From 8b99e9607c4799d6b58a1a74c404ae50b5b391e2 Mon Sep 17 00:00:00 2001 From: ddidderr Date: Sun, 23 Aug 2026 16:41:17 +0200 Subject: [PATCH] feat(reconstruction): complete binary-backed C recovery Replace the partial mechanics transcriptions with a separate, readable C11 reconstruction of the complete Win16 image while preserving the original raw Ghidra export as immutable evidence. Cover all ordinary and overlapping entry points, Borland runtime behavior, Win16 imports, segmented data, callbacks, resources, indirect control flow, physics, rendering, persistence, and startup/shutdown lifecycles. Add deterministic extraction and audit tooling plus address-linked ledgers for functions, imports, DGROUP ranges and objects, relocations, resources, and callbacks. The final gate records zero raw, partial, restored, unknown, blocked, or unclassified required units. Keep the semantic-fidelity boundary explicit: the portable C is not claimed to reproduce a byte-identical Borland NE build. Add strict focused harnesses for every reconstructed C unit, exact resource round-trip checks, and a 16-bit Borland Real48 reference probe. No Rust source or Cargo metadata is changed in this phase. Test Plan: - `bash original/tools/test_reconstructed_c.sh` -- passed - `bash original/tools/probe_real48_reference.sh` -- passed bit-for-bit - `python3 original/tools/audit_reconstruction.py --require-complete` -- passed - `git diff --cached --check` -- passed - `git diff HEAD -- '*.rs' Cargo.toml Cargo.lock` -- empty --- original/BINARY_FUNCTIONS.tsv | 684 + original/CALLBACK_RECONSTRUCTION.tsv | 7 + original/CODE_DATA_OBJECTS.tsv | 19 + original/COMPLETE_COVERAGE.tsv | 80 + original/COMPLETE_FUNCTIONS.tsv | 684 + original/C_RECONSTRUCTION_FINAL_AUDIT.md | 85 + original/DATA_COVERAGE.tsv | 745 + original/DATA_OBJECTS.tsv | 220 + original/DATA_RECONSTRUCTION.tsv | 456 + original/DECOMPILATION.md | 54 +- original/DEFINED_DATA.tsv | 579 + original/ENTRY_POINTS.tsv | 302 + original/FUNCTION_RECONSTRUCTION.tsv | 392 + original/IMPORT_RECONSTRUCTION.tsv | 293 + original/MECHANICS_PROGRESS.md | 30 +- original/MODULE_REFERENCES.tsv | 11 + original/NE_SEGMENTS.tsv | 7 + original/RECONSTRUCTION_PROGRESS.md | 149 + original/REFERENCES.tsv | 12081 +++++++++++ original/RELOCATIONS.tsv | 2435 +++ original/RESOURCE_RECONSTRUCTION.tsv | 64 + original/SHARED_ENTRY_POINTS.tsv | 7 + original/SYMBOLS.tsv | 2843 +++ original/TDKPIN_GHIDRA_COMPLETE_RAW.c | 16661 ++++++++++++++++ original/TDKPIN_MECHANICS_RESTORED.c | 11 +- original/TDKPIN_PHYSICS_RESTORED.c | 11 +- original/UNEXPLAINED.tsv | 3 + original/reconstructed/tdkpin_application.c | 442 + original/reconstructed/tdkpin_application.h | 75 + original/reconstructed/tdkpin_arithmetic.c | 43 + original/reconstructed/tdkpin_arithmetic.h | 18 + original/reconstructed/tdkpin_asset_cleanup.c | 82 + .../reconstructed/tdkpin_asset_initializer.c | 278 + original/reconstructed/tdkpin_borland_files.c | 438 + original/reconstructed/tdkpin_borland_files.h | 60 + .../reconstructed/tdkpin_borland_objects.c | 103 + .../reconstructed/tdkpin_borland_objects.h | 27 + .../reconstructed/tdkpin_borland_records.c | 123 + .../reconstructed/tdkpin_borland_records.h | 59 + .../reconstructed/tdkpin_borland_runtime.c | 298 + .../reconstructed/tdkpin_borland_runtime.h | 62 + .../reconstructed/tdkpin_borland_startup.c | 51 + .../reconstructed/tdkpin_borland_startup.h | 28 + original/reconstructed/tdkpin_claw_render.c | 78 + .../reconstructed/tdkpin_collision_events.c | 285 + .../reconstructed/tdkpin_collision_events.h | 11 + .../reconstructed/tdkpin_collision_records.c | 210 + .../reconstructed/tdkpin_collision_records.h | 84 + original/reconstructed/tdkpin_command_line.c | 66 + original/reconstructed/tdkpin_command_line.h | 20 + original/reconstructed/tdkpin_data.c | 49 + original/reconstructed/tdkpin_dgroup.h | 59 + original/reconstructed/tdkpin_dialog.c | 271 + original/reconstructed/tdkpin_dialog.h | 47 + original/reconstructed/tdkpin_dispatch.c | 97 + original/reconstructed/tdkpin_dispatch.h | 17 + .../tdkpin_flipper_bitmap_geometry.c | 213 + .../reconstructed/tdkpin_flipper_collision.c | 494 + original/reconstructed/tdkpin_flippers.c | 44 + original/reconstructed/tdkpin_flippers.h | 24 + .../reconstructed/tdkpin_game_application.c | 91 + .../reconstructed/tdkpin_game_application.h | 19 + original/reconstructed/tdkpin_game_assets.c | 278 + original/reconstructed/tdkpin_game_assets.h | 49 + original/reconstructed/tdkpin_game_setup.c | 293 + original/reconstructed/tdkpin_game_setup.h | 10 + .../tdkpin_game_setup_collision_data.inc | 183 + original/reconstructed/tdkpin_game_windows.c | 81 + original/reconstructed/tdkpin_game_windows.h | 22 + .../reconstructed/tdkpin_gameplay_helpers.c | 858 + .../reconstructed/tdkpin_gameplay_helpers.h | 89 + original/reconstructed/tdkpin_global_memory.c | 21 + original/reconstructed/tdkpin_global_memory.h | 10 + original/reconstructed/tdkpin_heap.c | 272 + original/reconstructed/tdkpin_heap.h | 29 + original/reconstructed/tdkpin_highscores.c | 415 + original/reconstructed/tdkpin_highscores.h | 55 + .../reconstructed/tdkpin_initialization.c | 22 + .../reconstructed/tdkpin_initialization.h | 9 + original/reconstructed/tdkpin_key_input.c | 367 + original/reconstructed/tdkpin_key_input.h | 14 + .../reconstructed/tdkpin_mechanism_render.c | 132 + .../reconstructed/tdkpin_mechanism_render.h | 9 + original/reconstructed/tdkpin_message_pump.c | 76 + original/reconstructed/tdkpin_message_pump.h | 16 + original/reconstructed/tdkpin_multimedia.c | 190 + original/reconstructed/tdkpin_multimedia.h | 52 + .../reconstructed/tdkpin_multimedia_paths.c | 187 + .../reconstructed/tdkpin_multimedia_startup.c | 129 + original/reconstructed/tdkpin_numeric.c | 182 + original/reconstructed/tdkpin_numeric.h | 37 + .../reconstructed/tdkpin_object_lifecycle.c | 79 + .../reconstructed/tdkpin_object_lifecycle.h | 17 + original/reconstructed/tdkpin_object_list.c | 315 + original/reconstructed/tdkpin_object_list.h | 62 + .../reconstructed/tdkpin_object_windows.c | 357 + .../reconstructed/tdkpin_object_windows.h | 101 + original/reconstructed/tdkpin_palette.c | 200 + original/reconstructed/tdkpin_palette.h | 71 + .../reconstructed/tdkpin_panel_animation.c | 265 + .../reconstructed/tdkpin_panel_animation.h | 9 + original/reconstructed/tdkpin_physics.c | 1137 ++ original/reconstructed/tdkpin_physics.h | 9 + original/reconstructed/tdkpin_player_state.c | 178 + original/reconstructed/tdkpin_player_state.h | 13 + original/reconstructed/tdkpin_program_entry.c | 76 + original/reconstructed/tdkpin_program_entry.h | 10 + original/reconstructed/tdkpin_random.c | 61 + original/reconstructed/tdkpin_random.h | 16 + original/reconstructed/tdkpin_real48.c | 893 + original/reconstructed/tdkpin_real48.h | 91 + original/reconstructed/tdkpin_render.c | 186 + original/reconstructed/tdkpin_render.h | 45 + original/reconstructed/tdkpin_resources.c | 138 + original/reconstructed/tdkpin_resources.h | 51 + original/reconstructed/tdkpin_runtime_ui.c | 572 + original/reconstructed/tdkpin_runtime_ui.h | 40 + original/reconstructed/tdkpin_segmented.c | 241 + original/reconstructed/tdkpin_segmented.h | 111 + original/reconstructed/tdkpin_shortstrings.c | 218 + original/reconstructed/tdkpin_shortstrings.h | 30 + original/reconstructed/tdkpin_sound.c | 225 + original/reconstructed/tdkpin_sound.h | 17 + original/reconstructed/tdkpin_stack.c | 45 + original/reconstructed/tdkpin_stack.h | 9 + original/reconstructed/tdkpin_status_render.c | 112 + original/reconstructed/tdkpin_strings.c | 228 + original/reconstructed/tdkpin_strings.h | 26 + original/reconstructed/tdkpin_system_timer.c | 86 + original/reconstructed/tdkpin_system_timer.h | 23 + original/reconstructed/tdkpin_tables.c | 25 + original/reconstructed/tdkpin_tables.h | 24 + original/reconstructed/tdkpin_timer_tick.c | 660 + original/reconstructed/tdkpin_timer_tick.h | 12 + .../reconstructed/tdkpin_tpwincrt_lifecycle.c | 107 + .../reconstructed/tdkpin_tpwincrt_lifecycle.h | 20 + original/reconstructed/tdkpin_tpwincrt_text.c | 268 + original/reconstructed/tdkpin_tpwincrt_text.h | 25 + original/reconstructed/tdkpin_turn_state.c | 198 + original/reconstructed/tdkpin_turn_state.h | 11 + original/reconstructed/tdkpin_win16.h | 446 + .../reconstructed/tdkpin_window_lifecycle.c | 71 + .../reconstructed/tdkpin_window_lifecycle.h | 16 + .../reconstructed/tdkpin_window_messages.c | 797 + .../reconstructed/tdkpin_window_messages.h | 104 + .../reconstructed/tdkpin_window_placement.c | 271 + .../reconstructed/tdkpin_window_placement.h | 17 + .../reconstructed/tests/test_application.c | 200 + .../tests/test_application_loop.c | 274 + .../tests/test_application_windows.c | 215 + .../reconstructed/tests/test_arithmetic.c | 54 + .../reconstructed/tests/test_asset_cleanup.c | 128 + .../tests/test_asset_initializer.c | 343 + .../reconstructed/tests/test_ball_render.c | 301 + .../reconstructed/tests/test_ball_restore.c | 173 + .../reconstructed/tests/test_ball_sweep.c | 243 + .../reconstructed/tests/test_bitmap_loader.c | 174 + .../reconstructed/tests/test_board_overlay.c | 140 + .../reconstructed/tests/test_borland_files.c | 539 + .../tests/test_borland_objects.c | 147 + .../tests/test_borland_records.c | 103 + .../tests/test_borland_startup.c | 102 + .../reconstructed/tests/test_bound_thunks.c | 97 + .../tests/test_child_validation.c | 182 + .../tests/test_class_registration.c | 136 + .../reconstructed/tests/test_claw_render.c | 111 + .../tests/test_collision_events.c | 319 + .../tests/test_collision_records.c | 204 + .../reconstructed/tests/test_command_line.c | 61 + original/reconstructed/tests/test_dialog.c | 413 + original/reconstructed/tests/test_dispatch.c | 117 + .../tests/test_flipper_bitmap_geometry.c | 280 + .../tests/test_flipper_collision.c | 279 + original/reconstructed/tests/test_flippers.c | 81 + .../tests/test_game_application.c | 150 + .../reconstructed/tests/test_game_assets.c | 75 + .../reconstructed/tests/test_game_setup.c | 370 + .../reconstructed/tests/test_game_windows.c | 181 + .../tests/test_gameplay_helpers.c | 358 + .../reconstructed/tests/test_global_memory.c | 59 + original/reconstructed/tests/test_heap_core.c | 101 + .../reconstructed/tests/test_heap_paths.c | 152 + .../reconstructed/tests/test_heap_reserve.c | 306 + .../reconstructed/tests/test_highscores.c | 688 + .../reconstructed/tests/test_initialization.c | 9 + original/reconstructed/tests/test_key_input.c | 167 + .../reconstructed/tests/test_key_release.c | 499 + .../tests/test_mechanism_render.c | 221 + .../tests/test_message_dispatch.c | 169 + .../reconstructed/tests/test_message_pump.c | 94 + .../reconstructed/tests/test_multimedia.c | 373 + .../tests/test_multimedia_paths.c | 178 + .../tests/test_multimedia_startup.c | 242 + original/reconstructed/tests/test_numeric.c | 77 + .../tests/test_object_lifecycle.c | 161 + .../reconstructed/tests/test_object_list.c | 169 + .../reconstructed/tests/test_object_windows.c | 174 + .../tests/test_object_windows_handlers.c | 169 + .../reconstructed/tests/test_overlay_setup.c | 44 + original/reconstructed/tests/test_palette.c | 140 + .../reconstructed/tests/test_palette_gdi.c | 95 + .../tests/test_palette_messages.c | 89 + .../tests/test_palette_window_messages.c | 141 + .../tests/test_panel_animation.c | 248 + original/reconstructed/tests/test_physics.c | 453 + .../reconstructed/tests/test_player_sprite.c | 112 + .../reconstructed/tests/test_player_state.c | 305 + .../reconstructed/tests/test_program_entry.c | 217 + original/reconstructed/tests/test_random.c | 49 + original/reconstructed/tests/test_real48.c | 387 + original/reconstructed/tests/test_render.c | 119 + original/reconstructed/tests/test_resources.c | 66 + .../reconstructed/tests/test_runtime_input.c | 155 + .../tests/test_runtime_lifecycle.c | 113 + .../reconstructed/tests/test_runtime_minmax.c | 145 + .../reconstructed/tests/test_runtime_ui.c | 76 + .../reconstructed/tests/test_score_render.c | 121 + original/reconstructed/tests/test_scoring.c | 165 + .../reconstructed/tests/test_shortstrings.c | 118 + original/reconstructed/tests/test_sound.c | 451 + original/reconstructed/tests/test_stack.c | 48 + .../reconstructed/tests/test_status_render.c | 139 + original/reconstructed/tests/test_strings.c | 164 + .../reconstructed/tests/test_system_timer.c | 114 + original/reconstructed/tests/test_tables.c | 24 + .../reconstructed/tests/test_timer_tick.c | 538 + .../tests/test_tpwincrt_lifecycle.c | 327 + .../reconstructed/tests/test_tpwincrt_text.c | 356 + .../reconstructed/tests/test_turn_state.c | 363 + .../tests/test_window_advanced_handlers.c | 315 + .../reconstructed/tests/test_window_command.c | 316 + .../tests/test_window_creation.c | 289 + .../reconstructed/tests/test_window_destroy.c | 132 + .../tests/test_window_lifecycle.c | 89 + .../tests/test_window_messages.c | 365 + .../tests/test_window_placement.c | 267 + .../tools/ApplyWin16ImportSignatures.java | 139 + original/tools/AuditCoverage.java | 8 +- original/tools/ExportDecompilation.java | 6 +- original/tools/ExportProgramEvidence.java | 210 + original/tools/SeedMissingEntrypoints.java | 90 + original/tools/audit_reconstruction.py | 836 + original/tools/build_data_coverage.py | 314 + original/tools/decompile.sh | 18 +- original/tools/extract_ne_metadata.py | 319 + .../generate_game_setup_collision_data.py | 128 + original/tools/probe_real48_reference.sh | 22 + original/tools/probes/real48_reference.asm | 399 + original/tools/promote_verified_data.py | 120 + original/tools/promote_verified_imports.py | 120 + original/tools/promote_verified_resources.py | 242 + original/tools/recover_win16_imports.py | 196 + original/tools/test_reconstructed_c.sh | 901 + 253 files changed, 79031 insertions(+), 51 deletions(-) create mode 100644 original/BINARY_FUNCTIONS.tsv create mode 100644 original/CALLBACK_RECONSTRUCTION.tsv create mode 100644 original/CODE_DATA_OBJECTS.tsv create mode 100644 original/COMPLETE_COVERAGE.tsv create mode 100644 original/COMPLETE_FUNCTIONS.tsv create mode 100644 original/C_RECONSTRUCTION_FINAL_AUDIT.md create mode 100644 original/DATA_COVERAGE.tsv create mode 100644 original/DATA_OBJECTS.tsv create mode 100644 original/DATA_RECONSTRUCTION.tsv create mode 100644 original/DEFINED_DATA.tsv create mode 100644 original/ENTRY_POINTS.tsv create mode 100644 original/FUNCTION_RECONSTRUCTION.tsv create mode 100644 original/IMPORT_RECONSTRUCTION.tsv create mode 100644 original/MODULE_REFERENCES.tsv create mode 100644 original/NE_SEGMENTS.tsv create mode 100644 original/RECONSTRUCTION_PROGRESS.md create mode 100644 original/REFERENCES.tsv create mode 100644 original/RELOCATIONS.tsv create mode 100644 original/RESOURCE_RECONSTRUCTION.tsv create mode 100644 original/SHARED_ENTRY_POINTS.tsv create mode 100644 original/SYMBOLS.tsv create mode 100644 original/TDKPIN_GHIDRA_COMPLETE_RAW.c create mode 100644 original/UNEXPLAINED.tsv create mode 100644 original/reconstructed/tdkpin_application.c create mode 100644 original/reconstructed/tdkpin_application.h create mode 100644 original/reconstructed/tdkpin_arithmetic.c create mode 100644 original/reconstructed/tdkpin_arithmetic.h create mode 100644 original/reconstructed/tdkpin_asset_cleanup.c create mode 100644 original/reconstructed/tdkpin_asset_initializer.c create mode 100644 original/reconstructed/tdkpin_borland_files.c create mode 100644 original/reconstructed/tdkpin_borland_files.h create mode 100644 original/reconstructed/tdkpin_borland_objects.c create mode 100644 original/reconstructed/tdkpin_borland_objects.h create mode 100644 original/reconstructed/tdkpin_borland_records.c create mode 100644 original/reconstructed/tdkpin_borland_records.h create mode 100644 original/reconstructed/tdkpin_borland_runtime.c create mode 100644 original/reconstructed/tdkpin_borland_runtime.h create mode 100644 original/reconstructed/tdkpin_borland_startup.c create mode 100644 original/reconstructed/tdkpin_borland_startup.h create mode 100644 original/reconstructed/tdkpin_claw_render.c create mode 100644 original/reconstructed/tdkpin_collision_events.c create mode 100644 original/reconstructed/tdkpin_collision_events.h create mode 100644 original/reconstructed/tdkpin_collision_records.c create mode 100644 original/reconstructed/tdkpin_collision_records.h create mode 100644 original/reconstructed/tdkpin_command_line.c create mode 100644 original/reconstructed/tdkpin_command_line.h create mode 100644 original/reconstructed/tdkpin_data.c create mode 100644 original/reconstructed/tdkpin_dgroup.h create mode 100644 original/reconstructed/tdkpin_dialog.c create mode 100644 original/reconstructed/tdkpin_dialog.h create mode 100644 original/reconstructed/tdkpin_dispatch.c create mode 100644 original/reconstructed/tdkpin_dispatch.h create mode 100644 original/reconstructed/tdkpin_flipper_bitmap_geometry.c create mode 100644 original/reconstructed/tdkpin_flipper_collision.c create mode 100644 original/reconstructed/tdkpin_flippers.c create mode 100644 original/reconstructed/tdkpin_flippers.h create mode 100644 original/reconstructed/tdkpin_game_application.c create mode 100644 original/reconstructed/tdkpin_game_application.h create mode 100644 original/reconstructed/tdkpin_game_assets.c create mode 100644 original/reconstructed/tdkpin_game_assets.h create mode 100644 original/reconstructed/tdkpin_game_setup.c create mode 100644 original/reconstructed/tdkpin_game_setup.h create mode 100644 original/reconstructed/tdkpin_game_setup_collision_data.inc create mode 100644 original/reconstructed/tdkpin_game_windows.c create mode 100644 original/reconstructed/tdkpin_game_windows.h create mode 100644 original/reconstructed/tdkpin_gameplay_helpers.c create mode 100644 original/reconstructed/tdkpin_gameplay_helpers.h create mode 100644 original/reconstructed/tdkpin_global_memory.c create mode 100644 original/reconstructed/tdkpin_global_memory.h create mode 100644 original/reconstructed/tdkpin_heap.c create mode 100644 original/reconstructed/tdkpin_heap.h create mode 100644 original/reconstructed/tdkpin_highscores.c create mode 100644 original/reconstructed/tdkpin_highscores.h create mode 100644 original/reconstructed/tdkpin_initialization.c create mode 100644 original/reconstructed/tdkpin_initialization.h create mode 100644 original/reconstructed/tdkpin_key_input.c create mode 100644 original/reconstructed/tdkpin_key_input.h create mode 100644 original/reconstructed/tdkpin_mechanism_render.c create mode 100644 original/reconstructed/tdkpin_mechanism_render.h create mode 100644 original/reconstructed/tdkpin_message_pump.c create mode 100644 original/reconstructed/tdkpin_message_pump.h create mode 100644 original/reconstructed/tdkpin_multimedia.c create mode 100644 original/reconstructed/tdkpin_multimedia.h create mode 100644 original/reconstructed/tdkpin_multimedia_paths.c create mode 100644 original/reconstructed/tdkpin_multimedia_startup.c create mode 100644 original/reconstructed/tdkpin_numeric.c create mode 100644 original/reconstructed/tdkpin_numeric.h create mode 100644 original/reconstructed/tdkpin_object_lifecycle.c create mode 100644 original/reconstructed/tdkpin_object_lifecycle.h create mode 100644 original/reconstructed/tdkpin_object_list.c create mode 100644 original/reconstructed/tdkpin_object_list.h create mode 100644 original/reconstructed/tdkpin_object_windows.c create mode 100644 original/reconstructed/tdkpin_object_windows.h create mode 100644 original/reconstructed/tdkpin_palette.c create mode 100644 original/reconstructed/tdkpin_palette.h create mode 100644 original/reconstructed/tdkpin_panel_animation.c create mode 100644 original/reconstructed/tdkpin_panel_animation.h create mode 100644 original/reconstructed/tdkpin_physics.c create mode 100644 original/reconstructed/tdkpin_physics.h create mode 100644 original/reconstructed/tdkpin_player_state.c create mode 100644 original/reconstructed/tdkpin_player_state.h create mode 100644 original/reconstructed/tdkpin_program_entry.c create mode 100644 original/reconstructed/tdkpin_program_entry.h create mode 100644 original/reconstructed/tdkpin_random.c create mode 100644 original/reconstructed/tdkpin_random.h create mode 100644 original/reconstructed/tdkpin_real48.c create mode 100644 original/reconstructed/tdkpin_real48.h create mode 100644 original/reconstructed/tdkpin_render.c create mode 100644 original/reconstructed/tdkpin_render.h create mode 100644 original/reconstructed/tdkpin_resources.c create mode 100644 original/reconstructed/tdkpin_resources.h create mode 100644 original/reconstructed/tdkpin_runtime_ui.c create mode 100644 original/reconstructed/tdkpin_runtime_ui.h create mode 100644 original/reconstructed/tdkpin_segmented.c create mode 100644 original/reconstructed/tdkpin_segmented.h create mode 100644 original/reconstructed/tdkpin_shortstrings.c create mode 100644 original/reconstructed/tdkpin_shortstrings.h create mode 100644 original/reconstructed/tdkpin_sound.c create mode 100644 original/reconstructed/tdkpin_sound.h create mode 100644 original/reconstructed/tdkpin_stack.c create mode 100644 original/reconstructed/tdkpin_stack.h create mode 100644 original/reconstructed/tdkpin_status_render.c create mode 100644 original/reconstructed/tdkpin_strings.c create mode 100644 original/reconstructed/tdkpin_strings.h create mode 100644 original/reconstructed/tdkpin_system_timer.c create mode 100644 original/reconstructed/tdkpin_system_timer.h create mode 100644 original/reconstructed/tdkpin_tables.c create mode 100644 original/reconstructed/tdkpin_tables.h create mode 100644 original/reconstructed/tdkpin_timer_tick.c create mode 100644 original/reconstructed/tdkpin_timer_tick.h create mode 100644 original/reconstructed/tdkpin_tpwincrt_lifecycle.c create mode 100644 original/reconstructed/tdkpin_tpwincrt_lifecycle.h create mode 100644 original/reconstructed/tdkpin_tpwincrt_text.c create mode 100644 original/reconstructed/tdkpin_tpwincrt_text.h create mode 100644 original/reconstructed/tdkpin_turn_state.c create mode 100644 original/reconstructed/tdkpin_turn_state.h create mode 100644 original/reconstructed/tdkpin_win16.h create mode 100644 original/reconstructed/tdkpin_window_lifecycle.c create mode 100644 original/reconstructed/tdkpin_window_lifecycle.h create mode 100644 original/reconstructed/tdkpin_window_messages.c create mode 100644 original/reconstructed/tdkpin_window_messages.h create mode 100644 original/reconstructed/tdkpin_window_placement.c create mode 100644 original/reconstructed/tdkpin_window_placement.h create mode 100644 original/reconstructed/tests/test_application.c create mode 100644 original/reconstructed/tests/test_application_loop.c create mode 100644 original/reconstructed/tests/test_application_windows.c create mode 100644 original/reconstructed/tests/test_arithmetic.c create mode 100644 original/reconstructed/tests/test_asset_cleanup.c create mode 100644 original/reconstructed/tests/test_asset_initializer.c create mode 100644 original/reconstructed/tests/test_ball_render.c create mode 100644 original/reconstructed/tests/test_ball_restore.c create mode 100644 original/reconstructed/tests/test_ball_sweep.c create mode 100644 original/reconstructed/tests/test_bitmap_loader.c create mode 100644 original/reconstructed/tests/test_board_overlay.c create mode 100644 original/reconstructed/tests/test_borland_files.c create mode 100644 original/reconstructed/tests/test_borland_objects.c create mode 100644 original/reconstructed/tests/test_borland_records.c create mode 100644 original/reconstructed/tests/test_borland_startup.c create mode 100644 original/reconstructed/tests/test_bound_thunks.c create mode 100644 original/reconstructed/tests/test_child_validation.c create mode 100644 original/reconstructed/tests/test_class_registration.c create mode 100644 original/reconstructed/tests/test_claw_render.c create mode 100644 original/reconstructed/tests/test_collision_events.c create mode 100644 original/reconstructed/tests/test_collision_records.c create mode 100644 original/reconstructed/tests/test_command_line.c create mode 100644 original/reconstructed/tests/test_dialog.c create mode 100644 original/reconstructed/tests/test_dispatch.c create mode 100644 original/reconstructed/tests/test_flipper_bitmap_geometry.c create mode 100644 original/reconstructed/tests/test_flipper_collision.c create mode 100644 original/reconstructed/tests/test_flippers.c create mode 100644 original/reconstructed/tests/test_game_application.c create mode 100644 original/reconstructed/tests/test_game_assets.c create mode 100644 original/reconstructed/tests/test_game_setup.c create mode 100644 original/reconstructed/tests/test_game_windows.c create mode 100644 original/reconstructed/tests/test_gameplay_helpers.c create mode 100644 original/reconstructed/tests/test_global_memory.c create mode 100644 original/reconstructed/tests/test_heap_core.c create mode 100644 original/reconstructed/tests/test_heap_paths.c create mode 100644 original/reconstructed/tests/test_heap_reserve.c create mode 100644 original/reconstructed/tests/test_highscores.c create mode 100644 original/reconstructed/tests/test_initialization.c create mode 100644 original/reconstructed/tests/test_key_input.c create mode 100644 original/reconstructed/tests/test_key_release.c create mode 100644 original/reconstructed/tests/test_mechanism_render.c create mode 100644 original/reconstructed/tests/test_message_dispatch.c create mode 100644 original/reconstructed/tests/test_message_pump.c create mode 100644 original/reconstructed/tests/test_multimedia.c create mode 100644 original/reconstructed/tests/test_multimedia_paths.c create mode 100644 original/reconstructed/tests/test_multimedia_startup.c create mode 100644 original/reconstructed/tests/test_numeric.c create mode 100644 original/reconstructed/tests/test_object_lifecycle.c create mode 100644 original/reconstructed/tests/test_object_list.c create mode 100644 original/reconstructed/tests/test_object_windows.c create mode 100644 original/reconstructed/tests/test_object_windows_handlers.c create mode 100644 original/reconstructed/tests/test_overlay_setup.c create mode 100644 original/reconstructed/tests/test_palette.c create mode 100644 original/reconstructed/tests/test_palette_gdi.c create mode 100644 original/reconstructed/tests/test_palette_messages.c create mode 100644 original/reconstructed/tests/test_palette_window_messages.c create mode 100644 original/reconstructed/tests/test_panel_animation.c create mode 100644 original/reconstructed/tests/test_physics.c create mode 100644 original/reconstructed/tests/test_player_sprite.c create mode 100644 original/reconstructed/tests/test_player_state.c create mode 100644 original/reconstructed/tests/test_program_entry.c create mode 100644 original/reconstructed/tests/test_random.c create mode 100644 original/reconstructed/tests/test_real48.c create mode 100644 original/reconstructed/tests/test_render.c create mode 100644 original/reconstructed/tests/test_resources.c create mode 100644 original/reconstructed/tests/test_runtime_input.c create mode 100644 original/reconstructed/tests/test_runtime_lifecycle.c create mode 100644 original/reconstructed/tests/test_runtime_minmax.c create mode 100644 original/reconstructed/tests/test_runtime_ui.c create mode 100644 original/reconstructed/tests/test_score_render.c create mode 100644 original/reconstructed/tests/test_scoring.c create mode 100644 original/reconstructed/tests/test_shortstrings.c create mode 100644 original/reconstructed/tests/test_sound.c create mode 100644 original/reconstructed/tests/test_stack.c create mode 100644 original/reconstructed/tests/test_status_render.c create mode 100644 original/reconstructed/tests/test_strings.c create mode 100644 original/reconstructed/tests/test_system_timer.c create mode 100644 original/reconstructed/tests/test_tables.c create mode 100644 original/reconstructed/tests/test_timer_tick.c create mode 100644 original/reconstructed/tests/test_tpwincrt_lifecycle.c create mode 100644 original/reconstructed/tests/test_tpwincrt_text.c create mode 100644 original/reconstructed/tests/test_turn_state.c create mode 100644 original/reconstructed/tests/test_window_advanced_handlers.c create mode 100644 original/reconstructed/tests/test_window_command.c create mode 100644 original/reconstructed/tests/test_window_creation.c create mode 100644 original/reconstructed/tests/test_window_destroy.c create mode 100644 original/reconstructed/tests/test_window_lifecycle.c create mode 100644 original/reconstructed/tests/test_window_messages.c create mode 100644 original/reconstructed/tests/test_window_placement.c create mode 100644 original/tools/ApplyWin16ImportSignatures.java create mode 100644 original/tools/ExportProgramEvidence.java create mode 100755 original/tools/audit_reconstruction.py create mode 100755 original/tools/build_data_coverage.py create mode 100755 original/tools/extract_ne_metadata.py create mode 100644 original/tools/generate_game_setup_collision_data.py create mode 100755 original/tools/probe_real48_reference.sh create mode 100644 original/tools/probes/real48_reference.asm create mode 100644 original/tools/promote_verified_data.py create mode 100644 original/tools/promote_verified_imports.py create mode 100644 original/tools/promote_verified_resources.py create mode 100755 original/tools/recover_win16_imports.py create mode 100755 original/tools/test_reconstructed_c.sh diff --git a/original/BINARY_FUNCTIONS.tsv b/original/BINARY_FUNCTIONS.tsv new file mode 100644 index 0000000..83336f7 --- /dev/null +++ b/original/BINARY_FUNCTIONS.tsv @@ -0,0 +1,684 @@ +address name namespace block body_bytes entry_kind calling_convention stack_purge_bytes return_type parameter_count varargs thunk +1000:0002 FUN_1000_0002 Global Code1 254 internal __stdcall16far 4 undefined 0 false false +1000:0100 FUN_1000_0100 Global Code1 33 internal __stdcall16far 4 undefined 0 false false +1000:0121 FUN_1000_0121 Global Code1 75 internal __stdcall16far 4 undefined 0 false false +1000:016c FUN_1000_016c Global Code1 103 internal __stdcall16far 8 undefined 0 false false +1000:01d3 FUN_1000_01d3 Global Code1 155 internal __stdcall16far 14 undefined 0 false false +1000:0270 FUN_1000_0270 Global Code1 20357 internal __stdcall16far 2147483647 undefined 0 false false +1000:51f5 FUN_1000_51f5 Global Code1 297 internal __stdcall16far 6 undefined 0 false false +1000:531e FUN_1000_531e Global Code1 114 internal __stdcall16far 4 undefined 0 false false +1000:5390 FUN_1000_5390 Global Code1 1367 internal __stdcall16far 10 undefined 0 false false +1000:58e7 FUN_1000_58e7 Global Code1 111 internal __stdcall16far 8 undefined 0 false false +1000:5956 FUN_1000_5956 Global Code1 74 internal __stdcall16far 8 undefined 0 false false +1000:59a0 FUN_1000_59a0 Global Code1 151 internal __stdcall16far 8 undefined 0 false false +1000:5a37 FUN_1000_5a37 Global Code1 128 internal __stdcall16far 8 undefined 0 false false +1000:5ab7 FUN_1000_5ab7 Global Code1 51 internal __stdcall16far 8 undefined 0 false false +1000:5aea FUN_1000_5aea Global Code1 188 internal __stdcall16far 14 undefined 0 false false +1000:5ba6 FUN_1000_5ba6 Global Code1 63 internal __stdcall16far 6 undefined 0 false false +1000:5be5 FUN_1000_5be5 Global Code1 46 internal __stdcall16far 4 undefined 0 false false +1000:5c13 FUN_1000_5c13 Global Code1 723 internal __stdcall16far 10 undefined 0 false false +1000:5ee6 FUN_1000_5ee6 Global Code1 22 internal __stdcall16far 8 undefined 0 false false +1000:5efc FUN_1000_5efc Global Code1 45 internal __stdcall16far 8 undefined 0 false false +1000:5f29 FUN_1000_5f29 Global Code1 151 internal __stdcall16far 8 undefined 0 false false +1000:5fc0 FUN_1000_5fc0 Global Code1 128 internal __stdcall16far 8 undefined 0 false false +1000:6040 FUN_1000_6040 Global Code1 51 internal __stdcall16far 8 undefined 0 false false +1000:6073 FUN_1000_6073 Global Code1 116 internal __stdcall16far 14 undefined 0 false false +1000:60e7 FUN_1000_60e7 Global Code1 66 internal __stdcall16far 6 undefined 0 false false +1000:6129 FUN_1000_6129 Global Code1 69 internal __stdcall16far 4 undefined 0 false false +1000:616e FUN_1000_616e Global Code1 148 internal __stdcall16far 10 undefined 0 false false +1000:6202 FUN_1000_6202 Global Code1 22 internal __stdcall16far 8 undefined 0 false false +1000:6218 FUN_1000_6218 Global Code1 45 internal __stdcall16far 8 undefined 0 false false +1000:6245 FUN_1000_6245 Global Code1 151 internal __stdcall16far 8 undefined 0 false false +1000:62dc FUN_1000_62dc Global Code1 128 internal __stdcall16far 8 undefined 0 false false +1000:635c FUN_1000_635c Global Code1 50 internal __stdcall16far 12 undefined 0 false false +1000:638e FUN_1000_638e Global Code1 1961 internal __stdcall16far 8 undefined 0 false false +1000:6b37 FUN_1000_6b37 Global Code1 193 internal __stdcall16far 4 undefined 0 false false +1000:6bf8 FUN_1000_6bf8 Global Code1 815 internal __stdcall16far 8 undefined 0 false false +1000:6f27 FUN_1000_6f27 Global Code1 1305 internal __stdcall16far 2 undefined 0 false false +1000:7440 FUN_1000_7440 Global Code1 2514 internal __stdcall16far 2 undefined 0 false false +1000:7e12 FUN_1000_7e12 Global Code1 128 internal __stdcall16far 4 undefined 0 false false +1000:7e92 FUN_1000_7e92 Global Code1 71 internal __stdcall16far 4 undefined 0 false false +1000:7ed9 FUN_1000_7ed9 Global Code1 3124 internal __stdcall16far 10 undefined 0 false false +1000:8b0d FUN_1000_8b0d Global Code1 3811 internal __stdcall16far 8 undefined 0 false false +1000:99f0 FUN_1000_99f0 Global Code1 240 internal __stdcall16far 2 undefined 0 false false +1000:9ae0 FUN_1000_9ae0 Global Code1 137 internal __stdcall16far 18 undefined 0 false false +1000:9b69 FUN_1000_9b69 Global Code1 97 internal __stdcall16far 18 undefined 0 false false +1000:9bca FUN_1000_9bca Global Code1 699 internal __stdcall16far 2 undefined 0 false false +1000:9e85 FUN_1000_9e85 Global Code1 238 internal __stdcall16far 2 undefined 0 false false +1000:9f73 FUN_1000_9f73 Global Code1 1051 internal __stdcall16far 2 undefined 0 false false +1000:a38e FUN_1000_a38e Global Code1 630 internal __stdcall16far 4 undefined 0 false false +1000:a604 FUN_1000_a604 Global Code1 266 internal __stdcall16far 2 undefined 0 false false +1000:a70e FUN_1000_a70e Global Code1 30 internal __stdcall16far 2 undefined 0 false false +1000:a72c FUN_1000_a72c Global Code1 446 internal __stdcall16far 2 undefined 0 false false +1000:a8ea FUN_1000_a8ea Global Code1 178 internal __stdcall16far 2 undefined 0 false false +1000:a99c FUN_1000_a99c Global Code1 416 internal __stdcall16far 2 undefined 0 false false +1000:ab3c FUN_1000_ab3c Global Code1 169 internal __stdcall16far 2 undefined 0 false false +1000:abe5 FUN_1000_abe5 Global Code1 221 internal __stdcall16far 2 undefined 0 false false +1000:acc2 FUN_1000_acc2 Global Code1 428 internal __stdcall16far 2 undefined 0 false false +1000:ae6e FUN_1000_ae6e Global Code1 1114 internal __stdcall16far 2 undefined 0 false false +1000:b2c8 FUN_1000_b2c8 Global Code1 67 internal __stdcall16far 12 undefined 0 false false +1000:b30b FUN_1000_b30b Global Code1 165 internal __stdcall16far 4 undefined 0 false false +1000:b3b0 FUN_1000_b3b0 Global Code1 67 internal __stdcall16far 12 undefined 0 false false +1000:b3f3 FUN_1000_b3f3 Global Code1 131 internal __stdcall16far 4 undefined 0 false false +1000:b476 FUN_1000_b476 Global Code1 1984 internal __stdcall16far 6 undefined 0 false false +1000:bc36 FUN_1000_bc36 Global Code1 364 internal __stdcall16far 6 undefined 0 false false +1000:bda2 FUN_1000_bda2 Global Code1 60 internal __stdcall16far 6 undefined 0 false false +1000:bdde FUN_1000_bdde Global Code1 289 internal __stdcall16far 6 undefined 0 false false +1000:beff FUN_1000_beff Global Code1 1132 internal __stdcall16far 10 undefined 0 false false +1000:c36b FUN_1000_c36b Global Code1 187 internal __stdcall16far 6 undefined 0 false false +1000:c426 FUN_1000_c426 Global Code1 187 internal __stdcall16far 6 undefined 0 false false +1000:c4e1 FUN_1000_c4e1 Global Code1 699 internal __stdcall16far 4 undefined 0 false false +1000:c79c FUN_1000_c79c Global Code1 8981 internal __stdcall16far 2147483647 undefined 0 false false +1000:eab1 exported_ordinal_10 Global Code1 4820 internal __stdcall16far 8 undefined 0 false false +1000:fd85 ne_program_entry Global Code1 181 internal unknown 2147483647 undefined 0 false false +1008:0002 FUN_1008_0002 Global Code2 33 internal __stdcall16far 2 undefined 0 false false +1008:0023 FUN_1008_0023 Global Code2 191 internal __stdcall16far 2 undefined 0 false false +1008:00e2 FUN_1008_00e2 Global Code2 86 internal __cdecl16far 0 undefined 0 false false +1008:0138 FUN_1008_0138 Global Code2 1615 internal __stdcall16far 80 undefined 0 false false +1008:0787 FUN_1008_0787 Global Code2 47 internal __stdcall16far 10 undefined 0 false false +1008:07b6 FUN_1008_07b6 Global Code2 129 internal __stdcall16far 12 undefined 0 false false +1008:0837 FUN_1008_0837 Global Code2 132 internal __stdcall16far 10 undefined 0 false false +1008:08bb FUN_1008_08bb Global Code2 132 internal __stdcall16far 10 undefined 0 false false +1008:093f FUN_1008_093f Global Code2 87 internal __stdcall16far 10 undefined 0 false false +1008:0996 FUN_1008_0996 Global Code2 520 internal __stdcall16far 6 undefined 0 false false +1008:0b9e FUN_1008_0b9e Global Code2 543 internal __stdcall16far 4 undefined 0 false false +1008:0dbd FUN_1008_0dbd Global Code2 75 internal __stdcall16far 4 undefined 0 false false +1008:0e08 FUN_1008_0e08 Global Code2 287 internal __stdcall16far 6 undefined 0 false false +1008:0f27 FUN_1008_0f27 Global Code2 5 internal __cdecl16far 0 undefined 0 false false +1008:0f2e FUN_1008_0f2e Global Code2 437 internal __cdecl16far 0 undefined 0 false false +1008:10e3 FUN_1008_10e3 Global Code2 78 internal __cdecl16far 0 undefined 0 false false +1008:1131 FUN_1008_1131 Global Code2 94 internal __stdcall16far 2 undefined 0 false false +1008:118f FUN_1008_118f Global Code2 41 internal __cdecl16far 0 undefined 0 false false +1008:11b8 FUN_1008_11b8 Global Code2 5 internal __cdecl16far 0 undefined 0 false false +1008:11c5 FUN_1008_11c5 Global Code2 345 internal __cdecl16far 0 undefined 0 false false +1008:1326 FUN_1008_1326 Global Code2 130 internal __stdcall16far 10 undefined 0 false false +1008:13a8 FUN_1008_13a8 Global Code2 245 internal __stdcall16far 4 undefined 0 false false +1008:149d FUN_1008_149d Global Code2 293 internal __stdcall16far 6 undefined 0 false false +1008:15c2 FUN_1008_15c2 Global Code2 5 internal __cdecl16far 0 undefined 0 false false +1008:15c7 FUN_1008_15c7 Global Code2 32 internal __stdcall16far 6 undefined 0 false false +1008:15e7 FUN_1008_15e7 Global Code2 32 internal __stdcall16far 4 undefined 0 false false +1008:1607 FUN_1008_1607 Global Code2 135 internal __stdcall16far 24 undefined 0 false false +1008:168e FUN_1008_168e Global Code2 48 internal __stdcall16far 4 undefined 0 false false +1008:16be FUN_1008_16be Global Code2 113 internal __stdcall16far 4 undefined 0 false false +1008:172f FUN_1008_172f Global Code2 37 internal __stdcall16near 4 undefined 0 false false +1008:1754 FUN_1008_1754 Global Code2 37 internal __stdcall16near 4 undefined 0 false false +1008:1779 FUN_1008_1779 Global Code2 105 internal __cdecl16near 0 undefined 0 false false +1008:17e2 FUN_1008_17e2 Global Code2 54 internal __cdecl16near 0 undefined 0 false false +1008:1818 FUN_1008_1818 Global Code2 67 internal __cdecl16near 0 undefined 0 false false +1008:185b FUN_1008_185b Global Code2 10 internal __cdecl16near 0 undefined 0 false false +1008:1865 FUN_1008_1865 Global Code2 107 internal __cdecl16near 0 undefined 0 false false +1008:18d0 FUN_1008_18d0 Global Code2 30 internal __cdecl16near 0 undefined 0 false false +1008:18ee FUN_1008_18ee Global Code2 201 internal __stdcall16far 4 undefined 0 false false +1008:19b7 FUN_1008_19b7 Global Code2 65 internal __cdecl16far 0 undefined 0 false false +1008:19f8 FUN_1008_19f8 Global Code2 65 internal __stdcall16near 4 undefined 0 false false +1008:1a39 FUN_1008_1a39 Global Code2 73 internal __stdcall16near 4 undefined 0 false false +1008:1a82 FUN_1008_1a82 Global Code2 143 internal __stdcall16near 2 undefined 0 false false +1008:1b11 FUN_1008_1b11 Global Code2 216 internal __stdcall16far 6 undefined 0 false false +1008:1be9 FUN_1008_1be9 Global Code2 26 internal __stdcall16far 2 undefined 0 false false +1008:1c03 FUN_1008_1c03 Global Code2 92 internal __cdecl16far 0 undefined 0 false false +1008:1c5f FUN_1008_1c5f Global Code2 103 internal __cdecl16far 0 undefined 0 false false +1008:1cc6 FUN_1008_1cc6 Global Code2 177 internal __stdcall16far 6 undefined 0 false false +1008:1d77 FUN_1008_1d77 Global Code2 85 internal __cdecl16near 0 undefined 0 false false +1008:1dcc FUN_1008_1dcc Global Code2 190 internal __cdecl16near 0 undefined 0 false false +1008:1e8a FUN_1008_1e8a Global Code2 130 internal __stdcall16near 8 undefined 0 false false +1008:1f0c FUN_1008_1f0c Global Code2 92 internal __stdcall16near 6 undefined 0 false false +1008:1f68 FUN_1008_1f68 Global Code2 128 internal __stdcall16near 4 undefined 0 false false +1008:1fe8 FUN_1008_1fe8 Global Code2 306 internal __stdcall16near 4 undefined 0 false false +1008:211a FUN_1008_211a Global Code2 45 internal __stdcall16near 2 undefined 0 false false +1008:2147 FUN_1008_2147 Global Code2 115 internal __stdcall16near 2 undefined 0 false false +1008:21ba FUN_1008_21ba Global Code2 20 internal __cdecl16near 0 undefined 0 false false +1008:21ce FUN_1008_21ce Global Code2 20 internal __cdecl16near 0 undefined 0 false false +1008:21e2 FUN_1008_21e2 Global Code2 55 internal __cdecl16near 0 undefined 0 false false +1008:2219 FUN_1008_2219 Global Code2 227 internal __stdcall16far 10 undefined 0 false false +1008:22fc FUN_1008_22fc Global Code2 64 internal __stdcall16far 4 undefined 0 false false +1008:233c FUN_1008_233c Global Code2 56 internal __stdcall16far 4 undefined 0 false false +1008:2374 FUN_1008_2374 Global Code2 23 internal __stdcall16far 4 undefined 0 false false +1008:238b FUN_1008_238b Global Code2 114 internal __stdcall16far 4 undefined 0 false false +1008:23fd FUN_1008_23fd Global Code2 69 internal __stdcall16far 4 undefined 0 false false +1008:2442 FUN_1008_2442 Global Code2 99 internal __cdecl16far 0 undefined 0 false false +1008:24a5 FUN_1008_24a5 Global Code2 175 internal __cdecl16far 0 undefined 0 false false +1008:2554 FUN_1008_2554 Global Code2 180 internal __cdecl16far 0 undefined 0 false false +1008:2608 FUN_1008_2608 Global Code2 59 internal __cdecl16near 0 undefined 0 false false +1008:2643 FUN_1008_2643 Global Code2 109 internal __stdcall16far 12 undefined 0 false false +1008:26b0 FUN_1008_26b0 Global Code2 361 internal __stdcall16far 16 undefined 0 false false +1008:2819 FUN_1008_2819 Global Code2 138 internal __stdcall16far 4 undefined 0 false false +1008:28a3 FUN_1008_28a3 Global Code2 99 internal __stdcall16far 14 undefined 0 false false +1008:2906 FUN_1008_2906 Global Code2 44 internal __stdcall16far 6 undefined 0 false false +1008:2932 FUN_1008_2932 Global Code2 42 internal __stdcall16far 4 undefined 0 false false +1008:295c FUN_1008_295c Global Code2 46 internal __stdcall16far 10 undefined 0 false false +1008:298a FUN_1008_298a Global Code2 12 internal __cdecl16far 0 undefined 0 false false +1008:2996 FUN_1008_2996 Global Code2 120 internal __stdcall16far 14 undefined 0 false false +1008:2a0e FUN_1008_2a0e Global Code2 55 internal __stdcall16far 6 undefined 0 false false +1008:2a45 FUN_1008_2a45 Global Code2 158 internal __stdcall16far 4 undefined 0 false false +1008:2ae3 FUN_1008_2ae3 Global Code2 206 internal __stdcall16far 4 undefined 0 false false +1008:2bb1 FUN_1008_2bb1 Global Code2 32 internal __stdcall16far 6 undefined 0 false false +1008:2bd1 FUN_1008_2bd1 Global Code2 55 internal __stdcall16far 6 undefined 0 false false +1008:2c08 FUN_1008_2c08 Global Code2 23 internal __stdcall16far 8 undefined 0 false false +1008:2c1f FUN_1008_2c1f Global Code2 100 internal __stdcall16far 8 undefined 0 false false +1008:2c83 FUN_1008_2c83 Global Code2 86 internal __stdcall16far 8 undefined 0 false false +1008:2cd9 FUN_1008_2cd9 Global Code2 25 internal __stdcall16far 8 undefined 0 false false +1008:2cf2 FUN_1008_2cf2 Global Code2 72 internal __stdcall16far 8 undefined 0 false false +1008:2d3a FUN_1008_2d3a Global Code2 44 internal __stdcall16far 8 undefined 0 false false +1008:2d66 FUN_1008_2d66 Global Code2 33 internal __stdcall16far 8 undefined 0 false false +1008:2d87 FUN_1008_2d87 Global Code2 18 internal __cdecl16far 0 undefined 0 false false +1008:2d99 FUN_1008_2d99 Global Code2 26 internal __stdcall16far 6 undefined 0 false false +1008:2db3 FUN_1008_2db3 Global Code2 26 internal __stdcall16far 4 undefined 0 false false +1008:2dcd FUN_1008_2dcd Global Code2 19 internal __stdcall16far 6 undefined 0 false false +1008:2de0 FUN_1008_2de0 Global Code2 31 internal __cdecl16far 0 undefined 0 false false +1008:2dff FUN_1008_2dff Global Code2 35 internal __cdecl16far 0 undefined 0 false false +1008:2e22 FUN_1008_2e22 Global Code2 84 internal __stdcall16far 2 undefined 0 false false +1008:2e76 FUN_1008_2e76 Global Code2 28 internal __cdecl16far 0 undefined 0 false false +1008:2e92 FUN_1008_2e92 Global Code2 23 internal __stdcall16far 4 undefined 0 false false +1008:2ea9 FUN_1008_2ea9 Global Code2 23 internal __stdcall16far 4 undefined 0 false false +1008:2ec0 FUN_1008_2ec0 Global Code2 37 internal __stdcall16far 10 undefined 0 false false +1008:2ee5 FUN_1008_2ee5 Global Code2 34 internal __stdcall16far 8 undefined 0 false false +1008:2f07 FUN_1008_2f07 Global Code2 40 internal __stdcall16far 10 undefined 0 false false +1008:2f2f FUN_1008_2f2f Global Code2 30 internal __stdcall16far 8 undefined 0 false false +1008:2f4d FUN_1008_2f4d Global Code2 35 internal __stdcall16far 8 undefined 0 false false +1008:2f70 FUN_1008_2f70 Global Code2 75 internal __stdcall16far 10 undefined 0 false false +1008:2fbb FUN_1008_2fbb Global Code2 40 internal __stdcall16far 6 undefined 0 false false +1008:2fe3 FUN_1008_2fe3 Global Code2 39 internal __stdcall16far 6 undefined 0 false false +1008:300a FUN_1008_300a Global Code2 34 internal __stdcall16far 4 undefined 0 false false +1008:302c FUN_1008_302c Global Code2 109 internal __stdcall16far 4 undefined 0 false false +1008:3099 FUN_1008_3099 Global Code2 44 internal __stdcall16far 4 undefined 0 false false +1010:0002 FUN_1010_0002 Global Code3 119 internal __cdecl16far 0 undefined 0 false false +1010:0079 FUN_1010_0079 Global Code3 41 internal __cdecl16far 0 undefined 0 false false +1010:00a2 FUN_1010_00a2 Global Code3 288 internal __stdcall16far 8 undefined 0 false false +1010:01c2 FUN_1010_01c2 Global Code3 493 internal __stdcall16far 10 undefined 0 false false +1010:03af FUN_1010_03af Global Code3 49 internal __stdcall16far 10 undefined 0 false false +1010:03e0 FUN_1010_03e0 Global Code3 37 internal __stdcall16far 6 undefined 0 false false +1010:0405 FUN_1010_0405 Global Code3 107 internal __stdcall16far 4 undefined 0 false false +1010:0472 FUN_1010_0472 Global Code3 378 internal __cdecl16far 0 undefined 0 false false +1018:0002 FUN_1018_0002 Global Code4 67 internal __cdecl16near 0 undefined 0 false false +1018:0045 FUN_1018_0045 Global Code4 44 internal __stdcall16far 6 undefined 0 false false +1018:0071 FUN_1018_0071 Global Code4 38 internal __stdcall16far 2 undefined 0 false false +1018:0097 FUN_1018_0097 Global Code4 108 internal __stdcall16far 2 undefined 0 false false +1018:0103 FUN_1018_0103 Global Code4 44 internal __cdecl16near 0 undefined 0 false false +1018:0133 FUN_1018_0133 Global Code4 88 internal __stdcall16far 10 undefined 0 false false +1018:018b FUN_1018_018b Global Code4 81 internal __stdcall16far 10 undefined 0 false false +1018:01dc FUN_1018_01dc Global Code4 286 internal __stdcall16far 4 undefined 0 false false +1018:02fa FUN_1018_02fa Global Code4 71 internal __stdcall16far 4 undefined 0 false false +1018:0341 FUN_1018_0341 Global Code4 168 internal __stdcall16far 10 undefined 0 false false +1018:03e9 FUN_1018_03e9 Global Code4 22 internal __stdcall16far 6 undefined 0 false false +1018:03ff FUN_1018_03ff Global Code4 103 internal __stdcall16far 6 undefined 0 false false +1018:0466 FUN_1018_0466 Global Code4 56 internal __stdcall16far 6 undefined 0 false false +1018:049e FUN_1018_049e Global Code4 134 internal __stdcall16far 6 undefined 0 false false +1018:0524 FUN_1018_0524 Global Code4 56 internal __stdcall16far 6 undefined 0 false false +1018:055c FUN_1018_055c Global Code4 128 internal __stdcall16far 4 undefined 0 false false +1018:05dc FUN_1018_05dc Global Code4 23 internal __stdcall16far 10 undefined 0 false false +1018:05f3 FUN_1018_05f3 Global Code4 26 internal __stdcall16far 4 undefined 0 false false +1018:060d FUN_1018_060d Global Code4 26 internal __stdcall16far 4 undefined 0 false false +1018:0627 FUN_1018_0627 Global Code4 26 internal __stdcall16far 4 undefined 0 false false +1018:0641 FUN_1018_0641 Global Code4 50 internal __stdcall16far 8 undefined 0 false false +1018:0673 FUN_1018_0673 Global Code4 39 internal __stdcall16far 6 undefined 0 false false +1018:069a FUN_1018_069a Global Code4 130 internal __stdcall16far 8 undefined 0 false false +1018:071c FUN_1018_071c Global Code4 241 internal __stdcall16far 8 undefined 0 false false +1018:080d FUN_1018_080d Global Code4 77 internal __stdcall16far 8 undefined 0 false false +1018:085a FUN_1018_085a Global Code4 82 internal __stdcall16far 8 undefined 0 false false +1018:08ac FUN_1018_08ac Global Code4 23 internal __stdcall16far 4 undefined 0 false false +1018:08c3 FUN_1018_08c3 Global Code4 45 internal __stdcall16far 12 undefined 0 false false +1018:08f0 FUN_1018_08f0 Global Code4 405 internal __stdcall16far 8 undefined 0 false false +1018:0a85 FUN_1018_0a85 Global Code4 160 internal __stdcall16far 8 undefined 0 false false +1018:0b25 FUN_1018_0b25 Global Code4 71 internal __stdcall16far 8 undefined 0 false false +1018:0b6c FUN_1018_0b6c Global Code4 71 internal __stdcall16far 8 undefined 0 false false +1018:0bb3 FUN_1018_0bb3 Global Code4 138 internal __stdcall16far 8 undefined 0 false false +1018:0c3d FUN_1018_0c3d Global Code4 28 internal __stdcall16far 8 undefined 0 false false +1018:0c59 FUN_1018_0c59 Global Code4 110 internal __stdcall16far 8 undefined 0 false false +1018:0cc7 FUN_1018_0cc7 Global Code4 32 internal __stdcall16far 6 undefined 0 false false +1018:0ce7 FUN_1018_0ce7 Global Code4 131 internal __stdcall16far 4 undefined 0 false false +1018:0d6a FUN_1018_0d6a Global Code4 32 internal __stdcall16far 4 undefined 0 false false +1018:0d8a FUN_1018_0d8a Global Code4 17 internal __stdcall16far 8 undefined 0 false false +1018:0d9b FUN_1018_0d9b Global Code4 50 internal __stdcall16far 4 undefined 0 false false +1018:0dcd FUN_1018_0dcd Global Code4 61 internal __stdcall16far 6 undefined 0 false false +1018:0e0a FUN_1018_0e0a Global Code4 60 internal __stdcall16far 6 undefined 0 false false +1018:0e46 FUN_1018_0e46 Global Code4 88 internal __stdcall16far 4 undefined 0 false false +1018:0e9e FUN_1018_0e9e Global Code4 34 internal __stdcall16far 6 undefined 0 false false +1018:0ec0 FUN_1018_0ec0 Global Code4 52 internal __stdcall16far 6 undefined 0 false false +1018:0ef4 FUN_1018_0ef4 Global Code4 46 internal __stdcall16far 4 undefined 0 false false +1018:0f22 FUN_1018_0f22 Global Code4 22 internal __stdcall16far 8 undefined 0 false false +1018:0f38 FUN_1018_0f38 Global Code4 85 internal __stdcall16far 4 undefined 0 false false +1018:0f8d FUN_1018_0f8d Global Code4 63 internal __stdcall16far 8 undefined 0 false false +1018:0fcc FUN_1018_0fcc Global Code4 49 internal __stdcall16far 8 undefined 0 false false +1018:0ffd FUN_1018_0ffd Global Code4 87 internal __stdcall16far 8 undefined 0 false false +1018:1054 FUN_1018_1054 Global Code4 86 internal __stdcall16far 8 undefined 0 false false +1018:10aa FUN_1018_10aa Global Code4 63 internal __stdcall16far 8 undefined 0 false false +1018:10e9 FUN_1018_10e9 Global Code4 29 internal __stdcall16far 4 undefined 0 false false +1018:1106 FUN_1018_1106 Global Code4 277 internal __stdcall16far 14 undefined 0 false false +1018:121b FUN_1018_121b Global Code4 89 internal __stdcall16far 6 undefined 0 false false +1018:1274 FUN_1018_1274 Global Code4 129 internal __stdcall16far 8 undefined 0 false false +1018:12f5 FUN_1018_12f5 Global Code4 28 internal __stdcall16far 4 undefined 0 false false +1018:1311 FUN_1018_1311 Global Code4 62 internal __stdcall16far 8 undefined 0 false false +1018:134f FUN_1018_134f Global Code4 504 internal __stdcall16far 4 undefined 0 false false +1018:1547 FUN_1018_1547 Global Code4 63 internal __stdcall16far 4 undefined 0 false false +1018:1586 FUN_1018_1586 Global Code4 58 internal __stdcall16far 4 undefined 0 false false +1018:15c0 FUN_1018_15c0 Global Code4 221 internal __stdcall16far 4 undefined 0 false false +1018:169d FUN_1018_169d Global Code4 78 internal __stdcall16far 8 undefined 0 false false +1018:16eb FUN_1018_16eb Global Code4 33 internal __stdcall16far 8 undefined 0 false false +1018:170c FUN_1018_170c Global Code4 85 internal __stdcall16far 4 undefined 0 false false +1018:1761 FUN_1018_1761 Global Code4 39 internal __stdcall16far 8 undefined 0 false false +1018:1788 FUN_1018_1788 Global Code4 112 internal __stdcall16far 8 undefined 0 false false +1018:17f8 FUN_1018_17f8 Global Code4 112 internal __stdcall16far 8 undefined 0 false false +1018:1868 FUN_1018_1868 Global Code4 129 internal __stdcall16far 8 undefined 0 false false +1018:18e9 FUN_1018_18e9 Global Code4 119 internal __stdcall16far 8 undefined 0 false false +1018:1960 FUN_1018_1960 Global Code4 38 internal __stdcall16far 8 undefined 0 false false +1018:1986 FUN_1018_1986 Global Code4 136 internal __stdcall16far 8 undefined 0 false false +1018:1a0e FUN_1018_1a0e Global Code4 83 internal __stdcall16far 8 undefined 0 false false +1018:1a61 FUN_1018_1a61 Global Code4 167 internal __stdcall16far 10 undefined 0 false false +1018:1b08 FUN_1018_1b08 Global Code4 45 internal __stdcall16far 6 undefined 0 false false +1018:1b35 FUN_1018_1b35 Global Code4 22 internal __stdcall16far 4 undefined 0 false false +1018:1b4b FUN_1018_1b4b Global Code4 12 internal __stdcall16far 4 undefined 0 false false +1018:1b57 FUN_1018_1b57 Global Code4 89 internal __stdcall16far 4 undefined 0 false false +1018:1bb0 FUN_1018_1bb0 Global Code4 47 internal __stdcall16far 4 undefined 0 false false +1018:1bdf FUN_1018_1bdf Global Code4 29 internal __stdcall16far 8 undefined 0 false false +1018:1bfc FUN_1018_1bfc Global Code4 131 internal __stdcall16far 4 undefined 0 false false +1018:1c7f FUN_1018_1c7f Global Code4 87 internal __stdcall16far 8 undefined 0 false false +1018:1cd6 FUN_1018_1cd6 Global Code4 76 internal __stdcall16far 8 undefined 0 false false +1018:1d22 FUN_1018_1d22 Global Code4 66 internal __stdcall16far 8 undefined 0 false false +1018:1d64 FUN_1018_1d64 Global Code4 77 internal __stdcall16far 8 undefined 0 false false +1018:1db1 FUN_1018_1db1 Global Code4 136 internal __stdcall16far 8 undefined 0 false false +1018:1e39 FUN_1018_1e39 Global Code4 119 internal __stdcall16far 8 undefined 0 false false +1018:1eb0 FUN_1018_1eb0 Global Code4 100 internal __stdcall16far 8 undefined 0 false false +1018:1f14 FUN_1018_1f14 Global Code4 66 internal __stdcall16far 6 undefined 0 false false +1018:1f56 FUN_1018_1f56 Global Code4 36 internal __stdcall16far 4 undefined 0 false false +1020:0002 FUN_1020_0002 Global Code5 91 internal __cdecl16far 0 undefined 0 false false +1020:005d FUN_1020_005d Global Code5 4 internal unknown 2147483647 undefined 0 false false +1020:0061 FUN_1020_0061 Global Code5 113 internal unknown 2147483647 undefined 0 false false +1020:00d2 FUN_1020_00d2 Global Code5 30 internal __cdecl16near 0 undefined 0 false false +1020:00f0 FUN_1020_00f0 Global Code5 23 internal __cdecl16near 0 undefined 0 false false +1020:012d FUN_1020_012d Global Code5 26 internal __stdcall16far 2 undefined 0 false false +1020:0147 FUN_1020_0147 Global Code5 32 internal __stdcall16far 6 undefined 0 false false +1020:0167 FUN_1020_0167 Global Code5 46 internal __cdecl16far 0 undefined 0 false false +1020:0195 runtime_1020_0195 Global Code5 53 internal __cdecl16far 0 undefined 0 false false +1020:01ca FUN_1020_01ca Global Code5 88 internal __cdecl16near 0 undefined 0 false false +1020:0222 FUN_1020_0222 Global Code5 26 internal __cdecl16near 0 undefined 0 false false +1020:023c FUN_1020_023c Global Code5 46 internal __cdecl16near 0 undefined 0 false false +1020:026a FUN_1020_026a Global Code5 60 internal __cdecl16near 0 undefined 0 false false +1020:02a6 FUN_1020_02a6 Global Code5 49 internal __cdecl16near 0 undefined 0 false false +1020:02d7 FUN_1020_02d7 Global Code5 150 internal __cdecl16near 0 undefined 0 false false +1020:0327 FUN_1020_0327 Global Code5 27 internal __cdecl16near 0 undefined 0 false false +1020:0388 FUN_1020_0388 Global Code5 7 internal __cdecl16far 0 undefined 0 false false +1020:038f FUN_1020_038f Global Code5 14 internal __cdecl16far 0 undefined 0 false false +1020:039d FUN_1020_039d Global Code5 40 internal __cdecl16far 0 undefined 0 false false +1020:03c5 runtime_1020_03c5 Global Code5 6 internal unknown 2147483647 undefined 0 false false +1020:03cb FUN_1020_03cb Global Code5 36 internal __cdecl16far 0 undefined 0 false false +1020:03ef FUN_1020_03ef Global Code5 74 internal __cdecl16far 0 undefined 0 false false +1020:0439 FUN_1020_0439 Global Code5 51 internal __cdecl16far 0 undefined 0 false false +1020:046c runtime_1020_046c Global Code5 35 internal __stdcall16far 10 undefined 0 false false +1020:048f runtime_1020_048f Global Code5 16 internal __cdecl16far 0 undefined 0 false false +1020:049f runtime_1020_049f Global Code5 93 internal __stdcall16far 8 undefined 0 false false +1020:04fc runtime_1020_04fc Global Code5 43 internal __stdcall16far 10 undefined 0 false false +1020:0527 FUN_1020_0527 Global Code5 5 internal unknown 4 undefined 0 false false +1020:052c FUN_1020_052c Global Code5 5 internal unknown 4 undefined 0 false false +1020:0534 FUN_1020_0534 Global Code5 78 internal __stdcall16far 4 undefined 0 false false +1020:0586 FUN_1020_0586 Global Code5 65 internal __stdcall16far 4 undefined 0 false false +1020:05c7 FUN_1020_05c7 Global Code5 17 internal __cdecl16near 0 undefined 0 false false +1020:05d8 FUN_1020_05d8 Global Code5 48 internal __stdcall16far 4 undefined 0 false false +1020:0608 FUN_1020_0608 Global Code5 37 internal __stdcall16far 4 undefined 0 false false +1020:062d FUN_1020_062d Global Code5 32 internal __stdcall16far 4 undefined 0 false false +1020:064d FUN_1020_064d Global Code5 25 internal __stdcall16far 4 undefined 0 false false +1020:0667 FUN_1020_0667 Global Code5 68 internal __stdcall16far 8 undefined 0 false false +1020:06ab FUN_1020_06ab Global Code5 95 internal __stdcall16far 6 undefined 0 false false +1020:0710 runtime_1020_0710 Global Code5 28 internal __stdcall16far 4 undefined 0 false false +1020:072c FUN_1020_072c Global Code5 37 internal __stdcall16far 4 undefined 0 false false +1020:0751 FUN_1020_0751 Global Code5 15 internal __cdecl16near 0 undefined 0 false false +1020:0760 runtime_1020_0760 Global Code5 49 internal __stdcall16far 4 undefined 0 false false +1020:0796 runtime_1020_0796 Global Code5 99 internal __stdcall16far 14 undefined 0 false false +1020:07fe FUN_1020_07fe Global Code5 48 internal __stdcall16far 8 undefined 0 false false +1020:082e FUN_1020_082e Global Code5 56 internal __stdcall16far 2 undefined 0 false false +1020:0866 runtime_1020_0866 Global Code5 11 internal __cdecl16far 0 undefined 0 false false +1020:0871 FUN_1020_0871 Global Code5 32 internal __cdecl16near 0 undefined 0 false false +1020:0891 FUN_1020_0891 Global Code5 24 internal __stdcall16far 10 undefined 0 false false +1020:08a9 FUN_1020_08a9 Global Code5 61 internal __cdecl16far 0 undefined 0 false false +1020:08e6 FUN_1020_08e6 Global Code5 166 internal __cdecl16far 0 undefined 0 false false +1020:098c runtime_1020_098c Global Code5 35 internal __cdecl16far 0 undefined 0 false false +1020:09af runtime_1020_09af Global Code5 35 internal __cdecl16far 0 undefined 0 false false +1020:09d2 runtime_1020_09d2 Global Code5 26 internal __stdcall16far 4 undefined 0 false false +1020:09ec FUN_1020_09ec Global Code5 36 internal __stdcall16far 10 undefined 0 false false +1020:0a10 FUN_1020_0a10 Global Code5 65 internal __stdcall16far 8 undefined 0 false false +1020:0a51 FUN_1020_0a51 Global Code5 44 internal __stdcall16far 4 undefined 0 false false +1020:0a7d FUN_1020_0a7d Global Code5 70 internal __stdcall16far 8 undefined 0 false false +1020:0ac3 FUN_1020_0ac3 Global Code5 43 internal __stdcall16far 8 undefined 0 false false +1020:0aee runtime_1020_0aee Global Code5 18 internal __stdcall16far 2 undefined 0 false false +1020:0b00 FUN_1020_0b00 Global Code5 27 internal __stdcall16far 6 undefined 0 false false +1020:0b1b FUN_1020_0b1b Global Code5 95 internal __stdcall16far 12 undefined 0 false false +1020:0b7a FUN_1020_0b7a Global Code5 111 internal __stdcall16far 8 undefined 0 false false +1020:0be9 FUN_1020_0be9 Global Code5 141 internal __stdcall16far 4 undefined 0 false false +1020:0c76 FUN_1020_0c76 Global Code5 90 internal __cdecl16near 0 undefined 0 false false +1020:0cd0 FUN_1020_0cd0 Global Code5 4 internal unknown 2147483647 undefined 0 false false +1020:0cd4 FUN_1020_0cd4 Global Code5 195 internal __cdecl16near 0 undefined 0 false false +1020:0d97 FUN_1020_0d97 Global Code5 251 internal __cdecl16near 0 undefined 0 false false +1020:0e93 FUN_1020_0e93 Global Code5 7 internal __cdecl16near 0 undefined 0 false false +1020:0e9a FUN_1020_0e9a Global Code5 119 internal __cdecl16near 0 undefined 0 false false +1020:0f11 FUN_1020_0f11 Global Code5 23 internal __cdecl16near 0 undefined 0 false false +1020:0f28 FUN_1020_0f28 Global Code5 19 internal __cdecl16near 0 undefined 0 false false +1020:0f3b FUN_1020_0f3b Global Code5 60 internal __cdecl16near 0 undefined 0 false false +1020:0f77 FUN_1020_0f77 Global Code5 110 internal __cdecl16near 0 undefined 0 false false +1020:0fe5 FUN_1020_0fe5 Global Code5 6 internal __cdecl16far 0 undefined 0 false false +1020:0feb FUN_1020_0feb Global Code5 6 internal __cdecl16far 0 undefined 0 false false +1020:0ff1 FUN_1020_0ff1 Global Code5 6 internal unknown 2147483647 undefined 0 false false +1020:0ff7 FUN_1020_0ff7 Global Code5 6 internal __cdecl16far 0 undefined 0 false false +1020:0ffd FUN_1020_0ffd Global Code5 22 internal __cdecl16far 0 undefined 0 false false +1020:1007 FUN_1020_1007 Global Code5 4 internal __cdecl16far 0 undefined 0 false false +1020:100b FUN_1020_100b Global Code5 4 internal __cdecl16far 0 undefined 0 false false +1020:1017 FUN_1020_1017 Global Code5 14 internal __cdecl16far 0 undefined 0 false false +1020:1031 FUN_1020_1031 Global Code5 10 internal __cdecl16near 0 undefined 0 false false +1020:103b runtime_1020_103b Global Code5 10 internal __cdecl16near 0 undefined 0 false false +1020:1045 runtime_1020_1045 Global Code5 10 internal __cdecl16near 0 undefined 0 false false +1020:104f FUN_1020_104f Global Code5 10 internal __cdecl16near 0 undefined 0 false false +1020:1059 runtime_1020_1059 Global Code5 81 internal __cdecl16far 0 undefined 0 false false +1020:10aa runtime_1020_10aa Global Code5 20 internal __cdecl16far 0 undefined 0 false false +1020:10be FUN_1020_10be Global Code5 95 internal __cdecl16far 0 undefined 0 false false +1020:111d runtime_1020_111d Global Code5 116 internal __cdecl16far 0 undefined 0 false false +1020:11bb runtime_1020_11bb Global Code5 133 internal __cdecl16far 0 undefined 0 false false +1020:1264 runtime_1020_1264 Global Code5 115 internal __cdecl16far 0 undefined 0 false false +1020:1307 runtime_1020_1307 Global Code5 225 internal __cdecl16far 0 undefined 0 false false +1020:1436 runtime_1020_1436 Global Code5 6 internal unknown 2147483647 undefined 0 false false +1020:143c FUN_1020_143c Global Code5 25 internal unknown 0 undefined 0 false false +1020:1455 FUN_1020_1455 Global Code5 79 internal __cdecl16near 0 undefined 0 false false +1020:14a4 FUN_1020_14a4 Global Code5 29 internal __stdcall16far 2 undefined 0 false false +1020:14c1 FUN_1020_14c1 Global Code5 29 internal __cdecl16far 0 undefined 0 false false +1020:14de runtime_1020_14de Global Code5 29 internal __cdecl16far 0 undefined 0 false false +1020:1501 FUN_1020_1501 Global Code5 54 internal __cdecl16near 0 undefined 0 false false +1020:1539 runtime_1020_1539 Global Code5 13 internal __cdecl16far 0 undefined 0 false false +1020:1546 FUN_1020_1546 Global Code5 28 internal __cdecl16near 0 undefined 0 false false +1020:1562 FUN_1020_1562 Global Code5 32 internal __cdecl16near 0 undefined 0 false false +1020:1582 FUN_1020_1582 Global Code5 167 internal __cdecl16near 0 undefined 0 false false +1020:1629 FUN_1020_1629 Global Code5 75 internal __stdcall16far 12 undefined 0 false false +1020:1674 FUN_1020_1674 Global Code5 49 internal __stdcall16far 8 undefined 0 false false +1020:16a5 FUN_1020_16a5 Global Code5 36 internal __stdcall16far 10 undefined 0 false false +1020:16c9 FUN_1020_16c9 Global Code5 20 internal __stdcall16far 8 undefined 0 false false +1020:16dd runtime_1020_16dd Global Code5 4 internal __cdecl16far 0 undefined 0 false false +1020:16e1 FUN_1020_16e1 Global Code5 5 internal unknown 2147483647 undefined 0 false false +1020:16e6 FUN_1020_16e6 Global Code5 61 internal __cdecl16near 0 undefined 0 false false +1228:0000 GETVERSION KERNEL EXTERNAL 4 external __stdcall16far 0 uint 0 false true +1228:0004 GLOBALALLOC KERNEL EXTERNAL 4 external __stdcall16far 6 ushort 2 false true +1228:0008 GLOBALFREE KERNEL EXTERNAL 4 external __stdcall16far 2 ushort 1 false true +1228:000c GLOBALLOCK KERNEL EXTERNAL 4 external __stdcall16far 2 uint 1 false true +1228:0010 GLOBALUNLOCK KERNEL EXTERNAL 4 external __stdcall16far 2 ushort 1 false true +1228:0014 GLOBALHANDLE KERNEL EXTERNAL 4 external __stdcall16far 2 uint 1 false true +1228:0018 GLOBALCOMPACT KERNEL EXTERNAL 4 external __stdcall16far 4 uint 1 false true +1228:001c WAITEVENT KERNEL EXTERNAL 4 external __stdcall16far 2 ushort 1 false true +1228:0020 GETCURRENTTASK KERNEL EXTERNAL 4 external __stdcall16far 0 uint 0 false true +1228:0024 GETMODULEHANDLE KERNEL EXTERNAL 4 external __stdcall16far 4 uint 1 false true +1228:0028 GETMODULEFILENAME KERNEL EXTERNAL 4 external __stdcall16far 8 ushort 3 false true +1228:002c GETPROCADDRESS KERNEL EXTERNAL 4 external __stdcall16far 6 uint 2 false true +1228:0030 MAKEPROCINSTANCE KERNEL EXTERNAL 4 external __stdcall16far 6 uint 2 false true +1228:0034 FREEPROCINSTANCE KERNEL EXTERNAL 4 external __stdcall16far 4 ushort 1 false true +1228:0038 FINDRESOURCE KERNEL EXTERNAL 4 external __stdcall16far 10 ushort 3 false true +1228:003c LOADRESOURCE KERNEL EXTERNAL 4 external __stdcall16far 4 ushort 2 false true +1228:0040 LOCKRESOURCE KERNEL EXTERNAL 4 external __stdcall16far 2 uint 1 false true +1228:0044 FREERESOURCE KERNEL EXTERNAL 4 external __stdcall16far 2 ushort 1 false true +1228:0048 _LCLOSE KERNEL EXTERNAL 4 external __stdcall16far 2 ushort 1 false true +1228:004c _LREAD KERNEL EXTERNAL 4 external __stdcall16far 8 ushort 3 false true +1228:0050 _LCREAT KERNEL EXTERNAL 4 external __stdcall16far 6 ushort 2 false true +1228:0054 _LOPEN KERNEL EXTERNAL 4 external __stdcall16far 6 ushort 2 false true +1228:0058 _LWRITE KERNEL EXTERNAL 4 external __stdcall16far 8 ushort 3 false true +1228:005c INITTASK KERNEL EXTERNAL 4 external unknown 0 undefined 0 false true +1228:0060 LOADLIBRARY KERNEL EXTERNAL 4 external __stdcall16far 4 ushort 1 false true +1228:0064 FREELIBRARY KERNEL EXTERNAL 4 external __stdcall16far 2 ushort 1 false true +1228:0068 SETERRORMODE KERNEL EXTERNAL 4 external __stdcall16far 2 ushort 1 false true +1228:006c __AHINCR KERNEL EXTERNAL 4 external unknown 2147483647 undefined 0 false true +1228:0070 GETPRIVATEPROFILEINT KERNEL EXTERNAL 4 external unknown 14 undefined 0 false true +1228:0074 GETDOSENVIRONMENT KERNEL EXTERNAL 4 external unknown 0 undefined 0 false true +1228:0078 GETWINFLAGS KERNEL EXTERNAL 4 external unknown 0 undefined 0 false true +1228:007c GETWINDOWSDIRECTORY KERNEL EXTERNAL 4 external unknown 6 undefined 0 false true +1228:0080 GETSYSTEMDIRECTORY KERNEL EXTERNAL 4 external unknown 6 undefined 0 false true +1228:0084 GETFREESPACE KERNEL EXTERNAL 4 external unknown 2 undefined 0 false true +1228:0088 ALLOCCSTODSALIAS KERNEL EXTERNAL 4 external unknown 2 undefined 0 false true +1228:008c FREESELECTOR KERNEL EXTERNAL 4 external unknown 2 undefined 0 false true +1228:0090 PRESTOCHANGOSELECTOR KERNEL EXTERNAL 4 external unknown 4 undefined 0 false true +1228:0094 SYSTEMTIMERMAKE MMTIMER EXTERNAL 4 external unknown 8 undefined 0 false true +1228:0098 SNDPLAYSOUND MMSYSTEM EXTERNAL 4 external unknown 6 undefined 0 false true +1228:009c WAVEOUTGETNUMDEVS MMSYSTEM EXTERNAL 4 external unknown 0 undefined 0 false true +1228:00a0 WAVEOUTGETDEVCAPS MMSYSTEM EXTERNAL 4 external unknown 8 undefined 0 false true +1228:00a4 WAVEOUTGETVOLUME MMSYSTEM EXTERNAL 4 external unknown 6 undefined 0 false true +1228:00a8 TIMEKILLEVENT MMSYSTEM EXTERNAL 4 external unknown 2147483647 undefined 0 false true +1228:00ac GETVERSION KERNEL EXTERNAL 4 external __stdcall16far 0 uint 0 false true +1228:00b0 GLOBALALLOC KERNEL EXTERNAL 4 external __stdcall16far 6 ushort 2 false true +1228:00b4 GLOBALFREE KERNEL EXTERNAL 4 external __stdcall16far 2 ushort 1 false true +1228:00b8 GLOBALLOCK KERNEL EXTERNAL 4 external __stdcall16far 2 uint 1 false true +1228:00bc GLOBALUNLOCK KERNEL EXTERNAL 4 external __stdcall16far 2 ushort 1 false true +1228:00c0 GLOBALHANDLE KERNEL EXTERNAL 4 external __stdcall16far 2 uint 1 false true +1228:00c4 GLOBALCOMPACT KERNEL EXTERNAL 4 external __stdcall16far 4 uint 1 false true +1228:00c8 WAITEVENT KERNEL EXTERNAL 4 external __stdcall16far 2 ushort 1 false true +1228:00cc GETCURRENTTASK KERNEL EXTERNAL 4 external __stdcall16far 0 uint 0 false true +1228:00d0 GETMODULEHANDLE KERNEL EXTERNAL 4 external __stdcall16far 4 uint 1 false true +1228:00d4 GETMODULEFILENAME KERNEL EXTERNAL 4 external __stdcall16far 8 ushort 3 false true +1228:00d8 GETPROCADDRESS KERNEL EXTERNAL 4 external __stdcall16far 6 uint 2 false true +1228:00dc MAKEPROCINSTANCE KERNEL EXTERNAL 4 external __stdcall16far 6 uint 2 false true +1228:00e0 FREEPROCINSTANCE KERNEL EXTERNAL 4 external __stdcall16far 4 ushort 1 false true +1228:00e4 FINDRESOURCE KERNEL EXTERNAL 4 external __stdcall16far 10 ushort 3 false true +1228:00e8 LOADRESOURCE KERNEL EXTERNAL 4 external __stdcall16far 4 ushort 2 false true +1228:00ec LOCKRESOURCE KERNEL EXTERNAL 4 external __stdcall16far 2 uint 1 false true +1228:00f0 FREERESOURCE KERNEL EXTERNAL 4 external __stdcall16far 2 ushort 1 false true +1228:00f4 _LCLOSE KERNEL EXTERNAL 4 external __stdcall16far 2 ushort 1 false true +1228:00f8 _LREAD KERNEL EXTERNAL 4 external __stdcall16far 8 ushort 3 false true +1228:00fc _LCREAT KERNEL EXTERNAL 4 external __stdcall16far 6 ushort 2 false true +1228:0100 _LOPEN KERNEL EXTERNAL 4 external __stdcall16far 6 ushort 2 false true +1228:0104 _LWRITE KERNEL EXTERNAL 4 external __stdcall16far 8 ushort 3 false true +1228:0108 INITTASK KERNEL EXTERNAL 4 external unknown 0 undefined 0 false true +1228:010c LOADLIBRARY KERNEL EXTERNAL 4 external __stdcall16far 4 ushort 1 false true +1228:0110 FREELIBRARY KERNEL EXTERNAL 4 external __stdcall16far 2 ushort 1 false true +1228:0114 SETERRORMODE KERNEL EXTERNAL 4 external __stdcall16far 2 ushort 1 false true +1228:0118 __AHINCR KERNEL EXTERNAL 4 external unknown 2147483647 undefined 0 false true +1228:011c GETPRIVATEPROFILEINT KERNEL EXTERNAL 4 external unknown 14 undefined 0 false true +1228:0120 GETDOSENVIRONMENT KERNEL EXTERNAL 4 external unknown 0 undefined 0 false true +1228:0124 GETWINFLAGS KERNEL EXTERNAL 4 external unknown 0 undefined 0 false true +1228:0128 GETWINDOWSDIRECTORY KERNEL EXTERNAL 4 external unknown 6 undefined 0 false true +1228:012c GETSYSTEMDIRECTORY KERNEL EXTERNAL 4 external unknown 6 undefined 0 false true +1228:0130 GETFREESPACE KERNEL EXTERNAL 4 external unknown 2 undefined 0 false true +1228:0134 ALLOCCSTODSALIAS KERNEL EXTERNAL 4 external unknown 2 undefined 0 false true +1228:0138 FREESELECTOR KERNEL EXTERNAL 4 external unknown 2 undefined 0 false true +1228:013c PRESTOCHANGOSELECTOR KERNEL EXTERNAL 4 external unknown 4 undefined 0 false true +1228:0140 SETBKCOLOR GDI EXTERNAL 4 external unknown 6 undefined 0 false true +1228:0144 SETBKMODE GDI EXTERNAL 4 external unknown 4 undefined 0 false true +1228:0148 SETTEXTCOLOR GDI EXTERNAL 4 external unknown 6 undefined 0 false true +1228:014c TEXTOUT GDI EXTERNAL 4 external unknown 12 undefined 0 false true +1228:0150 BITBLT GDI EXTERNAL 4 external unknown 20 undefined 0 false true +1228:0154 SELECTOBJECT GDI EXTERNAL 4 external unknown 4 undefined 0 false true +1228:0158 CREATECOMPATIBLEBITMAP GDI EXTERNAL 4 external unknown 6 undefined 0 false true +1228:015c CREATECOMPATIBLEDC GDI EXTERNAL 4 external unknown 2 undefined 0 false true +1228:0160 CREATEDC GDI EXTERNAL 4 external unknown 16 undefined 0 false true +1228:0164 DELETEDC GDI EXTERNAL 4 external unknown 2 undefined 0 false true +1228:0168 DELETEOBJECT GDI EXTERNAL 4 external unknown 2 undefined 0 false true +1228:016c GETSTOCKOBJECT GDI EXTERNAL 4 external unknown 2 undefined 0 false true +1228:0170 GETTEXTCOLOR GDI EXTERNAL 4 external unknown 2 undefined 0 false true +1228:0174 GETTEXTMETRICS GDI EXTERNAL 4 external unknown 6 undefined 0 false true +1228:0178 UNREALIZEOBJECT GDI EXTERNAL 4 external unknown 2 undefined 0 false true +1228:017c SETTEXTALIGN GDI EXTERNAL 4 external unknown 4 undefined 0 false true +1228:0180 CREATEPALETTE GDI EXTERNAL 4 external unknown 4 undefined 0 false true +1228:0184 UPDATECOLORS GDI EXTERNAL 4 external unknown 2 undefined 0 false true +1228:0188 CREATEDIBITMAP GDI EXTERNAL 4 external unknown 20 undefined 0 false true +1228:018c MESSAGEBOX USER EXTERNAL 4 external unknown 12 undefined 0 false true +1228:0190 INITAPP USER EXTERNAL 4 external unknown 2 undefined 0 false true +1228:0194 POSTQUITMESSAGE USER EXTERNAL 4 external unknown 0 undefined 0 false true +1228:0198 GETTICKCOUNT USER EXTERNAL 4 external unknown 2147483647 undefined 0 false true +1228:019c SETCAPTURE USER EXTERNAL 4 external unknown 2 undefined 0 false true +1228:01a0 RELEASECAPTURE USER EXTERNAL 4 external unknown 0 undefined 0 false true +1228:01a4 SETFOCUS USER EXTERNAL 4 external unknown 2 undefined 0 false true +1228:01a8 GETFOCUS USER EXTERNAL 4 external unknown 0 undefined 0 false true +1228:01ac REMOVEPROP USER EXTERNAL 4 external unknown 6 undefined 0 false true +1228:01b0 GETPROP USER EXTERNAL 4 external unknown 6 undefined 0 false true +1228:01b4 SETPROP USER EXTERNAL 4 external unknown 8 undefined 0 false true +1228:01b8 SCREENTOCLIENT USER EXTERNAL 4 external unknown 6 undefined 0 false true +1228:01bc ISICONIC USER EXTERNAL 4 external unknown 0 undefined 0 false true +1228:01c0 GETWINDOWRECT USER EXTERNAL 4 external unknown 6 undefined 0 false true +1228:01c4 GETCLIENTRECT USER EXTERNAL 4 external unknown 6 undefined 0 false true +1228:01c8 GETWINDOWTEXT USER EXTERNAL 4 external unknown 0 undefined 0 false true +1228:01cc SETWINDOWTEXT USER EXTERNAL 4 external unknown 0 undefined 0 false true +1228:01d0 BEGINPAINT USER EXTERNAL 4 external unknown 8 undefined 0 false true +1228:01d4 ENDPAINT USER EXTERNAL 4 external unknown 6 undefined 0 false true +1228:01d8 CREATEWINDOW USER EXTERNAL 4 external unknown 34 undefined 0 false true +1228:01dc SHOWWINDOW USER EXTERNAL 4 external unknown 4 undefined 0 false true +1228:01e0 GETPARENT USER EXTERNAL 4 external unknown 2 undefined 0 false true +1228:01e4 ISWINDOW USER EXTERNAL 4 external unknown 0 undefined 0 false true +1228:01e8 ISCHILD USER EXTERNAL 4 external unknown 0 undefined 0 false true +1228:01ec DESTROYWINDOW USER EXTERNAL 4 external unknown 2 undefined 0 false true +1228:01f0 REGISTERCLASS USER EXTERNAL 4 external unknown 4 undefined 0 false true +1228:01f4 SCROLLWINDOW USER EXTERNAL 4 external unknown 14 undefined 0 false true +1228:01f8 SETSCROLLPOS USER EXTERNAL 4 external unknown 8 undefined 0 false true +1228:01fc SETSCROLLRANGE USER EXTERNAL 4 external unknown 10 undefined 0 false true +1228:0200 GETDC USER EXTERNAL 4 external unknown 2 undefined 0 false true +1228:0204 RELEASEDC USER EXTERNAL 4 external unknown 4 undefined 0 false true +1228:0208 SETCURSOR USER EXTERNAL 4 external unknown 2 undefined 0 false true +1228:020c ENDDIALOG USER EXTERNAL 4 external unknown 4 undefined 0 false true +1228:0210 ISDIALOGMESSAGE USER EXTERNAL 4 external unknown 6 undefined 0 false true +1228:0214 GETDLGITEM USER EXTERNAL 4 external unknown 4 undefined 0 false true +1228:0218 SETDLGITEMTEXT USER EXTERNAL 4 external unknown 8 undefined 0 false true +1228:021c GETDLGITEMTEXT USER EXTERNAL 4 external unknown 10 undefined 0 false true +1228:0220 SENDDLGITEMMESSAGE USER EXTERNAL 4 external unknown 12 undefined 0 false true +1228:0224 MESSAGEBEEP USER EXTERNAL 4 external unknown 2 undefined 0 false true +1228:0228 GETKEYSTATE USER EXTERNAL 4 external unknown 0 undefined 0 false true +1228:022c DEFWINDOWPROC USER EXTERNAL 4 external unknown 10 undefined 0 false true +1228:0230 GETMESSAGE USER EXTERNAL 4 external unknown 14 undefined 0 false true +1228:0234 PEEKMESSAGE USER EXTERNAL 4 external unknown 14 undefined 0 false true +1228:0238 SENDMESSAGE USER EXTERNAL 4 external unknown 10 undefined 0 false true +1228:023c WAITMESSAGE USER EXTERNAL 4 external unknown 0 undefined 0 false true +1228:0240 TRANSLATEMESSAGE USER EXTERNAL 4 external unknown 4 undefined 0 false true +1228:0244 DISPATCHMESSAGE USER EXTERNAL 4 external unknown 4 undefined 0 false true +1228:0248 CALLWINDOWPROC USER EXTERNAL 4 external unknown 14 undefined 0 false true +1228:024c UPDATEWINDOW USER EXTERNAL 4 external unknown 2 undefined 0 false true +1228:0250 INVALIDATERECT USER EXTERNAL 4 external unknown 10 undefined 0 false true +1228:0254 GETWINDOWWORD USER EXTERNAL 4 external unknown 4 undefined 0 false true +1228:0258 GETWINDOWLONG USER EXTERNAL 4 external unknown 4 undefined 0 false true +1228:025c SETWINDOWLONG USER EXTERNAL 4 external unknown 8 undefined 0 false true +1228:0260 ENABLEMENUITEM USER EXTERNAL 4 external unknown 6 undefined 0 false true +1228:0264 GETSYSTEMMENU USER EXTERNAL 4 external unknown 4 undefined 0 false true +1228:0268 CREATECARET USER EXTERNAL 4 external unknown 8 undefined 0 false true +1228:026c DESTROYCARET USER EXTERNAL 4 external unknown 0 undefined 0 false true +1228:0270 SETCARETPOS USER EXTERNAL 4 external unknown 4 undefined 0 false true +1228:0274 SHOWCARET USER EXTERNAL 4 external unknown 2 undefined 0 false true +1228:0278 LOADCURSOR USER EXTERNAL 4 external unknown 6 undefined 0 false true +1228:027c LOADICON USER EXTERNAL 4 external unknown 6 undefined 0 false true +1228:0280 LOADBITMAP USER EXTERNAL 4 external unknown 6 undefined 0 false true +1228:0284 TRANSLATEACCELERATOR USER EXTERNAL 4 external unknown 8 undefined 0 false true +1228:0288 GETSYSTEMMETRICS USER EXTERNAL 4 external unknown 0 undefined 0 false true +1228:028c GETSYSCOLOR USER EXTERNAL 4 external unknown 0 undefined 0 false true +1228:0290 DIALOGBOXPARAM USER EXTERNAL 4 external unknown 16 undefined 0 false true +1228:0294 CREATEDIALOGPARAM USER EXTERNAL 4 external unknown 16 undefined 0 false true +1228:0298 ISZOOMED USER EXTERNAL 4 external unknown 0 undefined 0 false true +1228:029c SELECTPALETTE USER EXTERNAL 4 external unknown 6 undefined 0 false true +1228:02a0 REALIZEPALETTE USER EXTERNAL 4 external unknown 2 undefined 0 false true +1228:02a4 DEFDLGPROC USER EXTERNAL 4 external unknown 10 undefined 0 false true +1228:02a8 GETCLASSINFO USER EXTERNAL 4 external unknown 10 undefined 0 false true +1228:02ac WVSPRINTF USER EXTERNAL 4 external unknown 12 undefined 0 false true +1228:02b0 DEFMDICHILDPROC USER EXTERNAL 4 external unknown 10 undefined 0 false true +1228:02b4 TRANSLATEMDISYSACCEL USER EXTERNAL 4 external unknown 6 undefined 0 false true +1228:02b8 CREATEWINDOWEX USER EXTERNAL 4 external unknown 34 undefined 0 false true +1228:02bc Ordinal_5 KEYBOARD EXTERNAL 4 external unknown 2147483647 undefined 0 false true +1228:02c0 Ordinal_6 KEYBOARD EXTERNAL 4 external unknown 2147483647 undefined 0 false true +1228:02c4 GETVERSION KERNEL EXTERNAL 4 external __stdcall16far 0 uint 0 false true +1228:02c8 GLOBALALLOC KERNEL EXTERNAL 4 external __stdcall16far 6 ushort 2 false true +1228:02cc GLOBALFREE KERNEL EXTERNAL 4 external __stdcall16far 2 ushort 1 false true +1228:02d0 GLOBALLOCK KERNEL EXTERNAL 4 external __stdcall16far 2 uint 1 false true +1228:02d4 GLOBALUNLOCK KERNEL EXTERNAL 4 external __stdcall16far 2 ushort 1 false true +1228:02d8 GLOBALHANDLE KERNEL EXTERNAL 4 external __stdcall16far 2 uint 1 false true +1228:02dc GLOBALCOMPACT KERNEL EXTERNAL 4 external __stdcall16far 4 uint 1 false true +1228:02e0 WAITEVENT KERNEL EXTERNAL 4 external __stdcall16far 2 ushort 1 false true +1228:02e4 GETCURRENTTASK KERNEL EXTERNAL 4 external __stdcall16far 0 uint 0 false true +1228:02e8 GETMODULEHANDLE KERNEL EXTERNAL 4 external __stdcall16far 4 uint 1 false true +1228:02ec GETMODULEFILENAME KERNEL EXTERNAL 4 external __stdcall16far 8 ushort 3 false true +1228:02f0 GETPROCADDRESS KERNEL EXTERNAL 4 external __stdcall16far 6 uint 2 false true +1228:02f4 MAKEPROCINSTANCE KERNEL EXTERNAL 4 external __stdcall16far 6 uint 2 false true +1228:02f8 FREEPROCINSTANCE KERNEL EXTERNAL 4 external __stdcall16far 4 ushort 1 false true +1228:02fc FINDRESOURCE KERNEL EXTERNAL 4 external __stdcall16far 10 ushort 3 false true +1228:0300 LOADRESOURCE KERNEL EXTERNAL 4 external __stdcall16far 4 ushort 2 false true +1228:0304 LOCKRESOURCE KERNEL EXTERNAL 4 external __stdcall16far 2 uint 1 false true +1228:0308 FREERESOURCE KERNEL EXTERNAL 4 external __stdcall16far 2 ushort 1 false true +1228:030c _LCLOSE KERNEL EXTERNAL 4 external __stdcall16far 2 ushort 1 false true +1228:0310 _LREAD KERNEL EXTERNAL 4 external __stdcall16far 8 ushort 3 false true +1228:0314 _LCREAT KERNEL EXTERNAL 4 external __stdcall16far 6 ushort 2 false true +1228:0318 _LOPEN KERNEL EXTERNAL 4 external __stdcall16far 6 ushort 2 false true +1228:031c _LWRITE KERNEL EXTERNAL 4 external __stdcall16far 8 ushort 3 false true +1228:0320 INITTASK KERNEL EXTERNAL 4 external unknown 0 undefined 0 false true +1228:0324 LOADLIBRARY KERNEL EXTERNAL 4 external __stdcall16far 4 ushort 1 false true +1228:0328 FREELIBRARY KERNEL EXTERNAL 4 external __stdcall16far 2 ushort 1 false true +1228:032c SETERRORMODE KERNEL EXTERNAL 4 external __stdcall16far 2 ushort 1 false true +1228:0330 __AHINCR KERNEL EXTERNAL 4 external unknown 2147483647 undefined 0 false true +1228:0334 GETPRIVATEPROFILEINT KERNEL EXTERNAL 4 external unknown 14 undefined 0 false true +1228:0338 GETDOSENVIRONMENT KERNEL EXTERNAL 4 external unknown 0 undefined 0 false true +1228:033c GETWINFLAGS KERNEL EXTERNAL 4 external unknown 0 undefined 0 false true +1228:0340 GETWINDOWSDIRECTORY KERNEL EXTERNAL 4 external unknown 6 undefined 0 false true +1228:0344 GETSYSTEMDIRECTORY KERNEL EXTERNAL 4 external unknown 6 undefined 0 false true +1228:0348 GETFREESPACE KERNEL EXTERNAL 4 external unknown 2 undefined 0 false true +1228:034c ALLOCCSTODSALIAS KERNEL EXTERNAL 4 external unknown 2 undefined 0 false true +1228:0350 FREESELECTOR KERNEL EXTERNAL 4 external unknown 2 undefined 0 false true +1228:0354 PRESTOCHANGOSELECTOR KERNEL EXTERNAL 4 external unknown 4 undefined 0 false true +1228:0358 MESSAGEBOX USER EXTERNAL 4 external unknown 12 undefined 0 false true +1228:035c INITAPP USER EXTERNAL 4 external unknown 2 undefined 0 false true +1228:0360 POSTQUITMESSAGE USER EXTERNAL 4 external unknown 0 undefined 0 false true +1228:0364 GETTICKCOUNT USER EXTERNAL 4 external unknown 2147483647 undefined 0 false true +1228:0368 SETCAPTURE USER EXTERNAL 4 external unknown 2 undefined 0 false true +1228:036c RELEASECAPTURE USER EXTERNAL 4 external unknown 0 undefined 0 false true +1228:0370 SETFOCUS USER EXTERNAL 4 external unknown 2 undefined 0 false true +1228:0374 GETFOCUS USER EXTERNAL 4 external unknown 0 undefined 0 false true +1228:0378 REMOVEPROP USER EXTERNAL 4 external unknown 6 undefined 0 false true +1228:037c GETPROP USER EXTERNAL 4 external unknown 6 undefined 0 false true +1228:0380 SETPROP USER EXTERNAL 4 external unknown 8 undefined 0 false true +1228:0384 SCREENTOCLIENT USER EXTERNAL 4 external unknown 6 undefined 0 false true +1228:0388 ISICONIC USER EXTERNAL 4 external unknown 0 undefined 0 false true +1228:038c GETWINDOWRECT USER EXTERNAL 4 external unknown 6 undefined 0 false true +1228:0390 GETCLIENTRECT USER EXTERNAL 4 external unknown 6 undefined 0 false true +1228:0394 GETWINDOWTEXT USER EXTERNAL 4 external unknown 0 undefined 0 false true +1228:0398 SETWINDOWTEXT USER EXTERNAL 4 external unknown 0 undefined 0 false true +1228:039c BEGINPAINT USER EXTERNAL 4 external unknown 8 undefined 0 false true +1228:03a0 ENDPAINT USER EXTERNAL 4 external unknown 6 undefined 0 false true +1228:03a4 CREATEWINDOW USER EXTERNAL 4 external unknown 34 undefined 0 false true +1228:03a8 SHOWWINDOW USER EXTERNAL 4 external unknown 4 undefined 0 false true +1228:03ac GETPARENT USER EXTERNAL 4 external unknown 2 undefined 0 false true +1228:03b0 ISWINDOW USER EXTERNAL 4 external unknown 0 undefined 0 false true +1228:03b4 ISCHILD USER EXTERNAL 4 external unknown 0 undefined 0 false true +1228:03b8 DESTROYWINDOW USER EXTERNAL 4 external unknown 2 undefined 0 false true +1228:03bc REGISTERCLASS USER EXTERNAL 4 external unknown 4 undefined 0 false true +1228:03c0 SCROLLWINDOW USER EXTERNAL 4 external unknown 14 undefined 0 false true +1228:03c4 SETSCROLLPOS USER EXTERNAL 4 external unknown 8 undefined 0 false true +1228:03c8 SETSCROLLRANGE USER EXTERNAL 4 external unknown 10 undefined 0 false true +1228:03cc GETDC USER EXTERNAL 4 external unknown 2 undefined 0 false true +1228:03d0 RELEASEDC USER EXTERNAL 4 external unknown 4 undefined 0 false true +1228:03d4 SETCURSOR USER EXTERNAL 4 external unknown 2 undefined 0 false true +1228:03d8 ENDDIALOG USER EXTERNAL 4 external unknown 4 undefined 0 false true +1228:03dc ISDIALOGMESSAGE USER EXTERNAL 4 external unknown 6 undefined 0 false true +1228:03e0 GETDLGITEM USER EXTERNAL 4 external unknown 4 undefined 0 false true +1228:03e4 SETDLGITEMTEXT USER EXTERNAL 4 external unknown 8 undefined 0 false true +1228:03e8 GETDLGITEMTEXT USER EXTERNAL 4 external unknown 10 undefined 0 false true +1228:03ec SENDDLGITEMMESSAGE USER EXTERNAL 4 external unknown 12 undefined 0 false true +1228:03f0 MESSAGEBEEP USER EXTERNAL 4 external unknown 2 undefined 0 false true +1228:03f4 GETKEYSTATE USER EXTERNAL 4 external unknown 0 undefined 0 false true +1228:03f8 DEFWINDOWPROC USER EXTERNAL 4 external unknown 10 undefined 0 false true +1228:03fc GETMESSAGE USER EXTERNAL 4 external unknown 14 undefined 0 false true +1228:0400 PEEKMESSAGE USER EXTERNAL 4 external unknown 14 undefined 0 false true +1228:0404 SENDMESSAGE USER EXTERNAL 4 external unknown 10 undefined 0 false true +1228:0408 WAITMESSAGE USER EXTERNAL 4 external unknown 0 undefined 0 false true +1228:040c TRANSLATEMESSAGE USER EXTERNAL 4 external unknown 4 undefined 0 false true +1228:0410 DISPATCHMESSAGE USER EXTERNAL 4 external unknown 4 undefined 0 false true +1228:0414 CALLWINDOWPROC USER EXTERNAL 4 external unknown 14 undefined 0 false true +1228:0418 UPDATEWINDOW USER EXTERNAL 4 external unknown 2 undefined 0 false true +1228:041c INVALIDATERECT USER EXTERNAL 4 external unknown 10 undefined 0 false true +1228:0420 GETWINDOWWORD USER EXTERNAL 4 external unknown 4 undefined 0 false true +1228:0424 GETWINDOWLONG USER EXTERNAL 4 external unknown 4 undefined 0 false true +1228:0428 SETWINDOWLONG USER EXTERNAL 4 external unknown 8 undefined 0 false true +1228:042c ENABLEMENUITEM USER EXTERNAL 4 external unknown 6 undefined 0 false true +1228:0430 GETSYSTEMMENU USER EXTERNAL 4 external unknown 4 undefined 0 false true +1228:0434 CREATECARET USER EXTERNAL 4 external unknown 8 undefined 0 false true +1228:0438 DESTROYCARET USER EXTERNAL 4 external unknown 0 undefined 0 false true +1228:043c SETCARETPOS USER EXTERNAL 4 external unknown 4 undefined 0 false true +1228:0440 SHOWCARET USER EXTERNAL 4 external unknown 2 undefined 0 false true +1228:0444 LOADCURSOR USER EXTERNAL 4 external unknown 6 undefined 0 false true +1228:0448 LOADICON USER EXTERNAL 4 external unknown 6 undefined 0 false true +1228:044c LOADBITMAP USER EXTERNAL 4 external unknown 6 undefined 0 false true +1228:0450 TRANSLATEACCELERATOR USER EXTERNAL 4 external unknown 8 undefined 0 false true +1228:0454 GETSYSTEMMETRICS USER EXTERNAL 4 external unknown 0 undefined 0 false true +1228:0458 GETSYSCOLOR USER EXTERNAL 4 external unknown 0 undefined 0 false true +1228:045c DIALOGBOXPARAM USER EXTERNAL 4 external unknown 16 undefined 0 false true +1228:0460 CREATEDIALOGPARAM USER EXTERNAL 4 external unknown 16 undefined 0 false true +1228:0464 ISZOOMED USER EXTERNAL 4 external unknown 0 undefined 0 false true +1228:0468 SELECTPALETTE USER EXTERNAL 4 external unknown 6 undefined 0 false true +1228:046c REALIZEPALETTE USER EXTERNAL 4 external unknown 2 undefined 0 false true +1228:0470 DEFDLGPROC USER EXTERNAL 4 external unknown 10 undefined 0 false true +1228:0474 GETCLASSINFO USER EXTERNAL 4 external unknown 10 undefined 0 false true +1228:0478 WVSPRINTF USER EXTERNAL 4 external unknown 12 undefined 0 false true +1228:047c DEFMDICHILDPROC USER EXTERNAL 4 external unknown 10 undefined 0 false true +1228:0480 TRANSLATEMDISYSACCEL USER EXTERNAL 4 external unknown 6 undefined 0 false true +1228:0484 CREATEWINDOWEX USER EXTERNAL 4 external unknown 34 undefined 0 false true +1228:0488 Ordinal_5 KEYBOARD EXTERNAL 4 external unknown 2147483647 undefined 0 false true +1228:048c Ordinal_6 KEYBOARD EXTERNAL 4 external unknown 2147483647 undefined 0 false true diff --git a/original/CALLBACK_RECONSTRUCTION.tsv b/original/CALLBACK_RECONSTRUCTION.tsv new file mode 100644 index 0000000..893cc72 --- /dev/null +++ b/original/CALLBACK_RECONSTRUCTION.tsv @@ -0,0 +1,7 @@ +registration_site registering_function api status stage callback_address callback_name lifetime evidence notes +1008:2593 FUN_1008_2554 REGISTERCLASS verified static-wndclass 1008:2219 tpwincrt_window_proc Registered once for the process-wide TPWinCrt class when DGROUP 06fc is zero. DGROUP relocation 0564 -> TFLIPPK export ordinal 119 (1008:2219); WNDCLASS16 begins at 1028:0562; class name pointer 1028:0578 -> TPWinCrt. The 10-byte far callback has the exact WNDPROC16 stack shape and dispatches known window messages before DefWindowProc16. +1008:297b FUN_1008_295c SYSTEMTIMERMAKE verified companion-timer-callback MMTIMER.DLL 1000:0002 mmtimer_post_message_callback Installed by each SystemTimerMake call and removed through timeKillEvent16 using the returned timer id. MMTIMER.DLL export 1 at 1000:0039 and callback disassembly at 1000:0002; TDK wrapper 1008:295c. SystemTimerMake receives HWND, delay, resolution, and one-shot flag; its internal timeSetEvent16 callback posts message 0x0580 to that HWND. +1008:2ab1 FUN_1008_2a45 CREATEDIALOGPARAM verified dynamic-object-thunk dynamic thunk -> 1018:0133 object_dispatch_window_or_dialog_proc A 7-byte bound-object thunk is allocated from the verified 256-byte pool by 1018:01dc and returned by 1018:02fa during 1018:03ff destruction. CreateDialogParam16 push sequence at 1008:2a8f-2ab1; object callback fields +12/+14; verified dispatcher 1018:0133; reconstructed/tests/test_bound_thunks.c and test_message_dispatch.c. The callback argument is the bound thunk, not template fields +1d/+1f. Exact HWND/message/WPARAM/LPARAM record construction, dynamic VMT dispatch, and returned LRESULT are verified. +1008:2b64 FUN_1008_2ae3 DIALOGBOXPARAM verified dynamic-object-thunk dynamic thunk -> 1018:0133 object_dispatch_window_or_dialog_proc A 7-byte bound-object thunk is allocated from the verified 256-byte pool by 1018:01dc and returned by 1018:02fa during 1018:03ff destruction. DialogBoxParam16 push sequence at 1008:2b42-2b64; object callback fields +12/+14; verified dispatcher 1018:0133; reconstructed/tests/test_bound_thunks.c and test_message_dispatch.c. The modal and modeless dialog paths use the same object-bound dispatcher with exact message-record and LRESULT semantics; owner preservation remains accounted in the enclosing function ledger. +1018:0e86 FUN_1018_0e46 REGISTERCLASS verified class-bootstrap-wndproc 1018:018b object_window_bootstrap_proc Verified class-registration function 1018:0e46 first checks GetClassInfo, builds exact WNDCLASS16 only when absent, and registers bootstrap 1018:018b. Four VMT occurrences place 1018:0e46 at slot +0x1c; relocations 1018:12e1/12e4 select NE entry 211; class-registration and bootstrap-transition tests cover both sides. All concrete paths transition from verified bootstrap WNDPROC16 1018:018b to verified object-bound dispatcher 1018:0133; the abstract variant terminates through verified Runtime Error 211. +1018:1ac7 FUN_1018_1a61 MAKEPROCINSTANCE verified shared-dispatch-proc-instance 1018:0133 object_dispatch_window_or_dialog_proc Created once into verified DGROUP 0672:0674 by 1018:1a61 and released by FreeProcInstance16 in verified 1018:1b08. MAKEPROCINSTANCE relocation resolves FFFF:FFFF to NE entry 210 (1018:0133); verified application lifecycle, thunk pool, and message-dispatch tests. This process-wide proc instance is copied into each generated bound-object thunk; its complete stack record, hook, dynamic-handler, and LRESULT behavior are now address-linked readable C. diff --git a/original/CODE_DATA_OBJECTS.tsv b/original/CODE_DATA_OBJECTS.tsv new file mode 100644 index 0000000..ccfad67 --- /dev/null +++ b/original/CODE_DATA_OBJECTS.tsv @@ -0,0 +1,19 @@ +start end bytes status object_id object_name c_type initialization readers evidence notes +1000:0000 1000:0001 2 verified code_segment_1_tag code_segment_1_tag uint16_t Static word 0001. NE loader/segment inventory Binary bytes and NE_SEGMENTS.tsv segment 1 mapping. Compiler-emitted ordinal tag at the start of Code1; explicitly data, never executed. +1000:026e 1000:026f 2 verified code1_dot_short_string code1_dot_short_string const uint8_t[2] Static bytes 01 2e. Verified executable-segment pointer and sole Position consumer in 1000:0270; generated setup tests Exact Turbo Pascal ShortString "." used to locate and replace the executable extension with INI. +1008:0000 1008:0001 2 verified code_segment_2_tag code_segment_2_tag uint16_t Static word 0002. NE loader/segment inventory Binary bytes and NE_SEGMENTS.tsv segment 2 mapping. Compiler-emitted ordinal tag at the start of Code2; explicitly data, never executed. +1008:0f2c 1008:0f2d 2 verified sound_extension_dot_short_string sound_extension_dot_short_string uint8_t[2] Static bytes 01 2e. tdkpin_initialize_sounds 1008:0f2e Disassembly 1008:0f68-1080; verified ShortString Position and DOSBox/host sound tests. Turbo Pascal ShortString "." used to locate the first executable-extension dot while constructing the INI path. +1008:11bd 1008:11c4 8 verified uint16_allocation_range g_uint16_range BorlandInt32Range Static int32 minimum 0 and maximum 65535. tdkpin_create_palette_from_rgb_table 1008:11c5 Binary bytes; DI=11bd before verified range check 1008:1305-1313; reconstructed/tests/test_palette.c. Compiler range descriptor proves the 32-bit LOGPALETTE allocation byte count fits the uint16 Borland FreeMem size argument. +1008:131e 1008:1325 8 verified palette_byte_index_range g_palette_byte_range BorlandInt32Range Static int32 minimum 0 and maximum 767. tdkpin_load_palette_resource 1008:1326 Binary bytes; both DI=131e range calls inside the inclusive 0..02ff loop; reconstructed/tests/test_palette.c. Compiler range descriptor is applied separately to every source and destination byte index. +1010:0000 1010:0001 2 verified code_segment_3_tag code_segment_3_tag uint16_t Static word 0003. NE loader/segment inventory Binary bytes and NE_SEGMENTS.tsv segment 3 mapping. Compiler-emitted ordinal tag at the start of Code3; explicitly data, never executed. +1010:0470 1010:0471 2 verified multimedia_path_separator_short_string multimedia_path_separator_short_string uint8_t[2] Static bytes 01 5c. multimedia_initialize_runtime_unit Binary bytes; disassembly 1010:0486-04bd and 04c2-04f9; reconstructed/tests/test_multimedia_startup.c Exact Turbo Pascal ShortString "\\" concatenated between the system directory and each CTL3D DLL basename. +1018:0000 1018:0001 2 verified code_segment_4_tag code_segment_4_tag uint16_t Static word 0004. NE loader/segment inventory Binary bytes and NE_SEGMENTS.tsv segment 4 mapping. Compiler-emitted ordinal tag at the start of Code4; explicitly data, never executed. +1020:0000 1020:0001 2 verified code_segment_5_tag code_segment_5_tag uint16_t Static word 0005. NE loader/segment inventory Binary bytes and NE_SEGMENTS.tsv segment 5 mapping. Compiler-emitted ordinal tag at the start of Code5; explicitly data, never executed. +1020:0107 1020:012c 38 verified borland_runtime_copyright borland_runtime_copyright char[38] Static bytes "Portions Copyright (c) 1983,90 Borland" without NUL. No in-image reader Binary bytes and complete reference inventory. Compiler runtime identification string retained as immutable evidence; unreachable as instructions and explicitly classified data. +1020:1191 1020:11ba 42 verified real48_sin_coefficients g_sin_coefficients BorlandReal48[7] Static -1/15!,+1/13!,-1/11!,+1/9!,-1/7!,+1/5!,-1/3! approximants. borland_real48_sin/cos Exact bytes; disassembly 111d-1190; C table; original-offset DOSBox Sin/Cos vectors. Order and rounding at every Horner operation are verified against the original routine. +1020:1240 1020:1263 36 verified real48_ln_coefficients g_ln_coefficients BorlandReal48[6] Static 1/13,1/11,1/9,1/7,1/5,1/3 approximants. borland_real48_ln Exact bytes; disassembly 11bb-123f; C table; original-offset DOSBox Ln vectors. Ordered atanh-series coefficients are represented byte-for-byte. +1020:12d7 1020:1306 48 verified real48_exp_coefficients g_exp_coefficients BorlandReal48[8] Static eight-entry Exp polynomial ending in ln(2). borland_real48_exp Exact bytes; disassembly 1264-12d6; C table; original-offset DOSBox Exp vectors. Exact Horner order, intermediate Real48 rounding, and table extent are verified. +1020:13e8 1020:1435 78 verified real48_arctan_tables g_arctan_reduction_and_coefficients BorlandReal48[13] Static direct threshold, tan/angle reduction pairs, one, pi/4, and five odd-series coefficients. borland_real48_arctan and series Exact bytes; all indexed reads 1353-13bf; C constants/tables; original-offset DOSBox ArcTan vectors. All 13 entries, paired strides, thresholds, angle selection, and coefficient order are verified. +1020:14fb 1020:14fe 4 verified random_unsigned_bias random_unsigned_bias float Static IEEE-754 single 2147483648.0 (bytes 0000004f). borland_random_unit_interval 1020:14de FADD operand at 14ed; reconstructed/tests/test_random.c. Converts signed FILD of the 32-bit seed to its exact unsigned magnitude before scaling. +1020:14ff 1020:1500 2 verified random_scale_exponent random_scale_exponent int16_t Static signed word -32 (ffe0). borland_random_unit_interval 1020:14de FILD operand at 14e2 followed by FSCALE; reconstructed/tests/test_random.c. Exact binary exponent used to divide the unsigned seed by 2^32. +1020:1537 1020:1538 2 verified random_multiplier_low_word random_multiplier_low_word uint16_t Static word 8405. borland_next_random 1020:1501 MUL operand at 150a; full derived multiplier 08088405; reconstructed/tests/test_random.c. Low word embedded by the Borland LCG implementation; higher multiplier contribution is instruction-encoded. diff --git a/original/COMPLETE_COVERAGE.tsv b/original/COMPLETE_COVERAGE.tsv new file mode 100644 index 0000000..5ba9ec7 --- /dev/null +++ b/original/COMPLETE_COVERAGE.tsv @@ -0,0 +1,80 @@ +record name_or_start end bytes detail +block Code1 1000:fe39 65082 r=true,w=false,x=true,initialized=true +block Code2 1008:30c4 12485 r=true,w=false,x=true,initialized=true +block Code3 1010:05eb 1516 r=true,w=false,x=true,initialized=true +block Code4 1018:1f79 8058 r=true,w=false,x=true,initialized=true +block Code5 1020:1722 5923 r=true,w=false,x=true,initialized=true +block Data6 1028:4d39 19770 r=true,w=true,x=false,initialized=true +block Rsrc0 1030:15ff 5632 r=true,w=false,x=false,initialized=true +block Rsrc1 1038:15ff 5632 r=true,w=false,x=false,initialized=true +block Rsrc2 1040:15ff 5632 r=true,w=false,x=false,initialized=true +block Rsrc3 1048:15ff 5632 r=true,w=false,x=false,initialized=true +block Rsrc4 1050:15ff 5632 r=true,w=false,x=false,initialized=true +block Rsrc5 1058:15ff 5632 r=true,w=false,x=false,initialized=true +block Rsrc6 1060:15ff 5632 r=true,w=false,x=false,initialized=true +block Rsrc7 1068:15ff 5632 r=true,w=false,x=false,initialized=true +block Rsrc8 1071:7eff 98048 r=true,w=false,x=false,initialized=true +block Rsrc9 1078:52ff 21248 r=true,w=false,x=false,initialized=true +block Rsrc10 1080:52ff 21248 r=true,w=false,x=false,initialized=true +block Rsrc11 1088:52ff 21248 r=true,w=false,x=false,initialized=true +block Rsrc12 1090:52ff 21248 r=true,w=false,x=false,initialized=true +block Rsrc13 1098:10ff 4352 r=true,w=false,x=false,initialized=true +block Rsrc14 10a0:10ff 4352 r=true,w=false,x=false,initialized=true +block Rsrc15 10a8:10ff 4352 r=true,w=false,x=false,initialized=true +block Rsrc16 10b0:10ff 4352 r=true,w=false,x=false,initialized=true +block Rsrc17 10b8:10ff 4352 r=true,w=false,x=false,initialized=true +block Rsrc18 10c0:10ff 4352 r=true,w=false,x=false,initialized=true +block Rsrc19 10c8:10ff 4352 r=true,w=false,x=false,initialized=true +block Rsrc20 10d0:10ff 4352 r=true,w=false,x=false,initialized=true +block Rsrc21 10d8:10ff 4352 r=true,w=false,x=false,initialized=true +block Rsrc22 10e4:10ff 266496 r=true,w=false,x=false,initialized=true +block Rsrc23 10e8:0fff 4096 r=true,w=false,x=false,initialized=true +block Rsrc24 10f1:a6ff 108288 r=true,w=false,x=false,initialized=true +block Rsrc25 10f8:0cff 3328 r=true,w=false,x=false,initialized=true +block Rsrc26 1104:7eff 294656 r=true,w=false,x=false,initialized=true +block Rsrc27 110c:7eff 294656 r=true,w=false,x=false,initialized=true +block Rsrc28 1114:7eff 294656 r=true,w=false,x=false,initialized=true +block Rsrc29 111c:7eff 294656 r=true,w=false,x=false,initialized=true +block Rsrc30 1124:7eff 294656 r=true,w=false,x=false,initialized=true +block Rsrc31 112c:7eff 294656 r=true,w=false,x=false,initialized=true +block Rsrc32 1134:7eff 294656 r=true,w=false,x=false,initialized=true +block Rsrc33 113c:7eff 294656 r=true,w=false,x=false,initialized=true +block Rsrc34 1140:02ff 768 r=true,w=false,x=false,initialized=true +block Rsrc35 1148:18ff 6400 r=true,w=false,x=false,initialized=true +block Rsrc36 1150:11ff 4608 r=true,w=false,x=false,initialized=true +block Rsrc37 1158:1dff 7680 r=true,w=false,x=false,initialized=true +block Rsrc38 1160:0bff 3072 r=true,w=false,x=false,initialized=true +block Rsrc39 1168:76ff 30464 r=true,w=false,x=false,initialized=true +block Rsrc40 1170:98ff 39168 r=true,w=false,x=false,initialized=true +block Rsrc41 1178:1aff 6912 r=true,w=false,x=false,initialized=true +block Rsrc42 1180:01ff 512 r=true,w=false,x=false,initialized=true +block Rsrc43 1188:b5ff 46592 r=true,w=false,x=false,initialized=true +block Rsrc44 1190:1fff 8192 r=true,w=false,x=false,initialized=true +block Rsrc45 1198:0dff 3584 r=true,w=false,x=false,initialized=true +block Rsrc46 11a0:88ff 35072 r=true,w=false,x=false,initialized=true +block Rsrc47 11a8:14ff 5376 r=true,w=false,x=false,initialized=true +block Rsrc48 11b0:75ff 30208 r=true,w=false,x=false,initialized=true +block Rsrc49 11b8:0cff 3328 r=true,w=false,x=false,initialized=true +block Rsrc50 11c0:56ff 22272 r=true,w=false,x=false,initialized=true +block Rsrc51 11c8:00ff 256 r=true,w=false,x=false,initialized=true +block Rsrc52 11d0:00ff 256 r=true,w=false,x=false,initialized=true +block Rsrc53 11d8:34ff 13568 r=true,w=false,x=false,initialized=true +block Rsrc54 11e0:02ff 768 r=true,w=false,x=false,initialized=true +block Rsrc55 11e8:00ff 256 r=true,w=false,x=false,initialized=true +block Rsrc56 11f0:01ff 512 r=true,w=false,x=false,initialized=true +block Rsrc57 11f8:00ff 256 r=true,w=false,x=false,initialized=true +block Rsrc58 1200:00ff 256 r=true,w=false,x=false,initialized=true +block Rsrc59 1208:00ff 256 r=true,w=false,x=false,initialized=true +block Rsrc60 1210:01ff 512 r=true,w=false,x=false,initialized=true +block Rsrc61 1218:01ff 512 r=true,w=false,x=false,initialized=true +block Rsrc62 1220:00ff 256 r=true,w=false,x=false,initialized=true +block EXTERNAL 1228:048f 1168 r=true,w=false,x=false,initialized=false +summary executable-bytes 93064 n/a +summary disassembled-bytes 92780 99.69% of executable +summary defined-data-bytes 282 0.30% of executable +summary explained-code-or-data-bytes 93062 100.00% of executable +summary function-body-bytes 92745 99.66% of executable +summary internal-functions 391 n/a +summary undefined-executable-bytes 2 n/a +undefined-range 1020:0666 1020:0666 1 not-in-listing +undefined-range 1020:0dea 1020:0dea 1 not-in-listing diff --git a/original/COMPLETE_FUNCTIONS.tsv b/original/COMPLETE_FUNCTIONS.tsv new file mode 100644 index 0000000..4b5bf4e --- /dev/null +++ b/original/COMPLETE_FUNCTIONS.tsv @@ -0,0 +1,684 @@ +address name kind status message +1000:0002 FUN_1000_0002 internal ok decompiled +1000:0100 FUN_1000_0100 internal ok decompiled +1000:0121 FUN_1000_0121 internal ok decompiled +1000:016c FUN_1000_016c internal ok decompiled +1000:01d3 FUN_1000_01d3 internal ok decompiled +1000:0270 FUN_1000_0270 internal ok decompiled +1000:51f5 FUN_1000_51f5 internal ok decompiled +1000:531e FUN_1000_531e internal ok decompiled +1000:5390 FUN_1000_5390 internal ok decompiled +1000:58e7 FUN_1000_58e7 internal ok decompiled +1000:5956 FUN_1000_5956 internal ok decompiled +1000:59a0 FUN_1000_59a0 internal ok decompiled +1000:5a37 FUN_1000_5a37 internal ok decompiled +1000:5ab7 FUN_1000_5ab7 internal ok decompiled +1000:5aea FUN_1000_5aea internal ok decompiled +1000:5ba6 FUN_1000_5ba6 internal ok decompiled +1000:5be5 FUN_1000_5be5 internal ok decompiled +1000:5c13 FUN_1000_5c13 internal ok decompiled +1000:5ee6 FUN_1000_5ee6 internal ok decompiled +1000:5efc FUN_1000_5efc internal ok decompiled +1000:5f29 FUN_1000_5f29 internal ok decompiled +1000:5fc0 FUN_1000_5fc0 internal ok decompiled +1000:6040 FUN_1000_6040 internal ok decompiled +1000:6073 FUN_1000_6073 internal ok decompiled +1000:60e7 FUN_1000_60e7 internal ok decompiled +1000:6129 FUN_1000_6129 internal ok decompiled +1000:616e FUN_1000_616e internal ok decompiled +1000:6202 FUN_1000_6202 internal ok decompiled +1000:6218 FUN_1000_6218 internal ok decompiled +1000:6245 FUN_1000_6245 internal ok decompiled +1000:62dc FUN_1000_62dc internal ok decompiled +1000:635c FUN_1000_635c internal ok decompiled +1000:638e FUN_1000_638e internal ok decompiled +1000:6b37 FUN_1000_6b37 internal ok decompiled +1000:6bf8 FUN_1000_6bf8 internal ok decompiled +1000:6f27 FUN_1000_6f27 internal ok decompiled +1000:7440 FUN_1000_7440 internal ok decompiled +1000:7e12 FUN_1000_7e12 internal ok decompiled +1000:7e92 FUN_1000_7e92 internal ok decompiled +1000:7ed9 FUN_1000_7ed9 internal ok decompiled +1000:8b0d FUN_1000_8b0d internal ok decompiled +1000:99f0 FUN_1000_99f0 internal ok decompiled +1000:9ae0 FUN_1000_9ae0 internal ok decompiled +1000:9b69 FUN_1000_9b69 internal ok decompiled +1000:9bca FUN_1000_9bca internal ok decompiled +1000:9e85 FUN_1000_9e85 internal ok decompiled +1000:9f73 FUN_1000_9f73 internal ok decompiled +1000:a38e FUN_1000_a38e internal ok decompiled +1000:a604 FUN_1000_a604 internal ok decompiled +1000:a70e FUN_1000_a70e internal ok decompiled +1000:a72c FUN_1000_a72c internal ok decompiled +1000:a8ea FUN_1000_a8ea internal ok decompiled +1000:a99c FUN_1000_a99c internal ok decompiled +1000:ab3c FUN_1000_ab3c internal ok decompiled +1000:abe5 FUN_1000_abe5 internal ok decompiled +1000:acc2 FUN_1000_acc2 internal ok decompiled +1000:ae6e FUN_1000_ae6e internal ok decompiled +1000:b2c8 FUN_1000_b2c8 internal ok decompiled +1000:b30b FUN_1000_b30b internal ok decompiled +1000:b3b0 FUN_1000_b3b0 internal ok decompiled +1000:b3f3 FUN_1000_b3f3 internal ok decompiled +1000:b476 FUN_1000_b476 internal ok decompiled +1000:bc36 FUN_1000_bc36 internal ok decompiled +1000:bda2 FUN_1000_bda2 internal ok decompiled +1000:bdde FUN_1000_bdde internal ok decompiled +1000:beff FUN_1000_beff internal ok decompiled +1000:c36b FUN_1000_c36b internal ok decompiled +1000:c426 FUN_1000_c426 internal ok decompiled +1000:c4e1 FUN_1000_c4e1 internal ok decompiled +1000:c79c FUN_1000_c79c internal ok decompiled +1000:eab1 exported_ordinal_10 internal ok decompiled +1000:fd85 ne_program_entry internal ok decompiled +1008:0002 FUN_1008_0002 internal ok decompiled +1008:0023 FUN_1008_0023 internal ok decompiled +1008:00e2 FUN_1008_00e2 internal ok decompiled +1008:0138 FUN_1008_0138 internal ok decompiled +1008:0787 FUN_1008_0787 internal ok decompiled +1008:07b6 FUN_1008_07b6 internal ok decompiled +1008:0837 FUN_1008_0837 internal ok decompiled +1008:08bb FUN_1008_08bb internal ok decompiled +1008:093f FUN_1008_093f internal ok decompiled +1008:0996 FUN_1008_0996 internal ok decompiled +1008:0b9e FUN_1008_0b9e internal ok decompiled +1008:0dbd FUN_1008_0dbd internal ok decompiled +1008:0e08 FUN_1008_0e08 internal ok decompiled +1008:0f27 FUN_1008_0f27 internal ok decompiled +1008:0f2e FUN_1008_0f2e internal ok decompiled +1008:10e3 FUN_1008_10e3 internal ok decompiled +1008:1131 FUN_1008_1131 internal ok decompiled +1008:118f FUN_1008_118f internal ok decompiled +1008:11b8 FUN_1008_11b8 internal ok decompiled +1008:11c5 FUN_1008_11c5 internal ok decompiled +1008:1326 FUN_1008_1326 internal ok decompiled +1008:13a8 FUN_1008_13a8 internal ok decompiled +1008:149d FUN_1008_149d internal ok decompiled +1008:15c2 FUN_1008_15c2 internal ok decompiled +1008:15c7 FUN_1008_15c7 internal ok decompiled +1008:15e7 FUN_1008_15e7 internal ok decompiled +1008:1607 FUN_1008_1607 internal ok decompiled +1008:168e FUN_1008_168e internal ok decompiled +1008:16be FUN_1008_16be internal ok decompiled +1008:172f FUN_1008_172f internal ok decompiled +1008:1754 FUN_1008_1754 internal ok decompiled +1008:1779 FUN_1008_1779 internal ok decompiled +1008:17e2 FUN_1008_17e2 internal ok decompiled +1008:1818 FUN_1008_1818 internal ok decompiled +1008:185b FUN_1008_185b internal ok decompiled +1008:1865 FUN_1008_1865 internal ok decompiled +1008:18d0 FUN_1008_18d0 internal ok decompiled +1008:18ee FUN_1008_18ee internal ok decompiled +1008:19b7 FUN_1008_19b7 internal ok decompiled +1008:19f8 FUN_1008_19f8 internal ok decompiled +1008:1a39 FUN_1008_1a39 internal ok decompiled +1008:1a82 FUN_1008_1a82 internal ok decompiled +1008:1b11 FUN_1008_1b11 internal ok decompiled +1008:1be9 FUN_1008_1be9 internal ok decompiled +1008:1c03 FUN_1008_1c03 internal ok decompiled +1008:1c5f FUN_1008_1c5f internal ok decompiled +1008:1cc6 FUN_1008_1cc6 internal ok decompiled +1008:1d77 FUN_1008_1d77 internal ok decompiled +1008:1dcc FUN_1008_1dcc internal ok decompiled +1008:1e8a FUN_1008_1e8a internal ok decompiled +1008:1f0c FUN_1008_1f0c internal ok decompiled +1008:1f68 FUN_1008_1f68 internal ok decompiled +1008:1fe8 FUN_1008_1fe8 internal ok decompiled +1008:211a FUN_1008_211a internal ok decompiled +1008:2147 FUN_1008_2147 internal ok decompiled +1008:21ba FUN_1008_21ba internal ok decompiled +1008:21ce FUN_1008_21ce internal ok decompiled +1008:21e2 FUN_1008_21e2 internal ok decompiled +1008:2219 FUN_1008_2219 internal ok decompiled +1008:22fc FUN_1008_22fc internal ok decompiled +1008:233c FUN_1008_233c internal ok decompiled +1008:2374 FUN_1008_2374 internal ok decompiled +1008:238b FUN_1008_238b internal ok decompiled +1008:23fd FUN_1008_23fd internal ok decompiled +1008:2442 FUN_1008_2442 internal ok decompiled +1008:24a5 FUN_1008_24a5 internal ok decompiled +1008:2554 FUN_1008_2554 internal ok decompiled +1008:2608 FUN_1008_2608 internal ok decompiled +1008:2643 FUN_1008_2643 internal ok decompiled +1008:26b0 FUN_1008_26b0 internal ok decompiled +1008:2819 FUN_1008_2819 internal ok decompiled +1008:28a3 FUN_1008_28a3 internal ok decompiled +1008:2906 FUN_1008_2906 internal ok decompiled +1008:2932 FUN_1008_2932 internal ok decompiled +1008:295c FUN_1008_295c internal ok decompiled +1008:298a FUN_1008_298a internal ok decompiled +1008:2996 FUN_1008_2996 internal ok decompiled +1008:2a0e FUN_1008_2a0e internal ok decompiled +1008:2a45 FUN_1008_2a45 internal ok decompiled +1008:2ae3 FUN_1008_2ae3 internal ok decompiled +1008:2bb1 FUN_1008_2bb1 internal ok decompiled +1008:2bd1 FUN_1008_2bd1 internal ok decompiled +1008:2c08 FUN_1008_2c08 internal ok decompiled +1008:2c1f FUN_1008_2c1f internal ok decompiled +1008:2c83 FUN_1008_2c83 internal ok decompiled +1008:2cd9 FUN_1008_2cd9 internal ok decompiled +1008:2cf2 FUN_1008_2cf2 internal ok decompiled +1008:2d3a FUN_1008_2d3a internal ok decompiled +1008:2d66 FUN_1008_2d66 internal ok decompiled +1008:2d87 FUN_1008_2d87 internal ok decompiled +1008:2d99 FUN_1008_2d99 internal ok decompiled +1008:2db3 FUN_1008_2db3 internal ok decompiled +1008:2dcd FUN_1008_2dcd internal ok decompiled +1008:2de0 FUN_1008_2de0 internal ok decompiled +1008:2dff FUN_1008_2dff internal ok decompiled +1008:2e22 FUN_1008_2e22 internal ok decompiled +1008:2e76 FUN_1008_2e76 internal ok decompiled +1008:2e92 FUN_1008_2e92 internal ok decompiled +1008:2ea9 FUN_1008_2ea9 internal ok decompiled +1008:2ec0 FUN_1008_2ec0 internal ok decompiled +1008:2ee5 FUN_1008_2ee5 internal ok decompiled +1008:2f07 FUN_1008_2f07 internal ok decompiled +1008:2f2f FUN_1008_2f2f internal ok decompiled +1008:2f4d FUN_1008_2f4d internal ok decompiled +1008:2f70 FUN_1008_2f70 internal ok decompiled +1008:2fbb FUN_1008_2fbb internal ok decompiled +1008:2fe3 FUN_1008_2fe3 internal ok decompiled +1008:300a FUN_1008_300a internal ok decompiled +1008:302c FUN_1008_302c internal ok decompiled +1008:3099 FUN_1008_3099 internal ok decompiled +1010:0002 FUN_1010_0002 internal ok decompiled +1010:0079 FUN_1010_0079 internal ok decompiled +1010:00a2 FUN_1010_00a2 internal ok decompiled +1010:01c2 FUN_1010_01c2 internal ok decompiled +1010:03af FUN_1010_03af internal ok decompiled +1010:03e0 FUN_1010_03e0 internal ok decompiled +1010:0405 FUN_1010_0405 internal ok decompiled +1010:0472 FUN_1010_0472 internal ok decompiled +1018:0002 FUN_1018_0002 internal ok decompiled +1018:0045 FUN_1018_0045 internal ok decompiled +1018:0071 FUN_1018_0071 internal ok decompiled +1018:0097 FUN_1018_0097 internal ok decompiled +1018:0103 FUN_1018_0103 internal ok decompiled +1018:0133 FUN_1018_0133 internal ok decompiled +1018:018b FUN_1018_018b internal ok decompiled +1018:01dc FUN_1018_01dc internal ok decompiled +1018:02fa FUN_1018_02fa internal ok decompiled +1018:0341 FUN_1018_0341 internal ok decompiled +1018:03e9 FUN_1018_03e9 internal ok decompiled +1018:03ff FUN_1018_03ff internal ok decompiled +1018:0466 FUN_1018_0466 internal ok decompiled +1018:049e FUN_1018_049e internal ok decompiled +1018:0524 FUN_1018_0524 internal ok decompiled +1018:055c FUN_1018_055c internal ok decompiled +1018:05dc FUN_1018_05dc internal ok decompiled +1018:05f3 FUN_1018_05f3 internal ok decompiled +1018:060d FUN_1018_060d internal ok decompiled +1018:0627 FUN_1018_0627 internal ok decompiled +1018:0641 FUN_1018_0641 internal ok decompiled +1018:0673 FUN_1018_0673 internal ok decompiled +1018:069a FUN_1018_069a internal ok decompiled +1018:071c FUN_1018_071c internal ok decompiled +1018:080d FUN_1018_080d internal ok decompiled +1018:085a FUN_1018_085a internal ok decompiled +1018:08ac FUN_1018_08ac internal ok decompiled +1018:08c3 FUN_1018_08c3 internal ok decompiled +1018:08f0 FUN_1018_08f0 internal ok decompiled +1018:0a85 FUN_1018_0a85 internal ok decompiled +1018:0b25 FUN_1018_0b25 internal ok decompiled +1018:0b6c FUN_1018_0b6c internal ok decompiled +1018:0bb3 FUN_1018_0bb3 internal ok decompiled +1018:0c3d FUN_1018_0c3d internal ok decompiled +1018:0c59 FUN_1018_0c59 internal ok decompiled +1018:0cc7 FUN_1018_0cc7 internal ok decompiled +1018:0ce7 FUN_1018_0ce7 internal ok decompiled +1018:0d6a FUN_1018_0d6a internal ok decompiled +1018:0d8a FUN_1018_0d8a internal ok decompiled +1018:0d9b FUN_1018_0d9b internal ok decompiled +1018:0dcd FUN_1018_0dcd internal ok decompiled +1018:0e0a FUN_1018_0e0a internal ok decompiled +1018:0e46 FUN_1018_0e46 internal ok decompiled +1018:0e9e FUN_1018_0e9e internal ok decompiled +1018:0ec0 FUN_1018_0ec0 internal ok decompiled +1018:0ef4 FUN_1018_0ef4 internal ok decompiled +1018:0f22 FUN_1018_0f22 internal ok decompiled +1018:0f38 FUN_1018_0f38 internal ok decompiled +1018:0f8d FUN_1018_0f8d internal ok decompiled +1018:0fcc FUN_1018_0fcc internal ok decompiled +1018:0ffd FUN_1018_0ffd internal ok decompiled +1018:1054 FUN_1018_1054 internal ok decompiled +1018:10aa FUN_1018_10aa internal ok decompiled +1018:10e9 FUN_1018_10e9 internal ok decompiled +1018:1106 FUN_1018_1106 internal ok decompiled +1018:121b FUN_1018_121b internal ok decompiled +1018:1274 FUN_1018_1274 internal ok decompiled +1018:12f5 FUN_1018_12f5 internal ok decompiled +1018:1311 FUN_1018_1311 internal ok decompiled +1018:134f FUN_1018_134f internal ok decompiled +1018:1547 FUN_1018_1547 internal ok decompiled +1018:1586 FUN_1018_1586 internal ok decompiled +1018:15c0 FUN_1018_15c0 internal ok decompiled +1018:169d FUN_1018_169d internal ok decompiled +1018:16eb FUN_1018_16eb internal ok decompiled +1018:170c FUN_1018_170c internal ok decompiled +1018:1761 FUN_1018_1761 internal ok decompiled +1018:1788 FUN_1018_1788 internal ok decompiled +1018:17f8 FUN_1018_17f8 internal ok decompiled +1018:1868 FUN_1018_1868 internal ok decompiled +1018:18e9 FUN_1018_18e9 internal ok decompiled +1018:1960 FUN_1018_1960 internal ok decompiled +1018:1986 FUN_1018_1986 internal ok decompiled +1018:1a0e FUN_1018_1a0e internal ok decompiled +1018:1a61 FUN_1018_1a61 internal ok decompiled +1018:1b08 FUN_1018_1b08 internal ok decompiled +1018:1b35 FUN_1018_1b35 internal ok decompiled +1018:1b4b FUN_1018_1b4b internal ok decompiled +1018:1b57 FUN_1018_1b57 internal ok decompiled +1018:1bb0 FUN_1018_1bb0 internal ok decompiled +1018:1bdf FUN_1018_1bdf internal ok decompiled +1018:1bfc FUN_1018_1bfc internal ok decompiled +1018:1c7f FUN_1018_1c7f internal ok decompiled +1018:1cd6 FUN_1018_1cd6 internal ok decompiled +1018:1d22 FUN_1018_1d22 internal ok decompiled +1018:1d64 FUN_1018_1d64 internal ok decompiled +1018:1db1 FUN_1018_1db1 internal ok decompiled +1018:1e39 FUN_1018_1e39 internal ok decompiled +1018:1eb0 FUN_1018_1eb0 internal ok decompiled +1018:1f14 FUN_1018_1f14 internal ok decompiled +1018:1f56 FUN_1018_1f56 internal ok decompiled +1020:0002 FUN_1020_0002 internal ok decompiled +1020:005d FUN_1020_005d internal ok decompiled +1020:0061 FUN_1020_0061 internal ok decompiled +1020:00d2 FUN_1020_00d2 internal ok decompiled +1020:00f0 FUN_1020_00f0 internal ok decompiled +1020:012d FUN_1020_012d internal ok decompiled +1020:0147 FUN_1020_0147 internal ok decompiled +1020:0167 FUN_1020_0167 internal ok decompiled +1020:0195 runtime_1020_0195 internal ok decompiled +1020:01ca FUN_1020_01ca internal ok decompiled +1020:0222 FUN_1020_0222 internal ok decompiled +1020:023c FUN_1020_023c internal ok decompiled +1020:026a FUN_1020_026a internal ok decompiled +1020:02a6 FUN_1020_02a6 internal ok decompiled +1020:02d7 FUN_1020_02d7 internal ok decompiled +1020:0327 FUN_1020_0327 internal ok decompiled +1020:0388 FUN_1020_0388 internal ok decompiled +1020:038f FUN_1020_038f internal ok decompiled +1020:039d FUN_1020_039d internal ok decompiled +1020:03c5 runtime_1020_03c5 internal ok decompiled +1020:03cb FUN_1020_03cb internal ok decompiled +1020:03ef FUN_1020_03ef internal ok decompiled +1020:0439 FUN_1020_0439 internal ok decompiled +1020:046c runtime_1020_046c internal ok decompiled +1020:048f runtime_1020_048f internal ok decompiled +1020:049f runtime_1020_049f internal ok decompiled +1020:04fc runtime_1020_04fc internal ok decompiled +1020:0527 FUN_1020_0527 internal ok decompiled +1020:052c FUN_1020_052c internal ok decompiled +1020:0534 FUN_1020_0534 internal ok decompiled +1020:0586 FUN_1020_0586 internal ok decompiled +1020:05c7 FUN_1020_05c7 internal ok decompiled +1020:05d8 FUN_1020_05d8 internal ok decompiled +1020:0608 FUN_1020_0608 internal ok decompiled +1020:062d FUN_1020_062d internal ok decompiled +1020:064d FUN_1020_064d internal ok decompiled +1020:0667 FUN_1020_0667 internal ok decompiled +1020:06ab FUN_1020_06ab internal ok decompiled +1020:0710 runtime_1020_0710 internal ok decompiled +1020:072c FUN_1020_072c internal ok decompiled +1020:0751 FUN_1020_0751 internal ok decompiled +1020:0760 runtime_1020_0760 internal ok decompiled +1020:0796 runtime_1020_0796 internal ok decompiled +1020:07fe FUN_1020_07fe internal ok decompiled +1020:082e FUN_1020_082e internal ok decompiled +1020:0866 runtime_1020_0866 internal ok decompiled +1020:0871 FUN_1020_0871 internal ok decompiled +1020:0891 FUN_1020_0891 internal ok decompiled +1020:08a9 FUN_1020_08a9 internal ok decompiled +1020:08e6 FUN_1020_08e6 internal ok decompiled +1020:098c runtime_1020_098c internal ok decompiled +1020:09af runtime_1020_09af internal ok decompiled +1020:09d2 runtime_1020_09d2 internal ok decompiled +1020:09ec FUN_1020_09ec internal ok decompiled +1020:0a10 FUN_1020_0a10 internal ok decompiled +1020:0a51 FUN_1020_0a51 internal ok decompiled +1020:0a7d FUN_1020_0a7d internal ok decompiled +1020:0ac3 FUN_1020_0ac3 internal ok decompiled +1020:0aee runtime_1020_0aee internal ok decompiled +1020:0b00 FUN_1020_0b00 internal ok decompiled +1020:0b1b FUN_1020_0b1b internal ok decompiled +1020:0b7a FUN_1020_0b7a internal ok decompiled +1020:0be9 FUN_1020_0be9 internal ok decompiled +1020:0c76 FUN_1020_0c76 internal ok decompiled +1020:0cd0 FUN_1020_0cd0 internal ok decompiled +1020:0cd4 FUN_1020_0cd4 internal ok decompiled +1020:0d97 FUN_1020_0d97 internal ok decompiled +1020:0e93 FUN_1020_0e93 internal ok decompiled +1020:0e9a FUN_1020_0e9a internal ok decompiled +1020:0f11 FUN_1020_0f11 internal ok decompiled +1020:0f28 FUN_1020_0f28 internal ok decompiled +1020:0f3b FUN_1020_0f3b internal ok decompiled +1020:0f77 FUN_1020_0f77 internal ok decompiled +1020:0fe5 FUN_1020_0fe5 internal ok decompiled +1020:0feb FUN_1020_0feb internal ok decompiled +1020:0ff1 FUN_1020_0ff1 internal ok decompiled +1020:0ff7 FUN_1020_0ff7 internal ok decompiled +1020:0ffd FUN_1020_0ffd internal ok decompiled +1020:1007 FUN_1020_1007 internal ok decompiled +1020:100b FUN_1020_100b internal ok decompiled +1020:1017 FUN_1020_1017 internal ok decompiled +1020:1031 FUN_1020_1031 internal ok decompiled +1020:103b runtime_1020_103b internal ok decompiled +1020:1045 runtime_1020_1045 internal ok decompiled +1020:104f FUN_1020_104f internal ok decompiled +1020:1059 runtime_1020_1059 internal ok decompiled +1020:10aa runtime_1020_10aa internal ok decompiled +1020:10be FUN_1020_10be internal ok decompiled +1020:111d runtime_1020_111d internal ok decompiled +1020:11bb runtime_1020_11bb internal ok decompiled +1020:1264 runtime_1020_1264 internal ok decompiled +1020:1307 runtime_1020_1307 internal ok decompiled +1020:1436 runtime_1020_1436 internal ok decompiled +1020:143c FUN_1020_143c internal ok decompiled +1020:1455 FUN_1020_1455 internal ok decompiled +1020:14a4 FUN_1020_14a4 internal ok decompiled +1020:14c1 FUN_1020_14c1 internal ok decompiled +1020:14de runtime_1020_14de internal ok decompiled +1020:1501 FUN_1020_1501 internal ok decompiled +1020:1539 runtime_1020_1539 internal ok decompiled +1020:1546 FUN_1020_1546 internal ok decompiled +1020:1562 FUN_1020_1562 internal ok decompiled +1020:1582 FUN_1020_1582 internal ok decompiled +1020:1629 FUN_1020_1629 internal ok decompiled +1020:1674 FUN_1020_1674 internal ok decompiled +1020:16a5 FUN_1020_16a5 internal ok decompiled +1020:16c9 FUN_1020_16c9 internal ok decompiled +1020:16dd runtime_1020_16dd internal ok decompiled +1020:16e1 FUN_1020_16e1 internal ok decompiled +1020:16e6 FUN_1020_16e6 internal ok decompiled +1228:0000 GETVERSION external n/a imported function +1228:0004 GLOBALALLOC external n/a imported function +1228:0008 GLOBALFREE external n/a imported function +1228:000c GLOBALLOCK external n/a imported function +1228:0010 GLOBALUNLOCK external n/a imported function +1228:0014 GLOBALHANDLE external n/a imported function +1228:0018 GLOBALCOMPACT external n/a imported function +1228:001c WAITEVENT external n/a imported function +1228:0020 GETCURRENTTASK external n/a imported function +1228:0024 GETMODULEHANDLE external n/a imported function +1228:0028 GETMODULEFILENAME external n/a imported function +1228:002c GETPROCADDRESS external n/a imported function +1228:0030 MAKEPROCINSTANCE external n/a imported function +1228:0034 FREEPROCINSTANCE external n/a imported function +1228:0038 FINDRESOURCE external n/a imported function +1228:003c LOADRESOURCE external n/a imported function +1228:0040 LOCKRESOURCE external n/a imported function +1228:0044 FREERESOURCE external n/a imported function +1228:0048 _LCLOSE external n/a imported function +1228:004c _LREAD external n/a imported function +1228:0050 _LCREAT external n/a imported function +1228:0054 _LOPEN external n/a imported function +1228:0058 _LWRITE external n/a imported function +1228:005c INITTASK external n/a imported function +1228:0060 LOADLIBRARY external n/a imported function +1228:0064 FREELIBRARY external n/a imported function +1228:0068 SETERRORMODE external n/a imported function +1228:006c __AHINCR external n/a imported function +1228:0070 GETPRIVATEPROFILEINT external n/a imported function +1228:0074 GETDOSENVIRONMENT external n/a imported function +1228:0078 GETWINFLAGS external n/a imported function +1228:007c GETWINDOWSDIRECTORY external n/a imported function +1228:0080 GETSYSTEMDIRECTORY external n/a imported function +1228:0084 GETFREESPACE external n/a imported function +1228:0088 ALLOCCSTODSALIAS external n/a imported function +1228:008c FREESELECTOR external n/a imported function +1228:0090 PRESTOCHANGOSELECTOR external n/a imported function +1228:0094 SYSTEMTIMERMAKE external n/a imported function +1228:0098 SNDPLAYSOUND external n/a imported function +1228:009c WAVEOUTGETNUMDEVS external n/a imported function +1228:00a0 WAVEOUTGETDEVCAPS external n/a imported function +1228:00a4 WAVEOUTGETVOLUME external n/a imported function +1228:00a8 TIMEKILLEVENT external n/a imported function +1228:00ac GETVERSION external n/a imported function +1228:00b0 GLOBALALLOC external n/a imported function +1228:00b4 GLOBALFREE external n/a imported function +1228:00b8 GLOBALLOCK external n/a imported function +1228:00bc GLOBALUNLOCK external n/a imported function +1228:00c0 GLOBALHANDLE external n/a imported function +1228:00c4 GLOBALCOMPACT external n/a imported function +1228:00c8 WAITEVENT external n/a imported function +1228:00cc GETCURRENTTASK external n/a imported function +1228:00d0 GETMODULEHANDLE external n/a imported function +1228:00d4 GETMODULEFILENAME external n/a imported function +1228:00d8 GETPROCADDRESS external n/a imported function +1228:00dc MAKEPROCINSTANCE external n/a imported function +1228:00e0 FREEPROCINSTANCE external n/a imported function +1228:00e4 FINDRESOURCE external n/a imported function +1228:00e8 LOADRESOURCE external n/a imported function +1228:00ec LOCKRESOURCE external n/a imported function +1228:00f0 FREERESOURCE external n/a imported function +1228:00f4 _LCLOSE external n/a imported function +1228:00f8 _LREAD external n/a imported function +1228:00fc _LCREAT external n/a imported function +1228:0100 _LOPEN external n/a imported function +1228:0104 _LWRITE external n/a imported function +1228:0108 INITTASK external n/a imported function +1228:010c LOADLIBRARY external n/a imported function +1228:0110 FREELIBRARY external n/a imported function +1228:0114 SETERRORMODE external n/a imported function +1228:0118 __AHINCR external n/a imported function +1228:011c GETPRIVATEPROFILEINT external n/a imported function +1228:0120 GETDOSENVIRONMENT external n/a imported function +1228:0124 GETWINFLAGS external n/a imported function +1228:0128 GETWINDOWSDIRECTORY external n/a imported function +1228:012c GETSYSTEMDIRECTORY external n/a imported function +1228:0130 GETFREESPACE external n/a imported function +1228:0134 ALLOCCSTODSALIAS external n/a imported function +1228:0138 FREESELECTOR external n/a imported function +1228:013c PRESTOCHANGOSELECTOR external n/a imported function +1228:0140 SETBKCOLOR external n/a imported function +1228:0144 SETBKMODE external n/a imported function +1228:0148 SETTEXTCOLOR external n/a imported function +1228:014c TEXTOUT external n/a imported function +1228:0150 BITBLT external n/a imported function +1228:0154 SELECTOBJECT external n/a imported function +1228:0158 CREATECOMPATIBLEBITMAP external n/a imported function +1228:015c CREATECOMPATIBLEDC external n/a imported function +1228:0160 CREATEDC external n/a imported function +1228:0164 DELETEDC external n/a imported function +1228:0168 DELETEOBJECT external n/a imported function +1228:016c GETSTOCKOBJECT external n/a imported function +1228:0170 GETTEXTCOLOR external n/a imported function +1228:0174 GETTEXTMETRICS external n/a imported function +1228:0178 UNREALIZEOBJECT external n/a imported function +1228:017c SETTEXTALIGN external n/a imported function +1228:0180 CREATEPALETTE external n/a imported function +1228:0184 UPDATECOLORS external n/a imported function +1228:0188 CREATEDIBITMAP external n/a imported function +1228:018c MESSAGEBOX external n/a imported function +1228:0190 INITAPP external n/a imported function +1228:0194 POSTQUITMESSAGE external n/a imported function +1228:0198 GETTICKCOUNT external n/a imported function +1228:019c SETCAPTURE external n/a imported function +1228:01a0 RELEASECAPTURE external n/a imported function +1228:01a4 SETFOCUS external n/a imported function +1228:01a8 GETFOCUS external n/a imported function +1228:01ac REMOVEPROP external n/a imported function +1228:01b0 GETPROP external n/a imported function +1228:01b4 SETPROP external n/a imported function +1228:01b8 SCREENTOCLIENT external n/a imported function +1228:01bc ISICONIC external n/a imported function +1228:01c0 GETWINDOWRECT external n/a imported function +1228:01c4 GETCLIENTRECT external n/a imported function +1228:01c8 GETWINDOWTEXT external n/a imported function +1228:01cc SETWINDOWTEXT external n/a imported function +1228:01d0 BEGINPAINT external n/a imported function +1228:01d4 ENDPAINT external n/a imported function +1228:01d8 CREATEWINDOW external n/a imported function +1228:01dc SHOWWINDOW external n/a imported function +1228:01e0 GETPARENT external n/a imported function +1228:01e4 ISWINDOW external n/a imported function +1228:01e8 ISCHILD external n/a imported function +1228:01ec DESTROYWINDOW external n/a imported function +1228:01f0 REGISTERCLASS external n/a imported function +1228:01f4 SCROLLWINDOW external n/a imported function +1228:01f8 SETSCROLLPOS external n/a imported function +1228:01fc SETSCROLLRANGE external n/a imported function +1228:0200 GETDC external n/a imported function +1228:0204 RELEASEDC external n/a imported function +1228:0208 SETCURSOR external n/a imported function +1228:020c ENDDIALOG external n/a imported function +1228:0210 ISDIALOGMESSAGE external n/a imported function +1228:0214 GETDLGITEM external n/a imported function +1228:0218 SETDLGITEMTEXT external n/a imported function +1228:021c GETDLGITEMTEXT external n/a imported function +1228:0220 SENDDLGITEMMESSAGE external n/a imported function +1228:0224 MESSAGEBEEP external n/a imported function +1228:0228 GETKEYSTATE external n/a imported function +1228:022c DEFWINDOWPROC external n/a imported function +1228:0230 GETMESSAGE external n/a imported function +1228:0234 PEEKMESSAGE external n/a imported function +1228:0238 SENDMESSAGE external n/a imported function +1228:023c WAITMESSAGE external n/a imported function +1228:0240 TRANSLATEMESSAGE external n/a imported function +1228:0244 DISPATCHMESSAGE external n/a imported function +1228:0248 CALLWINDOWPROC external n/a imported function +1228:024c UPDATEWINDOW external n/a imported function +1228:0250 INVALIDATERECT external n/a imported function +1228:0254 GETWINDOWWORD external n/a imported function +1228:0258 GETWINDOWLONG external n/a imported function +1228:025c SETWINDOWLONG external n/a imported function +1228:0260 ENABLEMENUITEM external n/a imported function +1228:0264 GETSYSTEMMENU external n/a imported function +1228:0268 CREATECARET external n/a imported function +1228:026c DESTROYCARET external n/a imported function +1228:0270 SETCARETPOS external n/a imported function +1228:0274 SHOWCARET external n/a imported function +1228:0278 LOADCURSOR external n/a imported function +1228:027c LOADICON external n/a imported function +1228:0280 LOADBITMAP external n/a imported function +1228:0284 TRANSLATEACCELERATOR external n/a imported function +1228:0288 GETSYSTEMMETRICS external n/a imported function +1228:028c GETSYSCOLOR external n/a imported function +1228:0290 DIALOGBOXPARAM external n/a imported function +1228:0294 CREATEDIALOGPARAM external n/a imported function +1228:0298 ISZOOMED external n/a imported function +1228:029c SELECTPALETTE external n/a imported function +1228:02a0 REALIZEPALETTE external n/a imported function +1228:02a4 DEFDLGPROC external n/a imported function +1228:02a8 GETCLASSINFO external n/a imported function +1228:02ac WVSPRINTF external n/a imported function +1228:02b0 DEFMDICHILDPROC external n/a imported function +1228:02b4 TRANSLATEMDISYSACCEL external n/a imported function +1228:02b8 CREATEWINDOWEX external n/a imported function +1228:02bc Ordinal_5 external n/a imported function +1228:02c0 Ordinal_6 external n/a imported function +1228:02c4 GETVERSION external n/a imported function +1228:02c8 GLOBALALLOC external n/a imported function +1228:02cc GLOBALFREE external n/a imported function +1228:02d0 GLOBALLOCK external n/a imported function +1228:02d4 GLOBALUNLOCK external n/a imported function +1228:02d8 GLOBALHANDLE external n/a imported function +1228:02dc GLOBALCOMPACT external n/a imported function +1228:02e0 WAITEVENT external n/a imported function +1228:02e4 GETCURRENTTASK external n/a imported function +1228:02e8 GETMODULEHANDLE external n/a imported function +1228:02ec GETMODULEFILENAME external n/a imported function +1228:02f0 GETPROCADDRESS external n/a imported function +1228:02f4 MAKEPROCINSTANCE external n/a imported function +1228:02f8 FREEPROCINSTANCE external n/a imported function +1228:02fc FINDRESOURCE external n/a imported function +1228:0300 LOADRESOURCE external n/a imported function +1228:0304 LOCKRESOURCE external n/a imported function +1228:0308 FREERESOURCE external n/a imported function +1228:030c _LCLOSE external n/a imported function +1228:0310 _LREAD external n/a imported function +1228:0314 _LCREAT external n/a imported function +1228:0318 _LOPEN external n/a imported function +1228:031c _LWRITE external n/a imported function +1228:0320 INITTASK external n/a imported function +1228:0324 LOADLIBRARY external n/a imported function +1228:0328 FREELIBRARY external n/a imported function +1228:032c SETERRORMODE external n/a imported function +1228:0330 __AHINCR external n/a imported function +1228:0334 GETPRIVATEPROFILEINT external n/a imported function +1228:0338 GETDOSENVIRONMENT external n/a imported function +1228:033c GETWINFLAGS external n/a imported function +1228:0340 GETWINDOWSDIRECTORY external n/a imported function +1228:0344 GETSYSTEMDIRECTORY external n/a imported function +1228:0348 GETFREESPACE external n/a imported function +1228:034c ALLOCCSTODSALIAS external n/a imported function +1228:0350 FREESELECTOR external n/a imported function +1228:0354 PRESTOCHANGOSELECTOR external n/a imported function +1228:0358 MESSAGEBOX external n/a imported function +1228:035c INITAPP external n/a imported function +1228:0360 POSTQUITMESSAGE external n/a imported function +1228:0364 GETTICKCOUNT external n/a imported function +1228:0368 SETCAPTURE external n/a imported function +1228:036c RELEASECAPTURE external n/a imported function +1228:0370 SETFOCUS external n/a imported function +1228:0374 GETFOCUS external n/a imported function +1228:0378 REMOVEPROP external n/a imported function +1228:037c GETPROP external n/a imported function +1228:0380 SETPROP external n/a imported function +1228:0384 SCREENTOCLIENT external n/a imported function +1228:0388 ISICONIC external n/a imported function +1228:038c GETWINDOWRECT external n/a imported function +1228:0390 GETCLIENTRECT external n/a imported function +1228:0394 GETWINDOWTEXT external n/a imported function +1228:0398 SETWINDOWTEXT external n/a imported function +1228:039c BEGINPAINT external n/a imported function +1228:03a0 ENDPAINT external n/a imported function +1228:03a4 CREATEWINDOW external n/a imported function +1228:03a8 SHOWWINDOW external n/a imported function +1228:03ac GETPARENT external n/a imported function +1228:03b0 ISWINDOW external n/a imported function +1228:03b4 ISCHILD external n/a imported function +1228:03b8 DESTROYWINDOW external n/a imported function +1228:03bc REGISTERCLASS external n/a imported function +1228:03c0 SCROLLWINDOW external n/a imported function +1228:03c4 SETSCROLLPOS external n/a imported function +1228:03c8 SETSCROLLRANGE external n/a imported function +1228:03cc GETDC external n/a imported function +1228:03d0 RELEASEDC external n/a imported function +1228:03d4 SETCURSOR external n/a imported function +1228:03d8 ENDDIALOG external n/a imported function +1228:03dc ISDIALOGMESSAGE external n/a imported function +1228:03e0 GETDLGITEM external n/a imported function +1228:03e4 SETDLGITEMTEXT external n/a imported function +1228:03e8 GETDLGITEMTEXT external n/a imported function +1228:03ec SENDDLGITEMMESSAGE external n/a imported function +1228:03f0 MESSAGEBEEP external n/a imported function +1228:03f4 GETKEYSTATE external n/a imported function +1228:03f8 DEFWINDOWPROC external n/a imported function +1228:03fc GETMESSAGE external n/a imported function +1228:0400 PEEKMESSAGE external n/a imported function +1228:0404 SENDMESSAGE external n/a imported function +1228:0408 WAITMESSAGE external n/a imported function +1228:040c TRANSLATEMESSAGE external n/a imported function +1228:0410 DISPATCHMESSAGE external n/a imported function +1228:0414 CALLWINDOWPROC external n/a imported function +1228:0418 UPDATEWINDOW external n/a imported function +1228:041c INVALIDATERECT external n/a imported function +1228:0420 GETWINDOWWORD external n/a imported function +1228:0424 GETWINDOWLONG external n/a imported function +1228:0428 SETWINDOWLONG external n/a imported function +1228:042c ENABLEMENUITEM external n/a imported function +1228:0430 GETSYSTEMMENU external n/a imported function +1228:0434 CREATECARET external n/a imported function +1228:0438 DESTROYCARET external n/a imported function +1228:043c SETCARETPOS external n/a imported function +1228:0440 SHOWCARET external n/a imported function +1228:0444 LOADCURSOR external n/a imported function +1228:0448 LOADICON external n/a imported function +1228:044c LOADBITMAP external n/a imported function +1228:0450 TRANSLATEACCELERATOR external n/a imported function +1228:0454 GETSYSTEMMETRICS external n/a imported function +1228:0458 GETSYSCOLOR external n/a imported function +1228:045c DIALOGBOXPARAM external n/a imported function +1228:0460 CREATEDIALOGPARAM external n/a imported function +1228:0464 ISZOOMED external n/a imported function +1228:0468 SELECTPALETTE external n/a imported function +1228:046c REALIZEPALETTE external n/a imported function +1228:0470 DEFDLGPROC external n/a imported function +1228:0474 GETCLASSINFO external n/a imported function +1228:0478 WVSPRINTF external n/a imported function +1228:047c DEFMDICHILDPROC external n/a imported function +1228:0480 TRANSLATEMDISYSACCEL external n/a imported function +1228:0484 CREATEWINDOWEX external n/a imported function +1228:0488 Ordinal_5 external n/a imported function +1228:048c Ordinal_6 external n/a imported function diff --git a/original/C_RECONSTRUCTION_FINAL_AUDIT.md b/original/C_RECONSTRUCTION_FINAL_AUDIT.md new file mode 100644 index 0000000..76ad37e --- /dev/null +++ b/original/C_RECONSTRUCTION_FINAL_AUDIT.md @@ -0,0 +1,85 @@ +# TDKPIN.EXE C reconstruction final audit + +Audit target: + +```text +a9022f1894e3e6e21fc42e8f6c932f7c549ca77f63aaa0c488bb9d55d9d0174c TDKPIN.EXE +987a47580ba5c92fa071c989bdaeddf138e285d2b07106c5909a4acbc3e27088 TDKPIN_GHIDRA_RAW.c +``` + +The vendor source is unavailable. “Faithful C” therefore means an +address-traceable semantic reconstruction whose claims are closed by image +bytes, disassembly, relocation/reference data, typed Win16/Borland behavior, +and focused runtime evidence. It does not mean a byte-identical rebuild with +the original Borland compiler. + +## Requirement audit + +1. **Immutable evidence:** `TDKPIN_GHIDRA_RAW.c` retains its sealed hash. + Regenerated complete raw evidence is separate and never used as readable C. +2. **Executable bytes:** all 93,064 executable-segment bytes are classified. + 93,062 have non-overlapping Ghidra code/data units. The remaining two are + individually explained in `UNEXPLAINED.tsv` as an overlapping-entry opcode + at `1020:0666` and an alignment NOP at `1020:0dea`; zero bytes are + unclassified. +3. **Functions:** 391 ordinary in-image functions and all six overlapping/shared + entries are `verified`. Every ordinary function row names its exact address, + readable C symbol, source module, disassembly evidence, and semantic result. + No row is raw, partial, restored, unknown, or blocked. +4. **Readable C:** the authoritative deliverable is the 63 strict-C11 units + under `reconstructed/`. Historical partial `TDKPIN_*_RESTORED.c` files are + explicitly marked superseded and are not completion artifacts. +5. **Imports and ABI:** all 292 NE import slots are verified. The 137 called + slots have reviewed Win16 prototypes and call-site effects; 155 duplicate, + data-only, or unused slots have explicit zero-CALL accounting. Segment/offset + far pointers, PASCAL stack cleanup, 16-bit widths/wrap, and intentionally + retained register bytes are represented in the C model. +6. **Runtime library:** every in-image Borland routine is reconstructed or + identified through its exact implementation role. Real48 conversion, + arithmetic, comparison, transcendental tables, rounding, overflow/error + behavior, heap, files, strings, objects, and startup/shutdown paths are + address-linked rather than silently omitted. +7. **Data:** all 19,770 DGROUP bytes are covered by 744 non-overlapping verified + ranges and 219 verified semantic objects. All 455 referenced DGROUP addresses + and all 18 code-embedded objects (282 bytes) are verified. The complete + 175-record collision/rule table and all indirect dispatch/VMT/procedure + tables are represented. +8. **Callbacks and indirect control flow:** all six callback registrations are + verified with target, thunk/instance lifetime, and invocation behavior. All + 301 NE entry points, 2,434 relocation sites, VMT dispatches, bound thunks, + function pointers, and shared/overlapping entries are inventoried. +9. **Resources:** all 63 NE resources round-trip byte-for-byte from the target + and have decoded derivatives where applicable. `RESOURCE_RECONSTRUCTION.tsv` + has 63 verified rows. The semantic C catalog in `tdkpin_resources.c` records + every type/ID, file offset, flags, allocated/meaningful size, dimensions or + sample rate, disposition, and role. Four Borland File Open/Save templates are + explicitly `linked-unused`; ICON 1 and VERSION 1 are Windows-resolved rather + than falsely assigned image-code callers. WAV 2022 is loaded/freed by the + generic loop but has no in-image playback selector. +10. **Companion timer:** `MMTIMER.DLL` is sealed as + `f1d9ac980c7bfba5dc53eaa9e7cb2c3cd9b82f879ee8962ad40bf863d641bb49`. + TDKPIN's sole ordinal-1 relocation/call, the DLL's timer callback, message + `0x0580`, returned timer ID, and `timeKillEvent` lifetime are mapped. +11. **Behavioral validation:** every reconstructed C unit is compiled with + strict warnings by `tools/test_reconstructed_c.sh`; 89 focused harness + units cover normal, boundary, error, ownership, ABI, rendering, persistence, + resource, physics, callback, and lifecycle paths. The resource verifier + proves all 63 raw hashes and derivatives. `probe_real48_reference.sh` + matches a real 16-bit Borland reference stream bit-for-bit. Documented + Wine 11.15 probes cover original startup/input, timer gravity/substeps, + claw terminals, moving flippers, collision types 1..4, target/rule effects, + multiball, and scoring. Static/host evidence is not mislabeled as Wine. +12. **Phase boundary:** no Rust source or Cargo manifest/lockfile was modified. + +## Reproducible gates + +```sh +bash original/tools/test_reconstructed_c.sh +bash original/tools/probe_real48_reference.sh +python3 original/tools/audit_reconstruction.py --require-complete +git diff -- '*.rs' Cargo.toml Cargo.lock +``` + +The final ledger gate requires every function, import, data range/object, +resource, callback, and shared entry to be `verified`, plus zero unclassified +executable ranges. At this audit all required incomplete-status counts are zero. diff --git a/original/DATA_COVERAGE.tsv b/original/DATA_COVERAGE.tsv new file mode 100644 index 0000000..9f09a39 --- /dev/null +++ b/original/DATA_COVERAGE.tsv @@ -0,0 +1,745 @@ +start end bytes storage status stage object_id object_name c_type initial_value readers writers relocations evidence notes +1028:0000 1028:000f 16 initialized verified semantic-object compiler_data_prefix g_compiler_data_prefix const uint8_t[16] 00000000050000000000000000000000 Binary bytes plus complete zero-reader/zero-writer inventory; complete verified referring-function closure Explicit compiler/module data prefix retained byte-for-byte; no semantic consumer exists in the image. +1028:0010 1028:0011 2 initialized verified semantic-object highscore_xor_key g_highscore_xor_key const uint32_t 4957 FUN_1000_a8ea,FUN_1000_a99c Binary bytes; complete reader inventory 1000:a8ea/a99c; reconstructed/tdkpin_highscores.c; reconstructed/tests/test_highscores.c; 1028:0010:string[20]; complete verified referring-function closure Exact dword XOR key applied symmetrically to all ten serialized score values. +1028:0012 1028:0013 2 initialized verified semantic-object highscore_xor_key g_highscore_xor_key const uint32_t 494b FUN_1000_a8ea,FUN_1000_a99c Binary bytes; complete reader inventory 1000:a8ea/a99c; reconstructed/tdkpin_highscores.c; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact dword XOR key applied symmetrically to all ten serialized score values. +1028:0014 1028:0023 16 initialized verified semantic-object highscore_file_header g_highscore_file_header const uint8_t[16] 54444b204869676873636f7265730000 Binary bytes; complete save/write and load/ShortString-compare paths 1000:a8ea/a99c; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact 16-byte authentication header; both NUL bytes participate in comparison and serialization. +1028:0024 1028:002b 8 initialized verified semantic-object tdkpin_application_vmt g_tdkpin_application_vmt struct TdkpinApplicationVmt 1200eeff00000000 Binary hash b6da1047d807ee6b4c7ba9aac27c80fa2c968c483abb80385a33e79d28ebe717; relocations 6:3-16; all method targets and program-entry VMT calls verified.; complete verified referring-function closure Size 0x12, negative size 0xffee, reserved zero dword, destructor +08, Idle +0c, InitApplication +10, InitInstance +14, Setup +18, Run +1c, MessageLoop +20, PreProcess +24, dialog/accelerator/MDI +28/+2c/+30, MakeWindow +34, ExecDialog +38, ValidateWindow +3c, Error +40, CanClose +44. +1028:002c 1028:002f 4 initialized verified semantic-object tdkpin_application_vmt g_tdkpin_application_vmt struct TdkpinApplicationVmt ffff0000 1028:002c->entry-ordinal:99 Binary hash b6da1047d807ee6b4c7ba9aac27c80fa2c968c483abb80385a33e79d28ebe717; relocations 6:3-16; all method targets and program-entry VMT calls verified.; complete verified referring-function closure Size 0x12, negative size 0xffee, reserved zero dword, destructor +08, Idle +0c, InitApplication +10, InitInstance +14, Setup +18, Run +1c, MessageLoop +20, PreProcess +24, dialog/accelerator/MDI +28/+2c/+30, MakeWindow +34, ExecDialog +38, ValidateWindow +3c, Error +40, CanClose +44. +1028:0030 1028:0033 4 initialized verified semantic-object tdkpin_application_vmt g_tdkpin_application_vmt struct TdkpinApplicationVmt ffff0000 1028:0030->entry-ordinal:192 Binary hash b6da1047d807ee6b4c7ba9aac27c80fa2c968c483abb80385a33e79d28ebe717; relocations 6:3-16; all method targets and program-entry VMT calls verified.; complete verified referring-function closure Size 0x12, negative size 0xffee, reserved zero dword, destructor +08, Idle +0c, InitApplication +10, InitInstance +14, Setup +18, Run +1c, MessageLoop +20, PreProcess +24, dialog/accelerator/MDI +28/+2c/+30, MakeWindow +34, ExecDialog +38, ValidateWindow +3c, Error +40, CanClose +44. +1028:0034 1028:0037 4 initialized verified semantic-object tdkpin_application_vmt g_tdkpin_application_vmt struct TdkpinApplicationVmt ffff0000 1028:0034->entry-ordinal:193 Binary hash b6da1047d807ee6b4c7ba9aac27c80fa2c968c483abb80385a33e79d28ebe717; relocations 6:3-16; all method targets and program-entry VMT calls verified.; complete verified referring-function closure Size 0x12, negative size 0xffee, reserved zero dword, destructor +08, Idle +0c, InitApplication +10, InitInstance +14, Setup +18, Run +1c, MessageLoop +20, PreProcess +24, dialog/accelerator/MDI +28/+2c/+30, MakeWindow +34, ExecDialog +38, ValidateWindow +3c, Error +40, CanClose +44. +1028:0038 1028:003b 4 initialized verified semantic-object tdkpin_application_vmt g_tdkpin_application_vmt struct TdkpinApplicationVmt ffff0000 1028:0038->entry-ordinal:1 Binary hash b6da1047d807ee6b4c7ba9aac27c80fa2c968c483abb80385a33e79d28ebe717; relocations 6:3-16; all method targets and program-entry VMT calls verified.; complete verified referring-function closure Size 0x12, negative size 0xffee, reserved zero dword, destructor +08, Idle +0c, InitApplication +10, InitInstance +14, Setup +18, Run +1c, MessageLoop +20, PreProcess +24, dialog/accelerator/MDI +28/+2c/+30, MakeWindow +34, ExecDialog +38, ValidateWindow +3c, Error +40, CanClose +44. +1028:003c 1028:003f 4 initialized verified semantic-object tdkpin_application_vmt g_tdkpin_application_vmt struct TdkpinApplicationVmt ffff0000 1028:003c->entry-ordinal:2 Binary hash b6da1047d807ee6b4c7ba9aac27c80fa2c968c483abb80385a33e79d28ebe717; relocations 6:3-16; all method targets and program-entry VMT calls verified.; complete verified referring-function closure Size 0x12, negative size 0xffee, reserved zero dword, destructor +08, Idle +0c, InitApplication +10, InitInstance +14, Setup +18, Run +1c, MessageLoop +20, PreProcess +24, dialog/accelerator/MDI +28/+2c/+30, MakeWindow +34, ExecDialog +38, ValidateWindow +3c, Error +40, CanClose +44. +1028:0040 1028:0043 4 initialized verified semantic-object tdkpin_application_vmt g_tdkpin_application_vmt struct TdkpinApplicationVmt ffff0000 1028:0040->entry-ordinal:195 Binary hash b6da1047d807ee6b4c7ba9aac27c80fa2c968c483abb80385a33e79d28ebe717; relocations 6:3-16; all method targets and program-entry VMT calls verified.; complete verified referring-function closure Size 0x12, negative size 0xffee, reserved zero dword, destructor +08, Idle +0c, InitApplication +10, InitInstance +14, Setup +18, Run +1c, MessageLoop +20, PreProcess +24, dialog/accelerator/MDI +28/+2c/+30, MakeWindow +34, ExecDialog +38, ValidateWindow +3c, Error +40, CanClose +44. +1028:0044 1028:0047 4 initialized verified semantic-object tdkpin_application_vmt g_tdkpin_application_vmt struct TdkpinApplicationVmt ffff0000 1028:0044->entry-ordinal:197 Binary hash b6da1047d807ee6b4c7ba9aac27c80fa2c968c483abb80385a33e79d28ebe717; relocations 6:3-16; all method targets and program-entry VMT calls verified.; complete verified referring-function closure Size 0x12, negative size 0xffee, reserved zero dword, destructor +08, Idle +0c, InitApplication +10, InitInstance +14, Setup +18, Run +1c, MessageLoop +20, PreProcess +24, dialog/accelerator/MDI +28/+2c/+30, MakeWindow +34, ExecDialog +38, ValidateWindow +3c, Error +40, CanClose +44. +1028:0048 1028:004b 4 initialized verified semantic-object tdkpin_application_vmt g_tdkpin_application_vmt struct TdkpinApplicationVmt ffff0000 1028:0048->entry-ordinal:198 Binary hash b6da1047d807ee6b4c7ba9aac27c80fa2c968c483abb80385a33e79d28ebe717; relocations 6:3-16; all method targets and program-entry VMT calls verified.; complete verified referring-function closure Size 0x12, negative size 0xffee, reserved zero dword, destructor +08, Idle +0c, InitApplication +10, InitInstance +14, Setup +18, Run +1c, MessageLoop +20, PreProcess +24, dialog/accelerator/MDI +28/+2c/+30, MakeWindow +34, ExecDialog +38, ValidateWindow +3c, Error +40, CanClose +44. +1028:004c 1028:004f 4 initialized verified semantic-object tdkpin_application_vmt g_tdkpin_application_vmt struct TdkpinApplicationVmt ffff0000 1028:004c->entry-ordinal:199 Binary hash b6da1047d807ee6b4c7ba9aac27c80fa2c968c483abb80385a33e79d28ebe717; relocations 6:3-16; all method targets and program-entry VMT calls verified.; complete verified referring-function closure Size 0x12, negative size 0xffee, reserved zero dword, destructor +08, Idle +0c, InitApplication +10, InitInstance +14, Setup +18, Run +1c, MessageLoop +20, PreProcess +24, dialog/accelerator/MDI +28/+2c/+30, MakeWindow +34, ExecDialog +38, ValidateWindow +3c, Error +40, CanClose +44. +1028:0050 1028:0053 4 initialized verified semantic-object tdkpin_application_vmt g_tdkpin_application_vmt struct TdkpinApplicationVmt ffff0000 1028:0050->entry-ordinal:200 Binary hash b6da1047d807ee6b4c7ba9aac27c80fa2c968c483abb80385a33e79d28ebe717; relocations 6:3-16; all method targets and program-entry VMT calls verified.; complete verified referring-function closure Size 0x12, negative size 0xffee, reserved zero dword, destructor +08, Idle +0c, InitApplication +10, InitInstance +14, Setup +18, Run +1c, MessageLoop +20, PreProcess +24, dialog/accelerator/MDI +28/+2c/+30, MakeWindow +34, ExecDialog +38, ValidateWindow +3c, Error +40, CanClose +44. +1028:0054 1028:0057 4 initialized verified semantic-object tdkpin_application_vmt g_tdkpin_application_vmt struct TdkpinApplicationVmt ffff0000 1028:0054->entry-ordinal:201 Binary hash b6da1047d807ee6b4c7ba9aac27c80fa2c968c483abb80385a33e79d28ebe717; relocations 6:3-16; all method targets and program-entry VMT calls verified.; complete verified referring-function closure Size 0x12, negative size 0xffee, reserved zero dword, destructor +08, Idle +0c, InitApplication +10, InitInstance +14, Setup +18, Run +1c, MessageLoop +20, PreProcess +24, dialog/accelerator/MDI +28/+2c/+30, MakeWindow +34, ExecDialog +38, ValidateWindow +3c, Error +40, CanClose +44. +1028:0058 1028:005b 4 initialized verified semantic-object tdkpin_application_vmt g_tdkpin_application_vmt struct TdkpinApplicationVmt ffff0000 1028:0058->entry-ordinal:202 Binary hash b6da1047d807ee6b4c7ba9aac27c80fa2c968c483abb80385a33e79d28ebe717; relocations 6:3-16; all method targets and program-entry VMT calls verified.; complete verified referring-function closure Size 0x12, negative size 0xffee, reserved zero dword, destructor +08, Idle +0c, InitApplication +10, InitInstance +14, Setup +18, Run +1c, MessageLoop +20, PreProcess +24, dialog/accelerator/MDI +28/+2c/+30, MakeWindow +34, ExecDialog +38, ValidateWindow +3c, Error +40, CanClose +44. +1028:005c 1028:005f 4 initialized verified semantic-object tdkpin_application_vmt g_tdkpin_application_vmt struct TdkpinApplicationVmt ffff0000 1028:005c->entry-ordinal:203 Binary hash b6da1047d807ee6b4c7ba9aac27c80fa2c968c483abb80385a33e79d28ebe717; relocations 6:3-16; all method targets and program-entry VMT calls verified.; complete verified referring-function closure Size 0x12, negative size 0xffee, reserved zero dword, destructor +08, Idle +0c, InitApplication +10, InitInstance +14, Setup +18, Run +1c, MessageLoop +20, PreProcess +24, dialog/accelerator/MDI +28/+2c/+30, MakeWindow +34, ExecDialog +38, ValidateWindow +3c, Error +40, CanClose +44. +1028:0060 1028:0063 4 initialized verified semantic-object tdkpin_application_vmt g_tdkpin_application_vmt struct TdkpinApplicationVmt ffff0000 1028:0060->entry-ordinal:204 Binary hash b6da1047d807ee6b4c7ba9aac27c80fa2c968c483abb80385a33e79d28ebe717; relocations 6:3-16; all method targets and program-entry VMT calls verified.; complete verified referring-function closure Size 0x12, negative size 0xffee, reserved zero dword, destructor +08, Idle +0c, InitApplication +10, InitInstance +14, Setup +18, Run +1c, MessageLoop +20, PreProcess +24, dialog/accelerator/MDI +28/+2c/+30, MakeWindow +34, ExecDialog +38, ValidateWindow +3c, Error +40, CanClose +44. +1028:0064 1028:0067 4 initialized verified semantic-object tdkpin_application_vmt g_tdkpin_application_vmt struct TdkpinApplicationVmt ffff0000 1028:0064->entry-ordinal:205 Binary hash b6da1047d807ee6b4c7ba9aac27c80fa2c968c483abb80385a33e79d28ebe717; relocations 6:3-16; all method targets and program-entry VMT calls verified.; complete verified referring-function closure Size 0x12, negative size 0xffee, reserved zero dword, destructor +08, Idle +0c, InitApplication +10, InitInstance +14, Setup +18, Run +1c, MessageLoop +20, PreProcess +24, dialog/accelerator/MDI +28/+2c/+30, MakeWindow +34, ExecDialog +38, ValidateWindow +3c, Error +40, CanClose +44. +1028:0068 1028:006b 4 initialized verified semantic-object tdkpin_application_vmt g_tdkpin_application_vmt struct TdkpinApplicationVmt ffff0000 1028:0068->entry-ordinal:206 Binary hash b6da1047d807ee6b4c7ba9aac27c80fa2c968c483abb80385a33e79d28ebe717; relocations 6:3-16; all method targets and program-entry VMT calls verified.; complete verified referring-function closure Size 0x12, negative size 0xffee, reserved zero dword, destructor +08, Idle +0c, InitApplication +10, InitInstance +14, Setup +18, Run +1c, MessageLoop +20, PreProcess +24, dialog/accelerator/MDI +28/+2c/+30, MakeWindow +34, ExecDialog +38, ValidateWindow +3c, Error +40, CanClose +44. +1028:006c 1028:0081 22 initialized verified semantic-object main_window_dynamic_dispatch g_main_window_dynamic_dispatch const uint8_t[50] 0a060000000007000001010180051c00050011030f03 Exact bytes and relocations at 0082..009a to entry ordinals 8..14; all targets and dispatcher verified; complete verified referring-function closure Complete main-window dynamic dispatch descriptor, preserved separately from the VMT at 009e. +1028:0082 1028:0085 4 initialized verified semantic-object main_window_dynamic_dispatch g_main_window_dynamic_dispatch const uint8_t[50] ffff0000 1028:0082->entry-ordinal:8 Exact bytes and relocations at 0082..009a to entry ordinals 8..14; all targets and dispatcher verified; complete verified referring-function closure Complete main-window dynamic dispatch descriptor, preserved separately from the VMT at 009e. +1028:0086 1028:0089 4 initialized verified semantic-object main_window_dynamic_dispatch g_main_window_dynamic_dispatch const uint8_t[50] ffff0000 1028:0086->entry-ordinal:9 Exact bytes and relocations at 0082..009a to entry ordinals 8..14; all targets and dispatcher verified; complete verified referring-function closure Complete main-window dynamic dispatch descriptor, preserved separately from the VMT at 009e. +1028:008a 1028:008d 4 initialized verified semantic-object main_window_dynamic_dispatch g_main_window_dynamic_dispatch const uint8_t[50] ffff0000 1028:008a->entry-ordinal:10 Exact bytes and relocations at 0082..009a to entry ordinals 8..14; all targets and dispatcher verified; complete verified referring-function closure Complete main-window dynamic dispatch descriptor, preserved separately from the VMT at 009e. +1028:008e 1028:0091 4 initialized verified semantic-object main_window_dynamic_dispatch g_main_window_dynamic_dispatch const uint8_t[50] ffff0000 1028:008e->entry-ordinal:11 Exact bytes and relocations at 0082..009a to entry ordinals 8..14; all targets and dispatcher verified; complete verified referring-function closure Complete main-window dynamic dispatch descriptor, preserved separately from the VMT at 009e. +1028:0092 1028:0095 4 initialized verified semantic-object main_window_dynamic_dispatch g_main_window_dynamic_dispatch const uint8_t[50] ffff0000 1028:0092->entry-ordinal:12 Exact bytes and relocations at 0082..009a to entry ordinals 8..14; all targets and dispatcher verified; complete verified referring-function closure Complete main-window dynamic dispatch descriptor, preserved separately from the VMT at 009e. +1028:0096 1028:0099 4 initialized verified semantic-object main_window_dynamic_dispatch g_main_window_dynamic_dispatch const uint8_t[50] ffff0000 1028:0096->entry-ordinal:13 Exact bytes and relocations at 0082..009a to entry ordinals 8..14; all targets and dispatcher verified; complete verified referring-function closure Complete main-window dynamic dispatch descriptor, preserved separately from the VMT at 009e. +1028:009a 1028:009d 4 initialized verified semantic-object main_window_dynamic_dispatch g_main_window_dynamic_dispatch const uint8_t[50] ffff0000 1028:009a->entry-ordinal:14 Exact bytes and relocations at 0082..009a to entry ordinals 8..14; all targets and dispatcher verified; complete verified referring-function closure Complete main-window dynamic dispatch descriptor, preserved separately from the VMT at 009e. +1028:009e 1028:00a5 8 initialized verified semantic-object main_window_vmt g_main_window_vmt const uint8_t[80] e50b1bf46c000000 Constructor uses VMT 009e; exact relocations 00a6..00ea; all method targets/window paths verified; complete verified referring-function closure Exact main game-window VMT extent from size/header through final virtual slot. +1028:00a6 1028:00a9 4 initialized verified semantic-object main_window_vmt g_main_window_vmt const uint8_t[80] ffff0000 1028:00a6->entry-ordinal:5 Constructor uses VMT 009e; exact relocations 00a6..00ea; all method targets/window paths verified; complete verified referring-function closure Exact main game-window VMT extent from size/header through final virtual slot. +1028:00aa 1028:00ad 4 initialized verified semantic-object main_window_vmt g_main_window_vmt const uint8_t[80] ffff0000 1028:00aa->entry-ordinal:177 Constructor uses VMT 009e; exact relocations 00a6..00ea; all method targets/window paths verified; complete verified referring-function closure Exact main game-window VMT extent from size/header through final virtual slot. +1028:00ae 1028:00b1 4 initialized verified semantic-object main_window_vmt g_main_window_vmt const uint8_t[80] ffff0000 1028:00ae->entry-ordinal:135 Constructor uses VMT 009e; exact relocations 00a6..00ea; all method targets/window paths verified; complete verified referring-function closure Exact main game-window VMT extent from size/header through final virtual slot. +1028:00b2 1028:00b5 4 initialized verified semantic-object main_window_vmt g_main_window_vmt const uint8_t[80] ffff0000 1028:00b2->entry-ordinal:136 Constructor uses VMT 009e; exact relocations 00a6..00ea; all method targets/window paths verified; complete verified referring-function closure Exact main game-window VMT extent from size/header through final virtual slot. +1028:00b6 1028:00b9 4 initialized verified semantic-object main_window_vmt g_main_window_vmt const uint8_t[80] ffff0000 1028:00b6->entry-ordinal:137 Constructor uses VMT 009e; exact relocations 00a6..00ea; all method targets/window paths verified; complete verified referring-function closure Exact main game-window VMT extent from size/header through final virtual slot. +1028:00ba 1028:00bd 4 initialized verified semantic-object main_window_vmt g_main_window_vmt const uint8_t[80] ffff0000 1028:00ba->entry-ordinal:145 Constructor uses VMT 009e; exact relocations 00a6..00ea; all method targets/window paths verified; complete verified referring-function closure Exact main game-window VMT extent from size/header through final virtual slot. +1028:00be 1028:00c1 4 initialized verified semantic-object main_window_vmt g_main_window_vmt const uint8_t[80] ffff0000 1028:00be->entry-ordinal:176 Constructor uses VMT 009e; exact relocations 00a6..00ea; all method targets/window paths verified; complete verified referring-function closure Exact main game-window VMT extent from size/header through final virtual slot. +1028:00c2 1028:00c5 4 initialized verified semantic-object main_window_vmt g_main_window_vmt const uint8_t[80] ffff0000 1028:00c2->entry-ordinal:146 Constructor uses VMT 009e; exact relocations 00a6..00ea; all method targets/window paths verified; complete verified referring-function closure Exact main game-window VMT extent from size/header through final virtual slot. +1028:00c6 1028:00c9 4 initialized verified semantic-object main_window_vmt g_main_window_vmt const uint8_t[80] ffff0000 1028:00c6->entry-ordinal:175 Constructor uses VMT 009e; exact relocations 00a6..00ea; all method targets/window paths verified; complete verified referring-function closure Exact main game-window VMT extent from size/header through final virtual slot. +1028:00ca 1028:00cd 4 initialized verified semantic-object main_window_vmt g_main_window_vmt const uint8_t[80] ffff0000 1028:00ca->entry-ordinal:148 Constructor uses VMT 009e; exact relocations 00a6..00ea; all method targets/window paths verified; complete verified referring-function closure Exact main game-window VMT extent from size/header through final virtual slot. +1028:00ce 1028:00d1 4 initialized verified semantic-object main_window_vmt g_main_window_vmt const uint8_t[80] ffff0000 1028:00ce->entry-ordinal:149 Constructor uses VMT 009e; exact relocations 00a6..00ea; all method targets/window paths verified; complete verified referring-function closure Exact main game-window VMT extent from size/header through final virtual slot. +1028:00d2 1028:00d5 4 initialized verified semantic-object main_window_vmt g_main_window_vmt const uint8_t[80] ffff0000 1028:00d2->entry-ordinal:4 Constructor uses VMT 009e; exact relocations 00a6..00ea; all method targets/window paths verified; complete verified referring-function closure Exact main game-window VMT extent from size/header through final virtual slot. +1028:00d6 1028:00d9 4 initialized verified semantic-object main_window_vmt g_main_window_vmt const uint8_t[80] ffff0000 1028:00d6->entry-ordinal:6 Constructor uses VMT 009e; exact relocations 00a6..00ea; all method targets/window paths verified; complete verified referring-function closure Exact main game-window VMT extent from size/header through final virtual slot. +1028:00da 1028:00dd 4 initialized verified semantic-object main_window_vmt g_main_window_vmt const uint8_t[80] ffff0000 1028:00da->entry-ordinal:153 Constructor uses VMT 009e; exact relocations 00a6..00ea; all method targets/window paths verified; complete verified referring-function closure Exact main game-window VMT extent from size/header through final virtual slot. +1028:00de 1028:00e1 4 initialized verified semantic-object main_window_vmt g_main_window_vmt const uint8_t[80] ffff0000 1028:00de->entry-ordinal:154 Constructor uses VMT 009e; exact relocations 00a6..00ea; all method targets/window paths verified; complete verified referring-function closure Exact main game-window VMT extent from size/header through final virtual slot. +1028:00e2 1028:00e5 4 initialized verified semantic-object main_window_vmt g_main_window_vmt const uint8_t[80] ffff0000 1028:00e2->entry-ordinal:155 Constructor uses VMT 009e; exact relocations 00a6..00ea; all method targets/window paths verified; complete verified referring-function closure Exact main game-window VMT extent from size/header through final virtual slot. +1028:00e6 1028:00e9 4 initialized verified semantic-object main_window_vmt g_main_window_vmt const uint8_t[80] ffff0000 1028:00e6->entry-ordinal:156 Constructor uses VMT 009e; exact relocations 00a6..00ea; all method targets/window paths verified; complete verified referring-function closure Exact main game-window VMT extent from size/header through final virtual slot. +1028:00ea 1028:00ed 4 initialized verified semantic-object main_window_vmt g_main_window_vmt const uint8_t[80] ffff0000 1028:00ea->entry-ordinal:7 Constructor uses VMT 009e; exact relocations 00a6..00ea; all method targets/window paths verified; complete verified referring-function closure Exact main game-window VMT extent from size/header through final virtual slot. +1028:00ee 1028:00fd 16 initialized verified semantic-object highscore_dynamic_dispatch g_highscore_dynamic_dispatch const uint8_t[32] 0a060000000004000102010111030f03 Exact bytes and relocations 00fe..010a to entry ordinals 20..23; high-score window behavior verified; complete verified referring-function closure Complete dynamic dispatch descriptor paired with the verified high-score VMT at 010e. +1028:00fe 1028:0101 4 initialized verified semantic-object highscore_dynamic_dispatch g_highscore_dynamic_dispatch const uint8_t[32] ffff0000 1028:00fe->entry-ordinal:20 Exact bytes and relocations 00fe..010a to entry ordinals 20..23; high-score window behavior verified; complete verified referring-function closure Complete dynamic dispatch descriptor paired with the verified high-score VMT at 010e. +1028:0102 1028:0105 4 initialized verified semantic-object highscore_dynamic_dispatch g_highscore_dynamic_dispatch const uint8_t[32] ffff0000 1028:0102->entry-ordinal:21 Exact bytes and relocations 00fe..010a to entry ordinals 20..23; high-score window behavior verified; complete verified referring-function closure Complete dynamic dispatch descriptor paired with the verified high-score VMT at 010e. +1028:0106 1028:0109 4 initialized verified semantic-object highscore_dynamic_dispatch g_highscore_dynamic_dispatch const uint8_t[32] ffff0000 1028:0106->entry-ordinal:22 Exact bytes and relocations 00fe..010a to entry ordinals 20..23; high-score window behavior verified; complete verified referring-function closure Complete dynamic dispatch descriptor paired with the verified high-score VMT at 010e. +1028:010a 1028:010d 4 initialized verified semantic-object highscore_dynamic_dispatch g_highscore_dynamic_dispatch const uint8_t[32] ffff0000 1028:010a->entry-ordinal:23 Exact bytes and relocations 00fe..010a to entry ordinals 20..23; high-score window behavior verified; complete verified referring-function closure Complete dynamic dispatch descriptor paired with the verified high-score VMT at 010e. +1028:010e 1028:0115 8 initialized verified semantic-object highscore_window_vmt g_highscore_window_vmt TdkpinHighscoreWindowVmt 4500bbffee000000 Binary bytes; relocations 6:46-63; all method targets including paint 1000:5c13 verified; reconstructed/tdkpin_highscores.h; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact 80-byte TWindow-derived VMT from destructor +08 through paint +4c, with every slot named and address-backed. +1028:0116 1028:0119 4 initialized verified semantic-object highscore_window_vmt g_highscore_window_vmt TdkpinHighscoreWindowVmt ffff0000 1028:0116->entry-ordinal:17 Binary bytes; relocations 6:46-63; all method targets including paint 1000:5c13 verified; reconstructed/tdkpin_highscores.h; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact 80-byte TWindow-derived VMT from destructor +08 through paint +4c, with every slot named and address-backed. +1028:011a 1028:011d 4 initialized verified semantic-object highscore_window_vmt g_highscore_window_vmt TdkpinHighscoreWindowVmt ffff0000 1028:011a->entry-ordinal:177 Binary bytes; relocations 6:46-63; all method targets including paint 1000:5c13 verified; reconstructed/tdkpin_highscores.h; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact 80-byte TWindow-derived VMT from destructor +08 through paint +4c, with every slot named and address-backed. +1028:011e 1028:0121 4 initialized verified semantic-object highscore_window_vmt g_highscore_window_vmt TdkpinHighscoreWindowVmt ffff0000 1028:011e->entry-ordinal:135 Binary bytes; relocations 6:46-63; all method targets including paint 1000:5c13 verified; reconstructed/tdkpin_highscores.h; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact 80-byte TWindow-derived VMT from destructor +08 through paint +4c, with every slot named and address-backed. +1028:0122 1028:0125 4 initialized verified semantic-object highscore_window_vmt g_highscore_window_vmt TdkpinHighscoreWindowVmt ffff0000 1028:0122->entry-ordinal:136 Binary bytes; relocations 6:46-63; all method targets including paint 1000:5c13 verified; reconstructed/tdkpin_highscores.h; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact 80-byte TWindow-derived VMT from destructor +08 through paint +4c, with every slot named and address-backed. +1028:0126 1028:0129 4 initialized verified semantic-object highscore_window_vmt g_highscore_window_vmt TdkpinHighscoreWindowVmt ffff0000 1028:0126->entry-ordinal:137 Binary bytes; relocations 6:46-63; all method targets including paint 1000:5c13 verified; reconstructed/tdkpin_highscores.h; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact 80-byte TWindow-derived VMT from destructor +08 through paint +4c, with every slot named and address-backed. +1028:012a 1028:012d 4 initialized verified semantic-object highscore_window_vmt g_highscore_window_vmt TdkpinHighscoreWindowVmt ffff0000 1028:012a->entry-ordinal:145 Binary bytes; relocations 6:46-63; all method targets including paint 1000:5c13 verified; reconstructed/tdkpin_highscores.h; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact 80-byte TWindow-derived VMT from destructor +08 through paint +4c, with every slot named and address-backed. +1028:012e 1028:0131 4 initialized verified semantic-object highscore_window_vmt g_highscore_window_vmt TdkpinHighscoreWindowVmt ffff0000 1028:012e->entry-ordinal:176 Binary bytes; relocations 6:46-63; all method targets including paint 1000:5c13 verified; reconstructed/tdkpin_highscores.h; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact 80-byte TWindow-derived VMT from destructor +08 through paint +4c, with every slot named and address-backed. +1028:0132 1028:0135 4 initialized verified semantic-object highscore_window_vmt g_highscore_window_vmt TdkpinHighscoreWindowVmt ffff0000 1028:0132->entry-ordinal:146 Binary bytes; relocations 6:46-63; all method targets including paint 1000:5c13 verified; reconstructed/tdkpin_highscores.h; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact 80-byte TWindow-derived VMT from destructor +08 through paint +4c, with every slot named and address-backed. +1028:0136 1028:0139 4 initialized verified semantic-object highscore_window_vmt g_highscore_window_vmt TdkpinHighscoreWindowVmt ffff0000 1028:0136->entry-ordinal:175 Binary bytes; relocations 6:46-63; all method targets including paint 1000:5c13 verified; reconstructed/tdkpin_highscores.h; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact 80-byte TWindow-derived VMT from destructor +08 through paint +4c, with every slot named and address-backed. +1028:013a 1028:013d 4 initialized verified semantic-object highscore_window_vmt g_highscore_window_vmt TdkpinHighscoreWindowVmt ffff0000 1028:013a->entry-ordinal:148 Binary bytes; relocations 6:46-63; all method targets including paint 1000:5c13 verified; reconstructed/tdkpin_highscores.h; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact 80-byte TWindow-derived VMT from destructor +08 through paint +4c, with every slot named and address-backed. +1028:013e 1028:0141 4 initialized verified semantic-object highscore_window_vmt g_highscore_window_vmt TdkpinHighscoreWindowVmt ffff0000 1028:013e->entry-ordinal:149 Binary bytes; relocations 6:46-63; all method targets including paint 1000:5c13 verified; reconstructed/tdkpin_highscores.h; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact 80-byte TWindow-derived VMT from destructor +08 through paint +4c, with every slot named and address-backed. +1028:0142 1028:0145 4 initialized verified semantic-object highscore_window_vmt g_highscore_window_vmt TdkpinHighscoreWindowVmt ffff0000 1028:0142->entry-ordinal:16 Binary bytes; relocations 6:46-63; all method targets including paint 1000:5c13 verified; reconstructed/tdkpin_highscores.h; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact 80-byte TWindow-derived VMT from destructor +08 through paint +4c, with every slot named and address-backed. +1028:0146 1028:0149 4 initialized verified semantic-object highscore_window_vmt g_highscore_window_vmt TdkpinHighscoreWindowVmt ffff0000 1028:0146->entry-ordinal:18 Binary bytes; relocations 6:46-63; all method targets including paint 1000:5c13 verified; reconstructed/tdkpin_highscores.h; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact 80-byte TWindow-derived VMT from destructor +08 through paint +4c, with every slot named and address-backed. +1028:014a 1028:014d 4 initialized verified semantic-object highscore_window_vmt g_highscore_window_vmt TdkpinHighscoreWindowVmt ffff0000 1028:014a->entry-ordinal:153 Binary bytes; relocations 6:46-63; all method targets including paint 1000:5c13 verified; reconstructed/tdkpin_highscores.h; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact 80-byte TWindow-derived VMT from destructor +08 through paint +4c, with every slot named and address-backed. +1028:014e 1028:0151 4 initialized verified semantic-object highscore_window_vmt g_highscore_window_vmt TdkpinHighscoreWindowVmt ffff0000 1028:014e->entry-ordinal:154 Binary bytes; relocations 6:46-63; all method targets including paint 1000:5c13 verified; reconstructed/tdkpin_highscores.h; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact 80-byte TWindow-derived VMT from destructor +08 through paint +4c, with every slot named and address-backed. +1028:0152 1028:0155 4 initialized verified semantic-object highscore_window_vmt g_highscore_window_vmt TdkpinHighscoreWindowVmt ffff0000 1028:0152->entry-ordinal:155 Binary bytes; relocations 6:46-63; all method targets including paint 1000:5c13 verified; reconstructed/tdkpin_highscores.h; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact 80-byte TWindow-derived VMT from destructor +08 through paint +4c, with every slot named and address-backed. +1028:0156 1028:0159 4 initialized verified semantic-object highscore_window_vmt g_highscore_window_vmt TdkpinHighscoreWindowVmt ffff0000 1028:0156->entry-ordinal:156 Binary bytes; relocations 6:46-63; all method targets including paint 1000:5c13 verified; reconstructed/tdkpin_highscores.h; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact 80-byte TWindow-derived VMT from destructor +08 through paint +4c, with every slot named and address-backed. +1028:015a 1028:015d 4 initialized verified semantic-object highscore_window_vmt g_highscore_window_vmt TdkpinHighscoreWindowVmt ffff0000 1028:015a->entry-ordinal:19 Binary bytes; relocations 6:46-63; all method targets including paint 1000:5c13 verified; reconstructed/tdkpin_highscores.h; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact 80-byte TWindow-derived VMT from destructor +08 through paint +4c, with every slot named and address-backed. +1028:015e 1028:016d 16 initialized verified semantic-object full_child_dynamic_dispatch g_full_child_dynamic_dispatch const uint8_t[32] 0a060000000004000102010111030f03 Exact bytes and relocations 016e..017a to entry ordinals 29..32; full-child handlers verified; complete verified referring-function closure Complete dynamic dispatch descriptor for the full-size child/help window class. +1028:016e 1028:0171 4 initialized verified semantic-object full_child_dynamic_dispatch g_full_child_dynamic_dispatch const uint8_t[32] ffff0000 1028:016e->entry-ordinal:29 Exact bytes and relocations 016e..017a to entry ordinals 29..32; full-child handlers verified; complete verified referring-function closure Complete dynamic dispatch descriptor for the full-size child/help window class. +1028:0172 1028:0175 4 initialized verified semantic-object full_child_dynamic_dispatch g_full_child_dynamic_dispatch const uint8_t[32] ffff0000 1028:0172->entry-ordinal:30 Exact bytes and relocations 016e..017a to entry ordinals 29..32; full-child handlers verified; complete verified referring-function closure Complete dynamic dispatch descriptor for the full-size child/help window class. +1028:0176 1028:0179 4 initialized verified semantic-object full_child_dynamic_dispatch g_full_child_dynamic_dispatch const uint8_t[32] ffff0000 1028:0176->entry-ordinal:31 Exact bytes and relocations 016e..017a to entry ordinals 29..32; full-child handlers verified; complete verified referring-function closure Complete dynamic dispatch descriptor for the full-size child/help window class. +1028:017a 1028:017d 4 initialized verified semantic-object full_child_dynamic_dispatch g_full_child_dynamic_dispatch const uint8_t[32] ffff0000 1028:017a->entry-ordinal:32 Exact bytes and relocations 016e..017a to entry ordinals 29..32; full-child handlers verified; complete verified referring-function closure Complete dynamic dispatch descriptor for the full-size child/help window class. +1028:017e 1028:0185 8 initialized verified semantic-object full_child_window_vmt g_full_child_window_vmt const uint8_t[80] 4500bbff5e010000 Constructors use VMT 017e; exact relocations 0186..01ca; all window targets verified; complete verified referring-function closure Exact full-child/help window VMT from object size/header through final paint/message slot. +1028:0186 1028:0189 4 initialized verified semantic-object full_child_window_vmt g_full_child_window_vmt const uint8_t[80] ffff0000 1028:0186->entry-ordinal:26 Constructors use VMT 017e; exact relocations 0186..01ca; all window targets verified; complete verified referring-function closure Exact full-child/help window VMT from object size/header through final paint/message slot. +1028:018a 1028:018d 4 initialized verified semantic-object full_child_window_vmt g_full_child_window_vmt const uint8_t[80] ffff0000 1028:018a->entry-ordinal:177 Constructors use VMT 017e; exact relocations 0186..01ca; all window targets verified; complete verified referring-function closure Exact full-child/help window VMT from object size/header through final paint/message slot. +1028:018e 1028:0191 4 initialized verified semantic-object full_child_window_vmt g_full_child_window_vmt const uint8_t[80] ffff0000 1028:018e->entry-ordinal:135 Constructors use VMT 017e; exact relocations 0186..01ca; all window targets verified; complete verified referring-function closure Exact full-child/help window VMT from object size/header through final paint/message slot. +1028:0192 1028:0195 4 initialized verified semantic-object full_child_window_vmt g_full_child_window_vmt const uint8_t[80] ffff0000 1028:0192->entry-ordinal:136 Constructors use VMT 017e; exact relocations 0186..01ca; all window targets verified; complete verified referring-function closure Exact full-child/help window VMT from object size/header through final paint/message slot. +1028:0196 1028:0199 4 initialized verified semantic-object full_child_window_vmt g_full_child_window_vmt const uint8_t[80] ffff0000 1028:0196->entry-ordinal:137 Constructors use VMT 017e; exact relocations 0186..01ca; all window targets verified; complete verified referring-function closure Exact full-child/help window VMT from object size/header through final paint/message slot. +1028:019a 1028:019d 4 initialized verified semantic-object full_child_window_vmt g_full_child_window_vmt const uint8_t[80] ffff0000 1028:019a->entry-ordinal:145 Constructors use VMT 017e; exact relocations 0186..01ca; all window targets verified; complete verified referring-function closure Exact full-child/help window VMT from object size/header through final paint/message slot. +1028:019e 1028:01a1 4 initialized verified semantic-object full_child_window_vmt g_full_child_window_vmt const uint8_t[80] ffff0000 1028:019e->entry-ordinal:176 Constructors use VMT 017e; exact relocations 0186..01ca; all window targets verified; complete verified referring-function closure Exact full-child/help window VMT from object size/header through final paint/message slot. +1028:01a2 1028:01a5 4 initialized verified semantic-object full_child_window_vmt g_full_child_window_vmt const uint8_t[80] ffff0000 1028:01a2->entry-ordinal:146 Constructors use VMT 017e; exact relocations 0186..01ca; all window targets verified; complete verified referring-function closure Exact full-child/help window VMT from object size/header through final paint/message slot. +1028:01a6 1028:01a9 4 initialized verified semantic-object full_child_window_vmt g_full_child_window_vmt const uint8_t[80] ffff0000 1028:01a6->entry-ordinal:175 Constructors use VMT 017e; exact relocations 0186..01ca; all window targets verified; complete verified referring-function closure Exact full-child/help window VMT from object size/header through final paint/message slot. +1028:01aa 1028:01ad 4 initialized verified semantic-object full_child_window_vmt g_full_child_window_vmt const uint8_t[80] ffff0000 1028:01aa->entry-ordinal:148 Constructors use VMT 017e; exact relocations 0186..01ca; all window targets verified; complete verified referring-function closure Exact full-child/help window VMT from object size/header through final paint/message slot. +1028:01ae 1028:01b1 4 initialized verified semantic-object full_child_window_vmt g_full_child_window_vmt const uint8_t[80] ffff0000 1028:01ae->entry-ordinal:149 Constructors use VMT 017e; exact relocations 0186..01ca; all window targets verified; complete verified referring-function closure Exact full-child/help window VMT from object size/header through final paint/message slot. +1028:01b2 1028:01b5 4 initialized verified semantic-object full_child_window_vmt g_full_child_window_vmt const uint8_t[80] ffff0000 1028:01b2->entry-ordinal:25 Constructors use VMT 017e; exact relocations 0186..01ca; all window targets verified; complete verified referring-function closure Exact full-child/help window VMT from object size/header through final paint/message slot. +1028:01b6 1028:01b9 4 initialized verified semantic-object full_child_window_vmt g_full_child_window_vmt const uint8_t[80] ffff0000 1028:01b6->entry-ordinal:27 Constructors use VMT 017e; exact relocations 0186..01ca; all window targets verified; complete verified referring-function closure Exact full-child/help window VMT from object size/header through final paint/message slot. +1028:01ba 1028:01bd 4 initialized verified semantic-object full_child_window_vmt g_full_child_window_vmt const uint8_t[80] ffff0000 1028:01ba->entry-ordinal:153 Constructors use VMT 017e; exact relocations 0186..01ca; all window targets verified; complete verified referring-function closure Exact full-child/help window VMT from object size/header through final paint/message slot. +1028:01be 1028:01c1 4 initialized verified semantic-object full_child_window_vmt g_full_child_window_vmt const uint8_t[80] ffff0000 1028:01be->entry-ordinal:154 Constructors use VMT 017e; exact relocations 0186..01ca; all window targets verified; complete verified referring-function closure Exact full-child/help window VMT from object size/header through final paint/message slot. +1028:01c2 1028:01c5 4 initialized verified semantic-object full_child_window_vmt g_full_child_window_vmt const uint8_t[80] ffff0000 1028:01c2->entry-ordinal:155 Constructors use VMT 017e; exact relocations 0186..01ca; all window targets verified; complete verified referring-function closure Exact full-child/help window VMT from object size/header through final paint/message slot. +1028:01c6 1028:01c9 4 initialized verified semantic-object full_child_window_vmt g_full_child_window_vmt const uint8_t[80] ffff0000 1028:01c6->entry-ordinal:156 Constructors use VMT 017e; exact relocations 0186..01ca; all window targets verified; complete verified referring-function closure Exact full-child/help window VMT from object size/header through final paint/message slot. +1028:01ca 1028:01cd 4 initialized verified semantic-object full_child_window_vmt g_full_child_window_vmt const uint8_t[80] ffff0000 1028:01ca->entry-ordinal:28 Constructors use VMT 017e; exact relocations 0186..01ca; all window targets verified; complete verified referring-function closure Exact full-child/help window VMT from object size/header through final paint/message slot. +1028:01ce 1028:01d5 8 initialized verified semantic-object text_dialog_vmt g_text_dialog_vmt const uint8_t[84] 3400ccffc6060000 High-score editor constructs VMT 01ce; exact relocations 01d6..021e; dialog lifecycle verified; complete verified referring-function closure Exact modal text-dialog VMT including dialog-specific terminal slots 225 and 226. +1028:01d6 1028:01d9 4 initialized verified semantic-object text_dialog_vmt g_text_dialog_vmt const uint8_t[84] ffff0000 1028:01d6->entry-ordinal:223 High-score editor constructs VMT 01ce; exact relocations 01d6..021e; dialog lifecycle verified; complete verified referring-function closure Exact modal text-dialog VMT including dialog-specific terminal slots 225 and 226. +1028:01da 1028:01dd 4 initialized verified semantic-object text_dialog_vmt g_text_dialog_vmt const uint8_t[84] ffff0000 1028:01da->entry-ordinal:233 High-score editor constructs VMT 01ce; exact relocations 01d6..021e; dialog lifecycle verified; complete verified referring-function closure Exact modal text-dialog VMT including dialog-specific terminal slots 225 and 226. +1028:01de 1028:01e1 4 initialized verified semantic-object text_dialog_vmt g_text_dialog_vmt const uint8_t[84] ffff0000 1028:01de->entry-ordinal:135 High-score editor constructs VMT 01ce; exact relocations 01d6..021e; dialog lifecycle verified; complete verified referring-function closure Exact modal text-dialog VMT including dialog-specific terminal slots 225 and 226. +1028:01e2 1028:01e5 4 initialized verified semantic-object text_dialog_vmt g_text_dialog_vmt const uint8_t[84] ffff0000 1028:01e2->entry-ordinal:136 High-score editor constructs VMT 01ce; exact relocations 01d6..021e; dialog lifecycle verified; complete verified referring-function closure Exact modal text-dialog VMT including dialog-specific terminal slots 225 and 226. +1028:01e6 1028:01e9 4 initialized verified semantic-object text_dialog_vmt g_text_dialog_vmt const uint8_t[84] ffff0000 1028:01e6->entry-ordinal:137 High-score editor constructs VMT 01ce; exact relocations 01d6..021e; dialog lifecycle verified; complete verified referring-function closure Exact modal text-dialog VMT including dialog-specific terminal slots 225 and 226. +1028:01ea 1028:01ed 4 initialized verified semantic-object text_dialog_vmt g_text_dialog_vmt const uint8_t[84] ffff0000 1028:01ea->entry-ordinal:145 High-score editor constructs VMT 01ce; exact relocations 01d6..021e; dialog lifecycle verified; complete verified referring-function closure Exact modal text-dialog VMT including dialog-specific terminal slots 225 and 226. +1028:01ee 1028:01f1 4 initialized verified semantic-object text_dialog_vmt g_text_dialog_vmt const uint8_t[84] ffff0000 1028:01ee->entry-ordinal:224 High-score editor constructs VMT 01ce; exact relocations 01d6..021e; dialog lifecycle verified; complete verified referring-function closure Exact modal text-dialog VMT including dialog-specific terminal slots 225 and 226. +1028:01f2 1028:01f5 4 initialized verified semantic-object text_dialog_vmt g_text_dialog_vmt const uint8_t[84] ffff0000 1028:01f2->entry-ordinal:146 High-score editor constructs VMT 01ce; exact relocations 01d6..021e; dialog lifecycle verified; complete verified referring-function closure Exact modal text-dialog VMT including dialog-specific terminal slots 225 and 226. +1028:01f6 1028:01f9 4 initialized verified semantic-object text_dialog_vmt g_text_dialog_vmt const uint8_t[84] ffff0000 1028:01f6->entry-ordinal:147 High-score editor constructs VMT 01ce; exact relocations 01d6..021e; dialog lifecycle verified; complete verified referring-function closure Exact modal text-dialog VMT including dialog-specific terminal slots 225 and 226. +1028:01fa 1028:01fd 4 initialized verified semantic-object text_dialog_vmt g_text_dialog_vmt const uint8_t[84] ffff0000 1028:01fa->entry-ordinal:148 High-score editor constructs VMT 01ce; exact relocations 01d6..021e; dialog lifecycle verified; complete verified referring-function closure Exact modal text-dialog VMT including dialog-specific terminal slots 225 and 226. +1028:01fe 1028:0201 4 initialized verified semantic-object text_dialog_vmt g_text_dialog_vmt const uint8_t[84] ffff0000 1028:01fe->entry-ordinal:149 High-score editor constructs VMT 01ce; exact relocations 01d6..021e; dialog lifecycle verified; complete verified referring-function closure Exact modal text-dialog VMT including dialog-specific terminal slots 225 and 226. +1028:0202 1028:0205 4 initialized verified semantic-object text_dialog_vmt g_text_dialog_vmt const uint8_t[84] ffff0000 1028:0202->entry-ordinal:150 High-score editor constructs VMT 01ce; exact relocations 01d6..021e; dialog lifecycle verified; complete verified referring-function closure Exact modal text-dialog VMT including dialog-specific terminal slots 225 and 226. +1028:0206 1028:0209 4 initialized verified semantic-object text_dialog_vmt g_text_dialog_vmt const uint8_t[84] ffff0000 1028:0206->entry-ordinal:108 High-score editor constructs VMT 01ce; exact relocations 01d6..021e; dialog lifecycle verified; complete verified referring-function closure Exact modal text-dialog VMT including dialog-specific terminal slots 225 and 226. +1028:020a 1028:020d 4 initialized verified semantic-object text_dialog_vmt g_text_dialog_vmt const uint8_t[84] ffff0000 1028:020a->entry-ordinal:107 High-score editor constructs VMT 01ce; exact relocations 01d6..021e; dialog lifecycle verified; complete verified referring-function closure Exact modal text-dialog VMT including dialog-specific terminal slots 225 and 226. +1028:020e 1028:0211 4 initialized verified semantic-object text_dialog_vmt g_text_dialog_vmt const uint8_t[84] ffff0000 1028:020e->entry-ordinal:154 High-score editor constructs VMT 01ce; exact relocations 01d6..021e; dialog lifecycle verified; complete verified referring-function closure Exact modal text-dialog VMT including dialog-specific terminal slots 225 and 226. +1028:0212 1028:0215 4 initialized verified semantic-object text_dialog_vmt g_text_dialog_vmt const uint8_t[84] ffff0000 1028:0212->entry-ordinal:155 High-score editor constructs VMT 01ce; exact relocations 01d6..021e; dialog lifecycle verified; complete verified referring-function closure Exact modal text-dialog VMT including dialog-specific terminal slots 225 and 226. +1028:0216 1028:0219 4 initialized verified semantic-object text_dialog_vmt g_text_dialog_vmt const uint8_t[84] ffff0000 1028:0216->entry-ordinal:156 High-score editor constructs VMT 01ce; exact relocations 01d6..021e; dialog lifecycle verified; complete verified referring-function closure Exact modal text-dialog VMT including dialog-specific terminal slots 225 and 226. +1028:021a 1028:021d 4 initialized verified semantic-object text_dialog_vmt g_text_dialog_vmt const uint8_t[84] ffff0000 1028:021a->entry-ordinal:225 High-score editor constructs VMT 01ce; exact relocations 01d6..021e; dialog lifecycle verified; complete verified referring-function closure Exact modal text-dialog VMT including dialog-specific terminal slots 225 and 226. +1028:021e 1028:0221 4 initialized verified semantic-object text_dialog_vmt g_text_dialog_vmt const uint8_t[84] ffff0000 1028:021e->entry-ordinal:226 High-score editor constructs VMT 01ce; exact relocations 01d6..021e; dialog lifecycle verified; complete verified referring-function closure Exact modal text-dialog VMT including dialog-specific terminal slots 225 and 226. +1028:0222 1028:022b 10 initialized verified semantic-object tdkpin_module_name tdkpin_module_name char[10] 464c4950504552334400 Binary bytes; verified multimedia initialization call 1000:0100; path locator input tests.; 1028:0222:string[10]; complete verified referring-function closure Exact module-name far argument used while locating CTL3D relative to the executable. +1028:022c 1028:0244 25 initialized verified semantic-object tdkpin_application_title tdkpin_application_title char[25] 54444b2050696e62616c6c204d616368696e6520312e303000 Binary bytes; verified MainWindow constructor and second-instance MessageBox frames.; 1028:022c:string[25]; complete verified referring-function closure Exact application/window title and refusal-dialog caption. +1028:0245 1028:0252 14 initialized verified semantic-object tdkpin_already_running_text tdkpin_already_running_text char[27] 44657220466c6970706572206ce4 Binary bytes; verified second-instance MessageBox frame 1000:0144-015f.; complete verified referring-function closure Exact German already-running refusal text. +1028:0253 1028:025f 13 initialized verified semantic-object tdkpin_already_running_text tdkpin_already_running_text char[27] 75667420626572656974732100 Binary bytes; verified second-instance MessageBox frame 1000:0144-015f.; 1028:0253:string[13]; complete verified referring-function closure Exact German already-running refusal text. +1028:0260 1028:0269 10 initialized verified semantic-object setup_low_memory_text g_setup_low_memory_text const char[74] 4e696368742067656efc Binary bytes and sole verified MessageBox path in 1000:0270; reconstructed/tests/test_game_setup.c; complete verified referring-function closure Exact owner-zero low-memory text shown before window Close and RuntimeExit(0). +1028:026a 1028:02a9 64 initialized verified semantic-object setup_low_memory_text g_setup_low_memory_text const char[74] sha256:90ed45a0ccad3ef579c0532626a1a657f0cef8ec60814ea8a4400312e7f42762 Binary bytes and sole verified MessageBox path in 1000:0270; reconstructed/tests/test_game_setup.c; 1028:026a:string[64]; complete verified referring-function closure Exact owner-zero low-memory text shown before window Close and RuntimeExit(0). +1028:02aa 1028:02c2 25 initialized verified semantic-object setup_dialog_caption g_setup_dialog_caption const char[25] 54444b2050696e62616c6c204d616368696e6520312e303000 Binary bytes and both verified setup MessageBox paths; reconstructed/tests/test_game_setup.c; 1028:02aa:string[25]; complete verified referring-function closure Exact shared setup error caption. +1028:02c3 1028:02c6 4 initialized verified semantic-object setup_ini_suffix g_setup_ini_suffix const char[4] 494e4900 Binary bytes and verified parameter-string/extension replacement path in 1000:0270; complete verified referring-function closure Exact suffix appended after the executable-name dot. +1028:02c7 1028:02cf 9 initialized verified semantic-object setup_ini_section g_setup_ini_section const char[9] 53657474696e677300 Binary bytes and both verified GetPrivateProfileInt call sites; 1028:02c7:string[9]; complete verified referring-function closure Exact INI section shared by Language and Speed. +1028:02d0 1028:02d8 9 initialized verified semantic-object setup_ini_language_key g_setup_ini_language_key const char[9] 4c616e677561676500 Binary bytes and verified default/clamp path in 1000:0270; 1028:02d0:string[9]; complete verified referring-function closure Returns 1..5; out-of-range values become one. +1028:02d9 1028:02de 6 initialized verified semantic-object setup_ini_speed_key g_setup_ini_speed_key const char[6] 537065656400 Binary bytes and verified default/clamp/timer mapping in 1000:0270; 1028:02d9:string[6]; complete verified referring-function closure Returns 1..5; out-of-range values become three. +1028:02df 1028:02f3 21 initialized verified semantic-object setup_no_timer_text g_setup_no_timer_text const char[21] 4e6f2074696d657220617661696c61626c65210000 Binary bytes and sole verified timer-construction failure MessageBox path; 1028:02df:string[21]; complete verified referring-function closure Exact HWND-owned error followed directly by RuntimeExit(0), without window Close. +1028:02f4 1028:02ff 12 initialized verified semantic-object highscore_heading g_highscore_heading const char[12] 484947482053434f52455300 Binary bytes; heading TextOut in verified 1000:5c13; reconstructed/tests/test_highscores.c; 1028:02f4:string[12]; complete verified referring-function closure The terminal NUL at 02ff is also deliberately addressed as the empty rank-10 prefix. +1028:0300 1028:0305 6 initialized verified semantic-object highscore_rank_affixes g_highscore_rank_affixes const char[2][3] 2020002e2000 Binary bytes; rank construction in verified 1000:5c13; reconstructed/tests/test_highscores.c; complete verified referring-function closure Two leading spaces align ranks 1..9 with rank 10; dot-space follows every formatted rank. +1028:0306 1028:0310 11 initialized verified semantic-object help_window_title g_help_window_title const char[11] 48656c7053637265656e00 Binary bytes and sole verified full-child constructor use in 1000:6bf8; reconstructed/tests/test_key_input.c; 1028:0306:string[11]; complete verified referring-function closure Exact title of the F1-created help window. +1028:0311 1028:0311 1 initialized verified semantic-object alignment_0311 g_alignment_0311 const uint8_t 00 Exact binary byte; zero readers, writers, and relocations; complete verified referring-function closure Explicit one-byte string-table alignment/reserve. +1028:0312 1028:031f 14 initialized verified semantic-object highscore_save_file_name g_highscore_save_file_name const char[14] 486953636f7265732e4461740000 Binary bytes; sole _lcreat argument at 1000:a8ee-a8f5; reconstructed/tests/test_highscores.c; 1028:0312:string[14]; complete verified referring-function closure First NUL terminates the KERNEL filename; the adjacent second NUL is retained in the exact object extent. +1028:0320 1028:032c 13 initialized verified semantic-object highscore_load_file_name g_highscore_load_file_name const char[13] 486953636f7265732e44617400 Binary bytes; both _lopen mode call sites at 1000:a9a4-a9c0; reconstructed/tests/test_highscores.c; 1028:0320:string[13]; complete verified referring-function closure Exact shared filename for the mode-0 and mode-0x40 open attempts. +1028:032d 1028:0334 8 initialized verified semantic-object highscore_default_name g_highscore_default_name const char[8] 4e6f204e616d6500 Binary bytes; ten exact far-strcpy destinations in default path 1000:aaa2-ab33; reconstructed/tests/test_highscores.c; 1028:032d:string[8]; complete verified referring-function closure Exact fallback name copied independently into every 22-byte name slot. +1028:0335 1028:0335 1 initialized verified semantic-object alignment_0335 g_alignment_0335 const uint8_t 00 Exact binary byte; zero readers, writers, and relocations; complete verified referring-function closure Explicit one-byte string-table alignment/reserve. +1028:0336 1028:0348 19 initialized verified semantic-object highscore_edit_initial_name g_highscore_edit_initial_name const char[19] 54444b2050696e62616c6c20506c6179657200 Binary bytes; sole selected-slot far-strcpy in verified 1000:ab3c; reconstructed/tests/test_highscores.c; 1028:0336:string[19]; complete verified referring-function closure Exact initial editable name installed before the modal text dialog. +1028:0349 1028:0372 42 initialized verified semantic-object highscore_edit_caption g_highscore_edit_caption const char[42] sha256:b131fc861c12f1722cabb5f75f7577e141429308d525becdca58894cc3032910 Binary bytes; sole text-dialog caption argument in verified 1000:ab3c; reconstructed/tests/test_highscores.c; 1028:0349:string[42]; complete verified referring-function closure "Exact caption ""Congratulations! This is a Top Ten Score!""." +1028:0373 1028:038a 24 initialized verified semantic-object highscore_edit_label g_highscore_edit_label const char[24] 506c6561736520696e70757420796f7572206e616d653a00 Binary bytes; sole text-dialog label argument in verified 1000:ab3c; reconstructed/tests/test_highscores.c; 1028:0373:string[24]; complete verified referring-function closure "Exact prompt ""Please input your name:""." +1028:038b 1028:0394 10 initialized verified semantic-object highscore_window_title g_highscore_window_title const char[10] 4869676853636f726500 Binary bytes; sole centered-child title argument in verified 1000:ab3c; reconstructed/tests/test_highscores.c; 1028:038b:string[10]; complete verified referring-function closure Exact title of the modeless high-score list window. +1028:0395 1028:0395 1 initialized verified semantic-object alignment_0395 g_alignment_0395 const uint8_t 00 Exact binary byte; zero readers, writers, and relocations; complete verified referring-function closure Explicit one-byte string-table alignment/reserve. +1028:0396 1028:03c7 50 initialized verified semantic-object tdkpin_version_error_text tdkpin_version_error_text const char[50] sha256:eae2a07ecccd3c0db5129cfcad88a3bf697fdbd52e2bf6c11101d5c0f1012366 Binary bytes and verified indirect MessageBox path in ne_program_entry.; 1028:0396:string[50]; complete verified referring-function closure Exact text states that Windows 3.10 or higher is required. +1028:03c8 1028:03e0 25 initialized verified semantic-object tdkpin_version_dialog_title tdkpin_version_dialog_title const char[25] 54444b2050696e62616c6c204d616368696e6520312e303000 Binary bytes and verified minimum-version MessageBox arguments.; 1028:03c8:string[25]; complete verified referring-function closure "Exact caption ""TDK Pinball Machine 1.00""." +1028:03e1 1028:03e9 9 initialized verified semantic-object tdkpin_application_object_name tdkpin_application_object_name const char[9] 4c626d706170700000 Binary bytes and verified object_windows_application_construct name argument.; complete verified referring-function closure Exact ObjectWindows application object name extent. +1028:03ea 1028:03eb 2 initialized verified semantic-object sound_resource_byte_counts g_sound_resource_byte_counts uint32_t[22] 9e18 FUN_1008_0f2e Binary bytes 1028:03ea-0441; WAV payload lengths in assets/decoded/audio; indexed reads at 1008:1038-1048 and 113f-114d; reconstructed/tdkpin_data.c; reconstructed/tests/test_sound.c; 1028:03ea:undefined2[2]; complete verified referring-function closure Exact 22-entry table and one-based address arithmetic are represented; play sound number zero deliberately reaches the preceding dword exactly as the binary does. +1028:03ec 1028:03ed 2 initialized verified semantic-object sound_resource_byte_counts g_sound_resource_byte_counts uint32_t[22] 0000 FUN_1008_0f2e Binary bytes 1028:03ea-0441; WAV payload lengths in assets/decoded/audio; indexed reads at 1008:1038-1048 and 113f-114d; reconstructed/tdkpin_data.c; reconstructed/tests/test_sound.c; 1028:03ec:undefined2[2]; complete verified referring-function closure Exact 22-entry table and one-based address arithmetic are represented; play sound number zero deliberately reaches the preceding dword exactly as the binary does. +1028:03ee 1028:03ef 2 initialized verified semantic-object sound_resource_byte_counts g_sound_resource_byte_counts uint32_t[22] f211 FUN_1008_0f2e Binary bytes 1028:03ea-0441; WAV payload lengths in assets/decoded/audio; indexed reads at 1008:1038-1048 and 113f-114d; reconstructed/tdkpin_data.c; reconstructed/tests/test_sound.c; 1028:03ee:undefined2[2]; complete verified referring-function closure Exact 22-entry table and one-based address arithmetic are represented; play sound number zero deliberately reaches the preceding dword exactly as the binary does. +1028:03f0 1028:03f1 2 initialized verified semantic-object sound_resource_byte_counts g_sound_resource_byte_counts uint32_t[22] 0000 FUN_1008_0f2e Binary bytes 1028:03ea-0441; WAV payload lengths in assets/decoded/audio; indexed reads at 1008:1038-1048 and 113f-114d; reconstructed/tdkpin_data.c; reconstructed/tests/test_sound.c; 1028:03f0:undefined2[2]; complete verified referring-function closure Exact 22-entry table and one-based address arithmetic are represented; play sound number zero deliberately reaches the preceding dword exactly as the binary does. +1028:03f2 1028:0441 80 initialized verified semantic-object sound_resource_byte_counts g_sound_resource_byte_counts uint32_t[22] sha256:b5784b70fb60c813643ef9442a311e606ddb5b2bd8dfbea88dde52a8d7007afb Binary bytes 1028:03ea-0441; WAV payload lengths in assets/decoded/audio; indexed reads at 1008:1038-1048 and 113f-114d; reconstructed/tdkpin_data.c; reconstructed/tests/test_sound.c; complete verified referring-function closure Exact 22-entry table and one-based address arithmetic are represented; play sound number zero deliberately reaches the preceding dword exactly as the binary does. +1028:0442 1028:0445 4 initialized verified semantic-object sound_ini_suffix sound_ini_suffix char[4] 494e4900 Binary bytes; far strcat at 1008:1080-1090; reconstructed/tests/test_sound.c; complete verified referring-function closure Replaces the executable extension after the first dot found by the Borland ShortString Position call. +1028:0446 1028:044e 9 initialized verified semantic-object sound_ini_section sound_ini_section char[9] 53657474696e677300 Binary bytes; GetPrivateProfileInt16 call 1008:1095-10ac; reconstructed/tests/test_sound.c; 1028:0446:string[9]; complete verified referring-function closure Exact INI section far pointer. +1028:044f 1028:0454 6 initialized verified semantic-object sound_ini_key sound_ini_key char[6] 536f756e6400 Binary bytes; GetPrivateProfileInt16 call 1008:1095-10ac; reconstructed/tests/test_sound.c; 1028:044f:string[6]; complete verified referring-function closure Exact sound-enable INI key with default value one. +1028:0455 1028:0458 4 initialized verified semantic-object wave_resource_type wave_resource_type char[4] 57415600 Binary bytes; FindResource16 type argument at 1008:105c-1066; reconstructed/tests/test_sound.c; complete verified referring-function closure Exact custom NE resource type used for resource numbers 2001..2022. +1028:0459 1028:0459 1 initialized verified semantic-object alignment_0459 g_alignment_0459 const uint8_t 00 Exact binary byte; zero readers, writers, and relocations; complete verified referring-function closure Explicit one-byte resource-string separator. +1028:045a 1028:045d 4 initialized verified semantic-object palette_resource_type palette_resource_type char[4] 70616c00 Binary bytes; verified FindResource16 type argument 1008:1337-1340; reconstructed/tests/test_palette.c; complete verified referring-function closure Exact lowercase custom NE resource type used to load palette resource 999. +1028:045e 1028:0461 4 initialized verified semantic-object bitmap_resource_type bitmap_resource_type char[4] 44415400 Binary bytes; verified FindResource16 type argument 1008:14ae-14b7; reconstructed/tests/test_bitmap_loader.c; complete verified referring-function closure Exact uppercase custom NE resource type for bitmap/DIB resources. +1028:0462 1028:0469 8 initialized verified semantic-object display_dc_driver display_dc_driver char[8] 446973706c617900 Binary bytes; sole CreateDC16 driver argument 1008:1537-154c; reconstructed/tests/test_bitmap_loader.c; 1028:0462:string[8]; complete verified referring-function closure Exact display-driver name; device, output, and initialization-data pointers are all null. +1028:046a 1028:046f 6 initialized verified semantic-object multimedia_path_environment_name multimedia_path_environment_name const char[6] 504154480000 Binary bytes and verified environment lookup in multimedia_locate_library.; complete verified referring-function closure Exact DOS environment variable name used for final CTL3D search-list fallback. +1028:0470 1028:0481 18 initialized verified semantic-object ctl3d_procedure_name_table g_ctl3d_procedure_name_table const uint8_t[178] 43544c33444155544f535542434c41535300 Binary string units; verified 1010:01c2 loader resolves slots zero through ten and tests assert every name; 1028:0470:string[18]; complete verified referring-function closure Exact symbol table from CTL3DAUTOSUBCLASS through CTL3DUNREGISTER; variable-length packed strings total 178 bytes. +1028:0482 1028:0492 17 initialized verified semantic-object ctl3d_procedure_name_table g_ctl3d_procedure_name_table const uint8_t[178] 43544c3344434f4c4f524348414e474500 Binary string units; verified 1010:01c2 loader resolves slots zero through ten and tests assert every name; 1028:0482:string[17]; complete verified referring-function closure Exact symbol table from CTL3DAUTOSUBCLASS through CTL3DUNREGISTER; variable-length packed strings total 178 bytes. +1028:0493 1028:04a2 16 initialized verified semantic-object ctl3d_procedure_name_table g_ctl3d_procedure_name_table const uint8_t[178] 43544c334443544c434f4c4f52455800 Binary string units; verified 1010:01c2 loader resolves slots zero through ten and tests assert every name; 1028:0493:string[16]; complete verified referring-function closure Exact symbol table from CTL3DAUTOSUBCLASS through CTL3DUNREGISTER; variable-length packed strings total 178 bytes. +1028:04a3 1028:04af 13 initialized verified semantic-object ctl3d_procedure_name_table g_ctl3d_procedure_name_table const uint8_t[178] 43544c3344454e41424c454400 Binary string units; verified 1010:01c2 loader resolves slots zero through ten and tests assert every name; 1028:04a3:string[13]; complete verified referring-function closure Exact symbol table from CTL3DAUTOSUBCLASS through CTL3DUNREGISTER; variable-length packed strings total 178 bytes. +1028:04b0 1028:04c2 19 initialized verified semantic-object ctl3d_procedure_name_table g_ctl3d_procedure_name_table const uint8_t[178] 43544c3344444c474652414d455041494e5400 Binary string units; verified 1010:01c2 loader resolves slots zero through ten and tests assert every name; 1028:04b0:string[19]; complete verified referring-function closure Exact symbol table from CTL3DAUTOSUBCLASS through CTL3DUNREGISTER; variable-length packed strings total 178 bytes. +1028:04c3 1028:04ce 12 initialized verified semantic-object ctl3d_procedure_name_table g_ctl3d_procedure_name_table const uint8_t[178] 43544c334447455456455200 Binary string units; verified 1010:01c2 loader resolves slots zero through ten and tests assert every name; 1028:04c3:string[12]; complete verified referring-function closure Exact symbol table from CTL3DAUTOSUBCLASS through CTL3DUNREGISTER; variable-length packed strings total 178 bytes. +1028:04cf 1028:04dc 14 initialized verified semantic-object ctl3d_procedure_name_table g_ctl3d_procedure_name_table const uint8_t[178] 43544c3344524547495354455200 Binary string units; verified 1010:01c2 loader resolves slots zero through ten and tests assert every name; 1028:04cf:string[14]; complete verified referring-function closure Exact symbol table from CTL3DAUTOSUBCLASS through CTL3DUNREGISTER; variable-length packed strings total 178 bytes. +1028:04dd 1028:04ed 17 initialized verified semantic-object ctl3d_procedure_name_table g_ctl3d_procedure_name_table const uint8_t[178] 43544c3344535542434c415353444c4700 Binary string units; verified 1010:01c2 loader resolves slots zero through ten and tests assert every name; 1028:04dd:string[17]; complete verified referring-function closure Exact symbol table from CTL3DAUTOSUBCLASS through CTL3DUNREGISTER; variable-length packed strings total 178 bytes. +1028:04ee 1028:0500 19 initialized verified semantic-object ctl3d_procedure_name_table g_ctl3d_procedure_name_table const uint8_t[178] 43544c3344535542434c415353444c47455800 Binary string units; verified 1010:01c2 loader resolves slots zero through ten and tests assert every name; 1028:04ee:string[19]; complete verified referring-function closure Exact symbol table from CTL3DAUTOSUBCLASS through CTL3DUNREGISTER; variable-length packed strings total 178 bytes. +1028:0501 1028:0511 17 initialized verified semantic-object ctl3d_procedure_name_table g_ctl3d_procedure_name_table const uint8_t[178] 43544c3344535542434c41535343544c00 Binary string units; verified 1010:01c2 loader resolves slots zero through ten and tests assert every name; 1028:0501:string[17]; complete verified referring-function closure Exact symbol table from CTL3DAUTOSUBCLASS through CTL3DUNREGISTER; variable-length packed strings total 178 bytes. +1028:0512 1028:0521 16 initialized verified semantic-object ctl3d_procedure_name_table g_ctl3d_procedure_name_table const uint8_t[178] 43544c3344554e524547495354455200 Binary string units; verified 1010:01c2 loader resolves slots zero through ten and tests assert every name; 1028:0512:string[16]; complete verified referring-function closure Exact symbol table from CTL3DAUTOSUBCLASS through CTL3DUNREGISTER; variable-length packed strings total 178 bytes. +1028:0522 1028:0537 22 initialized verified semantic-object ctl3d_library_names g_ctl3d_library_names const char[2][11] 43544c33442e444c4c0043544c334456322e444c4c00 Binary bytes and verified modern/legacy CTL3D search/load paths; complete verified referring-function closure Exact primary and fallback helper DLL names, including both terminators. +1028:0538 1028:0539 2 initialized verified semantic-object tpwincrt_initial_placement g_tpwincrt_initial_placement INT16[4] 0080 FUN_1008_2442 Verified CreateWindow16 x/y/width/height arguments and lifecycle tests.; 1028:0538:undefined2[2]; complete verified referring-function closure Exact CW_USEDEFAULT placement tuple. +1028:053a 1028:053b 2 initialized verified semantic-object tpwincrt_initial_placement g_tpwincrt_initial_placement INT16[4] 0080 FUN_1008_2442 Verified CreateWindow16 x/y/width/height arguments and lifecycle tests.; 1028:053a:undefined2[2]; complete verified referring-function closure Exact CW_USEDEFAULT placement tuple. +1028:053c 1028:053d 2 initialized verified semantic-object tpwincrt_initial_placement g_tpwincrt_initial_placement INT16[4] 0080 FUN_1008_2442 Verified CreateWindow16 x/y/width/height arguments and lifecycle tests.; 1028:053c:undefined2[2]; complete verified referring-function closure Exact CW_USEDEFAULT placement tuple. +1028:053e 1028:053f 2 initialized verified semantic-object tpwincrt_initial_placement g_tpwincrt_initial_placement INT16[4] 0080 FUN_1008_2442 Verified CreateWindow16 x/y/width/height arguments and lifecycle tests.; 1028:053e:undefined2[2]; complete verified referring-function closure Exact CW_USEDEFAULT placement tuple. +1028:0540 1028:0541 2 initialized verified semantic-object tpwincrt_text_geometry g_tpwincrt_text_geometry struct TpWinCrtTextGeometry 5000 FUN_1008_19f8,FUN_1008_1a82,FUN_1008_1b11,FUN_1008_1d77,FUN_1008_1dcc,FUN_1008_1f68,FUN_1008_1fe8,FUN_1008_21e2 All readers/writers verified, including text output, line advance, create/destroy, paint, resize, caret, and circular addressing tests.; 1028:0540:undefined2[2]; complete verified referring-function closure Six exact uint16 values: columns, rows, cursor column/row, and viewport column/row. +1028:0542 1028:0543 2 initialized verified semantic-object tpwincrt_text_geometry g_tpwincrt_text_geometry struct TpWinCrtTextGeometry 1900 FUN_1008_19f8,FUN_1008_1a82,FUN_1008_1d77,FUN_1008_1dcc,FUN_1008_1f68,FUN_1008_1fe8,FUN_1008_21e2 All readers/writers verified, including text output, line advance, create/destroy, paint, resize, caret, and circular addressing tests.; 1028:0542:undefined2[2]; complete verified referring-function closure Six exact uint16 values: columns, rows, cursor column/row, and viewport column/row. +1028:0544 1028:0545 2 initialized verified semantic-object tpwincrt_text_geometry g_tpwincrt_text_geometry struct TpWinCrtTextGeometry 0000 FUN_1008_1818,FUN_1008_19b7,FUN_1008_1b11 FUN_1008_1a82,FUN_1008_1b11,FUN_1008_21e2 All readers/writers verified, including text output, line advance, create/destroy, paint, resize, caret, and circular addressing tests.; 1028:0544:undefined2[2]; complete verified referring-function closure Six exact uint16 values: columns, rows, cursor column/row, and viewport column/row. +1028:0546 1028:0547 2 initialized verified semantic-object tpwincrt_text_geometry g_tpwincrt_text_geometry struct TpWinCrtTextGeometry 0000 FUN_1008_1818,FUN_1008_19b7,FUN_1008_1a39,FUN_1008_1a82,FUN_1008_1b11 FUN_1008_1a82,FUN_1008_21e2 All readers/writers verified, including text output, line advance, create/destroy, paint, resize, caret, and circular addressing tests.; 1028:0546:undefined2[2]; complete verified referring-function closure Six exact uint16 values: columns, rows, cursor column/row, and viewport column/row. +1028:0548 1028:0549 2 initialized verified semantic-object tpwincrt_text_geometry g_tpwincrt_text_geometry struct TpWinCrtTextGeometry 0000 FUN_1008_1818,FUN_1008_1865,FUN_1008_18ee,FUN_1008_19b7,FUN_1008_1a39,FUN_1008_1dcc,FUN_1008_1f0c,FUN_1008_1f68 FUN_1008_18ee,FUN_1008_1f68,FUN_1008_21e2 All readers/writers verified, including text output, line advance, create/destroy, paint, resize, caret, and circular addressing tests.; 1028:0548:undefined2[2]; complete verified referring-function closure Six exact uint16 values: columns, rows, cursor column/row, and viewport column/row. +1028:054a 1028:054b 2 initialized verified semantic-object tpwincrt_text_geometry g_tpwincrt_text_geometry struct TpWinCrtTextGeometry 0000 FUN_1008_1818,FUN_1008_1865,FUN_1008_18ee,FUN_1008_19b7,FUN_1008_1a39,FUN_1008_1dcc,FUN_1008_1f0c,FUN_1008_1f68 FUN_1008_18ee,FUN_1008_1f68,FUN_1008_21e2 All readers/writers verified, including text output, line advance, create/destroy, paint, resize, caret, and circular addressing tests.; 1028:054a:undefined2[2]; complete verified referring-function closure Six exact uint16 values: columns, rows, cursor column/row, and viewport column/row. +1028:054c 1028:054d 2 initialized verified semantic-object tpwincrt_inactive_format_pointer g_tpwincrt_inactive_format_pointer Win16FarPtr ffff FUN_1008_24a5 1028:054c->segment:6:offset:0550 DGROUP relocation and verified 1008:24a5 wvsprintf call.; 1028:054c:undefined2[2]; complete verified referring-function closure Exact far pointer to the inactive-caption format. +1028:054e 1028:054f 2 initialized verified semantic-object tpwincrt_inactive_format_pointer g_tpwincrt_inactive_format_pointer Win16FarPtr 0000 FUN_1008_24a5 DGROUP relocation and verified 1008:24a5 wvsprintf call.; 1028:054e:undefined2[2]; complete verified referring-function closure Exact far pointer to the inactive-caption format. +1028:0550 1028:055d 14 initialized verified semantic-object tpwincrt_inactive_format g_tpwincrt_inactive_format const char[14] 28496e6163746976652025732900 Binary bytes and verified ExitProc formatting tests.; 1028:0550:string[14]; complete verified referring-function closure Exact clean-shutdown caption template. +1028:055e 1028:055e 1 initialized verified semantic-object tpwincrt_auto_scroll g_tpwincrt_auto_scroll uint8_t 01 FUN_1008_1b11 Verified final branch in 1008:1b11 and text-output tests.; 1028:055e:undefined1[1]; complete verified referring-function closure Keeps the output cursor visible after each bulk write. +1028:055f 1028:055f 1 initialized verified semantic-object tpwincrt_ctrl_z_is_eof g_tpwincrt_ctrl_z_is_eof uint8_t 00 FUN_1008_1cc6 Verified Ctrl-Z line-termination branch and focused tests.; 1028:055f:undefined1[1]; complete verified referring-function closure Optional DOS EOF semantics for TPWinCrt line input. +1028:0560 1028:0560 1 initialized verified semantic-object tpwincrt_break_check_enabled g_tpwincrt_break_check_enabled uint8_t 01 FUN_1008_1d77,FUN_1008_211a,FUN_1008_2147 FUN_1008_24a5 All Ctrl-C/create readers and the ExitProc writer are verified.; 1028:0560:undefined1[1]; complete verified referring-function closure Exact active-runtime break-check lifecycle. +1028:0561 1028:0561 1 initialized verified semantic-object alignment_0561 g_alignment_0561 const uint8_t 00 Exact binary byte; zero readers, writers, and relocations; complete verified referring-function closure Explicit one-byte WNDCLASS alignment. +1028:0562 1028:0563 2 initialized verified semantic-object wndclass_tpwincrt tpwincrt_window_class WNDCLASS16 0300 Wine 11.15 WNDCLASS16 layout; DGROUP relocation 0564 -> entry ordinal 119; relocation 0578 -> 1028:057c; assembly 1008:255e-2593.; complete verified referring-function closure style=CS_VREDRAW|CS_HREDRAW; wndproc=1008:2219; no class/window extra bytes; application icon and arrow cursor; background brush COLOR_WINDOW+1; no menu; class name TPWinCrt. +1028:0564 1028:0567 4 initialized verified semantic-object wndclass_tpwincrt tpwincrt_window_class WNDCLASS16 ffff0000 1028:0564->entry-ordinal:119 Wine 11.15 WNDCLASS16 layout; DGROUP relocation 0564 -> entry ordinal 119; relocation 0578 -> 1028:057c; assembly 1008:255e-2593.; complete verified referring-function closure style=CS_VREDRAW|CS_HREDRAW; wndproc=1008:2219; no class/window extra bytes; application icon and arrow cursor; background brush COLOR_WINDOW+1; no menu; class name TPWinCrt. +1028:0568 1028:056b 4 initialized verified semantic-object wndclass_tpwincrt tpwincrt_window_class WNDCLASS16 00000000 Wine 11.15 WNDCLASS16 layout; DGROUP relocation 0564 -> entry ordinal 119; relocation 0578 -> 1028:057c; assembly 1008:255e-2593.; complete verified referring-function closure style=CS_VREDRAW|CS_HREDRAW; wndproc=1008:2219; no class/window extra bytes; application icon and arrow cursor; background brush COLOR_WINDOW+1; no menu; class name TPWinCrt. +1028:056c 1028:056d 2 initialized verified semantic-object wndclass_tpwincrt tpwincrt_window_class WNDCLASS16 0000 FUN_1008_2554 Wine 11.15 WNDCLASS16 layout; DGROUP relocation 0564 -> entry ordinal 119; relocation 0578 -> 1028:057c; assembly 1008:255e-2593.; 1028:056c:undefined2[2]; complete verified referring-function closure style=CS_VREDRAW|CS_HREDRAW; wndproc=1008:2219; no class/window extra bytes; application icon and arrow cursor; background brush COLOR_WINDOW+1; no menu; class name TPWinCrt. +1028:056e 1028:056f 2 initialized verified semantic-object wndclass_tpwincrt tpwincrt_window_class WNDCLASS16 0000 FUN_1008_2554 Wine 11.15 WNDCLASS16 layout; DGROUP relocation 0564 -> entry ordinal 119; relocation 0578 -> 1028:057c; assembly 1008:255e-2593.; 1028:056e:undefined2[2]; complete verified referring-function closure style=CS_VREDRAW|CS_HREDRAW; wndproc=1008:2219; no class/window extra bytes; application icon and arrow cursor; background brush COLOR_WINDOW+1; no menu; class name TPWinCrt. +1028:0570 1028:0571 2 initialized verified semantic-object wndclass_tpwincrt tpwincrt_window_class WNDCLASS16 0000 FUN_1008_2554 Wine 11.15 WNDCLASS16 layout; DGROUP relocation 0564 -> entry ordinal 119; relocation 0578 -> 1028:057c; assembly 1008:255e-2593.; 1028:0570:undefined2[2]; complete verified referring-function closure style=CS_VREDRAW|CS_HREDRAW; wndproc=1008:2219; no class/window extra bytes; application icon and arrow cursor; background brush COLOR_WINDOW+1; no menu; class name TPWinCrt. +1028:0572 1028:0573 2 initialized verified semantic-object wndclass_tpwincrt tpwincrt_window_class WNDCLASS16 0000 FUN_1008_2554 Wine 11.15 WNDCLASS16 layout; DGROUP relocation 0564 -> entry ordinal 119; relocation 0578 -> 1028:057c; assembly 1008:255e-2593.; 1028:0572:undefined2[2]; complete verified referring-function closure style=CS_VREDRAW|CS_HREDRAW; wndproc=1008:2219; no class/window extra bytes; application icon and arrow cursor; background brush COLOR_WINDOW+1; no menu; class name TPWinCrt. +1028:0574 1028:0577 4 initialized verified semantic-object wndclass_tpwincrt tpwincrt_window_class WNDCLASS16 00000000 Wine 11.15 WNDCLASS16 layout; DGROUP relocation 0564 -> entry ordinal 119; relocation 0578 -> 1028:057c; assembly 1008:255e-2593.; complete verified referring-function closure style=CS_VREDRAW|CS_HREDRAW; wndproc=1008:2219; no class/window extra bytes; application icon and arrow cursor; background brush COLOR_WINDOW+1; no menu; class name TPWinCrt. +1028:0578 1028:0579 2 initialized verified semantic-object wndclass_tpwincrt tpwincrt_window_class WNDCLASS16 ffff FUN_1008_2442 1028:0578->segment:6:offset:057c Wine 11.15 WNDCLASS16 layout; DGROUP relocation 0564 -> entry ordinal 119; relocation 0578 -> 1028:057c; assembly 1008:255e-2593.; 1028:0578:undefined2[2]; complete verified referring-function closure style=CS_VREDRAW|CS_HREDRAW; wndproc=1008:2219; no class/window extra bytes; application icon and arrow cursor; background brush COLOR_WINDOW+1; no menu; class name TPWinCrt. +1028:057a 1028:057b 2 initialized verified semantic-object wndclass_tpwincrt tpwincrt_window_class WNDCLASS16 0000 FUN_1008_2442 Wine 11.15 WNDCLASS16 layout; DGROUP relocation 0564 -> entry ordinal 119; relocation 0578 -> 1028:057c; assembly 1008:255e-2593.; 1028:057a:undefined2[2]; complete verified referring-function closure style=CS_VREDRAW|CS_HREDRAW; wndproc=1008:2219; no class/window extra bytes; application icon and arrow cursor; background brush COLOR_WINDOW+1; no menu; class name TPWinCrt. +1028:057c 1028:0584 9 initialized verified semantic-object tpwincrt_class_name tpwincrt_class_name char[9] 545057696e43727400 Relocation 1028:0578 -> 1028:057c; RegisterClass16 path 1008:2554.; 1028:057c:string[9]; complete verified referring-function closure NUL-terminated TPWinCrt class name used by the verified WNDCLASS16 object. +1028:0585 1028:0585 1 initialized verified semantic-object alignment_0585 g_alignment_0585 const uint8_t 00 Exact binary byte; zero readers, writers, and relocations; complete verified referring-function closure Explicit one-byte runtime-state alignment. +1028:0586 1028:0587 2 initialized verified semantic-object tpwincrt_window_handle g_tpwincrt_window HWND16 0000 FUN_1008_1779,FUN_1008_17e2,FUN_1008_1818,FUN_1008_1865,FUN_1008_18ee,FUN_1008_1a82,FUN_1008_1d77,FUN_1008_2442,FUN_1008_24a5 FUN_1008_2442 Store at 1008:2230-2233 and all TPWinCrt USER call sites.; 1028:0586:undefined2[2]; complete verified referring-function closure Process-wide TPWinCrt HWND used by painting, caret, scrolling, focus, and teardown paths. +1028:0588 1028:0589 2 initialized verified semantic-object tpwincrt_ring_row_origin g_tpwincrt_ring_row_origin uint16_t 0000 FUN_1008_19f8,FUN_1008_1a82 FUN_1008_1a82 Verified circular addressing and scrolling tests.; 1028:0588:undefined2[2]; complete verified referring-function closure Exact circular physical-row origin. +1028:058a 1028:058b 2 initialized verified semantic-object tpwincrt_input_count g_tpwincrt_input_count uint16_t 0000 FUN_1008_1c03,FUN_1008_1c5f,FUN_1008_211a FUN_1008_1c5f,FUN_1008_211a Verified enqueue, poll, wait, dequeue, shift, and overflow paths.; 1028:058a:undefined2[2]; complete verified referring-function closure Exact signed-compared count for the 64-byte queue. +1028:058c 1028:058c 1 initialized verified semantic-object tpwincrt_window_created g_tpwincrt_window_created uint8_t 00 FUN_1008_18ee,FUN_1008_2442,FUN_1008_24a5 FUN_1008_1d77,FUN_1008_21e2 Verified create/destroy and all lazy-window/scroll/shutdown gates.; 1028:058c:undefined1[1]; complete verified referring-function closure Exact process-wide live-window Boolean. +1028:058d 1028:058d 1 initialized verified semantic-object tpwincrt_has_focus g_tpwincrt_has_focus uint8_t 00 FUN_1008_18d0,FUN_1008_1c5f,FUN_1008_1f68 FUN_1008_21ba,FUN_1008_21ce Reads in verified caret and size paths; exact focus handlers at 1008:21ba and 21ce.; 1028:058d:undefined1[1]; complete verified referring-function closure Boolean focus state with proven caret ordering. +1028:058e 1028:058e 1 initialized verified semantic-object tpwincrt_caret_enabled g_tpwincrt_caret_enabled uint8_t 00 FUN_1008_18d0,FUN_1008_1f68,FUN_1008_21ba,FUN_1008_21ce FUN_1008_1c5f Verified read/wait/focus/resize caret lifecycle.; 1028:058e:undefined1[1]; complete verified referring-function closure Exact Boolean controlling focus-owned caret lifetime. +1028:058f 1028:058f 1 initialized verified semantic-object tpwincrt_paint_message_active g_tpwincrt_paint_message_active uint8_t 00 FUN_1008_1779,FUN_1008_17e2 FUN_1008_1dcc Branch in verified 1008:1779/17e2; stores in 1008:1dcc.; 1028:058f:undefined1[1]; complete verified referring-function closure Selects matched BeginPaint16/EndPaint16 instead of GetDC16/ReleaseDC16. +1028:0590 1028:0590 1 initialized verified semantic-object tpwincrt_key_bindings g_tpwincrt_key_bindings TpWinCrtKeyBinding[12] 25 FUN_1008_2147 Binary bytes 1028:0590-05bf; indexed loop disassembly 1008:2170-21b4.; 1028:0590:undefined1[1]; complete verified referring-function closure Ordered bindings for Left/Right/Home/End/Up/Down/PageUp/PageDown with exact Ctrl requirement, horizontal/vertical axis, and Win16 scroll command. +1028:0591 1028:0591 1 initialized verified semantic-object tpwincrt_key_bindings g_tpwincrt_key_bindings TpWinCrtKeyBinding[12] 00 FUN_1008_2147 Binary bytes 1028:0590-05bf; indexed loop disassembly 1008:2170-21b4.; 1028:0591:undefined1[1]; complete verified referring-function closure Ordered bindings for Left/Right/Home/End/Up/Down/PageUp/PageDown with exact Ctrl requirement, horizontal/vertical axis, and Win16 scroll command. +1028:0592 1028:0592 1 initialized verified semantic-object tpwincrt_key_bindings g_tpwincrt_key_bindings TpWinCrtKeyBinding[12] 00 FUN_1008_2147 Binary bytes 1028:0590-05bf; indexed loop disassembly 1008:2170-21b4.; 1028:0592:undefined1[1]; complete verified referring-function closure Ordered bindings for Left/Right/Home/End/Up/Down/PageUp/PageDown with exact Ctrl requirement, horizontal/vertical axis, and Win16 scroll command. +1028:0593 1028:0593 1 initialized verified semantic-object tpwincrt_key_bindings g_tpwincrt_key_bindings TpWinCrtKeyBinding[12] 00 FUN_1008_2147 Binary bytes 1028:0590-05bf; indexed loop disassembly 1008:2170-21b4.; 1028:0593:undefined1[1]; complete verified referring-function closure Ordered bindings for Left/Right/Home/End/Up/Down/PageUp/PageDown with exact Ctrl requirement, horizontal/vertical axis, and Win16 scroll command. +1028:0594 1028:0594 1 initialized verified semantic-object tpwincrt_key_bindings g_tpwincrt_key_bindings TpWinCrtKeyBinding[12] 27 FUN_1008_2147 Binary bytes 1028:0590-05bf; indexed loop disassembly 1008:2170-21b4.; 1028:0594:undefined1[1]; complete verified referring-function closure Ordered bindings for Left/Right/Home/End/Up/Down/PageUp/PageDown with exact Ctrl requirement, horizontal/vertical axis, and Win16 scroll command. +1028:0595 1028:0595 1 initialized verified semantic-object tpwincrt_key_bindings g_tpwincrt_key_bindings TpWinCrtKeyBinding[12] 00 FUN_1008_2147 Binary bytes 1028:0590-05bf; indexed loop disassembly 1008:2170-21b4.; 1028:0595:undefined1[1]; complete verified referring-function closure Ordered bindings for Left/Right/Home/End/Up/Down/PageUp/PageDown with exact Ctrl requirement, horizontal/vertical axis, and Win16 scroll command. +1028:0596 1028:0596 1 initialized verified semantic-object tpwincrt_key_bindings g_tpwincrt_key_bindings TpWinCrtKeyBinding[12] 00 FUN_1008_2147 Binary bytes 1028:0590-05bf; indexed loop disassembly 1008:2170-21b4.; 1028:0596:undefined1[1]; complete verified referring-function closure Ordered bindings for Left/Right/Home/End/Up/Down/PageUp/PageDown with exact Ctrl requirement, horizontal/vertical axis, and Win16 scroll command. +1028:0597 1028:0597 1 initialized verified semantic-object tpwincrt_key_bindings g_tpwincrt_key_bindings TpWinCrtKeyBinding[12] 01 FUN_1008_2147 Binary bytes 1028:0590-05bf; indexed loop disassembly 1008:2170-21b4.; 1028:0597:undefined1[1]; complete verified referring-function closure Ordered bindings for Left/Right/Home/End/Up/Down/PageUp/PageDown with exact Ctrl requirement, horizontal/vertical axis, and Win16 scroll command. +1028:0598 1028:05bf 40 initialized verified semantic-object tpwincrt_key_bindings g_tpwincrt_key_bindings TpWinCrtKeyBinding[12] sha256:f3584e4dd3bb3552288877db409691f2446987313453d7031e1740c1f7ee7237 Binary bytes 1028:0590-05bf; indexed loop disassembly 1008:2170-21b4.; complete verified referring-function closure Ordered bindings for Left/Right/Home/End/Up/Down/PageUp/PageDown with exact Ctrl requirement, horizontal/vertical axis, and Win16 scroll command. +1028:05c0 1028:05c7 8 initialized verified semantic-object system_timer_vmt g_system_timer_vmt const uint8_t[12] 0600faff00000000 Setup constructs VMT 05c0; relocation to entry ordinal 129; verified SystemTimer lifecycle/tests; complete verified referring-function closure Exact six-byte timer object size, negative size/header fields, and destructor virtual slot. +1028:05c8 1028:05cb 4 initialized verified semantic-object system_timer_vmt g_system_timer_vmt const uint8_t[12] ffff0000 1028:05c8->entry-ordinal:129 Setup constructs VMT 05c0; relocation to entry ordinal 129; verified SystemTimer lifecycle/tests; complete verified referring-function closure Exact six-byte timer object size, negative size/header fields, and destructor virtual slot. +1028:05cc 1028:05e5 26 initialized verified semantic-object object_windows_base_message_table g_object_windows_base_message_table ObjectWindowsMessageTable9 00000000000009001501140111011000020082000600110014ff Binary bytes; relocations 1028:05e6-0606; verified resolver and focused message/command/scroll tests.; complete verified referring-function closure Exact 62-byte mutable-cache table layout represented in C; all nine handler functions and every id-to-address mapping are now verified. +1028:05e6 1028:05e9 4 initialized verified semantic-object object_windows_base_message_table g_object_windows_base_message_table ObjectWindowsMessageTable9 ffff0000 1028:05e6->entry-ordinal:161 Binary bytes; relocations 1028:05e6-0606; verified resolver and focused message/command/scroll tests.; complete verified referring-function closure Exact 62-byte mutable-cache table layout represented in C; all nine handler functions and every id-to-address mapping are now verified. +1028:05ea 1028:05ed 4 initialized verified semantic-object object_windows_base_message_table g_object_windows_base_message_table ObjectWindowsMessageTable9 ffff0000 1028:05ea->entry-ordinal:162 Binary bytes; relocations 1028:05e6-0606; verified resolver and focused message/command/scroll tests.; complete verified referring-function closure Exact 62-byte mutable-cache table layout represented in C; all nine handler functions and every id-to-address mapping are now verified. +1028:05ee 1028:05f1 4 initialized verified semantic-object object_windows_base_message_table g_object_windows_base_message_table ObjectWindowsMessageTable9 ffff0000 1028:05ee->entry-ordinal:163 Binary bytes; relocations 1028:05e6-0606; verified resolver and focused message/command/scroll tests.; complete verified referring-function closure Exact 62-byte mutable-cache table layout represented in C; all nine handler functions and every id-to-address mapping are now verified. +1028:05f2 1028:05f5 4 initialized verified semantic-object object_windows_base_message_table g_object_windows_base_message_table ObjectWindowsMessageTable9 ffff0000 1028:05f2->entry-ordinal:164 Binary bytes; relocations 1028:05e6-0606; verified resolver and focused message/command/scroll tests.; complete verified referring-function closure Exact 62-byte mutable-cache table layout represented in C; all nine handler functions and every id-to-address mapping are now verified. +1028:05f6 1028:05f9 4 initialized verified semantic-object object_windows_base_message_table g_object_windows_base_message_table ObjectWindowsMessageTable9 ffff0000 1028:05f6->entry-ordinal:165 Binary bytes; relocations 1028:05e6-0606; verified resolver and focused message/command/scroll tests.; complete verified referring-function closure Exact 62-byte mutable-cache table layout represented in C; all nine handler functions and every id-to-address mapping are now verified. +1028:05fa 1028:05fd 4 initialized verified semantic-object object_windows_base_message_table g_object_windows_base_message_table ObjectWindowsMessageTable9 ffff0000 1028:05fa->entry-ordinal:166 Binary bytes; relocations 1028:05e6-0606; verified resolver and focused message/command/scroll tests.; complete verified referring-function closure Exact 62-byte mutable-cache table layout represented in C; all nine handler functions and every id-to-address mapping are now verified. +1028:05fe 1028:0601 4 initialized verified semantic-object object_windows_base_message_table g_object_windows_base_message_table ObjectWindowsMessageTable9 ffff0000 1028:05fe->entry-ordinal:167 Binary bytes; relocations 1028:05e6-0606; verified resolver and focused message/command/scroll tests.; complete verified referring-function closure Exact 62-byte mutable-cache table layout represented in C; all nine handler functions and every id-to-address mapping are now verified. +1028:0602 1028:0605 4 initialized verified semantic-object object_windows_base_message_table g_object_windows_base_message_table ObjectWindowsMessageTable9 ffff0000 1028:0602->entry-ordinal:168 Binary bytes; relocations 1028:05e6-0606; verified resolver and focused message/command/scroll tests.; complete verified referring-function closure Exact 62-byte mutable-cache table layout represented in C; all nine handler functions and every id-to-address mapping are now verified. +1028:0606 1028:0609 4 initialized verified semantic-object object_windows_base_message_table g_object_windows_base_message_table ObjectWindowsMessageTable9 ffff0000 1028:0606->entry-ordinal:169 Binary bytes; relocations 1028:05e6-0606; verified resolver and focused message/command/scroll tests.; complete verified referring-function closure Exact 62-byte mutable-cache table layout represented in C; all nine handler functions and every id-to-address mapping are now verified. +1028:060a 1028:0625 28 initialized verified semantic-object object_windows_application_dispatch g_object_windows_application_dispatch const uint8_t[68] cc05000000000a00060022020100140115010f000500030001021201 Exact bytes and relocations 0626..064a to entry ordinals 178,179,181..188; application dispatch/tests verified; complete verified referring-function closure Complete ObjectWindows application dynamic table retained with every target address-backed. +1028:0626 1028:0629 4 initialized verified semantic-object object_windows_application_dispatch g_object_windows_application_dispatch const uint8_t[68] ffff0000 1028:0626->entry-ordinal:178 Exact bytes and relocations 0626..064a to entry ordinals 178,179,181..188; application dispatch/tests verified; complete verified referring-function closure Complete ObjectWindows application dynamic table retained with every target address-backed. +1028:062a 1028:062d 4 initialized verified semantic-object object_windows_application_dispatch g_object_windows_application_dispatch const uint8_t[68] ffff0000 1028:062a->entry-ordinal:179 Exact bytes and relocations 0626..064a to entry ordinals 178,179,181..188; application dispatch/tests verified; complete verified referring-function closure Complete ObjectWindows application dynamic table retained with every target address-backed. +1028:062e 1028:0631 4 initialized verified semantic-object object_windows_application_dispatch g_object_windows_application_dispatch const uint8_t[68] ffff0000 1028:062e->entry-ordinal:181 Exact bytes and relocations 0626..064a to entry ordinals 178,179,181..188; application dispatch/tests verified; complete verified referring-function closure Complete ObjectWindows application dynamic table retained with every target address-backed. +1028:0632 1028:0635 4 initialized verified semantic-object object_windows_application_dispatch g_object_windows_application_dispatch const uint8_t[68] ffff0000 1028:0632->entry-ordinal:182 Exact bytes and relocations 0626..064a to entry ordinals 178,179,181..188; application dispatch/tests verified; complete verified referring-function closure Complete ObjectWindows application dynamic table retained with every target address-backed. +1028:0636 1028:0639 4 initialized verified semantic-object object_windows_application_dispatch g_object_windows_application_dispatch const uint8_t[68] ffff0000 1028:0636->entry-ordinal:183 Exact bytes and relocations 0626..064a to entry ordinals 178,179,181..188; application dispatch/tests verified; complete verified referring-function closure Complete ObjectWindows application dynamic table retained with every target address-backed. +1028:063a 1028:063d 4 initialized verified semantic-object object_windows_application_dispatch g_object_windows_application_dispatch const uint8_t[68] ffff0000 1028:063a->entry-ordinal:184 Exact bytes and relocations 0626..064a to entry ordinals 178,179,181..188; application dispatch/tests verified; complete verified referring-function closure Complete ObjectWindows application dynamic table retained with every target address-backed. +1028:063e 1028:0641 4 initialized verified semantic-object object_windows_application_dispatch g_object_windows_application_dispatch const uint8_t[68] ffff0000 1028:063e->entry-ordinal:185 Exact bytes and relocations 0626..064a to entry ordinals 178,179,181..188; application dispatch/tests verified; complete verified referring-function closure Complete ObjectWindows application dynamic table retained with every target address-backed. +1028:0642 1028:0645 4 initialized verified semantic-object object_windows_application_dispatch g_object_windows_application_dispatch const uint8_t[68] ffff0000 1028:0642->entry-ordinal:186 Exact bytes and relocations 0626..064a to entry ordinals 178,179,181..188; application dispatch/tests verified; complete verified referring-function closure Complete ObjectWindows application dynamic table retained with every target address-backed. +1028:0646 1028:0649 4 initialized verified semantic-object object_windows_application_dispatch g_object_windows_application_dispatch const uint8_t[68] ffff0000 1028:0646->entry-ordinal:187 Exact bytes and relocations 0626..064a to entry ordinals 178,179,181..188; application dispatch/tests verified; complete verified referring-function closure Complete ObjectWindows application dynamic table retained with every target address-backed. +1028:064a 1028:064d 4 initialized verified semantic-object object_windows_application_dispatch g_object_windows_application_dispatch const uint8_t[68] ffff0000 1028:064a->entry-ordinal:188 Exact bytes and relocations 0626..064a to entry ordinals 178,179,181..188; application dispatch/tests verified; complete verified referring-function closure Complete ObjectWindows application dynamic table retained with every target address-backed. +1028:064e 1028:064f 2 initialized verified semantic-object object_windows_application g_object_windows_application Win16FarPtr 0000 FUN_1000_6bf8,FUN_1000_ab3c,FUN_1008_2ae3,FUN_1008_2c1f,FUN_1018_0f38,FUN_1018_0f8d,FUN_1018_0ffd,FUN_1018_1054,FUN_1018_10aa FUN_1018_1a61 Write at 1018:1a93-1a99; reads in application/window routing across Code1, Code2, and Code4; constructor lifecycle tested.; complete verified referring-function closure; 1028:064e:undefined4[4] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0650 1028:0651 2 initialized verified semantic-object object_windows_application g_object_windows_application Win16FarPtr 0000 FUN_1018_1a61 Write at 1018:1a93-1a99; reads in application/window routing across Code1, Code2, and Code4; constructor lifecycle tested.; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0652 1028:0653 2 initialized verified semantic-object win16_create_dialog_param g_win16_create_dialog_param Win16FarPtr ffff FUN_1008_2a45 1028:0652->USER.ordinal:241 Verified sole modeless call, bound-thunk callback ledger, and dialog tests.; 1028:0652:undefined2[2]; complete verified referring-function closure Exact far import pointer for CreateDialogParam16. +1028:0654 1028:0655 2 initialized verified semantic-object win16_create_dialog_param g_win16_create_dialog_param Win16FarPtr 0000 FUN_1008_2a45 Verified sole modeless call, bound-thunk callback ledger, and dialog tests.; 1028:0654:undefined2[2]; complete verified referring-function closure Exact far import pointer for CreateDialogParam16. +1028:0656 1028:0657 2 initialized verified semantic-object win16_dialog_box_param g_win16_dialog_box_param Win16FarPtr ffff FUN_1008_2ae3 1028:0656->USER.ordinal:239 Verified sole modal call, bound-thunk callback ledger, and dialog tests.; 1028:0656:undefined2[2]; complete verified referring-function closure Exact far import pointer for DialogBoxParam16. +1028:0658 1028:0659 2 initialized verified semantic-object win16_dialog_box_param g_win16_dialog_box_param Win16FarPtr 0000 FUN_1008_2ae3 Verified sole modal call, bound-thunk callback ledger, and dialog tests.; 1028:0658:undefined2[2]; complete verified referring-function closure Exact far import pointer for DialogBoxParam16. +1028:065a 1028:065d 4 initialized verified semantic-object object_windows_default_procedures g_object_windows_default_procedures const Win16FarPtr[3] ffff0000 1028:065a->USER.ordinal:107 NE relocations 136..138 and verified ObjectWindows default window/MDI procedure forwarding; complete verified referring-function closure Exact three far import slots used as framework default procedure identities. +1028:065e 1028:0661 4 initialized verified semantic-object object_windows_default_procedures g_object_windows_default_procedures const Win16FarPtr[3] ffff0000 1028:065e->USER.ordinal:447 NE relocations 136..138 and verified ObjectWindows default window/MDI procedure forwarding; complete verified referring-function closure Exact three far import slots used as framework default procedure identities. +1028:0662 1028:0665 4 initialized verified semantic-object object_windows_default_procedures g_object_windows_default_procedures const Win16FarPtr[3] ffff0000 1028:0662->USER.ordinal:308 NE relocations 136..138 and verified ObjectWindows default window/MDI procedure forwarding; complete verified referring-function closure Exact three far import slots used as framework default procedure identities. +1028:0666 1028:0667 2 initialized verified semantic-object win16_message_box g_win16_message_box Win16FarPtr ffff FUN_1000_0121,FUN_1000_0270,FUN_1018_1f14,ne_program_entry 1028:0666->USER.ordinal:1 Relocation record 139; all indirect readers inventoried; verified application-error call 1018:1f14 and focused test.; 1028:0666:undefined2[2]; complete verified referring-function closure Process-wide far import pointer for MessageBox16; argument semantics at the reconstructed ObjectWindows call site are exact. +1028:0668 1028:0669 2 initialized verified semantic-object win16_message_box g_win16_message_box Win16FarPtr 0000 FUN_1000_0121,FUN_1000_0270,FUN_1018_1f14,ne_program_entry Relocation record 139; all indirect readers inventoried; verified application-error call 1018:1f14 and focused test.; 1028:0668:undefined2[2]; complete verified referring-function closure Process-wide far import pointer for MessageBox16; argument semantics at the reconstructed ObjectWindows call site are exact. +1028:066a 1028:066a 1 initialized verified semantic-object dialog_alternate_template g_dialog_alternate_template uint8_t 00 FUN_1008_1607 Verified sole reader and both synthetic branch cases.; 1028:066a:undefined1[1]; complete verified referring-function closure Selects integer dialog template 7f02 normally or 7f05 when externally nonzero. +1028:066b 1028:066b 1 initialized verified semantic-object alignment_066b g_alignment_066b const uint8_t 00 Exact binary byte; zero readers, writers, and relocations; complete verified referring-function closure Explicit one-byte ObjectWindows alignment. +1028:066c 1028:066d 2 initialized verified semantic-object object_windows_thunk_code_selector g_object_windows_thunk_code_selector uint16_t 0000 FUN_1018_01dc FUN_1018_01dc Disassembly 1018:01dc-02f9; reconstructed/tests/test_bound_thunks.c; 1028:066c:undefined2[2]; complete verified referring-function closure Stored in the next pool's header before replacement and used as the current pool selector lifecycle marker. +1028:066e 1028:066f 2 initialized verified semantic-object object_windows_free_thunk g_object_windows_free_thunk Win16FarPtr 0000 FUN_1018_01dc,FUN_1018_02fa FUN_1018_01dc,FUN_1018_02fa Disassembly 1018:01dc-0340; reconstructed/tests/test_bound_thunks.c; 1028:066e:undefined2[2]; complete verified referring-function closure Exact LIFO head across pool construction, allocation, release, and reallocation; each free thunk stores the previous far head at +3. +1028:0670 1028:0671 2 initialized verified semantic-object object_windows_free_thunk g_object_windows_free_thunk Win16FarPtr 0000 FUN_1018_01dc,FUN_1018_02fa FUN_1018_01dc,FUN_1018_02fa Disassembly 1018:01dc-0340; reconstructed/tests/test_bound_thunks.c; 1028:0670:undefined2[2]; complete verified referring-function closure Exact LIFO head across pool construction, allocation, release, and reallocation; each free thunk stores the previous far head at +3. +1028:0672 1028:0673 2 initialized verified semantic-object object_windows_dispatch_proc g_object_windows_dispatch_proc Win16FarPtr 0000 FUN_1018_01dc,FUN_1018_1b08 FUN_1018_1a61 Verified constructor write, thunk-pool copy/use, destructor FreeProcInstance, and focused application/thunk tests.; 1028:0672:undefined2[2]; complete verified referring-function closure Shared procedure reached by every generated bound thunk; exact MakeProcInstance/FreeProcInstance ownership lifecycle is represented. +1028:0674 1028:0675 2 initialized verified semantic-object object_windows_dispatch_proc g_object_windows_dispatch_proc Win16FarPtr 0000 FUN_1018_01dc,FUN_1018_1b08 FUN_1018_1a61 Verified constructor write, thunk-pool copy/use, destructor FreeProcInstance, and focused application/thunk tests.; 1028:0674:undefined2[2]; complete verified referring-function closure Shared procedure reached by every generated bound thunk; exact MakeProcInstance/FreeProcInstance ownership lifecycle is represented. +1028:0676 1028:0677 2 initialized verified semantic-object object_windows_creating_object g_object_windows_creating_object Win16FarPtr 0000 FUN_1018_134f Verified writer 1018:134f, bootstrap reader/transition, exact extent, and creation tests.; 1028:0676:undefined2[2]; complete verified referring-function closure Exact temporary object handoff until HWND-to-object thunk binding completes. +1028:0678 1028:0679 2 initialized verified semantic-object object_windows_creating_object g_object_windows_creating_object Win16FarPtr 0000 FUN_1018_134f Verified writer 1018:134f, bootstrap reader/transition, exact extent, and creation tests.; 1028:0678:undefined2[2]; complete verified referring-function closure Exact temporary object handoff until HWND-to-object thunk binding completes. +1028:067a 1028:067d 4 initialized verified semantic-object object_windows_selector_property object_windows_selector_property_name char[4] 4f573100 TDKPIN.EXE data bytes; SetProp16 call at 1018:004a-0059.; complete verified referring-function closure NUL-terminated property name OW1; stores the bound object's selector. +1028:067e 1028:0681 4 initialized verified semantic-object object_windows_offset_property object_windows_offset_property_name char[4] 4f573200 TDKPIN.EXE data bytes; SetProp16 call at 1018:005a-0069.; complete verified referring-function closure NUL-terminated property name OW2; stores the bound object's offset. +1028:0682 1028:0683 2 initialized verified semantic-object object_windows_message_hook g_object_windows_message_hook Win16FarPtr 0000 FUN_1018_0103 Complete Ghidra reference inventory: reads only at 1018:0127, 015f, and 08de; binary zero bytes; reconstructed/tests/test_message_dispatch.c; 1028:0682:undefined2[2]; complete verified referring-function closure Optional generic ObjectWindows instrumentation hook. Normal TDKPIN execution always skips it because the selector word at 0684 remains zero; nonnull semantics are nevertheless reconstructed and branch-tested. +1028:0684 1028:0685 2 initialized verified semantic-object object_windows_message_hook g_object_windows_message_hook Win16FarPtr 0000 FUN_1018_0103,FUN_1018_08c3 Complete Ghidra reference inventory: reads only at 1018:0127, 015f, and 08de; binary zero bytes; reconstructed/tests/test_message_dispatch.c; 1028:0684:undefined2[2]; complete verified referring-function closure Optional generic ObjectWindows instrumentation hook. Normal TDKPIN execution always skips it because the selector word at 0684 remains zero; nonnull semantics are nevertheless reconstructed and branch-tested. +1028:0686 1028:068a 5 initialized verified semantic-object object_windows_thunk_template object_windows_thunk_template uint8_t[5] 5b2ec41fea Binary bytes; disassembly 1018:020e-0226; reconstructed/tests/test_bound_thunks.c; complete verified referring-function closure POP BX; CS:LES BX,[BX]; JMP FAR immediate template: consumes the CALL return address, loads the embedded bound object, and jumps through the shared dispatch procedure appended at +7. +1028:068b 1028:068b 1 initialized verified semantic-object alignment_068b g_alignment_068b const uint8_t 00 Exact binary byte; zero readers, writers, and relocations; complete verified referring-function closure Explicit one-byte ObjectWindows separator. +1028:068c 1028:0697 12 initialized verified semantic-object object_windows_turbo_window_class_name object_windows_turbo_window_class_name char[12] 547572626f57696e646f7700 Binary bytes; four TWindow-derived VMTs select 1018:0d6a at +0x2c; focused far-pointer test.; 1028:068c:string[12]; complete verified referring-function closure Exact registered class-name provider for the shared ObjectWindows window implementation. +1028:0698 1028:06b2 27 initialized verified semantic-object object_windows_error_format object_windows_error_format char[27] 4572726f7220636f6465203d2025642e20436f6e74696e75653f00 Binary bytes and verified wvsprintf call at 1018:1f20-1f2c; reconstructed/tests/test_application_windows.c; 1028:0698:string[27]; complete verified referring-function closure Signed decimal application error prompt; the sole conversion consumes the caller's uint16 word as int16. +1028:06b3 1028:06c4 18 initialized verified semantic-object object_windows_error_caption object_windows_error_caption char[18] 4170706c69636174696f6e204572726f7200 Binary bytes and verified indirect MessageBox call at 1018:1f2f-1f3e.; 1028:06b3:string[18]; complete verified referring-function closure Exact caption for the ObjectWindows application error prompt. +1028:06c5 1028:06d9 21 initialized verified semantic-object borland_unit_descriptor_table g_borland_unit_descriptor_table const uint8_t[45] 00cc05000000000600018002801001110010009005 Exact bytes and relocations 06da..06ee to entry ordinals 227..232; complete verified startup/ExitProc chain; complete verified referring-function closure Exact compiler-generated unit lifecycle table; all six targets and ordering are represented. +1028:06da 1028:06dd 4 initialized verified semantic-object borland_unit_descriptor_table g_borland_unit_descriptor_table const uint8_t[45] ffff0000 1028:06da->entry-ordinal:227 Exact bytes and relocations 06da..06ee to entry ordinals 227..232; complete verified startup/ExitProc chain; complete verified referring-function closure Exact compiler-generated unit lifecycle table; all six targets and ordering are represented. +1028:06de 1028:06e1 4 initialized verified semantic-object borland_unit_descriptor_table g_borland_unit_descriptor_table const uint8_t[45] ffff0000 1028:06de->entry-ordinal:228 Exact bytes and relocations 06da..06ee to entry ordinals 227..232; complete verified startup/ExitProc chain; complete verified referring-function closure Exact compiler-generated unit lifecycle table; all six targets and ordering are represented. +1028:06e2 1028:06e5 4 initialized verified semantic-object borland_unit_descriptor_table g_borland_unit_descriptor_table const uint8_t[45] ffff0000 1028:06e2->entry-ordinal:229 Exact bytes and relocations 06da..06ee to entry ordinals 227..232; complete verified startup/ExitProc chain; complete verified referring-function closure Exact compiler-generated unit lifecycle table; all six targets and ordering are represented. +1028:06e6 1028:06e9 4 initialized verified semantic-object borland_unit_descriptor_table g_borland_unit_descriptor_table const uint8_t[45] ffff0000 1028:06e6->entry-ordinal:230 Exact bytes and relocations 06da..06ee to entry ordinals 227..232; complete verified startup/ExitProc chain; complete verified referring-function closure Exact compiler-generated unit lifecycle table; all six targets and ordering are represented. +1028:06ea 1028:06ed 4 initialized verified semantic-object borland_unit_descriptor_table g_borland_unit_descriptor_table const uint8_t[45] ffff0000 1028:06ea->entry-ordinal:231 Exact bytes and relocations 06da..06ee to entry ordinals 227..232; complete verified startup/ExitProc chain; complete verified referring-function closure Exact compiler-generated unit lifecycle table; all six targets and ordering are represented. +1028:06ee 1028:06f1 4 initialized verified semantic-object borland_unit_descriptor_table g_borland_unit_descriptor_table const uint8_t[45] ffff0000 1028:06ee->entry-ordinal:232 Exact bytes and relocations 06da..06ee to entry ordinals 227..232; complete verified startup/ExitProc chain; complete verified referring-function closure Exact compiler-generated unit lifecycle table; all six targets and ordering are represented. +1028:06f2 1028:06f2 1 initialized verified semantic-object object_windows_focus_event_marker g_object_windows_focus_event_marker uint8_t 01 FUN_1008_2c83 Complete reference inventory proves one writer and no readers; focused handler tests.; 1028:06f2:undefined1[1]; complete verified referring-function closure Exact write-only marker with no inferred role beyond its observed store. +1028:06f3 1028:06f3 1 initialized verified semantic-object alignment_06f3 g_alignment_06f3 const uint8_t 00 Exact binary byte; zero readers, writers, and relocations; complete verified referring-function closure Explicit one-byte runtime alignment. +1028:06f4 1028:06f5 2 initialized verified semantic-object borland_heap_reserve_size g_borland_heap_reserve_bytes uint16_t 0020 FUN_1008_2dff,FUN_1008_2e22 Binary bytes and reads in 1008:2dff/2e22.; 1028:06f4:undefined2[2]; complete verified referring-function closure Configured 8-KiB emergency heap reserve size. +1028:06f6 1028:06f7 2 initialized verified semantic-object borland_heap_reserve g_borland_heap_reserve Win16FarPtr 0000 FUN_1008_2de0,FUN_1008_2e22 FUN_1008_2dff,FUN_1008_2e22 Verified null/allocation/free/clear lifecycle tests for 1008:2de0, 2dff, and 2e22.; 1028:06f6:undefined2[2]; complete verified referring-function closure Emergency allocation released on OOM so the allocator can retry; underlying allocator is tracked separately. +1028:06f8 1028:06f9 2 initialized verified semantic-object borland_heap_reserve g_borland_heap_reserve Win16FarPtr 0000 FUN_1008_2de0,FUN_1008_2e22 FUN_1008_2dff,FUN_1008_2e22 Verified null/allocation/free/clear lifecycle tests for 1008:2de0, 2dff, and 2e22.; 1028:06f8:undefined2[2]; complete verified referring-function closure Emergency allocation released on OOM so the allocator can retry; underlying allocator is tracked separately. +1028:06fa 1028:06fa 1 initialized verified semantic-object borland_heap_reserve_disabled g_borland_heap_reserve_disabled uint8_t 00 FUN_1008_2e22 Branch in 1008:2e22 and writers in runtime setup/teardown.; complete verified referring-function closure; 1028:06fa:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:06fb 1028:06fb 1 initialized verified semantic-object alignment_06fb g_alignment_06fb const uint8_t 00 Exact binary byte; zero readers, writers, and relocations; complete verified referring-function closure Explicit one-byte startup-state alignment. +1028:06fc 1028:06fd 2 initialized verified semantic-object win16_previous_instance g_win16_previous_instance HINSTANCE16 0000 FUN_1000_0121,FUN_1008_2554,FUN_1018_1a61 FUN_1020_0002 Startup write in 1020:0002; first-instance branch in verified 1018:1a61; reconstructed/tests/test_application.c; complete verified referring-function closure; 1028:06fc:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:06fe 1028:06ff 2 initialized verified semantic-object win16_instance g_win16_instance HINSTANCE16 0000 FUN_1000_016c,FUN_1000_0270,FUN_1000_5390,FUN_1000_5be5,FUN_1000_6129,FUN_1008_0f2e,FUN_1008_2442,FUN_1008_2554,FUN_1008_2a45,FUN_1008_2ae3,FUN_1010_01c2,FUN_1018_0e46,FUN_1018_1274,FUN_1018_134f,FUN_1018_1a61,FUN_1020_0002,FUN_1020_082e FUN_1020_0002 34 readers across resource/window/module paths; verified MakeProcInstance argument in 1018:1a61.; complete verified referring-function closure; 1028:06fe:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0700 1028:0701 2 initialized verified semantic-object win16_show_command g_win16_show_command uint16_t 0000 FUN_1008_2442,FUN_1018_1b57 FUN_1020_0002 Startup write at 1020:0015; read by verified application initialization 1018:1b57; reconstructed/tests/test_application.c; complete verified referring-function closure; 1028:0700:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0702 1028:0703 2 initialized verified semantic-object borland_command_line g_borland_command_line Win16FarPtr 0000 FUN_1020_0871 FUN_1020_0002 Verified startup capture and command-token scanner 1020:0871; reconstructed/tests/test_borland_startup.c; 1028:0702:undefined4[4]; complete verified referring-function closure Exact far pointer to the NUL-terminated DOS command tail, including independent selector and wrapping offset semantics. +1028:0704 1028:0705 2 initialized verified semantic-object borland_command_line g_borland_command_line Win16FarPtr 0000 FUN_1020_0002 Verified startup capture and command-token scanner 1020:0871; reconstructed/tests/test_borland_startup.c; complete verified referring-function closure Exact far pointer to the NUL-terminated DOS command tail, including independent selector and wrapping offset semantics. +1028:0706 1028:0707 2 initialized verified semantic-object borland_heap_segment_head g_borland_heap_segment_head uint16_t 0000 FUN_1020_0167,FUN_1020_023c,FUN_1020_026a,FUN_1020_02d7,runtime_1020_0195 FUN_1020_023c,FUN_1020_02d7 Reads/writes in 1020:0167, 0195, 023c, 026a, 02d7; reconstructed/tests/test_heap_core.c; reconstructed/tests/test_heap_paths.c; 1028:0706:undefined2[2]; complete verified referring-function closure Circular insertion, successful-segment rotation, predecessor unlink, and final zeroing are represented and verified across one- and two-segment lifecycles. +1028:0708 1028:0709 2 initialized verified semantic-object borland_local_heap_limit g_borland_local_heap_limit uint16_t 0004 FUN_1020_01ca Threshold branches in 1020:01ca; reconstructed/tests/test_heap_paths.c; 1028:0708:undefined2[2]; complete verified referring-function closure Below-threshold local-first and above-threshold global-first paths, including fallback, are represented and branch-tested. +1028:070a 1028:070b 2 initialized verified semantic-object borland_heap_segment_bytes g_borland_heap_segment_bytes uint16_t 0020 FUN_1020_01ca,FUN_1020_026a,FUN_1020_02d7 Header/free-size construction and full-segment release tests.; 1028:070a:undefined2[2]; complete verified referring-function closure Exact 8-KiB local heap segment allocation size. +1028:070c 1028:070d 2 initialized verified semantic-object borland_global_alloc_flags g_borland_global_alloc_flags uint16_t 0200 FUN_1020_0222 Push at 1020:0222 and verified GlobalAlloc16 argument test.; 1028:070c:undefined2[2]; complete verified referring-function closure Exact flags passed for Borland global heap blocks. +1028:070e 1028:070f 2 initialized verified semantic-object borland_heap_error_handler g_borland_heap_error_handler Win16FarPtr 0000 FUN_1020_01ca FUN_1008_2e76 Verified NE-segment binding to selector:2e22; indirect call at 1020:020c-0210.; 1028:070e:undefined2[2]; complete verified referring-function closure Allocator callback returns 0 stop, 1 no retry, or 2 retry after emergency-reserve release. +1028:0710 1028:0711 2 initialized verified semantic-object borland_heap_error_handler g_borland_heap_error_handler Win16FarPtr 0000 FUN_1020_01ca FUN_1008_2e76 Verified NE-segment binding to selector:2e22; indirect call at 1020:020c-0210.; 1028:0710:undefined2[2]; complete verified referring-function closure Allocator callback returns 0 stop, 1 no retry, or 2 retry after emergency-reserve release. +1028:0712 1028:0713 2 initialized verified semantic-object borland_exit_proc g_borland_exit_proc Win16FarPtr 0000 FUN_1008_2554,FUN_1020_00d2 FUN_1008_24a5,FUN_1008_2554,FUN_1020_00d2 Reads/clears in 1020:00d2; writers throughout shutdown setup.; complete verified referring-function closure; 1028:0712:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0714 1028:0715 2 initialized verified semantic-object borland_exit_proc g_borland_exit_proc Win16FarPtr 0000 FUN_1008_2554 FUN_1008_24a5,FUN_1008_2554,FUN_1020_00d2 Reads/clears in 1020:00d2; writers throughout shutdown setup.; complete verified referring-function closure; 1028:0714:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0716 1028:0716 1 initialized verified semantic-object borland_exit_code g_borland_exit_code_word uint16_t 00 FUN_1020_0061 FUN_1020_0061 Stores/reads in 1020:0061 and related runtime entries.; complete verified referring-function closure; 1028:0716:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0717 1028:0717 1 initialized verified semantic-object borland_exit_code g_borland_exit_code_word uint16_t 00 Stores/reads in 1020:0061 and related runtime entries.; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0718 1028:0719 2 initialized verified semantic-object borland_error_location g_borland_error_location struct BorlandErrorLocation 0000 FUN_1008_24a5,FUN_1020_0061 FUN_1020_0061 Reads/writes in 1020:0002, 005d, 0061, and runtime error helpers.; complete verified referring-function closure; 1028:0718:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:071a 1028:071b 2 initialized verified semantic-object borland_error_location g_borland_error_location struct BorlandErrorLocation 0000 FUN_1008_24a5,FUN_1020_0061 FUN_1020_0061 Reads/writes in 1020:0002, 005d, 0061, and runtime error helpers.; complete verified referring-function closure; 1028:071a:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:071c 1028:071d 2 initialized verified semantic-object borland_windows_mode g_borland_windows_mode uint16_t 0000 FUN_1020_0061 FUN_1020_0002 Verified startup capture, termination consumer 1020:0061, and focused tests.; 1028:071c:undefined2[2]; complete verified referring-function closure Exact Win16 selector-valued mode word; nonzero selects ExitProc execution and GUI error reporting. +1028:071e 1028:071f 2 initialized verified semantic-object borland_io_result g_borland_io_result _Atomic uint16_t 0000 FUN_1020_0388,FUN_1020_038f FUN_1020_00d2,FUN_1020_0388,FUN_1020_0534,FUN_1020_0586,FUN_1020_05c7,FUN_1020_06ab,FUN_1020_072c,FUN_1020_0751,FUN_1020_07fe,runtime_1020_0710 Atomic exchange in verified 1020:0388; reads/writes in runtime I/O and ExitProc paths.; complete verified referring-function closure; 1028:071e:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0720 1028:0721 2 initialized verified semantic-object borland_random_seed g_borland_random_seed uint32_t 0000 FUN_1020_1501,runtime_1020_14de FUN_1000_0270,FUN_1020_1501,runtime_1020_1539 Reads/writes in 1020:14a4, 14c1, 14de, 1501, and 1539; multiplier 0x08088405 proved from assembly.; 1028:0720:undefined2[2]; complete verified referring-function closure Exact modulo-2^32 Borland RandSeed state, stored low word then high word. +1028:0722 1028:0723 2 initialized verified semantic-object borland_random_seed g_borland_random_seed uint32_t 0000 FUN_1020_1501 FUN_1000_0270,FUN_1020_1501,runtime_1020_1539 Reads/writes in 1020:14a4, 14c1, 14de, 1501, and 1539; multiplier 0x08088405 proved from assembly.; 1028:0722:undefined2[2]; complete verified referring-function closure Exact modulo-2^32 Borland RandSeed state, stored low word then high word. +1028:0724 1028:0725 2 initialized verified semantic-object borland_huge_pointer_increment g_borland_huge_pointer_increment uint16_t 0000 FUN_1020_0002 Relocation 5:4 at 1020:0051; Wine 11.15 __AHINCR=8; reconstructed/tests/test_borland_startup.c; 1028:0724:undefined2[2]; complete verified referring-function closure Exact selector increment used by Borland huge-pointer normalization; this import is runtime data, not a callable function. +1028:0726 1028:0726 1 initialized verified semantic-object borland_cpu_level g_borland_cpu_level uint8_t 00 FUN_1020_08a9,FUN_1020_08e6,runtime_1020_098c,runtime_1020_09af FUN_1020_0002 Verified startup branches and consumers 1020:08a9, 08e6, 098c, and 09af; arithmetic and startup tests.; 1028:0726:undefined1[1]; complete verified referring-function closure Exact levels 0 for 086/186, 1 for 286, and 2 for 386-plus instruction selection. +1028:0727 1028:0727 1 initialized verified semantic-object borland_file_mode g_borland_file_mode uint8_t 02 FUN_1020_06ab Binary byte; sole read by verified generic open entry 1020:06ab; focused DOS-open test.; 1028:0727:undefined1[1]; complete verified referring-function closure Exact DOS AH=3d access mode passed for nonempty generic-file names. +1028:0728 1028:0747 32 initialized verified semantic-object borland_runtime_error_text g_borland_runtime_error_text char[32] 52756e74696d65206572726f722030303020617420303030303a303030302e00 TDKPIN.EXE bytes; fixed write endpoints 0739, 0741, 0746 in 1020:0061.; 1028:0728:string[32]; complete verified referring-function closure Mutable decimal error-code and uppercase hexadecimal segment/offset fields are written backward into fixed placeholders before MessageBox16. +1028:0748 1028:0749 2 zero-fill verified semantic-object tdkpin_application_object g_tdkpin_application_object uint8_t[36] zero-fill ne_program_entry Verified application constructor, VMT Run/destructor calls, static dispose mode zero, and program-entry tests.; 1028:0748:undefined2[2]; complete verified referring-function closure Exact process-lifetime ObjectWindows application instance. +1028:074a 1028:076b 34 zero-fill verified semantic-object tdkpin_application_object g_tdkpin_application_object uint8_t[36] zero-fill Verified application constructor, VMT Run/destructor calls, static dispose mode zero, and program-entry tests.; complete verified referring-function closure Exact process-lifetime ObjectWindows application instance. +1028:076c 1028:07be 83 zero-fill verified semantic-object reserved_runtime_to_game_state g_reserved_runtime_to_game_state uint8_t[83] zero-fill Complete reference, relocation, and defined-data inventories contain no address in the range; complete verified referring-function closure Explicit unreferenced runtime/game-state reserve; all 83 bytes remain zero in-image. +1028:07bf 1028:07c0 2 zero-fill verified semantic-object tdkpin_windows_version g_tdkpin_windows_version uint32_t zero-fill ne_program_entry ne_program_entry Verified 2.x, 3.9, 3.10, and 4.x branches and full-dword publication.; 1028:07bf:undefined2[2]; complete verified referring-function closure Low-byte major, next-byte minor; upper word retained but not used by threshold. +1028:07c1 1028:07c2 2 zero-fill verified semantic-object tdkpin_windows_version g_tdkpin_windows_version uint32_t zero-fill ne_program_entry ne_program_entry Verified 2.x, 3.9, 3.10, and 4.x branches and full-dword publication.; 1028:07c1:undefined2[2]; complete verified referring-function closure Low-byte major, next-byte minor; upper word retained but not used by threshold. +1028:07c3 1028:07c3 1 zero-fill verified semantic-object alignment_07c3 g_alignment_07c3 uint8_t zero-fill Complete zero-reader/zero-writer/zero-relocation inventory; complete verified referring-function closure Explicit one-byte game-state alignment. +1028:07c4 1028:07c4 1 zero-fill verified semantic-object palette_update_active g_palette_update_active uint8_t zero-fill FUN_1000_58e7,FUN_1000_5956,exported_ordinal_10 FUN_1000_58e7,FUN_1000_5956 All palette-message readers/writers 1000:58e7,5956,59a0,5a37 are verified; palette message tests; complete verified referring-function closure; 1028:07c4:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07c5 1028:07c5 1 zero-fill verified semantic-object collision_refresh_pending g_collision_refresh_pending uint8_t zero-fill exported_ordinal_10 FUN_1000_0270,FUN_1000_638e,exported_ordinal_10 Writes at 1000:03e0/6959/eb2c and timer read at 1000:eb0b; exact add-player branch in reconstructed/tdkpin_key_input.c and reconstructed/tests/test_key_release.c; complete verified referring-function closure; 1028:07c5:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07c6 1028:07c6 1 zero-fill verified semantic-object game_tilted game_tilted uint8_t zero-fill FUN_1000_638e,FUN_1000_6bf8,FUN_1000_b476,FUN_1000_bc36,FUN_1000_c79c,FUN_1008_0002,exported_ordinal_10 FUN_1000_638e,FUN_1000_9e85 Verified sound-dispatch gate 1008:0002; complete reference inventory identifies readers in key, collision, timer, and gameplay paths plus writers 1000:638e and 1000:9e85.; complete verified referring-function closure; 1028:07c6:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07c7 1028:07c7 1 zero-fill verified semantic-object target_rotation_armed g_target_rotation_armed uint8_t zero-fill FUN_1000_b476,FUN_1000_c79c,exported_ordinal_10 FUN_1000_0270,FUN_1000_638e,FUN_1000_b476,exported_ordinal_10 Verified gate/writer in 1000:b476 and complete reference inventory; reconstructed/tests/test_collision_events.c; complete verified referring-function closure; 1028:07c7:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07c8 1028:07c8 1 zero-fill verified semantic-object target_set_complete g_target_set_complete uint8_t zero-fill FUN_1000_b476,FUN_1000_c79c,exported_ordinal_10 FUN_1000_0270,FUN_1000_9e85,FUN_1000_c79c,exported_ordinal_10 Verified writer 1000:9e85, gate 1000:b476, and complete reference inventory; ball-render/collision-event tests; complete verified referring-function closure; 1028:07c8:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07c9 1028:07c9 1 zero-fill verified semantic-object gameplay_transition_pending g_gameplay_transition_pending uint8_t zero-fill exported_ordinal_10 FUN_1000_0270,FUN_1000_638e,FUN_1000_a70e Verified writer plus complete reference inventory.; complete verified referring-function closure; 1028:07c9:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07ca 1028:07ca 1 zero-fill verified semantic-object claw_animation_active g_claw_animation_active uint8_t zero-fill exported_ordinal_10 FUN_1000_0270,FUN_1000_c79c,exported_ordinal_10 Complete references; full timer state machine in reconstructed/tdkpin_timer_tick.c and test_timer_tick.c; complete verified referring-function closure; 1028:07ca:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07cb 1028:07cb 1 zero-fill verified semantic-object scene_ready g_scene_ready uint8_t zero-fill FUN_1000_0270,FUN_1000_5390 Verified writer 1000:5390; asset-initializer tests; complete verified referring-function closure; 1028:07cb:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07cc 1028:07cc 1 zero-fill verified semantic-object assets_pending g_assets_pending uint8_t zero-fill FUN_1000_5390,exported_ordinal_10 FUN_1000_0270,FUN_1000_5390 Verified reader/clear in 1000:5390; asset-initializer tests; complete verified referring-function closure; 1028:07cc:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07cd 1028:07ce 2 zero-fill verified semantic-object board_index g_board_index uint16_t zero-fill FUN_1000_0270,FUN_1000_6129 FUN_1000_0270 Verified setup reader; reconstructed/tests/test_board_overlay.c; complete verified referring-function closure; 1028:07cd:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07cf 1028:07cf 1 zero-fill verified semantic-object debug_keys_enabled g_debug_keys_enabled uint8_t zero-fill FUN_1000_638e FUN_1000_0270 Complete reference inventory: verified setup 1000:0270 and both debug branches in verified 1000:638e; reconstructed/tests/test_game_setup.c and test_key_release.c; 1028:07cf:undefined1[1]; complete verified referring-function closure Nonzero, possible only through external mutation, enables F2 target-rotation reset and F7 ball-position restore; normal execution leaves both paths dormant. +1028:07d0 1028:07d0 1 zero-fill verified semantic-object player_count g_player_count uint8_t zero-fill FUN_1000_638e,FUN_1000_6bf8,FUN_1000_a72c,FUN_1000_acc2,FUN_1000_ae6e,exported_ordinal_10 FUN_1000_0270,FUN_1000_638e,FUN_1000_a70e Verified clear and complete loop/reference evidence.; complete verified referring-function closure; 1028:07d0:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07d1 1028:07d1 1 zero-fill verified semantic-object current_player g_current_player uint8_t zero-fill FUN_1000_5390,FUN_1000_6f27,FUN_1000_7e92,FUN_1000_a604,FUN_1000_abe5,FUN_1000_acc2,FUN_1000_ae6e,FUN_1000_b476,FUN_1000_bc36,FUN_1000_c4e1,FUN_1000_c79c,FUN_1008_0b9e,exported_ordinal_10 FUN_1000_0270,FUN_1000_638e,FUN_1000_a72c,FUN_1000_acc2,FUN_1000_ae6e Verified gating/index use in 1008:0b9e; status tests; complete verified referring-function closure; 1028:07d1:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07d2 1028:07d2 1 zero-fill verified semantic-object highscore_insert_index g_highscore_insert_index uint8_t zero-fill FUN_1000_ab3c,FUN_1000_ae6e FUN_1000_a72c,FUN_1000_abe5 Verified insert/show lifecycle and complete reference inventory; reconstructed/tests/test_highscores.c; complete verified referring-function closure; 1028:07d2:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07d3 1028:07d4 2 zero-fill verified semantic-object ball_position_milli g_ball_position_milli int32_t[2] zero-fill FUN_1000_0270,FUN_1000_7ed9,FUN_1000_9bca,FUN_1000_9f73,FUN_1000_ae6e,FUN_1000_bdde,FUN_1000_beff,FUN_1000_c426,FUN_1000_c79c,exported_ordinal_10 FUN_1000_0270,FUN_1000_638e,FUN_1000_9e85,FUN_1000_ae6e,FUN_1000_beff,FUN_1000_c36b,FUN_1000_c79c,exported_ordinal_10 Verified reset, pixel projection 1000:9bca, bounds/dynamic-record and ball-slot helpers; complete reference inventory; reconstructed/tests/test_ball_render.c and test_gameplay_helpers.c; complete verified referring-function closure; 1028:07d3:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07d5 1028:07d6 2 zero-fill verified semantic-object ball_position_milli g_ball_position_milli int32_t[2] zero-fill FUN_1000_0270,FUN_1000_7ed9,FUN_1000_9bca,FUN_1000_9f73,FUN_1000_ae6e,FUN_1000_bdde,FUN_1000_beff,FUN_1000_c426,FUN_1000_c79c,exported_ordinal_10 FUN_1000_0270,FUN_1000_638e,FUN_1000_9e85,FUN_1000_ae6e,FUN_1000_beff,FUN_1000_c36b,FUN_1000_c79c,exported_ordinal_10 Verified reset, pixel projection 1000:9bca, bounds/dynamic-record and ball-slot helpers; complete reference inventory; reconstructed/tests/test_ball_render.c and test_gameplay_helpers.c; complete verified referring-function closure; 1028:07d5:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07d7 1028:07d8 2 zero-fill verified semantic-object ball_position_milli g_ball_position_milli int32_t[2] zero-fill FUN_1000_0270,FUN_1000_7ed9,FUN_1000_9bca,FUN_1000_9f73,FUN_1000_ae6e,FUN_1000_bdde,FUN_1000_beff,FUN_1000_c426,FUN_1000_c79c,exported_ordinal_10 FUN_1000_0270,FUN_1000_638e,FUN_1000_9e85,FUN_1000_ae6e,FUN_1000_beff,FUN_1000_c36b,FUN_1000_c79c,exported_ordinal_10 Verified reset, pixel projection 1000:9bca, bounds/dynamic-record and ball-slot helpers; complete reference inventory; reconstructed/tests/test_ball_render.c and test_gameplay_helpers.c; complete verified referring-function closure; 1028:07d7:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07d9 1028:07da 2 zero-fill verified semantic-object ball_position_milli g_ball_position_milli int32_t[2] zero-fill FUN_1000_0270,FUN_1000_7ed9,FUN_1000_9bca,FUN_1000_9f73,FUN_1000_ae6e,FUN_1000_bdde,FUN_1000_beff,FUN_1000_c426,FUN_1000_c79c,exported_ordinal_10 FUN_1000_0270,FUN_1000_638e,FUN_1000_9e85,FUN_1000_ae6e,FUN_1000_beff,FUN_1000_c36b,FUN_1000_c79c,exported_ordinal_10 Verified reset, pixel projection 1000:9bca, bounds/dynamic-record and ball-slot helpers; complete reference inventory; reconstructed/tests/test_ball_render.c and test_gameplay_helpers.c; complete verified referring-function closure; 1028:07d9:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07db 1028:07dc 2 zero-fill verified semantic-object predicted_ball_position_milli g_predicted_ball_position_milli int32_t[2] zero-fill FUN_1000_9b69,FUN_1000_c79c FUN_1000_c79c Complete verified readers/writers 1000:c79c and 1000:9b69; reconstructed/tdkpin_physics.c and focused physics tests; 1028:07db:undefined2[2]; complete verified referring-function closure Exact X then Y signed dword extent, write order, trigger rewrite, and bounds use are fully represented. +1028:07dd 1028:07de 2 zero-fill verified semantic-object predicted_ball_position_milli g_predicted_ball_position_milli int32_t[2] zero-fill FUN_1000_9b69,FUN_1000_c79c FUN_1000_c79c Complete verified readers/writers 1000:c79c and 1000:9b69; reconstructed/tdkpin_physics.c and focused physics tests; 1028:07dd:undefined2[2]; complete verified referring-function closure Exact X then Y signed dword extent, write order, trigger rewrite, and bounds use are fully represented. +1028:07df 1028:07e0 2 zero-fill verified semantic-object predicted_ball_position_milli g_predicted_ball_position_milli int32_t[2] zero-fill FUN_1000_9b69,FUN_1000_c79c FUN_1000_c79c Complete verified readers/writers 1000:c79c and 1000:9b69; reconstructed/tdkpin_physics.c and focused physics tests; 1028:07df:undefined2[2]; complete verified referring-function closure Exact X then Y signed dword extent, write order, trigger rewrite, and bounds use are fully represented. +1028:07e1 1028:07e2 2 zero-fill verified semantic-object predicted_ball_position_milli g_predicted_ball_position_milli int32_t[2] zero-fill FUN_1000_9b69,FUN_1000_c79c FUN_1000_c79c Complete verified readers/writers 1000:c79c and 1000:9b69; reconstructed/tdkpin_physics.c and focused physics tests; 1028:07e1:undefined2[2]; complete verified referring-function closure Exact X then Y signed dword extent, write order, trigger rewrite, and bounds use are fully represented. +1028:07e3 1028:07e4 2 zero-fill verified semantic-object ball_slot_x_positions_milli g_ball_slot_x_positions_milli int32_t[2] zero-fill exported_ordinal_10 exported_ordinal_10 Verified 1000:c36b/c426 stride plus full timer promotion/copy paths; gameplay-helper and timer tests; complete verified referring-function closure; 1028:07e3:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07e5 1028:07e6 2 zero-fill verified semantic-object ball_slot_x_positions_milli g_ball_slot_x_positions_milli int32_t[2] zero-fill exported_ordinal_10 exported_ordinal_10 Verified 1000:c36b/c426 stride plus full timer promotion/copy paths; gameplay-helper and timer tests; complete verified referring-function closure; 1028:07e5:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07e7 1028:07e8 2 zero-fill verified semantic-object ball_slot_x_positions_milli g_ball_slot_x_positions_milli int32_t[2] zero-fill exported_ordinal_10 Verified 1000:c36b/c426 stride plus full timer promotion/copy paths; gameplay-helper and timer tests; complete verified referring-function closure; 1028:07e7:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07e9 1028:07ea 2 zero-fill verified semantic-object ball_slot_x_positions_milli g_ball_slot_x_positions_milli int32_t[2] zero-fill exported_ordinal_10 Verified 1000:c36b/c426 stride plus full timer promotion/copy paths; gameplay-helper and timer tests; complete verified referring-function closure; 1028:07e9:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07eb 1028:07ec 2 zero-fill verified semantic-object ball_slot_y_positions_milli g_ball_slot_y_positions_milli int32_t[2] zero-fill exported_ordinal_10 exported_ordinal_10 Verified 1000:c36b/c426 stride plus full timer promotion/copy paths; focused tests; complete verified referring-function closure; 1028:07eb:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07ed 1028:07ee 2 zero-fill verified semantic-object ball_slot_y_positions_milli g_ball_slot_y_positions_milli int32_t[2] zero-fill exported_ordinal_10 exported_ordinal_10 Verified 1000:c36b/c426 stride plus full timer promotion/copy paths; focused tests; complete verified referring-function closure; 1028:07ed:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07ef 1028:07f0 2 zero-fill verified semantic-object ball_slot_y_positions_milli g_ball_slot_y_positions_milli int32_t[2] zero-fill exported_ordinal_10 Verified 1000:c36b/c426 stride plus full timer promotion/copy paths; focused tests; complete verified referring-function closure; 1028:07ef:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07f1 1028:07f2 2 zero-fill verified semantic-object ball_slot_y_positions_milli g_ball_slot_y_positions_milli int32_t[2] zero-fill exported_ordinal_10 Verified 1000:c36b/c426 stride plus full timer promotion/copy paths; focused tests; complete verified referring-function closure; 1028:07f1:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07f3 1028:07f4 2 zero-fill verified semantic-object ball_slot_velocity_x_milli g_ball_slot_velocity_x_milli int32_t[2] zero-fill FUN_1000_638e FUN_1000_638e,exported_ordinal_10 Verified 1000:c36b/c426 slot stride and verified 1000:638e nudge updates; timer slot-one-to-zero transfer at 1000:f24d; gameplay-helper and key-release tests; complete verified referring-function closure; 1028:07f3:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07f5 1028:07f6 2 zero-fill verified semantic-object ball_slot_velocity_x_milli g_ball_slot_velocity_x_milli int32_t[2] zero-fill FUN_1000_638e FUN_1000_638e,exported_ordinal_10 Verified 1000:c36b/c426 slot stride and verified 1000:638e nudge updates; timer slot-one-to-zero transfer at 1000:f24d; gameplay-helper and key-release tests; complete verified referring-function closure; 1028:07f5:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07f7 1028:07f8 2 zero-fill verified semantic-object ball_slot_velocity_x_milli g_ball_slot_velocity_x_milli int32_t[2] zero-fill FUN_1000_638e,exported_ordinal_10 FUN_1000_638e Verified 1000:c36b/c426 slot stride and verified 1000:638e nudge updates; timer slot-one-to-zero transfer at 1000:f24d; gameplay-helper and key-release tests; complete verified referring-function closure; 1028:07f7:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07f9 1028:07fa 2 zero-fill verified semantic-object ball_slot_velocity_x_milli g_ball_slot_velocity_x_milli int32_t[2] zero-fill FUN_1000_638e,exported_ordinal_10 FUN_1000_638e Verified 1000:c36b/c426 slot stride and verified 1000:638e nudge updates; timer slot-one-to-zero transfer at 1000:f24d; gameplay-helper and key-release tests; complete verified referring-function closure; 1028:07f9:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07fb 1028:07fc 2 zero-fill verified semantic-object ball_slot_velocity_y_milli g_ball_slot_velocity_y_milli int32_t[2] zero-fill FUN_1000_638e FUN_1000_638e,exported_ordinal_10 Verified 1000:c36b/c426 slot stride, verified 1000:638e launch publication and space-nudge updates, timer slot-one-to-zero transfer at 1000:f25b; focused tests; complete verified referring-function closure; 1028:07fb:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07fd 1028:07fe 2 zero-fill verified semantic-object ball_slot_velocity_y_milli g_ball_slot_velocity_y_milli int32_t[2] zero-fill FUN_1000_638e FUN_1000_638e,exported_ordinal_10 Verified 1000:c36b/c426 slot stride, verified 1000:638e launch publication and space-nudge updates, timer slot-one-to-zero transfer at 1000:f25b; focused tests; complete verified referring-function closure; 1028:07fd:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07ff 1028:0800 2 zero-fill verified semantic-object ball_slot_velocity_y_milli g_ball_slot_velocity_y_milli int32_t[2] zero-fill FUN_1000_638e,exported_ordinal_10 FUN_1000_638e Verified 1000:c36b/c426 slot stride, verified 1000:638e launch publication and space-nudge updates, timer slot-one-to-zero transfer at 1000:f25b; focused tests; complete verified referring-function closure; 1028:07ff:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0801 1028:0802 2 zero-fill verified semantic-object ball_slot_velocity_y_milli g_ball_slot_velocity_y_milli int32_t[2] zero-fill FUN_1000_638e,exported_ordinal_10 FUN_1000_638e Verified 1000:c36b/c426 slot stride, verified 1000:638e launch publication and space-nudge updates, timer slot-one-to-zero transfer at 1000:f25b; focused tests; complete verified referring-function closure; 1028:0801:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0803 1028:0804 2 zero-fill verified semantic-object ball_slot_auxiliary_state g_ball_slot_auxiliary_state int32_t[2] zero-fill exported_ordinal_10 Verified 1000:c36b/c426 and full timer slot promotion; focused tests; complete verified referring-function closure; 1028:0803:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0805 1028:0806 2 zero-fill verified semantic-object ball_slot_auxiliary_state g_ball_slot_auxiliary_state int32_t[2] zero-fill exported_ordinal_10 Verified 1000:c36b/c426 and full timer slot promotion; focused tests; complete verified referring-function closure; 1028:0805:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0807 1028:0808 2 zero-fill verified semantic-object ball_slot_auxiliary_state g_ball_slot_auxiliary_state int32_t[2] zero-fill exported_ordinal_10 Verified 1000:c36b/c426 and full timer slot promotion; focused tests; complete verified referring-function closure; 1028:0807:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0809 1028:080a 2 zero-fill verified semantic-object ball_slot_auxiliary_state g_ball_slot_auxiliary_state int32_t[2] zero-fill exported_ordinal_10 Verified 1000:c36b/c426 and full timer slot promotion; focused tests; complete verified referring-function closure; 1028:0809:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:080b 1028:080c 2 zero-fill verified semantic-object ball_slot_real48_state g_ball_slot_real48_state BorlandReal48[2] zero-fill exported_ordinal_10 Verified six-byte stride in 1000:c36b/c426 and full timer promotion; focused tests; complete verified referring-function closure; 1028:080b:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:080d 1028:080e 2 zero-fill verified semantic-object ball_slot_real48_state g_ball_slot_real48_state BorlandReal48[2] zero-fill exported_ordinal_10 Verified six-byte stride in 1000:c36b/c426 and full timer promotion; focused tests; complete verified referring-function closure; 1028:080d:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:080f 1028:0810 2 zero-fill verified semantic-object ball_slot_real48_state g_ball_slot_real48_state BorlandReal48[2] zero-fill exported_ordinal_10 Verified six-byte stride in 1000:c36b/c426 and full timer promotion; focused tests; complete verified referring-function closure; 1028:080f:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0811 1028:0812 2 zero-fill verified semantic-object ball_slot_real48_state g_ball_slot_real48_state BorlandReal48[2] zero-fill exported_ordinal_10 Verified six-byte stride in 1000:c36b/c426 and full timer promotion; focused tests; complete verified referring-function closure; 1028:0811:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0813 1028:0814 2 zero-fill verified semantic-object ball_slot_real48_state g_ball_slot_real48_state BorlandReal48[2] zero-fill exported_ordinal_10 Verified six-byte stride in 1000:c36b/c426 and full timer promotion; focused tests; complete verified referring-function closure; 1028:0813:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0815 1028:0816 2 zero-fill verified semantic-object ball_slot_real48_state g_ball_slot_real48_state BorlandReal48[2] zero-fill exported_ordinal_10 Verified six-byte stride in 1000:c36b/c426 and full timer promotion; focused tests; complete verified referring-function closure; 1028:0815:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0817 1028:0817 1 zero-fill verified semantic-object player_ready_flags g_player_ready_flags uint8_t[4] zero-fill FUN_1000_0270 Verified initialization and exact extent in 1000:a72c; reconstructed/tests/test_player_state.c; complete verified referring-function closure; 1028:0817:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0818 1028:0818 1 zero-fill verified semantic-object player_ready_flags g_player_ready_flags uint8_t[4] zero-fill FUN_1000_a72c Verified initialization and exact extent in 1000:a72c; reconstructed/tests/test_player_state.c; complete verified referring-function closure; 1028:0818:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0819 1028:081a 2 zero-fill verified semantic-object player_ready_flags g_player_ready_flags uint8_t[4] zero-fill Verified initialization and exact extent in 1000:a72c; reconstructed/tests/test_player_state.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:081b 1028:081b 1 zero-fill verified semantic-object player_item_group_flags g_player_item_group_flags uint8_t[4] zero-fill FUN_1000_0270 Verified initialization and exact extent in 1000:a72c; reconstructed/tests/test_player_state.c; complete verified referring-function closure; 1028:081b:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:081c 1028:081c 1 zero-fill verified semantic-object player_item_group_flags g_player_item_group_flags uint8_t[4] zero-fill FUN_1000_a72c Verified initialization and exact extent in 1000:a72c; reconstructed/tests/test_player_state.c; complete verified referring-function closure; 1028:081c:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:081d 1028:081e 2 zero-fill verified semantic-object player_item_group_flags g_player_item_group_flags uint8_t[4] zero-fill Verified initialization and exact extent in 1000:a72c; reconstructed/tests/test_player_state.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:081f 1028:0820 2 zero-fill verified semantic-object player_marker_counts g_player_marker_counts int16_t[5] zero-fill Verified six-marker projection in 1000:a604; complete indexed reference inventory; reconstructed/tests/test_gameplay_helpers.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0821 1028:0822 2 zero-fill verified semantic-object player_marker_counts g_player_marker_counts int16_t[5] zero-fill FUN_1000_0270,FUN_1000_638e Verified six-marker projection in 1000:a604; complete indexed reference inventory; reconstructed/tests/test_gameplay_helpers.c; complete verified referring-function closure; 1028:0821:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0823 1028:0824 2 zero-fill verified semantic-object player_marker_counts g_player_marker_counts int16_t[5] zero-fill FUN_1000_638e,FUN_1000_a72c Verified six-marker projection in 1000:a604; complete indexed reference inventory; reconstructed/tests/test_gameplay_helpers.c; complete verified referring-function closure; 1028:0823:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0825 1028:0828 4 zero-fill verified semantic-object player_marker_counts g_player_marker_counts int16_t[5] zero-fill Verified six-marker projection in 1000:a604; complete indexed reference inventory; reconstructed/tests/test_gameplay_helpers.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0829 1028:082a 2 zero-fill verified semantic-object player_marker_score_thresholds g_player_marker_score_thresholds int32_t[4] zero-fill FUN_1000_0270 Verified indexed comparison in 1000:bc36 and exact boundary against marker counts/levels; reconstructed/tests/test_scoring.c; complete verified referring-function closure; 1028:0829:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:082b 1028:082c 2 zero-fill verified semantic-object player_marker_score_thresholds g_player_marker_score_thresholds int32_t[4] zero-fill FUN_1000_0270 Verified indexed comparison in 1000:bc36 and exact boundary against marker counts/levels; reconstructed/tests/test_scoring.c; complete verified referring-function closure; 1028:082b:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:082d 1028:082e 2 zero-fill verified semantic-object player_marker_score_thresholds g_player_marker_score_thresholds int32_t[4] zero-fill FUN_1000_0270 Verified indexed comparison in 1000:bc36 and exact boundary against marker counts/levels; reconstructed/tests/test_scoring.c; complete verified referring-function closure; 1028:082d:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:082f 1028:0830 2 zero-fill verified semantic-object player_marker_score_thresholds g_player_marker_score_thresholds int32_t[4] zero-fill FUN_1000_0270 Verified indexed comparison in 1000:bc36 and exact boundary against marker counts/levels; reconstructed/tests/test_scoring.c; complete verified referring-function closure; 1028:082f:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0831 1028:0832 2 zero-fill verified semantic-object player_marker_score_thresholds g_player_marker_score_thresholds int32_t[4] zero-fill FUN_1000_0270 Verified indexed comparison in 1000:bc36 and exact boundary against marker counts/levels; reconstructed/tests/test_scoring.c; complete verified referring-function closure; 1028:0831:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0833 1028:0834 2 zero-fill verified semantic-object player_marker_score_thresholds g_player_marker_score_thresholds int32_t[4] zero-fill FUN_1000_0270 Verified indexed comparison in 1000:bc36 and exact boundary against marker counts/levels; reconstructed/tests/test_scoring.c; complete verified referring-function closure; 1028:0833:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0835 1028:0836 2 zero-fill verified semantic-object player_marker_score_thresholds g_player_marker_score_thresholds int32_t[4] zero-fill FUN_1000_0270 Verified indexed comparison in 1000:bc36 and exact boundary against marker counts/levels; reconstructed/tests/test_scoring.c; complete verified referring-function closure; 1028:0835:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0837 1028:0838 2 zero-fill verified semantic-object player_marker_score_thresholds g_player_marker_score_thresholds int32_t[4] zero-fill FUN_1000_0270 Verified indexed comparison in 1000:bc36 and exact boundary against marker counts/levels; reconstructed/tests/test_scoring.c; complete verified referring-function closure; 1028:0837:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0839 1028:083a 2 zero-fill verified semantic-object player_marker_levels g_player_marker_levels int32_t[4] zero-fill FUN_1000_0270 Verified initialization 1000:a72c and increment/limit logic 1000:bc36; player-state/scoring tests; complete verified referring-function closure; 1028:0839:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:083b 1028:083c 2 zero-fill verified semantic-object player_marker_levels g_player_marker_levels int32_t[4] zero-fill FUN_1000_0270 Verified initialization 1000:a72c and increment/limit logic 1000:bc36; player-state/scoring tests; complete verified referring-function closure; 1028:083b:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:083d 1028:083e 2 zero-fill verified semantic-object player_marker_levels g_player_marker_levels int32_t[4] zero-fill FUN_1000_a72c Verified initialization 1000:a72c and increment/limit logic 1000:bc36; player-state/scoring tests; complete verified referring-function closure; 1028:083d:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:083f 1028:0840 2 zero-fill verified semantic-object player_marker_levels g_player_marker_levels int32_t[4] zero-fill FUN_1000_a72c Verified initialization 1000:a72c and increment/limit logic 1000:bc36; player-state/scoring tests; complete verified referring-function closure; 1028:083f:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0841 1028:0848 8 zero-fill verified semantic-object player_marker_levels g_player_marker_levels int32_t[4] zero-fill Verified initialization 1000:a72c and increment/limit logic 1000:bc36; player-state/scoring tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0849 1028:084a 2 zero-fill verified semantic-object collision_path_continuation g_collision_path_continuation int32_t[2] zero-fill FUN_1008_0138 FUN_1008_0138 Complete sole-function read/write inventory, exact 32-bit wrap, and branch tests.; 1028:0849:undefined2[2]; complete verified referring-function closure X then Y continuation; circles retain point1 center, segments retain point2 endpoint. +1028:084b 1028:084c 2 zero-fill verified semantic-object collision_path_continuation g_collision_path_continuation int32_t[2] zero-fill FUN_1008_0138 FUN_1008_0138 Complete sole-function read/write inventory, exact 32-bit wrap, and branch tests.; 1028:084b:undefined2[2]; complete verified referring-function closure X then Y continuation; circles retain point1 center, segments retain point2 endpoint. +1028:084d 1028:084e 2 zero-fill verified semantic-object collision_path_continuation g_collision_path_continuation int32_t[2] zero-fill FUN_1008_0138 FUN_1008_0138 Complete sole-function read/write inventory, exact 32-bit wrap, and branch tests.; 1028:084d:undefined2[2]; complete verified referring-function closure X then Y continuation; circles retain point1 center, segments retain point2 endpoint. +1028:084f 1028:0850 2 zero-fill verified semantic-object collision_path_continuation g_collision_path_continuation int32_t[2] zero-fill FUN_1008_0138 FUN_1008_0138 Complete sole-function read/write inventory, exact 32-bit wrap, and branch tests.; 1028:084f:undefined2[2]; complete verified referring-function closure X then Y continuation; circles retain point1 center, segments retain point2 endpoint. +1028:0851 1028:0852 2 zero-fill verified semantic-object panel_animation_frame g_panel_animation_frame int32_t zero-fill FUN_1000_7440,exported_ordinal_10 FUN_1000_9e85,FUN_1000_c79c,exported_ordinal_10 Verified complete render consumer 1000:7440 and reset writer 1000:9e85; full reference inventory; reconstructed/tests/test_panel_animation.c; complete verified referring-function closure; 1028:0851:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0853 1028:0854 2 zero-fill verified semantic-object panel_animation_frame g_panel_animation_frame int32_t zero-fill FUN_1000_7440,exported_ordinal_10 FUN_1000_9e85,FUN_1000_c79c,exported_ordinal_10 Verified complete render consumer 1000:7440 and reset writer 1000:9e85; full reference inventory; reconstructed/tests/test_panel_animation.c; complete verified referring-function closure; 1028:0853:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0855 1028:0856 2 zero-fill verified semantic-object target_rotation_state g_target_rotation_state int32_t zero-fill FUN_1000_6f27,exported_ordinal_10 FUN_1000_638e,FUN_1000_b476,exported_ordinal_10 Verified full render/rotation consumer 1000:6f27 and complete reference inventory; reconstructed/tests/test_mechanism_render.c; complete verified referring-function closure; 1028:0855:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0857 1028:0858 2 zero-fill verified semantic-object target_rotation_state g_target_rotation_state int32_t zero-fill FUN_1000_6f27,exported_ordinal_10 FUN_1000_638e,FUN_1000_b476,exported_ordinal_10 Verified full render/rotation consumer 1000:6f27 and complete reference inventory; reconstructed/tests/test_mechanism_render.c; complete verified referring-function closure; 1028:0857:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0859 1028:085a 2 zero-fill verified semantic-object dat600_bitmap g_dat600_bitmap HBITMAP16 zero-fill FUN_1000_51f5,FUN_1000_6f27,FUN_1000_7440 FUN_1000_5390 Complete verified load/render/delete lifecycle 1000:5390,6f27,7440,51f5; mechanism and panel-animation tests; 1028:0859:undefined2[2]; complete verified referring-function closure Exact DAT600 atlas provenance, 91-pixel target frames, panel-animation mask/image regions, publication, and ownership lifecycle are fully proven. +1028:085b 1028:085c 2 zero-fill verified semantic-object background_bitmap g_background_bitmap HBITMAP16 zero-fill FUN_1000_0002,FUN_1000_51f5,FUN_1000_5390,FUN_1000_6b37,FUN_1000_7440,FUN_1000_9bca,FUN_1000_9f73,FUN_1000_a38e,FUN_1000_beff,FUN_1008_07b6,FUN_1008_0837,FUN_1008_08bb,FUN_1008_093f,FUN_1008_0996,FUN_1008_0e08 FUN_1000_5390 Verified writer and readers 1008:07b6,0837,08bb,093f,0996/1000:5390; complete verified referring-function closure; 1028:085b:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:085d 1028:085e 2 zero-fill verified semantic-object background_overlay_b g_background_overlay_b HBITMAP16 zero-fill FUN_1000_51f5,FUN_1000_6f27,FUN_1000_7440,FUN_1008_08bb FUN_1000_5390 Complete writer/reader inventory 1000:5390 and 1008:08bb; asset/render tests.; 1028:085d:undefined2[2]; complete verified referring-function closure Exact overlay-B resource, publication, restore role, and DGROUP extent are fully proven. +1028:085f 1028:0860 2 zero-fill verified semantic-object background_overlay_a g_background_overlay_a HBITMAP16 zero-fill FUN_1000_51f5,FUN_1000_7440,FUN_1008_0837,exported_ordinal_10 FUN_1000_5390 Complete writer/reader inventory 1000:5390 and 1008:0837; asset/render tests.; 1028:085f:undefined2[2]; complete verified referring-function closure Exact overlay-A resource, publication, restore role, and DGROUP extent are fully proven. +1028:0861 1028:0862 2 zero-fill verified semantic-object digit_sprite_bitmap g_digit_sprite_bitmap HBITMAP16 zero-fill FUN_1000_51f5,FUN_1008_0996,exported_ordinal_10 FUN_1000_5390 Complete writer/reader inventory 1000:5390 and 1008:0996; asset/score tests.; 1028:0861:undefined2[2]; complete verified referring-function closure Exact HBITMAP slot, resource ID, 16-pixel horizontal digit stride, and 28x16 SRCAND use are fully proven. +1028:0863 1028:0864 2 zero-fill verified semantic-object claw_sprite_bitmap g_claw_sprite_bitmap HBITMAP16 zero-fill FUN_1000_51f5,FUN_1008_0e08 FUN_1000_5390 Complete writer/reader/deletion inventory 1000:5390,1008:0e08,1000:51f5; asset/claw/cleanup tests; 1028:0863:undefined2[2]; complete verified referring-function closure Exact resource, atlas geometry, frame mapping, publication, rendering, and ownership lifecycle are fully proven. +1028:0865 1028:0866 2 zero-fill verified semantic-object board_decoration_bitmap g_board_decoration_bitmap HBITMAP16 zero-fill FUN_1000_51f5,FUN_1000_638e,FUN_1000_6b37 FUN_1000_5390 Complete verified lifecycle 1000:5390,638e,6b37,51f5; asset, key-release, gameplay-helper, and cleanup tests; 1028:0865:undefined2[2]; complete verified referring-function closure Exact DAT901 provenance, launch-decoration and velocity-row atlas geometry, presentation, and ownership endpoint are fully proven. +1028:0867 1028:0868 2 zero-fill verified semantic-object overlay_bitmap g_overlay_bitmap HBITMAP16 zero-fill FUN_1000_5ba6,FUN_1000_5c13,FUN_1000_60e7,FUN_1000_616e FUN_1000_5be5,FUN_1000_6129 Complete verified setup/destructor, 616e 640x460 drawing, and 5c13 high-score source-region lifecycle; overlay and high-score tests; 1028:0867:undefined2[2]; complete verified referring-function closure Exact global HBITMAP provenance, replacement, 32/204 high-score source, whole-overlay drawing, and ownership endpoints are fully proven. +1028:0869 1028:086a 2 zero-fill verified semantic-object unused_setup_word_0869 g_unused_setup_word_0869 uint16_t zero-fill FUN_1000_0270 Sole write 1000:03ff in verified setup and zero-reader proof; 1028:0869:undefined2[2]; complete verified referring-function closure Explicit retained word is initialized state, not silently omitted padding; it has no in-image consumer. +1028:086b 1028:086c 2 zero-fill verified semantic-object displayed_status_level g_displayed_status_level uint16_t zero-fill FUN_1008_0b9e FUN_1000_0270,FUN_1000_5390,FUN_1008_0b9e All renderer reads/writes in 1008:0b9e verified; status tests; complete verified referring-function closure; 1028:086b:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:086d 1028:086e 2 zero-fill verified semantic-object claw_current_frame g_claw_current_frame uint16_t zero-fill exported_ordinal_10 FUN_1000_0270,exported_ordinal_10 Complete setup/timer references, exact claw table and test_timer_tick.c; complete verified referring-function closure; 1028:086d:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:086f 1028:0870 2 zero-fill verified semantic-object claw_target_frame g_claw_target_frame uint16_t zero-fill exported_ordinal_10 FUN_1000_0270,FUN_1000_c79c,exported_ordinal_10 Complete references and full timer claw state machine; complete verified referring-function closure; 1028:086f:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0871 1028:0872 2 zero-fill verified semantic-object physics_substeps_per_tick g_physics_substeps_per_tick uint16_t zero-fill FUN_1000_c79c FUN_1000_0270 Verified setup speed table and 1000:c79c loop; game-setup and physics tests; 1028:0871:undefined2[2]; complete verified referring-function closure Exact unsigned zero-through-configured substep semantics and zero-substep rendering behavior are fully represented. +1028:0873 1028:0873 1 zero-fill verified semantic-object claw_alternate_bank g_claw_alternate_bank uint8_t zero-fill exported_ordinal_10 FUN_1000_0270,FUN_1000_c79c,exported_ordinal_10 Complete references, verified claw renderer and full timer tests; complete verified referring-function closure; 1028:0873:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0874 1028:0874 1 zero-fill verified semantic-object score_double_active g_score_double_active uint8_t zero-fill FUN_1000_ae6e,FUN_1000_bc36,FUN_1000_c79c,exported_ordinal_10 FUN_1000_0270,FUN_1000_638e,FUN_1000_a72c,FUN_1000_ae6e,FUN_1000_c4e1,FUN_1000_c79c,exported_ordinal_10 Verified lifecycle in 1000:a72c/bc36/c4e1; complete reference inventory; player-state/scoring tests; complete verified referring-function closure; 1028:0874:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0875 1028:0875 1 zero-fill verified semantic-object special_respawn_active g_special_respawn_active uint8_t zero-fill FUN_1000_c79c FUN_1000_0270,FUN_1000_ae6e,FUN_1000_c79c Verified both writes in 1000:ae6e and complete reference inventory; reconstructed/tests/test_turn_state.c; complete verified referring-function closure; 1028:0875:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0876 1028:0877 2 zero-fill verified semantic-object timer_tick_counter g_timer_tick_counter uint32_t zero-fill exported_ordinal_10 FUN_1000_0270,exported_ordinal_10 Setup and full 1000:eab1 disassembly/source; test_timer_tick.c; complete verified referring-function closure; 1028:0876:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0878 1028:0879 2 zero-fill verified semantic-object timer_tick_counter g_timer_tick_counter uint32_t zero-fill exported_ordinal_10 FUN_1000_0270,exported_ordinal_10 Setup and full 1000:eab1 disassembly/source; test_timer_tick.c; complete verified referring-function closure; 1028:0878:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:087a 1028:087b 2 zero-fill verified semantic-object intro_marquee_counter g_intro_marquee_counter uint32_t zero-fill exported_ordinal_10 FUN_1000_0270,exported_ordinal_10 Setup and full timer GDI path; test_timer_tick.c; complete verified referring-function closure; 1028:087a:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:087c 1028:087d 2 zero-fill verified semantic-object intro_marquee_counter g_intro_marquee_counter uint32_t zero-fill exported_ordinal_10 FUN_1000_0270,exported_ordinal_10 Setup and full timer GDI path; test_timer_tick.c; complete verified referring-function closure; 1028:087c:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:087e 1028:087f 2 zero-fill verified semantic-object highscore_scores g_highscore_scores int32_t[10] zero-fill FUN_1000_5c13,FUN_1000_a8ea FUN_1000_a99c Complete verified reader/writer inventory across 1000:5c13/a8ea/a99c/abe5; reconstructed/tests/test_highscores.c; 1028:087e:undefined2[2]; complete verified referring-function closure Exact ten signed dwords, one-based addressing, persistence, ordering, comparison, and decimal rendering are fully proven. +1028:0880 1028:0881 2 zero-fill verified semantic-object highscore_scores g_highscore_scores int32_t[10] zero-fill FUN_1000_5c13,FUN_1000_a8ea,FUN_1000_abe5 FUN_1000_a99c Complete verified reader/writer inventory across 1000:5c13/a8ea/a99c/abe5; reconstructed/tests/test_highscores.c; 1028:0880:undefined2[2]; complete verified referring-function closure Exact ten signed dwords, one-based addressing, persistence, ordering, comparison, and decimal rendering are fully proven. +1028:0882 1028:0883 2 zero-fill verified semantic-object highscore_scores g_highscore_scores int32_t[10] zero-fill FUN_1000_a8ea,FUN_1000_abe5 FUN_1000_a99c,FUN_1000_abe5 Complete verified reader/writer inventory across 1000:5c13/a8ea/a99c/abe5; reconstructed/tests/test_highscores.c; 1028:0882:undefined2[2]; complete verified referring-function closure Exact ten signed dwords, one-based addressing, persistence, ordering, comparison, and decimal rendering are fully proven. +1028:0884 1028:0885 2 zero-fill verified semantic-object highscore_scores g_highscore_scores int32_t[10] zero-fill FUN_1000_a8ea,FUN_1000_abe5 FUN_1000_a99c,FUN_1000_abe5 Complete verified reader/writer inventory across 1000:5c13/a8ea/a99c/abe5; reconstructed/tests/test_highscores.c; 1028:0884:undefined2[2]; complete verified referring-function closure Exact ten signed dwords, one-based addressing, persistence, ordering, comparison, and decimal rendering are fully proven. +1028:0886 1028:0899 20 zero-fill verified semantic-object highscore_scores g_highscore_scores int32_t[10] zero-fill Complete verified reader/writer inventory across 1000:5c13/a8ea/a99c/abe5; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact ten signed dwords, one-based addressing, persistence, ordering, comparison, and decimal rendering are fully proven. +1028:089a 1028:089b 2 zero-fill verified semantic-object highscore_scores g_highscore_scores int32_t[10] zero-fill FUN_1000_abe5 Complete verified reader/writer inventory across 1000:5c13/a8ea/a99c/abe5; reconstructed/tests/test_highscores.c; 1028:089a:undefined2[2]; complete verified referring-function closure Exact ten signed dwords, one-based addressing, persistence, ordering, comparison, and decimal rendering are fully proven. +1028:089c 1028:089d 2 zero-fill verified semantic-object highscore_scores g_highscore_scores int32_t[10] zero-fill FUN_1000_abe5 Complete verified reader/writer inventory across 1000:5c13/a8ea/a99c/abe5; reconstructed/tests/test_highscores.c; 1028:089c:undefined2[2]; complete verified referring-function closure Exact ten signed dwords, one-based addressing, persistence, ordering, comparison, and decimal rendering are fully proven. +1028:089e 1028:089f 2 zero-fill verified semantic-object highscore_scores g_highscore_scores int32_t[10] zero-fill FUN_1000_abe5 FUN_1000_abe5 Complete verified reader/writer inventory across 1000:5c13/a8ea/a99c/abe5; reconstructed/tests/test_highscores.c; 1028:089e:undefined2[2]; complete verified referring-function closure Exact ten signed dwords, one-based addressing, persistence, ordering, comparison, and decimal rendering are fully proven. +1028:08a0 1028:08a1 2 zero-fill verified semantic-object highscore_scores g_highscore_scores int32_t[10] zero-fill FUN_1000_abe5 FUN_1000_abe5 Complete verified reader/writer inventory across 1000:5c13/a8ea/a99c/abe5; reconstructed/tests/test_highscores.c; 1028:08a0:undefined2[2]; complete verified referring-function closure Exact ten signed dwords, one-based addressing, persistence, ordering, comparison, and decimal rendering are fully proven. +1028:08a2 1028:08a3 2 zero-fill verified semantic-object highscore_scores g_highscore_scores int32_t[10] zero-fill FUN_1000_abe5 Complete verified reader/writer inventory across 1000:5c13/a8ea/a99c/abe5; reconstructed/tests/test_highscores.c; 1028:08a2:undefined2[2]; complete verified referring-function closure Exact ten signed dwords, one-based addressing, persistence, ordering, comparison, and decimal rendering are fully proven. +1028:08a4 1028:08a5 2 zero-fill verified semantic-object highscore_scores g_highscore_scores int32_t[10] zero-fill FUN_1000_abe5 Complete verified reader/writer inventory across 1000:5c13/a8ea/a99c/abe5; reconstructed/tests/test_highscores.c; 1028:08a4:undefined2[2]; complete verified referring-function closure Exact ten signed dwords, one-based addressing, persistence, ordering, comparison, and decimal rendering are fully proven. +1028:08a6 1028:0981 220 zero-fill verified semantic-object highscore_names g_highscore_names char[10][22] zero-fill Complete verified lifecycle 1000:5c13/a8ea/a99c/ab3c/abe5; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact ten 22-byte slots, short-read behavior, defaulting, shift/edit, C-string display truncation, and persistence layout are fully proven. +1028:0982 1028:0983 2 zero-fill verified semantic-object player_scores g_player_scores int32_t[4] zero-fill FUN_1000_5390 FUN_1000_0270,FUN_1000_638e Verified one-based reader 1008:0996; score-render tests; complete verified referring-function closure; 1028:0982:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0984 1028:0985 2 zero-fill verified semantic-object player_scores g_player_scores int32_t[4] zero-fill FUN_1000_5390 FUN_1000_0270,FUN_1000_638e Verified one-based reader 1008:0996; score-render tests; complete verified referring-function closure; 1028:0984:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0986 1028:0987 2 zero-fill verified semantic-object player_scores g_player_scores int32_t[4] zero-fill FUN_1000_5390 FUN_1000_0270,FUN_1000_a72c Verified one-based reader 1008:0996; score-render tests; complete verified referring-function closure; 1028:0986:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0988 1028:0989 2 zero-fill verified semantic-object player_scores g_player_scores int32_t[4] zero-fill FUN_1000_5390 FUN_1000_0270,FUN_1000_a72c Verified one-based reader 1008:0996; score-render tests; complete verified referring-function closure; 1028:0988:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:098a 1028:0991 8 zero-fill verified semantic-object player_scores g_player_scores int32_t[4] zero-fill Verified one-based reader 1008:0996; score-render tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0992 1028:0993 2 zero-fill verified semantic-object player_secondary_scores g_player_secondary_scores int32_t[4] zero-fill FUN_1000_acc2 FUN_1000_0270 Verified reset 1000:a72c and active redraw 1000:acc2; reconstructed/tests/test_player_state.c; complete verified referring-function closure; 1028:0992:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0994 1028:0995 2 zero-fill verified semantic-object player_secondary_scores g_player_secondary_scores int32_t[4] zero-fill FUN_1000_acc2 FUN_1000_0270 Verified reset 1000:a72c and active redraw 1000:acc2; reconstructed/tests/test_player_state.c; complete verified referring-function closure; 1028:0994:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0996 1028:0997 2 zero-fill verified semantic-object player_secondary_scores g_player_secondary_scores int32_t[4] zero-fill FUN_1000_0270,FUN_1000_a72c Verified reset 1000:a72c and active redraw 1000:acc2; reconstructed/tests/test_player_state.c; complete verified referring-function closure; 1028:0996:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0998 1028:0999 2 zero-fill verified semantic-object player_secondary_scores g_player_secondary_scores int32_t[4] zero-fill FUN_1000_0270,FUN_1000_a72c Verified reset 1000:a72c and active redraw 1000:acc2; reconstructed/tests/test_player_state.c; complete verified referring-function closure; 1028:0998:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:099a 1028:09a1 8 zero-fill verified semantic-object player_secondary_scores g_player_secondary_scores int32_t[4] zero-fill Verified reset 1000:a72c and active redraw 1000:acc2; reconstructed/tests/test_player_state.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:09a2 1028:09a2 1 zero-fill verified semantic-object player_score_multipliers g_player_score_multipliers uint8_t[4] zero-fill FUN_1000_acc2 FUN_1000_0270 Verified reset 1000:a72c and multiply 1000:acc2; reconstructed/tests/test_player_state.c; complete verified referring-function closure; 1028:09a2:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:09a3 1028:09a3 1 zero-fill verified semantic-object player_score_multipliers g_player_score_multipliers uint8_t[4] zero-fill FUN_1000_0270,FUN_1000_a72c Verified reset 1000:a72c and multiply 1000:acc2; reconstructed/tests/test_player_state.c; complete verified referring-function closure; 1028:09a3:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:09a4 1028:09a5 2 zero-fill verified semantic-object player_score_multipliers g_player_score_multipliers uint8_t[4] zero-fill Verified reset 1000:a72c and multiply 1000:acc2; reconstructed/tests/test_player_state.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:09a6 1028:09a7 2 zero-fill verified semantic-object player_sprite_indices g_player_sprite_indices uint16_t[4] zero-fill FUN_1000_acc2 FUN_1000_0270 Verified reset 1000:a72c and active-player composite 1000:acc2/0002; player-state/player-sprite tests; complete verified referring-function closure; 1028:09a6:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:09a8 1028:09a9 2 zero-fill verified semantic-object player_sprite_indices g_player_sprite_indices uint16_t[4] zero-fill FUN_1000_0270,FUN_1000_a72c Verified reset 1000:a72c and active-player composite 1000:acc2/0002; player-state/player-sprite tests; complete verified referring-function closure; 1028:09a8:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:09aa 1028:09ad 4 zero-fill verified semantic-object player_sprite_indices g_player_sprite_indices uint16_t[4] zero-fill Verified reset 1000:a72c and active-player composite 1000:acc2/0002; player-state/player-sprite tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:09ae 1028:09e1 52 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:09e2 1028:09e2 1 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_0270,FUN_1000_ae6e FUN_1000_638e,FUN_1000_ae6e Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:09e2:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:09e3 1028:09f0 14 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:09f1 1028:09f2 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_0270,FUN_1000_a72c,FUN_1000_ae6e FUN_1000_638e,FUN_1000_ae6e Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:09f1:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:09f3 1028:09f6 4 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:09f7 1028:09f8 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:09f7:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:09f9 1028:0a00 8 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a01 1028:0a01 1 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a01:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a02 1028:0a02 1 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a02:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a03 1028:0a04 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a03:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a05 1028:0a06 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a05:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a07 1028:0a08 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a07:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a09 1028:0a0a 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a09:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a0b 1028:0a0c 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a0b:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a0d 1028:0a0e 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a0d:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a0f 1028:0a10 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a0f:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a11 1028:0a12 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a11:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a13 1028:0a14 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a13:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a15 1028:0a16 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a15:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a17 1028:0a18 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a17:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a19 1028:0a1a 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a19:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a1b 1028:0a1c 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a1b:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a1d 1028:0a1e 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a1d:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a1f 1028:0a20 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a1f:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a21 1028:0a22 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a21:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a23 1028:0a24 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a23:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a25 1028:0a26 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a25:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a27 1028:0a28 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a27:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a29 1028:0a2a 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a29:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a2b 1028:0a2c 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a2b:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a2d 1028:0a2e 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a2d:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a2f 1028:0a30 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a2f:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a31 1028:0a32 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a31:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a33 1028:0a34 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a33:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a35 1028:0a35 1 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_0270,FUN_1000_ae6e,FUN_1000_c79c FUN_1000_638e,FUN_1000_ae6e,FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a35:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a36 1028:0a37 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a36:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a38 1028:0a39 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a38:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a3a 1028:0a3b 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a3a:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a3c 1028:0a3d 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a3c:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a3e 1028:0a3f 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a3e:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a40 1028:0a41 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a40:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a42 1028:0a43 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a42:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a44 1028:0a45 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_0270,FUN_1000_c79c FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a44:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a46 1028:0a47 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a46:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a48 1028:0a49 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a48:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a4a 1028:0a4b 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0a4a:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a4c 1028:0b80 309 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0b81 1028:0b81 1 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_b476 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0b81:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0b82 1028:0b97 22 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0b98 1028:0b99 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_b476 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0b98:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0b9a 1028:0b9b 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_b476 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0b9a:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0b9c 1028:0b9d 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_b476 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0b9c:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0b9e 1028:0b9f 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_b476 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0b9e:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0ba0 1028:0d72 467 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0d73 1028:0d73 1 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c,exported_ordinal_10 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0d73:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0d74 1028:0dc5 82 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0dc6 1028:0dc6 1 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_c79c,exported_ordinal_10 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:0dc6:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0dc7 1028:1e7f 4281 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1e80 1028:1e81 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1e80:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1e82 1028:1e83 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1e82:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1e84 1028:1e85 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1e84:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1e86 1028:1e87 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1e86:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1e88 1028:1e8f 8 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1e90 1028:1e91 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1e90:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1e92 1028:1e93 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1e92:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1e94 1028:1e95 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1e94:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1e96 1028:1ec2 45 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1ec3 1028:1ec4 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1ec3:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1ec5 1028:1ec6 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1ec5:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1ec7 1028:1ec8 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1ec7:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1ec9 1028:1eca 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1ec9:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1ecb 1028:1ecc 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1ecb:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1ecd 1028:1ece 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1ecd:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1ecf 1028:1ed0 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1ecf:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1ed1 1028:1ed2 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1ed1:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1ed3 1028:1ed4 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9,FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1ed3:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1ed5 1028:1ed6 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9,FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1ed5:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1ed7 1028:1ed8 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1ed7:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1ed9 1028:1eda 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1ed9:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1edb 1028:1edc 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9,FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1edb:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1edd 1028:1ede 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9,FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1edd:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1edf 1028:1ee0 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9,FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1edf:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1ee1 1028:1ee2 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9,FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1ee1:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1ee3 1028:1f15 51 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f16 1028:1f17 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1f16:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f18 1028:1f19 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1f18:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f1a 1028:1f1b 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1f1a:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f1c 1028:1f1d 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1f1c:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f1e 1028:1f1f 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1f1e:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f20 1028:1f21 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1f20:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f22 1028:1f23 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1f22:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f24 1028:1f25 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1f24:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f26 1028:1f27 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1f26:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f28 1028:1f29 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1f28:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f2a 1028:1f2b 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1f2a:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f2c 1028:1f2d 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1f2c:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f2e 1028:1f68 59 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f69 1028:1f6a 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1f69:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f6b 1028:1f6c 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1f6b:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f6d 1028:1f6e 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1f6d:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f6f 1028:1f70 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1f6f:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f71 1028:1f72 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1f71:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f73 1028:1f74 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1f73:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f75 1028:1f76 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1f75:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f77 1028:1f78 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1f77:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f79 1028:1f7a 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9,FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1f79:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f7b 1028:1f7c 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9,FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1f7b:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f7d 1028:1f7e 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9,FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1f7d:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f7f 1028:1f80 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9,FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1f7f:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f81 1028:1f82 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9,FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1f81:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f83 1028:1f84 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9,FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1f83:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f85 1028:1f86 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1f85:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f87 1028:1f88 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:1f87:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f89 1028:235c 980 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:235d 1028:235e 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:235d:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:235f 1028:2360 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:235f:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2361 1028:2362 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:2361:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2363 1028:2364 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:2363:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2365 1028:236c 8 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:236d 1028:236e 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:236d:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:236f 1028:2370 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:236f:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2371 1028:2372 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:2371:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2373 1028:239f 45 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23a0 1028:23a1 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:23a0:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23a2 1028:23a3 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:23a2:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23a4 1028:23a5 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:23a4:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23a6 1028:23a7 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:23a6:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23a8 1028:23a9 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:23a8:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23aa 1028:23ab 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:23aa:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23ac 1028:23ad 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:23ac:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23ae 1028:23af 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:23ae:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23b0 1028:23b1 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9,FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:23b0:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23b2 1028:23b3 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9,FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:23b2:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23b4 1028:23b5 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:23b4:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23b6 1028:23b7 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:23b6:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23b8 1028:23b9 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9,FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:23b8:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23ba 1028:23bb 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9,FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:23ba:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23bc 1028:23bd 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9,FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:23bc:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23be 1028:23bf 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9,FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:23be:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23c0 1028:23f2 51 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23f3 1028:23f4 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:23f3:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23f5 1028:23f6 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:23f5:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23f7 1028:23f8 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:23f7:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23f9 1028:23fa 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:23f9:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23fb 1028:23fc 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:23fb:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23fd 1028:23fe 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:23fd:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23ff 1028:2400 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:23ff:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2401 1028:2402 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:2401:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2403 1028:2404 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:2403:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2405 1028:2406 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:2405:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2407 1028:2408 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:2407:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2409 1028:240a 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:2409:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:240b 1028:2445 59 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2446 1028:2447 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:2446:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2448 1028:2449 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:2448:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:244a 1028:244b 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:244a:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:244c 1028:244d 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:244c:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:244e 1028:244f 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:244e:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2450 1028:2451 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:2450:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2452 1028:2453 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:2452:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2454 1028:2455 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:2454:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2456 1028:2457 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9,FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:2456:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2458 1028:2459 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9,FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:2458:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:245a 1028:245b 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9,FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:245a:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:245c 1028:245d 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_7ed9,FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:245c:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:245e 1028:245f 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:245e:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2460 1028:2461 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:2460:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2462 1028:2463 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:2462:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2464 1028:2465 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_8b0d FUN_1000_8b0d Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:2464:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2466 1028:2678 531 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2679 1028:267a 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill exported_ordinal_10 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:2679:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:267b 1028:333f 3269 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3340 1028:3341 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_638e Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:3340:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3342 1028:3343 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_638e Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:3342:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3344 1028:3345 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_638e Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:3344:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3346 1028:3347 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_638e Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:3346:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3348 1028:3370 41 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3371 1028:3372 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_6f27,FUN_1000_9e85,FUN_1000_c79c FUN_1000_6f27,exported_ordinal_10 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:3371:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3373 1028:33c3 81 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:33c4 1028:33c5 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_6f27,FUN_1000_9e85,FUN_1000_c79c FUN_1000_6f27,exported_ordinal_10 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:33c4:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:33c6 1028:3416 81 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3417 1028:3418 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_6f27,FUN_1000_9e85 FUN_1000_6f27 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:3417:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3419 1028:3469 81 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:346a 1028:346b 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_6f27,FUN_1000_9e85 FUN_1000_6f27 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:346a:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:346c 1028:34bc 81 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:34bd 1028:34be 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_6f27,FUN_1000_9e85 FUN_1000_6f27 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:34bd:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:34bf 1028:3968 1194 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3969 1028:396a 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_ae6e,exported_ordinal_10 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:3969:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:396b 1028:396c 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_ae6e,exported_ordinal_10 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:396b:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:396d 1028:396e 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_ae6e,exported_ordinal_10 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:396d:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:396f 1028:3970 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_ae6e,exported_ordinal_10 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:396f:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3971 1028:3999 41 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:399a 1028:399b 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_ae6e,FUN_1000_b476,FUN_1000_c4e1 FUN_1000_ae6e,exported_ordinal_10 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:399a:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:399c 1028:39dd 66 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:39de 1028:39de 1 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_b476 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:39de:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:39df 1028:3b29 331 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3b2a 1028:3b2a 1 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_b476 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:3b2a:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3b2b 1028:3b40 22 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3b41 1028:3b42 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_b476 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:3b41:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3b43 1028:3b44 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_b476 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:3b43:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3b45 1028:3b46 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_b476 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:3b45:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3b47 1028:3b48 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_b476 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:3b47:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3b49 1028:3b7c 52 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3b7d 1028:3b7d 1 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_b476 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:3b7d:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3b7e 1028:3b93 22 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3b94 1028:3b95 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_b476 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:3b94:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3b96 1028:3b97 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_b476 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:3b96:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3b98 1028:3b99 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_b476 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:3b98:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3b9a 1028:3b9b 2 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill FUN_1000_b476 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:3b9a:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3b9c 1028:41f8 1629 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:41f9 1028:41f9 1 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill exported_ordinal_10 FUN_1000_ae6e,exported_ordinal_10 Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure; 1028:41f9:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:41fa 1028:4217 30 zero-fill verified semantic-object collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] zero-fill Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:4218 1028:424b 52 zero-fill verified semantic-object collision_record_175_prefix g_collision_record_175_prefix uint8_t[75] zero-fill Verified writer 1008:0138 and OBJECTS.tsv row 175; final eight bytes are separately shared with word-quad storage at 4263..426a.; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:424c 1028:424c 1 zero-fill verified semantic-object collision_record_175_prefix g_collision_record_175_prefix uint8_t[75] zero-fill exported_ordinal_10 FUN_1000_c79c,exported_ordinal_10 Verified writer 1008:0138 and OBJECTS.tsv row 175; final eight bytes are separately shared with word-quad storage at 4263..426a.; complete verified referring-function closure; 1028:424c:undefined1[1] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:424d 1028:4262 22 zero-fill verified semantic-object collision_record_175_prefix g_collision_record_175_prefix uint8_t[75] zero-fill Verified writer 1008:0138 and OBJECTS.tsv row 175; final eight bytes are separately shared with word-quad storage at 4263..426a.; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:4263 1028:430a 168 zero-fill verified semantic-object tdkpin_word_quads g_tdkpin_word_quads TdkpinWordQuad[21] zero-fill Twenty direct calls with exact constants; byte-complete zero-fill range and writer tests.; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:430b 1028:431a 16 zero-fill verified semantic-object sprite_bitmaps_400_407 g_sprite_bitmaps_400_407 HBITMAP16[8] zero-fill Verified writer/deletion and ID order; asset initializer/cleanup tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:431b 1028:431c 2 zero-fill verified semantic-object status_level_bitmaps g_status_level_bitmaps HBITMAP16[4] zero-fill FUN_1000_51f5 FUN_1000_5390 Complete writer/reader/deletion inventory in 1000:5390,1008:0b9e,1000:51f5; asset/status/cleanup tests; 1028:431b:undefined2[2]; complete verified referring-function closure Exact four HBITMAP slots, resource mapping, threshold-level mapping, primary 146x142 blit use, and ownership lifecycle are fully proven. +1028:431d 1028:431e 2 zero-fill verified semantic-object status_level_bitmaps g_status_level_bitmaps HBITMAP16[4] zero-fill FUN_1000_51f5 Complete writer/reader/deletion inventory in 1000:5390,1008:0b9e,1000:51f5; asset/status/cleanup tests; 1028:431d:undefined2[2]; complete verified referring-function closure Exact four HBITMAP slots, resource mapping, threshold-level mapping, primary 146x142 blit use, and ownership lifecycle are fully proven. +1028:431f 1028:4320 2 zero-fill verified semantic-object status_level_bitmaps g_status_level_bitmaps HBITMAP16[4] zero-fill Complete writer/reader/deletion inventory in 1000:5390,1008:0b9e,1000:51f5; asset/status/cleanup tests; complete verified referring-function closure Exact four HBITMAP slots, resource mapping, threshold-level mapping, primary 146x142 blit use, and ownership lifecycle are fully proven. +1028:4321 1028:4322 2 zero-fill verified semantic-object status_level_bitmaps g_status_level_bitmaps HBITMAP16[4] zero-fill FUN_1008_0b9e Complete writer/reader/deletion inventory in 1000:5390,1008:0b9e,1000:51f5; asset/status/cleanup tests; 1028:4321:undefined2[2]; complete verified referring-function closure Exact four HBITMAP slots, resource mapping, threshold-level mapping, primary 146x142 blit use, and ownership lifecycle are fully proven. +1028:4323 1028:4324 2 zero-fill verified semantic-object item_bitmaps_801_809 g_item_bitmaps_801_809 HBITMAP16[9] zero-fill FUN_1000_51f5 FUN_1000_5390 Verified writer/deletion and ID order; asset initializer/cleanup tests; complete verified referring-function closure; 1028:4323:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:4325 1028:4326 2 zero-fill verified semantic-object item_bitmaps_801_809 g_item_bitmaps_801_809 HBITMAP16[9] zero-fill FUN_1000_51f5 Verified writer/deletion and ID order; asset initializer/cleanup tests; complete verified referring-function closure; 1028:4325:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:4327 1028:4334 14 zero-fill verified semantic-object item_bitmaps_801_809 g_item_bitmaps_801_809 HBITMAP16[9] zero-fill Verified writer/deletion and ID order; asset initializer/cleanup tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:4335 1028:43bd 137 zero-fill verified semantic-object reserved_asset_to_wave_state g_reserved_asset_to_wave_state uint8_t[137] zero-fill Complete reference, relocation, and defined-data inventories contain no address in the range; complete verified referring-function closure Explicit unreferenced asset/sound reserve; all 137 bytes remain zero in-image. +1028:43be 1028:43e9 44 zero-fill verified semantic-object wave_output_capabilities wave_output_capabilities WAVEOUTCAPS16 zero-fill Windows 3.1 packed field offsets; call 1008:0fca-0fda; dwSupport read at 1008:0fe6-0ffe; strict size assertion and reconstructed/tests/test_sound.c; complete verified referring-function closure Exact Win16 layout is wMid, wPid, 16-bit driver version, 32-byte name, formats, channels, and support; WAVECAPS_VOLUME is bit 4 at offset 44. +1028:43ea 1028:43eb 2 zero-fill verified semantic-object wave_output_capabilities wave_output_capabilities WAVEOUTCAPS16 zero-fill FUN_1008_0f2e Windows 3.1 packed field offsets; call 1008:0fca-0fda; dwSupport read at 1008:0fe6-0ffe; strict size assertion and reconstructed/tests/test_sound.c; 1028:43ea:undefined2[2]; complete verified referring-function closure Exact Win16 layout is wMid, wPid, 16-bit driver version, 32-byte name, formats, channels, and support; WAVECAPS_VOLUME is bit 4 at offset 44. +1028:43ec 1028:43ed 2 zero-fill verified semantic-object wave_output_capabilities wave_output_capabilities WAVEOUTCAPS16 zero-fill FUN_1008_0f2e Windows 3.1 packed field offsets; call 1008:0fca-0fda; dwSupport read at 1008:0fe6-0ffe; strict size assertion and reconstructed/tests/test_sound.c; 1028:43ec:undefined2[2]; complete verified referring-function closure Exact Win16 layout is wMid, wPid, 16-bit driver version, 32-byte name, formats, channels, and support; WAVECAPS_VOLUME is bit 4 at offset 44. +1028:43ee 1028:43ef 2 zero-fill verified semantic-object wave_output_device_count wave_output_device_count uint16_t zero-fill FUN_1000_638e,FUN_1008_0f2e,FUN_1008_10e3,FUN_1008_1131,FUN_1008_118f FUN_1008_0f2e Complete verified lifecycle in 1008:0f2e,10e3,1131,118f and sound-toggle reader 1000:638e; reconstructed/tests/test_sound.c and test_key_release.c; 1028:43ee:undefined2[2]; complete verified referring-function closure The word is the actual device count, not a Boolean initialized flag; nonzero permits keyboard re-enabling after sound has been disabled. +1028:43f0 1028:43f1 2 zero-fill verified semantic-object wave_output_device_id wave_output_device_id uint16_t zero-fill FUN_1008_0f2e Reads before the sole waveOutGetDevCaps and waveOutGetVolume calls at 1008:0fca and 1008:1008; reconstructed/tests/test_sound.c; 1028:43f0:undefined2[2]; complete verified referring-function closure Selects wave-output device zero for both capability and volume queries. +1028:43f2 1028:43f2 1 zero-fill verified semantic-object sound_enabled sound_enabled uint8_t zero-fill FUN_1000_638e,FUN_1008_0002,FUN_1008_1131 FUN_1000_638e,FUN_1008_0f2e Complete verified readers/writers 1008:0002,0f2e,1131 and 1000:638e; sound and key-release tests; 1028:43f2:undefined1[1]; complete verified referring-function closure Exact Boolean enable lifecycle, playback gates, disable behavior, and device-gated re-enable behavior are fully proven. +1028:43f3 1028:43f3 1 zero-fill verified semantic-object sound_playing sound_playing uint8_t zero-fill FUN_1008_10e3,FUN_1008_1131,FUN_1008_118f FUN_1008_0f2e,FUN_1008_10e3,FUN_1008_1131 All reads/writes in verified 1008:0f2e, 10e3, 1131, and 118f; reconstructed/tests/test_sound.c; 1028:43f3:undefined1[1]; complete verified referring-function closure Exact current-playing flag, including stop-without-clear behavior in 118f and failure-to-play clear in 1131. +1028:43f4 1028:43f4 1 zero-fill verified semantic-object sound_volume_step sound_volume_step uint8_t zero-fill FUN_1008_0f2e Disassembly 1008:0fe6-102e; exact byte extraction/divide/multiply path; reconstructed/tests/test_sound.c; 1028:43f4:undefined1[1]; complete verified referring-function closure Written during successful initialization and otherwise retained; no in-image reader exists. +1028:43f5 1028:43f5 1 zero-fill verified semantic-object sound_state_padding sound_state_padding uint8_t zero-fill Byte lies between the verified one-byte volume state and aligned far-pointer array; complete reference inventory contains no reader or writer.; complete verified referring-function closure Explicit alignment/padding byte retained so the first sound pointer begins at 43f6. +1028:43f6 1028:43f7 2 zero-fill verified semantic-object sound_buffers sound_buffers Win16FarPtr[22] zero-fill FUN_1008_10e3 All indexed accesses in verified 1008:0f2e, 10e3, and 1131; exact one-based addressing and focused lifecycle tests in reconstructed/tests/test_sound.c; 1028:43f6:undefined2[2]; complete verified referring-function closure Exact 22 far-pointer slots, load overwrite behavior, inclusive release order, lack of pointer clearing, and play selection are represented. +1028:43f8 1028:43f9 2 zero-fill verified semantic-object sound_buffers sound_buffers Win16FarPtr[22] zero-fill FUN_1008_10e3 All indexed accesses in verified 1008:0f2e, 10e3, and 1131; exact one-based addressing and focused lifecycle tests in reconstructed/tests/test_sound.c; 1028:43f8:undefined2[2]; complete verified referring-function closure Exact 22 far-pointer slots, load overwrite behavior, inclusive release order, lack of pointer clearing, and play selection are represented. +1028:43fa 1028:43fb 2 zero-fill verified semantic-object sound_buffers sound_buffers Win16FarPtr[22] zero-fill FUN_1008_0f2e,FUN_1008_10e3 FUN_1008_0f2e All indexed accesses in verified 1008:0f2e, 10e3, and 1131; exact one-based addressing and focused lifecycle tests in reconstructed/tests/test_sound.c; 1028:43fa:undefined4[4]; complete verified referring-function closure Exact 22 far-pointer slots, load overwrite behavior, inclusive release order, lack of pointer clearing, and play selection are represented. +1028:43fc 1028:43fd 2 zero-fill verified semantic-object sound_buffers sound_buffers Win16FarPtr[22] zero-fill FUN_1008_10e3 FUN_1008_0f2e All indexed accesses in verified 1008:0f2e, 10e3, and 1131; exact one-based addressing and focused lifecycle tests in reconstructed/tests/test_sound.c; complete verified referring-function closure Exact 22 far-pointer slots, load overwrite behavior, inclusive release order, lack of pointer clearing, and play selection are represented. +1028:43fe 1028:444d 80 zero-fill verified semantic-object sound_buffers sound_buffers Win16FarPtr[22] zero-fill All indexed accesses in verified 1008:0f2e, 10e3, and 1131; exact one-based addressing and focused lifecycle tests in reconstructed/tests/test_sound.c; complete verified referring-function closure Exact 22 far-pointer slots, load overwrite behavior, inclusive release order, lack of pointer clearing, and play selection are represented. +1028:444e 1028:444f 2 zero-fill verified semantic-object tdkpin_palette_handle tdkpin_palette_handle HPALETTE16 zero-fill FUN_1000_5390,FUN_1000_59a0,FUN_1000_5a37,FUN_1000_5c13,FUN_1000_5f29,FUN_1000_5fc0,FUN_1000_616e,FUN_1000_6245,FUN_1000_62dc,FUN_1008_149d FUN_1008_11c5 Complete reader inventory spans rendering/window functions; verified writer and bitmap loader 1008:149d; reconstructed/tests/test_palette.c; complete verified referring-function closure; 1028:444e:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:4450 1028:474f 768 zero-fill verified semantic-object tdkpin_palette_rgb tdkpin_palette_rgb uint8_t[256][3] zero-fill All consumers verified: LOGPALETTE RGB projection 1008:11c5 and BITMAPINFO BGR0 projection 1008:13a8; reconstructed/tests/test_palette.c; complete verified referring-function closure Exact 768-byte RGB triplet table, resource provenance, copy extent, palette-entry projection, RGBQUAD channel reversal, and full read/write inventory are proven. +1028:4750 1028:4751 2 zero-fill verified semantic-object multimedia_procedures g_multimedia_procedures Win16FarPtr[11] zero-fill FUN_1010_01c2 FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; 1028:4750:undefined2[2]; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:4752 1028:4753 2 zero-fill verified semantic-object multimedia_procedures g_multimedia_procedures Win16FarPtr[11] zero-fill FUN_1010_01c2 FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; 1028:4752:undefined2[2]; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:4754 1028:4755 2 zero-fill verified semantic-object multimedia_procedures g_multimedia_procedures Win16FarPtr[11] zero-fill FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; 1028:4754:undefined2[2]; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:4756 1028:4757 2 zero-fill verified semantic-object multimedia_procedures g_multimedia_procedures Win16FarPtr[11] zero-fill FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; 1028:4756:undefined2[2]; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:4758 1028:4759 2 zero-fill verified semantic-object multimedia_procedures g_multimedia_procedures Win16FarPtr[11] zero-fill FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; 1028:4758:undefined2[2]; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:475a 1028:475b 2 zero-fill verified semantic-object multimedia_procedures g_multimedia_procedures Win16FarPtr[11] zero-fill FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; 1028:475a:undefined2[2]; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:475c 1028:475d 2 zero-fill verified semantic-object multimedia_procedures g_multimedia_procedures Win16FarPtr[11] zero-fill FUN_1010_01c2 FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; 1028:475c:undefined2[2]; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:475e 1028:475f 2 zero-fill verified semantic-object multimedia_procedures g_multimedia_procedures Win16FarPtr[11] zero-fill FUN_1010_01c2 FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; 1028:475e:undefined2[2]; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:4760 1028:4761 2 zero-fill verified semantic-object multimedia_procedures g_multimedia_procedures Win16FarPtr[11] zero-fill FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; 1028:4760:undefined2[2]; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:4762 1028:4763 2 zero-fill verified semantic-object multimedia_procedures g_multimedia_procedures Win16FarPtr[11] zero-fill FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; 1028:4762:undefined2[2]; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:4764 1028:4765 2 zero-fill verified semantic-object multimedia_procedures g_multimedia_procedures Win16FarPtr[11] zero-fill FUN_1010_01c2 FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; 1028:4764:undefined2[2]; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:4766 1028:4767 2 zero-fill verified semantic-object multimedia_procedures g_multimedia_procedures Win16FarPtr[11] zero-fill FUN_1010_01c2 FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; 1028:4766:undefined2[2]; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:4768 1028:4769 2 zero-fill verified semantic-object multimedia_procedures g_multimedia_procedures Win16FarPtr[11] zero-fill FUN_1010_01c2 FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; 1028:4768:undefined2[2]; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:476a 1028:476b 2 zero-fill verified semantic-object multimedia_procedures g_multimedia_procedures Win16FarPtr[11] zero-fill FUN_1010_01c2 FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; 1028:476a:undefined2[2]; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:476c 1028:476d 2 zero-fill verified semantic-object multimedia_procedures g_multimedia_procedures Win16FarPtr[11] zero-fill FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; 1028:476c:undefined2[2]; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:476e 1028:476f 2 zero-fill verified semantic-object multimedia_procedures g_multimedia_procedures Win16FarPtr[11] zero-fill FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; 1028:476e:undefined2[2]; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:4770 1028:4771 2 zero-fill verified semantic-object multimedia_procedures g_multimedia_procedures Win16FarPtr[11] zero-fill FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; 1028:4770:undefined2[2]; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:4772 1028:4773 2 zero-fill verified semantic-object multimedia_procedures g_multimedia_procedures Win16FarPtr[11] zero-fill FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; 1028:4772:undefined2[2]; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:4774 1028:4775 2 zero-fill verified semantic-object multimedia_procedures g_multimedia_procedures Win16FarPtr[11] zero-fill FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; 1028:4774:undefined2[2]; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:4776 1028:4777 2 zero-fill verified semantic-object multimedia_procedures g_multimedia_procedures Win16FarPtr[11] zero-fill FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; 1028:4776:undefined2[2]; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:4778 1028:4779 2 zero-fill verified semantic-object multimedia_procedures g_multimedia_procedures Win16FarPtr[11] zero-fill FUN_1010_0079 FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; 1028:4778:undefined2[2]; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:477a 1028:477b 2 zero-fill verified semantic-object multimedia_procedures g_multimedia_procedures Win16FarPtr[11] zero-fill FUN_1010_0079 FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; 1028:477a:undefined2[2]; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:477c 1028:477d 2 zero-fill verified semantic-object multimedia_version g_multimedia_version uint16_t zero-fill FUN_1010_01c2 FUN_1010_01c2 Verified loader version >=9 gate and version-8 cleanup test.; 1028:477c:undefined2[2]; complete verified referring-function closure Exact CTL3D compatibility version word. +1028:477e 1028:477e 1 zero-fill verified semantic-object multimedia_auto_subclassed g_multimedia_auto_subclassed uint8_t zero-fill FUN_1010_01c2,FUN_1010_0472 Verified modern success and legacy/disabled zero branches.; 1028:477e:undefined1[1]; complete verified referring-function closure Boolean records whether process auto-subclassing succeeded. +1028:477f 1028:477f 1 zero-fill verified semantic-object multimedia_argument_2 g_multimedia_argument_2 uint8_t zero-fill FUN_1010_01c2,FUN_1010_0472 Disassembly 1010:0373; focused export/loader test.; 1028:477f:undefined1[1]; complete verified referring-function closure Exact parameter publication order is second argument first. +1028:4780 1028:4780 1 zero-fill verified semantic-object multimedia_argument_1 g_multimedia_argument_1 uint8_t zero-fill FUN_1010_01c2,FUN_1010_0472 Disassembly 1010:0376; focused export/loader test.; 1028:4780:undefined1[1]; complete verified referring-function closure Exact parameter publication order is second argument then first. +1028:4781 1028:4782 2 zero-fill verified semantic-object multimedia_module g_multimedia_module HINSTANCE16 zero-fill FUN_1010_0002,FUN_1010_01c2 FUN_1010_01c2,FUN_1010_0472 Verified <32 error, modern/legacy load, failure unload, and explicit cleanup tests.; 1028:4781:undefined2[2]; complete verified referring-function closure Unaligned module handle; values below 32 are Win16 load errors rather than unloadable handles. +1028:4783 1028:4783 1 zero-fill verified semantic-object multimedia_pending g_multimedia_pending uint8_t zero-fill FUN_1010_03af,FUN_1010_0472 Verified stores in 1010:03af/0472 and multimedia tests.; 1028:4783:undefined1[1]; complete verified referring-function closure Exact transient pending byte; no reader exists in this image. +1028:4784 1028:4784 1 zero-fill verified semantic-object multimedia_initialized g_multimedia_initialized uint8_t zero-fill FUN_1010_0079,FUN_1010_01c2 FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Complete verified loader/finalizer/unload lifecycle and branch tests.; 1028:4784:undefined1[1]; complete verified referring-function closure Gates every dynamic helper use with exact boolean semantics. +1028:4785 1028:4789 5 zero-fill verified semantic-object multimedia_state_alignment g_multimedia_state_alignment uint8_t[5] zero-fill Complete zero-reader/zero-writer/zero-relocation inventory; complete verified referring-function closure Explicit five-byte multimedia state alignment/reserve. +1028:478a 1028:478a 1 zero-fill verified semantic-object multimedia_windows_version g_multimedia_windows_version uint16_t zero-fill FUN_1010_0472 FUN_1010_0472 Verified 3.0/3.10/4.0 major-minor branches and startup tests.; 1028:478a:undefined1[1]; complete verified referring-function closure Low-byte major, high-byte minor; upper GetVersion word is discarded. +1028:478b 1028:478b 1 zero-fill verified semantic-object multimedia_windows_version g_multimedia_windows_version uint16_t zero-fill FUN_1010_0472 Verified 3.0/3.10/4.0 major-minor branches and startup tests.; 1028:478b:undefined1[1]; complete verified referring-function closure Low-byte major, high-byte minor; upper GetVersion word is discarded. +1028:478c 1028:478c 1 zero-fill verified semantic-object multimedia_legacy_windows g_multimedia_legacy_windows uint8_t zero-fill FUN_1010_01c2 FUN_1010_0472 Verified writer and all loader branch consumers.; 1028:478c:undefined1[1]; complete verified referring-function closure Selects path probing, legacy procedure policy, and AutoSubclass suppression. +1028:478d 1028:47a1 21 zero-fill verified semantic-object multimedia_library_path g_multimedia_library_path char[21] zero-fill Verified unit writer, loader readers, all selection branches, and tests.; complete verified referring-function closure Exact 21-byte NUL-terminated selected DLL basename/path buffer. +1028:47a2 1028:47a3 2 zero-fill verified semantic-object multimedia_system_directory_length g_multimedia_system_directory_length uint16_t zero-fill FUN_1010_0472 FUN_1010_0472 Verified zero/nonzero path-probe gate and tests.; 1028:47a2:undefined2[2]; complete verified referring-function closure Exact length for adjacent system-directory buffer. +1028:47a4 1028:486b 200 zero-fill verified semantic-object multimedia_system_directory g_multimedia_system_directory char[200] zero-fill Verified two ShortString path constructions and maximum size.; complete verified referring-function closure Exact transient NUL-terminated system directory buffer. +1028:486c 1028:486c 1 zero-fill verified semantic-object multimedia_path_separator_486c g_multimedia_path_separator_486c uint8_t zero-fill Complete zero-reader/zero-writer/zero-relocation inventory; complete verified referring-function closure Explicit one-byte path-buffer separator. +1028:486d 1028:496c 256 zero-fill verified semantic-object multimedia_ctl3d_full_path g_multimedia_ctl3d_full_path uint8_t[256] zero-fill Verified ShortString helpers, file probe, and startup tests.; complete verified referring-function closure Exact Pascal ShortString classic DLL full path. +1028:496d 1028:4a6c 256 zero-fill verified semantic-object multimedia_ctl3dv2_full_path g_multimedia_ctl3dv2_full_path uint8_t[256] zero-fill Verified ShortString helpers, preferred file probe, and startup tests.; complete verified referring-function closure Exact Pascal ShortString V2 DLL full path. +1028:4a6d 1028:4a6d 1 zero-fill verified semantic-object tpwincrt_separator_4a6d g_tpwincrt_separator_4a6d uint8_t zero-fill Complete zero-reader/zero-writer/zero-relocation inventory; complete verified referring-function closure Explicit one-byte unit-state separator. +1028:4a6e 1028:4abd 80 zero-fill verified semantic-object tpwincrt_window_title g_tpwincrt_window_title char[80] zero-fill Verified unit initialization, CreateWindow title, ExitProc formatting, and lifecycle tests.; complete verified referring-function closure Exact TPWinCrt application caption buffer. +1028:4abe 1028:4abf 2 zero-fill verified semantic-object tpwincrt_saved_exit_proc g_tpwincrt_saved_exit_proc Win16FarPtr zero-fill FUN_1008_24a5 FUN_1008_2554 Verified predecessor save/restore ordering and lifecycle tests.; 1028:4abe:undefined2[2]; complete verified referring-function closure Exact mutable ExitProc chain link. +1028:4ac0 1028:4ac1 2 zero-fill verified semantic-object tpwincrt_saved_exit_proc g_tpwincrt_saved_exit_proc Win16FarPtr zero-fill FUN_1008_24a5 FUN_1008_2554 Verified predecessor save/restore ordering and lifecycle tests.; 1028:4ac0:undefined2[2]; complete verified referring-function closure Exact mutable ExitProc chain link. +1028:4ac2 1028:4ac3 2 zero-fill verified semantic-object tpwincrt_screen_buffer g_tpwincrt_screen_buffer Win16FarPtr zero-fill FUN_1008_19f8,FUN_1008_1d77,FUN_1008_21e2 FUN_1008_1d77 Verified allocation/fill, circular readers, free/clear lifecycle, and tests.; 1028:4ac2:undefined2[2]; complete verified referring-function closure Exact far pointer to columns*rows character cells. +1028:4ac4 1028:4ac5 2 zero-fill verified semantic-object tpwincrt_screen_buffer g_tpwincrt_screen_buffer Win16FarPtr zero-fill FUN_1008_21e2 FUN_1008_1d77 Verified allocation/fill, circular readers, free/clear lifecycle, and tests.; complete verified referring-function closure Exact far pointer to columns*rows character cells. +1028:4ac6 1028:4ac7 2 zero-fill verified semantic-object tpwincrt_view_metrics g_tpwincrt_view_metrics struct TpWinCrtViewMetrics zero-fill FUN_1008_19b7,FUN_1008_1f0c,FUN_1008_1f68 FUN_1008_1f68 All arithmetic, caret, paint, scroll, size, and initialization paths are verified.; 1028:4ac6:undefined2[2]; complete verified referring-function closure Seven exact uint16 fields: visible dimensions, max origins, character dimensions, and caret y offset. +1028:4ac8 1028:4ac9 2 zero-fill verified semantic-object tpwincrt_view_metrics g_tpwincrt_view_metrics struct TpWinCrtViewMetrics zero-fill FUN_1008_19b7,FUN_1008_1f0c,FUN_1008_1f68 FUN_1008_1f68 All arithmetic, caret, paint, scroll, size, and initialization paths are verified.; 1028:4ac8:undefined2[2]; complete verified referring-function closure Seven exact uint16 fields: visible dimensions, max origins, character dimensions, and caret y offset. +1028:4aca 1028:4acb 2 zero-fill verified semantic-object tpwincrt_view_metrics g_tpwincrt_view_metrics struct TpWinCrtViewMetrics zero-fill FUN_1008_1865,FUN_1008_18ee,FUN_1008_1f0c,FUN_1008_1f68 FUN_1008_1f68 All arithmetic, caret, paint, scroll, size, and initialization paths are verified.; 1028:4aca:undefined2[2]; complete verified referring-function closure Seven exact uint16 fields: visible dimensions, max origins, character dimensions, and caret y offset. +1028:4acc 1028:4acd 2 zero-fill verified semantic-object tpwincrt_view_metrics g_tpwincrt_view_metrics struct TpWinCrtViewMetrics zero-fill FUN_1008_1865,FUN_1008_18ee,FUN_1008_1f0c,FUN_1008_1f68 FUN_1008_1f68 All arithmetic, caret, paint, scroll, size, and initialization paths are verified.; 1028:4acc:undefined2[2]; complete verified referring-function closure Seven exact uint16 fields: visible dimensions, max origins, character dimensions, and caret y offset. +1028:4ace 1028:4acf 2 zero-fill verified semantic-object tpwincrt_view_metrics g_tpwincrt_view_metrics struct TpWinCrtViewMetrics zero-fill FUN_1008_1818,FUN_1008_18ee,FUN_1008_1a39,FUN_1008_1dcc,FUN_1008_1f68,FUN_1008_1fe8 FUN_1008_1fe8 All arithmetic, caret, paint, scroll, size, and initialization paths are verified.; 1028:4ace:undefined2[2]; complete verified referring-function closure Seven exact uint16 fields: visible dimensions, max origins, character dimensions, and caret y offset. +1028:4ad0 1028:4ad1 2 zero-fill verified semantic-object tpwincrt_view_metrics g_tpwincrt_view_metrics struct TpWinCrtViewMetrics zero-fill FUN_1008_1818,FUN_1008_18ee,FUN_1008_1a39,FUN_1008_1a82,FUN_1008_1dcc,FUN_1008_1f68,FUN_1008_1fe8 FUN_1008_1fe8 All arithmetic, caret, paint, scroll, size, and initialization paths are verified.; 1028:4ad0:undefined2[2]; complete verified referring-function closure Seven exact uint16 fields: visible dimensions, max origins, character dimensions, and caret y offset. +1028:4ad2 1028:4ad3 2 zero-fill verified semantic-object tpwincrt_view_metrics g_tpwincrt_view_metrics struct TpWinCrtViewMetrics zero-fill FUN_1008_1818 FUN_1008_1fe8 All arithmetic, caret, paint, scroll, size, and initialization paths are verified.; 1028:4ad2:undefined2[2]; complete verified referring-function closure Seven exact uint16 fields: visible dimensions, max origins, character dimensions, and caret y offset. +1028:4ad4 1028:4ad5 2 zero-fill verified semantic-object tpwincrt_paint_dc g_tpwincrt_paint_dc HDC16 zero-fill FUN_1008_1779,FUN_1008_17e2,FUN_1008_1a39,FUN_1008_1dcc,FUN_1008_1fe8 FUN_1008_1779 Verified 1008:1779/17e2 and paint/render consumers.; complete verified referring-function closure; 1028:4ad4:undefined2[2] Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:4ad6 1028:4ad9 4 zero-fill verified semantic-object tpwincrt_paint_struct g_tpwincrt_paint PAINTSTRUCT16 zero-fill Wine 11.15 PAINTSTRUCT16 layout; fixed pointer in 1008:1779/17e2; rcPaint reads in verified 1008:1dcc.; complete verified referring-function closure Exact HDC, erase flag, RECT16, restore/update flags, and 16 reserved bytes; extent ends immediately before saved font at 4af6. +1028:4ada 1028:4adb 2 zero-fill verified semantic-object tpwincrt_paint_struct g_tpwincrt_paint PAINTSTRUCT16 zero-fill FUN_1008_1dcc Wine 11.15 PAINTSTRUCT16 layout; fixed pointer in 1008:1779/17e2; rcPaint reads in verified 1008:1dcc.; 1028:4ada:undefined2[2]; complete verified referring-function closure Exact HDC, erase flag, RECT16, restore/update flags, and 16 reserved bytes; extent ends immediately before saved font at 4af6. +1028:4adc 1028:4add 2 zero-fill verified semantic-object tpwincrt_paint_struct g_tpwincrt_paint PAINTSTRUCT16 zero-fill FUN_1008_1dcc Wine 11.15 PAINTSTRUCT16 layout; fixed pointer in 1008:1779/17e2; rcPaint reads in verified 1008:1dcc.; 1028:4adc:undefined2[2]; complete verified referring-function closure Exact HDC, erase flag, RECT16, restore/update flags, and 16 reserved bytes; extent ends immediately before saved font at 4af6. +1028:4ade 1028:4adf 2 zero-fill verified semantic-object tpwincrt_paint_struct g_tpwincrt_paint PAINTSTRUCT16 zero-fill FUN_1008_1dcc Wine 11.15 PAINTSTRUCT16 layout; fixed pointer in 1008:1779/17e2; rcPaint reads in verified 1008:1dcc.; 1028:4ade:undefined2[2]; complete verified referring-function closure Exact HDC, erase flag, RECT16, restore/update flags, and 16 reserved bytes; extent ends immediately before saved font at 4af6. +1028:4ae0 1028:4ae1 2 zero-fill verified semantic-object tpwincrt_paint_struct g_tpwincrt_paint PAINTSTRUCT16 zero-fill FUN_1008_1dcc Wine 11.15 PAINTSTRUCT16 layout; fixed pointer in 1008:1779/17e2; rcPaint reads in verified 1008:1dcc.; 1028:4ae0:undefined2[2]; complete verified referring-function closure Exact HDC, erase flag, RECT16, restore/update flags, and 16 reserved bytes; extent ends immediately before saved font at 4af6. +1028:4ae2 1028:4af5 20 zero-fill verified semantic-object tpwincrt_paint_struct g_tpwincrt_paint PAINTSTRUCT16 zero-fill Wine 11.15 PAINTSTRUCT16 layout; fixed pointer in 1008:1779/17e2; rcPaint reads in verified 1008:1dcc.; complete verified referring-function closure Exact HDC, erase flag, RECT16, restore/update flags, and 16 reserved bytes; extent ends immediately before saved font at 4af6. +1028:4af6 1028:4af7 2 zero-fill verified semantic-object tpwincrt_previous_font g_tpwincrt_previous_font HGDIOBJ16 zero-fill FUN_1008_17e2 FUN_1008_1779 Verified paired stores/reads in 1008:1779 and 17e2.; 1028:4af6:undefined2[2]; complete verified referring-function closure Stock-font replacement is restored exactly before releasing the drawing context. +1028:4af8 1028:4af8 1 zero-fill verified semantic-object tpwincrt_input_buffer g_tpwincrt_input_buffer uint8_t[64] zero-fill FUN_1008_1c5f Verified append, signed-capacity suppression, blocking dequeue, overlapping shift, line editing, and focused tests.; 1028:4af8:undefined1[1]; complete verified referring-function closure Exact fixed 64-byte FIFO input queue. +1028:4af9 1028:4b37 63 zero-fill verified semantic-object tpwincrt_input_buffer g_tpwincrt_input_buffer uint8_t[64] zero-fill Verified append, signed-capacity suppression, blocking dequeue, overlapping shift, line editing, and focused tests.; complete verified referring-function closure Exact fixed 64-byte FIFO input queue. +1028:4b38 1028:4d37 512 zero-fill verified semantic-object tpwincrt_reserved_tail g_tpwincrt_reserved_tail uint8_t[512] zero-fill Complete reference, relocation, and defined-data inventories contain no address in the range; complete verified referring-function closure Explicit unreferenced TPWinCrt/unit reserve; all 512 bytes remain zero in-image. +1028:4d38 1028:4d39 2 zero-fill verified semantic-object borland_heap_request_bytes g_borland_heap_request_bytes uint16_t zero-fill FUN_1020_01ca FUN_1020_01ca Complete sole-function references; verified borland_try_get_mem source and heap core/path tests; 1028:4d38:undefined2[2]; complete verified referring-function closure Exact retry-stable uint16 request size, local/global threshold comparisons, and HeapError callback argument are fully represented. diff --git a/original/DATA_OBJECTS.tsv b/original/DATA_OBJECTS.tsv new file mode 100644 index 0000000..4411587 --- /dev/null +++ b/original/DATA_OBJECTS.tsv @@ -0,0 +1,220 @@ +start end status object_id object_name c_type initialization evidence notes +1028:0311 1028:0311 verified alignment_0311 g_alignment_0311 const uint8_t Static zero byte between independently terminated high-score strings. Exact binary byte; zero readers, writers, and relocations; complete verified referring-function closure Explicit one-byte string-table alignment/reserve. +1028:0335 1028:0335 verified alignment_0335 g_alignment_0335 const uint8_t Static zero byte between independently terminated high-score strings. Exact binary byte; zero readers, writers, and relocations; complete verified referring-function closure Explicit one-byte string-table alignment/reserve. +1028:0395 1028:0395 verified alignment_0395 g_alignment_0395 const uint8_t Static zero byte between the HighScore title and version-error text. Exact binary byte; zero readers, writers, and relocations; complete verified referring-function closure Explicit one-byte string-table alignment/reserve. +1028:0459 1028:0459 verified alignment_0459 g_alignment_0459 const uint8_t Static zero separator between WAV and pal resource-type strings. Exact binary byte; zero readers, writers, and relocations; complete verified referring-function closure Explicit one-byte resource-string separator. +1028:0561 1028:0561 verified alignment_0561 g_alignment_0561 const uint8_t Static zero before the packed WNDCLASS16 object. Exact binary byte; zero readers, writers, and relocations; complete verified referring-function closure Explicit one-byte WNDCLASS alignment. +1028:0585 1028:0585 verified alignment_0585 g_alignment_0585 const uint8_t Static zero between TPWinCrt class name and HWND state. Exact binary byte; zero readers, writers, and relocations; complete verified referring-function closure Explicit one-byte runtime-state alignment. +1028:066b 1028:066b verified alignment_066b g_alignment_066b const uint8_t Static zero between dialog template byte and thunk selector. Exact binary byte; zero readers, writers, and relocations; complete verified referring-function closure Explicit one-byte ObjectWindows alignment. +1028:068b 1028:068b verified alignment_068b g_alignment_068b const uint8_t Static zero between thunk opcode template and TurboWindow class string. Exact binary byte; zero readers, writers, and relocations; complete verified referring-function closure Explicit one-byte ObjectWindows separator. +1028:06f3 1028:06f3 verified alignment_06f3 g_alignment_06f3 const uint8_t Static zero between focus marker and heap-reserve size. Exact binary byte; zero readers, writers, and relocations; complete verified referring-function closure Explicit one-byte runtime alignment. +1028:06fb 1028:06fb verified alignment_06fb g_alignment_06fb const uint8_t Static zero between heap-reserve flags and WinMain instance words. Exact binary byte; zero readers, writers, and relocations; complete verified referring-function closure Explicit one-byte startup-state alignment. +1028:076c 1028:07be verified reserved_runtime_to_game_state g_reserved_runtime_to_game_state uint8_t[83] Zero-fill gap between the 36-byte application object and Windows-version/game-state globals. Complete reference, relocation, and defined-data inventories contain no address in the range; complete verified referring-function closure Explicit unreferenced runtime/game-state reserve; all 83 bytes remain zero in-image. +1028:07c3 1028:07c3 verified alignment_07c3 g_alignment_07c3 uint8_t Zero-fill byte between Windows-version dword and palette-update state. Complete zero-reader/zero-writer/zero-relocation inventory; complete verified referring-function closure Explicit one-byte game-state alignment. +1028:4335 1028:43bd verified reserved_asset_to_wave_state g_reserved_asset_to_wave_state uint8_t[137] Zero-fill gap between bitmap-handle tables and WAVEOUTCAPS16. Complete reference, relocation, and defined-data inventories contain no address in the range; complete verified referring-function closure Explicit unreferenced asset/sound reserve; all 137 bytes remain zero in-image. +1028:4785 1028:4789 verified multimedia_state_alignment g_multimedia_state_alignment uint8_t[5] Zero-fill gap between multimedia initialized byte and stored Windows version. Complete zero-reader/zero-writer/zero-relocation inventory; complete verified referring-function closure Explicit five-byte multimedia state alignment/reserve. +1028:486c 1028:486c verified multimedia_path_separator_486c g_multimedia_path_separator_486c uint8_t Zero-fill byte between 200-byte system-directory buffer and CTL3D full-path buffer. Complete zero-reader/zero-writer/zero-relocation inventory; complete verified referring-function closure Explicit one-byte path-buffer separator. +1028:4a6d 1028:4a6d verified tpwincrt_separator_4a6d g_tpwincrt_separator_4a6d uint8_t Zero-fill byte between CTL3DV2 full-path buffer and TPWinCrt title. Complete zero-reader/zero-writer/zero-relocation inventory; complete verified referring-function closure Explicit one-byte unit-state separator. +1028:4b38 1028:4d37 verified tpwincrt_reserved_tail g_tpwincrt_reserved_tail uint8_t[512] Zero-fill tail after the 64-byte TPWinCrt input queue and before Borland heap request state. Complete reference, relocation, and defined-data inventories contain no address in the range; complete verified referring-function closure Explicit unreferenced TPWinCrt/unit reserve; all 512 bytes remain zero in-image. +1028:0000 1028:000f verified compiler_data_prefix g_compiler_data_prefix const uint8_t[16] Static exact bytes 00 00 00 00 05 00 followed by ten zero bytes; no relocation or direct reference. Binary bytes plus complete zero-reader/zero-writer inventory; complete verified referring-function closure Explicit compiler/module data prefix retained byte-for-byte; no semantic consumer exists in the image. +1028:006c 1028:009d verified main_window_dynamic_dispatch g_main_window_dynamic_dispatch const uint8_t[50] Static 22-byte Borland dynamic-message descriptor followed by seven relocated far entry points. Exact bytes and relocations at 0082..009a to entry ordinals 8..14; all targets and dispatcher verified; complete verified referring-function closure Complete main-window dynamic dispatch descriptor, preserved separately from the VMT at 009e. +1028:009e 1028:00ed verified main_window_vmt g_main_window_vmt const uint8_t[80] Static TWindow-derived VMT header plus eighteen relocated far methods. Constructor uses VMT 009e; exact relocations 00a6..00ea; all method targets/window paths verified; complete verified referring-function closure Exact main game-window VMT extent from size/header through final virtual slot. +1028:00ee 1028:010d verified highscore_dynamic_dispatch g_highscore_dynamic_dispatch const uint8_t[32] Static 16-byte Borland dynamic-message descriptor followed by four relocated far entry points. Exact bytes and relocations 00fe..010a to entry ordinals 20..23; high-score window behavior verified; complete verified referring-function closure Complete dynamic dispatch descriptor paired with the verified high-score VMT at 010e. +1028:015e 1028:017d verified full_child_dynamic_dispatch g_full_child_dynamic_dispatch const uint8_t[32] Static 16-byte Borland dynamic-message descriptor followed by four relocated far entry points. Exact bytes and relocations 016e..017a to entry ordinals 29..32; full-child handlers verified; complete verified referring-function closure Complete dynamic dispatch descriptor for the full-size child/help window class. +1028:017e 1028:01cd verified full_child_window_vmt g_full_child_window_vmt const uint8_t[80] Static TWindow-derived VMT header plus eighteen relocated far methods. Constructors use VMT 017e; exact relocations 0186..01ca; all window targets verified; complete verified referring-function closure Exact full-child/help window VMT from object size/header through final paint/message slot. +1028:01ce 1028:0221 verified text_dialog_vmt g_text_dialog_vmt const uint8_t[84] Static dialog-derived VMT header plus nineteen relocated far methods. High-score editor constructs VMT 01ce; exact relocations 01d6..021e; dialog lifecycle verified; complete verified referring-function closure Exact modal text-dialog VMT including dialog-specific terminal slots 225 and 226. +1028:0470 1028:0521 verified ctl3d_procedure_name_table g_ctl3d_procedure_name_table const uint8_t[178] Eleven adjacent NUL-terminated CTL3D export names in exact GetProcAddress order. Binary string units; verified 1010:01c2 loader resolves slots zero through ten and tests assert every name; complete verified referring-function closure Exact symbol table from CTL3DAUTOSUBCLASS through CTL3DUNREGISTER; variable-length packed strings total 178 bytes. +1028:0522 1028:0537 verified ctl3d_library_names g_ctl3d_library_names const char[2][11] Adjacent NUL-terminated strings CTL3D.DLL and CTL3DV2.DLL. Binary bytes and verified modern/legacy CTL3D search/load paths; complete verified referring-function closure Exact primary and fallback helper DLL names, including both terminators. +1028:05c0 1028:05cb verified system_timer_vmt g_system_timer_vmt const uint8_t[12] Static six-byte object descriptor plus relocated destructor entry at 05c8. Setup constructs VMT 05c0; relocation to entry ordinal 129; verified SystemTimer lifecycle/tests; complete verified referring-function closure Exact six-byte timer object size, negative size/header fields, and destructor virtual slot. +1028:060a 1028:064d verified object_windows_application_dispatch g_object_windows_application_dispatch const uint8_t[68] Static 28-byte application dispatch descriptor followed by ten relocated far handlers. Exact bytes and relocations 0626..064a to entry ordinals 178,179,181..188; application dispatch/tests verified; complete verified referring-function closure Complete ObjectWindows application dynamic table retained with every target address-backed. +1028:065a 1028:0665 verified object_windows_default_procedures g_object_windows_default_procedures const Win16FarPtr[3] Loader-relocated USER procedure pointers for ordinals 107, 447, and 308. NE relocations 136..138 and verified ObjectWindows default window/MDI procedure forwarding; complete verified referring-function closure Exact three far import slots used as framework default procedure identities. +1028:06c5 1028:06f1 verified borland_unit_descriptor_table g_borland_unit_descriptor_table const uint8_t[45] Static Borland unit descriptor bytes followed by six relocated far initialization/finalization entries. Exact bytes and relocations 06da..06ee to entry ordinals 227..232; complete verified startup/ExitProc chain; complete verified referring-function closure Exact compiler-generated unit lifecycle table; all six targets and ordering are represented. +1028:07db 1028:07e2 verified predicted_ball_position_milli g_predicted_ball_position_milli int32_t[2] Zero-fill; each physics substep publishes current position plus velocity as predicted X/Y before broadphase. Complete verified readers/writers 1000:c79c and 1000:9b69; reconstructed/tdkpin_physics.c and focused physics tests; complete verified referring-function closure Exact X then Y signed dword extent, write order, trigger rewrite, and bounds use are fully represented. +1028:0869 1028:086a verified unused_setup_word_0869 g_unused_setup_word_0869 uint16_t Zero-fill and explicitly written zero by game setup; never read anywhere in the complete reference inventory. Sole write 1000:03ff in verified setup and zero-reader proof; complete verified referring-function closure Explicit retained word is initialized state, not silently omitted padding; it has no in-image consumer. +1028:0871 1028:0872 verified physics_substeps_per_tick g_physics_substeps_per_tick uint16_t Configured from the clamped speed setting and snapshotted by physics before the one-based substep loop. Verified setup speed table and 1000:c79c loop; game-setup and physics tests; complete verified referring-function closure Exact unsigned zero-through-configured substep semantics and zero-substep rendering behavior are fully represented. +1028:4d38 1028:4d39 verified borland_heap_request_bytes g_borland_heap_request_bytes uint16_t Zero-fill; 1020:01ca stores the current allocation request before local/global attempts and reuses it across HeapError retries. Complete sole-function references; verified borland_try_get_mem source and heap core/path tests; complete verified referring-function closure Exact retry-stable uint16 request size, local/global threshold comparisons, and HeapError callback argument are fully represented. +1028:07ca 1028:07ca verified claw_animation_active g_claw_animation_active uint8_t Zero-fill; setup clears it, collision logic arms it, and the timer clears it after the claw returns to frame ten with the primary bank selected. Complete references; full timer state machine in reconstructed/tdkpin_timer_tick.c and test_timer_tick.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07e3 1028:07ea verified ball_slot_x_positions_milli g_ball_slot_x_positions_milli int32_t[2] Zero-fill; indexed save/load transfers active ball X for slots zero and one. Verified 1000:c36b/c426 stride plus full timer promotion/copy paths; gameplay-helper and timer tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07eb 1028:07f2 verified ball_slot_y_positions_milli g_ball_slot_y_positions_milli int32_t[2] Zero-fill; indexed save/load transfers active ball Y for slots zero and one. Verified 1000:c36b/c426 stride plus full timer promotion/copy paths; focused tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0803 1028:080a verified ball_slot_auxiliary_state g_ball_slot_auxiliary_state int32_t[2] Zero-fill; indexed save/load mirrors receiver +0bca for slots zero and one. Verified 1000:c36b/c426 and full timer slot promotion; focused tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:080b 1028:0816 verified ball_slot_real48_state g_ball_slot_real48_state BorlandReal48[2] Zero-fill; indexed save/load mirrors receiver +0bce..0bd3 for slots zero and one. Verified six-byte stride in 1000:c36b/c426 and full timer promotion; focused tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:086d 1028:086e verified claw_current_frame g_claw_current_frame uint16_t Setup initializes ten; timer steps it toward the target and selects release state 1..9/18 or rest state ten. Complete setup/timer references, exact claw table and test_timer_tick.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:086f 1028:0870 verified claw_target_frame g_claw_target_frame uint16_t Setup initializes ten; collision logic selects a target and timer resets it to ten after releasing a ball. Complete references and full timer claw state machine; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0873 1028:0873 verified claw_alternate_bank g_claw_alternate_bank uint8_t Zero-fill; passed as the claw atlas bank while moving and cleared on release completion. Complete references, verified claw renderer and full timer tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0876 1028:0879 verified timer_tick_counter g_timer_tick_counter uint32_t Zero-fill; incremented after timer guards, drives intro quotient/remainder schedules, and resets when a new game is initialized. Setup and full 1000:eab1 disassembly/source; test_timer_tick.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:087a 1028:087d verified intro_marquee_counter g_intro_marquee_counter uint32_t Zero-fill; increments on each six-tick intro marquee redraw and selects phase modulo 49. Setup and full timer GDI path; test_timer_tick.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07c5 1028:07c5 verified collision_refresh_pending g_collision_refresh_pending uint8_t Zero-fill; setup clears it, adding a player sets it, and the next timer pass refreshes all 175 collision records before clearing it. Writes at 1000:03e0/6959/eb2c and timer read at 1000:eb0b; exact add-player branch in reconstructed/tdkpin_key_input.c and reconstructed/tests/test_key_release.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07cf 1028:07cf verified debug_keys_enabled g_debug_keys_enabled uint8_t Zero-fill and explicitly cleared on setup entry; no in-image writer enables it. Complete reference inventory: verified setup 1000:0270 and both debug branches in verified 1000:638e; reconstructed/tests/test_game_setup.c and test_key_release.c; complete verified referring-function closure Nonzero, possible only through external mutation, enables F2 target-rotation reset and F7 ball-position restore; normal execution leaves both paths dormant. +1028:07f3 1028:07fa verified ball_slot_velocity_x_milli g_ball_slot_velocity_x_milli int32_t[2] Zero-fill; indexed ball-slot save/load stores horizontal velocity for slots zero and one. Verified 1000:c36b/c426 slot stride and verified 1000:638e nudge updates; timer slot-one-to-zero transfer at 1000:f24d; gameplay-helper and key-release tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07fb 1028:0802 verified ball_slot_velocity_y_milli g_ball_slot_velocity_y_milli int32_t[2] Zero-fill; indexed ball-slot save/load stores vertical velocity for slots zero and one. Verified 1000:c36b/c426 slot stride, verified 1000:638e launch publication and space-nudge updates, timer slot-one-to-zero transfer at 1000:f25b; focused tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0260 1028:02a9 verified setup_low_memory_text g_setup_low_memory_text const char[74] Static NUL-terminated German insufficient-memory message. Binary bytes and sole verified MessageBox path in 1000:0270; reconstructed/tests/test_game_setup.c; complete verified referring-function closure Exact owner-zero low-memory text shown before window Close and RuntimeExit(0). +1028:02aa 1028:02c2 verified setup_dialog_caption g_setup_dialog_caption const char[25] "Static NUL-terminated ""TDK Pinball Machine 1.00""." Binary bytes and both verified setup MessageBox paths; reconstructed/tests/test_game_setup.c; complete verified referring-function closure Exact shared setup error caption. +1028:02c3 1028:02c6 verified setup_ini_suffix g_setup_ini_suffix const char[4] "Static NUL-terminated ""INI""." Binary bytes and verified parameter-string/extension replacement path in 1000:0270; complete verified referring-function closure Exact suffix appended after the executable-name dot. +1028:02c7 1028:02cf verified setup_ini_section g_setup_ini_section const char[9] "Static NUL-terminated ""Settings""." Binary bytes and both verified GetPrivateProfileInt call sites; complete verified referring-function closure Exact INI section shared by Language and Speed. +1028:02d0 1028:02d8 verified setup_ini_language_key g_setup_ini_language_key const char[9] "Static NUL-terminated ""Language""." Binary bytes and verified default/clamp path in 1000:0270; complete verified referring-function closure Returns 1..5; out-of-range values become one. +1028:02d9 1028:02de verified setup_ini_speed_key g_setup_ini_speed_key const char[6] "Static NUL-terminated ""Speed""." Binary bytes and verified default/clamp/timer mapping in 1000:0270; complete verified referring-function closure Returns 1..5; out-of-range values become three. +1028:02df 1028:02f3 verified setup_no_timer_text g_setup_no_timer_text const char[21] "Static ""No timer available!"" followed by two NUL bytes." Binary bytes and sole verified timer-construction failure MessageBox path; complete verified referring-function closure Exact HWND-owned error followed directly by RuntimeExit(0), without window Close. +1028:0306 1028:0310 verified help_window_title g_help_window_title const char[11] "Static NUL-terminated ""HelpScreen""." Binary bytes and sole verified full-child constructor use in 1000:6bf8; reconstructed/tests/test_key_input.c; complete verified referring-function closure Exact title of the F1-created help window. +1028:0010 1028:0013 verified highscore_xor_key g_highscore_xor_key const uint32_t Static bytes 49 57 49 4b, interpreted little-endian as 0x4b495749. Binary bytes; complete reader inventory 1000:a8ea/a99c; reconstructed/tdkpin_highscores.c; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact dword XOR key applied symmetrically to all ten serialized score values. +1028:0014 1028:0023 verified highscore_file_header g_highscore_file_header const uint8_t[16] "Static bytes ""TDK Highscores"" followed by two NUL bytes." Binary bytes; complete save/write and load/ShortString-compare paths 1000:a8ea/a99c; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact 16-byte authentication header; both NUL bytes participate in comparison and serialization. +1028:010e 1028:015d verified highscore_window_vmt g_highscore_window_vmt TdkpinHighscoreWindowVmt Static 0x45/-0x45 header, zero reserved dword, and eighteen loader-relocated far methods. Binary bytes; relocations 6:46-63; all method targets including paint 1000:5c13 verified; reconstructed/tdkpin_highscores.h; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact 80-byte TWindow-derived VMT from destructor +08 through paint +4c, with every slot named and address-backed. +1028:02f4 1028:02ff verified highscore_heading g_highscore_heading const char[12] "Static NUL-terminated ""HIGH SCORES""." Binary bytes; heading TextOut in verified 1000:5c13; reconstructed/tests/test_highscores.c; complete verified referring-function closure The terminal NUL at 02ff is also deliberately addressed as the empty rank-10 prefix. +1028:0300 1028:0305 verified highscore_rank_affixes g_highscore_rank_affixes const char[2][3] "Static consecutive C strings "" "" and "". ""." Binary bytes; rank construction in verified 1000:5c13; reconstructed/tests/test_highscores.c; complete verified referring-function closure Two leading spaces align ranks 1..9 with rank 10; dot-space follows every formatted rank. +1028:0312 1028:031f verified highscore_save_file_name g_highscore_save_file_name const char[14] "Static ""HiScores.Dat"" followed by two NUL bytes." Binary bytes; sole _lcreat argument at 1000:a8ee-a8f5; reconstructed/tests/test_highscores.c; complete verified referring-function closure First NUL terminates the KERNEL filename; the adjacent second NUL is retained in the exact object extent. +1028:0320 1028:032c verified highscore_load_file_name g_highscore_load_file_name const char[13] "Static NUL-terminated ""HiScores.Dat""." Binary bytes; both _lopen mode call sites at 1000:a9a4-a9c0; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact shared filename for the mode-0 and mode-0x40 open attempts. +1028:032d 1028:0334 verified highscore_default_name g_highscore_default_name const char[8] "Static NUL-terminated ""No Name""." Binary bytes; ten exact far-strcpy destinations in default path 1000:aaa2-ab33; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact fallback name copied independently into every 22-byte name slot. +1028:0336 1028:0348 verified highscore_edit_initial_name g_highscore_edit_initial_name const char[19] "Static NUL-terminated ""TDK Pinball Player""." Binary bytes; sole selected-slot far-strcpy in verified 1000:ab3c; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact initial editable name installed before the modal text dialog. +1028:0349 1028:0372 verified highscore_edit_caption g_highscore_edit_caption const char[42] Static NUL-terminated congratulations caption. Binary bytes; sole text-dialog caption argument in verified 1000:ab3c; reconstructed/tests/test_highscores.c; complete verified referring-function closure "Exact caption ""Congratulations! This is a Top Ten Score!""." +1028:0373 1028:038a verified highscore_edit_label g_highscore_edit_label const char[24] Static NUL-terminated input prompt. Binary bytes; sole text-dialog label argument in verified 1000:ab3c; reconstructed/tests/test_highscores.c; complete verified referring-function closure "Exact prompt ""Please input your name:""." +1028:038b 1028:0394 verified highscore_window_title g_highscore_window_title const char[10] "Static NUL-terminated ""HighScore""." Binary bytes; sole centered-child title argument in verified 1000:ab3c; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact title of the modeless high-score list window. +1028:07d2 1028:07d2 verified highscore_insert_index g_highscore_insert_index uint8_t Zero-fill; set to the one-based inserted slot by 1000:abe5 and consumed by 1000:ab3c. Verified insert/show lifecycle and complete reference inventory; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07d3 1028:07da verified ball_position_milli g_ball_position_milli int32_t[2] Zero-fill; reset to 325000/413000 by verified 1000:9e85 and updated throughout physics/gameplay. Verified reset, pixel projection 1000:9bca, bounds/dynamic-record and ball-slot helpers; complete reference inventory; reconstructed/tests/test_ball_render.c and test_gameplay_helpers.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:081f 1028:0828 verified player_marker_counts g_player_marker_counts int16_t[5] Zero-fill; indexed one-based by active player and initialized/updated by game-state paths. Verified six-marker projection in 1000:a604; complete indexed reference inventory; reconstructed/tests/test_gameplay_helpers.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0817 1028:081a verified player_ready_flags g_player_ready_flags uint8_t[4] Zero-fill; each configured one-based player slot is set to one by 1000:a72c. Verified initialization and exact extent in 1000:a72c; reconstructed/tests/test_player_state.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:081b 1028:081e verified player_item_group_flags g_player_item_group_flags uint8_t[4] Zero-fill; each configured one-based player slot is set to one after marker initialization. Verified initialization and exact extent in 1000:a72c; reconstructed/tests/test_player_state.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0829 1028:0838 verified player_marker_score_thresholds g_player_marker_score_thresholds int32_t[4] Zero-fill then initialized by startup/game setup; read one-based by score-award level. Verified indexed comparison in 1000:bc36 and exact boundary against marker counts/levels; reconstructed/tests/test_scoring.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0839 1028:0848 verified player_marker_levels g_player_marker_levels int32_t[4] Zero-fill; initialized to one for configured players and incremented when score thresholds are crossed. Verified initialization 1000:a72c and increment/limit logic 1000:bc36; player-state/scoring tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0992 1028:09a1 verified player_secondary_scores g_player_secondary_scores int32_t[4] Zero-fill; reset for configured players and multiplied for active-player display. Verified reset 1000:a72c and active redraw 1000:acc2; reconstructed/tests/test_player_state.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:09a2 1028:09a5 verified player_score_multipliers g_player_score_multipliers uint8_t[4] Zero-fill; initialized to one and used as unsigned byte factors for secondary-score display. Verified reset 1000:a72c and multiply 1000:acc2; reconstructed/tests/test_player_state.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:09a6 1028:09ad verified player_sprite_indices g_player_sprite_indices uint16_t[4] Zero-fill; reset to zero and consumed as indices into the 400-series sprite bitmap array. Verified reset 1000:a72c and active-player composite 1000:acc2/0002; player-state/player-sprite tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0874 1028:0874 verified score_double_active g_score_double_active uint8_t Zero-fill; cleared by player initialization, set by sprite effect 7, and doubles score deltas while nonzero. Verified lifecycle in 1000:a72c/bc36/c4e1; complete reference inventory; player-state/scoring tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0875 1028:0875 verified special_respawn_active g_special_respawn_active uint8_t Zero-fill; set only on the special collision-position respawn branch and cleared on normal ball end. Verified both writes in 1000:ae6e and complete reference inventory; reconstructed/tests/test_turn_state.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0855 1028:0858 verified target_rotation_state g_target_rotation_state int32_t Zero-fill; selects DAT600 frames 1..5 and the rotation/composite branch at values 6 and above. Verified full render/rotation consumer 1000:6f27 and complete reference inventory; reconstructed/tests/test_mechanism_render.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0851 1028:0854 verified panel_animation_frame g_panel_animation_frame int32_t Zero-fill; drives the nine-phase 1..281 panel animation and entry-frame sound events. Verified complete render consumer 1000:7440 and reset writer 1000:9e85; full reference inventory; reconstructed/tests/test_panel_animation.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07c7 1028:07c7 verified target_rotation_armed g_target_rotation_armed uint8_t Zero-fill; event flag 0400 clears the rotation state and sets this byte only while both rotation bytes are zero. Verified gate/writer in 1000:b476 and complete reference inventory; reconstructed/tests/test_collision_events.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07c8 1028:07c8 verified target_set_complete g_target_set_complete uint8_t Zero-fill; set when all five target record words are nonzero and suppresses rearming while set. Verified writer 1000:9e85, gate 1000:b476, and complete reference inventory; ball-render/collision-event tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:087e 1028:08a5 verified highscore_scores g_highscore_scores int32_t[10] Zero-fill; loaded/defaulted by 1000:a99c, reordered by 1000:abe5, rendered by 1000:5c13, and XOR-serialized by 1000:a8ea. Complete verified reader/writer inventory across 1000:5c13/a8ea/a99c/abe5; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact ten signed dwords, one-based addressing, persistence, ordering, comparison, and decimal rendering are fully proven. +1028:08a6 1028:0981 verified highscore_names g_highscore_names char[10][22] Zero-fill; directly read as 220 bytes or defaulted, shifted/edited by UI, rendered, and serialized. Complete verified lifecycle 1000:5c13/a8ea/a99c/ab3c/abe5; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact ten 22-byte slots, short-read behavior, defaulting, shift/edit, C-string display truncation, and persistence layout are fully proven. +1028:0024 1028:006b verified tdkpin_application_vmt g_tdkpin_application_vmt struct TdkpinApplicationVmt Static eight-byte VMT header followed by sixteen relocated far methods. Binary hash b6da1047d807ee6b4c7ba9aac27c80fa2c968c483abb80385a33e79d28ebe717; relocations 6:3-16; all method targets and program-entry VMT calls verified.; complete verified referring-function closure Size 0x12, negative size 0xffee, reserved zero dword, destructor +08, Idle +0c, InitApplication +10, InitInstance +14, Setup +18, Run +1c, MessageLoop +20, PreProcess +24, dialog/accelerator/MDI +28/+2c/+30, MakeWindow +34, ExecDialog +38, ValidateWindow +3c, Error +40, CanClose +44. +1028:0396 1028:03c7 verified tdkpin_version_error_text tdkpin_version_error_text const char[50] Static NUL-terminated minimum-version message. Binary bytes and verified indirect MessageBox path in ne_program_entry.; complete verified referring-function closure Exact text states that Windows 3.10 or higher is required. +1028:03c8 1028:03e0 verified tdkpin_version_dialog_title tdkpin_version_dialog_title const char[25] Static NUL-terminated application caption. Binary bytes and verified minimum-version MessageBox arguments.; complete verified referring-function closure "Exact caption ""TDK Pinball Machine 1.00""." +1028:03e1 1028:03e9 verified tdkpin_application_object_name tdkpin_application_object_name const char[9] "Static bytes ""Lbmpapp"" followed by two NUL bytes." Binary bytes and verified object_windows_application_construct name argument.; complete verified referring-function closure Exact ObjectWindows application object name extent. +1028:046a 1028:046f verified multimedia_path_environment_name multimedia_path_environment_name const char[6] "Static bytes ""PATH"" followed by two NUL bytes." Binary bytes and verified environment lookup in multimedia_locate_library.; complete verified referring-function closure Exact DOS environment variable name used for final CTL3D search-list fallback. +1028:06f2 1028:06f2 verified object_windows_focus_event_marker g_object_windows_focus_event_marker uint8_t Static value 1 and redundantly set to 1 by 1008:2c83. Complete reference inventory proves one writer and no readers; focused handler tests.; complete verified referring-function closure Exact write-only marker with no inferred role beyond its observed store. +1028:0652 1028:0655 verified win16_create_dialog_param g_win16_create_dialog_param Win16FarPtr NE loader relocation to USER ordinal 241. Verified sole modeless call, bound-thunk callback ledger, and dialog tests.; complete verified referring-function closure Exact far import pointer for CreateDialogParam16. +1028:0656 1028:0659 verified win16_dialog_box_param g_win16_dialog_box_param Win16FarPtr NE loader relocation to USER ordinal 239. Verified sole modal call, bound-thunk callback ledger, and dialog tests.; complete verified referring-function closure Exact far import pointer for DialogBoxParam16. +1028:066a 1028:066a verified dialog_alternate_template g_dialog_alternate_template uint8_t Static zero with no in-image writer. Verified sole reader and both synthetic branch cases.; complete verified referring-function closure Selects integer dialog template 7f02 normally or 7f05 when externally nonzero. +1028:0748 1028:076b verified tdkpin_application_object g_tdkpin_application_object uint8_t[36] Zero-fill static storage constructed in-place with VMT offset 0x0024. Verified application constructor, VMT Run/destructor calls, static dispose mode zero, and program-entry tests.; complete verified referring-function closure Exact process-lifetime ObjectWindows application instance. +1028:07bf 1028:07c2 verified tdkpin_windows_version g_tdkpin_windows_version uint32_t Full DX:AX return from GetVersion16. Verified 2.x, 3.9, 3.10, and 4.x branches and full-dword publication.; complete verified referring-function closure Low-byte major, next-byte minor; upper word retained but not used by threshold. +1028:07c9 1028:07c9 verified gameplay_transition_pending g_gameplay_transition_pending uint8_t Zero-fill; set by verified 1000:a70e and setup/input paths. Verified writer plus complete reference inventory.; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07d0 1028:07d0 verified player_count g_player_count uint8_t Zero-fill; configured during setup and cleared by verified 1000:a70e. Verified clear and complete loop/reference evidence.; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0849 1028:0850 verified collision_path_continuation g_collision_path_continuation int32_t[2] Zero-fill; updated after every accepted circle/segment and consumed by relative-mode records. Complete sole-function read/write inventory, exact 32-bit wrap, and branch tests.; complete verified referring-function closure X then Y continuation; circles retain point1 center, segments retain point2 endpoint. +1028:09ae 1028:4217 verified collision_records_1_174 g_collision_records_1_174 TdkpinCollisionRecord[174] Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:4218 1028:4262 verified collision_record_175_prefix g_collision_record_175_prefix uint8_t[75] Zero-fill; initialized as collision record 175. Verified writer 1008:0138 and OBJECTS.tsv row 175; final eight bytes are separately shared with word-quad storage at 4263..426a.; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:03ea 1028:0441 verified sound_resource_byte_counts g_sound_resource_byte_counts uint32_t[22] Static little-endian RIFF byte lengths for resource numbers 2001..2022; six absent resource IDs have zero entries. Binary bytes 1028:03ea-0441; WAV payload lengths in assets/decoded/audio; indexed reads at 1008:1038-1048 and 113f-114d; reconstructed/tdkpin_data.c; reconstructed/tests/test_sound.c; complete verified referring-function closure Exact 22-entry table and one-based address arithmetic are represented; play sound number zero deliberately reaches the preceding dword exactly as the binary does. +1028:0442 1028:0445 verified sound_ini_suffix sound_ini_suffix char[4] "Static NUL-terminated bytes ""INI""." Binary bytes; far strcat at 1008:1080-1090; reconstructed/tests/test_sound.c; complete verified referring-function closure Replaces the executable extension after the first dot found by the Borland ShortString Position call. +1028:0446 1028:044e verified sound_ini_section sound_ini_section char[9] "Static NUL-terminated bytes ""Settings""." Binary bytes; GetPrivateProfileInt16 call 1008:1095-10ac; reconstructed/tests/test_sound.c; complete verified referring-function closure Exact INI section far pointer. +1028:044f 1028:0454 verified sound_ini_key sound_ini_key char[6] "Static NUL-terminated bytes ""Sound""." Binary bytes; GetPrivateProfileInt16 call 1008:1095-10ac; reconstructed/tests/test_sound.c; complete verified referring-function closure Exact sound-enable INI key with default value one. +1028:0455 1028:0458 verified wave_resource_type wave_resource_type char[4] "Static NUL-terminated bytes ""WAV""." Binary bytes; FindResource16 type argument at 1008:105c-1066; reconstructed/tests/test_sound.c; complete verified referring-function closure Exact custom NE resource type used for resource numbers 2001..2022. +1028:045a 1028:045d verified palette_resource_type palette_resource_type char[4] "Static NUL-terminated bytes ""pal""." Binary bytes; verified FindResource16 type argument 1008:1337-1340; reconstructed/tests/test_palette.c; complete verified referring-function closure Exact lowercase custom NE resource type used to load palette resource 999. +1028:045e 1028:0461 verified bitmap_resource_type bitmap_resource_type char[4] "Static NUL-terminated bytes ""DAT""." Binary bytes; verified FindResource16 type argument 1008:14ae-14b7; reconstructed/tests/test_bitmap_loader.c; complete verified referring-function closure Exact uppercase custom NE resource type for bitmap/DIB resources. +1028:0462 1028:0469 verified display_dc_driver display_dc_driver char[8] "Static NUL-terminated bytes ""Display""." Binary bytes; sole CreateDC16 driver argument 1008:1537-154c; reconstructed/tests/test_bitmap_loader.c; complete verified referring-function closure Exact display-driver name; device, output, and initialization-data pointers are all null. +1028:07c6 1028:07c6 verified game_tilted game_tilted uint8_t Zero-filled; reset during game/ball setup and set after the nudge threshold is exceeded. Verified sound-dispatch gate 1008:0002; complete reference inventory identifies readers in key, collision, timer, and gameplay paths plus writers 1000:638e and 1000:9e85.; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0538 1028:053f verified tpwincrt_initial_placement g_tpwincrt_initial_placement INT16[4] Four static words 0x8000. Verified CreateWindow16 x/y/width/height arguments and lifecycle tests.; complete verified referring-function closure Exact CW_USEDEFAULT placement tuple. +1028:0540 1028:054b verified tpwincrt_text_geometry g_tpwincrt_text_geometry struct TpWinCrtTextGeometry Initialized to 80 columns, 25 rows, and zero cursor/view origins. All readers/writers verified, including text output, line advance, create/destroy, paint, resize, caret, and circular addressing tests.; complete verified referring-function closure Six exact uint16 values: columns, rows, cursor column/row, and viewport column/row. +1028:054c 1028:054f verified tpwincrt_inactive_format_pointer g_tpwincrt_inactive_format_pointer Win16FarPtr Relocated pointer to 1028:0550. DGROUP relocation and verified 1008:24a5 wvsprintf call.; complete verified referring-function closure Exact far pointer to the inactive-caption format. +1028:0550 1028:055d verified tpwincrt_inactive_format g_tpwincrt_inactive_format const char[14] "Static bytes for ""(Inactive %s)"" plus NUL." Binary bytes and verified ExitProc formatting tests.; complete verified referring-function closure Exact clean-shutdown caption template. +1028:055e 1028:055e verified tpwincrt_auto_scroll g_tpwincrt_auto_scroll uint8_t Static value 1. Verified final branch in 1008:1b11 and text-output tests.; complete verified referring-function closure Keeps the output cursor visible after each bulk write. +1028:055f 1028:055f verified tpwincrt_ctrl_z_is_eof g_tpwincrt_ctrl_z_is_eof uint8_t Static value 0. Verified Ctrl-Z line-termination branch and focused tests.; complete verified referring-function closure Optional DOS EOF semantics for TPWinCrt line input. +1028:0560 1028:0560 verified tpwincrt_break_check_enabled g_tpwincrt_break_check_enabled uint8_t Static value 1; cleared by the clean shutdown ExitProc. All Ctrl-C/create readers and the ExitProc writer are verified.; complete verified referring-function closure Exact active-runtime break-check lifecycle. +1028:0562 1028:057b verified wndclass_tpwincrt tpwincrt_window_class WNDCLASS16 Static style/zero fields plus runtime hInstance/icon/cursor stores in 1008:2554. Wine 11.15 WNDCLASS16 layout; DGROUP relocation 0564 -> entry ordinal 119; relocation 0578 -> 1028:057c; assembly 1008:255e-2593.; complete verified referring-function closure style=CS_VREDRAW|CS_HREDRAW; wndproc=1008:2219; no class/window extra bytes; application icon and arrow cursor; background brush COLOR_WINDOW+1; no menu; class name TPWinCrt. +1028:057c 1028:0584 verified tpwincrt_class_name tpwincrt_class_name char[9] Static initialized bytes 54 50 57 69 6e 43 72 74 00. Relocation 1028:0578 -> 1028:057c; RegisterClass16 path 1008:2554.; complete verified referring-function closure NUL-terminated TPWinCrt class name used by the verified WNDCLASS16 object. +1028:0586 1028:0587 verified tpwincrt_window_handle g_tpwincrt_window HWND16 Static zero; assigned from every 1008:2219 callback entry. Store at 1008:2230-2233 and all TPWinCrt USER call sites.; complete verified referring-function closure Process-wide TPWinCrt HWND used by painting, caret, scrolling, focus, and teardown paths. +1028:0588 1028:0589 verified tpwincrt_ring_row_origin g_tpwincrt_ring_row_origin uint16_t Static zero; advanced/wrapped at bottom-row line advance. Verified circular addressing and scrolling tests.; complete verified referring-function closure Exact circular physical-row origin. +1028:058a 1028:058b verified tpwincrt_input_count g_tpwincrt_input_count uint16_t Static zero; incremented by WM_CHAR and decremented by blocking dequeue. Verified enqueue, poll, wait, dequeue, shift, and overflow paths.; complete verified referring-function closure Exact signed-compared count for the 64-byte queue. +1028:058c 1028:058c verified tpwincrt_window_created g_tpwincrt_window_created uint8_t Static zero; set on create and cleared after destroy. Verified create/destroy and all lazy-window/scroll/shutdown gates.; complete verified referring-function closure Exact process-wide live-window Boolean. +1028:058d 1028:058d verified tpwincrt_has_focus g_tpwincrt_has_focus uint8_t Static zero; set/cleared only by verified 1008:21ba/21ce. Reads in verified caret and size paths; exact focus handlers at 1008:21ba and 21ce.; complete verified referring-function closure Boolean focus state with proven caret ordering. +1028:058e 1028:058e verified tpwincrt_caret_enabled g_tpwincrt_caret_enabled uint8_t Static zero; set only across a blocking input wait. Verified read/wait/focus/resize caret lifecycle.; complete verified referring-function closure Exact Boolean controlling focus-owned caret lifetime. +1028:058f 1028:058f verified tpwincrt_paint_message_active g_tpwincrt_paint_message_active uint8_t Static zero; set only around WM_PAINT drawing. Branch in verified 1008:1779/17e2; stores in 1008:1dcc.; complete verified referring-function closure Selects matched BeginPaint16/EndPaint16 instead of GetDC16/ReleaseDC16. +1028:0590 1028:05bf verified tpwincrt_key_bindings g_tpwincrt_key_bindings TpWinCrtKeyBinding[12] Static 48-byte table represented verbatim in reconstructed/tdkpin_data.c. Binary bytes 1028:0590-05bf; indexed loop disassembly 1008:2170-21b4.; complete verified referring-function closure Ordered bindings for Left/Right/Home/End/Up/Down/PageUp/PageDown with exact Ctrl requirement, horizontal/vertical axis, and Win16 scroll command. +1028:05cc 1028:0609 verified object_windows_base_message_table g_object_windows_base_message_table ObjectWindowsMessageTable9 Static parent/cache zero, count 9, ids 0115,0114,0111,0010,0002,0082,0006,0011,0014, and nine relocated far handlers. Binary bytes; relocations 1028:05e6-0606; verified resolver and focused message/command/scroll tests.; complete verified referring-function closure Exact 62-byte mutable-cache table layout represented in C; all nine handler functions and every id-to-address mapping are now verified. +1028:0222 1028:022b verified tdkpin_module_name tdkpin_module_name char[10] "Static NUL-terminated bytes ""FLIPPER3D""." Binary bytes; verified multimedia initialization call 1000:0100; path locator input tests.; complete verified referring-function closure Exact module-name far argument used while locating CTL3D relative to the executable. +1028:022c 1028:0244 verified tdkpin_application_title tdkpin_application_title char[25] "Static NUL-terminated bytes ""TDK Pinball Machine 1.00""." Binary bytes; verified MainWindow constructor and second-instance MessageBox frames.; complete verified referring-function closure Exact application/window title and refusal-dialog caption. +1028:0245 1028:025f verified tdkpin_already_running_text tdkpin_already_running_text char[27] "Static OEM/ANSI bytes ""Der Flipper läuft bereits!"" plus NUL." Binary bytes; verified second-instance MessageBox frame 1000:0144-015f.; complete verified referring-function closure Exact German already-running refusal text. +1028:064e 1028:0651 verified object_windows_application g_object_windows_application Win16FarPtr Static null; published by verified 1018:1a61 after root construction. Write at 1018:1a93-1a99; reads in application/window routing across Code1, Code2, and Code4; constructor lifecycle tested.; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:066c 1028:066d verified object_windows_thunk_code_selector g_object_windows_thunk_code_selector uint16_t Static zero; updated to each newly allocated thunk pool's executable selector. Disassembly 1018:01dc-02f9; reconstructed/tests/test_bound_thunks.c; complete verified referring-function closure Stored in the next pool's header before replacement and used as the current pool selector lifecycle marker. +1028:0666 1028:0669 verified win16_message_box g_win16_message_box Win16FarPtr NE loader relocation binds USER ordinal 1 at startup. Relocation record 139; all indirect readers inventoried; verified application-error call 1018:1f14 and focused test.; complete verified referring-function closure Process-wide far import pointer for MessageBox16; argument semantics at the reconstructed ObjectWindows call site are exact. +1028:066e 1028:0671 verified object_windows_free_thunk g_object_windows_free_thunk Win16FarPtr Static null; populated with 35 generated thunks per 256-byte pool. Disassembly 1018:01dc-0340; reconstructed/tests/test_bound_thunks.c; complete verified referring-function closure Exact LIFO head across pool construction, allocation, release, and reallocation; each free thunk stores the previous far head at +3. +1028:0672 1028:0675 verified object_windows_dispatch_proc g_object_windows_dispatch_proc Win16FarPtr Static null; assigned the MakeProcInstance16 result by 1018:1a61 and consumed by new thunk pools. Verified constructor write, thunk-pool copy/use, destructor FreeProcInstance, and focused application/thunk tests.; complete verified referring-function closure Shared procedure reached by every generated bound thunk; exact MakeProcInstance/FreeProcInstance ownership lifecycle is represented. +1028:0676 1028:0679 verified object_windows_creating_object g_object_windows_creating_object Win16FarPtr Published immediately before native creation and consumed by bootstrap WNDPROC 1018:018b. Verified writer 1018:134f, bootstrap reader/transition, exact extent, and creation tests.; complete verified referring-function closure Exact temporary object handoff until HWND-to-object thunk binding completes. +1028:067a 1028:067d verified object_windows_selector_property object_windows_selector_property_name char[4] Static initialized bytes 4f 57 31 00. TDKPIN.EXE data bytes; SetProp16 call at 1018:004a-0059.; complete verified referring-function closure NUL-terminated property name OW1; stores the bound object's selector. +1028:067e 1028:0681 verified object_windows_offset_property object_windows_offset_property_name char[4] Static initialized bytes 4f 57 32 00. TDKPIN.EXE data bytes; SetProp16 call at 1018:005a-0069.; complete verified referring-function closure NUL-terminated property name OW2; stores the bound object's offset. +1028:0682 1028:0685 verified object_windows_message_hook g_object_windows_message_hook Win16FarPtr Static null far pointer; the target image contains no writer. Complete Ghidra reference inventory: reads only at 1018:0127, 015f, and 08de; binary zero bytes; reconstructed/tests/test_message_dispatch.c; complete verified referring-function closure Optional generic ObjectWindows instrumentation hook. Normal TDKPIN execution always skips it because the selector word at 0684 remains zero; nonnull semantics are nevertheless reconstructed and branch-tested. +1028:0686 1028:068a verified object_windows_thunk_template object_windows_thunk_template uint8_t[5] Static bytes 5b 2e c4 1f ea copied to each generated code block at offset +2. Binary bytes; disassembly 1018:020e-0226; reconstructed/tests/test_bound_thunks.c; complete verified referring-function closure POP BX; CS:LES BX,[BX]; JMP FAR immediate template: consumes the CALL return address, loads the embedded bound object, and jumps through the shared dispatch procedure appended at +7. +1028:068c 1028:0697 verified object_windows_turbo_window_class_name object_windows_turbo_window_class_name char[12] "Static NUL-terminated bytes ""TurboWindow""." Binary bytes; four TWindow-derived VMTs select 1018:0d6a at +0x2c; focused far-pointer test.; complete verified referring-function closure Exact registered class-name provider for the shared ObjectWindows window implementation. +1028:0698 1028:06b2 verified object_windows_error_format object_windows_error_format char[27] "Static NUL-terminated bytes ""Error code = %d. Continue?""." Binary bytes and verified wvsprintf call at 1018:1f20-1f2c; reconstructed/tests/test_application_windows.c; complete verified referring-function closure Signed decimal application error prompt; the sole conversion consumes the caller's uint16 word as int16. +1028:06b3 1028:06c4 verified object_windows_error_caption object_windows_error_caption char[18] "Static NUL-terminated bytes ""Application Error""." Binary bytes and verified indirect MessageBox call at 1018:1f2f-1f3e.; complete verified referring-function closure Exact caption for the ObjectWindows application error prompt. +1028:06fc 1028:06fd verified win16_previous_instance g_win16_previous_instance HINSTANCE16 Initialized from the hPrevInstance startup word by 1020:0002. Startup write in 1020:0002; first-instance branch in verified 1018:1a61; reconstructed/tests/test_application.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:06fe 1028:06ff verified win16_instance g_win16_instance HINSTANCE16 Initialized from the current Win16 task instance by 1020:0002. 34 readers across resource/window/module paths; verified MakeProcInstance argument in 1018:1a61.; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0700 1028:0701 verified win16_show_command g_win16_show_command uint16_t Initialized from DX by Win16 startup 1020:0002. Startup write at 1020:0015; read by verified application initialization 1018:1b57; reconstructed/tests/test_application.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0702 1028:0705 verified borland_command_line g_borland_command_line Win16FarPtr Initialized exactly from startup ES:BX by verified 1020:0002. Verified startup capture and command-token scanner 1020:0871; reconstructed/tests/test_borland_startup.c; complete verified referring-function closure Exact far pointer to the NUL-terminated DOS command tail, including independent selector and wrapping offset semantics. +1028:0706 1028:0707 verified borland_heap_segment_head g_borland_heap_segment_head uint16_t Static zero; points to current selector in the circular local-heap segment ring. Reads/writes in 1020:0167, 0195, 023c, 026a, 02d7; reconstructed/tests/test_heap_core.c; reconstructed/tests/test_heap_paths.c; complete verified referring-function closure Circular insertion, successful-segment rotation, predecessor unlink, and final zeroing are represented and verified across one- and two-segment lifecycles. +1028:0708 1028:0709 verified borland_local_heap_limit g_borland_local_heap_limit uint16_t Static value 0x0400. Threshold branches in 1020:01ca; reconstructed/tests/test_heap_paths.c; complete verified referring-function closure Below-threshold local-first and above-threshold global-first paths, including fallback, are represented and branch-tested. +1028:070a 1028:070b verified borland_heap_segment_bytes g_borland_heap_segment_bytes uint16_t Static value 0x2000. Header/free-size construction and full-segment release tests.; complete verified referring-function closure Exact 8-KiB local heap segment allocation size. +1028:06f4 1028:06f5 verified borland_heap_reserve_size g_borland_heap_reserve_bytes uint16_t Static value 0x2000. Binary bytes and reads in 1008:2dff/2e22.; complete verified referring-function closure Configured 8-KiB emergency heap reserve size. +1028:06f6 1028:06f9 verified borland_heap_reserve g_borland_heap_reserve Win16FarPtr Static null; allocated by 2dff and cleared by 2e22. Verified null/allocation/free/clear lifecycle tests for 1008:2de0, 2dff, and 2e22.; complete verified referring-function closure Emergency allocation released on OOM so the allocator can retry; underlying allocator is tracked separately. +1028:06fa 1028:06fa verified borland_heap_reserve_disabled g_borland_heap_reserve_disabled uint8_t Static zero. Branch in 1008:2e22 and writers in runtime setup/teardown.; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:070c 1028:070d verified borland_global_alloc_flags g_borland_global_alloc_flags uint16_t Static value 2. Push at 1020:0222 and verified GlobalAlloc16 argument test.; complete verified referring-function closure Exact flags passed for Borland global heap blocks. +1028:070e 1028:0711 verified borland_heap_error_handler g_borland_heap_error_handler Win16FarPtr Set by 1008:2e76 relocation to 1008:2e22. Verified NE-segment binding to selector:2e22; indirect call at 1020:020c-0210.; complete verified referring-function closure Allocator callback returns 0 stop, 1 no retry, or 2 retry after emergency-reserve release. +1028:0712 1028:0715 verified borland_exit_proc g_borland_exit_proc Win16FarPtr Static zero; mutable ExitProc head. Reads/clears in 1020:00d2; writers throughout shutdown setup.; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0716 1028:0717 verified borland_exit_code g_borland_exit_code_word uint16_t Static zero; AX store on runtime-exit entry. Stores/reads in 1020:0061 and related runtime entries.; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0718 1028:071b verified borland_error_location g_borland_error_location struct BorlandErrorLocation Static zero; cleared by Halt and populated by run-error paths. Reads/writes in 1020:0002, 005d, 0061, and runtime error helpers.; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:071c 1028:071d verified borland_windows_mode g_borland_windows_mode uint16_t Initialized from startup ES by verified 1020:0002. Verified startup capture, termination consumer 1020:0061, and focused tests.; complete verified referring-function closure Exact Win16 selector-valued mode word; nonzero selects ExitProc execution and GUI error reporting. +1028:071e 1028:071f verified borland_io_result g_borland_io_result _Atomic uint16_t Static zero; 1020:0388 uses one locked-equivalent XCHG read-and-clear. Atomic exchange in verified 1020:0388; reads/writes in runtime I/O and ExitProc paths.; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0720 1028:0723 verified borland_random_seed g_borland_random_seed uint32_t Static zero; seeded from DOS time and advanced by the verified LCG. Reads/writes in 1020:14a4, 14c1, 14de, 1501, and 1539; multiplier 0x08088405 proved from assembly.; complete verified referring-function closure Exact modulo-2^32 Borland RandSeed state, stored low word then high word. +1028:0724 1028:0725 verified borland_huge_pointer_increment g_borland_huge_pointer_increment uint16_t Assigned the relocated KERNEL ordinal 114 equate __AHINCR by verified startup. Relocation 5:4 at 1020:0051; Wine 11.15 __AHINCR=8; reconstructed/tests/test_borland_startup.c; complete verified referring-function closure Exact selector increment used by Borland huge-pointer normalization; this import is runtime data, not a callable function. +1028:0726 1028:0726 verified borland_cpu_level g_borland_cpu_level uint8_t Set by verified startup from returned GetWinFlags AL. Verified startup branches and consumers 1020:08a9, 08e6, 098c, and 09af; arithmetic and startup tests.; complete verified referring-function closure Exact levels 0 for 086/186, 1 for 286, and 2 for 386-plus instruction selection. +1028:0727 1028:0727 verified borland_file_mode g_borland_file_mode uint8_t Static value 2. Binary byte; sole read by verified generic open entry 1020:06ab; focused DOS-open test.; complete verified referring-function closure Exact DOS AH=3d access mode passed for nonempty generic-file names. +1028:0728 1028:0747 verified borland_runtime_error_text g_borland_runtime_error_text char[32] Static string Runtime error 000 at 0000:0000. including NUL. TDKPIN.EXE bytes; fixed write endpoints 0739, 0741, 0746 in 1020:0061.; complete verified referring-function closure Mutable decimal error-code and uppercase hexadecimal segment/offset fields are written backward into fixed placeholders before MessageBox16. +1028:07c4 1028:07c4 verified palette_update_active g_palette_update_active uint8_t Zero-filled; reset by variant A wParam zero and set before synchronous invalidate/update in both verified handlers. All palette-message readers/writers 1000:58e7,5956,59a0,5a37 are verified; palette message tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07cb 1028:07cb verified scene_ready g_scene_ready uint8_t Zero-filled; set to one after verified scene redraw, score/status update, and DC release in 1000:5390. Verified writer 1000:5390; asset-initializer tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07cc 1028:07cc verified assets_pending g_assets_pending uint8_t Set during game initialization; nonzero selects the verified one-time asset-loading phase and is cleared at loading stage 34. Verified reader/clear in 1000:5390; asset-initializer tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07cd 1028:07ce verified board_index g_board_index uint16_t Zero-filled; selects DAT resource 1000+value in verified 1000:6129. Verified setup reader; reconstructed/tests/test_board_overlay.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07d1 1028:07d1 verified current_player g_current_player uint8_t Zero-filled; values 1..4 identify the active player and zero disables the status display. Verified gating/index use in 1008:0b9e; status tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0867 1028:0868 verified overlay_bitmap g_overlay_bitmap HBITMAP16 Zero-filled; assigned by verified DAT loaders 1000:5be5/6129 and deleted by verified destructors 5ba6/60e7 without clearing the slot. Complete verified setup/destructor, 616e 640x460 drawing, and 5c13 high-score source-region lifecycle; overlay and high-score tests; complete verified referring-function closure Exact global HBITMAP provenance, replacement, 32/204 high-score source, whole-overlay drawing, and ownership endpoints are fully proven. +1028:085b 1028:085c verified background_bitmap g_background_bitmap HBITMAP16 Zero-filled; assigned DAT 998 by verified asset initialization and selected by all verified low-level background blits. Verified writer and readers 1008:07b6,0837,08bb,093f,0996/1000:5390; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:085d 1028:085e verified background_overlay_b g_background_overlay_b HBITMAP16 Zero-filled; assigned DAT 998 by verified asset initialization and consumed only by verified restore variant B. Complete writer/reader inventory 1000:5390 and 1008:08bb; asset/render tests.; complete verified referring-function closure Exact overlay-B resource, publication, restore role, and DGROUP extent are fully proven. +1028:085f 1028:0860 verified background_overlay_a g_background_overlay_a HBITMAP16 Zero-filled; assigned DAT 997 by verified asset initialization and consumed only by verified restore variant A. Complete writer/reader inventory 1000:5390 and 1008:0837; asset/render tests.; complete verified referring-function closure Exact overlay-A resource, publication, restore role, and DGROUP extent are fully proven. +1028:0861 1028:0862 verified digit_sprite_bitmap g_digit_sprite_bitmap HBITMAP16 Zero-filled; assigned BITMAP resource 500 by verified asset initialization and consumed by verified score renderer. Complete writer/reader inventory 1000:5390 and 1008:0996; asset/score tests.; complete verified referring-function closure Exact HBITMAP slot, resource ID, 16-pixel horizontal digit stride, and 28x16 SRCAND use are fully proven. +1028:0859 1028:085a verified dat600_bitmap g_dat600_bitmap HBITMAP16 Zero-filled; assigned DAT resource 600 at loading stage 33 by verified asset initialization. Complete verified load/render/delete lifecycle 1000:5390,6f27,7440,51f5; mechanism and panel-animation tests; complete verified referring-function closure Exact DAT600 atlas provenance, 91-pixel target frames, panel-animation mask/image regions, publication, and ownership lifecycle are fully proven. +1028:0863 1028:0864 verified claw_sprite_bitmap g_claw_sprite_bitmap HBITMAP16 Zero-filled; assigned DAT resource 900 at loading stage 29 and deleted at asset shutdown. Complete writer/reader/deletion inventory 1000:5390,1008:0e08,1000:51f5; asset/claw/cleanup tests; complete verified referring-function closure Exact resource, atlas geometry, frame mapping, publication, rendering, and ownership lifecycle are fully proven. +1028:0865 1028:0866 verified board_decoration_bitmap g_board_decoration_bitmap HBITMAP16 Zero-filled; assigned DAT resource 901 at loading stage 32 and deleted during asset shutdown without clearing the slot. Complete verified lifecycle 1000:5390,638e,6b37,51f5; asset, key-release, gameplay-helper, and cleanup tests; complete verified referring-function closure Exact DAT901 provenance, launch-decoration and velocity-row atlas geometry, presentation, and ownership endpoint are fully proven. +1028:086b 1028:086c verified displayed_status_level g_displayed_status_level uint16_t Zero-filled; initialized/reset to 99 and assigned computed levels 0..4 by verified status renderer. All renderer reads/writes in 1008:0b9e verified; status tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0982 1028:0991 verified player_scores g_player_scores int32_t[4] Zero-filled; initialized/reset by game setup and updated by scoring paths. Verified one-based reader 1008:0996; score-render tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:431b 1028:4322 verified status_level_bitmaps g_status_level_bitmaps HBITMAP16[4] Zero-filled; DAT resources 701..704 are loaded one-based by verified asset initialization. Complete writer/reader/deletion inventory in 1000:5390,1008:0b9e,1000:51f5; asset/status/cleanup tests; complete verified referring-function closure Exact four HBITMAP slots, resource mapping, threshold-level mapping, primary 146x142 blit use, and ownership lifecycle are fully proven. +1028:430b 1028:431a verified sprite_bitmaps_400_407 g_sprite_bitmaps_400_407 HBITMAP16[8] Zero-filled; DAT resources 400..407 are loaded zero-based at stages 7..14 and deleted zero-based at shutdown. Verified writer/deletion and ID order; asset initializer/cleanup tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:4323 1028:4334 verified item_bitmaps_801_809 g_item_bitmaps_801_809 HBITMAP16[9] Zero-filled; DAT resources 801..809 are loaded and deleted one-based. Verified writer/deletion and ID order; asset initializer/cleanup tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:4263 1028:430a verified tdkpin_word_quads g_tdkpin_word_quads TdkpinWordQuad[21] Zero-filled table; setup 1000:0270 writes indices 1..20 through verified 1008:0787. Twenty direct calls with exact constants; byte-complete zero-fill range and writer tests.; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:43be 1028:43ed verified wave_output_capabilities wave_output_capabilities WAVEOUTCAPS16 Zero-filled 48-byte buffer populated by waveOutGetDevCaps for device zero. Windows 3.1 packed field offsets; call 1008:0fca-0fda; dwSupport read at 1008:0fe6-0ffe; strict size assertion and reconstructed/tests/test_sound.c; complete verified referring-function closure Exact Win16 layout is wMid, wPid, 16-bit driver version, 32-byte name, formats, channels, and support; WAVECAPS_VOLUME is bit 4 at offset 44. +1028:43ee 1028:43ef verified wave_output_device_count wave_output_device_count uint16_t Zero-filled; assigned from waveOutGetNumDevs and reset on entry or capability-query failure. Complete verified lifecycle in 1008:0f2e,10e3,1131,118f and sound-toggle reader 1000:638e; reconstructed/tests/test_sound.c and test_key_release.c; complete verified referring-function closure The word is the actual device count, not a Boolean initialized flag; nonzero permits keyboard re-enabling after sound has been disabled. +1028:43f0 1028:43f1 verified wave_output_device_id wave_output_device_id uint16_t Static zero and never written in the image. Reads before the sole waveOutGetDevCaps and waveOutGetVolume calls at 1008:0fca and 1008:1008; reconstructed/tests/test_sound.c; complete verified referring-function closure Selects wave-output device zero for both capability and volume queries. +1028:43f2 1028:43f2 verified sound_enabled sound_enabled uint8_t Zero-filled; cleared on every sound initialization entry, set after successful capability/resource setup, and toggled by F12 only when a device exists. Complete verified readers/writers 1008:0002,0f2e,1131 and 1000:638e; sound and key-release tests; complete verified referring-function closure Exact Boolean enable lifecycle, playback gates, disable behavior, and device-gated re-enable behavior are fully proven. +1028:43f3 1028:43f3 verified sound_playing sound_playing uint8_t Zero-filled; cleared by initialization/unload and assigned from sndPlaySound's BOOL16 result. All reads/writes in verified 1008:0f2e, 10e3, 1131, and 118f; reconstructed/tests/test_sound.c; complete verified referring-function closure Exact current-playing flag, including stop-without-clear behavior in 118f and failure-to-play clear in 1131. +1028:43f4 1028:43f4 verified sound_volume_step sound_volume_step uint8_t Zero-filled; set to ff when volume control is unsupported, otherwise the left-channel high byte rounded down to a multiple of ten. Disassembly 1008:0fe6-102e; exact byte extraction/divide/multiply path; reconstructed/tests/test_sound.c; complete verified referring-function closure Written during successful initialization and otherwise retained; no in-image reader exists. +1028:43f5 1028:43f5 verified sound_state_padding sound_state_padding uint8_t Zero-filled and never referenced directly. Byte lies between the verified one-byte volume state and aligned far-pointer array; complete reference inventory contains no reader or writer.; complete verified referring-function closure Explicit alignment/padding byte retained so the first sound pointer begins at 43f6. +1028:43f6 1028:444d verified sound_buffers sound_buffers Win16FarPtr[22] Zero-filled; sound setup stores locked global-memory blocks for resource numbers 2001..2022. All indexed accesses in verified 1008:0f2e, 10e3, and 1131; exact one-based addressing and focused lifecycle tests in reconstructed/tests/test_sound.c; complete verified referring-function closure Exact 22 far-pointer slots, load overwrite behavior, inclusive release order, lack of pointer clearing, and play selection are represented. +1028:444e 1028:444f verified tdkpin_palette_handle tdkpin_palette_handle HPALETTE16 Zero-filled; assigned the CreatePalette16 result by verified 1008:11c5. Complete reader inventory spans rendering/window functions; verified writer and bitmap loader 1008:149d; reconstructed/tests/test_palette.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:4450 1028:474f verified tdkpin_palette_rgb tdkpin_palette_rgb uint8_t[256][3] Zero-filled then overwritten byte-for-byte from custom PAL resource 999 by verified 1008:1326. All consumers verified: LOGPALETTE RGB projection 1008:11c5 and BITMAPINFO BGR0 projection 1008:13a8; reconstructed/tests/test_palette.c; complete verified referring-function closure Exact 768-byte RGB triplet table, resource provenance, copy extent, palette-entry projection, RGBQUAD channel reversal, and full read/write inventory are proven. +1028:4750 1028:477b verified multimedia_procedures g_multimedia_procedures Win16FarPtr[11] Static zero; populated in exact CTL3D name order by verified loader 1010:01c2. Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:477c 1028:477d verified multimedia_version g_multimedia_version uint16_t Static zero; assigned from CTL3DGETVER after successful registration. Verified loader version >=9 gate and version-8 cleanup test.; complete verified referring-function closure Exact CTL3D compatibility version word. +1028:477e 1028:477e verified multimedia_auto_subclassed g_multimedia_auto_subclassed uint8_t Static zero; set from CTL3DAUTOSUBCLASS only on modern/nonzero-request path. Verified modern success and legacy/disabled zero branches.; complete verified referring-function closure Boolean records whether process auto-subclassing succeeded. +1028:477f 1028:477f verified multimedia_argument_2 g_multimedia_argument_2 uint8_t Stored from loader second byte argument after full initialization. Disassembly 1010:0373; focused export/loader test.; complete verified referring-function closure Exact parameter publication order is second argument first. +1028:4780 1028:4780 verified multimedia_argument_1 g_multimedia_argument_1 uint8_t Stored from loader first byte argument after full initialization. Disassembly 1010:0376; focused export/loader test.; complete verified referring-function closure Exact parameter publication order is second argument then first. +1028:4781 1028:4782 verified multimedia_module g_multimedia_module HINSTANCE16 Static zero; assigned by LoadLibrary16 and retained after FreeLibrary16. Verified <32 error, modern/legacy load, failure unload, and explicit cleanup tests.; complete verified referring-function closure Unaligned module handle; values below 32 are Win16 load errors rather than unloadable handles. +1028:4783 1028:4783 verified multimedia_pending g_multimedia_pending uint8_t Static zero; cleared by unit startup and every exported initialization return. Verified stores in 1010:03af/0472 and multimedia tests.; complete verified referring-function closure Exact transient pending byte; no reader exists in this image. +1028:4784 1028:4784 verified multimedia_initialized g_multimedia_initialized uint8_t Static zero; set only after Register, GetVer >=9, and Enabled all succeed; cleared by cleanup. Complete verified loader/finalizer/unload lifecycle and branch tests.; complete verified referring-function closure Gates every dynamic helper use with exact boolean semantics. +1028:478a 1028:478b verified multimedia_windows_version g_multimedia_windows_version uint16_t Low word returned by GetVersion16 during unit startup. Verified 3.0/3.10/4.0 major-minor branches and startup tests.; complete verified referring-function closure Low-byte major, high-byte minor; upper GetVersion word is discarded. +1028:478c 1028:478c verified multimedia_legacy_windows g_multimedia_legacy_windows uint8_t Set exactly for Windows 3.0 through 3.9. Verified writer and all loader branch consumers.; complete verified referring-function closure Selects path probing, legacy procedure policy, and AutoSubclass suppression. +1028:478d 1028:47a1 verified multimedia_library_path g_multimedia_library_path char[21] Zero-fill; populated with CTL3DV2.DLL or CTL3D.DLL according to exact existence policy. Verified unit writer, loader readers, all selection branches, and tests.; complete verified referring-function closure Exact 21-byte NUL-terminated selected DLL basename/path buffer. +1028:47a2 1028:47a3 verified multimedia_system_directory_length g_multimedia_system_directory_length uint16_t Return from GetSystemDirectory16 with maximum 200. Verified zero/nonzero path-probe gate and tests.; complete verified referring-function closure Exact length for adjacent system-directory buffer. +1028:47a4 1028:486b verified multimedia_system_directory g_multimedia_system_directory char[200] Zero-fill; populated by GetSystemDirectory16 during unit startup. Verified two ShortString path constructions and maximum size.; complete verified referring-function closure Exact transient NUL-terminated system directory buffer. +1028:486d 1028:496c verified multimedia_ctl3d_full_path g_multimedia_ctl3d_full_path uint8_t[256] "Constructed as system directory + ""\\"" + CTL3D.DLL." Verified ShortString helpers, file probe, and startup tests.; complete verified referring-function closure Exact Pascal ShortString classic DLL full path. +1028:496d 1028:4a6c verified multimedia_ctl3dv2_full_path g_multimedia_ctl3dv2_full_path uint8_t[256] "Constructed as system directory + ""\\"" + CTL3DV2.DLL." Verified ShortString helpers, preferred file probe, and startup tests.; complete verified referring-function closure Exact Pascal ShortString V2 DLL full path. +1028:4a6e 1028:4abd verified tpwincrt_window_title g_tpwincrt_window_title char[80] Zero-fill; populated with the module filename and converted in-place OEM to ANSI. Verified unit initialization, CreateWindow title, ExitProc formatting, and lifecycle tests.; complete verified referring-function closure Exact TPWinCrt application caption buffer. +1028:4abe 1028:4ac1 verified tpwincrt_saved_exit_proc g_tpwincrt_saved_exit_proc Win16FarPtr Zero-fill; receives the prior Borland ExitProc. Verified predecessor save/restore ordering and lifecycle tests.; complete verified referring-function closure Exact mutable ExitProc chain link. +1028:4ac2 1028:4ac5 verified tpwincrt_screen_buffer g_tpwincrt_screen_buffer Win16FarPtr Static zero; allocated on WM_CREATE and released on WM_DESTROY. Verified allocation/fill, circular readers, free/clear lifecycle, and tests.; complete verified referring-function closure Exact far pointer to columns*rows character cells. +1028:4ac6 1028:4ad3 verified tpwincrt_view_metrics g_tpwincrt_view_metrics struct TpWinCrtViewMetrics Static zero; populated from client size/font metrics. All arithmetic, caret, paint, scroll, size, and initialization paths are verified.; complete verified referring-function closure Seven exact uint16 fields: visible dimensions, max origins, character dimensions, and caret y offset. +1028:4ad4 1028:4ad5 verified tpwincrt_paint_dc g_tpwincrt_paint_dc HDC16 Static zero; assigned by GetDC16 or BeginPaint16. Verified 1008:1779/17e2 and paint/render consumers.; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:4ad6 1028:4af5 verified tpwincrt_paint_struct g_tpwincrt_paint PAINTSTRUCT16 Zero-filled persistent structure populated by BeginPaint16. Wine 11.15 PAINTSTRUCT16 layout; fixed pointer in 1008:1779/17e2; rcPaint reads in verified 1008:1dcc.; complete verified referring-function closure Exact HDC, erase flag, RECT16, restore/update flags, and 16 reserved bytes; extent ends immediately before saved font at 4af6. +1028:4af6 1028:4af7 verified tpwincrt_previous_font g_tpwincrt_previous_font HGDIOBJ16 Static zero; receives SelectObject16 result. Verified paired stores/reads in 1008:1779 and 17e2.; complete verified referring-function closure Stock-font replacement is restored exactly before releasing the drawing context. +1028:4af8 1028:4b37 verified tpwincrt_input_buffer g_tpwincrt_input_buffer uint8_t[64] Zero-filled DGROUP storage. Verified append, signed-capacity suppression, blocking dequeue, overlapping shift, line editing, and focused tests.; complete verified referring-function closure Exact fixed 64-byte FIFO input queue. diff --git a/original/DATA_RECONSTRUCTION.tsv b/original/DATA_RECONSTRUCTION.tsv new file mode 100644 index 0000000..b410b75 --- /dev/null +++ b/original/DATA_RECONSTRUCTION.tsv @@ -0,0 +1,456 @@ +address status stage object_name type extent_start extent_end reads writes referring_functions initialization evidence notes +1028:0010 verified semantic-object-field g_highscore_xor_key const uint32_t 1028:0010 1028:0013 2 0 FUN_1000_a8ea,FUN_1000_a99c Static bytes 49 57 49 4b, interpreted little-endian as 0x4b495749. Binary bytes; complete reader inventory 1000:a8ea/a99c; reconstructed/tdkpin_highscores.c; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact dword XOR key applied symmetrically to all ten serialized score values. +1028:0012 verified semantic-object-field g_highscore_xor_key const uint32_t 1028:0010 1028:0013 2 0 FUN_1000_a8ea,FUN_1000_a99c Static bytes 49 57 49 4b, interpreted little-endian as 0x4b495749. Binary bytes; complete reader inventory 1000:a8ea/a99c; reconstructed/tdkpin_highscores.c; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact dword XOR key applied symmetrically to all ten serialized score values. +1028:03ea verified semantic-object-field g_sound_resource_byte_counts uint32_t[22] 1028:03ea 1028:0441 1 0 FUN_1008_0f2e Static little-endian RIFF byte lengths for resource numbers 2001..2022; six absent resource IDs have zero entries. Binary bytes 1028:03ea-0441; WAV payload lengths in assets/decoded/audio; indexed reads at 1008:1038-1048 and 113f-114d; reconstructed/tdkpin_data.c; reconstructed/tests/test_sound.c; complete verified referring-function closure Exact 22-entry table and one-based address arithmetic are represented; play sound number zero deliberately reaches the preceding dword exactly as the binary does. +1028:03ec verified semantic-object-field g_sound_resource_byte_counts uint32_t[22] 1028:03ea 1028:0441 1 0 FUN_1008_0f2e Static little-endian RIFF byte lengths for resource numbers 2001..2022; six absent resource IDs have zero entries. Binary bytes 1028:03ea-0441; WAV payload lengths in assets/decoded/audio; indexed reads at 1008:1038-1048 and 113f-114d; reconstructed/tdkpin_data.c; reconstructed/tests/test_sound.c; complete verified referring-function closure Exact 22-entry table and one-based address arithmetic are represented; play sound number zero deliberately reaches the preceding dword exactly as the binary does. +1028:03ee verified semantic-object-field g_sound_resource_byte_counts uint32_t[22] 1028:03ea 1028:0441 3 0 FUN_1008_0f2e Static little-endian RIFF byte lengths for resource numbers 2001..2022; six absent resource IDs have zero entries. Binary bytes 1028:03ea-0441; WAV payload lengths in assets/decoded/audio; indexed reads at 1008:1038-1048 and 113f-114d; reconstructed/tdkpin_data.c; reconstructed/tests/test_sound.c; complete verified referring-function closure Exact 22-entry table and one-based address arithmetic are represented; play sound number zero deliberately reaches the preceding dword exactly as the binary does. +1028:03f0 verified semantic-object-field g_sound_resource_byte_counts uint32_t[22] 1028:03ea 1028:0441 2 0 FUN_1008_0f2e Static little-endian RIFF byte lengths for resource numbers 2001..2022; six absent resource IDs have zero entries. Binary bytes 1028:03ea-0441; WAV payload lengths in assets/decoded/audio; indexed reads at 1008:1038-1048 and 113f-114d; reconstructed/tdkpin_data.c; reconstructed/tests/test_sound.c; complete verified referring-function closure Exact 22-entry table and one-based address arithmetic are represented; play sound number zero deliberately reaches the preceding dword exactly as the binary does. +1028:0538 verified semantic-object-field g_tpwincrt_initial_placement INT16[4] 1028:0538 1028:053f 1 0 FUN_1008_2442 Four static words 0x8000. Verified CreateWindow16 x/y/width/height arguments and lifecycle tests.; complete verified referring-function closure Exact CW_USEDEFAULT placement tuple. +1028:053a verified semantic-object-field g_tpwincrt_initial_placement INT16[4] 1028:0538 1028:053f 1 0 FUN_1008_2442 Four static words 0x8000. Verified CreateWindow16 x/y/width/height arguments and lifecycle tests.; complete verified referring-function closure Exact CW_USEDEFAULT placement tuple. +1028:053c verified semantic-object-field g_tpwincrt_initial_placement INT16[4] 1028:0538 1028:053f 1 0 FUN_1008_2442 Four static words 0x8000. Verified CreateWindow16 x/y/width/height arguments and lifecycle tests.; complete verified referring-function closure Exact CW_USEDEFAULT placement tuple. +1028:053e verified semantic-object-field g_tpwincrt_initial_placement INT16[4] 1028:0538 1028:053f 1 0 FUN_1008_2442 Four static words 0x8000. Verified CreateWindow16 x/y/width/height arguments and lifecycle tests.; complete verified referring-function closure Exact CW_USEDEFAULT placement tuple. +1028:0540 verified semantic-object-field g_tpwincrt_text_geometry struct TpWinCrtTextGeometry 1028:0540 1028:054b 9 0 FUN_1008_19f8,FUN_1008_1a82,FUN_1008_1b11,FUN_1008_1d77,FUN_1008_1dcc,FUN_1008_1f68,FUN_1008_1fe8,FUN_1008_21e2 Initialized to 80 columns, 25 rows, and zero cursor/view origins. All readers/writers verified, including text output, line advance, create/destroy, paint, resize, caret, and circular addressing tests.; complete verified referring-function closure Six exact uint16 values: columns, rows, cursor column/row, and viewport column/row. +1028:0542 verified semantic-object-field g_tpwincrt_text_geometry struct TpWinCrtTextGeometry 1028:0540 1028:054b 10 0 FUN_1008_19f8,FUN_1008_1a82,FUN_1008_1d77,FUN_1008_1dcc,FUN_1008_1f68,FUN_1008_1fe8,FUN_1008_21e2 Initialized to 80 columns, 25 rows, and zero cursor/view origins. All readers/writers verified, including text output, line advance, create/destroy, paint, resize, caret, and circular addressing tests.; complete verified referring-function closure Six exact uint16 values: columns, rows, cursor column/row, and viewport column/row. +1028:0544 verified semantic-object-field g_tpwincrt_text_geometry struct TpWinCrtTextGeometry 1028:0540 1028:054b 15 4 FUN_1008_1818,FUN_1008_19b7,FUN_1008_1a82,FUN_1008_1b11,FUN_1008_21e2 Initialized to 80 columns, 25 rows, and zero cursor/view origins. All readers/writers verified, including text output, line advance, create/destroy, paint, resize, caret, and circular addressing tests.; complete verified referring-function closure Six exact uint16 values: columns, rows, cursor column/row, and viewport column/row. +1028:0546 verified semantic-object-field g_tpwincrt_text_geometry struct TpWinCrtTextGeometry 1028:0540 1028:054b 11 3 FUN_1008_1818,FUN_1008_19b7,FUN_1008_1a39,FUN_1008_1a82,FUN_1008_1b11,FUN_1008_21e2 Initialized to 80 columns, 25 rows, and zero cursor/view origins. All readers/writers verified, including text output, line advance, create/destroy, paint, resize, caret, and circular addressing tests.; complete verified referring-function closure Six exact uint16 values: columns, rows, cursor column/row, and viewport column/row. +1028:0548 verified semantic-object-field g_tpwincrt_text_geometry struct TpWinCrtTextGeometry 1028:0540 1028:054b 12 3 FUN_1008_1818,FUN_1008_1865,FUN_1008_18ee,FUN_1008_19b7,FUN_1008_1a39,FUN_1008_1dcc,FUN_1008_1f0c,FUN_1008_1f68,FUN_1008_21e2 Initialized to 80 columns, 25 rows, and zero cursor/view origins. All readers/writers verified, including text output, line advance, create/destroy, paint, resize, caret, and circular addressing tests.; complete verified referring-function closure Six exact uint16 values: columns, rows, cursor column/row, and viewport column/row. +1028:054a verified semantic-object-field g_tpwincrt_text_geometry struct TpWinCrtTextGeometry 1028:0540 1028:054b 12 3 FUN_1008_1818,FUN_1008_1865,FUN_1008_18ee,FUN_1008_19b7,FUN_1008_1a39,FUN_1008_1dcc,FUN_1008_1f0c,FUN_1008_1f68,FUN_1008_21e2 Initialized to 80 columns, 25 rows, and zero cursor/view origins. All readers/writers verified, including text output, line advance, create/destroy, paint, resize, caret, and circular addressing tests.; complete verified referring-function closure Six exact uint16 values: columns, rows, cursor column/row, and viewport column/row. +1028:054c verified semantic-object-field g_tpwincrt_inactive_format_pointer Win16FarPtr 1028:054c 1028:054f 1 0 FUN_1008_24a5 Relocated pointer to 1028:0550. DGROUP relocation and verified 1008:24a5 wvsprintf call.; complete verified referring-function closure Exact far pointer to the inactive-caption format. +1028:054e verified semantic-object-field g_tpwincrt_inactive_format_pointer Win16FarPtr 1028:054c 1028:054f 1 0 FUN_1008_24a5 Relocated pointer to 1028:0550. DGROUP relocation and verified 1008:24a5 wvsprintf call.; complete verified referring-function closure Exact far pointer to the inactive-caption format. +1028:055e verified semantic-object-field g_tpwincrt_auto_scroll uint8_t 1028:055e 1028:055e 1 0 FUN_1008_1b11 Static value 1. Verified final branch in 1008:1b11 and text-output tests.; complete verified referring-function closure Keeps the output cursor visible after each bulk write. +1028:055f verified semantic-object-field g_tpwincrt_ctrl_z_is_eof uint8_t 1028:055f 1028:055f 1 0 FUN_1008_1cc6 Static value 0. Verified Ctrl-Z line-termination branch and focused tests.; complete verified referring-function closure Optional DOS EOF semantics for TPWinCrt line input. +1028:0560 verified semantic-object-field g_tpwincrt_break_check_enabled uint8_t 1028:0560 1028:0560 3 1 FUN_1008_1d77,FUN_1008_211a,FUN_1008_2147,FUN_1008_24a5 Static value 1; cleared by the clean shutdown ExitProc. All Ctrl-C/create readers and the ExitProc writer are verified.; complete verified referring-function closure Exact active-runtime break-check lifecycle. +1028:056c verified semantic-object-field tpwincrt_window_class WNDCLASS16 1028:0562 1028:057b 0 1 FUN_1008_2554 Static style/zero fields plus runtime hInstance/icon/cursor stores in 1008:2554. Wine 11.15 WNDCLASS16 layout; DGROUP relocation 0564 -> entry ordinal 119; relocation 0578 -> 1028:057c; assembly 1008:255e-2593.; complete verified referring-function closure style=CS_VREDRAW|CS_HREDRAW; wndproc=1008:2219; no class/window extra bytes; application icon and arrow cursor; background brush COLOR_WINDOW+1; no menu; class name TPWinCrt. +1028:056e verified semantic-object-field tpwincrt_window_class WNDCLASS16 1028:0562 1028:057b 0 1 FUN_1008_2554 Static style/zero fields plus runtime hInstance/icon/cursor stores in 1008:2554. Wine 11.15 WNDCLASS16 layout; DGROUP relocation 0564 -> entry ordinal 119; relocation 0578 -> 1028:057c; assembly 1008:255e-2593.; complete verified referring-function closure style=CS_VREDRAW|CS_HREDRAW; wndproc=1008:2219; no class/window extra bytes; application icon and arrow cursor; background brush COLOR_WINDOW+1; no menu; class name TPWinCrt. +1028:0570 verified semantic-object-field tpwincrt_window_class WNDCLASS16 1028:0562 1028:057b 0 1 FUN_1008_2554 Static style/zero fields plus runtime hInstance/icon/cursor stores in 1008:2554. Wine 11.15 WNDCLASS16 layout; DGROUP relocation 0564 -> entry ordinal 119; relocation 0578 -> 1028:057c; assembly 1008:255e-2593.; complete verified referring-function closure style=CS_VREDRAW|CS_HREDRAW; wndproc=1008:2219; no class/window extra bytes; application icon and arrow cursor; background brush COLOR_WINDOW+1; no menu; class name TPWinCrt. +1028:0572 verified semantic-object-field tpwincrt_window_class WNDCLASS16 1028:0562 1028:057b 0 1 FUN_1008_2554 Static style/zero fields plus runtime hInstance/icon/cursor stores in 1008:2554. Wine 11.15 WNDCLASS16 layout; DGROUP relocation 0564 -> entry ordinal 119; relocation 0578 -> 1028:057c; assembly 1008:255e-2593.; complete verified referring-function closure style=CS_VREDRAW|CS_HREDRAW; wndproc=1008:2219; no class/window extra bytes; application icon and arrow cursor; background brush COLOR_WINDOW+1; no menu; class name TPWinCrt. +1028:0578 verified semantic-object-field tpwincrt_window_class WNDCLASS16 1028:0562 1028:057b 1 0 FUN_1008_2442 Static style/zero fields plus runtime hInstance/icon/cursor stores in 1008:2554. Wine 11.15 WNDCLASS16 layout; DGROUP relocation 0564 -> entry ordinal 119; relocation 0578 -> 1028:057c; assembly 1008:255e-2593.; complete verified referring-function closure style=CS_VREDRAW|CS_HREDRAW; wndproc=1008:2219; no class/window extra bytes; application icon and arrow cursor; background brush COLOR_WINDOW+1; no menu; class name TPWinCrt. +1028:057a verified semantic-object-field tpwincrt_window_class WNDCLASS16 1028:0562 1028:057b 1 0 FUN_1008_2442 Static style/zero fields plus runtime hInstance/icon/cursor stores in 1008:2554. Wine 11.15 WNDCLASS16 layout; DGROUP relocation 0564 -> entry ordinal 119; relocation 0578 -> 1028:057c; assembly 1008:255e-2593.; complete verified referring-function closure style=CS_VREDRAW|CS_HREDRAW; wndproc=1008:2219; no class/window extra bytes; application icon and arrow cursor; background brush COLOR_WINDOW+1; no menu; class name TPWinCrt. +1028:0586 verified semantic-object-field g_tpwincrt_window HWND16 1028:0586 1028:0587 21 1 FUN_1008_1779,FUN_1008_17e2,FUN_1008_1818,FUN_1008_1865,FUN_1008_18ee,FUN_1008_1a82,FUN_1008_1d77,FUN_1008_2442,FUN_1008_24a5 Static zero; assigned from every 1008:2219 callback entry. Store at 1008:2230-2233 and all TPWinCrt USER call sites.; complete verified referring-function closure Process-wide TPWinCrt HWND used by painting, caret, scrolling, focus, and teardown paths. +1028:0588 verified semantic-object-field g_tpwincrt_ring_row_origin uint16_t 1028:0588 1028:0589 3 2 FUN_1008_19f8,FUN_1008_1a82 Static zero; advanced/wrapped at bottom-row line advance. Verified circular addressing and scrolling tests.; complete verified referring-function closure Exact circular physical-row origin. +1028:058a verified semantic-object-field g_tpwincrt_input_count uint16_t 1028:058a 1028:058b 6 2 FUN_1008_1c03,FUN_1008_1c5f,FUN_1008_211a Static zero; incremented by WM_CHAR and decremented by blocking dequeue. Verified enqueue, poll, wait, dequeue, shift, and overflow paths.; complete verified referring-function closure Exact signed-compared count for the 64-byte queue. +1028:058c verified semantic-object-field g_tpwincrt_window_created uint8_t 1028:058c 1028:058c 3 2 FUN_1008_18ee,FUN_1008_1d77,FUN_1008_21e2,FUN_1008_2442,FUN_1008_24a5 Static zero; set on create and cleared after destroy. Verified create/destroy and all lazy-window/scroll/shutdown gates.; complete verified referring-function closure Exact process-wide live-window Boolean. +1028:058d verified semantic-object-field g_tpwincrt_has_focus uint8_t 1028:058d 1028:058d 5 2 FUN_1008_18d0,FUN_1008_1c5f,FUN_1008_1f68,FUN_1008_21ba,FUN_1008_21ce Static zero; set/cleared only by verified 1008:21ba/21ce. Reads in verified caret and size paths; exact focus handlers at 1008:21ba and 21ce.; complete verified referring-function closure Boolean focus state with proven caret ordering. +1028:058e verified semantic-object-field g_tpwincrt_caret_enabled uint8_t 1028:058e 1028:058e 5 2 FUN_1008_18d0,FUN_1008_1c5f,FUN_1008_1f68,FUN_1008_21ba,FUN_1008_21ce Static zero; set only across a blocking input wait. Verified read/wait/focus/resize caret lifecycle.; complete verified referring-function closure Exact Boolean controlling focus-owned caret lifetime. +1028:058f verified semantic-object-field g_tpwincrt_paint_message_active uint8_t 1028:058f 1028:058f 2 2 FUN_1008_1779,FUN_1008_17e2,FUN_1008_1dcc Static zero; set only around WM_PAINT drawing. Branch in verified 1008:1779/17e2; stores in 1008:1dcc.; complete verified referring-function closure Selects matched BeginPaint16/EndPaint16 instead of GetDC16/ReleaseDC16. +1028:0590 verified semantic-object-field g_tpwincrt_key_bindings TpWinCrtKeyBinding[12] 1028:0590 1028:05bf 1 0 FUN_1008_2147 Static 48-byte table represented verbatim in reconstructed/tdkpin_data.c. Binary bytes 1028:0590-05bf; indexed loop disassembly 1008:2170-21b4.; complete verified referring-function closure Ordered bindings for Left/Right/Home/End/Up/Down/PageUp/PageDown with exact Ctrl requirement, horizontal/vertical axis, and Win16 scroll command. +1028:0591 verified semantic-object-field g_tpwincrt_key_bindings TpWinCrtKeyBinding[12] 1028:0590 1028:05bf 1 0 FUN_1008_2147 Static 48-byte table represented verbatim in reconstructed/tdkpin_data.c. Binary bytes 1028:0590-05bf; indexed loop disassembly 1008:2170-21b4.; complete verified referring-function closure Ordered bindings for Left/Right/Home/End/Up/Down/PageUp/PageDown with exact Ctrl requirement, horizontal/vertical axis, and Win16 scroll command. +1028:0592 verified semantic-object-field g_tpwincrt_key_bindings TpWinCrtKeyBinding[12] 1028:0590 1028:05bf 1 0 FUN_1008_2147 Static 48-byte table represented verbatim in reconstructed/tdkpin_data.c. Binary bytes 1028:0590-05bf; indexed loop disassembly 1008:2170-21b4.; complete verified referring-function closure Ordered bindings for Left/Right/Home/End/Up/Down/PageUp/PageDown with exact Ctrl requirement, horizontal/vertical axis, and Win16 scroll command. +1028:0593 verified semantic-object-field g_tpwincrt_key_bindings TpWinCrtKeyBinding[12] 1028:0590 1028:05bf 1 0 FUN_1008_2147 Static 48-byte table represented verbatim in reconstructed/tdkpin_data.c. Binary bytes 1028:0590-05bf; indexed loop disassembly 1008:2170-21b4.; complete verified referring-function closure Ordered bindings for Left/Right/Home/End/Up/Down/PageUp/PageDown with exact Ctrl requirement, horizontal/vertical axis, and Win16 scroll command. +1028:0594 verified semantic-object-field g_tpwincrt_key_bindings TpWinCrtKeyBinding[12] 1028:0590 1028:05bf 1 0 FUN_1008_2147 Static 48-byte table represented verbatim in reconstructed/tdkpin_data.c. Binary bytes 1028:0590-05bf; indexed loop disassembly 1008:2170-21b4.; complete verified referring-function closure Ordered bindings for Left/Right/Home/End/Up/Down/PageUp/PageDown with exact Ctrl requirement, horizontal/vertical axis, and Win16 scroll command. +1028:0595 verified semantic-object-field g_tpwincrt_key_bindings TpWinCrtKeyBinding[12] 1028:0590 1028:05bf 1 0 FUN_1008_2147 Static 48-byte table represented verbatim in reconstructed/tdkpin_data.c. Binary bytes 1028:0590-05bf; indexed loop disassembly 1008:2170-21b4.; complete verified referring-function closure Ordered bindings for Left/Right/Home/End/Up/Down/PageUp/PageDown with exact Ctrl requirement, horizontal/vertical axis, and Win16 scroll command. +1028:0596 verified semantic-object-field g_tpwincrt_key_bindings TpWinCrtKeyBinding[12] 1028:0590 1028:05bf 1 0 FUN_1008_2147 Static 48-byte table represented verbatim in reconstructed/tdkpin_data.c. Binary bytes 1028:0590-05bf; indexed loop disassembly 1008:2170-21b4.; complete verified referring-function closure Ordered bindings for Left/Right/Home/End/Up/Down/PageUp/PageDown with exact Ctrl requirement, horizontal/vertical axis, and Win16 scroll command. +1028:0597 verified semantic-object-field g_tpwincrt_key_bindings TpWinCrtKeyBinding[12] 1028:0590 1028:05bf 1 0 FUN_1008_2147 Static 48-byte table represented verbatim in reconstructed/tdkpin_data.c. Binary bytes 1028:0590-05bf; indexed loop disassembly 1008:2170-21b4.; complete verified referring-function closure Ordered bindings for Left/Right/Home/End/Up/Down/PageUp/PageDown with exact Ctrl requirement, horizontal/vertical axis, and Win16 scroll command. +1028:064e verified semantic-object-field g_object_windows_application Win16FarPtr 1028:064e 1028:0651 15 1 FUN_1000_6bf8,FUN_1000_ab3c,FUN_1008_2ae3,FUN_1008_2c1f,FUN_1018_0f38,FUN_1018_0f8d,FUN_1018_0ffd,FUN_1018_1054,FUN_1018_10aa,FUN_1018_1a61 Static null; published by verified 1018:1a61 after root construction. Write at 1018:1a93-1a99; reads in application/window routing across Code1, Code2, and Code4; constructor lifecycle tested.; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0650 verified semantic-object-field g_object_windows_application Win16FarPtr 1028:064e 1028:0651 0 1 FUN_1018_1a61 Static null; published by verified 1018:1a61 after root construction. Write at 1018:1a93-1a99; reads in application/window routing across Code1, Code2, and Code4; constructor lifecycle tested.; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0652 verified semantic-object-field g_win16_create_dialog_param Win16FarPtr 1028:0652 1028:0655 1 0 FUN_1008_2a45 NE loader relocation to USER ordinal 241. Verified sole modeless call, bound-thunk callback ledger, and dialog tests.; complete verified referring-function closure Exact far import pointer for CreateDialogParam16. +1028:0654 verified semantic-object-field g_win16_create_dialog_param Win16FarPtr 1028:0652 1028:0655 1 0 FUN_1008_2a45 NE loader relocation to USER ordinal 241. Verified sole modeless call, bound-thunk callback ledger, and dialog tests.; complete verified referring-function closure Exact far import pointer for CreateDialogParam16. +1028:0656 verified semantic-object-field g_win16_dialog_box_param Win16FarPtr 1028:0656 1028:0659 1 0 FUN_1008_2ae3 NE loader relocation to USER ordinal 239. Verified sole modal call, bound-thunk callback ledger, and dialog tests.; complete verified referring-function closure Exact far import pointer for DialogBoxParam16. +1028:0658 verified semantic-object-field g_win16_dialog_box_param Win16FarPtr 1028:0656 1028:0659 1 0 FUN_1008_2ae3 NE loader relocation to USER ordinal 239. Verified sole modal call, bound-thunk callback ledger, and dialog tests.; complete verified referring-function closure Exact far import pointer for DialogBoxParam16. +1028:0666 verified semantic-object-field g_win16_message_box Win16FarPtr 1028:0666 1028:0669 5 0 FUN_1000_0121,FUN_1000_0270,FUN_1018_1f14,ne_program_entry NE loader relocation binds USER ordinal 1 at startup. Relocation record 139; all indirect readers inventoried; verified application-error call 1018:1f14 and focused test.; complete verified referring-function closure Process-wide far import pointer for MessageBox16; argument semantics at the reconstructed ObjectWindows call site are exact. +1028:0668 verified semantic-object-field g_win16_message_box Win16FarPtr 1028:0666 1028:0669 5 0 FUN_1000_0121,FUN_1000_0270,FUN_1018_1f14,ne_program_entry NE loader relocation binds USER ordinal 1 at startup. Relocation record 139; all indirect readers inventoried; verified application-error call 1018:1f14 and focused test.; complete verified referring-function closure Process-wide far import pointer for MessageBox16; argument semantics at the reconstructed ObjectWindows call site are exact. +1028:066a verified semantic-object-field g_dialog_alternate_template uint8_t 1028:066a 1028:066a 1 0 FUN_1008_1607 Static zero with no in-image writer. Verified sole reader and both synthetic branch cases.; complete verified referring-function closure Selects integer dialog template 7f02 normally or 7f05 when externally nonzero. +1028:066c verified semantic-object-field g_object_windows_thunk_code_selector uint16_t 1028:066c 1028:066d 1 1 FUN_1018_01dc Static zero; updated to each newly allocated thunk pool's executable selector. Disassembly 1018:01dc-02f9; reconstructed/tests/test_bound_thunks.c; complete verified referring-function closure Stored in the next pool's header before replacement and used as the current pool selector lifecycle marker. +1028:066e verified semantic-object-field g_object_windows_free_thunk Win16FarPtr 1028:066e 1028:0671 5 3 FUN_1018_01dc,FUN_1018_02fa Static null; populated with 35 generated thunks per 256-byte pool. Disassembly 1018:01dc-0340; reconstructed/tests/test_bound_thunks.c; complete verified referring-function closure Exact LIFO head across pool construction, allocation, release, and reallocation; each free thunk stores the previous far head at +3. +1028:0670 verified semantic-object-field g_object_windows_free_thunk Win16FarPtr 1028:066e 1028:0671 5 3 FUN_1018_01dc,FUN_1018_02fa Static null; populated with 35 generated thunks per 256-byte pool. Disassembly 1018:01dc-0340; reconstructed/tests/test_bound_thunks.c; complete verified referring-function closure Exact LIFO head across pool construction, allocation, release, and reallocation; each free thunk stores the previous far head at +3. +1028:0672 verified semantic-object-field g_object_windows_dispatch_proc Win16FarPtr 1028:0672 1028:0675 2 1 FUN_1018_01dc,FUN_1018_1a61,FUN_1018_1b08 Static null; assigned the MakeProcInstance16 result by 1018:1a61 and consumed by new thunk pools. Verified constructor write, thunk-pool copy/use, destructor FreeProcInstance, and focused application/thunk tests.; complete verified referring-function closure Shared procedure reached by every generated bound thunk; exact MakeProcInstance/FreeProcInstance ownership lifecycle is represented. +1028:0674 verified semantic-object-field g_object_windows_dispatch_proc Win16FarPtr 1028:0672 1028:0675 2 1 FUN_1018_01dc,FUN_1018_1a61,FUN_1018_1b08 Static null; assigned the MakeProcInstance16 result by 1018:1a61 and consumed by new thunk pools. Verified constructor write, thunk-pool copy/use, destructor FreeProcInstance, and focused application/thunk tests.; complete verified referring-function closure Shared procedure reached by every generated bound thunk; exact MakeProcInstance/FreeProcInstance ownership lifecycle is represented. +1028:0676 verified semantic-object-field g_object_windows_creating_object Win16FarPtr 1028:0676 1028:0679 0 1 FUN_1018_134f Published immediately before native creation and consumed by bootstrap WNDPROC 1018:018b. Verified writer 1018:134f, bootstrap reader/transition, exact extent, and creation tests.; complete verified referring-function closure Exact temporary object handoff until HWND-to-object thunk binding completes. +1028:0678 verified semantic-object-field g_object_windows_creating_object Win16FarPtr 1028:0676 1028:0679 0 1 FUN_1018_134f Published immediately before native creation and consumed by bootstrap WNDPROC 1018:018b. Verified writer 1018:134f, bootstrap reader/transition, exact extent, and creation tests.; complete verified referring-function closure Exact temporary object handoff until HWND-to-object thunk binding completes. +1028:0682 verified semantic-object-field g_object_windows_message_hook Win16FarPtr 1028:0682 1028:0685 1 0 FUN_1018_0103 Static null far pointer; the target image contains no writer. Complete Ghidra reference inventory: reads only at 1018:0127, 015f, and 08de; binary zero bytes; reconstructed/tests/test_message_dispatch.c; complete verified referring-function closure Optional generic ObjectWindows instrumentation hook. Normal TDKPIN execution always skips it because the selector word at 0684 remains zero; nonnull semantics are nevertheless reconstructed and branch-tested. +1028:0684 verified semantic-object-field g_object_windows_message_hook Win16FarPtr 1028:0682 1028:0685 2 0 FUN_1018_0103,FUN_1018_08c3 Static null far pointer; the target image contains no writer. Complete Ghidra reference inventory: reads only at 1018:0127, 015f, and 08de; binary zero bytes; reconstructed/tests/test_message_dispatch.c; complete verified referring-function closure Optional generic ObjectWindows instrumentation hook. Normal TDKPIN execution always skips it because the selector word at 0684 remains zero; nonnull semantics are nevertheless reconstructed and branch-tested. +1028:06f2 verified semantic-object-field g_object_windows_focus_event_marker uint8_t 1028:06f2 1028:06f2 0 1 FUN_1008_2c83 Static value 1 and redundantly set to 1 by 1008:2c83. Complete reference inventory proves one writer and no readers; focused handler tests.; complete verified referring-function closure Exact write-only marker with no inferred role beyond its observed store. +1028:06f4 verified semantic-object-field g_borland_heap_reserve_bytes uint16_t 1028:06f4 1028:06f5 2 0 FUN_1008_2dff,FUN_1008_2e22 Static value 0x2000. Binary bytes and reads in 1008:2dff/2e22.; complete verified referring-function closure Configured 8-KiB emergency heap reserve size. +1028:06f6 verified semantic-object-field g_borland_heap_reserve Win16FarPtr 1028:06f6 1028:06f9 2 2 FUN_1008_2de0,FUN_1008_2dff,FUN_1008_2e22 Static null; allocated by 2dff and cleared by 2e22. Verified null/allocation/free/clear lifecycle tests for 1008:2de0, 2dff, and 2e22.; complete verified referring-function closure Emergency allocation released on OOM so the allocator can retry; underlying allocator is tracked separately. +1028:06f8 verified semantic-object-field g_borland_heap_reserve Win16FarPtr 1028:06f6 1028:06f9 2 2 FUN_1008_2de0,FUN_1008_2dff,FUN_1008_2e22 Static null; allocated by 2dff and cleared by 2e22. Verified null/allocation/free/clear lifecycle tests for 1008:2de0, 2dff, and 2e22.; complete verified referring-function closure Emergency allocation released on OOM so the allocator can retry; underlying allocator is tracked separately. +1028:06fa verified semantic-object-field g_borland_heap_reserve_disabled uint8_t 1028:06fa 1028:06fa 1 0 FUN_1008_2e22 Static zero. Branch in 1008:2e22 and writers in runtime setup/teardown.; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:06fc verified semantic-object-field g_win16_previous_instance HINSTANCE16 1028:06fc 1028:06fd 3 1 FUN_1000_0121,FUN_1008_2554,FUN_1018_1a61,FUN_1020_0002 Initialized from the hPrevInstance startup word by 1020:0002. Startup write in 1020:0002; first-instance branch in verified 1018:1a61; reconstructed/tests/test_application.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:06fe verified semantic-object-field g_win16_instance HINSTANCE16 1028:06fe 1028:06ff 34 1 FUN_1000_016c,FUN_1000_0270,FUN_1000_5390,FUN_1000_5be5,FUN_1000_6129,FUN_1008_0f2e,FUN_1008_2442,FUN_1008_2554,FUN_1008_2a45,FUN_1008_2ae3,FUN_1010_01c2,FUN_1018_0e46,FUN_1018_1274,FUN_1018_134f,FUN_1018_1a61,FUN_1020_0002,FUN_1020_082e Initialized from the current Win16 task instance by 1020:0002. 34 readers across resource/window/module paths; verified MakeProcInstance argument in 1018:1a61.; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0700 verified semantic-object-field g_win16_show_command uint16_t 1028:0700 1028:0701 2 1 FUN_1008_2442,FUN_1018_1b57,FUN_1020_0002 Initialized from DX by Win16 startup 1020:0002. Startup write at 1020:0015; read by verified application initialization 1018:1b57; reconstructed/tests/test_application.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0702 verified semantic-object-field g_borland_command_line Win16FarPtr 1028:0702 1028:0705 1 1 FUN_1020_0002,FUN_1020_0871 Initialized exactly from startup ES:BX by verified 1020:0002. Verified startup capture and command-token scanner 1020:0871; reconstructed/tests/test_borland_startup.c; complete verified referring-function closure Exact far pointer to the NUL-terminated DOS command tail, including independent selector and wrapping offset semantics. +1028:0704 verified semantic-object-field g_borland_command_line Win16FarPtr 1028:0702 1028:0705 0 1 FUN_1020_0002 Initialized exactly from startup ES:BX by verified 1020:0002. Verified startup capture and command-token scanner 1020:0871; reconstructed/tests/test_borland_startup.c; complete verified referring-function closure Exact far pointer to the NUL-terminated DOS command tail, including independent selector and wrapping offset semantics. +1028:0706 verified semantic-object-field g_borland_heap_segment_head uint16_t 1028:0706 1028:0707 8 2 FUN_1020_0167,FUN_1020_023c,FUN_1020_026a,FUN_1020_02d7,runtime_1020_0195 Static zero; points to current selector in the circular local-heap segment ring. Reads/writes in 1020:0167, 0195, 023c, 026a, 02d7; reconstructed/tests/test_heap_core.c; reconstructed/tests/test_heap_paths.c; complete verified referring-function closure Circular insertion, successful-segment rotation, predecessor unlink, and final zeroing are represented and verified across one- and two-segment lifecycles. +1028:0708 verified semantic-object-field g_borland_local_heap_limit uint16_t 1028:0708 1028:0709 2 0 FUN_1020_01ca Static value 0x0400. Threshold branches in 1020:01ca; reconstructed/tests/test_heap_paths.c; complete verified referring-function closure Below-threshold local-first and above-threshold global-first paths, including fallback, are represented and branch-tested. +1028:070a verified semantic-object-field g_borland_heap_segment_bytes uint16_t 1028:070a 1028:070b 4 0 FUN_1020_01ca,FUN_1020_026a,FUN_1020_02d7 Static value 0x2000. Header/free-size construction and full-segment release tests.; complete verified referring-function closure Exact 8-KiB local heap segment allocation size. +1028:070c verified semantic-object-field g_borland_global_alloc_flags uint16_t 1028:070c 1028:070d 1 0 FUN_1020_0222 Static value 2. Push at 1020:0222 and verified GlobalAlloc16 argument test.; complete verified referring-function closure Exact flags passed for Borland global heap blocks. +1028:070e verified semantic-object-field g_borland_heap_error_handler Win16FarPtr 1028:070e 1028:0711 2 1 FUN_1008_2e76,FUN_1020_01ca Set by 1008:2e76 relocation to 1008:2e22. Verified NE-segment binding to selector:2e22; indirect call at 1020:020c-0210.; complete verified referring-function closure Allocator callback returns 0 stop, 1 no retry, or 2 retry after emergency-reserve release. +1028:0710 verified semantic-object-field g_borland_heap_error_handler Win16FarPtr 1028:070e 1028:0711 2 1 FUN_1008_2e76,FUN_1020_01ca Set by 1008:2e76 relocation to 1008:2e22. Verified NE-segment binding to selector:2e22; indirect call at 1020:020c-0210.; complete verified referring-function closure Allocator callback returns 0 stop, 1 no retry, or 2 retry after emergency-reserve release. +1028:0712 verified semantic-object-field g_borland_exit_proc Win16FarPtr 1028:0712 1028:0715 2 3 FUN_1008_24a5,FUN_1008_2554,FUN_1020_00d2 Static zero; mutable ExitProc head. Reads/clears in 1020:00d2; writers throughout shutdown setup.; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0714 verified semantic-object-field g_borland_exit_proc Win16FarPtr 1028:0712 1028:0715 1 3 FUN_1008_24a5,FUN_1008_2554,FUN_1020_00d2 Static zero; mutable ExitProc head. Reads/clears in 1020:00d2; writers throughout shutdown setup.; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0716 verified semantic-object-field g_borland_exit_code_word uint16_t 1028:0716 1028:0717 2 1 FUN_1020_0061 Static zero; AX store on runtime-exit entry. Stores/reads in 1020:0061 and related runtime entries.; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0718 verified semantic-object-field g_borland_error_location struct BorlandErrorLocation 1028:0718 1028:071b 3 1 FUN_1008_24a5,FUN_1020_0061 Static zero; cleared by Halt and populated by run-error paths. Reads/writes in 1020:0002, 005d, 0061, and runtime error helpers.; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:071a verified semantic-object-field g_borland_error_location struct BorlandErrorLocation 1028:0718 1028:071b 3 1 FUN_1008_24a5,FUN_1020_0061 Static zero; cleared by Halt and populated by run-error paths. Reads/writes in 1020:0002, 005d, 0061, and runtime error helpers.; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:071c verified semantic-object-field g_borland_windows_mode uint16_t 1028:071c 1028:071d 1 1 FUN_1020_0002,FUN_1020_0061 Initialized from startup ES by verified 1020:0002. Verified startup capture, termination consumer 1020:0061, and focused tests.; complete verified referring-function closure Exact Win16 selector-valued mode word; nonzero selects ExitProc execution and GUI error reporting. +1028:071e verified semantic-object-field g_borland_io_result _Atomic uint16_t 1028:071e 1028:071f 3 10 FUN_1020_00d2,FUN_1020_0388,FUN_1020_038f,FUN_1020_0534,FUN_1020_0586,FUN_1020_05c7,FUN_1020_06ab,FUN_1020_072c,FUN_1020_0751,FUN_1020_07fe,runtime_1020_0710 Static zero; 1020:0388 uses one locked-equivalent XCHG read-and-clear. Atomic exchange in verified 1020:0388; reads/writes in runtime I/O and ExitProc paths.; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0720 verified semantic-object-field g_borland_random_seed uint32_t 1028:0720 1028:0723 2 3 FUN_1000_0270,FUN_1020_1501,runtime_1020_14de,runtime_1020_1539 Static zero; seeded from DOS time and advanced by the verified LCG. Reads/writes in 1020:14a4, 14c1, 14de, 1501, and 1539; multiplier 0x08088405 proved from assembly.; complete verified referring-function closure Exact modulo-2^32 Borland RandSeed state, stored low word then high word. +1028:0722 verified semantic-object-field g_borland_random_seed uint32_t 1028:0720 1028:0723 1 3 FUN_1000_0270,FUN_1020_1501,runtime_1020_1539 Static zero; seeded from DOS time and advanced by the verified LCG. Reads/writes in 1020:14a4, 14c1, 14de, 1501, and 1539; multiplier 0x08088405 proved from assembly.; complete verified referring-function closure Exact modulo-2^32 Borland RandSeed state, stored low word then high word. +1028:0724 verified semantic-object-field g_borland_huge_pointer_increment uint16_t 1028:0724 1028:0725 0 1 FUN_1020_0002 Assigned the relocated KERNEL ordinal 114 equate __AHINCR by verified startup. Relocation 5:4 at 1020:0051; Wine 11.15 __AHINCR=8; reconstructed/tests/test_borland_startup.c; complete verified referring-function closure Exact selector increment used by Borland huge-pointer normalization; this import is runtime data, not a callable function. +1028:0726 verified semantic-object-field g_borland_cpu_level uint8_t 1028:0726 1028:0726 4 1 FUN_1020_0002,FUN_1020_08a9,FUN_1020_08e6,runtime_1020_098c,runtime_1020_09af Set by verified startup from returned GetWinFlags AL. Verified startup branches and consumers 1020:08a9, 08e6, 098c, and 09af; arithmetic and startup tests.; complete verified referring-function closure Exact levels 0 for 086/186, 1 for 286, and 2 for 386-plus instruction selection. +1028:0727 verified semantic-object-field g_borland_file_mode uint8_t 1028:0727 1028:0727 1 0 FUN_1020_06ab Static value 2. Binary byte; sole read by verified generic open entry 1020:06ab; focused DOS-open test.; complete verified referring-function closure Exact DOS AH=3d access mode passed for nonempty generic-file names. +1028:0748 verified semantic-object-field g_tdkpin_application_object uint8_t[36] 1028:0748 1028:076b 2 0 ne_program_entry Zero-fill static storage constructed in-place with VMT offset 0x0024. Verified application constructor, VMT Run/destructor calls, static dispose mode zero, and program-entry tests.; complete verified referring-function closure Exact process-lifetime ObjectWindows application instance. +1028:07bf verified semantic-object-field g_tdkpin_windows_version uint32_t 1028:07bf 1028:07c2 3 1 ne_program_entry Full DX:AX return from GetVersion16. Verified 2.x, 3.9, 3.10, and 4.x branches and full-dword publication.; complete verified referring-function closure Low-byte major, next-byte minor; upper word retained but not used by threshold. +1028:07c1 verified semantic-object-field g_tdkpin_windows_version uint32_t 1028:07bf 1028:07c2 3 1 ne_program_entry Full DX:AX return from GetVersion16. Verified 2.x, 3.9, 3.10, and 4.x branches and full-dword publication.; complete verified referring-function closure Low-byte major, next-byte minor; upper word retained but not used by threshold. +1028:07c4 verified semantic-object-field g_palette_update_active uint8_t 1028:07c4 1028:07c4 3 3 FUN_1000_58e7,FUN_1000_5956,exported_ordinal_10 Zero-filled; reset by variant A wParam zero and set before synchronous invalidate/update in both verified handlers. All palette-message readers/writers 1000:58e7,5956,59a0,5a37 are verified; palette message tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07c5 verified semantic-object-field g_collision_refresh_pending uint8_t 1028:07c5 1028:07c5 1 3 FUN_1000_0270,FUN_1000_638e,exported_ordinal_10 Zero-fill; setup clears it, adding a player sets it, and the next timer pass refreshes all 175 collision records before clearing it. Writes at 1000:03e0/6959/eb2c and timer read at 1000:eb0b; exact add-player branch in reconstructed/tdkpin_key_input.c and reconstructed/tests/test_key_release.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07c6 verified semantic-object-field game_tilted uint8_t 1028:07c6 1028:07c6 9 2 FUN_1000_638e,FUN_1000_6bf8,FUN_1000_9e85,FUN_1000_b476,FUN_1000_bc36,FUN_1000_c79c,FUN_1008_0002,exported_ordinal_10 Zero-filled; reset during game/ball setup and set after the nudge threshold is exceeded. Verified sound-dispatch gate 1008:0002; complete reference inventory identifies readers in key, collision, timer, and gameplay paths plus writers 1000:638e and 1000:9e85.; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07c7 verified semantic-object-field g_target_rotation_armed uint8_t 1028:07c7 1028:07c7 3 4 FUN_1000_0270,FUN_1000_638e,FUN_1000_b476,FUN_1000_c79c,exported_ordinal_10 Zero-fill; event flag 0400 clears the rotation state and sets this byte only while both rotation bytes are zero. Verified gate/writer in 1000:b476 and complete reference inventory; reconstructed/tests/test_collision_events.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07c8 verified semantic-object-field g_target_set_complete uint8_t 1028:07c8 1028:07c8 3 4 FUN_1000_0270,FUN_1000_9e85,FUN_1000_b476,FUN_1000_c79c,exported_ordinal_10 Zero-fill; set when all five target record words are nonzero and suppresses rearming while set. Verified writer 1000:9e85, gate 1000:b476, and complete reference inventory; ball-render/collision-event tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07c9 verified semantic-object-field g_gameplay_transition_pending uint8_t 1028:07c9 1028:07c9 1 3 FUN_1000_0270,FUN_1000_638e,FUN_1000_a70e,exported_ordinal_10 Zero-fill; set by verified 1000:a70e and setup/input paths. Verified writer plus complete reference inventory.; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07ca verified semantic-object-field g_claw_animation_active uint8_t 1028:07ca 1028:07ca 1 3 FUN_1000_0270,FUN_1000_c79c,exported_ordinal_10 Zero-fill; setup clears it, collision logic arms it, and the timer clears it after the claw returns to frame ten with the primary bank selected. Complete references; full timer state machine in reconstructed/tdkpin_timer_tick.c and test_timer_tick.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07cb verified semantic-object-field g_scene_ready uint8_t 1028:07cb 1028:07cb 0 2 FUN_1000_0270,FUN_1000_5390 Zero-filled; set to one after verified scene redraw, score/status update, and DC release in 1000:5390. Verified writer 1000:5390; asset-initializer tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07cc verified semantic-object-field g_assets_pending uint8_t 1028:07cc 1028:07cc 2 2 FUN_1000_0270,FUN_1000_5390,exported_ordinal_10 Set during game initialization; nonzero selects the verified one-time asset-loading phase and is cleared at loading stage 34. Verified reader/clear in 1000:5390; asset-initializer tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07cd verified semantic-object-field g_board_index uint16_t 1028:07cd 1028:07ce 3 2 FUN_1000_0270,FUN_1000_6129 Zero-filled; selects DAT resource 1000+value in verified 1000:6129. Verified setup reader; reconstructed/tests/test_board_overlay.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07cf verified semantic-object-field g_debug_keys_enabled uint8_t 1028:07cf 1028:07cf 2 1 FUN_1000_0270,FUN_1000_638e Zero-fill and explicitly cleared on setup entry; no in-image writer enables it. Complete reference inventory: verified setup 1000:0270 and both debug branches in verified 1000:638e; reconstructed/tests/test_game_setup.c and test_key_release.c; complete verified referring-function closure Nonzero, possible only through external mutation, enables F2 target-rotation reset and F7 ball-position restore; normal execution leaves both paths dormant. +1028:07d0 verified semantic-object-field g_player_count uint8_t 1028:07d0 1028:07d0 9 3 FUN_1000_0270,FUN_1000_638e,FUN_1000_6bf8,FUN_1000_a70e,FUN_1000_a72c,FUN_1000_acc2,FUN_1000_ae6e,exported_ordinal_10 Zero-fill; configured during setup and cleared by verified 1000:a70e. Verified clear and complete loop/reference evidence.; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07d1 verified semantic-object-field g_current_player uint8_t 1028:07d1 1028:07d1 112 8 FUN_1000_0270,FUN_1000_5390,FUN_1000_638e,FUN_1000_6f27,FUN_1000_7e92,FUN_1000_a604,FUN_1000_a72c,FUN_1000_abe5,FUN_1000_acc2,FUN_1000_ae6e,FUN_1000_b476,FUN_1000_bc36,FUN_1000_c4e1,FUN_1000_c79c,FUN_1008_0b9e,exported_ordinal_10 Zero-filled; values 1..4 identify the active player and zero disables the status display. Verified gating/index use in 1008:0b9e; status tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07d2 verified semantic-object-field g_highscore_insert_index uint8_t 1028:07d2 1028:07d2 4 2 FUN_1000_a72c,FUN_1000_ab3c,FUN_1000_abe5,FUN_1000_ae6e Zero-fill; set to the one-based inserted slot by 1000:abe5 and consumed by 1000:ab3c. Verified insert/show lifecycle and complete reference inventory; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07d3 verified semantic-object-field g_ball_position_milli int32_t[2] 1028:07d3 1028:07da 35 18 FUN_1000_0270,FUN_1000_638e,FUN_1000_7ed9,FUN_1000_9bca,FUN_1000_9e85,FUN_1000_9f73,FUN_1000_ae6e,FUN_1000_bdde,FUN_1000_beff,FUN_1000_c36b,FUN_1000_c426,FUN_1000_c79c,exported_ordinal_10 Zero-fill; reset to 325000/413000 by verified 1000:9e85 and updated throughout physics/gameplay. Verified reset, pixel projection 1000:9bca, bounds/dynamic-record and ball-slot helpers; complete reference inventory; reconstructed/tests/test_ball_render.c and test_gameplay_helpers.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07d5 verified semantic-object-field g_ball_position_milli int32_t[2] 1028:07d3 1028:07da 35 18 FUN_1000_0270,FUN_1000_638e,FUN_1000_7ed9,FUN_1000_9bca,FUN_1000_9e85,FUN_1000_9f73,FUN_1000_ae6e,FUN_1000_bdde,FUN_1000_beff,FUN_1000_c36b,FUN_1000_c426,FUN_1000_c79c,exported_ordinal_10 Zero-fill; reset to 325000/413000 by verified 1000:9e85 and updated throughout physics/gameplay. Verified reset, pixel projection 1000:9bca, bounds/dynamic-record and ball-slot helpers; complete reference inventory; reconstructed/tests/test_ball_render.c and test_gameplay_helpers.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07d7 verified semantic-object-field g_ball_position_milli int32_t[2] 1028:07d3 1028:07da 36 18 FUN_1000_0270,FUN_1000_638e,FUN_1000_7ed9,FUN_1000_9bca,FUN_1000_9e85,FUN_1000_9f73,FUN_1000_ae6e,FUN_1000_bdde,FUN_1000_beff,FUN_1000_c36b,FUN_1000_c426,FUN_1000_c79c,exported_ordinal_10 Zero-fill; reset to 325000/413000 by verified 1000:9e85 and updated throughout physics/gameplay. Verified reset, pixel projection 1000:9bca, bounds/dynamic-record and ball-slot helpers; complete reference inventory; reconstructed/tests/test_ball_render.c and test_gameplay_helpers.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07d9 verified semantic-object-field g_ball_position_milli int32_t[2] 1028:07d3 1028:07da 36 18 FUN_1000_0270,FUN_1000_638e,FUN_1000_7ed9,FUN_1000_9bca,FUN_1000_9e85,FUN_1000_9f73,FUN_1000_ae6e,FUN_1000_bdde,FUN_1000_beff,FUN_1000_c36b,FUN_1000_c426,FUN_1000_c79c,exported_ordinal_10 Zero-fill; reset to 325000/413000 by verified 1000:9e85 and updated throughout physics/gameplay. Verified reset, pixel projection 1000:9bca, bounds/dynamic-record and ball-slot helpers; complete reference inventory; reconstructed/tests/test_ball_render.c and test_gameplay_helpers.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07db verified semantic-object-field g_predicted_ball_position_milli int32_t[2] 1028:07db 1028:07e2 7 2 FUN_1000_9b69,FUN_1000_c79c Zero-fill; each physics substep publishes current position plus velocity as predicted X/Y before broadphase. Complete verified readers/writers 1000:c79c and 1000:9b69; reconstructed/tdkpin_physics.c and focused physics tests; complete verified referring-function closure Exact X then Y signed dword extent, write order, trigger rewrite, and bounds use are fully represented. +1028:07dd verified semantic-object-field g_predicted_ball_position_milli int32_t[2] 1028:07db 1028:07e2 7 2 FUN_1000_9b69,FUN_1000_c79c Zero-fill; each physics substep publishes current position plus velocity as predicted X/Y before broadphase. Complete verified readers/writers 1000:c79c and 1000:9b69; reconstructed/tdkpin_physics.c and focused physics tests; complete verified referring-function closure Exact X then Y signed dword extent, write order, trigger rewrite, and bounds use are fully represented. +1028:07df verified semantic-object-field g_predicted_ball_position_milli int32_t[2] 1028:07db 1028:07e2 7 2 FUN_1000_9b69,FUN_1000_c79c Zero-fill; each physics substep publishes current position plus velocity as predicted X/Y before broadphase. Complete verified readers/writers 1000:c79c and 1000:9b69; reconstructed/tdkpin_physics.c and focused physics tests; complete verified referring-function closure Exact X then Y signed dword extent, write order, trigger rewrite, and bounds use are fully represented. +1028:07e1 verified semantic-object-field g_predicted_ball_position_milli int32_t[2] 1028:07db 1028:07e2 7 2 FUN_1000_9b69,FUN_1000_c79c Zero-fill; each physics substep publishes current position plus velocity as predicted X/Y before broadphase. Complete verified readers/writers 1000:c79c and 1000:9b69; reconstructed/tdkpin_physics.c and focused physics tests; complete verified referring-function closure Exact X then Y signed dword extent, write order, trigger rewrite, and bounds use are fully represented. +1028:07e3 verified semantic-object-field g_ball_slot_x_positions_milli int32_t[2] 1028:07e3 1028:07ea 1 1 exported_ordinal_10 Zero-fill; indexed save/load transfers active ball X for slots zero and one. Verified 1000:c36b/c426 stride plus full timer promotion/copy paths; gameplay-helper and timer tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07e5 verified semantic-object-field g_ball_slot_x_positions_milli int32_t[2] 1028:07e3 1028:07ea 1 1 exported_ordinal_10 Zero-fill; indexed save/load transfers active ball X for slots zero and one. Verified 1000:c36b/c426 stride plus full timer promotion/copy paths; gameplay-helper and timer tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07e7 verified semantic-object-field g_ball_slot_x_positions_milli int32_t[2] 1028:07e3 1028:07ea 3 0 exported_ordinal_10 Zero-fill; indexed save/load transfers active ball X for slots zero and one. Verified 1000:c36b/c426 stride plus full timer promotion/copy paths; gameplay-helper and timer tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07e9 verified semantic-object-field g_ball_slot_x_positions_milli int32_t[2] 1028:07e3 1028:07ea 3 0 exported_ordinal_10 Zero-fill; indexed save/load transfers active ball X for slots zero and one. Verified 1000:c36b/c426 stride plus full timer promotion/copy paths; gameplay-helper and timer tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07eb verified semantic-object-field g_ball_slot_y_positions_milli int32_t[2] 1028:07eb 1028:07f2 1 1 exported_ordinal_10 Zero-fill; indexed save/load transfers active ball Y for slots zero and one. Verified 1000:c36b/c426 stride plus full timer promotion/copy paths; focused tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07ed verified semantic-object-field g_ball_slot_y_positions_milli int32_t[2] 1028:07eb 1028:07f2 1 1 exported_ordinal_10 Zero-fill; indexed save/load transfers active ball Y for slots zero and one. Verified 1000:c36b/c426 stride plus full timer promotion/copy paths; focused tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07ef verified semantic-object-field g_ball_slot_y_positions_milli int32_t[2] 1028:07eb 1028:07f2 3 0 exported_ordinal_10 Zero-fill; indexed save/load transfers active ball Y for slots zero and one. Verified 1000:c36b/c426 stride plus full timer promotion/copy paths; focused tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07f1 verified semantic-object-field g_ball_slot_y_positions_milli int32_t[2] 1028:07eb 1028:07f2 3 0 exported_ordinal_10 Zero-fill; indexed save/load transfers active ball Y for slots zero and one. Verified 1000:c36b/c426 stride plus full timer promotion/copy paths; focused tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07f3 verified semantic-object-field g_ball_slot_velocity_x_milli int32_t[2] 1028:07f3 1028:07fa 3 4 FUN_1000_638e,exported_ordinal_10 Zero-fill; indexed ball-slot save/load stores horizontal velocity for slots zero and one. Verified 1000:c36b/c426 slot stride and verified 1000:638e nudge updates; timer slot-one-to-zero transfer at 1000:f24d; gameplay-helper and key-release tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07f5 verified semantic-object-field g_ball_slot_velocity_x_milli int32_t[2] 1028:07f3 1028:07fa 3 4 FUN_1000_638e,exported_ordinal_10 Zero-fill; indexed ball-slot save/load stores horizontal velocity for slots zero and one. Verified 1000:c36b/c426 slot stride and verified 1000:638e nudge updates; timer slot-one-to-zero transfer at 1000:f24d; gameplay-helper and key-release tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07f7 verified semantic-object-field g_ball_slot_velocity_x_milli int32_t[2] 1028:07f3 1028:07fa 4 3 FUN_1000_638e,exported_ordinal_10 Zero-fill; indexed ball-slot save/load stores horizontal velocity for slots zero and one. Verified 1000:c36b/c426 slot stride and verified 1000:638e nudge updates; timer slot-one-to-zero transfer at 1000:f24d; gameplay-helper and key-release tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07f9 verified semantic-object-field g_ball_slot_velocity_x_milli int32_t[2] 1028:07f3 1028:07fa 4 3 FUN_1000_638e,exported_ordinal_10 Zero-fill; indexed ball-slot save/load stores horizontal velocity for slots zero and one. Verified 1000:c36b/c426 slot stride and verified 1000:638e nudge updates; timer slot-one-to-zero transfer at 1000:f24d; gameplay-helper and key-release tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07fb verified semantic-object-field g_ball_slot_velocity_y_milli int32_t[2] 1028:07fb 1028:0802 1 3 FUN_1000_638e,exported_ordinal_10 Zero-fill; indexed ball-slot save/load stores vertical velocity for slots zero and one. Verified 1000:c36b/c426 slot stride, verified 1000:638e launch publication and space-nudge updates, timer slot-one-to-zero transfer at 1000:f25b; focused tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07fd verified semantic-object-field g_ball_slot_velocity_y_milli int32_t[2] 1028:07fb 1028:0802 1 3 FUN_1000_638e,exported_ordinal_10 Zero-fill; indexed ball-slot save/load stores vertical velocity for slots zero and one. Verified 1000:c36b/c426 slot stride, verified 1000:638e launch publication and space-nudge updates, timer slot-one-to-zero transfer at 1000:f25b; focused tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:07ff verified semantic-object-field g_ball_slot_velocity_y_milli int32_t[2] 1028:07fb 1028:0802 2 1 FUN_1000_638e,exported_ordinal_10 Zero-fill; indexed ball-slot save/load stores vertical velocity for slots zero and one. Verified 1000:c36b/c426 slot stride, verified 1000:638e launch publication and space-nudge updates, timer slot-one-to-zero transfer at 1000:f25b; focused tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0801 verified semantic-object-field g_ball_slot_velocity_y_milli int32_t[2] 1028:07fb 1028:0802 2 1 FUN_1000_638e,exported_ordinal_10 Zero-fill; indexed ball-slot save/load stores vertical velocity for slots zero and one. Verified 1000:c36b/c426 slot stride, verified 1000:638e launch publication and space-nudge updates, timer slot-one-to-zero transfer at 1000:f25b; focused tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0803 verified semantic-object-field g_ball_slot_auxiliary_state int32_t[2] 1028:0803 1028:080a 0 1 exported_ordinal_10 Zero-fill; indexed save/load mirrors receiver +0bca for slots zero and one. Verified 1000:c36b/c426 and full timer slot promotion; focused tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0805 verified semantic-object-field g_ball_slot_auxiliary_state int32_t[2] 1028:0803 1028:080a 0 1 exported_ordinal_10 Zero-fill; indexed save/load mirrors receiver +0bca for slots zero and one. Verified 1000:c36b/c426 and full timer slot promotion; focused tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0807 verified semantic-object-field g_ball_slot_auxiliary_state int32_t[2] 1028:0803 1028:080a 1 0 exported_ordinal_10 Zero-fill; indexed save/load mirrors receiver +0bca for slots zero and one. Verified 1000:c36b/c426 and full timer slot promotion; focused tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0809 verified semantic-object-field g_ball_slot_auxiliary_state int32_t[2] 1028:0803 1028:080a 1 0 exported_ordinal_10 Zero-fill; indexed save/load mirrors receiver +0bca for slots zero and one. Verified 1000:c36b/c426 and full timer slot promotion; focused tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:080b verified semantic-object-field g_ball_slot_real48_state BorlandReal48[2] 1028:080b 1028:0816 0 1 exported_ordinal_10 Zero-fill; indexed save/load mirrors receiver +0bce..0bd3 for slots zero and one. Verified six-byte stride in 1000:c36b/c426 and full timer promotion; focused tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:080d verified semantic-object-field g_ball_slot_real48_state BorlandReal48[2] 1028:080b 1028:0816 0 1 exported_ordinal_10 Zero-fill; indexed save/load mirrors receiver +0bce..0bd3 for slots zero and one. Verified six-byte stride in 1000:c36b/c426 and full timer promotion; focused tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:080f verified semantic-object-field g_ball_slot_real48_state BorlandReal48[2] 1028:080b 1028:0816 0 1 exported_ordinal_10 Zero-fill; indexed save/load mirrors receiver +0bce..0bd3 for slots zero and one. Verified six-byte stride in 1000:c36b/c426 and full timer promotion; focused tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0811 verified semantic-object-field g_ball_slot_real48_state BorlandReal48[2] 1028:080b 1028:0816 1 0 exported_ordinal_10 Zero-fill; indexed save/load mirrors receiver +0bce..0bd3 for slots zero and one. Verified six-byte stride in 1000:c36b/c426 and full timer promotion; focused tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0813 verified semantic-object-field g_ball_slot_real48_state BorlandReal48[2] 1028:080b 1028:0816 1 0 exported_ordinal_10 Zero-fill; indexed save/load mirrors receiver +0bce..0bd3 for slots zero and one. Verified six-byte stride in 1000:c36b/c426 and full timer promotion; focused tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0815 verified semantic-object-field g_ball_slot_real48_state BorlandReal48[2] 1028:080b 1028:0816 1 0 exported_ordinal_10 Zero-fill; indexed save/load mirrors receiver +0bce..0bd3 for slots zero and one. Verified six-byte stride in 1000:c36b/c426 and full timer promotion; focused tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0817 verified semantic-object-field g_player_ready_flags uint8_t[4] 1028:0817 1028:081a 0 1 FUN_1000_0270 Zero-fill; each configured one-based player slot is set to one by 1000:a72c. Verified initialization and exact extent in 1000:a72c; reconstructed/tests/test_player_state.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0818 verified semantic-object-field g_player_ready_flags uint8_t[4] 1028:0817 1028:081a 0 1 FUN_1000_a72c Zero-fill; each configured one-based player slot is set to one by 1000:a72c. Verified initialization and exact extent in 1000:a72c; reconstructed/tests/test_player_state.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:081b verified semantic-object-field g_player_item_group_flags uint8_t[4] 1028:081b 1028:081e 0 1 FUN_1000_0270 Zero-fill; each configured one-based player slot is set to one after marker initialization. Verified initialization and exact extent in 1000:a72c; reconstructed/tests/test_player_state.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:081c verified semantic-object-field g_player_item_group_flags uint8_t[4] 1028:081b 1028:081e 0 1 FUN_1000_a72c Zero-fill; each configured one-based player slot is set to one after marker initialization. Verified initialization and exact extent in 1000:a72c; reconstructed/tests/test_player_state.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0821 verified semantic-object-field g_player_marker_counts int16_t[5] 1028:081f 1028:0828 0 2 FUN_1000_0270,FUN_1000_638e Zero-fill; indexed one-based by active player and initialized/updated by game-state paths. Verified six-marker projection in 1000:a604; complete indexed reference inventory; reconstructed/tests/test_gameplay_helpers.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0823 verified semantic-object-field g_player_marker_counts int16_t[5] 1028:081f 1028:0828 0 3 FUN_1000_638e,FUN_1000_a72c Zero-fill; indexed one-based by active player and initialized/updated by game-state paths. Verified six-marker projection in 1000:a604; complete indexed reference inventory; reconstructed/tests/test_gameplay_helpers.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0829 verified semantic-object-field g_player_marker_score_thresholds int32_t[4] 1028:0829 1028:0838 0 1 FUN_1000_0270 Zero-fill then initialized by startup/game setup; read one-based by score-award level. Verified indexed comparison in 1000:bc36 and exact boundary against marker counts/levels; reconstructed/tests/test_scoring.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:082b verified semantic-object-field g_player_marker_score_thresholds int32_t[4] 1028:0829 1028:0838 0 1 FUN_1000_0270 Zero-fill then initialized by startup/game setup; read one-based by score-award level. Verified indexed comparison in 1000:bc36 and exact boundary against marker counts/levels; reconstructed/tests/test_scoring.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:082d verified semantic-object-field g_player_marker_score_thresholds int32_t[4] 1028:0829 1028:0838 0 1 FUN_1000_0270 Zero-fill then initialized by startup/game setup; read one-based by score-award level. Verified indexed comparison in 1000:bc36 and exact boundary against marker counts/levels; reconstructed/tests/test_scoring.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:082f verified semantic-object-field g_player_marker_score_thresholds int32_t[4] 1028:0829 1028:0838 0 1 FUN_1000_0270 Zero-fill then initialized by startup/game setup; read one-based by score-award level. Verified indexed comparison in 1000:bc36 and exact boundary against marker counts/levels; reconstructed/tests/test_scoring.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0831 verified semantic-object-field g_player_marker_score_thresholds int32_t[4] 1028:0829 1028:0838 0 1 FUN_1000_0270 Zero-fill then initialized by startup/game setup; read one-based by score-award level. Verified indexed comparison in 1000:bc36 and exact boundary against marker counts/levels; reconstructed/tests/test_scoring.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0833 verified semantic-object-field g_player_marker_score_thresholds int32_t[4] 1028:0829 1028:0838 0 1 FUN_1000_0270 Zero-fill then initialized by startup/game setup; read one-based by score-award level. Verified indexed comparison in 1000:bc36 and exact boundary against marker counts/levels; reconstructed/tests/test_scoring.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0835 verified semantic-object-field g_player_marker_score_thresholds int32_t[4] 1028:0829 1028:0838 0 1 FUN_1000_0270 Zero-fill then initialized by startup/game setup; read one-based by score-award level. Verified indexed comparison in 1000:bc36 and exact boundary against marker counts/levels; reconstructed/tests/test_scoring.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0837 verified semantic-object-field g_player_marker_score_thresholds int32_t[4] 1028:0829 1028:0838 0 1 FUN_1000_0270 Zero-fill then initialized by startup/game setup; read one-based by score-award level. Verified indexed comparison in 1000:bc36 and exact boundary against marker counts/levels; reconstructed/tests/test_scoring.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0839 verified semantic-object-field g_player_marker_levels int32_t[4] 1028:0839 1028:0848 0 1 FUN_1000_0270 Zero-fill; initialized to one for configured players and incremented when score thresholds are crossed. Verified initialization 1000:a72c and increment/limit logic 1000:bc36; player-state/scoring tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:083b verified semantic-object-field g_player_marker_levels int32_t[4] 1028:0839 1028:0848 0 1 FUN_1000_0270 Zero-fill; initialized to one for configured players and incremented when score thresholds are crossed. Verified initialization 1000:a72c and increment/limit logic 1000:bc36; player-state/scoring tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:083d verified semantic-object-field g_player_marker_levels int32_t[4] 1028:0839 1028:0848 0 1 FUN_1000_a72c Zero-fill; initialized to one for configured players and incremented when score thresholds are crossed. Verified initialization 1000:a72c and increment/limit logic 1000:bc36; player-state/scoring tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:083f verified semantic-object-field g_player_marker_levels int32_t[4] 1028:0839 1028:0848 0 1 FUN_1000_a72c Zero-fill; initialized to one for configured players and incremented when score thresholds are crossed. Verified initialization 1000:a72c and increment/limit logic 1000:bc36; player-state/scoring tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0849 verified semantic-object-field g_collision_path_continuation int32_t[2] 1028:0849 1028:0850 1 2 FUN_1008_0138 Zero-fill; updated after every accepted circle/segment and consumed by relative-mode records. Complete sole-function read/write inventory, exact 32-bit wrap, and branch tests.; complete verified referring-function closure X then Y continuation; circles retain point1 center, segments retain point2 endpoint. +1028:084b verified semantic-object-field g_collision_path_continuation int32_t[2] 1028:0849 1028:0850 1 2 FUN_1008_0138 Zero-fill; updated after every accepted circle/segment and consumed by relative-mode records. Complete sole-function read/write inventory, exact 32-bit wrap, and branch tests.; complete verified referring-function closure X then Y continuation; circles retain point1 center, segments retain point2 endpoint. +1028:084d verified semantic-object-field g_collision_path_continuation int32_t[2] 1028:0849 1028:0850 1 2 FUN_1008_0138 Zero-fill; updated after every accepted circle/segment and consumed by relative-mode records. Complete sole-function read/write inventory, exact 32-bit wrap, and branch tests.; complete verified referring-function closure X then Y continuation; circles retain point1 center, segments retain point2 endpoint. +1028:084f verified semantic-object-field g_collision_path_continuation int32_t[2] 1028:0849 1028:0850 1 2 FUN_1008_0138 Zero-fill; updated after every accepted circle/segment and consumed by relative-mode records. Complete sole-function read/write inventory, exact 32-bit wrap, and branch tests.; complete verified referring-function closure X then Y continuation; circles retain point1 center, segments retain point2 endpoint. +1028:0851 verified semantic-object-field g_panel_animation_frame int32_t 1028:0851 1028:0854 47 4 FUN_1000_7440,FUN_1000_9e85,FUN_1000_c79c,exported_ordinal_10 Zero-fill; drives the nine-phase 1..281 panel animation and entry-frame sound events. Verified complete render consumer 1000:7440 and reset writer 1000:9e85; full reference inventory; reconstructed/tests/test_panel_animation.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0853 verified semantic-object-field g_panel_animation_frame int32_t 1028:0851 1028:0854 46 4 FUN_1000_7440,FUN_1000_9e85,FUN_1000_c79c,exported_ordinal_10 Zero-fill; drives the nine-phase 1..281 panel animation and entry-frame sound events. Verified complete render consumer 1000:7440 and reset writer 1000:9e85; full reference inventory; reconstructed/tests/test_panel_animation.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0855 verified semantic-object-field g_target_rotation_state int32_t 1028:0855 1028:0858 5 3 FUN_1000_638e,FUN_1000_6f27,FUN_1000_b476,exported_ordinal_10 Zero-fill; selects DAT600 frames 1..5 and the rotation/composite branch at values 6 and above. Verified full render/rotation consumer 1000:6f27 and complete reference inventory; reconstructed/tests/test_mechanism_render.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0857 verified semantic-object-field g_target_rotation_state int32_t 1028:0855 1028:0858 4 3 FUN_1000_638e,FUN_1000_6f27,FUN_1000_b476,exported_ordinal_10 Zero-fill; selects DAT600 frames 1..5 and the rotation/composite branch at values 6 and above. Verified full render/rotation consumer 1000:6f27 and complete reference inventory; reconstructed/tests/test_mechanism_render.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0859 verified semantic-object-field g_dat600_bitmap HBITMAP16 1028:0859 1028:085a 4 1 FUN_1000_51f5,FUN_1000_5390,FUN_1000_6f27,FUN_1000_7440 Zero-filled; assigned DAT resource 600 at loading stage 33 by verified asset initialization. Complete verified load/render/delete lifecycle 1000:5390,6f27,7440,51f5; mechanism and panel-animation tests; complete verified referring-function closure Exact DAT600 atlas provenance, 91-pixel target frames, panel-animation mask/image regions, publication, and ownership lifecycle are fully proven. +1028:085b verified semantic-object-field g_background_bitmap HBITMAP16 1028:085b 1028:085c 16 1 FUN_1000_0002,FUN_1000_51f5,FUN_1000_5390,FUN_1000_6b37,FUN_1000_7440,FUN_1000_9bca,FUN_1000_9f73,FUN_1000_a38e,FUN_1000_beff,FUN_1008_07b6,FUN_1008_0837,FUN_1008_08bb,FUN_1008_093f,FUN_1008_0996,FUN_1008_0e08 Zero-filled; assigned DAT 998 by verified asset initialization and selected by all verified low-level background blits. Verified writer and readers 1008:07b6,0837,08bb,093f,0996/1000:5390; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:085d verified semantic-object-field g_background_overlay_b HBITMAP16 1028:085d 1028:085e 4 1 FUN_1000_51f5,FUN_1000_5390,FUN_1000_6f27,FUN_1000_7440,FUN_1008_08bb Zero-filled; assigned DAT 998 by verified asset initialization and consumed only by verified restore variant B. Complete writer/reader inventory 1000:5390 and 1008:08bb; asset/render tests.; complete verified referring-function closure Exact overlay-B resource, publication, restore role, and DGROUP extent are fully proven. +1028:085f verified semantic-object-field g_background_overlay_a HBITMAP16 1028:085f 1028:0860 4 1 FUN_1000_51f5,FUN_1000_5390,FUN_1000_7440,FUN_1008_0837,exported_ordinal_10 Zero-filled; assigned DAT 997 by verified asset initialization and consumed only by verified restore variant A. Complete writer/reader inventory 1000:5390 and 1008:0837; asset/render tests.; complete verified referring-function closure Exact overlay-A resource, publication, restore role, and DGROUP extent are fully proven. +1028:0861 verified semantic-object-field g_digit_sprite_bitmap HBITMAP16 1028:0861 1028:0862 3 1 FUN_1000_51f5,FUN_1000_5390,FUN_1008_0996,exported_ordinal_10 Zero-filled; assigned BITMAP resource 500 by verified asset initialization and consumed by verified score renderer. Complete writer/reader inventory 1000:5390 and 1008:0996; asset/score tests.; complete verified referring-function closure Exact HBITMAP slot, resource ID, 16-pixel horizontal digit stride, and 28x16 SRCAND use are fully proven. +1028:0863 verified semantic-object-field g_claw_sprite_bitmap HBITMAP16 1028:0863 1028:0864 2 1 FUN_1000_51f5,FUN_1000_5390,FUN_1008_0e08 Zero-filled; assigned DAT resource 900 at loading stage 29 and deleted at asset shutdown. Complete writer/reader/deletion inventory 1000:5390,1008:0e08,1000:51f5; asset/claw/cleanup tests; complete verified referring-function closure Exact resource, atlas geometry, frame mapping, publication, rendering, and ownership lifecycle are fully proven. +1028:0865 verified semantic-object-field g_board_decoration_bitmap HBITMAP16 1028:0865 1028:0866 3 1 FUN_1000_51f5,FUN_1000_5390,FUN_1000_638e,FUN_1000_6b37 Zero-filled; assigned DAT resource 901 at loading stage 32 and deleted during asset shutdown without clearing the slot. Complete verified lifecycle 1000:5390,638e,6b37,51f5; asset, key-release, gameplay-helper, and cleanup tests; complete verified referring-function closure Exact DAT901 provenance, launch-decoration and velocity-row atlas geometry, presentation, and ownership endpoint are fully proven. +1028:0867 verified semantic-object-field g_overlay_bitmap HBITMAP16 1028:0867 1028:0868 4 2 FUN_1000_5ba6,FUN_1000_5be5,FUN_1000_5c13,FUN_1000_60e7,FUN_1000_6129,FUN_1000_616e Zero-filled; assigned by verified DAT loaders 1000:5be5/6129 and deleted by verified destructors 5ba6/60e7 without clearing the slot. Complete verified setup/destructor, 616e 640x460 drawing, and 5c13 high-score source-region lifecycle; overlay and high-score tests; complete verified referring-function closure Exact global HBITMAP provenance, replacement, 32/204 high-score source, whole-overlay drawing, and ownership endpoints are fully proven. +1028:0869 verified semantic-object-field g_unused_setup_word_0869 uint16_t 1028:0869 1028:086a 0 1 FUN_1000_0270 Zero-fill and explicitly written zero by game setup; never read anywhere in the complete reference inventory. Sole write 1000:03ff in verified setup and zero-reader proof; complete verified referring-function closure Explicit retained word is initialized state, not silently omitted padding; it has no in-image consumer. +1028:086b verified semantic-object-field g_displayed_status_level uint16_t 1028:086b 1028:086c 2 4 FUN_1000_0270,FUN_1000_5390,FUN_1008_0b9e Zero-filled; initialized/reset to 99 and assigned computed levels 0..4 by verified status renderer. All renderer reads/writes in 1008:0b9e verified; status tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:086d verified semantic-object-field g_claw_current_frame uint16_t 1028:086d 1028:086e 8 3 FUN_1000_0270,exported_ordinal_10 Setup initializes ten; timer steps it toward the target and selects release state 1..9/18 or rest state ten. Complete setup/timer references, exact claw table and test_timer_tick.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:086f verified semantic-object-field g_claw_target_frame uint16_t 1028:086f 1028:0870 2 6 FUN_1000_0270,FUN_1000_c79c,exported_ordinal_10 Setup initializes ten; collision logic selects a target and timer resets it to ten after releasing a ball. Complete references and full timer claw state machine; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0871 verified semantic-object-field g_physics_substeps_per_tick uint16_t 1028:0871 1028:0872 1 6 FUN_1000_0270,FUN_1000_c79c Configured from the clamped speed setting and snapshotted by physics before the one-based substep loop. Verified setup speed table and 1000:c79c loop; game-setup and physics tests; complete verified referring-function closure Exact unsigned zero-through-configured substep semantics and zero-substep rendering behavior are fully represented. +1028:0873 verified semantic-object-field g_claw_alternate_bank uint8_t 1028:0873 1028:0873 2 3 FUN_1000_0270,FUN_1000_c79c,exported_ordinal_10 Zero-fill; passed as the claw atlas bank while moving and cleared on release completion. Complete references, verified claw renderer and full timer tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0874 verified semantic-object-field g_score_double_active uint8_t 1028:0874 1028:0874 6 11 FUN_1000_0270,FUN_1000_638e,FUN_1000_a72c,FUN_1000_ae6e,FUN_1000_bc36,FUN_1000_c4e1,FUN_1000_c79c,exported_ordinal_10 Zero-fill; cleared by player initialization, set by sprite effect 7, and doubles score deltas while nonzero. Verified lifecycle in 1000:a72c/bc36/c4e1; complete reference inventory; player-state/scoring tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0875 verified semantic-object-field g_special_respawn_active uint8_t 1028:0875 1028:0875 1 4 FUN_1000_0270,FUN_1000_ae6e,FUN_1000_c79c Zero-fill; set only on the special collision-position respawn branch and cleared on normal ball end. Verified both writes in 1000:ae6e and complete reference inventory; reconstructed/tests/test_turn_state.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0876 verified semantic-object-field g_timer_tick_counter uint32_t 1028:0876 1028:0879 13 3 FUN_1000_0270,exported_ordinal_10 Zero-fill; incremented after timer guards, drives intro quotient/remainder schedules, and resets when a new game is initialized. Setup and full 1000:eab1 disassembly/source; test_timer_tick.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0878 verified semantic-object-field g_timer_tick_counter uint32_t 1028:0876 1028:0879 13 3 FUN_1000_0270,exported_ordinal_10 Zero-fill; incremented after timer guards, drives intro quotient/remainder schedules, and resets when a new game is initialized. Setup and full 1000:eab1 disassembly/source; test_timer_tick.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:087a verified semantic-object-field g_intro_marquee_counter uint32_t 1028:087a 1028:087d 8 2 FUN_1000_0270,exported_ordinal_10 Zero-fill; increments on each six-tick intro marquee redraw and selects phase modulo 49. Setup and full timer GDI path; test_timer_tick.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:087c verified semantic-object-field g_intro_marquee_counter uint32_t 1028:087a 1028:087d 8 2 FUN_1000_0270,exported_ordinal_10 Zero-fill; increments on each six-tick intro marquee redraw and selects phase modulo 49. Setup and full timer GDI path; test_timer_tick.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:087e verified semantic-object-field g_highscore_scores int32_t[10] 1028:087e 1028:08a5 2 2 FUN_1000_5c13,FUN_1000_a8ea,FUN_1000_a99c Zero-fill; loaded/defaulted by 1000:a99c, reordered by 1000:abe5, rendered by 1000:5c13, and XOR-serialized by 1000:a8ea. Complete verified reader/writer inventory across 1000:5c13/a8ea/a99c/abe5; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact ten signed dwords, one-based addressing, persistence, ordering, comparison, and decimal rendering are fully proven. +1028:0880 verified semantic-object-field g_highscore_scores int32_t[10] 1028:087e 1028:08a5 3 2 FUN_1000_5c13,FUN_1000_a8ea,FUN_1000_a99c,FUN_1000_abe5 Zero-fill; loaded/defaulted by 1000:a99c, reordered by 1000:abe5, rendered by 1000:5c13, and XOR-serialized by 1000:a8ea. Complete verified reader/writer inventory across 1000:5c13/a8ea/a99c/abe5; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact ten signed dwords, one-based addressing, persistence, ordering, comparison, and decimal rendering are fully proven. +1028:0882 verified semantic-object-field g_highscore_scores int32_t[10] 1028:087e 1028:08a5 2 2 FUN_1000_a8ea,FUN_1000_a99c,FUN_1000_abe5 Zero-fill; loaded/defaulted by 1000:a99c, reordered by 1000:abe5, rendered by 1000:5c13, and XOR-serialized by 1000:a8ea. Complete verified reader/writer inventory across 1000:5c13/a8ea/a99c/abe5; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact ten signed dwords, one-based addressing, persistence, ordering, comparison, and decimal rendering are fully proven. +1028:0884 verified semantic-object-field g_highscore_scores int32_t[10] 1028:087e 1028:08a5 2 2 FUN_1000_a8ea,FUN_1000_a99c,FUN_1000_abe5 Zero-fill; loaded/defaulted by 1000:a99c, reordered by 1000:abe5, rendered by 1000:5c13, and XOR-serialized by 1000:a8ea. Complete verified reader/writer inventory across 1000:5c13/a8ea/a99c/abe5; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact ten signed dwords, one-based addressing, persistence, ordering, comparison, and decimal rendering are fully proven. +1028:089a verified semantic-object-field g_highscore_scores int32_t[10] 1028:087e 1028:08a5 1 0 FUN_1000_abe5 Zero-fill; loaded/defaulted by 1000:a99c, reordered by 1000:abe5, rendered by 1000:5c13, and XOR-serialized by 1000:a8ea. Complete verified reader/writer inventory across 1000:5c13/a8ea/a99c/abe5; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact ten signed dwords, one-based addressing, persistence, ordering, comparison, and decimal rendering are fully proven. +1028:089c verified semantic-object-field g_highscore_scores int32_t[10] 1028:087e 1028:08a5 1 0 FUN_1000_abe5 Zero-fill; loaded/defaulted by 1000:a99c, reordered by 1000:abe5, rendered by 1000:5c13, and XOR-serialized by 1000:a8ea. Complete verified reader/writer inventory across 1000:5c13/a8ea/a99c/abe5; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact ten signed dwords, one-based addressing, persistence, ordering, comparison, and decimal rendering are fully proven. +1028:089e verified semantic-object-field g_highscore_scores int32_t[10] 1028:087e 1028:08a5 1 1 FUN_1000_abe5 Zero-fill; loaded/defaulted by 1000:a99c, reordered by 1000:abe5, rendered by 1000:5c13, and XOR-serialized by 1000:a8ea. Complete verified reader/writer inventory across 1000:5c13/a8ea/a99c/abe5; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact ten signed dwords, one-based addressing, persistence, ordering, comparison, and decimal rendering are fully proven. +1028:08a0 verified semantic-object-field g_highscore_scores int32_t[10] 1028:087e 1028:08a5 1 1 FUN_1000_abe5 Zero-fill; loaded/defaulted by 1000:a99c, reordered by 1000:abe5, rendered by 1000:5c13, and XOR-serialized by 1000:a8ea. Complete verified reader/writer inventory across 1000:5c13/a8ea/a99c/abe5; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact ten signed dwords, one-based addressing, persistence, ordering, comparison, and decimal rendering are fully proven. +1028:08a2 verified semantic-object-field g_highscore_scores int32_t[10] 1028:087e 1028:08a5 0 1 FUN_1000_abe5 Zero-fill; loaded/defaulted by 1000:a99c, reordered by 1000:abe5, rendered by 1000:5c13, and XOR-serialized by 1000:a8ea. Complete verified reader/writer inventory across 1000:5c13/a8ea/a99c/abe5; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact ten signed dwords, one-based addressing, persistence, ordering, comparison, and decimal rendering are fully proven. +1028:08a4 verified semantic-object-field g_highscore_scores int32_t[10] 1028:087e 1028:08a5 0 1 FUN_1000_abe5 Zero-fill; loaded/defaulted by 1000:a99c, reordered by 1000:abe5, rendered by 1000:5c13, and XOR-serialized by 1000:a8ea. Complete verified reader/writer inventory across 1000:5c13/a8ea/a99c/abe5; reconstructed/tests/test_highscores.c; complete verified referring-function closure Exact ten signed dwords, one-based addressing, persistence, ordering, comparison, and decimal rendering are fully proven. +1028:0982 verified semantic-object-field g_player_scores int32_t[4] 1028:0982 1028:0991 1 2 FUN_1000_0270,FUN_1000_5390,FUN_1000_638e Zero-filled; initialized/reset by game setup and updated by scoring paths. Verified one-based reader 1008:0996; score-render tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0984 verified semantic-object-field g_player_scores int32_t[4] 1028:0982 1028:0991 1 2 FUN_1000_0270,FUN_1000_5390,FUN_1000_638e Zero-filled; initialized/reset by game setup and updated by scoring paths. Verified one-based reader 1008:0996; score-render tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0986 verified semantic-object-field g_player_scores int32_t[4] 1028:0982 1028:0991 1 2 FUN_1000_0270,FUN_1000_5390,FUN_1000_a72c Zero-filled; initialized/reset by game setup and updated by scoring paths. Verified one-based reader 1008:0996; score-render tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0988 verified semantic-object-field g_player_scores int32_t[4] 1028:0982 1028:0991 1 2 FUN_1000_0270,FUN_1000_5390,FUN_1000_a72c Zero-filled; initialized/reset by game setup and updated by scoring paths. Verified one-based reader 1008:0996; score-render tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0992 verified semantic-object-field g_player_secondary_scores int32_t[4] 1028:0992 1028:09a1 1 1 FUN_1000_0270,FUN_1000_acc2 Zero-fill; reset for configured players and multiplied for active-player display. Verified reset 1000:a72c and active redraw 1000:acc2; reconstructed/tests/test_player_state.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0994 verified semantic-object-field g_player_secondary_scores int32_t[4] 1028:0992 1028:09a1 1 1 FUN_1000_0270,FUN_1000_acc2 Zero-fill; reset for configured players and multiplied for active-player display. Verified reset 1000:a72c and active redraw 1000:acc2; reconstructed/tests/test_player_state.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0996 verified semantic-object-field g_player_secondary_scores int32_t[4] 1028:0992 1028:09a1 0 2 FUN_1000_0270,FUN_1000_a72c Zero-fill; reset for configured players and multiplied for active-player display. Verified reset 1000:a72c and active redraw 1000:acc2; reconstructed/tests/test_player_state.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0998 verified semantic-object-field g_player_secondary_scores int32_t[4] 1028:0992 1028:09a1 0 2 FUN_1000_0270,FUN_1000_a72c Zero-fill; reset for configured players and multiplied for active-player display. Verified reset 1000:a72c and active redraw 1000:acc2; reconstructed/tests/test_player_state.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:09a2 verified semantic-object-field g_player_score_multipliers uint8_t[4] 1028:09a2 1028:09a5 1 1 FUN_1000_0270,FUN_1000_acc2 Zero-fill; initialized to one and used as unsigned byte factors for secondary-score display. Verified reset 1000:a72c and multiply 1000:acc2; reconstructed/tests/test_player_state.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:09a3 verified semantic-object-field g_player_score_multipliers uint8_t[4] 1028:09a2 1028:09a5 0 2 FUN_1000_0270,FUN_1000_a72c Zero-fill; initialized to one and used as unsigned byte factors for secondary-score display. Verified reset 1000:a72c and multiply 1000:acc2; reconstructed/tests/test_player_state.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:09a6 verified semantic-object-field g_player_sprite_indices uint16_t[4] 1028:09a6 1028:09ad 1 1 FUN_1000_0270,FUN_1000_acc2 Zero-fill; reset to zero and consumed as indices into the 400-series sprite bitmap array. Verified reset 1000:a72c and active-player composite 1000:acc2/0002; player-state/player-sprite tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:09a8 verified semantic-object-field g_player_sprite_indices uint16_t[4] 1028:09a6 1028:09ad 0 2 FUN_1000_0270,FUN_1000_a72c Zero-fill; reset to zero and consumed as indices into the 400-series sprite bitmap array. Verified reset 1000:a72c and active-player composite 1000:acc2/0002; player-state/player-sprite tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:09e2 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 2 2 FUN_1000_0270,FUN_1000_638e,FUN_1000_ae6e Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:09f1 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 3 2 FUN_1000_0270,FUN_1000_638e,FUN_1000_a72c,FUN_1000_ae6e Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:09f7 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a01 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a02 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 4 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a03 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a05 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a07 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a09 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a0b verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a0d verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a0f verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a11 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a13 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 15 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a15 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 15 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a17 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 15 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a19 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 15 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a1b verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 5 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a1d verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 5 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a1f verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 5 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a21 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 5 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a23 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 4 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a25 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 4 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a27 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 4 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a29 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a2b verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a2d verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a2f verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a31 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a33 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a35 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 3 4 FUN_1000_0270,FUN_1000_638e,FUN_1000_ae6e,FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a36 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a38 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a3a verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a3c verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a3e verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a40 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a42 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 5 2 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a44 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 6 5 FUN_1000_0270,FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a46 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 2 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a48 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 2 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0a4a verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_c79c Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0b81 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_b476 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0b98 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 4 0 FUN_1000_b476 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0b9a verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 4 0 FUN_1000_b476 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0b9c verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 2 0 FUN_1000_b476 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0b9e verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 2 0 FUN_1000_b476 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0d73 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_c79c,exported_ordinal_10 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:0dc6 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_c79c,exported_ordinal_10 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1e80 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_7ed9 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1e82 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_7ed9 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1e84 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_7ed9 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1e86 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_7ed9 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1e90 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_7ed9 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1e92 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_7ed9 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1e94 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_7ed9 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1ec3 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1ec5 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1ec7 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1ec9 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1ecb verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1ecd verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1ecf verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1ed1 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1ed3 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 5 1 FUN_1000_7ed9,FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1ed5 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 5 1 FUN_1000_7ed9,FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1ed7 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 4 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1ed9 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 4 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1edb verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 5 1 FUN_1000_7ed9,FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1edd verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 5 1 FUN_1000_7ed9,FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1edf verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 5 1 FUN_1000_7ed9,FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1ee1 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 5 1 FUN_1000_7ed9,FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f16 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f18 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f1a verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f1c verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f1e verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f20 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f22 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f24 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f26 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f28 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f2a verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f2c verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f69 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f6b verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f6d verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f6f verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f71 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f73 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f75 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f77 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f79 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 5 1 FUN_1000_7ed9,FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f7b verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 5 1 FUN_1000_7ed9,FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f7d verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 5 1 FUN_1000_7ed9,FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f7f verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 5 1 FUN_1000_7ed9,FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f81 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 5 1 FUN_1000_7ed9,FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f83 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 5 1 FUN_1000_7ed9,FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f85 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 4 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:1f87 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 4 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:235d verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_7ed9 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:235f verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_7ed9 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2361 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_7ed9 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2363 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_7ed9 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:236d verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_7ed9 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:236f verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_7ed9 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2371 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_7ed9 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23a0 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23a2 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23a4 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23a6 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23a8 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23aa verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23ac verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23ae verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23b0 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 5 1 FUN_1000_7ed9,FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23b2 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 5 1 FUN_1000_7ed9,FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23b4 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 4 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23b6 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 4 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23b8 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 5 1 FUN_1000_7ed9,FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23ba verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 5 1 FUN_1000_7ed9,FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23bc verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 5 1 FUN_1000_7ed9,FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23be verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 5 1 FUN_1000_7ed9,FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23f3 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23f5 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23f7 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23f9 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23fb verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23fd verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:23ff verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2401 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2403 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2405 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2407 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2409 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2446 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2448 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:244a verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:244c verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:244e verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2450 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2452 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2454 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2456 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 6 1 FUN_1000_7ed9,FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2458 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 6 1 FUN_1000_7ed9,FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:245a verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 5 1 FUN_1000_7ed9,FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:245c verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 5 1 FUN_1000_7ed9,FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:245e verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 4 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2460 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 4 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2462 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 4 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2464 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 4 1 FUN_1000_8b0d Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:2679 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 1 exported_ordinal_10 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3340 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_638e Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3342 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_638e Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3344 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_638e Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3346 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 0 FUN_1000_638e Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3371 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 4 2 FUN_1000_6f27,FUN_1000_9e85,FUN_1000_c79c,exported_ordinal_10 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:33c4 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 4 2 FUN_1000_6f27,FUN_1000_9e85,FUN_1000_c79c,exported_ordinal_10 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3417 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 3 1 FUN_1000_6f27,FUN_1000_9e85 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:346a verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 3 1 FUN_1000_6f27,FUN_1000_9e85 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:34bd verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 3 1 FUN_1000_6f27,FUN_1000_9e85 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3969 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 2 0 FUN_1000_ae6e,exported_ordinal_10 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:396b verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 2 0 FUN_1000_ae6e,exported_ordinal_10 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:396d verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 2 0 FUN_1000_ae6e,exported_ordinal_10 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:396f verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 2 0 FUN_1000_ae6e,exported_ordinal_10 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:399a verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 4 2 FUN_1000_ae6e,FUN_1000_b476,FUN_1000_c4e1,exported_ordinal_10 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:39de verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 1 FUN_1000_b476 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3b2a verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_b476 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3b41 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 4 0 FUN_1000_b476 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3b43 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 4 0 FUN_1000_b476 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3b45 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 2 0 FUN_1000_b476 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3b47 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 2 0 FUN_1000_b476 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3b7d verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 0 2 FUN_1000_b476 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3b94 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 4 0 FUN_1000_b476 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3b96 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 4 0 FUN_1000_b476 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3b98 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 2 0 FUN_1000_b476 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:3b9a verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 2 0 FUN_1000_b476 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:41f9 verified semantic-object-field g_collision_records_1_174 TdkpinCollisionRecord[174] 1028:09ae 1028:4217 1 3 FUN_1000_ae6e,exported_ordinal_10 Zero-fill; initialized by 174 indexed calls in the large setup routine. Verified 83-byte writer 1008:0138; OBJECTS.tsv live dump for IDs 1..174; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:424c verified semantic-object-field g_collision_record_175_prefix uint8_t[75] 1028:4218 1028:4262 2 5 FUN_1000_c79c,exported_ordinal_10 Zero-fill; initialized as collision record 175. Verified writer 1008:0138 and OBJECTS.tsv row 175; final eight bytes are separately shared with word-quad storage at 4263..426a.; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:431b verified semantic-object-field g_status_level_bitmaps HBITMAP16[4] 1028:431b 1028:4322 1 1 FUN_1000_51f5,FUN_1000_5390 Zero-filled; DAT resources 701..704 are loaded one-based by verified asset initialization. Complete writer/reader/deletion inventory in 1000:5390,1008:0b9e,1000:51f5; asset/status/cleanup tests; complete verified referring-function closure Exact four HBITMAP slots, resource mapping, threshold-level mapping, primary 146x142 blit use, and ownership lifecycle are fully proven. +1028:431d verified semantic-object-field g_status_level_bitmaps HBITMAP16[4] 1028:431b 1028:4322 1 0 FUN_1000_51f5 Zero-filled; DAT resources 701..704 are loaded one-based by verified asset initialization. Complete writer/reader/deletion inventory in 1000:5390,1008:0b9e,1000:51f5; asset/status/cleanup tests; complete verified referring-function closure Exact four HBITMAP slots, resource mapping, threshold-level mapping, primary 146x142 blit use, and ownership lifecycle are fully proven. +1028:4321 verified semantic-object-field g_status_level_bitmaps HBITMAP16[4] 1028:431b 1028:4322 1 0 FUN_1008_0b9e Zero-filled; DAT resources 701..704 are loaded one-based by verified asset initialization. Complete writer/reader/deletion inventory in 1000:5390,1008:0b9e,1000:51f5; asset/status/cleanup tests; complete verified referring-function closure Exact four HBITMAP slots, resource mapping, threshold-level mapping, primary 146x142 blit use, and ownership lifecycle are fully proven. +1028:4323 verified semantic-object-field g_item_bitmaps_801_809 HBITMAP16[9] 1028:4323 1028:4334 1 1 FUN_1000_51f5,FUN_1000_5390 Zero-filled; DAT resources 801..809 are loaded and deleted one-based. Verified writer/deletion and ID order; asset initializer/cleanup tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:4325 verified semantic-object-field g_item_bitmaps_801_809 HBITMAP16[9] 1028:4323 1028:4334 1 0 FUN_1000_51f5 Zero-filled; DAT resources 801..809 are loaded and deleted one-based. Verified writer/deletion and ID order; asset initializer/cleanup tests; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:43ea verified semantic-object-field wave_output_capabilities WAVEOUTCAPS16 1028:43be 1028:43ed 1 0 FUN_1008_0f2e Zero-filled 48-byte buffer populated by waveOutGetDevCaps for device zero. Windows 3.1 packed field offsets; call 1008:0fca-0fda; dwSupport read at 1008:0fe6-0ffe; strict size assertion and reconstructed/tests/test_sound.c; complete verified referring-function closure Exact Win16 layout is wMid, wPid, 16-bit driver version, 32-byte name, formats, channels, and support; WAVECAPS_VOLUME is bit 4 at offset 44. +1028:43ec verified semantic-object-field wave_output_capabilities WAVEOUTCAPS16 1028:43be 1028:43ed 1 0 FUN_1008_0f2e Zero-filled 48-byte buffer populated by waveOutGetDevCaps for device zero. Windows 3.1 packed field offsets; call 1008:0fca-0fda; dwSupport read at 1008:0fe6-0ffe; strict size assertion and reconstructed/tests/test_sound.c; complete verified referring-function closure Exact Win16 layout is wMid, wPid, 16-bit driver version, 32-byte name, formats, channels, and support; WAVECAPS_VOLUME is bit 4 at offset 44. +1028:43ee verified semantic-object-field wave_output_device_count uint16_t 1028:43ee 1028:43ef 5 3 FUN_1000_638e,FUN_1008_0f2e,FUN_1008_10e3,FUN_1008_1131,FUN_1008_118f Zero-filled; assigned from waveOutGetNumDevs and reset on entry or capability-query failure. Complete verified lifecycle in 1008:0f2e,10e3,1131,118f and sound-toggle reader 1000:638e; reconstructed/tests/test_sound.c and test_key_release.c; complete verified referring-function closure The word is the actual device count, not a Boolean initialized flag; nonzero permits keyboard re-enabling after sound has been disabled. +1028:43f0 verified semantic-object-field wave_output_device_id uint16_t 1028:43f0 1028:43f1 2 0 FUN_1008_0f2e Static zero and never written in the image. Reads before the sole waveOutGetDevCaps and waveOutGetVolume calls at 1008:0fca and 1008:1008; reconstructed/tests/test_sound.c; complete verified referring-function closure Selects wave-output device zero for both capability and volume queries. +1028:43f2 verified semantic-object-field sound_enabled uint8_t 1028:43f2 1028:43f2 3 4 FUN_1000_638e,FUN_1008_0002,FUN_1008_0f2e,FUN_1008_1131 Zero-filled; cleared on every sound initialization entry, set after successful capability/resource setup, and toggled by F12 only when a device exists. Complete verified readers/writers 1008:0002,0f2e,1131 and 1000:638e; sound and key-release tests; complete verified referring-function closure Exact Boolean enable lifecycle, playback gates, disable behavior, and device-gated re-enable behavior are fully proven. +1028:43f3 verified semantic-object-field sound_playing uint8_t 1028:43f3 1028:43f3 3 3 FUN_1008_0f2e,FUN_1008_10e3,FUN_1008_1131,FUN_1008_118f Zero-filled; cleared by initialization/unload and assigned from sndPlaySound's BOOL16 result. All reads/writes in verified 1008:0f2e, 10e3, 1131, and 118f; reconstructed/tests/test_sound.c; complete verified referring-function closure Exact current-playing flag, including stop-without-clear behavior in 118f and failure-to-play clear in 1131. +1028:43f4 verified semantic-object-field sound_volume_step uint8_t 1028:43f4 1028:43f4 0 2 FUN_1008_0f2e Zero-filled; set to ff when volume control is unsupported, otherwise the left-channel high byte rounded down to a multiple of ten. Disassembly 1008:0fe6-102e; exact byte extraction/divide/multiply path; reconstructed/tests/test_sound.c; complete verified referring-function closure Written during successful initialization and otherwise retained; no in-image reader exists. +1028:43f6 verified semantic-object-field sound_buffers Win16FarPtr[22] 1028:43f6 1028:444d 1 0 FUN_1008_10e3 Zero-filled; sound setup stores locked global-memory blocks for resource numbers 2001..2022. All indexed accesses in verified 1008:0f2e, 10e3, and 1131; exact one-based addressing and focused lifecycle tests in reconstructed/tests/test_sound.c; complete verified referring-function closure Exact 22 far-pointer slots, load overwrite behavior, inclusive release order, lack of pointer clearing, and play selection are represented. +1028:43f8 verified semantic-object-field sound_buffers Win16FarPtr[22] 1028:43f6 1028:444d 1 0 FUN_1008_10e3 Zero-filled; sound setup stores locked global-memory blocks for resource numbers 2001..2022. All indexed accesses in verified 1008:0f2e, 10e3, and 1131; exact one-based addressing and focused lifecycle tests in reconstructed/tests/test_sound.c; complete verified referring-function closure Exact 22 far-pointer slots, load overwrite behavior, inclusive release order, lack of pointer clearing, and play selection are represented. +1028:43fa verified semantic-object-field sound_buffers Win16FarPtr[22] 1028:43f6 1028:444d 2 1 FUN_1008_0f2e,FUN_1008_10e3 Zero-filled; sound setup stores locked global-memory blocks for resource numbers 2001..2022. All indexed accesses in verified 1008:0f2e, 10e3, and 1131; exact one-based addressing and focused lifecycle tests in reconstructed/tests/test_sound.c; complete verified referring-function closure Exact 22 far-pointer slots, load overwrite behavior, inclusive release order, lack of pointer clearing, and play selection are represented. +1028:43fc verified semantic-object-field sound_buffers Win16FarPtr[22] 1028:43f6 1028:444d 1 1 FUN_1008_0f2e,FUN_1008_10e3 Zero-filled; sound setup stores locked global-memory blocks for resource numbers 2001..2022. All indexed accesses in verified 1008:0f2e, 10e3, and 1131; exact one-based addressing and focused lifecycle tests in reconstructed/tests/test_sound.c; complete verified referring-function closure Exact 22 far-pointer slots, load overwrite behavior, inclusive release order, lack of pointer clearing, and play selection are represented. +1028:444e verified semantic-object-field tdkpin_palette_handle HPALETTE16 1028:444e 1028:444f 14 1 FUN_1000_5390,FUN_1000_59a0,FUN_1000_5a37,FUN_1000_5c13,FUN_1000_5f29,FUN_1000_5fc0,FUN_1000_616e,FUN_1000_6245,FUN_1000_62dc,FUN_1008_11c5,FUN_1008_149d Zero-filled; assigned the CreatePalette16 result by verified 1008:11c5. Complete reader inventory spans rendering/window functions; verified writer and bitmap loader 1008:149d; reconstructed/tests/test_palette.c; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:4750 verified semantic-object-field g_multimedia_procedures Win16FarPtr[11] 1028:4750 1028:477b 1 3 FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Static zero; populated in exact CTL3D name order by verified loader 1010:01c2. Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:4752 verified semantic-object-field g_multimedia_procedures Win16FarPtr[11] 1028:4750 1028:477b 1 3 FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Static zero; populated in exact CTL3D name order by verified loader 1010:01c2. Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:4754 verified semantic-object-field g_multimedia_procedures Win16FarPtr[11] 1028:4750 1028:477b 0 3 FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Static zero; populated in exact CTL3D name order by verified loader 1010:01c2. Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:4756 verified semantic-object-field g_multimedia_procedures Win16FarPtr[11] 1028:4750 1028:477b 0 3 FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Static zero; populated in exact CTL3D name order by verified loader 1010:01c2. Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:4758 verified semantic-object-field g_multimedia_procedures Win16FarPtr[11] 1028:4750 1028:477b 0 3 FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Static zero; populated in exact CTL3D name order by verified loader 1010:01c2. Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:475a verified semantic-object-field g_multimedia_procedures Win16FarPtr[11] 1028:4750 1028:477b 0 3 FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Static zero; populated in exact CTL3D name order by verified loader 1010:01c2. Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:475c verified semantic-object-field g_multimedia_procedures Win16FarPtr[11] 1028:4750 1028:477b 1 3 FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Static zero; populated in exact CTL3D name order by verified loader 1010:01c2. Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:475e verified semantic-object-field g_multimedia_procedures Win16FarPtr[11] 1028:4750 1028:477b 1 3 FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Static zero; populated in exact CTL3D name order by verified loader 1010:01c2. Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:4760 verified semantic-object-field g_multimedia_procedures Win16FarPtr[11] 1028:4750 1028:477b 0 3 FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Static zero; populated in exact CTL3D name order by verified loader 1010:01c2. Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:4762 verified semantic-object-field g_multimedia_procedures Win16FarPtr[11] 1028:4750 1028:477b 0 3 FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Static zero; populated in exact CTL3D name order by verified loader 1010:01c2. Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:4764 verified semantic-object-field g_multimedia_procedures Win16FarPtr[11] 1028:4750 1028:477b 1 3 FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Static zero; populated in exact CTL3D name order by verified loader 1010:01c2. Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:4766 verified semantic-object-field g_multimedia_procedures Win16FarPtr[11] 1028:4750 1028:477b 1 3 FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Static zero; populated in exact CTL3D name order by verified loader 1010:01c2. Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:4768 verified semantic-object-field g_multimedia_procedures Win16FarPtr[11] 1028:4750 1028:477b 1 3 FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Static zero; populated in exact CTL3D name order by verified loader 1010:01c2. Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:476a verified semantic-object-field g_multimedia_procedures Win16FarPtr[11] 1028:4750 1028:477b 1 3 FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Static zero; populated in exact CTL3D name order by verified loader 1010:01c2. Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:476c verified semantic-object-field g_multimedia_procedures Win16FarPtr[11] 1028:4750 1028:477b 0 3 FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Static zero; populated in exact CTL3D name order by verified loader 1010:01c2. Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:476e verified semantic-object-field g_multimedia_procedures Win16FarPtr[11] 1028:4750 1028:477b 0 3 FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Static zero; populated in exact CTL3D name order by verified loader 1010:01c2. Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:4770 verified semantic-object-field g_multimedia_procedures Win16FarPtr[11] 1028:4750 1028:477b 0 4 FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Static zero; populated in exact CTL3D name order by verified loader 1010:01c2. Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:4772 verified semantic-object-field g_multimedia_procedures Win16FarPtr[11] 1028:4750 1028:477b 0 4 FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Static zero; populated in exact CTL3D name order by verified loader 1010:01c2. Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:4774 verified semantic-object-field g_multimedia_procedures Win16FarPtr[11] 1028:4750 1028:477b 0 3 FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Static zero; populated in exact CTL3D name order by verified loader 1010:01c2. Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:4776 verified semantic-object-field g_multimedia_procedures Win16FarPtr[11] 1028:4750 1028:477b 0 3 FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Static zero; populated in exact CTL3D name order by verified loader 1010:01c2. Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:4778 verified semantic-object-field g_multimedia_procedures Win16FarPtr[11] 1028:4750 1028:477b 2 3 FUN_1010_0002,FUN_1010_0079,FUN_1010_01c2,FUN_1010_0472 Static zero; populated in exact CTL3D name order by verified loader 1010:01c2. Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:477a verified semantic-object-field g_multimedia_procedures Win16FarPtr[11] 1028:4750 1028:477b 2 3 FUN_1010_0002,FUN_1010_0079,FUN_1010_01c2,FUN_1010_0472 Static zero; populated in exact CTL3D name order by verified loader 1010:01c2. Verified load/use/legacy-slot-8/clear lifecycle and focused tests.; complete verified referring-function closure Slots are AutoSubclass, ColorChange, CtlColorEx, Enabled, DlgFramePaint, GetVer, Register, SubclassDlg, SubclassDlgEx, SubclassCtl, Unregister. +1028:477c verified semantic-object-field g_multimedia_version uint16_t 1028:477c 1028:477d 1 1 FUN_1010_01c2 Static zero; assigned from CTL3DGETVER after successful registration. Verified loader version >=9 gate and version-8 cleanup test.; complete verified referring-function closure Exact CTL3D compatibility version word. +1028:477e verified semantic-object-field g_multimedia_auto_subclassed uint8_t 1028:477e 1028:477e 0 3 FUN_1010_01c2,FUN_1010_0472 Static zero; set from CTL3DAUTOSUBCLASS only on modern/nonzero-request path. Verified modern success and legacy/disabled zero branches.; complete verified referring-function closure Boolean records whether process auto-subclassing succeeded. +1028:477f verified semantic-object-field g_multimedia_argument_2 uint8_t 1028:477f 1028:477f 0 2 FUN_1010_01c2,FUN_1010_0472 Stored from loader second byte argument after full initialization. Disassembly 1010:0373; focused export/loader test.; complete verified referring-function closure Exact parameter publication order is second argument first. +1028:4780 verified semantic-object-field g_multimedia_argument_1 uint8_t 1028:4780 1028:4780 0 2 FUN_1010_01c2,FUN_1010_0472 Stored from loader first byte argument after full initialization. Disassembly 1010:0376; focused export/loader test.; complete verified referring-function closure Exact parameter publication order is second argument then first. +1028:4781 verified semantic-object-field g_multimedia_module HINSTANCE16 1028:4781 1028:4782 14 4 FUN_1010_0002,FUN_1010_01c2,FUN_1010_0472 Static zero; assigned by LoadLibrary16 and retained after FreeLibrary16. Verified <32 error, modern/legacy load, failure unload, and explicit cleanup tests.; complete verified referring-function closure Unaligned module handle; values below 32 are Win16 load errors rather than unloadable handles. +1028:4783 verified semantic-object-field g_multimedia_pending uint8_t 1028:4783 1028:4783 0 2 FUN_1010_03af,FUN_1010_0472 Static zero; cleared by unit startup and every exported initialization return. Verified stores in 1010:03af/0472 and multimedia tests.; complete verified referring-function closure Exact transient pending byte; no reader exists in this image. +1028:4784 verified semantic-object-field g_multimedia_initialized uint8_t 1028:4784 1028:4784 5 4 FUN_1010_0002,FUN_1010_0079,FUN_1010_01c2,FUN_1010_0472 Static zero; set only after Register, GetVer >=9, and Enabled all succeed; cleared by cleanup. Complete verified loader/finalizer/unload lifecycle and branch tests.; complete verified referring-function closure Gates every dynamic helper use with exact boolean semantics. +1028:478a verified semantic-object-field g_multimedia_windows_version uint16_t 1028:478a 1028:478b 1 1 FUN_1010_0472 Low word returned by GetVersion16 during unit startup. Verified 3.0/3.10/4.0 major-minor branches and startup tests.; complete verified referring-function closure Low-byte major, high-byte minor; upper GetVersion word is discarded. +1028:478b verified semantic-object-field g_multimedia_windows_version uint16_t 1028:478a 1028:478b 1 0 FUN_1010_0472 Low word returned by GetVersion16 during unit startup. Verified 3.0/3.10/4.0 major-minor branches and startup tests.; complete verified referring-function closure Low-byte major, high-byte minor; upper GetVersion word is discarded. +1028:478c verified semantic-object-field g_multimedia_legacy_windows uint8_t 1028:478c 1028:478c 3 1 FUN_1010_01c2,FUN_1010_0472 Set exactly for Windows 3.0 through 3.9. Verified writer and all loader branch consumers.; complete verified referring-function closure Selects path probing, legacy procedure policy, and AutoSubclass suppression. +1028:47a2 verified semantic-object-field g_multimedia_system_directory_length uint16_t 1028:47a2 1028:47a3 1 1 FUN_1010_0472 Return from GetSystemDirectory16 with maximum 200. Verified zero/nonzero path-probe gate and tests.; complete verified referring-function closure Exact length for adjacent system-directory buffer. +1028:4abe verified semantic-object-field g_tpwincrt_saved_exit_proc Win16FarPtr 1028:4abe 1028:4ac1 1 1 FUN_1008_24a5,FUN_1008_2554 Zero-fill; receives the prior Borland ExitProc. Verified predecessor save/restore ordering and lifecycle tests.; complete verified referring-function closure Exact mutable ExitProc chain link. +1028:4ac0 verified semantic-object-field g_tpwincrt_saved_exit_proc Win16FarPtr 1028:4abe 1028:4ac1 1 1 FUN_1008_24a5,FUN_1008_2554 Zero-fill; receives the prior Borland ExitProc. Verified predecessor save/restore ordering and lifecycle tests.; complete verified referring-function closure Exact mutable ExitProc chain link. +1028:4ac2 verified semantic-object-field g_tpwincrt_screen_buffer Win16FarPtr 1028:4ac2 1028:4ac5 3 1 FUN_1008_19f8,FUN_1008_1d77,FUN_1008_21e2 Static zero; allocated on WM_CREATE and released on WM_DESTROY. Verified allocation/fill, circular readers, free/clear lifecycle, and tests.; complete verified referring-function closure Exact far pointer to columns*rows character cells. +1028:4ac4 verified semantic-object-field g_tpwincrt_screen_buffer Win16FarPtr 1028:4ac2 1028:4ac5 1 1 FUN_1008_1d77,FUN_1008_21e2 Static zero; allocated on WM_CREATE and released on WM_DESTROY. Verified allocation/fill, circular readers, free/clear lifecycle, and tests.; complete verified referring-function closure Exact far pointer to columns*rows character cells. +1028:4ac6 verified semantic-object-field g_tpwincrt_view_metrics struct TpWinCrtViewMetrics 1028:4ac6 1028:4ad3 3 1 FUN_1008_19b7,FUN_1008_1f0c,FUN_1008_1f68 Static zero; populated from client size/font metrics. All arithmetic, caret, paint, scroll, size, and initialization paths are verified.; complete verified referring-function closure Seven exact uint16 fields: visible dimensions, max origins, character dimensions, and caret y offset. +1028:4ac8 verified semantic-object-field g_tpwincrt_view_metrics struct TpWinCrtViewMetrics 1028:4ac6 1028:4ad3 3 1 FUN_1008_19b7,FUN_1008_1f0c,FUN_1008_1f68 Static zero; populated from client size/font metrics. All arithmetic, caret, paint, scroll, size, and initialization paths are verified.; complete verified referring-function closure Seven exact uint16 fields: visible dimensions, max origins, character dimensions, and caret y offset. +1028:4aca verified semantic-object-field g_tpwincrt_view_metrics struct TpWinCrtViewMetrics 1028:4ac6 1028:4ad3 4 1 FUN_1008_1865,FUN_1008_18ee,FUN_1008_1f0c,FUN_1008_1f68 Static zero; populated from client size/font metrics. All arithmetic, caret, paint, scroll, size, and initialization paths are verified.; complete verified referring-function closure Seven exact uint16 fields: visible dimensions, max origins, character dimensions, and caret y offset. +1028:4acc verified semantic-object-field g_tpwincrt_view_metrics struct TpWinCrtViewMetrics 1028:4ac6 1028:4ad3 4 1 FUN_1008_1865,FUN_1008_18ee,FUN_1008_1f0c,FUN_1008_1f68 Static zero; populated from client size/font metrics. All arithmetic, caret, paint, scroll, size, and initialization paths are verified.; complete verified referring-function closure Seven exact uint16 fields: visible dimensions, max origins, character dimensions, and caret y offset. +1028:4ace verified semantic-object-field g_tpwincrt_view_metrics struct TpWinCrtViewMetrics 1028:4ac6 1028:4ad3 11 1 FUN_1008_1818,FUN_1008_18ee,FUN_1008_1a39,FUN_1008_1dcc,FUN_1008_1f68,FUN_1008_1fe8 Static zero; populated from client size/font metrics. All arithmetic, caret, paint, scroll, size, and initialization paths are verified.; complete verified referring-function closure Seven exact uint16 fields: visible dimensions, max origins, character dimensions, and caret y offset. +1028:4ad0 verified semantic-object-field g_tpwincrt_view_metrics struct TpWinCrtViewMetrics 1028:4ac6 1028:4ad3 11 1 FUN_1008_1818,FUN_1008_18ee,FUN_1008_1a39,FUN_1008_1a82,FUN_1008_1dcc,FUN_1008_1f68,FUN_1008_1fe8 Static zero; populated from client size/font metrics. All arithmetic, caret, paint, scroll, size, and initialization paths are verified.; complete verified referring-function closure Seven exact uint16 fields: visible dimensions, max origins, character dimensions, and caret y offset. +1028:4ad2 verified semantic-object-field g_tpwincrt_view_metrics struct TpWinCrtViewMetrics 1028:4ac6 1028:4ad3 1 1 FUN_1008_1818,FUN_1008_1fe8 Static zero; populated from client size/font metrics. All arithmetic, caret, paint, scroll, size, and initialization paths are verified.; complete verified referring-function closure Seven exact uint16 fields: visible dimensions, max origins, character dimensions, and caret y offset. +1028:4ad4 verified semantic-object-field g_tpwincrt_paint_dc HDC16 1028:4ad4 1028:4ad5 8 2 FUN_1008_1779,FUN_1008_17e2,FUN_1008_1a39,FUN_1008_1dcc,FUN_1008_1fe8 Static zero; assigned by GetDC16 or BeginPaint16. Verified 1008:1779/17e2 and paint/render consumers.; complete verified referring-function closure Exact object boundary, type, initialization, and full in-image reader/writer lifecycle are verified. +1028:4ada verified semantic-object-field g_tpwincrt_paint PAINTSTRUCT16 1028:4ad6 1028:4af5 1 0 FUN_1008_1dcc Zero-filled persistent structure populated by BeginPaint16. Wine 11.15 PAINTSTRUCT16 layout; fixed pointer in 1008:1779/17e2; rcPaint reads in verified 1008:1dcc.; complete verified referring-function closure Exact HDC, erase flag, RECT16, restore/update flags, and 16 reserved bytes; extent ends immediately before saved font at 4af6. +1028:4adc verified semantic-object-field g_tpwincrt_paint PAINTSTRUCT16 1028:4ad6 1028:4af5 1 0 FUN_1008_1dcc Zero-filled persistent structure populated by BeginPaint16. Wine 11.15 PAINTSTRUCT16 layout; fixed pointer in 1008:1779/17e2; rcPaint reads in verified 1008:1dcc.; complete verified referring-function closure Exact HDC, erase flag, RECT16, restore/update flags, and 16 reserved bytes; extent ends immediately before saved font at 4af6. +1028:4ade verified semantic-object-field g_tpwincrt_paint PAINTSTRUCT16 1028:4ad6 1028:4af5 1 0 FUN_1008_1dcc Zero-filled persistent structure populated by BeginPaint16. Wine 11.15 PAINTSTRUCT16 layout; fixed pointer in 1008:1779/17e2; rcPaint reads in verified 1008:1dcc.; complete verified referring-function closure Exact HDC, erase flag, RECT16, restore/update flags, and 16 reserved bytes; extent ends immediately before saved font at 4af6. +1028:4ae0 verified semantic-object-field g_tpwincrt_paint PAINTSTRUCT16 1028:4ad6 1028:4af5 1 0 FUN_1008_1dcc Zero-filled persistent structure populated by BeginPaint16. Wine 11.15 PAINTSTRUCT16 layout; fixed pointer in 1008:1779/17e2; rcPaint reads in verified 1008:1dcc.; complete verified referring-function closure Exact HDC, erase flag, RECT16, restore/update flags, and 16 reserved bytes; extent ends immediately before saved font at 4af6. +1028:4af6 verified semantic-object-field g_tpwincrt_previous_font HGDIOBJ16 1028:4af6 1028:4af7 1 1 FUN_1008_1779,FUN_1008_17e2 Static zero; receives SelectObject16 result. Verified paired stores/reads in 1008:1779 and 17e2.; complete verified referring-function closure Stock-font replacement is restored exactly before releasing the drawing context. +1028:4af8 verified semantic-object-field g_tpwincrt_input_buffer uint8_t[64] 1028:4af8 1028:4b37 1 0 FUN_1008_1c5f Zero-filled DGROUP storage. Verified append, signed-capacity suppression, blocking dequeue, overlapping shift, line editing, and focused tests.; complete verified referring-function closure Exact fixed 64-byte FIFO input queue. +1028:4d38 verified semantic-object-field g_borland_heap_request_bytes uint16_t 1028:4d38 1028:4d39 4 1 FUN_1020_01ca Zero-fill; 1020:01ca stores the current allocation request before local/global attempts and reuses it across HeapError retries. Complete sole-function references; verified borland_try_get_mem source and heap core/path tests; complete verified referring-function closure Exact retry-stable uint16 request size, local/global threshold comparisons, and HeapError callback argument are fully represented. diff --git a/original/DECOMPILATION.md b/original/DECOMPILATION.md index bf6c91a..9f0f864 100644 --- a/original/DECOMPILATION.md +++ b/original/DECOMPILATION.md @@ -15,15 +15,26 @@ the output are therefore analysis-generated identifiers. ## Outputs -- `TDKPIN_GHIDRA_RAW.c`: C-like Ghidra output for every recovered in-image function. -- `TDKPIN_PHYSICS_RESTORED.c`: syntax-checked, address-linked transcription of - the fixed-point state and recovered type-1/type-2 response arithmetic. -- `FUNCTIONS.tsv`: address ledger separating in-image functions from imported APIs. -- `COVERAGE.tsv`: executable-block, instruction, function-body, and undefined-range audit. +- `TDKPIN_GHIDRA_RAW.c`: preserved initial Ghidra export; immutable evidence. +- `TDKPIN_GHIDRA_COMPLETE_RAW.c`: separate regenerated C-like Ghidra output for + every currently recovered in-image function, with Win16 import signatures applied. +- `TDKPIN_PHYSICS_RESTORED.c` and `TDKPIN_MECHANICS_RESTORED.c`: preserved + historical partial transcriptions, explicitly superseded by the complete + address-linked modules under `reconstructed/`. +- `FUNCTIONS.tsv` and `COVERAGE.tsv`: preserved inventories paired with the initial raw export. +- `COMPLETE_FUNCTIONS.tsv` and `COMPLETE_COVERAGE.tsv`: regenerated inventories + paired with `TDKPIN_GHIDRA_COMPLETE_RAW.c`. +- `BINARY_FUNCTIONS.tsv`: function extents, segments, provisional conventions, and signatures. +- `REFERENCES.tsv`, `DEFINED_DATA.tsv`, and `SYMBOLS.tsv`: reproducible call/data evidence. +- `UNEXPLAINED.tsv`: exact classification of bytes not representable by a normal + non-overlapping Ghidra code/data unit. +- `FUNCTION_RECONSTRUCTION.tsv`: semantic reconstruction status for every in-image function. - `OBJECTS.tsv`: all 175 initialized collision/rule records, including geometry, Real48 response values, flags, layers, scores, and render bounds. - `tools/ExportDecompilation.java`: deterministic decompiler exporter. -- `tools/SeedMissingEntrypoints.java`: seeds one missed NE export and the NE startup entry. +- `tools/SeedMissingEntrypoints.java`: classifies compiler data and seeds missed NE/runtime entries. +- `tools/ExportProgramEvidence.java`: regenerates function metadata, references, + data, symbols, and exceptional executable-byte evidence. - `tools/AuditCoverage.java`: regenerates the byte-coverage audit. - `tools/decompile.sh`: runs the import, repair, export, and audit from scratch. - `tools/dump_original_objects.py`: regenerates the initialized object ledger @@ -32,23 +43,26 @@ the output are therefore analysis-generated identifiers. ## Accounting - 301/301 NE exported entry points have corresponding in-image functions. -- 62 additional internal/startup functions were recovered. -- 363 in-image functions were submitted to the decompiler. -- 363 produced C-like output; none returned a decompiler failure. +- 90 additional internal/startup/runtime functions were recovered. +- 391 in-image functions were submitted to the decompiler. +- 391 produced C-like output; none returned a decompiler failure. - 292 imported Win16 APIs are recorded separately and are not represented as fake bodies. -- 91,332/93,064 executable-segment bytes (98.14%) are instructions in recovered function bodies. -- 1,730 executable-segment bytes remain undefined. Most are islands in the runtime-heavy fifth - segment and may include embedded tables or alignment, but they have not been fully classified. +- 92,780 bytes are disassembled instructions and 282 bytes are embedded compiler data. +- 93,062/93,064 executable-segment bytes have non-overlapping Ghidra code/data units. +- The remaining two bytes are fully classified in `UNEXPLAINED.tsv`: one is the + first opcode byte of an overlapping Borland alternate entry at `1020:0666`, + and one is an alignment NOP at `1020:0dea`. Ghidra's initial NE analysis missed export ordinal 10 at `1000:eab1` and the program entry at -`1000:fd85`. Both were verified as code from the image bytes, explicitly disassembled, and -included in the final output. +`1000:fd85`, plus 28 entries in the Borland runtime segment. Each added entry was +verified from prologue/control-flow/return bytes or a direct recovered call target +before being submitted to the decompiler. ## Fidelity boundary -`TDKPIN_GHIDRA_RAW.c` is a decompilation artifact, not recovered original source and not yet a -buildable replacement. In particular, Ghidra still emits guessed parameter lists, generic data -types, unnamed globals, and several warnings around segmented pointers, stack tracking, and one -indirect jump table. The source has not been executed against Windows 3.x or compared -differentially with the original program. Consequently, the current result establishes broad -static code coverage, not source-level semantic parity or a reproducible binary build. +`TDKPIN_GHIDRA_RAW.c` remains an immutable decompilation artifact rather than the +readable deliverable. Its guessed types and names are intentionally preserved as evidence. +The separate modules under `reconstructed/` now provide the address-linked C reconstruction; +their completeness, typed data/import/resource ledgers, strict host harnesses, and focused live +Wine comparisons are tracked in `RECONSTRUCTION_PROGRESS.md`. No claim is made that rebuilding +those portable semantic modules reproduces a byte-identical Borland NE image. diff --git a/original/DEFINED_DATA.tsv b/original/DEFINED_DATA.tsv new file mode 100644 index 0000000..889075c --- /dev/null +++ b/original/DEFINED_DATA.tsv @@ -0,0 +1,579 @@ +address block length data_type label value +1000:0000 Code1 2 word[1] code_segment_1_tag - +1000:026e Code1 2 word[1] code1_embedded_word_026e - +1008:0000 Code2 2 word[1] code_segment_2_tag - +1008:0f2c Code2 2 word[1] code2_embedded_word_0f2c - +1008:11bd Code2 8 word[4] code2_embedded_words_11bd - +1008:131e Code2 8 word[4] code2_embedded_words_131e - +1010:0000 Code3 2 word[1] code_segment_3_tag - +1010:0470 Code3 2 word[1] code3_embedded_word_0470 - +1018:0000 Code4 2 word[1] code_segment_4_tag - +1020:0000 Code5 2 word[1] code_segment_5_tag - +1020:0107 Code5 38 byte[38] borland_runtime_copyright - +1020:1191 Code5 42 byte[42] real48_table_1191 - +1020:1240 Code5 36 byte[36] real48_table_1240 - +1020:12d7 Code5 48 byte[48] real48_table_12d7 - +1020:13e8 Code5 78 byte[78] real48_table_13e8 - +1020:14fb Code5 4 undefined4 DAT_1020_14fb 4F000000h +1020:14ff Code5 2 undefined2 DAT_1020_14ff FFE0h +1020:1537 Code5 2 undefined2 DAT_1020_1537 8405h +1028:0010 Data6 20 string s_IWIKTDK_Highscores_1028_0010 "IWIKTDK Highscores" +1028:0222 Data6 10 string "FLIPPER3D" +1028:022c Data6 25 string "TDK Pinball Machine 1.00" +1028:0253 Data6 13 string "uft bereits!" +1028:026a Data6 64 string "gend freier Speicher. Beenden Sie bitte alle anderen Programme." +1028:02aa Data6 25 string "TDK Pinball Machine 1.00" +1028:02c7 Data6 9 string "Settings" +1028:02d0 Data6 9 string "Language" +1028:02d9 Data6 6 string "Speed" +1028:02df Data6 21 string "No timer available!" +1028:02f4 Data6 12 string "HIGH SCORES" +1028:0306 Data6 11 string "HelpScreen" +1028:0312 Data6 14 string "HiScores.Dat" +1028:0320 Data6 13 string "HiScores.Dat" +1028:032d Data6 8 string "No Name" +1028:0336 Data6 19 string "TDK Pinball Player" +1028:0349 Data6 42 string "Congratulations! This is a Top Ten Score!" +1028:0373 Data6 24 string "Please input your name:" +1028:038b Data6 10 string "HighScore" +1028:0396 Data6 50 string "TDK Pinball Machine needs Windows 3.10 or higher!" +1028:03c8 Data6 25 string "TDK Pinball Machine 1.00" +1028:03ea Data6 2 undefined2 DAT_1028_03ea 189Eh +1028:03ec Data6 2 undefined2 DAT_1028_03ec 0000h +1028:03ee Data6 2 undefined2 DAT_1028_03ee 11F2h +1028:03f0 Data6 2 undefined2 DAT_1028_03f0 0000h +1028:0446 Data6 9 string "Settings" +1028:044f Data6 6 string "Sound" +1028:0462 Data6 8 string "Display" +1028:0470 Data6 18 string "CTL3DAUTOSUBCLASS" +1028:0482 Data6 17 string "CTL3DCOLORCHANGE" +1028:0493 Data6 16 string "CTL3DCTLCOLOREX" +1028:04a3 Data6 13 string "CTL3DENABLED" +1028:04b0 Data6 19 string "CTL3DDLGFRAMEPAINT" +1028:04c3 Data6 12 string "CTL3DGETVER" +1028:04cf Data6 14 string "CTL3DREGISTER" +1028:04dd Data6 17 string "CTL3DSUBCLASSDLG" +1028:04ee Data6 19 string "CTL3DSUBCLASSDLGEX" +1028:0501 Data6 17 string "CTL3DSUBCLASSCTL" +1028:0512 Data6 16 string "CTL3DUNREGISTER" +1028:0538 Data6 2 undefined2 DAT_1028_0538 8000h +1028:053a Data6 2 undefined2 DAT_1028_053a 8000h +1028:053c Data6 2 undefined2 DAT_1028_053c 8000h +1028:053e Data6 2 undefined2 DAT_1028_053e 8000h +1028:0540 Data6 2 undefined2 DAT_1028_0540 0050h +1028:0542 Data6 2 undefined2 DAT_1028_0542 0019h +1028:0544 Data6 2 undefined2 DAT_1028_0544 0000h +1028:0546 Data6 2 undefined2 DAT_1028_0546 0000h +1028:0548 Data6 2 undefined2 DAT_1028_0548 0000h +1028:054a Data6 2 undefined2 DAT_1028_054a 0000h +1028:054c Data6 2 undefined2 DAT_1028_054c 0550h +1028:054e Data6 2 undefined2 DAT_1028_054e 1028h +1028:0550 Data6 14 string "(Inactive %s)" +1028:055e Data6 1 undefined1 DAT_1028_055e 01h +1028:055f Data6 1 undefined1 DAT_1028_055f 00h +1028:0560 Data6 1 undefined1 DAT_1028_0560 01h +1028:056c Data6 2 undefined2 DAT_1028_056c 0000h +1028:056e Data6 2 undefined2 DAT_1028_056e 0000h +1028:0570 Data6 2 undefined2 DAT_1028_0570 0000h +1028:0572 Data6 2 undefined2 DAT_1028_0572 0000h +1028:0578 Data6 2 undefined2 DAT_1028_0578 057Ch +1028:057a Data6 2 undefined2 DAT_1028_057a 1028h +1028:057c Data6 9 string "TPWinCrt" +1028:0586 Data6 2 undefined2 DAT_1028_0586 0000h +1028:0588 Data6 2 undefined2 DAT_1028_0588 0000h +1028:058a Data6 2 undefined2 DAT_1028_058a 0000h +1028:058c Data6 1 undefined1 DAT_1028_058c 00h +1028:058d Data6 1 undefined1 DAT_1028_058d 00h +1028:058e Data6 1 undefined1 DAT_1028_058e 00h +1028:058f Data6 1 undefined1 DAT_1028_058f 00h +1028:0590 Data6 1 undefined1 DAT_1028_0590 25h +1028:0591 Data6 1 undefined1 DAT_1028_0591 00h +1028:0592 Data6 1 undefined1 DAT_1028_0592 00h +1028:0593 Data6 1 undefined1 DAT_1028_0593 00h +1028:0594 Data6 1 undefined1 DAT_1028_0594 27h +1028:0595 Data6 1 undefined1 DAT_1028_0595 00h +1028:0596 Data6 1 undefined1 DAT_1028_0596 00h +1028:0597 Data6 1 undefined1 DAT_1028_0597 01h +1028:064e Data6 4 undefined4 DAT_1028_064e 00000000h +1028:0652 Data6 2 undefined2 DAT_1028_0652 0294h +1028:0654 Data6 2 undefined2 DAT_1028_0654 1228h +1028:0656 Data6 2 undefined2 DAT_1028_0656 0290h +1028:0658 Data6 2 undefined2 DAT_1028_0658 1228h +1028:0666 Data6 2 undefined2 DAT_1028_0666 018Ch +1028:0668 Data6 2 undefined2 DAT_1028_0668 1228h +1028:066a Data6 1 undefined1 DAT_1028_066a 00h +1028:066c Data6 2 undefined2 DAT_1028_066c 0000h +1028:066e Data6 2 undefined2 DAT_1028_066e 0000h +1028:0670 Data6 2 undefined2 DAT_1028_0670 0000h +1028:0672 Data6 2 undefined2 DAT_1028_0672 0000h +1028:0674 Data6 2 undefined2 DAT_1028_0674 0000h +1028:0676 Data6 2 undefined2 DAT_1028_0676 0000h +1028:0678 Data6 2 undefined2 DAT_1028_0678 0000h +1028:0682 Data6 2 undefined2 DAT_1028_0682 0000h +1028:0684 Data6 2 undefined2 DAT_1028_0684 0000h +1028:068c Data6 12 string "TurboWindow" +1028:0698 Data6 27 string "Error code = %d. Continue?" +1028:06b3 Data6 18 string "Application Error" +1028:06f2 Data6 1 undefined1 DAT_1028_06f2 01h +1028:06f4 Data6 2 undefined2 DAT_1028_06f4 2000h +1028:06f6 Data6 2 undefined2 DAT_1028_06f6 0000h +1028:06f8 Data6 2 undefined2 DAT_1028_06f8 0000h +1028:06fa Data6 1 undefined1 DAT_1028_06fa 00h +1028:06fc Data6 2 undefined2 DAT_1028_06fc 0000h +1028:06fe Data6 2 undefined2 DAT_1028_06fe 0000h +1028:0700 Data6 2 undefined2 DAT_1028_0700 0000h +1028:0702 Data6 4 undefined4 DAT_1028_0702 00000000h +1028:0706 Data6 2 undefined2 DAT_1028_0706 0000h +1028:0708 Data6 2 undefined2 DAT_1028_0708 0400h +1028:070a Data6 2 undefined2 DAT_1028_070a 2000h +1028:070c Data6 2 undefined2 DAT_1028_070c 0002h +1028:070e Data6 2 undefined2 DAT_1028_070e 0000h +1028:0710 Data6 2 undefined2 DAT_1028_0710 0000h +1028:0712 Data6 2 undefined2 DAT_1028_0712 0000h +1028:0714 Data6 2 undefined2 DAT_1028_0714 0000h +1028:0716 Data6 1 undefined1 DAT_1028_0716 00h +1028:0718 Data6 2 undefined2 DAT_1028_0718 0000h +1028:071a Data6 2 undefined2 DAT_1028_071a 0000h +1028:071c Data6 2 undefined2 DAT_1028_071c 0000h +1028:071e Data6 2 undefined2 DAT_1028_071e 0000h +1028:0720 Data6 2 undefined2 DAT_1028_0720 0000h +1028:0722 Data6 2 undefined2 DAT_1028_0722 0000h +1028:0724 Data6 2 undefined2 DAT_1028_0724 0000h +1028:0726 Data6 1 undefined1 DAT_1028_0726 00h +1028:0727 Data6 1 undefined1 DAT_1028_0727 02h +1028:0728 Data6 32 string "Runtime error 000 at 0000:0000." +1028:0748 Data6 2 undefined2 DAT_1028_0748 0000h +1028:07bf Data6 2 undefined2 DAT_1028_07bf 0000h +1028:07c1 Data6 2 undefined2 DAT_1028_07c1 0000h +1028:07c4 Data6 1 undefined1 DAT_1028_07c4 00h +1028:07c5 Data6 1 undefined1 DAT_1028_07c5 00h +1028:07c6 Data6 1 undefined1 DAT_1028_07c6 00h +1028:07c7 Data6 1 undefined1 DAT_1028_07c7 00h +1028:07c8 Data6 1 undefined1 DAT_1028_07c8 00h +1028:07c9 Data6 1 undefined1 DAT_1028_07c9 00h +1028:07ca Data6 1 undefined1 DAT_1028_07ca 00h +1028:07cb Data6 1 undefined1 DAT_1028_07cb 00h +1028:07cc Data6 1 undefined1 DAT_1028_07cc 00h +1028:07cd Data6 2 undefined2 DAT_1028_07cd 0000h +1028:07cf Data6 1 undefined1 DAT_1028_07cf 00h +1028:07d0 Data6 1 undefined1 DAT_1028_07d0 00h +1028:07d1 Data6 1 undefined1 DAT_1028_07d1 00h +1028:07d2 Data6 1 undefined1 DAT_1028_07d2 00h +1028:07d3 Data6 2 undefined2 DAT_1028_07d3 0000h +1028:07d5 Data6 2 undefined2 DAT_1028_07d5 0000h +1028:07d7 Data6 2 undefined2 DAT_1028_07d7 0000h +1028:07d9 Data6 2 undefined2 DAT_1028_07d9 0000h +1028:07db Data6 2 undefined2 DAT_1028_07db 0000h +1028:07dd Data6 2 undefined2 DAT_1028_07dd 0000h +1028:07df Data6 2 undefined2 DAT_1028_07df 0000h +1028:07e1 Data6 2 undefined2 DAT_1028_07e1 0000h +1028:07e3 Data6 2 undefined2 DAT_1028_07e3 0000h +1028:07e5 Data6 2 undefined2 DAT_1028_07e5 0000h +1028:07e7 Data6 2 undefined2 DAT_1028_07e7 0000h +1028:07e9 Data6 2 undefined2 DAT_1028_07e9 0000h +1028:07eb Data6 2 undefined2 DAT_1028_07eb 0000h +1028:07ed Data6 2 undefined2 DAT_1028_07ed 0000h +1028:07ef Data6 2 undefined2 DAT_1028_07ef 0000h +1028:07f1 Data6 2 undefined2 DAT_1028_07f1 0000h +1028:07f3 Data6 2 undefined2 DAT_1028_07f3 0000h +1028:07f5 Data6 2 undefined2 DAT_1028_07f5 0000h +1028:07f7 Data6 2 undefined2 DAT_1028_07f7 0000h +1028:07f9 Data6 2 undefined2 DAT_1028_07f9 0000h +1028:07fb Data6 2 undefined2 DAT_1028_07fb 0000h +1028:07fd Data6 2 undefined2 DAT_1028_07fd 0000h +1028:07ff Data6 2 undefined2 DAT_1028_07ff 0000h +1028:0801 Data6 2 undefined2 DAT_1028_0801 0000h +1028:0803 Data6 2 undefined2 DAT_1028_0803 0000h +1028:0805 Data6 2 undefined2 DAT_1028_0805 0000h +1028:0807 Data6 2 undefined2 DAT_1028_0807 0000h +1028:0809 Data6 2 undefined2 DAT_1028_0809 0000h +1028:080b Data6 2 undefined2 DAT_1028_080b 0000h +1028:080d Data6 2 undefined2 DAT_1028_080d 0000h +1028:080f Data6 2 undefined2 DAT_1028_080f 0000h +1028:0811 Data6 2 undefined2 DAT_1028_0811 0000h +1028:0813 Data6 2 undefined2 DAT_1028_0813 0000h +1028:0815 Data6 2 undefined2 DAT_1028_0815 0000h +1028:0817 Data6 1 undefined1 DAT_1028_0817 00h +1028:0818 Data6 1 undefined1 DAT_1028_0818 00h +1028:081b Data6 1 undefined1 DAT_1028_081b 00h +1028:081c Data6 1 undefined1 DAT_1028_081c 00h +1028:0821 Data6 2 undefined2 DAT_1028_0821 0000h +1028:0823 Data6 2 undefined2 DAT_1028_0823 0000h +1028:0829 Data6 2 undefined2 DAT_1028_0829 0000h +1028:082b Data6 2 undefined2 DAT_1028_082b 0000h +1028:082d Data6 2 undefined2 DAT_1028_082d 0000h +1028:082f Data6 2 undefined2 DAT_1028_082f 0000h +1028:0831 Data6 2 undefined2 DAT_1028_0831 0000h +1028:0833 Data6 2 undefined2 DAT_1028_0833 0000h +1028:0835 Data6 2 undefined2 DAT_1028_0835 0000h +1028:0837 Data6 2 undefined2 DAT_1028_0837 0000h +1028:0839 Data6 2 undefined2 DAT_1028_0839 0000h +1028:083b Data6 2 undefined2 DAT_1028_083b 0000h +1028:083d Data6 2 undefined2 DAT_1028_083d 0000h +1028:083f Data6 2 undefined2 DAT_1028_083f 0000h +1028:0849 Data6 2 undefined2 DAT_1028_0849 0000h +1028:084b Data6 2 undefined2 DAT_1028_084b 0000h +1028:084d Data6 2 undefined2 DAT_1028_084d 0000h +1028:084f Data6 2 undefined2 DAT_1028_084f 0000h +1028:0851 Data6 2 undefined2 DAT_1028_0851 0000h +1028:0853 Data6 2 undefined2 DAT_1028_0853 0000h +1028:0855 Data6 2 undefined2 DAT_1028_0855 0000h +1028:0857 Data6 2 undefined2 DAT_1028_0857 0000h +1028:0859 Data6 2 undefined2 DAT_1028_0859 0000h +1028:085b Data6 2 undefined2 DAT_1028_085b 0000h +1028:085d Data6 2 undefined2 DAT_1028_085d 0000h +1028:085f Data6 2 undefined2 DAT_1028_085f 0000h +1028:0861 Data6 2 undefined2 DAT_1028_0861 0000h +1028:0863 Data6 2 undefined2 DAT_1028_0863 0000h +1028:0865 Data6 2 undefined2 DAT_1028_0865 0000h +1028:0867 Data6 2 undefined2 DAT_1028_0867 0000h +1028:0869 Data6 2 undefined2 DAT_1028_0869 0000h +1028:086b Data6 2 undefined2 DAT_1028_086b 0000h +1028:086d Data6 2 undefined2 DAT_1028_086d 0000h +1028:086f Data6 2 undefined2 DAT_1028_086f 0000h +1028:0871 Data6 2 undefined2 DAT_1028_0871 0000h +1028:0873 Data6 1 undefined1 DAT_1028_0873 00h +1028:0874 Data6 1 undefined1 DAT_1028_0874 00h +1028:0875 Data6 1 undefined1 DAT_1028_0875 00h +1028:0876 Data6 2 undefined2 DAT_1028_0876 0000h +1028:0878 Data6 2 undefined2 DAT_1028_0878 0000h +1028:087a Data6 2 undefined2 DAT_1028_087a 0000h +1028:087c Data6 2 undefined2 DAT_1028_087c 0000h +1028:087e Data6 2 undefined2 DAT_1028_087e 0000h +1028:0880 Data6 2 undefined2 DAT_1028_0880 0000h +1028:0882 Data6 2 undefined2 DAT_1028_0882 0000h +1028:0884 Data6 2 undefined2 DAT_1028_0884 0000h +1028:089a Data6 2 undefined2 DAT_1028_089a 0000h +1028:089c Data6 2 undefined2 DAT_1028_089c 0000h +1028:089e Data6 2 undefined2 DAT_1028_089e 0000h +1028:08a0 Data6 2 undefined2 DAT_1028_08a0 0000h +1028:08a2 Data6 2 undefined2 DAT_1028_08a2 0000h +1028:08a4 Data6 2 undefined2 DAT_1028_08a4 0000h +1028:0982 Data6 2 undefined2 DAT_1028_0982 0000h +1028:0984 Data6 2 undefined2 DAT_1028_0984 0000h +1028:0986 Data6 2 undefined2 DAT_1028_0986 0000h +1028:0988 Data6 2 undefined2 DAT_1028_0988 0000h +1028:0992 Data6 2 undefined2 DAT_1028_0992 0000h +1028:0994 Data6 2 undefined2 DAT_1028_0994 0000h +1028:0996 Data6 2 undefined2 DAT_1028_0996 0000h +1028:0998 Data6 2 undefined2 DAT_1028_0998 0000h +1028:09a2 Data6 1 undefined1 DAT_1028_09a2 00h +1028:09a3 Data6 1 undefined1 DAT_1028_09a3 00h +1028:09a6 Data6 2 undefined2 DAT_1028_09a6 0000h +1028:09a8 Data6 2 undefined2 DAT_1028_09a8 0000h +1028:09e2 Data6 1 undefined1 DAT_1028_09e2 00h +1028:09f1 Data6 2 undefined2 DAT_1028_09f1 0000h +1028:09f7 Data6 2 undefined2 DAT_1028_09f7 0000h +1028:0a01 Data6 1 undefined1 DAT_1028_0a01 00h +1028:0a02 Data6 1 undefined1 DAT_1028_0a02 00h +1028:0a03 Data6 2 undefined2 DAT_1028_0a03 0000h +1028:0a05 Data6 2 undefined2 DAT_1028_0a05 0000h +1028:0a07 Data6 2 undefined2 DAT_1028_0a07 0000h +1028:0a09 Data6 2 undefined2 DAT_1028_0a09 0000h +1028:0a0b Data6 2 undefined2 DAT_1028_0a0b 0000h +1028:0a0d Data6 2 undefined2 DAT_1028_0a0d 0000h +1028:0a0f Data6 2 undefined2 DAT_1028_0a0f 0000h +1028:0a11 Data6 2 undefined2 DAT_1028_0a11 0000h +1028:0a13 Data6 2 undefined2 DAT_1028_0a13 0000h +1028:0a15 Data6 2 undefined2 DAT_1028_0a15 0000h +1028:0a17 Data6 2 undefined2 DAT_1028_0a17 0000h +1028:0a19 Data6 2 undefined2 DAT_1028_0a19 0000h +1028:0a1b Data6 2 undefined2 DAT_1028_0a1b 0000h +1028:0a1d Data6 2 undefined2 DAT_1028_0a1d 0000h +1028:0a1f Data6 2 undefined2 DAT_1028_0a1f 0000h +1028:0a21 Data6 2 undefined2 DAT_1028_0a21 0000h +1028:0a23 Data6 2 undefined2 DAT_1028_0a23 0000h +1028:0a25 Data6 2 undefined2 DAT_1028_0a25 0000h +1028:0a27 Data6 2 undefined2 DAT_1028_0a27 0000h +1028:0a29 Data6 2 undefined2 DAT_1028_0a29 0000h +1028:0a2b Data6 2 undefined2 DAT_1028_0a2b 0000h +1028:0a2d Data6 2 undefined2 DAT_1028_0a2d 0000h +1028:0a2f Data6 2 undefined2 DAT_1028_0a2f 0000h +1028:0a31 Data6 2 undefined2 DAT_1028_0a31 0000h +1028:0a33 Data6 2 undefined2 DAT_1028_0a33 0000h +1028:0a35 Data6 1 undefined1 DAT_1028_0a35 00h +1028:0a36 Data6 2 undefined2 DAT_1028_0a36 0000h +1028:0a38 Data6 2 undefined2 DAT_1028_0a38 0000h +1028:0a3a Data6 2 undefined2 DAT_1028_0a3a 0000h +1028:0a3c Data6 2 undefined2 DAT_1028_0a3c 0000h +1028:0a3e Data6 2 undefined2 DAT_1028_0a3e 0000h +1028:0a40 Data6 2 undefined2 DAT_1028_0a40 0000h +1028:0a42 Data6 2 undefined2 DAT_1028_0a42 0000h +1028:0a44 Data6 2 undefined2 DAT_1028_0a44 0000h +1028:0a46 Data6 2 undefined2 DAT_1028_0a46 0000h +1028:0a48 Data6 2 undefined2 DAT_1028_0a48 0000h +1028:0a4a Data6 2 undefined2 DAT_1028_0a4a 0000h +1028:0b81 Data6 1 undefined1 DAT_1028_0b81 00h +1028:0b98 Data6 2 undefined2 DAT_1028_0b98 0000h +1028:0b9a Data6 2 undefined2 DAT_1028_0b9a 0000h +1028:0b9c Data6 2 undefined2 DAT_1028_0b9c 0000h +1028:0b9e Data6 2 undefined2 DAT_1028_0b9e 0000h +1028:0d73 Data6 1 undefined1 DAT_1028_0d73 00h +1028:0dc6 Data6 1 undefined1 DAT_1028_0dc6 00h +1028:1e80 Data6 2 undefined2 DAT_1028_1e80 0000h +1028:1e82 Data6 2 undefined2 DAT_1028_1e82 0000h +1028:1e84 Data6 2 undefined2 DAT_1028_1e84 0000h +1028:1e86 Data6 2 undefined2 DAT_1028_1e86 0000h +1028:1e90 Data6 2 undefined2 DAT_1028_1e90 0000h +1028:1e92 Data6 2 undefined2 DAT_1028_1e92 0000h +1028:1e94 Data6 2 undefined2 DAT_1028_1e94 0000h +1028:1ec3 Data6 2 undefined2 DAT_1028_1ec3 0000h +1028:1ec5 Data6 2 undefined2 DAT_1028_1ec5 0000h +1028:1ec7 Data6 2 undefined2 DAT_1028_1ec7 0000h +1028:1ec9 Data6 2 undefined2 DAT_1028_1ec9 0000h +1028:1ecb Data6 2 undefined2 DAT_1028_1ecb 0000h +1028:1ecd Data6 2 undefined2 DAT_1028_1ecd 0000h +1028:1ecf Data6 2 undefined2 DAT_1028_1ecf 0000h +1028:1ed1 Data6 2 undefined2 DAT_1028_1ed1 0000h +1028:1ed3 Data6 2 undefined2 DAT_1028_1ed3 0000h +1028:1ed5 Data6 2 undefined2 DAT_1028_1ed5 0000h +1028:1ed7 Data6 2 undefined2 DAT_1028_1ed7 0000h +1028:1ed9 Data6 2 undefined2 DAT_1028_1ed9 0000h +1028:1edb Data6 2 undefined2 DAT_1028_1edb 0000h +1028:1edd Data6 2 undefined2 DAT_1028_1edd 0000h +1028:1edf Data6 2 undefined2 DAT_1028_1edf 0000h +1028:1ee1 Data6 2 undefined2 DAT_1028_1ee1 0000h +1028:1f16 Data6 2 undefined2 DAT_1028_1f16 0000h +1028:1f18 Data6 2 undefined2 DAT_1028_1f18 0000h +1028:1f1a Data6 2 undefined2 DAT_1028_1f1a 0000h +1028:1f1c Data6 2 undefined2 DAT_1028_1f1c 0000h +1028:1f1e Data6 2 undefined2 DAT_1028_1f1e 0000h +1028:1f20 Data6 2 undefined2 DAT_1028_1f20 0000h +1028:1f22 Data6 2 undefined2 DAT_1028_1f22 0000h +1028:1f24 Data6 2 undefined2 DAT_1028_1f24 0000h +1028:1f26 Data6 2 undefined2 DAT_1028_1f26 0000h +1028:1f28 Data6 2 undefined2 DAT_1028_1f28 0000h +1028:1f2a Data6 2 undefined2 DAT_1028_1f2a 0000h +1028:1f2c Data6 2 undefined2 DAT_1028_1f2c 0000h +1028:1f69 Data6 2 undefined2 DAT_1028_1f69 0000h +1028:1f6b Data6 2 undefined2 DAT_1028_1f6b 0000h +1028:1f6d Data6 2 undefined2 DAT_1028_1f6d 0000h +1028:1f6f Data6 2 undefined2 DAT_1028_1f6f 0000h +1028:1f71 Data6 2 undefined2 DAT_1028_1f71 0000h +1028:1f73 Data6 2 undefined2 DAT_1028_1f73 0000h +1028:1f75 Data6 2 undefined2 DAT_1028_1f75 0000h +1028:1f77 Data6 2 undefined2 DAT_1028_1f77 0000h +1028:1f79 Data6 2 undefined2 DAT_1028_1f79 0000h +1028:1f7b Data6 2 undefined2 DAT_1028_1f7b 0000h +1028:1f7d Data6 2 undefined2 DAT_1028_1f7d 0000h +1028:1f7f Data6 2 undefined2 DAT_1028_1f7f 0000h +1028:1f81 Data6 2 undefined2 DAT_1028_1f81 0000h +1028:1f83 Data6 2 undefined2 DAT_1028_1f83 0000h +1028:1f85 Data6 2 undefined2 DAT_1028_1f85 0000h +1028:1f87 Data6 2 undefined2 DAT_1028_1f87 0000h +1028:235d Data6 2 undefined2 DAT_1028_235d 0000h +1028:235f Data6 2 undefined2 DAT_1028_235f 0000h +1028:2361 Data6 2 undefined2 DAT_1028_2361 0000h +1028:2363 Data6 2 undefined2 DAT_1028_2363 0000h +1028:236d Data6 2 undefined2 DAT_1028_236d 0000h +1028:236f Data6 2 undefined2 DAT_1028_236f 0000h +1028:2371 Data6 2 undefined2 DAT_1028_2371 0000h +1028:23a0 Data6 2 undefined2 DAT_1028_23a0 0000h +1028:23a2 Data6 2 undefined2 DAT_1028_23a2 0000h +1028:23a4 Data6 2 undefined2 DAT_1028_23a4 0000h +1028:23a6 Data6 2 undefined2 DAT_1028_23a6 0000h +1028:23a8 Data6 2 undefined2 DAT_1028_23a8 0000h +1028:23aa Data6 2 undefined2 DAT_1028_23aa 0000h +1028:23ac Data6 2 undefined2 DAT_1028_23ac 0000h +1028:23ae Data6 2 undefined2 DAT_1028_23ae 0000h +1028:23b0 Data6 2 undefined2 DAT_1028_23b0 0000h +1028:23b2 Data6 2 undefined2 DAT_1028_23b2 0000h +1028:23b4 Data6 2 undefined2 DAT_1028_23b4 0000h +1028:23b6 Data6 2 undefined2 DAT_1028_23b6 0000h +1028:23b8 Data6 2 undefined2 DAT_1028_23b8 0000h +1028:23ba Data6 2 undefined2 DAT_1028_23ba 0000h +1028:23bc Data6 2 undefined2 DAT_1028_23bc 0000h +1028:23be Data6 2 undefined2 DAT_1028_23be 0000h +1028:23f3 Data6 2 undefined2 DAT_1028_23f3 0000h +1028:23f5 Data6 2 undefined2 DAT_1028_23f5 0000h +1028:23f7 Data6 2 undefined2 DAT_1028_23f7 0000h +1028:23f9 Data6 2 undefined2 DAT_1028_23f9 0000h +1028:23fb Data6 2 undefined2 DAT_1028_23fb 0000h +1028:23fd Data6 2 undefined2 DAT_1028_23fd 0000h +1028:23ff Data6 2 undefined2 DAT_1028_23ff 0000h +1028:2401 Data6 2 undefined2 DAT_1028_2401 0000h +1028:2403 Data6 2 undefined2 DAT_1028_2403 0000h +1028:2405 Data6 2 undefined2 DAT_1028_2405 0000h +1028:2407 Data6 2 undefined2 DAT_1028_2407 0000h +1028:2409 Data6 2 undefined2 DAT_1028_2409 0000h +1028:2446 Data6 2 undefined2 DAT_1028_2446 0000h +1028:2448 Data6 2 undefined2 DAT_1028_2448 0000h +1028:244a Data6 2 undefined2 DAT_1028_244a 0000h +1028:244c Data6 2 undefined2 DAT_1028_244c 0000h +1028:244e Data6 2 undefined2 DAT_1028_244e 0000h +1028:2450 Data6 2 undefined2 DAT_1028_2450 0000h +1028:2452 Data6 2 undefined2 DAT_1028_2452 0000h +1028:2454 Data6 2 undefined2 DAT_1028_2454 0000h +1028:2456 Data6 2 undefined2 DAT_1028_2456 0000h +1028:2458 Data6 2 undefined2 DAT_1028_2458 0000h +1028:245a Data6 2 undefined2 DAT_1028_245a 0000h +1028:245c Data6 2 undefined2 DAT_1028_245c 0000h +1028:245e Data6 2 undefined2 DAT_1028_245e 0000h +1028:2460 Data6 2 undefined2 DAT_1028_2460 0000h +1028:2462 Data6 2 undefined2 DAT_1028_2462 0000h +1028:2464 Data6 2 undefined2 DAT_1028_2464 0000h +1028:2679 Data6 2 undefined2 DAT_1028_2679 0000h +1028:3340 Data6 2 undefined2 DAT_1028_3340 0000h +1028:3342 Data6 2 undefined2 DAT_1028_3342 0000h +1028:3344 Data6 2 undefined2 DAT_1028_3344 0000h +1028:3346 Data6 2 undefined2 DAT_1028_3346 0000h +1028:3371 Data6 2 undefined2 DAT_1028_3371 0000h +1028:33c4 Data6 2 undefined2 DAT_1028_33c4 0000h +1028:3417 Data6 2 undefined2 DAT_1028_3417 0000h +1028:346a Data6 2 undefined2 DAT_1028_346a 0000h +1028:34bd Data6 2 undefined2 DAT_1028_34bd 0000h +1028:3969 Data6 2 undefined2 DAT_1028_3969 0000h +1028:396b Data6 2 undefined2 DAT_1028_396b 0000h +1028:396d Data6 2 undefined2 DAT_1028_396d 0000h +1028:396f Data6 2 undefined2 DAT_1028_396f 0000h +1028:399a Data6 2 undefined2 DAT_1028_399a 0000h +1028:39de Data6 1 undefined1 DAT_1028_39de 00h +1028:3b2a Data6 1 undefined1 DAT_1028_3b2a 00h +1028:3b41 Data6 2 undefined2 DAT_1028_3b41 0000h +1028:3b43 Data6 2 undefined2 DAT_1028_3b43 0000h +1028:3b45 Data6 2 undefined2 DAT_1028_3b45 0000h +1028:3b47 Data6 2 undefined2 DAT_1028_3b47 0000h +1028:3b7d Data6 1 undefined1 DAT_1028_3b7d 00h +1028:3b94 Data6 2 undefined2 DAT_1028_3b94 0000h +1028:3b96 Data6 2 undefined2 DAT_1028_3b96 0000h +1028:3b98 Data6 2 undefined2 DAT_1028_3b98 0000h +1028:3b9a Data6 2 undefined2 DAT_1028_3b9a 0000h +1028:41f9 Data6 1 undefined1 DAT_1028_41f9 00h +1028:424c Data6 1 undefined1 DAT_1028_424c 00h +1028:431b Data6 2 undefined2 DAT_1028_431b 0000h +1028:431d Data6 2 undefined2 DAT_1028_431d 0000h +1028:4321 Data6 2 undefined2 DAT_1028_4321 0000h +1028:4323 Data6 2 undefined2 DAT_1028_4323 0000h +1028:4325 Data6 2 undefined2 DAT_1028_4325 0000h +1028:43ea Data6 2 undefined2 DAT_1028_43ea 0000h +1028:43ec Data6 2 undefined2 DAT_1028_43ec 0000h +1028:43ee Data6 2 undefined2 DAT_1028_43ee 0000h +1028:43f0 Data6 2 undefined2 DAT_1028_43f0 0000h +1028:43f2 Data6 1 undefined1 DAT_1028_43f2 00h +1028:43f3 Data6 1 undefined1 DAT_1028_43f3 00h +1028:43f4 Data6 1 undefined1 DAT_1028_43f4 00h +1028:43f6 Data6 2 undefined2 DAT_1028_43f6 0000h +1028:43f8 Data6 2 undefined2 DAT_1028_43f8 0000h +1028:43fa Data6 4 undefined4 DAT_1028_43fa 00000000h +1028:444e Data6 2 undefined2 DAT_1028_444e 0000h +1028:4750 Data6 2 undefined2 DAT_1028_4750 0000h +1028:4752 Data6 2 undefined2 DAT_1028_4752 0000h +1028:4754 Data6 2 undefined2 DAT_1028_4754 0000h +1028:4756 Data6 2 undefined2 DAT_1028_4756 0000h +1028:4758 Data6 2 undefined2 DAT_1028_4758 0000h +1028:475a Data6 2 undefined2 DAT_1028_475a 0000h +1028:475c Data6 2 undefined2 DAT_1028_475c 0000h +1028:475e Data6 2 undefined2 DAT_1028_475e 0000h +1028:4760 Data6 2 undefined2 DAT_1028_4760 0000h +1028:4762 Data6 2 undefined2 DAT_1028_4762 0000h +1028:4764 Data6 2 undefined2 DAT_1028_4764 0000h +1028:4766 Data6 2 undefined2 DAT_1028_4766 0000h +1028:4768 Data6 2 undefined2 DAT_1028_4768 0000h +1028:476a Data6 2 undefined2 DAT_1028_476a 0000h +1028:476c Data6 2 undefined2 DAT_1028_476c 0000h +1028:476e Data6 2 undefined2 DAT_1028_476e 0000h +1028:4770 Data6 2 undefined2 DAT_1028_4770 0000h +1028:4772 Data6 2 undefined2 DAT_1028_4772 0000h +1028:4774 Data6 2 undefined2 DAT_1028_4774 0000h +1028:4776 Data6 2 undefined2 DAT_1028_4776 0000h +1028:4778 Data6 2 undefined2 DAT_1028_4778 0000h +1028:477a Data6 2 undefined2 DAT_1028_477a 0000h +1028:477c Data6 2 undefined2 DAT_1028_477c 0000h +1028:477e Data6 1 undefined1 DAT_1028_477e 00h +1028:477f Data6 1 undefined1 DAT_1028_477f 00h +1028:4780 Data6 1 undefined1 DAT_1028_4780 00h +1028:4781 Data6 2 undefined2 DAT_1028_4781 0000h +1028:4783 Data6 1 undefined1 DAT_1028_4783 00h +1028:4784 Data6 1 undefined1 DAT_1028_4784 00h +1028:478a Data6 1 undefined1 DAT_1028_478a 00h +1028:478b Data6 1 undefined1 DAT_1028_478b 00h +1028:478c Data6 1 undefined1 DAT_1028_478c 00h +1028:47a2 Data6 2 undefined2 DAT_1028_47a2 0000h +1028:4abe Data6 2 undefined2 DAT_1028_4abe 0000h +1028:4ac0 Data6 2 undefined2 DAT_1028_4ac0 0000h +1028:4ac2 Data6 2 undefined2 DAT_1028_4ac2 0000h +1028:4ac6 Data6 2 undefined2 DAT_1028_4ac6 0000h +1028:4ac8 Data6 2 undefined2 DAT_1028_4ac8 0000h +1028:4aca Data6 2 undefined2 DAT_1028_4aca 0000h +1028:4acc Data6 2 undefined2 DAT_1028_4acc 0000h +1028:4ace Data6 2 undefined2 DAT_1028_4ace 0000h +1028:4ad0 Data6 2 undefined2 DAT_1028_4ad0 0000h +1028:4ad2 Data6 2 undefined2 DAT_1028_4ad2 0000h +1028:4ad4 Data6 2 undefined2 DAT_1028_4ad4 0000h +1028:4ada Data6 2 undefined2 DAT_1028_4ada 0000h +1028:4adc Data6 2 undefined2 DAT_1028_4adc 0000h +1028:4ade Data6 2 undefined2 DAT_1028_4ade 0000h +1028:4ae0 Data6 2 undefined2 DAT_1028_4ae0 0000h +1028:4af6 Data6 2 undefined2 DAT_1028_4af6 0000h +1028:4af8 Data6 1 undefined1 DAT_1028_4af8 00h +1028:4d38 Data6 2 undefined2 DAT_1028_4d38 0000h +1109:aeda Rsrc27 18 string "=================" +1109:b3db Rsrc27 16 string "===============" +1109:b8dc Rsrc27 14 string "=============" +1109:bb5e Rsrc27 10 string "=========" +1148:0000 Rsrc35 6302 WAVE-Sound +1150:0000 Rsrc36 4594 WAVE-Sound +1158:0000 Rsrc37 7554 WAVE-Sound +1160:0000 Rsrc38 2906 WAVE-Sound +1168:0000 Rsrc39 30452 WAVE-Sound +1170:0000 Rsrc40 39134 WAVE-Sound +1178:0000 Rsrc41 6710 WAVE-Sound +1180:0000 Rsrc42 320 WAVE-Sound +1188:0000 Rsrc43 46348 WAVE-Sound +1190:0000 Rsrc44 7946 WAVE-Sound +1198:0000 Rsrc45 3518 WAVE-Sound +11a0:0000 Rsrc46 34842 WAVE-Sound +11a8:0000 Rsrc47 5148 WAVE-Sound +11b0:0000 Rsrc48 30000 WAVE-Sound +11b8:0000 Rsrc49 3194 WAVE-Sound +11c0:0000 Rsrc50 22122 WAVE-Sound +11f0:0004 Rsrc56 16 string "VS_VERSION_INFO" +11f0:004c Rsrc56 16 string "StringFileInfo" +11f0:0070 Rsrc56 12 string "CompanyName" +11f0:007c Rsrc56 28 string "Lars Hammer / KIWI Hamburg" +11f0:009c Rsrc56 16 string "FileDescription" +11f0:00ac Rsrc56 20 string "TDK Pinball Machine" +11f0:00c4 Rsrc56 12 string "FileVersion" +11f0:00dc Rsrc56 16 string "InternalName" +11f0:00f8 Rsrc56 16 string "LegalCopyright" +11f0:0108 Rsrc56 48 string "Developed 1995 by KIWI Von Wendt Konzept GmbH." +11f0:013c Rsrc56 12 string "ProductName" +11f0:0148 Rsrc56 20 string "TDK Pinball Machine" +11f0:0160 Rsrc56 16 string "ProductVersion" +11f0:0180 Rsrc56 12 string "VarFileInfo" +11f0:0190 Rsrc56 12 string "Translation" +11f8:000f Rsrc57 10 string "File Open" +11f8:002f Rsrc57 11 string "File&name:" +11f8:005b Rsrc57 11 string "Directory:" +11f8:0087 Rsrc57 9 string "&Files:" +11f8:00b0 Rsrc57 14 string "&Directories:" +11f8:00f2 Rsrc57 10 string "Cancel" +1200:000f Rsrc58 13 string "File Save As" +1200:0032 Rsrc58 11 string "File&name:" +1200:005e Rsrc58 11 string "Directory:" +1200:009b Rsrc58 14 string "&Directories:" +1200:00cc Rsrc58 8 string "Cancel" +1208:005b Rsrc59 9 string "Cancel" +1210:0015 Rsrc60 10 string "File Open" +1210:0035 Rsrc60 11 string "File&name:" +1210:0061 Rsrc60 11 string "Directory:" +1210:008d Rsrc60 8 string "&Files:" +1210:00b6 Rsrc60 14 string "&Directories:" +1210:00e3 Rsrc60 10 string "PBorShade" +1210:00fc Rsrc60 12 string "PBorShade" +1210:011d Rsrc60 7 string "Button" +1210:013a Rsrc60 7 string "Button" +1210:014f Rsrc60 10 string "PBorShade" +1210:0168 Rsrc60 12 string "PBorShade" +1218:0015 Rsrc61 13 string "File Save As" +1218:0038 Rsrc61 12 string "File&name:" +1218:0064 Rsrc61 12 string "Directory:" +1218:00a1 Rsrc61 15 string "&Directories:" +1218:00bd Rsrc61 11 string "PBorShade" +1218:00d6 Rsrc61 10 string "PBorShade" +1218:00f7 Rsrc61 7 string "Button" +1218:0114 Rsrc61 8 string "Button" +1218:0129 Rsrc61 11 string "PBorShade" +1220:004c Rsrc62 12 string "PBorShade" +1220:006d Rsrc62 7 string "Button" +1220:008a Rsrc62 10 string "Button" diff --git a/original/ENTRY_POINTS.tsv b/original/ENTRY_POINTS.tsv new file mode 100644 index 0000000..17fc4e2 --- /dev/null +++ b/original/ENTRY_POINTS.tsv @@ -0,0 +1,302 @@ +ordinal segment offset address flags kind +1 1 0x0100 1000:0100 0x00 movable-int3f-3fcd +2 1 0x0121 1000:0121 0x00 movable-int3f-3fcd +3 1 0x01d3 1000:01d3 0x00 movable-int3f-3fcd +4 1 0x016c 1000:016c 0x00 movable-int3f-3fcd +5 1 0x51f5 1000:51f5 0x00 movable-int3f-3fcd +6 1 0x0270 1000:0270 0x00 movable-int3f-3fcd +7 1 0x5390 1000:5390 0x00 movable-int3f-3fcd +8 1 0x6bf8 1000:6bf8 0x00 movable-int3f-3fcd +9 1 0x638e 1000:638e 0x00 movable-int3f-3fcd +10 1 0xeab1 1000:eab1 0x00 movable-int3f-3fcd +11 1 0x58e7 1000:58e7 0x00 movable-int3f-3fcd +12 1 0x5956 1000:5956 0x00 movable-int3f-3fcd +13 1 0x59a0 1000:59a0 0x00 movable-int3f-3fcd +14 1 0x5a37 1000:5a37 0x00 movable-int3f-3fcd +15 1 0x5aea 1000:5aea 0x00 movable-int3f-3fcd +16 1 0x5ab7 1000:5ab7 0x00 movable-int3f-3fcd +17 1 0x5ba6 1000:5ba6 0x00 movable-int3f-3fcd +18 1 0x5be5 1000:5be5 0x00 movable-int3f-3fcd +19 1 0x5c13 1000:5c13 0x00 movable-int3f-3fcd +20 1 0x5ee6 1000:5ee6 0x00 movable-int3f-3fcd +21 1 0x5efc 1000:5efc 0x00 movable-int3f-3fcd +22 1 0x5f29 1000:5f29 0x00 movable-int3f-3fcd +23 1 0x5fc0 1000:5fc0 0x00 movable-int3f-3fcd +24 1 0x6073 1000:6073 0x00 movable-int3f-3fcd +25 1 0x6040 1000:6040 0x00 movable-int3f-3fcd +26 1 0x60e7 1000:60e7 0x00 movable-int3f-3fcd +27 1 0x6129 1000:6129 0x00 movable-int3f-3fcd +28 1 0x616e 1000:616e 0x00 movable-int3f-3fcd +29 1 0x6202 1000:6202 0x00 movable-int3f-3fcd +30 1 0x6218 1000:6218 0x00 movable-int3f-3fcd +31 1 0x6245 1000:6245 0x00 movable-int3f-3fcd +32 1 0x62dc 1000:62dc 0x00 movable-int3f-3fcd +33 1 0x0002 1000:0002 0x00 movable-int3f-3fcd +34 1 0x531e 1000:531e 0x00 movable-int3f-3fcd +35 1 0x635c 1000:635c 0x00 movable-int3f-3fcd +36 1 0x6b37 1000:6b37 0x00 movable-int3f-3fcd +37 1 0xc79c 1000:c79c 0x00 movable-int3f-3fcd +38 1 0xbeff 1000:beff 0x00 movable-int3f-3fcd +39 1 0xbc36 1000:bc36 0x00 movable-int3f-3fcd +40 1 0xbda2 1000:bda2 0x00 movable-int3f-3fcd +41 1 0xb3f3 1000:b3f3 0x00 movable-int3f-3fcd +42 1 0xb30b 1000:b30b 0x00 movable-int3f-3fcd +43 1 0x7e12 1000:7e12 0x00 movable-int3f-3fcd +44 1 0xc36b 1000:c36b 0x00 movable-int3f-3fcd +45 1 0xc426 1000:c426 0x00 movable-int3f-3fcd +46 1 0x7e92 1000:7e92 0x00 movable-int3f-3fcd +47 1 0x6f27 1000:6f27 0x00 movable-int3f-3fcd +48 1 0x7440 1000:7440 0x00 movable-int3f-3fcd +49 1 0x7ed9 1000:7ed9 0x00 movable-int3f-3fcd +50 1 0x99f0 1000:99f0 0x00 movable-int3f-3fcd +51 1 0x8b0d 1000:8b0d 0x00 movable-int3f-3fcd +52 1 0x9ae0 1000:9ae0 0x00 movable-int3f-3fcd +53 1 0x9b69 1000:9b69 0x00 movable-int3f-3fcd +54 1 0x9bca 1000:9bca 0x00 movable-int3f-3fcd +55 1 0x9e85 1000:9e85 0x00 movable-int3f-3fcd +56 1 0x9f73 1000:9f73 0x00 movable-int3f-3fcd +57 1 0xa38e 1000:a38e 0x00 movable-int3f-3fcd +58 1 0xa604 1000:a604 0x00 movable-int3f-3fcd +59 1 0xa70e 1000:a70e 0x00 movable-int3f-3fcd +60 1 0xa72c 1000:a72c 0x00 movable-int3f-3fcd +61 1 0xa8ea 1000:a8ea 0x00 movable-int3f-3fcd +62 1 0xa99c 1000:a99c 0x00 movable-int3f-3fcd +63 1 0xab3c 1000:ab3c 0x00 movable-int3f-3fcd +64 1 0xabe5 1000:abe5 0x00 movable-int3f-3fcd +65 1 0xacc2 1000:acc2 0x00 movable-int3f-3fcd +66 1 0xbdde 1000:bdde 0x00 movable-int3f-3fcd +67 1 0xae6e 1000:ae6e 0x00 movable-int3f-3fcd +68 1 0xb2c8 1000:b2c8 0x00 movable-int3f-3fcd +69 1 0xb3b0 1000:b3b0 0x00 movable-int3f-3fcd +70 1 0xb476 1000:b476 0x00 movable-int3f-3fcd +71 1 0xc4e1 1000:c4e1 0x00 movable-int3f-3fcd +72 2 0x0f27 1008:0f27 0x00 movable-int3f-3fcd +73 2 0x0002 1008:0002 0x00 movable-int3f-3fcd +74 2 0x0023 1008:0023 0x00 movable-int3f-3fcd +75 2 0x00e2 1008:00e2 0x00 movable-int3f-3fcd +76 2 0x0138 1008:0138 0x00 movable-int3f-3fcd +77 2 0x0787 1008:0787 0x00 movable-int3f-3fcd +78 2 0x07b6 1008:07b6 0x00 movable-int3f-3fcd +79 2 0x0837 1008:0837 0x00 movable-int3f-3fcd +80 2 0x08bb 1008:08bb 0x00 movable-int3f-3fcd +81 2 0x093f 1008:093f 0x00 movable-int3f-3fcd +82 2 0x0996 1008:0996 0x00 movable-int3f-3fcd +83 2 0x0b9e 1008:0b9e 0x00 movable-int3f-3fcd +84 2 0x0dbd 1008:0dbd 0x00 movable-int3f-3fcd +85 2 0x0e08 1008:0e08 0x00 movable-int3f-3fcd +86 2 0x11b8 1008:11b8 0x00 movable-int3f-3fcd +87 2 0x0f2e 1008:0f2e 0x00 movable-int3f-3fcd +88 2 0x10e3 1008:10e3 0x00 movable-int3f-3fcd +89 2 0x1131 1008:1131 0x00 movable-int3f-3fcd +90 2 0x118f 1008:118f 0x00 movable-int3f-3fcd +91 2 0x15c2 1008:15c2 0x00 movable-int3f-3fcd +92 2 0x11c5 1008:11c5 0x00 movable-int3f-3fcd +93 2 0x1326 1008:1326 0x00 movable-int3f-3fcd +94 2 0x13a8 1008:13a8 0x00 movable-int3f-3fcd +95 2 0x149d 1008:149d 0x00 movable-int3f-3fcd +96 2 0x15c7 1008:15c7 0x00 movable-int3f-3fcd +97 2 0x15e7 1008:15e7 0x00 movable-int3f-3fcd +98 3 0x0472 1010:0472 0x00 movable-int3f-3fcd +99 3 0x03e0 1010:03e0 0x00 movable-int3f-3fcd +100 3 0x0079 1010:0079 0x00 movable-int3f-3fcd +101 3 0x03af 1010:03af 0x00 movable-int3f-3fcd +102 3 0x0002 1010:0002 0x00 movable-int3f-3fcd +103 3 0x00a2 1010:00a2 0x00 movable-int3f-3fcd +104 3 0x01c2 1010:01c2 0x00 movable-int3f-3fcd +105 3 0x0405 1010:0405 0x00 movable-int3f-3fcd +106 2 0x1607 1008:1607 0x00 movable-int3f-3fcd +107 2 0x168e 1008:168e 0x00 movable-int3f-3fcd +108 2 0x16be 1008:16be 0x00 movable-int3f-3fcd +109 2 0x2554 1008:2554 0x00 movable-int3f-3fcd +110 2 0x2442 1008:2442 0x00 movable-int3f-3fcd +111 2 0x1b11 1008:1b11 0x00 movable-int3f-3fcd +112 2 0x1be9 1008:1be9 0x00 movable-int3f-3fcd +113 2 0x1c03 1008:1c03 0x00 movable-int3f-3fcd +114 2 0x1c5f 1008:1c5f 0x00 movable-int3f-3fcd +115 2 0x1cc6 1008:1cc6 0x00 movable-int3f-3fcd +116 2 0x18ee 1008:18ee 0x00 movable-int3f-3fcd +117 2 0x19b7 1008:19b7 0x00 movable-int3f-3fcd +118 2 0x23fd 1008:23fd 0x00 movable-int3f-3fcd +119 2 0x2219 1008:2219 0x01 movable-int3f-3fcd +120 2 0x22fc 1008:22fc 0x00 movable-int3f-3fcd +121 2 0x233c 1008:233c 0x00 movable-int3f-3fcd +122 2 0x2374 1008:2374 0x00 movable-int3f-3fcd +123 2 0x238b 1008:238b 0x00 movable-int3f-3fcd +124 2 0x24a5 1008:24a5 0x00 movable-int3f-3fcd +125 2 0x2643 1008:2643 0x00 movable-int3f-3fcd +126 2 0x26b0 1008:26b0 0x00 movable-int3f-3fcd +127 2 0x2819 1008:2819 0x00 movable-int3f-3fcd +128 2 0x28a3 1008:28a3 0x00 movable-int3f-3fcd +129 2 0x2906 1008:2906 0x00 movable-int3f-3fcd +130 2 0x2932 1008:2932 0x00 movable-int3f-3fcd +131 2 0x295c 1008:295c 0x00 movable-int3f-3fcd +132 2 0x298a 1008:298a 0x00 movable-int3f-3fcd +133 4 0x0341 1018:0341 0x00 movable-int3f-3fcd +134 4 0x03ff 1018:03ff 0x00 movable-int3f-3fcd +135 4 0x0bb3 1018:0bb3 0x00 movable-int3f-3fcd +136 4 0x0c3d 1018:0c3d 0x00 movable-int3f-3fcd +137 4 0x0c59 1018:0c59 0x00 movable-int3f-3fcd +138 4 0x0641 1018:0641 0x00 movable-int3f-3fcd +139 4 0x0673 1018:0673 0x00 movable-int3f-3fcd +140 4 0x080d 1018:080d 0x00 movable-int3f-3fcd +141 4 0x085a 1018:085a 0x00 movable-int3f-3fcd +142 4 0x05f3 1018:05f3 0x00 movable-int3f-3fcd +143 4 0x060d 1018:060d 0x00 movable-int3f-3fcd +144 4 0x0627 1018:0627 0x00 movable-int3f-3fcd +145 4 0x0e46 1018:0e46 0x00 movable-int3f-3fcd +146 4 0x0ce7 1018:0ce7 0x00 movable-int3f-3fcd +147 4 0x08ac 1018:08ac 0x00 movable-int3f-3fcd +148 4 0x0d6a 1018:0d6a 0x00 movable-int3f-3fcd +149 4 0x10e9 1018:10e9 0x00 movable-int3f-3fcd +150 4 0x0d8a 1018:0d8a 0x00 movable-int3f-3fcd +151 4 0x0d9b 1018:0d9b 0x00 movable-int3f-3fcd +152 4 0x0e9e 1018:0e9e 0x00 movable-int3f-3fcd +153 4 0x0ef4 1018:0ef4 0x00 movable-int3f-3fcd +154 4 0x05dc 1018:05dc 0x00 movable-int3f-3fcd +155 4 0x0e0a 1018:0e0a 0x00 movable-int3f-3fcd +156 4 0x0a85 1018:0a85 0x00 movable-int3f-3fcd +157 4 0x0f38 1018:0f38 0x00 movable-int3f-3fcd +158 4 0x069a 1018:069a 0x00 movable-int3f-3fcd +159 4 0x071c 1018:071c 0x00 movable-int3f-3fcd +160 4 0x055c 1018:055c 0x00 movable-int3f-3fcd +161 4 0x0b25 1018:0b25 0x00 movable-int3f-3fcd +162 4 0x0b6c 1018:0b6c 0x00 movable-int3f-3fcd +163 4 0x08f0 1018:08f0 0x00 movable-int3f-3fcd +164 4 0x0f22 1018:0f22 0x00 movable-int3f-3fcd +165 4 0x0f8d 1018:0f8d 0x00 movable-int3f-3fcd +166 4 0x0fcc 1018:0fcc 0x00 movable-int3f-3fcd +167 4 0x0ffd 1018:0ffd 0x00 movable-int3f-3fcd +168 4 0x1054 1018:1054 0x00 movable-int3f-3fcd +169 4 0x10aa 1018:10aa 0x00 movable-int3f-3fcd +170 4 0x1106 1018:1106 0x00 movable-int3f-3fcd +171 4 0x121b 1018:121b 0x00 movable-int3f-3fcd +172 4 0x1274 1018:1274 0x00 movable-int3f-3fcd +173 4 0x1547 1018:1547 0x00 movable-int3f-3fcd +174 4 0x1586 1018:1586 0x00 movable-int3f-3fcd +175 4 0x12f5 1018:12f5 0x00 movable-int3f-3fcd +176 4 0x134f 1018:134f 0x00 movable-int3f-3fcd +177 4 0x1311 1018:1311 0x00 movable-int3f-3fcd +178 4 0x169d 1018:169d 0x00 movable-int3f-3fcd +179 4 0x16eb 1018:16eb 0x00 movable-int3f-3fcd +180 4 0x170c 1018:170c 0x00 movable-int3f-3fcd +181 4 0x1761 1018:1761 0x00 movable-int3f-3fcd +182 4 0x1788 1018:1788 0x00 movable-int3f-3fcd +183 4 0x17f8 1018:17f8 0x00 movable-int3f-3fcd +184 4 0x1868 1018:1868 0x00 movable-int3f-3fcd +185 4 0x18e9 1018:18e9 0x00 movable-int3f-3fcd +186 4 0x1960 1018:1960 0x00 movable-int3f-3fcd +187 4 0x1986 1018:1986 0x00 movable-int3f-3fcd +188 4 0x1a0e 1018:1a0e 0x00 movable-int3f-3fcd +189 4 0x15c0 1018:15c0 0x00 movable-int3f-3fcd +190 4 0x1a61 1018:1a61 0x00 movable-int3f-3fcd +191 4 0x1b08 1018:1b08 0x00 movable-int3f-3fcd +192 4 0x1b35 1018:1b35 0x00 movable-int3f-3fcd +193 4 0x1b4b 1018:1b4b 0x00 movable-int3f-3fcd +194 4 0x1b57 1018:1b57 0x00 movable-int3f-3fcd +195 4 0x1bb0 1018:1bb0 0x00 movable-int3f-3fcd +196 4 0x1bdf 1018:1bdf 0x00 movable-int3f-3fcd +197 4 0x1bfc 1018:1bfc 0x00 movable-int3f-3fcd +198 4 0x1c7f 1018:1c7f 0x00 movable-int3f-3fcd +199 4 0x1cd6 1018:1cd6 0x00 movable-int3f-3fcd +200 4 0x1d22 1018:1d22 0x00 movable-int3f-3fcd +201 4 0x1d64 1018:1d64 0x00 movable-int3f-3fcd +202 4 0x1e39 1018:1e39 0x00 movable-int3f-3fcd +203 4 0x1eb0 1018:1eb0 0x00 movable-int3f-3fcd +204 4 0x1db1 1018:1db1 0x00 movable-int3f-3fcd +205 4 0x1f14 1018:1f14 0x00 movable-int3f-3fcd +206 4 0x1f56 1018:1f56 0x00 movable-int3f-3fcd +207 4 0x0097 1018:0097 0x00 movable-int3f-3fcd +208 4 0x0045 1018:0045 0x00 movable-int3f-3fcd +209 4 0x0071 1018:0071 0x00 movable-int3f-3fcd +210 4 0x0133 1018:0133 0x01 movable-int3f-3fcd +211 4 0x018b 1018:018b 0x01 movable-int3f-3fcd +212 4 0x01dc 1018:01dc 0x00 movable-int3f-3fcd +213 4 0x02fa 1018:02fa 0x00 movable-int3f-3fcd +214 4 0x03e9 1018:03e9 0x00 movable-int3f-3fcd +215 4 0x0466 1018:0466 0x00 movable-int3f-3fcd +216 4 0x049e 1018:049e 0x00 movable-int3f-3fcd +217 4 0x0524 1018:0524 0x00 movable-int3f-3fcd +218 4 0x08c3 1018:08c3 0x00 movable-int3f-3fcd +219 4 0x0cc7 1018:0cc7 0x00 movable-int3f-3fcd +220 4 0x0dcd 1018:0dcd 0x00 movable-int3f-3fcd +221 4 0x0ec0 1018:0ec0 0x00 movable-int3f-3fcd +222 2 0x2996 1008:2996 0x00 movable-int3f-3fcd +223 2 0x2a0e 1008:2a0e 0x00 movable-int3f-3fcd +224 2 0x2a45 1008:2a45 0x00 movable-int3f-3fcd +225 2 0x2ae3 1008:2ae3 0x00 movable-int3f-3fcd +226 2 0x2bd1 1008:2bd1 0x00 movable-int3f-3fcd +227 2 0x2cf2 1008:2cf2 0x00 movable-int3f-3fcd +228 2 0x2d3a 1008:2d3a 0x00 movable-int3f-3fcd +229 2 0x2c08 1008:2c08 0x00 movable-int3f-3fcd +230 2 0x2c1f 1008:2c1f 0x00 movable-int3f-3fcd +231 2 0x2d66 1008:2d66 0x00 movable-int3f-3fcd +232 2 0x2c83 1008:2c83 0x00 movable-int3f-3fcd +233 2 0x2cd9 1008:2cd9 0x00 movable-int3f-3fcd +234 2 0x2bb1 1008:2bb1 0x00 movable-int3f-3fcd +235 2 0x2d99 1008:2d99 0x00 movable-int3f-3fcd +236 2 0x2db3 1008:2db3 0x00 movable-int3f-3fcd +237 2 0x2dcd 1008:2dcd 0x00 movable-int3f-3fcd +238 2 0x2d87 1008:2d87 0x00 movable-int3f-3fcd +239 2 0x2e76 1008:2e76 0x00 movable-int3f-3fcd +240 2 0x2de0 1008:2de0 0x00 movable-int3f-3fcd +241 2 0x2dff 1008:2dff 0x00 movable-int3f-3fcd +242 2 0x2e22 1008:2e22 0x00 movable-int3f-3fcd +243 2 0x2e92 1008:2e92 0x00 movable-int3f-3fcd +244 2 0x2ea9 1008:2ea9 0x00 movable-int3f-3fcd +245 2 0x2ec0 1008:2ec0 0x00 movable-int3f-3fcd +246 2 0x2ee5 1008:2ee5 0x00 movable-int3f-3fcd +247 2 0x2f07 1008:2f07 0x00 movable-int3f-3fcd +248 2 0x2f2f 1008:2f2f 0x00 movable-int3f-3fcd +249 2 0x2f4d 1008:2f4d 0x00 movable-int3f-3fcd +250 2 0x2f70 1008:2f70 0x00 movable-int3f-3fcd +251 2 0x2fbb 1008:2fbb 0x00 movable-int3f-3fcd +252 2 0x2fe3 1008:2fe3 0x00 movable-int3f-3fcd +253 2 0x300a 1008:300a 0x00 movable-int3f-3fcd +254 2 0x302c 1008:302c 0x00 movable-int3f-3fcd +255 2 0x3099 1008:3099 0x00 movable-int3f-3fcd +256 5 0x0002 1020:0002 0x00 movable-int3f-3fcd +257 5 0x005d 1020:005d 0x00 movable-int3f-3fcd +258 5 0x0061 1020:0061 0x00 movable-int3f-3fcd +259 5 0x0891 1020:0891 0x00 movable-int3f-3fcd +260 5 0x08a9 1020:08a9 0x00 movable-int3f-3fcd +261 5 0x08e6 1020:08e6 0x00 movable-int3f-3fcd +262 5 0x09ec 1020:09ec 0x00 movable-int3f-3fcd +263 5 0x0a51 1020:0a51 0x00 movable-int3f-3fcd +264 5 0x0a7d 1020:0a7d 0x00 movable-int3f-3fcd +265 5 0x0ac3 1020:0ac3 0x00 movable-int3f-3fcd +266 5 0x0b00 1020:0b00 0x00 movable-int3f-3fcd +267 5 0x012d 1020:012d 0x00 movable-int3f-3fcd +268 5 0x0147 1020:0147 0x00 movable-int3f-3fcd +269 5 0x0167 1020:0167 0x00 movable-int3f-3fcd +270 5 0x0388 1020:0388 0x00 movable-int3f-3fcd +271 5 0x038f 1020:038f 0x00 movable-int3f-3fcd +272 5 0x039d 1020:039d 0x00 movable-int3f-3fcd +273 5 0x03cb 1020:03cb 0x00 movable-int3f-3fcd +274 5 0x0527 1020:0527 0x00 movable-int3f-3fcd +275 5 0x052c 1020:052c 0x00 movable-int3f-3fcd +276 5 0x0667 1020:0667 0x00 movable-int3f-3fcd +277 5 0x06ab 1020:06ab 0x00 movable-int3f-3fcd +278 5 0x072c 1020:072c 0x00 movable-int3f-3fcd +279 5 0x16c9 1020:16c9 0x00 movable-int3f-3fcd +280 5 0x14a4 1020:14a4 0x00 movable-int3f-3fcd +281 5 0x082e 1020:082e 0x00 movable-int3f-3fcd +282 5 0x16a5 1020:16a5 0x00 movable-int3f-3fcd +283 5 0x1629 1020:1629 0x00 movable-int3f-3fcd +284 5 0x0fe5 1020:0fe5 0x00 movable-int3f-3fcd +285 5 0x0feb 1020:0feb 0x00 movable-int3f-3fcd +286 5 0x0ff7 1020:0ff7 0x00 movable-int3f-3fcd +287 5 0x0ffd 1020:0ffd 0x00 movable-int3f-3fcd +288 5 0x1007 1020:1007 0x00 movable-int3f-3fcd +289 5 0x100b 1020:100b 0x00 movable-int3f-3fcd +290 5 0x1017 1020:1017 0x00 movable-int3f-3fcd +291 5 0x0ff1 1020:0ff1 0x00 movable-int3f-3fcd +292 5 0x10be 1020:10be 0x00 movable-int3f-3fcd +293 5 0x14c1 1020:14c1 0x00 movable-int3f-3fcd +294 5 0x03ef 1020:03ef 0x00 movable-int3f-3fcd +295 5 0x0439 1020:0439 0x00 movable-int3f-3fcd +296 5 0x16e1 1020:16e1 0x00 movable-int3f-3fcd +297 5 0x0be9 1020:0be9 0x00 movable-int3f-3fcd +298 5 0x05d8 1020:05d8 0x00 movable-int3f-3fcd +299 5 0x0608 1020:0608 0x00 movable-int3f-3fcd +300 5 0x062d 1020:062d 0x00 movable-int3f-3fcd +301 5 0x064d 1020:064d 0x00 movable-int3f-3fcd diff --git a/original/FUNCTION_RECONSTRUCTION.tsv b/original/FUNCTION_RECONSTRUCTION.tsv new file mode 100644 index 0000000..642dc5c --- /dev/null +++ b/original/FUNCTION_RECONSTRUCTION.tsv @@ -0,0 +1,392 @@ +address raw_name segment body_bytes status reconstructed_name module evidence notes +1000:0002 FUN_1000_0002 Code1 254 verified tdkpin_composite_player_sprite reconstructed/tdkpin_gameplay_helpers.c disassembly 1000:0002-00ff; exact GDI argument order correcting raw decompiler coordinate reversal; background and indexed 430b sprite tables; reconstructed/tests/test_player_sprite.c Exact two-word ABI, three compatible DCs, 14x14 temporary bitmap, indexed sprite selection, background save at 84/77, 42x123 sprite blit at 55/79, 14x14 restore, reverse object/DC cleanup, ignored GDI results, and no destination presentation are represented and sequence-tested. +1000:0100 FUN_1000_0100 Code1 33 verified tdkpin_application_init_instance reconstructed/tdkpin_game_application.c disassembly 1000:0100-0120; TApplication VMT +0x14; verified ObjectWindows/CTL3D initialization; reconstructed/tests/test_game_application.c Exact application receiver, initialization-before-multimedia order, fixed byte arguments 1/1/1, DGROUP module name 0222 far words, ignored loader result, and four-byte cleanup are represented and tested. +1000:0121 FUN_1000_0121 Code1 75 verified tdkpin_application_init_application reconstructed/tdkpin_game_application.c disassembly 1000:0121-016b; first-instance global 06fc; title/text 022c/0245; verified MessageBox/RuntimeExit; reconstructed/tests/test_game_application.c Exact first-instance null-object/VMT 009e/title/null-parent constructor frame and MainWindow +8 store; second-instance owner/text/caption/0x2010 dialog and Halt(0) no-return path are represented and branch-tested. +1000:016c FUN_1000_016c Code1 103 verified tdkpin_build_main_window_class reconstructed/tdkpin_game_application.c disassembly 1000:016c-01d2; verified base WNDCLASS builder; USER/GDI resource calls; reconstructed/tests/test_game_application.c Exact base call, style 0x3000, instance icon resource 0x03e4, arrow cursor, stock object 0 brush, current instance, zero class/window extras, far descriptor, and eight-byte cleanup are tested. +1000:01d3 FUN_1000_01d3 Code1 155 verified tdkpin_main_window_construct reconstructed/tdkpin_game_windows.c disassembly 1000:01d3-026d; verified Borland constructor and TWindow base; USER GetSystemMetrics; reconstructed/tests/test_game_windows.c Exact 14-byte far-constructor frame, null base VMT, 640x480 geometry, signed divide-by-two screen centering, style 0x86ca0000 replacement, returned far object, and constructor-entry failure are represented and tested. +1000:0270 FUN_1000_0270 Code1 20357 verified tdkpin_setup_game_window reconstructed/tdkpin_game_setup.c disassembly 1000:0270-51f4; generated typed collision data checked against TDKPIN_GHIDRA_COMPLETE_RAW.c; verified setup dependencies; exact 20 quad calls; reconstructed/tests/test_game_setup.c; tools/generate_game_setup_collision_data.py --check Exact far-window RETF-4 ABI, low-memory message/close/RuntimeExit branch, ObjectWindows/cursor/palette setup, tick seed, all globals/receiver/player defaults, milli/pixel state, executable-relative INI-name construction, clamped language/speed configuration, timer creation/failure-without-close path, 177 ordered typed collision calls including preliminary 169/170 then final overwrite, twenty word quads, and 175 active/contact/zero mirrors are represented; success, low-memory, timer-failure, call-order, table-boundary, and mirror tests pass. +1000:51f5 FUN_1000_51f5 Code1 297 verified tdkpin_asset_window_destruct reconstructed/tdkpin_asset_cleanup.c disassembly 1000:51f5-531d; verified sound/message/TWindow/Borland dependencies; exact global/window bitmap inventory; reconstructed/tests/test_asset_cleanup.c Exact Wait cursor save/restore, sound unload, bd9/bd8 publication, optional +49 Dispose(mode 1), message drain, deletion order window+52 then 0859,0863,0865,085f,085b,0861,085d, arrays 430b[0..7],4319[1..4],4321[1..9], intentionally stale handles and retained window+54, PostQuitMessage(18), TWindow destructor, erase=true invalidation, derived ownership finish, six-byte cleanup, and 29-handle sequence are tested. +1000:531e FUN_1000_531e Code1 114 verified tdkpin_draw_loading_stage reconstructed/tdkpin_game_assets.c disassembly 1000:531e-538f; exact caller-BP/SS offsets; GDI compatible-DC/select/BitBlt/DeleteObject; reconstructed/tests/test_game_assets.c Exact BP-0c/-04/-02/+0e shared frame contract, byte-stage zero extension, 16-bit (stage-1)*7 wrap, fixed destination 13/y and 328x202 SRCCOPY, select/restore, intentional DeleteObject-on-HDC, four-byte cleanup, and scratch writes are branch-tested. +1000:5390 FUN_1000_5390 Code1 1367 verified tdkpin_initialize_assets_and_redraw reconstructed/tdkpin_asset_initializer.c disassembly 1000:5390-58e6; all internal dependencies verified; exact DAT/BITMAP ID sequence and DGROUP/window offsets; reconstructed/tests/test_asset_initializer.c Exact public ten-byte ABI, entry palette select/unrealize/realize and message drain, static helper split at binary phases 53c5/5619, DAT IDs 995,994,998x2,400..407,701..704,801..809,900,997,901,600, BITMAP IDs 500/102/101, progress stages 2..35, sound init, handle publications, loading-surface draw/delete, palette/cursor restoration, already-redrawn palette retention, transient scene composition, optional mask/image ROPs with coordinate+19 dimensions, score factor/product and positive-player redraw, status sentinel/update, scene-ready publication, and all three control-flow phases are represented and tested. +1000:58e7 FUN_1000_58e7 Code1 111 verified tdkpin_palette_change_variant_a reconstructed/tdkpin_game_assets.c disassembly 1000:58e7-5955; exact ObjectWindowsMessage result offsets; USER IsIconic/InvalidateRect/UpdateWindow; reconstructed/tests/test_palette_messages.c Exact zero-wParam reentrancy reset/result zero, active suppression, iconic suppression, non-iconic invalidate/update ordering, result DWORD clear, state publication, uninitialized uint16 suppressed return, and eight-byte cleanup are branch-tested. +1000:5956 FUN_1000_5956 Code1 74 verified tdkpin_palette_change_variant_b reconstructed/tdkpin_game_assets.c disassembly 1000:5956-599f; shared palette-update state and invalidate helper; reconstructed/tests/test_palette_messages.c Exact wParam==0 and inactive conjunction, state set, null-rect/non-erasing invalidate, synchronous update, message result DWORD clear, no-op branches, and eight-byte cleanup are represented and tested. +1000:59a0 FUN_1000_59a0 Code1 151 verified tdkpin_wm_palette_changed reconstructed/tdkpin_game_assets.c disassembly 1000:59a0-5a36; exact ObjectWindowsMessage offsets; USER/GDI parent/DC/palette/update calls; reconstructed/tests/test_palette_window_messages.c Exact self/child HWND suppression returning 1, foreign-window GetDC, background SelectPalette TRUE, RealizePalette/UpdateColors, restore FALSE, ReleaseDC, result DWORD zero, return 0, and eight-byte cleanup are branch-tested. +1000:5a37 FUN_1000_5a37 Code1 128 verified tdkpin_wm_query_new_palette reconstructed/tdkpin_game_assets.c disassembly 1000:5a37-5ab6; foreground palette call frame; reconstructed/tests/test_palette_window_messages.c Exact GetDC, foreground SelectPalette FALSE, signed RealizePalette result, restore FALSE, ReleaseDC, positive-only full-window invalidate, result low word/high zero, returned count, and eight-byte cleanup are tested for zero and positive changes. +1000:5ab7 FUN_1000_5ab7 Code1 51 verified tdkpin_build_stock_brush_class_a reconstructed/tdkpin_game_application.c disassembly 1000:5ab7-5ae9; verified base builder; GDI GetStockObject(5); reconstructed/tests/test_game_application.c Exact base call, background brush replacement, ordered style OR 0x0800/0x1000/0x2000, resulting preserved base bits, far frame, and eight-byte cleanup are tested. +1000:5aea FUN_1000_5aea Code1 188 verified tdkpin_centered_child_window_construct reconstructed/tdkpin_game_windows.c disassembly 1000:5aea-5ba5; verified Borland constructor and TWindow base; USER SetFocus; reconstructed/tests/test_game_windows.c Exact parent far-pointer publication at +41, 360x300 geometry centered around binary constants x=320/y=230, low/high style-word OR equivalent to 0x46800002, HWND +4 focus, returned far object, and constructor-entry failure are represented and tested. +1000:5ba6 FUN_1000_5ba6 Code1 63 verified tdkpin_overlay_window_destruct reconstructed/tdkpin_window_lifecycle.c disassembly 1000:5ba6-5be4; verified 1018:121b; DGROUP bitmap 0867; reciprocal peer +41; reconstructed/tests/test_window_lifecycle.c Exact DeleteObject without global clear, unguarded peer dereference, reciprocal far-pointer clearing, base TWindow destructor with hidden VMT zero, derived ownership finish, six-byte cleanup, and call ordering are tested. +1000:5be5 FUN_1000_5be5 Code1 46 verified tdkpin_setup_overlay_window reconstructed/tdkpin_game_assets.c disassembly 1000:5be5-5c12; verified 1018:170c and 1008:149d dependencies; DGROUP bitmap 0867; USER SetFocus; reconstructed/tests/test_overlay_setup.c Exact setup ordering, DAT 993/current-instance loader frame, HBITMAP publication, receiver HWND focus, ignored previous-focus result, and four-byte Pascal cleanup are represented and tested. +1000:5c13 FUN_1000_5c13 Code1 723 verified tdkpin_paint_highscores reconstructed/tdkpin_highscores.c disassembly 1000:5c13-5ee5; TWindow VMT +4c and ten-byte paint ABI; verified string/numeric helpers; exact Win16-PASCAL GDI push order and DGROUP tables; reconstructed/tests/test_highscores.c Exact ignored receiver/PAINTSTRUCT plus HDC frame, palette realization/restoration, two compatible DCs, overlay source 32/204, 360x300 backbuffer matching the window geometry, saved text state, centered heading at 180/27, ten rank/name/score rows, rank-10 empty-prefix alias at 02ff, both SRCCOPY operations, and reverse GDI cleanup are represented and sequence-tested across all 21 TextOut calls. +1000:5ee6 FUN_1000_5ee6 Code1 22 verified tdkpin_close_variant_a reconstructed/tdkpin_message_pump.c disassembly 1000:5ee6-5efb; verified 1008:00e2 and 1018:0f38; reconstructed/tests/test_message_pump.c Exact queue drain before close-if-allowed, receiver far argument, and four-byte Pascal cleanup are represented and tested. +1000:5efc FUN_1000_5efc Code1 45 verified tdkpin_conditional_close_variant_a reconstructed/tdkpin_message_pump.c disassembly 1000:5efc-5f28; event high-word low byte comparison 0x1c; reconstructed/tests/test_message_pump.c Exact suppression value, drain/close nonmatch path, unchanged receiver/event frames, uninitialized uint16 local return via compatibility primitive on both paths, and eight-byte cleanup are branch-tested. +1000:5f29 FUN_1000_5f29 Code1 151 verified tdkpin_wm_palette_changed_variant_b reconstructed/tdkpin_game_assets.c instruction-for-instruction duplicate of verified 1000:59a0 at 1000:5f29-5fbf; shared static semantic core; reconstructed/tests/test_palette_window_messages.c Exact second-class WM_PALETTECHANGED entry retains self/child suppression, background palette TRUE, UpdateColors, result/return contract, and eight-byte cleanup; duplicate-to-core factoring is explicitly recorded. +1000:5fc0 FUN_1000_5fc0 Code1 128 verified tdkpin_wm_query_new_palette_variant_b reconstructed/tdkpin_game_assets.c instruction-for-instruction duplicate of verified 1000:5a37 at 1000:5fc0-603f; shared static semantic core; palette-window tests Exact second-class WM_QUERYNEWPALETTE entry retains foreground select, signed color count, positive invalidation, result/return contract, and cleanup. +1000:6040 FUN_1000_6040 Code1 51 verified tdkpin_build_stock_brush_class_b reconstructed/tdkpin_game_application.c disassembly 1000:6040-6072; verified base builder; GDI GetStockObject(5); reconstructed/tests/test_game_application.c Byte-identical second derived-class builder: exact base call, brush replacement, style OR 0x3800, far frame, and cleanup are represented and tested separately. +1000:6073 FUN_1000_6073 Code1 116 verified tdkpin_full_child_window_construct reconstructed/tdkpin_game_windows.c disassembly 1000:6073-60e6; verified Borland constructor and TWindow base; USER SetFocus; reconstructed/tests/test_game_windows.c Exact parent far-pointer publication at +41, origin 0/0, 640x460 geometry, style 0x46000002 replacement, HWND +4 focus, returned far object, and constructor-entry failure are represented and tested. +1000:60e7 FUN_1000_60e7 Code1 66 verified tdkpin_board_window_destruct reconstructed/tdkpin_window_lifecycle.c disassembly 1000:60e7-6128; verified TWindow destructor; peer +41 to reciprocal +45; overlay bitmap 0867; reconstructed/tests/test_window_lifecycle.c Exact unguarded peer dereference, peer +45/+47 clear, self +41/+43 clear, bitmap deletion without global clear, base/derived Borland destructor chaining, six-byte cleanup, and ordering are represented and tested. +1000:6129 FUN_1000_6129 Code1 69 verified tdkpin_setup_board_window reconstructed/tdkpin_game_assets.c disassembly 1000:6129-616d; verified SetupWindow/DAT loader; board index 07cd; USER cursor/focus APIs; reconstructed/tests/test_board_overlay.c Exact setup, system Wait cursor load/set, uint16 resource ID 1000+board_index with zero selector, current instance, global bitmap publication, HWND focus, ignored cursor/focus returns, and four-byte cleanup are tested. +1000:616e FUN_1000_616e Code1 148 verified tdkpin_draw_board_overlay reconstructed/tdkpin_game_assets.c disassembly 1000:616e-6201; palette/bitmap globals; GDI compatible DC and 640x460 SRCCOPY; reconstructed/tests/test_board_overlay.c Exact foreground palette select/unrealize/realize, compatible source DC, bitmap select, 640x460 origin SRCCOPY, object/DC/palette restoration, Arrow cursor load/set, three ignored arguments, ten-byte cleanup, and call order are tested. +1000:6202 FUN_1000_6202 Code1 22 verified tdkpin_close_variant_b reconstructed/tdkpin_message_pump.c disassembly 1000:6202-6217; verified 1008:00e2 and 1018:0f38; reconstructed/tests/test_message_pump.c Exact queue drain before close-if-allowed, receiver far argument, and four-byte Pascal cleanup are represented and tested. +1000:6218 FUN_1000_6218 Code1 45 verified tdkpin_conditional_close_variant_b reconstructed/tdkpin_message_pump.c disassembly 1000:6218-6244; event high-word low byte comparison 0x3b; reconstructed/tests/test_message_pump.c Exact suppression value, drain/close nonmatch path, unchanged receiver/event frames, uninitialized uint16 local return via compatibility primitive on both paths, and eight-byte cleanup are branch-tested. +1000:6245 FUN_1000_6245 Code1 151 verified tdkpin_wm_palette_changed_variant_c reconstructed/tdkpin_game_assets.c instruction-for-instruction duplicate of verified 1000:59a0 at 1000:6245-62db; shared static semantic core; palette-window tests Exact third-class WM_PALETTECHANGED entry and all branches/call flags are represented through the documented duplicate core. +1000:62dc FUN_1000_62dc Code1 128 verified tdkpin_wm_query_new_palette_variant_c reconstructed/tdkpin_game_assets.c instruction-for-instruction duplicate of verified 1000:5a37 at 1000:62dc-635b; shared static semantic core; palette-window tests Exact third-class WM_QUERYNEWPALETTE entry, result publication, positive invalidation, and cleanup are represented. +1000:635c FUN_1000_635c Code1 50 verified tdkpin_blit_bitmap_and_present reconstructed/tdkpin_gameplay_helpers.c disassembly 1000:635c-638d; verified 1008:07b6/093f; reconstructed/tests/test_gameplay_helpers.c Exact six-word forwarding into bitmap-to-background followed by present with the bitmap argument omitted, unchanged height/width/y/x/DC, ignored results, and 12-byte cleanup are represented and tested. +1000:638e FUN_1000_638e Code1 1961 verified tdkpin_handle_key_release reconstructed/tdkpin_key_input.c disassembly 1000:638e-6b36; verified arithmetic/Real48/random/sound/render dependencies; exact USER GetDC/ReleaseDC call frames; reconstructed/tests/test_key_release.c Exact two-far-pointer RETF-8 ABI, four-word auxiliary-window gate, dormant debug F2/F7 paths, scan-50 scalar*100 impulse with signed 32-bit wrap, lower clamp and exact Real48 0.6 upper clamp, random jitter, velocity mirror and decoration redraw, flipper-key clears, left/right/space nudges with exact random order and Real48 random*20-10 factor, two-slot velocity updates, unsigned tilt threshold and UI restore, sound toggle/device gate, add-player state publication, all four 175-byte/word mirrors, unused-player score/UI clears, record live-state refresh, normal event clears, and zero return are branch- and extent-tested. +1000:6b37 FUN_1000_6b37 Code1 193 verified tdkpin_draw_board_decoration_row reconstructed/tdkpin_gameplay_helpers.c disassembly 1000:6b37-6bf7; verified present-region dependency; exact 6bf8 caller-frame offsets; GDI imports; reconstructed/tests/test_gameplay_helpers.c Exact four-byte nested ABI, caller HDC at SS:[BP-0c], four published GDI temporaries at -0e/-10/-12/-14, two compatible DCs, background/decoration selections, 21x18 SRCCOPY from atlas 314/426 to x0/caller-y, reverse restore/delete, and final background presentation are represented and sequence-tested. +1000:6bf8 FUN_1000_6bf8 Code1 815 verified tdkpin_handle_key_press reconstructed/tdkpin_key_input.c disassembly 1000:6bf8-6f26; verified window/application/board-decoration dependencies; exact far event layout and GDI threshold behavior; reconstructed/tests/test_key_input.c Exact two-far-pointer RETF-8 ABI, four-word auxiliary-window gate, F1 HelpScreen VMT 017e creation/MakeWindow/+45 publication/Show and indeterminate return without event clearing, scan-50 scalar*50 velocity subtraction and baa clear, player-count DC gate, signed -1..-10 threshold selection to rows 21..210 or 231, scan 1d/1c flipper flags under tilt gate, normal event +0a/+0c clears, and zero return are branch-tested. +1000:6f27 FUN_1000_6f27 Code1 1305 verified tdkpin_rotate_and_draw_targets reconstructed/tdkpin_mechanism_render.c disassembly 1000:6f27-743f; exact Win16-PASCAL GDI push order; verified item/sound dependencies; target words and player receiver row; reconstructed/tests/test_mechanism_render.c Exact DC/91x90 bitmap lifetime, state<6 DAT600 frame selection with 91-pixel stride, state>=6 overlay-background capture and DAT600 reselection, cyclic rotation of five record words and five active-player bytes, item 15..19 refresh, state-1 sound 11, six complete five-point coordinate sets, nonzero-target 17x17 SRCAND/SRCPAINT atlas pairs at x455/y17/0, final presentation at 79/33, and cleanup are represented and tested for state 1 and state 6. +1000:7440 FUN_1000_7440 Code1 2514 verified tdkpin_draw_panel_animation reconstructed/tdkpin_panel_animation.c disassembly 1000:7440-7e11; exact Win16-PASCAL GDI push order correcting raw width/height mappings; DAT600/overlay/background assets; verified sound dependencies; reconstructed/tests/test_panel_animation.c Exact 91x123 backbuffer and board location 79/0, nine signed-low-word frame intervals 1..44,45..57,58..65,66..128,129..158,159..221,222..229,230..237,238..281, entry-frame play/stop events, all times-two reveal/retract formulas, 91x90 and 45x88 mask/image compositions, frame-1 background initialization, frame-281 background commit through overlay B, final presentation, and GDI cleanup are represented as named phases and tested at all interval starts plus internal formula boundaries. +1000:7e12 FUN_1000_7e12 Code1 128 verified tdkpin_refresh_collision_record reconstructed/tdkpin_gameplay_helpers.c disassembly 1000:7e12-7e91; verified b30b/b3f3; packed collision layout; reconstructed/tests/test_gameplay_helpers.c Exact id 1..175 gate, flags +41 priority 0080 before 0100, active byte +34 polarity/inversion, overlay-A/B dispatcher selection, no-op flags, and four-byte cleanup are represented and branch-tested. +1000:7e92 FUN_1000_7e92 Code1 71 verified tdkpin_refresh_player_item reconstructed/tdkpin_gameplay_helpers.c disassembly 1000:7e92-7ed8; SS caller-frame receiver; player byte 07d1; reconstructed/tests/test_gameplay_helpers.c Exact current-player times 20 plus item plus 0467 byte address, nonzero overlay-A/zero overlay-B polarity, item+1000 wrapped id, caller BP forwarding, and four-byte cleanup are represented and tested. +1000:7ed9 FUN_1000_7ed9 Code1 3124 verified tdkpin_move_flipper_collision_geometry reconstructed/tdkpin_flipper_collision.c disassembly 1000:7ed9-8b0c with every far call annotated; typed collision records 65-68/80-83; verified Mul32/Div32/Real48/sound/slot/move dependencies; reconstructed/tests/test_flipper_collision.c Exact RETF-10 ABI, sound 21 entry effect, flipper-specific radius/pivot/edge loads and dead point reads, delta*radius pivot motion, direction-selected response records 66/68/81/83, snapshotted one-based ball loop with live multiball load/save gates, signed divide-by-1000 cross products, strict 54000 square/radial gates, mode/flipper/direction tests, exact Real48 0.1 vertical-edge fallback, interpolated or absolute penetration, sign-correct Real48 normals, deliberately discarded-and-zeroed normal projection, tangent projection, sqrt(distance/44000)*2+0.4 gain, per-record 1+response factor, ordered X/Y velocity publication, penetration*vx/vy ball movement, 32-bit wrap, and invalid-flipper indeterminate state are represented; four contact directions, distinct response coefficients, both vertical fallbacks, gates, and multiball iteration are tested. +1000:8b0d FUN_1000_8b0d Code1 3811 verified tdkpin_move_flipper_bitmap_geometry reconstructed/tdkpin_flipper_bitmap_geometry.c disassembly 1000:8b0d-99ef; typed 83-byte collision records; all 28 immediate scale factors and signed add/sub instructions; verified arithmetic/render dependencies; exact USER GetDC/ReleaseDC frames; reconstructed/tests/test_flipper_bitmap_geometry.c Exact hidden static link through 99f0 and timer caller frames, GetDC-before-parent-scratch order, four parent-stack words including delta==1 positive 43000 versus all-other negative 43000, records 66-68 and 81-83, all point/bounds mutations with 32-bit wrap, four signed endpoint min/max recomputations padded by 5000, two direct swept-edge bounds updates, left/right restore polarity from receiver bd4/bd6, exact 52x47 at 373/93 and 53x45 at 372/175 presentation rectangles, invalid-flipper balanced-DC no-op, and RETF-8 ABI are represented and branch-/extent-tested. +1000:99f0 FUN_1000_99f0 Code1 240 verified tdkpin_update_flippers reconstructed/tdkpin_flippers.c disassembly 1000:99f0-9adf; exact caller-BP receiver fields; verified 1000:7ed9/8b0d dependency cores; reconstructed/tests/test_flippers.c Exact outer caller-frame receiver lookup, independent left/right key and position gates, uint16 position increment/decrement, delta -1 on the zero-position pressed edge and +1 on release, flipper IDs 1/2, collision-before-bitmap ordering, no-op steady states, and nested 8b0d semantic-core factoring are represented and press/release/steady tested for both flippers. +1000:9ae0 FUN_1000_9ae0 Code1 137 verified tdkpin_receiver_point_in_bounds reconstructed/tdkpin_gameplay_helpers.c disassembly 1000:9ae0-9b68; SS caller-frame receiver; reconstructed/tests/test_gameplay_helpers.c Exact receiver milli-X/Y fields +0bba/+0bbe, inclusive signed-int32 minimum/maximum comparisons using signed high/unsigned low words, short-circuit order, last-loaded AX high-byte residue, Boolean AL, and 18-byte cleanup are represented and branch-tested. +1000:9b69 FUN_1000_9b69 Code1 97 verified tdkpin_ball_in_bounds reconstructed/tdkpin_gameplay_helpers.c disassembly 1000:9b69-9bc9; DGROUP ball X/Y 07db/07df; reconstructed/tests/test_gameplay_helpers.c Exact ignored static link, global milli-X/Y, inclusive signed-int32 bounds, short-circuit order, last-loaded AX high-byte residue, Boolean AL, and 18-byte cleanup are represented and branch-tested. +1000:9bca FUN_1000_9bca Code1 699 verified tdkpin_render_ball_from_caller_frame reconstructed/tdkpin_gameplay_helpers.c disassembly 1000:9bca-9e84; exact caller-frame ABI; verified signed divide; USER/GDI prototypes; background/mask/image sources; reconstructed/tests/test_ball_render.c Exact GetClientRect side effect, GetDC and three compatible DCs, 100x100 bitmap, wrapping add-500 signed divide-by-1000 minus-eight pixel conversion, receiver publications, 19x19 background capture, SRCAND/SRCPAINT composition, signed bottom clipping to row 442/443 including zero height, stale SS:[BP-6] third-DC reselection, and complete cleanup/release order are branch- and sequence-tested. +1000:9e85 FUN_1000_9e85 Code1 238 verified tdkpin_reset_ball_state reconstructed/tdkpin_gameplay_helpers.c disassembly 1000:9e85-9f72; verified 1000:9bca dependency; exact DGROUP/receiver offsets; reconstructed/tests/test_ball_render.c Exact five-word all-nonzero gate, conditional 0851/0853 clears and 07c8 set, unconditional tilt/receiver reset, milli-position constants 325000/413000, duplicate current/previous coordinate fields, velocity/state zeroing, bdd byte clear, caller-BP propagation, and redraw are represented and both gate branches tested. +1000:9f73 FUN_1000_9f73 Code1 1051 verified tdkpin_render_ball_swept_region reconstructed/tdkpin_gameplay_helpers.c disassembly 1000:9f73-a38d; exact caller-frame/receiver fields; verified signed divide; USER/GDI prototypes; reconstructed/tests/test_ball_sweep.c Exact current pixel projection, signed current-minus-previous milli delta divided by 1000, bb2/bb6 publications, direction-dependent swept destination and mask/image source offsets, modulo-2^32 magnitude without C overflow UB, abs(delta)+19 geometry, background capture, 19x19 SRCAND/SRCPAINT composition, signed bottom clipping, whole swept-region presentation, stale SS:[BP-6] reselection, and complete cleanup are represented and tested for both delta polarities and clipped/unclipped branches. +1000:a38e FUN_1000_a38e Code1 630 verified tdkpin_restore_previous_ball_region reconstructed/tdkpin_gameplay_helpers.c disassembly 1000:a38e-a603; exact caller-frame ABI and receiver fields; verified signed divide; USER/GDI prototypes; reconstructed/tests/test_ball_restore.c Exact GetClientRect/GetDC, three compatible DCs, 100x100 bitmap, prior milli-position +500/divide1000/minus8 projection, ba2/ba6 publication, velocity zeroing, 19x19 background capture, signed bottom clipping, low-byte presentation suppression, stale SS:[BP-6] reselection, and full object/DC/release cleanup are represented and both presentation branches tested. +1000:a604 FUN_1000_a604 Code1 266 verified tdkpin_refresh_player_progress_markers reconstructed/tdkpin_gameplay_helpers.c disassembly 1000:a604-a70d; verified multiply and overlay/present dependencies; exact current-player/table addressing; reconstructed/tests/test_gameplay_helpers.c Exact caller-BP receiver/HWND, GetDC lifetime, 32-bit counter 1..6, signed int16 marker threshold, player row (player-1)*44+298, marker column (counter-1)*8+391, inclusive 5x5 geometry, overlay A/B polarity, twelve draw/present calls, and ReleaseDC are represented and sequence-tested. +1000:a70e FUN_1000_a70e Code1 30 verified tdkpin_set_gameplay_transition_flags reconstructed/tdkpin_gameplay_helpers.c disassembly 1000:a70e-a72b; SS caller-frame far receiver at BP+6; reconstructed/tests/test_gameplay_helpers.c Exact player-count clear, caller-frame receiver recovery, object byte +0bde set, transition-pending byte set, write order, and two-byte cleanup are represented and tested. +1000:a72c FUN_1000_a72c Code1 446 verified tdkpin_initialize_player_state reconstructed/tdkpin_player_state.c disassembly 1000:a72c-a8e9; all internal dependencies verified; exact collision/player/item tables and caller receiver; reconstructed/tests/test_player_state.c Exact 175-record refresh plus record+43 copy into all four 0x15e-stride receiver rows, five item restores, zero score draw and 0874 clear, configured-player-only score/secondary/multiplier/sprite/marker/level/item initialization, initial 2-versus-3 marker counts, 20-byte receiver row clears, final current-player/highscore-index reset, and twenty item refreshes are count-, order-, and memory-tested. +1000:a8ea FUN_1000_a8ea Code1 178 verified tdkpin_save_highscores reconstructed/tdkpin_highscores.c disassembly 1000:a8ea-a99b; verified Borland fill/strcpy; KERNEL _lcreat/_lwrite/_lclose prototypes; exact DGROUP offsets; reconstructed/tests/test_highscores.c Exact ignored two-byte static link, -1 create failure, 260-byte contiguous local layout, zeroed 220-byte name region, one-based ten-entry dword XOR with key 0010, 22-byte name slots, 16/40/220-byte write order, ignored write/close results, and close-on-success path are represented and byte-tested. +1000:a99c FUN_1000_a99c Code1 416 verified tdkpin_load_highscores reconstructed/tdkpin_highscores.c disassembly 1000:a99c-ab3b; verified ShortString conversion/compare, dword multiply, far strcpy; KERNEL _lopen/_lread/_lclose; reconstructed/tests/test_highscores.c Exact two-byte static link, mode-0 then mode-0x40 open retry, 16-byte header read and ShortString comparison, ignored read returns, direct 220-byte DGROUP name read, ten dword XOR decodes, unconditional close of an opened file, descending 1000000..100000 defaults, and ten No Name copies are branch- and byte-tested, including short-read residue semantics. +1000:ab3c FUN_1000_ab3c Code1 169 verified tdkpin_show_highscore_windows reconstructed/tdkpin_highscores.c disassembly 1000:ab3c-abe4; verified far strcpy, text-dialog and centered-child constructors, ObjectWindows virtual slots +38/+34 and Show; exact caller SS:BP contract; reconstructed/tests/test_highscores.c Exact optional insertion-index name reset, hidden text-dialog VMT 01ce versus control ID 0016, label/caption/name/parent order, ignored ExecDialog result, centered child VMT 010e/title, MakeWindow return publication at receiver +41, Show command 1, and zero-index dialog bypass are represented and tested. +1000:abe5 FUN_1000_abe5 Code1 221 verified tdkpin_insert_current_score reconstructed/tdkpin_highscores.c disassembly 1000:abe5-acc1; verified far-copy/show/save dependencies; current-player/player-score and high-score table offsets; reconstructed/tests/test_highscores.c Exact one-based scan, signed high-word then unsigned low-word strict comparison, tie rejection, bottom-up dword and 22-byte name shift, index-10 no-shift case, score/index publication, caller-BP propagation, dialog/show then save ordering, and nonqualifying early return are represented and tested. +1000:acc2 FUN_1000_acc2 Code1 428 verified tdkpin_redraw_all_players reconstructed/tdkpin_player_state.c disassembly 1000:acc2-ae6d; verified score/sprite/overlay dependencies; exact player arrays and geometry; reconstructed/tests/test_player_state.c Exact GetDC-before-zero-count behavior, saved current/player-count bytes, 44-pixel row loop, 31x139 panel restore, temporary current-player publication, active zero-delta score/status path, secondary-score times byte multiplier, sprite composition and 123x42 presentation, active overlay-A versus inactive redraw-only/overlay-B 11x11 marker polarity, saved-player restoration, and ReleaseDC are branch- and sequence-tested. +1000:ae6e FUN_1000_ae6e Code1 1114 verified tdkpin_finish_ball_or_advance_player reconstructed/tdkpin_turn_state.c disassembly 1000:ae6e-b2c7; all internal dependencies verified; exact collision/player/receiver tables; Real48 register constant 80 cd cc cc cc 4c; reconstructed/tests/test_turn_state.c Exact special-respawn gate and collision-position transfer, item-20 clear, dynamic record update, int32-to-Real48 times 0.8 rounded velocity, special flags, normal sound/restore/highscore-on-zero path, 175-record save/load mirrors, modulo player search with return-to-origin termination, game-over transition/dialog condition, changed-player collision/item/UI refresh, ready-item redraw, marker decrement, ball reset, 20x148 overlay refresh, and final marker redraw are represented and tested across special, live-next-player, and all-dead branches. +1000:b2c8 FUN_1000_b2c8 Code1 67 verified tdkpin_restore_bounds_overlay_a reconstructed/tdkpin_gameplay_helpers.c disassembly 1000:b2c8-b30a; verified 1008:0837/093f; reconstructed/tests/test_gameplay_helpers.c Exact ignored static link, inclusive uint16 bottom-top+1/right-left+1 dimensions, wrapped INT16 arguments, overlay-A restore then present ordering, unchanged top/left/DC, and 12-byte cleanup are represented and tested. +1000:b30b FUN_1000_b30b Code1 165 verified tdkpin_restore_record_or_item_a reconstructed/tdkpin_gameplay_helpers.c disassembly 1000:b30b-b3af; verified b2c8 and 1008:0dbd; collision/word-quad layouts; reconstructed/tests/test_gameplay_helpers.c Exact caller-frame HWND/DC lifetime, ids 0..175 collision render bounds, ids 1006..1014 item-status mapping 1..9, all other ids via wrapped id-1000 times 8 word-quad bounds, overlay-A restore, and four-byte cleanup are represented and branch-tested. +1000:b3b0 FUN_1000_b3b0 Code1 67 verified tdkpin_restore_bounds_overlay_b reconstructed/tdkpin_gameplay_helpers.c disassembly 1000:b3b0-b3f2; verified 1008:08bb/093f; reconstructed/tests/test_gameplay_helpers.c Exact ignored static link, inclusive uint16 bottom-top+1/right-left+1 dimensions, wrapped INT16 arguments, overlay-B restore then present ordering, unchanged top/left/DC, and 12-byte cleanup are represented and tested. +1000:b3f3 FUN_1000_b3f3 Code1 131 verified tdkpin_restore_record_b reconstructed/tdkpin_gameplay_helpers.c disassembly 1000:b3f3-b475; verified b3b0; collision/word-quad layouts; reconstructed/tests/test_gameplay_helpers.c Exact caller-frame HWND/DC lifetime, ids 0..175 collision render bounds, all larger ids through wrapped id-1000 times 8 word-quad bounds without the A-path item special case, overlay-B restore, and four-byte cleanup are represented and tested. +1000:b476 FUN_1000_b476 Code1 1984 verified tdkpin_handle_collision_events reconstructed/tdkpin_collision_events.c disassembly 1000:b476-bc35; all internal dependencies verified; exact collision/player/receiver aliases and bit order; reconstructed/tests/test_collision_events.c Exact tilt-wide early return and ordered independent flags 0001,0002/2000,0400,0004,0008,0010,1000,0040 are represented: item activation, linked-record clear, rotation arm, random/nonrandom sprite award, five-group ready reward/reset, four-group item-bank <9/=9/>9 branches with completion rectangles or secondary bonus, three record switches, timed records, sounds, score deltas, record/player byte publications, DC sharing, and refresh ordering are branch-tested across every event class and boundary. +1000:bc36 FUN_1000_bc36 Code1 364 verified tdkpin_add_score_from_caller_frame reconstructed/tdkpin_gameplay_helpers.c disassembly 1000:bc36-bda1; verified multiply/sound/marker/status/score dependencies; exact player tables and caller receiver; reconstructed/tests/test_scoring.c Exact caller-BP plus int32 delta ABI, -1 redraw sentinel, tilt gate, independent global/receiver doubling with 32-bit wrap, active score update, signed-high/unsigned-low threshold comparison including equality, level<=4 gate and index-zero alias arithmetic, sound 7, 32-bit level and 16-bit marker increments, marker refresh, conditional status update, unconditional score redraw, and DC lifetime are branch-tested. +1000:bda2 FUN_1000_bda2 Code1 60 verified tdkpin_draw_score_from_caller_frame reconstructed/tdkpin_gameplay_helpers.c disassembly 1000:bda2-bddd; SS caller-frame receiver at BP+6; USER GetDC/ReleaseDC; verified 1008:0996; reconstructed/tests/test_gameplay_helpers.c Exact caller-frame far receiver, HWND +4, matched DC lifetime, low/high score word assembly, score renderer argument order, ignored API results, and six-byte cleanup are represented and tested. +1000:bdde FUN_1000_bdde Code1 289 verified tdkpin_update_dynamic_ball_record reconstructed/tdkpin_gameplay_helpers.c disassembly 1000:bdde-befe; packed collision layout; reconstructed/tests/test_gameplay_helpers.c Exact ignored static link, signed 32-bit displacement plus 173 with low-word 83-byte indexing, current ball point1 stores, modulo-2^32 +/-16000 then +/-5000 bounds equivalent to +/-21000, six field writes, and six-byte cleanup are represented and tested. +1000:beff FUN_1000_beff Code1 1132 verified tdkpin_move_ball_and_render reconstructed/tdkpin_gameplay_helpers.c disassembly 1000:beff-c36a; body-equivalent swept-render tail proven against verified 1000:9f73; exact ten-byte ABI and position stores; reconstructed/tests/test_ball_sweep.c Exact caller-BP plus delta-X/delta-Y int32 argument order, current-to-previous bc2/bc6 publication before mutation, modulo-2^32 Y-then-X additions, and the complete byte-equivalent signed-delta/geometry/mask/image/clipping/GDI tail shared with 1000:9f73 are represented; end-to-end state and rendered delta are tested with mixed-sign arguments. +1000:c36b FUN_1000_c36b Code1 187 verified tdkpin_load_ball_slot reconstructed/tdkpin_gameplay_helpers.c disassembly 1000:c36b-c425; SS caller-frame receiver; reconstructed/tests/test_gameplay_helpers.c Exact unchecked uint16 slot times 4/6 addressing, slot position to global ball X/Y, velocity and auxiliary dword fields to receiver +0baa/+0bae/+0bca, six-byte Real48 copy to +0bce, overlap behavior, and six-byte cleanup are represented and tested. +1000:c426 FUN_1000_c426 Code1 187 verified tdkpin_save_ball_slot reconstructed/tdkpin_gameplay_helpers.c disassembly 1000:c426-c4e0; SS caller-frame receiver; reconstructed/tests/test_gameplay_helpers.c Exact inverse unchecked uint16 slot times 4/6 transfer of global position, receiver velocity/auxiliary dwords and six-byte Real48 field into packed DGROUP slot arrays, overlapping out-of-range slot behavior, and six-byte cleanup are represented and tested. +1000:c4e1 FUN_1000_c4e1 Code1 699 verified tdkpin_apply_player_sprite_effect reconstructed/tdkpin_player_state.c disassembly 1000:c4e1-c79b; verified multiply/score dependencies; exact player tables and record 399a access; reconstructed/tests/test_player_state.c Exact sprite-index dispatch 1..7, wrapping secondary-score additions 10000/20000/50000/100000/200000, unsigned-byte multiplier redraw, effect-6 multiplied transfer/reset/zero redraw, effect-7 nonzero record gate, signed-negative or unequal argument condition, receiver +be0 and global 0874 publications, and default no-op behavior are represented and branch-tested. +1000:c79c FUN_1000_c79c Code1 8981 verified tdkpin_simulate_ball_and_dispatch_collision reconstructed/tdkpin_physics.c disassembly 1000:c79c-eab0 and rz-ghidra stack-offset view; packed 83-byte records and exact 52-byte candidate layout; all integer/Real48/gameplay/GDI dependencies verified; reconstructed/tests/test_physics.c Exact RETF-2 caller-frame ABI, simulation-call counter, snapshotted ball count and substep word, multiball load/save, gravity and two ordered speed clamps, previous/predicted coordinates, board-loss/layer gates, 175-record broadphase, types 1 circle, 2 segment, 3 capture/pocket, and 4 stateful trigger, subtype normal reversal, signed cross/end-point tests, contact-state sentinels, claw/target-set/sprite/score special paths, trigger 0x4000 lifecycle and random bounce, packed nearest-candidate copies, event/score dispatch, Real48 normal/tangent/spin/response/kick transform including deliberately zeroed intermediate, ball-to-ball impulse transfer, record 25/2 terminal paths, ordered velocity/position publication, dynamic-record update, swept rendering, 32-bit wrap, and Borland divide/error behavior are represented. Free integration, exact 3-4-5 clamp, circle/segment responses, four trigger/capture modes, distinct response/event/score paths, out-of-bounds, and zero-substep multiball are tested. +1000:eab1 exported_ordinal_10 Code1 4820 verified tdkpin_timer_tick reconstructed/tdkpin_timer_tick.c disassembly 1000:eab1-fd84 including RETF-8 and all annotated calls; exact Real48 claw-release table; complete verified dependency closure including 1000:c79c; reconstructed/tests/test_timer_tick.c Exact two-DWORD callback ABI with unused second argument, all nine guard conditions, busy flag, 175-record refresh, two dword counters, claw movement/release/record activation, ten exact spawn states, 175 countdowns, target rotation, multiball collapse/promotion/reset/spawn, physics gate, quotient-versus-remainder intro schedules, record/item/chase/status animations, complete 30x284 score-marquee GDI lifetime, panel frames 1..281, game initialization, flipper/message epilogue, busy clear, redundant tilt read, and tilt-counter decrement are represented and branch-/sequence-tested. +1000:fd85 ne_program_entry Code1 181 verified tdkpin_ne_program_entry reconstructed/tdkpin_program_entry.c disassembly 1000:fd85-fe39; relocations 1669-1679; reconstructed/tests/test_program_entry.c Exact InitTask register handoff, eight-unit initialization order, full DX:AX GetVersion store, Windows 3.10 threshold, indirect MessageBox error path, fixed application object construction, VMT +1c Run and +08 destructor calls, dispose mode zero, and unconditional Halt(0) are represented and branch-tested. +1008:0002 FUN_1008_0002 Code2 33 verified tdkpin_play_sound_if_not_tilted reconstructed/tdkpin_sound.c disassembly 1008:0002-0022; verified 1008:1131 dependency; DGROUP game-tilted byte 07c6 and sound-enabled byte 43f2; reconstructed/tests/test_sound.c Exact Tilted==0 then Enabled!=0 short-circuit order, unchanged sound-number argument, ignored player result, two-byte Pascal cleanup, and all gate combinations are branch-tested. +1008:0023 FUN_1008_0023 Code2 191 verified tdkpin_realize_nocollapse_palette reconstructed/tdkpin_palette.c disassembly 1008:0023-00e1; exact LOGPALETTE256 layout; verified Borland allocation/free; GDI palette/DC APIs; reconstructed/tests/test_palette_gdi.c Exact null-allocation early return, 1028-byte palette, version 0300/count 256, 256 zero RGB entries with flag 4, GetDC/Create/Select(false)/Realize/Select(previous,true)/Delete/Release ordering, ignored API returns, free, and RETF 2 are branch-tested. +1008:00e2 FUN_1008_00e2 Code2 86 verified tdkpin_drain_messages_except_input reconstructed/tdkpin_message_pump.c disassembly 1008:00e2-0137; exact MSG16 and USER Peek/Translate/Dispatch calls; seven internal/export callers; reconstructed/tests/test_message_pump.c Exact PeekMessage HWND/min/max=0x32/PM_REMOVE arguments, loop-to-empty behavior, suppression of 0x0580/0x0100/0x0101, translation/dispatch of all other returned messages, and far return are represented and tested. +1008:0138 FUN_1008_0138 Code2 1615 verified tdkpin_initialize_collision_record reconstructed/tdkpin_collision_records.c disassembly 1008:0138-0786; 177 call sites in 1000:0270; OBJECTS.tsv live original dump; reconstructed/tests/test_collision_records.c Exact 40-word ABI, index 0..175 gate, 83-byte packed layout, type/subtype/active truncation, radius geometry selection, absolute Y-20 and relative continuation modes, signed int32 bound ordering, modulo-2^32 scale/add/subtract, +/-5000 and fallback corrections, Real48 radius conversion, four Real48 copies, all scalar fields, continuation globals, slot-0 aliases, and slot-175/word-table overlap are represented and branch-tested; rows 1 and 4 match live original geometry. +1008:0787 FUN_1008_0787 Code2 47 verified tdkpin_set_word_quad reconstructed/tdkpin_tables.c disassembly 1008:0787-07b5; twenty direct setup calls with indices 1..20; reconstructed/tests/test_tables.c Exact uint16 index*8 offset, DGROUP base 4263, reversed Pascal argument-to-field order, four word stores, ten-byte cleanup, and first/last written records are represented and tested. +1008:07b6 FUN_1008_07b6 Code2 129 verified tdkpin_blit_bitmap_to_background reconstructed/tdkpin_render.c disassembly 1008:07b6-0836; background bitmap 085b; two compatible DCs; reconstructed/tests/test_render.c Exact supplied-bitmap origin to background (x,y,width,height) SRCCOPY, selections/restorations, bitmap/source DC roles, deletion order, 12-byte cleanup, and ignored API results are tested. +1008:0837 FUN_1008_0837 Code2 132 verified tdkpin_restore_background_region_a reconstructed/tdkpin_render.c disassembly 1008:0837-08ba; bitmaps 085b/085f; reconstructed/tests/test_render.c Exact same-coordinate rectangle copy from overlay A into background, dual compatible DC lifecycle, object restoration, deletion order, ten-byte cleanup, and SRCCOPY are tested. +1008:08bb FUN_1008_08bb Code2 132 verified tdkpin_restore_background_region_b reconstructed/tdkpin_render.c disassembly 1008:08bb-093e; bitmaps 085b/085d; reconstructed/tests/test_render.c Byte-identical second rectangle restore with overlay B's exact global slot, argument order, DC/object lifecycle, and ten-byte cleanup is independently tested. +1008:093f FUN_1008_093f Code2 87 verified tdkpin_present_background_region reconstructed/tdkpin_render.c disassembly 1008:093f-0995; background bitmap 085b; reconstructed/tests/test_render.c Exact background-to-destination same-coordinate SRCCOPY, single compatible DC/select/restore/delete lifecycle, ten-byte cleanup, and ignored BOOL results are represented and tested. +1008:0996 FUN_1008_0996 Code2 520 verified tdkpin_draw_score reconstructed/tdkpin_render.c disassembly 1008:0996-0b9d; verified 08e6 and blit dependencies; player-score table 0982-0991; digit bitmap 0861; reconstructed/tests/test_score_render.c Exact one-based player-score selection, destination-x cases, 40x150 temporary surface, 40x130 background capture at y478, duplicated signed divide-by-10 calls, low-byte remainder digit, eight positions, leading-zero suppression, digit SRCAND coordinates, final SRCCOPY, selections/deletions, six-byte cleanup, and 16-bit coordinates are represented and tested. +1008:0b9e FUN_1008_0b9e Code2 543 verified tdkpin_update_status_display reconstructed/tdkpin_status_render.c disassembly 1008:0b9e-0dbc; player/score/status/bitmap DGROUP objects; verified four blit primitives; reconstructed/tests/test_status_render.c Exact current-player/sentinel/1..4 gates, strict score thresholds 2000/140000/650000/1300000, unchanged-level skip, level bitmap one-based lookup, main 146x142 region at 380,69, five reversed-x 11x11 indicators at y544, active A/inactive B selection, player-zero full reset, sentinel 99, four-byte cleanup, and state publication are branch-tested. +1008:0dbd FUN_1008_0dbd Code2 75 verified tdkpin_draw_item_status reconstructed/tdkpin_status_render.c disassembly 1008:0dbd-0e07; item bitmap base 4321; verified blit/restore/present primitives; reconstructed/tests/test_status_render.c Exact signed item-zero branch, one-based HBITMAP lookup for nonzero values, binary argument order height61,width68,y300,x123, background-B restoration, bitmap-to-background blit, unconditional presentation, four-byte cleanup, and ignored returns are represented and tested. +1008:0e08 FUN_1008_0e08 Code2 287 verified tdkpin_draw_claw_frame reconstructed/tdkpin_claw_render.c disassembly 1008:0e08-0f26; verified background primitives; DAT900 bitmap 0863; reconstructed/tests/test_claw_render.c Exact frame-zero restore/present, byte alternate gate, frame>9 subtract/switch, unsigned (frame-1)*100 source-x, source-y banks 0/74/148/222, fixed destination height74,width100,y47,x238, duplicate SRCCOPY to background and destination, select/restore/delete order, six-byte cleanup, and representative frames 1/10/18 are tested. +1008:0f27 FUN_1008_0f27 Code2 5 verified tdkpin_initialize_unit_ordinal_72 reconstructed/tdkpin_initialization.c disassembly 1008:0f27-0f2b; NE entry 72; direct startup call at 1000:fda8 Binary body is exactly PUSH BP; MOV BP,SP; LEAVE; RETF and therefore has no state or side effects beyond ordinary call-frame mechanics. +1008:0f2e FUN_1008_0f2e Code2 437 verified tdkpin_initialize_sounds reconstructed/tdkpin_sound.c disassembly 1008:0f2e-10e2; exact DGROUP data and 48-byte WAVEOUTCAPS16 layout; verified Borland ParamStr/string/move/global-memory dependencies; 16 extracted WAV payload lengths; reconstructed/tests/test_sound.c Exact entry resets, two-call ParamStr path construction, INI default/gate, device count/capability failures, volume-support rounding, one-based 1..22 traversal, absent-resource skips, Find/Load/allocate/Lock/Move/Unlock/Free ordering, state publication, and lack of failure checks are branch-tested. +1008:10e3 FUN_1008_10e3 Code2 78 verified tdkpin_unload_sounds reconstructed/tdkpin_sound.c disassembly 1008:10e3-1130; sndPlaySound and verified global-memory release; exact DGROUP address model; reconstructed/tests/test_sound.c Exact device-count gate, optional stop, inclusive slots 1..22 release order, no pointer/count/enabled clearing, Playing-byte clear, disabled no-op, and far return are branch-tested. +1008:1131 FUN_1008_1131 Code2 94 verified tdkpin_play_sound reconstructed/tdkpin_sound.c disassembly 1008:1131-118e; resource-size table at conceptual base 03e6; sound-pointer base 43f2; MMSYSTEM sndPlaySound; reconstructed/tests/test_sound.c Exact device-count/Enabled/nonzero-resource-size gates, prior-sound stop, selected far pointer, flags 5, BOOL-to-Playing publication, failure clear, no range check with 16-bit wrapped indexing, uninitialized word return, and all ordinary gate branches are tested. +1008:118f FUN_1008_118f Code2 41 verified tdkpin_stop_sound_if_active reconstructed/tdkpin_sound.c disassembly 1008:118f-11b7; MMSYSTEM sndPlaySound; DGROUP device count 43ee and Playing 43f3; reconstructed/tests/test_sound.c Exact device-count-word and playing-byte conjunction, sndPlaySound(NULL,0), ignored BOOL16 return, unchanged playing flag, uninitialized uint16 result, and all gate combinations are tested. +1008:11b8 FUN_1008_11b8 Code2 5 verified tdkpin_initialize_unit_ordinal_86 reconstructed/tdkpin_initialization.c disassembly 1008:11b8-11bc; NE entry 86; direct startup call at 1000:fda3 Binary body is exactly PUSH BP; MOV BP,SP; LEAVE; RETF and therefore has no state or side effects beyond ordinary call-frame mechanics. +1008:11c5 FUN_1008_11c5 Code2 345 verified tdkpin_create_palette_from_rgb_table reconstructed/tdkpin_palette.c disassembly 1008:11c5-131d; exact LOGPALETTE256 layout; DGROUP RGB table 4450-474f; verified Borland allocation/range/free dependencies; GDI CreatePalette; reconstructed/tests/test_palette.c Exact 1028-byte allocation, version 0300/count 256, index*3 RGB to index*4 PALETTEENTRY copy, zero flags, 32-bit loop shape, palette handle publication, 0..65535 descriptor check, temporary free, and far return are represented and tested. +1008:1326 FUN_1008_1326 Code2 130 verified tdkpin_load_palette_resource reconstructed/tdkpin_palette.c disassembly 1008:1326-13a7; PAL resource call frame; range descriptor 131e; reconstructed/tests/test_palette.c Exact current-instance/resource-name/custom-type FindResource, Load/Lock chain, inclusive indices 0..767, two compiler range checks per byte, far source/destination copy, GlobalUnlock-only cleanup, lack of failure checks, RETF 0x0a, and resource 999 call shape are represented and tested. +1008:13a8 FUN_1008_13a8 Code2 245 verified tdkpin_fill_bitmap_info_palette reconstructed/tdkpin_palette.c disassembly 1008:13a8-149c; exact BITMAPINFOHEADER/RGBQUAD offsets; verified 32-bit multiply helper equivalence; reconstructed/tests/test_palette.c Exact bit-count shift and dead wrapped allocation-tail arithmetic, inclusive 0..255 loop, source index*3, destination index*4+40, RGB-to-BGR reversal, reserved-zero store, unaligned far accesses, and four-byte cleanup are represented and tested. +1008:149d FUN_1008_149d Code2 293 verified tdkpin_load_bitmap_resource reconstructed/tdkpin_palette.c disassembly 1008:149d-15c1; exact BITMAPINFOHEADER16/CreateDIBitmap frame; verified 13a8 and resource dependencies; reconstructed/tests/test_bitmap_loader.c Exact DAT Find/Load/Lock, 40-byte stack-header copy, resource bits +40, wrapped color-table allocation size, leaked BITMAPINFO ownership, full BGR0 fill, CreateDC("Display"), palette select/unrealize/realize, CBM_INIT CreateDIBitmap arguments, palette restore, DeleteDC, Unlock/FreeResource, returned HBITMAP, and RETF 6 are represented and tested. +1008:15c2 FUN_1008_15c2 Code2 5 verified tdkpin_initialize_unit_ordinal_91 reconstructed/tdkpin_initialization.c disassembly 1008:15c2-15c6; NE entry 91; direct startup call at 1000:fd9e Binary body is exactly PUSH BP; MOV BP,SP; LEAVE; RETF and therefore has no state or side effects beyond ordinary call-frame mechanics. +1008:15c7 FUN_1008_15c7 Code2 32 verified tdkpin_global_allocate_locked reconstructed/tdkpin_global_memory.c disassembly 1008:15c7-15e6; NE entry 96; Win16 KERNEL ordinals 15 and 18; reconstructed/tests/test_global_memory.c Exact UINT16 flags, uint32 byte count, GlobalAlloc handle flow, unconditional GlobalLock, and far-pointer result are represented and tested. +1008:15e7 FUN_1008_15e7 Code2 32 verified tdkpin_global_unlock_and_free reconstructed/tdkpin_global_memory.c disassembly 1008:15e7-1606; NE entry 97; Win16 KERNEL ordinals 21, 19, and 17; reconstructed/tests/test_global_memory.c Exact selector-only GlobalHandle lookup, retained handle, GlobalUnlock-before-GlobalFree order, ignored pointer offset, and ignored API returns are represented and tested. +1008:1607 FUN_1008_1607 Code2 135 verified object_windows_text_dialog_construct reconstructed/tdkpin_dialog.c disassembly 1008:1607-168d; verified 1008:2996; reconstructed/tests/test_dialog.c Exact hidden-VMT constructor gate, 066a template choice 7f02/7f05, base integer-resource constructor, unaligned caption/label/text far fields +26/+2a/+2e, signed control id +32, parent propagation, suppressed-construction return, and 24-byte cleanup are represented and tested. +1008:168e FUN_1008_168e Code2 48 verified object_windows_dialog_read_text reconstructed/tdkpin_dialog.c disassembly 1008:168e-16bd; USER GetDlgItemText ordinal 93; object fields +4/+0x2e/+0x32; reconstructed/tests/test_dialog.c Exact HWND, signed control id, unaligned far buffer, maximum 0x65, ignored character count, fixed AL=1 return, and four-byte cleanup are represented and tested. +1008:16be FUN_1008_16be Code2 113 verified object_windows_dialog_setup_text_fields reconstructed/tdkpin_dialog.c disassembly 1008:16be-172e; verified 1018:0d9b; reconstructed/tests/test_dialog.c Exact prepare ordering, HWND caption, control 100 label, control 101 text, EM_LIMITTEXT 0415 to control 101, uint16 capacity-minus-one wrap, zero lParam, ignored USER results, and four-byte cleanup are represented and tested. +1008:172f FUN_1008_172f Code2 37 verified tpwincrt_min_i16 reconstructed/tdkpin_runtime_ui.c disassembly 1008:172f-1753 Exact signed comparison, branch values, 16-bit result, and four-byte near-Pascal cleanup represented in C. +1008:1754 FUN_1008_1754 Code2 37 verified tpwincrt_max_i16 reconstructed/tdkpin_runtime_ui.c disassembly 1008:1754-1778 Exact signed comparison, branch values, 16-bit result, and four-byte near-Pascal cleanup represented in C. +1008:1779 FUN_1008_1779 Code2 105 verified tpwincrt_begin_drawing reconstructed/tdkpin_runtime_ui.c disassembly 1008:1779-17e1; Wine 11.15 USER/GDI prototypes; fixed PAINTSTRUCT address Exact BeginPaint/GetDC selection, stock-font selection/save, system foreground/background colors, argument order, stores, and ignored return values represented in C. +1008:17e2 FUN_1008_17e2 Code2 54 verified tpwincrt_end_drawing reconstructed/tdkpin_runtime_ui.c disassembly 1008:17e2-1817; matching drawing acquisition at 1008:1779 Exact previous-font restoration and EndPaint/ReleaseDC branch with HWND/DC/PAINTSTRUCT arguments represented in C. +1008:1818 FUN_1008_1818 Code2 67 verified tpwincrt_create_caret reconstructed/tdkpin_runtime_ui.c disassembly 1008:1818-185a; four USER import call sites reviewed Exact control flow, argument order, unsigned 16-bit coordinate wrap, ignored results, and address-linked globals represented in C. +1008:185b FUN_1008_185b Code2 10 verified tpwincrt_destroy_caret reconstructed/tdkpin_runtime_ui.c disassembly 1008:185b-1864; DestroyCaret16 call site reviewed Exact no-argument call, ignored BOOL16 result, and return represented in C. +1008:1865 FUN_1008_1865 Code2 107 verified tpwincrt_update_scrollbars reconstructed/tdkpin_runtime_ui.c disassembly 1008:1865-18cf; verified max helper; all SetScrollRange16/SetScrollPos16 call sites reviewed Exact bar ids, redraw flags, signed max clamp, positions, ignored results, and call order represented in C. +1008:18d0 FUN_1008_18d0 Code2 30 verified tpwincrt_abort_on_ctrl_c reconstructed/tdkpin_runtime_ui.c disassembly 1008:18d0-18ed; verified RuntimeExit 1020:0061; reconstructed/tests/test_runtime_input.c Exact focus-and-caret conjunction, conditional DestroyCaret-before-exit order, ignored BOOL16 result, fixed uint16 status 0xff, and all focus/caret combinations are tested. +1008:18ee FUN_1008_18ee Code2 201 verified tpwincrt_scroll_to reconstructed/tdkpin_runtime_ui.c disassembly 1008:18ee-19b6; verified signed min/max helpers; this function's SetScrollPos16/ScrollWindow16/UpdateWindow16 calls reviewed Exact clamping, conditional scrollbar updates, low-word MUL deltas, signed API interpretation, viewport-store order, repaint call, and inactive-window early return represented in C. +1008:19b7 FUN_1008_19b7 Code2 65 verified tpwincrt_scroll_cursor_into_view reconstructed/tdkpin_runtime_ui.c disassembly 1008:19b7-19f7; verified signed min/max and scroll dependencies Exact 16-bit subtraction/increment wrap, nested bounds selection, argument order, and far-call return behavior represented in C. +1008:19f8 FUN_1008_19f8 Code2 65 verified tpwincrt_cell_pointer reconstructed/tdkpin_runtime_ui.c disassembly 1008:19f8-1a38 Exact signed one-wrap row test, unsigned MUL low word, offset-only 16-bit wrap, and unchanged selector represented in C. +1008:1a39 FUN_1008_1a39 Code2 73 verified tpwincrt_draw_row_range reconstructed/tdkpin_tpwincrt_text.c disassembly 1008:1a39-1a81; reconstructed/tests/test_tpwincrt_text.c Exact signed empty-range gate, 16-bit pixel products, circular-buffer pointer, TextOut count, and matched drawing-context lifetime are represented and tested. +1008:1a82 FUN_1008_1a82 Code2 143 verified tpwincrt_advance_line reconstructed/tdkpin_tpwincrt_text.c disassembly 1008:1a82-1b10; caller-frame alias mapped to explicit changed-range pointers; reconstructed/tests/test_tpwincrt_text.c Exact pending-row draw, local-range clears, CR column reset, row advance, bottom-row retention, ring-origin wrap, row clearing, negative-height ScrollWindow, and UpdateWindow are represented and tested. +1008:1b11 FUN_1008_1b11 Code2 216 verified tpwincrt_write_bytes reconstructed/tdkpin_tpwincrt_text.c disassembly 1008:1b11-1be8; reconstructed/tests/test_tpwincrt_text.c Exact lazy-window call, printable/CR/BS/BEL dispatch, signed dirty-range tracking, 16-bit cursor wrap behavior, circular-screen writes, final draw, and optional cursor scroll are represented and tested. +1008:1be9 FUN_1008_1be9 Code2 26 verified tpwincrt_write_character reconstructed/tdkpin_tpwincrt_text.c disassembly 1008:1be9-1c02; reconstructed/tests/test_tpwincrt_text.c Exact single-byte SS-backed wrapper into the bulk TPWinCrt writer and six-byte far-Pascal cleanup semantics are represented through line-edit echo tests. +1008:1c03 FUN_1008_1c03 Code2 92 verified tpwincrt_poll_input reconstructed/tdkpin_tpwincrt_text.c disassembly 1008:1c03-1c5e; reconstructed/tests/test_tpwincrt_text.c Exact lazy-window creation, PeekMessage remove flag 1, full queue drain, WM_QUIT abort, Translate/Dispatch ordering, and signed-positive input-count result are represented and tested. +1008:1c5f FUN_1008_1c5f Code2 103 verified tpwincrt_read_character reconstructed/tdkpin_tpwincrt_text.c disassembly 1008:1c5f-1cc5; reconstructed/tests/test_tpwincrt_text.c Exact pre-read cursor scroll, nonblocking poll, WaitMessage loop, focus-conditional caret ownership, queue decrement, first-byte return, and overlap-safe tail shift are represented and tested. +1008:1cc6 FUN_1008_1cc6 Code2 177 verified tpwincrt_read_line reconstructed/tdkpin_tpwincrt_text.c disassembly 1008:1cc6-1d76; reconstructed/tests/test_tpwincrt_text.c Exact backspace editing, unsigned capacity-minus-two gate, printable echo, CR or optional Ctrl-Z termination, retained terminator, CRLF expansion, final cursor scroll, and returned byte count are represented and tested. +1008:1d77 FUN_1008_1d77 Code2 85 verified tpwincrt_on_create reconstructed/tdkpin_runtime_ui.c disassembly 1008:1d77-1dcb; verified GetMem/fill; reconstructed/tests/test_runtime_lifecycle.c Exact created flag, low-word columns*rows wrap, allocation/store, space fill, BreakCheck gate, GetSystemMenu/EnableMenuItem arguments and order, ignored results, and both menu branches are tested. +1008:1dcc FUN_1008_1dcc Code2 190 verified tpwincrt_on_paint reconstructed/tdkpin_runtime_ui.c disassembly 1008:1dcc-1e89; PAINTSTRUCT16 layout; verified draw-context, min/max, and cell-pointer dependencies Exact paint flag lifetime, signed clipping math, 16-bit rounded bounds, signed row loop, low-word pixel coordinates, circular text pointer, TextOut16 arguments, and cleanup represented in C. +1008:1e8a FUN_1008_1e8a Code2 130 verified tpwincrt_apply_scroll_command reconstructed/tdkpin_runtime_ui.c disassembly 1008:1e8a-1f0b; caller-frame layout from 1008:1f0c Exact BP+4/BP+6 aliasing, all eight command/default paths, signed values, and 16-bit arithmetic wrap represented in C. +1008:1f0c FUN_1008_1f0c Code2 92 verified tpwincrt_handle_scroll reconstructed/tdkpin_runtime_ui.c disassembly 1008:1f0c-1f67; verified 1008:1e8a and 1008:18ee dependencies Exact caller-frame handoff, horizontal half-page versus vertical full-page sizing, axis selection, unchanged-axis behavior, and common scroll call represented in C. +1008:1f68 FUN_1008_1f68 Code2 128 verified tpwincrt_on_size reconstructed/tdkpin_runtime_ui.c disassembly 1008:1f68-1fe7; verified caret, min/max, and scrollbar dependencies Exact WM_SIZE width/height order, signed IDIV, 16-bit subtraction wrap, viewport clamps, scrollbar update, and caret teardown/recreation ordering represented in C. +1008:1fe8 FUN_1008_1fe8 Code2 306 verified tpwincrt_fill_minmax_info reconstructed/tdkpin_runtime_ui.c disassembly 1008:1fe8-2119; exact TEXTMETRIC16/MINMAXINFO16; reconstructed/tests/test_runtime_minmax.c Host stack bound as emulated SS verifies local far TEXTMETRIC writes, drawing acquire/release, metric stores, every SystemMetrics-derived expression, signed screen clamp, low-word arithmetic, six exact target words, and untouched fields. +1008:211a FUN_1008_211a Code2 45 verified tpwincrt_queue_character reconstructed/tdkpin_runtime_ui.c disassembly 1008:211a-2146; verified abort path; reconstructed/tests/test_runtime_input.c Exact BreakCheck/character-3 termination-before-append, ordinary byte append, uint16 count increment, signed count capacity comparison at 64, disabled-BreakCheck character 3, and full-queue no-op are branch-tested. +1008:2147 FUN_1008_2147 Code2 115 verified tpwincrt_handle_keydown reconstructed/tdkpin_runtime_ui.c disassembly 1008:2147-21b9; verified key table/RuntimeExit/scroll path; reconstructed/tests/test_runtime_input.c Exact Ctrl-C termination, signed GetKeyState control bit, ordered first-match table scan, horizontal LineUp, Ctrl-PageUp, vertical LineUp, no-match no-op, and resulting viewport/API effects are branch-tested. +1008:21ba FUN_1008_21ba Code2 20 verified tpwincrt_on_set_focus reconstructed/tdkpin_runtime_ui.c disassembly 1008:21ba-21cd; verified 1008:1818 dependency Exact store-before-conditional-caret-create ordering represented in C. +1008:21ce FUN_1008_21ce Code2 20 verified tpwincrt_on_kill_focus reconstructed/tdkpin_runtime_ui.c disassembly 1008:21ce-21e1; verified 1008:185b dependency Exact conditional-caret-destroy-before-focus-clear ordering represented in C. +1008:21e2 FUN_1008_21e2 Code2 55 verified tpwincrt_on_destroy reconstructed/tdkpin_runtime_ui.c disassembly 1008:21e2-2218; verified FreeMem; reconstructed/tests/test_runtime_lifecycle.c Exact low-word columns*rows release size, far buffer, cursor/view zeroing, PostQuitMessage(0), created-flag clear, ordering, and wrapped-size case are represented and tested. +1008:2219 FUN_1008_2219 Code2 227 verified tpwincrt_window_proc reconstructed/tdkpin_runtime_ui.c disassembly 1008:2219-22f9; NE entry 119; exact WNDPROC16 ABI; every direct handler row verified Exact process-window publication, eleven handled message ids/argument extractions, handled DX:AX zero return, default DefWindowProc16 frame/LRESULT preservation, and complete address-linked handler mapping are represented; every dispatched handler and dependency is independently verified. +1008:22fc FUN_1008_22fc Code2 64 verified tpwincrt_text_write_buffer reconstructed/tdkpin_tpwincrt_text.c disassembly 1008:22fc-233b; reconstructed/tests/test_tpwincrt_text.c Exact zero-count bypass, BufPtr/BufPos bulk write, post-write BufPos clear, input-message poll, ignored poll result, and AX=0 callback result are represented and tested. +1008:233c FUN_1008_233c Code2 56 verified tpwincrt_text_read_buffer reconstructed/tdkpin_tpwincrt_text.c disassembly 1008:233c-2373; reconstructed/tests/test_tpwincrt_text.c Exact BufSize/BufPtr line read, returned count publication to BufEnd, BufPos clear, and AX=0 callback result are represented and tested. +1008:2374 FUN_1008_2374 Code2 23 verified tdkpin_file_close_noop reconstructed/tdkpin_borland_files.c disassembly 1008:2374-238a; stored FileProc relocation at 1008:23de/23e1; reconstructed/tests/test_borland_files.c Exact ignored far FileRec receiver, local uint16 zero, AX return, four-byte Pascal cleanup, and callback role are represented and tested. +1008:238b FUN_1008_238b Code2 114 verified tpwincrt_open_text_record reconstructed/tdkpin_tpwincrt_text.c disassembly 1008:238b-23fc; relocations to 1008:22fc/233c/2374; reconstructed/tests/test_tpwincrt_text.c Exact input versus output mode transition and relocated InOut/Flush/Close callback table, including null input FlushFunc and shared output callbacks, are represented and tested. +1008:23fd FUN_1008_23fd Code2 69 verified tpwincrt_initialize_text_record reconstructed/tdkpin_tpwincrt_text.c disassembly 1008:23fd-2441; relocation to 1008:238b; reconstructed/tests/test_tpwincrt_text.c Exact ffff handle, closed sentinel, 128-byte buffer, embedded buffer pointer, OpenFunc, empty name, and deliberate preservation of all unwritten TextRec fields are represented and tested. +1008:2442 FUN_1008_2442 Code2 99 verified tpwincrt_create_window reconstructed/tdkpin_tpwincrt_lifecycle.c disassembly 1008:2442-24a4; sole CreateWindow/ShowWindow/UpdateWindow call sites; reconstructed/tests/test_tpwincrt_lifecycle.c Exact created gate, class/title far pointers, style 00ff0000, four 8000 defaults, null parent/menu/parameter, process instance, show command, HWND publication, and ignored API results are represented and tested. +1008:24a5 FUN_1008_24a5 Code2 175 verified tpwincrt_shutdown_exit_proc reconstructed/tdkpin_tpwincrt_lifecycle.c disassembly 1008:24a5-2553; stored callback relocation from 1008:2554; reconstructed/tests/test_tpwincrt_lifecycle.c Exact predecessor restoration before guards, clean/live-window gate, far-title wvsprintf argument, inactive caption, SC_CLOSE enable, break-check disable, and GetMessage/Translate/Dispatch shutdown loop are represented and tested. +1008:2554 FUN_1008_2554 Code2 180 verified tpwincrt_initialize_runtime_unit reconstructed/tdkpin_tpwincrt_lifecycle.c disassembly 1008:2554-2607; relocations 274-286; reconstructed/tests/test_tpwincrt_lifecycle.c Exact first-instance WNDCLASS completion/registration, shared icon/cursor integer resource, input/output TextRec Reset/Rewrite with IOResult checks, 80-byte module-title fetch, in-place OemToAnsi, and ExitProc predecessor/install sequence are represented and tested. +1008:2608 FUN_1008_2608 Code2 59 verified borland_dos_get_file_attributes_ansi reconstructed/tdkpin_multimedia_paths.c disassembly 1008:2608-2642; KEYBOARD ordinal 5; DOS AX=4300h; reconstructed/tests/test_multimedia_paths.c Exact 79-byte bounded copy, unconditional NUL, in-place AnsiToOem conversion, restored AX/CX register contract, DOS carry, returned attribute word, and overlength case are represented and tested. +1008:2643 FUN_1008_2643 Code2 109 verified multimedia_search_file reconstructed/tdkpin_multimedia_paths.c disassembly 1008:2643-26af; verified 1008:2608; reconstructed/tests/test_multimedia_paths.c Exact bare-name-first search, 79+NUL result capacity, semicolon component parser, empty component behavior, colon/backslash separator suppression, file attribute 18 mask, exhausted empty result, far-pointer return, and truncation are represented and tested. +1008:26b0 FUN_1008_26b0 Code2 361 verified multimedia_split_path reconstructed/tdkpin_multimedia_paths.c disassembly 1008:26b0-2818; verified far string dependencies; reconstructed/tests/test_multimedia_paths.c Exact last slash/colon base, first-dot extension, 67-byte prefix and 8-byte basename caps, fixed four-byte extension copy, optional outputs, overlap-safe in-place directory extraction, wildcard detection, and 8/4/2/1 flag word are represented and tested. +1008:2819 FUN_1008_2819 Code2 138 verified multimedia_environment_value reconstructed/tdkpin_multimedia_paths.c disassembly 1008:2819-28a2; KERNEL GetDOSEnvironment ordinal 131; verified far strlen/strnicmp; reconstructed/tests/test_multimedia_paths.c Exact double-NUL environment traversal, ASCII case-insensitive bounded name match, mandatory equals delimiter, empty value pointer, missing-name null return, and selector-preserving offset advance are represented and tested. +1008:28a3 FUN_1008_28a3 Code2 99 verified tdkpin_system_timer_construct reconstructed/tdkpin_system_timer.c disassembly 1008:28a3-2905; verified Borland object helpers; reconstructed/tests/test_system_timer.c Exact six-byte object layout, existing/new ownership, root construction, recipient/timer stores, start call, zero-id failure cleanup, and far-object return are represented and branch-tested. +1008:2906 FUN_1008_2906 Code2 44 verified tdkpin_system_timer_destruct reconstructed/tdkpin_system_timer.c disassembly 1008:2906-2931; verified 1008:2932, 1008:2dcd, and 1020:0439; reconstructed/tests/test_system_timer.c Exact stack check, timer cancellation, root destruction, hidden VMT ownership, and allocation release order are represented and tested. +1008:2932 FUN_1008_2932 Code2 42 verified tdkpin_system_timer_stop reconstructed/tdkpin_system_timer.c disassembly 1008:2932-295b; MMSYSTEM timeKillEvent ordinal 603; reconstructed/tests/test_system_timer.c Exact nonzero-id branch, imported cancellation call and ignored result, unconditional id clearing, and already-stopped path are represented and branch-tested. +1008:295c FUN_1008_295c Code2 46 verified tdkpin_system_timer_start reconstructed/tdkpin_system_timer.c disassembly 1008:295c-2989; verified MMTIMER SystemTimerMake ordinal 1; reconstructed/tests/test_system_timer.c Exact object recipient field, delay/resolution ordering, stack-check AX high byte retained across MOV AL, one-shot low byte, timer-id return, and 16-bit widths are represented and tested. +1008:298a FUN_1008_298a Code2 12 verified tdkpin_initialize_stack_guard reconstructed/tdkpin_stack.c disassembly 1008:298a-2995; NE entry 132; direct startup call at 1000:fd8f; verified 1020:03cb; reconstructed/tests/test_stack.c Exact AX=0 initialization call into the Borland stack guard is represented and tested against bound Win16 stack state. +1008:2996 FUN_1008_2996 Code2 120 verified object_windows_dialog_construct reconstructed/tdkpin_dialog.c disassembly 1008:2996-2a0d; verified ObjectWindows/Borland/string dependencies; reconstructed/tests/test_dialog.c Exact hidden-VMT gate, base object construction with VMT zero, flag-4 clear, selector-zero integer template retention, far-string duplication/ownership, unaligned template/init fields, modal clear, suppressed construction, return, and 14-byte cleanup are represented and tested. +1008:2a0e FUN_1008_2a0e Code2 55 verified object_windows_dialog_destruct reconstructed/tdkpin_dialog.c disassembly 1008:2a0e-2a44; verified far string/base object/Borland destructor helpers; reconstructed/tests/test_dialog.c Exact selector-word-only string guard at unaligned +0x1d/+0x1f, optional dispose, base destructor hidden VMT zero, caller-owned final frame, call order, and six-byte cleanup are branch-tested. +1008:2a45 FUN_1008_2a45 Code2 158 verified object_windows_create_modeless_dialog reconstructed/tdkpin_dialog.c disassembly 1008:2a45-2ae2; DGROUP CreateDialogParam pointer 0652; callback ledger; reconstructed/tests/test_dialog.c Exact status gate, flag clear/set, modal clear, null/parent HWND selection, instance/template/bound-proc/init arguments, HWND publication, zero-handle status ffff, retained AH plus Boolean AL return, indeterminate skipped-path AH, and four-byte cleanup are represented and tested. +1008:2ae3 FUN_1008_2ae3 Code2 206 verified object_windows_execute_modal_dialog reconstructed/tdkpin_dialog.c disassembly 1008:2ae3-2bb0; DGROUP DialogBoxParam pointer 0656; callback ledger; reconstructed/tests/test_dialog.c Exact status short-circuit, flag clear/set, modal set, parent HWND, application active-dialog save/restore around the indirect call, all five API arguments, -1 status propagation, HWND clear, returned INT16 result, and four-byte cleanup are represented and tested. +1008:2bb1 FUN_1008_2bb1 Code2 32 verified object_windows_dialog_mark_child reconstructed/tdkpin_dialog.c disassembly 1008:2bb1-2bd0; callback relocation at 1008:2be1/2be4; verified flag helper; reconstructed/tests/test_dialog.c Exact ignored static-link word, child far pointer, HWND +4 zero gate, flag-4 set, six-byte cleanup, and ForEach callback role are represented and tested. +1008:2bd1 FUN_1008_2bd1 Code2 55 verified object_windows_end_modal_dialog reconstructed/tdkpin_dialog.c disassembly 1008:2bd1-2c07; modal byte +0x25; verified child iteration callback; USER EndDialog; reconstructed/tests/test_dialog.c Exact inactive no-op, child marking before EndDialog, HWND +4/result ordering, ignored BOOL16 return, six-byte cleanup, and active/inactive branches are represented and tested. +1008:2c08 FUN_1008_2c08 Code2 23 verified object_windows_call_slot_38 reconstructed/tdkpin_window_messages.c disassembly 1008:2c08-2c1e; VMT relocation at 1028:06e2; reconstructed/tests/test_window_messages.c Exact receiver/event far arguments, ignored event, receiver-only VMT +0x38 call, and eight-byte Pascal cleanup are represented and tested. +1008:2c1f FUN_1008_2c1f Code2 100 verified object_windows_query_end_session_result reconstructed/tdkpin_window_messages.c disassembly 1008:2c1f-2c82; application MainWindow +8; VMT slots +44/+3c; reconstructed/tests/test_object_windows_handlers.c Exact far MainWindow comparison, Application-versus-Window CanClose receiver selection, AL Boolean inversion, CBW/CWD 32-bit result publication at message +0a, and both approval/rejection branches are represented and tested. +1008:2c83 FUN_1008_2c83 Code2 86 verified object_windows_focus_message reconstructed/tdkpin_window_messages.c disassembly 1008:2c83-2cd8; USER SetFocus ordinal 22; verified 1018:0097; reconstructed/tests/test_object_windows_handlers.c Exact message wParam focus request, ignored SetFocus result, HWND-to-object recovery, null branches, unaligned attached far pointer +43, attached VMT +0c receiver call, and unconditional marker store are represented and tested. +1008:2cd9 FUN_1008_2cd9 Code2 25 verified object_windows_zero_message_result reconstructed/tdkpin_window_messages.c disassembly 1008:2cd9-2cf1; dialog VMT relocation at 1028:01da slot +0x0c; reconstructed/tests/test_window_messages.c Exact ignored receiver, event far pointer, two zero word stores at +0x0a/+0x0c, 32-bit LRESULT zero, and eight-byte cleanup are represented and tested. +1008:2cf2 FUN_1008_2cf2 Code2 72 verified object_windows_dialog_validate_and_close reconstructed/tdkpin_dialog.c disassembly 1008:2cf2-2d39; verified 1018:0f38; VMT slots +3c/+44/+50; reconstructed/tests/test_object_windows_handlers.c Exact modal-byte gate, nonmodal close-if-allowed path, modal CanClose rejection, approved +44(object,1) then +50(object,1) ordering, ignored event, and eight-byte cleanup are represented and tested. +1008:2d3a FUN_1008_2d3a Code2 44 verified object_windows_dialog_close reconstructed/tdkpin_dialog.c disassembly 1008:2d3a-2d65; modal byte +0x25; verified close helper; VMT +0x50; reconstructed/tests/test_dialog.c Exact ignored event far pointer, nonmodal close-if-allowed path, modal receiver/argument 2 virtual call, branch ordering, and eight-byte cleanup are represented and tested. +1008:2d66 FUN_1008_2d66 Code2 33 verified borland_dispatch_method_8002 reconstructed/tdkpin_dispatch.c disassembly 1008:2d66-2d86; VMT relocation at 1028:06ea; verified dynamic dispatcher; reconstructed/tests/test_dispatch.c Exact receiver/argument far-pointer copies, receiver VMT load, dynamic id 0x8002, far target invocation, and eight-byte Pascal cleanup are represented and tested. +1008:2d87 FUN_1008_2d87 Code2 18 verified borland_abstract_method_error reconstructed/tdkpin_borland_objects.c disassembly 1008:2d87-2d98; NE entry 238; reconstructed/tests/test_borland_objects.c Exact no-return Runtime Error 211 abstract-virtual trap is represented and tested. +1008:2d99 FUN_1008_2d99 Code2 26 verified borland_default_object_constructor reconstructed/tdkpin_borland_objects.c disassembly 1008:2d99-2db2; NE entry 235; verified 1020:03ef; reconstructed/tests/test_borland_objects.c Exact hidden object/VMT frame, DI=0 VMT-field offset, unchanged far-object return, and constructor allocation path are represented and tested. +1008:2db3 FUN_1008_2db3 Code2 26 verified borland_dispose_object reconstructed/tdkpin_borland_objects.c disassembly 1008:2db3-2dcc; NE entry 236; reconstructed/tests/test_borland_objects.c Exact object VMT lookup, far virtual destructor slot +8, object argument, and hidden dispose mode 1 are represented and tested. +1008:2dcd FUN_1008_2dcd Code2 19 verified borland_default_object_destructor reconstructed/tdkpin_borland_objects.c disassembly 1008:2dcd-2ddf; NE entry 237; verified 1020:0439; reconstructed/tests/test_borland_objects.c Exact DI=0 destructor cleanup call and hidden object/VMT argument behavior are represented and tested. +1008:2de0 FUN_1008_2de0 Code2 31 verified borland_heap_reserve_is_unallocated reconstructed/tdkpin_borland_runtime.c disassembly 1008:2de0-2dfe Exact far-pointer OR, AL boolean normalization, and ignored residual AH represented by a C bool result. +1008:2dff FUN_1008_2dff Code2 35 verified borland_ensure_heap_reserve reconstructed/tdkpin_borland_runtime.c disassembly 1008:2dff-2e21; null/existing reserve tests with mocked GetMem Exact null guard, configured-size allocation, no-reallocation path, and far-pointer store verified; allocator internals remain a separate function row. +1008:2e22 FUN_1008_2e22 Code2 84 verified borland_release_heap_reserve_on_oom reconstructed/tdkpin_borland_runtime.c disassembly 1008:2e22-2e75; complete branch/status/free tests Exact zero/nonzero contract, disabled/null/reserve branches, FreeMem arguments, pointer clear, 0/1/2 statuses, and explicit indeterminate result verified. +1008:2e76 FUN_1008_2e76 Code2 28 verified borland_initialize_heap_reserve reconstructed/tdkpin_borland_runtime.c disassembly 1008:2e76-2e91; NE segment relocation binding test Exact ensure call and segment-2 offset 2e22 handler publication verified. +1008:2e92 FUN_1008_2e92 Code2 23 verified borland_far_strlen reconstructed/tdkpin_strings.c disassembly 1008:2e92-2ea8; selector-backed boundary tests Exact CX=ffff REPNE scan, ordinary NUL, and no-NUL fffe result verified against the portable 16:16 memory model. +1008:2ea9 FUN_1008_2ea9 Code2 23 verified borland_far_strend reconstructed/tdkpin_strings.c disassembly 1008:2ea9-2ebf; selector-backed boundary tests Exact bounded scan, terminator pointer, and no-NUL offset fffe verified. +1008:2ec0 FUN_1008_2ec0 Code2 37 verified borland_far_memmove reconstructed/tdkpin_strings.c disassembly 1008:2ec0-2ee4; overlap and cross-selector tests Exact unsigned offset-only direction decision, backward overlap, cross-selector transfer, and destination return verified. +1008:2ee5 FUN_1008_2ee5 Code2 34 verified borland_far_strcpy reconstructed/tdkpin_strings.c disassembly 1008:2ee5-2f06; selector-backed copy tests Exact bounded NUL-inclusive copy and destination return verified. +1008:2f07 FUN_1008_2f07 Code2 40 verified borland_far_strncpy reconstructed/tdkpin_strings.c disassembly 1008:2f07-2f2e; in-bound/out-of-bound NUL tests Exact copied-count arithmetic and unconditional extra NUL, including the double-NUL case, verified. +1008:2f2f FUN_1008_2f2f Code2 30 verified borland_short_to_c_string reconstructed/tdkpin_strings.c disassembly 1008:2f2f-2f4c; short-string conversion test Exact uint8 length, payload copy, appended NUL, and destination return verified. +1008:2f4d FUN_1008_2f4d Code2 35 verified borland_far_strcat reconstructed/tdkpin_strings.c disassembly 1008:2f4d-2f6f; verified dependencies and concatenation test Exact end lookup, append including NUL, and original destination return verified. +1008:2f70 FUN_1008_2f70 Code2 75 verified borland_far_strnicmp reconstructed/tdkpin_strings.c disassembly 1008:2f70-2fba; bounded ASCII case-fold tests Exact comparison bound, NUL participation, REPE continuation, ASCII-only fold, and signed difference verified. +1008:2fbb FUN_1008_2fbb Code2 40 verified borland_far_strchr reconstructed/tdkpin_strings.c disassembly 1008:2fbb-2fe2; found/NUL tests Exact NUL-inclusive forward search, pointer result, and null result verified. +1008:2fe3 FUN_1008_2fe3 Code2 39 verified borland_far_strrchr reconstructed/tdkpin_strings.c disassembly 1008:2fe3-3009; last/NUL/missing tests Exact NUL-inclusive reverse search, last-match pointer, and null result verified. +1008:300a FUN_1008_300a Code2 34 verified borland_c_to_short_string reconstructed/tdkpin_strings.c disassembly 1008:300a-302b; ordinary and 260-byte truncation tests Exact full 16-bit copy count with low-byte Pascal length truncation and overflow behavior verified. +1008:302c FUN_1008_302c Code2 109 verified borland_far_strdup reconstructed/tdkpin_strings.c disassembly 1008:302c-3098; verified checked allocator and far copy; reconstructed/tests/test_strings.c Exact null/empty rejection, uint16 length+1, allocation bytes, null allocation result, NUL-inclusive copy, far return, and Pascal cleanup are branch-tested. +1008:3099 FUN_1008_3099 Code2 44 verified borland_far_strdispose reconstructed/tdkpin_strings.c disassembly 1008:3099-30c4; verified strlen and checked FreeMem; reconstructed/tests/test_strings.c Exact null no-op, far strlen, uint16 length+1 including NUL, block/size release, and four-byte cleanup are represented and tested. +1010:0002 FUN_1010_0002 Code3 119 verified multimedia_unload reconstructed/tdkpin_multimedia.c disassembly 1010:0002-0078; eleven exact far slots; sole FreeLibrary16 call reviewed Exact >=32 module guard, ignored FreeLibrary result, initialized-flag clear, eleven offset/selector clears, and retained module word represented in C. +1010:0079 FUN_1010_0079 Code3 41 verified multimedia_finalize_current_task reconstructed/tdkpin_multimedia.c disassembly 1010:0079-00a1; guarded dynamic-call and cleanup tests Exact initialized/proc guards, GetCurrentTask argument, dynamic far call target/result discard, conditional unload, and no-op paths verified. +1010:00a2 FUN_1010_00a2 Code3 288 verified multimedia_locate_library reconstructed/tdkpin_multimedia.c disassembly 1010:00a2-01c1; verified 1008:2643/26b0/2819; KERNEL directory/module calls; reconstructed/tests/test_multimedia.c and test_multimedia_paths.c Exact bare, Windows, System, caller-module-directory, and PATH search order; 256/80/9/5-byte stack objects; in-place module-directory split; no synthetic null-PATH bypass; and every first-hit/all-fail stop point are represented and tested. +1010:01c2 FUN_1010_01c2 Code3 493 verified multimedia_initialize reconstructed/tdkpin_multimedia.c disassembly 1010:01c2-03ae; eleven CTL3D names 1028:0470-0521; reviewed KERNEL loader imports; reconstructed/tests/test_multimedia.c Exact already-initialized return, modern error-mode load, legacy locator/load, module >=32 gate, ordered procedure resolution with legacy slot 8 zero, task registration, GetVer >=9, Enabled gate, cleanup, argument stores, optional AutoSubclass, and all failure/success branches are represented and tested. +1010:03af FUN_1010_03af Code3 49 verified multimedia_initialize_export reconstructed/tdkpin_multimedia.c disassembly 1010:03af-03df; verified 1010:01c2; exact ten-byte Pascal frame; reconstructed/tests/test_multimedia.c Byte arguments in word slots, two uint16 arguments, verified loader call, AL result, unconditional pending-byte clear, and return are represented and tested. +1010:03e0 FUN_1010_03e0 Code3 37 verified multimedia_application_destruct reconstructed/tdkpin_multimedia.c disassembly 1010:03e0-0404; verified 1010:0079, 1018:1b08, and 1020:0439 semantics; reconstructed/tests/test_multimedia.c Exact multimedia-finalize first, application destructor hidden VMT zero, owned-allocation frame with caller VMT, object far pointer, and binary call order are represented and tested. +1010:0405 FUN_1010_0405 Code3 107 verified multimedia_short_file_exists reconstructed/tdkpin_multimedia_startup.c disassembly 1010:0405-046f; verified Borland file/runtime dependencies; reconstructed/tests/test_multimedia_startup.c Exact 255-byte ShortString copy, local FileRec assignment, one-byte generic open, destructive IOResult read, false-on-open-error, success close, close-error RuntimeError gate, and Boolean return are represented and tested. +1010:0472 FUN_1010_0472 Code3 378 verified multimedia_initialize_runtime_unit reconstructed/tdkpin_multimedia_startup.c disassembly 1010:0472-05eb; code data 1010:0470-0471; reconstructed/tests/test_multimedia_startup.c Exact 200-byte system-directory fetch, ShortString slash/name concatenation, two 256-byte full paths, V2/classic existence fallback policy, eleven far-slot clears, GetVersion low-word policy, Windows 3.0 legacy test, and all seven scalar reset stores are represented and branch-tested. +1018:0002 FUN_1018_0002 Code4 67 verified object_windows_resolve_message_handler reconstructed/tdkpin_object_windows.c disassembly 1018:0002-0044; synthetic derived/parent/cache/miss tables in reconstructed/tests/test_message_dispatch.c Exact VMT +4 table, most-derived cache, inherited linear search, four-byte handler stride, parent traversal, cache-on-parent-hit, and VMT fallback-slot behavior are represented and branch-tested. +1018:0045 FUN_1018_0045 Code4 44 verified object_windows_bind_window reconstructed/tdkpin_object_windows.c disassembly 1018:0045-006e; DGROUP strings OW1 at 067a and OW2 at 067e; SetProp16 calls reviewed Exact selector/offset split, property order, ignored BOOL16 results, and six-byte far-Pascal cleanup represented in C. +1018:0071 FUN_1018_0071 Code4 38 verified object_windows_unbind_window reconstructed/tdkpin_object_windows.c disassembly 1018:0071-0096; verified OW1/OW2 data objects Exact RemoveProp16 order, HWND/name arguments, ignored results, and far-Pascal cleanup represented in C. +1018:0097 FUN_1018_0097 Code4 108 verified object_windows_object_from_window reconstructed/tdkpin_object_windows.c disassembly 1018:0097-0102; selector-backed generated-thunk, OW1/OW2 fallback, and invalid-HWND tests Exact IsWindow guard, GWL_WNDPROC lookup, E8/self-relative/2e5b validation, embedded object pointer, property fallback order, selector/offset reconstruction, and null result verified. +1018:0103 FUN_1018_0103 Code4 44 verified object_windows_call_message_hook reconstructed/tdkpin_object_windows.c disassembly 1018:0103-012e; exact seven-argument hook frame; reconstructed/tests/test_message_dispatch.c Exact bound object, selected far handler, HWND/message/WPARAM/LPARAM word ordering, global hook target, ignored hook return, and nonmutation of the original record are represented and tested. +1018:0133 FUN_1018_0133 Code4 88 verified object_dispatch_window_or_dialog_proc reconstructed/tdkpin_object_windows.c disassembly 1018:0133-018a; NE entry 210; generated thunk call frame; reconstructed/tests/test_message_dispatch.c Exact ES:BX object binding, HWND store, 14-byte stack message record, signed-message fallback, dynamic resolution, selector-word hook gate, indirect handler call, mutable initial result 1, and returned LRESULT16 are represented and branch-tested. +1018:018b FUN_1018_018b Code4 81 verified object_window_bootstrap_proc reconstructed/tdkpin_object_windows.c disassembly 1018:018b-01d9; WNDCLASS relocation 1018:12e1/12e4 -> NE entry 211; reconstructed/tests/test_object_windows.c Exact creating-object read, object +0x12 far thunk, GWL_WNDPROC replacement, OW1/OW2 binding, unchanged HWND/message/WPARAM/LPARAM dispatch frame, and returned LRESULT are represented and transition-tested. +1018:01dc FUN_1018_01dc Code4 286 verified object_windows_allocate_bound_thunk reconstructed/tdkpin_object_windows.c disassembly 1018:01dc-02f9; verified 1020:16a5; reviewed KERNEL selector APIs; reconstructed/tests/test_bound_thunks.c Exact 256-byte pool, header/template/dispatch target, 35 seven-byte CALL thunks, displacement arithmetic, LIFO list, selector conversion/aliasing, object patch, and returned code pointer are represented and branch-tested. +1018:02fa FUN_1018_02fa Code4 71 verified object_windows_release_bound_thunk reconstructed/tdkpin_object_windows.c disassembly 1018:02fa-0340; reviewed AllocCStoDSAlias/FreeSelector calls; reconstructed/tests/test_bound_thunks.c Exact code-selector alias, embedded next-pointer write, alias release, and global LIFO-head publication are represented and tested through release/reallocation. +1018:0341 FUN_1018_0341 Code4 168 verified object_windows_object_construct reconstructed/tdkpin_object_lifecycle.c disassembly 1018:0341-03e8; verified Borland/root/parent/thunk/flag helpers; reconstructed/tests/test_object_lifecycle.c Exact hidden VMT frame, suppressed-construction return, root initialization, HWND/status/field +0x17 zeros, parent +6/+8 and circular append, no-parent next zero, child/transfer far zeros, bound thunk +0x12, flag byte reset/set-4, return, and call order are branch-tested. +1018:03e9 FUN_1018_03e9 Code4 22 verified object_windows_dispose_child_callback reconstructed/tdkpin_object_list.c disassembly 1018:03e9-03fe; callback relocation at 1018:0410/0413; verified virtual dispose helper; reconstructed/tests/test_object_list.c Exact ignored static-link word, child far argument, virtual dispose mode 1 forwarding, six-byte Pascal cleanup, and callback role in 1018:03ff child iteration are represented and tested. +1018:03ff FUN_1018_03ff Code4 103 verified object_windows_object_destruct reconstructed/tdkpin_object_lifecycle.c disassembly 1018:03ff-0465; verified VMT/list/parent/thunk/root/Borland helpers; reconstructed/tests/test_object_lifecycle.c Exact VMT +0x24 teardown, child-dispose callback, optional parent unlink, bound thunk +0x12 release, root destructor hidden VMT zero, owned-allocation frame, and binary call order are represented and parent/no-parent tested. +1018:0466 FUN_1018_0466 Code4 56 verified object_windows_child_group_matches reconstructed/tdkpin_object_list.c disassembly 1018:0466-049d; signed static-link group and unaligned child field +0x17; reconstructed/tests/test_child_validation.c Exact negative-group rejection, uint16 equality, AL boolean result with inherited AH irrelevance, six-byte cleanup, and nested predicate role are represented and tested. +1018:049e FUN_1018_049e Code4 134 verified object_windows_try_child_activation reconstructed/tdkpin_object_list.c disassembly 1018:049e-0523; flag 4/VMT +0x20; USER IsIconic/GetWindowText/SetWindowText; reconstructed/tests/test_child_validation.c Exact flag/method inversion, 82-byte local buffer, maximum 81, minimized-window get/set-text side effect, AL result inversion, and six-byte callback cleanup are branch-tested. +1018:0524 FUN_1018_0524 Code4 56 verified object_windows_unindexed_child_matches reconstructed/tdkpin_object_list.c disassembly 1018:0524-055b; child group +0x17 and verified 1018:049e; reconstructed/tests/test_child_validation.c Exact group-zero gate, nested static-link forwarding, activation predicate, AL result, and six-byte cleanup are represented and tested. +1018:055c FUN_1018_055c Code4 128 verified object_windows_validate_child_groups reconstructed/tdkpin_object_list.c disassembly 1018:055c-05db; callbacks 1018:0466/0524 and helper 049e; verified circular list; reconstructed/tests/test_child_validation.c Exact signed group counter from 1, first-match scan, activation stop condition, missing-group transition, group-zero callback search, final far-null inversion, and empty/multi-group cases are represented and branch-tested. +1018:05dc FUN_1018_05dc Code4 23 verified object_windows_zero_word_default reconstructed/tdkpin_window_messages.c disassembly 1018:05dc-05f2; reconstructed/tests/test_window_messages.c Exact ignored receiver, local uint16 zero, AX return, and four-byte Pascal cleanup are represented and tested without assigning an unproved original virtual-method name. +1018:05f3 FUN_1018_05f3 Code4 26 verified object_windows_set_flag_1 reconstructed/tdkpin_window_messages.c disassembly 1018:05f3-060c; verified 1018:0641; reconstructed/tests/test_window_messages.c Exact receiver, set=true, mask=1 arguments and four-byte cleanup are represented and tested. +1018:060d FUN_1018_060d Code4 26 verified object_windows_set_flag_4 reconstructed/tdkpin_window_messages.c disassembly 1018:060d-0626; verified 1018:0641; reconstructed/tests/test_window_messages.c Exact receiver, set=true, mask=4 arguments and four-byte cleanup are represented and tested. +1018:0627 FUN_1018_0627 Code4 26 verified object_windows_clear_flag_4 reconstructed/tdkpin_window_messages.c disassembly 1018:0627-0640; verified 1018:0641; reconstructed/tests/test_window_messages.c Exact receiver, set=false, mask=4 arguments and four-byte cleanup are represented and tested. +1018:0641 FUN_1018_0641 Code4 50 verified object_windows_update_flags reconstructed/tdkpin_window_messages.c disassembly 1018:0641-0672; object byte +0x16; reconstructed/tests/test_window_messages.c Exact uint8 OR set path, complement-and-AND clear path, preservation of unrelated bits, boolean selector, mask width, and eight-byte cleanup are represented and branch-tested. +1018:0673 FUN_1018_0673 Code4 39 verified object_windows_has_flags reconstructed/tdkpin_window_messages.c disassembly 1018:0673-0699; object flag byte +0x16; reconstructed/tests/test_window_messages.c Exact uint8 mask, AND/compare all-bits-set rule, AL false/true result, inherited AH irrelevance at all callers, and six-byte Pascal cleanup are represented and tested. +1018:069a FUN_1018_069a Code4 130 verified object_windows_append_child reconstructed/tdkpin_object_list.c disassembly 1018:069a-071b; container +0x0a/+0x0c and child +0x19/+0x1b far fields; reconstructed/tests/test_object_list.c Exact null no-op, empty self-ring, tail->next insertion, new-tail publication, unaligned far fields, and eight-byte Pascal cleanup are represented and tested across three children. +1018:071c FUN_1018_071c Code4 241 verified object_windows_remove_child reconstructed/tdkpin_object_list.c disassembly 1018:071c-080c; circular predecessor search; reconstructed/tests/test_object_list.c Exact empty/missing/singleton/middle/tail cases, far equality, predecessor relink, tail replacement/zeroing, unaligned next fields, and eight-byte cleanup are represented and branch-tested. +1018:080d FUN_1018_080d Code4 77 verified object_windows_find_child reconstructed/tdkpin_object_list.c disassembly 1018:080d-0859; Borland nested callback frame abstracted by explicit bridge; reconstructed/tests/test_object_list.c Exact head-to-tail order from tail->next, first-match far return, full-cycle miss, empty result, callback AL gate, and eight-byte cleanup are represented and tested. +1018:085a FUN_1018_085a Code4 82 verified object_windows_for_each_child reconstructed/tdkpin_object_list.c disassembly 1018:085a-08ab; reconstructed/tests/test_object_list.c Exact head-to-tail visitation, next-pointer capture before callback, tail callback last, empty no-op, far procedure bridge, and eight-byte cleanup are represented and tested. +1018:08ac FUN_1018_08ac Code4 23 verified object_windows_minus_one_default reconstructed/tdkpin_object_list.c disassembly 1018:08ac-08c2; reconstructed/tests/test_object_list.c Exact ignored receiver, local uint16 0xffff, AX return, and four-byte Pascal cleanup are represented and tested without inventing an original virtual-method name. +1018:08c3 FUN_1018_08c3 Code4 45 verified object_windows_dispatch_event reconstructed/tdkpin_object_windows.c disassembly 1018:08c3-08ef; eight internal call sites; verified resolver/hook; reconstructed/tests/test_message_dispatch.c Exact DX fallback slot, AX method id, original far event/object arguments, VMT resolution, selector-word hook gate, event-field hook copy, and indirect far handler frame are represented and tested. +1018:08f0 FUN_1018_08f0 Code4 405 verified object_windows_wm_command reconstructed/tdkpin_window_messages.c disassembly 1018:08f0-0a84; message table id 0x0111; reviewed GetDlgItem/SendMessage/GetFocus/GetParent calls; reconstructed/tests/test_window_command.c Exact dialog-control synthesis via WM_GETDLGCODE mask 0x30, focus/parent object discovery, menu id minus 0x6000, control id minus 0x8000, notification minus 0x7000, child-object/high-word gates, VMT +0x0c/+0x14 defaults, and all dispatch targets are represented and branch-tested. +1018:0a85 FUN_1018_0a85 Code4 160 verified object_windows_route_scroll_notification reconstructed/tdkpin_window_messages.c disassembly 1018:0a85-0b24; four VMT relocations at +0x48; verified object lookup/dispatcher; USER GetWindowWord GWW_ID; reconstructed/tests/test_window_command.c Exact zero-control default, child-object notification minus 0x7000/fallback +0x18, native GWW_ID minus 0x8000/fallback +0x14, id 0x1000 direct VMT +0x14, original event frame, and all branches are represented and tested. +1018:0b25 FUN_1018_0b25 Code4 71 verified object_windows_wm_vscroll reconstructed/tdkpin_window_messages.c disassembly 1018:0b25-0b6b; message table id 0x0115; USER GetWindowLong GWL_STYLE; reconstructed/tests/test_window_messages.c Exact HWND +4, int32 style high word, WS_VSCROLL high mask 0x20, VMT +0x48 versus default +0x0c selection, unchanged event frame, and eight-byte cleanup are represented and branch-tested. +1018:0b6c FUN_1018_0b6c Code4 71 verified object_windows_wm_hscroll reconstructed/tdkpin_window_messages.c disassembly 1018:0b6c-0bb2; message table id 0x0114; USER GetWindowLong GWL_STYLE; reconstructed/tests/test_window_messages.c Exact HWND +4, int32 style high word, WS_HSCROLL high mask 0x10, VMT +0x48 versus default +0x0c selection, unchanged event frame, and eight-byte cleanup are represented and branch-tested. +1018:0bb3 FUN_1018_0bb3 Code4 138 verified object_windows_route_command_target reconstructed/tdkpin_window_messages.c disassembly 1018:0bb3-0c3c; object HWND +4 and parent +6/+8; verified HWND lookup/dispatcher; reconstructed/tests/test_window_command.c Exact self-HWND suppression, explicit-parent precedence, HWND property fallback, null default VMT +0x0c, WPARAM minus 0x6000/fallback +0x10 dispatch, and all far comparisons are represented and branch-tested. +1018:0c3d FUN_1018_0c3d Code4 28 verified object_windows_forward_default reconstructed/tdkpin_window_messages.c disassembly 1018:0c3d-0c58; four VMT relocations at slot +0x14; reconstructed/tests/test_window_messages.c Exact object/event far arguments, VMT +0x0c indirect call, unchanged frame, and eight-byte Pascal cleanup are represented and tested without assigning an unproved original method name. +1018:0c59 FUN_1018_0c59 Code4 110 verified object_windows_forward_event_to_parent reconstructed/tdkpin_window_messages.c disassembly 1018:0c59-0cc6; parent +6/+8; WM_COMMAND 0x0111; USER GetWindowWord GWW_ID; reconstructed/tests/test_window_command.c Exact null-parent no-op, WM_COMMAND WPARAM versus noncommand GWW_ID selection, uint16 id minus 0x8000, fallback +0x14, parent/object/event far frame, and eight-byte cleanup are represented and branch-tested. +1018:0cc7 FUN_1018_0cc7 Code4 32 verified object_windows_set_flag_4_if_windowed reconstructed/tdkpin_window_messages.c disassembly 1018:0cc7-0ce6; relocation to verified 1018:060d; reconstructed/tests/test_window_messages.c Exact ignored leading word, far object, field +4 zero gate, fixed flag-4 setter call, and six-byte Pascal cleanup are represented and branch-tested. +1018:0ce7 FUN_1018_0ce7 Code4 131 verified object_windows_destroy_native_window reconstructed/tdkpin_window_messages.c disassembly 1018:0ce7-0d69; verified child iteration/flag helpers; parent VMT +0x30; USER SendMessage/DestroyWindow; reconstructed/tests/test_window_destroy.c Exact HWND zero gate, child callback 1018:0cc7, flag-8 MDI branch, deliberate double client getter, client HWND WM_MDIDESTROY frame, normal DestroyWindow fallback, and all call ordering are represented and branch-tested. +1018:0d6a FUN_1018_0d6a Code4 32 verified object_windows_turbo_window_class_name reconstructed/tdkpin_window_messages.c disassembly 1018:0d6a-0d89; four VMT relocations at slot +0x2c; DGROUP string 068c; reconstructed/tests/test_window_messages.c Exact ignored receiver, DGROUP offset 068c, runtime DS selector in DX, far-pointer return, and four-byte Pascal cleanup are represented and tested. +1018:0d8a FUN_1018_0d8a Code4 17 verified object_windows_abstract_method reconstructed/tdkpin_borland_objects.c disassembly 1018:0d8a-0d9a; relocation to NE entry 238 at 1008:2d87; reconstructed/tests/test_borland_objects.c Exact ObjectWindows abstract-slot forwarding to the verified Borland Runtime Error 211 trap is represented and tested. +1018:0d9b FUN_1018_0d9b Code4 50 verified object_windows_prepare_window reconstructed/tdkpin_object_list.c disassembly 1018:0d9b-0dcc; verified 1018:055c; object status +2 and VMT +0x44; reconstructed/tests/test_child_validation.c Exact validation AL gate, failure status -4, success receiver/argument 2 virtual call, four-byte cleanup, and both branches are represented and tested. +1018:0dcd FUN_1018_0dcd Code4 61 verified object_windows_transfer_child_callback reconstructed/tdkpin_object_list.c disassembly 1018:0dcd-0e09; flag 0x10, VMT +0x40, outer static-link cursor/direction; reconstructed/tests/test_child_validation.c Exact participant gate, child/direction/far-cursor frame, uint16 AX consumption, offset-only wrapped cursor advance, selector preservation, ignored static mechanics, and six-byte callback cleanup are represented and tested. +1018:0e0a FUN_1018_0e0a Code4 60 verified object_windows_transfer_child_data reconstructed/tdkpin_object_list.c disassembly 1018:0e0a-0e45; object transfer pointer +0x0e/+0x10; callback relocation to 1018:0dcd; verified circular list; reconstructed/tests/test_child_validation.c Exact null transfer-pointer gate, local far cursor, direction word, head-to-tail callback traversal with next capture, nonparticipant skip, cumulative offsets, and six-byte Pascal cleanup are represented and branch-tested. +1018:0e46 FUN_1018_0e46 Code4 88 verified object_windows_register_class reconstructed/tdkpin_window_messages.c disassembly 1018:0e46-0e9d; VMT +0x2c/+0x34; exact WNDCLASS16; USER GetClassInfo/RegisterClass; reconstructed/tests/test_class_registration.c Exact current HINSTANCE, far class name, existing-class early success, 26-byte builder frame, RegisterClass zero/nonzero normalization, and four-byte cleanup are represented and branch-tested. +1018:0e9e FUN_1018_0e9e Code4 34 verified object_windows_show reconstructed/tdkpin_application.c disassembly 1018:0e9e-0ebf; USER ShowWindow ordinal 42; three internal call sites; reconstructed/tests/test_application.c Exact object HWND +4 zero gate, HWND/INT16 command arguments, ignored BOOL16 return, and six-byte Pascal cleanup are represented and branch-tested. +1018:0ec0 FUN_1018_0ec0 Code4 52 verified object_windows_child_blocks_close reconstructed/tdkpin_object_list.c disassembly 1018:0ec0-0ef3; child HWND +4 and VMT +0x3c; reconstructed/tests/test_object_list.c Exact ignored leading word, window-handle gate, virtual CanClose inversion, AL predicate result, and six-byte Pascal cleanup are represented and zero/allow/block tested. +1018:0ef4 FUN_1018_0ef4 Code4 46 verified object_windows_all_children_can_close reconstructed/tdkpin_object_list.c disassembly 1018:0ef4-0f21; relocation to predicate NE entry 151 at 1018:0ec0; verified ring search; reconstructed/tests/test_object_list.c Exact nested predicate pointer, first-blocker far result, selector-or-offset null test, AL true only on no blocker, and four-byte cleanup are represented and branch-tested. +1018:0f22 FUN_1018_0f22 Code4 22 verified object_windows_wm_close reconstructed/tdkpin_window_messages.c disassembly 1018:0f22-0f37; message table 1028:05cc id 0x0010; verified 1018:0f38; reconstructed/tests/test_window_messages.c Exact object argument forwarding, ignored message record, close-if-allowed call, and eight-byte Pascal cleanup are represented and branch-tested through main/nonmain windows. +1018:0f38 FUN_1018_0f38 Code4 85 verified object_windows_close_if_allowed reconstructed/tdkpin_window_messages.c disassembly 1018:0f38-0f8c; application MainWindow +8; VMT +0x44/+0x3c; reconstructed/tests/test_window_messages.c Exact main-window far comparison, application-versus-window CanClose receiver/slot, AL gate, virtual dispose mode 1, and rejected-close path are represented and branch-tested. +1018:0f8d FUN_1018_0f8d Code4 63 verified object_windows_wm_destroy reconstructed/tdkpin_window_messages.c disassembly 1018:0f8d-0fcb; message table id 0x0002; USER PostQuitMessage ordinal 6; reconstructed/tests/test_window_messages.c Exact main-window comparison, HWND +4 PostQuitMessage argument, nonmain skip, default VMT +0x0c event call, and eight-byte Pascal cleanup are represented and tested. +1018:0fcc FUN_1018_0fcc Code4 49 verified object_windows_wm_nc_destroy reconstructed/tdkpin_window_messages.c disassembly 1018:0fcc-0ffc; message table id 0x0082; verified OW1/OW2 unbind helper; reconstructed/tests/test_window_messages.c Exact HWND property-unbind-before-default order, VMT +0x0c event frame, post-handler HWND zeroing, and eight-byte cleanup are represented and tested. +1018:0ffd FUN_1018_0ffd Code4 87 verified object_windows_wm_activate reconstructed/tdkpin_window_messages.c disassembly 1018:0ffd-1053; message table id 0x0006; verified flag/set-active-dialog helpers; reconstructed/tests/test_window_messages.c Exact default-handler-first order, event WPARAM +4 zero gate, flag bit 1 test, window/null active-dialog publication, and eight-byte cleanup are represented and branch-tested. +1018:1054 FUN_1018_1054 Code4 86 verified object_windows_wm_query_end_session reconstructed/tdkpin_window_messages.c disassembly 1018:1054-10a9; message table id 0x0011; MainWindow/VMT +0x44 and window VMT +0x3c; reconstructed/tests/test_window_messages.c Exact main/nonmain CanClose selection, CBW/CWD-compatible boolean result at message record +0x0a/+0x0c, and eight-byte cleanup are represented and true/false tested. +1018:10aa FUN_1018_10aa Code4 63 verified object_windows_message_0014 reconstructed/tdkpin_window_messages.c disassembly 1018:10aa-10e8; message table id 0x0014; verified 1018:0f38; reconstructed/tests/test_window_messages.c Exact numeric message id retained without speculative OWL naming; main windows use close-if-allowed, nonmain windows receive VMT +0x10 with the unchanged event far frame; both branches tested. +1018:10e9 FUN_1018_10e9 Code4 29 verified object_windows_window_get_mdi_client_default reconstructed/tdkpin_application.c disassembly 1018:10e9-1105; four VMT relocations at slot +0x30; verified MDI accelerator consumer 1018:1d64; reconstructed/tests/test_application_loop.c Exact receiver far argument, local null far pointer, DX:AX zero return, and four-byte Pascal cleanup are represented and tested; non-MDI window classes inherit this default. +1018:1106 FUN_1018_1106 Code4 277 verified object_windows_window_construct reconstructed/tdkpin_window_placement.c disassembly 1018:1106-121a; verified Borland/ObjectWindows/string dependencies; USER ordinal relocations 107/447; reconstructed/tests/test_window_creation.c Exact hidden-VMT gate, base object/parent, owned title duplicate, DefWindowProc default, root/ordinary-child/MDI-child styles, parent VMT +30 MDI detection, flag 08 set, DefMDIChildProc substitution, all extended-style/placement/menu/parameter/attachment/focus initializers, suppressed construction, and 14-byte cleanup are represented and tested. +1018:121b FUN_1018_121b Code4 89 verified object_windows_window_destruct reconstructed/tdkpin_window_lifecycle.c disassembly 1018:121b-1273; verified far-string/base-object/Borland destructor dependencies; attached VMT+8 Dispose semantics; reconstructed/tests/test_window_lifecycle.c Exact unconditionally tolerant title disposal, optional attached-object Dispose(mode 1), +3b far-pointer clear, base destruction with hidden VMT zero, derived ownership finish, six-byte cleanup, and ordering are represented and tested. +1018:1274 FUN_1018_1274 Code4 129 verified object_windows_build_window_class reconstructed/tdkpin_window_messages.c disassembly 1018:1274-12f4; exact WNDCLASS16; bootstrap relocation 1018:018b; VMT +0x2c; reconstructed/tests/test_class_registration.c Exact style 3, bootstrap far proc, zero extras, current instance, application icon/arrow cursor, background brush 6, null menu, virtual class-name far pointer, field offsets, and eight-byte cleanup are tested. +1018:12f5 FUN_1018_12f5 Code4 28 verified object_windows_get_field_35 reconstructed/tdkpin_window_messages.c disassembly 1018:12f5-1310; three VMT relocations at slot +0x28; reconstructed/tests/test_window_messages.c Exact receiver far pointer, unaligned uint16 read at +0x35, AX return, and four-byte Pascal cleanup are represented and tested without assigning an unproved source field name. +1018:1311 FUN_1018_1311 Code4 62 verified object_windows_call_original_window_proc reconstructed/tdkpin_window_messages.c disassembly 1018:1311-134e; USER CallWindowProc ordinal 122; object fields +4/+0x37; reconstructed/tests/test_window_messages.c Exact unaligned far procedure, HWND, message, WPARAM, LPARAM low/high ordering, 14-byte Pascal import frame, DX:AX result store at record +0x0a/+0x0c, and eight-byte cleanup are represented and tested. +1018:134f FUN_1018_134f Code4 504 verified object_windows_create_native_window reconstructed/tdkpin_window_placement.c disassembly 1018:134f-1546; relocations 113-121; reconstructed/tests/test_window_creation.c Exact status gate, flag clear, parent HWND, flag-02 GetDlgItem path, VMT +1c registration, creating-object publication, VMT +2c class, flag-08 CreateWindowEx versus WM_MDICREATE paths, packed 26-byte MDICREATESTRUCT16, all creation arguments, zero-handle status ffff, existing-object bypass, bind/SetWindowLong GWL_WNDPROC/original-proc store, VMT +38 callback, indeterminate AH preservation, Boolean AL, and four-byte cleanup are represented and branch-tested. +1018:1547 FUN_1018_1547 Code4 63 verified object_windows_restore_child_focus reconstructed/tdkpin_window_messages.c disassembly 1018:1547-1585; saved HWND +0x3f; USER IsWindow/IsIconic/SetFocus; reconstructed/tests/test_window_messages.c Exact zero-saved skip, validity gate, owner HWND +4 iconic gate, SetFocus argument, ignored return, and all three suppression/success paths are tested. +1018:1586 FUN_1018_1586 Code4 58 verified object_windows_remember_child_focus reconstructed/tdkpin_window_messages.c disassembly 1018:1586-15bf; USER GetFocus/IsChild; object HWND +4 and unaligned saved focus +0x3f; reconstructed/tests/test_window_messages.c Exact zero-focus skip, IsChild(parent HWND, focus) ordering, BOOL gate, unaligned HWND store, and four-byte cleanup are represented and branch-tested. +1018:15c0 FUN_1018_15c0 Code4 221 verified object_windows_capture_normal_placement reconstructed/tdkpin_window_placement.c disassembly 1018:15c0-169c; exact RECT16 and object offsets; verified flag/far-virtual-call dependencies; USER IsIconic/IsZoomed/GetWindowRect/ScreenToClient; reconstructed/tests/test_window_placement.c Exact minimized/maximized early exits, width/height capture, parent VMT+30 client lookup, flag-08 client conversion, attribute-40000000 parent conversion, screen-coordinate fallback, ignored BOOL results, unaligned saved fields 29/2b/2d/2f, and four-byte cleanup are branch-tested. +1018:169d FUN_1018_169d Code4 78 verified object_windows_wm_activate_with_focus reconstructed/tdkpin_window_messages.c disassembly 1018:169d-16ea; verified WM_ACTIVATE/flag/focus helpers; VMT relocation 1028:0626; reconstructed/tests/test_window_messages.c Exact base-activate-first order, flag-1 gate, WPARAM zero save versus nonzero restore selection, unchanged event frame, and both branches are tested. +1018:16eb FUN_1018_16eb Code4 33 verified borland_dispatch_method_0006 reconstructed/tdkpin_dispatch.c disassembly 1018:16eb-170b; VMT relocation at 1028:062a; verified dynamic dispatcher; reconstructed/tests/test_dispatch.c Exact receiver/argument far-pointer copies, receiver VMT load, dynamic id 0x0006, far target invocation, and eight-byte Pascal cleanup are represented and tested. +1018:170c FUN_1018_170c Code4 85 verified object_windows_setup_window reconstructed/tdkpin_window_placement.c disassembly 1018:170c-1760; verified 1018:0d9b/0673/15c0 dependencies; USER SetFocus; reconstructed/tests/test_window_placement.c Exact prepare, flag-08 focus, optional far object at +3b VMT+10 setup, placement-capture ordering, native HWND use, null-attached branch, and four-byte cleanup are represented and tested. +1018:1761 FUN_1018_1761 Code4 39 verified object_windows_call_slot_38_then_default reconstructed/tdkpin_window_messages.c disassembly 1018:1761-1787; VMT relocation at 1028:062e; reconstructed/tests/test_window_messages.c Exact receiver-only VMT +0x38 call followed by object/event VMT +0x0c call, ordering, far frames, and eight-byte cleanup are represented and tested. +1018:1788 FUN_1018_1788 Code4 112 verified object_windows_wm_hscroll_attached reconstructed/tdkpin_window_messages.c disassembly 1018:1788-17f7; USER GetWindowLong ordinal 135; VMT +48/+20/+0c; reconstructed/tests/test_window_advanced_handlers.c Exact HWND/GWL_STYLE -16 call, high-word WS_HSCROLL bit 10 test, style-absent window +48 forwarding, unaligned attached +3b null/default path, attached +20 position/command order, ignored API result, and eight-byte cleanup are represented and tested. +1018:17f8 FUN_1018_17f8 Code4 112 verified object_windows_wm_vscroll_attached reconstructed/tdkpin_window_messages.c disassembly 1018:17f8-1867; USER GetWindowLong ordinal 135; VMT +48/+1c/+0c; reconstructed/tests/test_window_advanced_handlers.c Exact HWND/GWL_STYLE -16 call, high-word WS_VSCROLL bit 20 test, style-absent window +48 forwarding, unaligned attached +3b null/default path, attached +1c position/command order, ignored API result, and eight-byte cleanup are represented and tested. +1018:1868 FUN_1018_1868 Code4 129 verified object_windows_wm_paint_attached reconstructed/tdkpin_window_messages.c disassembly 1018:1868-18e8; USER BeginPaint/EndPaint; VMT +14/+4c/+18; reconstructed/tests/test_window_advanced_handlers.c Exact 32-byte stack PAINTSTRUCT16, HWND Begin/End lifetime, optional attached before-paint +14(paint,dc), window paint +4c(paint,dc), optional attached after-paint +18, shared DC, ordering, ignored results, and eight-byte cleanup are represented and tested. +1018:18e9 FUN_1018_18e9 Code4 119 verified object_windows_wm_size_attached reconstructed/tdkpin_window_messages.c disassembly 1018:18e9-195f; USER GetWindowRect ordinal 32; VMT +0c; reconstructed/tests/test_window_advanced_handlers.c Exact attached notification except SIZE_MINIMIZED=1, restored/default forwarding, SIZE_RESTORED=0 rectangle query, signed right-left/bottom-top 16-bit differences, unaligned width/height stores +2d/+2f, call ordering, and eight-byte cleanup are represented and tested. +1018:1960 FUN_1018_1960 Code4 38 verified object_windows_remember_focus_then_default reconstructed/tdkpin_window_messages.c disassembly 1018:1960-1985; verified 1018:1586; VMT relocation at 1028:0642; reconstructed/tests/test_window_messages.c Exact child-focus capture before unchanged default event dispatch, receiver/event frames, call ordering, and eight-byte cleanup are represented and tested. +1018:1986 FUN_1018_1986 Code4 136 verified object_windows_track_mouse_until_button_up reconstructed/tdkpin_window_messages.c disassembly 1018:1986-1a0d; USER SetCapture/PeekMessage/Translate/Dispatch/ReleaseCapture; attached VMT +24; reconstructed/tests/test_window_advanced_handlers.c Exact attached/null and byte +22 gates, HWND capture, remove-mode nonblocking pump, retained/explicitly indeterminate MSG when empty, per-iteration attached +24(HWND), inclusive WM_LBUTTONUP iteration, release ordering, final default handler, and eight-byte cleanup are represented and tested. +1018:1a0e FUN_1018_1a0e Code4 83 verified object_windows_wm_syscommand_focus reconstructed/tdkpin_window_messages.c disassembly 1018:1a0e-1a60; flag 1; SC_MINIMIZE f020/SC_RESTORE f120; VMT relocation 1028:064a; reconstructed/tests/test_window_messages.c Exact flag gate, minimize save, restore focus, other-command no-op, mandatory default-handler-after-focus order, event frame, and all command branches are tested. +1018:1a61 FUN_1018_1a61 Code4 167 verified object_windows_application_construct reconstructed/tdkpin_application.c disassembly 1018:1a61-1b07; verified Borland object/reserve helpers; KERNEL MakeProcInstance ordinal 51; reconstructed/tests/test_application.c Exact object fields, global publication, relocated 1018:0133 procedure instance, heap reserve setup, previous-instance gate, status-word gate, VMT +0x10/+0x14 calls, and far return are represented and branch-tested. +1018:1b08 FUN_1018_1b08 Code4 45 verified object_windows_application_destruct reconstructed/tdkpin_application.c disassembly 1018:1b08-1b34; KERNEL FreeProcInstance ordinal 52; verified root/destructor helpers; reconstructed/tests/test_application.c Exact shared proc-instance release, root destructor call with hidden VMT zero, owned-allocation cleanup, and object-size recovery are represented and tested. +1018:1b35 FUN_1018_1b35 Code4 22 verified object_windows_application_idle_default reconstructed/tdkpin_application.c disassembly 1018:1b35-1b4a; TApplication VMT +0x0c at 1028:0030; message-loop call at 1018:1c21; reconstructed/tests/test_application.c Exact receiver far argument, local uint8 false value, AL return, and four-byte Pascal cleanup are represented and tested; this default causes WaitMessage when the queue is empty. +1018:1b4b FUN_1018_1b4b Code4 12 verified object_windows_application_init_application_default reconstructed/tdkpin_application.c disassembly 1018:1b4b-1b56; TApplication VMT +0x10 at 1028:0034; verified constructor first-instance gate Exact no-op virtual InitApplication method with receiver far argument and four-byte Pascal cleanup is represented; application-specific subclasses may override the slot. +1018:1b57 FUN_1018_1b57 Code4 89 verified object_windows_application_initialize reconstructed/tdkpin_application.c disassembly 1018:1b57-1baf; TApplication VMT +0x18/+0x34; verified 1018:0e9e; reconstructed/tests/test_application.c Exact setup/creator virtual order, far MainWindow +8 publication, null result status -5, startup show command, HWND gate, and nonnull ShowWindow path are represented and branch-tested. +1018:1bb0 FUN_1018_1bb0 Code4 47 verified object_windows_application_run reconstructed/tdkpin_application.c disassembly 1018:1bb0-1bde; TApplication VMT +0x20/+0x40; reconstructed/tests/test_application_loop.c Exact status +2 branch, zero-status receiver-only Run call, nonzero-status receiver-plus-uint16 Error call, virtual far slots, and four-byte Pascal cleanup are represented and branch-tested. +1018:1bdf FUN_1018_1bdf Code4 29 verified object_windows_application_set_active_dialog reconstructed/tdkpin_application.c disassembly 1018:1bdf-1bfb; call sites 1018:1037/1048; message-loop consumer 1018:1cd6; reconstructed/tests/test_application.c Exact application/dialog far arguments, offset +0x0e/+0x10 stores, and eight-byte Pascal cleanup are represented and tested; the pointer feeds modal-dialog preservation and IsDialogMessage routing. +1018:1bfc FUN_1018_1bfc Code4 131 verified object_windows_application_message_loop reconstructed/tdkpin_application.c disassembly 1018:1bfc-1c7e; exact 18-byte MSG16; reviewed USER calls; reconstructed/tests/test_application_loop.c Exact PM_REMOVE loop, empty-queue IdleAction/WaitMessage repetition, WM_QUIT-only termination, VMT +0x24 prefilter, conditional Translate/Dispatch, and quit-WPARAM status store are represented and path-tested. +1018:1c7f FUN_1018_1c7f Code4 87 verified object_windows_application_preprocess_message reconstructed/tdkpin_application.c disassembly 1018:1c7f-1cd5; TApplication VMT slots +0x28/+0x30/+0x2c; reconstructed/tests/test_application_loop.c Exact dialog-then-MDI-then-ordinary-accelerator order, first-true short circuit, receiver/MSG arguments, AL boolean interpretation, and all-false result are represented and branch-tested. +1018:1cd6 FUN_1018_1cd6 Code4 76 verified object_windows_application_process_dialog_message reconstructed/tdkpin_application.c disassembly 1018:1cd6-1d21; USER IsDialogMessage ordinal 90; reconstructed/tests/test_application_loop.c Exact active-dialog far pointer, dialog HWND +4 gate, MSG argument, NEG AX/SBB AL/NEG AL normalization with preserved AH, zero paths, and uint16 result are represented and tested. +1018:1d22 FUN_1018_1d22 Code4 66 verified object_windows_application_process_accelerator reconstructed/tdkpin_application.c disassembly 1018:1d22-1d63; USER TranslateAccelerator ordinal 178; reconstructed/tests/test_application_loop.c Exact HACCEL +0x0c gate, main-window far pointer +8, HWND +4, MSG argument, API result booleanization, and zero-table path are represented and tested. +1018:1d64 FUN_1018_1d64 Code4 77 verified object_windows_application_process_mdi_accelerator reconstructed/tdkpin_application.c disassembly 1018:1d64-1db0; USER TranslateMDISysAccel ordinal 451; reconstructed/tests/test_application_loop.c Exact main-window +8 lookup, virtual client getter +0x30, null client path, client HWND +4, MSG argument, and API result booleanization are represented and branch-tested. +1018:1db1 FUN_1018_1db1 Code4 136 verified object_windows_application_validate_window reconstructed/tdkpin_application.c disassembly 1018:1db1-1e38; verified Borland reserve/dispose helpers; reconstructed/tests/test_application_windows.c Exact null candidate, reserve-missing error -2/dispose/reprovision order, object-status error/dispose path, VMT +0x40 error arguments, successful far return, and null failure return are represented and branch-tested. +1018:1e39 FUN_1018_1e39 Code4 119 verified object_windows_application_make_window reconstructed/tdkpin_application.c disassembly 1018:1e39-1eaf; TApplication VMT +0x3c/+0x40 and window VMT +0x20/+0x08; reconstructed/tests/test_application_windows.c Exact null/validator gates, Create virtual boolean, successful original far return, status-word error report, virtual dispose mode 1, and null failure result are represented and branch-tested. +1018:1eb0 FUN_1018_1eb0 Code4 100 verified object_windows_application_exec_dialog reconstructed/tdkpin_application.c disassembly 1018:1eb0-1f13; TApplication VMT +0x3c/+0x40 and dialog VMT +0x4c/+0x08; reconstructed/tests/test_application_windows.c Exact default result 2, validator gate, signed dialog result, negative-result error report/fallback, nonnegative result, unconditional post-execution dispose, and all return paths are represented and branch-tested. +1018:1f14 FUN_1018_1f14 Code4 66 verified object_windows_application_error reconstructed/tdkpin_application.c disassembly 1018:1f14-1f55; USER wvsprintf ordinal 421; DGROUP MessageBox pointer 0666; strings 0698/06b3; reconstructed/tests/test_application_windows.c Exact 32-byte buffer, caller error-word argument list, signed %d formatting, indirect MessageBox owner/text/caption/type, IDNO 7 branch, and full uint16 runtime-exit status are represented and branch-tested. +1018:1f56 FUN_1018_1f56 Code4 36 verified object_windows_application_can_close reconstructed/tdkpin_application.c disassembly 1018:1f56-1f79; TApplication MainWindow +8 and window VMT +0x3c; reconstructed/tests/test_application_loop.c Exact far MainWindow/VMT lookup, CanClose virtual receiver call, AL boolean result, and four-byte Pascal cleanup are represented and true/false tested. +1020:0002 FUN_1020_0002 Code5 91 verified borland_initialize_win16_runtime reconstructed/tdkpin_borland_startup.c disassembly 1020:0002-005c; entry call at 1000:fd8a; relocations to KERNEL WaitEvent/GetWinFlags/__AHINCR and USER InitApp; reconstructed/tests/test_borland_startup.c Exact AX fatal gate, SI/DI/DX/ES:BX loader-register capture, WaitEvent(0), InitApp failure, low-AL CPU classification, __AHINCR equate publication, normal far return, and INT 21h/AH=4c status ff termination are represented and branch-tested. +1020:005d FUN_1020_005d Code5 4 verified borland_runtime_error reconstructed/tdkpin_borland_runtime.c disassembly 1020:005d-0060 plus shared 0065 path; reconstructed/tests/test_heap_reserve.c Exact current far return address, ffff selector special case, normal selector:0 logical segment translation, uint16 error code, stored offset/segment, and DOS termination are represented and tested through Runtime Errors 203/204. +1020:0061 FUN_1020_0061 Code5 113 verified borland_runtime_exit reconstructed/tdkpin_borland_runtime.c disassembly 1020:0061-00d1; Runtime error template; MessageBox relocation; reconstructed/tests/test_heap_reserve.c Exact full uint16 exit word, cleared error location, Windows-mode ExitProc gate, mutable chain, decimal/hex backward formatting, MessageBox flags 0x1010, DOS low-byte status, and no-dialog/dialog termination paths are tested. +1020:00d2 FUN_1020_00d2 Code5 30 verified borland_run_exit_procedures reconstructed/tdkpin_borland_runtime.c disassembly 1020:00d2-00ef; reconstructed/tests/test_heap_reserve.c Exact mutable far ExitProc capture, clear-before-call, IOResult zero before every callback, callback-installed successor, two-entry order, and final null head are represented and tested. +1020:00f0 FUN_1020_00f0 Code5 23 verified borland_prepend_unsigned reconstructed/tdkpin_borland_runtime.c disassembly 1020:00f0-0106 Exact unsigned DIV loop, uppercase digit mapping, pre-decrement destination write, and zero-value single-digit behavior represented in C. +1020:012d FUN_1020_012d Code5 26 verified borland_get_mem reconstructed/tdkpin_borland_runtime.c disassembly 1020:012d-0146; verified 1020:01ca/005d; reconstructed/tests/test_heap_reserve.c Exact uint16 size, far allocation result, success return, failure/carry Runtime Error 203, ffff caller location, and termination are represented and branch-tested. +1020:0147 FUN_1020_0147 Code5 32 verified borland_free_mem reconstructed/tdkpin_borland_runtime.c disassembly 1020:0147-0166; verified 1020:02d7/005d; reconstructed/tests/test_heap_reserve.c Exact far block/uint16 size, successful release, failure Runtime Error 204, normal selector logical segment tag, caller offset, and termination are represented and branch-tested. +1020:0167 FUN_1020_0167 Code5 46 verified borland_heap_free_space reconstructed/tdkpin_heap.c disassembly 1020:0167-0194; local/global sum test Exact GetFreeSpace16(0x1000), circular segment traversal, uint16 local-free additions with 32-bit carry, and total result verified. +1020:0195 runtime_1020_0195 Code5 53 verified borland_heap_largest_block reconstructed/tdkpin_heap.c disassembly 1020:0195-01c9; low/high GlobalCompact and local maximum tests Exact GlobalCompact16(0), high-word short circuit, circular local free-byte maximum, and uint32 result verified. +1020:01ca FUN_1020_01ca Code5 88 verified borland_try_get_mem reconstructed/tdkpin_heap.c disassembly 1020:01ca-0221; reconstructed/tests/test_heap_core.c; reconstructed/tests/test_heap_paths.c Zero, local-first, global-first, cross-heap fallback, and HeapError actions 0, 1, and 2 including retry are represented and branch-tested. +1020:0222 FUN_1020_0222 Code5 26 verified borland_global_allocate reconstructed/tdkpin_borland_runtime.c disassembly 1020:0222-023b; zero/nonzero GlobalAlloc16 mock tests Exact configured flags, zero-extended uint16 size, handle-zero failure, conditional GlobalLock16, and far-pointer result verified. +1020:023c FUN_1020_023c Code5 46 verified borland_try_local_allocation reconstructed/tdkpin_heap.c disassembly 1020:023c-0269; reconstructed/tests/test_heap_core.c; reconstructed/tests/test_heap_paths.c Exact 4-byte alignment, circular scan, new-segment insertion/fallback, successful-head update, failure, and far-pointer result are represented and branch-tested across two segments. +1020:026a FUN_1020_026a Code5 60 verified borland_create_local_heap_segment reconstructed/tdkpin_heap.c disassembly 1020:026a-02a5; initialized header/ring test Exact 0x5054 header, free-list offsets/sizes, free-byte count, circular ring insertion, segment-size allocation, and selector result verified. +1020:02a6 FUN_1020_02a6 Code5 49 verified borland_local_allocate_in_segment reconstructed/tdkpin_heap.c disassembly 1020:02a6-02d6; sequential allocation/split/free-byte tests Exact first-fit traversal, unsigned size test, exact-fit unlink, remainder split, previous-link update, free-byte subtraction, offset result, and failure represented and verified. +1020:02d7 FUN_1020_02d7 Code5 150 verified borland_try_free_mem reconstructed/tdkpin_heap.c disassembly 1020:02d7-0387; reconstructed/tests/test_heap_core.c; reconstructed/tests/test_heap_paths.c Zero-size, global/local split, validation failures, ordered insertion, accounting, both merges, circular-ring unlink, single/multi-segment release, and GlobalHandle/Unlock/Free behavior are represented and branch-tested. +1020:0327 FUN_1020_0327 Code5 27 verified borland_local_merge_next reconstructed/tdkpin_heap.c disassembly 1020:0327-0341; adjacent/nonadjacent behavior exercised by heap-core tests Exact offset+size adjacency check, link bypass, and uint16 size merge represented and verified. +1020:0388 FUN_1020_0388 Code5 7 verified borland_take_io_result reconstructed/tdkpin_borland_runtime.c disassembly 1020:0388-038e Exact sequentially consistent 16-bit atomic exchange-to-zero and returned prior value represented in C. +1020:038f FUN_1020_038f Code5 14 verified borland_require_io_success reconstructed/tdkpin_borland_runtime.c disassembly 1020:038f-039c; verified runtime-error path; reconstructed/tests/test_heap_reserve.c Exact atomic IOResult read, zero return, nonzero unchanged code transfer, caller location, and DOS termination are branch-tested. +1020:039d FUN_1020_039d Code5 40 verified borland_check_int32_range reconstructed/tdkpin_borland_runtime.c disassembly 1020:039d-03c4; verified Runtime Error 201; reconstructed/tests/test_heap_reserve.c Exact inclusive int32 minimum/maximum, boundary success, below/above failure, signed-high/unsigned-low-equivalent semantics, and error termination are tested. +1020:03c5 runtime_1020_03c5 Code5 6 verified borland_runtime_error_215 reconstructed/tdkpin_borland_runtime.c disassembly 1020:03c5-03ca; verified runtime-error path; reconstructed/tests/test_heap_reserve.c Exact fixed uint16 code 215 transfer, caller-location handling, and DOS termination are represented and tested. +1020:03cb FUN_1020_03cb Code5 36 verified borland_check_stack reconstructed/tdkpin_stack.c disassembly 1020:03cb-03ee; SS:000a/000e accesses; reconstructed/tests/test_stack.c; reconstructed/tests/test_system_timer.c Exact uint16 request plus 0x400 safety margin, carry/collision/lower-limit errors, low-water update, equality boundary, returned remaining-byte AX value, and Runtime Error 202 are explicitly represented and branch-tested. +1020:03ef FUN_1020_03ef Code5 74 verified borland_enter_object_constructor reconstructed/tdkpin_borland_objects.c disassembly 1020:03ef-0438; verified 1020:01ca; reconstructed/tests/test_borland_objects.c VMT-zero no-op, existing-object ownership mutation, DGROUP VMT size, allocation success/null/failure, caller object update, VMT-field offset, and Runtime Error 203 are explicitly represented and branch-tested. +1020:0439 FUN_1020_0439 Code5 51 verified borland_finish_object_destructor reconstructed/tdkpin_borland_objects.c disassembly 1020:0439-046b; verified 1020:02d7; reconstructed/tests/test_borland_objects.c Hidden ownership marker, installed-VMT size recovery, arbitrary VMT-field offset, release success/failure, caller object clearing, and Runtime Error 204 are explicitly represented and branch-tested. +1020:046c runtime_1020_046c Code5 35 verified borland_copy_typed_record reconstructed/tdkpin_borland_runtime.c disassembly 1020:046c-048e; reconstructed/tests/test_heap_reserve.c Exact far source/destination, embedded near descriptor pointer, DGROUP length lookup, always-forward copy, descriptor restoration, 16-bit offsets, and zero-length behavior are represented and branch-tested. +1020:048f runtime_1020_048f Code5 16 verified borland_validate_vmt_descriptor reconstructed/tdkpin_borland_records.c disassembly 1020:048f-049e; Borland Runtime Error 210; reconstructed/tests/test_borland_records.c Exact nonzero size, uint16 size+negative-size zero invariant, valid return, invalid descriptor error transfer, and VMT field widths are represented and branch-tested. +1020:049f runtime_1020_049f Code5 93 verified borland_assign_text_c; borland_assign_text_short reconstructed/tdkpin_borland_records.c disassembly 1020:049f-04fb; shared overlapping entry 1020:04a0; relocation to 1020:0be9; reconstructed/tests/test_borland_records.c Exact 128-byte TextRec header, buffer/open far pointers, 14 cleared words, 79-byte name cap, C-string and ShortString entries, embedded-NUL stop, NUL append, in-place AnsiToOem, and eight-byte cleanup are represented and tested. +1020:04fc runtime_1020_04fc Code5 43 verified borland_initialize_file_record reconstructed/tdkpin_borland_records.c disassembly 1020:04fc-0526; reconstructed/tests/test_borland_records.c Exact far record argument, fields +4/+0c/+0e, zero stores +8/+0a, three uint16 inputs, ten-byte Pascal cleanup, and untouched surrounding bytes are represented and tested. +1020:0527 FUN_1020_0527 Code5 5 verified borland_reset_file reconstructed/tdkpin_borland_files.c disassembly 1020:0527-052b; mode DX=0xd7b1 tail entry; reconstructed/tests/test_borland_files.c Exact input-mode selector and common open dispatcher behavior are represented and tested. +1020:052c FUN_1020_052c Code5 5 verified borland_rewrite_file reconstructed/tdkpin_borland_files.c disassembly 1020:052c-0530; mode DX=0xd7b2 tail entry; reconstructed/tests/test_borland_files.c Exact output-mode selector and common open dispatcher behavior are represented and tested. +1020:0534 FUN_1020_0534 Code5 78 verified borland_open_file reconstructed/tdkpin_borland_files.c disassembly 1020:0534-0581; mode sentinels and FileProc +0x10; reconstructed/tests/test_borland_files.c Exact existing input/output close, invalid-mode IOResult 0x66, desired-mode preservation, buffer position/end zeroing, open call, error rollback to closed, and all paths are branch-tested. +1020:0586 FUN_1020_0586 Code5 65 verified borland_close_file reconstructed/tdkpin_borland_files.c disassembly 1020:0586-05c6; FileProc +0x14/+0x1c; reconstructed/tests/test_borland_files.c Exact input close-only, output flush-then-close even on flush error, invalid-mode IOResult 0x67, closed sentinel store, and FileProc order are branch-tested. +1020:05c7 FUN_1020_05c7 Code5 17 verified borland_call_file_procedure reconstructed/tdkpin_borland_files.c disassembly 1020:05c7-05d7; reconstructed/tests/test_borland_files.c Exact far FileProc slot lookup, preserved ES:DI record argument, uint16 AX return, nonzero-only atomic IOResult publication, and near return are represented and tested. +1020:05d8 FUN_1020_05d8 Code5 48 verified borland_file_read_buffer reconstructed/tdkpin_borland_files.c disassembly 1020:05d8-0607; DOS INT21 AH=3f; reconstructed/tests/test_borland_files.c Exact handle +0, count +4, buffer far +0x0c, carry/error AX, bytes-read +0x0a, position +8 zero, success zero return, and error paths are tested. +1020:0608 FUN_1020_0608 Code5 37 verified borland_file_flush_buffer reconstructed/tdkpin_borland_files.c disassembly 1020:0608-062c; atomic XCHG and DOS INT21 AH=40; reconstructed/tests/test_borland_files.c Exact atomic pending-count read/zero, handle/buffer/count frame, carry error, full-write zero, short-write error 0x65, and all returns are branch-tested. +1020:062d FUN_1020_062d Code5 32 verified borland_file_write_buffer reconstructed/tdkpin_borland_files.c disassembly 1020:062d-064c; atomic XCHG and DOS INT21 AH=40; reconstructed/tests/test_borland_files.c Exact pending-count exchange, DOS write frame, carry-only error semantics, intentional short-write acceptance, and success/error returns are tested. +1020:064d FUN_1020_064d Code5 25 verified borland_file_close_handle reconstructed/tdkpin_borland_files.c disassembly 1020:064d-0666; DOS INT21 AH=3e; reconstructed/tests/test_borland_files.c Exact handle <=4 preservation, >4 DOS close, carry AX error, zero success, no-call standard-handle path, and four-byte cleanup are branch-tested. +1020:0667 FUN_1020_0667 Code5 68 verified borland_assign_file_short reconstructed/tdkpin_borland_records.c disassembly 1020:0667-06aa; generic FileRec layout; KEYBOARD AnsiToOem; reconstructed/tests/test_borland_records.c Exact handle/mode words, 22 cleared runtime words, 80-byte name field, ShortString cap 79, embedded-NUL stop, NUL append, in-place ANSI-to-OEM call, and eight-byte cleanup are represented and tested. +1020:06ab FUN_1020_06ab Code5 95 verified borland_open_generic_file; borland_create_generic_file reconstructed/tdkpin_borland_files.c disassembly 1020:06ab-070f; shared Create entry 1020:06b4; DOS AH=3d/3c; reconstructed/tests/test_borland_files.c Exact global access mode 2, create attributes zero, current-open close, invalid-mode 0x66, empty-name handles 0/1, named DOS carry error, handle/open sentinel/record-size stores, and both overlapping entries are branch-tested. +1020:0710 runtime_1020_0710 Code5 28 verified borland_truncate_file reconstructed/tdkpin_borland_files.c disassembly 1020:0710-072b; verified open validator; DOS AH=40/CX=0; reconstructed/tests/test_borland_files.c Exact invalid-mode skip, handle, zero count, indeterminate DS:DX preservation model, carry-only IOResult publication, success no-op, and four-byte cleanup are branch-tested. +1020:072c FUN_1020_072c Code5 37 verified borland_close_generic_file reconstructed/tdkpin_borland_files.c disassembly 1020:072c-0750; verified open validator; DOS AH=3e; reconstructed/tests/test_borland_files.c Exact invalid-mode no-change, handle <=4 skip, larger-handle close, carry IOResult, closed sentinel despite close error, and four-byte cleanup are branch-tested. +1020:0751 FUN_1020_0751 Code5 15 verified borland_validate_open_file reconstructed/tdkpin_borland_files.c disassembly 1020:0751-075f; reconstructed/tests/test_borland_files.c Exact mode 0xd7b3 equality/ZF contract, valid no-op, invalid IOResult 0x67, and near return are represented and tested. +1020:0760 runtime_1020_0760 Code5 49 verified borland_file_read_record; borland_file_write_record reconstructed/tdkpin_borland_files.c disassembly 1020:0760-0795; shared write entry 1020:0765; DOS AH=3f/40; reconstructed/tests/test_borland_files.c Exact open validation, record-size count, far buffer, read/write selector, carry AX, full-transfer success, short-transfer errors 0x64/0x65, and both shared entries are branch-tested. +1020:0796 runtime_1020_0796 Code5 99 verified borland_file_block_read; borland_file_block_write reconstructed/tdkpin_borland_files.c disassembly 1020:0796-07fd; shared write entry 1020:079b; reconstructed/tests/test_borland_files.c Exact requested*record-size low-word byte count, DOS read/write, carry IOResult, bytes/record-size quotient, optional far result count, no-result short-transfer errors, validation-failure zero publication, and both entries are tested. +1020:07fe FUN_1020_07fe Code5 48 verified borland_file_seek_record reconstructed/tdkpin_borland_files.c disassembly 1020:07fe-082d; DOS AH=42 origin zero; reconstructed/tests/test_borland_files.c Exact open validation, uint32 record index times uint16 record size modulo 2^32, CX:DX offset, handle, origin zero, carry-only IOResult, and eight-byte cleanup are represented and tested. +1020:082e FUN_1020_082e Code5 56 verified borland_parameter_string reconstructed/tdkpin_command_line.c disassembly 1020:082e-0865; verified scanner; KERNEL GetModuleFileName; reconstructed/tests/test_command_line.c Exact hidden far result, index-zero module filename, max 0xff, low-byte returned length, indexed token scan, full uint16 copy despite byte-length wrap, missing token, and two-byte explicit-argument cleanup are tested. +1020:0866 runtime_1020_0866 Code5 11 verified borland_parameter_count reconstructed/tdkpin_command_line.c disassembly 1020:0866-0870; CX=0 underflow token-count test Exact zero-index scan, XCHG, two's-complement negation, and returned uint16 parameter count verified. +1020:0871 FUN_1020_0871 Code5 32 verified borland_scan_command_token reconstructed/tdkpin_command_line.c disassembly 1020:0871-0890; selector-backed whitespace/token/missing-index tests Exact <=space skipping, token extent, zero-length termination, LOOP decrement/wrap, far pointer, length, and residual CX represented and verified. +1020:0891 FUN_1020_0891 Code5 24 verified borland_far_copy reconstructed/tdkpin_strings.c disassembly 1020:0891-08a8; cross-selector copy test Exact full 16-bit count, forward CLD behavior, selector-preserving offsets, and byte order verified. +1020:08a9 FUN_1020_08a9 Code5 61 verified borland_multiply_i32 reconstructed/tdkpin_arithmetic.c disassembly 1020:08a9-08e5; 286 partial-product/386 IMUL equivalence tests Exact low 32 bits of signed DX:AX*BX:CX represented without C signed-overflow UB and verified on positive, negative, and overflow cases. +1020:08e6 FUN_1020_08e6 Code5 166 verified borland_divide_i32 reconstructed/tdkpin_arithmetic.c disassembly 1020:08e6-098b; reconstructed/tests/test_arithmetic.c Exact signs/remainders, divisor-zero Runtime Error 200, INT32_MIN/-1 286 wrap result, 386 divide fault, and ordinary signed combinations are represented and branch-tested. +1020:098c runtime_1020_098c Code5 35 verified borland_shift_right_u32 reconstructed/tdkpin_shortstrings.c disassembly 1020:098c-09ae; loop/386-path equivalence; masked-count tests Exact logical DX:AX right shift with count&31 represented and verified across zero, ordinary, and wrapped counts. +1020:09af runtime_1020_09af Code5 35 verified borland_shift_left_u32 reconstructed/tdkpin_shortstrings.c disassembly 1020:09af-09d1; loop/386-path equivalence; masked-count tests Exact DX:AX left shift with count&31 represented and verified across zero, ordinary, and wrapped counts. +1020:09d2 runtime_1020_09d2 Code5 26 verified borland_short_assign reconstructed/tdkpin_shortstrings.c disassembly 1020:09d2-09eb; selector-backed assignment test Exact length-byte and payload copy across far selectors verified. +1020:09ec FUN_1020_09ec Code5 36 verified borland_short_assign_truncated reconstructed/tdkpin_shortstrings.c disassembly 1020:09ec-0a0f; truncation test Exact uint8 minimum length, stored length, and far payload copy verified. +1020:0a10 FUN_1020_0a10 Code5 65 verified borland_short_substring reconstructed/tdkpin_shortstrings.c disassembly 1020:0a10-0a50; positive and negative bounds tests Exact one-based index clamp, signed negative count clamp, available/count minimum, and payload source offset verified. +1020:0a51 FUN_1020_0a51 Code5 44 verified borland_short_concat reconstructed/tdkpin_shortstrings.c disassembly 1020:0a51-0a7c; normal and 255-byte overflow tests Exact length-byte carry, saturation to 255, complement copy count, append offset, and far transfer verified. +1020:0a7d FUN_1020_0a7d Code5 70 verified borland_short_position reconstructed/tdkpin_shortstrings.c disassembly 1020:0a7d-0ac2; found/empty tests Exact one-based first-match search, empty/oversized rejection, first-byte scan, remaining-byte compare, and zero result verified. +1020:0ac3 FUN_1020_0ac3 Code5 43 verified borland_short_compare reconstructed/tdkpin_shortstrings.c disassembly 1020:0ac3-0aed; selector-backed ordering tests; sole caller 1000:aa04 immediately uses JNZ Payload-byte comparison followed by length comparison is materialized as a signed C result; zero/nonzero exactly preserves the sole caller's equality branch. +1020:0aee runtime_1020_0aee Code5 18 verified borland_character_to_short reconstructed/tdkpin_shortstrings.c disassembly 1020:0aee-0aff; character conversion test Exact length 1 and payload-byte stores verified. +1020:0b00 FUN_1020_0b00 Code5 27 verified borland_bytes_to_short reconstructed/tdkpin_shortstrings.c disassembly 1020:0b00-0b1a; byte-array conversion test Exact low-byte length truncation and full 16-bit REP MOVSB count represented and verified. +1020:0b1b FUN_1020_0b1b Code5 95 verified borland_short_insert reconstructed/tdkpin_shortstrings.c disassembly 1020:0b1b-0b79; prefix/insert/suffix and max-length tests Exact index clamp, two temporary ShortString composition, saturation to destination maximum, append-beyond-end behavior, and in-place result verified. +1020:0b7a FUN_1020_0b7a Code5 111 verified borland_short_delete reconstructed/tdkpin_shortstrings.c disassembly 1020:0b7a-0be8; valid/invalid deletion tests Exact positive index/count gates, index clamp to 255, prefix/suffix composition, unchanged invalid input, and in-place result verified. +1020:0be9 FUN_1020_0be9 Code5 141 verified borland_open_text_record reconstructed/tdkpin_borland_files.c disassembly 1020:0be9-0c75; relocations 18-25 to 1020:05d8/0608/062d/064d; reconstructed/tests/test_borland_files.c Exact Reset/Rewrite/Append DOS open/create selection, empty-name handles 0/1, ignored IOCTL carry with device bit in DL, relocated InOut/Flush/Close callbacks, output-mode transition, and DOS-error AX return are represented and tested. +1020:0c76 FUN_1020_0c76 Code5 90 verified borland_text_truncate_at_ctrl_z reconstructed/tdkpin_borland_files.c disassembly 1020:0c76-0ccf; reconstructed/tests/test_borland_files.c Exact last-128-byte scan, 32-bit DX:AX seek arithmetic, first Ctrl-Z selection, FFFF:(index-read-count) relative EOF seek, zero-byte truncating write, DS:DX residue, and deliberately ignored DOS errors are represented and tested. +1020:0cd0 FUN_1020_0cd0 Code5 4 verified borland_real48_subtract_registers reconstructed/tdkpin_real48.c disassembly 1020:0cd0-0cd3 sign-bit XOR followed by shared 0cd4 body; original-byte DOSBox arithmetic probe; reconstructed/tests/test_real48.c Exact second-operand sign toggle and shared add/sub normalization are represented, including ignored operands beyond exponent distance 40, cancellation, guard-byte rounding, underflow zero, and overflow carry. +1020:0cd4 FUN_1020_0cd4 Code5 195 verified borland_real48_add_registers reconstructed/tdkpin_real48.c disassembly 1020:0cd4-0d96; 48-bit internal significands with eight guard bits; original-byte DOSBox arithmetic probe; reconstructed/tests/test_real48.c Exact exponent ordering/alignment, same-sign carry normalization, opposite-sign magnitude selection and renormalization, add-0x80 rounding, sign/exponent packing, zero/underflow, and overflow carry match the unmodified 16-bit routine. +1020:0d97 FUN_1020_0d97 Code5 251 verified borland_real48_multiply_registers reconstructed/tdkpin_real48.c disassembly 1020:0d97-0e91 plus alignment NOP 0e92; exact 40x40 product projection; original-byte DOSBox arithmetic probe; reconstructed/tests/test_real48.c Exact zero short-circuit, sign XOR, 80-bit product, top-bit normalization, exponent bias, eight guard bits, add-0x80 rounding, underflow zero, and overflow carry are represented without host floating point. +1020:0e93 FUN_1020_0e93 Code5 7 verified borland_real48_zero_registers reconstructed/tdkpin_real48.c disassembly 1020:0e93-0e99; shared underflow targets from 0cd4 and 0d97; reconstructed/tests/test_real48.c Exact AX=BX=DX=0 canonical Real48 zero result and near return are represented; no hidden state or memory effect exists. +1020:0e9a FUN_1020_0e9a Code5 119 verified borland_real48_divide_registers reconstructed/tdkpin_real48.c disassembly 1020:0e9a-0f10; restoring quotient loop; original-byte DOSBox arithmetic probe; reconstructed/tests/test_real48.c Exact numerator-zero result, normalized 48-bit quotient generation, exponent difference/bias, sign XOR, guard-byte rounding, underflow zero, and overflow flag are represented; denominator-zero classification is exposed for the far wrapper's Error 200 path. +1020:0f11 FUN_1020_0f11 Code5 23 verified borland_real48_compare_registers reconstructed/tdkpin_real48.c disassembly 1020:0f11-0f27; verified magnitude core 0f28; reconstructed/tests/test_real48.c Exact sign-difference carry, positive magnitude order, negative-order reversal, equality preservation, and FLAGS result materialized as signed -1/0/1 are branch-tested. +1020:0f28 FUN_1020_0f28 Code5 19 verified borland_real48_compare_magnitude_registers reconstructed/tdkpin_real48.c disassembly 1020:0f28-0f3a; AL/CL exponent then DX/DI, BX/SI, AH/CH comparison order; reconstructed/tests/test_real48.c Exact unsigned lexicographic magnitude order and exponent-zero early equality that ignores noncanonical payload bytes are represented and tested. +1020:0f3b FUN_1020_0f3b Code5 60 verified borland_i32_to_real48_registers reconstructed/tdkpin_real48.c disassembly 1020:0f3b-0f76; exact exponent/significand derivation; original-byte DOSBox probe tools/probes/real48_reference.asm; reconstructed/tests/test_real48.c Exact signed DX:AX two's-complement magnitude, normalization, exponent bias 129, sign bit, canonical zero, and all int32 endpoints are represented; eight vectors match the unmodified 16-bit routine byte-for-byte. +1020:0f77 FUN_1020_0f77 Code5 110 verified borland_real48_to_i32_registers reconstructed/tdkpin_real48.c disassembly 1020:0f77-0fe4; CH truncate/round modes; original-byte DOSBox probe; reconstructed/tests/test_real48.c Exact exponent-derived shift, implicit significand, CH-controlled first-discarded-bit addition, halves-away-from-zero behavior, signed negation, overflow candidate and carry semantics, canonical zero, and int32 endpoints match the unmodified 16-bit core. +1020:0fe5 FUN_1020_0fe5 Code5 6 verified borland_real48_add reconstructed/tdkpin_real48.c disassembly 1020:0fe5-0fea; verified 0cd4; shared Error 205 target 1025; DOSBox probe and sanitizer harness Exact far Add entry, successful RETF, and arithmetic-overflow Runtime Error 205 path are represented. +1020:0feb FUN_1020_0feb Code5 6 verified borland_real48_subtract reconstructed/tdkpin_real48.c disassembly 1020:0feb-0ff0; verified 0cd0; shared Error 205 target 1025; DOSBox probe and sanitizer harness Exact far Subtract entry, successful RETF, sign-toggle semantics, and arithmetic-overflow Runtime Error 205 path are represented. +1020:0ff1 FUN_1020_0ff1 Code5 6 verified borland_real48_square reconstructed/tdkpin_real48.c disassembly 1020:0ff1-0ff6 copies AX/BX/DX to CX/SI/DI and falls through into 0ff7; verified multiply core; reconstructed/tests/test_real48.c Exact shared-entry square operation and overflow behavior are represented rather than treating the six-byte staging prefix as an independent opaque wrapper. +1020:0ff7 FUN_1020_0ff7 Code5 6 verified borland_real48_multiply reconstructed/tdkpin_real48.c disassembly 1020:0ff7-0ffc; verified 0d97; shared Error 205 target; DOSBox probe and sanitizer harness Exact far Multiply entry, successful RETF, and arithmetic-overflow Runtime Error 205 path are represented. +1020:0ffd FUN_1020_0ffd Code5 22 verified borland_real48_divide reconstructed/tdkpin_real48.c disassembly 1020:0ffd-1006 plus shared error targets 1025/102b; verified 0e9a; DOSBox probe and sanitizer harness Exact denominator exponent-zero Runtime Error 200 path, successful far Divide, overflow Runtime Error 205 path, and unchanged operand order are represented and branch-tested. +1020:1007 FUN_1020_1007 Code5 4 verified borland_real48_compare reconstructed/tdkpin_real48.c disassembly 1020:1007-100a; verified near core 0f11; reconstructed/tests/test_real48.c Exact far comparison entry consists solely of near comparison and RETF; the readable signed result preserves every caller-visible equality/ordering condition. +1020:100b FUN_1020_100b Code5 4 verified borland_i32_to_real48 reconstructed/tdkpin_real48.c disassembly 1020:100b-100e; verified near core 0f3b; original-byte DOSBox probe Exact far integer-conversion entry and register result are represented without replacing the six-byte Real48 format by host floating point. +1020:1017 FUN_1020_1017 Code5 14 verified borland_real48_round_to_i32 reconstructed/tdkpin_real48.c disassembly 1020:1017-1024; CH=1; shared Runtime Error 207 tail with entry 100f; original-byte DOSBox probe; reconstructed/tests/test_real48.c Exact Round mode, candidate DX:AX, overflow carry, Runtime Error 207 path, halves-away-from-zero behavior, and shared-tail control flow are represented and tested. +1020:1031 FUN_1020_1031 Code5 10 verified borland_real48_add_preserving_right reconstructed/tdkpin_real48.c disassembly 1020:1031-103a; verified 0cd4; reconstructed/tests/test_real48.c Exact PUSH DI/SI/CX, Add core, POP CX/SI/DI, RET sequence is represented as by-value right operand preservation with identical result/error flags. +1020:103b runtime_1020_103b Code5 10 verified borland_real48_subtract_preserving_right reconstructed/tdkpin_real48.c disassembly 1020:103b-1044; verified 0cd0; reconstructed/tests/test_real48.c Exact PUSH DI/SI/CX, Subtract core, POP CX/SI/DI, RET sequence and preserved secondary operand are represented. +1020:1045 runtime_1020_1045 Code5 10 verified borland_real48_multiply_preserving_right reconstructed/tdkpin_real48.c disassembly 1020:1045-104e; verified 0d97; reconstructed/tests/test_real48.c Exact PUSH DI/SI/CX, Multiply core, POP CX/SI/DI, RET sequence and preserved secondary operand are represented. +1020:104f FUN_1020_104f Code5 10 verified borland_real48_divide_preserving_right reconstructed/tdkpin_real48.c disassembly 1020:104f-1058; verified 0e9a; reconstructed/tests/test_real48.c Exact PUSH DI/SI/CX, Divide core, POP CX/SI/DI, RET sequence and preserved secondary operand are represented. +1020:1059 runtime_1020_1059 Code5 81 verified borland_real48_integer_part reconstructed/tdkpin_real48.c disassembly 1020:1059-10a9; exponent-derived mask construction; original-byte DOSBox Int/Frac probe; reconstructed/tests/test_real48.c Exact Pascal Int semantics are represented: exponent >=168 unchanged, magnitude below one becomes canonical zero, otherwise only fractional significand bits are cleared toward zero while exponent and sign remain unchanged. +1020:10aa runtime_1020_10aa Code5 20 verified borland_real48_fractional_part reconstructed/tdkpin_real48.c disassembly 1020:10aa-10bd; verified 1059 and 0cd0; original-byte DOSBox Int/Frac probe; reconstructed/tests/test_real48.c Exact Pascal Frac register choreography and value-minus-Int(value) semantics are represented, including signed fractions, magnitudes below one, wholly integral values, and far return. +1020:10be FUN_1020_10be Code5 95 verified borland_real48_sqrt reconstructed/tdkpin_real48.c disassembly 1020:10be-111c; verified Real48 divide/add/subtract preserving cores; original-byte DOSBox Sqrt probe; ASan/UBSan reconstructed/tests/test_real48.c Exact zero identity, negative Runtime Error 207, signed-byte initial exponent transform with retained mantissa, Newton quotient-plus-guess/2 iteration, exponent-of-difference convergence threshold, and bit-exact outputs for 1, 2, 4, and 1.5 match the unmodified routine. +1020:111d runtime_1020_111d Code5 116 verified borland_real48_cos reconstructed/tdkpin_real48.c disassembly 1020:111d-1190; shared Sin entry 1130; 2pi/pi reductions and table 1191-11ba; original-offset DOSBox Sin/Cos probe; ASan/UBSan tests Exact pi/2-x Cos prelude, modulo-2pi via Frac, negative remainder correction, pi/pi2 quadrant folding, exponent-6c small-argument bypass, seven-term odd Sin polynomial, half-cycle sign, and far return match original bytes for zero, pi/6, pi/2, pi, 2pi, -pi/2, and one. +1020:11bb runtime_1020_11bb Code5 133 verified borland_real48_ln reconstructed/tdkpin_real48.c disassembly 1020:11bb-123f; coefficient table 1240-1263; sqrt(1/2), ln(2)/2, ln(2) constants; original-offset DOSBox Ln probe; ASan/UBSan tests Exact positive-domain Runtime Error 207, exponent displacement, normalized mantissa times sqrt(1/2), (m-1)/(m+1), six-term odd atanh series, doubling, ln(2)/2 correction, exponent*ln(2) addition, exponent-67 flush, and outputs for 0.5,1,1.5,2,10 match original bytes. +1020:1264 runtime_1020_1264 Code5 115 verified borland_real48_exp reconstructed/tdkpin_real48.c disassembly 1020:1264-12d6; coefficient table 12d7-1306; verified conversion/arithmetic primitives; original-offset DOSBox Exp probe; ASan/UBSan tests Exact absolute-value reduction by ln(2), exponent-88 overflow gate, Round(2q), q-n/2 remainder, eight-term polynomial, odd sqrt(2) factor, exponent-byte scaling/carry Error 205, negative reciprocal, and outputs for -2,-1,-0.5,0,0.5,1,2,10 match original bytes. +1020:1307 runtime_1020_1307 Code5 225 verified borland_real48_arctan reconstructed/tdkpin_real48.c disassembly 1020:1307-13e7; reduction table 13e8-1417; verified 1436/143c/1455; original-offset DOSBox ArcTan probe; ASan/UBSan tests Exact sign capture, >=1 reciprocal, direct threshold, tan(pi/12)/tan(pi/6)/1 reductions with angle additions, pi/2 reciprocal correction, final sign, zero path, and outputs for 0,0.125,0.5,1,2,-1 match original bytes. +1020:1436 runtime_1020_1436 Code5 6 verified borland_real48_arctan_series reconstructed/tdkpin_real48.c disassembly 1020:1436-143b loads table 1418/count 5 then falls through 143c; exact coefficient bytes; original-offset DOSBox probe; reconstructed/tests/test_real48.c Exact fixed ArcTan odd-series entry and fallthrough are represented; zero, 0.25, 0.5, and tan(pi/8) outputs match the original bytes exactly. +1020:143c FUN_1020_143c Code5 25 verified borland_real48_odd_polynomial reconstructed/tdkpin_real48.c disassembly 1020:143c-1454; verified multiply core and 1455 evaluator; reconstructed/tests/test_real48.c Exact x*x staging, caller-supplied CS table/count, polynomial evaluation, restored x, and tail multiply producing x*P(x*x) are represented without host floating point. +1020:1455 FUN_1020_1455 Code5 79 verified borland_real48_polynomial_plus_one reconstructed/tdkpin_real48.c disassembly 1020:1455-14a3; exact local input save, CS coefficient order, multiply-before-advance loop, add/multiply sequence, final +1; DOSBox probe Exact Horner order result=1+x*(c[n-1]+x*(...+x*c[0])), Real48 rounding after every primitive, table stride six, and count-controlled loop are represented and differentially exercised through ArcTan. +1020:14a4 FUN_1020_14a4 Code5 29 verified borland_random_below reconstructed/tdkpin_random.c disassembly 1020:14a4-14c0; verified LCG; high-product tests Exact seed advance and high 32 bits of unsigned seed*uint16 bound represented and verified, including bound zero. +1020:14c1 FUN_1020_14c1 Code5 29 verified borland_random_exponent reconstructed/tdkpin_random.c disassembly 1020:14c1-14dd; leading-bit test Exact seed advance, zero special case, 32-step MSB search, and signed int8 exponent sequence verified. +1020:14de runtime_1020_14de Code5 29 verified borland_random_unit_interval reconstructed/tdkpin_random.c disassembly 1020:14de-14fa; embedded IEEE single 2^31 at 14fb and signed scale -32 at 14ff; verified 1501 dependency; reconstructed/tests/test_random.c Exact next-seed call, signed FILD plus 2^31 unsigned correction, FSCALE by -32, x87 stack cleanup, and [0,1) result are represented; binary64 is exact for every uint32/2^32 output. +1020:1501 FUN_1020_1501 Code5 54 verified borland_next_random reconstructed/tdkpin_random.c disassembly 1020:1501-1536; embedded multiplier word 1537; independent LCG tests Word-level multiply/add sequence is exactly equivalent to modulo-2^32 seed*0x08088405+1 and verified across chained calls. +1020:1539 runtime_1020_1539 Code5 13 verified borland_seed_random_from_dos_time reconstructed/tdkpin_random.c disassembly 1020:1539-1545; DOS int21 AH=2c register contract; bound DOS-time word test Exact CX low word and DX high word assignment to RandSeed represented and verified. +1020:1546 FUN_1020_1546 Code5 28 verified borland_format_i32_decimal_backward reconstructed/tdkpin_numeric.c disassembly 1020:1546-1561; negative/ordinary formatting tests Exact signed high-word test, two's-complement magnitude, base 10 handoff, prefix minus store, start pointer, and length increment verified. +1020:1562 FUN_1020_1562 Code5 32 verified borland_format_u32_backward reconstructed/tdkpin_numeric.c disassembly 1020:1562-1581; decimal/hex backward-format tests Exact two-word unsigned division loop, uppercase digit mapping, pre-decrement far writes, zero representation, start pointer, and length verified. +1020:1582 FUN_1020_1582 Code5 167 verified borland_parse_i32_span reconstructed/tdkpin_numeric.c disassembly 1020:1582-1628; signed/hex/overflow/trailing tests Exact optional sign, decimal and $-hex grammars, lowercase fold, shift/multiply overflow gates, full-hex signed exception, cursor/remaining words, carry failure, and int32 result verified. +1020:1629 FUN_1020_1629 Code5 75 verified borland_format_i32_short_string reconstructed/tdkpin_numeric.c disassembly 1020:1629-1673; verified backward formatter 1546; exact 32-byte local workspace and 12-byte Pascal frame; reconstructed/tests/test_numeric.c Exact signed maximum/field-width clamps, formatted-length clamp, width promotion, low-byte ShortString length, left space padding, leading-byte truncation, forward copy, DS restoration semantics, and RETF 0x0c are represented and tested. +1020:1674 FUN_1020_1674 Code5 49 verified borland_val_i32_short_string reconstructed/tdkpin_numeric.c disassembly 1020:1674-16a4; leading-space/success/error-position tests Exact ShortString length, leading-space skip, parser span, trailing/carry failure, one-based error position, zero-on-error, and value return verified. +1020:16a5 FUN_1020_16a5 Code5 36 verified borland_move_bytes reconstructed/tdkpin_borland_runtime.c disassembly 1020:16a5-16c8; NE entry 282; reconstructed/tests/test_heap_reserve.c Exact far source/destination selectors, uint16 count, offset-only direction choice, CLD/STD overlap behavior, 16-bit offset arithmetic, and zero count are represented and branch-tested. +1020:16c9 FUN_1020_16c9 Code5 20 verified borland_fill_bytes reconstructed/tdkpin_borland_runtime.c disassembly 1020:16c9-16dc; selector-backed fill test Exact destination far pointer, full 16-bit count, low-byte value, forward CLD semantics, and repeated stores verified. +1020:16dd runtime_1020_16dd Code5 4 verified borland_find_dynamic_method reconstructed/tdkpin_dispatch.c disassembly 1020:16dd-16e0; verified 1020:16e6; reconstructed/tests/test_dispatch.c Exact public lookup entry and returned DGROUP address of the selected far-procedure slot are represented and tested. +1020:16e1 FUN_1020_16e1 Code5 5 verified borland_dispatch_dynamic_method reconstructed/tdkpin_dispatch.c disassembly 1020:16e1-16e5; verified 1020:16e6; call sites 1008:2d66 and 1018:16eb; reconstructed/tests/test_dispatch.c Exact lookup followed by FF /5 far-indirect dispatch through the four-byte procedure slot is represented and tested. +1020:16e6 FUN_1020_16e6 Code5 61 verified borland_resolve_dynamic_method_slot reconstructed/tdkpin_dispatch.c disassembly 1020:16e6-1722; synthetic table branch tests in reconstructed/tests/test_dispatch.c Exact VMT +4 table pointer, mutable id/slot cache, uint16 id scan, target-slot stride, parent chain, cache update, and Runtime Error 210 miss path are represented and branch-tested. diff --git a/original/IMPORT_RECONSTRUCTION.tsv b/original/IMPORT_RECONSTRUCTION.tsv new file mode 100644 index 0000000..ca1a783 --- /dev/null +++ b/original/IMPORT_RECONSTRUCTION.tsv @@ -0,0 +1,293 @@ +address library import_name stack_purge_bytes call_sites status stage prototype evidence notes +1228:0000 KERNEL GETVERSION 0 2 verified binary-reviewed pascal16 dword GetVersion() disassembly 1000:fdb0-fdf2 and 1010:05ad-05c9; Wine 11.15 KERNEL ordinal 3; program-entry and multimedia-startup tests Both call sites take no arguments; the NE entry preserves DX:AX while the multimedia unit stores AX only, and both decode low-byte major/high-byte minor exactly. +1228:0004 KERNEL GLOBALALLOC 6 3 verified binary-reviewed pascal16 -ret16 GlobalAlloc(word long) Wine 11.15 ordinal 15 prototype; call sites 1008:15c7, 1018:01dc, and 1020:0222; focused global-memory, thunk-pool, and heap tests All calls have exact flags/uint32 byte order, handle use, and failure behavior represented; uses are application locked blocks, 256-byte executable thunk pools, and Borland heap blocks. +1228:0008 KERNEL GLOBALFREE 2 2 verified binary-reviewed pascal16 -ret16 GlobalFree(word) Wine 11.15 ordinal 17 prototype; call sites 1008:15e7 and 1020:035b; reconstructed/tests/test_global_memory.c and test_heap_paths.c Both calls pass a GlobalHandle-derived HGLOBAL after GlobalUnlock and ignore the returned handle exactly. +1228:000c KERNEL GLOBALLOCK 2 3 verified binary-reviewed pascal16 GlobalLock(word) Wine 11.15 ordinal 18 prototype; call sites 1008:15c7, 1018:01dc, and 1020:0222; focused global-memory, thunk-pool, and heap tests All calls pass the immediately returned HGLOBAL and preserve the resulting 16:16 pointer, including the unguarded thunk-pool lock and guarded Borland allocator path. +1228:0010 KERNEL GLOBALUNLOCK 2 5 verified binary-reviewed pascal16 -ret16 GlobalUnlock(word) Wine 11.15 KERNEL ordinal 19 prototype; call sites 1008:10c3,139c,15ab,15f6 and 1020:0356; focused sound/palette/bitmap/global-memory/heap tests All five calls are verified: three loaded-resource handles after copy/use and two GlobalHandle-derived allocations before GlobalFree; every BOOL16 return is ignored. +1228:0014 KERNEL GLOBALHANDLE 2 2 verified binary-reviewed pascal16 GlobalHandle(word) Wine 11.15 ordinal 21 prototype; call sites 1008:15ef and 1020:034b; reconstructed/tests/test_global_memory.c and test_heap_paths.c Both calls pass only the selector half of a far pointer; zero handles suppress freeing and nonzero handles feed the reviewed unlock/free sequence. +1228:0018 KERNEL GLOBALCOMPACT 4 1 verified callsite-reviewed pascal16 GlobalCompact(long) Wine wine-11.15 krnl386.exe16.spec line 28; disassembly 1020:019a-01c5 The sole call passes uint32 zero, preserves a high-word nonzero result, otherwise compares the low word with local free-byte counts. +1228:001c KERNEL WAITEVENT 2 1 verified binary-reviewed pascal16 -ret16 WaitEvent(word) disassembly 1020:0023-002a; Wine 11.15 KERNEL ordinal 30 prototype; reconstructed/tests/test_borland_startup.c Sole call pushes literal zero before startup InitApp; no return value is consumed, and ordering plus argument are tested. +1228:0020 KERNEL GETCURRENTTASK 0 2 verified binary-reviewed pascal16 GetCurrentTask() Wine 11.15 KERNEL ordinal 36 prototype; call sites 1010:008e and 1010:0327; reconstructed/tests/test_multimedia.c Finalizer passes the task to CTL3DUNREGISTER; loader passes it to CTL3DREGISTER. Both dynamic targets, returns, guards, and cleanup are verified. +1228:0024 KERNEL GETMODULEHANDLE 4 1 verified binary-reviewed pascal16 GetModuleHandle(segstr) Wine 11.15 KERNEL ordinal 47 prototype; sole call at 1010:013e; reconstructed/tests/test_multimedia.c The sole call passes the original far module-name argument; its HINSTANCE16 feeds GetModuleFileName for the fourth CTL3D search location. +1228:0028 KERNEL GETMODULEFILENAME 8 3 verified binary-reviewed pascal16 -ret16 GetModuleFileName(HINSTANCE16 segptr uint16) disassembly call sites 1008:25ca, 1010:0148, 1020:084c; Wine 11.15 KERNEL ordinal 49; focused TPWinCrt, multimedia, and command-line tests All three call sites have exact module, far-buffer, maximum-size, return-use, and in-place follow-up semantics represented. +1228:002c KERNEL GETPROCADDRESS 6 11 verified binary-reviewed pascal16 GetProcAddress(word str) Wine 11.15 KERNEL ordinal 50 prototype; eleven call sites 1010:0238-031b; reconstructed/tests/test_multimedia.c All calls pass the loaded HINSTANCE16 and exact ordered CTL3D names; far returns populate slots 0-10, except legacy Windows deliberately zeros slot 8 without calling the import. +1228:0030 KERNEL MAKEPROCINSTANCE 6 1 verified binary-reviewed pascal16 MakeProcInstance(segptr word) Wine 11.15 ordinal 51 prototype; sole call at 1018:1ac7; relocation to 1018:0133; reconstructed/tests/test_application.c The sole call passes the relocated bound-dispatch procedure and current HINSTANCE16, then stores the returned far proc instance in 1028:0672/0674. +1228:0034 KERNEL FREEPROCINSTANCE 4 1 verified binary-reviewed pascal16 -ret16 FreeProcInstance(segptr) Wine 11.15 ordinal 52 prototype; sole call at 1018:1b15; reconstructed/tests/test_application.c The sole call releases exactly the stored bound-dispatch proc instance before root/application allocation destruction; return is ignored. +1228:0038 KERNEL FINDRESOURCE 10 3 verified binary-reviewed pascal16 -ret16 FindResource(word str str) Wine 11.15 KERNEL ordinal 60 prototype; call sites 1008:1061,133c,14b3; sound/palette/bitmap harnesses All calls pass the current HINSTANCE16, exact name/MAKEINTRESOURCE far pointer, and custom type WAV, pal, or DAT; result chaining and lack of failure checks are represented. +1228:003c KERNEL LOADRESOURCE 4 3 verified binary-reviewed pascal16 -ret16 LoadResource(word word) Wine 11.15 KERNEL ordinal 61 prototype; call sites 1008:1067,134a,14c1; sound/palette/bitmap harnesses All calls pass current HINSTANCE16 plus the preceding HRSRC16, preserve the HGLOBAL16, and perform no failure check. +1228:0040 KERNEL LOCKRESOURCE 2 3 verified binary-reviewed pascal16 LockResource(word) Wine 11.15 KERNEL ordinal 62 prototype; call sites 1008:1095,1355,14cc; sound/palette/bitmap harnesses All calls receive the immediately loaded HGLOBAL16 and preserve the returned far pointer for byte copy, DIB header/bits, or waveform data. +1228:0044 KERNEL FREERESOURCE 2 2 verified binary-reviewed pascal16 -ret16 FreeResource(word) Wine 11.15 KERNEL ordinal 63 prototype; call sites 1008:10cb and 15b3; sound/bitmap harnesses Both calls occur after GlobalUnlock on the same resource handle and ignore BOOL16; the palette loader's intentional Unlock-only behavior is separately verified. +1228:0048 KERNEL _LCLOSE 2 2 verified call-sites-verified HFILE16 LClose16(HFILE16 file) Wine wine-11.15 ordinal 81 prototype; disassembly 1000:a8ea-a99b and a99c-ab3b; reconstructed/tdkpin_highscores.c; reconstructed/tests/test_highscores.c Both call sites close only successfully created/opened HiScores.Dat handles; load closes after valid or invalid header, save closes after all writes, returns are intentionally ignored, and no close occurs after -1. +1228:004c KERNEL _LREAD 8 3 verified call-sites-verified UINT16 LRead16(HFILE16 file, Win16FarPtr bytes, UINT16 byte_count) Wine wine-11.15 ordinal 82 prototype; disassembly 1000:a9d1-aa2e; reconstructed/tdkpin_highscores.c; reconstructed/tests/test_highscores.c All calls use an opened HiScores.Dat handle: 16 bytes to SS header, then only after header equality 40 bytes to SS encrypted scores and 220 bytes directly to DGROUP 08a6; all returns are deliberately ignored and short-read residue/tail effects are modeled and tested. +1228:0050 KERNEL _LCREAT 6 1 verified call-sites-verified HFILE16 LCreate16(Win16FarPtr file_name, INT16 attributes) Wine wine-11.15 ordinal 83 prototype; disassembly 1000:a8ee-a8fa; reconstructed/tdkpin_highscores.c; reconstructed/tests/test_highscores.c "Sole call passes DGROUP 0312 ""HiScores.Dat"" and attribute zero; signed -1 failure skips buffer construction, writes, and close; success handle is retained exactly." +1228:0054 KERNEL _LOPEN 6 2 verified call-sites-verified HFILE16 LOpen16(Win16FarPtr file_name, INT16 mode) Wine wine-11.15 ordinal 85 prototype; disassembly 1000:a9a4-a9c8; reconstructed/tdkpin_highscores.c; reconstructed/tests/test_highscores.c "Both calls use DGROUP 0320 ""HiScores.Dat""; mode zero is tried first and exactly on signed -1 mode 0x40 is retried; a second -1 selects defaults without read or close, and all branches are tested." +1228:0058 KERNEL _LWRITE 8 3 verified call-sites-verified UINT16 LWrite16(HFILE16 file, Win16FarPtr bytes, UINT16 byte_count) Wine wine-11.15 ordinal 86 prototype; disassembly 1000:a961-a990; reconstructed/tdkpin_highscores.c; reconstructed/tests/test_highscores.c All three calls use the successful HFILE and write header DGROUP 0014/16 bytes, encrypted-score SS buffer/40 bytes, then name SS buffer/220 bytes; every return is deliberately ignored and byte order is tested. +1228:005c KERNEL INITTASK 0 1 verified binary-reviewed pascal16 -register InitTask() disassembly 1000:fd85-fd8e and 1020:0002 register stores; Wine 11.15 KERNEL ordinal 91; reconstructed/tests/test_program_entry.c Sole register-return call supplies AX loader gate, ES:BX command line, DX show command, SI previous instance, and DI current instance directly to verified Borland startup. +1228:0060 KERNEL LOADLIBRARY 4 2 verified binary-reviewed pascal16 -ret16 LoadLibrary(str) Wine 11.15 KERNEL ordinal 95 prototype; modern and located-legacy calls at 1010:01f8/0216; reconstructed/tests/test_multimedia.c Both calls pass the mutable CTL3D path buffer; direct and locator-gated branches, <32 error handles, successful module lifecycle, and skipped-load failure are verified. +1228:0064 KERNEL FREELIBRARY 2 1 verified callsite-reviewed pascal16 -ret16 FreeLibrary(word) Wine wine-11.15 krnl386.exe16.spec line 100; disassembly 1010:0007-0016 The sole call is guarded by module handle >=32, passes that handle, ignores BOOL16, and intentionally leaves the stored handle unchanged while clearing proc slots. +1228:0068 KERNEL SETERRORMODE 2 2 verified binary-reviewed pascal16 -ret16 SetErrorMode(word) Wine 11.15 KERNEL ordinal 107 prototype; calls 1010:01f9/020d; reconstructed/tests/test_multimedia.c Modern loading sets 0x8000 immediately before LoadLibrary and 0 immediately after, ignores both returns, and legacy loading skips both calls; ordering is tested. +1228:006c KERNEL __AHINCR 2147483647 0 verified runtime-data equate16 __AHINCR = 8 Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L118 Wine Win16 ordinal 114; this is runtime data, not a callable function. +1228:0070 KERNEL GETPRIVATEPROFILEINT 14 3 verified call-sites-verified pascal16 -ret16 GetPrivateProfileInt(str str s_word str) Wine 11.15 KERNEL ordinal 127 prototype; disassembly 1008:1095-10b1; reconstructed/tests/test_sound.c; all 3 direct call sites map to verified address-linked function rows and readable C All 3 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:0074 KERNEL GETDOSENVIRONMENT 0 1 verified binary-reviewed pascal16 segptr GetDOSEnvironment() disassembly 1008:2821-283a; Wine 11.15 KERNEL ordinal 131; reconstructed/tests/test_multimedia_paths.c Sole no-argument call returns the far base of the double-NUL DOS environment block; traversal preserves selector and returns a pointer immediately after matching NAME=. +1228:0078 KERNEL GETWINFLAGS 0 1 verified binary-reviewed pascal16 dword GetWinFlags() disassembly 1020:0038-0049; Wine 11.15 KERNEL ordinal 132 prototype; reconstructed/tests/test_borland_startup.c Sole call takes no arguments; only returned AL bits c0 and 02 classify 086/186, 286, or 386-plus arithmetic paths, including ignored upper bits. +1228:007c KERNEL GETWINDOWSDIRECTORY 6 1 verified binary-reviewed pascal16 -ret16 GetWindowsDirectory(ptr word) Wine 11.15 KERNEL ordinal 134 prototype; sole call at 1010:00df; reconstructed/tests/test_multimedia.c The sole call receives the 256-byte search buffer with maximum 0xff; its return is ignored and resulting directory becomes the second CTL3D search location. +1228:0080 KERNEL GETSYSTEMDIRECTORY 6 2 verified binary-reviewed pascal16 -ret16 GetSystemDirectory(segptr uint16) disassembly 1010:0107-0116 and 0476-0483; Wine 11.15 KERNEL ordinal 135; multimedia tests Locator uses a 255-byte stack buffer; unit startup uses the exact 200-byte DGROUP buffer and retains the returned length as its path-probe gate. +1228:0084 KERNEL GETFREESPACE 2 1 verified callsite-reviewed pascal16 GetFreeSpace(word) Wine wine-11.15 krnl386.exe16.spec line 172; disassembly 1020:016c-0190 The sole call passes 0x1000 and its uint32 result receives every local segment's uint16 free-byte count with carry. +1228:0088 KERNEL ALLOCCSTODSALIAS 2 2 verified binary-reviewed pascal16 -ret16 AllocCStoDSAlias(word) Wine 11.15 ordinal 170 prototype; call sites 1018:02bb and 1018:030c; reconstructed/tests/test_bound_thunks.c Allocate and release each alias the thunk's code selector, preserve its offset, patch through the returned writable selector, and free that alias afterward. +1228:008c KERNEL FREESELECTOR 2 2 verified binary-reviewed pascal16 -ret16 FreeSelector(word) Wine 11.15 ordinal 176 prototype; call sites 1018:02e9 and 1018:0329; reconstructed/tests/test_bound_thunks.c Both calls release exactly the temporary CS-to-DS alias returned for the current thunk and ignore the result. +1228:0090 KERNEL PRESTOCHANGOSELECTOR 4 1 verified binary-reviewed pascal16 -ret16 PrestoChangoSelector(word word) Wine 11.15 ordinal 177 prototype; sole call at 1018:029f; reconstructed/tests/test_bound_thunks.c The generated-pool selector is passed as both source and destination after all bytes are initialized, converting the locked block for executable thunk use; return is ignored. +1228:0094 MMTIMER SYSTEMTIMERMAKE 8 1 verified binary-reviewed pascal16 -ret16 SystemTimerMake(HWND16 recipient, word delay_ms, word resolution_ms, word one_shot) MMTIMER.DLL 1000:0039 disassembly; export ordinal 1; f1d9ac980c7bfba5dc53eaa9e7cb2c3cd9b82f879ee8962ad40bf863d641bb49 Binary-reviewed wrapper around timeSetEvent16: it installs MMTIMER 1000:0002, posts message 0x0580 to recipient, and returns the multimedia timer id. +1228:0098 MMSYSTEM SNDPLAYSOUND 6 4 verified binary-reviewed pascal16 sndPlaySound(ptr word) Wine 11.15 MMSYSTEM ordinal 2 prototype; call sites 1008:10ff,1164,1177,11ab; reconstructed/tests/test_sound.c All four calls are verified: NULL/0 stop in unload/play/stop helper, and loaded far sound/flags 5 playback with BOOL result stored to Playing. +1228:009c MMSYSTEM WAVEOUTGETNUMDEVS 0 1 verified binary-reviewed pascal16 waveOutGetNumDevs() Wine 11.15 MMSYSTEM ordinal 401 prototype; disassembly 1008:0fb8-0fc7; reconstructed/tests/test_sound.c The sole call has no arguments, stores the UINT16 device count at DGROUP 43ee, and returns early on zero; count and branch semantics are verified. +1228:00a0 MMSYSTEM WAVEOUTGETDEVCAPS 8 1 verified binary-reviewed pascal16 waveOutGetDevCaps(word ptr word) Wine 11.15 MMSYSTEM ordinal 402 prototype; disassembly 1008:0fca-0fe5; exact WAVEOUTCAPS16; reconstructed/tests/test_sound.c The sole call passes zero-filled device id 43f0, far DGROUP buffer 43be, and exact size 48; MMRESULT zero succeeds and failure clears device count. +1228:00a4 MMSYSTEM WAVEOUTGETVOLUME 6 1 verified binary-reviewed pascal16 waveOutGetVolume(word ptr) Wine 11.15 MMSYSTEM ordinal 415 prototype; disassembly 1008:1000-1027; reconstructed/tests/test_sound.c The sole conditional call passes device id 43f0 and a zeroed stack DWORD; its return is ignored and bits 8..15 of volume are rounded down to a multiple of ten. +1228:00a8 MMSYSTEM TIMEKILLEVENT 2147483647 1 verified binary-reviewed pascal16 timeKillEvent(word) Wine wine-11.15 MMSYSTEM ordinal 603 prototype; disassembly 1008:2932-295b; reconstructed/tests/test_system_timer.c The sole call passes the nonzero uint16 timer id from object offset +2, ignores the MMRESULT, and unconditionally clears the stored id afterward. +1228:00ac KERNEL GETVERSION 0 0 verified unused-slot-verified pascal16 GetVersion() Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L6; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:00b0 KERNEL GLOBALALLOC 6 0 verified unused-slot-verified pascal16 -ret16 GlobalAlloc(word long) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L18; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:00b4 KERNEL GLOBALFREE 2 0 verified unused-slot-verified pascal16 -ret16 GlobalFree(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L20; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:00b8 KERNEL GLOBALLOCK 2 0 verified unused-slot-verified pascal16 GlobalLock(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L21; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:00bc KERNEL GLOBALUNLOCK 2 0 verified unused-slot-verified pascal16 -ret16 GlobalUnlock(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L22; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:00c0 KERNEL GLOBALHANDLE 2 0 verified unused-slot-verified pascal16 GlobalHandle(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L24; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:00c4 KERNEL GLOBALCOMPACT 4 0 verified unused-slot-verified pascal16 GlobalCompact(long) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L28; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:00c8 KERNEL WAITEVENT 2 0 verified unused-slot-verified pascal16 -ret16 WaitEvent(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L33; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:00cc KERNEL GETCURRENTTASK 0 0 verified unused-slot-verified pascal16 GetCurrentTask() Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L39; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:00d0 KERNEL GETMODULEHANDLE 4 0 verified unused-slot-verified pascal16 GetModuleHandle(segstr) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L50; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:00d4 KERNEL GETMODULEFILENAME 8 0 verified unused-slot-verified pascal16 -ret16 GetModuleFileName(word ptr s_word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L52; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:00d8 KERNEL GETPROCADDRESS 6 0 verified unused-slot-verified pascal16 GetProcAddress(word str) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L53; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:00dc KERNEL MAKEPROCINSTANCE 6 0 verified unused-slot-verified pascal16 MakeProcInstance(segptr word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L54; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:00e0 KERNEL FREEPROCINSTANCE 4 0 verified unused-slot-verified pascal16 -ret16 FreeProcInstance(segptr) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L55; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:00e4 KERNEL FINDRESOURCE 10 0 verified unused-slot-verified pascal16 -ret16 FindResource(word str str) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L63; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:00e8 KERNEL LOADRESOURCE 4 0 verified unused-slot-verified pascal16 -ret16 LoadResource(word word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L64; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:00ec KERNEL LOCKRESOURCE 2 0 verified unused-slot-verified pascal16 LockResource(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L65; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:00f0 KERNEL FREERESOURCE 2 0 verified unused-slot-verified pascal16 -ret16 FreeResource(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L66; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:00f4 KERNEL _LCLOSE 2 0 verified unused-slot-verified pascal16 -ret16 _lclose(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L85; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:00f8 KERNEL _LREAD 8 0 verified unused-slot-verified pascal16 -ret16 _lread(word segptr word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L86; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:00fc KERNEL _LCREAT 6 0 verified unused-slot-verified pascal16 -ret16 _lcreat(str word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L87; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0100 KERNEL _LOPEN 6 0 verified unused-slot-verified pascal16 -ret16 _lopen(str word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L89; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0104 KERNEL _LWRITE 8 0 verified unused-slot-verified pascal16 -ret16 _lwrite(word ptr word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L90; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0108 KERNEL INITTASK 0 0 verified unused-slot-verified pascal16 -register InitTask() Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L95; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:010c KERNEL LOADLIBRARY 4 0 verified unused-slot-verified pascal16 -ret16 LoadLibrary(str) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L99; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0110 KERNEL FREELIBRARY 2 0 verified unused-slot-verified pascal16 -ret16 FreeLibrary(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L100; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0114 KERNEL SETERRORMODE 2 0 verified unused-slot-verified pascal16 -ret16 SetErrorMode(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L111; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0118 KERNEL __AHINCR 2147483647 0 verified runtime-data equate16 __AHINCR = 8 Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L118 Wine Win16 ordinal 114; this is runtime data, not a callable function. +1228:011c KERNEL GETPRIVATEPROFILEINT 14 0 verified unused-slot-verified pascal16 -ret16 GetPrivateProfileInt(str str s_word str) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L131; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0120 KERNEL GETDOSENVIRONMENT 0 0 verified unused-slot-verified pascal16 GetDOSEnvironment() Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L135; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0124 KERNEL GETWINFLAGS 0 0 verified unused-slot-verified pascal16 GetWinFlags() Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L136; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0128 KERNEL GETWINDOWSDIRECTORY 6 0 verified unused-slot-verified pascal16 -ret16 GetWindowsDirectory(ptr word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L138; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:012c KERNEL GETSYSTEMDIRECTORY 6 0 verified unused-slot-verified pascal16 -ret16 GetSystemDirectory(ptr word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L139; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0130 KERNEL GETFREESPACE 2 0 verified unused-slot-verified pascal16 GetFreeSpace(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L172; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0134 KERNEL ALLOCCSTODSALIAS 2 0 verified unused-slot-verified pascal16 -ret16 AllocCStoDSAlias(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L173; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0138 KERNEL FREESELECTOR 2 0 verified unused-slot-verified pascal16 -ret16 FreeSelector(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L179; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:013c KERNEL PRESTOCHANGOSELECTOR 4 0 verified unused-slot-verified pascal16 -ret16 PrestoChangoSelector(word word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L180; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0140 GDI SETBKCOLOR 6 1 verified call-sites-verified pascal16 SetBkColor(word long) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/gdi.exe16/gdi.exe16.spec#L1; all 1 direct call sites map to verified address-linked function rows and readable C All 1 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:0144 GDI SETBKMODE 4 2 verified call-sites-verified INT16 SetBkMode16(HDC16 dc, INT16 mode) Wine wine-11.15 ordinal 2 prototype; disassembly 1000:5ca2-5ca8 and 5e93-5e9b; reconstructed/tdkpin_highscores.c; reconstructed/tests/test_highscores.c Both calls target the 300x360 buffer DC: mode 1 is installed and its exact return saved, then that saved mode is restored after drawing; sequence and arguments are tested. +1228:0148 GDI SETTEXTCOLOR 6 3 verified call-sites-verified pascal16 SetTextColor(word long) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/gdi.exe16/gdi.exe16.spec#L9; all 3 direct call sites map to verified address-linked function rows and readable C All 3 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:014c GDI TEXTOUT 12 5 verified call-sites-verified pascal16 -ret16 TextOut(word s_word s_word str word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/gdi.exe16/gdi.exe16.spec#L33; all 5 direct call sites map to verified address-linked function rows and readable C All 5 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:0150 GDI BITBLT 20 95 verified call-sites-verified pascal16 -ret16 BitBlt(word s_word s_word s_word s_word word s_word s_word long) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/gdi.exe16/gdi.exe16.spec#L34; all 95 direct call sites map to verified address-linked function rows and readable C All 95 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:0154 GDI SELECTOBJECT 4 99 verified call-sites-verified pascal16 -ret16 SelectObject(word word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/gdi.exe16/gdi.exe16.spec#L45; all 99 direct call sites map to verified address-linked function rows and readable C All 99 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:0158 GDI CREATECOMPATIBLEBITMAP 6 11 verified call-sites-verified pascal16 -ret16 CreateCompatibleBitmap(word word word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/gdi.exe16/gdi.exe16.spec#L51; all 11 direct call sites map to verified address-linked function rows and readable C All 11 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:015c GDI CREATECOMPATIBLEDC 2 41 verified call-sites-verified pascal16 -ret16 CreateCompatibleDC(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/gdi.exe16/gdi.exe16.spec#L52; all 41 direct call sites map to verified address-linked function rows and readable C All 41 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:0160 GDI CREATEDC 16 1 verified binary-reviewed pascal16 -ret16 CreateDC(str str str ptr) Wine 11.15 GDI ordinal 53 prototype; sole call 1008:1537-154c; reconstructed/tests/test_bitmap_loader.c "The sole call passes far ""Display"" plus null device, output, and initialization-data pointers; returned HDC owns the palette/CreateDIBitmap sequence and is deleted exactly once." +1228:0164 GDI DELETEDC 2 40 verified call-sites-verified pascal16 -ret16 DeleteDC(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/gdi.exe16/gdi.exe16.spec#L68; all 40 direct call sites map to verified address-linked function rows and readable C All 40 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:0168 GDI DELETEOBJECT 2 29 verified call-sites-verified pascal16 -ret16 DeleteObject(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/gdi.exe16/gdi.exe16.spec#L69; all 29 direct call sites map to verified address-linked function rows and readable C All 29 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:016c GDI GETSTOCKOBJECT 2 4 verified call-sites-verified pascal16 -ret16 GetStockObject(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/gdi.exe16/gdi.exe16.spec#L87; all 4 direct call sites map to verified address-linked function rows and readable C All 4 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:0170 GDI GETTEXTCOLOR 2 1 verified call-sites-verified COLORREF16 GetTextColor16(HDC16 dc) Wine wine-11.15 ordinal 90 prototype; disassembly 1000:5c85-5c91; reconstructed/tdkpin_highscores.c; reconstructed/tests/test_highscores.c Sole call reads the newly created buffer DC text color as a full DX:AX COLORREF, which is restored after all text rendering; full-dword behavior is tested. +1228:0174 GDI GETTEXTMETRICS 6 1 verified callsite-reviewed pascal16 -ret16 GetTextMetrics(word ptr) Wine wine-11.15 gdi.exe16.spec line 93; disassembly 1008:1ff1-1ffe The sole call passes the active TPWinCrt HDC and a far SS pointer to an exact 31-byte TEXTMETRIC16; BOOL16 is intentionally ignored. +1228:0178 GDI UNREALIZEOBJECT 2 4 verified call-sites-verified pascal16 -ret16 UnrealizeObject(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/gdi.exe16/gdi.exe16.spec#L142; all 4 direct call sites map to verified address-linked function rows and readable C All 4 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:017c GDI SETTEXTALIGN 4 4 verified call-sites-verified UINT16 SetTextAlign16(HDC16 dc, UINT16 alignment) Wine wine-11.15 ordinal 346 prototype; disassembly 1000:5c94-5c9f,5d2e-5d39,5df5-5e00,5e87-5e93; reconstructed/tdkpin_highscores.c; reconstructed/tests/test_highscores.c All static call sites target the buffer DC: initial 6 saves old alignment, every name row uses 0, every score row uses 2, and cleanup restores the saved value; exact 22 dynamic calls are tested. +1228:0180 GDI CREATEPALETTE 4 2 verified binary-reviewed pascal16 -ret16 CreatePalette(ptr) Wine 11.15 GDI ordinal 360 prototype; call sites 1008:009a and 12f7; reconstructed/tests/test_palette_gdi.c and test_palette.c Both exact LOGPALETTE256 pointers are verified: temporary all-black PC_NOCOLLAPSE realization and persistent RGB-table palette publication. +1228:0184 GDI UPDATECOLORS 2 3 verified call-sites-verified pascal16 -ret16 UpdateColors(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/gdi.exe16/gdi.exe16.spec#L267; all 3 direct call sites map to verified address-linked function rows and readable C All 3 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:0188 GDI CREATEDIBITMAP 20 1 verified binary-reviewed pascal16 -ret16 CreateDIBitmap(word ptr long ptr ptr word) Wine 11.15 GDI ordinal 442 prototype; sole call 1008:1572-1590; reconstructed/tests/test_bitmap_loader.c The sole call passes Display HDC, stack BITMAPINFOHEADER16, DWORD CBM_INIT=4, DAT bits at resource+40, allocated BGR0 BITMAPINFO, and DIB_RGB_COLORS=0; returned HBITMAP is propagated. +1228:018c USER MESSAGEBOX 12 6 verified call-sites-verified pascal16 -ret16 MessageBox(word str str word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L1; all 6 direct call sites map to verified address-linked function rows and readable C All 6 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:0190 USER INITAPP 2 1 verified binary-reviewed pascal16 -ret16 InitApp(HINSTANCE16) disassembly 1020:002b-0037; Wine 11.15 USER ordinal 5 prototype; reconstructed/tests/test_borland_startup.c Sole call receives the captured DI instance after WaitEvent(0); zero return terminates through DOS with status ff, nonzero continues to CPU detection. +1228:0194 USER POSTQUITMESSAGE 0 3 verified call-sites-verified pascal16 -ret16 PostQuitMessage(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L6; all 3 direct call sites map to verified address-linked function rows and readable C All 3 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:0198 USER GETTICKCOUNT 2147483647 1 verified call-sites-verified pascal16 GetTickCount() Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L11; all 1 direct call sites map to verified address-linked function rows and readable C All 1 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:019c USER SETCAPTURE 2 1 verified binary-reviewed pascal16 HWND16 SetCapture(HWND16) disassembly 1018:199b-19b1; Wine 11.15 USER ordinal 18; reconstructed/tests/test_window_advanced_handlers.c Sole call passes receiver HWND before the attached mouse-tracking loop; previous-capture HWND return is ignored and ReleaseCapture is paired after the inclusive button-up iteration. +1228:01a0 USER RELEASECAPTURE 0 1 verified binary-reviewed pascal16 BOOL16 ReleaseCapture() disassembly 1018:19eb-19f6; Wine 11.15 USER ordinal 19; reconstructed/tests/test_window_advanced_handlers.c Sole no-argument call occurs after the attached tracking loop exits on WM_LBUTTONUP; BOOL16 is ignored and default event forwarding follows. +1228:01a4 USER SETFOCUS 2 7 verified call-sites-verified pascal16 -ret16 SetFocus(word) Wine 11.15 USER ordinal 22 prototype; disassembly 1018:172b-1736; reconstructed/tests/test_window_placement.c; all 7 direct call sites map to verified address-linked function rows and readable C All 7 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:01a8 USER GETFOCUS 0 2 verified call-sites-verified pascal16 -ret16 GetFocus() Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L22; all 2 direct call sites map to verified address-linked function rows and readable C All 2 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:01ac USER REMOVEPROP 6 2 verified callsite-reviewed pascal16 -ret16 RemoveProp(word ptr) Wine wine-11.15 user.exe16.spec line 23; disassembly 1018:0076-0090 Both call sites remove OW1 then OW2 for the same HWND; returned property handles are intentionally ignored. +1228:01b0 USER GETPROP 6 2 verified call-sites-verified pascal16 -ret16 GetProp(word str) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L24; all 2 direct call sites map to verified address-linked function rows and readable C All 2 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:01b4 USER SETPROP 8 2 verified callsite-reviewed pascal16 -ret16 SetProp(word str word) Wine wine-11.15 user.exe16.spec line 25; disassembly 1018:004a-0069 Both call sites bind one HWND to the object's selector under OW1 and offset under OW2; BOOL16 results are intentionally ignored. +1228:01b8 USER SCREENTOCLIENT 6 2 verified binary-reviewed pascal16 -ret16 ScreenToClient(word ptr) Wine 11.15 USER ordinal 29 prototype; both call sites 1018:164a-165b and 1673-1684; reconstructed/tests/test_window_placement.c Both calls pass the same stack RECT16 top-left as POINT16; one uses the VMT-returned MDI-client HWND under flag 08 and the other uses the parent HWND under attribute bit 40000000; BOOL16 is ignored. +1228:01bc USER ISICONIC 0 4 verified call-sites-verified pascal16 -ret16 IsIconic(word) Wine 11.15 USER ordinal 31 prototype; disassembly 1018:15c8-15da; reconstructed/tests/test_window_placement.c; all 4 direct call sites map to verified address-linked function rows and readable C All 4 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:01c0 USER GETWINDOWRECT 6 2 verified binary-reviewed pascal16 BOOL16 GetWindowRect(HWND16 segptr RECT16) disassembly 1018:15ee-15ff and 1921-1931; Wine 11.15 USER ordinal 32; placement and advanced-handler tests Both calls pass exact HWND and eight-byte stack RECT16 pointers and ignore BOOL16; one converts screen placement, the other caches signed 16-bit width/height differences. +1228:01c4 USER GETCLIENTRECT 6 6 verified call-sites-verified pascal16 -ret16 GetClientRect(word ptr) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L32; all 6 direct call sites map to verified address-linked function rows and readable C All 6 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:01c8 USER GETWINDOWTEXT 0 1 verified call-sites-verified pascal16 -ret16 GetWindowText(word segptr word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L35; all 1 direct call sites map to verified address-linked function rows and readable C All 1 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:01cc USER SETWINDOWTEXT 0 3 verified binary-reviewed pascal16 BOOL16 SetWindowText(HWND16 segstr) disassembly 1008:16cd-16e0, 1008:24f5-2503, and 1018:0500-050d; Wine 11.15 USER ordinal 37; dialog/TPWinCrt/object tests All three call sites have exact HWND/text arguments and ignored BOOL16 returns: dialog caption field, inactive TPWinCrt stack caption, and child-activation text. +1228:01d0 USER BEGINPAINT 8 2 verified binary-reviewed pascal16 HDC16 BeginPaint(HWND16 segptr PAINTSTRUCT16) disassembly 1008:1782-1791 and 1018:1870-1880; Wine 11.15 USER ordinal 39; TPWinCrt and advanced-handler tests Both call sites pass exact HWND plus 32-byte PAINTSTRUCT16 storage; TPWinCrt stores the returned HDC while ObjectWindows consumes the structure HDC through ordered virtual calls. +1228:01d4 USER ENDPAINT 6 2 verified binary-reviewed pascal16 BOOL16 EndPaint(HWND16 segptr PAINTSTRUCT16) disassembly 1008:17f4-1806 and 1018:18d1-18e1; Wine 11.15 USER ordinal 40; TPWinCrt and advanced-handler tests Both calls pair the same HWND/PAINTSTRUCT used by BeginPaint after restoring fonts or completing attached/window paint virtuals; BOOL16 is ignored. +1228:01d8 USER CREATEWINDOW 34 1 verified binary-reviewed pascal16 HWND16 CreateWindow(segstr segstr long s_word s_word s_word s_word HWND16 HMENU16 HINSTANCE16 segptr) disassembly 1008:244e-2487; Wine 11.15 USER ordinal 41; reconstructed/tests/test_tpwincrt_lifecycle.c Sole call's class/title, style 00ff0000, four CW_USEDEFAULT words, null parent/menu/parameter, process instance, returned HWND publication, and subsequent Show/Update are verified. +1228:01dc USER SHOWWINDOW 4 2 verified call-sites-verified pascal16 -ret16 ShowWindow(word word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L41; all 2 direct call sites map to verified address-linked function rows and readable C All 2 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:01e0 USER GETPARENT 2 4 verified call-sites-verified pascal16 -ret16 GetParent(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L45; all 4 direct call sites map to verified address-linked function rows and readable C All 4 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:01e4 USER ISWINDOW 0 2 verified call-sites-verified pascal16 -ret16 IsWindow(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L46; all 2 direct call sites map to verified address-linked function rows and readable C All 2 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:01e8 USER ISCHILD 0 1 verified call-sites-verified pascal16 -ret16 IsChild(word word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L47; all 1 direct call sites map to verified address-linked function rows and readable C All 1 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:01ec USER DESTROYWINDOW 2 1 verified binary-reviewed pascal16 -ret16 DestroyWindow(word) Wine 11.15 USER ordinal 53 prototype; sole call at 1018:0d5e; reconstructed/tests/test_window_destroy.c The sole call receives object HWND +4 after child marking and after the MDI getter path declines; zero HWND skips it and BOOL16 return is ignored. +1228:01f0 USER REGISTERCLASS 4 2 verified binary-reviewed pascal16 uint16 RegisterClass(segptr WNDCLASS16) disassembly 1008:2588-2597 and 1018:0e76-0e8b; Wine 11.15 USER ordinal 57; TPWinCrt and ObjectWindows class tests Both call sites pass exact 26-byte Win16 class descriptors; first-instance gates, dynamic class construction, relocations, and ignored atom results are verified. +1228:01f4 USER SCROLLWINDOW 14 2 verified call-sites-verified pascal16 -ret16 ScrollWindow(word s_word s_word ptr ptr) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L60; all 2 direct call sites map to verified address-linked function rows and readable C All 2 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:01f8 USER SETSCROLLPOS 8 4 verified callsite-reviewed pascal16 -ret16 SetScrollPos(word word s_word word) Wine wine-11.15 user.exe16.spec line 61; disassembly 1008:1886-1899, 18b9-18cd, 1937-1952, and 1953-196f All four calls use the TPWinCrt HWND, correct horizontal/vertical bar id, signed position, redraw=1, and intentionally ignore the previous position. +1228:01fc USER SETSCROLLRANGE 10 2 verified callsite-reviewed pascal16 -ret16 SetScrollRange(word word s_word s_word word) Wine wine-11.15 user.exe16.spec line 63; disassembly 1008:1868-1885 and 189a-18b8 Both calls use minimum 0, maximum max(recovered limit,1), redraw=0, correct bar id, and intentionally ignore BOOL16. +1228:0200 USER GETDC 2 43 verified call-sites-verified pascal16 -ret16 GetDC(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L65; all 43 direct call sites map to verified address-linked function rows and readable C All 43 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:0204 USER RELEASEDC 4 43 verified call-sites-verified pascal16 -ret16 ReleaseDC(word word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L67; all 43 direct call sites map to verified address-linked function rows and readable C All 43 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:0208 USER SETCURSOR 2 7 verified call-sites-verified pascal16 -ret16 SetCursor(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L68; all 7 direct call sites map to verified address-linked function rows and readable C All 7 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:020c USER ENDDIALOG 4 1 verified binary-reviewed pascal16 -ret16 EndDialog(word s_word) Wine 11.15 USER ordinal 88 prototype; sole call at 1008:2bfb; reconstructed/tests/test_dialog.c The sole call executes only for modal byte +0x25, after child marking, with object HWND +4 then signed result word; BOOL16 return is ignored. +1228:0210 USER ISDIALOGMESSAGE 6 1 verified binary-reviewed pascal16 -ret16 IsDialogMessage(word ptr) Wine 11.15 USER ordinal 90 prototype; sole call at 1018:1d0b; reconstructed/tests/test_application_loop.c The sole call passes active-dialog HWND at object +4 and the exact 18-byte MSG16 pointer; its BOOL16 is normalized by the target's NEG/SBB/NEG byte sequence. +1228:0214 USER GETDLGITEM 4 3 verified call-sites-verified pascal16 -ret16 GetDlgItem(word word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L90; all 3 direct call sites map to verified address-linked function rows and readable C All 3 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:0218 USER SETDLGITEMTEXT 8 2 verified binary-reviewed pascal16 BOOL16 SetDlgItemText(HWND16 INT16 segstr) disassembly 1008:16e1-170c; Wine 11.15 USER ordinal 92; reconstructed/tests/test_dialog.c Both sole calls use the same dialog HWND with exact ids 100 and 101 and unaligned far text fields +2a and +2e; both returns are ignored. +1228:021c USER GETDLGITEMTEXT 10 1 verified binary-reviewed pascal16 -ret16 GetDlgItemText(word word segptr word) Wine 11.15 USER ordinal 93 prototype; sole call at 1008:16aa; reconstructed/tests/test_dialog.c The sole call passes object HWND +4, signed control id +0x32, unaligned far buffer +0x2e/+0x30, maximum 0x65, ignores the returned character count, and the caller returns true. +1228:0220 USER SENDDLGITEMMESSAGE 12 1 verified binary-reviewed pascal16 LRESULT16 SendDlgItemMessage(HWND16 INT16 UINT16 WPARAM16 LPARAM16) disassembly 1008:170d-1727; Wine 11.15 USER ordinal 101; reconstructed/tests/test_dialog.c Sole call targets control 101 with EM_LIMITTEXT 0415, uint16 field +32 minus one in wParam including zero-to-ffff wrap, lParam zero, and ignored LRESULT. +1228:0224 USER MESSAGEBEEP 2 1 verified binary-reviewed pascal16 BOOL16 MessageBeep(uint16) disassembly 1008:1bb8-1bc3; Wine 11.15 USER ordinal 104; reconstructed/tests/test_tpwincrt_text.c Sole BEL-byte branch passes literal zero, ignores BOOL16, and preserves dirty-range/cursor state. +1228:0228 USER GETKEYSTATE 0 1 verified callsite-reviewed pascal16 -ret16 GetKeyState(word) Wine wine-11.15 user.exe16.spec line 105; disassembly 1008:215d-216d The sole call pushes VK_CONTROL 0x11 and tests the signed INT16 result for negativity; Ghidra's zero purge metadata is contradicted by the call and the executing Wine spec. +1228:022c USER DEFWINDOWPROC 10 1 verified call-sites-verified pascal16 DefWindowProc(word word word long) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L106; all 1 direct call sites map to verified address-linked function rows and readable C All 1 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:0230 USER GETMESSAGE 14 1 verified binary-reviewed pascal16 BOOL16 GetMessage(segptr MSG16 HWND16 uint16 uint16) disassembly 1008:2522-254d; Wine 11.15 USER ordinal 108; reconstructed/tests/test_tpwincrt_lifecycle.c Sole clean-shutdown loop passes an 18-byte stack MSG and three zero filters; every nonzero result, including -1, is translated/dispatched until zero. +1228:0234 USER PEEKMESSAGE 14 4 verified binary-reviewed pascal16 BOOL16 PeekMessage(segptr MSG16 HWND16 UINT16 UINT16 UINT16) disassembly call sites 1008:00f3,1c22 and 1018:19bf,1c15; Wine 11.15 USER ordinal 109; runtime-input, message-loop, and advanced-handler tests All four calls pass 18-byte MSG storage, zero HWND/range filters, and PM_REMOVE=1; empty-queue behavior, WM_QUIT handling, tracking retention, and dispatch ordering are verified. +1228:0238 USER SENDMESSAGE 10 3 verified call-sites-verified pascal16 SendMessage(word word word long) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L110; all 3 direct call sites map to verified address-linked function rows and readable C All 3 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:023c USER WAITMESSAGE 0 2 verified call-sites-verified pascal16 -ret16 WaitMessage() Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L111; all 2 direct call sites map to verified address-linked function rows and readable C All 2 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:0240 USER TRANSLATEMESSAGE 4 5 verified binary-reviewed pascal16 BOOL16 TranslateMessage(segptr MSG16) five disassembly call sites across verified TPWinCrt, shutdown, tracking, and application loops; Wine 11.15 USER ordinal 113; focused tests Every call receives the same stack MSG returned by Peek/GetMessage immediately before DispatchMessage; BOOL16 is ignored and all skip/loop conditions are verified. +1228:0244 USER DISPATCHMESSAGE 4 5 verified binary-reviewed pascal16 LRESULT16 DispatchMessage(segptr MSG16) five disassembly call sites across verified TPWinCrt, shutdown, tracking, and application loops; Wine 11.15 USER ordinal 114; focused tests Every call receives the translated stack MSG; LRESULT is ignored, while WM_QUIT/button-up and preprocessing gates are represented in enclosing functions. +1228:0248 USER CALLWINDOWPROC 14 1 verified binary-reviewed pascal16 CallWindowProc(segptr word word word long) Wine 11.15 USER ordinal 122 prototype; sole call at 1018:1337; reconstructed/tests/test_window_messages.c The sole call passes unaligned stored WNDPROC +0x37/+0x39, object HWND +4, exact message/WPARAM/LPARAM words, and stores the returned LRESULT16 into the ObjectWindows message record. +1228:024c USER UPDATEWINDOW 2 5 verified call-sites-verified pascal16 -ret16 UpdateWindow(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L123; all 5 direct call sites map to verified address-linked function rows and readable C All 5 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:0250 USER INVALIDATERECT 10 6 verified call-sites-verified pascal16 -ret16 InvalidateRect(word ptr word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L124; all 6 direct call sites map to verified address-linked function rows and readable C All 6 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:0254 USER GETWINDOWWORD 4 2 verified call-sites-verified pascal16 -ret16 GetWindowWord(word s_word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L132; all 2 direct call sites map to verified address-linked function rows and readable C All 2 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:0258 USER GETWINDOWLONG 4 5 verified binary-reviewed pascal16 LONG GetWindowLong(HWND16 INT16) five disassembly call sites in verified 1018:0097,0b25,0b6c,1788,17f8; Wine 11.15 USER ordinal 135; object/window/advanced-handler tests GWL_WNDPROC=-4 is used for bound-thunk recovery; GWL_STYLE=-16 supplies exact WS_HSCROLL/WS_VSCROLL high-word bits for base and attached scrolling. Full 32-bit results and all consumers are verified. +1228:025c USER SETWINDOWLONG 8 2 verified callsite-reviewed pascal16 SetWindowLong(word s_word long) Wine wine-11.15 user.exe16.spec line 135; disassembly 1018:0197-01ac and 1018:1488-14a3 Both calls use GWL_WNDPROC (-4): bootstrap installs the bound thunk; normal creation installs the object handler and preserves the previous procedure. +1228:0260 USER ENABLEMENUITEM 6 2 verified call-sites-verified pascal16 -ret16 EnableMenuItem(word word word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L154; all 2 direct call sites map to verified address-linked function rows and readable C All 2 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:0264 USER GETSYSTEMMENU 4 2 verified call-sites-verified pascal16 -ret16 GetSystemMenu(word word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L155; all 2 direct call sites map to verified address-linked function rows and readable C All 2 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:0268 USER CREATECARET 8 1 verified callsite-reviewed pascal16 -ret16 CreateCaret(word word word word) Wine wine-11.15 user.exe16.spec line 162; disassembly 1008:181b-182e The sole call passes TPWinCrt HWND, null bitmap, character width, and height 2 in exact far-Pascal order; BOOL16 is intentionally ignored. +1228:026c USER DESTROYCARET 0 1 verified callsite-reviewed pascal16 -ret16 DestroyCaret() Wine wine-11.15 user.exe16.spec line 163; disassembly 1008:185b-1864 The sole call has no arguments; BOOL16 is intentionally ignored. +1228:0270 USER SETCARETPOS 4 1 verified callsite-reviewed pascal16 -ret16 SetCaretPos(word word) Wine wine-11.15 user.exe16.spec line 164; disassembly 1008:182f-184f The sole call passes 16-bit wrapped x then y coordinates; BOOL16 is intentionally ignored. +1228:0274 USER SHOWCARET 2 1 verified callsite-reviewed pascal16 -ret16 ShowCaret(word) Wine wine-11.15 user.exe16.spec line 166; disassembly 1008:1850-185a The sole call passes the TPWinCrt HWND; BOOL16 is intentionally ignored. +1228:0278 USER LOADCURSOR 6 9 verified call-sites-verified pascal16 -ret16 LoadCursor(word str) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L172; all 9 direct call sites map to verified address-linked function rows and readable C All 9 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:027c USER LOADICON 6 3 verified binary-reviewed pascal16 HICON16 LoadIcon(HINSTANCE16 segstr) disassembly 1000:0186-0194, 1008:2564-2573, 1018:128d-129b; Wine 11.15 USER ordinal 174; class-builder tests All three class-construction calls have exact instance/integer-resource arguments, handle publication, first-instance behavior, and no hidden ownership transfer. +1228:0280 USER LOADBITMAP 6 3 verified binary-reviewed pascal16 -ret16 LoadBitmap(word str) Wine 11.15 USER ordinal 175 prototype; all call sites 1000:5491,5551,5586 in verified asset initializer; reconstructed/tests/test_asset_initializer.c All calls pass current HINSTANCE16 and MAKEINTRESOURCE selectors zero for IDs 500,102,101; returned HBITMAPs publish to digit atlas or window fields +54/+52 at exact progress stages. +1228:0284 USER TRANSLATEACCELERATOR 8 1 verified binary-reviewed pascal16 -ret16 TranslateAccelerator(word word ptr) Wine 11.15 USER ordinal 178 prototype; sole call at 1018:1d48; reconstructed/tests/test_application_loop.c The sole call passes main-window HWND +4, application HACCEL +0x0c, and exact MSG16 pointer; zero/nonzero return becomes AL false/true. +1228:0288 USER GETSYSTEMMETRICS 0 14 verified call-sites-verified pascal16 -ret16 GetSystemMetrics(s_word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L178; all 14 direct call sites map to verified address-linked function rows and readable C All 14 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:028c USER GETSYSCOLOR 0 2 verified call-sites-verified pascal16 GetSysColor(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L179; all 2 direct call sites map to verified address-linked function rows and readable C All 2 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:0290 USER DIALOGBOXPARAM 16 1 verified binary-reviewed pascal16 INT16 DialogBoxParam(HINSTANCE16 segstr HWND16 segptr LPARAM16) disassembly 1008:2b30-2b7d; Wine 11.15 USER ordinal 239; callback ledger; reconstructed/tests/test_dialog.c Sole indirect call passes process instance, template +1d, parent HWND, bound dispatcher +12, init value +21; preserves/restores application active dialog, maps -1 to status ffff, clears HWND, and returns INT16. +1228:0294 USER CREATEDIALOGPARAM 16 1 verified binary-reviewed pascal16 HWND16 CreateDialogParam(HINSTANCE16 segstr HWND16 segptr LPARAM16) disassembly 1008:2a8f-2ac8; Wine 11.15 USER ordinal 241; callback ledger; reconstructed/tests/test_dialog.c Sole indirect call passes process instance, template +1d, parent HWND, bound dispatcher +12, and init value +21; stores HWND, maps zero to status ffff, and preserves returned AH in its Boolean result. +1228:0298 USER ISZOOMED 0 1 verified binary-reviewed pascal16 -ret16 IsZoomed(word) Wine 11.15 USER ordinal 272 prototype; disassembly 1018:15db-15ed; reconstructed/tests/test_window_placement.c The sole call receives the receiver HWND after IsIconic returned zero and preserves all saved-placement words by returning immediately on nonzero. +1228:029c USER SELECTPALETTE 6 23 verified call-sites-verified pascal16 -ret16 SelectPalette(word word word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L282; all 23 direct call sites map to verified address-linked function rows and readable C All 23 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:02a0 USER REALIZEPALETTE 2 11 verified call-sites-verified pascal16 -ret16 RealizePalette(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L283; all 11 direct call sites map to verified address-linked function rows and readable C All 11 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:02a4 USER DEFDLGPROC 10 0 verified unused-slot-verified pascal16 DefDlgProc(word word word long) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L304; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:02a8 USER GETCLASSINFO 10 1 verified binary-reviewed pascal16 -ret16 GetClassInfo(word segstr ptr) Wine 11.15 USER ordinal 404 prototype; sole call at 1018:0e68; reconstructed/tests/test_class_registration.c The sole call passes current HINSTANCE16, VMT +0x2c far class name, and exact 26-byte WNDCLASS16 pointer; nonzero skips builder/registration and returns true. +1228:02ac USER WVSPRINTF 12 2 verified call-sites-verified pascal16 -ret16 wvsprintf(ptr str ptr) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L391; all 2 direct call sites map to verified address-linked function rows and readable C All 2 relocation-backed direct call sites are in verified functions whose evidence records argument order, segmented pointer or handle use, return handling, side effects, and branches. +1228:02b0 USER DEFMDICHILDPROC 10 0 verified unused-slot-verified pascal16 DefMDIChildProc(word word word long) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L410; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:02b4 USER TRANSLATEMDISYSACCEL 6 1 verified binary-reviewed pascal16 -ret16 TranslateMDISysAccel(word ptr) Wine 11.15 USER ordinal 451 prototype; sole call at 1018:1d91; reconstructed/tests/test_application_loop.c The sole call follows main-window VMT +0x30 to a client object, passes client HWND +4 and exact MSG16 pointer, and booleanizes the BOOL16 result; null client skips the import. +1228:02b8 USER CREATEWINDOWEX 34 1 verified binary-reviewed pascal16 HWND16 CreateWindowEx(long segstr segstr long s_word s_word s_word s_word HWND16 HMENU16 HINSTANCE16 segptr) disassembly 1018:13cd-1429; Wine 11.15 USER ordinal 452; reconstructed/tests/test_window_creation.c Sole call passes exact extended/style dwords, VMT class far pointer, owned title, signed placement words, parent HWND, menu/id, process instance, far parameter, and stores returned HWND before common binding/error handling. +1228:02bc KEYBOARD Ordinal_5 2147483647 3 verified binary-reviewed pascal16 -ret16 AnsiToOem(segstr segptr) disassembly 1008:2629-2634, 1020:04d4-04f7, and 1020:0683-06a6; Wine 11.15 KEYBOARD ordinal 5; path and Borland-record tests All three call sites use identical source/destination buffers for in-place conversion: bounded DOS path, assigned TextRec name, and assigned FileRec name; results are ignored. +1228:02c0 KEYBOARD Ordinal_6 2147483647 1 verified binary-reviewed pascal16 -ret16 OemToAnsi(segstr segptr) disassembly 1008:25dc-25ea; Wine 11.15 KEYBOARD ordinal 6; reconstructed/tests/test_tpwincrt_lifecycle.c Sole call passes the same 80-byte module-title buffer as source and destination for in-place OEM-to-ANSI conversion; return is ignored. +1228:02c4 KERNEL GETVERSION 0 0 verified unused-slot-verified pascal16 GetVersion() Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L6; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:02c8 KERNEL GLOBALALLOC 6 0 verified unused-slot-verified pascal16 -ret16 GlobalAlloc(word long) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L18; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:02cc KERNEL GLOBALFREE 2 0 verified unused-slot-verified pascal16 -ret16 GlobalFree(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L20; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:02d0 KERNEL GLOBALLOCK 2 0 verified unused-slot-verified pascal16 GlobalLock(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L21; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:02d4 KERNEL GLOBALUNLOCK 2 0 verified unused-slot-verified pascal16 -ret16 GlobalUnlock(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L22; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:02d8 KERNEL GLOBALHANDLE 2 0 verified unused-slot-verified pascal16 GlobalHandle(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L24; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:02dc KERNEL GLOBALCOMPACT 4 0 verified unused-slot-verified pascal16 GlobalCompact(long) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L28; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:02e0 KERNEL WAITEVENT 2 0 verified unused-slot-verified pascal16 -ret16 WaitEvent(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L33; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:02e4 KERNEL GETCURRENTTASK 0 0 verified unused-slot-verified pascal16 GetCurrentTask() Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L39; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:02e8 KERNEL GETMODULEHANDLE 4 0 verified unused-slot-verified pascal16 GetModuleHandle(segstr) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L50; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:02ec KERNEL GETMODULEFILENAME 8 0 verified unused-slot-verified pascal16 -ret16 GetModuleFileName(word ptr s_word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L52; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:02f0 KERNEL GETPROCADDRESS 6 0 verified unused-slot-verified pascal16 GetProcAddress(word str) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L53; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:02f4 KERNEL MAKEPROCINSTANCE 6 0 verified unused-slot-verified pascal16 MakeProcInstance(segptr word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L54; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:02f8 KERNEL FREEPROCINSTANCE 4 0 verified unused-slot-verified pascal16 -ret16 FreeProcInstance(segptr) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L55; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:02fc KERNEL FINDRESOURCE 10 0 verified unused-slot-verified pascal16 -ret16 FindResource(word str str) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L63; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0300 KERNEL LOADRESOURCE 4 0 verified unused-slot-verified pascal16 -ret16 LoadResource(word word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L64; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0304 KERNEL LOCKRESOURCE 2 0 verified unused-slot-verified pascal16 LockResource(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L65; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0308 KERNEL FREERESOURCE 2 0 verified unused-slot-verified pascal16 -ret16 FreeResource(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L66; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:030c KERNEL _LCLOSE 2 0 verified unused-slot-verified pascal16 -ret16 _lclose(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L85; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0310 KERNEL _LREAD 8 0 verified unused-slot-verified pascal16 -ret16 _lread(word segptr word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L86; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0314 KERNEL _LCREAT 6 0 verified unused-slot-verified pascal16 -ret16 _lcreat(str word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L87; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0318 KERNEL _LOPEN 6 0 verified unused-slot-verified pascal16 -ret16 _lopen(str word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L89; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:031c KERNEL _LWRITE 8 0 verified unused-slot-verified pascal16 -ret16 _lwrite(word ptr word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L90; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0320 KERNEL INITTASK 0 0 verified unused-slot-verified pascal16 -register InitTask() Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L95; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0324 KERNEL LOADLIBRARY 4 0 verified unused-slot-verified pascal16 -ret16 LoadLibrary(str) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L99; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0328 KERNEL FREELIBRARY 2 0 verified unused-slot-verified pascal16 -ret16 FreeLibrary(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L100; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:032c KERNEL SETERRORMODE 2 0 verified unused-slot-verified pascal16 -ret16 SetErrorMode(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L111; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0330 KERNEL __AHINCR 2147483647 0 verified runtime-data equate16 __AHINCR = 8 Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L118 Wine Win16 ordinal 114; this is runtime data, not a callable function. +1228:0334 KERNEL GETPRIVATEPROFILEINT 14 0 verified unused-slot-verified pascal16 -ret16 GetPrivateProfileInt(str str s_word str) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L131; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0338 KERNEL GETDOSENVIRONMENT 0 0 verified unused-slot-verified pascal16 GetDOSEnvironment() Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L135; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:033c KERNEL GETWINFLAGS 0 0 verified unused-slot-verified pascal16 GetWinFlags() Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L136; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0340 KERNEL GETWINDOWSDIRECTORY 6 0 verified unused-slot-verified pascal16 -ret16 GetWindowsDirectory(ptr word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L138; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0344 KERNEL GETSYSTEMDIRECTORY 6 0 verified unused-slot-verified pascal16 -ret16 GetSystemDirectory(ptr word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L139; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0348 KERNEL GETFREESPACE 2 0 verified unused-slot-verified pascal16 GetFreeSpace(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L172; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:034c KERNEL ALLOCCSTODSALIAS 2 0 verified unused-slot-verified pascal16 -ret16 AllocCStoDSAlias(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L173; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0350 KERNEL FREESELECTOR 2 0 verified unused-slot-verified pascal16 -ret16 FreeSelector(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L179; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0354 KERNEL PRESTOCHANGOSELECTOR 4 0 verified unused-slot-verified pascal16 -ret16 PrestoChangoSelector(word word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/krnl386.exe16/krnl386.exe16.spec#L180; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0358 USER MESSAGEBOX 12 0 verified unused-slot-verified pascal16 -ret16 MessageBox(word str str word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L1; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:035c USER INITAPP 2 0 verified unused-slot-verified pascal16 -ret16 InitApp(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L5; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0360 USER POSTQUITMESSAGE 0 0 verified unused-slot-verified pascal16 -ret16 PostQuitMessage(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L6; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0364 USER GETTICKCOUNT 2147483647 0 verified unused-slot-verified pascal16 GetTickCount() Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L11; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0368 USER SETCAPTURE 2 0 verified unused-slot-verified pascal16 -ret16 SetCapture(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L17; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:036c USER RELEASECAPTURE 0 0 verified unused-slot-verified pascal16 -ret16 ReleaseCapture() Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L18; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0370 USER SETFOCUS 2 0 verified unused-slot-verified pascal16 -ret16 SetFocus(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L21; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0374 USER GETFOCUS 0 0 verified unused-slot-verified pascal16 -ret16 GetFocus() Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L22; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0378 USER REMOVEPROP 6 0 verified unused-slot-verified pascal16 -ret16 RemoveProp(word ptr) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L23; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:037c USER GETPROP 6 0 verified unused-slot-verified pascal16 -ret16 GetProp(word str) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L24; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0380 USER SETPROP 8 0 verified unused-slot-verified pascal16 -ret16 SetProp(word str word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L25; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0384 USER SCREENTOCLIENT 6 0 verified unused-slot-verified pascal16 -ret16 ScreenToClient(word ptr) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L28; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0388 USER ISICONIC 0 0 verified unused-slot-verified pascal16 -ret16 IsIconic(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L30; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:038c USER GETWINDOWRECT 6 0 verified unused-slot-verified pascal16 -ret16 GetWindowRect(word ptr) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L31; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0390 USER GETCLIENTRECT 6 0 verified unused-slot-verified pascal16 -ret16 GetClientRect(word ptr) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L32; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0394 USER GETWINDOWTEXT 0 0 verified unused-slot-verified pascal16 -ret16 GetWindowText(word segptr word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L35; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0398 USER SETWINDOWTEXT 0 0 verified unused-slot-verified pascal16 -ret16 SetWindowText(word segstr) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L36; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:039c USER BEGINPAINT 8 0 verified unused-slot-verified pascal16 -ret16 BeginPaint(word ptr) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L38; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:03a0 USER ENDPAINT 6 0 verified unused-slot-verified pascal16 -ret16 EndPaint(word ptr) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L39; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:03a4 USER CREATEWINDOW 34 0 verified unused-slot-verified pascal16 -ret16 CreateWindow(str str long s_word s_word s_word s_word word word word segptr) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L40; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:03a8 USER SHOWWINDOW 4 0 verified unused-slot-verified pascal16 -ret16 ShowWindow(word word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L41; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:03ac USER GETPARENT 2 0 verified unused-slot-verified pascal16 -ret16 GetParent(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L45; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:03b0 USER ISWINDOW 0 0 verified unused-slot-verified pascal16 -ret16 IsWindow(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L46; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:03b4 USER ISCHILD 0 0 verified unused-slot-verified pascal16 -ret16 IsChild(word word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L47; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:03b8 USER DESTROYWINDOW 2 0 verified unused-slot-verified pascal16 -ret16 DestroyWindow(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L52; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:03bc USER REGISTERCLASS 4 0 verified unused-slot-verified pascal16 -ret16 RegisterClass(ptr) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L56; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:03c0 USER SCROLLWINDOW 14 0 verified unused-slot-verified pascal16 -ret16 ScrollWindow(word s_word s_word ptr ptr) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L60; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:03c4 USER SETSCROLLPOS 8 0 verified unused-slot-verified pascal16 -ret16 SetScrollPos(word word s_word word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L61; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:03c8 USER SETSCROLLRANGE 10 0 verified unused-slot-verified pascal16 -ret16 SetScrollRange(word word s_word s_word word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L63; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:03cc USER GETDC 2 0 verified unused-slot-verified pascal16 -ret16 GetDC(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L65; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:03d0 USER RELEASEDC 4 0 verified unused-slot-verified pascal16 -ret16 ReleaseDC(word word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L67; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:03d4 USER SETCURSOR 2 0 verified unused-slot-verified pascal16 -ret16 SetCursor(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L68; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:03d8 USER ENDDIALOG 4 0 verified unused-slot-verified pascal16 -ret16 EndDialog(word s_word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L87; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:03dc USER ISDIALOGMESSAGE 6 0 verified unused-slot-verified pascal16 -ret16 IsDialogMessage(word ptr) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L89; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:03e0 USER GETDLGITEM 4 0 verified unused-slot-verified pascal16 -ret16 GetDlgItem(word word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L90; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:03e4 USER SETDLGITEMTEXT 8 0 verified unused-slot-verified pascal16 -ret16 SetDlgItemText(word word segstr) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L91; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:03e8 USER GETDLGITEMTEXT 10 0 verified unused-slot-verified pascal16 -ret16 GetDlgItemText(word word segptr word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L92; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:03ec USER SENDDLGITEMMESSAGE 12 0 verified unused-slot-verified pascal16 SendDlgItemMessage(word word word word long) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L100; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:03f0 USER MESSAGEBEEP 2 0 verified unused-slot-verified pascal16 -ret16 MessageBeep(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L103; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:03f4 USER GETKEYSTATE 0 0 verified unused-slot-verified pascal16 -ret16 GetKeyState(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L105; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:03f8 USER DEFWINDOWPROC 10 0 verified unused-slot-verified pascal16 DefWindowProc(word word word long) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L106; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:03fc USER GETMESSAGE 14 0 verified unused-slot-verified pascal16 -ret16 GetMessage(ptr word word word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L107; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0400 USER PEEKMESSAGE 14 0 verified unused-slot-verified pascal16 -ret16 PeekMessage(ptr word word word word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L108; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0404 USER SENDMESSAGE 10 0 verified unused-slot-verified pascal16 SendMessage(word word word long) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L110; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0408 USER WAITMESSAGE 0 0 verified unused-slot-verified pascal16 -ret16 WaitMessage() Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L111; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:040c USER TRANSLATEMESSAGE 4 0 verified unused-slot-verified pascal16 -ret16 TranslateMessage(ptr) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L112; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0410 USER DISPATCHMESSAGE 4 0 verified unused-slot-verified pascal16 DispatchMessage(ptr) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L113; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0414 USER CALLWINDOWPROC 14 0 verified unused-slot-verified pascal16 CallWindowProc(segptr word word word long) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L121; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0418 USER UPDATEWINDOW 2 0 verified unused-slot-verified pascal16 -ret16 UpdateWindow(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L123; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:041c USER INVALIDATERECT 10 0 verified unused-slot-verified pascal16 -ret16 InvalidateRect(word ptr word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L124; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0420 USER GETWINDOWWORD 4 0 verified unused-slot-verified pascal16 -ret16 GetWindowWord(word s_word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L132; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0424 USER GETWINDOWLONG 4 0 verified unused-slot-verified pascal16 GetWindowLong(word s_word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L134; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0428 USER SETWINDOWLONG 8 0 verified unused-slot-verified pascal16 SetWindowLong(word s_word long) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L135; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:042c USER ENABLEMENUITEM 6 0 verified unused-slot-verified pascal16 -ret16 EnableMenuItem(word word word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L154; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0430 USER GETSYSTEMMENU 4 0 verified unused-slot-verified pascal16 -ret16 GetSystemMenu(word word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L155; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0434 USER CREATECARET 8 0 verified unused-slot-verified pascal16 -ret16 CreateCaret(word word word word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L162; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0438 USER DESTROYCARET 0 0 verified unused-slot-verified pascal16 -ret16 DestroyCaret() Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L163; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:043c USER SETCARETPOS 4 0 verified unused-slot-verified pascal16 -ret16 SetCaretPos(word word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L164; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0440 USER SHOWCARET 2 0 verified unused-slot-verified pascal16 -ret16 ShowCaret(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L166; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0444 USER LOADCURSOR 6 0 verified unused-slot-verified pascal16 -ret16 LoadCursor(word str) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L172; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0448 USER LOADICON 6 0 verified unused-slot-verified pascal16 -ret16 LoadIcon(word str) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L173; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:044c USER LOADBITMAP 6 0 verified unused-slot-verified pascal16 -ret16 LoadBitmap(word str) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L174; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0450 USER TRANSLATEACCELERATOR 8 0 verified unused-slot-verified pascal16 -ret16 TranslateAccelerator(word word ptr) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L177; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0454 USER GETSYSTEMMETRICS 0 0 verified unused-slot-verified pascal16 -ret16 GetSystemMetrics(s_word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L178; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0458 USER GETSYSCOLOR 0 0 verified unused-slot-verified pascal16 GetSysColor(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L179; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:045c USER DIALOGBOXPARAM 16 0 verified unused-slot-verified pascal16 -ret16 DialogBoxParam(word str word segptr long) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L239; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0460 USER CREATEDIALOGPARAM 16 0 verified unused-slot-verified pascal16 -ret16 CreateDialogParam(word str word segptr long) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L241; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0464 USER ISZOOMED 0 0 verified unused-slot-verified pascal16 -ret16 IsZoomed(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L272; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0468 USER SELECTPALETTE 6 0 verified unused-slot-verified pascal16 -ret16 SelectPalette(word word word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L282; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:046c USER REALIZEPALETTE 2 0 verified unused-slot-verified pascal16 -ret16 RealizePalette(word) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L283; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0470 USER DEFDLGPROC 10 0 verified unused-slot-verified pascal16 DefDlgProc(word word word long) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L304; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0474 USER GETCLASSINFO 10 0 verified unused-slot-verified pascal16 -ret16 GetClassInfo(word segstr ptr) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L376; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0478 USER WVSPRINTF 12 0 verified unused-slot-verified pascal16 -ret16 wvsprintf(ptr str ptr) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L391; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:047c USER DEFMDICHILDPROC 10 0 verified unused-slot-verified pascal16 DefMDIChildProc(word word word long) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L410; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0480 USER TRANSLATEMDISYSACCEL 6 0 verified unused-slot-verified pascal16 -ret16 TranslateMDISysAccel(word ptr) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L414; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0484 USER CREATEWINDOWEX 34 0 verified unused-slot-verified pascal16 -ret16 CreateWindowEx(long str str long s_word s_word s_word s_word word word word segptr) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/user.exe16/user.exe16.spec#L415; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:0488 KEYBOARD Ordinal_5 2147483647 0 verified unused-slot-verified pascal16 -ret16 AnsiToOem(str ptr) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/keyboard.drv16/keyboard.drv16.spec#L5; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. +1228:048c KEYBOARD Ordinal_6 2147483647 0 verified unused-slot-verified pascal16 -ret16 OemToAnsi(str ptr) Wine wine-11.15 https://gitlab.winehq.org/wine/wine/-/raw/wine-11.15/dlls/keyboard.drv16/keyboard.drv16.spec#L6; complete Ghidra CALL inventory and NE relocation inventory: zero call sites Explicit imported NE slot with no CALL reference anywhere in the complete image; no TDKPIN call-site behavior exists to reconstruct. diff --git a/original/MECHANICS_PROGRESS.md b/original/MECHANICS_PROGRESS.md index 6ebb2e4..f5f2244 100644 --- a/original/MECHANICS_PROGRESS.md +++ b/original/MECHANICS_PROGRESS.md @@ -1,4 +1,11 @@ -# Mechanics reconstruction progress +# Historical mechanics reconstruction notes + +This file preserves the live-Wine observations from the earlier mechanics-only +pass. Its former partial-status table and pending list are superseded by +`RECONSTRUCTION_PROGRESS.md` and `FUNCTION_RECONSTRUCTION.tsv`: all functions +named below, including the complete `1000:7ed9`, `1000:8b0d`, `1000:c79c`, and +`1000:eab1` paths, now have verified readable-C reconstructions. The runtime +captures below remain useful independent evidence. This ledger scopes the current reverse-engineering pass to the claw and flippers. The preserved executable is the authority; `TDKPIN_GHIDRA_RAW.c` @@ -48,18 +55,16 @@ renamed. - The speed scalar is 3800 millipixels per tick. Its Borland Real48 direction constants are decoded for all release cases in the readable C companion. -## Explicit pending evidence +## Evidence that was pending in this historical pass -- Transcribe the full raw fixed-point flipper impulse calculation. Production - behavior currently uses live-fitted up/down transfer curves with exact record - geometry and probe tests. -- Reproduce original callback batching for non-default detail settings. Physics - substeps and claw cadence are recovered, but Rust presents intermediate 10 ms - physics states instead of batching 1-5 substeps into one Win16 repaint. +- The full raw fixed-point flipper impulse calculation is now represented in + `reconstructed/tdkpin_flipper_collision.c` and verified at `1000:7ed9`. +- Original callback batching for detail settings 1..5 is now represented in + `reconstructed/tdkpin_timer_tick.c` and `tdkpin_physics.c`. Any later Rust + transfer remains a separate goal and is not part of this C phase. -Those items are intentionally not counted as semantic parity. The readable -C files preserve their raw constants and label unresolved batching/fitted -arithmetic so later work cannot silently turn an estimate into claimed evidence. +Those items were intentionally excluded from parity at the time of these notes; +their later C closure is recorded in the address-linked main ledger. ## Runtime comparison on 2026-08-22 @@ -147,7 +152,8 @@ from the record geometry. Three live left-edge probes at `(115,390)`, `(120,390)`, and `(125,390)` produced post-edge positions `(128.718,365)`, `(133.397,360)`, and `(138.182,355)` with raw velocities `(1932,-3523)`, `(2079,-4658)`, and `(2217,-5889)`. The Rust upward stroke fits those states; -the full raw calculation remains pending. A separate downstroke probe at +the full raw calculation was still pending in this historical pass and is now +closed by the verified `1000:7ed9` reconstruction. A separate downstroke probe at `(125,390)` kept position unchanged and assigned `(3519,6302)` before the next substep clamped speed to 3800; the Rust return edge now matches that state. diff --git a/original/MODULE_REFERENCES.tsv b/original/MODULE_REFERENCES.tsv new file mode 100644 index 0000000..dde3781 --- /dev/null +++ b/original/MODULE_REFERENCES.tsv @@ -0,0 +1,11 @@ +module_index module_name +1 KERNEL +2 MMTIMER +3 MMSYSTEM +4 KERNEL +5 GDI +6 USER +7 KEYBOARD +8 KERNEL +9 USER +10 KEYBOARD diff --git a/original/NE_SEGMENTS.tsv b/original/NE_SEGMENTS.tsv new file mode 100644 index 0000000..2289396 --- /dev/null +++ b/original/NE_SEGMENTS.tsv @@ -0,0 +1,7 @@ +segment selector file_offset file_length allocation_size zero_fill_bytes flags has_relocations +1 1000 3328 65082 65082 0 0x1d10 True +2 1008 81920 12485 12485 0 0x1d10 True +3 1010 97280 1516 1516 0 0x1d50 True +4 1018 99328 8058 8058 0 0x1d10 True +5 1020 108800 5923 5923 0 0x0d50 True +6 1028 115200 1864 19770 17906 0x0d41 True diff --git a/original/RECONSTRUCTION_PROGRESS.md b/original/RECONSTRUCTION_PROGRESS.md new file mode 100644 index 0000000..b3c60f8 --- /dev/null +++ b/original/RECONSTRUCTION_PROGRESS.md @@ -0,0 +1,149 @@ +# Complete C reconstruction progress + +This ledger tracks the full reconstruction of `TDKPIN.EXE`, not the narrower +Rust gameplay replica. The binary is authoritative: + +```text +a9022f1894e3e6e21fc42e8f6c932f7c549ca77f63aaa0c488bb9d55d9d0174c TDKPIN.EXE +``` + +The required deliverable is polished, readable C that accounts for every +binary-backed function, data object, callback, resource, import interaction, +and observable behavior. Raw Ghidra output remains immutable evidence and is +not itself accepted as reconstructed source. + +Until every completion gate in this file passes, the Rust project is explicitly +out of scope and must not be edited. Translation to Rust is a separate future +goal that begins only after the C reconstruction has passed its final audit. + +The preserved initial raw export is independently sealed as: + +```text +987a47580ba5c92fa071c989bdaeddf138e285d2b07106c5909a4acbc3e27088 TDKPIN_GHIDRA_RAW.c +``` + +## Current measured baseline + +| Gate | Current evidence | Status | +| --- | --- | --- | +| Known in-image functions | 391 ordinary functions plus six separately tracked overlapping/shared entries | 0 raw, 0 partial, 0 restored, 391 verified; all six shared entries verified; every code segment is raw-free | +| Readable function reconstruction | 63 separate strict-C11 modules under `reconstructed/` | complete; every ordinary/shared entry is address-linked and raw evidence is never used as the readable deliverable | +| Imported Win16 APIs | 292 slots / 140 unique declarations | 0 partial, 292 verified; 137 called slots have prototype/call-site evidence and 155 data/duplicate/unused slots have an explicit zero-CALL proof | +| Executable bytes | 93,064 total; every byte classified | complete structural classification | +| Non-overlapping Ghidra code/data | 93,062 bytes; 92,780 instruction bytes and 282 embedded-data bytes | complete within Ghidra's representation | +| Exceptional executable bytes | overlapping opcode at `1020:0666`; alignment NOP at `1020:0dea` | classified with byte-level evidence | +| Defined data | 578 Ghidra-defined units | raw inventory only | +| Referenced DGROUP addresses | 455 unique targets reached from 147 functions | 0 unknown, 0 restored, 455 verified after semantic projection | +| Byte-complete DGROUP ranges | 744 non-overlapping ranges / 19,770 bytes | 0 raw, 0 partial, 0 restored, 744 verified, 0 unknown | +| Semantic DGROUP objects | 219 exact objects | 0 raw, 0 partial, 0 restored, 219 verified, 0 unknown | +| Code-embedded data objects | 18 objects / all 282 executable data bytes | 0 unknown, 0 restored, 18 verified; exact inventory bijection enforced | +| Collision/rule records | 175 initialized records | exact static ledger and live dump available | +| Resources | 63 NE resource blocks | 0 raw, 0 partial, 0 restored, 63 verified; 57 directly managed, 2 Windows-resolved, and 4 explicitly linked-unused | +| Callback sites | six registration sites | all six verified, including bootstrap and generated bound thunks | +| Companion MMTIMER.DLL | SHA-256 `f1d9ac980c7bfba5dc53eaa9e7cb2c3cd9b82f879ee8962ad40bf863d641bb49` | ordinal 1 wrapper, internal callback, posted message 0580, timer-id return, and cancellation lifetime mapped | +| Live runtime | Wine 11.15 staging plus trace/dump/injection tooling | exact original exercised for startup/input and focused types 1/2/3/4, claw, flipper, multiball, and score transitions | +| Buildable reconstructed C | strict C11 Win16/segmented model and 89 focused harness units | complete; every one of 63 reconstructed C units is compiled by `test_reconstructed_c.sh`, all tests pass, and the Borland Real48 DOS reference probe is bit-exact | + +The prior 363-function inventory was incomplete. Classifying the executable +gaps recovered 28 additional Borland runtime entries and established the current +391-function denominator. It remains subject to later correction only if direct +control-flow or runtime evidence proves an overlapping/shared entry that Ghidra +cannot represent as an ordinary function. + +## Evidence artifacts + +- `TDKPIN_GHIDRA_RAW.c`: immutable original raw decompiler output; never regenerated. +- `FUNCTIONS.tsv` and `COVERAGE.tsv`: immutable inventories paired with that original export. +- `TDKPIN_GHIDRA_COMPLETE_RAW.c`: separate regenerated raw evidence containing + every currently recovered entry after missed-code seeding and Win16 import typing. +- `COMPLETE_FUNCTIONS.tsv` and `COMPLETE_COVERAGE.tsv`: inventories paired with + the separate complete raw evidence. +- `BINARY_FUNCTIONS.tsv`: function bodies, blocks, conventions, and provisional signatures. +- `REFERENCES.tsv`: complete Ghidra reference export for calls, jumps, reads, and writes. +- `DEFINED_DATA.tsv`: all currently defined data units. +- `SYMBOLS.tsv`: all loader/analyzer symbols. +- `UNEXPLAINED.tsv`: exact bytes outside ordinary function/code-data coverage; + both current rows have explicit overlap/alignment classifications and evidence. +- `SHARED_ENTRY_POINTS.tsv`: internal compiler/runtime entry points that begin + inside another decoded instruction stream, including the verified C-string + versus ShortString TextRec entries at `1020:049f` and `1020:04a0`. +- `FUNCTION_RECONSTRUCTION.tsv`: one semantic-status row per known in-image function. +- `IMPORT_RECONSTRUCTION.tsv`: one row per NE import slot, including module, + stack-purge size, direct call count, prototype status, and review evidence. +- `DATA_RECONSTRUCTION.tsv`: one row per currently referenced DGROUP address, + with readers/writers and unresolved semantic object boundaries made explicit. +- `DATA_COVERAGE.tsv`: byte-complete non-overlapping coverage of all 19,770 + DGROUP bytes, including the 17,906-byte zero-fill tail. +- `DATA_OBJECTS.tsv`: reviewed semantic data objects whose exact ranges and + types are projected into the byte-complete coverage ledger. +- `CODE_DATA_OBJECTS.tsv`: one semantic row for every defined data object + embedded in executable segments, including compiler tags, ShortStrings, + Real48 tables/constants, and the Borland runtime identification string. +- `ENTRY_POINTS.tsv`, `NE_SEGMENTS.tsv`, `MODULE_REFERENCES.tsv`, and + `RELOCATIONS.tsv`: direct NE metadata, including all 2,434 expanded relocation + sites and their internal/import targets. +- `RESOURCE_RECONSTRUCTION.tsv`: one verified row per NE resource with exact + extraction provenance, code/system user mapping, lifecycle, and explicit + classification of linked-but-unused Borland templates. +- `CALLBACK_RECONSTRUCTION.tsv`: every identified callback-registration site, + callback target, lifetime, and invocation path, all verified. +- `COVERAGE.tsv`: executable-byte coverage and memory-block inventory. +- `OBJECTS.tsv`: all initialized collision/rule records. +- `assets/manifest.json`: resource offsets, raw hashes, and decoded derivatives. +- `reconstructed/`: separate readable C modules and Win16/segmented-memory type model. +- `tools/test_reconstructed_c.sh`: strict C11 tests for verified numeric, + circular-buffer, key-table, selector, overlap, far-string, heap-ring, + Borland object ownership, stack-guard, and SystemTimer behavior. + +Run `python3 tools/audit_reconstruction.py` after every reconstruction batch. +It fails if the target hash, function bijection, raw markers, body metadata, +coverage totals, or collision-record inventory drift. + +Run `python3 tools/audit_reconstruction.py --require-complete` for the final +gate. It intentionally fails until every required function, import, data, +resource, and callback row is `verified` and no unclassified range remains. + +## Completion gates + +The reconstruction is complete only when all of the following are true: + +1. Every executable byte is classified as function code, embedded data, + relocation material, alignment, or unreachable padding with recorded + evidence; no row remains `unclassified`. +2. Every in-image function has exactly one address-linked readable-C + implementation and a `verified` ledger row. Combined or split source + helpers retain an explicit mapping to the original function ranges. +3. Every DGROUP region and code-embedded data object has a named type, extent, + initialization source, and complete read/write reference set. +4. All 292 imports have correct Win16 prototypes and every call site has + reviewed argument order, far-pointer handling, and return semantics. +5. Window procedures, dialog procedures, timer callbacks, multimedia paths, + and stored function pointers are separately inventoried and traced to their + registration and invocation sites. +6. All 63 resources and the companion `MMTIMER.DLL` are mapped to their users; + unused resources, if any, are explicitly identified rather than omitted. +7. Segmented pointers, DGROUP assumptions, 16-bit wrapping, Borland Real48, + calling conventions, stack cleanup, and indirect jump tables are represented + without silently replacing target behavior with modern equivalents. +8. The reconstructed sources pass strict syntax/build checks in their declared + compatibility model and focused normal/sanitizer harnesses where host + execution is meaningful. +9. Behavioral evidence is proportional and explicitly typed: complete + disassembly/data-flow closure for every required unit, strict focused C + harnesses for normal/error/ownership/ABI paths, a bit-exact 16-bit Borland + Real48 reference probe, and focused Wine comparisons where live state adds + evidence (startup/input, claw, flippers, collision types 1..4, multiball, + scoring, and timer substeps). Host-only tests are never labeled Wine probes. +10. The final audit reports zero `raw`, `partial`, `restored`, unknown, + unread, unclassified, or behaviorally unverified required units. + +## Work order + +1. Recover the Borland/Win16 ABI model and correct every imported and internal + signature before relying on decompiler parameter lists. +2. Group DGROUP references into typed data objects and recover initialization, + ownership, and lifecycle. +3. Reconstruct functions by subsystem into separate readable C modules while + preserving address-level traceability. +4. Add subsystem differential probes and promote ledger rows to `verified` only + when static and runtime evidence agree. diff --git a/original/REFERENCES.tsv b/original/REFERENCES.tsv new file mode 100644 index 0000000..bd12a50 --- /dev/null +++ b/original/REFERENCES.tsv @@ -0,0 +1,12081 @@ +from_address from_function reference_type operand_index primary to_address to_block to_function to_symbol +1000:0006 FUN_1000_0002 DATA 0 true Stack[0x6] - +1000:0009 FUN_1000_0002 UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1000:000e FUN_1000_0002 DATA 0 true Stack[-0xc] - +1000:0011 FUN_1000_0002 DATA 0 true Stack[0x6] - +1000:0014 FUN_1000_0002 UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1000:0019 FUN_1000_0002 DATA 0 true Stack[-0xe] - +1000:001c FUN_1000_0002 DATA 0 true Stack[0x6] - +1000:001f FUN_1000_0002 UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1000:0024 FUN_1000_0002 DATA 0 true Stack[-0x10] - +1000:0027 FUN_1000_0002 DATA 0 true Stack[0x6] - +1000:002e FUN_1000_0002 UNCONDITIONAL_CALL 0 true 1228:0158 EXTERNAL CREATECOMPATIBLEBITMAP CREATECOMPATIBLEBITMAP +1000:0033 FUN_1000_0002 DATA 0 true Stack[-0xa] - +1000:0036 FUN_1000_0002 DATA 0 true Stack[-0xc] - +1000:0039 FUN_1000_0002 READ 0 true 1028:085b Data6 DAT_1028_085b +1000:003d FUN_1000_0002 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:0042 FUN_1000_0002 DATA 0 true Stack[-0x4] - +1000:0045 FUN_1000_0002 DATA 0 true Stack[-0xe] - +1000:0048 FUN_1000_0002 DATA 1 true Stack[0x4] - +1000:0051 FUN_1000_0002 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:0056 FUN_1000_0002 DATA 0 true Stack[-0x6] - +1000:0059 FUN_1000_0002 DATA 0 true Stack[-0x10] - +1000:005c FUN_1000_0002 DATA 0 true Stack[-0xa] - +1000:005f FUN_1000_0002 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:0064 FUN_1000_0002 DATA 0 true Stack[-0x8] - +1000:0067 FUN_1000_0002 DATA 0 true Stack[-0x10] - +1000:0072 FUN_1000_0002 DATA 0 true Stack[-0xc] - +1000:007e FUN_1000_0002 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:0083 FUN_1000_0002 DATA 0 true Stack[-0xc] - +1000:008e FUN_1000_0002 DATA 0 true Stack[-0xe] - +1000:009a FUN_1000_0002 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:009f FUN_1000_0002 DATA 0 true Stack[-0xc] - +1000:00aa FUN_1000_0002 DATA 0 true Stack[-0x10] - +1000:00b6 FUN_1000_0002 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:00bb FUN_1000_0002 DATA 0 true Stack[-0x10] - +1000:00be FUN_1000_0002 DATA 0 true Stack[-0x8] - +1000:00c1 FUN_1000_0002 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:00c6 FUN_1000_0002 DATA 0 true Stack[-0xe] - +1000:00c9 FUN_1000_0002 DATA 0 true Stack[-0x6] - +1000:00cc FUN_1000_0002 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:00d1 FUN_1000_0002 DATA 0 true Stack[-0xc] - +1000:00d4 FUN_1000_0002 DATA 0 true Stack[-0x4] - +1000:00d7 FUN_1000_0002 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:00dc FUN_1000_0002 DATA 0 true Stack[-0xa] - +1000:00df FUN_1000_0002 UNCONDITIONAL_CALL 0 true 1228:0168 EXTERNAL DELETEOBJECT DELETEOBJECT +1000:00e4 FUN_1000_0002 DATA 0 true Stack[-0x10] - +1000:00e7 FUN_1000_0002 UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1000:00ec FUN_1000_0002 DATA 0 true Stack[-0xe] - +1000:00ef FUN_1000_0002 UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1000:00f4 FUN_1000_0002 DATA 0 true Stack[-0xc] - +1000:00f7 FUN_1000_0002 UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1000:0103 FUN_1000_0100 DATA 1 true Stack[0x4] - +1000:0108 FUN_1000_0100 UNCONDITIONAL_CALL 0 true 1018:1b57 Code4 FUN_1018_1b57 FUN_1018_1b57 +1000:0118 FUN_1000_0100 UNCONDITIONAL_CALL 0 true 1010:03af Code3 FUN_1010_03af FUN_1010_03af +1000:0124 FUN_1000_0121 READ 0 true 1028:06fc Data6 DAT_1028_06fc +1000:0129 FUN_1000_0121 CONDITIONAL_JUMP 0 true 1000:014e Code1 LAB_1000_014e +1000:013c FUN_1000_0121 UNCONDITIONAL_CALL 0 true 1000:01d3 Code1 FUN_1000_01d3 FUN_1000_01d3 +1000:0141 FUN_1000_0121 DATA 1 true Stack[0x4] - +1000:014c FUN_1000_0121 UNCONDITIONAL_JUMP 0 true 1000:0168 Code1 LAB_1000_0168 +1000:015d FUN_1000_0121 READ 0 true 1028:0668 Data6 DAT_1028_0668 +1000:015d FUN_1000_0121 READ 0 false 1028:0666 Data6 DAT_1028_0666 +1000:015d FUN_1000_0121 COMPUTED_CALL -1 true 1228:018c EXTERNAL MESSAGEBOX MESSAGEBOX +1000:0163 FUN_1000_0121 UNCONDITIONAL_CALL 0 true 1020:0061 Code5 FUN_1020_0061 FUN_1020_0061 +1000:016f FUN_1000_016c DATA 1 true Stack[0x8] - +1000:0174 FUN_1000_016c DATA 1 true Stack[0x4] - +1000:0179 FUN_1000_016c UNCONDITIONAL_CALL 0 true 1018:1274 Code4 FUN_1018_1274 FUN_1018_1274 +1000:017e FUN_1000_016c DATA 1 true Stack[0x8] - +1000:0186 FUN_1000_016c READ 0 true 1028:06fe Data6 DAT_1028_06fe +1000:018f FUN_1000_016c UNCONDITIONAL_CALL 0 true 1228:027c EXTERNAL LOADICON LOADICON +1000:0194 FUN_1000_016c DATA 1 true Stack[0x8] - +1000:01a2 FUN_1000_016c UNCONDITIONAL_CALL 0 true 1228:0278 EXTERNAL LOADCURSOR LOADCURSOR +1000:01a7 FUN_1000_016c DATA 1 true Stack[0x8] - +1000:01b0 FUN_1000_016c UNCONDITIONAL_CALL 0 true 1228:016c EXTERNAL GETSTOCKOBJECT GETSTOCKOBJECT +1000:01b5 FUN_1000_016c DATA 1 true Stack[0x8] - +1000:01bc FUN_1000_016c READ 1 true 1028:06fe Data6 DAT_1028_06fe +1000:01d9 FUN_1000_01d3 UNCONDITIONAL_CALL 0 true 1020:03ef Code5 FUN_1020_03ef FUN_1020_03ef +1000:01de FUN_1000_01d3 CONDITIONAL_JUMP 0 true 1000:01e3 Code1 LAB_1000_01e3 +1000:01e0 FUN_1000_01d3 UNCONDITIONAL_JUMP 0 true 1000:0265 Code1 LAB_1000_0265 +1000:01e3 FUN_1000_01d3 DATA 0 true Stack[0x10] - +1000:01e6 FUN_1000_01d3 DATA 0 true Stack[0xe] - +1000:01e9 FUN_1000_01d3 DATA 0 true Stack[0xc] - +1000:01ec FUN_1000_01d3 DATA 0 true Stack[0xa] - +1000:01f2 FUN_1000_01d3 DATA 1 true Stack[0x4] - +1000:01f7 FUN_1000_01d3 UNCONDITIONAL_CALL 0 true 1018:1106 Code4 FUN_1018_1106 FUN_1018_1106 +1000:01fc FUN_1000_01d3 DATA 1 true Stack[0x4] - +1000:0203 FUN_1000_01d3 DATA 0 true Stack[-0xa] - +1000:0206 FUN_1000_01d3 DATA 0 true Stack[-0x8] - +1000:0222 FUN_1000_01d3 UNCONDITIONAL_CALL 0 true 1228:0288 EXTERNAL GETSYSTEMMETRICS GETSYSTEMMETRICS +1000:0230 FUN_1000_01d3 DATA 1 true Stack[-0xa] - +1000:0244 FUN_1000_01d3 UNCONDITIONAL_CALL 0 true 1228:0288 EXTERNAL GETSYSTEMMETRICS GETSYSTEMMETRICS +1000:0252 FUN_1000_01d3 DATA 1 true Stack[-0xa] - +1000:0265 FUN_1000_01d3 DATA 1 true Stack[0x4] - +1000:0274 FUN_1000_0270 WRITE 0 true 1028:07cf Data6 DAT_1028_07cf +1000:0279 FUN_1000_0270 WRITE 0 true 1028:0874 Data6 DAT_1028_0874 +1000:027e FUN_1000_0270 WRITE 0 true 1028:0875 Data6 DAT_1028_0875 +1000:0283 FUN_1000_0270 DATA 1 true Stack[0x4] - +1000:029a FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1020:0167 Code5 FUN_1020_0167 FUN_1020_0167 +1000:02a2 FUN_1000_0270 CONDITIONAL_JUMP 0 true 1000:02ab Code1 LAB_1000_02ab +1000:02a4 FUN_1000_0270 CONDITIONAL_JUMP 0 true 1000:02cf Code1 LAB_1000_02cf +1000:02a9 FUN_1000_0270 CONDITIONAL_JUMP 0 true 1000:02cf Code1 LAB_1000_02cf +1000:02ba FUN_1000_0270 READ 0 true 1028:0668 Data6 DAT_1028_0668 +1000:02ba FUN_1000_0270 READ 0 false 1028:0666 Data6 DAT_1028_0666 +1000:02ba FUN_1000_0270 COMPUTED_CALL -1 true 1228:018c EXTERNAL MESSAGEBOX MESSAGEBOX +1000:02be FUN_1000_0270 DATA 1 true Stack[0x4] - +1000:02c3 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1018:0f38 Code4 FUN_1018_0f38 FUN_1018_0f38 +1000:02ca FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1020:0061 Code5 FUN_1020_0061 FUN_1020_0061 +1000:02cf FUN_1000_0270 DATA 1 true Stack[0x4] - +1000:02d4 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1018:170c Code4 FUN_1018_170c FUN_1018_170c +1000:02e0 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1228:0278 EXTERNAL LOADCURSOR LOADCURSOR +1000:02e6 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1228:0208 EXTERNAL SETCURSOR SETCURSOR +1000:02eb FUN_1000_0270 DATA 1 true Stack[0x4] - +1000:02f2 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0023 Code2 FUN_1008_0023 FUN_1008_0023 +1000:02f7 FUN_1000_0270 READ 0 true 1028:06fe Data6 DAT_1028_06fe +1000:0305 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:1326 Code2 FUN_1008_1326 FUN_1008_1326 +1000:030a FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:11c5 Code2 FUN_1008_11c5 FUN_1008_11c5 +1000:030f FUN_1000_0270 WRITE 0 true 1028:07cc Data6 DAT_1028_07cc +1000:0314 FUN_1000_0270 DATA 1 true Stack[0x4] - +1000:032c FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1228:0198 EXTERNAL GETTICKCOUNT GETTICKCOUNT +1000:0331 FUN_1000_0270 WRITE 0 true 1028:0720 Data6 DAT_1028_0720 +1000:0334 FUN_1000_0270 WRITE 0 true 1028:0722 Data6 DAT_1028_0722 +1000:0338 FUN_1000_0270 DATA 1 true Stack[0x4] - +1000:0342 FUN_1000_0270 WRITE 0 true 1028:07c7 Data6 DAT_1028_07c7 +1000:0347 FUN_1000_0270 WRITE 0 true 1028:07c8 Data6 DAT_1028_07c8 +1000:034c FUN_1000_0270 WRITE 0 true 1028:086d Data6 DAT_1028_086d +1000:0352 FUN_1000_0270 WRITE 0 true 1028:086f Data6 DAT_1028_086f +1000:0358 FUN_1000_0270 WRITE 0 true 1028:0873 Data6 DAT_1028_0873 +1000:035d FUN_1000_0270 WRITE 0 true 1028:07ca Data6 DAT_1028_07ca +1000:0362 FUN_1000_0270 WRITE 0 true 1028:07cb Data6 DAT_1028_07cb +1000:0367 FUN_1000_0270 WRITE 0 true 1028:07c9 Data6 DAT_1028_07c9 +1000:03a4 FUN_1000_0270 WRITE 0 true 1028:07d3 Data6 DAT_1028_07d3 +1000:03a7 FUN_1000_0270 WRITE 0 true 1028:07d5 Data6 DAT_1028_07d5 +1000:03b5 FUN_1000_0270 WRITE 0 true 1028:07d7 Data6 DAT_1028_07d7 +1000:03b8 FUN_1000_0270 WRITE 0 true 1028:07d9 Data6 DAT_1028_07d9 +1000:03e0 FUN_1000_0270 WRITE 0 true 1028:07c5 Data6 DAT_1028_07c5 +1000:03eb FUN_1000_0270 WRITE 0 true 1028:07d0 Data6 DAT_1028_07d0 +1000:03f0 FUN_1000_0270 WRITE 0 true 1028:07d1 Data6 DAT_1028_07d1 +1000:03fa FUN_1000_0270 WRITE 0 true 1028:086b Data6 DAT_1028_086b +1000:0402 FUN_1000_0270 WRITE 0 true 1028:0869 Data6 DAT_1028_0869 +1000:0407 FUN_1000_0270 WRITE 0 true 1028:0876 Data6 DAT_1028_0876 +1000:040a FUN_1000_0270 WRITE 0 true 1028:0878 Data6 DAT_1028_0878 +1000:040f FUN_1000_0270 WRITE 0 true 1028:087a Data6 DAT_1028_087a +1000:0412 FUN_1000_0270 WRITE 0 true 1028:087c Data6 DAT_1028_087c +1000:0415 FUN_1000_0270 DATA 0 true Stack[-0x4] - +1000:041a FUN_1000_0270 UNCONDITIONAL_JUMP 0 true 1000:041f Code1 LAB_1000_041f +1000:041c FUN_1000_0270 DATA 0 true Stack[-0x4] - +1000:041f FUN_1000_0270 DATA 1 true Stack[-0x4] - +1000:0422 FUN_1000_0270 DATA 1 true Stack[0x4] - +1000:042d FUN_1000_0270 DATA 1 true Stack[-0x4] - +1000:0430 FUN_1000_0270 DATA 1 true Stack[0x4] - +1000:043b FUN_1000_0270 DATA 1 true Stack[-0x4] - +1000:043e FUN_1000_0270 DATA 1 true Stack[0x4] - +1000:0449 FUN_1000_0270 DATA 1 true Stack[-0x4] - +1000:044c FUN_1000_0270 DATA 1 true Stack[0x4] - +1000:0457 FUN_1000_0270 DATA 0 true Stack[-0x4] - +1000:045b FUN_1000_0270 CONDITIONAL_JUMP 0 true 1000:041c Code1 LAB_1000_041c +1000:045d FUN_1000_0270 DATA 0 true Stack[-0x4] - +1000:0462 FUN_1000_0270 UNCONDITIONAL_JUMP 0 true 1000:0467 Code1 LAB_1000_0467 +1000:0464 FUN_1000_0270 DATA 0 true Stack[-0x4] - +1000:0467 FUN_1000_0270 DATA 1 true Stack[-0x4] - +1000:046f FUN_1000_0270 WRITE 0 true 1028:0982 Data6 DAT_1028_0982 +1000:046f FUN_1000_0270 WRITE 0 false 1028:0986 Data6 DAT_1028_0986 +1000:0473 FUN_1000_0270 WRITE 0 true 1028:0984 Data6 DAT_1028_0984 +1000:0473 FUN_1000_0270 WRITE 0 false 1028:0988 Data6 DAT_1028_0988 +1000:0477 FUN_1000_0270 DATA 1 true Stack[-0x4] - +1000:047f FUN_1000_0270 WRITE 0 true 1028:0992 Data6 DAT_1028_0992 +1000:047f FUN_1000_0270 WRITE 0 false 1028:0996 Data6 DAT_1028_0996 +1000:0483 FUN_1000_0270 WRITE 0 true 1028:0994 Data6 DAT_1028_0994 +1000:0483 FUN_1000_0270 WRITE 0 false 1028:0998 Data6 DAT_1028_0998 +1000:0487 FUN_1000_0270 DATA 1 true Stack[-0x4] - +1000:048a FUN_1000_0270 WRITE 0 true 1028:09a2 Data6 DAT_1028_09a2 +1000:048a FUN_1000_0270 WRITE 0 false 1028:09a3 Data6 DAT_1028_09a3 +1000:048f FUN_1000_0270 DATA 1 true Stack[-0x4] - +1000:0496 FUN_1000_0270 WRITE 0 true 1028:09a6 Data6 DAT_1028_09a6 +1000:0496 FUN_1000_0270 WRITE 0 false 1028:09a8 Data6 DAT_1028_09a8 +1000:049a FUN_1000_0270 DATA 1 true Stack[-0x4] - +1000:049f FUN_1000_0270 WRITE 0 true 1028:0821 Data6 DAT_1028_0821 +1000:04a5 FUN_1000_0270 DATA 1 true Stack[-0x4] - +1000:04a8 FUN_1000_0270 WRITE 0 true 1028:0817 Data6 DAT_1028_0817 +1000:04ad FUN_1000_0270 DATA 1 true Stack[-0x4] - +1000:04b3 FUN_1000_0270 WRITE 0 true 1028:0839 Data6 DAT_1028_0839 +1000:04b9 FUN_1000_0270 WRITE 0 true 1028:083b Data6 DAT_1028_083b +1000:04bf FUN_1000_0270 DATA 1 true Stack[-0x4] - +1000:04c2 FUN_1000_0270 WRITE 0 true 1028:081b Data6 DAT_1028_081b +1000:04c7 FUN_1000_0270 DATA 0 true Stack[-0x4] - +1000:04cb FUN_1000_0270 CONDITIONAL_JUMP 0 true 1000:0464 Code1 LAB_1000_0464 +1000:04cd FUN_1000_0270 WRITE 0 true 1028:0829 Data6 DAT_1028_0829 +1000:04d3 FUN_1000_0270 WRITE 0 true 1028:082b Data6 DAT_1028_082b +1000:04d9 FUN_1000_0270 WRITE 0 true 1028:082d Data6 DAT_1028_082d +1000:04df FUN_1000_0270 WRITE 0 true 1028:082f Data6 DAT_1028_082f +1000:04e5 FUN_1000_0270 WRITE 0 true 1028:0831 Data6 DAT_1028_0831 +1000:04eb FUN_1000_0270 WRITE 0 true 1028:0833 Data6 DAT_1028_0833 +1000:04f1 FUN_1000_0270 WRITE 0 true 1028:0835 Data6 DAT_1028_0835 +1000:04f7 FUN_1000_0270 WRITE 0 true 1028:0837 Data6 DAT_1028_0837 +1000:04fd FUN_1000_0270 DATA 1 true Stack[0x4] - +1000:052d FUN_1000_0270 READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:0530 FUN_1000_0270 READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:053f FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:0544 FUN_1000_0270 DATA 1 true Stack[0x4] - +1000:055d FUN_1000_0270 READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:0560 FUN_1000_0270 READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:056f FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:0574 FUN_1000_0270 DATA 1 true Stack[0x4] - +1000:05a7 FUN_1000_0270 DATA 0 true Stack[-0x6b] - +1000:05ac FUN_1000_0270 DATA 0 true Stack[-0x2d2] - +1000:05b4 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1020:082e Code5 FUN_1020_082e FUN_1020_082e +1000:05b9 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:2f2f Code2 FUN_1008_2f2f FUN_1008_2f2f +1000:05be FUN_1000_0270 DATA 0 true Stack[-0xd0] - +1000:05c4 FUN_1000_0270 DATA 0 true Stack[-0x6b] - +1000:05ce FUN_1000_0270 DATA 0 true Stack[-0x2d2] - +1000:05d6 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1020:082e Code5 FUN_1020_082e FUN_1020_082e +1000:05db FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1020:0a7d Code5 FUN_1020_0a7d FUN_1020_0a7d +1000:05e1 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:2f07 Code2 FUN_1008_2f07 FUN_1008_2f07 +1000:05e6 FUN_1000_0270 DATA 0 true Stack[-0xd0] - +1000:05f1 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:2f4d Code2 FUN_1008_2f4d FUN_1008_2f4d +1000:0602 FUN_1000_0270 DATA 0 true Stack[-0xd0] - +1000:0608 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1228:0070 EXTERNAL GETPRIVATEPROFILEINT GETPRIVATEPROFILEINT +1000:060d FUN_1000_0270 WRITE 0 true 1028:07cd Data6 DAT_1028_07cd +1000:0610 FUN_1000_0270 READ 0 true 1028:07cd Data6 DAT_1028_07cd +1000:0615 FUN_1000_0270 CONDITIONAL_JUMP 0 true 1000:061e Code1 LAB_1000_061e +1000:0617 FUN_1000_0270 READ 0 true 1028:07cd Data6 DAT_1028_07cd +1000:061c FUN_1000_0270 CONDITIONAL_JUMP 0 true 1000:0624 Code1 LAB_1000_0624 +1000:061e FUN_1000_0270 WRITE 0 true 1028:07cd Data6 DAT_1028_07cd +1000:0630 FUN_1000_0270 DATA 0 true Stack[-0xd0] - +1000:0636 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1228:0070 EXTERNAL GETPRIVATEPROFILEINT GETPRIVATEPROFILEINT +1000:063b FUN_1000_0270 DATA 1 true Stack[0x4] - +1000:0647 FUN_1000_0270 CONDITIONAL_JUMP 0 true 1000:0650 Code1 LAB_1000_0650 +1000:064e FUN_1000_0270 CONDITIONAL_JUMP 0 true 1000:0658 Code1 LAB_1000_0658 +1000:0650 FUN_1000_0270 DATA 1 true Stack[0x4] - +1000:0658 FUN_1000_0270 DATA 1 true Stack[0x4] - +1000:0661 FUN_1000_0270 CONDITIONAL_JUMP 0 true 1000:068a Code1 LAB_1000_068a +1000:067b FUN_1000_0270 DATA 0 true Stack[-0x1d2] - +1000:0681 FUN_1000_0270 WRITE 0 true 1028:0871 Data6 DAT_1028_0871 +1000:0687 FUN_1000_0270 UNCONDITIONAL_JUMP 0 true 1000:0767 Code1 LAB_1000_0767 +1000:068c FUN_1000_0270 CONDITIONAL_JUMP 0 true 1000:06b8 Code1 LAB_1000_06b8 +1000:068e FUN_1000_0270 DATA 1 true Stack[0x4] - +1000:06a9 FUN_1000_0270 DATA 0 true Stack[-0x1d2] - +1000:06af FUN_1000_0270 WRITE 0 true 1028:0871 Data6 DAT_1028_0871 +1000:06b5 FUN_1000_0270 UNCONDITIONAL_JUMP 0 true 1000:0767 Code1 LAB_1000_0767 +1000:06ba FUN_1000_0270 CONDITIONAL_JUMP 0 true 1000:06e6 Code1 LAB_1000_06e6 +1000:06bc FUN_1000_0270 DATA 1 true Stack[0x4] - +1000:06d7 FUN_1000_0270 DATA 0 true Stack[-0x1d2] - +1000:06dd FUN_1000_0270 WRITE 0 true 1028:0871 Data6 DAT_1028_0871 +1000:06e3 FUN_1000_0270 UNCONDITIONAL_JUMP 0 true 1000:0767 Code1 LAB_1000_0767 +1000:06e8 FUN_1000_0270 CONDITIONAL_JUMP 0 true 1000:0713 Code1 LAB_1000_0713 +1000:06ea FUN_1000_0270 DATA 1 true Stack[0x4] - +1000:0705 FUN_1000_0270 DATA 0 true Stack[-0x1d2] - +1000:070b FUN_1000_0270 WRITE 0 true 1028:0871 Data6 DAT_1028_0871 +1000:0711 FUN_1000_0270 UNCONDITIONAL_JUMP 0 true 1000:0767 Code1 LAB_1000_0767 +1000:0715 FUN_1000_0270 CONDITIONAL_JUMP 0 true 1000:0740 Code1 LAB_1000_0740 +1000:0717 FUN_1000_0270 DATA 1 true Stack[0x4] - +1000:0732 FUN_1000_0270 DATA 0 true Stack[-0x1d2] - +1000:0738 FUN_1000_0270 WRITE 0 true 1028:0871 Data6 DAT_1028_0871 +1000:073e FUN_1000_0270 UNCONDITIONAL_JUMP 0 true 1000:0767 Code1 LAB_1000_0767 +1000:0740 FUN_1000_0270 DATA 1 true Stack[0x4] - +1000:075b FUN_1000_0270 DATA 0 true Stack[-0x1d2] - +1000:0761 FUN_1000_0270 WRITE 0 true 1028:0871 Data6 DAT_1028_0871 +1000:0767 FUN_1000_0270 DATA 1 true Stack[0x4] - +1000:076e FUN_1000_0270 DATA 0 true Stack[-0x1d2] - +1000:077e FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:28a3 Code2 FUN_1008_28a3 FUN_1008_28a3 +1000:0783 FUN_1000_0270 DATA 1 true Stack[0x4] - +1000:0796 FUN_1000_0270 CONDITIONAL_JUMP 0 true 1000:07b4 Code1 LAB_1000_07b4 +1000:07a9 FUN_1000_0270 READ 0 true 1028:0668 Data6 DAT_1028_0668 +1000:07a9 FUN_1000_0270 READ 0 false 1028:0666 Data6 DAT_1028_0666 +1000:07a9 FUN_1000_0270 COMPUTED_CALL -1 true 1228:018c EXTERNAL MESSAGEBOX MESSAGEBOX +1000:07af FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1020:0061 Code5 FUN_1020_0061 FUN_1020_0061 +1000:0818 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:0882 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:08ec FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:0958 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:09c3 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:0a2c FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:0a97 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:0b01 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:0b6c FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:0bd5 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:0c40 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:0cab FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:0d15 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:0d81 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:0dea FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:0e54 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:0ebd FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:0f27 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:0f90 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:0ff8 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:1062 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:10cb FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:1134 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:119d FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:1206 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:126f FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:12d9 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:1344 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:13ad FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:1416 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:147f FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:14e8 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:1551 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:15ba FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:1622 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:1689 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:16f0 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:1757 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:17be FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:1826 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:188f FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:18f7 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:1960 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:19c8 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:1a31 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:1a99 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:1b01 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:1b69 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:1bd2 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:1c3a FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:1ca3 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:1d0c FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:1d80 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:1df2 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:1e66 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:1ecc FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:1f37 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:1f9c FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:2001 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:2066 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:20cb FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:2133 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:219a FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:2203 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:226c FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:22d5 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:233b FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:23a3 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:240a FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:2472 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:24d9 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:253e FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:25a3 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:2608 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:266d FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:26d8 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:2741 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:27aa FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:2815 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:287e FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:28e9 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:2950 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:29b9 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:2a20 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:2a89 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:2af0 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:2b56 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:2bbc FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:2c23 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:2c8a FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:2cef FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:2d5d FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:2dcb FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:2e39 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:2ea7 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:2f15 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:2f83 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:2ff1 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:305f FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:30cd FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:313b FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:31a8 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:3215 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:3283 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:32f0 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:335d FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:33c8 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:3431 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:34a2 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:350b FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:3579 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:35e5 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:3651 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:36bf FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:372b FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:3797 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:3805 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:3871 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:38dd FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:394b FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:39b7 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:3a23 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:3a8b FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:3af1 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:3b57 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:3bc0 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:3c28 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:3c90 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:3cf7 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:3d60 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:3dc5 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:3e2a FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:3e90 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:3ef6 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:3f5b FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:3fc3 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:402b FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:4094 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:40fd FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:4166 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:41ce FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:4235 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:429c FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:4303 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:4369 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:43cd FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:4431 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:4495 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:44f9 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:455e FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:45c2 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:4629 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:4690 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:46f7 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:475e FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:47c9 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:4832 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:489c FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:4905 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:496f FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:49d8 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:4a42 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:4aab FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:4b15 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:4b7e FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:4be8 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:4c51 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:4cbb FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:4d22 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:4d8b FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:4df6 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:4e5e FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:4ec7 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:4f2e FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:4f97 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:4ffc FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:5061 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0138 Code2 FUN_1008_0138 FUN_1008_0138 +1000:5072 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0787 Code2 FUN_1008_0787 FUN_1008_0787 +1000:5084 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0787 Code2 FUN_1008_0787 FUN_1008_0787 +1000:5097 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0787 Code2 FUN_1008_0787 FUN_1008_0787 +1000:50aa FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0787 Code2 FUN_1008_0787 FUN_1008_0787 +1000:50bd FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0787 Code2 FUN_1008_0787 FUN_1008_0787 +1000:50cc FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0787 Code2 FUN_1008_0787 FUN_1008_0787 +1000:50db FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0787 Code2 FUN_1008_0787 FUN_1008_0787 +1000:50ea FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0787 Code2 FUN_1008_0787 FUN_1008_0787 +1000:50f9 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0787 Code2 FUN_1008_0787 FUN_1008_0787 +1000:5108 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0787 Code2 FUN_1008_0787 FUN_1008_0787 +1000:5117 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0787 Code2 FUN_1008_0787 FUN_1008_0787 +1000:5126 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0787 Code2 FUN_1008_0787 FUN_1008_0787 +1000:5135 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0787 Code2 FUN_1008_0787 FUN_1008_0787 +1000:5144 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0787 Code2 FUN_1008_0787 FUN_1008_0787 +1000:5153 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0787 Code2 FUN_1008_0787 FUN_1008_0787 +1000:5162 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0787 Code2 FUN_1008_0787 FUN_1008_0787 +1000:5173 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0787 Code2 FUN_1008_0787 FUN_1008_0787 +1000:5184 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0787 Code2 FUN_1008_0787 FUN_1008_0787 +1000:5193 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0787 Code2 FUN_1008_0787 FUN_1008_0787 +1000:51a2 FUN_1000_0270 UNCONDITIONAL_CALL 0 true 1008:0787 Code2 FUN_1008_0787 FUN_1008_0787 +1000:51a7 FUN_1000_0270 DATA 0 true Stack[-0x4] - +1000:51ac FUN_1000_0270 UNCONDITIONAL_JUMP 0 true 1000:51b1 Code1 LAB_1000_51b1 +1000:51ae FUN_1000_0270 DATA 0 true Stack[-0x4] - +1000:51b1 FUN_1000_0270 DATA 1 true Stack[-0x4] - +1000:51b5 FUN_1000_0270 READ 1 true 1028:09e2 Data6 DAT_1028_09e2 +1000:51b5 FUN_1000_0270 READ 1 false 1028:0a35 Data6 DAT_1028_0a35 +1000:51b9 FUN_1000_0270 DATA 1 true Stack[-0x4] - +1000:51bc FUN_1000_0270 DATA 1 true Stack[0x4] - +1000:51c6 FUN_1000_0270 DATA 1 true Stack[-0x4] - +1000:51ca FUN_1000_0270 READ 1 true 1028:09f1 Data6 DAT_1028_09f1 +1000:51ca FUN_1000_0270 READ 1 false 1028:0a44 Data6 DAT_1028_0a44 +1000:51ce FUN_1000_0270 DATA 1 true Stack[-0x4] - +1000:51d3 FUN_1000_0270 DATA 1 true Stack[0x4] - +1000:51dd FUN_1000_0270 DATA 1 true Stack[-0x4] - +1000:51e0 FUN_1000_0270 DATA 1 true Stack[0x4] - +1000:51ea FUN_1000_0270 DATA 0 true Stack[-0x4] - +1000:51ef FUN_1000_0270 CONDITIONAL_JUMP 0 true 1000:51ae Code1 LAB_1000_51ae +1000:5200 FUN_1000_51f5 UNCONDITIONAL_CALL 0 true 1228:0278 EXTERNAL LOADCURSOR LOADCURSOR +1000:5206 FUN_1000_51f5 UNCONDITIONAL_CALL 0 true 1228:0208 EXTERNAL SETCURSOR SETCURSOR +1000:520b FUN_1000_51f5 DATA 0 true Stack[-0x6] - +1000:520e FUN_1000_51f5 UNCONDITIONAL_CALL 0 true 1008:10e3 Code2 FUN_1008_10e3 FUN_1008_10e3 +1000:5213 FUN_1000_51f5 DATA 1 true Stack[0x4] - +1000:522a FUN_1000_51f5 CONDITIONAL_JUMP 0 true 1000:523b Code1 LAB_1000_523b +1000:523b FUN_1000_51f5 UNCONDITIONAL_CALL 0 true 1008:00e2 Code2 FUN_1008_00e2 FUN_1008_00e2 +1000:5240 FUN_1000_51f5 DATA 1 true Stack[0x4] - +1000:5247 FUN_1000_51f5 UNCONDITIONAL_CALL 0 true 1228:0168 EXTERNAL DELETEOBJECT DELETEOBJECT +1000:524c FUN_1000_51f5 READ 0 true 1028:0859 Data6 DAT_1028_0859 +1000:5250 FUN_1000_51f5 UNCONDITIONAL_CALL 0 true 1228:0168 EXTERNAL DELETEOBJECT DELETEOBJECT +1000:5255 FUN_1000_51f5 READ 0 true 1028:0863 Data6 DAT_1028_0863 +1000:5259 FUN_1000_51f5 UNCONDITIONAL_CALL 0 true 1228:0168 EXTERNAL DELETEOBJECT DELETEOBJECT +1000:525e FUN_1000_51f5 READ 0 true 1028:0865 Data6 DAT_1028_0865 +1000:5262 FUN_1000_51f5 UNCONDITIONAL_CALL 0 true 1228:0168 EXTERNAL DELETEOBJECT DELETEOBJECT +1000:5267 FUN_1000_51f5 READ 0 true 1028:085f Data6 DAT_1028_085f +1000:526b FUN_1000_51f5 UNCONDITIONAL_CALL 0 true 1228:0168 EXTERNAL DELETEOBJECT DELETEOBJECT +1000:5270 FUN_1000_51f5 READ 0 true 1028:085b Data6 DAT_1028_085b +1000:5274 FUN_1000_51f5 UNCONDITIONAL_CALL 0 true 1228:0168 EXTERNAL DELETEOBJECT DELETEOBJECT +1000:5279 FUN_1000_51f5 READ 0 true 1028:0861 Data6 DAT_1028_0861 +1000:527d FUN_1000_51f5 UNCONDITIONAL_CALL 0 true 1228:0168 EXTERNAL DELETEOBJECT DELETEOBJECT +1000:5282 FUN_1000_51f5 READ 0 true 1028:085d Data6 DAT_1028_085d +1000:5286 FUN_1000_51f5 UNCONDITIONAL_CALL 0 true 1228:0168 EXTERNAL DELETEOBJECT DELETEOBJECT +1000:528d FUN_1000_51f5 DATA 0 true Stack[-0x4] - +1000:5290 FUN_1000_51f5 UNCONDITIONAL_JUMP 0 true 1000:5295 Code1 LAB_1000_5295 +1000:5292 FUN_1000_51f5 DATA 0 true Stack[-0x4] - +1000:5295 FUN_1000_51f5 DATA 1 true Stack[-0x4] - +1000:529e FUN_1000_51f5 UNCONDITIONAL_CALL 0 true 1228:0168 EXTERNAL DELETEOBJECT DELETEOBJECT +1000:52a3 FUN_1000_51f5 DATA 0 true Stack[-0x4] - +1000:52a7 FUN_1000_51f5 CONDITIONAL_JUMP 0 true 1000:5292 Code1 LAB_1000_5292 +1000:52a9 FUN_1000_51f5 DATA 0 true Stack[-0x4] - +1000:52ae FUN_1000_51f5 UNCONDITIONAL_JUMP 0 true 1000:52b3 Code1 LAB_1000_52b3 +1000:52b0 FUN_1000_51f5 DATA 0 true Stack[-0x4] - +1000:52b3 FUN_1000_51f5 DATA 1 true Stack[-0x4] - +1000:52b8 FUN_1000_51f5 READ 0 true 1028:431b Data6 DAT_1028_431b +1000:52b8 FUN_1000_51f5 READ 0 false 1028:431d Data6 DAT_1028_431d +1000:52bc FUN_1000_51f5 UNCONDITIONAL_CALL 0 true 1228:0168 EXTERNAL DELETEOBJECT DELETEOBJECT +1000:52c1 FUN_1000_51f5 DATA 0 true Stack[-0x4] - +1000:52c5 FUN_1000_51f5 CONDITIONAL_JUMP 0 true 1000:52b0 Code1 LAB_1000_52b0 +1000:52c7 FUN_1000_51f5 DATA 0 true Stack[-0x4] - +1000:52cc FUN_1000_51f5 UNCONDITIONAL_JUMP 0 true 1000:52d1 Code1 LAB_1000_52d1 +1000:52ce FUN_1000_51f5 DATA 0 true Stack[-0x4] - +1000:52d1 FUN_1000_51f5 DATA 1 true Stack[-0x4] - +1000:52d6 FUN_1000_51f5 READ 0 true 1028:4323 Data6 DAT_1028_4323 +1000:52d6 FUN_1000_51f5 READ 0 false 1028:4325 Data6 DAT_1028_4325 +1000:52da FUN_1000_51f5 UNCONDITIONAL_CALL 0 true 1228:0168 EXTERNAL DELETEOBJECT DELETEOBJECT +1000:52df FUN_1000_51f5 DATA 0 true Stack[-0x4] - +1000:52e3 FUN_1000_51f5 CONDITIONAL_JUMP 0 true 1000:52ce Code1 LAB_1000_52ce +1000:52e5 FUN_1000_51f5 DATA 0 true Stack[-0x6] - +1000:52e8 FUN_1000_51f5 UNCONDITIONAL_CALL 0 true 1228:0208 EXTERNAL SETCURSOR SETCURSOR +1000:52ef FUN_1000_51f5 UNCONDITIONAL_CALL 0 true 1228:0194 EXTERNAL POSTQUITMESSAGE POSTQUITMESSAGE +1000:52f7 FUN_1000_51f5 DATA 1 true Stack[0x4] - +1000:52fc FUN_1000_51f5 UNCONDITIONAL_CALL 0 true 1018:121b Code4 FUN_1018_121b FUN_1018_121b +1000:5301 FUN_1000_51f5 DATA 1 true Stack[0x4] - +1000:530e FUN_1000_51f5 UNCONDITIONAL_CALL 0 true 1228:0250 EXTERNAL INVALIDATERECT INVALIDATERECT +1000:5315 FUN_1000_51f5 UNCONDITIONAL_CALL 0 true 1020:0439 Code5 FUN_1020_0439 FUN_1020_0439 +1000:5321 FUN_1000_531e DATA 1 true Stack[0x4] - +1000:5328 FUN_1000_531e UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1000:532d FUN_1000_531e DATA 1 true Stack[0x4] - +1000:533c FUN_1000_531e UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:5341 FUN_1000_531e DATA 1 true Stack[0x4] - +1000:5352 FUN_1000_531e DATA 1 true Stack[0x6] - +1000:536b FUN_1000_531e UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:5370 FUN_1000_531e DATA 1 true Stack[0x4] - +1000:537b FUN_1000_531e UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:5380 FUN_1000_531e DATA 1 true Stack[0x4] - +1000:5383 FUN_1000_531e DATA 0 true Stack[-0xc] - +1000:5387 FUN_1000_531e UNCONDITIONAL_CALL 0 true 1228:0168 EXTERNAL DELETEOBJECT DELETEOBJECT +1000:5394 FUN_1000_5390 DATA 0 true Stack[0xc] - +1000:5397 FUN_1000_5390 READ 0 true 1028:444e Data6 DAT_1028_444e +1000:539d FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:029c EXTERNAL SELECTPALETTE SELECTPALETTE +1000:53a2 FUN_1000_5390 DATA 0 true Stack[-0x24] - +1000:53a5 FUN_1000_5390 READ 0 true 1028:444e Data6 DAT_1028_444e +1000:53a9 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:0178 EXTERNAL UNREALIZEOBJECT UNREALIZEOBJECT +1000:53ae FUN_1000_5390 DATA 0 true Stack[0xc] - +1000:53b1 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:02a0 EXTERNAL REALIZEPALETTE REALIZEPALETTE +1000:53b6 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1008:00e2 Code2 FUN_1008_00e2 FUN_1008_00e2 +1000:53bb FUN_1000_5390 READ 0 true 1028:07cc Data6 DAT_1028_07cc +1000:53c0 FUN_1000_5390 CONDITIONAL_JUMP 0 true 1000:53c5 Code1 LAB_1000_53c5 +1000:53c2 FUN_1000_5390 UNCONDITIONAL_JUMP 0 true 1000:5619 Code1 LAB_1000_5619 +1000:53c5 FUN_1000_5390 READ 0 true 1028:06fe Data6 DAT_1028_06fe +1000:53ce FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1008:149d Code2 FUN_1008_149d FUN_1008_149d +1000:53d3 FUN_1000_5390 DATA 0 true Stack[-0x4] - +1000:53d6 FUN_1000_5390 DATA 0 true Stack[0xc] - +1000:53d9 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1000:53de FUN_1000_5390 DATA 0 true Stack[-0xe] - +1000:53e1 FUN_1000_5390 DATA 0 true Stack[-0xe] - +1000:53e4 FUN_1000_5390 DATA 0 true Stack[-0x4] - +1000:53e7 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:53ec FUN_1000_5390 DATA 0 true Stack[-0x6] - +1000:53ef FUN_1000_5390 DATA 0 true Stack[0xc] - +1000:53fc FUN_1000_5390 DATA 0 true Stack[-0xe] - +1000:5408 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:540d FUN_1000_5390 DATA 0 true Stack[-0xe] - +1000:5410 FUN_1000_5390 DATA 0 true Stack[-0x6] - +1000:5413 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:5418 FUN_1000_5390 DATA 0 true Stack[-0xe] - +1000:541b FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:0168 EXTERNAL DELETEOBJECT DELETEOBJECT +1000:5420 FUN_1000_5390 DATA 0 true Stack[-0x4] - +1000:5423 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:0168 EXTERNAL DELETEOBJECT DELETEOBJECT +1000:5428 FUN_1000_5390 READ 0 true 1028:06fe Data6 DAT_1028_06fe +1000:5431 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1008:149d Code2 FUN_1008_149d FUN_1008_149d +1000:5436 FUN_1000_5390 DATA 0 true Stack[-0x4] - +1000:543c FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1000:531e Code1 FUN_1000_531e FUN_1000_531e +1000:5441 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1008:0f2e Code2 FUN_1008_0f2e FUN_1008_0f2e +1000:5449 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1000:531e Code1 FUN_1000_531e FUN_1000_531e +1000:5451 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1000:531e Code1 FUN_1000_531e FUN_1000_531e +1000:5456 FUN_1000_5390 READ 0 true 1028:06fe Data6 DAT_1028_06fe +1000:545f FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1008:149d Code2 FUN_1008_149d FUN_1008_149d +1000:5464 FUN_1000_5390 WRITE 0 true 1028:085d Data6 DAT_1028_085d +1000:546a FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1000:531e Code1 FUN_1000_531e FUN_1000_531e +1000:546f FUN_1000_5390 READ 0 true 1028:06fe Data6 DAT_1028_06fe +1000:5478 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1008:149d Code2 FUN_1008_149d FUN_1008_149d +1000:547d FUN_1000_5390 WRITE 0 true 1028:085b Data6 DAT_1028_085b +1000:5483 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1000:531e Code1 FUN_1000_531e FUN_1000_531e +1000:5488 FUN_1000_5390 READ 0 true 1028:06fe Data6 DAT_1028_06fe +1000:5491 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:0280 EXTERNAL LOADBITMAP LOADBITMAP +1000:5496 FUN_1000_5390 WRITE 0 true 1028:0861 Data6 DAT_1028_0861 +1000:549b FUN_1000_5390 DATA 0 true Stack[-0x20] - +1000:549e FUN_1000_5390 UNCONDITIONAL_JUMP 0 true 1000:54a3 Code1 LAB_1000_54a3 +1000:54a0 FUN_1000_5390 DATA 0 true Stack[-0x20] - +1000:54a3 FUN_1000_5390 DATA 1 true Stack[-0x20] - +1000:54ab FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1000:531e Code1 FUN_1000_531e FUN_1000_531e +1000:54b0 FUN_1000_5390 READ 0 true 1028:06fe Data6 DAT_1028_06fe +1000:54b4 FUN_1000_5390 DATA 1 true Stack[-0x20] - +1000:54bd FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1008:149d Code2 FUN_1008_149d FUN_1008_149d +1000:54c2 FUN_1000_5390 DATA 1 true Stack[-0x20] - +1000:54cb FUN_1000_5390 DATA 0 true Stack[-0x20] - +1000:54cf FUN_1000_5390 CONDITIONAL_JUMP 0 true 1000:54a0 Code1 LAB_1000_54a0 +1000:54d1 FUN_1000_5390 DATA 0 true Stack[-0x20] - +1000:54d6 FUN_1000_5390 UNCONDITIONAL_JUMP 0 true 1000:54db Code1 LAB_1000_54db +1000:54d8 FUN_1000_5390 DATA 0 true Stack[-0x20] - +1000:54db FUN_1000_5390 DATA 1 true Stack[-0x20] - +1000:54e3 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1000:531e Code1 FUN_1000_531e FUN_1000_531e +1000:54e8 FUN_1000_5390 READ 0 true 1028:06fe Data6 DAT_1028_06fe +1000:54ec FUN_1000_5390 DATA 1 true Stack[-0x20] - +1000:54f5 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1008:149d Code2 FUN_1008_149d FUN_1008_149d +1000:54fa FUN_1000_5390 DATA 1 true Stack[-0x20] - +1000:54ff FUN_1000_5390 WRITE 0 true 1028:431b Data6 DAT_1028_431b +1000:5503 FUN_1000_5390 DATA 0 true Stack[-0x20] - +1000:5507 FUN_1000_5390 CONDITIONAL_JUMP 0 true 1000:54d8 Code1 LAB_1000_54d8 +1000:5509 FUN_1000_5390 DATA 0 true Stack[-0x20] - +1000:550e FUN_1000_5390 UNCONDITIONAL_JUMP 0 true 1000:5513 Code1 LAB_1000_5513 +1000:5510 FUN_1000_5390 DATA 0 true Stack[-0x20] - +1000:5513 FUN_1000_5390 DATA 1 true Stack[-0x20] - +1000:551b FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1000:531e Code1 FUN_1000_531e FUN_1000_531e +1000:5520 FUN_1000_5390 READ 0 true 1028:06fe Data6 DAT_1028_06fe +1000:5524 FUN_1000_5390 DATA 1 true Stack[-0x20] - +1000:552d FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1008:149d Code2 FUN_1008_149d FUN_1008_149d +1000:5532 FUN_1000_5390 DATA 1 true Stack[-0x20] - +1000:5537 FUN_1000_5390 WRITE 0 true 1028:4323 Data6 DAT_1028_4323 +1000:553b FUN_1000_5390 DATA 0 true Stack[-0x20] - +1000:553f FUN_1000_5390 CONDITIONAL_JUMP 0 true 1000:5510 Code1 LAB_1000_5510 +1000:5544 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1000:531e Code1 FUN_1000_531e FUN_1000_531e +1000:5549 FUN_1000_5390 READ 0 true 1028:06fe Data6 DAT_1028_06fe +1000:5551 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:0280 EXTERNAL LOADBITMAP LOADBITMAP +1000:5556 FUN_1000_5390 DATA 1 true Stack[0x4] - +1000:5560 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1000:531e Code1 FUN_1000_531e FUN_1000_531e +1000:5565 FUN_1000_5390 READ 0 true 1028:06fe Data6 DAT_1028_06fe +1000:556e FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1008:149d Code2 FUN_1008_149d FUN_1008_149d +1000:5573 FUN_1000_5390 WRITE 0 true 1028:0863 Data6 DAT_1028_0863 +1000:5579 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1000:531e Code1 FUN_1000_531e FUN_1000_531e +1000:557e FUN_1000_5390 READ 0 true 1028:06fe Data6 DAT_1028_06fe +1000:5586 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:0280 EXTERNAL LOADBITMAP LOADBITMAP +1000:558b FUN_1000_5390 DATA 1 true Stack[0x4] - +1000:5595 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1000:531e Code1 FUN_1000_531e FUN_1000_531e +1000:559a FUN_1000_5390 READ 0 true 1028:06fe Data6 DAT_1028_06fe +1000:55a3 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1008:149d Code2 FUN_1008_149d FUN_1008_149d +1000:55a8 FUN_1000_5390 WRITE 0 true 1028:085f Data6 DAT_1028_085f +1000:55ae FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1000:531e Code1 FUN_1000_531e FUN_1000_531e +1000:55b3 FUN_1000_5390 READ 0 true 1028:06fe Data6 DAT_1028_06fe +1000:55bc FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1008:149d Code2 FUN_1008_149d FUN_1008_149d +1000:55c1 FUN_1000_5390 WRITE 0 true 1028:0865 Data6 DAT_1028_0865 +1000:55c7 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1000:531e Code1 FUN_1000_531e FUN_1000_531e +1000:55cc FUN_1000_5390 READ 0 true 1028:06fe Data6 DAT_1028_06fe +1000:55d5 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1008:149d Code2 FUN_1008_149d FUN_1008_149d +1000:55da FUN_1000_5390 WRITE 0 true 1028:0859 Data6 DAT_1028_0859 +1000:55e0 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1000:531e Code1 FUN_1000_531e FUN_1000_531e +1000:55e5 FUN_1000_5390 WRITE 0 true 1028:07cc Data6 DAT_1028_07cc +1000:55ed FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1000:531e Code1 FUN_1000_531e FUN_1000_531e +1000:55f2 FUN_1000_5390 DATA 0 true Stack[-0x4] - +1000:55f5 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:0168 EXTERNAL DELETEOBJECT DELETEOBJECT +1000:55fa FUN_1000_5390 DATA 0 true Stack[0xc] - +1000:55fd FUN_1000_5390 DATA 0 true Stack[-0x24] - +1000:5602 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:029c EXTERNAL SELECTPALETTE SELECTPALETTE +1000:560e FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:0278 EXTERNAL LOADCURSOR LOADCURSOR +1000:5614 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:0208 EXTERNAL SETCURSOR SETCURSOR +1000:5619 FUN_1000_5390 DATA 1 true Stack[0x4] - +1000:5622 FUN_1000_5390 CONDITIONAL_JUMP 0 true 1000:5627 Code1 LAB_1000_5627 +1000:5624 FUN_1000_5390 UNCONDITIONAL_JUMP 0 true 1000:58e3 Code1 LAB_1000_58e3 +1000:562d FUN_1000_5390 DATA 0 true Stack[0xc] - +1000:5630 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1000:5635 FUN_1000_5390 DATA 0 true Stack[-0xc] - +1000:5638 FUN_1000_5390 DATA 0 true Stack[0xc] - +1000:563b FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1000:5640 FUN_1000_5390 DATA 0 true Stack[-0xe] - +1000:5643 FUN_1000_5390 DATA 1 true Stack[0x4] - +1000:564a FUN_1000_5390 DATA 0 true Stack[-0x16] - +1000:564f FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:01c4 EXTERNAL GETCLIENTRECT GETCLIENTRECT +1000:5654 FUN_1000_5390 DATA 0 true Stack[0xc] - +1000:5657 FUN_1000_5390 DATA 1 true Stack[-0x12] - +1000:565c FUN_1000_5390 DATA 1 true Stack[-0x10] - +1000:5661 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:0158 EXTERNAL CREATECOMPATIBLEBITMAP CREATECOMPATIBLEBITMAP +1000:5666 FUN_1000_5390 DATA 0 true Stack[-0xa] - +1000:5669 FUN_1000_5390 DATA 0 true Stack[-0xc] - +1000:566c FUN_1000_5390 READ 0 true 1028:085b Data6 DAT_1028_085b +1000:5670 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:5675 FUN_1000_5390 DATA 0 true Stack[-0x6] - +1000:5678 FUN_1000_5390 DATA 0 true Stack[-0xe] - +1000:567b FUN_1000_5390 DATA 0 true Stack[-0xa] - +1000:567e FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:5683 FUN_1000_5390 DATA 0 true Stack[-0x8] - +1000:5686 FUN_1000_5390 DATA 0 true Stack[-0xe] - +1000:568d FUN_1000_5390 DATA 0 true Stack[-0x12] - +1000:5690 FUN_1000_5390 DATA 0 true Stack[-0x10] - +1000:5693 FUN_1000_5390 DATA 0 true Stack[-0xc] - +1000:569f FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:56a4 FUN_1000_5390 DATA 0 true Stack[-0xc] - +1000:56ab FUN_1000_5390 DATA 0 true Stack[-0x12] - +1000:56ae FUN_1000_5390 DATA 0 true Stack[-0x10] - +1000:56b1 FUN_1000_5390 DATA 0 true Stack[-0xe] - +1000:56bd FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:56c2 FUN_1000_5390 DATA 0 true Stack[0xc] - +1000:56c9 FUN_1000_5390 DATA 0 true Stack[-0x12] - +1000:56cc FUN_1000_5390 DATA 0 true Stack[-0x10] - +1000:56cf FUN_1000_5390 DATA 0 true Stack[-0xe] - +1000:56db FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:56e0 FUN_1000_5390 DATA 0 true Stack[-0xe] - +1000:56e3 FUN_1000_5390 DATA 0 true Stack[-0x8] - +1000:56e6 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:56eb FUN_1000_5390 DATA 0 true Stack[-0xa] - +1000:56ee FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:0168 EXTERNAL DELETEOBJECT DELETEOBJECT +1000:56f3 FUN_1000_5390 DATA 0 true Stack[-0xe] - +1000:56f6 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1000:56fb FUN_1000_5390 DATA 0 true Stack[-0xc] - +1000:56fe FUN_1000_5390 DATA 0 true Stack[-0x6] - +1000:5701 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:5706 FUN_1000_5390 DATA 1 true Stack[0x4] - +1000:570f FUN_1000_5390 CONDITIONAL_JUMP 0 true 1000:5721 Code1 LAB_1000_5721 +1000:5711 FUN_1000_5390 CONDITIONAL_JUMP 0 true 1000:5716 Code1 LAB_1000_5716 +1000:5713 FUN_1000_5390 UNCONDITIONAL_JUMP 0 true 1000:57fb Code1 LAB_1000_57fb +1000:571c FUN_1000_5390 CONDITIONAL_JUMP 0 true 1000:5721 Code1 LAB_1000_5721 +1000:571e FUN_1000_5390 UNCONDITIONAL_JUMP 0 true 1000:57fb Code1 LAB_1000_57fb +1000:5721 FUN_1000_5390 DATA 1 true Stack[0x4] - +1000:572a FUN_1000_5390 CONDITIONAL_JUMP 0 true 1000:573c Code1 LAB_1000_573c +1000:572c FUN_1000_5390 CONDITIONAL_JUMP 0 true 1000:5731 Code1 LAB_1000_5731 +1000:572e FUN_1000_5390 UNCONDITIONAL_JUMP 0 true 1000:57fb Code1 LAB_1000_57fb +1000:5737 FUN_1000_5390 CONDITIONAL_JUMP 0 true 1000:573c Code1 LAB_1000_573c +1000:5739 FUN_1000_5390 UNCONDITIONAL_JUMP 0 true 1000:57fb Code1 LAB_1000_57fb +1000:573c FUN_1000_5390 DATA 1 true Stack[0x4] - +1000:5745 FUN_1000_5390 CONDITIONAL_JUMP 0 true 1000:574a Code1 LAB_1000_574a +1000:5747 FUN_1000_5390 UNCONDITIONAL_JUMP 0 true 1000:57fb Code1 LAB_1000_57fb +1000:574a FUN_1000_5390 DATA 0 true Stack[-0xc] - +1000:5751 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:5756 FUN_1000_5390 DATA 0 true Stack[-0x6] - +1000:5759 FUN_1000_5390 DATA 0 true Stack[0xc] - +1000:575c FUN_1000_5390 DATA 1 true Stack[0x4] - +1000:578b FUN_1000_5390 DATA 0 true Stack[-0xc] - +1000:5798 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:579d FUN_1000_5390 DATA 0 true Stack[-0xc] - +1000:57a0 FUN_1000_5390 DATA 1 true Stack[0x4] - +1000:57a7 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:57ac FUN_1000_5390 DATA 0 true Stack[0xc] - +1000:57af FUN_1000_5390 DATA 1 true Stack[0x4] - +1000:57de FUN_1000_5390 DATA 0 true Stack[-0xc] - +1000:57eb FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:57f0 FUN_1000_5390 DATA 0 true Stack[-0xc] - +1000:57f3 FUN_1000_5390 DATA 0 true Stack[-0x6] - +1000:57f6 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:57fb FUN_1000_5390 DATA 0 true Stack[-0xc] - +1000:57fe FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1000:5803 FUN_1000_5390 DATA 1 true Stack[0x4] - +1000:5816 FUN_1000_5390 DATA 0 true Stack[0xc] - +1000:5819 FUN_1000_5390 DATA 0 true Stack[-0x24] - +1000:581e FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:029c EXTERNAL SELECTPALETTE SELECTPALETTE +1000:582a FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:0278 EXTERNAL LOADCURSOR LOADCURSOR +1000:5830 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:0208 EXTERNAL SETCURSOR SETCURSOR +1000:5835 FUN_1000_5390 DATA 1 true Stack[0x4] - +1000:583c FUN_1000_5390 DATA 0 true Stack[-0x16] - +1000:5841 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:01c4 EXTERNAL GETCLIENTRECT GETCLIENTRECT +1000:5846 FUN_1000_5390 DATA 1 true Stack[0x4] - +1000:584d FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:5852 FUN_1000_5390 DATA 0 true Stack[-0xe] - +1000:5855 FUN_1000_5390 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:5868 FUN_1000_5390 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:587a FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:5881 FUN_1000_5390 DATA 0 true Stack[-0xe] - +1000:5884 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1008:0996 Code2 FUN_1008_0996 FUN_1008_0996 +1000:5889 FUN_1000_5390 DATA 0 true Stack[-0x20] - +1000:588e FUN_1000_5390 UNCONDITIONAL_JUMP 0 true 1000:5893 Code1 LAB_1000_5893 +1000:5890 FUN_1000_5390 DATA 0 true Stack[-0x20] - +1000:5893 FUN_1000_5390 DATA 1 true Stack[-0x20] - +1000:5899 FUN_1000_5390 READ 0 true 1028:0984 Data6 DAT_1028_0984 +1000:5899 FUN_1000_5390 READ 0 false 1028:0988 Data6 DAT_1028_0988 +1000:589e FUN_1000_5390 CONDITIONAL_JUMP 0 true 1000:58a9 Code1 LAB_1000_58a9 +1000:58a0 FUN_1000_5390 CONDITIONAL_JUMP 0 true 1000:58b7 Code1 LAB_1000_58b7 +1000:58a2 FUN_1000_5390 READ 0 true 1028:0982 Data6 DAT_1028_0982 +1000:58a2 FUN_1000_5390 READ 0 false 1028:0986 Data6 DAT_1028_0986 +1000:58a7 FUN_1000_5390 CONDITIONAL_JUMP 0 true 1000:58b7 Code1 LAB_1000_58b7 +1000:58a9 FUN_1000_5390 DATA 1 true Stack[-0x20] - +1000:58af FUN_1000_5390 DATA 0 true Stack[-0xe] - +1000:58b2 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1008:0996 Code2 FUN_1008_0996 FUN_1008_0996 +1000:58b7 FUN_1000_5390 DATA 0 true Stack[-0x20] - +1000:58bb FUN_1000_5390 CONDITIONAL_JUMP 0 true 1000:5890 Code1 LAB_1000_5890 +1000:58bd FUN_1000_5390 WRITE 0 true 1028:086b Data6 DAT_1028_086b +1000:58c3 FUN_1000_5390 DATA 0 true Stack[-0xe] - +1000:58c6 FUN_1000_5390 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:58ca FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1008:0b9e Code2 FUN_1008_0b9e FUN_1008_0b9e +1000:58cf FUN_1000_5390 DATA 1 true Stack[0x4] - +1000:58d6 FUN_1000_5390 DATA 0 true Stack[-0xe] - +1000:58d9 FUN_1000_5390 UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:58de FUN_1000_5390 WRITE 0 true 1028:07cb Data6 DAT_1028_07cb +1000:58eb FUN_1000_58e7 DATA 1 true Stack[0x8] - +1000:58f3 FUN_1000_58e7 CONDITIONAL_JUMP 0 true 1000:5901 Code1 LAB_1000_5901 +1000:58f5 FUN_1000_58e7 WRITE 0 true 1028:07c4 Data6 DAT_1028_07c4 +1000:58fc FUN_1000_58e7 DATA 0 true Stack[-0x4] - +1000:58ff FUN_1000_58e7 UNCONDITIONAL_JUMP 0 true 1000:594f Code1 LAB_1000_594f +1000:5901 FUN_1000_58e7 READ 0 true 1028:07c4 Data6 DAT_1028_07c4 +1000:5906 FUN_1000_58e7 CONDITIONAL_JUMP 0 true 1000:594f Code1 LAB_1000_594f +1000:5908 FUN_1000_58e7 DATA 1 true Stack[0x4] - +1000:590f FUN_1000_58e7 UNCONDITIONAL_CALL 0 true 1228:01bc EXTERNAL ISICONIC ISICONIC +1000:5916 FUN_1000_58e7 CONDITIONAL_JUMP 0 true 1000:594f Code1 LAB_1000_594f +1000:5918 FUN_1000_58e7 WRITE 0 true 1028:07c4 Data6 DAT_1028_07c4 +1000:591d FUN_1000_58e7 DATA 1 true Stack[0x4] - +1000:592a FUN_1000_58e7 UNCONDITIONAL_CALL 0 true 1228:0250 EXTERNAL INVALIDATERECT INVALIDATERECT +1000:592f FUN_1000_58e7 DATA 1 true Stack[0x4] - +1000:5936 FUN_1000_58e7 UNCONDITIONAL_CALL 0 true 1228:024c EXTERNAL UPDATEWINDOW UPDATEWINDOW +1000:593b FUN_1000_58e7 DATA 1 true Stack[0x8] - +1000:594c FUN_1000_58e7 DATA 0 true Stack[-0x4] - +1000:594f FUN_1000_58e7 DATA 1 true Stack[-0x4] - +1000:5959 FUN_1000_5956 DATA 1 true Stack[0x8] - +1000:5961 FUN_1000_5956 CONDITIONAL_JUMP 0 true 1000:599c Code1 LAB_1000_599c +1000:5963 FUN_1000_5956 READ 0 true 1028:07c4 Data6 DAT_1028_07c4 +1000:5968 FUN_1000_5956 CONDITIONAL_JUMP 0 true 1000:599c Code1 LAB_1000_599c +1000:596a FUN_1000_5956 WRITE 0 true 1028:07c4 Data6 DAT_1028_07c4 +1000:596f FUN_1000_5956 DATA 1 true Stack[0x4] - +1000:597c FUN_1000_5956 UNCONDITIONAL_CALL 0 true 1228:0250 EXTERNAL INVALIDATERECT INVALIDATERECT +1000:5981 FUN_1000_5956 DATA 1 true Stack[0x4] - +1000:5988 FUN_1000_5956 UNCONDITIONAL_CALL 0 true 1228:024c EXTERNAL UPDATEWINDOW UPDATEWINDOW +1000:598d FUN_1000_5956 DATA 1 true Stack[0x8] - +1000:59a4 FUN_1000_59a0 DATA 0 true Stack[-0x4] - +1000:59a9 FUN_1000_59a0 DATA 1 true Stack[0x8] - +1000:59b0 FUN_1000_59a0 DATA 1 true Stack[0x4] - +1000:59b7 FUN_1000_59a0 CONDITIONAL_JUMP 0 true 1000:59ce Code1 LAB_1000_59ce +1000:59b9 FUN_1000_59a0 DATA 1 true Stack[0x8] - +1000:59c0 FUN_1000_59a0 UNCONDITIONAL_CALL 0 true 1228:01e0 EXTERNAL GETPARENT GETPARENT +1000:59c5 FUN_1000_59a0 DATA 1 true Stack[0x4] - +1000:59cc FUN_1000_59a0 CONDITIONAL_JUMP 0 true 1000:59d0 Code1 LAB_1000_59d0 +1000:59ce FUN_1000_59a0 UNCONDITIONAL_JUMP 0 true 1000:5a30 Code1 LAB_1000_5a30 +1000:59d0 FUN_1000_59a0 DATA 1 true Stack[0x4] - +1000:59d7 FUN_1000_59a0 UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:59dc FUN_1000_59a0 DATA 0 true Stack[-0x6] - +1000:59df FUN_1000_59a0 DATA 0 true Stack[-0x6] - +1000:59e2 FUN_1000_59a0 READ 0 true 1028:444e Data6 DAT_1028_444e +1000:59e8 FUN_1000_59a0 UNCONDITIONAL_CALL 0 true 1228:029c EXTERNAL SELECTPALETTE SELECTPALETTE +1000:59ed FUN_1000_59a0 DATA 0 true Stack[-0x8] - +1000:59f0 FUN_1000_59a0 DATA 0 true Stack[-0x6] - +1000:59f3 FUN_1000_59a0 UNCONDITIONAL_CALL 0 true 1228:02a0 EXTERNAL REALIZEPALETTE REALIZEPALETTE +1000:59f8 FUN_1000_59a0 DATA 0 true Stack[-0x6] - +1000:59fb FUN_1000_59a0 UNCONDITIONAL_CALL 0 true 1228:0184 EXTERNAL UPDATECOLORS UPDATECOLORS +1000:5a00 FUN_1000_59a0 DATA 0 true Stack[-0x6] - +1000:5a03 FUN_1000_59a0 DATA 0 true Stack[-0x8] - +1000:5a08 FUN_1000_59a0 UNCONDITIONAL_CALL 0 true 1228:029c EXTERNAL SELECTPALETTE SELECTPALETTE +1000:5a0d FUN_1000_59a0 DATA 1 true Stack[0x4] - +1000:5a14 FUN_1000_59a0 DATA 0 true Stack[-0x6] - +1000:5a17 FUN_1000_59a0 UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:5a1c FUN_1000_59a0 DATA 1 true Stack[0x8] - +1000:5a2d FUN_1000_59a0 DATA 0 true Stack[-0x4] - +1000:5a30 FUN_1000_59a0 DATA 1 true Stack[-0x4] - +1000:5a3b FUN_1000_5a37 DATA 1 true Stack[0x4] - +1000:5a42 FUN_1000_5a37 UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:5a47 FUN_1000_5a37 DATA 0 true Stack[-0x6] - +1000:5a4a FUN_1000_5a37 DATA 0 true Stack[-0x6] - +1000:5a4d FUN_1000_5a37 READ 0 true 1028:444e Data6 DAT_1028_444e +1000:5a53 FUN_1000_5a37 UNCONDITIONAL_CALL 0 true 1228:029c EXTERNAL SELECTPALETTE SELECTPALETTE +1000:5a58 FUN_1000_5a37 DATA 0 true Stack[-0x8] - +1000:5a5b FUN_1000_5a37 DATA 0 true Stack[-0x6] - +1000:5a5e FUN_1000_5a37 UNCONDITIONAL_CALL 0 true 1228:02a0 EXTERNAL REALIZEPALETTE REALIZEPALETTE +1000:5a63 FUN_1000_5a37 DATA 0 true Stack[-0xa] - +1000:5a66 FUN_1000_5a37 DATA 0 true Stack[-0x6] - +1000:5a69 FUN_1000_5a37 DATA 0 true Stack[-0x8] - +1000:5a6e FUN_1000_5a37 UNCONDITIONAL_CALL 0 true 1228:029c EXTERNAL SELECTPALETTE SELECTPALETTE +1000:5a73 FUN_1000_5a37 DATA 1 true Stack[0x4] - +1000:5a7a FUN_1000_5a37 DATA 0 true Stack[-0x6] - +1000:5a7d FUN_1000_5a37 UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:5a82 FUN_1000_5a37 DATA 0 true Stack[-0xa] - +1000:5a86 FUN_1000_5a37 CONDITIONAL_JUMP 0 true 1000:5a9a Code1 LAB_1000_5a9a +1000:5a88 FUN_1000_5a37 DATA 1 true Stack[0x4] - +1000:5a95 FUN_1000_5a37 UNCONDITIONAL_CALL 0 true 1228:0250 EXTERNAL INVALIDATERECT INVALIDATERECT +1000:5a9a FUN_1000_5a37 DATA 1 true Stack[-0xa] - +1000:5a9d FUN_1000_5a37 DATA 1 true Stack[0x8] - +1000:5aaa FUN_1000_5a37 DATA 1 true Stack[-0xa] - +1000:5aad FUN_1000_5a37 DATA 0 true Stack[-0x4] - +1000:5ab0 FUN_1000_5a37 DATA 1 true Stack[-0x4] - +1000:5aba FUN_1000_5ab7 DATA 1 true Stack[0x8] - +1000:5abf FUN_1000_5ab7 DATA 1 true Stack[0x4] - +1000:5ac4 FUN_1000_5ab7 UNCONDITIONAL_CALL 0 true 1018:1274 Code4 FUN_1018_1274 FUN_1018_1274 +1000:5acb FUN_1000_5ab7 UNCONDITIONAL_CALL 0 true 1228:016c EXTERNAL GETSTOCKOBJECT GETSTOCKOBJECT +1000:5ad0 FUN_1000_5ab7 DATA 1 true Stack[0x8] - +1000:5af0 FUN_1000_5aea UNCONDITIONAL_CALL 0 true 1020:03ef Code5 FUN_1020_03ef FUN_1020_03ef +1000:5af5 FUN_1000_5aea CONDITIONAL_JUMP 0 true 1000:5afa Code1 LAB_1000_5afa +1000:5af7 FUN_1000_5aea UNCONDITIONAL_JUMP 0 true 1000:5b9d Code1 LAB_1000_5b9d +1000:5afa FUN_1000_5aea DATA 0 true Stack[0x10] - +1000:5afd FUN_1000_5aea DATA 0 true Stack[0xe] - +1000:5b00 FUN_1000_5aea DATA 0 true Stack[0xc] - +1000:5b03 FUN_1000_5aea DATA 0 true Stack[0xa] - +1000:5b09 FUN_1000_5aea DATA 1 true Stack[0x4] - +1000:5b0e FUN_1000_5aea UNCONDITIONAL_CALL 0 true 1018:1106 Code4 FUN_1018_1106 FUN_1018_1106 +1000:5b13 FUN_1000_5aea DATA 1 true Stack[0xe] - +1000:5b16 FUN_1000_5aea DATA 1 true Stack[0x10] - +1000:5b19 FUN_1000_5aea DATA 1 true Stack[0x4] - +1000:5b91 FUN_1000_5aea DATA 1 true Stack[0x4] - +1000:5b98 FUN_1000_5aea UNCONDITIONAL_CALL 0 true 1228:01a4 EXTERNAL SETFOCUS SETFOCUS +1000:5b9d FUN_1000_5aea DATA 1 true Stack[0x4] - +1000:5ba9 FUN_1000_5ba6 READ 0 true 1028:0867 Data6 DAT_1028_0867 +1000:5bad FUN_1000_5ba6 UNCONDITIONAL_CALL 0 true 1228:0168 EXTERNAL DELETEOBJECT DELETEOBJECT +1000:5bb2 FUN_1000_5ba6 DATA 1 true Stack[0x4] - +1000:5bc3 FUN_1000_5ba6 DATA 1 true Stack[0x4] - +1000:5bd5 FUN_1000_5ba6 UNCONDITIONAL_CALL 0 true 1018:121b Code4 FUN_1018_121b FUN_1018_121b +1000:5bdc FUN_1000_5ba6 UNCONDITIONAL_CALL 0 true 1020:0439 Code5 FUN_1020_0439 FUN_1020_0439 +1000:5be8 FUN_1000_5be5 DATA 1 true Stack[0x4] - +1000:5bed FUN_1000_5be5 UNCONDITIONAL_CALL 0 true 1018:170c Code4 FUN_1018_170c FUN_1018_170c +1000:5bf2 FUN_1000_5be5 READ 0 true 1028:06fe Data6 DAT_1028_06fe +1000:5bfb FUN_1000_5be5 UNCONDITIONAL_CALL 0 true 1008:149d Code2 FUN_1008_149d FUN_1008_149d +1000:5c00 FUN_1000_5be5 WRITE 0 true 1028:0867 Data6 DAT_1028_0867 +1000:5c03 FUN_1000_5be5 DATA 1 true Stack[0x4] - +1000:5c0a FUN_1000_5be5 UNCONDITIONAL_CALL 0 true 1228:01a4 EXTERNAL SETFOCUS SETFOCUS +1000:5c17 FUN_1000_5c13 DATA 0 true Stack[0xc] - +1000:5c1a FUN_1000_5c13 READ 0 true 1028:444e Data6 DAT_1028_444e +1000:5c20 FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1228:029c EXTERNAL SELECTPALETTE SELECTPALETTE +1000:5c25 FUN_1000_5c13 DATA 0 true Stack[-0x4] - +1000:5c28 FUN_1000_5c13 READ 0 true 1028:444e Data6 DAT_1028_444e +1000:5c2c FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1228:0178 EXTERNAL UNREALIZEOBJECT UNREALIZEOBJECT +1000:5c31 FUN_1000_5c13 DATA 0 true Stack[0xc] - +1000:5c34 FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1228:02a0 EXTERNAL REALIZEPALETTE REALIZEPALETTE +1000:5c39 FUN_1000_5c13 DATA 0 true Stack[0xc] - +1000:5c3c FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1000:5c41 FUN_1000_5c13 DATA 0 true Stack[-0x16a] - +1000:5c45 FUN_1000_5c13 DATA 0 true Stack[-0x16a] - +1000:5c49 FUN_1000_5c13 READ 0 true 1028:0867 Data6 DAT_1028_0867 +1000:5c4d FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:5c52 FUN_1000_5c13 DATA 0 true Stack[-0x164] - +1000:5c56 FUN_1000_5c13 DATA 0 true Stack[0xc] - +1000:5c59 FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1000:5c5e FUN_1000_5c13 DATA 0 true Stack[-0x16c] - +1000:5c62 FUN_1000_5c13 DATA 0 true Stack[0xc] - +1000:5c6b FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1228:0158 EXTERNAL CREATECOMPATIBLEBITMAP CREATECOMPATIBLEBITMAP +1000:5c70 FUN_1000_5c13 DATA 0 true Stack[-0x168] - +1000:5c74 FUN_1000_5c13 DATA 0 true Stack[-0x16c] - +1000:5c78 FUN_1000_5c13 DATA 0 true Stack[-0x168] - +1000:5c7c FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:5c81 FUN_1000_5c13 DATA 0 true Stack[-0x166] - +1000:5c85 FUN_1000_5c13 DATA 0 true Stack[-0x16c] - +1000:5c89 FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1228:0170 EXTERNAL GETTEXTCOLOR GETTEXTCOLOR +1000:5c8e FUN_1000_5c13 DATA 0 true Stack[-0x8] - +1000:5c91 FUN_1000_5c13 DATA 0 true Stack[-0x6] - +1000:5c94 FUN_1000_5c13 DATA 0 true Stack[-0x16c] - +1000:5c9a FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1228:017c EXTERNAL SETTEXTALIGN SETTEXTALIGN +1000:5c9f FUN_1000_5c13 DATA 0 true Stack[-0xa] - +1000:5ca2 FUN_1000_5c13 DATA 0 true Stack[-0x16c] - +1000:5ca8 FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1228:0144 EXTERNAL SETBKMODE SETBKMODE +1000:5cad FUN_1000_5c13 DATA 0 true Stack[-0x162] - +1000:5cb1 FUN_1000_5c13 DATA 0 true Stack[-0x16c] - +1000:5cbf FUN_1000_5c13 DATA 0 true Stack[-0x16a] - +1000:5ccc FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:5cd1 FUN_1000_5c13 DATA 0 true Stack[-0x16c] - +1000:5ce4 FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1228:0148 EXTERNAL SETTEXTCOLOR SETTEXTCOLOR +1000:5ce9 FUN_1000_5c13 DATA 0 true Stack[-0x33] - +1000:5cf3 FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1008:2ee5 Code2 FUN_1008_2ee5 FUN_1008_2ee5 +1000:5cf8 FUN_1000_5c13 DATA 0 true Stack[-0x16c] - +1000:5d01 FUN_1000_5c13 DATA 0 true Stack[-0x33] - +1000:5d06 FUN_1000_5c13 DATA 0 true Stack[-0x33] - +1000:5d0b FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1008:2e92 Code2 FUN_1008_2e92 FUN_1008_2e92 +1000:5d11 FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1228:014c EXTERNAL TEXTOUT TEXTOUT +1000:5d16 FUN_1000_5c13 DATA 0 true Stack[-0x15e] - +1000:5d1c FUN_1000_5c13 UNCONDITIONAL_JUMP 0 true 1000:5d22 Code1 LAB_1000_5d22 +1000:5d1e FUN_1000_5c13 DATA 0 true Stack[-0x15e] - +1000:5d22 FUN_1000_5c13 DATA 1 true Stack[-0x15e] - +1000:5d2a FUN_1000_5c13 DATA 0 true Stack[-0x160] - +1000:5d2e FUN_1000_5c13 DATA 0 true Stack[-0x16c] - +1000:5d34 FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1228:017c EXTERNAL SETTEXTALIGN SETTEXTALIGN +1000:5d39 FUN_1000_5c13 DATA 0 true Stack[-0x15e] - +1000:5d3e FUN_1000_5c13 CONDITIONAL_JUMP 0 true 1000:5d51 Code1 LAB_1000_5d51 +1000:5d40 FUN_1000_5c13 DATA 0 true Stack[-0x33] - +1000:5d4a FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1008:2ee5 Code2 FUN_1008_2ee5 FUN_1008_2ee5 +1000:5d4f FUN_1000_5c13 UNCONDITIONAL_JUMP 0 true 1000:5d60 Code1 LAB_1000_5d60 +1000:5d51 FUN_1000_5c13 DATA 0 true Stack[-0x33] - +1000:5d5b FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1008:2ee5 Code2 FUN_1008_2ee5 FUN_1008_2ee5 +1000:5d60 FUN_1000_5c13 DATA 1 true Stack[-0x15e] - +1000:5d69 FUN_1000_5c13 DATA 0 true Stack[-0x15c] - +1000:5d72 FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1020:1629 Code5 FUN_1020_1629 FUN_1020_1629 +1000:5d77 FUN_1000_5c13 DATA 0 true Stack[-0x5c] - +1000:5d7c FUN_1000_5c13 DATA 0 true Stack[-0x15c] - +1000:5d82 FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1008:2f2f Code2 FUN_1008_2f2f FUN_1008_2f2f +1000:5d87 FUN_1000_5c13 DATA 0 true Stack[-0x33] - +1000:5d8c FUN_1000_5c13 DATA 0 true Stack[-0x5c] - +1000:5d91 FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1008:2f4d Code2 FUN_1008_2f4d FUN_1008_2f4d +1000:5d96 FUN_1000_5c13 DATA 0 true Stack[-0x33] - +1000:5da0 FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1008:2f4d Code2 FUN_1008_2f4d FUN_1008_2f4d +1000:5da5 FUN_1000_5c13 DATA 0 true Stack[-0x5c] - +1000:5daa FUN_1000_5c13 DATA 0 true Stack[-0x26c] - +1000:5db0 FUN_1000_5c13 DATA 1 true Stack[-0x15e] - +1000:5dbd FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1020:0b00 Code5 FUN_1020_0b00 FUN_1020_0b00 +1000:5dc2 FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1008:2f2f Code2 FUN_1008_2f2f FUN_1008_2f2f +1000:5dc7 FUN_1000_5c13 DATA 0 true Stack[-0x33] - +1000:5dcc FUN_1000_5c13 DATA 0 true Stack[-0x5c] - +1000:5dd1 FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1008:2f4d Code2 FUN_1008_2f4d FUN_1008_2f4d +1000:5dd6 FUN_1000_5c13 DATA 0 true Stack[-0x16c] - +1000:5ddc FUN_1000_5c13 DATA 0 true Stack[-0x160] - +1000:5de0 FUN_1000_5c13 DATA 0 true Stack[-0x33] - +1000:5de5 FUN_1000_5c13 DATA 0 true Stack[-0x33] - +1000:5dea FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1008:2e92 Code2 FUN_1008_2e92 FUN_1008_2e92 +1000:5df0 FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1228:014c EXTERNAL TEXTOUT TEXTOUT +1000:5df5 FUN_1000_5c13 DATA 0 true Stack[-0x16c] - +1000:5dfb FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1228:017c EXTERNAL SETTEXTALIGN SETTEXTALIGN +1000:5e00 FUN_1000_5c13 DATA 1 true Stack[-0x15e] - +1000:5e07 FUN_1000_5c13 READ 0 true 1028:0880 Data6 DAT_1028_0880 +1000:5e0b FUN_1000_5c13 READ 0 true 1028:087e Data6 DAT_1028_087e +1000:5e11 FUN_1000_5c13 DATA 0 true Stack[-0x15c] - +1000:5e1a FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1020:1629 Code5 FUN_1020_1629 FUN_1020_1629 +1000:5e1f FUN_1000_5c13 DATA 0 true Stack[-0x33] - +1000:5e24 FUN_1000_5c13 DATA 0 true Stack[-0x15c] - +1000:5e2a FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1008:2f2f Code2 FUN_1008_2f2f FUN_1008_2f2f +1000:5e2f FUN_1000_5c13 DATA 0 true Stack[-0x16c] - +1000:5e36 FUN_1000_5c13 DATA 0 true Stack[-0x160] - +1000:5e3a FUN_1000_5c13 DATA 0 true Stack[-0x33] - +1000:5e3f FUN_1000_5c13 DATA 0 true Stack[-0x33] - +1000:5e44 FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1008:2e92 Code2 FUN_1008_2e92 FUN_1008_2e92 +1000:5e4a FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1228:014c EXTERNAL TEXTOUT TEXTOUT +1000:5e4f FUN_1000_5c13 DATA 0 true Stack[-0x15e] - +1000:5e54 FUN_1000_5c13 CONDITIONAL_JUMP 0 true 1000:5e59 Code1 LAB_1000_5e59 +1000:5e56 FUN_1000_5c13 UNCONDITIONAL_JUMP 0 true 1000:5d1e Code1 LAB_1000_5d1e +1000:5e59 FUN_1000_5c13 DATA 0 true Stack[0xc] - +1000:5e66 FUN_1000_5c13 DATA 0 true Stack[-0x16c] - +1000:5e73 FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:5e78 FUN_1000_5c13 DATA 0 true Stack[-0x16c] - +1000:5e7c FUN_1000_5c13 DATA 0 true Stack[-0x6] - +1000:5e7f FUN_1000_5c13 DATA 0 true Stack[-0x8] - +1000:5e82 FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1228:0148 EXTERNAL SETTEXTCOLOR SETTEXTCOLOR +1000:5e87 FUN_1000_5c13 DATA 0 true Stack[-0x16c] - +1000:5e8b FUN_1000_5c13 DATA 0 true Stack[-0xa] - +1000:5e8e FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1228:017c EXTERNAL SETTEXTALIGN SETTEXTALIGN +1000:5e93 FUN_1000_5c13 DATA 0 true Stack[-0x16c] - +1000:5e97 FUN_1000_5c13 DATA 0 true Stack[-0x162] - +1000:5e9b FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1228:0144 EXTERNAL SETBKMODE SETBKMODE +1000:5ea0 FUN_1000_5c13 DATA 0 true Stack[-0x16c] - +1000:5ea4 FUN_1000_5c13 DATA 0 true Stack[-0x166] - +1000:5ea8 FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:5ead FUN_1000_5c13 DATA 0 true Stack[-0x168] - +1000:5eb1 FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1228:0168 EXTERNAL DELETEOBJECT DELETEOBJECT +1000:5eb6 FUN_1000_5c13 DATA 0 true Stack[-0x16c] - +1000:5eba FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1000:5ebf FUN_1000_5c13 DATA 0 true Stack[-0x16a] - +1000:5ec3 FUN_1000_5c13 DATA 0 true Stack[-0x164] - +1000:5ec7 FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:5ecc FUN_1000_5c13 DATA 0 true Stack[-0x16a] - +1000:5ed0 FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1000:5ed5 FUN_1000_5c13 DATA 0 true Stack[0xc] - +1000:5ed8 FUN_1000_5c13 DATA 0 true Stack[-0x4] - +1000:5edd FUN_1000_5c13 UNCONDITIONAL_CALL 0 true 1228:029c EXTERNAL SELECTPALETTE SELECTPALETTE +1000:5ee9 FUN_1000_5ee6 UNCONDITIONAL_CALL 0 true 1008:00e2 Code2 FUN_1008_00e2 FUN_1008_00e2 +1000:5eee FUN_1000_5ee6 DATA 1 true Stack[0x4] - +1000:5ef3 FUN_1000_5ee6 UNCONDITIONAL_CALL 0 true 1018:0f38 Code4 FUN_1018_0f38 FUN_1018_0f38 +1000:5f00 FUN_1000_5efc DATA 1 true Stack[0x8] - +1000:5f0a FUN_1000_5efc DATA 0 true Stack[-0x6] - +1000:5f0d FUN_1000_5efc DATA 0 true Stack[-0x6] - +1000:5f11 FUN_1000_5efc CONDITIONAL_JUMP 0 true 1000:5f22 Code1 LAB_1000_5f22 +1000:5f13 FUN_1000_5efc UNCONDITIONAL_CALL 0 true 1008:00e2 Code2 FUN_1008_00e2 FUN_1008_00e2 +1000:5f18 FUN_1000_5efc DATA 1 true Stack[0x4] - +1000:5f1d FUN_1000_5efc UNCONDITIONAL_CALL 0 true 1018:0f38 Code4 FUN_1018_0f38 FUN_1018_0f38 +1000:5f22 FUN_1000_5efc DATA 1 true Stack[-0x4] - +1000:5f2d FUN_1000_5f29 DATA 0 true Stack[-0x4] - +1000:5f32 FUN_1000_5f29 DATA 1 true Stack[0x8] - +1000:5f39 FUN_1000_5f29 DATA 1 true Stack[0x4] - +1000:5f40 FUN_1000_5f29 CONDITIONAL_JUMP 0 true 1000:5f57 Code1 LAB_1000_5f57 +1000:5f42 FUN_1000_5f29 DATA 1 true Stack[0x8] - +1000:5f49 FUN_1000_5f29 UNCONDITIONAL_CALL 0 true 1228:01e0 EXTERNAL GETPARENT GETPARENT +1000:5f4e FUN_1000_5f29 DATA 1 true Stack[0x4] - +1000:5f55 FUN_1000_5f29 CONDITIONAL_JUMP 0 true 1000:5f59 Code1 LAB_1000_5f59 +1000:5f57 FUN_1000_5f29 UNCONDITIONAL_JUMP 0 true 1000:5fb9 Code1 LAB_1000_5fb9 +1000:5f59 FUN_1000_5f29 DATA 1 true Stack[0x4] - +1000:5f60 FUN_1000_5f29 UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:5f65 FUN_1000_5f29 DATA 0 true Stack[-0x6] - +1000:5f68 FUN_1000_5f29 DATA 0 true Stack[-0x6] - +1000:5f6b FUN_1000_5f29 READ 0 true 1028:444e Data6 DAT_1028_444e +1000:5f71 FUN_1000_5f29 UNCONDITIONAL_CALL 0 true 1228:029c EXTERNAL SELECTPALETTE SELECTPALETTE +1000:5f76 FUN_1000_5f29 DATA 0 true Stack[-0x8] - +1000:5f79 FUN_1000_5f29 DATA 0 true Stack[-0x6] - +1000:5f7c FUN_1000_5f29 UNCONDITIONAL_CALL 0 true 1228:02a0 EXTERNAL REALIZEPALETTE REALIZEPALETTE +1000:5f81 FUN_1000_5f29 DATA 0 true Stack[-0x6] - +1000:5f84 FUN_1000_5f29 UNCONDITIONAL_CALL 0 true 1228:0184 EXTERNAL UPDATECOLORS UPDATECOLORS +1000:5f89 FUN_1000_5f29 DATA 0 true Stack[-0x6] - +1000:5f8c FUN_1000_5f29 DATA 0 true Stack[-0x8] - +1000:5f91 FUN_1000_5f29 UNCONDITIONAL_CALL 0 true 1228:029c EXTERNAL SELECTPALETTE SELECTPALETTE +1000:5f96 FUN_1000_5f29 DATA 1 true Stack[0x4] - +1000:5f9d FUN_1000_5f29 DATA 0 true Stack[-0x6] - +1000:5fa0 FUN_1000_5f29 UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:5fa5 FUN_1000_5f29 DATA 1 true Stack[0x8] - +1000:5fb6 FUN_1000_5f29 DATA 0 true Stack[-0x4] - +1000:5fb9 FUN_1000_5f29 DATA 1 true Stack[-0x4] - +1000:5fc4 FUN_1000_5fc0 DATA 1 true Stack[0x4] - +1000:5fcb FUN_1000_5fc0 UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:5fd0 FUN_1000_5fc0 DATA 0 true Stack[-0x6] - +1000:5fd3 FUN_1000_5fc0 DATA 0 true Stack[-0x6] - +1000:5fd6 FUN_1000_5fc0 READ 0 true 1028:444e Data6 DAT_1028_444e +1000:5fdc FUN_1000_5fc0 UNCONDITIONAL_CALL 0 true 1228:029c EXTERNAL SELECTPALETTE SELECTPALETTE +1000:5fe1 FUN_1000_5fc0 DATA 0 true Stack[-0x8] - +1000:5fe4 FUN_1000_5fc0 DATA 0 true Stack[-0x6] - +1000:5fe7 FUN_1000_5fc0 UNCONDITIONAL_CALL 0 true 1228:02a0 EXTERNAL REALIZEPALETTE REALIZEPALETTE +1000:5fec FUN_1000_5fc0 DATA 0 true Stack[-0xa] - +1000:5fef FUN_1000_5fc0 DATA 0 true Stack[-0x6] - +1000:5ff2 FUN_1000_5fc0 DATA 0 true Stack[-0x8] - +1000:5ff7 FUN_1000_5fc0 UNCONDITIONAL_CALL 0 true 1228:029c EXTERNAL SELECTPALETTE SELECTPALETTE +1000:5ffc FUN_1000_5fc0 DATA 1 true Stack[0x4] - +1000:6003 FUN_1000_5fc0 DATA 0 true Stack[-0x6] - +1000:6006 FUN_1000_5fc0 UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:600b FUN_1000_5fc0 DATA 0 true Stack[-0xa] - +1000:600f FUN_1000_5fc0 CONDITIONAL_JUMP 0 true 1000:6023 Code1 LAB_1000_6023 +1000:6011 FUN_1000_5fc0 DATA 1 true Stack[0x4] - +1000:601e FUN_1000_5fc0 UNCONDITIONAL_CALL 0 true 1228:0250 EXTERNAL INVALIDATERECT INVALIDATERECT +1000:6023 FUN_1000_5fc0 DATA 1 true Stack[-0xa] - +1000:6026 FUN_1000_5fc0 DATA 1 true Stack[0x8] - +1000:6033 FUN_1000_5fc0 DATA 1 true Stack[-0xa] - +1000:6036 FUN_1000_5fc0 DATA 0 true Stack[-0x4] - +1000:6039 FUN_1000_5fc0 DATA 1 true Stack[-0x4] - +1000:6043 FUN_1000_6040 DATA 1 true Stack[0x8] - +1000:6048 FUN_1000_6040 DATA 1 true Stack[0x4] - +1000:604d FUN_1000_6040 UNCONDITIONAL_CALL 0 true 1018:1274 Code4 FUN_1018_1274 FUN_1018_1274 +1000:6054 FUN_1000_6040 UNCONDITIONAL_CALL 0 true 1228:016c EXTERNAL GETSTOCKOBJECT GETSTOCKOBJECT +1000:6059 FUN_1000_6040 DATA 1 true Stack[0x8] - +1000:6079 FUN_1000_6073 UNCONDITIONAL_CALL 0 true 1020:03ef Code5 FUN_1020_03ef FUN_1020_03ef +1000:607e FUN_1000_6073 CONDITIONAL_JUMP 0 true 1000:60de Code1 LAB_1000_60de +1000:6080 FUN_1000_6073 DATA 0 true Stack[0x10] - +1000:6083 FUN_1000_6073 DATA 0 true Stack[0xe] - +1000:6086 FUN_1000_6073 DATA 0 true Stack[0xc] - +1000:6089 FUN_1000_6073 DATA 0 true Stack[0xa] - +1000:608f FUN_1000_6073 DATA 1 true Stack[0x4] - +1000:6094 FUN_1000_6073 UNCONDITIONAL_CALL 0 true 1018:1106 Code4 FUN_1018_1106 FUN_1018_1106 +1000:6099 FUN_1000_6073 DATA 1 true Stack[0xe] - +1000:609c FUN_1000_6073 DATA 1 true Stack[0x10] - +1000:609f FUN_1000_6073 DATA 1 true Stack[0x4] - +1000:60d2 FUN_1000_6073 DATA 1 true Stack[0x4] - +1000:60d9 FUN_1000_6073 UNCONDITIONAL_CALL 0 true 1228:01a4 EXTERNAL SETFOCUS SETFOCUS +1000:60de FUN_1000_6073 DATA 1 true Stack[0x4] - +1000:60ea FUN_1000_60e7 DATA 1 true Stack[0x4] - +1000:60fb FUN_1000_60e7 DATA 1 true Stack[0x4] - +1000:6108 FUN_1000_60e7 READ 0 true 1028:0867 Data6 DAT_1028_0867 +1000:610c FUN_1000_60e7 UNCONDITIONAL_CALL 0 true 1228:0168 EXTERNAL DELETEOBJECT DELETEOBJECT +1000:6114 FUN_1000_60e7 DATA 1 true Stack[0x4] - +1000:6119 FUN_1000_60e7 UNCONDITIONAL_CALL 0 true 1018:121b Code4 FUN_1018_121b FUN_1018_121b +1000:6120 FUN_1000_60e7 UNCONDITIONAL_CALL 0 true 1020:0439 Code5 FUN_1020_0439 FUN_1020_0439 +1000:612c FUN_1000_6129 DATA 1 true Stack[0x4] - +1000:6131 FUN_1000_6129 UNCONDITIONAL_CALL 0 true 1018:170c Code4 FUN_1018_170c FUN_1018_170c +1000:613d FUN_1000_6129 UNCONDITIONAL_CALL 0 true 1228:0278 EXTERNAL LOADCURSOR LOADCURSOR +1000:6143 FUN_1000_6129 UNCONDITIONAL_CALL 0 true 1228:0208 EXTERNAL SETCURSOR SETCURSOR +1000:6148 FUN_1000_6129 READ 0 true 1028:06fe Data6 DAT_1028_06fe +1000:614c FUN_1000_6129 READ 1 true 1028:07cd Data6 DAT_1028_07cd +1000:6156 FUN_1000_6129 UNCONDITIONAL_CALL 0 true 1008:149d Code2 FUN_1008_149d FUN_1008_149d +1000:615b FUN_1000_6129 WRITE 0 true 1028:0867 Data6 DAT_1028_0867 +1000:615e FUN_1000_6129 DATA 1 true Stack[0x4] - +1000:6165 FUN_1000_6129 UNCONDITIONAL_CALL 0 true 1228:01a4 EXTERNAL SETFOCUS SETFOCUS +1000:6172 FUN_1000_616e DATA 0 true Stack[0xc] - +1000:6175 FUN_1000_616e READ 0 true 1028:444e Data6 DAT_1028_444e +1000:617b FUN_1000_616e UNCONDITIONAL_CALL 0 true 1228:029c EXTERNAL SELECTPALETTE SELECTPALETTE +1000:6180 FUN_1000_616e DATA 0 true Stack[-0x4] - +1000:6183 FUN_1000_616e READ 0 true 1028:444e Data6 DAT_1028_444e +1000:6187 FUN_1000_616e UNCONDITIONAL_CALL 0 true 1228:0178 EXTERNAL UNREALIZEOBJECT UNREALIZEOBJECT +1000:618c FUN_1000_616e DATA 0 true Stack[0xc] - +1000:618f FUN_1000_616e UNCONDITIONAL_CALL 0 true 1228:02a0 EXTERNAL REALIZEPALETTE REALIZEPALETTE +1000:6194 FUN_1000_616e DATA 0 true Stack[0xc] - +1000:6197 FUN_1000_616e UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1000:619c FUN_1000_616e DATA 0 true Stack[-0x8] - +1000:619f FUN_1000_616e DATA 0 true Stack[-0x8] - +1000:61a2 FUN_1000_616e READ 0 true 1028:0867 Data6 DAT_1028_0867 +1000:61a6 FUN_1000_616e UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:61ab FUN_1000_616e DATA 0 true Stack[-0x6] - +1000:61ae FUN_1000_616e DATA 0 true Stack[0xc] - +1000:61bb FUN_1000_616e DATA 0 true Stack[-0x8] - +1000:61c7 FUN_1000_616e UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:61cc FUN_1000_616e DATA 0 true Stack[-0x8] - +1000:61cf FUN_1000_616e DATA 0 true Stack[-0x6] - +1000:61d2 FUN_1000_616e UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:61d7 FUN_1000_616e DATA 0 true Stack[-0x8] - +1000:61da FUN_1000_616e UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1000:61df FUN_1000_616e DATA 0 true Stack[0xc] - +1000:61e2 FUN_1000_616e DATA 0 true Stack[-0x4] - +1000:61e7 FUN_1000_616e UNCONDITIONAL_CALL 0 true 1228:029c EXTERNAL SELECTPALETTE SELECTPALETTE +1000:61f3 FUN_1000_616e UNCONDITIONAL_CALL 0 true 1228:0278 EXTERNAL LOADCURSOR LOADCURSOR +1000:61f9 FUN_1000_616e UNCONDITIONAL_CALL 0 true 1228:0208 EXTERNAL SETCURSOR SETCURSOR +1000:6205 FUN_1000_6202 UNCONDITIONAL_CALL 0 true 1008:00e2 Code2 FUN_1008_00e2 FUN_1008_00e2 +1000:620a FUN_1000_6202 DATA 1 true Stack[0x4] - +1000:620f FUN_1000_6202 UNCONDITIONAL_CALL 0 true 1018:0f38 Code4 FUN_1018_0f38 FUN_1018_0f38 +1000:621c FUN_1000_6218 DATA 1 true Stack[0x8] - +1000:6226 FUN_1000_6218 DATA 0 true Stack[-0x6] - +1000:6229 FUN_1000_6218 DATA 0 true Stack[-0x6] - +1000:622d FUN_1000_6218 CONDITIONAL_JUMP 0 true 1000:623e Code1 LAB_1000_623e +1000:622f FUN_1000_6218 UNCONDITIONAL_CALL 0 true 1008:00e2 Code2 FUN_1008_00e2 FUN_1008_00e2 +1000:6234 FUN_1000_6218 DATA 1 true Stack[0x4] - +1000:6239 FUN_1000_6218 UNCONDITIONAL_CALL 0 true 1018:0f38 Code4 FUN_1018_0f38 FUN_1018_0f38 +1000:623e FUN_1000_6218 DATA 1 true Stack[-0x4] - +1000:6249 FUN_1000_6245 DATA 0 true Stack[-0x4] - +1000:624e FUN_1000_6245 DATA 1 true Stack[0x8] - +1000:6255 FUN_1000_6245 DATA 1 true Stack[0x4] - +1000:625c FUN_1000_6245 CONDITIONAL_JUMP 0 true 1000:6273 Code1 LAB_1000_6273 +1000:625e FUN_1000_6245 DATA 1 true Stack[0x8] - +1000:6265 FUN_1000_6245 UNCONDITIONAL_CALL 0 true 1228:01e0 EXTERNAL GETPARENT GETPARENT +1000:626a FUN_1000_6245 DATA 1 true Stack[0x4] - +1000:6271 FUN_1000_6245 CONDITIONAL_JUMP 0 true 1000:6275 Code1 LAB_1000_6275 +1000:6273 FUN_1000_6245 UNCONDITIONAL_JUMP 0 true 1000:62d5 Code1 LAB_1000_62d5 +1000:6275 FUN_1000_6245 DATA 1 true Stack[0x4] - +1000:627c FUN_1000_6245 UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:6281 FUN_1000_6245 DATA 0 true Stack[-0x6] - +1000:6284 FUN_1000_6245 DATA 0 true Stack[-0x6] - +1000:6287 FUN_1000_6245 READ 0 true 1028:444e Data6 DAT_1028_444e +1000:628d FUN_1000_6245 UNCONDITIONAL_CALL 0 true 1228:029c EXTERNAL SELECTPALETTE SELECTPALETTE +1000:6292 FUN_1000_6245 DATA 0 true Stack[-0x8] - +1000:6295 FUN_1000_6245 DATA 0 true Stack[-0x6] - +1000:6298 FUN_1000_6245 UNCONDITIONAL_CALL 0 true 1228:02a0 EXTERNAL REALIZEPALETTE REALIZEPALETTE +1000:629d FUN_1000_6245 DATA 0 true Stack[-0x6] - +1000:62a0 FUN_1000_6245 UNCONDITIONAL_CALL 0 true 1228:0184 EXTERNAL UPDATECOLORS UPDATECOLORS +1000:62a5 FUN_1000_6245 DATA 0 true Stack[-0x6] - +1000:62a8 FUN_1000_6245 DATA 0 true Stack[-0x8] - +1000:62ad FUN_1000_6245 UNCONDITIONAL_CALL 0 true 1228:029c EXTERNAL SELECTPALETTE SELECTPALETTE +1000:62b2 FUN_1000_6245 DATA 1 true Stack[0x4] - +1000:62b9 FUN_1000_6245 DATA 0 true Stack[-0x6] - +1000:62bc FUN_1000_6245 UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:62c1 FUN_1000_6245 DATA 1 true Stack[0x8] - +1000:62d2 FUN_1000_6245 DATA 0 true Stack[-0x4] - +1000:62d5 FUN_1000_6245 DATA 1 true Stack[-0x4] - +1000:62e0 FUN_1000_62dc DATA 1 true Stack[0x4] - +1000:62e7 FUN_1000_62dc UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:62ec FUN_1000_62dc DATA 0 true Stack[-0x6] - +1000:62ef FUN_1000_62dc DATA 0 true Stack[-0x6] - +1000:62f2 FUN_1000_62dc READ 0 true 1028:444e Data6 DAT_1028_444e +1000:62f8 FUN_1000_62dc UNCONDITIONAL_CALL 0 true 1228:029c EXTERNAL SELECTPALETTE SELECTPALETTE +1000:62fd FUN_1000_62dc DATA 0 true Stack[-0x8] - +1000:6300 FUN_1000_62dc DATA 0 true Stack[-0x6] - +1000:6303 FUN_1000_62dc UNCONDITIONAL_CALL 0 true 1228:02a0 EXTERNAL REALIZEPALETTE REALIZEPALETTE +1000:6308 FUN_1000_62dc DATA 0 true Stack[-0xa] - +1000:630b FUN_1000_62dc DATA 0 true Stack[-0x6] - +1000:630e FUN_1000_62dc DATA 0 true Stack[-0x8] - +1000:6313 FUN_1000_62dc UNCONDITIONAL_CALL 0 true 1228:029c EXTERNAL SELECTPALETTE SELECTPALETTE +1000:6318 FUN_1000_62dc DATA 1 true Stack[0x4] - +1000:631f FUN_1000_62dc DATA 0 true Stack[-0x6] - +1000:6322 FUN_1000_62dc UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:6327 FUN_1000_62dc DATA 0 true Stack[-0xa] - +1000:632b FUN_1000_62dc CONDITIONAL_JUMP 0 true 1000:633f Code1 LAB_1000_633f +1000:632d FUN_1000_62dc DATA 1 true Stack[0x4] - +1000:633a FUN_1000_62dc UNCONDITIONAL_CALL 0 true 1228:0250 EXTERNAL INVALIDATERECT INVALIDATERECT +1000:633f FUN_1000_62dc DATA 1 true Stack[-0xa] - +1000:6342 FUN_1000_62dc DATA 1 true Stack[0x8] - +1000:634f FUN_1000_62dc DATA 1 true Stack[-0xa] - +1000:6352 FUN_1000_62dc DATA 0 true Stack[-0x4] - +1000:6355 FUN_1000_62dc DATA 1 true Stack[-0x4] - +1000:635f FUN_1000_635c DATA 0 true Stack[0xe] - +1000:6362 FUN_1000_635c DATA 0 true Stack[0xc] - +1000:6365 FUN_1000_635c DATA 0 true Stack[0xa] - +1000:6368 FUN_1000_635c DATA 0 true Stack[0x8] - +1000:636b FUN_1000_635c DATA 0 true Stack[0x6] - +1000:636e FUN_1000_635c DATA 0 true Stack[0x4] - +1000:6371 FUN_1000_635c UNCONDITIONAL_CALL 0 true 1008:07b6 Code2 FUN_1008_07b6 FUN_1008_07b6 +1000:6376 FUN_1000_635c DATA 0 true Stack[0xe] - +1000:6379 FUN_1000_635c DATA 0 true Stack[0xc] - +1000:637c FUN_1000_635c DATA 0 true Stack[0xa] - +1000:637f FUN_1000_635c DATA 0 true Stack[0x8] - +1000:6382 FUN_1000_635c DATA 0 true Stack[0x6] - +1000:6385 FUN_1000_635c UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1000:6392 FUN_1000_638e DATA 1 true Stack[0x4] - +1000:639d FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:63a2 Code1 LAB_1000_63a2 +1000:639f FUN_1000_638e UNCONDITIONAL_JUMP 0 true 1000:6b1c Code1 LAB_1000_6b1c +1000:63aa FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:63af Code1 LAB_1000_63af +1000:63ac FUN_1000_638e UNCONDITIONAL_JUMP 0 true 1000:6b1c Code1 LAB_1000_6b1c +1000:63af FUN_1000_638e DATA 1 true Stack[0x8] - +1000:63b9 FUN_1000_638e DATA 0 true Stack[-0x6] - +1000:63bc FUN_1000_638e READ 0 true 1028:07cf Data6 DAT_1028_07cf +1000:63c1 FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:63d6 Code1 LAB_1000_63d6 +1000:63c3 FUN_1000_638e DATA 0 true Stack[-0x6] - +1000:63c7 FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:63d6 Code1 LAB_1000_63d6 +1000:63cb FUN_1000_638e WRITE 0 true 1028:0855 Data6 DAT_1028_0855 +1000:63ce FUN_1000_638e WRITE 0 true 1028:0857 Data6 DAT_1028_0857 +1000:63d1 FUN_1000_638e WRITE 0 true 1028:07c7 Data6 DAT_1028_07c7 +1000:63d6 FUN_1000_638e READ 0 true 1028:07cf Data6 DAT_1028_07cf +1000:63db FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:641a Code1 LAB_1000_641a +1000:63dd FUN_1000_638e DATA 0 true Stack[-0x6] - +1000:63e1 FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:641a Code1 LAB_1000_641a +1000:63e3 FUN_1000_638e READ 1 true 1028:3340 Data6 DAT_1028_3340 +1000:63e6 FUN_1000_638e READ 1 true 1028:3342 Data6 DAT_1028_3342 +1000:63ea FUN_1000_638e WRITE 0 true 1028:07d3 Data6 DAT_1028_07d3 +1000:63ed FUN_1000_638e WRITE 0 true 1028:07d5 Data6 DAT_1028_07d5 +1000:63f1 FUN_1000_638e READ 1 true 1028:3344 Data6 DAT_1028_3344 +1000:63f4 FUN_1000_638e READ 1 true 1028:3346 Data6 DAT_1028_3346 +1000:63f8 FUN_1000_638e WRITE 0 true 1028:07d7 Data6 DAT_1028_07d7 +1000:63fb FUN_1000_638e WRITE 0 true 1028:07d9 Data6 DAT_1028_07d9 +1000:63ff FUN_1000_638e DATA 1 true Stack[0x4] - +1000:641a FUN_1000_638e DATA 1 true Stack[0x4] - +1000:6423 FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:6428 Code1 LAB_1000_6428 +1000:6425 FUN_1000_638e UNCONDITIONAL_JUMP 0 true 1000:65aa Code1 LAB_1000_65aa +1000:642e FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:6433 Code1 LAB_1000_6433 +1000:6430 FUN_1000_638e UNCONDITIONAL_JUMP 0 true 1000:65aa Code1 LAB_1000_65aa +1000:6433 FUN_1000_638e DATA 0 true Stack[-0x6] - +1000:6437 FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:643c Code1 LAB_1000_643c +1000:6439 FUN_1000_638e UNCONDITIONAL_JUMP 0 true 1000:65aa Code1 LAB_1000_65aa +1000:643c FUN_1000_638e READ 0 true 1028:07d0 Data6 DAT_1028_07d0 +1000:6441 FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:6446 Code1 LAB_1000_6446 +1000:6443 FUN_1000_638e UNCONDITIONAL_JUMP 0 true 1000:65aa Code1 LAB_1000_65aa +1000:6453 FUN_1000_638e UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:6458 FUN_1000_638e UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:645d FUN_1000_638e UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:6466 FUN_1000_638e DATA 1 true Stack[0x4] - +1000:6495 FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:64a0 Code1 LAB_1000_64a0 +1000:6497 FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:64db Code1 LAB_1000_64db +1000:649e FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:64db Code1 LAB_1000_64db +1000:64a0 FUN_1000_638e DATA 1 true Stack[0x4] - +1000:64a7 FUN_1000_638e UNCONDITIONAL_CALL 0 true 1020:14a4 Code5 FUN_1020_14a4 FUN_1020_14a4 +1000:64b9 FUN_1000_638e DATA 1 true Stack[0x4] - +1000:64d9 FUN_1000_638e UNCONDITIONAL_JUMP 0 true 1000:654c Code1 LAB_1000_654c +1000:64db FUN_1000_638e DATA 1 true Stack[0x4] - +1000:64e6 FUN_1000_638e UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:64f4 FUN_1000_638e UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:64f9 FUN_1000_638e UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:6505 FUN_1000_638e DATA 1 true Stack[0x4] - +1000:650d FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:6518 Code1 LAB_1000_6518 +1000:650f FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:654c Code1 LAB_1000_654c +1000:6516 FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:654c Code1 LAB_1000_654c +1000:6518 FUN_1000_638e DATA 1 true Stack[0x4] - +1000:651f FUN_1000_638e UNCONDITIONAL_CALL 0 true 1020:14a4 Code5 FUN_1020_14a4 FUN_1020_14a4 +1000:6531 FUN_1000_638e DATA 1 true Stack[0x4] - +1000:654c FUN_1000_638e DATA 1 true Stack[0x4] - +1000:6559 FUN_1000_638e WRITE 0 true 1028:07fb Data6 DAT_1028_07fb +1000:655c FUN_1000_638e WRITE 0 true 1028:07fd Data6 DAT_1028_07fd +1000:656e FUN_1000_638e UNCONDITIONAL_CALL 0 true 1008:0002 Code2 FUN_1008_0002 FUN_1008_0002 +1000:6573 FUN_1000_638e DATA 1 true Stack[0x4] - +1000:657a FUN_1000_638e UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:657f FUN_1000_638e DATA 0 true Stack[-0xc] - +1000:6582 FUN_1000_638e DATA 0 true Stack[-0xc] - +1000:658f FUN_1000_638e READ 0 true 1028:0865 Data6 DAT_1028_0865 +1000:6593 FUN_1000_638e UNCONDITIONAL_CALL 0 true 1000:635c Code1 FUN_1000_635c FUN_1000_635c +1000:6598 FUN_1000_638e DATA 1 true Stack[0x4] - +1000:659f FUN_1000_638e DATA 0 true Stack[-0xc] - +1000:65a2 FUN_1000_638e UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:65a7 FUN_1000_638e UNCONDITIONAL_JUMP 0 true 1000:6b1c Code1 LAB_1000_6b1c +1000:65aa FUN_1000_638e DATA 0 true Stack[-0x6] - +1000:65ae FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:65bc Code1 LAB_1000_65bc +1000:65b0 FUN_1000_638e DATA 1 true Stack[0x4] - +1000:65b9 FUN_1000_638e UNCONDITIONAL_JUMP 0 true 1000:6b1c Code1 LAB_1000_6b1c +1000:65bc FUN_1000_638e DATA 0 true Stack[-0x6] - +1000:65c0 FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:65ce Code1 LAB_1000_65ce +1000:65c2 FUN_1000_638e DATA 1 true Stack[0x4] - +1000:65cb FUN_1000_638e UNCONDITIONAL_JUMP 0 true 1000:6b1c Code1 LAB_1000_6b1c +1000:65ce FUN_1000_638e READ 0 true 1028:07c6 Data6 DAT_1028_07c6 +1000:65d3 FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:65d8 Code1 LAB_1000_65d8 +1000:65d5 FUN_1000_638e UNCONDITIONAL_JUMP 0 true 1000:68f0 Code1 LAB_1000_68f0 +1000:65d8 FUN_1000_638e DATA 0 true Stack[-0x6] - +1000:65dc FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:65ed Code1 LAB_1000_65ed +1000:65de FUN_1000_638e DATA 0 true Stack[-0x6] - +1000:65e2 FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:65ed Code1 LAB_1000_65ed +1000:65e4 FUN_1000_638e DATA 0 true Stack[-0x6] - +1000:65e8 FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:65ed Code1 LAB_1000_65ed +1000:65ea FUN_1000_638e UNCONDITIONAL_JUMP 0 true 1000:68f0 Code1 LAB_1000_68f0 +1000:65ef FUN_1000_638e UNCONDITIONAL_CALL 0 true 1008:0002 Code2 FUN_1008_0002 FUN_1008_0002 +1000:65f4 FUN_1000_638e DATA 0 true Stack[-0x6] - +1000:65f8 FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:663c Code1 LAB_1000_663c +1000:65fc FUN_1000_638e UNCONDITIONAL_CALL 0 true 1020:14a4 Code5 FUN_1020_14a4 FUN_1020_14a4 +1000:660a FUN_1000_638e DATA 1 true Stack[0x4] - +1000:6615 FUN_1000_638e UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:661e FUN_1000_638e DATA 1 true Stack[0x4] - +1000:6639 FUN_1000_638e UNCONDITIONAL_JUMP 0 true 1000:671a Code1 LAB_1000_671a +1000:663c FUN_1000_638e DATA 0 true Stack[-0x6] - +1000:6640 FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:667c Code1 LAB_1000_667c +1000:6644 FUN_1000_638e UNCONDITIONAL_CALL 0 true 1020:14a4 Code5 FUN_1020_14a4 FUN_1020_14a4 +1000:6652 FUN_1000_638e DATA 1 true Stack[0x4] - +1000:665d FUN_1000_638e UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:6662 FUN_1000_638e DATA 1 true Stack[0x4] - +1000:6679 FUN_1000_638e UNCONDITIONAL_JUMP 0 true 1000:671a Code1 LAB_1000_671a +1000:667c FUN_1000_638e DATA 0 true Stack[-0x6] - +1000:6680 FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:6685 Code1 LAB_1000_6685 +1000:6682 FUN_1000_638e UNCONDITIONAL_JUMP 0 true 1000:671a Code1 LAB_1000_671a +1000:6685 FUN_1000_638e DATA 1 true Stack[0x4] - +1000:6690 FUN_1000_638e UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:6698 FUN_1000_638e UNCONDITIONAL_CALL 0 true 1020:14c1 Code5 FUN_1020_14c1 FUN_1020_14c1 +1000:66a5 FUN_1000_638e UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:66b2 FUN_1000_638e UNCONDITIONAL_CALL 0 true 1020:0feb Code5 FUN_1020_0feb FUN_1020_0feb +1000:66ba FUN_1000_638e UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:66bf FUN_1000_638e UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:66c4 FUN_1000_638e DATA 1 true Stack[0x4] - +1000:66dd FUN_1000_638e UNCONDITIONAL_CALL 0 true 1020:14a4 Code5 FUN_1020_14a4 FUN_1020_14a4 +1000:66eb FUN_1000_638e DATA 1 true Stack[0x4] - +1000:66f6 FUN_1000_638e UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:66ff FUN_1000_638e DATA 1 true Stack[0x4] - +1000:671a FUN_1000_638e DATA 1 true Stack[0x4] - +1000:6722 FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:6727 Code1 LAB_1000_6727 +1000:6724 FUN_1000_638e UNCONDITIONAL_JUMP 0 true 1000:6872 Code1 LAB_1000_6872 +1000:6727 FUN_1000_638e DATA 0 true Stack[-0x6] - +1000:672b FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:6783 Code1 LAB_1000_6783 +1000:673a FUN_1000_638e UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:6743 FUN_1000_638e READ 1 true 1028:07f3 Data6 DAT_1028_07f3 +1000:6746 FUN_1000_638e READ 1 true 1028:07f5 Data6 DAT_1028_07f5 +1000:674e FUN_1000_638e WRITE 0 true 1028:07f3 Data6 DAT_1028_07f3 +1000:6751 FUN_1000_638e WRITE 0 true 1028:07f5 Data6 DAT_1028_07f5 +1000:6755 FUN_1000_638e DATA 1 true Stack[0x4] - +1000:6765 FUN_1000_638e UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:676e FUN_1000_638e READ 1 true 1028:07f7 Data6 DAT_1028_07f7 +1000:6771 FUN_1000_638e READ 1 true 1028:07f9 Data6 DAT_1028_07f9 +1000:6779 FUN_1000_638e WRITE 0 true 1028:07f7 Data6 DAT_1028_07f7 +1000:677c FUN_1000_638e WRITE 0 true 1028:07f9 Data6 DAT_1028_07f9 +1000:6780 FUN_1000_638e UNCONDITIONAL_JUMP 0 true 1000:6872 Code1 LAB_1000_6872 +1000:6783 FUN_1000_638e DATA 0 true Stack[-0x6] - +1000:6787 FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:67d4 Code1 LAB_1000_67d4 +1000:6789 FUN_1000_638e DATA 1 true Stack[0x4] - +1000:6799 FUN_1000_638e UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:679e FUN_1000_638e READ 1 true 1028:07f3 Data6 DAT_1028_07f3 +1000:67a2 FUN_1000_638e READ 1 true 1028:07f5 Data6 DAT_1028_07f5 +1000:67a6 FUN_1000_638e WRITE 0 true 1028:07f3 Data6 DAT_1028_07f3 +1000:67a9 FUN_1000_638e WRITE 0 true 1028:07f5 Data6 DAT_1028_07f5 +1000:67ad FUN_1000_638e DATA 1 true Stack[0x4] - +1000:67bd FUN_1000_638e UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:67c2 FUN_1000_638e READ 1 true 1028:07f7 Data6 DAT_1028_07f7 +1000:67c6 FUN_1000_638e READ 1 true 1028:07f9 Data6 DAT_1028_07f9 +1000:67ca FUN_1000_638e WRITE 0 true 1028:07f7 Data6 DAT_1028_07f7 +1000:67cd FUN_1000_638e WRITE 0 true 1028:07f9 Data6 DAT_1028_07f9 +1000:67d1 FUN_1000_638e UNCONDITIONAL_JUMP 0 true 1000:6872 Code1 LAB_1000_6872 +1000:67d4 FUN_1000_638e DATA 0 true Stack[-0x6] - +1000:67d8 FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:67dd Code1 LAB_1000_67dd +1000:67da FUN_1000_638e UNCONDITIONAL_JUMP 0 true 1000:6872 Code1 LAB_1000_6872 +1000:67df FUN_1000_638e UNCONDITIONAL_CALL 0 true 1020:14a4 Code5 FUN_1020_14a4 FUN_1020_14a4 +1000:67e9 FUN_1000_638e DATA 1 true Stack[0x4] - +1000:67f4 FUN_1000_638e UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:67f9 FUN_1000_638e DATA 0 true Stack[-0xe] - +1000:67fe FUN_1000_638e UNCONDITIONAL_CALL 0 true 1020:14a4 Code5 FUN_1020_14a4 FUN_1020_14a4 +1000:6808 FUN_1000_638e DATA 1 true Stack[0x4] - +1000:6813 FUN_1000_638e UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:681e FUN_1000_638e UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:6823 FUN_1000_638e DATA 0 true Stack[-0x10] - +1000:6826 FUN_1000_638e DATA 1 true Stack[-0xe] - +1000:682a FUN_1000_638e READ 1 true 1028:07f3 Data6 DAT_1028_07f3 +1000:682e FUN_1000_638e READ 1 true 1028:07f5 Data6 DAT_1028_07f5 +1000:6832 FUN_1000_638e WRITE 0 true 1028:07f3 Data6 DAT_1028_07f3 +1000:6835 FUN_1000_638e WRITE 0 true 1028:07f5 Data6 DAT_1028_07f5 +1000:6839 FUN_1000_638e DATA 1 true Stack[-0xe] - +1000:683d FUN_1000_638e READ 1 true 1028:07f7 Data6 DAT_1028_07f7 +1000:6841 FUN_1000_638e READ 1 true 1028:07f9 Data6 DAT_1028_07f9 +1000:6845 FUN_1000_638e WRITE 0 true 1028:07f7 Data6 DAT_1028_07f7 +1000:6848 FUN_1000_638e WRITE 0 true 1028:07f9 Data6 DAT_1028_07f9 +1000:684c FUN_1000_638e DATA 1 true Stack[-0x10] - +1000:6850 FUN_1000_638e READ 1 true 1028:07fb Data6 DAT_1028_07fb +1000:6854 FUN_1000_638e READ 1 true 1028:07fd Data6 DAT_1028_07fd +1000:6858 FUN_1000_638e WRITE 0 true 1028:07fb Data6 DAT_1028_07fb +1000:685b FUN_1000_638e WRITE 0 true 1028:07fd Data6 DAT_1028_07fd +1000:685f FUN_1000_638e DATA 1 true Stack[-0x10] - +1000:6863 FUN_1000_638e READ 1 true 1028:07ff Data6 DAT_1028_07ff +1000:6867 FUN_1000_638e READ 1 true 1028:0801 Data6 DAT_1028_0801 +1000:686b FUN_1000_638e WRITE 0 true 1028:07ff Data6 DAT_1028_07ff +1000:686e FUN_1000_638e WRITE 0 true 1028:0801 Data6 DAT_1028_0801 +1000:6872 FUN_1000_638e DATA 1 true Stack[0x4] - +1000:6882 FUN_1000_638e UNCONDITIONAL_CALL 0 true 1020:14a4 Code5 FUN_1020_14a4 FUN_1020_14a4 +1000:688a FUN_1000_638e DATA 1 true Stack[0x4] - +1000:6891 FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:68ed Code1 LAB_1000_68ed +1000:6895 FUN_1000_638e UNCONDITIONAL_CALL 0 true 1008:0002 Code2 FUN_1008_0002 FUN_1008_0002 +1000:689a FUN_1000_638e WRITE 0 true 1028:07c6 Data6 DAT_1028_07c6 +1000:689f FUN_1000_638e DATA 1 true Stack[0x4] - +1000:68b2 FUN_1000_638e UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:68b7 FUN_1000_638e DATA 0 true Stack[-0xc] - +1000:68ba FUN_1000_638e DATA 0 true Stack[-0xc] - +1000:68c7 FUN_1000_638e UNCONDITIONAL_CALL 0 true 1008:0837 Code2 FUN_1008_0837 FUN_1008_0837 +1000:68cc FUN_1000_638e DATA 0 true Stack[-0xc] - +1000:68d9 FUN_1000_638e UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1000:68de FUN_1000_638e DATA 1 true Stack[0x4] - +1000:68e5 FUN_1000_638e DATA 0 true Stack[-0xc] - +1000:68e8 FUN_1000_638e UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:68ed FUN_1000_638e UNCONDITIONAL_JUMP 0 true 1000:6b1c Code1 LAB_1000_6b1c +1000:68f0 FUN_1000_638e DATA 0 true Stack[-0x6] - +1000:68f4 FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:6913 Code1 LAB_1000_6913 +1000:68f6 FUN_1000_638e READ 0 true 1028:43f2 Data6 DAT_1028_43f2 +1000:68fb FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:690b Code1 LAB_1000_690b +1000:68fd FUN_1000_638e READ 0 true 1028:43ee Data6 DAT_1028_43ee +1000:6902 FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:6909 Code1 LAB_1000_6909 +1000:6904 FUN_1000_638e WRITE 0 true 1028:43f2 Data6 DAT_1028_43f2 +1000:6909 FUN_1000_638e UNCONDITIONAL_JUMP 0 true 1000:6910 Code1 LAB_1000_6910 +1000:690b FUN_1000_638e WRITE 0 true 1028:43f2 Data6 DAT_1028_43f2 +1000:6910 FUN_1000_638e UNCONDITIONAL_JUMP 0 true 1000:6b1c Code1 LAB_1000_6b1c +1000:6913 FUN_1000_638e DATA 1 true Stack[0x4] - +1000:691c FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:6921 Code1 LAB_1000_6921 +1000:691e FUN_1000_638e UNCONDITIONAL_JUMP 0 true 1000:6b1c Code1 LAB_1000_6b1c +1000:6921 FUN_1000_638e DATA 0 true Stack[-0x6] - +1000:6925 FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:6930 Code1 LAB_1000_6930 +1000:6927 FUN_1000_638e DATA 0 true Stack[-0x6] - +1000:692b FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:6930 Code1 LAB_1000_6930 +1000:692d FUN_1000_638e UNCONDITIONAL_JUMP 0 true 1000:6b1c Code1 LAB_1000_6b1c +1000:6930 FUN_1000_638e READ 0 true 1028:07d0 Data6 DAT_1028_07d0 +1000:6935 FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:693a Code1 LAB_1000_693a +1000:6937 FUN_1000_638e UNCONDITIONAL_JUMP 0 true 1000:6b1c Code1 LAB_1000_6b1c +1000:693a FUN_1000_638e WRITE 0 true 1028:07c9 Data6 DAT_1028_07c9 +1000:6941 FUN_1000_638e UNCONDITIONAL_CALL 0 true 1008:0002 Code2 FUN_1008_0002 FUN_1008_0002 +1000:6946 FUN_1000_638e READ_WRITE 0 true 1028:07d0 Data6 DAT_1028_07d0 +1000:694a FUN_1000_638e DATA 1 true Stack[0x4] - +1000:6959 FUN_1000_638e WRITE 0 true 1028:07c5 Data6 DAT_1028_07c5 +1000:6963 FUN_1000_638e WRITE 0 true 1028:0874 Data6 DAT_1028_0874 +1000:6968 FUN_1000_638e DATA 0 true Stack[-0x9] - +1000:696c FUN_1000_638e UNCONDITIONAL_JUMP 0 true 1000:6971 Code1 LAB_1000_6971 +1000:696e FUN_1000_638e DATA 0 true Stack[-0x9] - +1000:6971 FUN_1000_638e DATA 1 true Stack[-0x9] - +1000:697a FUN_1000_638e WRITE 0 true 1028:0821 Data6 DAT_1028_0821 +1000:697a FUN_1000_638e WRITE 0 false 1028:0823 Data6 DAT_1028_0823 +1000:6980 FUN_1000_638e DATA 0 true Stack[-0xa] - +1000:6984 FUN_1000_638e UNCONDITIONAL_JUMP 0 true 1000:6989 Code1 LAB_1000_6989 +1000:6986 FUN_1000_638e DATA 0 true Stack[-0xa] - +1000:6989 FUN_1000_638e DATA 1 true Stack[-0xa] - +1000:698e FUN_1000_638e DATA 1 true Stack[0x4] - +1000:6998 FUN_1000_638e DATA 1 true Stack[-0xa] - +1000:699f FUN_1000_638e DATA 1 true Stack[-0x9] - +1000:69a8 FUN_1000_638e DATA 1 true Stack[0x4] - +1000:69b3 FUN_1000_638e DATA 1 true Stack[-0xa] - +1000:69ba FUN_1000_638e DATA 1 true Stack[0x4] - +1000:69c4 FUN_1000_638e DATA 1 true Stack[-0xa] - +1000:69cd FUN_1000_638e DATA 1 true Stack[-0x9] - +1000:69d6 FUN_1000_638e DATA 1 true Stack[0x4] - +1000:69e2 FUN_1000_638e DATA 0 true Stack[-0xa] - +1000:69e6 FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:6986 Code1 LAB_1000_6986 +1000:69e8 FUN_1000_638e DATA 1 true Stack[0x4] - +1000:69ef FUN_1000_638e UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:69f4 FUN_1000_638e DATA 0 true Stack[-0xc] - +1000:69f7 FUN_1000_638e DATA 1 true Stack[-0x9] - +1000:69fa FUN_1000_638e READ 1 true 1028:07d0 Data6 DAT_1028_07d0 +1000:69fe FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:6a4e Code1 LAB_1000_6a4e +1000:6a00 FUN_1000_638e DATA 1 true Stack[-0x9] - +1000:6a0c FUN_1000_638e WRITE 0 true 1028:0982 Data6 DAT_1028_0982 +1000:6a10 FUN_1000_638e WRITE 0 true 1028:0984 Data6 DAT_1028_0984 +1000:6a14 FUN_1000_638e DATA 0 true Stack[-0xc] - +1000:6a1a FUN_1000_638e DATA 1 true Stack[-0x9] - +1000:6a2c FUN_1000_638e UNCONDITIONAL_CALL 0 true 1008:08bb Code2 FUN_1008_08bb FUN_1008_08bb +1000:6a31 FUN_1000_638e DATA 0 true Stack[-0xc] - +1000:6a37 FUN_1000_638e DATA 1 true Stack[-0x9] - +1000:6a49 FUN_1000_638e UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1000:6a4e FUN_1000_638e DATA 0 true Stack[-0xc] - +1000:6a53 FUN_1000_638e UNCONDITIONAL_CALL 0 true 1008:0dbd Code2 FUN_1008_0dbd FUN_1008_0dbd +1000:6a58 FUN_1000_638e DATA 1 true Stack[0x4] - +1000:6a5f FUN_1000_638e DATA 0 true Stack[-0xc] - +1000:6a62 FUN_1000_638e UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:6a67 FUN_1000_638e DATA 0 true Stack[-0x9] - +1000:6a6b FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:6ac7 Code1 LAB_1000_6ac7 +1000:6a6d FUN_1000_638e DATA 1 true Stack[0x4] - +1000:6a74 FUN_1000_638e UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:6a79 FUN_1000_638e DATA 0 true Stack[-0xc] - +1000:6a7c FUN_1000_638e DATA 0 true Stack[-0xc] - +1000:6a8a FUN_1000_638e UNCONDITIONAL_CALL 0 true 1008:0837 Code2 FUN_1008_0837 FUN_1008_0837 +1000:6a8f FUN_1000_638e DATA 0 true Stack[-0xc] - +1000:6a9d FUN_1000_638e UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1000:6aa6 FUN_1000_638e DATA 0 true Stack[-0xc] - +1000:6aa9 FUN_1000_638e UNCONDITIONAL_CALL 0 true 1008:0996 Code2 FUN_1008_0996 FUN_1008_0996 +1000:6aae FUN_1000_638e DATA 0 true Stack[-0xc] - +1000:6ab3 FUN_1000_638e UNCONDITIONAL_CALL 0 true 1008:0b9e Code2 FUN_1008_0b9e FUN_1008_0b9e +1000:6ab8 FUN_1000_638e DATA 1 true Stack[0x4] - +1000:6abf FUN_1000_638e DATA 0 true Stack[-0xc] - +1000:6ac2 FUN_1000_638e UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:6ac7 FUN_1000_638e DATA 0 true Stack[-0x9] - +1000:6acb FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:6ad0 Code1 LAB_1000_6ad0 +1000:6acd FUN_1000_638e UNCONDITIONAL_JUMP 0 true 1000:696e Code1 LAB_1000_696e +1000:6ad0 FUN_1000_638e DATA 0 true Stack[-0xa] - +1000:6ad4 FUN_1000_638e UNCONDITIONAL_JUMP 0 true 1000:6ad9 Code1 LAB_1000_6ad9 +1000:6ad6 FUN_1000_638e DATA 0 true Stack[-0xa] - +1000:6ad9 FUN_1000_638e DATA 1 true Stack[-0xa] - +1000:6ade FUN_1000_638e DATA 1 true Stack[0x4] - +1000:6ae8 FUN_1000_638e DATA 1 true Stack[-0xa] - +1000:6af0 FUN_1000_638e WRITE 0 true 1028:09e2 Data6 DAT_1028_09e2 +1000:6af0 FUN_1000_638e WRITE 0 false 1028:0a35 Data6 DAT_1028_0a35 +1000:6af4 FUN_1000_638e DATA 1 true Stack[-0xa] - +1000:6afb FUN_1000_638e DATA 1 true Stack[0x4] - +1000:6b05 FUN_1000_638e DATA 1 true Stack[-0xa] - +1000:6b0d FUN_1000_638e WRITE 0 true 1028:09f1 Data6 DAT_1028_09f1 +1000:6b11 FUN_1000_638e DATA 0 true Stack[-0xa] - +1000:6b15 FUN_1000_638e CONDITIONAL_JUMP 0 true 1000:6ad6 Code1 LAB_1000_6ad6 +1000:6b17 FUN_1000_638e WRITE 0 true 1028:07d1 Data6 DAT_1028_07d1 +1000:6b1c FUN_1000_638e DATA 1 true Stack[0x8] - +1000:6b2d FUN_1000_638e DATA 0 true Stack[-0x4] - +1000:6b30 FUN_1000_638e DATA 1 true Stack[-0x4] - +1000:6b3a FUN_1000_6b37 DATA 1 true Stack[0x4] - +1000:6b41 FUN_1000_6b37 UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1000:6b46 FUN_1000_6b37 DATA 1 true Stack[0x4] - +1000:6b51 FUN_1000_6b37 UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1000:6b56 FUN_1000_6b37 DATA 1 true Stack[0x4] - +1000:6b61 FUN_1000_6b37 READ 0 true 1028:085b Data6 DAT_1028_085b +1000:6b65 FUN_1000_6b37 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:6b6a FUN_1000_6b37 DATA 1 true Stack[0x4] - +1000:6b75 FUN_1000_6b37 READ 0 true 1028:0865 Data6 DAT_1028_0865 +1000:6b79 FUN_1000_6b37 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:6b7e FUN_1000_6b37 DATA 1 true Stack[0x4] - +1000:6b97 FUN_1000_6b37 DATA 0 true Stack[0x6] - +1000:6ba1 FUN_1000_6b37 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:6ba6 FUN_1000_6b37 DATA 1 true Stack[0x4] - +1000:6bb1 FUN_1000_6b37 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:6bb6 FUN_1000_6b37 DATA 1 true Stack[0x4] - +1000:6bbd FUN_1000_6b37 DATA 0 true Stack[-0x12] - +1000:6bc1 FUN_1000_6b37 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:6bc6 FUN_1000_6b37 DATA 1 true Stack[0x4] - +1000:6bcd FUN_1000_6b37 UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1000:6bd2 FUN_1000_6b37 DATA 1 true Stack[0x4] - +1000:6bd9 FUN_1000_6b37 UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1000:6bde FUN_1000_6b37 DATA 1 true Stack[0x4] - +1000:6bef FUN_1000_6b37 UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1000:6bfc FUN_1000_6bf8 DATA 1 true Stack[0x4] - +1000:6c0c FUN_1000_6bf8 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:6c11 FUN_1000_6bf8 DATA 0 true Stack[-0xc] - +1000:6c14 FUN_1000_6bf8 DATA 0 true Stack[-0xa] - +1000:6c17 FUN_1000_6bf8 DATA 1 true Stack[0x4] - +1000:6c22 FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6c27 Code1 LAB_1000_6c27 +1000:6c24 FUN_1000_6bf8 UNCONDITIONAL_JUMP 0 true 1000:6f0c Code1 LAB_1000_6f0c +1000:6c2f FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6c34 Code1 LAB_1000_6c34 +1000:6c31 FUN_1000_6bf8 UNCONDITIONAL_JUMP 0 true 1000:6f0c Code1 LAB_1000_6f0c +1000:6c34 FUN_1000_6bf8 DATA 1 true Stack[0x8] - +1000:6c3e FUN_1000_6bf8 DATA 0 true Stack[-0x8] - +1000:6c41 FUN_1000_6bf8 DATA 0 true Stack[-0x8] - +1000:6c45 FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6c87 Code1 LAB_1000_6c87 +1000:6c47 FUN_1000_6bf8 DATA 1 true Stack[0x4] - +1000:6c59 FUN_1000_6bf8 UNCONDITIONAL_CALL 0 true 1000:6073 Code1 FUN_1000_6073 FUN_1000_6073 +1000:6c60 FUN_1000_6bf8 READ 1 true 1028:064e Data6 DAT_1028_064e +1000:6c6c FUN_1000_6bf8 DATA 1 true Stack[0x4] - +1000:6c7f FUN_1000_6bf8 UNCONDITIONAL_CALL 0 true 1018:0e9e Code4 FUN_1018_0e9e FUN_1018_0e9e +1000:6c84 FUN_1000_6bf8 UNCONDITIONAL_JUMP 0 true 1000:6f20 Code1 LAB_1000_6f20 +1000:6c87 FUN_1000_6bf8 DATA 1 true Stack[0x4] - +1000:6c90 FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6c95 Code1 LAB_1000_6c95 +1000:6c92 FUN_1000_6bf8 UNCONDITIONAL_JUMP 0 true 1000:6ee7 Code1 LAB_1000_6ee7 +1000:6c9b FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6ca0 Code1 LAB_1000_6ca0 +1000:6c9d FUN_1000_6bf8 UNCONDITIONAL_JUMP 0 true 1000:6ee7 Code1 LAB_1000_6ee7 +1000:6ca0 FUN_1000_6bf8 DATA 0 true Stack[-0x8] - +1000:6ca4 FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6ca9 Code1 LAB_1000_6ca9 +1000:6ca6 FUN_1000_6bf8 UNCONDITIONAL_JUMP 0 true 1000:6ee7 Code1 LAB_1000_6ee7 +1000:6ca9 FUN_1000_6bf8 DATA 1 true Stack[-0xc] - +1000:6cac FUN_1000_6bf8 DATA 1 true Stack[-0xa] - +1000:6cb4 FUN_1000_6bf8 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:6cbd FUN_1000_6bf8 DATA 1 true Stack[0x4] - +1000:6ce4 FUN_1000_6bf8 READ 0 true 1028:07d0 Data6 DAT_1028_07d0 +1000:6ce9 FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6cee Code1 LAB_1000_6cee +1000:6ceb FUN_1000_6bf8 UNCONDITIONAL_JUMP 0 true 1000:6ee5 Code1 LAB_1000_6ee5 +1000:6cf2 FUN_1000_6bf8 UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:6cf7 FUN_1000_6bf8 DATA 0 true Stack[-0xe] - +1000:6cfa FUN_1000_6bf8 DATA 1 true Stack[-0xc] - +1000:6cfd FUN_1000_6bf8 DATA 1 true Stack[-0xa] - +1000:6d07 FUN_1000_6bf8 DATA 1 true Stack[0x4] - +1000:6d0f FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6d1a Code1 LAB_1000_6d1a +1000:6d11 FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6d25 Code1 LAB_1000_6d25 +1000:6d18 FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6d25 Code1 LAB_1000_6d25 +1000:6d1d FUN_1000_6bf8 UNCONDITIONAL_CALL 0 true 1000:6b37 Code1 FUN_1000_6b37 FUN_1000_6b37 +1000:6d22 FUN_1000_6bf8 UNCONDITIONAL_JUMP 0 true 1000:6ed6 Code1 LAB_1000_6ed6 +1000:6d25 FUN_1000_6bf8 DATA 1 true Stack[-0xc] - +1000:6d28 FUN_1000_6bf8 DATA 1 true Stack[-0xa] - +1000:6d31 FUN_1000_6bf8 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:6d36 FUN_1000_6bf8 DATA 1 true Stack[0x4] - +1000:6d3e FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6d49 Code1 LAB_1000_6d49 +1000:6d40 FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6d54 Code1 LAB_1000_6d54 +1000:6d47 FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6d54 Code1 LAB_1000_6d54 +1000:6d4c FUN_1000_6bf8 UNCONDITIONAL_CALL 0 true 1000:6b37 Code1 FUN_1000_6b37 FUN_1000_6b37 +1000:6d51 FUN_1000_6bf8 UNCONDITIONAL_JUMP 0 true 1000:6ed6 Code1 LAB_1000_6ed6 +1000:6d54 FUN_1000_6bf8 DATA 1 true Stack[-0xc] - +1000:6d57 FUN_1000_6bf8 DATA 1 true Stack[-0xa] - +1000:6d60 FUN_1000_6bf8 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:6d65 FUN_1000_6bf8 DATA 1 true Stack[0x4] - +1000:6d6d FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6d78 Code1 LAB_1000_6d78 +1000:6d6f FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6d83 Code1 LAB_1000_6d83 +1000:6d76 FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6d83 Code1 LAB_1000_6d83 +1000:6d7b FUN_1000_6bf8 UNCONDITIONAL_CALL 0 true 1000:6b37 Code1 FUN_1000_6b37 FUN_1000_6b37 +1000:6d80 FUN_1000_6bf8 UNCONDITIONAL_JUMP 0 true 1000:6ed6 Code1 LAB_1000_6ed6 +1000:6d83 FUN_1000_6bf8 DATA 1 true Stack[-0xc] - +1000:6d86 FUN_1000_6bf8 DATA 1 true Stack[-0xa] - +1000:6d8f FUN_1000_6bf8 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:6d94 FUN_1000_6bf8 DATA 1 true Stack[0x4] - +1000:6d9c FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6da7 Code1 LAB_1000_6da7 +1000:6d9e FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6db2 Code1 LAB_1000_6db2 +1000:6da5 FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6db2 Code1 LAB_1000_6db2 +1000:6daa FUN_1000_6bf8 UNCONDITIONAL_CALL 0 true 1000:6b37 Code1 FUN_1000_6b37 FUN_1000_6b37 +1000:6daf FUN_1000_6bf8 UNCONDITIONAL_JUMP 0 true 1000:6ed6 Code1 LAB_1000_6ed6 +1000:6db2 FUN_1000_6bf8 DATA 1 true Stack[-0xc] - +1000:6db5 FUN_1000_6bf8 DATA 1 true Stack[-0xa] - +1000:6dbe FUN_1000_6bf8 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:6dc3 FUN_1000_6bf8 DATA 1 true Stack[0x4] - +1000:6dcb FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6dd6 Code1 LAB_1000_6dd6 +1000:6dcd FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6de1 Code1 LAB_1000_6de1 +1000:6dd4 FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6de1 Code1 LAB_1000_6de1 +1000:6dd9 FUN_1000_6bf8 UNCONDITIONAL_CALL 0 true 1000:6b37 Code1 FUN_1000_6b37 FUN_1000_6b37 +1000:6dde FUN_1000_6bf8 UNCONDITIONAL_JUMP 0 true 1000:6ed6 Code1 LAB_1000_6ed6 +1000:6de1 FUN_1000_6bf8 DATA 1 true Stack[-0xc] - +1000:6de4 FUN_1000_6bf8 DATA 1 true Stack[-0xa] - +1000:6ded FUN_1000_6bf8 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:6df2 FUN_1000_6bf8 DATA 1 true Stack[0x4] - +1000:6dfa FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6e05 Code1 LAB_1000_6e05 +1000:6dfc FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6e10 Code1 LAB_1000_6e10 +1000:6e03 FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6e10 Code1 LAB_1000_6e10 +1000:6e08 FUN_1000_6bf8 UNCONDITIONAL_CALL 0 true 1000:6b37 Code1 FUN_1000_6b37 FUN_1000_6b37 +1000:6e0d FUN_1000_6bf8 UNCONDITIONAL_JUMP 0 true 1000:6ed6 Code1 LAB_1000_6ed6 +1000:6e10 FUN_1000_6bf8 DATA 1 true Stack[-0xc] - +1000:6e13 FUN_1000_6bf8 DATA 1 true Stack[-0xa] - +1000:6e1c FUN_1000_6bf8 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:6e21 FUN_1000_6bf8 DATA 1 true Stack[0x4] - +1000:6e29 FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6e34 Code1 LAB_1000_6e34 +1000:6e2b FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6e40 Code1 LAB_1000_6e40 +1000:6e32 FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6e40 Code1 LAB_1000_6e40 +1000:6e38 FUN_1000_6bf8 UNCONDITIONAL_CALL 0 true 1000:6b37 Code1 FUN_1000_6b37 FUN_1000_6b37 +1000:6e3d FUN_1000_6bf8 UNCONDITIONAL_JUMP 0 true 1000:6ed6 Code1 LAB_1000_6ed6 +1000:6e40 FUN_1000_6bf8 DATA 1 true Stack[-0xc] - +1000:6e43 FUN_1000_6bf8 DATA 1 true Stack[-0xa] - +1000:6e4c FUN_1000_6bf8 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:6e51 FUN_1000_6bf8 DATA 1 true Stack[0x4] - +1000:6e59 FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6e64 Code1 LAB_1000_6e64 +1000:6e5b FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6e6f Code1 LAB_1000_6e6f +1000:6e62 FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6e6f Code1 LAB_1000_6e6f +1000:6e68 FUN_1000_6bf8 UNCONDITIONAL_CALL 0 true 1000:6b37 Code1 FUN_1000_6b37 FUN_1000_6b37 +1000:6e6d FUN_1000_6bf8 UNCONDITIONAL_JUMP 0 true 1000:6ed6 Code1 LAB_1000_6ed6 +1000:6e6f FUN_1000_6bf8 DATA 1 true Stack[-0xc] - +1000:6e72 FUN_1000_6bf8 DATA 1 true Stack[-0xa] - +1000:6e7b FUN_1000_6bf8 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:6e80 FUN_1000_6bf8 DATA 1 true Stack[0x4] - +1000:6e88 FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6e93 Code1 LAB_1000_6e93 +1000:6e8a FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6e9e Code1 LAB_1000_6e9e +1000:6e91 FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6e9e Code1 LAB_1000_6e9e +1000:6e97 FUN_1000_6bf8 UNCONDITIONAL_CALL 0 true 1000:6b37 Code1 FUN_1000_6b37 FUN_1000_6b37 +1000:6e9c FUN_1000_6bf8 UNCONDITIONAL_JUMP 0 true 1000:6ed6 Code1 LAB_1000_6ed6 +1000:6e9e FUN_1000_6bf8 DATA 1 true Stack[-0xc] - +1000:6ea1 FUN_1000_6bf8 DATA 1 true Stack[-0xa] - +1000:6eaa FUN_1000_6bf8 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:6eaf FUN_1000_6bf8 DATA 1 true Stack[0x4] - +1000:6eb7 FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6ec2 Code1 LAB_1000_6ec2 +1000:6eb9 FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6ecd Code1 LAB_1000_6ecd +1000:6ec0 FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6ecd Code1 LAB_1000_6ecd +1000:6ec6 FUN_1000_6bf8 UNCONDITIONAL_CALL 0 true 1000:6b37 Code1 FUN_1000_6b37 FUN_1000_6b37 +1000:6ecb FUN_1000_6bf8 UNCONDITIONAL_JUMP 0 true 1000:6ed6 Code1 LAB_1000_6ed6 +1000:6ed1 FUN_1000_6bf8 UNCONDITIONAL_CALL 0 true 1000:6b37 Code1 FUN_1000_6b37 FUN_1000_6b37 +1000:6ed6 FUN_1000_6bf8 DATA 1 true Stack[0x4] - +1000:6edd FUN_1000_6bf8 DATA 0 true Stack[-0xe] - +1000:6ee0 FUN_1000_6bf8 UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:6ee5 FUN_1000_6bf8 UNCONDITIONAL_JUMP 0 true 1000:6f0c Code1 LAB_1000_6f0c +1000:6ee7 FUN_1000_6bf8 READ 0 true 1028:07c6 Data6 DAT_1028_07c6 +1000:6eec FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6f0c Code1 LAB_1000_6f0c +1000:6eee FUN_1000_6bf8 DATA 0 true Stack[-0x8] - +1000:6ef2 FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6efd Code1 LAB_1000_6efd +1000:6ef4 FUN_1000_6bf8 DATA 1 true Stack[0x4] - +1000:6efd FUN_1000_6bf8 DATA 0 true Stack[-0x8] - +1000:6f01 FUN_1000_6bf8 CONDITIONAL_JUMP 0 true 1000:6f0c Code1 LAB_1000_6f0c +1000:6f03 FUN_1000_6bf8 DATA 1 true Stack[0x4] - +1000:6f0c FUN_1000_6bf8 DATA 1 true Stack[0x8] - +1000:6f1d FUN_1000_6bf8 DATA 0 true Stack[-0x4] - +1000:6f20 FUN_1000_6bf8 DATA 1 true Stack[-0x4] - +1000:6f2b FUN_1000_6f27 DATA 1 true Stack[0x4] - +1000:6f36 FUN_1000_6f27 UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:6f3b FUN_1000_6f27 DATA 0 true Stack[-0x4] - +1000:6f3e FUN_1000_6f27 DATA 0 true Stack[-0x4] - +1000:6f41 FUN_1000_6f27 UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1000:6f46 FUN_1000_6f27 DATA 0 true Stack[-0x8] - +1000:6f49 FUN_1000_6f27 DATA 0 true Stack[-0x4] - +1000:6f4c FUN_1000_6f27 UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1000:6f51 FUN_1000_6f27 DATA 0 true Stack[-0x6] - +1000:6f54 FUN_1000_6f27 DATA 0 true Stack[-0x4] - +1000:6f5b FUN_1000_6f27 UNCONDITIONAL_CALL 0 true 1228:0158 EXTERNAL CREATECOMPATIBLEBITMAP CREATECOMPATIBLEBITMAP +1000:6f60 FUN_1000_6f27 DATA 0 true Stack[-0xe] - +1000:6f63 FUN_1000_6f27 DATA 0 true Stack[-0x8] - +1000:6f66 FUN_1000_6f27 READ 0 true 1028:0859 Data6 DAT_1028_0859 +1000:6f6a FUN_1000_6f27 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:6f6f FUN_1000_6f27 DATA 0 true Stack[-0xa] - +1000:6f72 FUN_1000_6f27 DATA 0 true Stack[-0x6] - +1000:6f75 FUN_1000_6f27 DATA 0 true Stack[-0xe] - +1000:6f78 FUN_1000_6f27 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:6f7d FUN_1000_6f27 DATA 0 true Stack[-0xc] - +1000:6f80 FUN_1000_6f27 READ 0 true 1028:0857 Data6 DAT_1028_0857 +1000:6f85 FUN_1000_6f27 CONDITIONAL_JUMP 0 true 1000:6f90 Code1 LAB_1000_6f90 +1000:6f87 FUN_1000_6f27 CONDITIONAL_JUMP 0 true 1000:6fc5 Code1 LAB_1000_6fc5 +1000:6f89 FUN_1000_6f27 READ 0 true 1028:0855 Data6 DAT_1028_0855 +1000:6f8e FUN_1000_6f27 CONDITIONAL_JUMP 0 true 1000:6fc5 Code1 LAB_1000_6fc5 +1000:6f90 FUN_1000_6f27 DATA 0 true Stack[-0x6] - +1000:6f9b FUN_1000_6f27 DATA 0 true Stack[-0x8] - +1000:6f9e FUN_1000_6f27 READ 1 true 1028:0855 Data6 DAT_1028_0855 +1000:6fa1 FUN_1000_6f27 READ 1 true 1028:0857 Data6 DAT_1028_0857 +1000:6fb0 FUN_1000_6f27 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:6fbd FUN_1000_6f27 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:6fc2 FUN_1000_6f27 UNCONDITIONAL_JUMP 0 true 1000:711b Code1 LAB_1000_711b +1000:6fc5 FUN_1000_6f27 DATA 0 true Stack[-0x8] - +1000:6fc8 FUN_1000_6f27 READ 0 true 1028:085d Data6 DAT_1028_085d +1000:6fcc FUN_1000_6f27 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:6fd1 FUN_1000_6f27 DATA 0 true Stack[-0x6] - +1000:6fdc FUN_1000_6f27 DATA 0 true Stack[-0x8] - +1000:6fe8 FUN_1000_6f27 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:6fed FUN_1000_6f27 DATA 0 true Stack[-0x8] - +1000:6ff0 FUN_1000_6f27 READ 0 true 1028:0859 Data6 DAT_1028_0859 +1000:6ff4 FUN_1000_6f27 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:6ff9 FUN_1000_6f27 READ 1 true 1028:3371 Data6 DAT_1028_3371 +1000:6ffc FUN_1000_6f27 DATA 0 true Stack[-0x10] - +1000:6fff FUN_1000_6f27 READ 1 true 1028:33c4 Data6 DAT_1028_33c4 +1000:7002 FUN_1000_6f27 WRITE 0 true 1028:3371 Data6 DAT_1028_3371 +1000:7005 FUN_1000_6f27 READ 1 true 1028:3417 Data6 DAT_1028_3417 +1000:7008 FUN_1000_6f27 WRITE 0 true 1028:33c4 Data6 DAT_1028_33c4 +1000:700b FUN_1000_6f27 READ 1 true 1028:346a Data6 DAT_1028_346a +1000:700e FUN_1000_6f27 WRITE 0 true 1028:3417 Data6 DAT_1028_3417 +1000:7011 FUN_1000_6f27 READ 1 true 1028:34bd Data6 DAT_1028_34bd +1000:7014 FUN_1000_6f27 WRITE 0 true 1028:346a Data6 DAT_1028_346a +1000:7017 FUN_1000_6f27 DATA 1 true Stack[-0x10] - +1000:701a FUN_1000_6f27 WRITE 0 true 1028:34bd Data6 DAT_1028_34bd +1000:701d FUN_1000_6f27 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:7025 FUN_1000_6f27 DATA 1 true Stack[0x4] - +1000:7033 FUN_1000_6f27 DATA 0 true Stack[-0x25] - +1000:7036 FUN_1000_6f27 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:703e FUN_1000_6f27 DATA 1 true Stack[0x4] - +1000:704c FUN_1000_6f27 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:7054 FUN_1000_6f27 DATA 1 true Stack[0x4] - +1000:7062 FUN_1000_6f27 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:706a FUN_1000_6f27 DATA 1 true Stack[0x4] - +1000:7078 FUN_1000_6f27 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:7080 FUN_1000_6f27 DATA 1 true Stack[0x4] - +1000:708e FUN_1000_6f27 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:7096 FUN_1000_6f27 DATA 1 true Stack[0x4] - +1000:70a4 FUN_1000_6f27 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:70ac FUN_1000_6f27 DATA 1 true Stack[0x4] - +1000:70ba FUN_1000_6f27 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:70c2 FUN_1000_6f27 DATA 1 true Stack[0x4] - +1000:70d0 FUN_1000_6f27 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:70d8 FUN_1000_6f27 DATA 1 true Stack[0x4] - +1000:70e6 FUN_1000_6f27 DATA 1 true Stack[-0x25] - +1000:70e9 FUN_1000_6f27 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:70f1 FUN_1000_6f27 DATA 1 true Stack[0x4] - +1000:70ff FUN_1000_6f27 DATA 0 true Stack[-0x10] - +1000:7104 FUN_1000_6f27 UNCONDITIONAL_JUMP 0 true 1000:7109 Code1 LAB_1000_7109 +1000:7106 FUN_1000_6f27 DATA 0 true Stack[-0x10] - +1000:7109 FUN_1000_6f27 DATA 0 true Stack[-0x10] - +1000:710c FUN_1000_6f27 DATA 1 true Stack[0x4] - +1000:7110 FUN_1000_6f27 UNCONDITIONAL_CALL 0 true 1000:7e92 Code1 FUN_1000_7e92 FUN_1000_7e92 +1000:7115 FUN_1000_6f27 DATA 0 true Stack[-0x10] - +1000:7119 FUN_1000_6f27 CONDITIONAL_JUMP 0 true 1000:7106 Code1 LAB_1000_7106 +1000:711b FUN_1000_6f27 READ 1 true 1028:0855 Data6 DAT_1028_0855 +1000:7121 FUN_1000_6f27 CONDITIONAL_JUMP 0 true 1000:715f Code1 LAB_1000_715f +1000:7125 FUN_1000_6f27 UNCONDITIONAL_CALL 0 true 1008:0002 Code2 FUN_1008_0002 FUN_1008_0002 +1000:712a FUN_1000_6f27 DATA 0 true Stack[-0x12] - +1000:712f FUN_1000_6f27 DATA 0 true Stack[-0x1c] - +1000:7134 FUN_1000_6f27 DATA 0 true Stack[-0x14] - +1000:7139 FUN_1000_6f27 DATA 0 true Stack[-0x1e] - +1000:713e FUN_1000_6f27 DATA 0 true Stack[-0x16] - +1000:7143 FUN_1000_6f27 DATA 0 true Stack[-0x20] - +1000:7148 FUN_1000_6f27 DATA 0 true Stack[-0x18] - +1000:714d FUN_1000_6f27 DATA 0 true Stack[-0x22] - +1000:7152 FUN_1000_6f27 DATA 0 true Stack[-0x1a] - +1000:7157 FUN_1000_6f27 DATA 0 true Stack[-0x24] - +1000:715c FUN_1000_6f27 UNCONDITIONAL_JUMP 0 true 1000:727c Code1 LAB_1000_727c +1000:7162 FUN_1000_6f27 CONDITIONAL_JUMP 0 true 1000:7199 Code1 LAB_1000_7199 +1000:7164 FUN_1000_6f27 DATA 0 true Stack[-0x12] - +1000:7169 FUN_1000_6f27 DATA 0 true Stack[-0x1c] - +1000:716e FUN_1000_6f27 DATA 0 true Stack[-0x14] - +1000:7173 FUN_1000_6f27 DATA 0 true Stack[-0x1e] - +1000:7178 FUN_1000_6f27 DATA 0 true Stack[-0x16] - +1000:717d FUN_1000_6f27 DATA 0 true Stack[-0x20] - +1000:7182 FUN_1000_6f27 DATA 0 true Stack[-0x18] - +1000:7187 FUN_1000_6f27 DATA 0 true Stack[-0x22] - +1000:718c FUN_1000_6f27 DATA 0 true Stack[-0x1a] - +1000:7191 FUN_1000_6f27 DATA 0 true Stack[-0x24] - +1000:7196 FUN_1000_6f27 UNCONDITIONAL_JUMP 0 true 1000:727c Code1 LAB_1000_727c +1000:719c FUN_1000_6f27 CONDITIONAL_JUMP 0 true 1000:71d3 Code1 LAB_1000_71d3 +1000:719e FUN_1000_6f27 DATA 0 true Stack[-0x12] - +1000:71a3 FUN_1000_6f27 DATA 0 true Stack[-0x1c] - +1000:71a8 FUN_1000_6f27 DATA 0 true Stack[-0x14] - +1000:71ad FUN_1000_6f27 DATA 0 true Stack[-0x1e] - +1000:71b2 FUN_1000_6f27 DATA 0 true Stack[-0x16] - +1000:71b7 FUN_1000_6f27 DATA 0 true Stack[-0x20] - +1000:71bc FUN_1000_6f27 DATA 0 true Stack[-0x18] - +1000:71c1 FUN_1000_6f27 DATA 0 true Stack[-0x22] - +1000:71c6 FUN_1000_6f27 DATA 0 true Stack[-0x1a] - +1000:71cb FUN_1000_6f27 DATA 0 true Stack[-0x24] - +1000:71d0 FUN_1000_6f27 UNCONDITIONAL_JUMP 0 true 1000:727c Code1 LAB_1000_727c +1000:71d6 FUN_1000_6f27 CONDITIONAL_JUMP 0 true 1000:720c Code1 LAB_1000_720c +1000:71d8 FUN_1000_6f27 DATA 0 true Stack[-0x12] - +1000:71dd FUN_1000_6f27 DATA 0 true Stack[-0x1c] - +1000:71e2 FUN_1000_6f27 DATA 0 true Stack[-0x14] - +1000:71e7 FUN_1000_6f27 DATA 0 true Stack[-0x1e] - +1000:71ec FUN_1000_6f27 DATA 0 true Stack[-0x16] - +1000:71f1 FUN_1000_6f27 DATA 0 true Stack[-0x20] - +1000:71f6 FUN_1000_6f27 DATA 0 true Stack[-0x18] - +1000:71fb FUN_1000_6f27 DATA 0 true Stack[-0x22] - +1000:7200 FUN_1000_6f27 DATA 0 true Stack[-0x1a] - +1000:7205 FUN_1000_6f27 DATA 0 true Stack[-0x24] - +1000:720a FUN_1000_6f27 UNCONDITIONAL_JUMP 0 true 1000:727c Code1 LAB_1000_727c +1000:720f FUN_1000_6f27 CONDITIONAL_JUMP 0 true 1000:7245 Code1 LAB_1000_7245 +1000:7211 FUN_1000_6f27 DATA 0 true Stack[-0x12] - +1000:7216 FUN_1000_6f27 DATA 0 true Stack[-0x1c] - +1000:721b FUN_1000_6f27 DATA 0 true Stack[-0x14] - +1000:7220 FUN_1000_6f27 DATA 0 true Stack[-0x1e] - +1000:7225 FUN_1000_6f27 DATA 0 true Stack[-0x16] - +1000:722a FUN_1000_6f27 DATA 0 true Stack[-0x20] - +1000:722f FUN_1000_6f27 DATA 0 true Stack[-0x18] - +1000:7234 FUN_1000_6f27 DATA 0 true Stack[-0x22] - +1000:7239 FUN_1000_6f27 DATA 0 true Stack[-0x1a] - +1000:723e FUN_1000_6f27 DATA 0 true Stack[-0x24] - +1000:7243 FUN_1000_6f27 UNCONDITIONAL_JUMP 0 true 1000:727c Code1 LAB_1000_727c +1000:7248 FUN_1000_6f27 CONDITIONAL_JUMP 0 true 1000:727c Code1 LAB_1000_727c +1000:724a FUN_1000_6f27 DATA 0 true Stack[-0x12] - +1000:724f FUN_1000_6f27 DATA 0 true Stack[-0x1c] - +1000:7254 FUN_1000_6f27 DATA 0 true Stack[-0x14] - +1000:7259 FUN_1000_6f27 DATA 0 true Stack[-0x1e] - +1000:725e FUN_1000_6f27 DATA 0 true Stack[-0x16] - +1000:7263 FUN_1000_6f27 DATA 0 true Stack[-0x20] - +1000:7268 FUN_1000_6f27 DATA 0 true Stack[-0x18] - +1000:726d FUN_1000_6f27 DATA 0 true Stack[-0x22] - +1000:7272 FUN_1000_6f27 DATA 0 true Stack[-0x1a] - +1000:7277 FUN_1000_6f27 DATA 0 true Stack[-0x24] - +1000:727c FUN_1000_6f27 READ 0 true 1028:3371 Data6 DAT_1028_3371 +1000:7281 FUN_1000_6f27 CONDITIONAL_JUMP 0 true 1000:72c3 Code1 LAB_1000_72c3 +1000:7283 FUN_1000_6f27 DATA 0 true Stack[-0x6] - +1000:7286 FUN_1000_6f27 DATA 0 true Stack[-0x12] - +1000:7289 FUN_1000_6f27 DATA 0 true Stack[-0x1c] - +1000:7290 FUN_1000_6f27 DATA 0 true Stack[-0x8] - +1000:729e FUN_1000_6f27 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:72a3 FUN_1000_6f27 DATA 0 true Stack[-0x6] - +1000:72a6 FUN_1000_6f27 DATA 0 true Stack[-0x12] - +1000:72a9 FUN_1000_6f27 DATA 0 true Stack[-0x1c] - +1000:72b0 FUN_1000_6f27 DATA 0 true Stack[-0x8] - +1000:72be FUN_1000_6f27 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:72c3 FUN_1000_6f27 READ 0 true 1028:33c4 Data6 DAT_1028_33c4 +1000:72c8 FUN_1000_6f27 CONDITIONAL_JUMP 0 true 1000:730a Code1 LAB_1000_730a +1000:72ca FUN_1000_6f27 DATA 0 true Stack[-0x6] - +1000:72cd FUN_1000_6f27 DATA 0 true Stack[-0x14] - +1000:72d0 FUN_1000_6f27 DATA 0 true Stack[-0x1e] - +1000:72d7 FUN_1000_6f27 DATA 0 true Stack[-0x8] - +1000:72e5 FUN_1000_6f27 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:72ea FUN_1000_6f27 DATA 0 true Stack[-0x6] - +1000:72ed FUN_1000_6f27 DATA 0 true Stack[-0x14] - +1000:72f0 FUN_1000_6f27 DATA 0 true Stack[-0x1e] - +1000:72f7 FUN_1000_6f27 DATA 0 true Stack[-0x8] - +1000:7305 FUN_1000_6f27 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:730a FUN_1000_6f27 READ 0 true 1028:3417 Data6 DAT_1028_3417 +1000:730f FUN_1000_6f27 CONDITIONAL_JUMP 0 true 1000:7351 Code1 LAB_1000_7351 +1000:7311 FUN_1000_6f27 DATA 0 true Stack[-0x6] - +1000:7314 FUN_1000_6f27 DATA 0 true Stack[-0x16] - +1000:7317 FUN_1000_6f27 DATA 0 true Stack[-0x20] - +1000:731e FUN_1000_6f27 DATA 0 true Stack[-0x8] - +1000:732c FUN_1000_6f27 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:7331 FUN_1000_6f27 DATA 0 true Stack[-0x6] - +1000:7334 FUN_1000_6f27 DATA 0 true Stack[-0x16] - +1000:7337 FUN_1000_6f27 DATA 0 true Stack[-0x20] - +1000:733e FUN_1000_6f27 DATA 0 true Stack[-0x8] - +1000:734c FUN_1000_6f27 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:7351 FUN_1000_6f27 READ 0 true 1028:346a Data6 DAT_1028_346a +1000:7356 FUN_1000_6f27 CONDITIONAL_JUMP 0 true 1000:7398 Code1 LAB_1000_7398 +1000:7358 FUN_1000_6f27 DATA 0 true Stack[-0x6] - +1000:735b FUN_1000_6f27 DATA 0 true Stack[-0x18] - +1000:735e FUN_1000_6f27 DATA 0 true Stack[-0x22] - +1000:7365 FUN_1000_6f27 DATA 0 true Stack[-0x8] - +1000:7373 FUN_1000_6f27 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:7378 FUN_1000_6f27 DATA 0 true Stack[-0x6] - +1000:737b FUN_1000_6f27 DATA 0 true Stack[-0x18] - +1000:737e FUN_1000_6f27 DATA 0 true Stack[-0x22] - +1000:7385 FUN_1000_6f27 DATA 0 true Stack[-0x8] - +1000:7393 FUN_1000_6f27 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:7398 FUN_1000_6f27 READ 0 true 1028:34bd Data6 DAT_1028_34bd +1000:739d FUN_1000_6f27 CONDITIONAL_JUMP 0 true 1000:73df Code1 LAB_1000_73df +1000:739f FUN_1000_6f27 DATA 0 true Stack[-0x6] - +1000:73a2 FUN_1000_6f27 DATA 0 true Stack[-0x1a] - +1000:73a5 FUN_1000_6f27 DATA 0 true Stack[-0x24] - +1000:73ac FUN_1000_6f27 DATA 0 true Stack[-0x8] - +1000:73ba FUN_1000_6f27 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:73bf FUN_1000_6f27 DATA 0 true Stack[-0x6] - +1000:73c2 FUN_1000_6f27 DATA 0 true Stack[-0x1a] - +1000:73c5 FUN_1000_6f27 DATA 0 true Stack[-0x24] - +1000:73cc FUN_1000_6f27 DATA 0 true Stack[-0x8] - +1000:73da FUN_1000_6f27 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:73df FUN_1000_6f27 DATA 0 true Stack[-0x4] - +1000:73ea FUN_1000_6f27 DATA 0 true Stack[-0x6] - +1000:73f6 FUN_1000_6f27 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:73fb FUN_1000_6f27 DATA 0 true Stack[-0x8] - +1000:73fe FUN_1000_6f27 DATA 0 true Stack[-0xa] - +1000:7401 FUN_1000_6f27 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:7406 FUN_1000_6f27 DATA 0 true Stack[-0x6] - +1000:7409 FUN_1000_6f27 DATA 0 true Stack[-0xc] - +1000:740c FUN_1000_6f27 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:7411 FUN_1000_6f27 DATA 0 true Stack[-0xe] - +1000:7414 FUN_1000_6f27 UNCONDITIONAL_CALL 0 true 1228:0168 EXTERNAL DELETEOBJECT DELETEOBJECT +1000:7419 FUN_1000_6f27 DATA 0 true Stack[-0x6] - +1000:741c FUN_1000_6f27 UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1000:7421 FUN_1000_6f27 DATA 0 true Stack[-0x8] - +1000:7424 FUN_1000_6f27 UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1000:7429 FUN_1000_6f27 DATA 1 true Stack[0x4] - +1000:7434 FUN_1000_6f27 DATA 0 true Stack[-0x4] - +1000:7437 FUN_1000_6f27 UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:7444 FUN_1000_7440 DATA 1 true Stack[0x4] - +1000:744f FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:7454 FUN_1000_7440 DATA 0 true Stack[-0x4] - +1000:7457 FUN_1000_7440 DATA 0 true Stack[-0x4] - +1000:745a FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1000:745f FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:7462 FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:7465 FUN_1000_7440 READ 0 true 1028:085f Data6 DAT_1028_085f +1000:7469 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:746e FUN_1000_7440 DATA 0 true Stack[-0xa] - +1000:7471 FUN_1000_7440 DATA 0 true Stack[-0x4] - +1000:7474 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1000:7479 FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:747c FUN_1000_7440 DATA 0 true Stack[-0x4] - +1000:7483 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0158 EXTERNAL CREATECOMPATIBLEBITMAP CREATECOMPATIBLEBITMAP +1000:7488 FUN_1000_7440 DATA 0 true Stack[-0xe] - +1000:748b FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:748e FUN_1000_7440 DATA 0 true Stack[-0xe] - +1000:7491 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:7496 FUN_1000_7440 DATA 0 true Stack[-0xc] - +1000:7499 FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:74a4 FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:74b0 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:74b5 FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:74b8 FUN_1000_7440 READ 0 true 1028:0859 Data6 DAT_1028_0859 +1000:74bc FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:74c1 FUN_1000_7440 READ 1 true 1028:0851 Data6 DAT_1028_0851 +1000:74c7 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:74cc Code1 LAB_1000_74cc +1000:74c9 FUN_1000_7440 UNCONDITIONAL_JUMP 0 true 1000:75b2 Code1 LAB_1000_75b2 +1000:74cf FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:74d4 Code1 LAB_1000_74d4 +1000:74d1 FUN_1000_7440 UNCONDITIONAL_JUMP 0 true 1000:75b2 Code1 LAB_1000_75b2 +1000:74d4 FUN_1000_7440 READ 0 true 1028:0853 Data6 DAT_1028_0853 +1000:74d9 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:751d Code1 LAB_1000_751d +1000:74db FUN_1000_7440 READ 0 true 1028:0851 Data6 DAT_1028_0851 +1000:74e0 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:751d Code1 LAB_1000_751d +1000:74e4 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1008:0002 Code2 FUN_1008_0002 FUN_1008_0002 +1000:74e9 FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:74ec FUN_1000_7440 READ 0 true 1028:085b Data6 DAT_1028_085b +1000:74f0 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:74f5 FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:7500 FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:750d FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:7512 FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:7515 FUN_1000_7440 DATA 0 true Stack[-0xe] - +1000:7518 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:751d FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:7526 FUN_1000_7440 READ 1 true 1028:0851 Data6 DAT_1028_0851 +1000:7529 FUN_1000_7440 READ 1 true 1028:0853 Data6 DAT_1028_0853 +1000:7532 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:7538 FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:7542 FUN_1000_7440 READ 1 true 1028:0851 Data6 DAT_1028_0851 +1000:7546 FUN_1000_7440 READ 1 true 1028:0853 Data6 DAT_1028_0853 +1000:754f FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:7561 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:7566 FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:756f FUN_1000_7440 READ 1 true 1028:0851 Data6 DAT_1028_0851 +1000:7572 FUN_1000_7440 READ 1 true 1028:0853 Data6 DAT_1028_0853 +1000:757b FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:7581 FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:758b FUN_1000_7440 READ 1 true 1028:0851 Data6 DAT_1028_0851 +1000:758f FUN_1000_7440 READ 1 true 1028:0853 Data6 DAT_1028_0853 +1000:7598 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:75aa FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:75af FUN_1000_7440 UNCONDITIONAL_JUMP 0 true 1000:7db1 Code1 LAB_1000_7db1 +1000:75b5 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:760c Code1 LAB_1000_760c +1000:75ba FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:760c Code1 LAB_1000_760c +1000:75bc FUN_1000_7440 READ 0 true 1028:0853 Data6 DAT_1028_0853 +1000:75c1 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:75cf Code1 LAB_1000_75cf +1000:75c3 FUN_1000_7440 READ 0 true 1028:0851 Data6 DAT_1028_0851 +1000:75c8 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:75cf Code1 LAB_1000_75cf +1000:75ca FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1008:118f Code2 FUN_1008_118f FUN_1008_118f +1000:75cf FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:75da FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:75e7 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:75ec FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:75f7 FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:7604 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:7609 FUN_1000_7440 UNCONDITIONAL_JUMP 0 true 1000:7db1 Code1 LAB_1000_7db1 +1000:760f FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:7669 Code1 LAB_1000_7669 +1000:7614 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:7669 Code1 LAB_1000_7669 +1000:7616 FUN_1000_7440 READ 0 true 1028:0853 Data6 DAT_1028_0853 +1000:761b FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:762b Code1 LAB_1000_762b +1000:761d FUN_1000_7440 READ 0 true 1028:0851 Data6 DAT_1028_0851 +1000:7622 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:762b Code1 LAB_1000_762b +1000:7626 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1008:0002 Code2 FUN_1008_0002 FUN_1008_0002 +1000:762b FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:7636 FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:7644 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:7649 FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:7654 FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:7661 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:7666 FUN_1000_7440 UNCONDITIONAL_JUMP 0 true 1000:7db1 Code1 LAB_1000_7db1 +1000:766c FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:7671 Code1 LAB_1000_7671 +1000:766e FUN_1000_7440 UNCONDITIONAL_JUMP 0 true 1000:787e Code1 LAB_1000_787e +1000:7674 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:7679 Code1 LAB_1000_7679 +1000:7676 FUN_1000_7440 UNCONDITIONAL_JUMP 0 true 1000:787e Code1 LAB_1000_787e +1000:7679 FUN_1000_7440 READ 0 true 1028:0853 Data6 DAT_1028_0853 +1000:767e FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:768e Code1 LAB_1000_768e +1000:7680 FUN_1000_7440 READ 0 true 1028:0851 Data6 DAT_1028_0851 +1000:7685 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:768e Code1 LAB_1000_768e +1000:7689 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1008:0002 Code2 FUN_1008_0002 FUN_1008_0002 +1000:768e FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:7699 FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:76a6 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:76ab FUN_1000_7440 READ 0 true 1028:0853 Data6 DAT_1028_0853 +1000:76b0 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:76bb Code1 LAB_1000_76bb +1000:76b2 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:7726 Code1 LAB_1000_7726 +1000:76b4 FUN_1000_7440 READ 0 true 1028:0851 Data6 DAT_1028_0851 +1000:76b9 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:7726 Code1 LAB_1000_7726 +1000:76bb FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:76c5 FUN_1000_7440 READ 1 true 1028:0851 Data6 DAT_1028_0851 +1000:76c9 FUN_1000_7440 READ 1 true 1028:0853 Data6 DAT_1028_0853 +1000:76d2 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:76dc FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:76ea FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:76ef FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:76f9 FUN_1000_7440 READ 1 true 1028:0851 Data6 DAT_1028_0851 +1000:76fd FUN_1000_7440 READ 1 true 1028:0853 Data6 DAT_1028_0853 +1000:7706 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:7710 FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:771e FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:7723 FUN_1000_7440 UNCONDITIONAL_JUMP 0 true 1000:77c6 Code1 LAB_1000_77c6 +1000:7726 FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:7734 FUN_1000_7440 READ 1 true 1028:0851 Data6 DAT_1028_0851 +1000:7738 FUN_1000_7440 READ 1 true 1028:0853 Data6 DAT_1028_0853 +1000:7741 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:7747 FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:774d FUN_1000_7440 READ 1 true 1028:0851 Data6 DAT_1028_0851 +1000:7750 FUN_1000_7440 READ 1 true 1028:0853 Data6 DAT_1028_0853 +1000:775f FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:7771 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:7776 FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:7784 FUN_1000_7440 READ 1 true 1028:0851 Data6 DAT_1028_0851 +1000:7788 FUN_1000_7440 READ 1 true 1028:0853 Data6 DAT_1028_0853 +1000:7791 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:7797 FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:779d FUN_1000_7440 READ 1 true 1028:0851 Data6 DAT_1028_0851 +1000:77a0 FUN_1000_7440 READ 1 true 1028:0853 Data6 DAT_1028_0853 +1000:77af FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:77c1 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:77c6 FUN_1000_7440 READ 0 true 1028:0853 Data6 DAT_1028_0853 +1000:77cb FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:77dc Code1 LAB_1000_77dc +1000:77cd FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:77d2 Code1 LAB_1000_77d2 +1000:77cf FUN_1000_7440 UNCONDITIONAL_JUMP 0 true 1000:787b Code1 LAB_1000_787b +1000:77d2 FUN_1000_7440 READ 0 true 1028:0851 Data6 DAT_1028_0851 +1000:77d7 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:77dc Code1 LAB_1000_77dc +1000:77d9 FUN_1000_7440 UNCONDITIONAL_JUMP 0 true 1000:787b Code1 LAB_1000_787b +1000:77dc FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:77ea FUN_1000_7440 READ 1 true 1028:0851 Data6 DAT_1028_0851 +1000:77ee FUN_1000_7440 READ 1 true 1028:0853 Data6 DAT_1028_0853 +1000:77f7 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:77fd FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:7803 FUN_1000_7440 READ 1 true 1028:0851 Data6 DAT_1028_0851 +1000:7806 FUN_1000_7440 READ 1 true 1028:0853 Data6 DAT_1028_0853 +1000:7815 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:7827 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:782c FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:783a FUN_1000_7440 READ 1 true 1028:0851 Data6 DAT_1028_0851 +1000:783e FUN_1000_7440 READ 1 true 1028:0853 Data6 DAT_1028_0853 +1000:7847 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:784d FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:7852 FUN_1000_7440 READ 1 true 1028:0851 Data6 DAT_1028_0851 +1000:7855 FUN_1000_7440 READ 1 true 1028:0853 Data6 DAT_1028_0853 +1000:7864 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:7876 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:787b FUN_1000_7440 UNCONDITIONAL_JUMP 0 true 1000:7db1 Code1 LAB_1000_7db1 +1000:7881 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:78bc Code1 LAB_1000_78bc +1000:7886 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:78bc Code1 LAB_1000_78bc +1000:7888 FUN_1000_7440 READ 0 true 1028:0853 Data6 DAT_1028_0853 +1000:788d FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:789c Code1 LAB_1000_789c +1000:788f FUN_1000_7440 READ 0 true 1028:0851 Data6 DAT_1028_0851 +1000:7895 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:789c Code1 LAB_1000_789c +1000:7897 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1008:118f Code2 FUN_1008_118f FUN_1008_118f +1000:789c FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:78a7 FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:78b4 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:78b9 FUN_1000_7440 UNCONDITIONAL_JUMP 0 true 1000:7db1 Code1 LAB_1000_7db1 +1000:78bf FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:78c4 Code1 LAB_1000_78c4 +1000:78c1 FUN_1000_7440 UNCONDITIONAL_JUMP 0 true 1000:7b26 Code1 LAB_1000_7b26 +1000:78c7 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:78cc Code1 LAB_1000_78cc +1000:78c9 FUN_1000_7440 UNCONDITIONAL_JUMP 0 true 1000:7b26 Code1 LAB_1000_7b26 +1000:78cc FUN_1000_7440 READ 0 true 1028:0853 Data6 DAT_1028_0853 +1000:78d1 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:78e2 Code1 LAB_1000_78e2 +1000:78d3 FUN_1000_7440 READ 0 true 1028:0851 Data6 DAT_1028_0851 +1000:78d9 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:78e2 Code1 LAB_1000_78e2 +1000:78dd FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1008:0002 Code2 FUN_1008_0002 FUN_1008_0002 +1000:78e2 FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:78ed FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:78fa FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:78ff FUN_1000_7440 READ 0 true 1028:0853 Data6 DAT_1028_0853 +1000:7904 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:7916 Code1 LAB_1000_7916 +1000:7906 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:790b Code1 LAB_1000_790b +1000:7908 FUN_1000_7440 UNCONDITIONAL_JUMP 0 true 1000:79b8 Code1 LAB_1000_79b8 +1000:790b FUN_1000_7440 READ 0 true 1028:0851 Data6 DAT_1028_0851 +1000:7911 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:7916 Code1 LAB_1000_7916 +1000:7913 FUN_1000_7440 UNCONDITIONAL_JUMP 0 true 1000:79b8 Code1 LAB_1000_79b8 +1000:7916 FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:791f FUN_1000_7440 READ 1 true 1028:0851 Data6 DAT_1028_0851 +1000:7922 FUN_1000_7440 READ 1 true 1028:0853 Data6 DAT_1028_0853 +1000:7931 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:7937 FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:7942 FUN_1000_7440 READ 1 true 1028:0851 Data6 DAT_1028_0851 +1000:7946 FUN_1000_7440 READ 1 true 1028:0853 Data6 DAT_1028_0853 +1000:794f FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:7961 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:7966 FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:796f FUN_1000_7440 READ 1 true 1028:0851 Data6 DAT_1028_0851 +1000:7972 FUN_1000_7440 READ 1 true 1028:0853 Data6 DAT_1028_0853 +1000:7981 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:7987 FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:7992 FUN_1000_7440 READ 1 true 1028:0851 Data6 DAT_1028_0851 +1000:7996 FUN_1000_7440 READ 1 true 1028:0853 Data6 DAT_1028_0853 +1000:799f FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:79b1 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:79b6 FUN_1000_7440 UNCONDITIONAL_JUMP 0 true 1000:7a20 Code1 LAB_1000_7a20 +1000:79b8 FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:79bd FUN_1000_7440 READ 1 true 1028:0851 Data6 DAT_1028_0851 +1000:79c0 FUN_1000_7440 READ 1 true 1028:0853 Data6 DAT_1028_0853 +1000:79cf FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:79d9 FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:79e7 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:79ec FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:79f1 FUN_1000_7440 READ 1 true 1028:0851 Data6 DAT_1028_0851 +1000:79f4 FUN_1000_7440 READ 1 true 1028:0853 Data6 DAT_1028_0853 +1000:7a03 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:7a0d FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:7a1b FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:7a20 FUN_1000_7440 READ 0 true 1028:0853 Data6 DAT_1028_0853 +1000:7a25 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:7a37 Code1 LAB_1000_7a37 +1000:7a27 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:7a2c Code1 LAB_1000_7a2c +1000:7a29 FUN_1000_7440 UNCONDITIONAL_JUMP 0 true 1000:7b23 Code1 LAB_1000_7b23 +1000:7a2c FUN_1000_7440 READ 0 true 1028:0851 Data6 DAT_1028_0851 +1000:7a32 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:7a37 Code1 LAB_1000_7a37 +1000:7a34 FUN_1000_7440 UNCONDITIONAL_JUMP 0 true 1000:7b23 Code1 LAB_1000_7b23 +1000:7a37 FUN_1000_7440 READ 0 true 1028:0853 Data6 DAT_1028_0853 +1000:7a3c FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:7a84 Code1 LAB_1000_7a84 +1000:7a3e FUN_1000_7440 READ 0 true 1028:0851 Data6 DAT_1028_0851 +1000:7a44 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:7a84 Code1 LAB_1000_7a84 +1000:7a46 FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:7a51 FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:7a5f FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:7a64 FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:7a6f FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:7a7c FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:7a81 FUN_1000_7440 UNCONDITIONAL_JUMP 0 true 1000:7b23 Code1 LAB_1000_7b23 +1000:7a84 FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:7a8d FUN_1000_7440 READ 1 true 1028:0851 Data6 DAT_1028_0851 +1000:7a90 FUN_1000_7440 READ 1 true 1028:0853 Data6 DAT_1028_0853 +1000:7a9f FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:7aa5 FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:7ab0 FUN_1000_7440 READ 1 true 1028:0851 Data6 DAT_1028_0851 +1000:7ab4 FUN_1000_7440 READ 1 true 1028:0853 Data6 DAT_1028_0853 +1000:7abd FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:7acf FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:7ad4 FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:7add FUN_1000_7440 READ 1 true 1028:0851 Data6 DAT_1028_0851 +1000:7ae0 FUN_1000_7440 READ 1 true 1028:0853 Data6 DAT_1028_0853 +1000:7aef FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:7af5 FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:7aff FUN_1000_7440 READ 1 true 1028:0851 Data6 DAT_1028_0851 +1000:7b03 FUN_1000_7440 READ 1 true 1028:0853 Data6 DAT_1028_0853 +1000:7b0c FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:7b1e FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:7b23 FUN_1000_7440 UNCONDITIONAL_JUMP 0 true 1000:7db1 Code1 LAB_1000_7db1 +1000:7b29 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:7b2e Code1 LAB_1000_7b2e +1000:7b2b FUN_1000_7440 UNCONDITIONAL_JUMP 0 true 1000:7bc4 Code1 LAB_1000_7bc4 +1000:7b31 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:7b36 Code1 LAB_1000_7b36 +1000:7b33 FUN_1000_7440 UNCONDITIONAL_JUMP 0 true 1000:7bc4 Code1 LAB_1000_7bc4 +1000:7b36 FUN_1000_7440 READ 0 true 1028:0853 Data6 DAT_1028_0853 +1000:7b3b FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:7b4a Code1 LAB_1000_7b4a +1000:7b3d FUN_1000_7440 READ 0 true 1028:0851 Data6 DAT_1028_0851 +1000:7b43 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:7b4a Code1 LAB_1000_7b4a +1000:7b45 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1008:118f Code2 FUN_1008_118f FUN_1008_118f +1000:7b4a FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:7b55 FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:7b63 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:7b68 FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:7b73 FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:7b81 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:7b86 FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:7b91 FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:7b9f FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:7ba4 FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:7baf FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:7bbc FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:7bc1 FUN_1000_7440 UNCONDITIONAL_JUMP 0 true 1000:7db1 Code1 LAB_1000_7db1 +1000:7bc7 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:7bcc Code1 LAB_1000_7bcc +1000:7bc9 FUN_1000_7440 UNCONDITIONAL_JUMP 0 true 1000:7c63 Code1 LAB_1000_7c63 +1000:7bcf FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:7bd4 Code1 LAB_1000_7bd4 +1000:7bd1 FUN_1000_7440 UNCONDITIONAL_JUMP 0 true 1000:7c63 Code1 LAB_1000_7c63 +1000:7bd4 FUN_1000_7440 READ 0 true 1028:0853 Data6 DAT_1028_0853 +1000:7bd9 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:7bea Code1 LAB_1000_7bea +1000:7bdb FUN_1000_7440 READ 0 true 1028:0851 Data6 DAT_1028_0851 +1000:7be1 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:7bea Code1 LAB_1000_7bea +1000:7be5 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1008:0002 Code2 FUN_1008_0002 FUN_1008_0002 +1000:7bea FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:7bf5 FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:7c03 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:7c08 FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:7c13 FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:7c21 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:7c26 FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:7c31 FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:7c3e FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:7c43 FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:7c4e FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:7c5b FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:7c60 FUN_1000_7440 UNCONDITIONAL_JUMP 0 true 1000:7db1 Code1 LAB_1000_7db1 +1000:7c66 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:7c6b Code1 LAB_1000_7c6b +1000:7c68 FUN_1000_7440 UNCONDITIONAL_JUMP 0 true 1000:7db1 Code1 LAB_1000_7db1 +1000:7c6e FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:7c73 Code1 LAB_1000_7c73 +1000:7c70 FUN_1000_7440 UNCONDITIONAL_JUMP 0 true 1000:7db1 Code1 LAB_1000_7db1 +1000:7c73 FUN_1000_7440 READ 0 true 1028:0853 Data6 DAT_1028_0853 +1000:7c78 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:7c89 Code1 LAB_1000_7c89 +1000:7c7a FUN_1000_7440 READ 0 true 1028:0851 Data6 DAT_1028_0851 +1000:7c80 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:7c89 Code1 LAB_1000_7c89 +1000:7c84 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1008:0002 Code2 FUN_1008_0002 FUN_1008_0002 +1000:7c89 FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:7c94 FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:7ca2 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:7ca7 FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:7cb2 FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:7cc0 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:7cc5 FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:7cd3 FUN_1000_7440 READ 1 true 1028:0851 Data6 DAT_1028_0851 +1000:7cd7 FUN_1000_7440 READ 1 true 1028:0853 Data6 DAT_1028_0853 +1000:7ce0 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:7ce6 FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:7ceb FUN_1000_7440 READ 1 true 1028:0851 Data6 DAT_1028_0851 +1000:7cee FUN_1000_7440 READ 1 true 1028:0853 Data6 DAT_1028_0853 +1000:7cfd FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:7d0f FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:7d14 FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:7d22 FUN_1000_7440 READ 1 true 1028:0851 Data6 DAT_1028_0851 +1000:7d26 FUN_1000_7440 READ 1 true 1028:0853 Data6 DAT_1028_0853 +1000:7d2f FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:7d35 FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:7d3a FUN_1000_7440 READ 1 true 1028:0851 Data6 DAT_1028_0851 +1000:7d3d FUN_1000_7440 READ 1 true 1028:0853 Data6 DAT_1028_0853 +1000:7d4c FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:7d5e FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:7d63 FUN_1000_7440 READ 0 true 1028:0853 Data6 DAT_1028_0853 +1000:7d68 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:7db1 Code1 LAB_1000_7db1 +1000:7d6a FUN_1000_7440 READ 0 true 1028:0851 Data6 DAT_1028_0851 +1000:7d70 FUN_1000_7440 CONDITIONAL_JUMP 0 true 1000:7db1 Code1 LAB_1000_7db1 +1000:7d72 FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:7d75 FUN_1000_7440 READ 0 true 1028:085b Data6 DAT_1028_085b +1000:7d79 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:7d7e FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:7d81 FUN_1000_7440 READ 0 true 1028:085d Data6 DAT_1028_085d +1000:7d85 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:7d8a FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:7d95 FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:7da1 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:7da6 FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:7da9 FUN_1000_7440 DATA 0 true Stack[-0xe] - +1000:7dac FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:7db1 FUN_1000_7440 DATA 0 true Stack[-0x4] - +1000:7dbc FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:7dc8 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:7dcd FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:7dd0 FUN_1000_7440 DATA 0 true Stack[-0xc] - +1000:7dd3 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:7dd8 FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:7ddb FUN_1000_7440 DATA 0 true Stack[-0xa] - +1000:7dde FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:7de3 FUN_1000_7440 DATA 0 true Stack[-0xe] - +1000:7de6 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0168 EXTERNAL DELETEOBJECT DELETEOBJECT +1000:7deb FUN_1000_7440 DATA 0 true Stack[-0x6] - +1000:7dee FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1000:7df3 FUN_1000_7440 DATA 0 true Stack[-0x8] - +1000:7df6 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1000:7dfb FUN_1000_7440 DATA 1 true Stack[0x4] - +1000:7e06 FUN_1000_7440 DATA 0 true Stack[-0x4] - +1000:7e09 FUN_1000_7440 UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:7e15 FUN_1000_7e12 DATA 0 true Stack[0x6] - +1000:7e19 FUN_1000_7e12 CONDITIONAL_JUMP 0 true 1000:7e8e Code1 LAB_1000_7e8e +1000:7e1b FUN_1000_7e12 DATA 0 true Stack[0x6] - +1000:7e20 FUN_1000_7e12 CONDITIONAL_JUMP 0 true 1000:7e8e Code1 LAB_1000_7e8e +1000:7e22 FUN_1000_7e12 DATA 1 true Stack[0x6] - +1000:7e30 FUN_1000_7e12 CONDITIONAL_JUMP 0 true 1000:7e59 Code1 LAB_1000_7e59 +1000:7e32 FUN_1000_7e12 DATA 1 true Stack[0x6] - +1000:7e3b FUN_1000_7e12 CONDITIONAL_JUMP 0 true 1000:7e4b Code1 LAB_1000_7e4b +1000:7e3d FUN_1000_7e12 DATA 0 true Stack[0x6] - +1000:7e40 FUN_1000_7e12 DATA 1 true Stack[0x4] - +1000:7e44 FUN_1000_7e12 UNCONDITIONAL_CALL 0 true 1000:b3f3 Code1 FUN_1000_b3f3 FUN_1000_b3f3 +1000:7e49 FUN_1000_7e12 UNCONDITIONAL_JUMP 0 true 1000:7e57 Code1 LAB_1000_7e57 +1000:7e4b FUN_1000_7e12 DATA 0 true Stack[0x6] - +1000:7e4e FUN_1000_7e12 DATA 1 true Stack[0x4] - +1000:7e52 FUN_1000_7e12 UNCONDITIONAL_CALL 0 true 1000:b30b Code1 FUN_1000_b30b FUN_1000_b30b +1000:7e57 FUN_1000_7e12 UNCONDITIONAL_JUMP 0 true 1000:7e8e Code1 LAB_1000_7e8e +1000:7e59 FUN_1000_7e12 DATA 1 true Stack[0x6] - +1000:7e67 FUN_1000_7e12 CONDITIONAL_JUMP 0 true 1000:7e8e Code1 LAB_1000_7e8e +1000:7e69 FUN_1000_7e12 DATA 1 true Stack[0x6] - +1000:7e72 FUN_1000_7e12 CONDITIONAL_JUMP 0 true 1000:7e82 Code1 LAB_1000_7e82 +1000:7e74 FUN_1000_7e12 DATA 0 true Stack[0x6] - +1000:7e77 FUN_1000_7e12 DATA 1 true Stack[0x4] - +1000:7e7b FUN_1000_7e12 UNCONDITIONAL_CALL 0 true 1000:b30b Code1 FUN_1000_b30b FUN_1000_b30b +1000:7e80 FUN_1000_7e12 UNCONDITIONAL_JUMP 0 true 1000:7e8e Code1 LAB_1000_7e8e +1000:7e82 FUN_1000_7e12 DATA 0 true Stack[0x6] - +1000:7e85 FUN_1000_7e12 DATA 1 true Stack[0x4] - +1000:7e89 FUN_1000_7e12 UNCONDITIONAL_CALL 0 true 1000:b3f3 Code1 FUN_1000_b3f3 FUN_1000_b3f3 +1000:7e95 FUN_1000_7e92 DATA 1 true Stack[0x6] - +1000:7e98 FUN_1000_7e92 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:7ea0 FUN_1000_7e92 DATA 1 true Stack[0x4] - +1000:7eb1 FUN_1000_7e92 CONDITIONAL_JUMP 0 true 1000:7ec5 Code1 LAB_1000_7ec5 +1000:7eb3 FUN_1000_7e92 DATA 1 true Stack[0x6] - +1000:7eba FUN_1000_7e92 DATA 1 true Stack[0x4] - +1000:7ebe FUN_1000_7e92 UNCONDITIONAL_CALL 0 true 1000:b30b Code1 FUN_1000_b30b FUN_1000_b30b +1000:7ec3 FUN_1000_7e92 UNCONDITIONAL_JUMP 0 true 1000:7ed5 Code1 LAB_1000_7ed5 +1000:7ec5 FUN_1000_7e92 DATA 1 true Stack[0x6] - +1000:7ecc FUN_1000_7e92 DATA 1 true Stack[0x4] - +1000:7ed0 FUN_1000_7e92 UNCONDITIONAL_CALL 0 true 1000:b3f3 Code1 FUN_1000_b3f3 FUN_1000_b3f3 +1000:7edf FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1008:0002 Code2 FUN_1008_0002 FUN_1008_0002 +1000:7ee4 FUN_1000_7ed9 DATA 1 true Stack[0xa] - +1000:7eea FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:7eef Code1 LAB_1000_7eef +1000:7eec FUN_1000_7ed9 UNCONDITIONAL_JUMP 0 true 1000:7fea Code1 LAB_1000_7fea +1000:7eef FUN_1000_7ed9 DATA 0 true Stack[-0x70] - +1000:7ef4 FUN_1000_7ed9 DATA 1 true Stack[-0x70] - +1000:7ef8 FUN_1000_7ed9 READ 1 true 1028:1e90 Data6 DAT_1028_1e90 +1000:7efc FUN_1000_7ed9 READ 1 true 1028:1e92 Data6 DAT_1028_1e92 +1000:7f00 FUN_1000_7ed9 READ 1 true 1028:1e94 Data6 DAT_1028_1e94 +1000:7f04 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:7f09 FUN_1000_7ed9 DATA 0 true Stack[-0x7a] - +1000:7f0c FUN_1000_7ed9 DATA 0 true Stack[-0x78] - +1000:7f0f FUN_1000_7ed9 DATA 1 true Stack[-0x70] - +1000:7f13 FUN_1000_7ed9 READ 1 true 1028:1e80 Data6 DAT_1028_1e80 +1000:7f17 FUN_1000_7ed9 READ 1 true 1028:1e82 Data6 DAT_1028_1e82 +1000:7f21 FUN_1000_7ed9 DATA 0 true Stack[-0x1a] - +1000:7f24 FUN_1000_7ed9 DATA 0 true Stack[-0x18] - +1000:7f27 FUN_1000_7ed9 DATA 1 true Stack[-0x70] - +1000:7f2e FUN_1000_7ed9 READ 1 true 1028:1ed3 Data6 DAT_1028_1ed3 +1000:7f32 FUN_1000_7ed9 READ 1 true 1028:1ed5 Data6 DAT_1028_1ed5 +1000:7f36 FUN_1000_7ed9 DATA 0 true Stack[-0x22] - +1000:7f39 FUN_1000_7ed9 DATA 0 true Stack[-0x20] - +1000:7f3c FUN_1000_7ed9 DATA 1 true Stack[-0x70] - +1000:7f40 FUN_1000_7ed9 READ 1 true 1028:1e84 Data6 DAT_1028_1e84 +1000:7f44 FUN_1000_7ed9 READ 1 true 1028:1e86 Data6 DAT_1028_1e86 +1000:7f48 FUN_1000_7ed9 DATA 0 true Stack[-0x1e] - +1000:7f4b FUN_1000_7ed9 DATA 0 true Stack[-0x1c] - +1000:7f4e FUN_1000_7ed9 DATA 1 true Stack[-0x70] - +1000:7f55 FUN_1000_7ed9 READ 1 true 1028:1edb Data6 DAT_1028_1edb +1000:7f59 FUN_1000_7ed9 READ 1 true 1028:1edd Data6 DAT_1028_1edd +1000:7f63 FUN_1000_7ed9 DATA 0 true Stack[-0x2a] - +1000:7f66 FUN_1000_7ed9 DATA 0 true Stack[-0x28] - +1000:7f69 FUN_1000_7ed9 DATA 1 true Stack[-0x70] - +1000:7f70 FUN_1000_7ed9 READ 1 true 1028:1edf Data6 DAT_1028_1edf +1000:7f74 FUN_1000_7ed9 READ 1 true 1028:1ee1 Data6 DAT_1028_1ee1 +1000:7f78 FUN_1000_7ed9 DATA 0 true Stack[-0x2e] - +1000:7f7b FUN_1000_7ed9 DATA 0 true Stack[-0x2c] - +1000:7f7e FUN_1000_7ed9 DATA 1 true Stack[-0x70] - +1000:7f87 FUN_1000_7ed9 READ 1 true 1028:1f81 Data6 DAT_1028_1f81 +1000:7f8b FUN_1000_7ed9 READ 1 true 1028:1f83 Data6 DAT_1028_1f83 +1000:7f8f FUN_1000_7ed9 DATA 0 true Stack[-0x26] - +1000:7f92 FUN_1000_7ed9 DATA 0 true Stack[-0x24] - +1000:7f95 FUN_1000_7ed9 DATA 1 true Stack[-0x70] - +1000:7f9e FUN_1000_7ed9 READ 1 true 1028:1f79 Data6 DAT_1028_1f79 +1000:7fa2 FUN_1000_7ed9 READ 1 true 1028:1f7b Data6 DAT_1028_1f7b +1000:7fac FUN_1000_7ed9 DATA 0 true Stack[-0x32] - +1000:7faf FUN_1000_7ed9 DATA 0 true Stack[-0x30] - +1000:7fb2 FUN_1000_7ed9 DATA 1 true Stack[-0x70] - +1000:7fbb FUN_1000_7ed9 READ 1 true 1028:1f7d Data6 DAT_1028_1f7d +1000:7fbf FUN_1000_7ed9 READ 1 true 1028:1f7f Data6 DAT_1028_1f7f +1000:7fc3 FUN_1000_7ed9 DATA 0 true Stack[-0x36] - +1000:7fc6 FUN_1000_7ed9 DATA 0 true Stack[-0x34] - +1000:7fc9 FUN_1000_7ed9 DATA 0 true Stack[0x8] - +1000:7fcd FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:7fe0 Code1 LAB_1000_7fe0 +1000:7fcf FUN_1000_7ed9 DATA 0 true Stack[0x6] - +1000:7fd3 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:7fe0 Code1 LAB_1000_7fe0 +1000:7fd5 FUN_1000_7ed9 DATA 1 true Stack[-0x70] - +1000:7fdb FUN_1000_7ed9 DATA 0 true Stack[-0x68] - +1000:7fde FUN_1000_7ed9 UNCONDITIONAL_JUMP 0 true 1000:7fe7 Code1 LAB_1000_7fe7 +1000:7fe0 FUN_1000_7ed9 DATA 1 true Stack[-0x70] - +1000:7fe4 FUN_1000_7ed9 DATA 0 true Stack[-0x68] - +1000:7fe7 FUN_1000_7ed9 UNCONDITIONAL_JUMP 0 true 1000:80ea Code1 LAB_1000_80ea +1000:7fed FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:7ff2 Code1 LAB_1000_7ff2 +1000:7fef FUN_1000_7ed9 UNCONDITIONAL_JUMP 0 true 1000:80ea Code1 LAB_1000_80ea +1000:7ff2 FUN_1000_7ed9 DATA 0 true Stack[-0x72] - +1000:7ff7 FUN_1000_7ed9 DATA 1 true Stack[-0x72] - +1000:7ffb FUN_1000_7ed9 READ 1 true 1028:236d Data6 DAT_1028_236d +1000:7fff FUN_1000_7ed9 READ 1 true 1028:236f Data6 DAT_1028_236f +1000:8003 FUN_1000_7ed9 READ 1 true 1028:2371 Data6 DAT_1028_2371 +1000:8007 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:800c FUN_1000_7ed9 DATA 0 true Stack[-0x7a] - +1000:800f FUN_1000_7ed9 DATA 0 true Stack[-0x78] - +1000:8012 FUN_1000_7ed9 DATA 1 true Stack[-0x72] - +1000:8016 FUN_1000_7ed9 READ 1 true 1028:235d Data6 DAT_1028_235d +1000:801a FUN_1000_7ed9 READ 1 true 1028:235f Data6 DAT_1028_235f +1000:8024 FUN_1000_7ed9 DATA 0 true Stack[-0x1a] - +1000:8027 FUN_1000_7ed9 DATA 0 true Stack[-0x18] - +1000:802a FUN_1000_7ed9 DATA 1 true Stack[-0x72] - +1000:802e FUN_1000_7ed9 READ 1 true 1028:2361 Data6 DAT_1028_2361 +1000:8032 FUN_1000_7ed9 READ 1 true 1028:2363 Data6 DAT_1028_2363 +1000:8036 FUN_1000_7ed9 DATA 0 true Stack[-0x1e] - +1000:8039 FUN_1000_7ed9 DATA 0 true Stack[-0x1c] - +1000:803c FUN_1000_7ed9 DATA 1 true Stack[-0x72] - +1000:8045 FUN_1000_7ed9 READ 1 true 1028:2456 Data6 DAT_1028_2456 +1000:8049 FUN_1000_7ed9 READ 1 true 1028:2458 Data6 DAT_1028_2458 +1000:804d FUN_1000_7ed9 DATA 0 true Stack[-0x22] - +1000:8050 FUN_1000_7ed9 DATA 0 true Stack[-0x20] - +1000:8053 FUN_1000_7ed9 DATA 1 true Stack[-0x72] - +1000:805c FUN_1000_7ed9 READ 1 true 1028:2456 Data6 DAT_1028_2456 +1000:8060 FUN_1000_7ed9 READ 1 true 1028:2458 Data6 DAT_1028_2458 +1000:806a FUN_1000_7ed9 DATA 0 true Stack[-0x2a] - +1000:806d FUN_1000_7ed9 DATA 0 true Stack[-0x28] - +1000:8070 FUN_1000_7ed9 DATA 1 true Stack[-0x72] - +1000:8079 FUN_1000_7ed9 READ 1 true 1028:245a Data6 DAT_1028_245a +1000:807d FUN_1000_7ed9 READ 1 true 1028:245c Data6 DAT_1028_245c +1000:8081 FUN_1000_7ed9 DATA 0 true Stack[-0x2e] - +1000:8084 FUN_1000_7ed9 DATA 0 true Stack[-0x2c] - +1000:8087 FUN_1000_7ed9 DATA 1 true Stack[-0x72] - +1000:808e FUN_1000_7ed9 READ 1 true 1028:23b0 Data6 DAT_1028_23b0 +1000:8092 FUN_1000_7ed9 READ 1 true 1028:23b2 Data6 DAT_1028_23b2 +1000:8096 FUN_1000_7ed9 DATA 0 true Stack[-0x26] - +1000:8099 FUN_1000_7ed9 DATA 0 true Stack[-0x24] - +1000:809c FUN_1000_7ed9 DATA 1 true Stack[-0x72] - +1000:80a3 FUN_1000_7ed9 READ 1 true 1028:23b8 Data6 DAT_1028_23b8 +1000:80a7 FUN_1000_7ed9 READ 1 true 1028:23ba Data6 DAT_1028_23ba +1000:80b1 FUN_1000_7ed9 DATA 0 true Stack[-0x32] - +1000:80b4 FUN_1000_7ed9 DATA 0 true Stack[-0x30] - +1000:80b7 FUN_1000_7ed9 DATA 1 true Stack[-0x72] - +1000:80be FUN_1000_7ed9 READ 1 true 1028:23bc Data6 DAT_1028_23bc +1000:80c2 FUN_1000_7ed9 READ 1 true 1028:23be Data6 DAT_1028_23be +1000:80c6 FUN_1000_7ed9 DATA 0 true Stack[-0x36] - +1000:80c9 FUN_1000_7ed9 DATA 0 true Stack[-0x34] - +1000:80cc FUN_1000_7ed9 DATA 0 true Stack[0x8] - +1000:80d0 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:80e1 Code1 LAB_1000_80e1 +1000:80d2 FUN_1000_7ed9 DATA 0 true Stack[0x6] - +1000:80d6 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:80e1 Code1 LAB_1000_80e1 +1000:80d8 FUN_1000_7ed9 DATA 1 true Stack[-0x72] - +1000:80dc FUN_1000_7ed9 DATA 0 true Stack[-0x68] - +1000:80df FUN_1000_7ed9 UNCONDITIONAL_JUMP 0 true 1000:80ea Code1 LAB_1000_80ea +1000:80e1 FUN_1000_7ed9 DATA 1 true Stack[-0x72] - +1000:80e7 FUN_1000_7ed9 DATA 0 true Stack[-0x68] - +1000:80ea FUN_1000_7ed9 DATA 1 true Stack[0x6] - +1000:80ed FUN_1000_7ed9 DATA 1 true Stack[0x8] - +1000:80f0 FUN_1000_7ed9 DATA 1 true Stack[-0x7a] - +1000:80f3 FUN_1000_7ed9 DATA 1 true Stack[-0x78] - +1000:80f6 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:80fb FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:8100 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:8105 FUN_1000_7ed9 DATA 1 true Stack[-0x1e] - +1000:8108 FUN_1000_7ed9 DATA 1 true Stack[-0x1c] - +1000:810b FUN_1000_7ed9 DATA 0 true Stack[-0x1e] - +1000:810e FUN_1000_7ed9 DATA 0 true Stack[-0x1c] - +1000:8111 FUN_1000_7ed9 DATA 1 true Stack[0x4] - +1000:8120 FUN_1000_7ed9 DATA 0 true Stack[-0x3d7] - +1000:8124 FUN_1000_7ed9 DATA 0 true Stack[-0x3d5] - +1000:812d FUN_1000_7ed9 DATA 1 true Stack[-0x3d5] - +1000:8131 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:8136 Code1 LAB_1000_8136 +1000:8133 FUN_1000_7ed9 UNCONDITIONAL_JUMP 0 true 1000:8b09 Code1 LAB_1000_8b09 +1000:8136 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:8141 Code1 LAB_1000_8141 +1000:8138 FUN_1000_7ed9 DATA 1 true Stack[-0x3d7] - +1000:813c FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:8141 Code1 LAB_1000_8141 +1000:813e FUN_1000_7ed9 UNCONDITIONAL_JUMP 0 true 1000:8b09 Code1 LAB_1000_8b09 +1000:8141 FUN_1000_7ed9 DATA 0 true Stack[-0x76] - +1000:8144 FUN_1000_7ed9 DATA 0 true Stack[-0x74] - +1000:8147 FUN_1000_7ed9 UNCONDITIONAL_JUMP 0 true 1000:8151 Code1 LAB_1000_8151 +1000:8149 FUN_1000_7ed9 DATA 0 true Stack[-0x76] - +1000:814d FUN_1000_7ed9 DATA 0 true Stack[-0x74] - +1000:8151 FUN_1000_7ed9 DATA 1 true Stack[0x4] - +1000:815d FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:8176 Code1 LAB_1000_8176 +1000:815f FUN_1000_7ed9 DATA 1 true Stack[-0x76] - +1000:8162 FUN_1000_7ed9 DATA 1 true Stack[-0x74] - +1000:816d FUN_1000_7ed9 DATA 1 true Stack[0x4] - +1000:8171 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1000:c36b Code1 FUN_1000_c36b FUN_1000_c36b +1000:8176 FUN_1000_7ed9 DATA 0 true Stack[0x8] - +1000:817a FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:817f Code1 LAB_1000_817f +1000:817c FUN_1000_7ed9 UNCONDITIONAL_JUMP 0 true 1000:82b1 Code1 LAB_1000_82b1 +1000:817f FUN_1000_7ed9 DATA 0 true Stack[0x6] - +1000:8183 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:8188 Code1 LAB_1000_8188 +1000:8185 FUN_1000_7ed9 UNCONDITIONAL_JUMP 0 true 1000:82b1 Code1 LAB_1000_82b1 +1000:8188 FUN_1000_7ed9 DATA 1 true Stack[-0x2a] - +1000:818b FUN_1000_7ed9 DATA 1 true Stack[-0x28] - +1000:818e FUN_1000_7ed9 READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:8192 FUN_1000_7ed9 READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:819b FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:81a0 FUN_1000_7ed9 DATA 0 true Stack[-0x5a] - +1000:81a3 FUN_1000_7ed9 DATA 0 true Stack[-0x58] - +1000:81a6 FUN_1000_7ed9 DATA 1 true Stack[-0x2e] - +1000:81a9 FUN_1000_7ed9 DATA 1 true Stack[-0x2c] - +1000:81b2 FUN_1000_7ed9 DATA 1 true Stack[-0x1e] - +1000:81b5 FUN_1000_7ed9 DATA 1 true Stack[-0x1c] - +1000:81bd FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:81c2 FUN_1000_7ed9 DATA 0 true Stack[-0x5e] - +1000:81c5 FUN_1000_7ed9 DATA 0 true Stack[-0x5c] - +1000:81c8 FUN_1000_7ed9 DATA 1 true Stack[-0x2e] - +1000:81cb FUN_1000_7ed9 DATA 1 true Stack[-0x2c] - +1000:81d4 FUN_1000_7ed9 READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:81d8 FUN_1000_7ed9 READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:81e1 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:81e6 FUN_1000_7ed9 DATA 0 true Stack[-0x62] - +1000:81e9 FUN_1000_7ed9 DATA 0 true Stack[-0x60] - +1000:81ec FUN_1000_7ed9 DATA 1 true Stack[-0x2a] - +1000:81ef FUN_1000_7ed9 DATA 1 true Stack[-0x28] - +1000:81f2 FUN_1000_7ed9 DATA 1 true Stack[-0x1a] - +1000:81f5 FUN_1000_7ed9 DATA 1 true Stack[-0x18] - +1000:81fd FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:8202 FUN_1000_7ed9 DATA 0 true Stack[-0x66] - +1000:8205 FUN_1000_7ed9 DATA 0 true Stack[-0x64] - +1000:8208 FUN_1000_7ed9 DATA 1 true Stack[-0x62] - +1000:820b FUN_1000_7ed9 DATA 1 true Stack[-0x60] - +1000:820e FUN_1000_7ed9 DATA 1 true Stack[-0x66] - +1000:8211 FUN_1000_7ed9 DATA 1 true Stack[-0x64] - +1000:8214 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:821b FUN_1000_7ed9 DATA 1 true Stack[-0x5a] - +1000:821e FUN_1000_7ed9 DATA 1 true Stack[-0x58] - +1000:8221 FUN_1000_7ed9 DATA 1 true Stack[-0x5e] - +1000:8224 FUN_1000_7ed9 DATA 1 true Stack[-0x5c] - +1000:8227 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:8232 FUN_1000_7ed9 DATA 0 true Stack[-0x6] - +1000:8235 FUN_1000_7ed9 DATA 0 true Stack[-0x4] - +1000:8238 FUN_1000_7ed9 DATA 1 true Stack[-0x2e] - +1000:823b FUN_1000_7ed9 DATA 1 true Stack[-0x2c] - +1000:8244 FUN_1000_7ed9 DATA 1 true Stack[-0x1e] - +1000:8247 FUN_1000_7ed9 DATA 1 true Stack[-0x1c] - +1000:824f FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:8254 FUN_1000_7ed9 DATA 0 true Stack[-0x5e] - +1000:8257 FUN_1000_7ed9 DATA 0 true Stack[-0x5c] - +1000:825a FUN_1000_7ed9 DATA 1 true Stack[-0x2e] - +1000:825d FUN_1000_7ed9 DATA 1 true Stack[-0x2c] - +1000:8266 FUN_1000_7ed9 READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:826a FUN_1000_7ed9 READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:8273 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:8278 FUN_1000_7ed9 DATA 0 true Stack[-0x62] - +1000:827b FUN_1000_7ed9 DATA 0 true Stack[-0x60] - +1000:827e FUN_1000_7ed9 DATA 1 true Stack[-0x62] - +1000:8281 FUN_1000_7ed9 DATA 1 true Stack[-0x60] - +1000:8284 FUN_1000_7ed9 DATA 1 true Stack[-0x66] - +1000:8287 FUN_1000_7ed9 DATA 1 true Stack[-0x64] - +1000:828a FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:8291 FUN_1000_7ed9 DATA 1 true Stack[-0x5a] - +1000:8294 FUN_1000_7ed9 DATA 1 true Stack[-0x58] - +1000:8297 FUN_1000_7ed9 DATA 1 true Stack[-0x5e] - +1000:829a FUN_1000_7ed9 DATA 1 true Stack[-0x5c] - +1000:829d FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:82a8 FUN_1000_7ed9 DATA 0 true Stack[-0xa] - +1000:82ab FUN_1000_7ed9 DATA 0 true Stack[-0x8] - +1000:82ae FUN_1000_7ed9 UNCONDITIONAL_JUMP 0 true 1000:83d7 Code1 LAB_1000_83d7 +1000:82b1 FUN_1000_7ed9 DATA 1 true Stack[-0x32] - +1000:82b4 FUN_1000_7ed9 DATA 1 true Stack[-0x30] - +1000:82b7 FUN_1000_7ed9 READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:82bb FUN_1000_7ed9 READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:82c4 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:82c9 FUN_1000_7ed9 DATA 0 true Stack[-0x5a] - +1000:82cc FUN_1000_7ed9 DATA 0 true Stack[-0x58] - +1000:82cf FUN_1000_7ed9 DATA 1 true Stack[-0x36] - +1000:82d2 FUN_1000_7ed9 DATA 1 true Stack[-0x34] - +1000:82db FUN_1000_7ed9 DATA 1 true Stack[-0x1e] - +1000:82de FUN_1000_7ed9 DATA 1 true Stack[-0x1c] - +1000:82e6 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:82eb FUN_1000_7ed9 DATA 0 true Stack[-0x5e] - +1000:82ee FUN_1000_7ed9 DATA 0 true Stack[-0x5c] - +1000:82f1 FUN_1000_7ed9 DATA 1 true Stack[-0x36] - +1000:82f4 FUN_1000_7ed9 DATA 1 true Stack[-0x34] - +1000:82fd FUN_1000_7ed9 READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:8301 FUN_1000_7ed9 READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:830a FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:830f FUN_1000_7ed9 DATA 0 true Stack[-0x62] - +1000:8312 FUN_1000_7ed9 DATA 0 true Stack[-0x60] - +1000:8315 FUN_1000_7ed9 DATA 1 true Stack[-0x32] - +1000:8318 FUN_1000_7ed9 DATA 1 true Stack[-0x30] - +1000:831b FUN_1000_7ed9 DATA 1 true Stack[-0x1a] - +1000:831e FUN_1000_7ed9 DATA 1 true Stack[-0x18] - +1000:8326 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:832b FUN_1000_7ed9 DATA 0 true Stack[-0x66] - +1000:832e FUN_1000_7ed9 DATA 0 true Stack[-0x64] - +1000:8331 FUN_1000_7ed9 DATA 1 true Stack[-0x62] - +1000:8334 FUN_1000_7ed9 DATA 1 true Stack[-0x60] - +1000:8337 FUN_1000_7ed9 DATA 1 true Stack[-0x66] - +1000:833a FUN_1000_7ed9 DATA 1 true Stack[-0x64] - +1000:833d FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:8344 FUN_1000_7ed9 DATA 1 true Stack[-0x5a] - +1000:8347 FUN_1000_7ed9 DATA 1 true Stack[-0x58] - +1000:834a FUN_1000_7ed9 DATA 1 true Stack[-0x5e] - +1000:834d FUN_1000_7ed9 DATA 1 true Stack[-0x5c] - +1000:8350 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:835b FUN_1000_7ed9 DATA 0 true Stack[-0x6] - +1000:835e FUN_1000_7ed9 DATA 0 true Stack[-0x4] - +1000:8361 FUN_1000_7ed9 DATA 1 true Stack[-0x36] - +1000:8364 FUN_1000_7ed9 DATA 1 true Stack[-0x34] - +1000:836d FUN_1000_7ed9 DATA 1 true Stack[-0x1e] - +1000:8370 FUN_1000_7ed9 DATA 1 true Stack[-0x1c] - +1000:8378 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:837d FUN_1000_7ed9 DATA 0 true Stack[-0x5e] - +1000:8380 FUN_1000_7ed9 DATA 0 true Stack[-0x5c] - +1000:8383 FUN_1000_7ed9 DATA 1 true Stack[-0x36] - +1000:8386 FUN_1000_7ed9 DATA 1 true Stack[-0x34] - +1000:838f FUN_1000_7ed9 READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:8393 FUN_1000_7ed9 READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:839c FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:83a1 FUN_1000_7ed9 DATA 0 true Stack[-0x62] - +1000:83a4 FUN_1000_7ed9 DATA 0 true Stack[-0x60] - +1000:83a7 FUN_1000_7ed9 DATA 1 true Stack[-0x62] - +1000:83aa FUN_1000_7ed9 DATA 1 true Stack[-0x60] - +1000:83ad FUN_1000_7ed9 DATA 1 true Stack[-0x66] - +1000:83b0 FUN_1000_7ed9 DATA 1 true Stack[-0x64] - +1000:83b3 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:83ba FUN_1000_7ed9 DATA 1 true Stack[-0x5a] - +1000:83bd FUN_1000_7ed9 DATA 1 true Stack[-0x58] - +1000:83c0 FUN_1000_7ed9 DATA 1 true Stack[-0x5e] - +1000:83c3 FUN_1000_7ed9 DATA 1 true Stack[-0x5c] - +1000:83c6 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:83d1 FUN_1000_7ed9 DATA 0 true Stack[-0xa] - +1000:83d4 FUN_1000_7ed9 DATA 0 true Stack[-0x8] - +1000:83d7 FUN_1000_7ed9 DATA 0 true Stack[-0x3a] - +1000:83dc FUN_1000_7ed9 DATA 0 true Stack[-0x38] - +1000:83e1 FUN_1000_7ed9 READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:83e4 FUN_1000_7ed9 READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:83e8 FUN_1000_7ed9 DATA 1 true Stack[-0x1a] - +1000:83eb FUN_1000_7ed9 DATA 1 true Stack[-0x18] - +1000:83f0 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:83f9 Code1 LAB_1000_83f9 +1000:83f9 FUN_1000_7ed9 DATA 0 true Stack[-0x8e] - +1000:83fd FUN_1000_7ed9 DATA 0 true Stack[-0x8c] - +1000:8401 FUN_1000_7ed9 READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:8404 FUN_1000_7ed9 READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:8408 FUN_1000_7ed9 DATA 1 true Stack[-0x1e] - +1000:840b FUN_1000_7ed9 DATA 1 true Stack[-0x1c] - +1000:8410 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:8419 Code1 LAB_1000_8419 +1000:8419 FUN_1000_7ed9 DATA 0 true Stack[-0x92] - +1000:841d FUN_1000_7ed9 DATA 0 true Stack[-0x90] - +1000:8421 FUN_1000_7ed9 DATA 1 true Stack[-0x8e] - +1000:8425 FUN_1000_7ed9 DATA 1 true Stack[-0x8c] - +1000:8429 FUN_1000_7ed9 DATA 1 true Stack[-0x38] - +1000:842c FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:843b Code1 LAB_1000_843b +1000:842e FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:8433 Code1 LAB_1000_8433 +1000:8430 FUN_1000_7ed9 UNCONDITIONAL_JUMP 0 true 1000:8acc Code1 LAB_1000_8acc +1000:8433 FUN_1000_7ed9 DATA 1 true Stack[-0x3a] - +1000:8436 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:843b Code1 LAB_1000_843b +1000:8438 FUN_1000_7ed9 UNCONDITIONAL_JUMP 0 true 1000:8acc Code1 LAB_1000_8acc +1000:843b FUN_1000_7ed9 DATA 1 true Stack[-0x92] - +1000:843f FUN_1000_7ed9 DATA 1 true Stack[-0x90] - +1000:8443 FUN_1000_7ed9 DATA 1 true Stack[-0x38] - +1000:8446 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:8455 Code1 LAB_1000_8455 +1000:8448 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:844d Code1 LAB_1000_844d +1000:844a FUN_1000_7ed9 UNCONDITIONAL_JUMP 0 true 1000:8acc Code1 LAB_1000_8acc +1000:844d FUN_1000_7ed9 DATA 1 true Stack[-0x3a] - +1000:8450 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:8455 Code1 LAB_1000_8455 +1000:8452 FUN_1000_7ed9 UNCONDITIONAL_JUMP 0 true 1000:8acc Code1 LAB_1000_8acc +1000:8455 FUN_1000_7ed9 READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:8458 FUN_1000_7ed9 READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:845c FUN_1000_7ed9 DATA 1 true Stack[-0x1e] - +1000:845f FUN_1000_7ed9 DATA 1 true Stack[-0x1c] - +1000:8462 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:846f FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:8474 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:0ff1 Code5 FUN_1020_0ff1 FUN_1020_0ff1 +1000:847c FUN_1000_7ed9 READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:847f FUN_1000_7ed9 READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:8483 FUN_1000_7ed9 DATA 1 true Stack[-0x1a] - +1000:8486 FUN_1000_7ed9 DATA 1 true Stack[-0x18] - +1000:8489 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:8496 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:849b FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:0ff1 Code5 FUN_1020_0ff1 FUN_1020_0ff1 +1000:84a3 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:0fe5 Code5 FUN_1020_0fe5 FUN_1020_0fe5 +1000:84a8 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:10be Code5 FUN_1020_10be FUN_1020_10be +1000:84b5 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:84ba FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:84bf FUN_1000_7ed9 DATA 0 true Stack[-0x16] - +1000:84c2 FUN_1000_7ed9 DATA 0 true Stack[-0x14] - +1000:84c5 FUN_1000_7ed9 DATA 1 true Stack[-0x16] - +1000:84c8 FUN_1000_7ed9 DATA 1 true Stack[-0x14] - +1000:84cb FUN_1000_7ed9 DATA 1 true Stack[-0x38] - +1000:84ce FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:84dd Code1 LAB_1000_84dd +1000:84d0 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:84d5 Code1 LAB_1000_84d5 +1000:84d2 FUN_1000_7ed9 UNCONDITIONAL_JUMP 0 true 1000:8acc Code1 LAB_1000_8acc +1000:84d5 FUN_1000_7ed9 DATA 1 true Stack[-0x3a] - +1000:84d8 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:84dd Code1 LAB_1000_84dd +1000:84da FUN_1000_7ed9 UNCONDITIONAL_JUMP 0 true 1000:8acc Code1 LAB_1000_8acc +1000:84dd FUN_1000_7ed9 DATA 0 true Stack[0xc] - +1000:84e1 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:851a Code1 LAB_1000_851a +1000:84e3 FUN_1000_7ed9 DATA 0 true Stack[0xa] - +1000:84e7 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:851a Code1 LAB_1000_851a +1000:84e9 FUN_1000_7ed9 DATA 0 true Stack[-0x4] - +1000:84ed FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:84f8 Code1 LAB_1000_84f8 +1000:84ef FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:851a Code1 LAB_1000_851a +1000:84f1 FUN_1000_7ed9 DATA 0 true Stack[-0x6] - +1000:84f6 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:851a Code1 LAB_1000_851a +1000:84f8 FUN_1000_7ed9 DATA 0 true Stack[-0x8] - +1000:84fc FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:8507 Code1 LAB_1000_8507 +1000:84fe FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:851a Code1 LAB_1000_851a +1000:8500 FUN_1000_7ed9 DATA 0 true Stack[-0xa] - +1000:8505 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:851a Code1 LAB_1000_851a +1000:8507 FUN_1000_7ed9 READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:850a FUN_1000_7ed9 READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:850e FUN_1000_7ed9 DATA 1 true Stack[-0x18] - +1000:8511 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:856f Code1 LAB_1000_856f +1000:8513 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:851a Code1 LAB_1000_851a +1000:8515 FUN_1000_7ed9 DATA 1 true Stack[-0x1a] - +1000:8518 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:856f Code1 LAB_1000_856f +1000:851a FUN_1000_7ed9 DATA 0 true Stack[0xc] - +1000:851e FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:8523 Code1 LAB_1000_8523 +1000:8520 FUN_1000_7ed9 UNCONDITIONAL_JUMP 0 true 1000:8acc Code1 LAB_1000_8acc +1000:8523 FUN_1000_7ed9 DATA 0 true Stack[0xa] - +1000:8527 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:852c Code1 LAB_1000_852c +1000:8529 FUN_1000_7ed9 UNCONDITIONAL_JUMP 0 true 1000:8acc Code1 LAB_1000_8acc +1000:852c FUN_1000_7ed9 DATA 0 true Stack[-0x4] - +1000:8530 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:8541 Code1 LAB_1000_8541 +1000:8532 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:8537 Code1 LAB_1000_8537 +1000:8534 FUN_1000_7ed9 UNCONDITIONAL_JUMP 0 true 1000:8acc Code1 LAB_1000_8acc +1000:8537 FUN_1000_7ed9 DATA 0 true Stack[-0x6] - +1000:853c FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:8541 Code1 LAB_1000_8541 +1000:853e FUN_1000_7ed9 UNCONDITIONAL_JUMP 0 true 1000:8acc Code1 LAB_1000_8acc +1000:8541 FUN_1000_7ed9 DATA 0 true Stack[-0x8] - +1000:8545 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:8556 Code1 LAB_1000_8556 +1000:8547 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:854c Code1 LAB_1000_854c +1000:8549 FUN_1000_7ed9 UNCONDITIONAL_JUMP 0 true 1000:8acc Code1 LAB_1000_8acc +1000:854c FUN_1000_7ed9 DATA 0 true Stack[-0xa] - +1000:8551 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:8556 Code1 LAB_1000_8556 +1000:8553 FUN_1000_7ed9 UNCONDITIONAL_JUMP 0 true 1000:8acc Code1 LAB_1000_8acc +1000:8556 FUN_1000_7ed9 READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:8559 FUN_1000_7ed9 READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:855d FUN_1000_7ed9 DATA 1 true Stack[-0x18] - +1000:8560 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:856f Code1 LAB_1000_856f +1000:8562 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:8567 Code1 LAB_1000_8567 +1000:8564 FUN_1000_7ed9 UNCONDITIONAL_JUMP 0 true 1000:8acc Code1 LAB_1000_8acc +1000:8567 FUN_1000_7ed9 DATA 1 true Stack[-0x1a] - +1000:856a FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:856f Code1 LAB_1000_856f +1000:856c FUN_1000_7ed9 UNCONDITIONAL_JUMP 0 true 1000:8acc Code1 LAB_1000_8acc +1000:856f FUN_1000_7ed9 READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:8572 FUN_1000_7ed9 READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:8576 FUN_1000_7ed9 DATA 1 true Stack[-0x1a] - +1000:8579 FUN_1000_7ed9 DATA 1 true Stack[-0x18] - +1000:857c FUN_1000_7ed9 DATA 1 true Stack[0x6] - +1000:857f FUN_1000_7ed9 DATA 1 true Stack[0x8] - +1000:8582 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:8587 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:858c FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:8591 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:8596 FUN_1000_7ed9 DATA 0 true Stack[-0x44] - +1000:8599 FUN_1000_7ed9 DATA 0 true Stack[-0x42] - +1000:859c FUN_1000_7ed9 DATA 0 true Stack[-0x40] - +1000:859f FUN_1000_7ed9 READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:85a2 FUN_1000_7ed9 READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:85a6 FUN_1000_7ed9 DATA 1 true Stack[-0x1e] - +1000:85a9 FUN_1000_7ed9 DATA 1 true Stack[-0x1c] - +1000:85b2 FUN_1000_7ed9 DATA 1 true Stack[0x6] - +1000:85b5 FUN_1000_7ed9 DATA 1 true Stack[0x8] - +1000:85b8 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:85bd FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:85c2 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:85c7 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:85cc FUN_1000_7ed9 DATA 0 true Stack[-0x4a] - +1000:85cf FUN_1000_7ed9 DATA 0 true Stack[-0x48] - +1000:85d2 FUN_1000_7ed9 DATA 0 true Stack[-0x46] - +1000:85d5 FUN_1000_7ed9 DATA 0 true Stack[0xc] - +1000:85d9 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:8613 Code1 LAB_1000_8613 +1000:85db FUN_1000_7ed9 DATA 0 true Stack[0xa] - +1000:85df FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:8613 Code1 LAB_1000_8613 +1000:85e1 FUN_1000_7ed9 DATA 1 true Stack[-0x44] - +1000:85e4 FUN_1000_7ed9 DATA 1 true Stack[-0x42] - +1000:85e7 FUN_1000_7ed9 DATA 1 true Stack[-0x40] - +1000:85ec FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:85f1 Code1 LAB_1000_85f1 +1000:85f1 FUN_1000_7ed9 DATA 0 true Stack[-0x44] - +1000:85f4 FUN_1000_7ed9 DATA 0 true Stack[-0x42] - +1000:85f7 FUN_1000_7ed9 DATA 0 true Stack[-0x40] - +1000:85fa FUN_1000_7ed9 DATA 1 true Stack[-0x4a] - +1000:85fd FUN_1000_7ed9 DATA 1 true Stack[-0x48] - +1000:8600 FUN_1000_7ed9 DATA 1 true Stack[-0x46] - +1000:8605 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:860a Code1 LAB_1000_860a +1000:860a FUN_1000_7ed9 DATA 0 true Stack[-0x4a] - +1000:860d FUN_1000_7ed9 DATA 0 true Stack[-0x48] - +1000:8610 FUN_1000_7ed9 DATA 0 true Stack[-0x46] - +1000:8613 FUN_1000_7ed9 DATA 0 true Stack[0x8] - +1000:8617 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:861c Code1 LAB_1000_861c +1000:8619 FUN_1000_7ed9 UNCONDITIONAL_JUMP 0 true 1000:86b6 Code1 LAB_1000_86b6 +1000:861c FUN_1000_7ed9 DATA 0 true Stack[0x6] - +1000:8620 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:8625 Code1 LAB_1000_8625 +1000:8622 FUN_1000_7ed9 UNCONDITIONAL_JUMP 0 true 1000:86b6 Code1 LAB_1000_86b6 +1000:8625 FUN_1000_7ed9 DATA 1 true Stack[-0x2a] - +1000:8628 FUN_1000_7ed9 DATA 1 true Stack[-0x28] - +1000:862b FUN_1000_7ed9 DATA 1 true Stack[-0x1a] - +1000:862e FUN_1000_7ed9 DATA 1 true Stack[-0x18] - +1000:8633 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:863c Code1 LAB_1000_863c +1000:863c FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:864a FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:1007 Code5 FUN_1020_1007 FUN_1020_1007 +1000:864f FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:8687 Code1 LAB_1000_8687 +1000:8651 FUN_1000_7ed9 READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:8654 FUN_1000_7ed9 READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:8658 FUN_1000_7ed9 DATA 1 true Stack[-0x1a] - +1000:865b FUN_1000_7ed9 DATA 1 true Stack[-0x18] - +1000:8660 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:8669 Code1 LAB_1000_8669 +1000:866d FUN_1000_7ed9 DATA 1 true Stack[-0x1e] - +1000:8670 FUN_1000_7ed9 DATA 1 true Stack[-0x1c] - +1000:867d FUN_1000_7ed9 DATA 0 true Stack[-0x86] - +1000:8681 FUN_1000_7ed9 DATA 0 true Stack[-0x84] - +1000:8685 FUN_1000_7ed9 UNCONDITIONAL_JUMP 0 true 1000:869b Code1 LAB_1000_869b +1000:8687 FUN_1000_7ed9 DATA 1 true Stack[-0x2e] - +1000:868a FUN_1000_7ed9 DATA 1 true Stack[-0x2c] - +1000:8693 FUN_1000_7ed9 DATA 0 true Stack[-0x86] - +1000:8697 FUN_1000_7ed9 DATA 0 true Stack[-0x84] - +1000:869b FUN_1000_7ed9 DATA 1 true Stack[-0x86] - +1000:869f FUN_1000_7ed9 DATA 1 true Stack[-0x84] - +1000:86a3 FUN_1000_7ed9 READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:86a7 FUN_1000_7ed9 READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:86ab FUN_1000_7ed9 DATA 0 true Stack[-0x86] - +1000:86af FUN_1000_7ed9 DATA 0 true Stack[-0x84] - +1000:86b3 FUN_1000_7ed9 UNCONDITIONAL_JUMP 0 true 1000:8774 Code1 LAB_1000_8774 +1000:86b6 FUN_1000_7ed9 DATA 1 true Stack[-0x32] - +1000:86b9 FUN_1000_7ed9 DATA 1 true Stack[-0x30] - +1000:86bc FUN_1000_7ed9 DATA 1 true Stack[-0x1a] - +1000:86bf FUN_1000_7ed9 DATA 1 true Stack[-0x18] - +1000:86c4 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:86cd Code1 LAB_1000_86cd +1000:86cd FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:86db FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:1007 Code5 FUN_1020_1007 FUN_1020_1007 +1000:86e0 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:8748 Code1 LAB_1000_8748 +1000:86e2 FUN_1000_7ed9 DATA 1 true Stack[-0x32] - +1000:86e5 FUN_1000_7ed9 DATA 1 true Stack[-0x30] - +1000:86e8 FUN_1000_7ed9 DATA 1 true Stack[-0x1a] - +1000:86eb FUN_1000_7ed9 DATA 1 true Stack[-0x18] - +1000:86ee FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:86f6 FUN_1000_7ed9 DATA 1 true Stack[-0x36] - +1000:86f9 FUN_1000_7ed9 DATA 1 true Stack[-0x34] - +1000:8702 FUN_1000_7ed9 DATA 1 true Stack[-0x1e] - +1000:8705 FUN_1000_7ed9 DATA 1 true Stack[-0x1c] - +1000:870c FUN_1000_7ed9 READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:870f FUN_1000_7ed9 READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:8713 FUN_1000_7ed9 DATA 1 true Stack[-0x1a] - +1000:8716 FUN_1000_7ed9 DATA 1 true Stack[-0x18] - +1000:8719 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:871e FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:8726 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:872b FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:8734 FUN_1000_7ed9 DATA 1 true Stack[-0x1e] - +1000:8737 FUN_1000_7ed9 DATA 1 true Stack[-0x1c] - +1000:873e FUN_1000_7ed9 DATA 0 true Stack[-0x86] - +1000:8742 FUN_1000_7ed9 DATA 0 true Stack[-0x84] - +1000:8746 FUN_1000_7ed9 UNCONDITIONAL_JUMP 0 true 1000:875c Code1 LAB_1000_875c +1000:8748 FUN_1000_7ed9 DATA 1 true Stack[-0x36] - +1000:874b FUN_1000_7ed9 DATA 1 true Stack[-0x34] - +1000:8754 FUN_1000_7ed9 DATA 0 true Stack[-0x86] - +1000:8758 FUN_1000_7ed9 DATA 0 true Stack[-0x84] - +1000:875c FUN_1000_7ed9 DATA 1 true Stack[-0x86] - +1000:8760 FUN_1000_7ed9 DATA 1 true Stack[-0x84] - +1000:8764 FUN_1000_7ed9 READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:8768 FUN_1000_7ed9 READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:876c FUN_1000_7ed9 DATA 0 true Stack[-0x86] - +1000:8770 FUN_1000_7ed9 DATA 0 true Stack[-0x84] - +1000:8774 FUN_1000_7ed9 DATA 0 true Stack[-0x84] - +1000:8779 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:8784 Code1 LAB_1000_8784 +1000:877b FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:87b2 Code1 LAB_1000_87b2 +1000:877d FUN_1000_7ed9 DATA 0 true Stack[-0x86] - +1000:8782 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:87b2 Code1 LAB_1000_87b2 +1000:8784 FUN_1000_7ed9 DATA 1 true Stack[-0x86] - +1000:8788 FUN_1000_7ed9 DATA 1 true Stack[-0x84] - +1000:878c FUN_1000_7ed9 DATA 1 true Stack[0x6] - +1000:878f FUN_1000_7ed9 DATA 1 true Stack[0x8] - +1000:8792 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:8797 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:879c FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:87a8 FUN_1000_7ed9 DATA 0 true Stack[-0x86] - +1000:87ac FUN_1000_7ed9 DATA 0 true Stack[-0x84] - +1000:87b0 FUN_1000_7ed9 UNCONDITIONAL_JUMP 0 true 1000:87bc Code1 LAB_1000_87bc +1000:87b4 FUN_1000_7ed9 DATA 0 true Stack[-0x86] - +1000:87b8 FUN_1000_7ed9 DATA 0 true Stack[-0x84] - +1000:87bc FUN_1000_7ed9 DATA 1 true Stack[-0x3a] - +1000:87bf FUN_1000_7ed9 DATA 1 true Stack[-0x38] - +1000:87c8 FUN_1000_7ed9 DATA 0 true Stack[-0x3a] - +1000:87cb FUN_1000_7ed9 DATA 0 true Stack[-0x38] - +1000:87ce FUN_1000_7ed9 DATA 1 true Stack[-0x3a] - +1000:87d1 FUN_1000_7ed9 DATA 1 true Stack[-0x38] - +1000:87d4 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:87dc FUN_1000_7ed9 DATA 1 true Stack[0x4] - +1000:87ed FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:87f2 FUN_1000_7ed9 DATA 1 true Stack[-0x4a] - +1000:87f5 FUN_1000_7ed9 DATA 1 true Stack[-0x48] - +1000:87f8 FUN_1000_7ed9 DATA 1 true Stack[-0x46] - +1000:87fb FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:8803 FUN_1000_7ed9 DATA 1 true Stack[0x4] - +1000:8814 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:8819 FUN_1000_7ed9 DATA 1 true Stack[-0x44] - +1000:881c FUN_1000_7ed9 DATA 1 true Stack[-0x42] - +1000:881f FUN_1000_7ed9 DATA 1 true Stack[-0x40] - +1000:8822 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:882a FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:0fe5 Code5 FUN_1020_0fe5 FUN_1020_0fe5 +1000:8836 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:883e FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:8843 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:8848 FUN_1000_7ed9 DATA 0 true Stack[-0xe] - +1000:884b FUN_1000_7ed9 DATA 0 true Stack[-0xc] - +1000:8850 FUN_1000_7ed9 DATA 0 true Stack[-0xe] - +1000:8853 FUN_1000_7ed9 DATA 0 true Stack[-0xc] - +1000:8856 FUN_1000_7ed9 DATA 1 true Stack[-0x3a] - +1000:8859 FUN_1000_7ed9 DATA 1 true Stack[-0x38] - +1000:885c FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:8864 FUN_1000_7ed9 DATA 1 true Stack[0x4] - +1000:8875 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:887a FUN_1000_7ed9 DATA 1 true Stack[-0x44] - +1000:887d FUN_1000_7ed9 DATA 1 true Stack[-0x42] - +1000:8880 FUN_1000_7ed9 DATA 1 true Stack[-0x40] - +1000:8883 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:888b FUN_1000_7ed9 DATA 1 true Stack[0x4] - +1000:889c FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:88a1 FUN_1000_7ed9 DATA 1 true Stack[-0x4a] - +1000:88a4 FUN_1000_7ed9 DATA 1 true Stack[-0x48] - +1000:88a7 FUN_1000_7ed9 DATA 1 true Stack[-0x46] - +1000:88aa FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:88b2 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:0feb Code5 FUN_1020_0feb FUN_1020_0feb +1000:88ba FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:88bf FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:88c4 FUN_1000_7ed9 DATA 0 true Stack[-0x12] - +1000:88c7 FUN_1000_7ed9 DATA 0 true Stack[-0x10] - +1000:88ca FUN_1000_7ed9 DATA 1 true Stack[-0x3a] - +1000:88cd FUN_1000_7ed9 DATA 1 true Stack[-0x38] - +1000:88d0 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:88d8 FUN_1000_7ed9 DATA 1 true Stack[-0x16] - +1000:88db FUN_1000_7ed9 DATA 1 true Stack[-0x14] - +1000:88de FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:88e6 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:88eb FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:10be Code5 FUN_1020_10be FUN_1020_10be +1000:88f7 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:8905 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:0fe5 Code5 FUN_1020_0fe5 FUN_1020_0fe5 +1000:890a FUN_1000_7ed9 DATA 0 true Stack[-0x6e] - +1000:890d FUN_1000_7ed9 DATA 0 true Stack[-0x6c] - +1000:8910 FUN_1000_7ed9 DATA 0 true Stack[-0x6a] - +1000:8913 FUN_1000_7ed9 DATA 1 true Stack[-0x12] - +1000:8916 FUN_1000_7ed9 DATA 1 true Stack[-0x10] - +1000:8919 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:8928 FUN_1000_7ed9 DATA 1 true Stack[-0x68] - +1000:8938 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:0fe5 Code5 FUN_1020_0fe5 FUN_1020_0fe5 +1000:8940 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:8945 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:894a FUN_1000_7ed9 DATA 0 true Stack[-0x12] - +1000:894d FUN_1000_7ed9 DATA 0 true Stack[-0x10] - +1000:8950 FUN_1000_7ed9 DATA 1 true Stack[0x4] - +1000:895f FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:8964 FUN_1000_7ed9 DATA 1 true Stack[-0x6e] - +1000:8967 FUN_1000_7ed9 DATA 1 true Stack[-0x6c] - +1000:896a FUN_1000_7ed9 DATA 1 true Stack[-0x6a] - +1000:896d FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:8972 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:8977 FUN_1000_7ed9 DATA 1 true Stack[-0x12] - +1000:897a FUN_1000_7ed9 DATA 1 true Stack[-0x10] - +1000:897d FUN_1000_7ed9 DATA 0 true Stack[-0x12] - +1000:8980 FUN_1000_7ed9 DATA 0 true Stack[-0x10] - +1000:8983 FUN_1000_7ed9 DATA 1 true Stack[-0x3a] - +1000:8986 FUN_1000_7ed9 DATA 1 true Stack[-0x38] - +1000:8989 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:8991 FUN_1000_7ed9 DATA 1 true Stack[-0x12] - +1000:8994 FUN_1000_7ed9 DATA 1 true Stack[-0x10] - +1000:8997 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:899c FUN_1000_7ed9 DATA 1 true Stack[-0x4a] - +1000:899f FUN_1000_7ed9 DATA 1 true Stack[-0x48] - +1000:89a2 FUN_1000_7ed9 DATA 1 true Stack[-0x46] - +1000:89a5 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:89ad FUN_1000_7ed9 DATA 1 true Stack[-0xe] - +1000:89b0 FUN_1000_7ed9 DATA 1 true Stack[-0xc] - +1000:89b3 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:89b8 FUN_1000_7ed9 DATA 1 true Stack[-0x44] - +1000:89bb FUN_1000_7ed9 DATA 1 true Stack[-0x42] - +1000:89be FUN_1000_7ed9 DATA 1 true Stack[-0x40] - +1000:89c1 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:89c9 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:0feb Code5 FUN_1020_0feb FUN_1020_0feb +1000:89d1 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:89d6 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:89db FUN_1000_7ed9 DATA 1 true Stack[0x4] - +1000:89f6 FUN_1000_7ed9 DATA 1 true Stack[-0x3a] - +1000:89f9 FUN_1000_7ed9 DATA 1 true Stack[-0x38] - +1000:89fc FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:8a04 FUN_1000_7ed9 DATA 1 true Stack[-0xe] - +1000:8a07 FUN_1000_7ed9 DATA 1 true Stack[-0xc] - +1000:8a0a FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:8a0f FUN_1000_7ed9 DATA 1 true Stack[-0x4a] - +1000:8a12 FUN_1000_7ed9 DATA 1 true Stack[-0x48] - +1000:8a15 FUN_1000_7ed9 DATA 1 true Stack[-0x46] - +1000:8a18 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:8a20 FUN_1000_7ed9 DATA 1 true Stack[-0x12] - +1000:8a23 FUN_1000_7ed9 DATA 1 true Stack[-0x10] - +1000:8a26 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:8a2b FUN_1000_7ed9 DATA 1 true Stack[-0x44] - +1000:8a2e FUN_1000_7ed9 DATA 1 true Stack[-0x42] - +1000:8a31 FUN_1000_7ed9 DATA 1 true Stack[-0x40] - +1000:8a34 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:8a3c FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:0fe5 Code5 FUN_1020_0fe5 FUN_1020_0fe5 +1000:8a44 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:8a49 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:8a4e FUN_1000_7ed9 DATA 1 true Stack[0x4] - +1000:8a73 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:8a7b FUN_1000_7ed9 DATA 1 true Stack[-0x86] - +1000:8a7f FUN_1000_7ed9 DATA 1 true Stack[-0x84] - +1000:8a83 FUN_1000_7ed9 DATA 1 true Stack[0x4] - +1000:8a94 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:8a99 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:8aa1 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:8aa6 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:8aab FUN_1000_7ed9 DATA 0 true Stack[-0x8a] - +1000:8aaf FUN_1000_7ed9 DATA 0 true Stack[-0x88] - +1000:8ab3 FUN_1000_7ed9 DATA 0 true Stack[-0x84] - +1000:8ab7 FUN_1000_7ed9 DATA 0 true Stack[-0x86] - +1000:8abb FUN_1000_7ed9 DATA 0 true Stack[-0x88] - +1000:8abf FUN_1000_7ed9 DATA 0 true Stack[-0x8a] - +1000:8ac3 FUN_1000_7ed9 DATA 1 true Stack[0x4] - +1000:8ac7 FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1000:beff Code1 FUN_1000_beff FUN_1000_beff +1000:8acc FUN_1000_7ed9 DATA 1 true Stack[0x4] - +1000:8ad8 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:8af1 Code1 LAB_1000_8af1 +1000:8ada FUN_1000_7ed9 DATA 1 true Stack[-0x76] - +1000:8add FUN_1000_7ed9 DATA 1 true Stack[-0x74] - +1000:8ae8 FUN_1000_7ed9 DATA 1 true Stack[0x4] - +1000:8aec FUN_1000_7ed9 UNCONDITIONAL_CALL 0 true 1000:c426 Code1 FUN_1000_c426 FUN_1000_c426 +1000:8af1 FUN_1000_7ed9 DATA 1 true Stack[-0x76] - +1000:8af4 FUN_1000_7ed9 DATA 1 true Stack[-0x74] - +1000:8af7 FUN_1000_7ed9 DATA 1 true Stack[-0x3d5] - +1000:8afb FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:8b00 Code1 LAB_1000_8b00 +1000:8afd FUN_1000_7ed9 UNCONDITIONAL_JUMP 0 true 1000:8149 Code1 LAB_1000_8149 +1000:8b00 FUN_1000_7ed9 DATA 1 true Stack[-0x3d7] - +1000:8b04 FUN_1000_7ed9 CONDITIONAL_JUMP 0 true 1000:8b09 Code1 LAB_1000_8b09 +1000:8b06 FUN_1000_7ed9 UNCONDITIONAL_JUMP 0 true 1000:8149 Code1 LAB_1000_8149 +1000:8b11 FUN_1000_8b0d DATA 1 true Stack[0x4] - +1000:8b20 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:8b25 FUN_1000_8b0d DATA 0 true Stack[-0x4] - +1000:8b28 FUN_1000_8b0d DATA 0 true Stack[0x8] - +1000:8b2c FUN_1000_8b0d CONDITIONAL_JUMP 0 true 1000:8b4f Code1 LAB_1000_8b4f +1000:8b2e FUN_1000_8b0d DATA 0 true Stack[0x6] - +1000:8b32 FUN_1000_8b0d CONDITIONAL_JUMP 0 true 1000:8b4f Code1 LAB_1000_8b4f +1000:8b34 FUN_1000_8b0d DATA 1 true Stack[0x4] - +1000:8b4d FUN_1000_8b0d UNCONDITIONAL_JUMP 0 true 1000:8b68 Code1 LAB_1000_8b68 +1000:8b4f FUN_1000_8b0d DATA 1 true Stack[0x4] - +1000:8b68 FUN_1000_8b0d DATA 1 true Stack[0xa] - +1000:8b6d FUN_1000_8b0d CONDITIONAL_JUMP 0 true 1000:8b72 Code1 LAB_1000_8b72 +1000:8b6f FUN_1000_8b0d UNCONDITIONAL_JUMP 0 true 1000:92e6 Code1 LAB_1000_92e6 +1000:8b72 FUN_1000_8b0d DATA 0 true Stack[-0x10] - +1000:8b77 FUN_1000_8b0d DATA 1 true Stack[0x6] - +1000:8b7a FUN_1000_8b0d DATA 1 true Stack[0x8] - +1000:8b82 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:8b87 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:8b8c FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:8b95 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8b9c FUN_1000_8b0d READ 1 true 1028:1ed3 Data6 DAT_1028_1ed3 +1000:8ba0 FUN_1000_8b0d READ 1 true 1028:1ed5 Data6 DAT_1028_1ed5 +1000:8bac FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8bb3 FUN_1000_8b0d WRITE 0 true 1028:1ed3 Data6 DAT_1028_1ed3 +1000:8bb7 FUN_1000_8b0d WRITE 0 true 1028:1ed5 Data6 DAT_1028_1ed5 +1000:8bbb FUN_1000_8b0d DATA 1 true Stack[0x6] - +1000:8bbe FUN_1000_8b0d DATA 1 true Stack[0x8] - +1000:8bc6 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:8bcb FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:8bd0 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:8bd9 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8be0 FUN_1000_8b0d READ 1 true 1028:1ed7 Data6 DAT_1028_1ed7 +1000:8be4 FUN_1000_8b0d READ 1 true 1028:1ed9 Data6 DAT_1028_1ed9 +1000:8bf0 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8bf7 FUN_1000_8b0d WRITE 0 true 1028:1ed7 Data6 DAT_1028_1ed7 +1000:8bfb FUN_1000_8b0d WRITE 0 true 1028:1ed9 Data6 DAT_1028_1ed9 +1000:8bff FUN_1000_8b0d DATA 1 true Stack[0x6] - +1000:8c02 FUN_1000_8b0d DATA 1 true Stack[0x8] - +1000:8c0a FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:8c0f FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:8c14 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:8c1d FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8c24 FUN_1000_8b0d READ 1 true 1028:1edb Data6 DAT_1028_1edb +1000:8c28 FUN_1000_8b0d READ 1 true 1028:1edd Data6 DAT_1028_1edd +1000:8c34 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8c3b FUN_1000_8b0d WRITE 0 true 1028:1edb Data6 DAT_1028_1edb +1000:8c3f FUN_1000_8b0d WRITE 0 true 1028:1edd Data6 DAT_1028_1edd +1000:8c43 FUN_1000_8b0d DATA 1 true Stack[0x6] - +1000:8c46 FUN_1000_8b0d DATA 1 true Stack[0x8] - +1000:8c4e FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:8c53 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:8c58 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:8c61 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8c68 FUN_1000_8b0d READ 1 true 1028:1edf Data6 DAT_1028_1edf +1000:8c6c FUN_1000_8b0d READ 1 true 1028:1ee1 Data6 DAT_1028_1ee1 +1000:8c78 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8c7f FUN_1000_8b0d WRITE 0 true 1028:1edf Data6 DAT_1028_1edf +1000:8c83 FUN_1000_8b0d WRITE 0 true 1028:1ee1 Data6 DAT_1028_1ee1 +1000:8c87 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8c8e FUN_1000_8b0d READ 1 true 1028:1ed3 Data6 DAT_1028_1ed3 +1000:8c92 FUN_1000_8b0d READ 1 true 1028:1ed5 Data6 DAT_1028_1ed5 +1000:8c96 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8c9d FUN_1000_8b0d READ 1 true 1028:1edb Data6 DAT_1028_1edb +1000:8ca1 FUN_1000_8b0d READ 1 true 1028:1edd Data6 DAT_1028_1edd +1000:8ca7 FUN_1000_8b0d CONDITIONAL_JUMP 0 true 1000:8caf Code1 LAB_1000_8caf +1000:8ca9 FUN_1000_8b0d CONDITIONAL_JUMP 0 true 1000:8d01 Code1 LAB_1000_8d01 +1000:8cad FUN_1000_8b0d CONDITIONAL_JUMP 0 true 1000:8d01 Code1 LAB_1000_8d01 +1000:8caf FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8cb6 FUN_1000_8b0d READ 1 true 1028:1ed3 Data6 DAT_1028_1ed3 +1000:8cba FUN_1000_8b0d READ 1 true 1028:1ed5 Data6 DAT_1028_1ed5 +1000:8cc8 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8ccf FUN_1000_8b0d WRITE 0 true 1028:1ec3 Data6 DAT_1028_1ec3 +1000:8cd3 FUN_1000_8b0d WRITE 0 true 1028:1ec5 Data6 DAT_1028_1ec5 +1000:8cd7 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8cde FUN_1000_8b0d READ 1 true 1028:1edb Data6 DAT_1028_1edb +1000:8ce2 FUN_1000_8b0d READ 1 true 1028:1edd Data6 DAT_1028_1edd +1000:8cf0 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8cf7 FUN_1000_8b0d WRITE 0 true 1028:1ecb Data6 DAT_1028_1ecb +1000:8cfb FUN_1000_8b0d WRITE 0 true 1028:1ecd Data6 DAT_1028_1ecd +1000:8cff FUN_1000_8b0d UNCONDITIONAL_JUMP 0 true 1000:8d51 Code1 LAB_1000_8d51 +1000:8d01 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8d08 FUN_1000_8b0d READ 1 true 1028:1edb Data6 DAT_1028_1edb +1000:8d0c FUN_1000_8b0d READ 1 true 1028:1edd Data6 DAT_1028_1edd +1000:8d1a FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8d21 FUN_1000_8b0d WRITE 0 true 1028:1ec3 Data6 DAT_1028_1ec3 +1000:8d25 FUN_1000_8b0d WRITE 0 true 1028:1ec5 Data6 DAT_1028_1ec5 +1000:8d29 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8d30 FUN_1000_8b0d READ 1 true 1028:1ed3 Data6 DAT_1028_1ed3 +1000:8d34 FUN_1000_8b0d READ 1 true 1028:1ed5 Data6 DAT_1028_1ed5 +1000:8d42 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8d49 FUN_1000_8b0d WRITE 0 true 1028:1ecb Data6 DAT_1028_1ecb +1000:8d4d FUN_1000_8b0d WRITE 0 true 1028:1ecd Data6 DAT_1028_1ecd +1000:8d51 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8d58 FUN_1000_8b0d READ 1 true 1028:1ed7 Data6 DAT_1028_1ed7 +1000:8d5c FUN_1000_8b0d READ 1 true 1028:1ed9 Data6 DAT_1028_1ed9 +1000:8d60 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8d67 FUN_1000_8b0d READ 1 true 1028:1edf Data6 DAT_1028_1edf +1000:8d6b FUN_1000_8b0d READ 1 true 1028:1ee1 Data6 DAT_1028_1ee1 +1000:8d71 FUN_1000_8b0d CONDITIONAL_JUMP 0 true 1000:8d79 Code1 LAB_1000_8d79 +1000:8d73 FUN_1000_8b0d CONDITIONAL_JUMP 0 true 1000:8dcb Code1 LAB_1000_8dcb +1000:8d77 FUN_1000_8b0d CONDITIONAL_JUMP 0 true 1000:8dcb Code1 LAB_1000_8dcb +1000:8d79 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8d80 FUN_1000_8b0d READ 1 true 1028:1ed7 Data6 DAT_1028_1ed7 +1000:8d84 FUN_1000_8b0d READ 1 true 1028:1ed9 Data6 DAT_1028_1ed9 +1000:8d92 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8d99 FUN_1000_8b0d WRITE 0 true 1028:1ec7 Data6 DAT_1028_1ec7 +1000:8d9d FUN_1000_8b0d WRITE 0 true 1028:1ec9 Data6 DAT_1028_1ec9 +1000:8da1 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8da8 FUN_1000_8b0d READ 1 true 1028:1edf Data6 DAT_1028_1edf +1000:8dac FUN_1000_8b0d READ 1 true 1028:1ee1 Data6 DAT_1028_1ee1 +1000:8dba FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8dc1 FUN_1000_8b0d WRITE 0 true 1028:1ecf Data6 DAT_1028_1ecf +1000:8dc5 FUN_1000_8b0d WRITE 0 true 1028:1ed1 Data6 DAT_1028_1ed1 +1000:8dc9 FUN_1000_8b0d UNCONDITIONAL_JUMP 0 true 1000:8e1b Code1 LAB_1000_8e1b +1000:8dcb FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8dd2 FUN_1000_8b0d READ 1 true 1028:1edf Data6 DAT_1028_1edf +1000:8dd6 FUN_1000_8b0d READ 1 true 1028:1ee1 Data6 DAT_1028_1ee1 +1000:8de4 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8deb FUN_1000_8b0d WRITE 0 true 1028:1ec7 Data6 DAT_1028_1ec7 +1000:8def FUN_1000_8b0d WRITE 0 true 1028:1ec9 Data6 DAT_1028_1ec9 +1000:8df3 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8dfa FUN_1000_8b0d READ 1 true 1028:1ed7 Data6 DAT_1028_1ed7 +1000:8dfe FUN_1000_8b0d READ 1 true 1028:1ed9 Data6 DAT_1028_1ed9 +1000:8e0c FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8e13 FUN_1000_8b0d WRITE 0 true 1028:1ecf Data6 DAT_1028_1ecf +1000:8e17 FUN_1000_8b0d WRITE 0 true 1028:1ed1 Data6 DAT_1028_1ed1 +1000:8e1b FUN_1000_8b0d DATA 1 true Stack[0x6] - +1000:8e1e FUN_1000_8b0d DATA 1 true Stack[0x8] - +1000:8e26 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:8e2b FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:8e30 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:8e39 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8e41 FUN_1000_8b0d READ 1 true 1028:1f26 Data6 DAT_1028_1f26 +1000:8e45 FUN_1000_8b0d READ 1 true 1028:1f28 Data6 DAT_1028_1f28 +1000:8e51 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8e59 FUN_1000_8b0d WRITE 0 true 1028:1f26 Data6 DAT_1028_1f26 +1000:8e5d FUN_1000_8b0d WRITE 0 true 1028:1f28 Data6 DAT_1028_1f28 +1000:8e61 FUN_1000_8b0d DATA 1 true Stack[0x6] - +1000:8e64 FUN_1000_8b0d DATA 1 true Stack[0x8] - +1000:8e6c FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:8e71 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:8e76 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:8e7f FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8e87 FUN_1000_8b0d READ 1 true 1028:1f2a Data6 DAT_1028_1f2a +1000:8e8b FUN_1000_8b0d READ 1 true 1028:1f2c Data6 DAT_1028_1f2c +1000:8e97 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8e9f FUN_1000_8b0d WRITE 0 true 1028:1f2a Data6 DAT_1028_1f2a +1000:8ea3 FUN_1000_8b0d WRITE 0 true 1028:1f2c Data6 DAT_1028_1f2c +1000:8ea7 FUN_1000_8b0d DATA 1 true Stack[0x6] - +1000:8eaa FUN_1000_8b0d DATA 1 true Stack[0x8] - +1000:8eb2 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:8eb7 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:8ebc FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:8ec5 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8ecd FUN_1000_8b0d READ 1 true 1028:1f16 Data6 DAT_1028_1f16 +1000:8ed1 FUN_1000_8b0d READ 1 true 1028:1f18 Data6 DAT_1028_1f18 +1000:8edd FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8ee5 FUN_1000_8b0d WRITE 0 true 1028:1f16 Data6 DAT_1028_1f16 +1000:8ee9 FUN_1000_8b0d WRITE 0 true 1028:1f18 Data6 DAT_1028_1f18 +1000:8eed FUN_1000_8b0d DATA 1 true Stack[0x6] - +1000:8ef0 FUN_1000_8b0d DATA 1 true Stack[0x8] - +1000:8ef8 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:8efd FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:8f02 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:8f0b FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8f13 FUN_1000_8b0d READ 1 true 1028:1f1a Data6 DAT_1028_1f1a +1000:8f17 FUN_1000_8b0d READ 1 true 1028:1f1c Data6 DAT_1028_1f1c +1000:8f23 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8f2b FUN_1000_8b0d WRITE 0 true 1028:1f1a Data6 DAT_1028_1f1a +1000:8f2f FUN_1000_8b0d WRITE 0 true 1028:1f1c Data6 DAT_1028_1f1c +1000:8f33 FUN_1000_8b0d DATA 1 true Stack[0x6] - +1000:8f36 FUN_1000_8b0d DATA 1 true Stack[0x8] - +1000:8f3e FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:8f43 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:8f48 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:8f51 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8f59 FUN_1000_8b0d READ 1 true 1028:1f1e Data6 DAT_1028_1f1e +1000:8f5d FUN_1000_8b0d READ 1 true 1028:1f20 Data6 DAT_1028_1f20 +1000:8f69 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8f71 FUN_1000_8b0d WRITE 0 true 1028:1f1e Data6 DAT_1028_1f1e +1000:8f75 FUN_1000_8b0d WRITE 0 true 1028:1f20 Data6 DAT_1028_1f20 +1000:8f79 FUN_1000_8b0d DATA 1 true Stack[0x6] - +1000:8f7c FUN_1000_8b0d DATA 1 true Stack[0x8] - +1000:8f84 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:8f89 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:8f8e FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:8f97 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8f9f FUN_1000_8b0d READ 1 true 1028:1f22 Data6 DAT_1028_1f22 +1000:8fa3 FUN_1000_8b0d READ 1 true 1028:1f24 Data6 DAT_1028_1f24 +1000:8faf FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8fb7 FUN_1000_8b0d WRITE 0 true 1028:1f22 Data6 DAT_1028_1f22 +1000:8fbb FUN_1000_8b0d WRITE 0 true 1028:1f24 Data6 DAT_1028_1f24 +1000:8fbf FUN_1000_8b0d DATA 1 true Stack[0x6] - +1000:8fc2 FUN_1000_8b0d DATA 1 true Stack[0x8] - +1000:8fca FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:8fcf FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:8fd4 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:8fdd FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8fe6 FUN_1000_8b0d READ 1 true 1028:1f79 Data6 DAT_1028_1f79 +1000:8fea FUN_1000_8b0d READ 1 true 1028:1f7b Data6 DAT_1028_1f7b +1000:8ff6 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:8fff FUN_1000_8b0d WRITE 0 true 1028:1f79 Data6 DAT_1028_1f79 +1000:9003 FUN_1000_8b0d WRITE 0 true 1028:1f7b Data6 DAT_1028_1f7b +1000:9007 FUN_1000_8b0d DATA 1 true Stack[0x6] - +1000:900a FUN_1000_8b0d DATA 1 true Stack[0x8] - +1000:9012 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:9017 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:901c FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:9025 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:902e FUN_1000_8b0d READ 1 true 1028:1f7d Data6 DAT_1028_1f7d +1000:9032 FUN_1000_8b0d READ 1 true 1028:1f7f Data6 DAT_1028_1f7f +1000:903e FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:9047 FUN_1000_8b0d WRITE 0 true 1028:1f7d Data6 DAT_1028_1f7d +1000:904b FUN_1000_8b0d WRITE 0 true 1028:1f7f Data6 DAT_1028_1f7f +1000:904f FUN_1000_8b0d DATA 1 true Stack[0x6] - +1000:9052 FUN_1000_8b0d DATA 1 true Stack[0x8] - +1000:905a FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:905f FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:9064 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:906d FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:9076 FUN_1000_8b0d READ 1 true 1028:1f81 Data6 DAT_1028_1f81 +1000:907a FUN_1000_8b0d READ 1 true 1028:1f83 Data6 DAT_1028_1f83 +1000:9086 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:908f FUN_1000_8b0d WRITE 0 true 1028:1f81 Data6 DAT_1028_1f81 +1000:9093 FUN_1000_8b0d WRITE 0 true 1028:1f83 Data6 DAT_1028_1f83 +1000:9097 FUN_1000_8b0d DATA 1 true Stack[0x6] - +1000:909a FUN_1000_8b0d DATA 1 true Stack[0x8] - +1000:90a2 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:90a7 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:90ac FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:90b5 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:90be FUN_1000_8b0d READ 1 true 1028:1f85 Data6 DAT_1028_1f85 +1000:90c2 FUN_1000_8b0d READ 1 true 1028:1f87 Data6 DAT_1028_1f87 +1000:90ce FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:90d7 FUN_1000_8b0d WRITE 0 true 1028:1f85 Data6 DAT_1028_1f85 +1000:90db FUN_1000_8b0d WRITE 0 true 1028:1f87 Data6 DAT_1028_1f87 +1000:90df FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:90e8 FUN_1000_8b0d READ 1 true 1028:1f79 Data6 DAT_1028_1f79 +1000:90ec FUN_1000_8b0d READ 1 true 1028:1f7b Data6 DAT_1028_1f7b +1000:90f0 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:90f9 FUN_1000_8b0d READ 1 true 1028:1f81 Data6 DAT_1028_1f81 +1000:90fd FUN_1000_8b0d READ 1 true 1028:1f83 Data6 DAT_1028_1f83 +1000:9103 FUN_1000_8b0d CONDITIONAL_JUMP 0 true 1000:910b Code1 LAB_1000_910b +1000:9105 FUN_1000_8b0d CONDITIONAL_JUMP 0 true 1000:9165 Code1 LAB_1000_9165 +1000:9109 FUN_1000_8b0d CONDITIONAL_JUMP 0 true 1000:9165 Code1 LAB_1000_9165 +1000:910b FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:9114 FUN_1000_8b0d READ 1 true 1028:1f79 Data6 DAT_1028_1f79 +1000:9118 FUN_1000_8b0d READ 1 true 1028:1f7b Data6 DAT_1028_1f7b +1000:9126 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:912f FUN_1000_8b0d WRITE 0 true 1028:1f69 Data6 DAT_1028_1f69 +1000:9133 FUN_1000_8b0d WRITE 0 true 1028:1f6b Data6 DAT_1028_1f6b +1000:9137 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:9140 FUN_1000_8b0d READ 1 true 1028:1f81 Data6 DAT_1028_1f81 +1000:9144 FUN_1000_8b0d READ 1 true 1028:1f83 Data6 DAT_1028_1f83 +1000:9152 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:915b FUN_1000_8b0d WRITE 0 true 1028:1f71 Data6 DAT_1028_1f71 +1000:915f FUN_1000_8b0d WRITE 0 true 1028:1f73 Data6 DAT_1028_1f73 +1000:9163 FUN_1000_8b0d UNCONDITIONAL_JUMP 0 true 1000:91bd Code1 LAB_1000_91bd +1000:9165 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:916e FUN_1000_8b0d READ 1 true 1028:1f81 Data6 DAT_1028_1f81 +1000:9172 FUN_1000_8b0d READ 1 true 1028:1f83 Data6 DAT_1028_1f83 +1000:9180 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:9189 FUN_1000_8b0d WRITE 0 true 1028:1f69 Data6 DAT_1028_1f69 +1000:918d FUN_1000_8b0d WRITE 0 true 1028:1f6b Data6 DAT_1028_1f6b +1000:9191 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:919a FUN_1000_8b0d READ 1 true 1028:1f79 Data6 DAT_1028_1f79 +1000:919e FUN_1000_8b0d READ 1 true 1028:1f7b Data6 DAT_1028_1f7b +1000:91ac FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:91b5 FUN_1000_8b0d WRITE 0 true 1028:1f71 Data6 DAT_1028_1f71 +1000:91b9 FUN_1000_8b0d WRITE 0 true 1028:1f73 Data6 DAT_1028_1f73 +1000:91bd FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:91c6 FUN_1000_8b0d READ 1 true 1028:1f7d Data6 DAT_1028_1f7d +1000:91ca FUN_1000_8b0d READ 1 true 1028:1f7f Data6 DAT_1028_1f7f +1000:91ce FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:91d7 FUN_1000_8b0d READ 1 true 1028:1f85 Data6 DAT_1028_1f85 +1000:91db FUN_1000_8b0d READ 1 true 1028:1f87 Data6 DAT_1028_1f87 +1000:91e1 FUN_1000_8b0d CONDITIONAL_JUMP 0 true 1000:91e9 Code1 LAB_1000_91e9 +1000:91e3 FUN_1000_8b0d CONDITIONAL_JUMP 0 true 1000:9243 Code1 LAB_1000_9243 +1000:91e7 FUN_1000_8b0d CONDITIONAL_JUMP 0 true 1000:9243 Code1 LAB_1000_9243 +1000:91e9 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:91f2 FUN_1000_8b0d READ 1 true 1028:1f7d Data6 DAT_1028_1f7d +1000:91f6 FUN_1000_8b0d READ 1 true 1028:1f7f Data6 DAT_1028_1f7f +1000:9204 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:920d FUN_1000_8b0d WRITE 0 true 1028:1f6d Data6 DAT_1028_1f6d +1000:9211 FUN_1000_8b0d WRITE 0 true 1028:1f6f Data6 DAT_1028_1f6f +1000:9215 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:921e FUN_1000_8b0d READ 1 true 1028:1f85 Data6 DAT_1028_1f85 +1000:9222 FUN_1000_8b0d READ 1 true 1028:1f87 Data6 DAT_1028_1f87 +1000:9230 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:9239 FUN_1000_8b0d WRITE 0 true 1028:1f75 Data6 DAT_1028_1f75 +1000:923d FUN_1000_8b0d WRITE 0 true 1028:1f77 Data6 DAT_1028_1f77 +1000:9241 FUN_1000_8b0d UNCONDITIONAL_JUMP 0 true 1000:929b Code1 LAB_1000_929b +1000:9243 FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:924c FUN_1000_8b0d READ 1 true 1028:1f85 Data6 DAT_1028_1f85 +1000:9250 FUN_1000_8b0d READ 1 true 1028:1f87 Data6 DAT_1028_1f87 +1000:925e FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:9267 FUN_1000_8b0d WRITE 0 true 1028:1f6d Data6 DAT_1028_1f6d +1000:926b FUN_1000_8b0d WRITE 0 true 1028:1f6f Data6 DAT_1028_1f6f +1000:926f FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:9278 FUN_1000_8b0d READ 1 true 1028:1f7d Data6 DAT_1028_1f7d +1000:927c FUN_1000_8b0d READ 1 true 1028:1f7f Data6 DAT_1028_1f7f +1000:928a FUN_1000_8b0d DATA 1 true Stack[-0x10] - +1000:9293 FUN_1000_8b0d WRITE 0 true 1028:1f75 Data6 DAT_1028_1f75 +1000:9297 FUN_1000_8b0d WRITE 0 true 1028:1f77 Data6 DAT_1028_1f77 +1000:929b FUN_1000_8b0d DATA 1 true Stack[0x4] - +1000:92ac FUN_1000_8b0d CONDITIONAL_JUMP 0 true 1000:92c1 Code1 LAB_1000_92c1 +1000:92ae FUN_1000_8b0d DATA 0 true Stack[-0x4] - +1000:92ba FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1008:08bb Code2 FUN_1008_08bb FUN_1008_08bb +1000:92bf FUN_1000_8b0d UNCONDITIONAL_JUMP 0 true 1000:92d2 Code1 LAB_1000_92d2 +1000:92c1 FUN_1000_8b0d DATA 0 true Stack[-0x4] - +1000:92cd FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1008:0837 Code2 FUN_1008_0837 FUN_1008_0837 +1000:92d2 FUN_1000_8b0d DATA 0 true Stack[-0x4] - +1000:92de FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1000:92e3 FUN_1000_8b0d UNCONDITIONAL_JUMP 0 true 1000:99d5 Code1 LAB_1000_99d5 +1000:92e8 FUN_1000_8b0d CONDITIONAL_JUMP 0 true 1000:92ed Code1 LAB_1000_92ed +1000:92ea FUN_1000_8b0d UNCONDITIONAL_JUMP 0 true 1000:99d5 Code1 LAB_1000_99d5 +1000:92ed FUN_1000_8b0d DATA 0 true Stack[-0x12] - +1000:92f2 FUN_1000_8b0d DATA 1 true Stack[0x6] - +1000:92f5 FUN_1000_8b0d DATA 1 true Stack[0x8] - +1000:92fd FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:9306 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:930f FUN_1000_8b0d READ 1 true 1028:245e Data6 DAT_1028_245e +1000:9313 FUN_1000_8b0d READ 1 true 1028:2460 Data6 DAT_1028_2460 +1000:931f FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:9328 FUN_1000_8b0d WRITE 0 true 1028:245e Data6 DAT_1028_245e +1000:932c FUN_1000_8b0d WRITE 0 true 1028:2460 Data6 DAT_1028_2460 +1000:9330 FUN_1000_8b0d DATA 1 true Stack[0x6] - +1000:9333 FUN_1000_8b0d DATA 1 true Stack[0x8] - +1000:933b FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:9344 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:934d FUN_1000_8b0d READ 1 true 1028:2462 Data6 DAT_1028_2462 +1000:9351 FUN_1000_8b0d READ 1 true 1028:2464 Data6 DAT_1028_2464 +1000:935d FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:9366 FUN_1000_8b0d WRITE 0 true 1028:2462 Data6 DAT_1028_2462 +1000:936a FUN_1000_8b0d WRITE 0 true 1028:2464 Data6 DAT_1028_2464 +1000:936e FUN_1000_8b0d DATA 1 true Stack[0x6] - +1000:9371 FUN_1000_8b0d DATA 1 true Stack[0x8] - +1000:9379 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:9382 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:938b FUN_1000_8b0d READ 1 true 1028:2456 Data6 DAT_1028_2456 +1000:938f FUN_1000_8b0d READ 1 true 1028:2458 Data6 DAT_1028_2458 +1000:939b FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:93a4 FUN_1000_8b0d WRITE 0 true 1028:2456 Data6 DAT_1028_2456 +1000:93a8 FUN_1000_8b0d WRITE 0 true 1028:2458 Data6 DAT_1028_2458 +1000:93ac FUN_1000_8b0d DATA 1 true Stack[0x6] - +1000:93af FUN_1000_8b0d DATA 1 true Stack[0x8] - +1000:93b7 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:93c0 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:93c9 FUN_1000_8b0d READ 1 true 1028:245a Data6 DAT_1028_245a +1000:93cd FUN_1000_8b0d READ 1 true 1028:245c Data6 DAT_1028_245c +1000:93d9 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:93e2 FUN_1000_8b0d WRITE 0 true 1028:245a Data6 DAT_1028_245a +1000:93e6 FUN_1000_8b0d WRITE 0 true 1028:245c Data6 DAT_1028_245c +1000:93ea FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:93f3 FUN_1000_8b0d READ 1 true 1028:2456 Data6 DAT_1028_2456 +1000:93f7 FUN_1000_8b0d READ 1 true 1028:2458 Data6 DAT_1028_2458 +1000:93fb FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:9404 FUN_1000_8b0d READ 1 true 1028:245e Data6 DAT_1028_245e +1000:9408 FUN_1000_8b0d READ 1 true 1028:2460 Data6 DAT_1028_2460 +1000:940e FUN_1000_8b0d CONDITIONAL_JUMP 0 true 1000:9416 Code1 LAB_1000_9416 +1000:9410 FUN_1000_8b0d CONDITIONAL_JUMP 0 true 1000:9470 Code1 LAB_1000_9470 +1000:9414 FUN_1000_8b0d CONDITIONAL_JUMP 0 true 1000:9470 Code1 LAB_1000_9470 +1000:9416 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:941f FUN_1000_8b0d READ 1 true 1028:2456 Data6 DAT_1028_2456 +1000:9423 FUN_1000_8b0d READ 1 true 1028:2458 Data6 DAT_1028_2458 +1000:9431 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:943a FUN_1000_8b0d WRITE 0 true 1028:2446 Data6 DAT_1028_2446 +1000:943e FUN_1000_8b0d WRITE 0 true 1028:2448 Data6 DAT_1028_2448 +1000:9442 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:944b FUN_1000_8b0d READ 1 true 1028:245e Data6 DAT_1028_245e +1000:944f FUN_1000_8b0d READ 1 true 1028:2460 Data6 DAT_1028_2460 +1000:945d FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:9466 FUN_1000_8b0d WRITE 0 true 1028:244e Data6 DAT_1028_244e +1000:946a FUN_1000_8b0d WRITE 0 true 1028:2450 Data6 DAT_1028_2450 +1000:946e FUN_1000_8b0d UNCONDITIONAL_JUMP 0 true 1000:94c8 Code1 LAB_1000_94c8 +1000:9470 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:9479 FUN_1000_8b0d READ 1 true 1028:245e Data6 DAT_1028_245e +1000:947d FUN_1000_8b0d READ 1 true 1028:2460 Data6 DAT_1028_2460 +1000:948b FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:9494 FUN_1000_8b0d WRITE 0 true 1028:2446 Data6 DAT_1028_2446 +1000:9498 FUN_1000_8b0d WRITE 0 true 1028:2448 Data6 DAT_1028_2448 +1000:949c FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:94a5 FUN_1000_8b0d READ 1 true 1028:2456 Data6 DAT_1028_2456 +1000:94a9 FUN_1000_8b0d READ 1 true 1028:2458 Data6 DAT_1028_2458 +1000:94b7 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:94c0 FUN_1000_8b0d WRITE 0 true 1028:244e Data6 DAT_1028_244e +1000:94c4 FUN_1000_8b0d WRITE 0 true 1028:2450 Data6 DAT_1028_2450 +1000:94c8 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:94d1 FUN_1000_8b0d READ 1 true 1028:245a Data6 DAT_1028_245a +1000:94d5 FUN_1000_8b0d READ 1 true 1028:245c Data6 DAT_1028_245c +1000:94d9 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:94e2 FUN_1000_8b0d READ 1 true 1028:2462 Data6 DAT_1028_2462 +1000:94e6 FUN_1000_8b0d READ 1 true 1028:2464 Data6 DAT_1028_2464 +1000:94ec FUN_1000_8b0d CONDITIONAL_JUMP 0 true 1000:94f4 Code1 LAB_1000_94f4 +1000:94ee FUN_1000_8b0d CONDITIONAL_JUMP 0 true 1000:954e Code1 LAB_1000_954e +1000:94f2 FUN_1000_8b0d CONDITIONAL_JUMP 0 true 1000:954e Code1 LAB_1000_954e +1000:94f4 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:94fd FUN_1000_8b0d READ 1 true 1028:245a Data6 DAT_1028_245a +1000:9501 FUN_1000_8b0d READ 1 true 1028:245c Data6 DAT_1028_245c +1000:950f FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:9518 FUN_1000_8b0d WRITE 0 true 1028:244a Data6 DAT_1028_244a +1000:951c FUN_1000_8b0d WRITE 0 true 1028:244c Data6 DAT_1028_244c +1000:9520 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:9529 FUN_1000_8b0d READ 1 true 1028:2462 Data6 DAT_1028_2462 +1000:952d FUN_1000_8b0d READ 1 true 1028:2464 Data6 DAT_1028_2464 +1000:953b FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:9544 FUN_1000_8b0d WRITE 0 true 1028:2452 Data6 DAT_1028_2452 +1000:9548 FUN_1000_8b0d WRITE 0 true 1028:2454 Data6 DAT_1028_2454 +1000:954c FUN_1000_8b0d UNCONDITIONAL_JUMP 0 true 1000:95a6 Code1 LAB_1000_95a6 +1000:954e FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:9557 FUN_1000_8b0d READ 1 true 1028:2462 Data6 DAT_1028_2462 +1000:955b FUN_1000_8b0d READ 1 true 1028:2464 Data6 DAT_1028_2464 +1000:9569 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:9572 FUN_1000_8b0d WRITE 0 true 1028:244a Data6 DAT_1028_244a +1000:9576 FUN_1000_8b0d WRITE 0 true 1028:244c Data6 DAT_1028_244c +1000:957a FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:9583 FUN_1000_8b0d READ 1 true 1028:245a Data6 DAT_1028_245a +1000:9587 FUN_1000_8b0d READ 1 true 1028:245c Data6 DAT_1028_245c +1000:9595 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:959e FUN_1000_8b0d WRITE 0 true 1028:2452 Data6 DAT_1028_2452 +1000:95a2 FUN_1000_8b0d WRITE 0 true 1028:2454 Data6 DAT_1028_2454 +1000:95a6 FUN_1000_8b0d DATA 1 true Stack[0x6] - +1000:95a9 FUN_1000_8b0d DATA 1 true Stack[0x8] - +1000:95b1 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:95ba FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:95c2 FUN_1000_8b0d READ 1 true 1028:2403 Data6 DAT_1028_2403 +1000:95c6 FUN_1000_8b0d READ 1 true 1028:2405 Data6 DAT_1028_2405 +1000:95d2 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:95da FUN_1000_8b0d WRITE 0 true 1028:2403 Data6 DAT_1028_2403 +1000:95de FUN_1000_8b0d WRITE 0 true 1028:2405 Data6 DAT_1028_2405 +1000:95e2 FUN_1000_8b0d DATA 1 true Stack[0x6] - +1000:95e5 FUN_1000_8b0d DATA 1 true Stack[0x8] - +1000:95ed FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:95f6 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:95fe FUN_1000_8b0d READ 1 true 1028:2407 Data6 DAT_1028_2407 +1000:9602 FUN_1000_8b0d READ 1 true 1028:2409 Data6 DAT_1028_2409 +1000:960e FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:9616 FUN_1000_8b0d WRITE 0 true 1028:2407 Data6 DAT_1028_2407 +1000:961a FUN_1000_8b0d WRITE 0 true 1028:2409 Data6 DAT_1028_2409 +1000:961e FUN_1000_8b0d DATA 1 true Stack[0x6] - +1000:9621 FUN_1000_8b0d DATA 1 true Stack[0x8] - +1000:9629 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:9632 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:963a FUN_1000_8b0d READ 1 true 1028:23f3 Data6 DAT_1028_23f3 +1000:963e FUN_1000_8b0d READ 1 true 1028:23f5 Data6 DAT_1028_23f5 +1000:964a FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:9652 FUN_1000_8b0d WRITE 0 true 1028:23f3 Data6 DAT_1028_23f3 +1000:9656 FUN_1000_8b0d WRITE 0 true 1028:23f5 Data6 DAT_1028_23f5 +1000:965a FUN_1000_8b0d DATA 1 true Stack[0x6] - +1000:965d FUN_1000_8b0d DATA 1 true Stack[0x8] - +1000:9665 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:966e FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:9676 FUN_1000_8b0d READ 1 true 1028:23f7 Data6 DAT_1028_23f7 +1000:967a FUN_1000_8b0d READ 1 true 1028:23f9 Data6 DAT_1028_23f9 +1000:9686 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:968e FUN_1000_8b0d WRITE 0 true 1028:23f7 Data6 DAT_1028_23f7 +1000:9692 FUN_1000_8b0d WRITE 0 true 1028:23f9 Data6 DAT_1028_23f9 +1000:9696 FUN_1000_8b0d DATA 1 true Stack[0x6] - +1000:9699 FUN_1000_8b0d DATA 1 true Stack[0x8] - +1000:96a1 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:96aa FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:96b2 FUN_1000_8b0d READ 1 true 1028:23fb Data6 DAT_1028_23fb +1000:96b6 FUN_1000_8b0d READ 1 true 1028:23fd Data6 DAT_1028_23fd +1000:96c2 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:96ca FUN_1000_8b0d WRITE 0 true 1028:23fb Data6 DAT_1028_23fb +1000:96ce FUN_1000_8b0d WRITE 0 true 1028:23fd Data6 DAT_1028_23fd +1000:96d2 FUN_1000_8b0d DATA 1 true Stack[0x6] - +1000:96d5 FUN_1000_8b0d DATA 1 true Stack[0x8] - +1000:96dd FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:96e6 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:96ee FUN_1000_8b0d READ 1 true 1028:23ff Data6 DAT_1028_23ff +1000:96f2 FUN_1000_8b0d READ 1 true 1028:2401 Data6 DAT_1028_2401 +1000:96fe FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:9706 FUN_1000_8b0d WRITE 0 true 1028:23ff Data6 DAT_1028_23ff +1000:970a FUN_1000_8b0d WRITE 0 true 1028:2401 Data6 DAT_1028_2401 +1000:970e FUN_1000_8b0d DATA 1 true Stack[0x6] - +1000:9711 FUN_1000_8b0d DATA 1 true Stack[0x8] - +1000:9719 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:9722 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:9729 FUN_1000_8b0d READ 1 true 1028:23b8 Data6 DAT_1028_23b8 +1000:972d FUN_1000_8b0d READ 1 true 1028:23ba Data6 DAT_1028_23ba +1000:9739 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:9740 FUN_1000_8b0d WRITE 0 true 1028:23b8 Data6 DAT_1028_23b8 +1000:9744 FUN_1000_8b0d WRITE 0 true 1028:23ba Data6 DAT_1028_23ba +1000:9748 FUN_1000_8b0d DATA 1 true Stack[0x6] - +1000:974b FUN_1000_8b0d DATA 1 true Stack[0x8] - +1000:9753 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:975c FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:9763 FUN_1000_8b0d READ 1 true 1028:23bc Data6 DAT_1028_23bc +1000:9767 FUN_1000_8b0d READ 1 true 1028:23be Data6 DAT_1028_23be +1000:9773 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:977a FUN_1000_8b0d WRITE 0 true 1028:23bc Data6 DAT_1028_23bc +1000:977e FUN_1000_8b0d WRITE 0 true 1028:23be Data6 DAT_1028_23be +1000:9782 FUN_1000_8b0d DATA 1 true Stack[0x6] - +1000:9785 FUN_1000_8b0d DATA 1 true Stack[0x8] - +1000:978d FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:9796 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:979d FUN_1000_8b0d READ 1 true 1028:23b0 Data6 DAT_1028_23b0 +1000:97a1 FUN_1000_8b0d READ 1 true 1028:23b2 Data6 DAT_1028_23b2 +1000:97ad FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:97b4 FUN_1000_8b0d WRITE 0 true 1028:23b0 Data6 DAT_1028_23b0 +1000:97b8 FUN_1000_8b0d WRITE 0 true 1028:23b2 Data6 DAT_1028_23b2 +1000:97bc FUN_1000_8b0d DATA 1 true Stack[0x6] - +1000:97bf FUN_1000_8b0d DATA 1 true Stack[0x8] - +1000:97c7 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:97d0 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:97d7 FUN_1000_8b0d READ 1 true 1028:23b4 Data6 DAT_1028_23b4 +1000:97db FUN_1000_8b0d READ 1 true 1028:23b6 Data6 DAT_1028_23b6 +1000:97e7 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:97ee FUN_1000_8b0d WRITE 0 true 1028:23b4 Data6 DAT_1028_23b4 +1000:97f2 FUN_1000_8b0d WRITE 0 true 1028:23b6 Data6 DAT_1028_23b6 +1000:97f6 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:97fd FUN_1000_8b0d READ 1 true 1028:23b0 Data6 DAT_1028_23b0 +1000:9801 FUN_1000_8b0d READ 1 true 1028:23b2 Data6 DAT_1028_23b2 +1000:9805 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:980c FUN_1000_8b0d READ 1 true 1028:23b8 Data6 DAT_1028_23b8 +1000:9810 FUN_1000_8b0d READ 1 true 1028:23ba Data6 DAT_1028_23ba +1000:9816 FUN_1000_8b0d CONDITIONAL_JUMP 0 true 1000:981e Code1 LAB_1000_981e +1000:9818 FUN_1000_8b0d CONDITIONAL_JUMP 0 true 1000:9870 Code1 LAB_1000_9870 +1000:981c FUN_1000_8b0d CONDITIONAL_JUMP 0 true 1000:9870 Code1 LAB_1000_9870 +1000:981e FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:9825 FUN_1000_8b0d READ 1 true 1028:23b0 Data6 DAT_1028_23b0 +1000:9829 FUN_1000_8b0d READ 1 true 1028:23b2 Data6 DAT_1028_23b2 +1000:9837 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:983e FUN_1000_8b0d WRITE 0 true 1028:23a0 Data6 DAT_1028_23a0 +1000:9842 FUN_1000_8b0d WRITE 0 true 1028:23a2 Data6 DAT_1028_23a2 +1000:9846 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:984d FUN_1000_8b0d READ 1 true 1028:23b8 Data6 DAT_1028_23b8 +1000:9851 FUN_1000_8b0d READ 1 true 1028:23ba Data6 DAT_1028_23ba +1000:985f FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:9866 FUN_1000_8b0d WRITE 0 true 1028:23a8 Data6 DAT_1028_23a8 +1000:986a FUN_1000_8b0d WRITE 0 true 1028:23aa Data6 DAT_1028_23aa +1000:986e FUN_1000_8b0d UNCONDITIONAL_JUMP 0 true 1000:98c0 Code1 LAB_1000_98c0 +1000:9870 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:9877 FUN_1000_8b0d READ 1 true 1028:23b8 Data6 DAT_1028_23b8 +1000:987b FUN_1000_8b0d READ 1 true 1028:23ba Data6 DAT_1028_23ba +1000:9889 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:9890 FUN_1000_8b0d WRITE 0 true 1028:23a0 Data6 DAT_1028_23a0 +1000:9894 FUN_1000_8b0d WRITE 0 true 1028:23a2 Data6 DAT_1028_23a2 +1000:9898 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:989f FUN_1000_8b0d READ 1 true 1028:23b0 Data6 DAT_1028_23b0 +1000:98a3 FUN_1000_8b0d READ 1 true 1028:23b2 Data6 DAT_1028_23b2 +1000:98b1 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:98b8 FUN_1000_8b0d WRITE 0 true 1028:23a8 Data6 DAT_1028_23a8 +1000:98bc FUN_1000_8b0d WRITE 0 true 1028:23aa Data6 DAT_1028_23aa +1000:98c0 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:98c7 FUN_1000_8b0d READ 1 true 1028:23b4 Data6 DAT_1028_23b4 +1000:98cb FUN_1000_8b0d READ 1 true 1028:23b6 Data6 DAT_1028_23b6 +1000:98cf FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:98d6 FUN_1000_8b0d READ 1 true 1028:23bc Data6 DAT_1028_23bc +1000:98da FUN_1000_8b0d READ 1 true 1028:23be Data6 DAT_1028_23be +1000:98e0 FUN_1000_8b0d CONDITIONAL_JUMP 0 true 1000:98e8 Code1 LAB_1000_98e8 +1000:98e2 FUN_1000_8b0d CONDITIONAL_JUMP 0 true 1000:993a Code1 LAB_1000_993a +1000:98e6 FUN_1000_8b0d CONDITIONAL_JUMP 0 true 1000:993a Code1 LAB_1000_993a +1000:98e8 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:98ef FUN_1000_8b0d READ 1 true 1028:23b4 Data6 DAT_1028_23b4 +1000:98f3 FUN_1000_8b0d READ 1 true 1028:23b6 Data6 DAT_1028_23b6 +1000:9901 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:9908 FUN_1000_8b0d WRITE 0 true 1028:23a4 Data6 DAT_1028_23a4 +1000:990c FUN_1000_8b0d WRITE 0 true 1028:23a6 Data6 DAT_1028_23a6 +1000:9910 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:9917 FUN_1000_8b0d READ 1 true 1028:23bc Data6 DAT_1028_23bc +1000:991b FUN_1000_8b0d READ 1 true 1028:23be Data6 DAT_1028_23be +1000:9929 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:9930 FUN_1000_8b0d WRITE 0 true 1028:23ac Data6 DAT_1028_23ac +1000:9934 FUN_1000_8b0d WRITE 0 true 1028:23ae Data6 DAT_1028_23ae +1000:9938 FUN_1000_8b0d UNCONDITIONAL_JUMP 0 true 1000:998a Code1 LAB_1000_998a +1000:993a FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:9941 FUN_1000_8b0d READ 1 true 1028:23bc Data6 DAT_1028_23bc +1000:9945 FUN_1000_8b0d READ 1 true 1028:23be Data6 DAT_1028_23be +1000:9953 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:995a FUN_1000_8b0d WRITE 0 true 1028:23a4 Data6 DAT_1028_23a4 +1000:995e FUN_1000_8b0d WRITE 0 true 1028:23a6 Data6 DAT_1028_23a6 +1000:9962 FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:9969 FUN_1000_8b0d READ 1 true 1028:23b4 Data6 DAT_1028_23b4 +1000:996d FUN_1000_8b0d READ 1 true 1028:23b6 Data6 DAT_1028_23b6 +1000:997b FUN_1000_8b0d DATA 1 true Stack[-0x12] - +1000:9982 FUN_1000_8b0d WRITE 0 true 1028:23ac Data6 DAT_1028_23ac +1000:9986 FUN_1000_8b0d WRITE 0 true 1028:23ae Data6 DAT_1028_23ae +1000:998a FUN_1000_8b0d DATA 1 true Stack[0x4] - +1000:999b FUN_1000_8b0d CONDITIONAL_JUMP 0 true 1000:99b1 Code1 LAB_1000_99b1 +1000:999d FUN_1000_8b0d DATA 0 true Stack[-0x4] - +1000:99aa FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1008:08bb Code2 FUN_1008_08bb FUN_1008_08bb +1000:99af FUN_1000_8b0d UNCONDITIONAL_JUMP 0 true 1000:99c3 Code1 LAB_1000_99c3 +1000:99b1 FUN_1000_8b0d DATA 0 true Stack[-0x4] - +1000:99be FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1008:0837 Code2 FUN_1008_0837 FUN_1008_0837 +1000:99c3 FUN_1000_8b0d DATA 0 true Stack[-0x4] - +1000:99d0 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1000:99d5 FUN_1000_8b0d DATA 1 true Stack[0x4] - +1000:99e4 FUN_1000_8b0d DATA 0 true Stack[-0x4] - +1000:99e7 FUN_1000_8b0d UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:99f4 FUN_1000_99f0 DATA 1 true Stack[0x4] - +1000:9a01 FUN_1000_99f0 CONDITIONAL_JUMP 0 true 1000:9a2f Code1 LAB_1000_9a2f +1000:9a09 FUN_1000_99f0 CONDITIONAL_JUMP 0 true 1000:9a2f Code1 LAB_1000_9a2f +1000:9a18 FUN_1000_99f0 DATA 1 true Stack[0x4] - +1000:9a1c FUN_1000_99f0 UNCONDITIONAL_CALL 0 true 1000:7ed9 Code1 FUN_1000_7ed9 FUN_1000_7ed9 +1000:9a28 FUN_1000_99f0 UNCONDITIONAL_CALL 0 true 1000:8b0d Code1 FUN_1000_8b0d FUN_1000_8b0d +1000:9a2d FUN_1000_99f0 UNCONDITIONAL_JUMP 0 true 1000:9a68 Code1 LAB_1000_9a68 +1000:9a2f FUN_1000_99f0 DATA 1 true Stack[0x4] - +1000:9a3c FUN_1000_99f0 CONDITIONAL_JUMP 0 true 1000:9a68 Code1 LAB_1000_9a68 +1000:9a44 FUN_1000_99f0 CONDITIONAL_JUMP 0 true 1000:9a68 Code1 LAB_1000_9a68 +1000:9a53 FUN_1000_99f0 DATA 1 true Stack[0x4] - +1000:9a57 FUN_1000_99f0 UNCONDITIONAL_CALL 0 true 1000:7ed9 Code1 FUN_1000_7ed9 FUN_1000_7ed9 +1000:9a63 FUN_1000_99f0 UNCONDITIONAL_CALL 0 true 1000:8b0d Code1 FUN_1000_8b0d FUN_1000_8b0d +1000:9a68 FUN_1000_99f0 DATA 1 true Stack[0x4] - +1000:9a75 FUN_1000_99f0 CONDITIONAL_JUMP 0 true 1000:9aa3 Code1 LAB_1000_9aa3 +1000:9a7d FUN_1000_99f0 CONDITIONAL_JUMP 0 true 1000:9aa3 Code1 LAB_1000_9aa3 +1000:9a8c FUN_1000_99f0 DATA 1 true Stack[0x4] - +1000:9a90 FUN_1000_99f0 UNCONDITIONAL_CALL 0 true 1000:7ed9 Code1 FUN_1000_7ed9 FUN_1000_7ed9 +1000:9a9c FUN_1000_99f0 UNCONDITIONAL_CALL 0 true 1000:8b0d Code1 FUN_1000_8b0d FUN_1000_8b0d +1000:9aa1 FUN_1000_99f0 UNCONDITIONAL_JUMP 0 true 1000:9adc Code1 LAB_1000_9adc +1000:9aa3 FUN_1000_99f0 DATA 1 true Stack[0x4] - +1000:9ab0 FUN_1000_99f0 CONDITIONAL_JUMP 0 true 1000:9adc Code1 LAB_1000_9adc +1000:9ab8 FUN_1000_99f0 CONDITIONAL_JUMP 0 true 1000:9adc Code1 LAB_1000_9adc +1000:9ac7 FUN_1000_99f0 DATA 1 true Stack[0x4] - +1000:9acb FUN_1000_99f0 UNCONDITIONAL_CALL 0 true 1000:7ed9 Code1 FUN_1000_7ed9 FUN_1000_7ed9 +1000:9ad7 FUN_1000_99f0 UNCONDITIONAL_CALL 0 true 1000:8b0d Code1 FUN_1000_8b0d FUN_1000_8b0d +1000:9ae4 FUN_1000_9ae0 DATA 1 true Stack[0x4] - +1000:9af5 FUN_1000_9ae0 DATA 1 true Stack[0x14] - +1000:9af8 FUN_1000_9ae0 CONDITIONAL_JUMP 0 true 1000:9b01 Code1 LAB_1000_9b01 +1000:9afa FUN_1000_9ae0 CONDITIONAL_JUMP 0 true 1000:9b5e Code1 LAB_1000_9b5e +1000:9afc FUN_1000_9ae0 DATA 1 true Stack[0x12] - +1000:9aff FUN_1000_9ae0 CONDITIONAL_JUMP 0 true 1000:9b5e Code1 LAB_1000_9b5e +1000:9b01 FUN_1000_9ae0 DATA 1 true Stack[0x4] - +1000:9b12 FUN_1000_9ae0 DATA 1 true Stack[0x10] - +1000:9b15 FUN_1000_9ae0 CONDITIONAL_JUMP 0 true 1000:9b1e Code1 LAB_1000_9b1e +1000:9b17 FUN_1000_9ae0 CONDITIONAL_JUMP 0 true 1000:9b5e Code1 LAB_1000_9b5e +1000:9b19 FUN_1000_9ae0 DATA 1 true Stack[0xe] - +1000:9b1c FUN_1000_9ae0 CONDITIONAL_JUMP 0 true 1000:9b5e Code1 LAB_1000_9b5e +1000:9b1e FUN_1000_9ae0 DATA 1 true Stack[0x4] - +1000:9b2f FUN_1000_9ae0 DATA 1 true Stack[0xc] - +1000:9b32 FUN_1000_9ae0 CONDITIONAL_JUMP 0 true 1000:9b3b Code1 LAB_1000_9b3b +1000:9b34 FUN_1000_9ae0 CONDITIONAL_JUMP 0 true 1000:9b5e Code1 LAB_1000_9b5e +1000:9b36 FUN_1000_9ae0 DATA 1 true Stack[0xa] - +1000:9b39 FUN_1000_9ae0 CONDITIONAL_JUMP 0 true 1000:9b5e Code1 LAB_1000_9b5e +1000:9b3b FUN_1000_9ae0 DATA 1 true Stack[0x4] - +1000:9b4c FUN_1000_9ae0 DATA 1 true Stack[0x8] - +1000:9b4f FUN_1000_9ae0 CONDITIONAL_JUMP 0 true 1000:9b58 Code1 LAB_1000_9b58 +1000:9b51 FUN_1000_9ae0 CONDITIONAL_JUMP 0 true 1000:9b5e Code1 LAB_1000_9b5e +1000:9b53 FUN_1000_9ae0 DATA 1 true Stack[0x6] - +1000:9b56 FUN_1000_9ae0 CONDITIONAL_JUMP 0 true 1000:9b5e Code1 LAB_1000_9b5e +1000:9b58 FUN_1000_9ae0 DATA 0 true Stack[-0x3] - +1000:9b5c FUN_1000_9ae0 UNCONDITIONAL_JUMP 0 true 1000:9b62 Code1 LAB_1000_9b62 +1000:9b5e FUN_1000_9ae0 DATA 0 true Stack[-0x3] - +1000:9b62 FUN_1000_9ae0 DATA 1 true Stack[-0x3] - +1000:9b6d FUN_1000_9b69 READ 1 true 1028:07db Data6 DAT_1028_07db +1000:9b70 FUN_1000_9b69 READ 1 true 1028:07dd Data6 DAT_1028_07dd +1000:9b74 FUN_1000_9b69 DATA 1 true Stack[0x14] - +1000:9b77 FUN_1000_9b69 CONDITIONAL_JUMP 0 true 1000:9b80 Code1 LAB_1000_9b80 +1000:9b79 FUN_1000_9b69 CONDITIONAL_JUMP 0 true 1000:9bbf Code1 LAB_1000_9bbf +1000:9b7b FUN_1000_9b69 DATA 1 true Stack[0x12] - +1000:9b7e FUN_1000_9b69 CONDITIONAL_JUMP 0 true 1000:9bbf Code1 LAB_1000_9bbf +1000:9b80 FUN_1000_9b69 READ 1 true 1028:07df Data6 DAT_1028_07df +1000:9b83 FUN_1000_9b69 READ 1 true 1028:07e1 Data6 DAT_1028_07e1 +1000:9b87 FUN_1000_9b69 DATA 1 true Stack[0x10] - +1000:9b8a FUN_1000_9b69 CONDITIONAL_JUMP 0 true 1000:9b93 Code1 LAB_1000_9b93 +1000:9b8c FUN_1000_9b69 CONDITIONAL_JUMP 0 true 1000:9bbf Code1 LAB_1000_9bbf +1000:9b8e FUN_1000_9b69 DATA 1 true Stack[0xe] - +1000:9b91 FUN_1000_9b69 CONDITIONAL_JUMP 0 true 1000:9bbf Code1 LAB_1000_9bbf +1000:9b93 FUN_1000_9b69 READ 1 true 1028:07db Data6 DAT_1028_07db +1000:9b96 FUN_1000_9b69 READ 1 true 1028:07dd Data6 DAT_1028_07dd +1000:9b9a FUN_1000_9b69 DATA 1 true Stack[0xc] - +1000:9b9d FUN_1000_9b69 CONDITIONAL_JUMP 0 true 1000:9ba6 Code1 LAB_1000_9ba6 +1000:9b9f FUN_1000_9b69 CONDITIONAL_JUMP 0 true 1000:9bbf Code1 LAB_1000_9bbf +1000:9ba1 FUN_1000_9b69 DATA 1 true Stack[0xa] - +1000:9ba4 FUN_1000_9b69 CONDITIONAL_JUMP 0 true 1000:9bbf Code1 LAB_1000_9bbf +1000:9ba6 FUN_1000_9b69 READ 1 true 1028:07df Data6 DAT_1028_07df +1000:9ba9 FUN_1000_9b69 READ 1 true 1028:07e1 Data6 DAT_1028_07e1 +1000:9bad FUN_1000_9b69 DATA 1 true Stack[0x8] - +1000:9bb0 FUN_1000_9b69 CONDITIONAL_JUMP 0 true 1000:9bb9 Code1 LAB_1000_9bb9 +1000:9bb2 FUN_1000_9b69 CONDITIONAL_JUMP 0 true 1000:9bbf Code1 LAB_1000_9bbf +1000:9bb4 FUN_1000_9b69 DATA 1 true Stack[0x6] - +1000:9bb7 FUN_1000_9b69 CONDITIONAL_JUMP 0 true 1000:9bbf Code1 LAB_1000_9bbf +1000:9bb9 FUN_1000_9b69 DATA 0 true Stack[-0x3] - +1000:9bbd FUN_1000_9b69 UNCONDITIONAL_JUMP 0 true 1000:9bc3 Code1 LAB_1000_9bc3 +1000:9bbf FUN_1000_9b69 DATA 0 true Stack[-0x3] - +1000:9bc3 FUN_1000_9b69 DATA 1 true Stack[-0x3] - +1000:9bcd FUN_1000_9bca DATA 1 true Stack[0x4] - +1000:9bd8 FUN_1000_9bca DATA 1 true Stack[0x4] - +1000:9be1 FUN_1000_9bca UNCONDITIONAL_CALL 0 true 1228:01c4 EXTERNAL GETCLIENTRECT GETCLIENTRECT +1000:9be6 FUN_1000_9bca DATA 1 true Stack[0x4] - +1000:9bf1 FUN_1000_9bca UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:9bf6 FUN_1000_9bca DATA 1 true Stack[0x4] - +1000:9c01 FUN_1000_9bca UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1000:9c06 FUN_1000_9bca DATA 1 true Stack[0x4] - +1000:9c11 FUN_1000_9bca UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1000:9c16 FUN_1000_9bca DATA 1 true Stack[0x4] - +1000:9c1d FUN_1000_9bca DATA 0 true Stack[-0xc] - +1000:9c21 FUN_1000_9bca UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1000:9c26 FUN_1000_9bca DATA 1 true Stack[0x4] - +1000:9c35 FUN_1000_9bca UNCONDITIONAL_CALL 0 true 1228:0158 EXTERNAL CREATECOMPATIBLEBITMAP CREATECOMPATIBLEBITMAP +1000:9c3a FUN_1000_9bca DATA 1 true Stack[0x4] - +1000:9c41 FUN_1000_9bca READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:9c44 FUN_1000_9bca READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:9c53 FUN_1000_9bca UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:9c5e FUN_1000_9bca DATA 1 true Stack[0x4] - +1000:9c6f FUN_1000_9bca READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:9c72 FUN_1000_9bca READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:9c81 FUN_1000_9bca UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:9c8c FUN_1000_9bca DATA 1 true Stack[0x4] - +1000:9cad FUN_1000_9bca DATA 1 true Stack[0x4] - +1000:9cba FUN_1000_9bca DATA 1 true Stack[0x4] - +1000:9cd1 FUN_1000_9bca DATA 1 true Stack[0x4] - +1000:9cee FUN_1000_9bca READ 0 true 1028:085b Data6 DAT_1028_085b +1000:9cf2 FUN_1000_9bca UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:9cf7 FUN_1000_9bca DATA 1 true Stack[0x4] - +1000:9d06 FUN_1000_9bca UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:9d0b FUN_1000_9bca DATA 1 true Stack[0x4] - +1000:9d26 FUN_1000_9bca DATA 0 true Stack[-0x20] - +1000:9d2a FUN_1000_9bca DATA 0 true Stack[-0x22] - +1000:9d33 FUN_1000_9bca UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:9d38 FUN_1000_9bca DATA 1 true Stack[0x4] - +1000:9d3f FUN_1000_9bca DATA 1 true Stack[0x4] - +1000:9d4a FUN_1000_9bca UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:9d4f FUN_1000_9bca DATA 1 true Stack[0x4] - +1000:9d70 FUN_1000_9bca UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:9d75 FUN_1000_9bca DATA 1 true Stack[0x4] - +1000:9d7c FUN_1000_9bca DATA 1 true Stack[0x4] - +1000:9d87 FUN_1000_9bca UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:9d8c FUN_1000_9bca DATA 1 true Stack[0x4] - +1000:9dad FUN_1000_9bca UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:9db2 FUN_1000_9bca DATA 1 true Stack[0x4] - +1000:9dc0 FUN_1000_9bca CONDITIONAL_JUMP 0 true 1000:9de1 Code1 LAB_1000_9de1 +1000:9dc8 FUN_1000_9bca CONDITIONAL_JUMP 0 true 1000:9dd2 Code1 LAB_1000_9dd2 +1000:9dd0 FUN_1000_9bca UNCONDITIONAL_JUMP 0 true 1000:9de1 Code1 LAB_1000_9de1 +1000:9dd5 FUN_1000_9bca DATA 1 true Stack[0x4] - +1000:9de1 FUN_1000_9bca DATA 1 true Stack[0x4] - +1000:9de8 FUN_1000_9bca DATA 0 true Stack[-0x20] - +1000:9dec FUN_1000_9bca DATA 0 true Stack[-0x22] - +1000:9e05 FUN_1000_9bca UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:9e0a FUN_1000_9bca DATA 1 true Stack[0x4] - +1000:9e15 FUN_1000_9bca UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:9e1a FUN_1000_9bca DATA 1 true Stack[0x4] - +1000:9e25 FUN_1000_9bca UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:9e2a FUN_1000_9bca DATA 1 true Stack[0x4] - +1000:9e35 FUN_1000_9bca UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:9e3a FUN_1000_9bca DATA 1 true Stack[0x4] - +1000:9e41 FUN_1000_9bca UNCONDITIONAL_CALL 0 true 1228:0168 EXTERNAL DELETEOBJECT DELETEOBJECT +1000:9e46 FUN_1000_9bca DATA 1 true Stack[0x4] - +1000:9e4d FUN_1000_9bca UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1000:9e52 FUN_1000_9bca DATA 1 true Stack[0x4] - +1000:9e59 FUN_1000_9bca UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1000:9e5e FUN_1000_9bca DATA 1 true Stack[0x4] - +1000:9e65 FUN_1000_9bca UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1000:9e6a FUN_1000_9bca DATA 1 true Stack[0x4] - +1000:9e75 FUN_1000_9bca DATA 1 true Stack[0x4] - +1000:9e7c FUN_1000_9bca UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:9e88 FUN_1000_9e85 READ 0 true 1028:3371 Data6 DAT_1028_3371 +1000:9e8d FUN_1000_9e85 CONDITIONAL_JUMP 0 true 1000:9ec5 Code1 LAB_1000_9ec5 +1000:9e8f FUN_1000_9e85 READ 0 true 1028:33c4 Data6 DAT_1028_33c4 +1000:9e94 FUN_1000_9e85 CONDITIONAL_JUMP 0 true 1000:9ec5 Code1 LAB_1000_9ec5 +1000:9e96 FUN_1000_9e85 READ 0 true 1028:3417 Data6 DAT_1028_3417 +1000:9e9b FUN_1000_9e85 CONDITIONAL_JUMP 0 true 1000:9ec5 Code1 LAB_1000_9ec5 +1000:9e9d FUN_1000_9e85 READ 0 true 1028:346a Data6 DAT_1028_346a +1000:9ea2 FUN_1000_9e85 CONDITIONAL_JUMP 0 true 1000:9ec5 Code1 LAB_1000_9ec5 +1000:9ea4 FUN_1000_9e85 READ 0 true 1028:34bd Data6 DAT_1028_34bd +1000:9ea9 FUN_1000_9e85 CONDITIONAL_JUMP 0 true 1000:9ec5 Code1 LAB_1000_9ec5 +1000:9ead FUN_1000_9e85 WRITE 0 true 1028:0851 Data6 DAT_1028_0851 +1000:9eb0 FUN_1000_9e85 WRITE 0 true 1028:0853 Data6 DAT_1028_0853 +1000:9eb3 FUN_1000_9e85 WRITE 0 true 1028:07c8 Data6 DAT_1028_07c8 +1000:9eb8 FUN_1000_9e85 DATA 1 true Stack[0x4] - +1000:9ec5 FUN_1000_9e85 WRITE 0 true 1028:07c6 Data6 DAT_1028_07c6 +1000:9eca FUN_1000_9e85 DATA 1 true Stack[0x4] - +1000:9ed7 FUN_1000_9e85 WRITE 0 true 1028:07d3 Data6 DAT_1028_07d3 +1000:9edd FUN_1000_9e85 WRITE 0 true 1028:07d5 Data6 DAT_1028_07d5 +1000:9ee3 FUN_1000_9e85 WRITE 0 true 1028:07d7 Data6 DAT_1028_07d7 +1000:9ee9 FUN_1000_9e85 WRITE 0 true 1028:07d9 Data6 DAT_1028_07d9 +1000:9f66 FUN_1000_9e85 DATA 1 true Stack[0x4] - +1000:9f6a FUN_1000_9e85 UNCONDITIONAL_CALL 0 true 1000:9bca Code1 FUN_1000_9bca FUN_1000_9bca +1000:9f76 FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:9f81 FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:9f8a FUN_1000_9f73 UNCONDITIONAL_CALL 0 true 1228:01c4 EXTERNAL GETCLIENTRECT GETCLIENTRECT +1000:9f8f FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:9f9a FUN_1000_9f73 UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:9f9f FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:9faa FUN_1000_9f73 UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1000:9faf FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:9fba FUN_1000_9f73 UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1000:9fbf FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:9fc6 FUN_1000_9f73 DATA 0 true Stack[-0xc] - +1000:9fca FUN_1000_9f73 UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1000:9fcf FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:9fde FUN_1000_9f73 UNCONDITIONAL_CALL 0 true 1228:0158 EXTERNAL CREATECOMPATIBLEBITMAP CREATECOMPATIBLEBITMAP +1000:9fe3 FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:9fea FUN_1000_9f73 READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:9fed FUN_1000_9f73 READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:9ffc FUN_1000_9f73 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:a007 FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a018 FUN_1000_9f73 READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:a01b FUN_1000_9f73 READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:a02a FUN_1000_9f73 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:a035 FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a046 FUN_1000_9f73 READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:a049 FUN_1000_9f73 READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:a05c FUN_1000_9f73 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:a061 FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a072 FUN_1000_9f73 READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:a075 FUN_1000_9f73 READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:a088 FUN_1000_9f73 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:a08d FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a0a4 FUN_1000_9f73 CONDITIONAL_JUMP 0 true 1000:a0b0 Code1 LAB_1000_a0b0 +1000:a0a6 FUN_1000_9f73 CONDITIONAL_JUMP 0 true 1000:a0f8 Code1 LAB_1000_a0f8 +1000:a0ae FUN_1000_9f73 CONDITIONAL_JUMP 0 true 1000:a0f8 Code1 LAB_1000_a0f8 +1000:a0b0 FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a0d1 FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a0d8 FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a0ef FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a0f6 FUN_1000_9f73 UNCONDITIONAL_JUMP 0 true 1000:a11c Code1 LAB_1000_a11c +1000:a0f8 FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a10f FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a11c FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a129 FUN_1000_9f73 CONDITIONAL_JUMP 0 true 1000:a135 Code1 LAB_1000_a135 +1000:a12b FUN_1000_9f73 CONDITIONAL_JUMP 0 true 1000:a17d Code1 LAB_1000_a17d +1000:a133 FUN_1000_9f73 CONDITIONAL_JUMP 0 true 1000:a17d Code1 LAB_1000_a17d +1000:a135 FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a156 FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a15d FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a174 FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a17b FUN_1000_9f73 UNCONDITIONAL_JUMP 0 true 1000:a1a1 Code1 LAB_1000_a1a1 +1000:a17d FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a194 FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a1a1 FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a1b4 FUN_1000_9f73 CONDITIONAL_JUMP 0 true 1000:a1bd Code1 LAB_1000_a1bd +1000:a1c3 FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a1ca FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a1dd FUN_1000_9f73 CONDITIONAL_JUMP 0 true 1000:a1e6 Code1 LAB_1000_a1e6 +1000:a1ec FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a1f7 FUN_1000_9f73 READ 0 true 1028:085b Data6 DAT_1028_085b +1000:a1fb FUN_1000_9f73 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:a200 FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a20f FUN_1000_9f73 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:a214 FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a22f FUN_1000_9f73 DATA 0 true Stack[-0x20] - +1000:a233 FUN_1000_9f73 DATA 0 true Stack[-0x22] - +1000:a23c FUN_1000_9f73 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:a241 FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a248 FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a253 FUN_1000_9f73 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:a258 FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a279 FUN_1000_9f73 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:a27e FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a285 FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a290 FUN_1000_9f73 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:a295 FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a2b6 FUN_1000_9f73 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:a2bb FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a2c9 FUN_1000_9f73 CONDITIONAL_JUMP 0 true 1000:a2ea Code1 LAB_1000_a2ea +1000:a2d1 FUN_1000_9f73 CONDITIONAL_JUMP 0 true 1000:a2db Code1 LAB_1000_a2db +1000:a2d9 FUN_1000_9f73 UNCONDITIONAL_JUMP 0 true 1000:a2ea Code1 LAB_1000_a2ea +1000:a2de FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a2ea FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a2f1 FUN_1000_9f73 DATA 0 true Stack[-0x20] - +1000:a2f5 FUN_1000_9f73 DATA 0 true Stack[-0x22] - +1000:a30e FUN_1000_9f73 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:a313 FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a31e FUN_1000_9f73 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:a323 FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a32e FUN_1000_9f73 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:a333 FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a33e FUN_1000_9f73 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:a343 FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a34a FUN_1000_9f73 UNCONDITIONAL_CALL 0 true 1228:0168 EXTERNAL DELETEOBJECT DELETEOBJECT +1000:a34f FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a356 FUN_1000_9f73 UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1000:a35b FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a362 FUN_1000_9f73 UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1000:a367 FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a36e FUN_1000_9f73 UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1000:a373 FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a37e FUN_1000_9f73 DATA 1 true Stack[0x4] - +1000:a385 FUN_1000_9f73 UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:a391 FUN_1000_a38e DATA 1 true Stack[0x4] - +1000:a39c FUN_1000_a38e DATA 1 true Stack[0x4] - +1000:a3a5 FUN_1000_a38e UNCONDITIONAL_CALL 0 true 1228:01c4 EXTERNAL GETCLIENTRECT GETCLIENTRECT +1000:a3aa FUN_1000_a38e DATA 1 true Stack[0x4] - +1000:a3b5 FUN_1000_a38e UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:a3ba FUN_1000_a38e DATA 1 true Stack[0x4] - +1000:a3c5 FUN_1000_a38e UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1000:a3ca FUN_1000_a38e DATA 1 true Stack[0x4] - +1000:a3d5 FUN_1000_a38e UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1000:a3da FUN_1000_a38e DATA 1 true Stack[0x4] - +1000:a3e1 FUN_1000_a38e DATA 0 true Stack[-0xc] - +1000:a3e5 FUN_1000_a38e UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1000:a3ea FUN_1000_a38e DATA 1 true Stack[0x4] - +1000:a3f9 FUN_1000_a38e UNCONDITIONAL_CALL 0 true 1228:0158 EXTERNAL CREATECOMPATIBLEBITMAP CREATECOMPATIBLEBITMAP +1000:a3fe FUN_1000_a38e DATA 1 true Stack[0x4] - +1000:a405 FUN_1000_a38e DATA 1 true Stack[0x4] - +1000:a421 FUN_1000_a38e UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:a42c FUN_1000_a38e DATA 1 true Stack[0x4] - +1000:a452 FUN_1000_a38e UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:a45d FUN_1000_a38e DATA 1 true Stack[0x4] - +1000:a47e FUN_1000_a38e DATA 1 true Stack[0x4] - +1000:a48b FUN_1000_a38e DATA 1 true Stack[0x4] - +1000:a4a2 FUN_1000_a38e DATA 1 true Stack[0x4] - +1000:a4bb FUN_1000_a38e DATA 1 true Stack[0x4] - +1000:a4da FUN_1000_a38e DATA 1 true Stack[0x4] - +1000:a4e1 FUN_1000_a38e READ 0 true 1028:085b Data6 DAT_1028_085b +1000:a4e5 FUN_1000_a38e UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:a4ea FUN_1000_a38e DATA 1 true Stack[0x4] - +1000:a4f9 FUN_1000_a38e UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:a4fe FUN_1000_a38e DATA 1 true Stack[0x4] - +1000:a519 FUN_1000_a38e DATA 0 true Stack[-0x20] - +1000:a51d FUN_1000_a38e DATA 0 true Stack[-0x22] - +1000:a526 FUN_1000_a38e UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:a52b FUN_1000_a38e DATA 1 true Stack[0x4] - +1000:a539 FUN_1000_a38e CONDITIONAL_JUMP 0 true 1000:a55a Code1 LAB_1000_a55a +1000:a541 FUN_1000_a38e CONDITIONAL_JUMP 0 true 1000:a54b Code1 LAB_1000_a54b +1000:a549 FUN_1000_a38e UNCONDITIONAL_JUMP 0 true 1000:a55a Code1 LAB_1000_a55a +1000:a54e FUN_1000_a38e DATA 1 true Stack[0x4] - +1000:a55a FUN_1000_a38e DATA 0 true Stack[0x6] - +1000:a55e FUN_1000_a38e CONDITIONAL_JUMP 0 true 1000:a589 Code1 LAB_1000_a589 +1000:a560 FUN_1000_a38e DATA 1 true Stack[0x4] - +1000:a584 FUN_1000_a38e UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:a589 FUN_1000_a38e DATA 1 true Stack[0x4] - +1000:a594 FUN_1000_a38e UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:a599 FUN_1000_a38e DATA 1 true Stack[0x4] - +1000:a5a4 FUN_1000_a38e UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:a5a9 FUN_1000_a38e DATA 1 true Stack[0x4] - +1000:a5b4 FUN_1000_a38e UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:a5b9 FUN_1000_a38e DATA 1 true Stack[0x4] - +1000:a5c0 FUN_1000_a38e UNCONDITIONAL_CALL 0 true 1228:0168 EXTERNAL DELETEOBJECT DELETEOBJECT +1000:a5c5 FUN_1000_a38e DATA 1 true Stack[0x4] - +1000:a5cc FUN_1000_a38e UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1000:a5d1 FUN_1000_a38e DATA 1 true Stack[0x4] - +1000:a5d8 FUN_1000_a38e UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1000:a5dd FUN_1000_a38e DATA 1 true Stack[0x4] - +1000:a5e4 FUN_1000_a38e UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1000:a5e9 FUN_1000_a38e DATA 1 true Stack[0x4] - +1000:a5f4 FUN_1000_a38e DATA 1 true Stack[0x4] - +1000:a5fb FUN_1000_a38e UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:a608 FUN_1000_a604 DATA 1 true Stack[0x4] - +1000:a613 FUN_1000_a604 UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:a618 FUN_1000_a604 DATA 0 true Stack[-0x20] - +1000:a61b FUN_1000_a604 DATA 0 true Stack[-0x16] - +1000:a620 FUN_1000_a604 DATA 0 true Stack[-0x14] - +1000:a625 FUN_1000_a604 UNCONDITIONAL_JUMP 0 true 1000:a62f Code1 LAB_1000_a62f +1000:a627 FUN_1000_a604 DATA 0 true Stack[-0x16] - +1000:a62b FUN_1000_a604 DATA 0 true Stack[-0x14] - +1000:a62f FUN_1000_a604 DATA 1 true Stack[-0x16] - +1000:a632 FUN_1000_a604 DATA 1 true Stack[-0x14] - +1000:a640 FUN_1000_a604 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:a64b FUN_1000_a604 DATA 0 true Stack[-0x18] - +1000:a64e FUN_1000_a604 DATA 1 true Stack[-0x18] - +1000:a654 FUN_1000_a604 DATA 0 true Stack[-0x1c] - +1000:a657 FUN_1000_a604 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:a663 FUN_1000_a604 DATA 0 true Stack[-0x1a] - +1000:a666 FUN_1000_a604 DATA 1 true Stack[-0x1a] - +1000:a66c FUN_1000_a604 DATA 0 true Stack[-0x1e] - +1000:a66f FUN_1000_a604 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:a67d FUN_1000_a604 DATA 1 true Stack[-0x14] - +1000:a680 FUN_1000_a604 CONDITIONAL_JUMP 0 true 1000:a689 Code1 LAB_1000_a689 +1000:a682 FUN_1000_a604 CONDITIONAL_JUMP 0 true 1000:a6a9 Code1 LAB_1000_a6a9 +1000:a684 FUN_1000_a604 DATA 1 true Stack[-0x16] - +1000:a687 FUN_1000_a604 CONDITIONAL_JUMP 0 true 1000:a6a9 Code1 LAB_1000_a6a9 +1000:a689 FUN_1000_a604 DATA 0 true Stack[-0x20] - +1000:a68c FUN_1000_a604 DATA 0 true Stack[-0x18] - +1000:a68f FUN_1000_a604 DATA 0 true Stack[-0x1a] - +1000:a692 FUN_1000_a604 DATA 1 true Stack[-0x1c] - +1000:a695 FUN_1000_a604 DATA 1 true Stack[-0x18] - +1000:a69a FUN_1000_a604 DATA 1 true Stack[-0x1e] - +1000:a69d FUN_1000_a604 DATA 1 true Stack[-0x1a] - +1000:a6a2 FUN_1000_a604 UNCONDITIONAL_CALL 0 true 1008:0837 Code2 FUN_1008_0837 FUN_1008_0837 +1000:a6a7 FUN_1000_a604 UNCONDITIONAL_JUMP 0 true 1000:a6c7 Code1 LAB_1000_a6c7 +1000:a6a9 FUN_1000_a604 DATA 0 true Stack[-0x20] - +1000:a6ac FUN_1000_a604 DATA 0 true Stack[-0x18] - +1000:a6af FUN_1000_a604 DATA 0 true Stack[-0x1a] - +1000:a6b2 FUN_1000_a604 DATA 1 true Stack[-0x1c] - +1000:a6b5 FUN_1000_a604 DATA 1 true Stack[-0x18] - +1000:a6ba FUN_1000_a604 DATA 1 true Stack[-0x1e] - +1000:a6bd FUN_1000_a604 DATA 1 true Stack[-0x1a] - +1000:a6c2 FUN_1000_a604 UNCONDITIONAL_CALL 0 true 1008:08bb Code2 FUN_1008_08bb FUN_1008_08bb +1000:a6c7 FUN_1000_a604 DATA 0 true Stack[-0x20] - +1000:a6ca FUN_1000_a604 DATA 0 true Stack[-0x18] - +1000:a6cd FUN_1000_a604 DATA 0 true Stack[-0x1a] - +1000:a6d0 FUN_1000_a604 DATA 1 true Stack[-0x1c] - +1000:a6d3 FUN_1000_a604 DATA 1 true Stack[-0x18] - +1000:a6d8 FUN_1000_a604 DATA 1 true Stack[-0x1e] - +1000:a6db FUN_1000_a604 DATA 1 true Stack[-0x1a] - +1000:a6e0 FUN_1000_a604 UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1000:a6e5 FUN_1000_a604 DATA 0 true Stack[-0x14] - +1000:a6e9 FUN_1000_a604 CONDITIONAL_JUMP 0 true 1000:a6ee Code1 LAB_1000_a6ee +1000:a6eb FUN_1000_a604 UNCONDITIONAL_JUMP 0 true 1000:a627 Code1 LAB_1000_a627 +1000:a6ee FUN_1000_a604 DATA 0 true Stack[-0x16] - +1000:a6f2 FUN_1000_a604 CONDITIONAL_JUMP 0 true 1000:a6f7 Code1 LAB_1000_a6f7 +1000:a6f4 FUN_1000_a604 UNCONDITIONAL_JUMP 0 true 1000:a627 Code1 LAB_1000_a627 +1000:a6f7 FUN_1000_a604 DATA 1 true Stack[0x4] - +1000:a702 FUN_1000_a604 DATA 0 true Stack[-0x20] - +1000:a705 FUN_1000_a604 UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:a711 FUN_1000_a70e WRITE 0 true 1028:07d0 Data6 DAT_1028_07d0 +1000:a716 FUN_1000_a70e DATA 1 true Stack[0x4] - +1000:a723 FUN_1000_a70e WRITE 0 true 1028:07c9 Data6 DAT_1028_07c9 +1000:a730 FUN_1000_a72c DATA 0 true Stack[-0x3] - +1000:a734 FUN_1000_a72c UNCONDITIONAL_JUMP 0 true 1000:a739 Code1 LAB_1000_a739 +1000:a736 FUN_1000_a72c DATA 0 true Stack[-0x3] - +1000:a739 FUN_1000_a72c DATA 1 true Stack[-0x3] - +1000:a73f FUN_1000_a72c DATA 1 true Stack[0x4] - +1000:a743 FUN_1000_a72c UNCONDITIONAL_CALL 0 true 1000:7e12 Code1 FUN_1000_7e12 FUN_1000_7e12 +1000:a748 FUN_1000_a72c DATA 0 true Stack[-0x4] - +1000:a74c FUN_1000_a72c UNCONDITIONAL_JUMP 0 true 1000:a751 Code1 LAB_1000_a751 +1000:a74e FUN_1000_a72c DATA 0 true Stack[-0x4] - +1000:a751 FUN_1000_a72c DATA 1 true Stack[-0x3] - +1000:a759 FUN_1000_a72c READ 1 true 1028:09f1 Data6 DAT_1028_09f1 +1000:a75d FUN_1000_a72c DATA 1 true Stack[-0x3] - +1000:a766 FUN_1000_a72c DATA 1 true Stack[-0x4] - +1000:a76f FUN_1000_a72c DATA 1 true Stack[0x4] - +1000:a77f FUN_1000_a72c DATA 0 true Stack[-0x4] - +1000:a783 FUN_1000_a72c CONDITIONAL_JUMP 0 true 1000:a74e Code1 LAB_1000_a74e +1000:a785 FUN_1000_a72c DATA 0 true Stack[-0x3] - +1000:a789 FUN_1000_a72c CONDITIONAL_JUMP 0 true 1000:a736 Code1 LAB_1000_a736 +1000:a78b FUN_1000_a72c DATA 0 true Stack[-0x3] - +1000:a78f FUN_1000_a72c UNCONDITIONAL_JUMP 0 true 1000:a794 Code1 LAB_1000_a794 +1000:a791 FUN_1000_a72c DATA 0 true Stack[-0x3] - +1000:a794 FUN_1000_a72c DATA 1 true Stack[-0x3] - +1000:a79d FUN_1000_a72c DATA 1 true Stack[0x4] - +1000:a7a1 FUN_1000_a72c UNCONDITIONAL_CALL 0 true 1000:b3f3 Code1 FUN_1000_b3f3 FUN_1000_b3f3 +1000:a7a6 FUN_1000_a72c DATA 0 true Stack[-0x3] - +1000:a7aa FUN_1000_a72c CONDITIONAL_JUMP 0 true 1000:a791 Code1 LAB_1000_a791 +1000:a7b0 FUN_1000_a72c DATA 1 true Stack[0x4] - +1000:a7b4 FUN_1000_a72c UNCONDITIONAL_CALL 0 true 1000:bda2 Code1 FUN_1000_bda2 FUN_1000_bda2 +1000:a7b9 FUN_1000_a72c WRITE 0 true 1028:0874 Data6 DAT_1028_0874 +1000:a7be FUN_1000_a72c DATA 0 true Stack[-0x3] - +1000:a7c2 FUN_1000_a72c UNCONDITIONAL_JUMP 0 true 1000:a7c7 Code1 LAB_1000_a7c7 +1000:a7c4 FUN_1000_a72c DATA 0 true Stack[-0x3] - +1000:a7c7 FUN_1000_a72c DATA 1 true Stack[-0x3] - +1000:a7ca FUN_1000_a72c READ 1 true 1028:07d0 Data6 DAT_1028_07d0 +1000:a7ce FUN_1000_a72c CONDITIONAL_JUMP 0 true 1000:a7d3 Code1 LAB_1000_a7d3 +1000:a7d0 FUN_1000_a72c UNCONDITIONAL_JUMP 0 true 1000:a8b5 Code1 LAB_1000_a8b5 +1000:a7d3 FUN_1000_a72c DATA 1 true Stack[-0x3] - +1000:a7d6 FUN_1000_a72c WRITE 0 true 1028:07d1 Data6 DAT_1028_07d1 +1000:a7d9 FUN_1000_a72c DATA 1 true Stack[-0x3] - +1000:a7e5 FUN_1000_a72c WRITE 0 true 1028:0986 Data6 DAT_1028_0986 +1000:a7e9 FUN_1000_a72c WRITE 0 true 1028:0988 Data6 DAT_1028_0988 +1000:a7ed FUN_1000_a72c DATA 1 true Stack[-0x3] - +1000:a7f9 FUN_1000_a72c WRITE 0 true 1028:0996 Data6 DAT_1028_0996 +1000:a7fd FUN_1000_a72c WRITE 0 true 1028:0998 Data6 DAT_1028_0998 +1000:a801 FUN_1000_a72c DATA 1 true Stack[-0x3] - +1000:a808 FUN_1000_a72c WRITE 0 true 1028:09a3 Data6 DAT_1028_09a3 +1000:a80d FUN_1000_a72c DATA 1 true Stack[-0x3] - +1000:a818 FUN_1000_a72c WRITE 0 true 1028:09a8 Data6 DAT_1028_09a8 +1000:a820 FUN_1000_a72c DATA 1 true Stack[0x4] - +1000:a824 FUN_1000_a72c UNCONDITIONAL_CALL 0 true 1000:bc36 Code1 FUN_1000_bc36 FUN_1000_bc36 +1000:a829 FUN_1000_a72c DATA 1 true Stack[-0x3] - +1000:a830 FUN_1000_a72c WRITE 0 true 1028:0818 Data6 DAT_1028_0818 +1000:a835 FUN_1000_a72c DATA 0 true Stack[-0x3] - +1000:a839 FUN_1000_a72c CONDITIONAL_JUMP 0 true 1000:a84c Code1 LAB_1000_a84c +1000:a83b FUN_1000_a72c DATA 1 true Stack[-0x3] - +1000:a844 FUN_1000_a72c WRITE 0 true 1028:0823 Data6 DAT_1028_0823 +1000:a84a FUN_1000_a72c UNCONDITIONAL_JUMP 0 true 1000:a85b Code1 LAB_1000_a85b +1000:a84c FUN_1000_a72c DATA 1 true Stack[-0x3] - +1000:a855 FUN_1000_a72c WRITE 0 true 1028:0823 Data6 DAT_1028_0823 +1000:a85b FUN_1000_a72c DATA 1 true Stack[0x4] - +1000:a85f FUN_1000_a72c UNCONDITIONAL_CALL 0 true 1000:a604 Code1 FUN_1000_a604 FUN_1000_a604 +1000:a864 FUN_1000_a72c DATA 1 true Stack[-0x3] - +1000:a86e FUN_1000_a72c WRITE 0 true 1028:083d Data6 DAT_1028_083d +1000:a874 FUN_1000_a72c WRITE 0 true 1028:083f Data6 DAT_1028_083f +1000:a87a FUN_1000_a72c DATA 1 true Stack[-0x3] - +1000:a881 FUN_1000_a72c WRITE 0 true 1028:081c Data6 DAT_1028_081c +1000:a886 FUN_1000_a72c DATA 0 true Stack[-0x4] - +1000:a88a FUN_1000_a72c UNCONDITIONAL_JUMP 0 true 1000:a88f Code1 LAB_1000_a88f +1000:a88c FUN_1000_a72c DATA 0 true Stack[-0x4] - +1000:a88f FUN_1000_a72c DATA 1 true Stack[-0x4] - +1000:a896 FUN_1000_a72c DATA 1 true Stack[-0x3] - +1000:a89e FUN_1000_a72c DATA 1 true Stack[0x4] - +1000:a8af FUN_1000_a72c DATA 0 true Stack[-0x4] - +1000:a8b3 FUN_1000_a72c CONDITIONAL_JUMP 0 true 1000:a88c Code1 LAB_1000_a88c +1000:a8b5 FUN_1000_a72c DATA 0 true Stack[-0x3] - +1000:a8b9 FUN_1000_a72c CONDITIONAL_JUMP 0 true 1000:a8be Code1 LAB_1000_a8be +1000:a8bb FUN_1000_a72c UNCONDITIONAL_JUMP 0 true 1000:a7c4 Code1 LAB_1000_a7c4 +1000:a8be FUN_1000_a72c WRITE 0 true 1028:07d1 Data6 DAT_1028_07d1 +1000:a8c3 FUN_1000_a72c WRITE 0 true 1028:07d2 Data6 DAT_1028_07d2 +1000:a8c8 FUN_1000_a72c DATA 0 true Stack[-0x4] - +1000:a8cc FUN_1000_a72c UNCONDITIONAL_JUMP 0 true 1000:a8d1 Code1 LAB_1000_a8d1 +1000:a8ce FUN_1000_a72c DATA 0 true Stack[-0x4] - +1000:a8d1 FUN_1000_a72c DATA 1 true Stack[-0x4] - +1000:a8d7 FUN_1000_a72c DATA 1 true Stack[0x4] - +1000:a8db FUN_1000_a72c UNCONDITIONAL_CALL 0 true 1000:7e92 Code1 FUN_1000_7e92 FUN_1000_7e92 +1000:a8e0 FUN_1000_a72c DATA 0 true Stack[-0x4] - +1000:a8e4 FUN_1000_a72c CONDITIONAL_JUMP 0 true 1000:a8ce Code1 LAB_1000_a8ce +1000:a8f5 FUN_1000_a8ea UNCONDITIONAL_CALL 0 true 1228:0050 EXTERNAL _LCREAT _LCREAT +1000:a8fa FUN_1000_a8ea DATA 0 true Stack[-0x6] - +1000:a8fd FUN_1000_a8ea DATA 0 true Stack[-0x6] - +1000:a901 FUN_1000_a8ea CONDITIONAL_JUMP 0 true 1000:a906 Code1 LAB_1000_a906 +1000:a903 FUN_1000_a8ea UNCONDITIONAL_JUMP 0 true 1000:a998 Code1 LAB_1000_a998 +1000:a906 FUN_1000_a8ea DATA 0 true Stack[-0x10a] - +1000:a911 FUN_1000_a8ea UNCONDITIONAL_CALL 0 true 1020:16c9 Code5 FUN_1020_16c9 FUN_1020_16c9 +1000:a916 FUN_1000_a8ea DATA 0 true Stack[-0x4] - +1000:a91b FUN_1000_a8ea UNCONDITIONAL_JUMP 0 true 1000:a920 Code1 LAB_1000_a920 +1000:a91d FUN_1000_a8ea DATA 0 true Stack[-0x4] - +1000:a920 FUN_1000_a8ea DATA 1 true Stack[-0x4] - +1000:a926 FUN_1000_a8ea READ 1 true 1028:087e Data6 DAT_1028_087e +1000:a926 FUN_1000_a8ea READ 1 false 1028:0882 Data6 DAT_1028_0882 +1000:a92a FUN_1000_a8ea READ 1 true 1028:0880 Data6 DAT_1028_0880 +1000:a92a FUN_1000_a8ea READ 1 false 1028:0884 Data6 DAT_1028_0884 +1000:a92e FUN_1000_a8ea READ 1 true 1028:0010 Data6 s_IWIKTDK_Highscores_1028_0010 +1000:a932 FUN_1000_a8ea READ 1 true 1028:0012 Data6 s_IKTDK_Highscores_1028_0010+2 +1000:a936 FUN_1000_a8ea DATA 1 true Stack[-0x4] - +1000:a942 FUN_1000_a8ea DATA 1 true Stack[-0x4] - +1000:a946 FUN_1000_a8ea DATA 0 true Stack[-0x10a] - +1000:a94c FUN_1000_a8ea DATA 1 true Stack[-0x4] - +1000:a956 FUN_1000_a8ea UNCONDITIONAL_CALL 0 true 1008:2ee5 Code2 FUN_1008_2ee5 FUN_1008_2ee5 +1000:a95b FUN_1000_a8ea DATA 0 true Stack[-0x4] - +1000:a95f FUN_1000_a8ea CONDITIONAL_JUMP 0 true 1000:a91d Code1 LAB_1000_a91d +1000:a961 FUN_1000_a8ea DATA 0 true Stack[-0x6] - +1000:a96b FUN_1000_a8ea UNCONDITIONAL_CALL 0 true 1228:0058 EXTERNAL _LWRITE _LWRITE +1000:a970 FUN_1000_a8ea DATA 0 true Stack[-0x6] - +1000:a973 FUN_1000_a8ea DATA 0 true Stack[-0x2e] - +1000:a97a FUN_1000_a8ea UNCONDITIONAL_CALL 0 true 1228:0058 EXTERNAL _LWRITE _LWRITE +1000:a97f FUN_1000_a8ea DATA 0 true Stack[-0x6] - +1000:a982 FUN_1000_a8ea DATA 0 true Stack[-0x10a] - +1000:a98b FUN_1000_a8ea UNCONDITIONAL_CALL 0 true 1228:0058 EXTERNAL _LWRITE _LWRITE +1000:a990 FUN_1000_a8ea DATA 0 true Stack[-0x6] - +1000:a993 FUN_1000_a8ea UNCONDITIONAL_CALL 0 true 1228:0048 EXTERNAL _LCLOSE _LCLOSE +1000:a9a0 FUN_1000_a99c DATA 0 true Stack[-0x7] - +1000:a9ab FUN_1000_a99c UNCONDITIONAL_CALL 0 true 1228:0054 EXTERNAL _LOPEN _LOPEN +1000:a9b0 FUN_1000_a99c DATA 0 true Stack[-0x6] - +1000:a9b3 FUN_1000_a99c DATA 0 true Stack[-0x6] - +1000:a9b7 FUN_1000_a99c CONDITIONAL_JUMP 0 true 1000:a9c8 Code1 LAB_1000_a9c8 +1000:a9c0 FUN_1000_a99c UNCONDITIONAL_CALL 0 true 1228:0054 EXTERNAL _LOPEN _LOPEN +1000:a9c5 FUN_1000_a99c DATA 0 true Stack[-0x6] - +1000:a9c8 FUN_1000_a99c DATA 0 true Stack[-0x6] - +1000:a9cc FUN_1000_a99c CONDITIONAL_JUMP 0 true 1000:a9d1 Code1 LAB_1000_a9d1 +1000:a9ce FUN_1000_a99c UNCONDITIONAL_JUMP 0 true 1000:aa68 Code1 LAB_1000_aa68 +1000:a9d1 FUN_1000_a99c DATA 0 true Stack[-0x6] - +1000:a9d4 FUN_1000_a99c DATA 0 true Stack[-0x17] - +1000:a9db FUN_1000_a99c UNCONDITIONAL_CALL 0 true 1228:004c EXTERNAL _LREAD _LREAD +1000:a9e0 FUN_1000_a99c DATA 0 true Stack[-0x13f] - +1000:a9e6 FUN_1000_a99c DATA 0 true Stack[-0x17] - +1000:a9ed FUN_1000_a99c UNCONDITIONAL_CALL 0 true 1020:0b00 Code5 FUN_1020_0b00 FUN_1020_0b00 +1000:a9f2 FUN_1000_a99c DATA 0 true Stack[-0x23f] - +1000:a9ff FUN_1000_a99c UNCONDITIONAL_CALL 0 true 1020:0b00 Code5 FUN_1020_0b00 FUN_1020_0b00 +1000:aa04 FUN_1000_a99c UNCONDITIONAL_CALL 0 true 1020:0ac3 Code5 FUN_1020_0ac3 FUN_1020_0ac3 +1000:aa09 FUN_1000_a99c CONDITIONAL_JUMP 0 true 1000:aa60 Code1 LAB_1000_aa60 +1000:aa0b FUN_1000_a99c DATA 0 true Stack[-0x7] - +1000:aa0f FUN_1000_a99c DATA 0 true Stack[-0x6] - +1000:aa12 FUN_1000_a99c DATA 0 true Stack[-0x3f] - +1000:aa19 FUN_1000_a99c UNCONDITIONAL_CALL 0 true 1228:004c EXTERNAL _LREAD _LREAD +1000:aa1e FUN_1000_a99c DATA 0 true Stack[-0x6] - +1000:aa29 FUN_1000_a99c UNCONDITIONAL_CALL 0 true 1228:004c EXTERNAL _LREAD _LREAD +1000:aa2e FUN_1000_a99c DATA 0 true Stack[-0x4] - +1000:aa33 FUN_1000_a99c UNCONDITIONAL_JUMP 0 true 1000:aa38 Code1 LAB_1000_aa38 +1000:aa35 FUN_1000_a99c DATA 0 true Stack[-0x4] - +1000:aa38 FUN_1000_a99c DATA 1 true Stack[-0x4] - +1000:aa44 FUN_1000_a99c READ 1 true 1028:0010 Data6 s_IWIKTDK_Highscores_1028_0010 +1000:aa48 FUN_1000_a99c READ 1 true 1028:0012 Data6 s_IKTDK_Highscores_1028_0010+2 +1000:aa4c FUN_1000_a99c DATA 1 true Stack[-0x4] - +1000:aa52 FUN_1000_a99c WRITE 0 true 1028:087e Data6 DAT_1028_087e +1000:aa52 FUN_1000_a99c WRITE 0 false 1028:0882 Data6 DAT_1028_0882 +1000:aa56 FUN_1000_a99c WRITE 0 true 1028:0880 Data6 DAT_1028_0880 +1000:aa56 FUN_1000_a99c WRITE 0 false 1028:0884 Data6 DAT_1028_0884 +1000:aa5a FUN_1000_a99c DATA 0 true Stack[-0x4] - +1000:aa5e FUN_1000_a99c CONDITIONAL_JUMP 0 true 1000:aa35 Code1 LAB_1000_aa35 +1000:aa60 FUN_1000_a99c DATA 0 true Stack[-0x6] - +1000:aa63 FUN_1000_a99c UNCONDITIONAL_CALL 0 true 1228:0048 EXTERNAL _LCLOSE _LCLOSE +1000:aa68 FUN_1000_a99c DATA 0 true Stack[-0x7] - +1000:aa6c FUN_1000_a99c CONDITIONAL_JUMP 0 true 1000:aa71 Code1 LAB_1000_aa71 +1000:aa6e FUN_1000_a99c UNCONDITIONAL_JUMP 0 true 1000:ab38 Code1 LAB_1000_ab38 +1000:aa71 FUN_1000_a99c DATA 0 true Stack[-0x4] - +1000:aa76 FUN_1000_a99c UNCONDITIONAL_JUMP 0 true 1000:aa7b Code1 LAB_1000_aa7b +1000:aa78 FUN_1000_a99c DATA 0 true Stack[-0x4] - +1000:aa7e FUN_1000_a99c DATA 1 true Stack[-0x4] - +1000:aa89 FUN_1000_a99c UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:aa8e FUN_1000_a99c DATA 1 true Stack[-0x4] - +1000:aa94 FUN_1000_a99c WRITE 0 true 1028:087e Data6 DAT_1028_087e +1000:aa98 FUN_1000_a99c WRITE 0 true 1028:0880 Data6 DAT_1028_0880 +1000:aa9c FUN_1000_a99c DATA 0 true Stack[-0x4] - +1000:aaa0 FUN_1000_a99c CONDITIONAL_JUMP 0 true 1000:aa78 Code1 LAB_1000_aa78 +1000:aaac FUN_1000_a99c UNCONDITIONAL_CALL 0 true 1008:2ee5 Code2 FUN_1008_2ee5 FUN_1008_2ee5 +1000:aabb FUN_1000_a99c UNCONDITIONAL_CALL 0 true 1008:2ee5 Code2 FUN_1008_2ee5 FUN_1008_2ee5 +1000:aaca FUN_1000_a99c UNCONDITIONAL_CALL 0 true 1008:2ee5 Code2 FUN_1008_2ee5 FUN_1008_2ee5 +1000:aad9 FUN_1000_a99c UNCONDITIONAL_CALL 0 true 1008:2ee5 Code2 FUN_1008_2ee5 FUN_1008_2ee5 +1000:aae8 FUN_1000_a99c UNCONDITIONAL_CALL 0 true 1008:2ee5 Code2 FUN_1008_2ee5 FUN_1008_2ee5 +1000:aaf7 FUN_1000_a99c UNCONDITIONAL_CALL 0 true 1008:2ee5 Code2 FUN_1008_2ee5 FUN_1008_2ee5 +1000:ab06 FUN_1000_a99c UNCONDITIONAL_CALL 0 true 1008:2ee5 Code2 FUN_1008_2ee5 FUN_1008_2ee5 +1000:ab15 FUN_1000_a99c UNCONDITIONAL_CALL 0 true 1008:2ee5 Code2 FUN_1008_2ee5 FUN_1008_2ee5 +1000:ab24 FUN_1000_a99c UNCONDITIONAL_CALL 0 true 1008:2ee5 Code2 FUN_1008_2ee5 FUN_1008_2ee5 +1000:ab33 FUN_1000_a99c UNCONDITIONAL_CALL 0 true 1008:2ee5 Code2 FUN_1008_2ee5 FUN_1008_2ee5 +1000:ab3f FUN_1000_ab3c READ 0 true 1028:07d2 Data6 DAT_1028_07d2 +1000:ab44 FUN_1000_ab3c CONDITIONAL_JUMP 0 true 1000:ab9c Code1 LAB_1000_ab9c +1000:ab46 FUN_1000_ab3c READ 1 true 1028:07d2 Data6 DAT_1028_07d2 +1000:ab59 FUN_1000_ab3c UNCONDITIONAL_CALL 0 true 1008:2ee5 Code2 FUN_1008_2ee5 FUN_1008_2ee5 +1000:ab5e FUN_1000_ab3c DATA 1 true Stack[0x4] - +1000:ab71 FUN_1000_ab3c READ 1 true 1028:07d2 Data6 DAT_1028_07d2 +1000:ab89 FUN_1000_ab3c UNCONDITIONAL_CALL 0 true 1008:1607 Code2 FUN_1008_1607 FUN_1008_1607 +1000:ab90 FUN_1000_ab3c READ 1 true 1028:064e Data6 DAT_1028_064e +1000:ab9c FUN_1000_ab3c DATA 1 true Stack[0x4] - +1000:abb2 FUN_1000_ab3c UNCONDITIONAL_CALL 0 true 1000:5aea Code1 FUN_1000_5aea FUN_1000_5aea +1000:abb9 FUN_1000_ab3c READ 1 true 1028:064e Data6 DAT_1028_064e +1000:abc5 FUN_1000_ab3c DATA 1 true Stack[0x4] - +1000:abdc FUN_1000_ab3c UNCONDITIONAL_CALL 0 true 1018:0e9e Code4 FUN_1018_0e9e FUN_1018_0e9e +1000:abe9 FUN_1000_abe5 DATA 0 true Stack[-0x6] - +1000:abee FUN_1000_abe5 UNCONDITIONAL_JUMP 0 true 1000:abf3 Code1 LAB_1000_abf3 +1000:abf0 FUN_1000_abe5 DATA 0 true Stack[-0x6] - +1000:abf3 FUN_1000_abe5 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:ac05 FUN_1000_abe5 DATA 1 true Stack[-0x6] - +1000:ac0b FUN_1000_abe5 READ 1 true 1028:0880 Data6 DAT_1028_0880 +1000:ac0b FUN_1000_abe5 READ 1 false 1028:0884 Data6 DAT_1028_0884 +1000:ac0f FUN_1000_abe5 CONDITIONAL_JUMP 0 true 1000:ac1f Code1 LAB_1000_ac1f +1000:ac11 FUN_1000_abe5 CONDITIONAL_JUMP 0 true 1000:ac16 Code1 LAB_1000_ac16 +1000:ac13 FUN_1000_abe5 UNCONDITIONAL_JUMP 0 true 1000:acb5 Code1 LAB_1000_acb5 +1000:ac16 FUN_1000_abe5 READ 1 true 1028:0882 Data6 DAT_1028_0882 +1000:ac1a FUN_1000_abe5 CONDITIONAL_JUMP 0 true 1000:ac1f Code1 LAB_1000_ac1f +1000:ac1c FUN_1000_abe5 UNCONDITIONAL_JUMP 0 true 1000:acb5 Code1 LAB_1000_acb5 +1000:ac1f FUN_1000_abe5 DATA 1 true Stack[-0x6] - +1000:ac23 FUN_1000_abe5 DATA 0 true Stack[-0xa] - +1000:ac29 FUN_1000_abe5 DATA 1 true Stack[-0xa] - +1000:ac2c FUN_1000_abe5 CONDITIONAL_JUMP 0 true 1000:ac7b Code1 LAB_1000_ac7b +1000:ac2e FUN_1000_abe5 DATA 0 true Stack[-0x8] - +1000:ac31 FUN_1000_abe5 UNCONDITIONAL_JUMP 0 true 1000:ac36 Code1 LAB_1000_ac36 +1000:ac33 FUN_1000_abe5 DATA 0 true Stack[-0x8] - +1000:ac36 FUN_1000_abe5 DATA 1 true Stack[-0x8] - +1000:ac3f FUN_1000_abe5 READ 1 true 1028:089e Data6 DAT_1028_089e +1000:ac3f FUN_1000_abe5 READ 1 false 1028:089a Data6 DAT_1028_089a +1000:ac43 FUN_1000_abe5 READ 1 true 1028:08a0 Data6 DAT_1028_08a0 +1000:ac43 FUN_1000_abe5 READ 1 false 1028:089c Data6 DAT_1028_089c +1000:ac47 FUN_1000_abe5 DATA 1 true Stack[-0x8] - +1000:ac4d FUN_1000_abe5 WRITE 0 true 1028:08a2 Data6 DAT_1028_08a2 +1000:ac4d FUN_1000_abe5 WRITE 0 false 1028:089e Data6 DAT_1028_089e +1000:ac51 FUN_1000_abe5 WRITE 0 true 1028:08a4 Data6 DAT_1028_08a4 +1000:ac51 FUN_1000_abe5 WRITE 0 false 1028:08a0 Data6 DAT_1028_08a0 +1000:ac55 FUN_1000_abe5 DATA 1 true Stack[-0x8] - +1000:ac62 FUN_1000_abe5 DATA 1 true Stack[-0x8] - +1000:ac6e FUN_1000_abe5 UNCONDITIONAL_CALL 0 true 1020:0891 Code5 FUN_1020_0891 FUN_1020_0891 +1000:ac73 FUN_1000_abe5 DATA 1 true Stack[-0x8] - +1000:ac76 FUN_1000_abe5 DATA 1 true Stack[-0xa] - +1000:ac79 FUN_1000_abe5 CONDITIONAL_JUMP 0 true 1000:ac33 Code1 LAB_1000_ac33 +1000:ac7b FUN_1000_abe5 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:ac8d FUN_1000_abe5 DATA 1 true Stack[-0x6] - +1000:ac93 FUN_1000_abe5 WRITE 0 true 1028:0882 Data6 DAT_1028_0882 +1000:ac97 FUN_1000_abe5 WRITE 0 true 1028:0884 Data6 DAT_1028_0884 +1000:ac9b FUN_1000_abe5 DATA 1 true Stack[-0x6] - +1000:ac9e FUN_1000_abe5 WRITE 0 true 1028:07d2 Data6 DAT_1028_07d2 +1000:aca1 FUN_1000_abe5 DATA 1 true Stack[0x4] - +1000:aca5 FUN_1000_abe5 UNCONDITIONAL_CALL 0 true 1000:ab3c Code1 FUN_1000_ab3c FUN_1000_ab3c +1000:acaa FUN_1000_abe5 DATA 1 true Stack[0x4] - +1000:acae FUN_1000_abe5 UNCONDITIONAL_CALL 0 true 1000:a8ea Code1 FUN_1000_a8ea FUN_1000_a8ea +1000:acb3 FUN_1000_abe5 UNCONDITIONAL_JUMP 0 true 1000:acbe Code1 LAB_1000_acbe +1000:acb5 FUN_1000_abe5 DATA 0 true Stack[-0x6] - +1000:acb9 FUN_1000_abe5 CONDITIONAL_JUMP 0 true 1000:acbe Code1 LAB_1000_acbe +1000:acbb FUN_1000_abe5 UNCONDITIONAL_JUMP 0 true 1000:abf0 Code1 LAB_1000_abf0 +1000:acc6 FUN_1000_acc2 DATA 1 true Stack[0x4] - +1000:acd1 FUN_1000_acc2 UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:acd6 FUN_1000_acc2 DATA 0 true Stack[-0x150] - +1000:acda FUN_1000_acc2 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:acdd FUN_1000_acc2 DATA 0 true Stack[-0x14e] - +1000:ace1 FUN_1000_acc2 READ 1 true 1028:07d0 Data6 DAT_1028_07d0 +1000:ace4 FUN_1000_acc2 DATA 0 true Stack[-0x15b] - +1000:acea FUN_1000_acc2 DATA 1 true Stack[-0x15b] - +1000:acee FUN_1000_acc2 CONDITIONAL_JUMP 0 true 1000:acf3 Code1 LAB_1000_acf3 +1000:acf0 FUN_1000_acc2 UNCONDITIONAL_JUMP 0 true 1000:ae4f Code1 LAB_1000_ae4f +1000:acf3 FUN_1000_acc2 DATA 0 true Stack[-0x14c] - +1000:acf7 FUN_1000_acc2 UNCONDITIONAL_JUMP 0 true 1000:acfd Code1 LAB_1000_acfd +1000:acf9 FUN_1000_acc2 DATA 0 true Stack[-0x14c] - +1000:acfd FUN_1000_acc2 DATA 0 true Stack[-0x150] - +1000:ad04 FUN_1000_acc2 DATA 1 true Stack[-0x14c] - +1000:ad17 FUN_1000_acc2 UNCONDITIONAL_CALL 0 true 1008:0837 Code2 FUN_1008_0837 FUN_1008_0837 +1000:ad1c FUN_1000_acc2 DATA 0 true Stack[-0x150] - +1000:ad23 FUN_1000_acc2 DATA 1 true Stack[-0x14c] - +1000:ad36 FUN_1000_acc2 UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1000:ad3b FUN_1000_acc2 DATA 1 true Stack[-0x14c] - +1000:ad3f FUN_1000_acc2 WRITE 0 true 1028:07d1 Data6 DAT_1028_07d1 +1000:ad42 FUN_1000_acc2 DATA 1 true Stack[-0x14c] - +1000:ad46 FUN_1000_acc2 DATA 1 true Stack[-0x14e] - +1000:ad4a FUN_1000_acc2 CONDITIONAL_JUMP 0 true 1000:ad4f Code1 LAB_1000_ad4f +1000:ad4c FUN_1000_acc2 UNCONDITIONAL_JUMP 0 true 1000:adf9 Code1 LAB_1000_adf9 +1000:ad53 FUN_1000_acc2 DATA 1 true Stack[0x4] - +1000:ad57 FUN_1000_acc2 UNCONDITIONAL_CALL 0 true 1000:bc36 Code1 FUN_1000_bc36 FUN_1000_bc36 +1000:ad5c FUN_1000_acc2 DATA 1 true Stack[-0x14c] - +1000:ad64 FUN_1000_acc2 READ 1 true 1028:09a2 Data6 DAT_1028_09a2 +1000:ad70 FUN_1000_acc2 DATA 1 true Stack[-0x14c] - +1000:ad7b FUN_1000_acc2 READ 1 true 1028:0992 Data6 DAT_1028_0992 +1000:ad7f FUN_1000_acc2 READ 1 true 1028:0994 Data6 DAT_1028_0994 +1000:ad83 FUN_1000_acc2 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:ad8a FUN_1000_acc2 DATA 1 true Stack[0x4] - +1000:ad8e FUN_1000_acc2 UNCONDITIONAL_CALL 0 true 1000:bda2 Code1 FUN_1000_bda2 FUN_1000_bda2 +1000:ad93 FUN_1000_acc2 DATA 0 true Stack[-0x150] - +1000:ad97 FUN_1000_acc2 DATA 1 true Stack[-0x14c] - +1000:ada1 FUN_1000_acc2 READ 0 true 1028:09a6 Data6 DAT_1028_09a6 +1000:ada5 FUN_1000_acc2 UNCONDITIONAL_CALL 0 true 1000:0002 Code1 FUN_1000_0002 FUN_1000_0002 +1000:adaa FUN_1000_acc2 DATA 0 true Stack[-0x150] - +1000:adb6 FUN_1000_acc2 UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1000:adbb FUN_1000_acc2 DATA 0 true Stack[-0x150] - +1000:adc2 FUN_1000_acc2 DATA 1 true Stack[-0x14c] - +1000:add4 FUN_1000_acc2 UNCONDITIONAL_CALL 0 true 1008:0837 Code2 FUN_1008_0837 FUN_1008_0837 +1000:add9 FUN_1000_acc2 DATA 0 true Stack[-0x150] - +1000:ade0 FUN_1000_acc2 DATA 1 true Stack[-0x14c] - +1000:adf2 FUN_1000_acc2 UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1000:adf7 FUN_1000_acc2 UNCONDITIONAL_JUMP 0 true 1000:ae42 Code1 LAB_1000_ae42 +1000:adfd FUN_1000_acc2 DATA 1 true Stack[0x4] - +1000:ae01 FUN_1000_acc2 UNCONDITIONAL_CALL 0 true 1000:bc36 Code1 FUN_1000_bc36 FUN_1000_bc36 +1000:ae06 FUN_1000_acc2 DATA 0 true Stack[-0x150] - +1000:ae0d FUN_1000_acc2 DATA 1 true Stack[-0x14c] - +1000:ae1f FUN_1000_acc2 UNCONDITIONAL_CALL 0 true 1008:08bb Code2 FUN_1008_08bb FUN_1008_08bb +1000:ae24 FUN_1000_acc2 DATA 0 true Stack[-0x150] - +1000:ae2b FUN_1000_acc2 DATA 1 true Stack[-0x14c] - +1000:ae3d FUN_1000_acc2 UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1000:ae42 FUN_1000_acc2 DATA 1 true Stack[-0x14c] - +1000:ae46 FUN_1000_acc2 DATA 1 true Stack[-0x15b] - +1000:ae4a FUN_1000_acc2 CONDITIONAL_JUMP 0 true 1000:ae4f Code1 LAB_1000_ae4f +1000:ae4c FUN_1000_acc2 UNCONDITIONAL_JUMP 0 true 1000:acf9 Code1 LAB_1000_acf9 +1000:ae4f FUN_1000_acc2 DATA 1 true Stack[-0x14e] - +1000:ae53 FUN_1000_acc2 WRITE 0 true 1028:07d1 Data6 DAT_1028_07d1 +1000:ae56 FUN_1000_acc2 DATA 1 true Stack[0x4] - +1000:ae61 FUN_1000_acc2 DATA 0 true Stack[-0x150] - +1000:ae65 FUN_1000_acc2 UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:ae72 FUN_1000_ae6e READ 0 true 1028:0874 Data6 DAT_1028_0874 +1000:ae77 FUN_1000_ae6e CONDITIONAL_JUMP 0 true 1000:ae7c Code1 LAB_1000_ae7c +1000:ae79 FUN_1000_ae6e UNCONDITIONAL_JUMP 0 true 1000:af80 Code1 LAB_1000_af80 +1000:ae7c FUN_1000_ae6e READ 0 true 1028:399a Data6 DAT_1028_399a +1000:ae81 FUN_1000_ae6e CONDITIONAL_JUMP 0 true 1000:ae86 Code1 LAB_1000_ae86 +1000:ae83 FUN_1000_ae6e UNCONDITIONAL_JUMP 0 true 1000:af80 Code1 LAB_1000_af80 +1000:ae86 FUN_1000_ae6e WRITE 0 true 1028:0874 Data6 DAT_1028_0874 +1000:ae8d FUN_1000_ae6e DATA 1 true Stack[0x4] - +1000:ae91 FUN_1000_ae6e UNCONDITIONAL_CALL 0 true 1000:a38e Code1 FUN_1000_a38e FUN_1000_a38e +1000:ae96 FUN_1000_ae6e READ 1 true 1028:3969 Data6 DAT_1028_3969 +1000:ae99 FUN_1000_ae6e READ 1 true 1028:396b Data6 DAT_1028_396b +1000:ae9d FUN_1000_ae6e WRITE 0 true 1028:07d3 Data6 DAT_1028_07d3 +1000:aea0 FUN_1000_ae6e WRITE 0 true 1028:07d5 Data6 DAT_1028_07d5 +1000:aea4 FUN_1000_ae6e READ 1 true 1028:396d Data6 DAT_1028_396d +1000:aea7 FUN_1000_ae6e READ 1 true 1028:396f Data6 DAT_1028_396f +1000:aeab FUN_1000_ae6e WRITE 0 true 1028:07d7 Data6 DAT_1028_07d7 +1000:aeae FUN_1000_ae6e WRITE 0 true 1028:07d9 Data6 DAT_1028_07d9 +1000:aeb2 FUN_1000_ae6e READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:aeb5 FUN_1000_ae6e READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:aeb9 FUN_1000_ae6e DATA 1 true Stack[0x4] - +1000:aeca FUN_1000_ae6e READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:aecd FUN_1000_ae6e READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:aedb FUN_1000_ae6e READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:aeee FUN_1000_ae6e DATA 1 true Stack[0x4] - +1000:aef2 FUN_1000_ae6e UNCONDITIONAL_CALL 0 true 1000:b3f3 Code1 FUN_1000_b3f3 FUN_1000_b3f3 +1000:aefb FUN_1000_ae6e DATA 1 true Stack[0x4] - +1000:aeff FUN_1000_ae6e UNCONDITIONAL_CALL 0 true 1000:bdde Code1 FUN_1000_bdde FUN_1000_bdde +1000:af04 FUN_1000_ae6e DATA 1 true Stack[0x4] - +1000:af1f FUN_1000_ae6e UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:af2d FUN_1000_ae6e UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:af32 FUN_1000_ae6e UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:af37 FUN_1000_ae6e DATA 1 true Stack[0x4] - +1000:af6b FUN_1000_ae6e WRITE 0 true 1028:399a Data6 DAT_1028_399a +1000:af6e FUN_1000_ae6e WRITE 0 true 1028:0875 Data6 DAT_1028_0875 +1000:af73 FUN_1000_ae6e WRITE 0 true 1028:41f9 Data6 DAT_1028_41f9 +1000:af7d FUN_1000_ae6e UNCONDITIONAL_JUMP 0 true 1000:b2c4 Code1 LAB_1000_b2c4 +1000:af80 FUN_1000_ae6e WRITE 0 true 1028:0875 Data6 DAT_1028_0875 +1000:af87 FUN_1000_ae6e UNCONDITIONAL_CALL 0 true 1008:0002 Code2 FUN_1008_0002 FUN_1008_0002 +1000:af8e FUN_1000_ae6e DATA 1 true Stack[0x4] - +1000:af92 FUN_1000_ae6e UNCONDITIONAL_CALL 0 true 1000:a38e Code1 FUN_1000_a38e FUN_1000_a38e +1000:af97 FUN_1000_ae6e READ 0 true 1028:0874 Data6 DAT_1028_0874 +1000:af9c FUN_1000_ae6e CONDITIONAL_JUMP 0 true 1000:afab Code1 LAB_1000_afab +1000:af9e FUN_1000_ae6e DATA 1 true Stack[0x4] - +1000:afab FUN_1000_ae6e DATA 1 true Stack[0x4] - +1000:afb8 FUN_1000_ae6e READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:afc6 FUN_1000_ae6e CONDITIONAL_JUMP 0 true 1000:afed Code1 LAB_1000_afed +1000:afc8 FUN_1000_ae6e DATA 1 true Stack[0x4] - +1000:afdb FUN_1000_ae6e DATA 1 true Stack[0x4] - +1000:afdf FUN_1000_ae6e UNCONDITIONAL_CALL 0 true 1000:a99c Code1 FUN_1000_a99c FUN_1000_a99c +1000:afe4 FUN_1000_ae6e DATA 1 true Stack[0x4] - +1000:afe8 FUN_1000_ae6e UNCONDITIONAL_CALL 0 true 1000:abe5 Code1 FUN_1000_abe5 FUN_1000_abe5 +1000:afed FUN_1000_ae6e DATA 1 true Stack[0x4] - +1000:b009 FUN_1000_ae6e DATA 0 true Stack[-0x4] - +1000:b00d FUN_1000_ae6e UNCONDITIONAL_JUMP 0 true 1000:b012 Code1 LAB_1000_b012 +1000:b00f FUN_1000_ae6e DATA 0 true Stack[-0x4] - +1000:b012 FUN_1000_ae6e DATA 1 true Stack[-0x4] - +1000:b01a FUN_1000_ae6e READ 1 true 1028:09e2 Data6 DAT_1028_09e2 +1000:b01a FUN_1000_ae6e READ 1 false 1028:0a35 Data6 DAT_1028_0a35 +1000:b01e FUN_1000_ae6e DATA 1 true Stack[-0x4] - +1000:b025 FUN_1000_ae6e READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b02e FUN_1000_ae6e DATA 1 true Stack[0x4] - +1000:b03d FUN_1000_ae6e DATA 1 true Stack[-0x4] - +1000:b045 FUN_1000_ae6e READ 1 true 1028:09f1 Data6 DAT_1028_09f1 +1000:b049 FUN_1000_ae6e DATA 1 true Stack[-0x4] - +1000:b052 FUN_1000_ae6e READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b05b FUN_1000_ae6e DATA 1 true Stack[0x4] - +1000:b06b FUN_1000_ae6e DATA 0 true Stack[-0x4] - +1000:b06f FUN_1000_ae6e CONDITIONAL_JUMP 0 true 1000:b00f Code1 LAB_1000_b00f +1000:b071 FUN_1000_ae6e READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b074 FUN_1000_ae6e DATA 0 true Stack[-0x3] - +1000:b077 FUN_1000_ae6e READ 1 true 1028:07d0 Data6 DAT_1028_07d0 +1000:b07e FUN_1000_ae6e READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b088 FUN_1000_ae6e WRITE 0 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b08b FUN_1000_ae6e READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b099 FUN_1000_ae6e CONDITIONAL_JUMP 0 true 1000:b0a3 Code1 LAB_1000_b0a3 +1000:b09b FUN_1000_ae6e READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b09e FUN_1000_ae6e DATA 1 true Stack[-0x3] - +1000:b0a1 FUN_1000_ae6e CONDITIONAL_JUMP 0 true 1000:b077 Code1 LAB_1000_b077 +1000:b0a3 FUN_1000_ae6e READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b0b1 FUN_1000_ae6e CONDITIONAL_JUMP 0 true 1000:b0b6 Code1 LAB_1000_b0b6 +1000:b0b3 FUN_1000_ae6e UNCONDITIONAL_JUMP 0 true 1000:b293 Code1 LAB_1000_b293 +1000:b0b6 FUN_1000_ae6e DATA 0 true Stack[-0x4] - +1000:b0ba FUN_1000_ae6e UNCONDITIONAL_JUMP 0 true 1000:b0bf Code1 LAB_1000_b0bf +1000:b0bc FUN_1000_ae6e DATA 0 true Stack[-0x4] - +1000:b0bf FUN_1000_ae6e DATA 1 true Stack[-0x4] - +1000:b0c6 FUN_1000_ae6e READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b0cf FUN_1000_ae6e DATA 1 true Stack[0x4] - +1000:b0de FUN_1000_ae6e DATA 1 true Stack[-0x4] - +1000:b0e6 FUN_1000_ae6e WRITE 0 true 1028:09e2 Data6 DAT_1028_09e2 +1000:b0e6 FUN_1000_ae6e WRITE 0 false 1028:0a35 Data6 DAT_1028_0a35 +1000:b0ea FUN_1000_ae6e DATA 1 true Stack[-0x4] - +1000:b0f3 FUN_1000_ae6e READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b0fc FUN_1000_ae6e DATA 1 true Stack[0x4] - +1000:b10c FUN_1000_ae6e DATA 1 true Stack[-0x4] - +1000:b114 FUN_1000_ae6e WRITE 0 true 1028:09f1 Data6 DAT_1028_09f1 +1000:b118 FUN_1000_ae6e READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b11b FUN_1000_ae6e DATA 1 true Stack[-0x3] - +1000:b11e FUN_1000_ae6e CONDITIONAL_JUMP 0 true 1000:b12f Code1 LAB_1000_b12f +1000:b120 FUN_1000_ae6e DATA 1 true Stack[-0x4] - +1000:b126 FUN_1000_ae6e DATA 1 true Stack[0x4] - +1000:b12a FUN_1000_ae6e UNCONDITIONAL_CALL 0 true 1000:7e12 Code1 FUN_1000_7e12 FUN_1000_7e12 +1000:b12f FUN_1000_ae6e DATA 0 true Stack[-0x4] - +1000:b133 FUN_1000_ae6e CONDITIONAL_JUMP 0 true 1000:b0bc Code1 LAB_1000_b0bc +1000:b135 FUN_1000_ae6e DATA 0 true Stack[-0x4] - +1000:b139 FUN_1000_ae6e UNCONDITIONAL_JUMP 0 true 1000:b13e Code1 LAB_1000_b13e +1000:b13b FUN_1000_ae6e DATA 0 true Stack[-0x4] - +1000:b13e FUN_1000_ae6e READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b141 FUN_1000_ae6e DATA 1 true Stack[-0x3] - +1000:b144 FUN_1000_ae6e CONDITIONAL_JUMP 0 true 1000:b155 Code1 LAB_1000_b155 +1000:b146 FUN_1000_ae6e DATA 1 true Stack[-0x4] - +1000:b14c FUN_1000_ae6e DATA 1 true Stack[0x4] - +1000:b150 FUN_1000_ae6e UNCONDITIONAL_CALL 0 true 1000:7e92 Code1 FUN_1000_7e92 FUN_1000_7e92 +1000:b155 FUN_1000_ae6e DATA 0 true Stack[-0x4] - +1000:b159 FUN_1000_ae6e CONDITIONAL_JUMP 0 true 1000:b13b Code1 LAB_1000_b13b +1000:b15b FUN_1000_ae6e DATA 0 true Stack[-0x4] - +1000:b15f FUN_1000_ae6e UNCONDITIONAL_JUMP 0 true 1000:b164 Code1 LAB_1000_b164 +1000:b161 FUN_1000_ae6e DATA 0 true Stack[-0x4] - +1000:b164 FUN_1000_ae6e READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b16f FUN_1000_ae6e DATA 1 true Stack[-0x4] - +1000:b172 FUN_1000_ae6e CONDITIONAL_JUMP 0 true 1000:b187 Code1 LAB_1000_b187 +1000:b174 FUN_1000_ae6e DATA 1 true Stack[-0x4] - +1000:b17e FUN_1000_ae6e DATA 1 true Stack[0x4] - +1000:b182 FUN_1000_ae6e UNCONDITIONAL_CALL 0 true 1000:b30b Code1 FUN_1000_b30b FUN_1000_b30b +1000:b187 FUN_1000_ae6e DATA 0 true Stack[-0x4] - +1000:b18b FUN_1000_ae6e CONDITIONAL_JUMP 0 true 1000:b161 Code1 LAB_1000_b161 +1000:b18d FUN_1000_ae6e READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b190 FUN_1000_ae6e DATA 1 true Stack[-0x3] - +1000:b193 FUN_1000_ae6e CONDITIONAL_JUMP 0 true 1000:b20f Code1 LAB_1000_b20f +1000:b197 FUN_1000_ae6e DATA 0 true Stack[-0x9] - +1000:b19a FUN_1000_ae6e DATA 0 true Stack[-0x4] - +1000:b19e FUN_1000_ae6e UNCONDITIONAL_JUMP 0 true 1000:b1a3 Code1 LAB_1000_b1a3 +1000:b1a0 FUN_1000_ae6e DATA 0 true Stack[-0x4] - +1000:b1a3 FUN_1000_ae6e DATA 1 true Stack[-0x4] - +1000:b1ae FUN_1000_ae6e READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b1b6 FUN_1000_ae6e DATA 1 true Stack[0x4] - +1000:b1c7 FUN_1000_ae6e CONDITIONAL_JUMP 0 true 1000:b1cc Code1 LAB_1000_b1cc +1000:b1c9 FUN_1000_ae6e DATA 0 true Stack[-0x9] - +1000:b1cc FUN_1000_ae6e DATA 0 true Stack[-0x4] - +1000:b1d0 FUN_1000_ae6e CONDITIONAL_JUMP 0 true 1000:b1a0 Code1 LAB_1000_b1a0 +1000:b1d2 FUN_1000_ae6e DATA 1 true Stack[0x4] - +1000:b1dd FUN_1000_ae6e UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:b1e2 FUN_1000_ae6e DATA 0 true Stack[-0x7] - +1000:b1e5 FUN_1000_ae6e DATA 0 true Stack[-0x7] - +1000:b1e8 FUN_1000_ae6e DATA 0 true Stack[-0x9] - +1000:b1eb FUN_1000_ae6e UNCONDITIONAL_CALL 0 true 1008:0dbd Code2 FUN_1008_0dbd FUN_1008_0dbd +1000:b1f0 FUN_1000_ae6e DATA 0 true Stack[-0x7] - +1000:b1f3 FUN_1000_ae6e READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b1f7 FUN_1000_ae6e UNCONDITIONAL_CALL 0 true 1008:0b9e Code2 FUN_1008_0b9e FUN_1008_0b9e +1000:b1fc FUN_1000_ae6e DATA 1 true Stack[0x4] - +1000:b207 FUN_1000_ae6e DATA 0 true Stack[-0x7] - +1000:b20a FUN_1000_ae6e UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:b20f FUN_1000_ae6e DATA 1 true Stack[0x4] - +1000:b213 FUN_1000_ae6e UNCONDITIONAL_CALL 0 true 1000:acc2 Code1 FUN_1000_acc2 FUN_1000_acc2 +1000:b218 FUN_1000_ae6e READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b228 FUN_1000_ae6e READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b235 FUN_1000_ae6e DATA 1 true Stack[0x4] - +1000:b239 FUN_1000_ae6e UNCONDITIONAL_CALL 0 true 1000:9e85 Code1 FUN_1000_9e85 FUN_1000_9e85 +1000:b23e FUN_1000_ae6e DATA 1 true Stack[0x4] - +1000:b249 FUN_1000_ae6e UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:b24e FUN_1000_ae6e DATA 0 true Stack[-0x7] - +1000:b251 FUN_1000_ae6e DATA 0 true Stack[-0x7] - +1000:b25e FUN_1000_ae6e UNCONDITIONAL_CALL 0 true 1008:08bb Code2 FUN_1008_08bb FUN_1008_08bb +1000:b263 FUN_1000_ae6e DATA 0 true Stack[-0x7] - +1000:b270 FUN_1000_ae6e UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1000:b275 FUN_1000_ae6e DATA 1 true Stack[0x4] - +1000:b280 FUN_1000_ae6e DATA 0 true Stack[-0x7] - +1000:b283 FUN_1000_ae6e UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:b288 FUN_1000_ae6e DATA 1 true Stack[0x4] - +1000:b28c FUN_1000_ae6e UNCONDITIONAL_CALL 0 true 1000:a604 Code1 FUN_1000_a604 FUN_1000_a604 +1000:b291 FUN_1000_ae6e UNCONDITIONAL_JUMP 0 true 1000:b2c4 Code1 LAB_1000_b2c4 +1000:b293 FUN_1000_ae6e WRITE 0 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b298 FUN_1000_ae6e DATA 1 true Stack[0x4] - +1000:b29c FUN_1000_ae6e UNCONDITIONAL_CALL 0 true 1000:a70e Code1 FUN_1000_a70e FUN_1000_a70e +1000:b2a1 FUN_1000_ae6e READ 0 true 1028:07d2 Data6 DAT_1028_07d2 +1000:b2a6 FUN_1000_ae6e CONDITIONAL_JUMP 0 true 1000:b2c4 Code1 LAB_1000_b2c4 +1000:b2a8 FUN_1000_ae6e DATA 1 true Stack[0x4] - +1000:b2bb FUN_1000_ae6e DATA 1 true Stack[0x4] - +1000:b2bf FUN_1000_ae6e UNCONDITIONAL_CALL 0 true 1000:ab3c Code1 FUN_1000_ab3c FUN_1000_ab3c +1000:b2cb FUN_1000_b2c8 DATA 0 true Stack[0xe] - +1000:b2ce FUN_1000_b2c8 DATA 0 true Stack[0xc] - +1000:b2d1 FUN_1000_b2c8 DATA 0 true Stack[0xa] - +1000:b2d4 FUN_1000_b2c8 DATA 1 true Stack[0x8] - +1000:b2d7 FUN_1000_b2c8 DATA 1 true Stack[0xc] - +1000:b2dc FUN_1000_b2c8 DATA 1 true Stack[0x6] - +1000:b2df FUN_1000_b2c8 DATA 1 true Stack[0xa] - +1000:b2e4 FUN_1000_b2c8 UNCONDITIONAL_CALL 0 true 1008:0837 Code2 FUN_1008_0837 FUN_1008_0837 +1000:b2e9 FUN_1000_b2c8 DATA 0 true Stack[0xe] - +1000:b2ec FUN_1000_b2c8 DATA 0 true Stack[0xc] - +1000:b2ef FUN_1000_b2c8 DATA 0 true Stack[0xa] - +1000:b2f2 FUN_1000_b2c8 DATA 1 true Stack[0x8] - +1000:b2f5 FUN_1000_b2c8 DATA 1 true Stack[0xc] - +1000:b2fa FUN_1000_b2c8 DATA 1 true Stack[0x6] - +1000:b2fd FUN_1000_b2c8 DATA 1 true Stack[0xa] - +1000:b302 FUN_1000_b2c8 UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1000:b30f FUN_1000_b30b DATA 1 true Stack[0x4] - +1000:b31a FUN_1000_b30b UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:b31f FUN_1000_b30b DATA 0 true Stack[-0x4] - +1000:b322 FUN_1000_b30b DATA 0 true Stack[0x6] - +1000:b327 FUN_1000_b30b CONDITIONAL_JUMP 0 true 1000:b34e Code1 LAB_1000_b34e +1000:b329 FUN_1000_b30b DATA 1 true Stack[0x6] - +1000:b333 FUN_1000_b30b DATA 0 true Stack[-0x4] - +1000:b347 FUN_1000_b30b UNCONDITIONAL_CALL 0 true 1000:b2c8 Code1 FUN_1000_b2c8 FUN_1000_b2c8 +1000:b34c FUN_1000_b30b UNCONDITIONAL_JUMP 0 true 1000:b399 Code1 LAB_1000_b399 +1000:b34e FUN_1000_b30b DATA 0 true Stack[0x6] - +1000:b353 FUN_1000_b30b CONDITIONAL_JUMP 0 true 1000:b370 Code1 LAB_1000_b370 +1000:b355 FUN_1000_b30b DATA 0 true Stack[0x6] - +1000:b35a FUN_1000_b30b CONDITIONAL_JUMP 0 true 1000:b370 Code1 LAB_1000_b370 +1000:b35c FUN_1000_b30b DATA 0 true Stack[-0x4] - +1000:b35f FUN_1000_b30b DATA 1 true Stack[0x6] - +1000:b369 FUN_1000_b30b UNCONDITIONAL_CALL 0 true 1008:0dbd Code2 FUN_1008_0dbd FUN_1008_0dbd +1000:b36e FUN_1000_b30b UNCONDITIONAL_JUMP 0 true 1000:b399 Code1 LAB_1000_b399 +1000:b370 FUN_1000_b30b DATA 1 true Stack[0x6] - +1000:b381 FUN_1000_b30b DATA 0 true Stack[-0x4] - +1000:b394 FUN_1000_b30b UNCONDITIONAL_CALL 0 true 1000:b2c8 Code1 FUN_1000_b2c8 FUN_1000_b2c8 +1000:b399 FUN_1000_b30b DATA 1 true Stack[0x4] - +1000:b3a4 FUN_1000_b30b DATA 0 true Stack[-0x4] - +1000:b3a7 FUN_1000_b30b UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:b3b3 FUN_1000_b3b0 DATA 0 true Stack[0xe] - +1000:b3b6 FUN_1000_b3b0 DATA 0 true Stack[0xc] - +1000:b3b9 FUN_1000_b3b0 DATA 0 true Stack[0xa] - +1000:b3bc FUN_1000_b3b0 DATA 1 true Stack[0x8] - +1000:b3bf FUN_1000_b3b0 DATA 1 true Stack[0xc] - +1000:b3c4 FUN_1000_b3b0 DATA 1 true Stack[0x6] - +1000:b3c7 FUN_1000_b3b0 DATA 1 true Stack[0xa] - +1000:b3cc FUN_1000_b3b0 UNCONDITIONAL_CALL 0 true 1008:08bb Code2 FUN_1008_08bb FUN_1008_08bb +1000:b3d1 FUN_1000_b3b0 DATA 0 true Stack[0xe] - +1000:b3d4 FUN_1000_b3b0 DATA 0 true Stack[0xc] - +1000:b3d7 FUN_1000_b3b0 DATA 0 true Stack[0xa] - +1000:b3da FUN_1000_b3b0 DATA 1 true Stack[0x8] - +1000:b3dd FUN_1000_b3b0 DATA 1 true Stack[0xc] - +1000:b3e2 FUN_1000_b3b0 DATA 1 true Stack[0x6] - +1000:b3e5 FUN_1000_b3b0 DATA 1 true Stack[0xa] - +1000:b3ea FUN_1000_b3b0 UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1000:b3f7 FUN_1000_b3f3 DATA 1 true Stack[0x4] - +1000:b402 FUN_1000_b3f3 UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:b407 FUN_1000_b3f3 DATA 0 true Stack[-0x4] - +1000:b40a FUN_1000_b3f3 DATA 0 true Stack[0x6] - +1000:b40f FUN_1000_b3f3 CONDITIONAL_JUMP 0 true 1000:b436 Code1 LAB_1000_b436 +1000:b411 FUN_1000_b3f3 DATA 1 true Stack[0x6] - +1000:b41b FUN_1000_b3f3 DATA 0 true Stack[-0x4] - +1000:b42f FUN_1000_b3f3 UNCONDITIONAL_CALL 0 true 1000:b3b0 Code1 FUN_1000_b3b0 FUN_1000_b3b0 +1000:b434 FUN_1000_b3f3 UNCONDITIONAL_JUMP 0 true 1000:b45f Code1 LAB_1000_b45f +1000:b436 FUN_1000_b3f3 DATA 1 true Stack[0x6] - +1000:b447 FUN_1000_b3f3 DATA 0 true Stack[-0x4] - +1000:b45a FUN_1000_b3f3 UNCONDITIONAL_CALL 0 true 1000:b3b0 Code1 FUN_1000_b3b0 FUN_1000_b3b0 +1000:b45f FUN_1000_b3f3 DATA 1 true Stack[0x4] - +1000:b46a FUN_1000_b3f3 DATA 0 true Stack[-0x4] - +1000:b46d FUN_1000_b3f3 UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:b47a FUN_1000_b476 READ 0 true 1028:07c6 Data6 DAT_1028_07c6 +1000:b47f FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:b484 Code1 LAB_1000_b484 +1000:b481 FUN_1000_b476 UNCONDITIONAL_JUMP 0 true 1000:bc32 Code1 LAB_1000_bc32 +1000:b484 FUN_1000_b476 DATA 1 true Stack[0x6] - +1000:b48d FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:b4d7 Code1 LAB_1000_b4d7 +1000:b48f FUN_1000_b476 DATA 0 true Stack[0x8] - +1000:b494 FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:b4d7 Code1 LAB_1000_b4d7 +1000:b496 FUN_1000_b476 DATA 0 true Stack[0x8] - +1000:b49b FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:b4d7 Code1 LAB_1000_b4d7 +1000:b49d FUN_1000_b476 DATA 1 true Stack[0x8] - +1000:b4a8 FUN_1000_b476 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b4b0 FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:b4c1 FUN_1000_b476 DATA 1 true Stack[0x8] - +1000:b4ce FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:b4d2 FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1000:b30b Code1 FUN_1000_b30b FUN_1000_b30b +1000:b4d7 FUN_1000_b476 DATA 1 true Stack[0x6] - +1000:b4e0 FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:b526 Code1 LAB_1000_b526 +1000:b4e2 FUN_1000_b476 DATA 1 true Stack[0x8] - +1000:b4ea FUN_1000_b476 DATA 0 true Stack[-0x5] - +1000:b4ed FUN_1000_b476 DATA 1 true Stack[-0x5] - +1000:b4f6 FUN_1000_b476 DATA 0 true Stack[-0x5] - +1000:b4f9 FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:b4fd FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1000:7e12 Code1 FUN_1000_7e12 FUN_1000_7e12 +1000:b502 FUN_1000_b476 DATA 1 true Stack[0x6] - +1000:b50b FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:b526 Code1 LAB_1000_b526 +1000:b50d FUN_1000_b476 DATA 1 true Stack[-0x5] - +1000:b519 FUN_1000_b476 DATA 1 true Stack[-0x5] - +1000:b526 FUN_1000_b476 DATA 1 true Stack[0x6] - +1000:b52f FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:b54c Code1 LAB_1000_b54c +1000:b531 FUN_1000_b476 READ 0 true 1028:07c7 Data6 DAT_1028_07c7 +1000:b536 FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:b54c Code1 LAB_1000_b54c +1000:b538 FUN_1000_b476 READ 0 true 1028:07c8 Data6 DAT_1028_07c8 +1000:b53d FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:b54c Code1 LAB_1000_b54c +1000:b541 FUN_1000_b476 WRITE 0 true 1028:0855 Data6 DAT_1028_0855 +1000:b544 FUN_1000_b476 WRITE 0 true 1028:0857 Data6 DAT_1028_0857 +1000:b547 FUN_1000_b476 WRITE 0 true 1028:07c7 Data6 DAT_1028_07c7 +1000:b54c FUN_1000_b476 DATA 1 true Stack[0x6] - +1000:b555 FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:b55a Code1 LAB_1000_b55a +1000:b557 FUN_1000_b476 UNCONDITIONAL_JUMP 0 true 1000:b626 Code1 LAB_1000_b626 +1000:b55c FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1008:0002 Code2 FUN_1008_0002 FUN_1008_0002 +1000:b561 FUN_1000_b476 WRITE 0 true 1028:39de Data6 DAT_1028_39de +1000:b566 FUN_1000_b476 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b56f FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:b581 FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:b585 FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1000:b30b Code1 FUN_1000_b30b FUN_1000_b30b +1000:b58a FUN_1000_b476 READ 0 true 1028:399a Data6 DAT_1028_399a +1000:b58f FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:b5a2 Code1 LAB_1000_b5a2 +1000:b591 FUN_1000_b476 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b5a0 FUN_1000_b476 UNCONDITIONAL_JUMP 0 true 1000:b5db Code1 LAB_1000_b5db +1000:b5a2 FUN_1000_b476 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b5af FUN_1000_b476 DATA 0 true Stack[-0x9] - +1000:b5b4 FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1020:14a4 Code5 FUN_1020_14a4 FUN_1020_14a4 +1000:b5bc FUN_1000_b476 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b5c9 FUN_1000_b476 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b5d6 FUN_1000_b476 DATA 1 true Stack[-0x9] - +1000:b5d9 FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:b5b2 Code1 LAB_1000_b5b2 +1000:b5db FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:b5e6 FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:b5eb FUN_1000_b476 DATA 0 true Stack[-0xd] - +1000:b5ee FUN_1000_b476 DATA 0 true Stack[-0xd] - +1000:b5f1 FUN_1000_b476 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b5fe FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1000:0002 Code1 FUN_1000_0002 FUN_1000_0002 +1000:b603 FUN_1000_b476 DATA 0 true Stack[-0xd] - +1000:b60e FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1000:b613 FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:b61e FUN_1000_b476 DATA 0 true Stack[-0xd] - +1000:b621 FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:b626 FUN_1000_b476 DATA 1 true Stack[0x6] - +1000:b62f FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:b634 Code1 LAB_1000_b634 +1000:b631 FUN_1000_b476 UNCONDITIONAL_JUMP 0 true 1000:b758 Code1 LAB_1000_b758 +1000:b636 FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1008:0002 Code2 FUN_1008_0002 FUN_1008_0002 +1000:b63b FUN_1000_b476 DATA 0 true Stack[-0xa] - +1000:b63f FUN_1000_b476 DATA 0 true Stack[-0x3] - +1000:b643 FUN_1000_b476 UNCONDITIONAL_JUMP 0 true 1000:b648 Code1 LAB_1000_b648 +1000:b645 FUN_1000_b476 DATA 0 true Stack[-0x3] - +1000:b648 FUN_1000_b476 DATA 1 true Stack[-0x3] - +1000:b65e FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:b666 Code1 LAB_1000_b666 +1000:b660 FUN_1000_b476 DATA 0 true Stack[-0xa] - +1000:b664 FUN_1000_b476 UNCONDITIONAL_JUMP 0 true 1000:b66c Code1 LAB_1000_b66c +1000:b666 FUN_1000_b476 DATA 0 true Stack[-0x3] - +1000:b66a FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:b645 Code1 LAB_1000_b645 +1000:b66c FUN_1000_b476 DATA 0 true Stack[-0xa] - +1000:b670 FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:b675 Code1 LAB_1000_b675 +1000:b672 FUN_1000_b476 UNCONDITIONAL_JUMP 0 true 1000:b758 Code1 LAB_1000_b758 +1000:b677 FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1008:0002 Code2 FUN_1008_0002 FUN_1008_0002 +1000:b67c FUN_1000_b476 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b688 FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:b69a Code1 LAB_1000_b69a +1000:b68f FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:b693 FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1000:bc36 Code1 FUN_1000_bc36 FUN_1000_bc36 +1000:b698 FUN_1000_b476 UNCONDITIONAL_JUMP 0 true 1000:b6ec Code1 LAB_1000_b6ec +1000:b69a FUN_1000_b476 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b6a6 FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:b6b6 Code1 LAB_1000_b6b6 +1000:b6a8 FUN_1000_b476 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b6b4 FUN_1000_b476 UNCONDITIONAL_JUMP 0 true 1000:b6d1 Code1 LAB_1000_b6d1 +1000:b6b6 FUN_1000_b476 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b6c6 FUN_1000_b476 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b6d1 FUN_1000_b476 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b6e3 FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:b6e7 FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1000:b30b Code1 FUN_1000_b30b FUN_1000_b30b +1000:b6ec FUN_1000_b476 DATA 0 true Stack[-0x3] - +1000:b6f0 FUN_1000_b476 UNCONDITIONAL_JUMP 0 true 1000:b6f5 Code1 LAB_1000_b6f5 +1000:b6f2 FUN_1000_b476 DATA 0 true Stack[-0x3] - +1000:b6f5 FUN_1000_b476 DATA 1 true Stack[-0x3] - +1000:b70b FUN_1000_b476 DATA 1 true Stack[-0x3] - +1000:b722 FUN_1000_b476 DATA 1 true Stack[-0x3] - +1000:b73a FUN_1000_b476 DATA 1 true Stack[-0x3] - +1000:b749 FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:b74d FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1000:7e12 Code1 FUN_1000_7e12 FUN_1000_7e12 +1000:b752 FUN_1000_b476 DATA 0 true Stack[-0x3] - +1000:b756 FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:b6f2 Code1 LAB_1000_b6f2 +1000:b758 FUN_1000_b476 DATA 1 true Stack[0x6] - +1000:b761 FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:b766 Code1 LAB_1000_b766 +1000:b763 FUN_1000_b476 UNCONDITIONAL_JUMP 0 true 1000:ba8c Code1 LAB_1000_ba8c +1000:b768 FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1008:0002 Code2 FUN_1008_0002 FUN_1008_0002 +1000:b76d FUN_1000_b476 DATA 0 true Stack[-0xa] - +1000:b771 FUN_1000_b476 DATA 0 true Stack[-0x3] - +1000:b775 FUN_1000_b476 UNCONDITIONAL_JUMP 0 true 1000:b77a Code1 LAB_1000_b77a +1000:b777 FUN_1000_b476 DATA 0 true Stack[-0x3] - +1000:b77a FUN_1000_b476 DATA 1 true Stack[-0x3] - +1000:b790 FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:b798 Code1 LAB_1000_b798 +1000:b792 FUN_1000_b476 DATA 0 true Stack[-0xa] - +1000:b796 FUN_1000_b476 UNCONDITIONAL_JUMP 0 true 1000:b79e Code1 LAB_1000_b79e +1000:b798 FUN_1000_b476 DATA 0 true Stack[-0x3] - +1000:b79c FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:b777 Code1 LAB_1000_b777 +1000:b79e FUN_1000_b476 DATA 0 true Stack[-0xa] - +1000:b7a2 FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:b7a7 Code1 LAB_1000_b7a7 +1000:b7a4 FUN_1000_b476 UNCONDITIONAL_JUMP 0 true 1000:ba8c Code1 LAB_1000_ba8c +1000:b7a7 FUN_1000_b476 DATA 0 true Stack[-0x7] - +1000:b7ac FUN_1000_b476 DATA 0 true Stack[-0x3] - +1000:b7b0 FUN_1000_b476 UNCONDITIONAL_JUMP 0 true 1000:b7b5 Code1 LAB_1000_b7b5 +1000:b7b2 FUN_1000_b476 DATA 0 true Stack[-0x3] - +1000:b7b5 FUN_1000_b476 DATA 1 true Stack[-0x3] - +1000:b7c0 FUN_1000_b476 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b7c8 FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:b7d9 FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:b7de Code1 LAB_1000_b7de +1000:b7db FUN_1000_b476 DATA 0 true Stack[-0x7] - +1000:b7de FUN_1000_b476 DATA 0 true Stack[-0x3] - +1000:b7e2 FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:b7b2 Code1 LAB_1000_b7b2 +1000:b7e4 FUN_1000_b476 DATA 0 true Stack[-0x7] - +1000:b7e8 FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:b839 Code1 LAB_1000_b839 +1000:b7ec FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1008:0002 Code2 FUN_1008_0002 FUN_1008_0002 +1000:b7f1 FUN_1000_b476 DATA 1 true Stack[-0x7] - +1000:b7fa FUN_1000_b476 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b802 FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:b813 FUN_1000_b476 DATA 1 true Stack[-0x7] - +1000:b81b FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:b81f FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1000:b30b Code1 FUN_1000_b30b FUN_1000_b30b +1000:b824 FUN_1000_b476 DATA 1 true Stack[-0x7] - +1000:b82d FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:b831 FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1000:bc36 Code1 FUN_1000_bc36 FUN_1000_bc36 +1000:b836 FUN_1000_b476 UNCONDITIONAL_JUMP 0 true 1000:ba20 Code1 LAB_1000_ba20 +1000:b839 FUN_1000_b476 DATA 0 true Stack[-0x7] - +1000:b83d FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:b842 Code1 LAB_1000_b842 +1000:b83f FUN_1000_b476 UNCONDITIONAL_JUMP 0 true 1000:b998 Code1 LAB_1000_b998 +1000:b844 FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1008:0002 Code2 FUN_1008_0002 FUN_1008_0002 +1000:b849 FUN_1000_b476 DATA 1 true Stack[-0x7] - +1000:b852 FUN_1000_b476 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b85a FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:b86b FUN_1000_b476 DATA 1 true Stack[-0x7] - +1000:b873 FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:b877 FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1000:b30b Code1 FUN_1000_b30b FUN_1000_b30b +1000:b87c FUN_1000_b476 DATA 1 true Stack[-0x7] - +1000:b885 FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:b889 FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1000:bc36 Code1 FUN_1000_bc36 FUN_1000_bc36 +1000:b88e FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:b89b FUN_1000_b476 WRITE 0 true 1028:3b2a Data6 DAT_1028_3b2a +1000:b8a0 FUN_1000_b476 WRITE 0 true 1028:0b81 Data6 DAT_1028_0b81 +1000:b8a5 FUN_1000_b476 WRITE 0 true 1028:3b7d Data6 DAT_1028_3b7d +1000:b8ae FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:b8b3 FUN_1000_b476 DATA 0 true Stack[-0xd] - +1000:b8b6 FUN_1000_b476 DATA 0 true Stack[-0xd] - +1000:b8b9 FUN_1000_b476 READ 0 true 1028:3b41 Data6 DAT_1028_3b41 +1000:b8bd FUN_1000_b476 READ 0 true 1028:3b43 Data6 DAT_1028_3b43 +1000:b8c1 FUN_1000_b476 READ 1 true 1028:3b45 Data6 DAT_1028_3b45 +1000:b8c4 FUN_1000_b476 READ 1 true 1028:3b41 Data6 DAT_1028_3b41 +1000:b8ca FUN_1000_b476 READ 1 true 1028:3b47 Data6 DAT_1028_3b47 +1000:b8cd FUN_1000_b476 READ 1 true 1028:3b43 Data6 DAT_1028_3b43 +1000:b8d3 FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1008:0837 Code2 FUN_1008_0837 FUN_1008_0837 +1000:b8d8 FUN_1000_b476 DATA 0 true Stack[-0xd] - +1000:b8db FUN_1000_b476 READ 0 true 1028:3b41 Data6 DAT_1028_3b41 +1000:b8df FUN_1000_b476 READ 0 true 1028:3b43 Data6 DAT_1028_3b43 +1000:b8e3 FUN_1000_b476 READ 1 true 1028:3b45 Data6 DAT_1028_3b45 +1000:b8e6 FUN_1000_b476 READ 1 true 1028:3b41 Data6 DAT_1028_3b41 +1000:b8ec FUN_1000_b476 READ 1 true 1028:3b47 Data6 DAT_1028_3b47 +1000:b8ef FUN_1000_b476 READ 1 true 1028:3b43 Data6 DAT_1028_3b43 +1000:b8f5 FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1000:b8fa FUN_1000_b476 DATA 0 true Stack[-0xd] - +1000:b8fd FUN_1000_b476 READ 0 true 1028:3b94 Data6 DAT_1028_3b94 +1000:b901 FUN_1000_b476 READ 0 true 1028:3b96 Data6 DAT_1028_3b96 +1000:b905 FUN_1000_b476 READ 1 true 1028:3b98 Data6 DAT_1028_3b98 +1000:b908 FUN_1000_b476 READ 1 true 1028:3b94 Data6 DAT_1028_3b94 +1000:b90e FUN_1000_b476 READ 1 true 1028:3b9a Data6 DAT_1028_3b9a +1000:b911 FUN_1000_b476 READ 1 true 1028:3b96 Data6 DAT_1028_3b96 +1000:b917 FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1008:0837 Code2 FUN_1008_0837 FUN_1008_0837 +1000:b91c FUN_1000_b476 DATA 0 true Stack[-0xd] - +1000:b91f FUN_1000_b476 READ 0 true 1028:3b94 Data6 DAT_1028_3b94 +1000:b923 FUN_1000_b476 READ 0 true 1028:3b96 Data6 DAT_1028_3b96 +1000:b927 FUN_1000_b476 READ 1 true 1028:3b98 Data6 DAT_1028_3b98 +1000:b92a FUN_1000_b476 READ 1 true 1028:3b94 Data6 DAT_1028_3b94 +1000:b930 FUN_1000_b476 READ 1 true 1028:3b9a Data6 DAT_1028_3b9a +1000:b933 FUN_1000_b476 READ 1 true 1028:3b96 Data6 DAT_1028_3b96 +1000:b939 FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1000:b93e FUN_1000_b476 DATA 0 true Stack[-0xd] - +1000:b941 FUN_1000_b476 READ 0 true 1028:0b98 Data6 DAT_1028_0b98 +1000:b945 FUN_1000_b476 READ 0 true 1028:0b9a Data6 DAT_1028_0b9a +1000:b949 FUN_1000_b476 READ 1 true 1028:0b9c Data6 DAT_1028_0b9c +1000:b94c FUN_1000_b476 READ 1 true 1028:0b98 Data6 DAT_1028_0b98 +1000:b952 FUN_1000_b476 READ 1 true 1028:0b9e Data6 DAT_1028_0b9e +1000:b955 FUN_1000_b476 READ 1 true 1028:0b9a Data6 DAT_1028_0b9a +1000:b95b FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1008:0837 Code2 FUN_1008_0837 FUN_1008_0837 +1000:b960 FUN_1000_b476 DATA 0 true Stack[-0xd] - +1000:b963 FUN_1000_b476 READ 0 true 1028:0b98 Data6 DAT_1028_0b98 +1000:b967 FUN_1000_b476 READ 0 true 1028:0b9a Data6 DAT_1028_0b9a +1000:b96b FUN_1000_b476 READ 1 true 1028:0b9c Data6 DAT_1028_0b9c +1000:b96e FUN_1000_b476 READ 1 true 1028:0b98 Data6 DAT_1028_0b98 +1000:b974 FUN_1000_b476 READ 1 true 1028:0b9e Data6 DAT_1028_0b9e +1000:b977 FUN_1000_b476 READ 1 true 1028:0b9a Data6 DAT_1028_0b9a +1000:b97d FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1000:b982 FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:b98d FUN_1000_b476 DATA 0 true Stack[-0xd] - +1000:b990 FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:b995 FUN_1000_b476 UNCONDITIONAL_JUMP 0 true 1000:ba20 Code1 LAB_1000_ba20 +1000:b99a FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1008:0002 Code2 FUN_1008_0002 FUN_1008_0002 +1000:b99f FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:b9ac FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:ba13 Code1 LAB_1000_ba13 +1000:b9ae FUN_1000_b476 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b9ca FUN_1000_b476 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b9dc FUN_1000_b476 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:b9ef FUN_1000_b476 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:ba01 FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:ba08 FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:ba0c FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1000:bda2 Code1 FUN_1000_bda2 FUN_1000_bda2 +1000:ba11 FUN_1000_b476 UNCONDITIONAL_JUMP 0 true 1000:ba20 Code1 LAB_1000_ba20 +1000:ba13 FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:ba20 FUN_1000_b476 DATA 0 true Stack[-0x3] - +1000:ba24 FUN_1000_b476 UNCONDITIONAL_JUMP 0 true 1000:ba29 Code1 LAB_1000_ba29 +1000:ba26 FUN_1000_b476 DATA 0 true Stack[-0x3] - +1000:ba29 FUN_1000_b476 DATA 1 true Stack[-0x3] - +1000:ba3f FUN_1000_b476 DATA 1 true Stack[-0x3] - +1000:ba56 FUN_1000_b476 DATA 1 true Stack[-0x3] - +1000:ba6e FUN_1000_b476 DATA 1 true Stack[-0x3] - +1000:ba7d FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:ba81 FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1000:7e12 Code1 FUN_1000_7e12 FUN_1000_7e12 +1000:ba86 FUN_1000_b476 DATA 0 true Stack[-0x3] - +1000:ba8a FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:ba26 Code1 LAB_1000_ba26 +1000:ba8c FUN_1000_b476 DATA 1 true Stack[0x6] - +1000:ba95 FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:ba9a Code1 LAB_1000_ba9a +1000:ba97 FUN_1000_b476 UNCONDITIONAL_JUMP 0 true 1000:bb2d Code1 LAB_1000_bb2d +1000:ba9a FUN_1000_b476 DATA 1 true Stack[0x8] - +1000:baa0 FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:bace Code1 LAB_1000_bace +1000:baa2 FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:bab2 FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:bab6 FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1000:b30b Code1 FUN_1000_b30b FUN_1000_b30b +1000:babb FUN_1000_b476 WRITE 0 true 1028:3b2a Data6 DAT_1028_3b2a +1000:bac3 FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:bac7 FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1000:b30b Code1 FUN_1000_b30b FUN_1000_b30b +1000:bacc FUN_1000_b476 UNCONDITIONAL_JUMP 0 true 1000:bb2d Code1 LAB_1000_bb2d +1000:bad1 FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:bafe Code1 LAB_1000_bafe +1000:bad3 FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:bae3 FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:bae7 FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1000:b30b Code1 FUN_1000_b30b FUN_1000_b30b +1000:baec FUN_1000_b476 WRITE 0 true 1028:0b81 Data6 DAT_1028_0b81 +1000:baf3 FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:baf7 FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1000:b30b Code1 FUN_1000_b30b FUN_1000_b30b +1000:bafc FUN_1000_b476 UNCONDITIONAL_JUMP 0 true 1000:bb2d Code1 LAB_1000_bb2d +1000:bb01 FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:bb2d Code1 LAB_1000_bb2d +1000:bb03 FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:bb13 FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:bb17 FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1000:b30b Code1 FUN_1000_b30b FUN_1000_b30b +1000:bb1c FUN_1000_b476 WRITE 0 true 1028:3b7d Data6 DAT_1028_3b7d +1000:bb24 FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:bb28 FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1000:b30b Code1 FUN_1000_b30b FUN_1000_b30b +1000:bb2d FUN_1000_b476 DATA 1 true Stack[0x6] - +1000:bb36 FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:bb3b Code1 LAB_1000_bb3b +1000:bb38 FUN_1000_b476 UNCONDITIONAL_JUMP 0 true 1000:bc32 Code1 LAB_1000_bc32 +1000:bb3b FUN_1000_b476 DATA 1 true Stack[0x8] - +1000:bb41 FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:bb83 Code1 LAB_1000_bb83 +1000:bb45 FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1008:0002 Code2 FUN_1008_0002 FUN_1008_0002 +1000:bb4a FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:bb59 FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:bb5d FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1000:b30b Code1 FUN_1000_b30b FUN_1000_b30b +1000:bb62 FUN_1000_b476 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:bb77 FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:bb7b FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1000:bc36 Code1 FUN_1000_bc36 FUN_1000_bc36 +1000:bb80 FUN_1000_b476 UNCONDITIONAL_JUMP 0 true 1000:bc32 Code1 LAB_1000_bc32 +1000:bb86 FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:bbc7 Code1 LAB_1000_bbc7 +1000:bb8a FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1008:0002 Code2 FUN_1008_0002 FUN_1008_0002 +1000:bb8f FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:bb9e FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:bba2 FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1000:b30b Code1 FUN_1000_b30b FUN_1000_b30b +1000:bba7 FUN_1000_b476 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:bbbc FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:bbc0 FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1000:bc36 Code1 FUN_1000_bc36 FUN_1000_bc36 +1000:bbc5 FUN_1000_b476 UNCONDITIONAL_JUMP 0 true 1000:bc32 Code1 LAB_1000_bc32 +1000:bbca FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:bc0b Code1 LAB_1000_bc0b +1000:bbce FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1008:0002 Code2 FUN_1008_0002 FUN_1008_0002 +1000:bbd3 FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:bbe2 FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:bbe6 FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1000:b30b Code1 FUN_1000_b30b FUN_1000_b30b +1000:bbeb FUN_1000_b476 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:bc00 FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:bc04 FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1000:bc36 Code1 FUN_1000_bc36 FUN_1000_bc36 +1000:bc09 FUN_1000_b476 UNCONDITIONAL_JUMP 0 true 1000:bc32 Code1 LAB_1000_bc32 +1000:bc0e FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:bc32 Code1 LAB_1000_bc32 +1000:bc13 FUN_1000_b476 CONDITIONAL_JUMP 0 true 1000:bc32 Code1 LAB_1000_bc32 +1000:bc15 FUN_1000_b476 DATA 1 true Stack[0x8] - +1000:bc18 FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:bc26 FUN_1000_b476 DATA 0 true Stack[0x8] - +1000:bc29 FUN_1000_b476 DATA 1 true Stack[0x4] - +1000:bc2d FUN_1000_b476 UNCONDITIONAL_CALL 0 true 1000:b30b Code1 FUN_1000_b30b FUN_1000_b30b +1000:bc3a FUN_1000_bc36 DATA 1 true Stack[0x4] - +1000:bc45 FUN_1000_bc36 UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:bc4a FUN_1000_bc36 DATA 0 true Stack[-0x8] - +1000:bc4d FUN_1000_bc36 DATA 0 true Stack[0x8] - +1000:bc51 FUN_1000_bc36 CONDITIONAL_JUMP 0 true 1000:bc5c Code1 LAB_1000_bc5c +1000:bc53 FUN_1000_bc36 DATA 0 true Stack[0x6] - +1000:bc57 FUN_1000_bc36 CONDITIONAL_JUMP 0 true 1000:bc5c Code1 LAB_1000_bc5c +1000:bc59 FUN_1000_bc36 UNCONDITIONAL_JUMP 0 true 1000:bd7a Code1 LAB_1000_bd7a +1000:bc5c FUN_1000_bc36 READ 0 true 1028:07c6 Data6 DAT_1028_07c6 +1000:bc61 FUN_1000_bc36 CONDITIONAL_JUMP 0 true 1000:bc66 Code1 LAB_1000_bc66 +1000:bc63 FUN_1000_bc36 UNCONDITIONAL_JUMP 0 true 1000:bd7a Code1 LAB_1000_bd7a +1000:bc66 FUN_1000_bc36 READ 0 true 1028:0874 Data6 DAT_1028_0874 +1000:bc6b FUN_1000_bc36 CONDITIONAL_JUMP 0 true 1000:bc83 Code1 LAB_1000_bc83 +1000:bc6d FUN_1000_bc36 DATA 1 true Stack[0x6] - +1000:bc70 FUN_1000_bc36 DATA 1 true Stack[0x8] - +1000:bc78 FUN_1000_bc36 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:bc7d FUN_1000_bc36 DATA 0 true Stack[0x6] - +1000:bc80 FUN_1000_bc36 DATA 0 true Stack[0x8] - +1000:bc83 FUN_1000_bc36 DATA 1 true Stack[0x4] - +1000:bc90 FUN_1000_bc36 CONDITIONAL_JUMP 0 true 1000:bca8 Code1 LAB_1000_bca8 +1000:bc92 FUN_1000_bc36 DATA 1 true Stack[0x6] - +1000:bc95 FUN_1000_bc36 DATA 1 true Stack[0x8] - +1000:bc9d FUN_1000_bc36 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:bca2 FUN_1000_bc36 DATA 0 true Stack[0x6] - +1000:bca5 FUN_1000_bc36 DATA 0 true Stack[0x8] - +1000:bca8 FUN_1000_bc36 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:bcba FUN_1000_bc36 DATA 0 true Stack[-0x6] - +1000:bcbd FUN_1000_bc36 DATA 0 true Stack[-0x4] - +1000:bcc0 FUN_1000_bc36 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:bcd2 FUN_1000_bc36 DATA 1 true Stack[0x6] - +1000:bcd5 FUN_1000_bc36 DATA 1 true Stack[0x8] - +1000:bcdc FUN_1000_bc36 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:bcee FUN_1000_bc36 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:bcfd FUN_1000_bc36 CONDITIONAL_JUMP 0 true 1000:bd08 Code1 LAB_1000_bd08 +1000:bcff FUN_1000_bc36 CONDITIONAL_JUMP 0 true 1000:bd6e Code1 LAB_1000_bd6e +1000:bd06 FUN_1000_bc36 CONDITIONAL_JUMP 0 true 1000:bd6e Code1 LAB_1000_bd6e +1000:bd08 FUN_1000_bc36 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:bd21 FUN_1000_bc36 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:bd35 FUN_1000_bc36 CONDITIONAL_JUMP 0 true 1000:bd3d Code1 LAB_1000_bd3d +1000:bd37 FUN_1000_bc36 CONDITIONAL_JUMP 0 true 1000:bd6e Code1 LAB_1000_bd6e +1000:bd3b FUN_1000_bc36 CONDITIONAL_JUMP 0 true 1000:bd6e Code1 LAB_1000_bd6e +1000:bd3f FUN_1000_bc36 UNCONDITIONAL_CALL 0 true 1008:0002 Code2 FUN_1008_0002 FUN_1008_0002 +1000:bd44 FUN_1000_bc36 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:bd58 FUN_1000_bc36 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:bd65 FUN_1000_bc36 DATA 1 true Stack[0x4] - +1000:bd69 FUN_1000_bc36 UNCONDITIONAL_CALL 0 true 1000:a604 Code1 FUN_1000_a604 FUN_1000_a604 +1000:bd6e FUN_1000_bc36 DATA 0 true Stack[-0x8] - +1000:bd71 FUN_1000_bc36 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:bd75 FUN_1000_bc36 UNCONDITIONAL_CALL 0 true 1008:0b9e Code2 FUN_1008_0b9e FUN_1008_0b9e +1000:bd7a FUN_1000_bc36 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:bd83 FUN_1000_bc36 DATA 0 true Stack[-0x8] - +1000:bd86 FUN_1000_bc36 UNCONDITIONAL_CALL 0 true 1008:0996 Code2 FUN_1008_0996 FUN_1008_0996 +1000:bd8b FUN_1000_bc36 DATA 1 true Stack[0x4] - +1000:bd96 FUN_1000_bc36 DATA 0 true Stack[-0x8] - +1000:bd99 FUN_1000_bc36 UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:bda6 FUN_1000_bda2 DATA 1 true Stack[0x4] - +1000:bdb1 FUN_1000_bda2 UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:bdb6 FUN_1000_bda2 DATA 0 true Stack[-0x4] - +1000:bdb9 FUN_1000_bda2 DATA 0 true Stack[0x8] - +1000:bdbc FUN_1000_bda2 DATA 0 true Stack[0x6] - +1000:bdbf FUN_1000_bda2 DATA 0 true Stack[-0x4] - +1000:bdc2 FUN_1000_bda2 UNCONDITIONAL_CALL 0 true 1008:0996 Code2 FUN_1008_0996 FUN_1008_0996 +1000:bdc7 FUN_1000_bda2 DATA 1 true Stack[0x4] - +1000:bdd2 FUN_1000_bda2 DATA 0 true Stack[-0x4] - +1000:bdd5 FUN_1000_bda2 UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:bde1 FUN_1000_bdde READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:bde5 FUN_1000_bdde READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:bde9 FUN_1000_bdde DATA 1 true Stack[0x6] - +1000:bdec FUN_1000_bdde DATA 1 true Stack[0x8] - +1000:be06 FUN_1000_bdde READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:be0a FUN_1000_bdde READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:be0e FUN_1000_bdde DATA 1 true Stack[0x6] - +1000:be11 FUN_1000_bdde DATA 1 true Stack[0x8] - +1000:be2b FUN_1000_bdde READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:be2e FUN_1000_bdde READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:be42 FUN_1000_bdde DATA 1 true Stack[0x6] - +1000:be45 FUN_1000_bdde DATA 1 true Stack[0x8] - +1000:be5f FUN_1000_bdde READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:be62 FUN_1000_bdde READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:be76 FUN_1000_bdde DATA 1 true Stack[0x6] - +1000:be79 FUN_1000_bdde DATA 1 true Stack[0x8] - +1000:be93 FUN_1000_bdde READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:be96 FUN_1000_bdde READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:beaa FUN_1000_bdde DATA 1 true Stack[0x6] - +1000:bead FUN_1000_bdde DATA 1 true Stack[0x8] - +1000:bec7 FUN_1000_bdde READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:beca FUN_1000_bdde READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:bede FUN_1000_bdde DATA 1 true Stack[0x6] - +1000:bee1 FUN_1000_bdde DATA 1 true Stack[0x8] - +1000:bf02 FUN_1000_beff DATA 1 true Stack[0x4] - +1000:bf0d FUN_1000_beff DATA 1 true Stack[0x4] - +1000:bf16 FUN_1000_beff UNCONDITIONAL_CALL 0 true 1228:01c4 EXTERNAL GETCLIENTRECT GETCLIENTRECT +1000:bf1b FUN_1000_beff DATA 1 true Stack[0x4] - +1000:bf26 FUN_1000_beff UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:bf2b FUN_1000_beff DATA 1 true Stack[0x4] - +1000:bf36 FUN_1000_beff UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1000:bf3b FUN_1000_beff DATA 1 true Stack[0x4] - +1000:bf46 FUN_1000_beff UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1000:bf4b FUN_1000_beff DATA 1 true Stack[0x4] - +1000:bf52 FUN_1000_beff DATA 0 true Stack[-0xc] - +1000:bf56 FUN_1000_beff UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1000:bf5b FUN_1000_beff DATA 1 true Stack[0x4] - +1000:bf6a FUN_1000_beff UNCONDITIONAL_CALL 0 true 1228:0158 EXTERNAL CREATECOMPATIBLEBITMAP CREATECOMPATIBLEBITMAP +1000:bf6f FUN_1000_beff DATA 1 true Stack[0x4] - +1000:bf76 FUN_1000_beff READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:bf79 FUN_1000_beff READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:bf7d FUN_1000_beff DATA 1 true Stack[0x4] - +1000:bf8e FUN_1000_beff READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:bf91 FUN_1000_beff READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:bf9f FUN_1000_beff READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:bfa2 FUN_1000_beff READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:bfa6 FUN_1000_beff DATA 1 true Stack[0xa] - +1000:bfa9 FUN_1000_beff DATA 1 true Stack[0xc] - +1000:bfac FUN_1000_beff WRITE 0 true 1028:07d7 Data6 DAT_1028_07d7 +1000:bfaf FUN_1000_beff WRITE 0 true 1028:07d9 Data6 DAT_1028_07d9 +1000:bfb3 FUN_1000_beff READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:bfb6 FUN_1000_beff READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:bfba FUN_1000_beff DATA 1 true Stack[0x6] - +1000:bfbd FUN_1000_beff DATA 1 true Stack[0x8] - +1000:bfc0 FUN_1000_beff WRITE 0 true 1028:07d3 Data6 DAT_1028_07d3 +1000:bfc3 FUN_1000_beff WRITE 0 true 1028:07d5 Data6 DAT_1028_07d5 +1000:bfc7 FUN_1000_beff READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:bfca FUN_1000_beff READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:bfd9 FUN_1000_beff UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:bfe4 FUN_1000_beff DATA 1 true Stack[0x4] - +1000:bff5 FUN_1000_beff READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:bff8 FUN_1000_beff READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:c007 FUN_1000_beff UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:c012 FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c023 FUN_1000_beff READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:c026 FUN_1000_beff READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:c039 FUN_1000_beff UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:c03e FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c04f FUN_1000_beff READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:c052 FUN_1000_beff READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:c065 FUN_1000_beff UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:c06a FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c081 FUN_1000_beff CONDITIONAL_JUMP 0 true 1000:c08d Code1 LAB_1000_c08d +1000:c083 FUN_1000_beff CONDITIONAL_JUMP 0 true 1000:c0d5 Code1 LAB_1000_c0d5 +1000:c08b FUN_1000_beff CONDITIONAL_JUMP 0 true 1000:c0d5 Code1 LAB_1000_c0d5 +1000:c08d FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c0ae FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c0b5 FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c0cc FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c0d3 FUN_1000_beff UNCONDITIONAL_JUMP 0 true 1000:c0f9 Code1 LAB_1000_c0f9 +1000:c0d5 FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c0ec FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c0f9 FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c106 FUN_1000_beff CONDITIONAL_JUMP 0 true 1000:c112 Code1 LAB_1000_c112 +1000:c108 FUN_1000_beff CONDITIONAL_JUMP 0 true 1000:c15a Code1 LAB_1000_c15a +1000:c110 FUN_1000_beff CONDITIONAL_JUMP 0 true 1000:c15a Code1 LAB_1000_c15a +1000:c112 FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c133 FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c13a FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c151 FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c158 FUN_1000_beff UNCONDITIONAL_JUMP 0 true 1000:c17e Code1 LAB_1000_c17e +1000:c15a FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c171 FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c17e FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c191 FUN_1000_beff CONDITIONAL_JUMP 0 true 1000:c19a Code1 LAB_1000_c19a +1000:c1a0 FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c1a7 FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c1ba FUN_1000_beff CONDITIONAL_JUMP 0 true 1000:c1c3 Code1 LAB_1000_c1c3 +1000:c1c9 FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c1d4 FUN_1000_beff READ 0 true 1028:085b Data6 DAT_1028_085b +1000:c1d8 FUN_1000_beff UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:c1dd FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c1ec FUN_1000_beff UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:c1f1 FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c20c FUN_1000_beff DATA 0 true Stack[-0x20] - +1000:c210 FUN_1000_beff DATA 0 true Stack[-0x22] - +1000:c219 FUN_1000_beff UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:c21e FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c225 FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c230 FUN_1000_beff UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:c235 FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c256 FUN_1000_beff UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:c25b FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c262 FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c26d FUN_1000_beff UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:c272 FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c293 FUN_1000_beff UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:c298 FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c2a6 FUN_1000_beff CONDITIONAL_JUMP 0 true 1000:c2c7 Code1 LAB_1000_c2c7 +1000:c2ae FUN_1000_beff CONDITIONAL_JUMP 0 true 1000:c2b8 Code1 LAB_1000_c2b8 +1000:c2b6 FUN_1000_beff UNCONDITIONAL_JUMP 0 true 1000:c2c7 Code1 LAB_1000_c2c7 +1000:c2bb FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c2c7 FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c2ce FUN_1000_beff DATA 0 true Stack[-0x20] - +1000:c2d2 FUN_1000_beff DATA 0 true Stack[-0x22] - +1000:c2eb FUN_1000_beff UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:c2f0 FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c2fb FUN_1000_beff UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:c300 FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c30b FUN_1000_beff UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:c310 FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c31b FUN_1000_beff UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:c320 FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c327 FUN_1000_beff UNCONDITIONAL_CALL 0 true 1228:0168 EXTERNAL DELETEOBJECT DELETEOBJECT +1000:c32c FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c333 FUN_1000_beff UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1000:c338 FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c33f FUN_1000_beff UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1000:c344 FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c34b FUN_1000_beff UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1000:c350 FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c35b FUN_1000_beff DATA 1 true Stack[0x4] - +1000:c362 FUN_1000_beff UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:c36e FUN_1000_c36b DATA 1 true Stack[0x6] - +1000:c37c FUN_1000_c36b WRITE 0 true 1028:07d3 Data6 DAT_1028_07d3 +1000:c37f FUN_1000_c36b WRITE 0 true 1028:07d5 Data6 DAT_1028_07d5 +1000:c383 FUN_1000_c36b DATA 1 true Stack[0x6] - +1000:c391 FUN_1000_c36b WRITE 0 true 1028:07d7 Data6 DAT_1028_07d7 +1000:c394 FUN_1000_c36b WRITE 0 true 1028:07d9 Data6 DAT_1028_07d9 +1000:c398 FUN_1000_c36b DATA 1 true Stack[0x6] - +1000:c3a6 FUN_1000_c36b DATA 1 true Stack[0x4] - +1000:c3b7 FUN_1000_c36b DATA 1 true Stack[0x6] - +1000:c3c5 FUN_1000_c36b DATA 1 true Stack[0x4] - +1000:c3d6 FUN_1000_c36b DATA 1 true Stack[0x6] - +1000:c3ed FUN_1000_c36b DATA 1 true Stack[0x4] - +1000:c403 FUN_1000_c36b DATA 1 true Stack[0x6] - +1000:c411 FUN_1000_c36b DATA 1 true Stack[0x4] - +1000:c429 FUN_1000_c426 READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:c42c FUN_1000_c426 READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:c430 FUN_1000_c426 DATA 1 true Stack[0x6] - +1000:c43e FUN_1000_c426 READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:c441 FUN_1000_c426 READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:c445 FUN_1000_c426 DATA 1 true Stack[0x6] - +1000:c453 FUN_1000_c426 DATA 1 true Stack[0x4] - +1000:c464 FUN_1000_c426 DATA 1 true Stack[0x6] - +1000:c472 FUN_1000_c426 DATA 1 true Stack[0x4] - +1000:c483 FUN_1000_c426 DATA 1 true Stack[0x6] - +1000:c491 FUN_1000_c426 DATA 1 true Stack[0x4] - +1000:c4a7 FUN_1000_c426 DATA 1 true Stack[0x6] - +1000:c4be FUN_1000_c426 DATA 1 true Stack[0x4] - +1000:c4cf FUN_1000_c426 DATA 1 true Stack[0x6] - +1000:c4e4 FUN_1000_c4e1 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:c4f4 FUN_1000_c4e1 CONDITIONAL_JUMP 0 true 1000:c55c Code1 LAB_1000_c55c +1000:c4f6 FUN_1000_c4e1 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:c512 FUN_1000_c4e1 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:c524 FUN_1000_c4e1 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:c537 FUN_1000_c4e1 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:c549 FUN_1000_c4e1 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:c550 FUN_1000_c4e1 DATA 1 true Stack[0x4] - +1000:c554 FUN_1000_c4e1 UNCONDITIONAL_CALL 0 true 1000:bda2 Code1 FUN_1000_bda2 FUN_1000_bda2 +1000:c559 FUN_1000_c4e1 UNCONDITIONAL_JUMP 0 true 1000:c798 Code1 LAB_1000_c798 +1000:c55f FUN_1000_c4e1 CONDITIONAL_JUMP 0 true 1000:c5c7 Code1 LAB_1000_c5c7 +1000:c561 FUN_1000_c4e1 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:c57d FUN_1000_c4e1 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:c58f FUN_1000_c4e1 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:c5a2 FUN_1000_c4e1 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:c5b4 FUN_1000_c4e1 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:c5bb FUN_1000_c4e1 DATA 1 true Stack[0x4] - +1000:c5bf FUN_1000_c4e1 UNCONDITIONAL_CALL 0 true 1000:bda2 Code1 FUN_1000_bda2 FUN_1000_bda2 +1000:c5c4 FUN_1000_c4e1 UNCONDITIONAL_JUMP 0 true 1000:c798 Code1 LAB_1000_c798 +1000:c5ca FUN_1000_c4e1 CONDITIONAL_JUMP 0 true 1000:c632 Code1 LAB_1000_c632 +1000:c5cc FUN_1000_c4e1 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:c5e8 FUN_1000_c4e1 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:c5fa FUN_1000_c4e1 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:c60d FUN_1000_c4e1 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:c61f FUN_1000_c4e1 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:c626 FUN_1000_c4e1 DATA 1 true Stack[0x4] - +1000:c62a FUN_1000_c4e1 UNCONDITIONAL_CALL 0 true 1000:bda2 Code1 FUN_1000_bda2 FUN_1000_bda2 +1000:c62f FUN_1000_c4e1 UNCONDITIONAL_JUMP 0 true 1000:c798 Code1 LAB_1000_c798 +1000:c635 FUN_1000_c4e1 CONDITIONAL_JUMP 0 true 1000:c69d Code1 LAB_1000_c69d +1000:c637 FUN_1000_c4e1 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:c653 FUN_1000_c4e1 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:c665 FUN_1000_c4e1 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:c678 FUN_1000_c4e1 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:c68a FUN_1000_c4e1 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:c691 FUN_1000_c4e1 DATA 1 true Stack[0x4] - +1000:c695 FUN_1000_c4e1 UNCONDITIONAL_CALL 0 true 1000:bda2 Code1 FUN_1000_bda2 FUN_1000_bda2 +1000:c69a FUN_1000_c4e1 UNCONDITIONAL_JUMP 0 true 1000:c798 Code1 LAB_1000_c798 +1000:c6a0 FUN_1000_c4e1 CONDITIONAL_JUMP 0 true 1000:c708 Code1 LAB_1000_c708 +1000:c6a2 FUN_1000_c4e1 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:c6be FUN_1000_c4e1 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:c6d0 FUN_1000_c4e1 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:c6e3 FUN_1000_c4e1 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:c6f5 FUN_1000_c4e1 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:c6fc FUN_1000_c4e1 DATA 1 true Stack[0x4] - +1000:c700 FUN_1000_c4e1 UNCONDITIONAL_CALL 0 true 1000:bda2 Code1 FUN_1000_bda2 FUN_1000_bda2 +1000:c705 FUN_1000_c4e1 UNCONDITIONAL_JUMP 0 true 1000:c798 Code1 LAB_1000_c798 +1000:c70b FUN_1000_c4e1 CONDITIONAL_JUMP 0 true 1000:c765 Code1 LAB_1000_c765 +1000:c70d FUN_1000_c4e1 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:c720 FUN_1000_c4e1 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:c732 FUN_1000_c4e1 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:c739 FUN_1000_c4e1 DATA 1 true Stack[0x4] - +1000:c73d FUN_1000_c4e1 UNCONDITIONAL_CALL 0 true 1000:bc36 Code1 FUN_1000_bc36 FUN_1000_bc36 +1000:c742 FUN_1000_c4e1 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:c75a FUN_1000_c4e1 DATA 1 true Stack[0x4] - +1000:c75e FUN_1000_c4e1 UNCONDITIONAL_CALL 0 true 1000:bda2 Code1 FUN_1000_bda2 FUN_1000_bda2 +1000:c763 FUN_1000_c4e1 UNCONDITIONAL_JUMP 0 true 1000:c798 Code1 LAB_1000_c798 +1000:c768 FUN_1000_c4e1 CONDITIONAL_JUMP 0 true 1000:c798 Code1 LAB_1000_c798 +1000:c76a FUN_1000_c4e1 READ 0 true 1028:399a Data6 DAT_1028_399a +1000:c76f FUN_1000_c4e1 CONDITIONAL_JUMP 0 true 1000:c798 Code1 LAB_1000_c798 +1000:c771 FUN_1000_c4e1 DATA 1 true Stack[0x6] - +1000:c779 FUN_1000_c4e1 READ 1 true 1028:399a Data6 DAT_1028_399a +1000:c780 FUN_1000_c4e1 CONDITIONAL_JUMP 0 true 1000:c786 Code1 LAB_1000_c786 +1000:c784 FUN_1000_c4e1 CONDITIONAL_JUMP 0 true 1000:c798 Code1 LAB_1000_c798 +1000:c786 FUN_1000_c4e1 DATA 1 true Stack[0x4] - +1000:c793 FUN_1000_c4e1 WRITE 0 true 1028:0874 Data6 DAT_1028_0874 +1000:c7a0 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:c7b1 FUN_1000_c79c READ 1 true 1028:0871 Data6 DAT_1028_0871 +1000:c7b4 FUN_1000_c79c DATA 0 true Stack[-0xa] - +1000:c7bd FUN_1000_c79c DATA 0 true Stack[-0x2770] - +1000:c7c4 FUN_1000_c79c DATA 1 true Stack[-0x2770] - +1000:c7c8 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:c7cd Code1 LAB_1000_c7cd +1000:c7ca FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:eaad Code1 LAB_1000_eaad +1000:c7cd FUN_1000_c79c DATA 0 true Stack[-0x8] - +1000:c7d0 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:c7d5 Code1 LAB_1000_c7d5 +1000:c7d2 FUN_1000_c79c DATA 0 true Stack[-0x8] - +1000:c7d5 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:c7e1 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:c7f3 Code1 LAB_1000_c7f3 +1000:c7e3 FUN_1000_c79c DATA 1 true Stack[-0x8] - +1000:c7ea FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:c7ee FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1000:c36b Code1 FUN_1000_c36b FUN_1000_c36b +1000:c7f3 FUN_1000_c79c READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:c7f6 FUN_1000_c79c READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:c7fa FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:c80b FUN_1000_c79c READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:c80e FUN_1000_c79c READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:c81c FUN_1000_c79c DATA 1 true Stack[-0xa] - +1000:c81f FUN_1000_c79c DATA 0 true Stack[-0x2772] - +1000:c826 FUN_1000_c79c DATA 1 true Stack[-0x2772] - +1000:c82a FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:c82f Code1 LAB_1000_c82f +1000:c82c FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:ea63 Code1 LAB_1000_ea63 +1000:c82f FUN_1000_c79c DATA 0 true Stack[-0x2762] - +1000:c833 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:c839 Code1 LAB_1000_c839 +1000:c835 FUN_1000_c79c DATA 0 true Stack[-0x2762] - +1000:c839 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:c866 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:c873 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:c878 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff1 Code5 FUN_1020_0ff1 FUN_1020_0ff1 +1000:c880 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:c891 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:c89e FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:c8a3 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff1 Code5 FUN_1020_0ff1 FUN_1020_0ff1 +1000:c8ab FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0fe5 Code5 FUN_1020_0fe5 FUN_1020_0fe5 +1000:c8b0 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:10be Code5 FUN_1020_10be FUN_1020_10be +1000:c8bd FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:c8c2 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:c8c7 FUN_1000_c79c DATA 0 true Stack[-0x16] - +1000:c8ca FUN_1000_c79c DATA 0 true Stack[-0x14] - +1000:c8cd FUN_1000_c79c DATA 1 true Stack[-0x16] - +1000:c8d0 FUN_1000_c79c DATA 1 true Stack[-0x14] - +1000:c8d3 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:c8de FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:c8ee Code1 LAB_1000_c8ee +1000:c8e0 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:c8e5 Code1 LAB_1000_c8e5 +1000:c8e2 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:c9ee Code1 LAB_1000_c9ee +1000:c8e9 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:c8ee Code1 LAB_1000_c8ee +1000:c8eb FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:c9ee Code1 LAB_1000_c9ee +1000:c8ee FUN_1000_c79c DATA 1 true Stack[-0x16] - +1000:c8f1 FUN_1000_c79c DATA 1 true Stack[-0x14] - +1000:c8f4 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:c8fc FUN_1000_c79c DATA 1 true Stack[-0x16] - +1000:c8ff FUN_1000_c79c DATA 1 true Stack[-0x14] - +1000:c902 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:c911 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:c919 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:c921 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:c932 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:c93a FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:c93f FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:c948 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:c967 FUN_1000_c79c DATA 1 true Stack[-0x16] - +1000:c96a FUN_1000_c79c DATA 1 true Stack[-0x14] - +1000:c96d FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:c975 FUN_1000_c79c DATA 1 true Stack[-0x16] - +1000:c978 FUN_1000_c79c DATA 1 true Stack[-0x14] - +1000:c97b FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:c98a FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:c992 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:c99a FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:c9ab FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:c9b3 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:c9b8 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:c9c1 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:c9e8 FUN_1000_c79c DATA 0 true Stack[-0x16] - +1000:c9eb FUN_1000_c79c DATA 0 true Stack[-0x14] - +1000:c9ee FUN_1000_c79c READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:c9f1 FUN_1000_c79c READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:c9f5 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:ca06 FUN_1000_c79c READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:ca09 FUN_1000_c79c READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:ca17 FUN_1000_c79c READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:ca1a FUN_1000_c79c READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:ca28 FUN_1000_c79c WRITE 0 true 1028:07db Data6 DAT_1028_07db +1000:ca2b FUN_1000_c79c WRITE 0 true 1028:07dd Data6 DAT_1028_07dd +1000:ca2f FUN_1000_c79c READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:ca32 FUN_1000_c79c READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:ca40 FUN_1000_c79c WRITE 0 true 1028:07df Data6 DAT_1028_07df +1000:ca43 FUN_1000_c79c WRITE 0 true 1028:07e1 Data6 DAT_1028_07e1 +1000:ca51 FUN_1000_c79c DATA 0 true Stack[-0xe] - +1000:ca54 FUN_1000_c79c DATA 0 true Stack[-0xc] - +1000:ca61 FUN_1000_c79c DATA 0 true Stack[-0x12] - +1000:ca64 FUN_1000_c79c DATA 0 true Stack[-0x10] - +1000:ca71 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:ca76 FUN_1000_c79c DATA 0 true Stack[-0x82] - +1000:ca79 FUN_1000_c79c DATA 0 true Stack[-0x80] - +1000:ca7c FUN_1000_c79c DATA 0 true Stack[-0x7e] - +1000:ca7f FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:ca90 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:ca95 FUN_1000_c79c DATA 0 true Stack[-0x88] - +1000:ca99 FUN_1000_c79c DATA 0 true Stack[-0x86] - +1000:ca9d FUN_1000_c79c DATA 0 true Stack[-0x84] - +1000:caa1 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:cab7 FUN_1000_c79c DATA 0 true Stack[-0x40] - +1000:caba FUN_1000_c79c DATA 0 true Stack[-0x3e] - +1000:cabd FUN_1000_c79c DATA 0 true Stack[-0x3c] - +1000:cac2 FUN_1000_c79c DATA 0 true Stack[-0x2760] - +1000:cac6 FUN_1000_c79c DATA 0 true Stack[-0x70] - +1000:cacb FUN_1000_c79c DATA 0 true Stack[-0x6e] - +1000:cad2 FUN_1000_c79c DATA 0 true Stack[-0x22] - +1000:cad5 FUN_1000_c79c DATA 0 true Stack[-0x20] - +1000:cad8 FUN_1000_c79c READ 0 true 1028:07dd Data6 DAT_1028_07dd +1000:cadd FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cb1a Code1 LAB_1000_cb1a +1000:cadf FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cae8 Code1 LAB_1000_cae8 +1000:cae1 FUN_1000_c79c READ 0 true 1028:07db Data6 DAT_1028_07db +1000:cae6 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cb1a Code1 LAB_1000_cb1a +1000:cae8 FUN_1000_c79c READ 0 true 1028:07dd Data6 DAT_1028_07dd +1000:caed FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cb1a Code1 LAB_1000_cb1a +1000:caef FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:caf9 Code1 LAB_1000_caf9 +1000:caf1 FUN_1000_c79c READ 0 true 1028:07db Data6 DAT_1028_07db +1000:caf7 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cb1a Code1 LAB_1000_cb1a +1000:caf9 FUN_1000_c79c READ 0 true 1028:07e1 Data6 DAT_1028_07e1 +1000:cafe FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cb1a Code1 LAB_1000_cb1a +1000:cb00 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cb09 Code1 LAB_1000_cb09 +1000:cb02 FUN_1000_c79c READ 0 true 1028:07df Data6 DAT_1028_07df +1000:cb07 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cb1a Code1 LAB_1000_cb1a +1000:cb09 FUN_1000_c79c READ 0 true 1028:07e1 Data6 DAT_1028_07e1 +1000:cb0e FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cb1a Code1 LAB_1000_cb1a +1000:cb10 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cb47 Code1 LAB_1000_cb47 +1000:cb12 FUN_1000_c79c READ 0 true 1028:07df Data6 DAT_1028_07df +1000:cb18 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cb47 Code1 LAB_1000_cb47 +1000:cb1a FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:cb26 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cb3e Code1 LAB_1000_cb3e +1000:cb28 FUN_1000_c79c DATA 1 true Stack[-0x8] - +1000:cb32 FUN_1000_c79c WRITE 0 true 1028:424c Data6 DAT_1028_424c +1000:cb37 FUN_1000_c79c WRITE 0 true 1028:0874 Data6 DAT_1028_0874 +1000:cb3c FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:cb47 Code1 LAB_1000_cb47 +1000:cb3e FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:cb42 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1000:ae6e Code1 FUN_1000_ae6e FUN_1000_ae6e +1000:cb47 FUN_1000_c79c READ 0 true 1028:07d9 Data6 DAT_1028_07d9 +1000:cb4c FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cb58 Code1 LAB_1000_cb58 +1000:cb4e FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cb60 Code1 LAB_1000_cb60 +1000:cb50 FUN_1000_c79c READ 0 true 1028:07d7 Data6 DAT_1028_07d7 +1000:cb56 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cb60 Code1 LAB_1000_cb60 +1000:cb58 FUN_1000_c79c DATA 0 true Stack[-0x2764] - +1000:cb5e FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:cb66 Code1 LAB_1000_cb66 +1000:cb60 FUN_1000_c79c DATA 0 true Stack[-0x2764] - +1000:cb66 FUN_1000_c79c DATA 0 true Stack[-0x4] - +1000:cb6b FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:cb70 Code1 LAB_1000_cb70 +1000:cb6d FUN_1000_c79c DATA 0 true Stack[-0x4] - +1000:cb70 FUN_1000_c79c DATA 1 true Stack[-0x4] - +1000:cb7a FUN_1000_c79c DATA 0 true Stack[-0x2776] - +1000:cb7e FUN_1000_c79c DATA 0 true Stack[-0x2774] - +1000:cb82 FUN_1000_c79c DATA 0 true Stack[-0x95] - +1000:cb87 FUN_1000_c79c READ 1 true 1028:09f7 Data6 DAT_1028_09f7 +1000:cb87 FUN_1000_c79c READ 1 false 1028:0a4a Data6 DAT_1028_0a4a +1000:cb8b FUN_1000_c79c DATA 1 true Stack[-0x2764] - +1000:cb91 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cb96 Code1 LAB_1000_cb96 +1000:cb93 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:e1b9 Code1 LAB_1000_e1b9 +1000:cb96 FUN_1000_c79c READ 0 true 1028:0a35 Data6 DAT_1028_0a35 +1000:cb9b FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cba0 Code1 LAB_1000_cba0 +1000:cb9d FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:e1b9 Code1 LAB_1000_e1b9 +1000:cba0 FUN_1000_c79c READ 0 true 1028:0a05 Data6 DAT_1028_0a05 +1000:cba4 FUN_1000_c79c READ 0 true 1028:0a03 Data6 DAT_1028_0a03 +1000:cba8 FUN_1000_c79c READ 0 true 1028:0a09 Data6 DAT_1028_0a09 +1000:cbac FUN_1000_c79c READ 0 true 1028:0a07 Data6 DAT_1028_0a07 +1000:cbb0 FUN_1000_c79c READ 0 true 1028:0a0d Data6 DAT_1028_0a0d +1000:cbb4 FUN_1000_c79c READ 0 true 1028:0a0b Data6 DAT_1028_0a0b +1000:cbb8 FUN_1000_c79c READ 0 true 1028:0a11 Data6 DAT_1028_0a11 +1000:cbbc FUN_1000_c79c READ 0 true 1028:0a0f Data6 DAT_1028_0a0f +1000:cbc0 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:cbc4 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1000:9b69 Code1 FUN_1000_9b69 FUN_1000_9b69 +1000:cbcb FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cbd0 Code1 LAB_1000_cbd0 +1000:cbcd FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:e1b9 Code1 LAB_1000_e1b9 +1000:cbd0 FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:cbd4 FUN_1000_c79c READ 1 true 1028:0a01 Data6 DAT_1028_0a01 +1000:cbd9 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cbde Code1 LAB_1000_cbde +1000:cbdb FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:cfb5 Code1 LAB_1000_cfb5 +1000:cbe1 FUN_1000_c79c DATA 1 true Stack[-0x8] - +1000:cbe4 FUN_1000_c79c DATA 1 true Stack[-0x4] - +1000:cbe7 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cbec Code1 LAB_1000_cbec +1000:cbe9 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:cfb2 Code1 LAB_1000_cfb2 +1000:cbec FUN_1000_c79c READ 1 true 1028:0a17 Data6 DAT_1028_0a17 +1000:cbf0 FUN_1000_c79c READ 1 true 1028:0a19 Data6 DAT_1028_0a19 +1000:cbf4 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:cc05 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:cc12 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:cc17 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff1 Code5 FUN_1020_0ff1 FUN_1020_0ff1 +1000:cc1f FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:cc23 FUN_1000_c79c READ 1 true 1028:0a13 Data6 DAT_1028_0a13 +1000:cc27 FUN_1000_c79c READ 1 true 1028:0a15 Data6 DAT_1028_0a15 +1000:cc2b FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:cc3c FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:cc49 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:cc4e FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff1 Code5 FUN_1020_0ff1 FUN_1020_0ff1 +1000:cc56 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0fe5 Code5 FUN_1020_0fe5 FUN_1020_0fe5 +1000:cc5b FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:10be Code5 FUN_1020_10be FUN_1020_10be +1000:cc68 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:cc6d FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:cc74 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cc7d Code1 LAB_1000_cc7d +1000:cc7d FUN_1000_c79c DATA 0 true Stack[-0x68] - +1000:cc80 FUN_1000_c79c DATA 0 true Stack[-0x66] - +1000:cc83 FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:cc87 FUN_1000_c79c READ 1 true 1028:0a23 Data6 DAT_1028_0a23 +1000:cc8b FUN_1000_c79c READ 1 true 1028:0a25 Data6 DAT_1028_0a25 +1000:cc8f FUN_1000_c79c READ 1 true 1028:0a27 Data6 DAT_1028_0a27 +1000:cc93 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:cc9c FUN_1000_c79c DATA 1 true Stack[-0x68] - +1000:cc9f FUN_1000_c79c DATA 1 true Stack[-0x66] - +1000:cca6 FUN_1000_c79c DATA 0 true Stack[-0x68] - +1000:cca9 FUN_1000_c79c DATA 0 true Stack[-0x66] - +1000:ccac FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:ccb0 FUN_1000_c79c READ 0 true 1028:0a02 Data6 DAT_1028_0a02 +1000:ccb5 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cccf Code1 LAB_1000_cccf +1000:ccb7 FUN_1000_c79c DATA 1 true Stack[-0x16] - +1000:ccba FUN_1000_c79c DATA 1 true Stack[-0x14] - +1000:ccc3 FUN_1000_c79c DATA 1 true Stack[-0x66] - +1000:ccc6 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cd0a Code1 LAB_1000_cd0a +1000:ccc8 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cccf Code1 LAB_1000_cccf +1000:ccca FUN_1000_c79c DATA 1 true Stack[-0x68] - +1000:cccd FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cd0a Code1 LAB_1000_cd0a +1000:cccf FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:ccd3 FUN_1000_c79c READ 0 true 1028:0a02 Data6 DAT_1028_0a02 +1000:ccd8 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:ccdd Code1 LAB_1000_ccdd +1000:ccda FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:cfb2 Code1 LAB_1000_cfb2 +1000:ccdd FUN_1000_c79c DATA 1 true Stack[-0x16] - +1000:cce0 FUN_1000_c79c DATA 1 true Stack[-0x14] - +1000:cced FUN_1000_c79c DATA 1 true Stack[-0x68] - +1000:ccf0 FUN_1000_c79c DATA 1 true Stack[-0x66] - +1000:ccfc FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cd0a Code1 LAB_1000_cd0a +1000:ccfe FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cd03 Code1 LAB_1000_cd03 +1000:cd00 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:cfb2 Code1 LAB_1000_cfb2 +1000:cd05 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cd0a Code1 LAB_1000_cd0a +1000:cd07 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:cfb2 Code1 LAB_1000_cfb2 +1000:cd0a FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:cd0e FUN_1000_c79c READ 0 true 1028:0a02 Data6 DAT_1028_0a02 +1000:cd13 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cd18 Code1 LAB_1000_cd18 +1000:cd15 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:cdb1 Code1 LAB_1000_cdb1 +1000:cd18 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:cd29 FUN_1000_c79c READ 1 true 1028:07df Data6 DAT_1028_07df +1000:cd2d FUN_1000_c79c READ 1 true 1028:07e1 Data6 DAT_1028_07e1 +1000:cd36 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:cd3f FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:cd43 FUN_1000_c79c READ 1 true 1028:0a17 Data6 DAT_1028_0a17 +1000:cd47 FUN_1000_c79c READ 1 true 1028:0a19 Data6 DAT_1028_0a19 +1000:cd4f FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:cd54 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:cd59 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:cd5e FUN_1000_c79c DATA 0 true Stack[-0x76] - +1000:cd61 FUN_1000_c79c DATA 0 true Stack[-0x74] - +1000:cd64 FUN_1000_c79c DATA 0 true Stack[-0x72] - +1000:cd67 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:cd78 FUN_1000_c79c READ 1 true 1028:07db Data6 DAT_1028_07db +1000:cd7c FUN_1000_c79c READ 1 true 1028:07dd Data6 DAT_1028_07dd +1000:cd85 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:cd8a FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:cd8e FUN_1000_c79c READ 1 true 1028:0a13 Data6 DAT_1028_0a13 +1000:cd92 FUN_1000_c79c READ 1 true 1028:0a15 Data6 DAT_1028_0a15 +1000:cd96 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:cd9b FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:cda0 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:cda5 FUN_1000_c79c DATA 0 true Stack[-0x7c] - +1000:cda8 FUN_1000_c79c DATA 0 true Stack[-0x7a] - +1000:cdab FUN_1000_c79c DATA 0 true Stack[-0x78] - +1000:cdae FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:ce47 Code1 LAB_1000_ce47 +1000:cdb1 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:cdc2 FUN_1000_c79c READ 1 true 1028:07df Data6 DAT_1028_07df +1000:cdc6 FUN_1000_c79c READ 1 true 1028:07e1 Data6 DAT_1028_07e1 +1000:cdcf FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:cdd8 FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:cddc FUN_1000_c79c READ 1 true 1028:0a17 Data6 DAT_1028_0a17 +1000:cde0 FUN_1000_c79c READ 1 true 1028:0a19 Data6 DAT_1028_0a19 +1000:cde8 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:cded FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:cdf2 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:cdf7 FUN_1000_c79c DATA 0 true Stack[-0x76] - +1000:cdfa FUN_1000_c79c DATA 0 true Stack[-0x74] - +1000:cdfd FUN_1000_c79c DATA 0 true Stack[-0x72] - +1000:ce00 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:ce11 FUN_1000_c79c READ 1 true 1028:07db Data6 DAT_1028_07db +1000:ce15 FUN_1000_c79c READ 1 true 1028:07dd Data6 DAT_1028_07dd +1000:ce1e FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:ce23 FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:ce27 FUN_1000_c79c READ 1 true 1028:0a13 Data6 DAT_1028_0a13 +1000:ce2b FUN_1000_c79c READ 1 true 1028:0a15 Data6 DAT_1028_0a15 +1000:ce2f FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:ce34 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:ce39 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:ce3e FUN_1000_c79c DATA 0 true Stack[-0x7c] - +1000:ce41 FUN_1000_c79c DATA 0 true Stack[-0x7a] - +1000:ce44 FUN_1000_c79c DATA 0 true Stack[-0x78] - +1000:ce47 FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:ce4b FUN_1000_c79c READ 0 true 1028:0a02 Data6 DAT_1028_0a02 +1000:ce50 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:ce84 Code1 LAB_1000_ce84 +1000:ce52 FUN_1000_c79c DATA 1 true Stack[-0x76] - +1000:ce55 FUN_1000_c79c DATA 1 true Stack[-0x74] - +1000:ce58 FUN_1000_c79c DATA 1 true Stack[-0x72] - +1000:ce5d FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:ce62 Code1 LAB_1000_ce62 +1000:ce62 FUN_1000_c79c DATA 0 true Stack[-0x76] - +1000:ce65 FUN_1000_c79c DATA 0 true Stack[-0x74] - +1000:ce68 FUN_1000_c79c DATA 0 true Stack[-0x72] - +1000:ce6b FUN_1000_c79c DATA 1 true Stack[-0x7c] - +1000:ce6e FUN_1000_c79c DATA 1 true Stack[-0x7a] - +1000:ce71 FUN_1000_c79c DATA 1 true Stack[-0x78] - +1000:ce76 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:ce7b Code1 LAB_1000_ce7b +1000:ce7b FUN_1000_c79c DATA 0 true Stack[-0x7c] - +1000:ce7e FUN_1000_c79c DATA 0 true Stack[-0x7a] - +1000:ce81 FUN_1000_c79c DATA 0 true Stack[-0x78] - +1000:ce84 FUN_1000_c79c DATA 1 true Stack[-0x7c] - +1000:ce87 FUN_1000_c79c DATA 1 true Stack[-0x7a] - +1000:ce8a FUN_1000_c79c DATA 1 true Stack[-0x78] - +1000:ce95 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:ce9a FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff1 Code5 FUN_1020_0ff1 FUN_1020_0ff1 +1000:cea2 FUN_1000_c79c DATA 1 true Stack[-0x76] - +1000:cea5 FUN_1000_c79c DATA 1 true Stack[-0x74] - +1000:cea8 FUN_1000_c79c DATA 1 true Stack[-0x72] - +1000:ceb3 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:ceb8 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff1 Code5 FUN_1020_0ff1 FUN_1020_0ff1 +1000:cec0 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0fe5 Code5 FUN_1020_0fe5 FUN_1020_0fe5 +1000:cec5 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:10be Code5 FUN_1020_10be FUN_1020_10be +1000:ced2 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:ced7 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:cedc FUN_1000_c79c DATA 0 true Stack[-0x5c] - +1000:cedf FUN_1000_c79c DATA 0 true Stack[-0x5a] - +1000:cee2 FUN_1000_c79c DATA 0 true Stack[-0x5a] - +1000:cee6 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cef0 Code1 LAB_1000_cef0 +1000:cee8 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cf4f Code1 LAB_1000_cf4f +1000:ceea FUN_1000_c79c DATA 0 true Stack[-0x5c] - +1000:ceee FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cf4f Code1 LAB_1000_cf4f +1000:cef0 FUN_1000_c79c DATA 1 true Stack[-0x5c] - +1000:cef3 FUN_1000_c79c DATA 1 true Stack[-0x5a] - +1000:cef6 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:cefe FUN_1000_c79c DATA 1 true Stack[-0x88] - +1000:cf02 FUN_1000_c79c DATA 1 true Stack[-0x86] - +1000:cf06 FUN_1000_c79c DATA 1 true Stack[-0x84] - +1000:cf0a FUN_1000_c79c DATA 1 true Stack[-0x76] - +1000:cf0d FUN_1000_c79c DATA 1 true Stack[-0x74] - +1000:cf10 FUN_1000_c79c DATA 1 true Stack[-0x72] - +1000:cf13 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:cf1b FUN_1000_c79c DATA 1 true Stack[-0x82] - +1000:cf1e FUN_1000_c79c DATA 1 true Stack[-0x80] - +1000:cf21 FUN_1000_c79c DATA 1 true Stack[-0x7e] - +1000:cf24 FUN_1000_c79c DATA 1 true Stack[-0x7c] - +1000:cf27 FUN_1000_c79c DATA 1 true Stack[-0x7a] - +1000:cf2a FUN_1000_c79c DATA 1 true Stack[-0x78] - +1000:cf2d FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:cf35 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0feb Code5 FUN_1020_0feb FUN_1020_0feb +1000:cf3d FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:cf42 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:cf47 FUN_1000_c79c DATA 0 true Stack[-0x64] - +1000:cf4a FUN_1000_c79c DATA 0 true Stack[-0x62] - +1000:cf4d FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:cf57 Code1 LAB_1000_cf57 +1000:cf51 FUN_1000_c79c DATA 0 true Stack[-0x64] - +1000:cf54 FUN_1000_c79c DATA 0 true Stack[-0x62] - +1000:cf57 FUN_1000_c79c DATA 0 true Stack[-0x62] - +1000:cf5b FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cf65 Code1 LAB_1000_cf65 +1000:cf5d FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cfb2 Code1 LAB_1000_cfb2 +1000:cf5f FUN_1000_c79c DATA 0 true Stack[-0x64] - +1000:cf63 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cfb2 Code1 LAB_1000_cfb2 +1000:cf65 FUN_1000_c79c DATA 1 true Stack[-0x68] - +1000:cf68 FUN_1000_c79c DATA 1 true Stack[-0x66] - +1000:cf6d FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cf76 Code1 LAB_1000_cf76 +1000:cf80 FUN_1000_c79c DATA 1 true Stack[-0x64] - +1000:cf83 FUN_1000_c79c DATA 1 true Stack[-0x62] - +1000:cf88 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cf91 Code1 LAB_1000_cf91 +1000:cf93 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cf9b Code1 LAB_1000_cf9b +1000:cf95 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cfb2 Code1 LAB_1000_cfb2 +1000:cf99 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cfb2 Code1 LAB_1000_cfb2 +1000:cf9b FUN_1000_c79c DATA 1 true Stack[-0x68] - +1000:cf9e FUN_1000_c79c DATA 1 true Stack[-0x66] - +1000:cfa7 FUN_1000_c79c DATA 0 true Stack[-0x68] - +1000:cfaa FUN_1000_c79c DATA 0 true Stack[-0x66] - +1000:cfad FUN_1000_c79c DATA 0 true Stack[-0x95] - +1000:cfb2 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:e060 Code1 LAB_1000_e060 +1000:cfb7 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cfbc Code1 LAB_1000_cfbc +1000:cfb9 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:d403 Code1 LAB_1000_d403 +1000:cfbc FUN_1000_c79c READ 0 true 1028:07c6 Data6 DAT_1028_07c6 +1000:cfc1 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cfc6 Code1 LAB_1000_cfc6 +1000:cfc3 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:d400 Code1 LAB_1000_d400 +1000:cfc6 FUN_1000_c79c WRITE 0 true 1028:0875 Data6 DAT_1028_0875 +1000:cfcb FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:cfcf FUN_1000_c79c READ 1 true 1028:0a23 Data6 DAT_1028_0a23 +1000:cfd3 FUN_1000_c79c READ 1 true 1028:0a25 Data6 DAT_1028_0a25 +1000:cfd7 FUN_1000_c79c READ 1 true 1028:0a27 Data6 DAT_1028_0a27 +1000:cfdb FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:cfe3 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cff2 Code1 LAB_1000_cff2 +1000:cfe5 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cfea Code1 LAB_1000_cfea +1000:cfe7 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:d2cd Code1 LAB_1000_d2cd +1000:cfed FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:cff2 Code1 LAB_1000_cff2 +1000:cfef FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:d2cd Code1 LAB_1000_d2cd +1000:cff2 FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:cff6 FUN_1000_c79c READ 1 true 1028:0a17 Data6 DAT_1028_0a17 +1000:cffa FUN_1000_c79c READ 1 true 1028:0a19 Data6 DAT_1028_0a19 +1000:cffe FUN_1000_c79c READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:d002 FUN_1000_c79c READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:d006 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:d013 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:d018 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff1 Code5 FUN_1020_0ff1 FUN_1020_0ff1 +1000:d020 FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:d024 FUN_1000_c79c READ 1 true 1028:0a13 Data6 DAT_1028_0a13 +1000:d028 FUN_1000_c79c READ 1 true 1028:0a15 Data6 DAT_1028_0a15 +1000:d02c FUN_1000_c79c READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:d030 FUN_1000_c79c READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:d034 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:d041 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:d046 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff1 Code5 FUN_1020_0ff1 FUN_1020_0ff1 +1000:d04e FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0fe5 Code5 FUN_1020_0fe5 FUN_1020_0fe5 +1000:d053 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:10be Code5 FUN_1020_10be FUN_1020_10be +1000:d060 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:d065 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:d06c FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d075 Code1 LAB_1000_d075 +1000:d075 FUN_1000_c79c DATA 0 true Stack[-0x68] - +1000:d078 FUN_1000_c79c DATA 0 true Stack[-0x66] - +1000:d07b FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:d07f FUN_1000_c79c READ 1 true 1028:0a17 Data6 DAT_1028_0a17 +1000:d083 FUN_1000_c79c READ 1 true 1028:0a19 Data6 DAT_1028_0a19 +1000:d087 FUN_1000_c79c READ 1 true 1028:07df Data6 DAT_1028_07df +1000:d08b FUN_1000_c79c READ 1 true 1028:07e1 Data6 DAT_1028_07e1 +1000:d08f FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:d09c FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:d0a1 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff1 Code5 FUN_1020_0ff1 FUN_1020_0ff1 +1000:d0a9 FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:d0ad FUN_1000_c79c READ 1 true 1028:0a13 Data6 DAT_1028_0a13 +1000:d0b1 FUN_1000_c79c READ 1 true 1028:0a15 Data6 DAT_1028_0a15 +1000:d0b5 FUN_1000_c79c READ 1 true 1028:07db Data6 DAT_1028_07db +1000:d0b9 FUN_1000_c79c READ 1 true 1028:07dd Data6 DAT_1028_07dd +1000:d0bd FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:d0ca FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:d0cf FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff1 Code5 FUN_1020_0ff1 FUN_1020_0ff1 +1000:d0d7 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0fe5 Code5 FUN_1020_0fe5 FUN_1020_0fe5 +1000:d0dc FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:10be Code5 FUN_1020_10be FUN_1020_10be +1000:d0e9 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:d0ee FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:d0f5 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d0fe Code1 LAB_1000_d0fe +1000:d0fe FUN_1000_c79c DATA 0 true Stack[-0x6c] - +1000:d101 FUN_1000_c79c DATA 0 true Stack[-0x6a] - +1000:d104 FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:d108 FUN_1000_c79c READ 1 true 1028:0a23 Data6 DAT_1028_0a23 +1000:d10c FUN_1000_c79c READ 1 true 1028:0a25 Data6 DAT_1028_0a25 +1000:d110 FUN_1000_c79c READ 1 true 1028:0a27 Data6 DAT_1028_0a27 +1000:d114 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:d119 FUN_1000_c79c DATA 1 true Stack[-0x6a] - +1000:d11c FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d12b Code1 LAB_1000_d12b +1000:d11e FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d123 Code1 LAB_1000_d123 +1000:d120 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:d2bb Code1 LAB_1000_d2bb +1000:d123 FUN_1000_c79c DATA 1 true Stack[-0x6c] - +1000:d126 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d12b Code1 LAB_1000_d12b +1000:d128 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:d2bb Code1 LAB_1000_d2bb +1000:d12b FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:d12f FUN_1000_c79c READ 1 true 1028:0a42 Data6 DAT_1028_0a42 +1000:d139 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d13e Code1 LAB_1000_d13e +1000:d13b FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:d2b9 Code1 LAB_1000_d2b9 +1000:d13e FUN_1000_c79c READ 1 true 1028:0a42 Data6 DAT_1028_0a42 +1000:d145 FUN_1000_c79c WRITE 0 true 1028:0a42 Data6 DAT_1028_0a42 +1000:d14b FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1008:0002 Code2 FUN_1008_0002 FUN_1008_0002 +1000:d150 FUN_1000_c79c READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:d15f FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:d163 FUN_1000_c79c READ 1 true 1028:0a46 Data6 DAT_1028_0a46 +1000:d167 FUN_1000_c79c READ 1 true 1028:0a48 Data6 DAT_1028_0a48 +1000:d16b FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:d172 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:d176 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1000:bc36 Code1 FUN_1000_bc36 FUN_1000_bc36 +1000:d17b FUN_1000_c79c DATA 0 true Stack[-0x4] - +1000:d180 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d185 Code1 LAB_1000_d185 +1000:d182 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:d215 Code1 LAB_1000_d215 +1000:d185 FUN_1000_c79c DATA 1 true Stack[-0x4] - +1000:d189 FUN_1000_c79c WRITE 0 true 1028:0a35 Data6 DAT_1028_0a35 +1000:d18e FUN_1000_c79c DATA 1 true Stack[-0x4] - +1000:d191 FUN_1000_c79c READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:d19a FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:d1aa FUN_1000_c79c DATA 0 true Stack[-0x4] - +1000:d1ad FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:d1b1 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1000:b3f3 Code1 FUN_1000_b3f3 FUN_1000_b3f3 +1000:d1b6 FUN_1000_c79c DATA 0 true Stack[-0x8] - +1000:d1b9 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:d1bd FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1000:c4e1 Code1 FUN_1000_c4e1 FUN_1000_c4e1 +1000:d1c2 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:d1cd FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:d1d2 FUN_1000_c79c DATA 0 true Stack[-0x276e] - +1000:d1d6 FUN_1000_c79c READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:d1e5 FUN_1000_c79c DATA 0 true Stack[-0x276e] - +1000:d1eb FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1000:0002 Code1 FUN_1000_0002 FUN_1000_0002 +1000:d1f0 FUN_1000_c79c DATA 0 true Stack[-0x276e] - +1000:d1fc FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1000:d201 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:d20c FUN_1000_c79c DATA 0 true Stack[-0x276e] - +1000:d210 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:d215 FUN_1000_c79c DATA 0 true Stack[-0x4] - +1000:d218 FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:d21c FUN_1000_c79c READ 0 true 1028:0a42 Data6 DAT_1028_0a42 +1000:d220 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:d224 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1000:b476 Code1 FUN_1000_b476 FUN_1000_b476 +1000:d229 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:14c1 Code5 FUN_1020_14c1 FUN_1020_14c1 +1000:d237 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:d24b FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0feb Code5 FUN_1020_0feb FUN_1020_0feb +1000:d253 FUN_1000_c79c DATA 1 true Stack[-0xe] - +1000:d256 FUN_1000_c79c DATA 1 true Stack[-0xc] - +1000:d259 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:d261 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:d266 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:d26b FUN_1000_c79c DATA 0 true Stack[-0xe] - +1000:d26e FUN_1000_c79c DATA 0 true Stack[-0xc] - +1000:d271 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:14c1 Code5 FUN_1020_14c1 FUN_1020_14c1 +1000:d27f FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:d293 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0feb Code5 FUN_1020_0feb FUN_1020_0feb +1000:d29b FUN_1000_c79c DATA 1 true Stack[-0x12] - +1000:d29e FUN_1000_c79c DATA 1 true Stack[-0x10] - +1000:d2a1 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:d2a9 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:d2ae FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:d2b3 FUN_1000_c79c DATA 0 true Stack[-0x12] - +1000:d2b6 FUN_1000_c79c DATA 0 true Stack[-0x10] - +1000:d2b9 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:d2ca Code1 LAB_1000_d2ca +1000:d2bb FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:d2bf FUN_1000_c79c READ 1 true 1028:0a42 Data6 DAT_1028_0a42 +1000:d2c6 FUN_1000_c79c WRITE 0 true 1028:0a42 Data6 DAT_1028_0a42 +1000:d2ca FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:d400 Code1 LAB_1000_d400 +1000:d2cd FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:d2d1 FUN_1000_c79c READ 0 true 1028:0a15 Data6 DAT_1028_0a15 +1000:d2d5 FUN_1000_c79c READ 0 true 1028:0a13 Data6 DAT_1028_0a13 +1000:d2d9 FUN_1000_c79c READ 0 true 1028:0a19 Data6 DAT_1028_0a19 +1000:d2dd FUN_1000_c79c READ 0 true 1028:0a17 Data6 DAT_1028_0a17 +1000:d2e1 FUN_1000_c79c READ 0 true 1028:0a1d Data6 DAT_1028_0a1d +1000:d2e5 FUN_1000_c79c READ 0 true 1028:0a1b Data6 DAT_1028_0a1b +1000:d2e9 FUN_1000_c79c READ 0 true 1028:0a21 Data6 DAT_1028_0a21 +1000:d2ed FUN_1000_c79c READ 0 true 1028:0a1f Data6 DAT_1028_0a1f +1000:d2f1 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:d2f5 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1000:9ae0 Code1 FUN_1000_9ae0 FUN_1000_9ae0 +1000:d2fc FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d301 Code1 LAB_1000_d301 +1000:d2fe FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:d400 Code1 LAB_1000_d400 +1000:d301 FUN_1000_c79c DATA 0 true Stack[-0x4] - +1000:d306 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d318 Code1 LAB_1000_d318 +1000:d308 FUN_1000_c79c DATA 0 true Stack[-0x4] - +1000:d30d FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d318 Code1 LAB_1000_d318 +1000:d30f FUN_1000_c79c DATA 0 true Stack[-0x4] - +1000:d313 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d318 Code1 LAB_1000_d318 +1000:d315 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:d400 Code1 LAB_1000_d400 +1000:d318 FUN_1000_c79c DATA 1 true Stack[-0xe] - +1000:d31b FUN_1000_c79c DATA 1 true Stack[-0xc] - +1000:d31e FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:d32c FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:d331 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:d336 FUN_1000_c79c DATA 0 true Stack[-0xe] - +1000:d339 FUN_1000_c79c DATA 0 true Stack[-0xc] - +1000:d33c FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:d34b FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:d353 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:14c1 Code5 FUN_1020_14c1 FUN_1020_14c1 +1000:d361 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:d373 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0feb Code5 FUN_1020_0feb FUN_1020_0feb +1000:d37b FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:d380 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:d38c FUN_1000_c79c DATA 0 true Stack[-0x12] - +1000:d38f FUN_1000_c79c DATA 0 true Stack[-0x10] - +1000:d392 FUN_1000_c79c READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:d395 FUN_1000_c79c READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:d399 FUN_1000_c79c DATA 1 true Stack[-0xe] - +1000:d39c FUN_1000_c79c DATA 1 true Stack[-0xc] - +1000:d39f FUN_1000_c79c WRITE 0 true 1028:07db Data6 DAT_1028_07db +1000:d3a2 FUN_1000_c79c WRITE 0 true 1028:07dd Data6 DAT_1028_07dd +1000:d3a6 FUN_1000_c79c READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:d3a9 FUN_1000_c79c READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:d3ad FUN_1000_c79c DATA 1 true Stack[-0x12] - +1000:d3b0 FUN_1000_c79c DATA 1 true Stack[-0x10] - +1000:d3b3 FUN_1000_c79c WRITE 0 true 1028:07df Data6 DAT_1028_07df +1000:d3b6 FUN_1000_c79c WRITE 0 true 1028:07e1 Data6 DAT_1028_07e1 +1000:d3ba FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:d3be FUN_1000_c79c READ 0 true 1028:0a15 Data6 DAT_1028_0a15 +1000:d3c2 FUN_1000_c79c READ 0 true 1028:0a13 Data6 DAT_1028_0a13 +1000:d3c6 FUN_1000_c79c READ 0 true 1028:0a19 Data6 DAT_1028_0a19 +1000:d3ca FUN_1000_c79c READ 0 true 1028:0a17 Data6 DAT_1028_0a17 +1000:d3ce FUN_1000_c79c READ 0 true 1028:0a1d Data6 DAT_1028_0a1d +1000:d3d2 FUN_1000_c79c READ 0 true 1028:0a1b Data6 DAT_1028_0a1b +1000:d3d6 FUN_1000_c79c READ 0 true 1028:0a21 Data6 DAT_1028_0a21 +1000:d3da FUN_1000_c79c READ 0 true 1028:0a1f Data6 DAT_1028_0a1f +1000:d3de FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:d3e2 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1000:9b69 Code1 FUN_1000_9b69 FUN_1000_9b69 +1000:d3e9 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d3f4 Code1 LAB_1000_d3f4 +1000:d3eb FUN_1000_c79c DATA 1 true Stack[-0x4] - +1000:d3ef FUN_1000_c79c WRITE 0 true 1028:0a35 Data6 DAT_1028_0a35 +1000:d3f4 FUN_1000_c79c DATA 0 true Stack[-0x4] - +1000:d3f7 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:d3fb FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1000:b3f3 Code1 FUN_1000_b3f3 FUN_1000_b3f3 +1000:d400 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:e060 Code1 LAB_1000_e060 +1000:d405 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d40a Code1 LAB_1000_d40a +1000:d407 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:d785 Code1 LAB_1000_d785 +1000:d40a FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:d40e FUN_1000_c79c READ 1 true 1028:0a1b Data6 DAT_1028_0a1b +1000:d412 FUN_1000_c79c READ 1 true 1028:0a1d Data6 DAT_1028_0a1d +1000:d416 FUN_1000_c79c READ 1 true 1028:0a13 Data6 DAT_1028_0a13 +1000:d41a FUN_1000_c79c READ 1 true 1028:0a15 Data6 DAT_1028_0a15 +1000:d41e FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:d423 FUN_1000_c79c DATA 0 true Stack[-0x76] - +1000:d426 FUN_1000_c79c DATA 0 true Stack[-0x74] - +1000:d429 FUN_1000_c79c DATA 0 true Stack[-0x72] - +1000:d42c FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:d430 FUN_1000_c79c READ 1 true 1028:0a1f Data6 DAT_1028_0a1f +1000:d434 FUN_1000_c79c READ 1 true 1028:0a21 Data6 DAT_1028_0a21 +1000:d438 FUN_1000_c79c READ 1 true 1028:0a17 Data6 DAT_1028_0a17 +1000:d43c FUN_1000_c79c READ 1 true 1028:0a19 Data6 DAT_1028_0a19 +1000:d440 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:d445 FUN_1000_c79c DATA 0 true Stack[-0x7c] - +1000:d448 FUN_1000_c79c DATA 0 true Stack[-0x7a] - +1000:d44b FUN_1000_c79c DATA 0 true Stack[-0x78] - +1000:d44e FUN_1000_c79c DATA 1 true Stack[-0x7c] - +1000:d451 FUN_1000_c79c DATA 1 true Stack[-0x7a] - +1000:d454 FUN_1000_c79c DATA 1 true Stack[-0x78] - +1000:d45f FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:d464 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff1 Code5 FUN_1020_0ff1 FUN_1020_0ff1 +1000:d46c FUN_1000_c79c DATA 1 true Stack[-0x76] - +1000:d46f FUN_1000_c79c DATA 1 true Stack[-0x74] - +1000:d472 FUN_1000_c79c DATA 1 true Stack[-0x72] - +1000:d47d FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:d482 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff1 Code5 FUN_1020_0ff1 FUN_1020_0ff1 +1000:d48a FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0fe5 Code5 FUN_1020_0fe5 FUN_1020_0fe5 +1000:d48f FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:10be Code5 FUN_1020_10be FUN_1020_10be +1000:d49c FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:d4a1 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:d4a6 FUN_1000_c79c DATA 0 true Stack[-0x5c] - +1000:d4a9 FUN_1000_c79c DATA 0 true Stack[-0x5a] - +1000:d4ac FUN_1000_c79c DATA 1 true Stack[-0x5c] - +1000:d4af FUN_1000_c79c DATA 1 true Stack[-0x5a] - +1000:d4b2 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:d4bf FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:d4c7 FUN_1000_c79c DATA 1 true Stack[-0x76] - +1000:d4ca FUN_1000_c79c DATA 1 true Stack[-0x74] - +1000:d4cd FUN_1000_c79c DATA 1 true Stack[-0x72] - +1000:d4d8 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:d4e0 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:d4f1 FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:d4f5 FUN_1000_c79c READ 1 true 1028:0a17 Data6 DAT_1028_0a17 +1000:d4f9 FUN_1000_c79c READ 1 true 1028:0a19 Data6 DAT_1028_0a19 +1000:d4fd FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:d505 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:d50d FUN_1000_c79c DATA 1 true Stack[-0x7c] - +1000:d510 FUN_1000_c79c DATA 1 true Stack[-0x7a] - +1000:d513 FUN_1000_c79c DATA 1 true Stack[-0x78] - +1000:d51e FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:d526 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:d537 FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:d53b FUN_1000_c79c READ 1 true 1028:0a13 Data6 DAT_1028_0a13 +1000:d53f FUN_1000_c79c READ 1 true 1028:0a15 Data6 DAT_1028_0a15 +1000:d543 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:d54b FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:d553 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0feb Code5 FUN_1020_0feb FUN_1020_0feb +1000:d55b FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:d563 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:d568 FUN_1000_c79c DATA 0 true Stack[-0x68] - +1000:d56b FUN_1000_c79c DATA 0 true Stack[-0x66] - +1000:d56e FUN_1000_c79c DATA 1 true Stack[-0x5c] - +1000:d571 FUN_1000_c79c DATA 1 true Stack[-0x5a] - +1000:d574 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:d581 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:d589 FUN_1000_c79c DATA 1 true Stack[-0x76] - +1000:d58c FUN_1000_c79c DATA 1 true Stack[-0x74] - +1000:d58f FUN_1000_c79c DATA 1 true Stack[-0x72] - +1000:d59a FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:d59f FUN_1000_c79c DATA 1 true Stack[-0x88] - +1000:d5a3 FUN_1000_c79c DATA 1 true Stack[-0x86] - +1000:d5a7 FUN_1000_c79c DATA 1 true Stack[-0x84] - +1000:d5ab FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:d5b3 FUN_1000_c79c DATA 1 true Stack[-0x7c] - +1000:d5b6 FUN_1000_c79c DATA 1 true Stack[-0x7a] - +1000:d5b9 FUN_1000_c79c DATA 1 true Stack[-0x78] - +1000:d5c4 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:d5c9 FUN_1000_c79c DATA 1 true Stack[-0x82] - +1000:d5cc FUN_1000_c79c DATA 1 true Stack[-0x80] - +1000:d5cf FUN_1000_c79c DATA 1 true Stack[-0x7e] - +1000:d5d2 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:d5da FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0feb Code5 FUN_1020_0feb FUN_1020_0feb +1000:d5e2 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:d5e7 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:d5ec FUN_1000_c79c DATA 0 true Stack[-0x64] - +1000:d5ef FUN_1000_c79c DATA 0 true Stack[-0x62] - +1000:d5f2 FUN_1000_c79c DATA 1 true Stack[-0x16] - +1000:d5f5 FUN_1000_c79c DATA 1 true Stack[-0x14] - +1000:d5fe FUN_1000_c79c DATA 1 true Stack[-0x66] - +1000:d601 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d610 Code1 LAB_1000_d610 +1000:d603 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d608 Code1 LAB_1000_d608 +1000:d605 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:d782 Code1 LAB_1000_d782 +1000:d608 FUN_1000_c79c DATA 1 true Stack[-0x68] - +1000:d60b FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d610 Code1 LAB_1000_d610 +1000:d60d FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:d782 Code1 LAB_1000_d782 +1000:d610 FUN_1000_c79c DATA 0 true Stack[-0x62] - +1000:d614 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d624 Code1 LAB_1000_d624 +1000:d616 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d61b Code1 LAB_1000_d61b +1000:d618 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:d782 Code1 LAB_1000_d782 +1000:d61b FUN_1000_c79c DATA 0 true Stack[-0x64] - +1000:d61f FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d624 Code1 LAB_1000_d624 +1000:d621 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:d782 Code1 LAB_1000_d782 +1000:d624 FUN_1000_c79c DATA 1 true Stack[-0x68] - +1000:d627 FUN_1000_c79c DATA 1 true Stack[-0x66] - +1000:d63a FUN_1000_c79c DATA 1 true Stack[-0x64] - +1000:d63d FUN_1000_c79c DATA 1 true Stack[-0x62] - +1000:d642 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d64b Code1 LAB_1000_d64b +1000:d64d FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d65b Code1 LAB_1000_d65b +1000:d64f FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d654 Code1 LAB_1000_d654 +1000:d651 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:d782 Code1 LAB_1000_d782 +1000:d656 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d65b Code1 LAB_1000_d65b +1000:d658 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:d782 Code1 LAB_1000_d782 +1000:d65b FUN_1000_c79c READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:d65e FUN_1000_c79c READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:d662 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:d673 FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:d677 FUN_1000_c79c READ 1 true 1028:0a17 Data6 DAT_1028_0a17 +1000:d67b FUN_1000_c79c READ 1 true 1028:0a19 Data6 DAT_1028_0a19 +1000:d683 FUN_1000_c79c READ 1 true 1028:0a13 Data6 DAT_1028_0a13 +1000:d687 FUN_1000_c79c READ 1 true 1028:0a15 Data6 DAT_1028_0a15 +1000:d68b FUN_1000_c79c READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:d68f FUN_1000_c79c READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:d693 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:d69a FUN_1000_c79c READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:d69d FUN_1000_c79c READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:d6a1 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:d6b2 FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:d6b6 FUN_1000_c79c READ 1 true 1028:0a13 Data6 DAT_1028_0a13 +1000:d6ba FUN_1000_c79c READ 1 true 1028:0a15 Data6 DAT_1028_0a15 +1000:d6c2 FUN_1000_c79c READ 1 true 1028:0a17 Data6 DAT_1028_0a17 +1000:d6c6 FUN_1000_c79c READ 1 true 1028:0a19 Data6 DAT_1028_0a19 +1000:d6ca FUN_1000_c79c READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:d6ce FUN_1000_c79c READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:d6d2 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:d6e0 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d6ef Code1 LAB_1000_d6ef +1000:d6e2 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d6e7 Code1 LAB_1000_d6e7 +1000:d6e4 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:d782 Code1 LAB_1000_d782 +1000:d6ea FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d6ef Code1 LAB_1000_d6ef +1000:d6ec FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:d782 Code1 LAB_1000_d782 +1000:d6ef FUN_1000_c79c READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:d6f2 FUN_1000_c79c READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:d6f6 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:d707 FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:d70b FUN_1000_c79c READ 1 true 1028:0a1f Data6 DAT_1028_0a1f +1000:d70f FUN_1000_c79c READ 1 true 1028:0a21 Data6 DAT_1028_0a21 +1000:d717 FUN_1000_c79c READ 1 true 1028:0a1b Data6 DAT_1028_0a1b +1000:d71b FUN_1000_c79c READ 1 true 1028:0a1d Data6 DAT_1028_0a1d +1000:d71f FUN_1000_c79c READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:d723 FUN_1000_c79c READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:d727 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:d72e FUN_1000_c79c READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:d731 FUN_1000_c79c READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:d735 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:d746 FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:d74a FUN_1000_c79c READ 1 true 1028:0a1b Data6 DAT_1028_0a1b +1000:d74e FUN_1000_c79c READ 1 true 1028:0a1d Data6 DAT_1028_0a1d +1000:d756 FUN_1000_c79c READ 1 true 1028:0a1f Data6 DAT_1028_0a1f +1000:d75a FUN_1000_c79c READ 1 true 1028:0a21 Data6 DAT_1028_0a21 +1000:d75e FUN_1000_c79c READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:d762 FUN_1000_c79c READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:d766 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:d774 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d77d Code1 LAB_1000_d77d +1000:d776 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d782 Code1 LAB_1000_d782 +1000:d77b FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d782 Code1 LAB_1000_d782 +1000:d77d FUN_1000_c79c DATA 0 true Stack[-0x95] - +1000:d782 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:e060 Code1 LAB_1000_e060 +1000:d787 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d78c Code1 LAB_1000_d78c +1000:d789 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:e060 Code1 LAB_1000_e060 +1000:d78c FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:d790 FUN_1000_c79c READ 1 true 1028:0a17 Data6 DAT_1028_0a17 +1000:d794 FUN_1000_c79c READ 1 true 1028:0a19 Data6 DAT_1028_0a19 +1000:d798 FUN_1000_c79c READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:d79c FUN_1000_c79c READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:d7a6 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:d7b3 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:d7b8 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff1 Code5 FUN_1020_0ff1 FUN_1020_0ff1 +1000:d7c0 FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:d7c4 FUN_1000_c79c READ 1 true 1028:0a13 Data6 DAT_1028_0a13 +1000:d7c8 FUN_1000_c79c READ 1 true 1028:0a15 Data6 DAT_1028_0a15 +1000:d7cc FUN_1000_c79c READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:d7d0 FUN_1000_c79c READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:d7d4 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:d7e1 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:d7e6 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff1 Code5 FUN_1020_0ff1 FUN_1020_0ff1 +1000:d7ee FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0fe5 Code5 FUN_1020_0fe5 FUN_1020_0fe5 +1000:d7f3 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:10be Code5 FUN_1020_10be FUN_1020_10be +1000:d800 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:d805 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:d80c FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d815 Code1 LAB_1000_d815 +1000:d815 FUN_1000_c79c DATA 0 true Stack[-0x68] - +1000:d818 FUN_1000_c79c DATA 0 true Stack[-0x66] - +1000:d81b FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:d81f FUN_1000_c79c READ 1 true 1028:0a23 Data6 DAT_1028_0a23 +1000:d823 FUN_1000_c79c READ 1 true 1028:0a25 Data6 DAT_1028_0a25 +1000:d827 FUN_1000_c79c READ 1 true 1028:0a27 Data6 DAT_1028_0a27 +1000:d82b FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:d834 FUN_1000_c79c DATA 1 true Stack[-0x68] - +1000:d837 FUN_1000_c79c DATA 1 true Stack[-0x66] - +1000:d83e FUN_1000_c79c DATA 0 true Stack[-0x68] - +1000:d841 FUN_1000_c79c DATA 0 true Stack[-0x66] - +1000:d844 FUN_1000_c79c DATA 0 true Stack[-0x66] - +1000:d848 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d859 Code1 LAB_1000_d859 +1000:d84a FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d84f Code1 LAB_1000_d84f +1000:d84c FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:de5e Code1 LAB_1000_de5e +1000:d84f FUN_1000_c79c DATA 0 true Stack[-0x68] - +1000:d854 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d859 Code1 LAB_1000_d859 +1000:d856 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:de5e Code1 LAB_1000_de5e +1000:d859 FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:d85d FUN_1000_c79c READ 0 true 1028:0a44 Data6 DAT_1028_0a44 +1000:d862 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d899 Code1 LAB_1000_d899 +1000:d864 FUN_1000_c79c READ 0 true 1028:0a44 Data6 DAT_1028_0a44 +1000:d869 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d879 Code1 LAB_1000_d879 +1000:d86b FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:d877 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d899 Code1 LAB_1000_d899 +1000:d879 FUN_1000_c79c DATA 1 true Stack[-0x8] - +1000:d881 FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:d885 FUN_1000_c79c READ 1 true 1028:0a44 Data6 DAT_1028_0a44 +1000:d88d FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d892 Code1 LAB_1000_d892 +1000:d88f FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:de5e Code1 LAB_1000_de5e +1000:d894 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d899 Code1 LAB_1000_d899 +1000:d896 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:de5e Code1 LAB_1000_de5e +1000:d899 FUN_1000_c79c DATA 0 true Stack[-0x4] - +1000:d89e FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d8aa Code1 LAB_1000_d8aa +1000:d8a0 FUN_1000_c79c READ 0 true 1028:0875 Data6 DAT_1028_0875 +1000:d8a5 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d8aa Code1 LAB_1000_d8aa +1000:d8a7 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:de5e Code1 LAB_1000_de5e +1000:d8aa FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:d8b7 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d8ca Code1 LAB_1000_d8ca +1000:d8b9 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d8be Code1 LAB_1000_d8be +1000:d8bb FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:db43 Code1 LAB_1000_db43 +1000:d8c5 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d8ca Code1 LAB_1000_d8ca +1000:d8c7 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:db43 Code1 LAB_1000_db43 +1000:d8ca FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:d8ce FUN_1000_c79c READ 1 true 1028:0a13 Data6 DAT_1028_0a13 +1000:d8d2 FUN_1000_c79c READ 1 true 1028:0a15 Data6 DAT_1028_0a15 +1000:d8d6 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:d8e9 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d8f2 Code1 LAB_1000_d8f2 +1000:d8f5 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d904 Code1 LAB_1000_d904 +1000:d8f7 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d8fc Code1 LAB_1000_d8fc +1000:d8f9 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:d9f4 Code1 LAB_1000_d9f4 +1000:d8ff FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d904 Code1 LAB_1000_d904 +1000:d901 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:d9f4 Code1 LAB_1000_d9f4 +1000:d904 FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:d908 FUN_1000_c79c READ 1 true 1028:0a17 Data6 DAT_1028_0a17 +1000:d90c FUN_1000_c79c READ 1 true 1028:0a19 Data6 DAT_1028_0a19 +1000:d910 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:d923 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d92c Code1 LAB_1000_d92c +1000:d92f FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d93e Code1 LAB_1000_d93e +1000:d931 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d936 Code1 LAB_1000_d936 +1000:d933 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:d9f4 Code1 LAB_1000_d9f4 +1000:d939 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d93e Code1 LAB_1000_d93e +1000:d93b FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:d9f4 Code1 LAB_1000_d9f4 +1000:d93e FUN_1000_c79c DATA 1 true Stack[-0xe] - +1000:d941 FUN_1000_c79c DATA 1 true Stack[-0xc] - +1000:d946 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d94f Code1 LAB_1000_d94f +1000:d952 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d961 Code1 LAB_1000_d961 +1000:d954 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d959 Code1 LAB_1000_d959 +1000:d956 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:d9f4 Code1 LAB_1000_d9f4 +1000:d95c FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d961 Code1 LAB_1000_d961 +1000:d95e FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:d9f4 Code1 LAB_1000_d9f4 +1000:d961 FUN_1000_c79c DATA 1 true Stack[-0x12] - +1000:d964 FUN_1000_c79c DATA 1 true Stack[-0x10] - +1000:d969 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d972 Code1 LAB_1000_d972 +1000:d975 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d97e Code1 LAB_1000_d97e +1000:d977 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d9f4 Code1 LAB_1000_d9f4 +1000:d97c FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d9f4 Code1 LAB_1000_d9f4 +1000:d980 FUN_1000_c79c DATA 0 true Stack[-0xe] - +1000:d983 FUN_1000_c79c DATA 0 true Stack[-0xc] - +1000:d988 FUN_1000_c79c DATA 0 true Stack[-0x12] - +1000:d98b FUN_1000_c79c DATA 0 true Stack[-0x10] - +1000:d98e FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:d99f FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d9b3 Code1 LAB_1000_d9b3 +1000:d9a1 FUN_1000_c79c DATA 1 true Stack[-0x8] - +1000:d9a4 FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:d9a8 FUN_1000_c79c WRITE 0 true 1028:0a44 Data6 DAT_1028_0a44 +1000:d9ae FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1008:0002 Code2 FUN_1008_0002 FUN_1008_0002 +1000:d9b3 FUN_1000_c79c DATA 0 true Stack[-0x4] - +1000:d9b7 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:d9d0 Code1 LAB_1000_d9d0 +1000:d9b9 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:d9ce FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:d9f1 Code1 LAB_1000_d9f1 +1000:d9d0 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:d9f1 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:db40 Code1 LAB_1000_db40 +1000:d9f4 FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:d9f8 FUN_1000_c79c READ 1 true 1028:0a13 Data6 DAT_1028_0a13 +1000:d9fc FUN_1000_c79c READ 1 true 1028:0a15 Data6 DAT_1028_0a15 +1000:da00 FUN_1000_c79c READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:da04 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:da0e Code1 LAB_1000_da0e +1000:da06 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:da55 Code1 LAB_1000_da55 +1000:da08 FUN_1000_c79c READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:da0c FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:da55 Code1 LAB_1000_da55 +1000:da0e FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:da22 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:da29 FUN_1000_c79c DATA 1 true Stack[-0xe] - +1000:da2c FUN_1000_c79c DATA 1 true Stack[-0xc] - +1000:da2f FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:da3d FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:da42 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:da4d FUN_1000_c79c DATA 0 true Stack[-0xe] - +1000:da50 FUN_1000_c79c DATA 0 true Stack[-0xc] - +1000:da53 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:da9a Code1 LAB_1000_da9a +1000:da55 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:da69 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:da70 FUN_1000_c79c DATA 1 true Stack[-0xe] - +1000:da73 FUN_1000_c79c DATA 1 true Stack[-0xc] - +1000:da76 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:da84 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:da89 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:da94 FUN_1000_c79c DATA 0 true Stack[-0xe] - +1000:da97 FUN_1000_c79c DATA 0 true Stack[-0xc] - +1000:da9a FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:da9e FUN_1000_c79c READ 1 true 1028:0a17 Data6 DAT_1028_0a17 +1000:daa2 FUN_1000_c79c READ 1 true 1028:0a19 Data6 DAT_1028_0a19 +1000:daa6 FUN_1000_c79c READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:daaa FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:dab4 Code1 LAB_1000_dab4 +1000:daac FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:dafb Code1 LAB_1000_dafb +1000:daae FUN_1000_c79c READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:dab2 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:dafb Code1 LAB_1000_dafb +1000:dab4 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:dac8 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:dacf FUN_1000_c79c DATA 1 true Stack[-0x12] - +1000:dad2 FUN_1000_c79c DATA 1 true Stack[-0x10] - +1000:dad5 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:dae3 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:dae8 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:daf3 FUN_1000_c79c DATA 0 true Stack[-0x12] - +1000:daf6 FUN_1000_c79c DATA 0 true Stack[-0x10] - +1000:daf9 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:db40 Code1 LAB_1000_db40 +1000:dafb FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:db0f FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:db16 FUN_1000_c79c DATA 1 true Stack[-0x12] - +1000:db19 FUN_1000_c79c DATA 1 true Stack[-0x10] - +1000:db1c FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:db2a FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:db2f FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:db3a FUN_1000_c79c DATA 0 true Stack[-0x12] - +1000:db3d FUN_1000_c79c DATA 0 true Stack[-0x10] - +1000:db40 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:de5b Code1 LAB_1000_de5b +1000:db43 FUN_1000_c79c DATA 0 true Stack[-0x4] - +1000:db47 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:db4c Code1 LAB_1000_db4c +1000:db49 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:dbd6 Code1 LAB_1000_dbd6 +1000:db4c FUN_1000_c79c READ 0 true 1028:0874 Data6 DAT_1028_0874 +1000:db51 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:db56 Code1 LAB_1000_db56 +1000:db53 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:dbd3 Code1 LAB_1000_dbd3 +1000:db56 FUN_1000_c79c WRITE 0 true 1028:07ca Data6 DAT_1028_07ca +1000:db5d FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:14a4 Code5 FUN_1020_14a4 FUN_1020_14a4 +1000:db66 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:db70 Code1 LAB_1000_db70 +1000:db68 FUN_1000_c79c WRITE 0 true 1028:086f Data6 DAT_1028_086f +1000:db6e FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:db95 Code1 LAB_1000_db95 +1000:db73 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:db7d Code1 LAB_1000_db7d +1000:db75 FUN_1000_c79c WRITE 0 true 1028:086f Data6 DAT_1028_086f +1000:db7b FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:db95 Code1 LAB_1000_db95 +1000:db80 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:db8a Code1 LAB_1000_db8a +1000:db82 FUN_1000_c79c WRITE 0 true 1028:086f Data6 DAT_1028_086f +1000:db88 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:db95 Code1 LAB_1000_db95 +1000:db8d FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:db95 Code1 LAB_1000_db95 +1000:db8f FUN_1000_c79c WRITE 0 true 1028:086f Data6 DAT_1028_086f +1000:db95 FUN_1000_c79c WRITE 0 true 1028:0873 Data6 DAT_1028_0873 +1000:db9a FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:dba7 FUN_1000_c79c DATA 0 true Stack[-0x40] - +1000:dbac FUN_1000_c79c DATA 0 true Stack[-0x3e] - +1000:dbb1 FUN_1000_c79c DATA 0 true Stack[-0x3c] - +1000:dbb6 FUN_1000_c79c DATA 0 true Stack[-0x2768] - +1000:dbbc FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:dbc2 Code1 LAB_1000_dbc2 +1000:dbbe FUN_1000_c79c DATA 0 true Stack[-0x2768] - +1000:dbc2 FUN_1000_c79c DATA 1 true Stack[-0x2768] - +1000:dbc7 FUN_1000_c79c WRITE 0 true 1028:0d73 Data6 DAT_1028_0d73 +1000:dbc7 FUN_1000_c79c WRITE 0 false 1028:0dc6 Data6 DAT_1028_0dc6 +1000:dbcc FUN_1000_c79c DATA 0 true Stack[-0x2768] - +1000:dbd1 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:dbbe Code1 LAB_1000_dbbe +1000:dbd3 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:de5b Code1 LAB_1000_de5b +1000:dbd6 FUN_1000_c79c DATA 0 true Stack[-0x4] - +1000:dbdb FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:dbe0 Code1 LAB_1000_dbe0 +1000:dbdd FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:ddb3 Code1 LAB_1000_ddb3 +1000:dbe0 FUN_1000_c79c DATA 0 true Stack[-0x4] - +1000:dbe5 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:dbea Code1 LAB_1000_dbea +1000:dbe7 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:ddb3 Code1 LAB_1000_ddb3 +1000:dbea FUN_1000_c79c DATA 0 true Stack[-0x276c] - +1000:dbf0 FUN_1000_c79c DATA 0 true Stack[-0x276a] - +1000:dbf6 FUN_1000_c79c DATA 0 true Stack[-0x2766] - +1000:dbfc FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:dc02 Code1 LAB_1000_dc02 +1000:dbfe FUN_1000_c79c DATA 0 true Stack[-0x2766] - +1000:dc02 FUN_1000_c79c DATA 1 true Stack[-0x2766] - +1000:dc0d FUN_1000_c79c READ 0 true 1028:3371 Data6 DAT_1028_3371 +1000:dc0d FUN_1000_c79c READ 0 false 1028:33c4 Data6 DAT_1028_33c4 +1000:dc12 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:dc2e Code1 LAB_1000_dc2e +1000:dc14 FUN_1000_c79c DATA 1 true Stack[-0x276c] - +1000:dc18 FUN_1000_c79c DATA 1 true Stack[-0x276a] - +1000:dc21 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:dc26 FUN_1000_c79c DATA 0 true Stack[-0x276c] - +1000:dc2a FUN_1000_c79c DATA 0 true Stack[-0x276a] - +1000:dc2e FUN_1000_c79c DATA 0 true Stack[-0x2766] - +1000:dc33 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:dbfe Code1 LAB_1000_dbfe +1000:dc35 FUN_1000_c79c READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:dc47 FUN_1000_c79c DATA 1 true Stack[-0x276c] - +1000:dc4b FUN_1000_c79c DATA 1 true Stack[-0x276a] - +1000:dc53 FUN_1000_c79c READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:dc65 FUN_1000_c79c DATA 0 true Stack[-0x276a] - +1000:dc6a FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:dc6f Code1 LAB_1000_dc6f +1000:dc6c FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:dd42 Code1 LAB_1000_dd42 +1000:dc6f FUN_1000_c79c DATA 0 true Stack[-0x276c] - +1000:dc75 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:dc7a Code1 LAB_1000_dc7a +1000:dc77 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:dd42 Code1 LAB_1000_dd42 +1000:dc7a FUN_1000_c79c READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:dc8d FUN_1000_c79c READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:dc9f FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:dca6 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:dcaa FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1000:bc36 Code1 FUN_1000_bc36 FUN_1000_bc36 +1000:dcaf FUN_1000_c79c READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:dcc3 FUN_1000_c79c READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:dcce FUN_1000_c79c READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:dcdb FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:dcdf FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1000:a604 Code1 FUN_1000_a604 FUN_1000_a604 +1000:dce4 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:dcef FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:dcf4 FUN_1000_c79c DATA 0 true Stack[-0x276e] - +1000:dcf8 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:dd03 FUN_1000_c79c DATA 0 true Stack[-0x276e] - +1000:dd07 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:dd0c FUN_1000_c79c READ 0 true 1028:07c7 Data6 DAT_1028_07c7 +1000:dd11 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:dd3b Code1 LAB_1000_dd3b +1000:dd13 FUN_1000_c79c READ 0 true 1028:07c8 Data6 DAT_1028_07c8 +1000:dd18 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:dd3b Code1 LAB_1000_dd3b +1000:dd1a FUN_1000_c79c READ 0 true 1028:0874 Data6 DAT_1028_0874 +1000:dd1f FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:dd3b Code1 LAB_1000_dd3b +1000:dd23 FUN_1000_c79c WRITE 0 true 1028:0851 Data6 DAT_1028_0851 +1000:dd26 FUN_1000_c79c WRITE 0 true 1028:0853 Data6 DAT_1028_0853 +1000:dd29 FUN_1000_c79c WRITE 0 true 1028:07c8 Data6 DAT_1028_07c8 +1000:dd2e FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:dd3b FUN_1000_c79c WRITE 0 true 1028:0874 Data6 DAT_1028_0874 +1000:dd40 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:dd7c Code1 LAB_1000_dd7c +1000:dd42 FUN_1000_c79c DATA 1 true Stack[-0x4] - +1000:dd4d FUN_1000_c79c READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:dd55 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:dd66 FUN_1000_c79c DATA 1 true Stack[-0x4] - +1000:dd73 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:dd77 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1000:b30b Code1 FUN_1000_b30b FUN_1000_b30b +1000:dd7c FUN_1000_c79c READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:dd8f FUN_1000_c79c READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:dda1 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:dda8 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:ddac FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1000:bda2 Code1 FUN_1000_bda2 FUN_1000_bda2 +1000:ddb1 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:dddd Code1 LAB_1000_dddd +1000:ddb3 FUN_1000_c79c DATA 0 true Stack[-0x4] - +1000:ddb8 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:dddd Code1 LAB_1000_dddd +1000:ddba FUN_1000_c79c READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:ddc2 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:ddd4 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:ddd8 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1000:b30b Code1 FUN_1000_b30b FUN_1000_b30b +1000:dddd FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:ddf5 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:de35 Code1 LAB_1000_de35 +1000:ddf7 FUN_1000_c79c DATA 0 true Stack[-0x4] - +1000:ddfc FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:de0a Code1 LAB_1000_de0a +1000:ddfe FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:de02 FUN_1000_c79c WRITE 0 true 1028:0a44 Data6 DAT_1028_0a44 +1000:de08 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:de14 Code1 LAB_1000_de14 +1000:de0a FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:de0e FUN_1000_c79c WRITE 0 true 1028:0a44 Data6 DAT_1028_0a44 +1000:de14 FUN_1000_c79c READ 0 true 1028:07c6 Data6 DAT_1028_07c6 +1000:de19 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:de26 Code1 LAB_1000_de26 +1000:de1b FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:de1f FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1000:ae6e Code1 FUN_1000_ae6e FUN_1000_ae6e +1000:de24 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:de33 Code1 LAB_1000_de33 +1000:de26 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:de33 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:de5b Code1 LAB_1000_de5b +1000:de35 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:de42 FUN_1000_c79c DATA 1 true Stack[-0x8] - +1000:de4c FUN_1000_c79c WRITE 0 true 1028:424c Data6 DAT_1028_424c +1000:de51 FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:de55 FUN_1000_c79c WRITE 0 true 1028:0a44 Data6 DAT_1028_0a44 +1000:de5b FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:e060 Code1 LAB_1000_e060 +1000:de5e FUN_1000_c79c DATA 0 true Stack[-0x66] - +1000:de62 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:de6d Code1 LAB_1000_de6d +1000:de64 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:dea3 Code1 LAB_1000_dea3 +1000:de66 FUN_1000_c79c DATA 0 true Stack[-0x68] - +1000:de6b FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:dea3 Code1 LAB_1000_dea3 +1000:de6d FUN_1000_c79c DATA 1 true Stack[-0x8] - +1000:de75 FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:de79 FUN_1000_c79c READ 1 true 1028:0a44 Data6 DAT_1028_0a44 +1000:de81 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:dea3 Code1 LAB_1000_dea3 +1000:de85 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:dea3 Code1 LAB_1000_dea3 +1000:de89 FUN_1000_c79c WRITE 0 true 1028:0a44 Data6 DAT_1028_0a44 +1000:de8d FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:dea0 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:e060 Code1 LAB_1000_e060 +1000:dea3 FUN_1000_c79c DATA 1 true Stack[-0x68] - +1000:dea6 FUN_1000_c79c DATA 1 true Stack[-0x66] - +1000:dea9 FUN_1000_c79c DATA 1 true Stack[-0x14] - +1000:deac FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:debb Code1 LAB_1000_debb +1000:deae FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:deb3 Code1 LAB_1000_deb3 +1000:deb0 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:e060 Code1 LAB_1000_e060 +1000:deb3 FUN_1000_c79c DATA 1 true Stack[-0x16] - +1000:deb6 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:debb Code1 LAB_1000_debb +1000:deb8 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:e060 Code1 LAB_1000_e060 +1000:debb FUN_1000_c79c DATA 0 true Stack[-0x66] - +1000:debf FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:ded0 Code1 LAB_1000_ded0 +1000:dec1 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:dec6 Code1 LAB_1000_dec6 +1000:dec3 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:e060 Code1 LAB_1000_e060 +1000:dec6 FUN_1000_c79c DATA 0 true Stack[-0x68] - +1000:decb FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:ded0 Code1 LAB_1000_ded0 +1000:decd FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:e060 Code1 LAB_1000_e060 +1000:ded0 FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:ded4 FUN_1000_c79c READ 0 true 1028:0a44 Data6 DAT_1028_0a44 +1000:ded9 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:dede Code1 LAB_1000_dede +1000:dedb FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:e060 Code1 LAB_1000_e060 +1000:dede FUN_1000_c79c READ 1 true 1028:0a17 Data6 DAT_1028_0a17 +1000:dee2 FUN_1000_c79c READ 1 true 1028:0a19 Data6 DAT_1028_0a19 +1000:dee6 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:def7 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:defc FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:df01 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:df06 FUN_1000_c79c DATA 0 true Stack[-0x76] - +1000:df09 FUN_1000_c79c DATA 0 true Stack[-0x74] - +1000:df0c FUN_1000_c79c DATA 0 true Stack[-0x72] - +1000:df0f FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:df20 FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:df24 FUN_1000_c79c READ 1 true 1028:0a13 Data6 DAT_1028_0a13 +1000:df28 FUN_1000_c79c READ 1 true 1028:0a15 Data6 DAT_1028_0a15 +1000:df2c FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:df31 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:df36 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:df3b FUN_1000_c79c DATA 0 true Stack[-0x7c] - +1000:df3e FUN_1000_c79c DATA 0 true Stack[-0x7a] - +1000:df41 FUN_1000_c79c DATA 0 true Stack[-0x78] - +1000:df44 FUN_1000_c79c DATA 1 true Stack[-0x7c] - +1000:df47 FUN_1000_c79c DATA 1 true Stack[-0x7a] - +1000:df4a FUN_1000_c79c DATA 1 true Stack[-0x78] - +1000:df55 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:df5a FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff1 Code5 FUN_1020_0ff1 FUN_1020_0ff1 +1000:df62 FUN_1000_c79c DATA 1 true Stack[-0x76] - +1000:df65 FUN_1000_c79c DATA 1 true Stack[-0x74] - +1000:df68 FUN_1000_c79c DATA 1 true Stack[-0x72] - +1000:df73 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:df78 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff1 Code5 FUN_1020_0ff1 FUN_1020_0ff1 +1000:df80 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0fe5 Code5 FUN_1020_0fe5 FUN_1020_0fe5 +1000:df85 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:10be Code5 FUN_1020_10be FUN_1020_10be +1000:df92 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:df97 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:df9c FUN_1000_c79c DATA 0 true Stack[-0x5c] - +1000:df9f FUN_1000_c79c DATA 0 true Stack[-0x5a] - +1000:dfa2 FUN_1000_c79c DATA 0 true Stack[-0x5a] - +1000:dfa6 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:dfb0 Code1 LAB_1000_dfb0 +1000:dfa8 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e00f Code1 LAB_1000_e00f +1000:dfaa FUN_1000_c79c DATA 0 true Stack[-0x5c] - +1000:dfae FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e00f Code1 LAB_1000_e00f +1000:dfb0 FUN_1000_c79c DATA 1 true Stack[-0x5c] - +1000:dfb3 FUN_1000_c79c DATA 1 true Stack[-0x5a] - +1000:dfb6 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:dfbe FUN_1000_c79c DATA 1 true Stack[-0x88] - +1000:dfc2 FUN_1000_c79c DATA 1 true Stack[-0x86] - +1000:dfc6 FUN_1000_c79c DATA 1 true Stack[-0x84] - +1000:dfca FUN_1000_c79c DATA 1 true Stack[-0x76] - +1000:dfcd FUN_1000_c79c DATA 1 true Stack[-0x74] - +1000:dfd0 FUN_1000_c79c DATA 1 true Stack[-0x72] - +1000:dfd3 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:dfdb FUN_1000_c79c DATA 1 true Stack[-0x82] - +1000:dfde FUN_1000_c79c DATA 1 true Stack[-0x80] - +1000:dfe1 FUN_1000_c79c DATA 1 true Stack[-0x7e] - +1000:dfe4 FUN_1000_c79c DATA 1 true Stack[-0x7c] - +1000:dfe7 FUN_1000_c79c DATA 1 true Stack[-0x7a] - +1000:dfea FUN_1000_c79c DATA 1 true Stack[-0x78] - +1000:dfed FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:dff5 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0feb Code5 FUN_1020_0feb FUN_1020_0feb +1000:dffd FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:e002 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:e007 FUN_1000_c79c DATA 0 true Stack[-0x64] - +1000:e00a FUN_1000_c79c DATA 0 true Stack[-0x62] - +1000:e00d FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:e017 Code1 LAB_1000_e017 +1000:e011 FUN_1000_c79c DATA 0 true Stack[-0x64] - +1000:e014 FUN_1000_c79c DATA 0 true Stack[-0x62] - +1000:e017 FUN_1000_c79c DATA 0 true Stack[-0x62] - +1000:e01b FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e025 Code1 LAB_1000_e025 +1000:e01d FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e060 Code1 LAB_1000_e060 +1000:e01f FUN_1000_c79c DATA 0 true Stack[-0x64] - +1000:e023 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e060 Code1 LAB_1000_e060 +1000:e025 FUN_1000_c79c DATA 1 true Stack[-0x68] - +1000:e028 FUN_1000_c79c DATA 1 true Stack[-0x66] - +1000:e02d FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e036 Code1 LAB_1000_e036 +1000:e040 FUN_1000_c79c DATA 1 true Stack[-0x64] - +1000:e043 FUN_1000_c79c DATA 1 true Stack[-0x62] - +1000:e048 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e051 Code1 LAB_1000_e051 +1000:e053 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e05b Code1 LAB_1000_e05b +1000:e055 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e060 Code1 LAB_1000_e060 +1000:e059 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e060 Code1 LAB_1000_e060 +1000:e05b FUN_1000_c79c DATA 0 true Stack[-0x95] - +1000:e060 FUN_1000_c79c DATA 0 true Stack[-0x95] - +1000:e065 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e06a Code1 LAB_1000_e06a +1000:e067 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:e1b9 Code1 LAB_1000_e1b9 +1000:e06a FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:e07d FUN_1000_c79c DATA 1 true Stack[-0x68] - +1000:e080 FUN_1000_c79c DATA 1 true Stack[-0x66] - +1000:e083 FUN_1000_c79c DATA 1 true Stack[-0x6e] - +1000:e086 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e095 Code1 LAB_1000_e095 +1000:e088 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e08d Code1 LAB_1000_e08d +1000:e08a FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:e1b9 Code1 LAB_1000_e1b9 +1000:e08d FUN_1000_c79c DATA 1 true Stack[-0x70] - +1000:e090 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e095 Code1 LAB_1000_e095 +1000:e092 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:e1b9 Code1 LAB_1000_e1b9 +1000:e095 FUN_1000_c79c DATA 1 true Stack[-0x68] - +1000:e098 FUN_1000_c79c DATA 1 true Stack[-0x66] - +1000:e09b FUN_1000_c79c DATA 0 true Stack[-0x70] - +1000:e09e FUN_1000_c79c DATA 0 true Stack[-0x6e] - +1000:e0a1 FUN_1000_c79c DATA 1 true Stack[-0x2760] - +1000:e0a6 FUN_1000_c79c DATA 0 true Stack[-0x2760] - +1000:e0aa FUN_1000_c79c DATA 1 true Stack[-0x2760] - +1000:e0b5 FUN_1000_c79c DATA 0 true Stack[-0x277a] - +1000:e0b9 FUN_1000_c79c DATA 0 true Stack[-0x2778] - +1000:e0bd FUN_1000_c79c DATA 1 true Stack[-0x68] - +1000:e0c0 FUN_1000_c79c DATA 1 true Stack[-0x66] - +1000:e0cb FUN_1000_c79c DATA 1 true Stack[-0x4] - +1000:e0d1 FUN_1000_c79c DATA 1 true Stack[-0x76] - +1000:e0d4 FUN_1000_c79c DATA 1 true Stack[-0x74] - +1000:e0d7 FUN_1000_c79c DATA 1 true Stack[-0x72] - +1000:e0da FUN_1000_c79c DATA 1 true Stack[-0x277a] - +1000:e0ea FUN_1000_c79c DATA 1 true Stack[-0x7c] - +1000:e0ed FUN_1000_c79c DATA 1 true Stack[-0x7a] - +1000:e0f0 FUN_1000_c79c DATA 1 true Stack[-0x78] - +1000:e0f3 FUN_1000_c79c DATA 1 true Stack[-0x277a] - +1000:e103 FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:e107 FUN_1000_c79c READ 1 true 1028:0a2f Data6 DAT_1028_0a2f +1000:e10b FUN_1000_c79c READ 1 true 1028:0a31 Data6 DAT_1028_0a31 +1000:e10f FUN_1000_c79c READ 1 true 1028:0a33 Data6 DAT_1028_0a33 +1000:e113 FUN_1000_c79c DATA 1 true Stack[-0x277a] - +1000:e123 FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:e127 FUN_1000_c79c READ 1 true 1028:0a29 Data6 DAT_1028_0a29 +1000:e12b FUN_1000_c79c READ 1 true 1028:0a2b Data6 DAT_1028_0a2b +1000:e12f FUN_1000_c79c READ 1 true 1028:0a2d Data6 DAT_1028_0a2d +1000:e133 FUN_1000_c79c DATA 1 true Stack[-0x277a] - +1000:e143 FUN_1000_c79c DATA 1 true Stack[-0x64] - +1000:e146 FUN_1000_c79c DATA 1 true Stack[-0x62] - +1000:e151 FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:e155 FUN_1000_c79c READ 1 true 1028:0a36 Data6 DAT_1028_0a36 +1000:e159 FUN_1000_c79c READ 1 true 1028:0a38 Data6 DAT_1028_0a38 +1000:e15d FUN_1000_c79c READ 1 true 1028:0a3a Data6 DAT_1028_0a3a +1000:e161 FUN_1000_c79c DATA 1 true Stack[-0x277a] - +1000:e171 FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:e175 FUN_1000_c79c READ 1 true 1028:0a3c Data6 DAT_1028_0a3c +1000:e179 FUN_1000_c79c READ 1 true 1028:0a3e Data6 DAT_1028_0a3e +1000:e17d FUN_1000_c79c READ 1 true 1028:0a40 Data6 DAT_1028_0a40 +1000:e181 FUN_1000_c79c DATA 1 true Stack[-0x277a] - +1000:e191 FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:e195 FUN_1000_c79c READ 1 true 1028:0a42 Data6 DAT_1028_0a42 +1000:e199 FUN_1000_c79c DATA 1 true Stack[-0x277a] - +1000:e1a1 FUN_1000_c79c DATA 1 true Stack[-0x2776] - +1000:e1a5 FUN_1000_c79c READ 1 true 1028:0a46 Data6 DAT_1028_0a46 +1000:e1a9 FUN_1000_c79c READ 1 true 1028:0a48 Data6 DAT_1028_0a48 +1000:e1ad FUN_1000_c79c DATA 1 true Stack[-0x277a] - +1000:e1b9 FUN_1000_c79c DATA 0 true Stack[-0x4] - +1000:e1be FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e1c3 Code1 LAB_1000_e1c3 +1000:e1c0 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:cb6d Code1 LAB_1000_cb6d +1000:e1c3 FUN_1000_c79c DATA 0 true Stack[-0x2760] - +1000:e1c8 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e1cd Code1 LAB_1000_e1cd +1000:e1ca FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:e831 Code1 LAB_1000_e831 +1000:e1cd FUN_1000_c79c DATA 0 true Stack[-0x2734] - +1000:e1d2 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e1e5 Code1 LAB_1000_e1e5 +1000:e1d4 FUN_1000_c79c DATA 0 true Stack[-0x275e] - +1000:e1d8 FUN_1000_c79c DATA 0 true Stack[-0x2734] - +1000:e1dc FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:e1e0 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1000:b476 Code1 FUN_1000_b476 FUN_1000_b476 +1000:e1e5 FUN_1000_c79c DATA 1 true Stack[-0x2732] - +1000:e1e9 FUN_1000_c79c DATA 1 true Stack[-0x2730] - +1000:e1ed FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e219 Code1 LAB_1000_e219 +1000:e1ef FUN_1000_c79c DATA 1 true Stack[-0x273a] - +1000:e1f3 FUN_1000_c79c DATA 1 true Stack[-0x2738] - +1000:e1f7 FUN_1000_c79c DATA 1 true Stack[-0x2736] - +1000:e201 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1007 Code5 FUN_1020_1007 FUN_1020_1007 +1000:e206 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e219 Code1 LAB_1000_e219 +1000:e208 FUN_1000_c79c DATA 0 true Stack[-0x2730] - +1000:e20c FUN_1000_c79c DATA 0 true Stack[-0x2732] - +1000:e210 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:e214 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1000:bc36 Code1 FUN_1000_bc36 FUN_1000_bc36 +1000:e219 FUN_1000_c79c DATA 1 true Stack[-0x2756] - +1000:e21d FUN_1000_c79c DATA 1 true Stack[-0x2754] - +1000:e221 FUN_1000_c79c DATA 1 true Stack[-0x2752] - +1000:e22d FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:e232 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff1 Code5 FUN_1020_0ff1 FUN_1020_0ff1 +1000:e23a FUN_1000_c79c DATA 1 true Stack[-0x275c] - +1000:e23e FUN_1000_c79c DATA 1 true Stack[-0x275a] - +1000:e242 FUN_1000_c79c DATA 1 true Stack[-0x2758] - +1000:e24e FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:e253 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff1 Code5 FUN_1020_0ff1 FUN_1020_0ff1 +1000:e25b FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0fe5 Code5 FUN_1020_0fe5 FUN_1020_0fe5 +1000:e260 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:10be Code5 FUN_1020_10be FUN_1020_10be +1000:e26d FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:e272 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:e277 FUN_1000_c79c DATA 0 true Stack[-0x5c] - +1000:e27a FUN_1000_c79c DATA 0 true Stack[-0x5a] - +1000:e27d FUN_1000_c79c DATA 1 true Stack[-0x5c] - +1000:e280 FUN_1000_c79c DATA 1 true Stack[-0x5a] - +1000:e283 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:e28b FUN_1000_c79c DATA 1 true Stack[-0x88] - +1000:e28f FUN_1000_c79c DATA 1 true Stack[-0x86] - +1000:e293 FUN_1000_c79c DATA 1 true Stack[-0x84] - +1000:e297 FUN_1000_c79c DATA 1 true Stack[-0x2756] - +1000:e29b FUN_1000_c79c DATA 1 true Stack[-0x2754] - +1000:e29f FUN_1000_c79c DATA 1 true Stack[-0x2752] - +1000:e2a3 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:e2ab FUN_1000_c79c DATA 1 true Stack[-0x82] - +1000:e2ae FUN_1000_c79c DATA 1 true Stack[-0x80] - +1000:e2b1 FUN_1000_c79c DATA 1 true Stack[-0x7e] - +1000:e2b4 FUN_1000_c79c DATA 1 true Stack[-0x275c] - +1000:e2b8 FUN_1000_c79c DATA 1 true Stack[-0x275a] - +1000:e2bc FUN_1000_c79c DATA 1 true Stack[-0x2758] - +1000:e2c0 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:e2c8 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0fe5 Code5 FUN_1020_0fe5 FUN_1020_0fe5 +1000:e2d0 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:e2d5 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:e2da FUN_1000_c79c DATA 0 true Stack[-0x60] - +1000:e2dd FUN_1000_c79c DATA 0 true Stack[-0x5e] - +1000:e2e0 FUN_1000_c79c DATA 1 true Stack[-0x60] - +1000:e2e3 FUN_1000_c79c DATA 1 true Stack[-0x5e] - +1000:e2e6 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:e2f7 FUN_1000_c79c DATA 1 true Stack[-0x2746] - +1000:e2fb FUN_1000_c79c DATA 1 true Stack[-0x2744] - +1000:e2ff FUN_1000_c79c DATA 1 true Stack[-0x2742] - +1000:e303 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:e30b FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:e310 FUN_1000_c79c DATA 0 true Stack[-0x46] - +1000:e313 FUN_1000_c79c DATA 0 true Stack[-0x44] - +1000:e316 FUN_1000_c79c DATA 0 true Stack[-0x42] - +1000:e319 FUN_1000_c79c DATA 1 true Stack[-0x2750] - +1000:e31d FUN_1000_c79c DATA 1 true Stack[-0x274e] - +1000:e323 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e32c Code1 LAB_1000_e32c +1000:e32c FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:e331 FUN_1000_c79c DATA 1 true Stack[-0x2746] - +1000:e335 FUN_1000_c79c DATA 1 true Stack[-0x2744] - +1000:e339 FUN_1000_c79c DATA 1 true Stack[-0x2742] - +1000:e33d FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:e342 FUN_1000_c79c DATA 0 true Stack[-0x2746] - +1000:e346 FUN_1000_c79c DATA 0 true Stack[-0x2744] - +1000:e34a FUN_1000_c79c DATA 0 true Stack[-0x2742] - +1000:e34e FUN_1000_c79c DATA 0 true Stack[-0x5e] - +1000:e352 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e35c Code1 LAB_1000_e35c +1000:e354 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e37b Code1 LAB_1000_e37b +1000:e356 FUN_1000_c79c DATA 0 true Stack[-0x60] - +1000:e35a FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e37b Code1 LAB_1000_e37b +1000:e35c FUN_1000_c79c DATA 1 true Stack[-0x2746] - +1000:e360 FUN_1000_c79c DATA 1 true Stack[-0x2744] - +1000:e364 FUN_1000_c79c DATA 1 true Stack[-0x2742] - +1000:e36a FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e36f Code1 LAB_1000_e36f +1000:e36f FUN_1000_c79c DATA 0 true Stack[-0x2746] - +1000:e373 FUN_1000_c79c DATA 0 true Stack[-0x2744] - +1000:e377 FUN_1000_c79c DATA 0 true Stack[-0x2742] - +1000:e37b FUN_1000_c79c DATA 1 true Stack[-0x16] - +1000:e37e FUN_1000_c79c DATA 1 true Stack[-0x14] - +1000:e381 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:e389 FUN_1000_c79c DATA 1 true Stack[-0x46] - +1000:e38c FUN_1000_c79c DATA 1 true Stack[-0x44] - +1000:e38f FUN_1000_c79c DATA 1 true Stack[-0x42] - +1000:e39d FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:e3a2 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:10be Code5 FUN_1020_10be FUN_1020_10be +1000:e3aa FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:e3af FUN_1000_c79c DATA 0 true Stack[-0x4c] - +1000:e3b2 FUN_1000_c79c DATA 0 true Stack[-0x4a] - +1000:e3b5 FUN_1000_c79c DATA 0 true Stack[-0x48] - +1000:e3b8 FUN_1000_c79c DATA 0 true Stack[-0x4c] - +1000:e3bd FUN_1000_c79c DATA 0 true Stack[-0x4a] - +1000:e3c2 FUN_1000_c79c DATA 0 true Stack[-0x48] - +1000:e3c7 FUN_1000_c79c DATA 1 true Stack[-0x16] - +1000:e3ca FUN_1000_c79c DATA 1 true Stack[-0x14] - +1000:e3cd FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:e3d5 FUN_1000_c79c DATA 1 true Stack[-0x60] - +1000:e3d8 FUN_1000_c79c DATA 1 true Stack[-0x5e] - +1000:e3dd FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e3e6 Code1 LAB_1000_e3e6 +1000:e3e6 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:e3eb FUN_1000_c79c DATA 1 true Stack[-0x4c] - +1000:e3ee FUN_1000_c79c DATA 1 true Stack[-0x4a] - +1000:e3f1 FUN_1000_c79c DATA 1 true Stack[-0x48] - +1000:e3f4 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:e3fc FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:e40d FUN_1000_c79c DATA 1 true Stack[-0x40] - +1000:e410 FUN_1000_c79c DATA 1 true Stack[-0x3e] - +1000:e413 FUN_1000_c79c DATA 1 true Stack[-0x3c] - +1000:e416 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:e41e FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0feb Code5 FUN_1020_0feb FUN_1020_0feb +1000:e423 FUN_1000_c79c DATA 1 true Stack[-0x2746] - +1000:e427 FUN_1000_c79c DATA 1 true Stack[-0x2744] - +1000:e42b FUN_1000_c79c DATA 1 true Stack[-0x2742] - +1000:e42f FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0feb Code5 FUN_1020_0feb FUN_1020_0feb +1000:e434 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:e439 FUN_1000_c79c DATA 0 true Stack[-0x60] - +1000:e43c FUN_1000_c79c DATA 0 true Stack[-0x5e] - +1000:e448 FUN_1000_c79c DATA 1 true Stack[-0x40] - +1000:e44b FUN_1000_c79c DATA 1 true Stack[-0x3e] - +1000:e44e FUN_1000_c79c DATA 1 true Stack[-0x3c] - +1000:e451 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:e456 FUN_1000_c79c DATA 1 true Stack[-0x46] - +1000:e459 FUN_1000_c79c DATA 1 true Stack[-0x44] - +1000:e45c FUN_1000_c79c DATA 1 true Stack[-0x42] - +1000:e45f FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0fe5 Code5 FUN_1020_0fe5 FUN_1020_0fe5 +1000:e464 FUN_1000_c79c DATA 0 true Stack[-0x40] - +1000:e467 FUN_1000_c79c DATA 0 true Stack[-0x3e] - +1000:e46a FUN_1000_c79c DATA 0 true Stack[-0x3c] - +1000:e46d FUN_1000_c79c DATA 0 true Stack[-0x275e] - +1000:e473 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e480 Code1 LAB_1000_e480 +1000:e475 FUN_1000_c79c DATA 0 true Stack[-0x275e] - +1000:e47b FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e480 Code1 LAB_1000_e480 +1000:e47d FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:e590 Code1 LAB_1000_e590 +1000:e480 FUN_1000_c79c DATA 1 true Stack[-0x275e] - +1000:e491 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e4a2 Code1 LAB_1000_e4a2 +1000:e493 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e498 Code1 LAB_1000_e498 +1000:e495 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:e590 Code1 LAB_1000_e590 +1000:e49d FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e4a2 Code1 LAB_1000_e4a2 +1000:e49f FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:e590 Code1 LAB_1000_e590 +1000:e4a2 FUN_1000_c79c DATA 1 true Stack[-0x5c] - +1000:e4a5 FUN_1000_c79c DATA 1 true Stack[-0x5a] - +1000:e4a8 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:e4b0 FUN_1000_c79c DATA 1 true Stack[-0x2750] - +1000:e4b4 FUN_1000_c79c DATA 1 true Stack[-0x274e] - +1000:e4b8 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:e4bd FUN_1000_c79c DATA 1 true Stack[-0x2756] - +1000:e4c1 FUN_1000_c79c DATA 1 true Stack[-0x2754] - +1000:e4c5 FUN_1000_c79c DATA 1 true Stack[-0x2752] - +1000:e4c9 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:e4d1 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:e4d6 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:e4df FUN_1000_c79c DATA 1 true Stack[-0x275e] - +1000:e4fb FUN_1000_c79c DATA 1 true Stack[-0x275e] - +1000:e50f FUN_1000_c79c DATA 1 true Stack[-0x5c] - +1000:e512 FUN_1000_c79c DATA 1 true Stack[-0x5a] - +1000:e515 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:e51d FUN_1000_c79c DATA 1 true Stack[-0x2750] - +1000:e521 FUN_1000_c79c DATA 1 true Stack[-0x274e] - +1000:e525 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:e52a FUN_1000_c79c DATA 1 true Stack[-0x275c] - +1000:e52e FUN_1000_c79c DATA 1 true Stack[-0x275a] - +1000:e532 FUN_1000_c79c DATA 1 true Stack[-0x2758] - +1000:e536 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:e53e FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:e543 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:e54c FUN_1000_c79c DATA 1 true Stack[-0x275e] - +1000:e568 FUN_1000_c79c DATA 1 true Stack[-0x275e] - +1000:e57c FUN_1000_c79c DATA 1 true Stack[-0x2750] - +1000:e580 FUN_1000_c79c DATA 1 true Stack[-0x274e] - +1000:e58a FUN_1000_c79c DATA 0 true Stack[-0x64] - +1000:e58d FUN_1000_c79c DATA 0 true Stack[-0x62] - +1000:e590 FUN_1000_c79c DATA 1 true Stack[-0x2750] - +1000:e594 FUN_1000_c79c DATA 1 true Stack[-0x274e] - +1000:e598 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:e5a0 FUN_1000_c79c DATA 1 true Stack[-0x16] - +1000:e5a3 FUN_1000_c79c DATA 1 true Stack[-0x14] - +1000:e5a6 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:e5ae FUN_1000_c79c DATA 1 true Stack[-0x2750] - +1000:e5b2 FUN_1000_c79c DATA 1 true Stack[-0x274e] - +1000:e5b8 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e5c1 Code1 LAB_1000_e5c1 +1000:e5c1 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:e5c6 FUN_1000_c79c DATA 1 true Stack[-0x4c] - +1000:e5c9 FUN_1000_c79c DATA 1 true Stack[-0x4a] - +1000:e5cc FUN_1000_c79c DATA 1 true Stack[-0x48] - +1000:e5cf FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:e5d7 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:e5e6 FUN_1000_c79c DATA 1 true Stack[-0x274c] - +1000:e5ea FUN_1000_c79c DATA 1 true Stack[-0x274a] - +1000:e5ee FUN_1000_c79c DATA 1 true Stack[-0x2748] - +1000:e5f2 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0fe5 Code5 FUN_1020_0fe5 FUN_1020_0fe5 +1000:e5fa FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0feb Code5 FUN_1020_0feb FUN_1020_0feb +1000:e602 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:e607 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:e60c FUN_1000_c79c DATA 0 true Stack[-0x64] - +1000:e60f FUN_1000_c79c DATA 0 true Stack[-0x62] - +1000:e612 FUN_1000_c79c READ 0 true 1028:07c6 Data6 DAT_1028_07c6 +1000:e617 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e61c Code1 LAB_1000_e61c +1000:e619 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:e6d2 Code1 LAB_1000_e6d2 +1000:e61c FUN_1000_c79c DATA 1 true Stack[-0x2740] - +1000:e620 FUN_1000_c79c DATA 1 true Stack[-0x273e] - +1000:e624 FUN_1000_c79c DATA 1 true Stack[-0x273c] - +1000:e62e FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1007 Code5 FUN_1020_1007 FUN_1020_1007 +1000:e633 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e638 Code1 LAB_1000_e638 +1000:e635 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:e6d2 Code1 LAB_1000_e6d2 +1000:e638 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:e647 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:e64c FUN_1000_c79c DATA 1 true Stack[-0x2740] - +1000:e650 FUN_1000_c79c DATA 1 true Stack[-0x273e] - +1000:e654 FUN_1000_c79c DATA 1 true Stack[-0x273c] - +1000:e658 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:e65d FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:e662 FUN_1000_c79c DATA 1 true Stack[-0x274e] - +1000:e666 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e670 Code1 LAB_1000_e670 +1000:e668 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e6d2 Code1 LAB_1000_e6d2 +1000:e66a FUN_1000_c79c DATA 1 true Stack[-0x2750] - +1000:e66e FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e6d2 Code1 LAB_1000_e6d2 +1000:e670 FUN_1000_c79c DATA 1 true Stack[-0x2732] - +1000:e674 FUN_1000_c79c DATA 1 true Stack[-0x2730] - +1000:e678 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e68d Code1 LAB_1000_e68d +1000:e67a FUN_1000_c79c DATA 0 true Stack[-0x2730] - +1000:e67e FUN_1000_c79c DATA 0 true Stack[-0x2732] - +1000:e682 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:e686 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1000:bc36 Code1 FUN_1000_bc36 FUN_1000_bc36 +1000:e68b FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:e694 Code1 LAB_1000_e694 +1000:e68f FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1008:0002 Code2 FUN_1008_0002 FUN_1008_0002 +1000:e694 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:e6a3 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:e6a8 FUN_1000_c79c DATA 1 true Stack[-0x273a] - +1000:e6ac FUN_1000_c79c DATA 1 true Stack[-0x2738] - +1000:e6b0 FUN_1000_c79c DATA 1 true Stack[-0x2736] - +1000:e6b4 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:e6b9 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:e6c2 FUN_1000_c79c DATA 1 true Stack[-0x64] - +1000:e6c5 FUN_1000_c79c DATA 1 true Stack[-0x62] - +1000:e6cc FUN_1000_c79c DATA 0 true Stack[-0x64] - +1000:e6cf FUN_1000_c79c DATA 0 true Stack[-0x62] - +1000:e6d2 FUN_1000_c79c DATA 1 true Stack[-0x5c] - +1000:e6d5 FUN_1000_c79c DATA 1 true Stack[-0x5a] - +1000:e6d8 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:e6e0 FUN_1000_c79c DATA 1 true Stack[-0x64] - +1000:e6e3 FUN_1000_c79c DATA 1 true Stack[-0x62] - +1000:e6e6 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:e6eb FUN_1000_c79c DATA 1 true Stack[-0x2756] - +1000:e6ef FUN_1000_c79c DATA 1 true Stack[-0x2754] - +1000:e6f3 FUN_1000_c79c DATA 1 true Stack[-0x2752] - +1000:e6f7 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:e6ff FUN_1000_c79c DATA 1 true Stack[-0x60] - +1000:e702 FUN_1000_c79c DATA 1 true Stack[-0x5e] - +1000:e705 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:e70a FUN_1000_c79c DATA 1 true Stack[-0x275c] - +1000:e70e FUN_1000_c79c DATA 1 true Stack[-0x275a] - +1000:e712 FUN_1000_c79c DATA 1 true Stack[-0x2758] - +1000:e716 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:e71e FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0feb Code5 FUN_1020_0feb FUN_1020_0feb +1000:e726 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:e72b FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:e730 FUN_1000_c79c DATA 0 true Stack[-0x1a] - +1000:e733 FUN_1000_c79c DATA 0 true Stack[-0x18] - +1000:e736 FUN_1000_c79c DATA 1 true Stack[-0x5c] - +1000:e739 FUN_1000_c79c DATA 1 true Stack[-0x5a] - +1000:e73c FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:e744 FUN_1000_c79c DATA 1 true Stack[-0x60] - +1000:e747 FUN_1000_c79c DATA 1 true Stack[-0x5e] - +1000:e74a FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:e74f FUN_1000_c79c DATA 1 true Stack[-0x2756] - +1000:e753 FUN_1000_c79c DATA 1 true Stack[-0x2754] - +1000:e757 FUN_1000_c79c DATA 1 true Stack[-0x2752] - +1000:e75b FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:e763 FUN_1000_c79c DATA 1 true Stack[-0x64] - +1000:e766 FUN_1000_c79c DATA 1 true Stack[-0x62] - +1000:e769 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:e76e FUN_1000_c79c DATA 1 true Stack[-0x275c] - +1000:e772 FUN_1000_c79c DATA 1 true Stack[-0x275a] - +1000:e776 FUN_1000_c79c DATA 1 true Stack[-0x2758] - +1000:e77a FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:e782 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0fe5 Code5 FUN_1020_0fe5 FUN_1020_0fe5 +1000:e78a FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:e78f FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:e794 FUN_1000_c79c DATA 0 true Stack[-0x1e] - +1000:e797 FUN_1000_c79c DATA 0 true Stack[-0x1c] - +1000:e79a FUN_1000_c79c DATA 1 true Stack[-0xe] - +1000:e79d FUN_1000_c79c DATA 1 true Stack[-0xc] - +1000:e7a0 FUN_1000_c79c DATA 1 true Stack[-0x1a] - +1000:e7a3 FUN_1000_c79c DATA 1 true Stack[-0x18] - +1000:e7a6 FUN_1000_c79c DATA 0 true Stack[-0xe] - +1000:e7a9 FUN_1000_c79c DATA 0 true Stack[-0xc] - +1000:e7ac FUN_1000_c79c DATA 1 true Stack[-0x12] - +1000:e7af FUN_1000_c79c DATA 1 true Stack[-0x10] - +1000:e7b2 FUN_1000_c79c DATA 1 true Stack[-0x1e] - +1000:e7b5 FUN_1000_c79c DATA 1 true Stack[-0x1c] - +1000:e7b8 FUN_1000_c79c DATA 0 true Stack[-0x12] - +1000:e7bb FUN_1000_c79c DATA 0 true Stack[-0x10] - +1000:e7be FUN_1000_c79c DATA 0 true Stack[-0x275e] - +1000:e7c3 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e7fd Code1 LAB_1000_e7fd +1000:e7c5 FUN_1000_c79c DATA 0 true Stack[-0x14] - +1000:e7c9 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e7d4 Code1 LAB_1000_e7d4 +1000:e7cb FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e7f3 Code1 LAB_1000_e7f3 +1000:e7cd FUN_1000_c79c DATA 0 true Stack[-0x16] - +1000:e7d2 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e7f3 Code1 LAB_1000_e7f3 +1000:e7d4 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:e7e3 FUN_1000_c79c DATA 0 true Stack[-0xe] - +1000:e7e6 FUN_1000_c79c DATA 0 true Stack[-0xc] - +1000:e7eb FUN_1000_c79c DATA 0 true Stack[-0x12] - +1000:e7ee FUN_1000_c79c DATA 0 true Stack[-0x10] - +1000:e7f1 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:e7fb Code1 LAB_1000_e7fb +1000:e7f5 FUN_1000_c79c DATA 0 true Stack[-0xe] - +1000:e7f8 FUN_1000_c79c DATA 0 true Stack[-0xc] - +1000:e7fb FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:e831 Code1 LAB_1000_e831 +1000:e7fd FUN_1000_c79c DATA 0 true Stack[-0x275e] - +1000:e802 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e831 Code1 LAB_1000_e831 +1000:e804 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:e810 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e828 Code1 LAB_1000_e828 +1000:e812 FUN_1000_c79c DATA 1 true Stack[-0x8] - +1000:e81c FUN_1000_c79c WRITE 0 true 1028:424c Data6 DAT_1028_424c +1000:e821 FUN_1000_c79c WRITE 0 true 1028:0874 Data6 DAT_1028_0874 +1000:e826 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:e831 Code1 LAB_1000_e831 +1000:e828 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:e82c FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1000:ae6e Code1 FUN_1000_ae6e FUN_1000_ae6e +1000:e831 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:e83e FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e843 Code1 LAB_1000_e843 +1000:e840 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:ea36 Code1 LAB_1000_ea36 +1000:e843 FUN_1000_c79c DATA 1 true Stack[-0x40] - +1000:e846 FUN_1000_c79c DATA 1 true Stack[-0x3e] - +1000:e849 FUN_1000_c79c DATA 1 true Stack[-0x3c] - +1000:e84c FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:e862 FUN_1000_c79c DATA 1 true Stack[-0xe] - +1000:e865 FUN_1000_c79c DATA 1 true Stack[-0xc] - +1000:e872 FUN_1000_c79c DATA 1 true Stack[-0x12] - +1000:e875 FUN_1000_c79c DATA 1 true Stack[-0x10] - +1000:e88c FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:e899 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:e89e FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff1 Code5 FUN_1020_0ff1 FUN_1020_0ff1 +1000:e8a6 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:e8b7 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:e8c4 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:e8c9 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff1 Code5 FUN_1020_0ff1 FUN_1020_0ff1 +1000:e8d1 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0fe5 Code5 FUN_1020_0fe5 FUN_1020_0fe5 +1000:e8d6 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:10be Code5 FUN_1020_10be FUN_1020_10be +1000:e8e3 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:e8e8 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:e8ed FUN_1000_c79c DATA 0 true Stack[-0x16] - +1000:e8f0 FUN_1000_c79c DATA 0 true Stack[-0x14] - +1000:e8f3 FUN_1000_c79c DATA 1 true Stack[-0x16] - +1000:e8f6 FUN_1000_c79c DATA 1 true Stack[-0x14] - +1000:e8f9 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:e904 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e914 Code1 LAB_1000_e914 +1000:e906 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e90b Code1 LAB_1000_e90b +1000:e908 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:e9f0 Code1 LAB_1000_e9f0 +1000:e90f FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:e914 Code1 LAB_1000_e914 +1000:e911 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:e9f0 Code1 LAB_1000_e9f0 +1000:e914 FUN_1000_c79c DATA 1 true Stack[-0x16] - +1000:e917 FUN_1000_c79c DATA 1 true Stack[-0x14] - +1000:e91a FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:e922 FUN_1000_c79c DATA 1 true Stack[-0x16] - +1000:e925 FUN_1000_c79c DATA 1 true Stack[-0x14] - +1000:e928 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:e941 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:e946 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:e94e FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:e953 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:e95c FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:e97b FUN_1000_c79c DATA 1 true Stack[-0x16] - +1000:e97e FUN_1000_c79c DATA 1 true Stack[-0x14] - +1000:e981 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:e989 FUN_1000_c79c DATA 1 true Stack[-0x16] - +1000:e98c FUN_1000_c79c DATA 1 true Stack[-0x14] - +1000:e98f FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:e9a8 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:e9ad FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:e9b5 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:0ffd Code5 FUN_1020_0ffd FUN_1020_0ffd +1000:e9ba FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:e9c3 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:e9ea FUN_1000_c79c DATA 0 true Stack[-0x16] - +1000:e9ed FUN_1000_c79c DATA 0 true Stack[-0x14] - +1000:e9f0 FUN_1000_c79c READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:e9f3 FUN_1000_c79c READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:e9f7 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:ea08 FUN_1000_c79c WRITE 0 true 1028:07d3 Data6 DAT_1028_07d3 +1000:ea0b FUN_1000_c79c WRITE 0 true 1028:07d5 Data6 DAT_1028_07d5 +1000:ea0f FUN_1000_c79c READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:ea12 FUN_1000_c79c READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:ea20 FUN_1000_c79c WRITE 0 true 1028:07d7 Data6 DAT_1028_07d7 +1000:ea23 FUN_1000_c79c WRITE 0 true 1028:07d9 Data6 DAT_1028_07d9 +1000:ea27 FUN_1000_c79c DATA 1 true Stack[-0x8] - +1000:ea2d FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:ea31 FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1000:bdde Code1 FUN_1000_bdde FUN_1000_bdde +1000:ea36 FUN_1000_c79c DATA 0 true Stack[-0x2760] - +1000:ea3b FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:ea54 Code1 LAB_1000_ea54 +1000:ea3d FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:ea4a FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:ea54 Code1 LAB_1000_ea54 +1000:ea52 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:ea56 Code1 LAB_1000_ea56 +1000:ea54 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:ea63 Code1 LAB_1000_ea63 +1000:ea56 FUN_1000_c79c DATA 1 true Stack[-0x2762] - +1000:ea5a FUN_1000_c79c DATA 1 true Stack[-0x2772] - +1000:ea5e FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:ea63 Code1 LAB_1000_ea63 +1000:ea60 FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:c835 Code1 LAB_1000_c835 +1000:ea63 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:ea70 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:ea83 Code1 LAB_1000_ea83 +1000:ea78 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:ea83 Code1 LAB_1000_ea83 +1000:ea7a FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:ea7e FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1000:9f73 Code1 FUN_1000_9f73 FUN_1000_9f73 +1000:ea83 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:ea8f FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:eaa1 Code1 LAB_1000_eaa1 +1000:ea91 FUN_1000_c79c DATA 1 true Stack[-0x8] - +1000:ea98 FUN_1000_c79c DATA 1 true Stack[0x4] - +1000:ea9c FUN_1000_c79c UNCONDITIONAL_CALL 0 true 1000:c426 Code1 FUN_1000_c426 FUN_1000_c426 +1000:eaa1 FUN_1000_c79c DATA 1 true Stack[-0x8] - +1000:eaa4 FUN_1000_c79c DATA 1 true Stack[-0x2770] - +1000:eaa8 FUN_1000_c79c CONDITIONAL_JUMP 0 true 1000:eaad Code1 LAB_1000_eaad +1000:eaaa FUN_1000_c79c UNCONDITIONAL_JUMP 0 true 1000:c7d2 Code1 LAB_1000_c7d2 +1000:eab5 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:eac0 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:eac5 Code1 LAB_1000_eac5 +1000:eac2 exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:fd81 Code1 LAB_1000_fd81 +1000:eacd exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:ead2 Code1 LAB_1000_ead2 +1000:eacf exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:fd81 Code1 LAB_1000_fd81 +1000:ead8 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:eadd Code1 LAB_1000_eadd +1000:eada exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:fd81 Code1 LAB_1000_fd81 +1000:eae3 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:eae8 Code1 LAB_1000_eae8 +1000:eae5 exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:fd81 Code1 LAB_1000_fd81 +1000:eae8 exported_ordinal_10 READ 0 true 1028:07cc Data6 DAT_1028_07cc +1000:eaed exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:eaf2 Code1 LAB_1000_eaf2 +1000:eaef exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:fd81 Code1 LAB_1000_fd81 +1000:eaf7 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:eafc Code1 LAB_1000_eafc +1000:eaf9 exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:fd81 Code1 LAB_1000_fd81 +1000:eafc exported_ordinal_10 READ 0 true 1028:07c4 Data6 DAT_1028_07c4 +1000:eb01 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:eb06 Code1 LAB_1000_eb06 +1000:eb03 exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:fd81 Code1 LAB_1000_fd81 +1000:eb0b exported_ordinal_10 READ 0 true 1028:07c5 Data6 DAT_1028_07c5 +1000:eb10 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:eb31 Code1 LAB_1000_eb31 +1000:eb12 exported_ordinal_10 DATA 0 true Stack[-0x30] - +1000:eb17 exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:eb1c Code1 LAB_1000_eb1c +1000:eb19 exported_ordinal_10 DATA 0 true Stack[-0x30] - +1000:eb1c exported_ordinal_10 DATA 0 true Stack[-0x30] - +1000:eb20 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:7e12 Code1 FUN_1000_7e12 FUN_1000_7e12 +1000:eb25 exported_ordinal_10 DATA 0 true Stack[-0x30] - +1000:eb2a exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:eb19 Code1 LAB_1000_eb19 +1000:eb2c exported_ordinal_10 WRITE 0 true 1028:07c5 Data6 DAT_1028_07c5 +1000:eb31 exported_ordinal_10 READ_WRITE 0 true 1028:0876 Data6 DAT_1028_0876 +1000:eb36 exported_ordinal_10 READ_WRITE 0 true 1028:0878 Data6 DAT_1028_0878 +1000:eb3b exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:eb44 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:eb49 Code1 LAB_1000_eb49 +1000:eb46 exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f4ad Code1 LAB_1000_f4ad +1000:eb49 exported_ordinal_10 READ 0 true 1028:07ca Data6 DAT_1028_07ca +1000:eb4e exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:eb53 Code1 LAB_1000_eb53 +1000:eb50 exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f121 Code1 LAB_1000_f121 +1000:eb53 exported_ordinal_10 READ 0 true 1028:0874 Data6 DAT_1028_0874 +1000:eb58 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:eb5d Code1 LAB_1000_eb5d +1000:eb5a exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f121 Code1 LAB_1000_f121 +1000:eb5d exported_ordinal_10 READ 1 true 1028:086d Data6 DAT_1028_086d +1000:eb60 exported_ordinal_10 READ 1 true 1028:086f Data6 DAT_1028_086f +1000:eb64 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:ebad Code1 LAB_1000_ebad +1000:eb6a exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:eb6f exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:eb72 exported_ordinal_10 READ 1 true 1028:086f Data6 DAT_1028_086f +1000:eb75 exported_ordinal_10 READ 1 true 1028:086d Data6 DAT_1028_086d +1000:eb79 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:eb84 Code1 LAB_1000_eb84 +1000:eb7b exported_ordinal_10 READ 1 true 1028:086d Data6 DAT_1028_086d +1000:eb7f exported_ordinal_10 WRITE 0 true 1028:086d Data6 DAT_1028_086d +1000:eb82 exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:eb8b Code1 LAB_1000_eb8b +1000:eb84 exported_ordinal_10 READ 1 true 1028:086d Data6 DAT_1028_086d +1000:eb88 exported_ordinal_10 WRITE 0 true 1028:086d Data6 DAT_1028_086d +1000:eb8b exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:eb8e exported_ordinal_10 READ 0 true 1028:086d Data6 DAT_1028_086d +1000:eb92 exported_ordinal_10 READ 1 true 1028:0873 Data6 DAT_1028_0873 +1000:eb96 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1008:0e08 Code2 FUN_1008_0e08 FUN_1008_0e08 +1000:eb9b exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:eba2 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:eba5 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:ebaa exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f121 Code1 LAB_1000_f121 +1000:ebad exported_ordinal_10 READ 0 true 1028:086d Data6 DAT_1028_086d +1000:ebb2 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:ec06 Code1 LAB_1000_ec06 +1000:ebb4 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:ebbb exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:ebc0 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:ebc3 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:ebca exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1008:0e08 Code2 FUN_1008_0e08 FUN_1008_0e08 +1000:ebcf exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:ebd6 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:ebd9 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:ebde exported_ordinal_10 READ 0 true 1028:0873 Data6 DAT_1028_0873 +1000:ebe3 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:ec03 Code1 LAB_1000_ec03 +1000:ebe5 exported_ordinal_10 WRITE 0 true 1028:07ca Data6 DAT_1028_07ca +1000:ebea exported_ordinal_10 DATA 0 true Stack[-0x2e] - +1000:ebef exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:ebf4 Code1 LAB_1000_ebf4 +1000:ebf1 exported_ordinal_10 DATA 0 true Stack[-0x2e] - +1000:ebf4 exported_ordinal_10 DATA 1 true Stack[-0x2e] - +1000:ebf8 exported_ordinal_10 WRITE 0 true 1028:0d73 Data6 DAT_1028_0d73 +1000:ebf8 exported_ordinal_10 WRITE 0 false 1028:0dc6 Data6 DAT_1028_0dc6 +1000:ebfd exported_ordinal_10 DATA 0 true Stack[-0x2e] - +1000:ec01 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:ebf1 Code1 LAB_1000_ebf1 +1000:ec03 exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f121 Code1 LAB_1000_f121 +1000:ec06 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:ec0d exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:ec12 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:ec15 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:ec18 exported_ordinal_10 READ 0 true 1028:086d Data6 DAT_1028_086d +1000:ec1e exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1008:0e08 Code2 FUN_1008_0e08 FUN_1008_0e08 +1000:ec23 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:ec2a exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:ec2d exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:ec32 exported_ordinal_10 WRITE 0 true 1028:086f Data6 DAT_1028_086f +1000:ec38 exported_ordinal_10 WRITE 0 true 1028:0873 Data6 DAT_1028_0873 +1000:ec3f exported_ordinal_10 WRITE 0 true 1028:2679 Data6 DAT_1028_2679 +1000:ec42 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:ec66 exported_ordinal_10 READ 1 true 1028:086d Data6 DAT_1028_086d +1000:ec6c exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:ece0 Code1 LAB_1000_ece0 +1000:ec6e exported_ordinal_10 WRITE 0 true 1028:07d3 Data6 DAT_1028_07d3 +1000:ec74 exported_ordinal_10 WRITE 0 true 1028:07d5 Data6 DAT_1028_07d5 +1000:ec7a exported_ordinal_10 WRITE 0 true 1028:07d7 Data6 DAT_1028_07d7 +1000:ec80 exported_ordinal_10 WRITE 0 true 1028:07d9 Data6 DAT_1028_07d9 +1000:ec8e exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:ec9c exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:eca1 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:eca6 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:ecbb exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:ecc6 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:eccb exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:ecd0 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:ecdd exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f101 Code1 LAB_1000_f101 +1000:ece3 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:ed5d Code1 LAB_1000_ed5d +1000:ece5 exported_ordinal_10 WRITE 0 true 1028:07d3 Data6 DAT_1028_07d3 +1000:eceb exported_ordinal_10 WRITE 0 true 1028:07d5 Data6 DAT_1028_07d5 +1000:ecf1 exported_ordinal_10 WRITE 0 true 1028:07d7 Data6 DAT_1028_07d7 +1000:ecf7 exported_ordinal_10 WRITE 0 true 1028:07d9 Data6 DAT_1028_07d9 +1000:ecfd exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:ed08 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:ed16 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:ed1b exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:ed20 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:ed35 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:ed43 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:ed48 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:ed4d exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:ed5a exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f101 Code1 LAB_1000_f101 +1000:ed60 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:edda Code1 LAB_1000_edda +1000:ed62 exported_ordinal_10 WRITE 0 true 1028:07d3 Data6 DAT_1028_07d3 +1000:ed68 exported_ordinal_10 WRITE 0 true 1028:07d5 Data6 DAT_1028_07d5 +1000:ed6e exported_ordinal_10 WRITE 0 true 1028:07d7 Data6 DAT_1028_07d7 +1000:ed74 exported_ordinal_10 WRITE 0 true 1028:07d9 Data6 DAT_1028_07d9 +1000:ed7a exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:ed85 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:ed93 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:ed98 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:ed9d exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:edb2 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:edc0 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:edc5 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:edca exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:edd7 exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f101 Code1 LAB_1000_f101 +1000:eddd exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:ee57 Code1 LAB_1000_ee57 +1000:eddf exported_ordinal_10 WRITE 0 true 1028:07d3 Data6 DAT_1028_07d3 +1000:ede5 exported_ordinal_10 WRITE 0 true 1028:07d5 Data6 DAT_1028_07d5 +1000:edeb exported_ordinal_10 WRITE 0 true 1028:07d7 Data6 DAT_1028_07d7 +1000:edf1 exported_ordinal_10 WRITE 0 true 1028:07d9 Data6 DAT_1028_07d9 +1000:edf7 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:ee02 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:ee10 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:ee15 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:ee1a exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:ee2f exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:ee3d exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:ee42 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:ee47 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:ee54 exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f101 Code1 LAB_1000_f101 +1000:ee5a exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:eed4 Code1 LAB_1000_eed4 +1000:ee5c exported_ordinal_10 WRITE 0 true 1028:07d3 Data6 DAT_1028_07d3 +1000:ee62 exported_ordinal_10 WRITE 0 true 1028:07d5 Data6 DAT_1028_07d5 +1000:ee68 exported_ordinal_10 WRITE 0 true 1028:07d7 Data6 DAT_1028_07d7 +1000:ee6e exported_ordinal_10 WRITE 0 true 1028:07d9 Data6 DAT_1028_07d9 +1000:ee74 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:ee7f exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:ee8d exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:ee92 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:ee97 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:eeac exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:eeba exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:eebf exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:eec4 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:eed1 exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f101 Code1 LAB_1000_f101 +1000:eed7 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:ef51 Code1 LAB_1000_ef51 +1000:eed9 exported_ordinal_10 WRITE 0 true 1028:07d3 Data6 DAT_1028_07d3 +1000:eedf exported_ordinal_10 WRITE 0 true 1028:07d5 Data6 DAT_1028_07d5 +1000:eee5 exported_ordinal_10 WRITE 0 true 1028:07d7 Data6 DAT_1028_07d7 +1000:eeeb exported_ordinal_10 WRITE 0 true 1028:07d9 Data6 DAT_1028_07d9 +1000:eef1 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:eefc exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:ef0a exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:ef0f exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:ef14 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:ef29 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:ef37 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:ef3c exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:ef41 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:ef4e exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f101 Code1 LAB_1000_f101 +1000:ef54 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:efce Code1 LAB_1000_efce +1000:ef56 exported_ordinal_10 WRITE 0 true 1028:07d3 Data6 DAT_1028_07d3 +1000:ef5c exported_ordinal_10 WRITE 0 true 1028:07d5 Data6 DAT_1028_07d5 +1000:ef62 exported_ordinal_10 WRITE 0 true 1028:07d7 Data6 DAT_1028_07d7 +1000:ef68 exported_ordinal_10 WRITE 0 true 1028:07d9 Data6 DAT_1028_07d9 +1000:ef6e exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:ef79 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:ef87 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:ef8c exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:ef91 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:efa6 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:efb4 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:efb9 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:efbe exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:efcb exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f101 Code1 LAB_1000_f101 +1000:efd1 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f04b Code1 LAB_1000_f04b +1000:efd3 exported_ordinal_10 WRITE 0 true 1028:07d3 Data6 DAT_1028_07d3 +1000:efd9 exported_ordinal_10 WRITE 0 true 1028:07d5 Data6 DAT_1028_07d5 +1000:efdf exported_ordinal_10 WRITE 0 true 1028:07d7 Data6 DAT_1028_07d7 +1000:efe5 exported_ordinal_10 WRITE 0 true 1028:07d9 Data6 DAT_1028_07d9 +1000:efeb exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:eff6 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:f004 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:f009 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:f00e exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:f023 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:f031 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:f036 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:f03b exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:f048 exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f101 Code1 LAB_1000_f101 +1000:f04e exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f0c7 Code1 LAB_1000_f0c7 +1000:f050 exported_ordinal_10 WRITE 0 true 1028:07d3 Data6 DAT_1028_07d3 +1000:f056 exported_ordinal_10 WRITE 0 true 1028:07d5 Data6 DAT_1028_07d5 +1000:f05c exported_ordinal_10 WRITE 0 true 1028:07d7 Data6 DAT_1028_07d7 +1000:f062 exported_ordinal_10 WRITE 0 true 1028:07d9 Data6 DAT_1028_07d9 +1000:f068 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:f073 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:f081 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:f086 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:f08b exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:f0a0 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:f0ae exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:f0b3 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:f0b8 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:f0c5 exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f101 Code1 LAB_1000_f101 +1000:f0ca exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f101 Code1 LAB_1000_f101 +1000:f0cc exported_ordinal_10 WRITE 0 true 1028:07d3 Data6 DAT_1028_07d3 +1000:f0d2 exported_ordinal_10 WRITE 0 true 1028:07d5 Data6 DAT_1028_07d5 +1000:f0d8 exported_ordinal_10 WRITE 0 true 1028:07d7 Data6 DAT_1028_07d7 +1000:f0de exported_ordinal_10 WRITE 0 true 1028:07d9 Data6 DAT_1028_07d9 +1000:f0e4 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:f106 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:c426 Code1 FUN_1000_c426 FUN_1000_c426 +1000:f10c exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:9bca Code1 FUN_1000_9bca FUN_1000_9bca +1000:f113 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1008:0002 Code2 FUN_1008_0002 FUN_1008_0002 +1000:f118 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:f121 exported_ordinal_10 DATA 0 true Stack[-0x2e] - +1000:f126 exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f12b Code1 LAB_1000_f12b +1000:f128 exported_ordinal_10 DATA 0 true Stack[-0x2e] - +1000:f12b exported_ordinal_10 DATA 1 true Stack[-0x2e] - +1000:f12e exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:f138 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f15e Code1 LAB_1000_f15e +1000:f13a exported_ordinal_10 DATA 1 true Stack[-0x2e] - +1000:f13d exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:f146 exported_ordinal_10 DATA 1 true Stack[-0x2e] - +1000:f149 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:f153 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f15e Code1 LAB_1000_f15e +1000:f155 exported_ordinal_10 DATA 0 true Stack[-0x2e] - +1000:f159 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:b3f3 Code1 FUN_1000_b3f3 FUN_1000_b3f3 +1000:f15e exported_ordinal_10 DATA 0 true Stack[-0x2e] - +1000:f163 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f128 Code1 LAB_1000_f128 +1000:f165 exported_ordinal_10 READ 0 true 1028:07c7 Data6 DAT_1028_07c7 +1000:f16a exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f193 Code1 LAB_1000_f193 +1000:f16c exported_ordinal_10 READ 0 true 1028:0857 Data6 DAT_1028_0857 +1000:f171 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f17c Code1 LAB_1000_f17c +1000:f173 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f18e Code1 LAB_1000_f18e +1000:f175 exported_ordinal_10 READ 0 true 1028:0855 Data6 DAT_1028_0855 +1000:f17a exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f18e Code1 LAB_1000_f18e +1000:f17c exported_ordinal_10 READ_WRITE 0 true 1028:0855 Data6 DAT_1028_0855 +1000:f181 exported_ordinal_10 READ_WRITE 0 true 1028:0857 Data6 DAT_1028_0857 +1000:f187 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:6f27 Code1 FUN_1000_6f27 FUN_1000_6f27 +1000:f18c exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f193 Code1 LAB_1000_f193 +1000:f18e exported_ordinal_10 WRITE 0 true 1028:07c7 Data6 DAT_1028_07c7 +1000:f193 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:f19b exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f1a0 Code1 LAB_1000_f1a0 +1000:f19d exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f2f5 Code1 LAB_1000_f2f5 +1000:f1a0 exported_ordinal_10 READ 0 true 1028:41f9 Data6 DAT_1028_41f9 +1000:f1a5 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f1aa Code1 LAB_1000_f1aa +1000:f1a7 exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f297 Code1 LAB_1000_f297 +1000:f1b0 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f1de Code1 LAB_1000_f1de +1000:f1b2 exported_ordinal_10 READ 1 true 1028:07e3 Data6 DAT_1028_07e3 +1000:f1b5 exported_ordinal_10 READ 1 true 1028:07e5 Data6 DAT_1028_07e5 +1000:f1c3 exported_ordinal_10 READ 1 true 1028:07eb Data6 DAT_1028_07eb +1000:f1c6 exported_ordinal_10 READ 1 true 1028:07ed Data6 DAT_1028_07ed +1000:f1d7 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:a38e Code1 FUN_1000_a38e FUN_1000_a38e +1000:f1dc exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f1e7 Code1 LAB_1000_f1e7 +1000:f1de exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:f1e7 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:f1ef exported_ordinal_10 WRITE 0 true 1028:0874 Data6 DAT_1028_0874 +1000:f1f4 exported_ordinal_10 WRITE 0 true 1028:41f9 Data6 DAT_1028_41f9 +1000:f1f9 exported_ordinal_10 READ 0 true 1028:424c Data6 DAT_1028_424c +1000:f1fe exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f22a Code1 LAB_1000_f22a +1000:f200 exported_ordinal_10 READ 1 true 1028:07e7 Data6 DAT_1028_07e7 +1000:f203 exported_ordinal_10 READ 1 true 1028:07e9 Data6 DAT_1028_07e9 +1000:f211 exported_ordinal_10 READ 1 true 1028:07ef Data6 DAT_1028_07ef +1000:f214 exported_ordinal_10 READ 1 true 1028:07f1 Data6 DAT_1028_07f1 +1000:f223 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:ae6e Code1 FUN_1000_ae6e FUN_1000_ae6e +1000:f228 exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f295 Code1 LAB_1000_f295 +1000:f22a exported_ordinal_10 READ 1 true 1028:07e7 Data6 DAT_1028_07e7 +1000:f22d exported_ordinal_10 READ 1 true 1028:07e9 Data6 DAT_1028_07e9 +1000:f231 exported_ordinal_10 WRITE 0 true 1028:07e3 Data6 DAT_1028_07e3 +1000:f234 exported_ordinal_10 WRITE 0 true 1028:07e5 Data6 DAT_1028_07e5 +1000:f238 exported_ordinal_10 READ 1 true 1028:07ef Data6 DAT_1028_07ef +1000:f23b exported_ordinal_10 READ 1 true 1028:07f1 Data6 DAT_1028_07f1 +1000:f23f exported_ordinal_10 WRITE 0 true 1028:07eb Data6 DAT_1028_07eb +1000:f242 exported_ordinal_10 WRITE 0 true 1028:07ed Data6 DAT_1028_07ed +1000:f246 exported_ordinal_10 READ 1 true 1028:07f7 Data6 DAT_1028_07f7 +1000:f249 exported_ordinal_10 READ 1 true 1028:07f9 Data6 DAT_1028_07f9 +1000:f24d exported_ordinal_10 WRITE 0 true 1028:07f3 Data6 DAT_1028_07f3 +1000:f250 exported_ordinal_10 WRITE 0 true 1028:07f5 Data6 DAT_1028_07f5 +1000:f254 exported_ordinal_10 READ 1 true 1028:07ff Data6 DAT_1028_07ff +1000:f257 exported_ordinal_10 READ 1 true 1028:0801 Data6 DAT_1028_0801 +1000:f25b exported_ordinal_10 WRITE 0 true 1028:07fb Data6 DAT_1028_07fb +1000:f25e exported_ordinal_10 WRITE 0 true 1028:07fd Data6 DAT_1028_07fd +1000:f262 exported_ordinal_10 READ 1 true 1028:0811 Data6 DAT_1028_0811 +1000:f265 exported_ordinal_10 READ 1 true 1028:0813 Data6 DAT_1028_0813 +1000:f269 exported_ordinal_10 READ 1 true 1028:0815 Data6 DAT_1028_0815 +1000:f26d exported_ordinal_10 WRITE 0 true 1028:080b Data6 DAT_1028_080b +1000:f270 exported_ordinal_10 WRITE 0 true 1028:080d Data6 DAT_1028_080d +1000:f274 exported_ordinal_10 WRITE 0 true 1028:080f Data6 DAT_1028_080f +1000:f278 exported_ordinal_10 READ 1 true 1028:0807 Data6 DAT_1028_0807 +1000:f27b exported_ordinal_10 READ 1 true 1028:0809 Data6 DAT_1028_0809 +1000:f27f exported_ordinal_10 WRITE 0 true 1028:0803 Data6 DAT_1028_0803 +1000:f282 exported_ordinal_10 WRITE 0 true 1028:0805 Data6 DAT_1028_0805 +1000:f28b exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:c36b Code1 FUN_1000_c36b FUN_1000_c36b +1000:f290 exported_ordinal_10 WRITE 0 true 1028:424c Data6 DAT_1028_424c +1000:f295 exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f2f5 Code1 LAB_1000_f2f5 +1000:f297 exported_ordinal_10 READ 0 true 1028:424c Data6 DAT_1028_424c +1000:f29c exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f2f5 Code1 LAB_1000_f2f5 +1000:f29e exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:f2a7 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f2d5 Code1 LAB_1000_f2d5 +1000:f2a9 exported_ordinal_10 READ 1 true 1028:07e7 Data6 DAT_1028_07e7 +1000:f2ac exported_ordinal_10 READ 1 true 1028:07e9 Data6 DAT_1028_07e9 +1000:f2ba exported_ordinal_10 READ 1 true 1028:07ef Data6 DAT_1028_07ef +1000:f2bd exported_ordinal_10 READ 1 true 1028:07f1 Data6 DAT_1028_07f1 +1000:f2ce exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:a38e Code1 FUN_1000_a38e FUN_1000_a38e +1000:f2d3 exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f2de Code1 LAB_1000_f2de +1000:f2d5 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:f2de exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:f2e6 exported_ordinal_10 WRITE 0 true 1028:0874 Data6 DAT_1028_0874 +1000:f2f0 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:c36b Code1 FUN_1000_c36b FUN_1000_c36b +1000:f2f5 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:f2fe exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f30e Code1 LAB_1000_f30e +1000:f306 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f30e Code1 LAB_1000_f30e +1000:f309 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:c79c Code1 FUN_1000_c79c FUN_1000_c79c +1000:f30e exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:f317 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f38f Code1 LAB_1000_f38f +1000:f324 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:c426 Code1 FUN_1000_c426 FUN_1000_c426 +1000:f32e exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:bdde Code1 FUN_1000_bdde FUN_1000_bdde +1000:f334 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:9e85 Code1 FUN_1000_9e85 FUN_1000_9e85 +1000:f339 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:f340 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:f345 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f348 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f355 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1008:08bb Code2 FUN_1008_08bb FUN_1008_08bb +1000:f35a exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f367 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1000:f36c exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:f373 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f376 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:f380 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:c426 Code1 FUN_1000_c426 FUN_1000_c426 +1000:f38a exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:bdde Code1 FUN_1000_bdde FUN_1000_bdde +1000:f38f exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:f398 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f39d Code1 LAB_1000_f39d +1000:f39a exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f4aa Code1 LAB_1000_f4aa +1000:f3a2 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:c426 Code1 FUN_1000_c426 FUN_1000_c426 +1000:f3ac exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:bdde Code1 FUN_1000_bdde FUN_1000_bdde +1000:f3b1 exported_ordinal_10 READ 1 true 1028:3969 Data6 DAT_1028_3969 +1000:f3b4 exported_ordinal_10 READ 1 true 1028:396b Data6 DAT_1028_396b +1000:f3b8 exported_ordinal_10 WRITE 0 true 1028:07d3 Data6 DAT_1028_07d3 +1000:f3bb exported_ordinal_10 WRITE 0 true 1028:07d5 Data6 DAT_1028_07d5 +1000:f3bf exported_ordinal_10 READ 1 true 1028:396d Data6 DAT_1028_396d +1000:f3c2 exported_ordinal_10 READ 1 true 1028:396f Data6 DAT_1028_396f +1000:f3c6 exported_ordinal_10 WRITE 0 true 1028:07d7 Data6 DAT_1028_07d7 +1000:f3c9 exported_ordinal_10 WRITE 0 true 1028:07d9 Data6 DAT_1028_07d9 +1000:f3cd exported_ordinal_10 READ 1 true 1028:07d3 Data6 DAT_1028_07d3 +1000:f3d0 exported_ordinal_10 READ 1 true 1028:07d5 Data6 DAT_1028_07d5 +1000:f3d4 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:f3e1 exported_ordinal_10 READ 1 true 1028:07d7 Data6 DAT_1028_07d7 +1000:f3e4 exported_ordinal_10 READ 1 true 1028:07d9 Data6 DAT_1028_07d9 +1000:f3f5 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:a38e Code1 FUN_1000_a38e FUN_1000_a38e +1000:f3fa exported_ordinal_10 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:f402 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:f411 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:b3f3 Code1 FUN_1000_b3f3 FUN_1000_b3f3 +1000:f416 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:f42d exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1000:f43b exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:0ff7 Code5 FUN_1020_0ff7 FUN_1020_0ff7 +1000:f440 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:1017 Code5 FUN_1020_1017 FUN_1020_1017 +1000:f445 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:f473 exported_ordinal_10 WRITE 0 true 1028:399a Data6 DAT_1028_399a +1000:f47e exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:c426 Code1 FUN_1000_c426 FUN_1000_c426 +1000:f488 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:bdde Code1 FUN_1000_bdde FUN_1000_bdde +1000:f48d exported_ordinal_10 WRITE 0 true 1028:41f9 Data6 DAT_1028_41f9 +1000:f492 exported_ordinal_10 WRITE 0 true 1028:424c Data6 DAT_1028_424c +1000:f497 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:f49f exported_ordinal_10 WRITE 0 true 1028:0874 Data6 DAT_1028_0874 +1000:f4aa exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:fd59 Code1 LAB_1000_fd59 +1000:f4ad exported_ordinal_10 READ 0 true 1028:07c9 Data6 DAT_1028_07c9 +1000:f4b2 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f4b7 Code1 LAB_1000_f4b7 +1000:f4b4 exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:fc04 Code1 LAB_1000_fc04 +1000:f4b7 exported_ordinal_10 READ 1 true 1028:0876 Data6 DAT_1028_0876 +1000:f4ba exported_ordinal_10 READ 1 true 1028:0878 Data6 DAT_1028_0878 +1000:f4c3 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:f4ce exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f525 Code1 LAB_1000_f525 +1000:f4d0 exported_ordinal_10 READ 1 true 1028:0876 Data6 DAT_1028_0876 +1000:f4d3 exported_ordinal_10 READ 1 true 1028:0878 Data6 DAT_1028_0878 +1000:f4dc exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:f4ea exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:f4ef exported_ordinal_10 DATA 0 true Stack[-0x30] - +1000:f4f2 exported_ordinal_10 DATA 1 true Stack[-0x30] - +1000:f4f8 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f50e Code1 LAB_1000_f50e +1000:f4fd exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f50e Code1 LAB_1000_f50e +1000:f4ff exported_ordinal_10 DATA 1 true Stack[-0x30] - +1000:f507 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:b30b Code1 FUN_1000_b30b FUN_1000_b30b +1000:f50c exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f525 Code1 LAB_1000_f525 +1000:f511 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f525 Code1 LAB_1000_f525 +1000:f516 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f525 Code1 LAB_1000_f525 +1000:f518 exported_ordinal_10 DATA 1 true Stack[-0x30] - +1000:f520 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:b3f3 Code1 FUN_1000_b3f3 FUN_1000_b3f3 +1000:f525 exported_ordinal_10 READ 1 true 1028:0876 Data6 DAT_1028_0876 +1000:f528 exported_ordinal_10 READ 1 true 1028:0878 Data6 DAT_1028_0878 +1000:f531 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:f53c exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f541 Code1 LAB_1000_f541 +1000:f53e exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f5c9 Code1 LAB_1000_f5c9 +1000:f541 exported_ordinal_10 READ 1 true 1028:0876 Data6 DAT_1028_0876 +1000:f544 exported_ordinal_10 READ 1 true 1028:0878 Data6 DAT_1028_0878 +1000:f54d exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:f55b exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:f560 exported_ordinal_10 DATA 0 true Stack[-0x30] - +1000:f563 exported_ordinal_10 DATA 1 true Stack[-0x30] - +1000:f569 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f57f Code1 LAB_1000_f57f +1000:f56f exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:b30b Code1 FUN_1000_b30b FUN_1000_b30b +1000:f578 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:b3f3 Code1 FUN_1000_b3f3 FUN_1000_b3f3 +1000:f57d exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f5c9 Code1 LAB_1000_f5c9 +1000:f582 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f5a5 Code1 LAB_1000_f5a5 +1000:f587 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f5a5 Code1 LAB_1000_f5a5 +1000:f589 exported_ordinal_10 DATA 1 true Stack[-0x30] - +1000:f591 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:b30b Code1 FUN_1000_b30b FUN_1000_b30b +1000:f596 exported_ordinal_10 DATA 1 true Stack[-0x30] - +1000:f59e exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:b3f3 Code1 FUN_1000_b3f3 FUN_1000_b3f3 +1000:f5a3 exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f5c9 Code1 LAB_1000_f5c9 +1000:f5a8 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f5c9 Code1 LAB_1000_f5c9 +1000:f5ad exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f5c9 Code1 LAB_1000_f5c9 +1000:f5b2 exported_ordinal_10 DATA 1 true Stack[-0x30] - +1000:f5b7 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:b30b Code1 FUN_1000_b30b FUN_1000_b30b +1000:f5bf exported_ordinal_10 DATA 1 true Stack[-0x30] - +1000:f5c4 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:b3f3 Code1 FUN_1000_b3f3 FUN_1000_b3f3 +1000:f5c9 exported_ordinal_10 READ 1 true 1028:0876 Data6 DAT_1028_0876 +1000:f5cc exported_ordinal_10 READ 1 true 1028:0878 Data6 DAT_1028_0878 +1000:f5d5 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:f5e1 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f5ff Code1 LAB_1000_f5ff +1000:f5e7 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:b30b Code1 FUN_1000_b30b FUN_1000_b30b +1000:f5f0 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:b30b Code1 FUN_1000_b30b FUN_1000_b30b +1000:f5f8 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:b30b Code1 FUN_1000_b30b FUN_1000_b30b +1000:f5fd exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f61e Code1 LAB_1000_f61e +1000:f602 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f61e Code1 LAB_1000_f61e +1000:f608 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:b3f3 Code1 FUN_1000_b3f3 FUN_1000_b3f3 +1000:f611 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:b3f3 Code1 FUN_1000_b3f3 FUN_1000_b3f3 +1000:f619 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:b3f3 Code1 FUN_1000_b3f3 FUN_1000_b3f3 +1000:f61e exported_ordinal_10 READ 1 true 1028:0876 Data6 DAT_1028_0876 +1000:f621 exported_ordinal_10 READ 1 true 1028:0878 Data6 DAT_1028_0878 +1000:f62a exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:f635 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f63a Code1 LAB_1000_f63a +1000:f637 exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f759 Code1 LAB_1000_f759 +1000:f63a exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:f641 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:f646 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f649 exported_ordinal_10 READ 1 true 1028:0876 Data6 DAT_1028_0876 +1000:f64c exported_ordinal_10 READ 1 true 1028:0878 Data6 DAT_1028_0878 +1000:f655 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:f663 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:f668 exported_ordinal_10 DATA 0 true Stack[-0x30] - +1000:f66b exported_ordinal_10 DATA 0 true Stack[-0x30] - +1000:f66f exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f6dd Code1 LAB_1000_f6dd +1000:f671 exported_ordinal_10 DATA 1 true Stack[-0x30] - +1000:f686 exported_ordinal_10 DATA 0 true Stack[-0x4d] - +1000:f689 exported_ordinal_10 DATA 0 true Stack[-0x4b] - +1000:f68c exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f6ad exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1008:0837 Code2 FUN_1008_0837 FUN_1008_0837 +1000:f6b2 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f6b5 exported_ordinal_10 DATA 1 true Stack[-0x4d] - +1000:f6d6 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1000:f6db exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f74a Code1 LAB_1000_f74a +1000:f6dd exported_ordinal_10 DATA 1 true Stack[-0x30] - +1000:f6f5 exported_ordinal_10 DATA 0 true Stack[-0x4d] - +1000:f6f8 exported_ordinal_10 DATA 0 true Stack[-0x4b] - +1000:f6fb exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f71c exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1008:08bb Code2 FUN_1008_08bb FUN_1008_08bb +1000:f721 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f724 exported_ordinal_10 DATA 1 true Stack[-0x4d] - +1000:f745 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1000:f74a exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:f751 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f754 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:f759 exported_ordinal_10 READ 1 true 1028:0876 Data6 DAT_1028_0876 +1000:f75c exported_ordinal_10 READ 1 true 1028:0878 Data6 DAT_1028_0878 +1000:f765 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:f770 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f775 Code1 LAB_1000_f775 +1000:f772 exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f8f4 Code1 LAB_1000_f8f4 +1000:f775 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:f77c exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:f781 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f784 exported_ordinal_10 READ 1 true 1028:0876 Data6 DAT_1028_0876 +1000:f787 exported_ordinal_10 READ 1 true 1028:0878 Data6 DAT_1028_0878 +1000:f790 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:f79e exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:f7a3 exported_ordinal_10 DATA 0 true Stack[-0x30] - +1000:f7a6 exported_ordinal_10 DATA 1 true Stack[-0x30] - +1000:f7ac exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f7f9 Code1 LAB_1000_f7f9 +1000:f7ae exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f7bb exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1008:0837 Code2 FUN_1008_0837 FUN_1008_0837 +1000:f7c0 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f7cd exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1000:f7d2 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f7df exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1008:08bb Code2 FUN_1008_08bb FUN_1008_08bb +1000:f7e4 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f7f1 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1000:f7f6 exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f8e5 Code1 LAB_1000_f8e5 +1000:f7fc exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f849 Code1 LAB_1000_f849 +1000:f7fe exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f80b exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1008:0837 Code2 FUN_1008_0837 FUN_1008_0837 +1000:f810 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f81d exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1000:f822 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f82f exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1008:08bb Code2 FUN_1008_08bb FUN_1008_08bb +1000:f834 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f841 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1000:f846 exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f8e5 Code1 LAB_1000_f8e5 +1000:f84c exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f898 Code1 LAB_1000_f898 +1000:f84e exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f85b exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1008:0837 Code2 FUN_1008_0837 FUN_1008_0837 +1000:f860 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f86d exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1000:f872 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f87f exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1008:08bb Code2 FUN_1008_08bb FUN_1008_08bb +1000:f884 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f891 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1000:f896 exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f8e5 Code1 LAB_1000_f8e5 +1000:f89b exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f8e5 Code1 LAB_1000_f8e5 +1000:f89d exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f8aa exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1008:0837 Code2 FUN_1008_0837 FUN_1008_0837 +1000:f8af exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f8bc exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1000:f8c1 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f8ce exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1008:08bb Code2 FUN_1008_08bb FUN_1008_08bb +1000:f8d3 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f8e0 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1000:f8e5 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:f8ec exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f8ef exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:f8f4 exported_ordinal_10 READ 1 true 1028:0876 Data6 DAT_1028_0876 +1000:f8f7 exported_ordinal_10 READ 1 true 1028:0878 Data6 DAT_1028_0878 +1000:f900 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:f90b exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f96f Code1 LAB_1000_f96f +1000:f90d exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:f914 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:f919 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f91c exported_ordinal_10 READ 1 true 1028:0876 Data6 DAT_1028_0876 +1000:f91f exported_ordinal_10 READ 1 true 1028:0878 Data6 DAT_1028_0878 +1000:f928 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:f936 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:f93b exported_ordinal_10 DATA 0 true Stack[-0x30] - +1000:f93e exported_ordinal_10 DATA 0 true Stack[-0x30] - +1000:f942 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f951 Code1 LAB_1000_f951 +1000:f944 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f947 exported_ordinal_10 DATA 0 true Stack[-0x30] - +1000:f94a exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1008:0dbd Code2 FUN_1008_0dbd FUN_1008_0dbd +1000:f94f exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:f960 Code1 LAB_1000_f960 +1000:f951 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f957 exported_ordinal_10 DATA 1 true Stack[-0x30] - +1000:f95b exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1008:0dbd Code2 FUN_1008_0dbd FUN_1008_0dbd +1000:f960 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:f967 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f96a exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:f96f exported_ordinal_10 READ 1 true 1028:0876 Data6 DAT_1028_0876 +1000:f972 exported_ordinal_10 READ 1 true 1028:0878 Data6 DAT_1028_0878 +1000:f97b exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:f986 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:f98b Code1 LAB_1000_f98b +1000:f988 exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:fc04 Code1 LAB_1000_fc04 +1000:f98b exported_ordinal_10 READ_WRITE 0 true 1028:087a Data6 DAT_1028_087a +1000:f990 exported_ordinal_10 READ_WRITE 0 true 1028:087c Data6 DAT_1028_087c +1000:f995 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:f99c exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:f9a1 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f9a4 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f9a7 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1000:f9ac exported_ordinal_10 DATA 0 true Stack[-0x10] - +1000:f9af exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f9b2 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1000:f9b7 exported_ordinal_10 DATA 0 true Stack[-0x12] - +1000:f9ba exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:f9c2 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0158 EXTERNAL CREATECOMPATIBLEBITMAP CREATECOMPATIBLEBITMAP +1000:f9c7 exported_ordinal_10 DATA 0 true Stack[-0xa] - +1000:f9ca exported_ordinal_10 DATA 0 true Stack[-0x10] - +1000:f9cd exported_ordinal_10 READ 0 true 1028:085f Data6 DAT_1028_085f +1000:f9d1 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:f9d6 exported_ordinal_10 DATA 0 true Stack[-0x4] - +1000:f9d9 exported_ordinal_10 DATA 0 true Stack[-0x12] - +1000:f9dc exported_ordinal_10 DATA 0 true Stack[-0xa] - +1000:f9df exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:f9e4 exported_ordinal_10 DATA 0 true Stack[-0x6] - +1000:f9e7 exported_ordinal_10 DATA 0 true Stack[-0x12] - +1000:f9f2 exported_ordinal_10 DATA 0 true Stack[-0x10] - +1000:fa00 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:fa05 exported_ordinal_10 DATA 0 true Stack[-0x12] - +1000:fa11 exported_ordinal_10 DATA 0 true Stack[-0x10] - +1000:fa1f exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:fa24 exported_ordinal_10 DATA 0 true Stack[-0x10] - +1000:fa27 exported_ordinal_10 READ 0 true 1028:0861 Data6 DAT_1028_0861 +1000:fa2b exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:fa30 exported_ordinal_10 READ 1 true 1028:087a Data6 DAT_1028_087a +1000:fa33 exported_ordinal_10 READ 1 true 1028:087c Data6 DAT_1028_087c +1000:fa3c exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:fa48 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:fa51 Code1 LAB_1000_fa51 +1000:fa4a exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:fabd Code1 LAB_1000_fabd +1000:fa4f exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:fabd Code1 LAB_1000_fabd +1000:fa51 exported_ordinal_10 READ 1 true 1028:087a Data6 DAT_1028_087a +1000:fa54 exported_ordinal_10 READ 1 true 1028:087c Data6 DAT_1028_087c +1000:fa5d exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:fa69 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:fa72 Code1 LAB_1000_fa72 +1000:fa6b exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:fabd Code1 LAB_1000_fabd +1000:fa70 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:fabd Code1 LAB_1000_fabd +1000:fa72 exported_ordinal_10 DATA 0 true Stack[-0x12] - +1000:fa7e exported_ordinal_10 DATA 0 true Stack[-0x10] - +1000:fa81 exported_ordinal_10 READ 1 true 1028:087a Data6 DAT_1028_087a +1000:fa84 exported_ordinal_10 READ 1 true 1028:087c Data6 DAT_1028_087c +1000:fa8d exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:faa1 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:fab5 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:faba exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:fba8 Code1 LAB_1000_fba8 +1000:fabd exported_ordinal_10 DATA 0 true Stack[-0x12] - +1000:fac4 exported_ordinal_10 READ 1 true 1028:087a Data6 DAT_1028_087a +1000:fac7 exported_ordinal_10 READ 1 true 1028:087c Data6 DAT_1028_087c +1000:fad0 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:fae4 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:faf9 exported_ordinal_10 DATA 0 true Stack[-0x10] - +1000:fafc exported_ordinal_10 READ 1 true 1028:087a Data6 DAT_1028_087a +1000:faff exported_ordinal_10 READ 1 true 1028:087c Data6 DAT_1028_087c +1000:fb08 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:fb1c exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:fb30 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:fb35 exported_ordinal_10 DATA 0 true Stack[-0x12] - +1000:fb38 exported_ordinal_10 READ 1 true 1028:087a Data6 DAT_1028_087a +1000:fb3b exported_ordinal_10 READ 1 true 1028:087c Data6 DAT_1028_087c +1000:fb44 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:fb58 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:fb6d exported_ordinal_10 READ 1 true 1028:087a Data6 DAT_1028_087a +1000:fb70 exported_ordinal_10 READ 1 true 1028:087c Data6 DAT_1028_087c +1000:fb79 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1000:fb8d exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1000:fb95 exported_ordinal_10 DATA 0 true Stack[-0x10] - +1000:fba3 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:fba8 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:fbb6 exported_ordinal_10 DATA 0 true Stack[-0x12] - +1000:fbc2 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1000:fbc7 exported_ordinal_10 DATA 0 true Stack[-0x10] - +1000:fbca exported_ordinal_10 DATA 0 true Stack[-0x4] - +1000:fbcd exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:fbd2 exported_ordinal_10 DATA 0 true Stack[-0x12] - +1000:fbd5 exported_ordinal_10 DATA 0 true Stack[-0x6] - +1000:fbd8 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1000:fbdd exported_ordinal_10 DATA 0 true Stack[-0xa] - +1000:fbe0 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0168 EXTERNAL DELETEOBJECT DELETEOBJECT +1000:fbe5 exported_ordinal_10 DATA 0 true Stack[-0x10] - +1000:fbe8 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1000:fbed exported_ordinal_10 DATA 0 true Stack[-0x12] - +1000:fbf0 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1000:fbf5 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:fbfc exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:fbff exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:fc04 exported_ordinal_10 READ 0 true 1028:07c8 Data6 DAT_1028_07c8 +1000:fc09 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:fc0e Code1 LAB_1000_fc0e +1000:fc0b exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:fce7 Code1 LAB_1000_fce7 +1000:fc0e exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:fc17 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:fc1c Code1 LAB_1000_fc1c +1000:fc19 exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:fce7 Code1 LAB_1000_fce7 +1000:fc22 exported_ordinal_10 READ 0 true 1028:0853 Data6 DAT_1028_0853 +1000:fc27 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:fc33 Code1 LAB_1000_fc33 +1000:fc29 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:fc6e Code1 LAB_1000_fc6e +1000:fc2b exported_ordinal_10 READ 0 true 1028:0851 Data6 DAT_1028_0851 +1000:fc31 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:fc6e Code1 LAB_1000_fc6e +1000:fc33 exported_ordinal_10 READ 0 true 1028:0853 Data6 DAT_1028_0853 +1000:fc38 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:fc5c Code1 LAB_1000_fc5c +1000:fc3a exported_ordinal_10 READ 0 true 1028:0851 Data6 DAT_1028_0851 +1000:fc3f exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:fc5c Code1 LAB_1000_fc5c +1000:fc41 exported_ordinal_10 DATA 0 true Stack[-0x30] - +1000:fc46 exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:fc4b Code1 LAB_1000_fc4b +1000:fc48 exported_ordinal_10 DATA 0 true Stack[-0x30] - +1000:fc4b exported_ordinal_10 DATA 1 true Stack[-0x30] - +1000:fc51 exported_ordinal_10 WRITE 0 true 1028:3371 Data6 DAT_1028_3371 +1000:fc51 exported_ordinal_10 WRITE 0 false 1028:33c4 Data6 DAT_1028_33c4 +1000:fc55 exported_ordinal_10 DATA 0 true Stack[-0x30] - +1000:fc5a exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:fc48 Code1 LAB_1000_fc48 +1000:fc5c exported_ordinal_10 READ_WRITE 0 true 1028:0851 Data6 DAT_1028_0851 +1000:fc61 exported_ordinal_10 READ_WRITE 0 true 1028:0853 Data6 DAT_1028_0853 +1000:fc67 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:7440 Code1 FUN_1000_7440 FUN_1000_7440 +1000:fc6c exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:fce7 Code1 LAB_1000_fce7 +1000:fc6e exported_ordinal_10 WRITE 0 true 1028:07c8 Data6 DAT_1028_07c8 +1000:fc73 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:fc7e exported_ordinal_10 WRITE 0 true 1028:0851 Data6 DAT_1028_0851 +1000:fc81 exported_ordinal_10 WRITE 0 true 1028:0853 Data6 DAT_1028_0853 +1000:fc88 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:fc8d exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:fc90 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:fc9b exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1008:08bb Code2 FUN_1008_08bb FUN_1008_08bb +1000:fca0 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:fcab exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1000:fcb0 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:fcb7 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:fcba exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:fcbf exported_ordinal_10 DATA 0 true Stack[-0x30] - +1000:fcc4 exported_ordinal_10 UNCONDITIONAL_JUMP 0 true 1000:fcc9 Code1 LAB_1000_fcc9 +1000:fcc6 exported_ordinal_10 DATA 0 true Stack[-0x30] - +1000:fcc9 exported_ordinal_10 DATA 1 true Stack[-0x30] - +1000:fccc exported_ordinal_10 READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1000:fcd4 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:fce1 exported_ordinal_10 DATA 0 true Stack[-0x30] - +1000:fce5 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:fcc6 Code1 LAB_1000_fcc6 +1000:fce7 exported_ordinal_10 READ 1 true 1028:07d0 Data6 DAT_1028_07d0 +1000:fcf5 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:fd59 Code1 LAB_1000_fd59 +1000:fcf8 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:a72c Code1 FUN_1000_a72c FUN_1000_a72c +1000:fcfe exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:acc2 Code1 FUN_1000_acc2 FUN_1000_acc2 +1000:fd04 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:a604 Code1 FUN_1000_a604 FUN_1000_a604 +1000:fd0a exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:9e85 Code1 FUN_1000_9e85 FUN_1000_9e85 +1000:fd0f exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:fd16 exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1000:fd1b exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:fd1e exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:fd2b exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1008:08bb Code2 FUN_1008_08bb FUN_1008_08bb +1000:fd30 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:fd3d exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1000:fd42 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:fd49 exported_ordinal_10 DATA 0 true Stack[-0xe] - +1000:fd4c exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1000:fd53 exported_ordinal_10 WRITE 0 true 1028:0876 Data6 DAT_1028_0876 +1000:fd56 exported_ordinal_10 WRITE 0 true 1028:0878 Data6 DAT_1028_0878 +1000:fd5a exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1000:99f0 Code1 FUN_1000_99f0 FUN_1000_99f0 +1000:fd5f exported_ordinal_10 UNCONDITIONAL_CALL 0 true 1008:00e2 Code2 FUN_1008_00e2 FUN_1008_00e2 +1000:fd64 exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:fd71 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:fd81 Code1 LAB_1000_fd81 +1000:fd73 exported_ordinal_10 READ 0 true 1028:07c6 Data6 DAT_1028_07c6 +1000:fd78 exported_ordinal_10 CONDITIONAL_JUMP 0 true 1000:fd7a Code1 LAB_1000_fd7a +1000:fd7a exported_ordinal_10 DATA 1 true Stack[0x4] - +1000:fd85 ne_program_entry UNCONDITIONAL_CALL 0 true 1228:005c EXTERNAL INITTASK INITTASK +1000:fd8a ne_program_entry UNCONDITIONAL_CALL 0 true 1020:0002 Code5 FUN_1020_0002 FUN_1020_0002 +1000:fd8f ne_program_entry UNCONDITIONAL_CALL 0 true 1008:298a Code2 FUN_1008_298a FUN_1008_298a +1000:fd94 ne_program_entry UNCONDITIONAL_CALL 0 true 1008:2554 Code2 FUN_1008_2554 FUN_1008_2554 +1000:fd99 ne_program_entry UNCONDITIONAL_CALL 0 true 1010:0472 Code3 FUN_1010_0472 FUN_1010_0472 +1000:fd9e ne_program_entry UNCONDITIONAL_CALL 0 true 1008:15c2 Code2 FUN_1008_15c2 FUN_1008_15c2 +1000:fda3 ne_program_entry UNCONDITIONAL_CALL 0 true 1008:11b8 Code2 FUN_1008_11b8 FUN_1008_11b8 +1000:fda8 ne_program_entry UNCONDITIONAL_CALL 0 true 1008:0f27 Code2 FUN_1008_0f27 FUN_1008_0f27 +1000:fdb0 ne_program_entry UNCONDITIONAL_CALL 0 true 1228:0000 EXTERNAL GETVERSION GETVERSION +1000:fdb5 ne_program_entry WRITE 0 true 1028:07bf Data6 DAT_1028_07bf +1000:fdb8 ne_program_entry WRITE 0 true 1028:07c1 Data6 DAT_1028_07c1 +1000:fdbc ne_program_entry READ 0 true 1028:07c1 Data6 DAT_1028_07c1 +1000:fdc0 ne_program_entry READ 0 true 1028:07bf Data6 DAT_1028_07bf +1000:fdcc ne_program_entry CONDITIONAL_JUMP 0 true 1000:fdf4 Code1 LAB_1000_fdf4 +1000:fdce ne_program_entry READ 0 true 1028:07c1 Data6 DAT_1028_07c1 +1000:fdd2 ne_program_entry READ 0 true 1028:07bf Data6 DAT_1028_07bf +1000:fdde ne_program_entry CONDITIONAL_JUMP 0 true 1000:fe08 Code1 LAB_1000_fe08 +1000:fde0 ne_program_entry READ 0 true 1028:07c1 Data6 DAT_1028_07c1 +1000:fde4 ne_program_entry READ 0 true 1028:07bf Data6 DAT_1028_07bf +1000:fdf2 ne_program_entry CONDITIONAL_JUMP 0 true 1000:fe08 Code1 LAB_1000_fe08 +1000:fe02 ne_program_entry READ 0 true 1028:0668 Data6 DAT_1028_0668 +1000:fe02 ne_program_entry READ 0 false 1028:0666 Data6 DAT_1028_0666 +1000:fe02 ne_program_entry COMPUTED_CALL -1 true 1228:018c EXTERNAL MESSAGEBOX MESSAGEBOX +1000:fe06 ne_program_entry UNCONDITIONAL_JUMP 0 true 1000:fe32 Code1 LAB_1000_fe32 +1000:fe16 ne_program_entry UNCONDITIONAL_CALL 0 true 1018:1a61 Code4 FUN_1018_1a61 FUN_1018_1a61 +1000:fe20 ne_program_entry READ 1 true 1028:0748 Data6 DAT_1028_0748 +1000:fe2d ne_program_entry READ 1 true 1028:0748 Data6 DAT_1028_0748 +1000:fe35 ne_program_entry UNCONDITIONAL_CALL 0 true 1020:0061 Code5 FUN_1020_0061 FUN_1020_0061 +1008:0006 FUN_1008_0002 READ 0 true 1028:07c6 Data6 DAT_1028_07c6 +1008:000b FUN_1008_0002 CONDITIONAL_JUMP 0 true 1008:001f Code2 LAB_1008_001f +1008:000d FUN_1008_0002 READ 0 true 1028:43f2 Data6 DAT_1028_43f2 +1008:0012 FUN_1008_0002 CONDITIONAL_JUMP 0 true 1008:001f Code2 LAB_1008_001f +1008:0014 FUN_1008_0002 DATA 0 true Stack[0x4] - +1008:0017 FUN_1008_0002 UNCONDITIONAL_CALL 0 true 1008:1131 Code2 FUN_1008_1131 FUN_1008_1131 +1008:001c FUN_1008_0002 DATA 0 true Stack[-0x4] - +1008:002a FUN_1008_0023 UNCONDITIONAL_CALL 0 true 1020:012d Code5 FUN_1020_012d FUN_1020_012d +1008:002f FUN_1008_0023 DATA 0 true Stack[-0x6] - +1008:0032 FUN_1008_0023 DATA 0 true Stack[-0x4] - +1008:0035 FUN_1008_0023 DATA 1 true Stack[-0x6] - +1008:0038 FUN_1008_0023 DATA 1 true Stack[-0x4] - +1008:003b FUN_1008_0023 CONDITIONAL_JUMP 0 true 1008:0040 Code2 LAB_1008_0040 +1008:003d FUN_1008_0023 UNCONDITIONAL_JUMP 0 true 1008:00de Code2 LAB_1008_00de +1008:0040 FUN_1008_0023 DATA 1 true Stack[-0x6] - +1008:0043 FUN_1008_0023 DATA 0 true Stack[-0x10] - +1008:0046 FUN_1008_0023 DATA 0 true Stack[-0xe] - +1008:0056 FUN_1008_0023 DATA 0 true Stack[-0x8] - +1008:0059 FUN_1008_0023 UNCONDITIONAL_JUMP 0 true 1008:005e Code2 LAB_1008_005e +1008:005b FUN_1008_0023 DATA 0 true Stack[-0x8] - +1008:005e FUN_1008_0023 DATA 1 true Stack[-0x8] - +1008:0064 FUN_1008_0023 DATA 1 true Stack[-0x10] - +1008:0080 FUN_1008_0023 DATA 0 true Stack[-0x8] - +1008:0085 FUN_1008_0023 CONDITIONAL_JUMP 0 true 1008:005b Code2 LAB_1008_005b +1008:0087 FUN_1008_0023 DATA 0 true Stack[0x4] - +1008:008a FUN_1008_0023 UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1008:008f FUN_1008_0023 DATA 0 true Stack[-0xa] - +1008:0092 FUN_1008_0023 DATA 0 true Stack[-0xa] - +1008:0095 FUN_1008_0023 DATA 1 true Stack[-0x6] - +1008:009a FUN_1008_0023 UNCONDITIONAL_CALL 0 true 1228:0180 EXTERNAL CREATEPALETTE CREATEPALETTE +1008:00a2 FUN_1008_0023 UNCONDITIONAL_CALL 0 true 1228:029c EXTERNAL SELECTPALETTE SELECTPALETTE +1008:00a7 FUN_1008_0023 DATA 0 true Stack[-0xc] - +1008:00aa FUN_1008_0023 DATA 0 true Stack[-0xa] - +1008:00ad FUN_1008_0023 UNCONDITIONAL_CALL 0 true 1228:02a0 EXTERNAL REALIZEPALETTE REALIZEPALETTE +1008:00b2 FUN_1008_0023 DATA 0 true Stack[-0xa] - +1008:00b5 FUN_1008_0023 DATA 0 true Stack[-0xc] - +1008:00ba FUN_1008_0023 UNCONDITIONAL_CALL 0 true 1228:029c EXTERNAL SELECTPALETTE SELECTPALETTE +1008:00c0 FUN_1008_0023 UNCONDITIONAL_CALL 0 true 1228:0168 EXTERNAL DELETEOBJECT DELETEOBJECT +1008:00c5 FUN_1008_0023 DATA 0 true Stack[0x4] - +1008:00c8 FUN_1008_0023 DATA 0 true Stack[-0xa] - +1008:00cb FUN_1008_0023 UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1008:00d0 FUN_1008_0023 DATA 0 true Stack[-0x4] - +1008:00d3 FUN_1008_0023 DATA 0 true Stack[-0x6] - +1008:00d9 FUN_1008_0023 UNCONDITIONAL_CALL 0 true 1020:0147 Code5 FUN_1020_0147 FUN_1020_0147 +1008:00e6 FUN_1008_00e2 DATA 0 true Stack[-0x14] - +1008:00f3 FUN_1008_00e2 UNCONDITIONAL_CALL 0 true 1228:0234 EXTERNAL PEEKMESSAGE PEEKMESSAGE +1008:00fe FUN_1008_00e2 DATA 0 true Stack[-0x15] - +1008:0101 FUN_1008_00e2 DATA 0 true Stack[-0x15] - +1008:0105 FUN_1008_00e2 CONDITIONAL_JUMP 0 true 1008:0130 Code2 LAB_1008_0130 +1008:0107 FUN_1008_00e2 DATA 0 true Stack[-0x12] - +1008:010c FUN_1008_00e2 CONDITIONAL_JUMP 0 true 1008:0130 Code2 LAB_1008_0130 +1008:010e FUN_1008_00e2 DATA 0 true Stack[-0x12] - +1008:0113 FUN_1008_00e2 CONDITIONAL_JUMP 0 true 1008:0130 Code2 LAB_1008_0130 +1008:0115 FUN_1008_00e2 DATA 0 true Stack[-0x12] - +1008:011a FUN_1008_00e2 CONDITIONAL_JUMP 0 true 1008:0130 Code2 LAB_1008_0130 +1008:011c FUN_1008_00e2 DATA 0 true Stack[-0x14] - +1008:0121 FUN_1008_00e2 UNCONDITIONAL_CALL 0 true 1228:0240 EXTERNAL TRANSLATEMESSAGE TRANSLATEMESSAGE +1008:0126 FUN_1008_00e2 DATA 0 true Stack[-0x14] - +1008:012b FUN_1008_00e2 UNCONDITIONAL_CALL 0 true 1228:0244 EXTERNAL DISPATCHMESSAGE DISPATCHMESSAGE +1008:0130 FUN_1008_00e2 DATA 0 true Stack[-0x15] - +1008:0134 FUN_1008_00e2 CONDITIONAL_JUMP 0 true 1008:00e6 Code2 LAB_1008_00e6 +1008:013c FUN_1008_0138 DATA 0 true Stack[0x52] - +1008:0141 FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:0146 Code2 LAB_1008_0146 +1008:0143 FUN_1008_0138 UNCONDITIONAL_JUMP 0 true 1008:0783 Code2 LAB_1008_0783 +1008:0146 FUN_1008_0138 DATA 1 true Stack[0x52] - +1008:0150 FUN_1008_0138 DATA 0 true Stack[-0xe] - +1008:0153 FUN_1008_0138 DATA 0 true Stack[-0xc] - +1008:0156 FUN_1008_0138 DATA 1 true Stack[0x4e] - +1008:015c FUN_1008_0138 DATA 1 true Stack[0x36] - +1008:015f FUN_1008_0138 DATA 1 true Stack[0x38] - +1008:0162 FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:016a Code2 LAB_1008_016a +1008:0164 FUN_1008_0138 DATA 0 true Stack[0x4e] - +1008:0168 FUN_1008_0138 UNCONDITIONAL_JUMP 0 true 1008:016e Code2 LAB_1008_016e +1008:016a FUN_1008_0138 DATA 0 true Stack[0x4e] - +1008:016e FUN_1008_0138 DATA 0 true Stack[0x4a] - +1008:0172 FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:01c0 Code2 LAB_1008_01c0 +1008:0174 FUN_1008_0138 READ 1 true 1028:0849 Data6 DAT_1028_0849 +1008:0177 FUN_1008_0138 READ 1 true 1028:084b Data6 DAT_1028_084b +1008:017b FUN_1008_0138 DATA 1 true Stack[0x46] - +1008:017e FUN_1008_0138 DATA 1 true Stack[0x48] - +1008:0181 FUN_1008_0138 DATA 0 true Stack[0x46] - +1008:0184 FUN_1008_0138 DATA 0 true Stack[0x48] - +1008:0187 FUN_1008_0138 READ 1 true 1028:084d Data6 DAT_1028_084d +1008:018a FUN_1008_0138 READ 1 true 1028:084f Data6 DAT_1028_084f +1008:018e FUN_1008_0138 DATA 1 true Stack[0x42] - +1008:0191 FUN_1008_0138 DATA 1 true Stack[0x44] - +1008:0194 FUN_1008_0138 DATA 0 true Stack[0x42] - +1008:0197 FUN_1008_0138 DATA 0 true Stack[0x44] - +1008:019a FUN_1008_0138 DATA 1 true Stack[0x46] - +1008:019d FUN_1008_0138 DATA 1 true Stack[0x48] - +1008:01a0 FUN_1008_0138 DATA 1 true Stack[0x3e] - +1008:01a3 FUN_1008_0138 DATA 1 true Stack[0x40] - +1008:01a6 FUN_1008_0138 DATA 0 true Stack[-0x6] - +1008:01a9 FUN_1008_0138 DATA 0 true Stack[-0x4] - +1008:01ac FUN_1008_0138 DATA 1 true Stack[0x42] - +1008:01af FUN_1008_0138 DATA 1 true Stack[0x44] - +1008:01b2 FUN_1008_0138 DATA 1 true Stack[0x3a] - +1008:01b5 FUN_1008_0138 DATA 1 true Stack[0x3c] - +1008:01b8 FUN_1008_0138 DATA 0 true Stack[-0xa] - +1008:01bb FUN_1008_0138 DATA 0 true Stack[-0x8] - +1008:01be FUN_1008_0138 UNCONDITIONAL_JUMP 0 true 1008:0208 Code2 LAB_1008_0208 +1008:01c0 FUN_1008_0138 DATA 1 true Stack[0x46] - +1008:01c3 FUN_1008_0138 DATA 1 true Stack[0x48] - +1008:01cc FUN_1008_0138 DATA 0 true Stack[0x46] - +1008:01cf FUN_1008_0138 DATA 0 true Stack[0x48] - +1008:01d2 FUN_1008_0138 DATA 1 true Stack[0x42] - +1008:01d5 FUN_1008_0138 DATA 1 true Stack[0x44] - +1008:01de FUN_1008_0138 DATA 0 true Stack[0x42] - +1008:01e1 FUN_1008_0138 DATA 0 true Stack[0x44] - +1008:01e4 FUN_1008_0138 DATA 1 true Stack[0x3e] - +1008:01e7 FUN_1008_0138 DATA 1 true Stack[0x40] - +1008:01f0 FUN_1008_0138 DATA 0 true Stack[-0x6] - +1008:01f3 FUN_1008_0138 DATA 0 true Stack[-0x4] - +1008:01f6 FUN_1008_0138 DATA 1 true Stack[0x3a] - +1008:01f9 FUN_1008_0138 DATA 1 true Stack[0x3c] - +1008:0202 FUN_1008_0138 DATA 0 true Stack[-0xa] - +1008:0205 FUN_1008_0138 DATA 0 true Stack[-0x8] - +1008:0208 FUN_1008_0138 DATA 0 true Stack[-0x4] - +1008:020c FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:0216 Code2 LAB_1008_0216 +1008:020e FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:0261 Code2 LAB_1008_0261 +1008:0210 FUN_1008_0138 DATA 0 true Stack[-0x6] - +1008:0214 FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:0261 Code2 LAB_1008_0261 +1008:0216 FUN_1008_0138 DATA 1 true Stack[-0x6] - +1008:0219 FUN_1008_0138 DATA 1 true Stack[-0x4] - +1008:021c FUN_1008_0138 DATA 1 true Stack[0x48] - +1008:021f FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:0228 Code2 LAB_1008_0228 +1008:0221 FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:0261 Code2 LAB_1008_0261 +1008:0223 FUN_1008_0138 DATA 1 true Stack[0x46] - +1008:0226 FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:0261 Code2 LAB_1008_0261 +1008:0228 FUN_1008_0138 DATA 1 true Stack[0x46] - +1008:022b FUN_1008_0138 DATA 1 true Stack[0x48] - +1008:0233 FUN_1008_0138 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1008:0238 FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:0243 FUN_1008_0138 DATA 1 true Stack[-0x6] - +1008:0246 FUN_1008_0138 DATA 1 true Stack[-0x4] - +1008:024e FUN_1008_0138 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1008:0253 FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:025e FUN_1008_0138 UNCONDITIONAL_JUMP 0 true 1008:02fb Code2 LAB_1008_02fb +1008:0261 FUN_1008_0138 DATA 0 true Stack[-0x4] - +1008:0265 FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:026f Code2 LAB_1008_026f +1008:0267 FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:02b9 Code2 LAB_1008_02b9 +1008:0269 FUN_1008_0138 DATA 0 true Stack[-0x6] - +1008:026d FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:02b9 Code2 LAB_1008_02b9 +1008:026f FUN_1008_0138 DATA 1 true Stack[-0x6] - +1008:0272 FUN_1008_0138 DATA 1 true Stack[-0x4] - +1008:0275 FUN_1008_0138 DATA 1 true Stack[0x48] - +1008:0278 FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:0281 Code2 LAB_1008_0281 +1008:027a FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:02b9 Code2 LAB_1008_02b9 +1008:027c FUN_1008_0138 DATA 1 true Stack[0x46] - +1008:027f FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:02b9 Code2 LAB_1008_02b9 +1008:0281 FUN_1008_0138 DATA 1 true Stack[-0x6] - +1008:0284 FUN_1008_0138 DATA 1 true Stack[-0x4] - +1008:028c FUN_1008_0138 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1008:0291 FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:029c FUN_1008_0138 DATA 1 true Stack[0x46] - +1008:029f FUN_1008_0138 DATA 1 true Stack[0x48] - +1008:02a7 FUN_1008_0138 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1008:02ac FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:02b7 FUN_1008_0138 UNCONDITIONAL_JUMP 0 true 1008:02fb Code2 LAB_1008_02fb +1008:02b9 FUN_1008_0138 DATA 1 true Stack[0x46] - +1008:02bc FUN_1008_0138 DATA 1 true Stack[0x48] - +1008:02bf FUN_1008_0138 DATA 1 true Stack[0x36] - +1008:02c2 FUN_1008_0138 DATA 1 true Stack[0x38] - +1008:02ca FUN_1008_0138 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1008:02cf FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:02da FUN_1008_0138 DATA 1 true Stack[0x46] - +1008:02dd FUN_1008_0138 DATA 1 true Stack[0x48] - +1008:02e0 FUN_1008_0138 DATA 1 true Stack[0x36] - +1008:02e3 FUN_1008_0138 DATA 1 true Stack[0x38] - +1008:02eb FUN_1008_0138 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1008:02f0 FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:02fb FUN_1008_0138 DATA 0 true Stack[-0x8] - +1008:02ff FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:0309 Code2 LAB_1008_0309 +1008:0301 FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:0354 Code2 LAB_1008_0354 +1008:0303 FUN_1008_0138 DATA 0 true Stack[-0xa] - +1008:0307 FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:0354 Code2 LAB_1008_0354 +1008:0309 FUN_1008_0138 DATA 1 true Stack[-0xa] - +1008:030c FUN_1008_0138 DATA 1 true Stack[-0x8] - +1008:030f FUN_1008_0138 DATA 1 true Stack[0x44] - +1008:0312 FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:031b Code2 LAB_1008_031b +1008:0314 FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:0354 Code2 LAB_1008_0354 +1008:0316 FUN_1008_0138 DATA 1 true Stack[0x42] - +1008:0319 FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:0354 Code2 LAB_1008_0354 +1008:031b FUN_1008_0138 DATA 1 true Stack[0x42] - +1008:031e FUN_1008_0138 DATA 1 true Stack[0x44] - +1008:0326 FUN_1008_0138 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1008:032b FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:0336 FUN_1008_0138 DATA 1 true Stack[-0xa] - +1008:0339 FUN_1008_0138 DATA 1 true Stack[-0x8] - +1008:0341 FUN_1008_0138 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1008:0346 FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:0351 FUN_1008_0138 UNCONDITIONAL_JUMP 0 true 1008:03ee Code2 LAB_1008_03ee +1008:0354 FUN_1008_0138 DATA 0 true Stack[-0x8] - +1008:0358 FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:0362 Code2 LAB_1008_0362 +1008:035a FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:03ac Code2 LAB_1008_03ac +1008:035c FUN_1008_0138 DATA 0 true Stack[-0xa] - +1008:0360 FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:03ac Code2 LAB_1008_03ac +1008:0362 FUN_1008_0138 DATA 1 true Stack[-0xa] - +1008:0365 FUN_1008_0138 DATA 1 true Stack[-0x8] - +1008:0368 FUN_1008_0138 DATA 1 true Stack[0x44] - +1008:036b FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:0374 Code2 LAB_1008_0374 +1008:036d FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:03ac Code2 LAB_1008_03ac +1008:036f FUN_1008_0138 DATA 1 true Stack[0x42] - +1008:0372 FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:03ac Code2 LAB_1008_03ac +1008:0374 FUN_1008_0138 DATA 1 true Stack[-0xa] - +1008:0377 FUN_1008_0138 DATA 1 true Stack[-0x8] - +1008:037f FUN_1008_0138 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1008:0384 FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:038f FUN_1008_0138 DATA 1 true Stack[0x42] - +1008:0392 FUN_1008_0138 DATA 1 true Stack[0x44] - +1008:039a FUN_1008_0138 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1008:039f FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:03aa FUN_1008_0138 UNCONDITIONAL_JUMP 0 true 1008:03ee Code2 LAB_1008_03ee +1008:03ac FUN_1008_0138 DATA 1 true Stack[0x42] - +1008:03af FUN_1008_0138 DATA 1 true Stack[0x44] - +1008:03b2 FUN_1008_0138 DATA 1 true Stack[0x36] - +1008:03b5 FUN_1008_0138 DATA 1 true Stack[0x38] - +1008:03bd FUN_1008_0138 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1008:03c2 FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:03cd FUN_1008_0138 DATA 1 true Stack[0x42] - +1008:03d0 FUN_1008_0138 DATA 1 true Stack[0x44] - +1008:03d3 FUN_1008_0138 DATA 1 true Stack[0x36] - +1008:03d6 FUN_1008_0138 DATA 1 true Stack[0x38] - +1008:03de FUN_1008_0138 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1008:03e3 FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:03ee FUN_1008_0138 DATA 1 true Stack[0x4e] - +1008:03f3 FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:03f8 Code2 LAB_1008_03f8 +1008:03f5 FUN_1008_0138 UNCONDITIONAL_JUMP 0 true 1008:05dc Code2 LAB_1008_05dc +1008:03f8 FUN_1008_0138 DATA 1 true Stack[0x46] - +1008:03fb FUN_1008_0138 DATA 1 true Stack[0x48] - +1008:0403 FUN_1008_0138 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1008:0408 FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:0413 FUN_1008_0138 DATA 1 true Stack[0x42] - +1008:0416 FUN_1008_0138 DATA 1 true Stack[0x44] - +1008:041e FUN_1008_0138 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1008:0423 FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:0442 FUN_1008_0138 DATA 1 true Stack[0x36] - +1008:0445 FUN_1008_0138 DATA 1 true Stack[0x38] - +1008:044d FUN_1008_0138 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1008:0452 FUN_1008_0138 UNCONDITIONAL_CALL 0 true 1020:100b Code5 FUN_1020_100b FUN_1020_100b +1008:0457 FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:0472 FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:047c Code2 LAB_1008_047c +1008:0474 FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:0497 Code2 LAB_1008_0497 +1008:047a FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:0497 Code2 LAB_1008_0497 +1008:047c FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:0495 FUN_1008_0138 UNCONDITIONAL_JUMP 0 true 1008:04ba Code2 LAB_1008_04ba +1008:0497 FUN_1008_0138 DATA 1 true Stack[0x10] - +1008:049a FUN_1008_0138 DATA 1 true Stack[0x12] - +1008:04a2 FUN_1008_0138 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1008:04a7 FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:04ba FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:04c9 FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:04d3 Code2 LAB_1008_04d3 +1008:04cb FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:04ee Code2 LAB_1008_04ee +1008:04d1 FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:04ee Code2 LAB_1008_04ee +1008:04d3 FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:04ec FUN_1008_0138 UNCONDITIONAL_JUMP 0 true 1008:0511 Code2 LAB_1008_0511 +1008:04ee FUN_1008_0138 DATA 1 true Stack[0xc] - +1008:04f1 FUN_1008_0138 DATA 1 true Stack[0xe] - +1008:04f9 FUN_1008_0138 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1008:04fe FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:0511 FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:0520 FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:052a Code2 LAB_1008_052a +1008:0522 FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:0545 Code2 LAB_1008_0545 +1008:0528 FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:0545 Code2 LAB_1008_0545 +1008:052a FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:0543 FUN_1008_0138 UNCONDITIONAL_JUMP 0 true 1008:0568 Code2 LAB_1008_0568 +1008:0545 FUN_1008_0138 DATA 1 true Stack[0x10] - +1008:0548 FUN_1008_0138 DATA 1 true Stack[0x12] - +1008:0550 FUN_1008_0138 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1008:0555 FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:0568 FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:0577 FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:0581 Code2 LAB_1008_0581 +1008:0579 FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:059c Code2 LAB_1008_059c +1008:057f FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:059c Code2 LAB_1008_059c +1008:0581 FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:059a FUN_1008_0138 UNCONDITIONAL_JUMP 0 true 1008:05bf Code2 LAB_1008_05bf +1008:059c FUN_1008_0138 DATA 1 true Stack[0xc] - +1008:059f FUN_1008_0138 DATA 1 true Stack[0xe] - +1008:05a7 FUN_1008_0138 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1008:05ac FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:05bf FUN_1008_0138 DATA 1 true Stack[0x46] - +1008:05c2 FUN_1008_0138 DATA 1 true Stack[0x48] - +1008:05c5 FUN_1008_0138 WRITE 0 true 1028:0849 Data6 DAT_1028_0849 +1008:05c8 FUN_1008_0138 WRITE 0 true 1028:084b Data6 DAT_1028_084b +1008:05cc FUN_1008_0138 DATA 1 true Stack[0x42] - +1008:05cf FUN_1008_0138 DATA 1 true Stack[0x44] - +1008:05d2 FUN_1008_0138 WRITE 0 true 1028:084d Data6 DAT_1028_084d +1008:05d5 FUN_1008_0138 WRITE 0 true 1028:084f Data6 DAT_1028_084f +1008:05d9 FUN_1008_0138 UNCONDITIONAL_JUMP 0 true 1008:06d6 Code2 LAB_1008_06d6 +1008:05de FUN_1008_0138 CONDITIONAL_JUMP 0 true 1008:05e3 Code2 LAB_1008_05e3 +1008:05e0 FUN_1008_0138 UNCONDITIONAL_JUMP 0 true 1008:06d6 Code2 LAB_1008_06d6 +1008:05e3 FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:063e FUN_1008_0138 DATA 1 true Stack[0x46] - +1008:0641 FUN_1008_0138 DATA 1 true Stack[0x48] - +1008:0649 FUN_1008_0138 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1008:064e FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:0659 FUN_1008_0138 DATA 1 true Stack[0x42] - +1008:065c FUN_1008_0138 DATA 1 true Stack[0x44] - +1008:0664 FUN_1008_0138 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1008:0669 FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:0674 FUN_1008_0138 DATA 1 true Stack[-0x6] - +1008:0677 FUN_1008_0138 DATA 1 true Stack[-0x4] - +1008:067f FUN_1008_0138 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1008:0684 FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:068f FUN_1008_0138 DATA 1 true Stack[-0xa] - +1008:0692 FUN_1008_0138 DATA 1 true Stack[-0x8] - +1008:069a FUN_1008_0138 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1008:069f FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:06aa FUN_1008_0138 DATA 1 true Stack[-0x6] - +1008:06ad FUN_1008_0138 DATA 1 true Stack[-0x4] - +1008:06b0 FUN_1008_0138 WRITE 0 true 1028:0849 Data6 DAT_1028_0849 +1008:06b3 FUN_1008_0138 WRITE 0 true 1028:084b Data6 DAT_1028_084b +1008:06b7 FUN_1008_0138 DATA 1 true Stack[-0xa] - +1008:06ba FUN_1008_0138 DATA 1 true Stack[-0x8] - +1008:06bd FUN_1008_0138 WRITE 0 true 1028:084d Data6 DAT_1028_084d +1008:06c0 FUN_1008_0138 WRITE 0 true 1028:084f Data6 DAT_1028_084f +1008:06d6 FUN_1008_0138 DATA 1 true Stack[0x30] - +1008:06d9 FUN_1008_0138 DATA 1 true Stack[0x32] - +1008:06dc FUN_1008_0138 DATA 1 true Stack[0x34] - +1008:06df FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:06ee FUN_1008_0138 DATA 1 true Stack[0x2a] - +1008:06f1 FUN_1008_0138 DATA 1 true Stack[0x2c] - +1008:06f4 FUN_1008_0138 DATA 1 true Stack[0x2e] - +1008:06f7 FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:0706 FUN_1008_0138 DATA 1 true Stack[0x50] - +1008:070d FUN_1008_0138 DATA 1 true Stack[0x24] - +1008:0710 FUN_1008_0138 DATA 1 true Stack[0x26] - +1008:0713 FUN_1008_0138 DATA 1 true Stack[0x28] - +1008:0716 FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:0725 FUN_1008_0138 DATA 1 true Stack[0x1e] - +1008:0728 FUN_1008_0138 DATA 1 true Stack[0x20] - +1008:072b FUN_1008_0138 DATA 1 true Stack[0x22] - +1008:072e FUN_1008_0138 DATA 1 true Stack[-0xe] - +1008:073d FUN_1008_0138 DATA 1 true Stack[0x4c] - +1008:0744 FUN_1008_0138 DATA 1 true Stack[0x1c] - +1008:074b FUN_1008_0138 DATA 1 true Stack[0x1a] - +1008:0752 FUN_1008_0138 DATA 1 true Stack[0x16] - +1008:0755 FUN_1008_0138 DATA 1 true Stack[0x18] - +1008:0760 FUN_1008_0138 DATA 1 true Stack[0x14] - +1008:0767 FUN_1008_0138 DATA 1 true Stack[0xa] - +1008:076e FUN_1008_0138 DATA 1 true Stack[0x8] - +1008:0775 FUN_1008_0138 DATA 1 true Stack[0x6] - +1008:077c FUN_1008_0138 DATA 1 true Stack[0x4] - +1008:078b FUN_1008_0787 DATA 1 true Stack[0xc] - +1008:0797 FUN_1008_0787 DATA 1 true Stack[0xa] - +1008:079d FUN_1008_0787 DATA 1 true Stack[0x8] - +1008:07a4 FUN_1008_0787 DATA 1 true Stack[0x6] - +1008:07ab FUN_1008_0787 DATA 1 true Stack[0x4] - +1008:07ba FUN_1008_07b6 DATA 0 true Stack[0xe] - +1008:07bd FUN_1008_07b6 UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1008:07c2 FUN_1008_07b6 DATA 0 true Stack[-0x8] - +1008:07c5 FUN_1008_07b6 DATA 0 true Stack[0xe] - +1008:07c8 FUN_1008_07b6 UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1008:07cd FUN_1008_07b6 DATA 0 true Stack[-0xa] - +1008:07d0 FUN_1008_07b6 DATA 0 true Stack[-0x8] - +1008:07d3 FUN_1008_07b6 READ 0 true 1028:085b Data6 DAT_1028_085b +1008:07d7 FUN_1008_07b6 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1008:07dc FUN_1008_07b6 DATA 0 true Stack[-0x4] - +1008:07df FUN_1008_07b6 DATA 0 true Stack[-0xa] - +1008:07e2 FUN_1008_07b6 DATA 0 true Stack[0x4] - +1008:07e5 FUN_1008_07b6 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1008:07ea FUN_1008_07b6 DATA 0 true Stack[-0x6] - +1008:07ed FUN_1008_07b6 DATA 0 true Stack[-0x8] - +1008:07f0 FUN_1008_07b6 DATA 0 true Stack[0xc] - +1008:07f3 FUN_1008_07b6 DATA 0 true Stack[0xa] - +1008:07f6 FUN_1008_07b6 DATA 0 true Stack[0x8] - +1008:07f9 FUN_1008_07b6 DATA 0 true Stack[0x6] - +1008:07fc FUN_1008_07b6 DATA 0 true Stack[-0xa] - +1008:0808 FUN_1008_07b6 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1008:080d FUN_1008_07b6 DATA 0 true Stack[-0xa] - +1008:0810 FUN_1008_07b6 DATA 0 true Stack[-0x6] - +1008:0813 FUN_1008_07b6 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1008:0818 FUN_1008_07b6 DATA 0 true Stack[-0x8] - +1008:081b FUN_1008_07b6 DATA 0 true Stack[-0x4] - +1008:081e FUN_1008_07b6 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1008:0823 FUN_1008_07b6 DATA 0 true Stack[-0xa] - +1008:0826 FUN_1008_07b6 UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1008:082b FUN_1008_07b6 DATA 0 true Stack[-0x8] - +1008:082e FUN_1008_07b6 UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1008:083b FUN_1008_0837 DATA 0 true Stack[0xc] - +1008:083e FUN_1008_0837 UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1008:0843 FUN_1008_0837 DATA 0 true Stack[-0x8] - +1008:0846 FUN_1008_0837 DATA 0 true Stack[0xc] - +1008:0849 FUN_1008_0837 UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1008:084e FUN_1008_0837 DATA 0 true Stack[-0xa] - +1008:0851 FUN_1008_0837 DATA 0 true Stack[-0x8] - +1008:0854 FUN_1008_0837 READ 0 true 1028:085b Data6 DAT_1028_085b +1008:0858 FUN_1008_0837 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1008:085d FUN_1008_0837 DATA 0 true Stack[-0x4] - +1008:0860 FUN_1008_0837 DATA 0 true Stack[-0xa] - +1008:0863 FUN_1008_0837 READ 0 true 1028:085f Data6 DAT_1028_085f +1008:0867 FUN_1008_0837 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1008:086c FUN_1008_0837 DATA 0 true Stack[-0x6] - +1008:086f FUN_1008_0837 DATA 0 true Stack[-0x8] - +1008:0872 FUN_1008_0837 DATA 0 true Stack[0xa] - +1008:0875 FUN_1008_0837 DATA 0 true Stack[0x8] - +1008:0878 FUN_1008_0837 DATA 0 true Stack[0x6] - +1008:087b FUN_1008_0837 DATA 0 true Stack[0x4] - +1008:087e FUN_1008_0837 DATA 0 true Stack[-0xa] - +1008:0881 FUN_1008_0837 DATA 0 true Stack[0xa] - +1008:0884 FUN_1008_0837 DATA 0 true Stack[0x8] - +1008:088c FUN_1008_0837 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1008:0891 FUN_1008_0837 DATA 0 true Stack[-0xa] - +1008:0894 FUN_1008_0837 DATA 0 true Stack[-0x6] - +1008:0897 FUN_1008_0837 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1008:089c FUN_1008_0837 DATA 0 true Stack[-0x8] - +1008:089f FUN_1008_0837 DATA 0 true Stack[-0x4] - +1008:08a2 FUN_1008_0837 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1008:08a7 FUN_1008_0837 DATA 0 true Stack[-0xa] - +1008:08aa FUN_1008_0837 UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1008:08af FUN_1008_0837 DATA 0 true Stack[-0x8] - +1008:08b2 FUN_1008_0837 UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1008:08bf FUN_1008_08bb DATA 0 true Stack[0xc] - +1008:08c2 FUN_1008_08bb UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1008:08c7 FUN_1008_08bb DATA 0 true Stack[-0x8] - +1008:08ca FUN_1008_08bb DATA 0 true Stack[0xc] - +1008:08cd FUN_1008_08bb UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1008:08d2 FUN_1008_08bb DATA 0 true Stack[-0xa] - +1008:08d5 FUN_1008_08bb DATA 0 true Stack[-0x8] - +1008:08d8 FUN_1008_08bb READ 0 true 1028:085b Data6 DAT_1028_085b +1008:08dc FUN_1008_08bb UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1008:08e1 FUN_1008_08bb DATA 0 true Stack[-0x4] - +1008:08e4 FUN_1008_08bb DATA 0 true Stack[-0xa] - +1008:08e7 FUN_1008_08bb READ 0 true 1028:085d Data6 DAT_1028_085d +1008:08eb FUN_1008_08bb UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1008:08f0 FUN_1008_08bb DATA 0 true Stack[-0x6] - +1008:08f3 FUN_1008_08bb DATA 0 true Stack[-0x8] - +1008:08f6 FUN_1008_08bb DATA 0 true Stack[0xa] - +1008:08f9 FUN_1008_08bb DATA 0 true Stack[0x8] - +1008:08fc FUN_1008_08bb DATA 0 true Stack[0x6] - +1008:08ff FUN_1008_08bb DATA 0 true Stack[0x4] - +1008:0902 FUN_1008_08bb DATA 0 true Stack[-0xa] - +1008:0905 FUN_1008_08bb DATA 0 true Stack[0xa] - +1008:0908 FUN_1008_08bb DATA 0 true Stack[0x8] - +1008:0910 FUN_1008_08bb UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1008:0915 FUN_1008_08bb DATA 0 true Stack[-0xa] - +1008:0918 FUN_1008_08bb DATA 0 true Stack[-0x6] - +1008:091b FUN_1008_08bb UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1008:0920 FUN_1008_08bb DATA 0 true Stack[-0x8] - +1008:0923 FUN_1008_08bb DATA 0 true Stack[-0x4] - +1008:0926 FUN_1008_08bb UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1008:092b FUN_1008_08bb DATA 0 true Stack[-0xa] - +1008:092e FUN_1008_08bb UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1008:0933 FUN_1008_08bb DATA 0 true Stack[-0x8] - +1008:0936 FUN_1008_08bb UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1008:0943 FUN_1008_093f DATA 0 true Stack[0xc] - +1008:0946 FUN_1008_093f UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1008:094b FUN_1008_093f DATA 0 true Stack[-0x6] - +1008:094e FUN_1008_093f DATA 0 true Stack[-0x6] - +1008:0951 FUN_1008_093f READ 0 true 1028:085b Data6 DAT_1028_085b +1008:0955 FUN_1008_093f UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1008:095a FUN_1008_093f DATA 0 true Stack[-0x4] - +1008:095d FUN_1008_093f DATA 0 true Stack[0xc] - +1008:0960 FUN_1008_093f DATA 0 true Stack[0xa] - +1008:0963 FUN_1008_093f DATA 0 true Stack[0x8] - +1008:0966 FUN_1008_093f DATA 0 true Stack[0x6] - +1008:0969 FUN_1008_093f DATA 0 true Stack[0x4] - +1008:096c FUN_1008_093f DATA 0 true Stack[-0x6] - +1008:096f FUN_1008_093f DATA 0 true Stack[0xa] - +1008:0972 FUN_1008_093f DATA 0 true Stack[0x8] - +1008:097a FUN_1008_093f UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1008:097f FUN_1008_093f DATA 0 true Stack[-0x6] - +1008:0982 FUN_1008_093f DATA 0 true Stack[-0x4] - +1008:0985 FUN_1008_093f UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1008:098a FUN_1008_093f DATA 0 true Stack[-0x6] - +1008:098d FUN_1008_093f UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1008:099a FUN_1008_0996 DATA 0 true Stack[0x4] - +1008:099d FUN_1008_0996 UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1008:09a2 FUN_1008_0996 DATA 0 true Stack[-0x8] - +1008:09a5 FUN_1008_0996 DATA 0 true Stack[0x4] - +1008:09a8 FUN_1008_0996 UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1008:09ad FUN_1008_0996 DATA 0 true Stack[-0xe] - +1008:09b0 FUN_1008_0996 DATA 0 true Stack[0x4] - +1008:09b8 FUN_1008_0996 UNCONDITIONAL_CALL 0 true 1228:0158 EXTERNAL CREATECOMPATIBLEBITMAP CREATECOMPATIBLEBITMAP +1008:09bd FUN_1008_0996 DATA 0 true Stack[-0x18] - +1008:09c0 FUN_1008_0996 DATA 0 true Stack[-0x2e] - +1008:09c5 FUN_1008_0996 DATA 0 true Stack[-0x2c] - +1008:09ca FUN_1008_0996 DATA 1 true Stack[0x6] - +1008:09d0 FUN_1008_0996 CONDITIONAL_JUMP 0 true 1008:09de Code2 LAB_1008_09de +1008:09d2 FUN_1008_0996 DATA 0 true Stack[-0x32] - +1008:09d7 FUN_1008_0996 DATA 0 true Stack[-0x30] - +1008:09dc FUN_1008_0996 UNCONDITIONAL_JUMP 0 true 1008:0a1b Code2 LAB_1008_0a1b +1008:09e1 FUN_1008_0996 CONDITIONAL_JUMP 0 true 1008:09ef Code2 LAB_1008_09ef +1008:09e3 FUN_1008_0996 DATA 0 true Stack[-0x32] - +1008:09e8 FUN_1008_0996 DATA 0 true Stack[-0x30] - +1008:09ed FUN_1008_0996 UNCONDITIONAL_JUMP 0 true 1008:0a1b Code2 LAB_1008_0a1b +1008:09f2 FUN_1008_0996 CONDITIONAL_JUMP 0 true 1008:0a00 Code2 LAB_1008_0a00 +1008:09f4 FUN_1008_0996 DATA 0 true Stack[-0x32] - +1008:09f9 FUN_1008_0996 DATA 0 true Stack[-0x30] - +1008:09fe FUN_1008_0996 UNCONDITIONAL_JUMP 0 true 1008:0a1b Code2 LAB_1008_0a1b +1008:0a03 FUN_1008_0996 CONDITIONAL_JUMP 0 true 1008:0a11 Code2 LAB_1008_0a11 +1008:0a05 FUN_1008_0996 DATA 0 true Stack[-0x32] - +1008:0a0a FUN_1008_0996 DATA 0 true Stack[-0x30] - +1008:0a0f FUN_1008_0996 UNCONDITIONAL_JUMP 0 true 1008:0a1b Code2 LAB_1008_0a1b +1008:0a11 FUN_1008_0996 DATA 0 true Stack[-0x32] - +1008:0a16 FUN_1008_0996 DATA 0 true Stack[-0x30] - +1008:0a1b FUN_1008_0996 DATA 1 true Stack[-0x32] - +1008:0a1e FUN_1008_0996 DATA 1 true Stack[-0x30] - +1008:0a27 FUN_1008_0996 DATA 0 true Stack[-0x32] - +1008:0a2a FUN_1008_0996 DATA 0 true Stack[-0x30] - +1008:0a2d FUN_1008_0996 DATA 0 true Stack[0x8] - +1008:0a31 FUN_1008_0996 CONDITIONAL_JUMP 0 true 1008:0a49 Code2 LAB_1008_0a49 +1008:0a33 FUN_1008_0996 CONDITIONAL_JUMP 0 true 1008:0a3b Code2 LAB_1008_0a3b +1008:0a35 FUN_1008_0996 DATA 0 true Stack[0x6] - +1008:0a39 FUN_1008_0996 CONDITIONAL_JUMP 0 true 1008:0a49 Code2 LAB_1008_0a49 +1008:0a3b FUN_1008_0996 DATA 0 true Stack[0x8] - +1008:0a3f FUN_1008_0996 CONDITIONAL_JUMP 0 true 1008:0a49 Code2 LAB_1008_0a49 +1008:0a41 FUN_1008_0996 CONDITIONAL_JUMP 0 true 1008:0a57 Code2 LAB_1008_0a57 +1008:0a43 FUN_1008_0996 DATA 0 true Stack[0x6] - +1008:0a47 FUN_1008_0996 CONDITIONAL_JUMP 0 true 1008:0a57 Code2 LAB_1008_0a57 +1008:0a49 FUN_1008_0996 DATA 1 true Stack[0x6] - +1008:0a4c FUN_1008_0996 DATA 1 true Stack[0x8] - +1008:0a4f FUN_1008_0996 DATA 0 true Stack[-0x1e] - +1008:0a52 FUN_1008_0996 DATA 0 true Stack[-0x1c] - +1008:0a55 FUN_1008_0996 UNCONDITIONAL_JUMP 0 true 1008:0a6b Code2 LAB_1008_0a6b +1008:0a57 FUN_1008_0996 DATA 1 true Stack[0x6] - +1008:0a65 FUN_1008_0996 DATA 0 true Stack[-0x1e] - +1008:0a68 FUN_1008_0996 DATA 0 true Stack[-0x1c] - +1008:0a6b FUN_1008_0996 DATA 0 true Stack[-0x8] - +1008:0a6e FUN_1008_0996 READ 0 true 1028:085b Data6 DAT_1028_085b +1008:0a72 FUN_1008_0996 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1008:0a77 FUN_1008_0996 DATA 0 true Stack[-0x10] - +1008:0a7a FUN_1008_0996 DATA 0 true Stack[-0xe] - +1008:0a7d FUN_1008_0996 DATA 0 true Stack[-0x18] - +1008:0a80 FUN_1008_0996 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1008:0a85 FUN_1008_0996 DATA 0 true Stack[-0x12] - +1008:0a88 FUN_1008_0996 DATA 0 true Stack[-0xe] - +1008:0a94 FUN_1008_0996 DATA 0 true Stack[-0x8] - +1008:0a97 FUN_1008_0996 DATA 0 true Stack[-0x2e] - +1008:0a9a FUN_1008_0996 DATA 0 true Stack[-0x32] - +1008:0aa2 FUN_1008_0996 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1008:0aa7 FUN_1008_0996 DATA 0 true Stack[-0x4] - +1008:0aab FUN_1008_0996 UNCONDITIONAL_JUMP 0 true 1008:0ab0 Code2 LAB_1008_0ab0 +1008:0aad FUN_1008_0996 DATA 0 true Stack[-0x4] - +1008:0ab0 FUN_1008_0996 DATA 1 true Stack[-0x1e] - +1008:0ab3 FUN_1008_0996 DATA 1 true Stack[-0x1c] - +1008:0abb FUN_1008_0996 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1008:0ac4 FUN_1008_0996 DATA 0 true Stack[-0x5] - +1008:0ac7 FUN_1008_0996 DATA 1 true Stack[-0x1e] - +1008:0aca FUN_1008_0996 DATA 1 true Stack[-0x1c] - +1008:0ad2 FUN_1008_0996 UNCONDITIONAL_CALL 0 true 1020:08e6 Code5 FUN_1020_08e6 FUN_1020_08e6 +1008:0ad7 FUN_1008_0996 DATA 0 true Stack[-0x1e] - +1008:0ada FUN_1008_0996 DATA 0 true Stack[-0x1c] - +1008:0add FUN_1008_0996 DATA 0 true Stack[-0x5] - +1008:0ae1 FUN_1008_0996 CONDITIONAL_JUMP 0 true 1008:0afd Code2 LAB_1008_0afd +1008:0ae3 FUN_1008_0996 DATA 0 true Stack[-0x1c] - +1008:0ae7 FUN_1008_0996 CONDITIONAL_JUMP 0 true 1008:0afd Code2 LAB_1008_0afd +1008:0ae9 FUN_1008_0996 CONDITIONAL_JUMP 0 true 1008:0af1 Code2 LAB_1008_0af1 +1008:0aeb FUN_1008_0996 DATA 0 true Stack[-0x1e] - +1008:0aef FUN_1008_0996 CONDITIONAL_JUMP 0 true 1008:0afd Code2 LAB_1008_0afd +1008:0af1 FUN_1008_0996 DATA 0 true Stack[-0x5] - +1008:0af5 FUN_1008_0996 CONDITIONAL_JUMP 0 true 1008:0b44 Code2 LAB_1008_0b44 +1008:0af7 FUN_1008_0996 DATA 0 true Stack[-0x4] - +1008:0afb FUN_1008_0996 CONDITIONAL_JUMP 0 true 1008:0b44 Code2 LAB_1008_0b44 +1008:0afd FUN_1008_0996 DATA 1 true Stack[-0x4] - +1008:0b0d FUN_1008_0996 DATA 0 true Stack[-0x26] - +1008:0b10 FUN_1008_0996 DATA 0 true Stack[-0x24] - +1008:0b13 FUN_1008_0996 DATA 0 true Stack[-0x8] - +1008:0b16 FUN_1008_0996 READ 0 true 1028:0861 Data6 DAT_1028_0861 +1008:0b1a FUN_1008_0996 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1008:0b1f FUN_1008_0996 DATA 0 true Stack[-0xe] - +1008:0b22 FUN_1008_0996 DATA 0 true Stack[-0x26] - +1008:0b2b FUN_1008_0996 DATA 0 true Stack[-0x8] - +1008:0b2e FUN_1008_0996 DATA 1 true Stack[-0x5] - +1008:0b3f FUN_1008_0996 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1008:0b44 FUN_1008_0996 DATA 0 true Stack[-0x4] - +1008:0b48 FUN_1008_0996 CONDITIONAL_JUMP 0 true 1008:0b4d Code2 LAB_1008_0b4d +1008:0b4a FUN_1008_0996 UNCONDITIONAL_JUMP 0 true 1008:0aad Code2 LAB_1008_0aad +1008:0b4d FUN_1008_0996 DATA 0 true Stack[0x4] - +1008:0b50 FUN_1008_0996 DATA 0 true Stack[-0x2e] - +1008:0b53 FUN_1008_0996 DATA 0 true Stack[-0x32] - +1008:0b5b FUN_1008_0996 DATA 0 true Stack[-0xe] - +1008:0b67 FUN_1008_0996 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1008:0b6c FUN_1008_0996 DATA 0 true Stack[-0x8] - +1008:0b6f FUN_1008_0996 DATA 0 true Stack[-0x10] - +1008:0b72 FUN_1008_0996 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1008:0b77 FUN_1008_0996 DATA 0 true Stack[-0xe] - +1008:0b7a FUN_1008_0996 DATA 0 true Stack[-0x12] - +1008:0b7d FUN_1008_0996 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1008:0b82 FUN_1008_0996 DATA 0 true Stack[-0x18] - +1008:0b85 FUN_1008_0996 UNCONDITIONAL_CALL 0 true 1228:0168 EXTERNAL DELETEOBJECT DELETEOBJECT +1008:0b8a FUN_1008_0996 DATA 0 true Stack[-0x8] - +1008:0b8d FUN_1008_0996 UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1008:0b92 FUN_1008_0996 DATA 0 true Stack[-0xe] - +1008:0b95 FUN_1008_0996 UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1008:0ba2 FUN_1008_0b9e DATA 1 true Stack[0x4] - +1008:0ba5 FUN_1008_0b9e READ 1 true 1028:07d1 Data6 DAT_1028_07d1 +1008:0ba9 FUN_1008_0b9e CONDITIONAL_JUMP 0 true 1008:0bb5 Code2 LAB_1008_0bb5 +1008:0bab FUN_1008_0b9e READ 0 true 1028:086b Data6 DAT_1028_086b +1008:0bb0 FUN_1008_0b9e CONDITIONAL_JUMP 0 true 1008:0bb5 Code2 LAB_1008_0bb5 +1008:0bb2 FUN_1008_0b9e UNCONDITIONAL_JUMP 0 true 1008:0d3f Code2 LAB_1008_0d3f +1008:0bb5 FUN_1008_0b9e DATA 0 true Stack[0x4] - +1008:0bb9 FUN_1008_0b9e CONDITIONAL_JUMP 0 true 1008:0bbe Code2 LAB_1008_0bbe +1008:0bbb FUN_1008_0b9e UNCONDITIONAL_JUMP 0 true 1008:0d3f Code2 LAB_1008_0d3f +1008:0bbe FUN_1008_0b9e DATA 0 true Stack[0x4] - +1008:0bc2 FUN_1008_0b9e CONDITIONAL_JUMP 0 true 1008:0bc7 Code2 LAB_1008_0bc7 +1008:0bc4 FUN_1008_0b9e UNCONDITIONAL_JUMP 0 true 1008:0d3f Code2 LAB_1008_0d3f +1008:0bc7 FUN_1008_0b9e DATA 1 true Stack[0x4] - +1008:0bd6 FUN_1008_0b9e CONDITIONAL_JUMP 0 true 1008:0be2 Code2 LAB_1008_0be2 +1008:0bd8 FUN_1008_0b9e CONDITIONAL_JUMP 0 true 1008:0be9 Code2 LAB_1008_0be9 +1008:0be0 FUN_1008_0b9e CONDITIONAL_JUMP 0 true 1008:0be9 Code2 LAB_1008_0be9 +1008:0be2 FUN_1008_0b9e DATA 0 true Stack[-0x4] - +1008:0be7 FUN_1008_0b9e UNCONDITIONAL_JUMP 0 true 1008:0c54 Code2 LAB_1008_0c54 +1008:0be9 FUN_1008_0b9e DATA 1 true Stack[0x4] - +1008:0bf8 FUN_1008_0b9e CONDITIONAL_JUMP 0 true 1008:0c04 Code2 LAB_1008_0c04 +1008:0bfa FUN_1008_0b9e CONDITIONAL_JUMP 0 true 1008:0c0b Code2 LAB_1008_0c0b +1008:0c02 FUN_1008_0b9e CONDITIONAL_JUMP 0 true 1008:0c0b Code2 LAB_1008_0c0b +1008:0c04 FUN_1008_0b9e DATA 0 true Stack[-0x4] - +1008:0c09 FUN_1008_0b9e UNCONDITIONAL_JUMP 0 true 1008:0c54 Code2 LAB_1008_0c54 +1008:0c0b FUN_1008_0b9e DATA 1 true Stack[0x4] - +1008:0c1a FUN_1008_0b9e CONDITIONAL_JUMP 0 true 1008:0c26 Code2 LAB_1008_0c26 +1008:0c1c FUN_1008_0b9e CONDITIONAL_JUMP 0 true 1008:0c2d Code2 LAB_1008_0c2d +1008:0c24 FUN_1008_0b9e CONDITIONAL_JUMP 0 true 1008:0c2d Code2 LAB_1008_0c2d +1008:0c26 FUN_1008_0b9e DATA 0 true Stack[-0x4] - +1008:0c2b FUN_1008_0b9e UNCONDITIONAL_JUMP 0 true 1008:0c54 Code2 LAB_1008_0c54 +1008:0c2d FUN_1008_0b9e DATA 1 true Stack[0x4] - +1008:0c3c FUN_1008_0b9e CONDITIONAL_JUMP 0 true 1008:0c48 Code2 LAB_1008_0c48 +1008:0c3e FUN_1008_0b9e CONDITIONAL_JUMP 0 true 1008:0c4f Code2 LAB_1008_0c4f +1008:0c46 FUN_1008_0b9e CONDITIONAL_JUMP 0 true 1008:0c4f Code2 LAB_1008_0c4f +1008:0c48 FUN_1008_0b9e DATA 0 true Stack[-0x4] - +1008:0c4d FUN_1008_0b9e UNCONDITIONAL_JUMP 0 true 1008:0c54 Code2 LAB_1008_0c54 +1008:0c51 FUN_1008_0b9e DATA 0 true Stack[-0x4] - +1008:0c54 FUN_1008_0b9e DATA 1 true Stack[-0x4] - +1008:0c57 FUN_1008_0b9e READ 1 true 1028:086b Data6 DAT_1028_086b +1008:0c5b FUN_1008_0b9e CONDITIONAL_JUMP 0 true 1008:0c60 Code2 LAB_1008_0c60 +1008:0c5d FUN_1008_0b9e UNCONDITIONAL_JUMP 0 true 1008:0d37 Code2 LAB_1008_0d37 +1008:0c60 FUN_1008_0b9e DATA 0 true Stack[-0x4] - +1008:0c64 FUN_1008_0b9e CONDITIONAL_JUMP 0 true 1008:0c84 Code2 LAB_1008_0c84 +1008:0c66 FUN_1008_0b9e DATA 0 true Stack[0x6] - +1008:0c74 FUN_1008_0b9e DATA 1 true Stack[-0x4] - +1008:0c79 FUN_1008_0b9e READ 0 true 1028:4321 Data6 DAT_1028_4321 +1008:0c7d FUN_1008_0b9e UNCONDITIONAL_CALL 0 true 1008:07b6 Code2 FUN_1008_07b6 FUN_1008_07b6 +1008:0c82 FUN_1008_0b9e UNCONDITIONAL_JUMP 0 true 1008:0c97 Code2 LAB_1008_0c97 +1008:0c84 FUN_1008_0b9e DATA 0 true Stack[0x6] - +1008:0c92 FUN_1008_0b9e UNCONDITIONAL_CALL 0 true 1008:0837 Code2 FUN_1008_0837 FUN_1008_0837 +1008:0c97 FUN_1008_0b9e DATA 0 true Stack[0x6] - +1008:0ca5 FUN_1008_0b9e UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1008:0cac FUN_1008_0b9e DATA 0 true Stack[-0x6] - +1008:0caf FUN_1008_0b9e UNCONDITIONAL_JUMP 0 true 1008:0cb4 Code2 LAB_1008_0cb4 +1008:0cb1 FUN_1008_0b9e DATA 0 true Stack[-0x6] - +1008:0cb4 FUN_1008_0b9e DATA 1 true Stack[-0x6] - +1008:0cb7 FUN_1008_0b9e DATA 1 true Stack[-0x4] - +1008:0cba FUN_1008_0b9e CONDITIONAL_JUMP 0 true 1008:0cf6 Code2 LAB_1008_0cf6 +1008:0cbc FUN_1008_0b9e DATA 0 true Stack[0x6] - +1008:0cc5 FUN_1008_0b9e DATA 1 true Stack[-0x6] - +1008:0cd3 FUN_1008_0b9e UNCONDITIONAL_CALL 0 true 1008:0837 Code2 FUN_1008_0837 FUN_1008_0837 +1008:0cd8 FUN_1008_0b9e DATA 0 true Stack[0x6] - +1008:0ce1 FUN_1008_0b9e DATA 1 true Stack[-0x6] - +1008:0cef FUN_1008_0b9e UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1008:0cf4 FUN_1008_0b9e UNCONDITIONAL_JUMP 0 true 1008:0d2e Code2 LAB_1008_0d2e +1008:0cf6 FUN_1008_0b9e DATA 0 true Stack[0x6] - +1008:0cff FUN_1008_0b9e DATA 1 true Stack[-0x6] - +1008:0d0d FUN_1008_0b9e UNCONDITIONAL_CALL 0 true 1008:08bb Code2 FUN_1008_08bb FUN_1008_08bb +1008:0d12 FUN_1008_0b9e DATA 0 true Stack[0x6] - +1008:0d1b FUN_1008_0b9e DATA 1 true Stack[-0x6] - +1008:0d29 FUN_1008_0b9e UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1008:0d2e FUN_1008_0b9e DATA 0 true Stack[-0x6] - +1008:0d32 FUN_1008_0b9e CONDITIONAL_JUMP 0 true 1008:0d37 Code2 LAB_1008_0d37 +1008:0d34 FUN_1008_0b9e UNCONDITIONAL_JUMP 0 true 1008:0cb1 Code2 LAB_1008_0cb1 +1008:0d37 FUN_1008_0b9e DATA 1 true Stack[-0x4] - +1008:0d3a FUN_1008_0b9e WRITE 0 true 1028:086b Data6 DAT_1028_086b +1008:0d3d FUN_1008_0b9e UNCONDITIONAL_JUMP 0 true 1008:0db9 Code2 LAB_1008_0db9 +1008:0d3f FUN_1008_0b9e DATA 0 true Stack[0x4] - +1008:0d43 FUN_1008_0b9e CONDITIONAL_JUMP 0 true 1008:0db9 Code2 LAB_1008_0db9 +1008:0d45 FUN_1008_0b9e DATA 0 true Stack[0x6] - +1008:0d53 FUN_1008_0b9e UNCONDITIONAL_CALL 0 true 1008:08bb Code2 FUN_1008_08bb FUN_1008_08bb +1008:0d58 FUN_1008_0b9e DATA 0 true Stack[0x6] - +1008:0d66 FUN_1008_0b9e UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1008:0d6d FUN_1008_0b9e DATA 0 true Stack[-0x6] - +1008:0d70 FUN_1008_0b9e UNCONDITIONAL_JUMP 0 true 1008:0d75 Code2 LAB_1008_0d75 +1008:0d72 FUN_1008_0b9e DATA 0 true Stack[-0x6] - +1008:0d75 FUN_1008_0b9e DATA 0 true Stack[0x6] - +1008:0d7e FUN_1008_0b9e DATA 1 true Stack[-0x6] - +1008:0d8c FUN_1008_0b9e UNCONDITIONAL_CALL 0 true 1008:08bb Code2 FUN_1008_08bb FUN_1008_08bb +1008:0d91 FUN_1008_0b9e DATA 0 true Stack[0x6] - +1008:0d9a FUN_1008_0b9e DATA 1 true Stack[-0x6] - +1008:0da8 FUN_1008_0b9e UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1008:0dad FUN_1008_0b9e DATA 0 true Stack[-0x6] - +1008:0db1 FUN_1008_0b9e CONDITIONAL_JUMP 0 true 1008:0d72 Code2 LAB_1008_0d72 +1008:0db3 FUN_1008_0b9e WRITE 0 true 1028:086b Data6 DAT_1028_086b +1008:0dc0 FUN_1008_0dbd DATA 0 true Stack[0x4] - +1008:0dc4 FUN_1008_0dbd CONDITIONAL_JUMP 0 true 1008:0de2 Code2 LAB_1008_0de2 +1008:0dc6 FUN_1008_0dbd DATA 0 true Stack[0x6] - +1008:0dd2 FUN_1008_0dbd DATA 1 true Stack[0x4] - +1008:0ddb FUN_1008_0dbd UNCONDITIONAL_CALL 0 true 1008:07b6 Code2 FUN_1008_07b6 FUN_1008_07b6 +1008:0de0 FUN_1008_0dbd UNCONDITIONAL_JUMP 0 true 1008:0df3 Code2 LAB_1008_0df3 +1008:0de2 FUN_1008_0dbd DATA 0 true Stack[0x6] - +1008:0dee FUN_1008_0dbd UNCONDITIONAL_CALL 0 true 1008:08bb Code2 FUN_1008_08bb FUN_1008_08bb +1008:0df3 FUN_1008_0dbd DATA 0 true Stack[0x6] - +1008:0dff FUN_1008_0dbd UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1008:0e0c FUN_1008_0e08 DATA 0 true Stack[0x6] - +1008:0e10 FUN_1008_0e08 CONDITIONAL_JUMP 0 true 1008:0e37 Code2 LAB_1008_0e37 +1008:0e12 FUN_1008_0e08 DATA 0 true Stack[0x8] - +1008:0e1e FUN_1008_0e08 UNCONDITIONAL_CALL 0 true 1008:08bb Code2 FUN_1008_08bb FUN_1008_08bb +1008:0e23 FUN_1008_0e08 DATA 0 true Stack[0x8] - +1008:0e2f FUN_1008_0e08 UNCONDITIONAL_CALL 0 true 1008:093f Code2 FUN_1008_093f FUN_1008_093f +1008:0e34 FUN_1008_0e08 UNCONDITIONAL_JUMP 0 true 1008:0f23 Code2 LAB_1008_0f23 +1008:0e37 FUN_1008_0e08 DATA 0 true Stack[0x8] - +1008:0e3a FUN_1008_0e08 UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1008:0e3f FUN_1008_0e08 DATA 0 true Stack[-0x4] - +1008:0e42 FUN_1008_0e08 DATA 0 true Stack[0x8] - +1008:0e45 FUN_1008_0e08 UNCONDITIONAL_CALL 0 true 1228:015c EXTERNAL CREATECOMPATIBLEDC CREATECOMPATIBLEDC +1008:0e4a FUN_1008_0e08 DATA 0 true Stack[-0x6] - +1008:0e4d FUN_1008_0e08 DATA 0 true Stack[-0x4] - +1008:0e50 FUN_1008_0e08 READ 0 true 1028:085b Data6 DAT_1028_085b +1008:0e54 FUN_1008_0e08 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1008:0e59 FUN_1008_0e08 DATA 0 true Stack[-0x8] - +1008:0e5c FUN_1008_0e08 DATA 0 true Stack[-0x6] - +1008:0e5f FUN_1008_0e08 READ 0 true 1028:0863 Data6 DAT_1028_0863 +1008:0e63 FUN_1008_0e08 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1008:0e68 FUN_1008_0e08 DATA 0 true Stack[-0xa] - +1008:0e6b FUN_1008_0e08 DATA 0 true Stack[-0xc] - +1008:0e70 FUN_1008_0e08 DATA 0 true Stack[-0xe] - +1008:0e75 FUN_1008_0e08 DATA 0 true Stack[-0x10] - +1008:0e7a FUN_1008_0e08 DATA 0 true Stack[-0x12] - +1008:0e81 FUN_1008_0e08 DATA 0 true Stack[-0x14] - +1008:0e86 FUN_1008_0e08 DATA 0 true Stack[-0x16] - +1008:0e89 FUN_1008_0e08 DATA 0 true Stack[0x4] - +1008:0e8d FUN_1008_0e08 CONDITIONAL_JUMP 0 true 1008:0e97 Code2 LAB_1008_0e97 +1008:0e8f FUN_1008_0e08 DATA 1 true Stack[-0x12] - +1008:0e94 FUN_1008_0e08 DATA 0 true Stack[-0x16] - +1008:0e97 FUN_1008_0e08 DATA 0 true Stack[0x6] - +1008:0e9b FUN_1008_0e08 CONDITIONAL_JUMP 0 true 1008:0eaf Code2 LAB_1008_0eaf +1008:0e9d FUN_1008_0e08 DATA 1 true Stack[-0x16] - +1008:0ea0 FUN_1008_0e08 DATA 1 true Stack[-0x12] - +1008:0ea3 FUN_1008_0e08 DATA 0 true Stack[-0x16] - +1008:0ea6 FUN_1008_0e08 DATA 1 true Stack[0x6] - +1008:0eac FUN_1008_0e08 DATA 0 true Stack[0x6] - +1008:0eaf FUN_1008_0e08 DATA 1 true Stack[0x6] - +1008:0eb3 FUN_1008_0e08 DATA 0 true Stack[-0x10] - +1008:0eb6 FUN_1008_0e08 DATA 0 true Stack[-0x14] - +1008:0eb9 FUN_1008_0e08 DATA 0 true Stack[-0x4] - +1008:0ebc FUN_1008_0e08 DATA 0 true Stack[-0xc] - +1008:0ebf FUN_1008_0e08 DATA 0 true Stack[-0xe] - +1008:0ec2 FUN_1008_0e08 DATA 0 true Stack[-0x10] - +1008:0ec5 FUN_1008_0e08 DATA 0 true Stack[-0x12] - +1008:0ec8 FUN_1008_0e08 DATA 0 true Stack[-0x6] - +1008:0ecb FUN_1008_0e08 DATA 0 true Stack[-0x14] - +1008:0ece FUN_1008_0e08 DATA 0 true Stack[-0x16] - +1008:0ed6 FUN_1008_0e08 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1008:0edb FUN_1008_0e08 DATA 0 true Stack[0x8] - +1008:0ede FUN_1008_0e08 DATA 0 true Stack[-0xc] - +1008:0ee1 FUN_1008_0e08 DATA 0 true Stack[-0xe] - +1008:0ee4 FUN_1008_0e08 DATA 0 true Stack[-0x10] - +1008:0ee7 FUN_1008_0e08 DATA 0 true Stack[-0x12] - +1008:0eea FUN_1008_0e08 DATA 0 true Stack[-0x6] - +1008:0eed FUN_1008_0e08 DATA 0 true Stack[-0x14] - +1008:0ef0 FUN_1008_0e08 DATA 0 true Stack[-0x16] - +1008:0ef8 FUN_1008_0e08 UNCONDITIONAL_CALL 0 true 1228:0150 EXTERNAL BITBLT BITBLT +1008:0efd FUN_1008_0e08 DATA 0 true Stack[-0x4] - +1008:0f00 FUN_1008_0e08 DATA 0 true Stack[-0x8] - +1008:0f03 FUN_1008_0e08 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1008:0f08 FUN_1008_0e08 DATA 0 true Stack[-0x6] - +1008:0f0b FUN_1008_0e08 DATA 0 true Stack[-0xa] - +1008:0f0e FUN_1008_0e08 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1008:0f13 FUN_1008_0e08 DATA 0 true Stack[-0x6] - +1008:0f16 FUN_1008_0e08 UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1008:0f1b FUN_1008_0e08 DATA 0 true Stack[-0x4] - +1008:0f1e FUN_1008_0e08 UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1008:0f37 FUN_1008_0f2e WRITE 0 true 1028:43f2 Data6 DAT_1028_43f2 +1008:0f3c FUN_1008_0f2e WRITE 0 true 1028:43f3 Data6 DAT_1028_43f3 +1008:0f43 FUN_1008_0f2e WRITE 0 true 1028:43ee Data6 DAT_1028_43ee +1008:0f46 FUN_1008_0f2e DATA 0 true Stack[-0x78] - +1008:0f4b FUN_1008_0f2e DATA 0 true Stack[-0x2de] - +1008:0f53 FUN_1008_0f2e UNCONDITIONAL_CALL 0 true 1020:082e Code5 FUN_1020_082e FUN_1020_082e +1008:0f58 FUN_1008_0f2e UNCONDITIONAL_CALL 0 true 1008:2f2f Code2 FUN_1008_2f2f FUN_1008_2f2f +1008:0f5d FUN_1008_0f2e DATA 0 true Stack[-0xde] - +1008:0f63 FUN_1008_0f2e DATA 0 true Stack[-0x78] - +1008:0f6d FUN_1008_0f2e DATA 0 true Stack[-0x2de] - +1008:0f75 FUN_1008_0f2e UNCONDITIONAL_CALL 0 true 1020:082e Code5 FUN_1020_082e FUN_1020_082e +1008:0f7a FUN_1008_0f2e UNCONDITIONAL_CALL 0 true 1020:0a7d Code5 FUN_1020_0a7d FUN_1020_0a7d +1008:0f80 FUN_1008_0f2e UNCONDITIONAL_CALL 0 true 1008:2f07 Code2 FUN_1008_2f07 FUN_1008_2f07 +1008:0f85 FUN_1008_0f2e DATA 0 true Stack[-0xde] - +1008:0f90 FUN_1008_0f2e UNCONDITIONAL_CALL 0 true 1008:2f4d Code2 FUN_1008_2f4d FUN_1008_2f4d +1008:0fa1 FUN_1008_0f2e DATA 0 true Stack[-0xde] - +1008:0fa7 FUN_1008_0f2e UNCONDITIONAL_CALL 0 true 1228:0070 EXTERNAL GETPRIVATEPROFILEINT GETPRIVATEPROFILEINT +1008:0fac FUN_1008_0f2e DATA 0 true Stack[-0xc] - +1008:0faf FUN_1008_0f2e DATA 0 true Stack[-0xc] - +1008:0fb3 FUN_1008_0f2e CONDITIONAL_JUMP 0 true 1008:0fb8 Code2 LAB_1008_0fb8 +1008:0fb5 FUN_1008_0f2e UNCONDITIONAL_JUMP 0 true 1008:10de Code2 LAB_1008_10de +1008:0fb8 FUN_1008_0f2e UNCONDITIONAL_CALL 0 true 1228:009c EXTERNAL WAVEOUTGETNUMDEVS WAVEOUTGETNUMDEVS +1008:0fbd FUN_1008_0f2e WRITE 0 true 1028:43ee Data6 DAT_1028_43ee +1008:0fc0 FUN_1008_0f2e READ 0 true 1028:43ee Data6 DAT_1028_43ee +1008:0fc5 FUN_1008_0f2e CONDITIONAL_JUMP 0 true 1008:0fca Code2 LAB_1008_0fca +1008:0fc7 FUN_1008_0f2e UNCONDITIONAL_JUMP 0 true 1008:10de Code2 LAB_1008_10de +1008:0fca FUN_1008_0f2e READ 0 true 1028:43f0 Data6 DAT_1028_43f0 +1008:0fd5 FUN_1008_0f2e UNCONDITIONAL_CALL 0 true 1228:00a0 EXTERNAL WAVEOUTGETDEVCAPS WAVEOUTGETDEVCAPS +1008:0fdc FUN_1008_0f2e CONDITIONAL_JUMP 0 true 1008:0fe6 Code2 LAB_1008_0fe6 +1008:0fe0 FUN_1008_0f2e WRITE 0 true 1028:43ee Data6 DAT_1028_43ee +1008:0fe3 FUN_1008_0f2e UNCONDITIONAL_JUMP 0 true 1008:10de Code2 LAB_1008_10de +1008:0fe6 FUN_1008_0f2e READ 1 true 1028:43ea Data6 DAT_1028_43ea +1008:0fe9 FUN_1008_0f2e READ 1 true 1028:43ec Data6 DAT_1028_43ec +1008:0ff7 FUN_1008_0f2e CONDITIONAL_JUMP 0 true 1008:1000 Code2 LAB_1008_1000 +1008:0ff9 FUN_1008_0f2e CONDITIONAL_JUMP 0 true 1008:1029 Code2 LAB_1008_1029 +1008:0ffe FUN_1008_0f2e CONDITIONAL_JUMP 0 true 1008:1029 Code2 LAB_1008_1029 +1008:1002 FUN_1008_0f2e DATA 0 true Stack[-0x8] - +1008:1005 FUN_1008_0f2e DATA 0 true Stack[-0x6] - +1008:1008 FUN_1008_0f2e READ 0 true 1028:43f0 Data6 DAT_1028_43f0 +1008:100c FUN_1008_0f2e DATA 0 true Stack[-0x8] - +1008:1011 FUN_1008_0f2e UNCONDITIONAL_CALL 0 true 1228:00a4 EXTERNAL WAVEOUTGETVOLUME WAVEOUTGETVOLUME +1008:1016 FUN_1008_0f2e DATA 1 true Stack[-0x7] - +1008:1024 FUN_1008_0f2e WRITE 0 true 1028:43f4 Data6 DAT_1028_43f4 +1008:1027 FUN_1008_0f2e UNCONDITIONAL_JUMP 0 true 1008:102e Code2 LAB_1008_102e +1008:1029 FUN_1008_0f2e WRITE 0 true 1028:43f4 Data6 DAT_1028_43f4 +1008:102e FUN_1008_0f2e DATA 0 true Stack[-0xa] - +1008:1033 FUN_1008_0f2e UNCONDITIONAL_JUMP 0 true 1008:1038 Code2 LAB_1008_1038 +1008:1035 FUN_1008_0f2e DATA 0 true Stack[-0xa] - +1008:1038 FUN_1008_0f2e DATA 1 true Stack[-0xa] - +1008:103e FUN_1008_0f2e READ 1 true 1028:03ea Data6 DAT_1028_03ea +1008:103e FUN_1008_0f2e READ 1 false 1028:03ee Data6 DAT_1028_03ee +1008:1042 FUN_1008_0f2e READ 1 true 1028:03ec Data6 DAT_1028_03ec +1008:1042 FUN_1008_0f2e READ 1 false 1028:03f0 Data6 DAT_1028_03f0 +1008:1046 FUN_1008_0f2e CONDITIONAL_JUMP 0 true 1008:104b Code2 LAB_1008_104b +1008:1048 FUN_1008_0f2e UNCONDITIONAL_JUMP 0 true 1008:10d0 Code2 LAB_1008_10d0 +1008:104b FUN_1008_0f2e READ 0 true 1028:06fe Data6 DAT_1028_06fe +1008:104f FUN_1008_0f2e READ 0 true 1028:06fe Data6 DAT_1028_06fe +1008:1053 FUN_1008_0f2e DATA 1 true Stack[-0xa] - +1008:1061 FUN_1008_0f2e UNCONDITIONAL_CALL 0 true 1228:0038 EXTERNAL FINDRESOURCE FINDRESOURCE +1008:1067 FUN_1008_0f2e UNCONDITIONAL_CALL 0 true 1228:003c EXTERNAL LOADRESOURCE LOADRESOURCE +1008:106c FUN_1008_0f2e DATA 0 true Stack[-0x12] - +1008:1071 FUN_1008_0f2e DATA 1 true Stack[-0xa] - +1008:1077 FUN_1008_0f2e READ 0 true 1028:03f0 Data6 DAT_1028_03f0 +1008:107b FUN_1008_0f2e READ 0 true 1028:03ee Data6 DAT_1028_03ee +1008:107f FUN_1008_0f2e UNCONDITIONAL_CALL 0 true 1008:15c7 Code2 FUN_1008_15c7 FUN_1008_15c7 +1008:1084 FUN_1008_0f2e DATA 1 true Stack[-0xa] - +1008:108a FUN_1008_0f2e WRITE 0 true 1028:43fa Data6 DAT_1028_43fa +1008:108e FUN_1008_0f2e WRITE 0 true 1028:43fc Data6 DAT_1028_43fa+2 +1008:1092 FUN_1008_0f2e DATA 0 true Stack[-0x12] - +1008:1095 FUN_1008_0f2e UNCONDITIONAL_CALL 0 true 1228:0040 EXTERNAL LOCKRESOURCE LOCKRESOURCE +1008:109a FUN_1008_0f2e DATA 0 true Stack[-0x10] - +1008:109d FUN_1008_0f2e DATA 0 true Stack[-0xe] - +1008:10a0 FUN_1008_0f2e DATA 1 true Stack[-0x10] - +1008:10a5 FUN_1008_0f2e DATA 1 true Stack[-0xa] - +1008:10ab FUN_1008_0f2e READ 1 true 1028:43fa Data6 DAT_1028_43fa +1008:10b1 FUN_1008_0f2e DATA 1 true Stack[-0xa] - +1008:10b7 FUN_1008_0f2e READ 0 true 1028:03ee Data6 DAT_1028_03ee +1008:10bb FUN_1008_0f2e UNCONDITIONAL_CALL 0 true 1020:16a5 Code5 FUN_1020_16a5 FUN_1020_16a5 +1008:10c0 FUN_1008_0f2e DATA 0 true Stack[-0x12] - +1008:10c3 FUN_1008_0f2e UNCONDITIONAL_CALL 0 true 1228:0010 EXTERNAL GLOBALUNLOCK GLOBALUNLOCK +1008:10c8 FUN_1008_0f2e DATA 0 true Stack[-0x12] - +1008:10cb FUN_1008_0f2e UNCONDITIONAL_CALL 0 true 1228:0044 EXTERNAL FREERESOURCE FREERESOURCE +1008:10d0 FUN_1008_0f2e DATA 0 true Stack[-0xa] - +1008:10d4 FUN_1008_0f2e CONDITIONAL_JUMP 0 true 1008:10d9 Code2 LAB_1008_10d9 +1008:10d6 FUN_1008_0f2e UNCONDITIONAL_JUMP 0 true 1008:1035 Code2 LAB_1008_1035 +1008:10d9 FUN_1008_0f2e WRITE 0 true 1028:43f2 Data6 DAT_1028_43f2 +1008:10eb FUN_1008_10e3 READ 0 true 1028:43ee Data6 DAT_1028_43ee +1008:10f0 FUN_1008_10e3 CONDITIONAL_JUMP 0 true 1008:112c Code2 LAB_1008_112c +1008:10f2 FUN_1008_10e3 READ 0 true 1028:43f3 Data6 DAT_1028_43f3 +1008:10f7 FUN_1008_10e3 CONDITIONAL_JUMP 0 true 1008:1104 Code2 LAB_1008_1104 +1008:10ff FUN_1008_10e3 UNCONDITIONAL_CALL 0 true 1228:0098 EXTERNAL SNDPLAYSOUND SNDPLAYSOUND +1008:1104 FUN_1008_10e3 DATA 0 true Stack[-0x6] - +1008:1109 FUN_1008_10e3 UNCONDITIONAL_JUMP 0 true 1008:110e Code2 LAB_1008_110e +1008:110b FUN_1008_10e3 DATA 0 true Stack[-0x6] - +1008:110e FUN_1008_10e3 DATA 1 true Stack[-0x6] - +1008:1114 FUN_1008_10e3 READ 0 true 1028:43f8 Data6 DAT_1028_43f8 +1008:1114 FUN_1008_10e3 READ 0 false 1028:43fc Data6 DAT_1028_43fa+2 +1008:1118 FUN_1008_10e3 READ 0 true 1028:43f6 Data6 DAT_1028_43f6 +1008:1118 FUN_1008_10e3 READ 0 false 1028:43fa Data6 DAT_1028_43fa +1008:111c FUN_1008_10e3 UNCONDITIONAL_CALL 0 true 1008:15e7 Code2 FUN_1008_15e7 FUN_1008_15e7 +1008:1121 FUN_1008_10e3 DATA 0 true Stack[-0x6] - +1008:1125 FUN_1008_10e3 CONDITIONAL_JUMP 0 true 1008:110b Code2 LAB_1008_110b +1008:1127 FUN_1008_10e3 WRITE 0 true 1028:43f3 Data6 DAT_1028_43f3 +1008:1139 FUN_1008_1131 READ 0 true 1028:43ee Data6 DAT_1028_43ee +1008:113e FUN_1008_1131 CONDITIONAL_JUMP 0 true 1008:1185 Code2 LAB_1008_1185 +1008:1140 FUN_1008_1131 READ 0 true 1028:43f2 Data6 DAT_1028_43f2 +1008:1145 FUN_1008_1131 CONDITIONAL_JUMP 0 true 1008:1185 Code2 LAB_1008_1185 +1008:1147 FUN_1008_1131 DATA 1 true Stack[0x4] - +1008:1155 FUN_1008_1131 CONDITIONAL_JUMP 0 true 1008:1185 Code2 LAB_1008_1185 +1008:1157 FUN_1008_1131 READ 0 true 1028:43f3 Data6 DAT_1028_43f3 +1008:115c FUN_1008_1131 CONDITIONAL_JUMP 0 true 1008:1169 Code2 LAB_1008_1169 +1008:1164 FUN_1008_1131 UNCONDITIONAL_CALL 0 true 1228:0098 EXTERNAL SNDPLAYSOUND SNDPLAYSOUND +1008:1169 FUN_1008_1131 DATA 1 true Stack[0x4] - +1008:1177 FUN_1008_1131 UNCONDITIONAL_CALL 0 true 1228:0098 EXTERNAL SNDPLAYSOUND SNDPLAYSOUND +1008:1182 FUN_1008_1131 WRITE 0 true 1028:43f3 Data6 DAT_1028_43f3 +1008:1185 FUN_1008_1131 DATA 1 true Stack[-0x6] - +1008:1197 FUN_1008_118f READ 0 true 1028:43ee Data6 DAT_1028_43ee +1008:119c FUN_1008_118f CONDITIONAL_JUMP 0 true 1008:11b0 Code2 LAB_1008_11b0 +1008:119e FUN_1008_118f READ 0 true 1028:43f3 Data6 DAT_1028_43f3 +1008:11a3 FUN_1008_118f CONDITIONAL_JUMP 0 true 1008:11b0 Code2 LAB_1008_11b0 +1008:11ab FUN_1008_118f UNCONDITIONAL_CALL 0 true 1228:0098 EXTERNAL SNDPLAYSOUND SNDPLAYSOUND +1008:11b0 FUN_1008_118f DATA 1 true Stack[-0x6] - +1008:11cd FUN_1008_11c5 DATA 0 true Stack[-0xc] - +1008:11d2 FUN_1008_11c5 DATA 0 true Stack[-0xa] - +1008:11d7 FUN_1008_11c5 DATA 1 true Stack[-0xc] - +1008:11da FUN_1008_11c5 DATA 1 true Stack[-0xa] - +1008:11e8 FUN_1008_11c5 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1008:11f3 FUN_1008_11c5 DATA 0 true Stack[-0x14] - +1008:11f6 FUN_1008_11c5 DATA 0 true Stack[-0x12] - +1008:11f9 FUN_1008_11c5 DATA 0 true Stack[-0x14] - +1008:11fc FUN_1008_11c5 UNCONDITIONAL_CALL 0 true 1020:012d Code5 FUN_1020_012d FUN_1020_012d +1008:1201 FUN_1008_11c5 DATA 0 true Stack[-0x8] - +1008:1204 FUN_1008_11c5 DATA 0 true Stack[-0x6] - +1008:1207 FUN_1008_11c5 DATA 1 true Stack[-0xc] - +1008:120a FUN_1008_11c5 DATA 1 true Stack[-0x8] - +1008:1211 FUN_1008_11c5 DATA 1 true Stack[-0x8] - +1008:1219 FUN_1008_11c5 DATA 1 true Stack[-0xc] - +1008:121c FUN_1008_11c5 DATA 1 true Stack[-0xa] - +1008:1225 FUN_1008_11c5 DATA 0 true Stack[-0x18] - +1008:1228 FUN_1008_11c5 DATA 0 true Stack[-0x16] - +1008:122f FUN_1008_11c5 DATA 1 true Stack[-0x16] - +1008:1232 FUN_1008_11c5 CONDITIONAL_JUMP 0 true 1008:1237 Code2 LAB_1008_1237 +1008:1234 FUN_1008_11c5 UNCONDITIONAL_JUMP 0 true 1008:12f2 Code2 LAB_1008_12f2 +1008:1237 FUN_1008_11c5 CONDITIONAL_JUMP 0 true 1008:1241 Code2 LAB_1008_1241 +1008:1239 FUN_1008_11c5 DATA 1 true Stack[-0x18] - +1008:123c FUN_1008_11c5 CONDITIONAL_JUMP 0 true 1008:1241 Code2 LAB_1008_1241 +1008:123e FUN_1008_11c5 UNCONDITIONAL_JUMP 0 true 1008:12f2 Code2 LAB_1008_12f2 +1008:1241 FUN_1008_11c5 DATA 0 true Stack[-0x10] - +1008:1244 FUN_1008_11c5 DATA 0 true Stack[-0xe] - +1008:1247 FUN_1008_11c5 UNCONDITIONAL_JUMP 0 true 1008:1251 Code2 LAB_1008_1251 +1008:1249 FUN_1008_11c5 DATA 0 true Stack[-0x10] - +1008:124d FUN_1008_11c5 DATA 0 true Stack[-0xe] - +1008:1251 FUN_1008_11c5 DATA 1 true Stack[-0x10] - +1008:1254 FUN_1008_11c5 DATA 1 true Stack[-0xe] - +1008:125c FUN_1008_11c5 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1008:1267 FUN_1008_11c5 DATA 1 true Stack[-0x10] - +1008:126d FUN_1008_11c5 DATA 1 true Stack[-0x8] - +1008:1276 FUN_1008_11c5 DATA 1 true Stack[-0x10] - +1008:1279 FUN_1008_11c5 DATA 1 true Stack[-0xe] - +1008:1281 FUN_1008_11c5 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1008:1292 FUN_1008_11c5 DATA 1 true Stack[-0x10] - +1008:1298 FUN_1008_11c5 DATA 1 true Stack[-0x8] - +1008:12a1 FUN_1008_11c5 DATA 1 true Stack[-0x10] - +1008:12a4 FUN_1008_11c5 DATA 1 true Stack[-0xe] - +1008:12ac FUN_1008_11c5 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1008:12bd FUN_1008_11c5 DATA 1 true Stack[-0x10] - +1008:12c3 FUN_1008_11c5 DATA 1 true Stack[-0x8] - +1008:12cc FUN_1008_11c5 DATA 1 true Stack[-0x10] - +1008:12d2 FUN_1008_11c5 DATA 1 true Stack[-0x8] - +1008:12dc FUN_1008_11c5 DATA 1 true Stack[-0x10] - +1008:12df FUN_1008_11c5 DATA 1 true Stack[-0xe] - +1008:12e2 FUN_1008_11c5 DATA 1 true Stack[-0x16] - +1008:12e5 FUN_1008_11c5 CONDITIONAL_JUMP 0 true 1008:12ea Code2 LAB_1008_12ea +1008:12e7 FUN_1008_11c5 UNCONDITIONAL_JUMP 0 true 1008:1249 Code2 LAB_1008_1249 +1008:12ea FUN_1008_11c5 DATA 1 true Stack[-0x18] - +1008:12ed FUN_1008_11c5 CONDITIONAL_JUMP 0 true 1008:12f2 Code2 LAB_1008_12f2 +1008:12ef FUN_1008_11c5 UNCONDITIONAL_JUMP 0 true 1008:1249 Code2 LAB_1008_1249 +1008:12f2 FUN_1008_11c5 DATA 1 true Stack[-0x8] - +1008:12f7 FUN_1008_11c5 UNCONDITIONAL_CALL 0 true 1228:0180 EXTERNAL CREATEPALETTE CREATEPALETTE +1008:12fc FUN_1008_11c5 WRITE 0 true 1028:444e Data6 DAT_1028_444e +1008:12ff FUN_1008_11c5 DATA 0 true Stack[-0x6] - +1008:1302 FUN_1008_11c5 DATA 0 true Stack[-0x8] - +1008:1305 FUN_1008_11c5 DATA 1 true Stack[-0x14] - +1008:1308 FUN_1008_11c5 DATA 1 true Stack[-0x12] - +1008:130e FUN_1008_11c5 UNCONDITIONAL_CALL 0 true 1020:039d Code5 FUN_1020_039d FUN_1020_039d +1008:1314 FUN_1008_11c5 UNCONDITIONAL_CALL 0 true 1020:0147 Code5 FUN_1020_0147 FUN_1020_0147 +1008:132e FUN_1008_1326 DATA 0 true Stack[0xc] - +1008:1331 FUN_1008_1326 DATA 0 true Stack[0xa] - +1008:1334 FUN_1008_1326 DATA 0 true Stack[0x8] - +1008:133c FUN_1008_1326 UNCONDITIONAL_CALL 0 true 1228:0038 EXTERNAL FINDRESOURCE FINDRESOURCE +1008:1341 FUN_1008_1326 DATA 0 true Stack[-0xa] - +1008:1344 FUN_1008_1326 DATA 0 true Stack[0xc] - +1008:1347 FUN_1008_1326 DATA 0 true Stack[-0xa] - +1008:134a FUN_1008_1326 UNCONDITIONAL_CALL 0 true 1228:003c EXTERNAL LOADRESOURCE LOADRESOURCE +1008:134f FUN_1008_1326 DATA 0 true Stack[-0xc] - +1008:1352 FUN_1008_1326 DATA 0 true Stack[-0xc] - +1008:1355 FUN_1008_1326 UNCONDITIONAL_CALL 0 true 1228:0040 EXTERNAL LOCKRESOURCE LOCKRESOURCE +1008:135a FUN_1008_1326 DATA 0 true Stack[-0x8] - +1008:135d FUN_1008_1326 DATA 0 true Stack[-0x6] - +1008:1362 FUN_1008_1326 DATA 0 true Stack[-0xe] - +1008:1365 FUN_1008_1326 UNCONDITIONAL_JUMP 0 true 1008:136a Code2 LAB_1008_136a +1008:1367 FUN_1008_1326 DATA 0 true Stack[-0xe] - +1008:136a FUN_1008_1326 DATA 1 true Stack[-0xe] - +1008:1371 FUN_1008_1326 UNCONDITIONAL_CALL 0 true 1020:039d Code5 FUN_1020_039d FUN_1020_039d +1008:1376 FUN_1008_1326 DATA 1 true Stack[-0x8] - +1008:137e FUN_1008_1326 DATA 1 true Stack[-0xe] - +1008:1385 FUN_1008_1326 UNCONDITIONAL_CALL 0 true 1020:039d Code5 FUN_1020_039d FUN_1020_039d +1008:138a FUN_1008_1326 DATA 1 true Stack[0x4] - +1008:1392 FUN_1008_1326 DATA 0 true Stack[-0xe] - +1008:1397 FUN_1008_1326 CONDITIONAL_JUMP 0 true 1008:1367 Code2 LAB_1008_1367 +1008:1399 FUN_1008_1326 DATA 0 true Stack[-0xc] - +1008:139c FUN_1008_1326 UNCONDITIONAL_CALL 0 true 1228:0010 EXTERNAL GLOBALUNLOCK GLOBALUNLOCK +1008:13b3 FUN_1008_13a8 DATA 1 true Stack[0x4] - +1008:13be FUN_1008_13a8 DATA 0 true Stack[-0xc] - +1008:13c1 FUN_1008_13a8 DATA 0 true Stack[-0xa] - +1008:13c4 FUN_1008_13a8 DATA 1 true Stack[-0xc] - +1008:13c7 FUN_1008_13a8 DATA 1 true Stack[-0xa] - +1008:13d5 FUN_1008_13a8 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1008:13e0 FUN_1008_13a8 DATA 0 true Stack[-0x14] - +1008:13e3 FUN_1008_13a8 DATA 0 true Stack[-0x12] - +1008:13e8 FUN_1008_13a8 DATA 0 true Stack[-0x10] - +1008:13eb FUN_1008_13a8 DATA 0 true Stack[-0xe] - +1008:13ee FUN_1008_13a8 UNCONDITIONAL_JUMP 0 true 1008:13f8 Code2 LAB_1008_13f8 +1008:13f0 FUN_1008_13a8 DATA 0 true Stack[-0x10] - +1008:13f4 FUN_1008_13a8 DATA 0 true Stack[-0xe] - +1008:13f8 FUN_1008_13a8 DATA 1 true Stack[-0x10] - +1008:13fb FUN_1008_13a8 DATA 1 true Stack[-0xe] - +1008:1403 FUN_1008_13a8 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1008:140e FUN_1008_13a8 DATA 1 true Stack[-0x10] - +1008:1414 FUN_1008_13a8 DATA 1 true Stack[0x4] - +1008:141d FUN_1008_13a8 DATA 1 true Stack[-0x10] - +1008:1420 FUN_1008_13a8 DATA 1 true Stack[-0xe] - +1008:1428 FUN_1008_13a8 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1008:1439 FUN_1008_13a8 DATA 1 true Stack[-0x10] - +1008:143f FUN_1008_13a8 DATA 1 true Stack[0x4] - +1008:1448 FUN_1008_13a8 DATA 1 true Stack[-0x10] - +1008:144b FUN_1008_13a8 DATA 1 true Stack[-0xe] - +1008:1453 FUN_1008_13a8 UNCONDITIONAL_CALL 0 true 1020:08a9 Code5 FUN_1020_08a9 FUN_1020_08a9 +1008:1464 FUN_1008_13a8 DATA 1 true Stack[-0x10] - +1008:146a FUN_1008_13a8 DATA 1 true Stack[0x4] - +1008:1473 FUN_1008_13a8 DATA 1 true Stack[-0x10] - +1008:1479 FUN_1008_13a8 DATA 1 true Stack[0x4] - +1008:1483 FUN_1008_13a8 DATA 0 true Stack[-0xe] - +1008:1487 FUN_1008_13a8 CONDITIONAL_JUMP 0 true 1008:148c Code2 LAB_1008_148c +1008:1489 FUN_1008_13a8 UNCONDITIONAL_JUMP 0 true 1008:13f0 Code2 LAB_1008_13f0 +1008:148c FUN_1008_13a8 DATA 0 true Stack[-0x10] - +1008:1491 FUN_1008_13a8 CONDITIONAL_JUMP 0 true 1008:1496 Code2 LAB_1008_1496 +1008:1493 FUN_1008_13a8 UNCONDITIONAL_JUMP 0 true 1008:13f0 Code2 LAB_1008_13f0 +1008:14a5 FUN_1008_149d DATA 0 true Stack[0x8] - +1008:14a8 FUN_1008_149d DATA 0 true Stack[0x6] - +1008:14ab FUN_1008_149d DATA 0 true Stack[0x4] - +1008:14b3 FUN_1008_149d UNCONDITIONAL_CALL 0 true 1228:0038 EXTERNAL FINDRESOURCE FINDRESOURCE +1008:14b8 FUN_1008_149d DATA 0 true Stack[-0xa] - +1008:14bb FUN_1008_149d DATA 0 true Stack[0x8] - +1008:14be FUN_1008_149d DATA 0 true Stack[-0xa] - +1008:14c1 FUN_1008_149d UNCONDITIONAL_CALL 0 true 1228:003c EXTERNAL LOADRESOURCE LOADRESOURCE +1008:14c6 FUN_1008_149d DATA 0 true Stack[-0x8] - +1008:14c9 FUN_1008_149d DATA 0 true Stack[-0x8] - +1008:14cc FUN_1008_149d UNCONDITIONAL_CALL 0 true 1228:0040 EXTERNAL LOCKRESOURCE LOCKRESOURCE +1008:14d1 FUN_1008_149d DATA 0 true Stack[-0x70] - +1008:14d4 FUN_1008_149d DATA 0 true Stack[-0x6e] - +1008:14d7 FUN_1008_149d DATA 1 true Stack[-0x70] - +1008:14dc FUN_1008_149d DATA 0 true Stack[-0x32] - +1008:14e3 FUN_1008_149d UNCONDITIONAL_CALL 0 true 1020:0891 Code5 FUN_1020_0891 FUN_1020_0891 +1008:14e8 FUN_1008_149d DATA 1 true Stack[-0x70] - +1008:14f1 FUN_1008_149d DATA 0 true Stack[-0x3a] - +1008:14f4 FUN_1008_149d DATA 0 true Stack[-0x38] - +1008:14f7 FUN_1008_149d DATA 1 true Stack[-0x24] - +1008:14fa FUN_1008_149d DATA 0 true Stack[-0x42] - +1008:1500 FUN_1008_149d DATA 1 true Stack[-0x42] - +1008:150b FUN_1008_149d DATA 0 true Stack[-0x40] - +1008:150e FUN_1008_149d DATA 0 true Stack[-0x40] - +1008:1511 FUN_1008_149d UNCONDITIONAL_CALL 0 true 1020:012d Code5 FUN_1020_012d FUN_1020_012d +1008:1516 FUN_1008_149d DATA 0 true Stack[-0x36] - +1008:1519 FUN_1008_149d DATA 0 true Stack[-0x34] - +1008:151c FUN_1008_149d DATA 0 true Stack[-0x32] - +1008:1521 FUN_1008_149d DATA 1 true Stack[-0x36] - +1008:1528 FUN_1008_149d UNCONDITIONAL_CALL 0 true 1020:0891 Code5 FUN_1020_0891 FUN_1020_0891 +1008:152d FUN_1008_149d DATA 1 true Stack[-0x36] - +1008:1532 FUN_1008_149d UNCONDITIONAL_CALL 0 true 1008:13a8 Code2 FUN_1008_13a8 FUN_1008_13a8 +1008:1548 FUN_1008_149d UNCONDITIONAL_CALL 0 true 1228:0160 EXTERNAL CREATEDC CREATEDC +1008:154d FUN_1008_149d DATA 0 true Stack[-0x3c] - +1008:1550 FUN_1008_149d DATA 0 true Stack[-0x3c] - +1008:1553 FUN_1008_149d READ 0 true 1028:444e Data6 DAT_1028_444e +1008:1559 FUN_1008_149d UNCONDITIONAL_CALL 0 true 1228:029c EXTERNAL SELECTPALETTE SELECTPALETTE +1008:155e FUN_1008_149d DATA 0 true Stack[-0x3e] - +1008:1561 FUN_1008_149d READ 0 true 1028:444e Data6 DAT_1028_444e +1008:1565 FUN_1008_149d UNCONDITIONAL_CALL 0 true 1228:0178 EXTERNAL UNREALIZEOBJECT UNREALIZEOBJECT +1008:156a FUN_1008_149d DATA 0 true Stack[-0x3c] - +1008:156d FUN_1008_149d UNCONDITIONAL_CALL 0 true 1228:02a0 EXTERNAL REALIZEPALETTE REALIZEPALETTE +1008:1572 FUN_1008_149d DATA 0 true Stack[-0x3c] - +1008:1575 FUN_1008_149d DATA 0 true Stack[-0x32] - +1008:157e FUN_1008_149d DATA 0 true Stack[-0x38] - +1008:1581 FUN_1008_149d DATA 0 true Stack[-0x3a] - +1008:1584 FUN_1008_149d DATA 1 true Stack[-0x36] - +1008:158b FUN_1008_149d UNCONDITIONAL_CALL 0 true 1228:0188 EXTERNAL CREATEDIBITMAP CREATEDIBITMAP +1008:1590 FUN_1008_149d DATA 0 true Stack[-0x6] - +1008:1593 FUN_1008_149d DATA 0 true Stack[-0x3c] - +1008:1596 FUN_1008_149d DATA 0 true Stack[-0x3e] - +1008:159b FUN_1008_149d UNCONDITIONAL_CALL 0 true 1228:029c EXTERNAL SELECTPALETTE SELECTPALETTE +1008:15a0 FUN_1008_149d DATA 0 true Stack[-0x3c] - +1008:15a3 FUN_1008_149d UNCONDITIONAL_CALL 0 true 1228:0164 EXTERNAL DELETEDC DELETEDC +1008:15a8 FUN_1008_149d DATA 0 true Stack[-0x8] - +1008:15ab FUN_1008_149d UNCONDITIONAL_CALL 0 true 1228:0010 EXTERNAL GLOBALUNLOCK GLOBALUNLOCK +1008:15b0 FUN_1008_149d DATA 0 true Stack[-0x8] - +1008:15b3 FUN_1008_149d UNCONDITIONAL_CALL 0 true 1228:0044 EXTERNAL FREERESOURCE FREERESOURCE +1008:15b8 FUN_1008_149d DATA 1 true Stack[-0x6] - +1008:15cc FUN_1008_15c7 DATA 0 true Stack[0x8] - +1008:15cf FUN_1008_15c7 DATA 0 true Stack[0x6] - +1008:15d2 FUN_1008_15c7 DATA 0 true Stack[0x4] - +1008:15d5 FUN_1008_15c7 UNCONDITIONAL_CALL 0 true 1228:0004 EXTERNAL GLOBALALLOC GLOBALALLOC +1008:15db FUN_1008_15c7 UNCONDITIONAL_CALL 0 true 1228:000c EXTERNAL GLOBALLOCK GLOBALLOCK +1008:15ec FUN_1008_15e7 DATA 0 true Stack[0x6] - +1008:15ef FUN_1008_15e7 UNCONDITIONAL_CALL 0 true 1228:0014 EXTERNAL GLOBALHANDLE GLOBALHANDLE +1008:15f6 FUN_1008_15e7 UNCONDITIONAL_CALL 0 true 1228:0010 EXTERNAL GLOBALUNLOCK GLOBALUNLOCK +1008:15fb FUN_1008_15e7 UNCONDITIONAL_CALL 0 true 1228:0008 EXTERNAL GLOBALFREE GLOBALFREE +1008:1611 FUN_1008_1607 UNCONDITIONAL_CALL 0 true 1020:03ef Code5 FUN_1020_03ef FUN_1020_03ef +1008:1616 FUN_1008_1607 CONDITIONAL_JUMP 0 true 1008:1682 Code2 LAB_1008_1682 +1008:1618 FUN_1008_1607 READ 0 true 1028:066a Data6 DAT_1028_066a +1008:161d FUN_1008_1607 CONDITIONAL_JUMP 0 true 1008:162b Code2 LAB_1008_162b +1008:161f FUN_1008_1607 DATA 0 true Stack[-0x8] - +1008:1624 FUN_1008_1607 DATA 0 true Stack[-0x6] - +1008:1629 FUN_1008_1607 UNCONDITIONAL_JUMP 0 true 1008:1635 Code2 LAB_1008_1635 +1008:162b FUN_1008_1607 DATA 0 true Stack[-0x8] - +1008:1630 FUN_1008_1607 DATA 0 true Stack[-0x6] - +1008:1635 FUN_1008_1607 DATA 0 true Stack[0x1a] - +1008:1638 FUN_1008_1607 DATA 0 true Stack[0x18] - +1008:163b FUN_1008_1607 DATA 0 true Stack[-0x6] - +1008:163e FUN_1008_1607 DATA 0 true Stack[-0x8] - +1008:1644 FUN_1008_1607 DATA 1 true Stack[0x4] - +1008:1649 FUN_1008_1607 UNCONDITIONAL_CALL 0 true 1008:2996 Code2 FUN_1008_2996 FUN_1008_2996 +1008:164e FUN_1008_1607 DATA 1 true Stack[0x14] - +1008:1651 FUN_1008_1607 DATA 1 true Stack[0x16] - +1008:1654 FUN_1008_1607 DATA 1 true Stack[0x4] - +1008:165f FUN_1008_1607 DATA 1 true Stack[0x10] - +1008:1662 FUN_1008_1607 DATA 1 true Stack[0x12] - +1008:166d FUN_1008_1607 DATA 1 true Stack[0xc] - +1008:1670 FUN_1008_1607 DATA 1 true Stack[0xe] - +1008:167b FUN_1008_1607 DATA 1 true Stack[0xa] - +1008:1682 FUN_1008_1607 DATA 1 true Stack[0x4] - +1008:1696 FUN_1008_168e DATA 1 true Stack[0x4] - +1008:16ab FUN_1008_168e UNCONDITIONAL_CALL 0 true 1228:021c EXTERNAL GETDLGITEMTEXT GETDLGITEMTEXT +1008:16b0 FUN_1008_168e DATA 0 true Stack[-0x5] - +1008:16b4 FUN_1008_168e DATA 1 true Stack[-0x5] - +1008:16c3 FUN_1008_16be DATA 1 true Stack[0x4] - +1008:16c8 FUN_1008_16be UNCONDITIONAL_CALL 0 true 1018:0d9b Code4 FUN_1018_0d9b FUN_1018_0d9b +1008:16cd FUN_1008_16be DATA 1 true Stack[0x4] - +1008:16dc FUN_1008_16be UNCONDITIONAL_CALL 0 true 1228:01cc EXTERNAL SETWINDOWTEXT SETWINDOWTEXT +1008:16e1 FUN_1008_16be DATA 1 true Stack[0x4] - +1008:16f2 FUN_1008_16be UNCONDITIONAL_CALL 0 true 1228:0218 EXTERNAL SETDLGITEMTEXT SETDLGITEMTEXT +1008:16f7 FUN_1008_16be DATA 1 true Stack[0x4] - +1008:1708 FUN_1008_16be UNCONDITIONAL_CALL 0 true 1228:0218 EXTERNAL SETDLGITEMTEXT SETDLGITEMTEXT +1008:170d FUN_1008_16be DATA 1 true Stack[0x4] - +1008:1723 FUN_1008_16be UNCONDITIONAL_CALL 0 true 1228:0220 EXTERNAL SENDDLGITEMMESSAGE SENDDLGITEMMESSAGE +1008:1735 FUN_1008_172f DATA 1 true Stack[0x4] - +1008:1738 FUN_1008_172f DATA 1 true Stack[0x2] - +1008:173b FUN_1008_172f CONDITIONAL_JUMP 0 true 1008:1745 Code2 LAB_1008_1745 +1008:173d FUN_1008_172f DATA 1 true Stack[0x4] - +1008:1740 FUN_1008_172f DATA 0 true Stack[-0x4] - +1008:1743 FUN_1008_172f UNCONDITIONAL_JUMP 0 true 1008:174b Code2 LAB_1008_174b +1008:1745 FUN_1008_172f DATA 1 true Stack[0x2] - +1008:1748 FUN_1008_172f DATA 0 true Stack[-0x4] - +1008:174b FUN_1008_172f DATA 1 true Stack[-0x4] - +1008:175a FUN_1008_1754 DATA 1 true Stack[0x4] - +1008:175d FUN_1008_1754 DATA 1 true Stack[0x2] - +1008:1760 FUN_1008_1754 CONDITIONAL_JUMP 0 true 1008:176a Code2 LAB_1008_176a +1008:1762 FUN_1008_1754 DATA 1 true Stack[0x4] - +1008:1765 FUN_1008_1754 DATA 0 true Stack[-0x4] - +1008:1768 FUN_1008_1754 UNCONDITIONAL_JUMP 0 true 1008:1770 Code2 LAB_1008_1770 +1008:176a FUN_1008_1754 DATA 1 true Stack[0x2] - +1008:176d FUN_1008_1754 DATA 0 true Stack[-0x4] - +1008:1770 FUN_1008_1754 DATA 1 true Stack[-0x4] - +1008:177c FUN_1008_1779 READ 0 true 1028:058f Data6 DAT_1028_058f +1008:1781 FUN_1008_1779 CONDITIONAL_JUMP 0 true 1008:1796 Code2 LAB_1008_1796 +1008:1783 FUN_1008_1779 READ 0 true 1028:0586 Data6 DAT_1028_0586 +1008:178c FUN_1008_1779 UNCONDITIONAL_CALL 0 true 1228:01d0 EXTERNAL BEGINPAINT BEGINPAINT +1008:1791 FUN_1008_1779 WRITE 0 true 1028:4ad4 Data6 DAT_1028_4ad4 +1008:1794 FUN_1008_1779 UNCONDITIONAL_JUMP 0 true 1008:17a2 Code2 LAB_1008_17a2 +1008:1796 FUN_1008_1779 READ 0 true 1028:0586 Data6 DAT_1028_0586 +1008:179a FUN_1008_1779 UNCONDITIONAL_CALL 0 true 1228:0200 EXTERNAL GETDC GETDC +1008:179f FUN_1008_1779 WRITE 0 true 1028:4ad4 Data6 DAT_1028_4ad4 +1008:17a2 FUN_1008_1779 READ 0 true 1028:4ad4 Data6 DAT_1028_4ad4 +1008:17aa FUN_1008_1779 UNCONDITIONAL_CALL 0 true 1228:016c EXTERNAL GETSTOCKOBJECT GETSTOCKOBJECT +1008:17b0 FUN_1008_1779 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1008:17b5 FUN_1008_1779 WRITE 0 true 1028:4af6 Data6 DAT_1028_4af6 +1008:17b8 FUN_1008_1779 READ 0 true 1028:4ad4 Data6 DAT_1028_4ad4 +1008:17c0 FUN_1008_1779 UNCONDITIONAL_CALL 0 true 1228:028c EXTERNAL GETSYSCOLOR GETSYSCOLOR +1008:17c7 FUN_1008_1779 UNCONDITIONAL_CALL 0 true 1228:0148 EXTERNAL SETTEXTCOLOR SETTEXTCOLOR +1008:17cc FUN_1008_1779 READ 0 true 1028:4ad4 Data6 DAT_1028_4ad4 +1008:17d4 FUN_1008_1779 UNCONDITIONAL_CALL 0 true 1228:028c EXTERNAL GETSYSCOLOR GETSYSCOLOR +1008:17db FUN_1008_1779 UNCONDITIONAL_CALL 0 true 1228:0140 EXTERNAL SETBKCOLOR SETBKCOLOR +1008:17e5 FUN_1008_17e2 READ 0 true 1028:4ad4 Data6 DAT_1028_4ad4 +1008:17e9 FUN_1008_17e2 READ 0 true 1028:4af6 Data6 DAT_1028_4af6 +1008:17ed FUN_1008_17e2 UNCONDITIONAL_CALL 0 true 1228:0154 EXTERNAL SELECTOBJECT SELECTOBJECT +1008:17f2 FUN_1008_17e2 READ 0 true 1028:058f Data6 DAT_1028_058f +1008:17f7 FUN_1008_17e2 CONDITIONAL_JUMP 0 true 1008:1809 Code2 LAB_1008_1809 +1008:17f9 FUN_1008_17e2 READ 0 true 1028:0586 Data6 DAT_1028_0586 +1008:1802 FUN_1008_17e2 UNCONDITIONAL_CALL 0 true 1228:01d4 EXTERNAL ENDPAINT ENDPAINT +1008:1807 FUN_1008_17e2 UNCONDITIONAL_JUMP 0 true 1008:1816 Code2 LAB_1008_1816 +1008:1809 FUN_1008_17e2 READ 0 true 1028:0586 Data6 DAT_1028_0586 +1008:180d FUN_1008_17e2 READ 0 true 1028:4ad4 Data6 DAT_1028_4ad4 +1008:1811 FUN_1008_17e2 UNCONDITIONAL_CALL 0 true 1228:0204 EXTERNAL RELEASEDC RELEASEDC +1008:181b FUN_1008_1818 READ 0 true 1028:0586 Data6 DAT_1028_0586 +1008:1822 FUN_1008_1818 READ 0 true 1028:4ace Data6 DAT_1028_4ace +1008:182a FUN_1008_1818 UNCONDITIONAL_CALL 0 true 1228:0268 EXTERNAL CREATECARET CREATECARET +1008:182f FUN_1008_1818 READ 1 true 1028:0544 Data6 DAT_1028_0544 +1008:1832 FUN_1008_1818 READ 1 true 1028:0548 Data6 DAT_1028_0548 +1008:1836 FUN_1008_1818 READ 0 true 1028:4ace Data6 DAT_1028_4ace +1008:183b FUN_1008_1818 READ 1 true 1028:0546 Data6 DAT_1028_0546 +1008:183e FUN_1008_1818 READ 1 true 1028:054a Data6 DAT_1028_054a +1008:1842 FUN_1008_1818 READ 0 true 1028:4ad0 Data6 DAT_1028_4ad0 +1008:1846 FUN_1008_1818 READ 1 true 1028:4ad2 Data6 DAT_1028_4ad2 +1008:184b FUN_1008_1818 UNCONDITIONAL_CALL 0 true 1228:0270 EXTERNAL SETCARETPOS SETCARETPOS +1008:1850 FUN_1008_1818 READ 0 true 1028:0586 Data6 DAT_1028_0586 +1008:1854 FUN_1008_1818 UNCONDITIONAL_CALL 0 true 1228:0274 EXTERNAL SHOWCARET SHOWCARET +1008:185e FUN_1008_185b UNCONDITIONAL_CALL 0 true 1228:026c EXTERNAL DESTROYCARET DESTROYCARET +1008:1868 FUN_1008_1865 READ 0 true 1028:0586 Data6 DAT_1028_0586 +1008:1876 FUN_1008_1865 READ 0 true 1028:4aca Data6 DAT_1028_4aca +1008:187a FUN_1008_1865 UNCONDITIONAL_CALL 0 true 1008:1754 Code2 FUN_1008_1754 FUN_1008_1754 +1008:1881 FUN_1008_1865 UNCONDITIONAL_CALL 0 true 1228:01fc EXTERNAL SETSCROLLRANGE SETSCROLLRANGE +1008:1886 FUN_1008_1865 READ 0 true 1028:0586 Data6 DAT_1028_0586 +1008:188d FUN_1008_1865 READ 0 true 1028:0548 Data6 DAT_1028_0548 +1008:1895 FUN_1008_1865 UNCONDITIONAL_CALL 0 true 1228:01f8 EXTERNAL SETSCROLLPOS SETSCROLLPOS +1008:189a FUN_1008_1865 READ 0 true 1028:0586 Data6 DAT_1028_0586 +1008:18a9 FUN_1008_1865 READ 0 true 1028:4acc Data6 DAT_1028_4acc +1008:18ad FUN_1008_1865 UNCONDITIONAL_CALL 0 true 1008:1754 Code2 FUN_1008_1754 FUN_1008_1754 +1008:18b4 FUN_1008_1865 UNCONDITIONAL_CALL 0 true 1228:01fc EXTERNAL SETSCROLLRANGE SETSCROLLRANGE +1008:18b9 FUN_1008_1865 READ 0 true 1028:0586 Data6 DAT_1028_0586 +1008:18c1 FUN_1008_1865 READ 0 true 1028:054a Data6 DAT_1028_054a +1008:18c9 FUN_1008_1865 UNCONDITIONAL_CALL 0 true 1228:01f8 EXTERNAL SETSCROLLPOS SETSCROLLPOS +1008:18d3 FUN_1008_18d0 READ 0 true 1028:058d Data6 DAT_1028_058d +1008:18d8 FUN_1008_18d0 CONDITIONAL_JUMP 0 true 1008:18e4 Code2 LAB_1008_18e4 +1008:18da FUN_1008_18d0 READ 0 true 1028:058e Data6 DAT_1028_058e +1008:18df FUN_1008_18d0 CONDITIONAL_JUMP 0 true 1008:18e4 Code2 LAB_1008_18e4 +1008:18e1 FUN_1008_18d0 UNCONDITIONAL_CALL 0 true 1008:185b Code2 FUN_1008_185b FUN_1008_185b +1008:18e7 FUN_1008_18d0 UNCONDITIONAL_CALL 0 true 1020:0061 Code5 FUN_1020_0061 FUN_1020_0061 +1008:18f3 FUN_1008_18ee READ 0 true 1028:058c Data6 DAT_1028_058c +1008:18f8 FUN_1008_18ee CONDITIONAL_JUMP 0 true 1008:18fd Code2 LAB_1008_18fd +1008:18fa FUN_1008_18ee UNCONDITIONAL_JUMP 0 true 1008:19b0 Code2 LAB_1008_19b0 +1008:1900 FUN_1008_18ee DATA 0 true Stack[0x6] - +1008:1903 FUN_1008_18ee READ 0 true 1028:4aca Data6 DAT_1028_4aca +1008:1907 FUN_1008_18ee UNCONDITIONAL_CALL 0 true 1008:172f Code2 FUN_1008_172f FUN_1008_172f +1008:190b FUN_1008_18ee UNCONDITIONAL_CALL 0 true 1008:1754 Code2 FUN_1008_1754 FUN_1008_1754 +1008:190e FUN_1008_18ee DATA 0 true Stack[0x6] - +1008:1914 FUN_1008_18ee DATA 0 true Stack[0x4] - +1008:1917 FUN_1008_18ee READ 0 true 1028:4acc Data6 DAT_1028_4acc +1008:191b FUN_1008_18ee UNCONDITIONAL_CALL 0 true 1008:172f Code2 FUN_1008_172f FUN_1008_172f +1008:191f FUN_1008_18ee UNCONDITIONAL_CALL 0 true 1008:1754 Code2 FUN_1008_1754 FUN_1008_1754 +1008:1922 FUN_1008_18ee DATA 0 true Stack[0x4] - +1008:1925 FUN_1008_18ee DATA 1 true Stack[0x6] - +1008:1928 FUN_1008_18ee READ 1 true 1028:0548 Data6 DAT_1028_0548 +1008:192c FUN_1008_18ee CONDITIONAL_JUMP 0 true 1008:1937 Code2 LAB_1008_1937 +1008:192e FUN_1008_18ee DATA 1 true Stack[0x4] - +1008:1931 FUN_1008_18ee READ 1 true 1028:054a Data6 DAT_1028_054a +1008:1935 FUN_1008_18ee CONDITIONAL_JUMP 0 true 1008:19b0 Code2 LAB_1008_19b0 +1008:1937 FUN_1008_18ee DATA 1 true Stack[0x6] - +1008:193a FUN_1008_18ee READ 1 true 1028:0548 Data6 DAT_1028_0548 +1008:193e FUN_1008_18ee CONDITIONAL_JUMP 0 true 1008:1953 Code2 LAB_1008_1953 +1008:1940 FUN_1008_18ee READ 0 true 1028:0586 Data6 DAT_1028_0586 +1008:1947 FUN_1008_18ee DATA 0 true Stack[0x6] - +1008:194e FUN_1008_18ee UNCONDITIONAL_CALL 0 true 1228:01f8 EXTERNAL SETSCROLLPOS SETSCROLLPOS +1008:1953 FUN_1008_18ee DATA 1 true Stack[0x4] - +1008:1956 FUN_1008_18ee READ 1 true 1028:054a Data6 DAT_1028_054a +1008:195a FUN_1008_18ee CONDITIONAL_JUMP 0 true 1008:1970 Code2 LAB_1008_1970 +1008:195c FUN_1008_18ee READ 0 true 1028:0586 Data6 DAT_1028_0586 +1008:1964 FUN_1008_18ee DATA 0 true Stack[0x4] - +1008:196b FUN_1008_18ee UNCONDITIONAL_CALL 0 true 1228:01f8 EXTERNAL SETSCROLLPOS SETSCROLLPOS +1008:1970 FUN_1008_18ee READ 0 true 1028:0586 Data6 DAT_1028_0586 +1008:1974 FUN_1008_18ee READ 1 true 1028:0548 Data6 DAT_1028_0548 +1008:1977 FUN_1008_18ee DATA 1 true Stack[0x6] - +1008:197a FUN_1008_18ee READ 0 true 1028:4ace Data6 DAT_1028_4ace +1008:197f FUN_1008_18ee READ 1 true 1028:054a Data6 DAT_1028_054a +1008:1982 FUN_1008_18ee DATA 1 true Stack[0x4] - +1008:1985 FUN_1008_18ee READ 0 true 1028:4ad0 Data6 DAT_1028_4ad0 +1008:1996 FUN_1008_18ee UNCONDITIONAL_CALL 0 true 1228:01f4 EXTERNAL SCROLLWINDOW SCROLLWINDOW +1008:199b FUN_1008_18ee DATA 1 true Stack[0x6] - +1008:199e FUN_1008_18ee WRITE 0 true 1028:0548 Data6 DAT_1028_0548 +1008:19a1 FUN_1008_18ee DATA 1 true Stack[0x4] - +1008:19a4 FUN_1008_18ee WRITE 0 true 1028:054a Data6 DAT_1028_054a +1008:19a7 FUN_1008_18ee READ 0 true 1028:0586 Data6 DAT_1028_0586 +1008:19ab FUN_1008_18ee UNCONDITIONAL_CALL 0 true 1228:024c EXTERNAL UPDATEWINDOW UPDATEWINDOW +1008:19bc FUN_1008_19b7 READ 1 true 1028:0544 Data6 DAT_1028_0544 +1008:19bf FUN_1008_19b7 READ 1 true 1028:4ac6 Data6 DAT_1028_4ac6 +1008:19c5 FUN_1008_19b7 READ 0 true 1028:0548 Data6 DAT_1028_0548 +1008:19c9 FUN_1008_19b7 READ 0 true 1028:0544 Data6 DAT_1028_0544 +1008:19cd FUN_1008_19b7 UNCONDITIONAL_CALL 0 true 1008:172f Code2 FUN_1008_172f FUN_1008_172f +1008:19d1 FUN_1008_19b7 UNCONDITIONAL_CALL 0 true 1008:1754 Code2 FUN_1008_1754 FUN_1008_1754 +1008:19d5 FUN_1008_19b7 READ 1 true 1028:0546 Data6 DAT_1028_0546 +1008:19d8 FUN_1008_19b7 READ 1 true 1028:4ac8 Data6 DAT_1028_4ac8 +1008:19de FUN_1008_19b7 READ 0 true 1028:054a Data6 DAT_1028_054a +1008:19e2 FUN_1008_19b7 READ 0 true 1028:0546 Data6 DAT_1028_0546 +1008:19e6 FUN_1008_19b7 UNCONDITIONAL_CALL 0 true 1008:172f Code2 FUN_1008_172f FUN_1008_172f +1008:19ea FUN_1008_19b7 UNCONDITIONAL_CALL 0 true 1008:1754 Code2 FUN_1008_1754 FUN_1008_1754 +1008:19ee FUN_1008_19b7 UNCONDITIONAL_CALL 0 true 1008:18ee Code2 FUN_1008_18ee FUN_1008_18ee +1008:19fe FUN_1008_19f8 READ 1 true 1028:0588 Data6 DAT_1028_0588 +1008:1a01 FUN_1008_19f8 DATA 0 true Stack[0x2] - +1008:1a04 FUN_1008_19f8 DATA 1 true Stack[0x2] - +1008:1a07 FUN_1008_19f8 READ 1 true 1028:0542 Data6 DAT_1028_0542 +1008:1a0b FUN_1008_19f8 CONDITIONAL_JUMP 0 true 1008:1a13 Code2 LAB_1008_1a13 +1008:1a0d FUN_1008_19f8 READ 1 true 1028:0542 Data6 DAT_1028_0542 +1008:1a10 FUN_1008_19f8 DATA 0 true Stack[0x2] - +1008:1a13 FUN_1008_19f8 DATA 1 true Stack[0x2] - +1008:1a16 FUN_1008_19f8 READ 0 true 1028:0540 Data6 DAT_1028_0540 +1008:1a1a FUN_1008_19f8 DATA 1 true Stack[0x4] - +1008:1a1d FUN_1008_19f8 READ 1 true 1028:4ac2 Data6 DAT_1028_4ac2 +1008:1a27 FUN_1008_19f8 DATA 0 true Stack[-0x6] - +1008:1a2a FUN_1008_19f8 DATA 0 true Stack[-0x4] - +1008:1a2d FUN_1008_19f8 DATA 1 true Stack[-0x6] - +1008:1a30 FUN_1008_19f8 DATA 1 true Stack[-0x4] - +1008:1a3c FUN_1008_1a39 DATA 1 true Stack[0x4] - +1008:1a3f FUN_1008_1a39 DATA 1 true Stack[0x2] - +1008:1a42 FUN_1008_1a39 CONDITIONAL_JUMP 0 true 1008:1a7e Code2 LAB_1008_1a7e +1008:1a44 FUN_1008_1a39 UNCONDITIONAL_CALL 0 true 1008:1779 Code2 FUN_1008_1779 FUN_1008_1779 +1008:1a47 FUN_1008_1a39 READ 0 true 1028:4ad4 Data6 DAT_1028_4ad4 +1008:1a4b FUN_1008_1a39 DATA 1 true Stack[0x4] - +1008:1a4e FUN_1008_1a39 READ 1 true 1028:0548 Data6 DAT_1028_0548 +1008:1a52 FUN_1008_1a39 READ 0 true 1028:4ace Data6 DAT_1028_4ace +1008:1a57 FUN_1008_1a39 READ 1 true 1028:0546 Data6 DAT_1028_0546 +1008:1a5a FUN_1008_1a39 READ 1 true 1028:054a Data6 DAT_1028_054a +1008:1a5e FUN_1008_1a39 READ 0 true 1028:4ad0 Data6 DAT_1028_4ad0 +1008:1a63 FUN_1008_1a39 DATA 0 true Stack[0x4] - +1008:1a66 FUN_1008_1a39 READ 0 true 1028:0546 Data6 DAT_1028_0546 +1008:1a6a FUN_1008_1a39 UNCONDITIONAL_CALL 0 true 1008:19f8 Code2 FUN_1008_19f8 FUN_1008_19f8 +1008:1a6f FUN_1008_1a39 DATA 1 true Stack[0x2] - +1008:1a72 FUN_1008_1a39 DATA 1 true Stack[0x4] - +1008:1a76 FUN_1008_1a39 UNCONDITIONAL_CALL 0 true 1228:014c EXTERNAL TEXTOUT TEXTOUT +1008:1a7b FUN_1008_1a39 UNCONDITIONAL_CALL 0 true 1008:17e2 Code2 FUN_1008_17e2 FUN_1008_17e2 +1008:1a85 FUN_1008_1a82 DATA 1 true Stack[0x2] - +1008:1a88 FUN_1008_1a82 DATA 0 true Stack[-0x4] - +1008:1a8c FUN_1008_1a82 DATA 0 true Stack[-0x6] - +1008:1a90 FUN_1008_1a82 UNCONDITIONAL_CALL 0 true 1008:1a39 Code2 FUN_1008_1a39 FUN_1008_1a39 +1008:1a93 FUN_1008_1a82 DATA 1 true Stack[0x2] - +1008:1aa4 FUN_1008_1a82 WRITE 0 true 1028:0544 Data6 DAT_1028_0544 +1008:1aa7 FUN_1008_1a82 READ_WRITE 0 true 1028:0546 Data6 DAT_1028_0546 +1008:1aab FUN_1008_1a82 READ 1 true 1028:0546 Data6 DAT_1028_0546 +1008:1aae FUN_1008_1a82 READ 1 true 1028:0542 Data6 DAT_1028_0542 +1008:1ab2 FUN_1008_1a82 CONDITIONAL_JUMP 0 true 1008:1b0d Code2 LAB_1008_1b0d +1008:1ab4 FUN_1008_1a82 READ_WRITE 0 true 1028:0546 Data6 DAT_1028_0546 +1008:1ab8 FUN_1008_1a82 READ_WRITE 0 true 1028:0588 Data6 DAT_1028_0588 +1008:1abc FUN_1008_1a82 READ 1 true 1028:0588 Data6 DAT_1028_0588 +1008:1abf FUN_1008_1a82 READ 1 true 1028:0542 Data6 DAT_1028_0542 +1008:1ac3 FUN_1008_1a82 CONDITIONAL_JUMP 0 true 1008:1aca Code2 LAB_1008_1aca +1008:1ac7 FUN_1008_1a82 WRITE 0 true 1028:0588 Data6 DAT_1028_0588 +1008:1acd FUN_1008_1a82 READ 0 true 1028:0546 Data6 DAT_1028_0546 +1008:1ad1 FUN_1008_1a82 UNCONDITIONAL_CALL 0 true 1008:19f8 Code2 FUN_1008_19f8 FUN_1008_19f8 +1008:1ada FUN_1008_1a82 READ 0 true 1028:0540 Data6 DAT_1028_0540 +1008:1ae1 FUN_1008_1a82 UNCONDITIONAL_CALL 0 true 1020:16c9 Code5 FUN_1020_16c9 FUN_1020_16c9 +1008:1ae6 FUN_1008_1a82 READ 0 true 1028:0586 Data6 DAT_1028_0586 +1008:1aed FUN_1008_1a82 READ 1 true 1028:4ad0 Data6 DAT_1028_4ad0 +1008:1aff FUN_1008_1a82 UNCONDITIONAL_CALL 0 true 1228:01f4 EXTERNAL SCROLLWINDOW SCROLLWINDOW +1008:1b04 FUN_1008_1a82 READ 0 true 1028:0586 Data6 DAT_1028_0586 +1008:1b08 FUN_1008_1a82 UNCONDITIONAL_CALL 0 true 1228:024c EXTERNAL UPDATEWINDOW UPDATEWINDOW +1008:1b19 FUN_1008_1b11 UNCONDITIONAL_CALL 0 true 1008:2442 Code2 FUN_1008_2442 FUN_1008_2442 +1008:1b1e FUN_1008_1b11 READ 1 true 1028:0544 Data6 DAT_1028_0544 +1008:1b21 FUN_1008_1b11 DATA 0 true Stack[-0x6] - +1008:1b24 FUN_1008_1b11 READ 1 true 1028:0544 Data6 DAT_1028_0544 +1008:1b27 FUN_1008_1b11 DATA 0 true Stack[-0x8] - +1008:1b2a FUN_1008_1b11 DATA 0 true Stack[0x4] - +1008:1b2e FUN_1008_1b11 CONDITIONAL_JUMP 0 true 1008:1b33 Code2 LAB_1008_1b33 +1008:1b30 FUN_1008_1b11 UNCONDITIONAL_JUMP 0 true 1008:1bcd Code2 LAB_1008_1bcd +1008:1b33 FUN_1008_1b11 DATA 1 true Stack[0x6] - +1008:1b3b FUN_1008_1b11 CONDITIONAL_JUMP 0 true 1008:1b7c Code2 LAB_1008_1b7c +1008:1b3f FUN_1008_1b11 CONDITIONAL_JUMP 0 true 1008:1b7c Code2 LAB_1008_1b7c +1008:1b41 FUN_1008_1b11 DATA 1 true Stack[0x6] - +1008:1b48 FUN_1008_1b11 READ 0 true 1028:0544 Data6 DAT_1028_0544 +1008:1b4c FUN_1008_1b11 READ 0 true 1028:0546 Data6 DAT_1028_0546 +1008:1b50 FUN_1008_1b11 UNCONDITIONAL_CALL 0 true 1008:19f8 Code2 FUN_1008_19f8 FUN_1008_19f8 +1008:1b5b FUN_1008_1b11 READ_WRITE 0 true 1028:0544 Data6 DAT_1028_0544 +1008:1b5f FUN_1008_1b11 READ 1 true 1028:0544 Data6 DAT_1028_0544 +1008:1b62 FUN_1008_1b11 DATA 1 true Stack[-0x8] - +1008:1b65 FUN_1008_1b11 CONDITIONAL_JUMP 0 true 1008:1b6d Code2 LAB_1008_1b6d +1008:1b67 FUN_1008_1b11 READ 1 true 1028:0544 Data6 DAT_1028_0544 +1008:1b6a FUN_1008_1b11 DATA 0 true Stack[-0x8] - +1008:1b6d FUN_1008_1b11 READ 1 true 1028:0544 Data6 DAT_1028_0544 +1008:1b70 FUN_1008_1b11 READ 1 true 1028:0540 Data6 DAT_1028_0540 +1008:1b74 FUN_1008_1b11 CONDITIONAL_JUMP 0 true 1008:1b7a Code2 LAB_1008_1b7a +1008:1b77 FUN_1008_1b11 UNCONDITIONAL_CALL 0 true 1008:1a82 Code2 FUN_1008_1a82 FUN_1008_1a82 +1008:1b7a FUN_1008_1b11 UNCONDITIONAL_JUMP 0 true 1008:1bc4 Code2 LAB_1008_1bc4 +1008:1b7e FUN_1008_1b11 CONDITIONAL_JUMP 0 true 1008:1b86 Code2 LAB_1008_1b86 +1008:1b81 FUN_1008_1b11 UNCONDITIONAL_CALL 0 true 1008:1a82 Code2 FUN_1008_1a82 FUN_1008_1a82 +1008:1b84 FUN_1008_1b11 UNCONDITIONAL_JUMP 0 true 1008:1bc4 Code2 LAB_1008_1bc4 +1008:1b88 FUN_1008_1b11 CONDITIONAL_JUMP 0 true 1008:1bb8 Code2 LAB_1008_1bb8 +1008:1b8a FUN_1008_1b11 READ 0 true 1028:0544 Data6 DAT_1028_0544 +1008:1b8f FUN_1008_1b11 CONDITIONAL_JUMP 0 true 1008:1bb6 Code2 LAB_1008_1bb6 +1008:1b91 FUN_1008_1b11 READ_WRITE 0 true 1028:0544 Data6 DAT_1028_0544 +1008:1b95 FUN_1008_1b11 READ 0 true 1028:0544 Data6 DAT_1028_0544 +1008:1b99 FUN_1008_1b11 READ 0 true 1028:0546 Data6 DAT_1028_0546 +1008:1b9d FUN_1008_1b11 UNCONDITIONAL_CALL 0 true 1008:19f8 Code2 FUN_1008_19f8 FUN_1008_19f8 +1008:1ba8 FUN_1008_1b11 READ 1 true 1028:0544 Data6 DAT_1028_0544 +1008:1bab FUN_1008_1b11 DATA 1 true Stack[-0x6] - +1008:1bae FUN_1008_1b11 CONDITIONAL_JUMP 0 true 1008:1bb6 Code2 LAB_1008_1bb6 +1008:1bb0 FUN_1008_1b11 READ 1 true 1028:0544 Data6 DAT_1028_0544 +1008:1bb3 FUN_1008_1b11 DATA 0 true Stack[-0x6] - +1008:1bb6 FUN_1008_1b11 UNCONDITIONAL_JUMP 0 true 1008:1bc4 Code2 LAB_1008_1bc4 +1008:1bba FUN_1008_1b11 CONDITIONAL_JUMP 0 true 1008:1bc4 Code2 LAB_1008_1bc4 +1008:1bbf FUN_1008_1b11 UNCONDITIONAL_CALL 0 true 1228:0224 EXTERNAL MESSAGEBEEP MESSAGEBEEP +1008:1bc4 FUN_1008_1b11 DATA 0 true Stack[0x6] - +1008:1bc7 FUN_1008_1b11 DATA 0 true Stack[0x4] - +1008:1bca FUN_1008_1b11 UNCONDITIONAL_JUMP 0 true 1008:1b2a Code2 LAB_1008_1b2a +1008:1bcd FUN_1008_1b11 DATA 0 true Stack[-0x6] - +1008:1bd0 FUN_1008_1b11 DATA 0 true Stack[-0x8] - +1008:1bd3 FUN_1008_1b11 UNCONDITIONAL_CALL 0 true 1008:1a39 Code2 FUN_1008_1a39 FUN_1008_1a39 +1008:1bd6 FUN_1008_1b11 READ 0 true 1028:055e Data6 DAT_1028_055e +1008:1bdb FUN_1008_1b11 CONDITIONAL_JUMP 0 true 1008:1be2 Code2 LAB_1008_1be2 +1008:1bdd FUN_1008_1b11 UNCONDITIONAL_CALL 0 true 1008:19b7 Code2 FUN_1008_19b7 FUN_1008_19b7 +1008:1bee FUN_1008_1be9 DATA 0 true Stack[0x4] - +1008:1bf7 FUN_1008_1be9 UNCONDITIONAL_CALL 0 true 1008:1b11 Code2 FUN_1008_1b11 FUN_1008_1b11 +1008:1c0b FUN_1008_1c03 UNCONDITIONAL_CALL 0 true 1008:2442 Code2 FUN_1008_2442 FUN_1008_2442 +1008:1c10 FUN_1008_1c03 DATA 0 true Stack[-0x18] - +1008:1c22 FUN_1008_1c03 UNCONDITIONAL_CALL 0 true 1228:0234 EXTERNAL PEEKMESSAGE PEEKMESSAGE +1008:1c29 FUN_1008_1c03 CONDITIONAL_JUMP 0 true 1008:1c4a Code2 LAB_1008_1c4a +1008:1c2b FUN_1008_1c03 DATA 0 true Stack[-0x16] - +1008:1c2f FUN_1008_1c03 CONDITIONAL_JUMP 0 true 1008:1c34 Code2 LAB_1008_1c34 +1008:1c31 FUN_1008_1c03 UNCONDITIONAL_CALL 0 true 1008:18d0 Code2 FUN_1008_18d0 FUN_1008_18d0 +1008:1c34 FUN_1008_1c03 DATA 0 true Stack[-0x18] - +1008:1c39 FUN_1008_1c03 UNCONDITIONAL_CALL 0 true 1228:0240 EXTERNAL TRANSLATEMESSAGE TRANSLATEMESSAGE +1008:1c3e FUN_1008_1c03 DATA 0 true Stack[-0x18] - +1008:1c43 FUN_1008_1c03 UNCONDITIONAL_CALL 0 true 1228:0244 EXTERNAL DISPATCHMESSAGE DISPATCHMESSAGE +1008:1c48 FUN_1008_1c03 UNCONDITIONAL_JUMP 0 true 1008:1c10 Code2 LAB_1008_1c10 +1008:1c4a FUN_1008_1c03 READ 0 true 1028:058a Data6 DAT_1028_058a +1008:1c51 FUN_1008_1c03 CONDITIONAL_JUMP 0 true 1008:1c54 Code2 LAB_1008_1c54 +1008:1c54 FUN_1008_1c03 DATA 0 true Stack[-0x5] - +1008:1c57 FUN_1008_1c03 DATA 1 true Stack[-0x5] - +1008:1c67 FUN_1008_1c5f UNCONDITIONAL_CALL 0 true 1008:19b7 Code2 FUN_1008_19b7 FUN_1008_19b7 +1008:1c6c FUN_1008_1c5f UNCONDITIONAL_CALL 0 true 1008:1c03 Code2 FUN_1008_1c03 FUN_1008_1c03 +1008:1c73 FUN_1008_1c5f CONDITIONAL_JUMP 0 true 1008:1ca1 Code2 LAB_1008_1ca1 +1008:1c75 FUN_1008_1c5f WRITE 0 true 1028:058e Data6 DAT_1028_058e +1008:1c7a FUN_1008_1c5f READ 0 true 1028:058d Data6 DAT_1028_058d +1008:1c7f FUN_1008_1c5f CONDITIONAL_JUMP 0 true 1008:1c84 Code2 LAB_1008_1c84 +1008:1c81 FUN_1008_1c5f UNCONDITIONAL_CALL 0 true 1008:1818 Code2 FUN_1008_1818 FUN_1008_1818 +1008:1c84 FUN_1008_1c5f UNCONDITIONAL_CALL 0 true 1228:023c EXTERNAL WAITMESSAGE WAITMESSAGE +1008:1c89 FUN_1008_1c5f UNCONDITIONAL_CALL 0 true 1008:1c03 Code2 FUN_1008_1c03 FUN_1008_1c03 +1008:1c90 FUN_1008_1c5f CONDITIONAL_JUMP 0 true 1008:1c84 Code2 LAB_1008_1c84 +1008:1c92 FUN_1008_1c5f READ 0 true 1028:058d Data6 DAT_1028_058d +1008:1c97 FUN_1008_1c5f CONDITIONAL_JUMP 0 true 1008:1c9c Code2 LAB_1008_1c9c +1008:1c99 FUN_1008_1c5f UNCONDITIONAL_CALL 0 true 1008:185b Code2 FUN_1008_185b FUN_1008_185b +1008:1c9c FUN_1008_1c5f WRITE 0 true 1028:058e Data6 DAT_1028_058e +1008:1ca1 FUN_1008_1c5f READ 1 true 1028:4af8 Data6 DAT_1028_4af8 +1008:1ca4 FUN_1008_1c5f DATA 0 true Stack[-0x5] - +1008:1ca7 FUN_1008_1c5f READ_WRITE 0 true 1028:058a Data6 DAT_1028_058a +1008:1cb5 FUN_1008_1c5f READ 0 true 1028:058a Data6 DAT_1028_058a +1008:1cb9 FUN_1008_1c5f UNCONDITIONAL_CALL 0 true 1020:16a5 Code5 FUN_1020_16a5 FUN_1020_16a5 +1008:1cbe FUN_1008_1c5f DATA 1 true Stack[-0x5] - +1008:1cd0 FUN_1008_1cc6 DATA 0 true Stack[-0xa] - +1008:1cd3 FUN_1008_1cc6 UNCONDITIONAL_CALL 0 true 1008:1c5f Code2 FUN_1008_1c5f FUN_1008_1c5f +1008:1cd8 FUN_1008_1cc6 DATA 0 true Stack[-0x7] - +1008:1cdb FUN_1008_1cc6 DATA 1 true Stack[-0x7] - +1008:1ce0 FUN_1008_1cc6 CONDITIONAL_JUMP 0 true 1008:1cf5 Code2 LAB_1008_1cf5 +1008:1ce2 FUN_1008_1cc6 DATA 0 true Stack[-0xa] - +1008:1ce6 FUN_1008_1cc6 CONDITIONAL_JUMP 0 true 1008:1cf3 Code2 LAB_1008_1cf3 +1008:1ce8 FUN_1008_1cc6 DATA 0 true Stack[-0xa] - +1008:1cee FUN_1008_1cc6 UNCONDITIONAL_CALL 0 true 1008:1be9 Code2 FUN_1008_1be9 FUN_1008_1be9 +1008:1cf3 FUN_1008_1cc6 UNCONDITIONAL_JUMP 0 true 1008:1d21 Code2 LAB_1008_1d21 +1008:1cf7 FUN_1008_1cc6 CONDITIONAL_JUMP 0 true 1008:1d21 Code2 LAB_1008_1d21 +1008:1cfb FUN_1008_1cc6 CONDITIONAL_JUMP 0 true 1008:1d21 Code2 LAB_1008_1d21 +1008:1cfd FUN_1008_1cc6 DATA 1 true Stack[0x4] - +1008:1d02 FUN_1008_1cc6 DATA 1 true Stack[-0xa] - +1008:1d05 FUN_1008_1cc6 CONDITIONAL_JUMP 0 true 1008:1d21 Code2 LAB_1008_1d21 +1008:1d07 FUN_1008_1cc6 DATA 1 true Stack[-0x7] - +1008:1d0a FUN_1008_1cc6 DATA 1 true Stack[-0xa] - +1008:1d0d FUN_1008_1cc6 DATA 1 true Stack[0x6] - +1008:1d15 FUN_1008_1cc6 DATA 0 true Stack[-0xa] - +1008:1d18 FUN_1008_1cc6 DATA 1 true Stack[-0x7] - +1008:1d1c FUN_1008_1cc6 UNCONDITIONAL_CALL 0 true 1008:1be9 Code2 FUN_1008_1be9 FUN_1008_1be9 +1008:1d21 FUN_1008_1cc6 DATA 0 true Stack[-0x7] - +1008:1d25 FUN_1008_1cc6 CONDITIONAL_JUMP 0 true 1008:1d34 Code2 LAB_1008_1d34 +1008:1d27 FUN_1008_1cc6 READ 0 true 1028:055f Data6 DAT_1028_055f +1008:1d2c FUN_1008_1cc6 CONDITIONAL_JUMP 0 true 1008:1cd3 Code2 LAB_1008_1cd3 +1008:1d2e FUN_1008_1cc6 DATA 0 true Stack[-0x7] - +1008:1d32 FUN_1008_1cc6 CONDITIONAL_JUMP 0 true 1008:1cd3 Code2 LAB_1008_1cd3 +1008:1d34 FUN_1008_1cc6 DATA 1 true Stack[-0x7] - +1008:1d37 FUN_1008_1cc6 DATA 1 true Stack[-0xa] - +1008:1d3a FUN_1008_1cc6 DATA 1 true Stack[0x6] - +1008:1d42 FUN_1008_1cc6 DATA 0 true Stack[-0xa] - +1008:1d45 FUN_1008_1cc6 DATA 0 true Stack[-0x7] - +1008:1d49 FUN_1008_1cc6 CONDITIONAL_JUMP 0 true 1008:1d62 Code2 LAB_1008_1d62 +1008:1d4b FUN_1008_1cc6 DATA 1 true Stack[-0xa] - +1008:1d4e FUN_1008_1cc6 DATA 1 true Stack[0x6] - +1008:1d57 FUN_1008_1cc6 DATA 0 true Stack[-0xa] - +1008:1d5d FUN_1008_1cc6 UNCONDITIONAL_CALL 0 true 1008:1be9 Code2 FUN_1008_1be9 FUN_1008_1be9 +1008:1d62 FUN_1008_1cc6 UNCONDITIONAL_CALL 0 true 1008:19b7 Code2 FUN_1008_19b7 FUN_1008_19b7 +1008:1d67 FUN_1008_1cc6 DATA 1 true Stack[-0xa] - +1008:1d6a FUN_1008_1cc6 DATA 0 true Stack[-0x6] - +1008:1d6d FUN_1008_1cc6 DATA 1 true Stack[-0x6] - +1008:1d7a FUN_1008_1d77 WRITE 0 true 1028:058c Data6 DAT_1028_058c +1008:1d7f FUN_1008_1d77 READ 1 true 1028:0540 Data6 DAT_1028_0540 +1008:1d82 FUN_1008_1d77 READ 0 true 1028:0542 Data6 DAT_1028_0542 +1008:1d87 FUN_1008_1d77 UNCONDITIONAL_CALL 0 true 1020:012d Code5 FUN_1020_012d FUN_1020_012d +1008:1d8c FUN_1008_1d77 WRITE 0 true 1028:4ac2 Data6 DAT_1028_4ac2 +1008:1d8f FUN_1008_1d77 WRITE 0 true 1028:4ac4 Data6 DAT_1028_4ac4 +1008:1d93 FUN_1008_1d77 READ 1 true 1028:4ac2 Data6 DAT_1028_4ac2 +1008:1d99 FUN_1008_1d77 READ 1 true 1028:0540 Data6 DAT_1028_0540 +1008:1d9c FUN_1008_1d77 READ 0 true 1028:0542 Data6 DAT_1028_0542 +1008:1da4 FUN_1008_1d77 UNCONDITIONAL_CALL 0 true 1020:16c9 Code5 FUN_1020_16c9 FUN_1020_16c9 +1008:1da9 FUN_1008_1d77 READ 0 true 1028:0560 Data6 DAT_1028_0560 +1008:1dae FUN_1008_1d77 CONDITIONAL_JUMP 0 true 1008:1dca Code2 LAB_1008_1dca +1008:1db0 FUN_1008_1d77 READ 0 true 1028:0586 Data6 DAT_1028_0586 +1008:1db7 FUN_1008_1d77 UNCONDITIONAL_CALL 0 true 1228:0264 EXTERNAL GETSYSTEMMENU GETSYSTEMMENU +1008:1dc5 FUN_1008_1d77 UNCONDITIONAL_CALL 0 true 1228:0260 EXTERNAL ENABLEMENUITEM ENABLEMENUITEM +1008:1dd2 FUN_1008_1dcc WRITE 0 true 1028:058f Data6 DAT_1028_058f +1008:1dd7 FUN_1008_1dcc UNCONDITIONAL_CALL 0 true 1008:1779 Code2 FUN_1008_1779 FUN_1008_1779 +1008:1ddd FUN_1008_1dcc READ 1 true 1028:4ada Data6 DAT_1028_4ada +1008:1de1 FUN_1008_1dcc READ 0 true 1028:4ace Data6 DAT_1028_4ace +1008:1de5 FUN_1008_1dcc READ 1 true 1028:0548 Data6 DAT_1028_0548 +1008:1dea FUN_1008_1dcc UNCONDITIONAL_CALL 0 true 1008:1754 Code2 FUN_1008_1754 FUN_1008_1754 +1008:1ded FUN_1008_1dcc DATA 0 true Stack[-0x4] - +1008:1df0 FUN_1008_1dcc READ 0 true 1028:0540 Data6 DAT_1028_0540 +1008:1df4 FUN_1008_1dcc READ 1 true 1028:4ade Data6 DAT_1028_4ade +1008:1df7 FUN_1008_1dcc READ 1 true 1028:4ace Data6 DAT_1028_4ace +1008:1dfd FUN_1008_1dcc READ 0 true 1028:4ace Data6 DAT_1028_4ace +1008:1e01 FUN_1008_1dcc READ 1 true 1028:0548 Data6 DAT_1028_0548 +1008:1e06 FUN_1008_1dcc UNCONDITIONAL_CALL 0 true 1008:172f Code2 FUN_1008_172f FUN_1008_172f +1008:1e09 FUN_1008_1dcc DATA 0 true Stack[-0x6] - +1008:1e0f FUN_1008_1dcc READ 1 true 1028:4adc Data6 DAT_1028_4adc +1008:1e13 FUN_1008_1dcc READ 0 true 1028:4ad0 Data6 DAT_1028_4ad0 +1008:1e17 FUN_1008_1dcc READ 1 true 1028:054a Data6 DAT_1028_054a +1008:1e1c FUN_1008_1dcc UNCONDITIONAL_CALL 0 true 1008:1754 Code2 FUN_1008_1754 FUN_1008_1754 +1008:1e1f FUN_1008_1dcc DATA 0 true Stack[-0x8] - +1008:1e22 FUN_1008_1dcc READ 0 true 1028:0542 Data6 DAT_1028_0542 +1008:1e26 FUN_1008_1dcc READ 1 true 1028:4ae0 Data6 DAT_1028_4ae0 +1008:1e29 FUN_1008_1dcc READ 1 true 1028:4ad0 Data6 DAT_1028_4ad0 +1008:1e2f FUN_1008_1dcc READ 0 true 1028:4ad0 Data6 DAT_1028_4ad0 +1008:1e33 FUN_1008_1dcc READ 1 true 1028:054a Data6 DAT_1028_054a +1008:1e38 FUN_1008_1dcc UNCONDITIONAL_CALL 0 true 1008:172f Code2 FUN_1008_172f FUN_1008_172f +1008:1e3b FUN_1008_1dcc DATA 0 true Stack[-0xa] - +1008:1e3e FUN_1008_1dcc DATA 1 true Stack[-0x8] - +1008:1e41 FUN_1008_1dcc DATA 1 true Stack[-0xa] - +1008:1e44 FUN_1008_1dcc CONDITIONAL_JUMP 0 true 1008:1e7e Code2 LAB_1008_1e7e +1008:1e46 FUN_1008_1dcc READ 0 true 1028:4ad4 Data6 DAT_1028_4ad4 +1008:1e4a FUN_1008_1dcc DATA 1 true Stack[-0x4] - +1008:1e4d FUN_1008_1dcc READ 1 true 1028:0548 Data6 DAT_1028_0548 +1008:1e51 FUN_1008_1dcc READ 0 true 1028:4ace Data6 DAT_1028_4ace +1008:1e56 FUN_1008_1dcc DATA 1 true Stack[-0x8] - +1008:1e59 FUN_1008_1dcc READ 1 true 1028:054a Data6 DAT_1028_054a +1008:1e5d FUN_1008_1dcc READ 0 true 1028:4ad0 Data6 DAT_1028_4ad0 +1008:1e62 FUN_1008_1dcc DATA 0 true Stack[-0x4] - +1008:1e65 FUN_1008_1dcc DATA 0 true Stack[-0x8] - +1008:1e68 FUN_1008_1dcc UNCONDITIONAL_CALL 0 true 1008:19f8 Code2 FUN_1008_19f8 FUN_1008_19f8 +1008:1e6d FUN_1008_1dcc DATA 1 true Stack[-0x6] - +1008:1e70 FUN_1008_1dcc DATA 1 true Stack[-0x4] - +1008:1e74 FUN_1008_1dcc UNCONDITIONAL_CALL 0 true 1228:014c EXTERNAL TEXTOUT TEXTOUT +1008:1e79 FUN_1008_1dcc DATA 0 true Stack[-0x8] - +1008:1e7c FUN_1008_1dcc UNCONDITIONAL_JUMP 0 true 1008:1e3e Code2 LAB_1008_1e3e +1008:1e7e FUN_1008_1dcc UNCONDITIONAL_CALL 0 true 1008:17e2 Code2 FUN_1008_17e2 FUN_1008_17e2 +1008:1e81 FUN_1008_1dcc WRITE 0 true 1028:058f Data6 DAT_1028_058f +1008:1e90 FUN_1008_1e8a DATA 1 true Stack[0x2] - +1008:1e9a FUN_1008_1e8a CONDITIONAL_JUMP 0 true 1008:1ea5 Code2 LAB_1008_1ea5 +1008:1e9c FUN_1008_1e8a DATA 1 true Stack[0x8] - +1008:1ea0 FUN_1008_1e8a DATA 0 true Stack[-0x4] - +1008:1ea3 FUN_1008_1e8a UNCONDITIONAL_JUMP 0 true 1008:1f03 Code2 LAB_1008_1f03 +1008:1ea8 FUN_1008_1e8a CONDITIONAL_JUMP 0 true 1008:1eb3 Code2 LAB_1008_1eb3 +1008:1eaa FUN_1008_1e8a DATA 1 true Stack[0x8] - +1008:1eae FUN_1008_1e8a DATA 0 true Stack[-0x4] - +1008:1eb1 FUN_1008_1e8a UNCONDITIONAL_JUMP 0 true 1008:1f03 Code2 LAB_1008_1f03 +1008:1eb6 FUN_1008_1e8a CONDITIONAL_JUMP 0 true 1008:1ec3 Code2 LAB_1008_1ec3 +1008:1eb8 FUN_1008_1e8a DATA 1 true Stack[0x8] - +1008:1ebb FUN_1008_1e8a DATA 1 true Stack[0x6] - +1008:1ebe FUN_1008_1e8a DATA 0 true Stack[-0x4] - +1008:1ec1 FUN_1008_1e8a UNCONDITIONAL_JUMP 0 true 1008:1f03 Code2 LAB_1008_1f03 +1008:1ec6 FUN_1008_1e8a CONDITIONAL_JUMP 0 true 1008:1ed3 Code2 LAB_1008_1ed3 +1008:1ec8 FUN_1008_1e8a DATA 1 true Stack[0x8] - +1008:1ecb FUN_1008_1e8a DATA 1 true Stack[0x6] - +1008:1ece FUN_1008_1e8a DATA 0 true Stack[-0x4] - +1008:1ed1 FUN_1008_1e8a UNCONDITIONAL_JUMP 0 true 1008:1f03 Code2 LAB_1008_1f03 +1008:1ed6 FUN_1008_1e8a CONDITIONAL_JUMP 0 true 1008:1edf Code2 LAB_1008_1edf +1008:1eda FUN_1008_1e8a DATA 0 true Stack[-0x4] - +1008:1edd FUN_1008_1e8a UNCONDITIONAL_JUMP 0 true 1008:1f03 Code2 LAB_1008_1f03 +1008:1ee2 FUN_1008_1e8a CONDITIONAL_JUMP 0 true 1008:1eec Code2 LAB_1008_1eec +1008:1ee4 FUN_1008_1e8a DATA 1 true Stack[0x4] - +1008:1ee7 FUN_1008_1e8a DATA 0 true Stack[-0x4] - +1008:1eea FUN_1008_1e8a UNCONDITIONAL_JUMP 0 true 1008:1f03 Code2 LAB_1008_1f03 +1008:1eef FUN_1008_1e8a CONDITIONAL_JUMP 0 true 1008:1efd Code2 LAB_1008_1efd +1008:1ef1 FUN_1008_1e8a DATA 1 true Stack[0x2] - +1008:1ef8 FUN_1008_1e8a DATA 0 true Stack[-0x4] - +1008:1efb FUN_1008_1e8a UNCONDITIONAL_JUMP 0 true 1008:1f03 Code2 LAB_1008_1f03 +1008:1efd FUN_1008_1e8a DATA 1 true Stack[0x8] - +1008:1f00 FUN_1008_1e8a DATA 0 true Stack[-0x4] - +1008:1f03 FUN_1008_1e8a DATA 1 true Stack[-0x4] - +1008:1f12 FUN_1008_1f0c READ 1 true 1028:0548 Data6 DAT_1028_0548 +1008:1f15 FUN_1008_1f0c DATA 0 true Stack[-0x4] - +1008:1f18 FUN_1008_1f0c READ 1 true 1028:054a Data6 DAT_1028_054a +1008:1f1b FUN_1008_1f0c DATA 0 true Stack[-0x6] - +1008:1f1e FUN_1008_1f0c DATA 1 true Stack[0x6] - +1008:1f24 FUN_1008_1f0c CONDITIONAL_JUMP 0 true 1008:1f40 Code2 LAB_1008_1f40 +1008:1f26 FUN_1008_1f0c DATA 0 true Stack[-0x4] - +1008:1f29 FUN_1008_1f0c READ 1 true 1028:4ac6 Data6 DAT_1028_4ac6 +1008:1f33 FUN_1008_1f0c READ 0 true 1028:4aca Data6 DAT_1028_4aca +1008:1f38 FUN_1008_1f0c UNCONDITIONAL_CALL 0 true 1008:1e8a Code2 FUN_1008_1e8a FUN_1008_1e8a +1008:1f3b FUN_1008_1f0c DATA 0 true Stack[-0x4] - +1008:1f3e FUN_1008_1f0c UNCONDITIONAL_JUMP 0 true 1008:1f57 Code2 LAB_1008_1f57 +1008:1f43 FUN_1008_1f0c CONDITIONAL_JUMP 0 true 1008:1f57 Code2 LAB_1008_1f57 +1008:1f45 FUN_1008_1f0c DATA 0 true Stack[-0x6] - +1008:1f48 FUN_1008_1f0c READ 0 true 1028:4ac8 Data6 DAT_1028_4ac8 +1008:1f4c FUN_1008_1f0c READ 0 true 1028:4acc Data6 DAT_1028_4acc +1008:1f51 FUN_1008_1f0c UNCONDITIONAL_CALL 0 true 1008:1e8a Code2 FUN_1008_1e8a FUN_1008_1e8a +1008:1f54 FUN_1008_1f0c DATA 0 true Stack[-0x6] - +1008:1f57 FUN_1008_1f0c DATA 0 true Stack[-0x4] - +1008:1f5a FUN_1008_1f0c DATA 0 true Stack[-0x6] - +1008:1f5d FUN_1008_1f0c UNCONDITIONAL_CALL 0 true 1008:18ee Code2 FUN_1008_18ee FUN_1008_18ee +1008:1f6b FUN_1008_1f68 READ 0 true 1028:058d Data6 DAT_1028_058d +1008:1f70 FUN_1008_1f68 CONDITIONAL_JUMP 0 true 1008:1f7c Code2 LAB_1008_1f7c +1008:1f72 FUN_1008_1f68 READ 0 true 1028:058e Data6 DAT_1028_058e +1008:1f77 FUN_1008_1f68 CONDITIONAL_JUMP 0 true 1008:1f7c Code2 LAB_1008_1f7c +1008:1f79 FUN_1008_1f68 UNCONDITIONAL_CALL 0 true 1008:185b Code2 FUN_1008_185b FUN_1008_185b +1008:1f7c FUN_1008_1f68 DATA 1 true Stack[0x4] - +1008:1f80 FUN_1008_1f68 READ 0 true 1028:4ace Data6 DAT_1028_4ace +1008:1f84 FUN_1008_1f68 WRITE 0 true 1028:4ac6 Data6 DAT_1028_4ac6 +1008:1f87 FUN_1008_1f68 DATA 1 true Stack[0x2] - +1008:1f8b FUN_1008_1f68 READ 0 true 1028:4ad0 Data6 DAT_1028_4ad0 +1008:1f8f FUN_1008_1f68 WRITE 0 true 1028:4ac8 Data6 DAT_1028_4ac8 +1008:1f95 FUN_1008_1f68 READ 1 true 1028:0540 Data6 DAT_1028_0540 +1008:1f98 FUN_1008_1f68 READ 1 true 1028:4ac6 Data6 DAT_1028_4ac6 +1008:1f9d FUN_1008_1f68 UNCONDITIONAL_CALL 0 true 1008:1754 Code2 FUN_1008_1754 FUN_1008_1754 +1008:1fa0 FUN_1008_1f68 WRITE 0 true 1028:4aca Data6 DAT_1028_4aca +1008:1fa6 FUN_1008_1f68 READ 1 true 1028:0542 Data6 DAT_1028_0542 +1008:1fa9 FUN_1008_1f68 READ 1 true 1028:4ac8 Data6 DAT_1028_4ac8 +1008:1fae FUN_1008_1f68 UNCONDITIONAL_CALL 0 true 1008:1754 Code2 FUN_1008_1754 FUN_1008_1754 +1008:1fb1 FUN_1008_1f68 WRITE 0 true 1028:4acc Data6 DAT_1028_4acc +1008:1fb4 FUN_1008_1f68 READ 0 true 1028:0548 Data6 DAT_1028_0548 +1008:1fb8 FUN_1008_1f68 READ 0 true 1028:4aca Data6 DAT_1028_4aca +1008:1fbc FUN_1008_1f68 UNCONDITIONAL_CALL 0 true 1008:172f Code2 FUN_1008_172f FUN_1008_172f +1008:1fbf FUN_1008_1f68 WRITE 0 true 1028:0548 Data6 DAT_1028_0548 +1008:1fc2 FUN_1008_1f68 READ 0 true 1028:054a Data6 DAT_1028_054a +1008:1fc6 FUN_1008_1f68 READ 0 true 1028:4acc Data6 DAT_1028_4acc +1008:1fca FUN_1008_1f68 UNCONDITIONAL_CALL 0 true 1008:172f Code2 FUN_1008_172f FUN_1008_172f +1008:1fcd FUN_1008_1f68 WRITE 0 true 1028:054a Data6 DAT_1028_054a +1008:1fd0 FUN_1008_1f68 UNCONDITIONAL_CALL 0 true 1008:1865 Code2 FUN_1008_1865 FUN_1008_1865 +1008:1fd3 FUN_1008_1f68 READ 0 true 1028:058d Data6 DAT_1028_058d +1008:1fd8 FUN_1008_1f68 CONDITIONAL_JUMP 0 true 1008:1fe4 Code2 LAB_1008_1fe4 +1008:1fda FUN_1008_1f68 READ 0 true 1028:058e Data6 DAT_1028_058e +1008:1fdf FUN_1008_1f68 CONDITIONAL_JUMP 0 true 1008:1fe4 Code2 LAB_1008_1fe4 +1008:1fe1 FUN_1008_1f68 UNCONDITIONAL_CALL 0 true 1008:1818 Code2 FUN_1008_1818 FUN_1008_1818 +1008:1fee FUN_1008_1fe8 UNCONDITIONAL_CALL 0 true 1008:1779 Code2 FUN_1008_1779 FUN_1008_1779 +1008:1ff1 FUN_1008_1fe8 READ 0 true 1028:4ad4 Data6 DAT_1028_4ad4 +1008:1ff5 FUN_1008_1fe8 DATA 0 true Stack[-0x26] - +1008:1ffa FUN_1008_1fe8 UNCONDITIONAL_CALL 0 true 1228:0174 EXTERNAL GETTEXTMETRICS GETTEXTMETRICS +1008:1fff FUN_1008_1fe8 DATA 1 true Stack[-0x1a] - +1008:2002 FUN_1008_1fe8 WRITE 0 true 1028:4ace Data6 DAT_1028_4ace +1008:2005 FUN_1008_1fe8 DATA 1 true Stack[-0x26] - +1008:2008 FUN_1008_1fe8 DATA 1 true Stack[-0x1e] - +1008:200b FUN_1008_1fe8 WRITE 0 true 1028:4ad0 Data6 DAT_1028_4ad0 +1008:200e FUN_1008_1fe8 DATA 1 true Stack[-0x24] - +1008:2011 FUN_1008_1fe8 WRITE 0 true 1028:4ad2 Data6 DAT_1028_4ad2 +1008:2018 FUN_1008_1fe8 UNCONDITIONAL_CALL 0 true 1228:0288 EXTERNAL GETSYSTEMMETRICS GETSYSTEMMETRICS +1008:2024 FUN_1008_1fe8 UNCONDITIONAL_CALL 0 true 1228:0288 EXTERNAL GETSYSTEMMETRICS GETSYSTEMMETRICS +1008:202b FUN_1008_1fe8 READ 1 true 1028:0540 Data6 DAT_1028_0540 +1008:202e FUN_1008_1fe8 READ 0 true 1028:4ace Data6 DAT_1028_4ace +1008:2038 FUN_1008_1fe8 UNCONDITIONAL_CALL 0 true 1228:0288 EXTERNAL GETSYSTEMMETRICS GETSYSTEMMETRICS +1008:203e FUN_1008_1fe8 UNCONDITIONAL_CALL 0 true 1008:172f Code2 FUN_1008_172f FUN_1008_172f +1008:2044 FUN_1008_1fe8 DATA 0 true Stack[-0x4] - +1008:204b FUN_1008_1fe8 UNCONDITIONAL_CALL 0 true 1228:0288 EXTERNAL GETSYSTEMMETRICS GETSYSTEMMETRICS +1008:2057 FUN_1008_1fe8 UNCONDITIONAL_CALL 0 true 1228:0288 EXTERNAL GETSYSTEMMETRICS GETSYSTEMMETRICS +1008:2061 FUN_1008_1fe8 UNCONDITIONAL_CALL 0 true 1228:0288 EXTERNAL GETSYSTEMMETRICS GETSYSTEMMETRICS +1008:2068 FUN_1008_1fe8 READ 1 true 1028:0542 Data6 DAT_1028_0542 +1008:206b FUN_1008_1fe8 READ 0 true 1028:4ad0 Data6 DAT_1028_4ad0 +1008:2079 FUN_1008_1fe8 UNCONDITIONAL_CALL 0 true 1228:0288 EXTERNAL GETSYSTEMMETRICS GETSYSTEMMETRICS +1008:207f FUN_1008_1fe8 UNCONDITIONAL_CALL 0 true 1008:172f Code2 FUN_1008_172f FUN_1008_172f +1008:2085 FUN_1008_1fe8 DATA 0 true Stack[-0x6] - +1008:2088 FUN_1008_1fe8 DATA 1 true Stack[-0x4] - +1008:208b FUN_1008_1fe8 DATA 1 true Stack[0x2] - +1008:2092 FUN_1008_1fe8 DATA 1 true Stack[-0x6] - +1008:2095 FUN_1008_1fe8 DATA 1 true Stack[0x2] - +1008:20a0 FUN_1008_1fe8 UNCONDITIONAL_CALL 0 true 1228:0288 EXTERNAL GETSYSTEMMETRICS GETSYSTEMMETRICS +1008:20ac FUN_1008_1fe8 UNCONDITIONAL_CALL 0 true 1228:0288 EXTERNAL GETSYSTEMMETRICS GETSYSTEMMETRICS +1008:20b3 FUN_1008_1fe8 READ 1 true 1028:4ace Data6 DAT_1028_4ace +1008:20bf FUN_1008_1fe8 DATA 1 true Stack[0x2] - +1008:20ca FUN_1008_1fe8 UNCONDITIONAL_CALL 0 true 1228:0288 EXTERNAL GETSYSTEMMETRICS GETSYSTEMMETRICS +1008:20d4 FUN_1008_1fe8 UNCONDITIONAL_CALL 0 true 1228:0288 EXTERNAL GETSYSTEMMETRICS GETSYSTEMMETRICS +1008:20e0 FUN_1008_1fe8 UNCONDITIONAL_CALL 0 true 1228:0288 EXTERNAL GETSYSTEMMETRICS GETSYSTEMMETRICS +1008:20e7 FUN_1008_1fe8 READ 1 true 1028:4ad0 Data6 DAT_1028_4ad0 +1008:20f6 FUN_1008_1fe8 DATA 1 true Stack[0x2] - +1008:20fd FUN_1008_1fe8 DATA 1 true Stack[-0x4] - +1008:2100 FUN_1008_1fe8 DATA 1 true Stack[0x2] - +1008:2107 FUN_1008_1fe8 DATA 1 true Stack[-0x6] - +1008:210a FUN_1008_1fe8 DATA 1 true Stack[0x2] - +1008:2111 FUN_1008_1fe8 UNCONDITIONAL_CALL 0 true 1008:17e2 Code2 FUN_1008_17e2 FUN_1008_17e2 +1008:211d FUN_1008_211a READ 0 true 1028:0560 Data6 DAT_1028_0560 +1008:2122 FUN_1008_211a CONDITIONAL_JUMP 0 true 1008:212d Code2 LAB_1008_212d +1008:2124 FUN_1008_211a DATA 0 true Stack[0x2] - +1008:2128 FUN_1008_211a CONDITIONAL_JUMP 0 true 1008:212d Code2 LAB_1008_212d +1008:212a FUN_1008_211a UNCONDITIONAL_CALL 0 true 1008:18d0 Code2 FUN_1008_18d0 FUN_1008_18d0 +1008:212d FUN_1008_211a READ 0 true 1028:058a Data6 DAT_1028_058a +1008:2132 FUN_1008_211a CONDITIONAL_JUMP 0 true 1008:2143 Code2 LAB_1008_2143 +1008:2134 FUN_1008_211a DATA 1 true Stack[0x2] - +1008:2137 FUN_1008_211a READ 1 true 1028:058a Data6 DAT_1028_058a +1008:213f FUN_1008_211a READ_WRITE 0 true 1028:058a Data6 DAT_1028_058a +1008:214d FUN_1008_2147 READ 0 true 1028:0560 Data6 DAT_1028_0560 +1008:2152 FUN_1008_2147 CONDITIONAL_JUMP 0 true 1008:215d Code2 LAB_1008_215d +1008:2154 FUN_1008_2147 DATA 0 true Stack[0x2] - +1008:2158 FUN_1008_2147 CONDITIONAL_JUMP 0 true 1008:215d Code2 LAB_1008_215d +1008:215a FUN_1008_2147 UNCONDITIONAL_CALL 0 true 1008:18d0 Code2 FUN_1008_18d0 FUN_1008_18d0 +1008:2161 FUN_1008_2147 UNCONDITIONAL_CALL 0 true 1228:0228 EXTERNAL GETKEYSTATE GETKEYSTATE +1008:216a FUN_1008_2147 CONDITIONAL_JUMP 0 true 1008:216d Code2 LAB_1008_216d +1008:216d FUN_1008_2147 DATA 0 true Stack[-0x3] - +1008:2170 FUN_1008_2147 DATA 0 true Stack[-0x6] - +1008:2175 FUN_1008_2147 UNCONDITIONAL_JUMP 0 true 1008:217a Code2 LAB_1008_217a +1008:2177 FUN_1008_2147 DATA 0 true Stack[-0x6] - +1008:217a FUN_1008_2147 DATA 1 true Stack[-0x6] - +1008:2187 FUN_1008_2147 READ 1 true 1028:0590 Data6 DAT_1028_0590 +1008:2187 FUN_1008_2147 READ 1 false 1028:0594 Data6 DAT_1028_0594 +1008:218a FUN_1008_2147 DATA 1 true Stack[0x2] - +1008:218d FUN_1008_2147 CONDITIONAL_JUMP 0 true 1008:21ae Code2 LAB_1008_21ae +1008:218f FUN_1008_2147 READ 1 true 1028:0591 Data6 DAT_1028_0591 +1008:218f FUN_1008_2147 READ 1 false 1028:0595 Data6 DAT_1028_0595 +1008:2193 FUN_1008_2147 DATA 1 true Stack[-0x3] - +1008:2196 FUN_1008_2147 CONDITIONAL_JUMP 0 true 1008:21ae Code2 LAB_1008_21ae +1008:2198 FUN_1008_2147 READ 1 true 1028:0592 Data6 DAT_1028_0592 +1008:2198 FUN_1008_2147 READ 1 false 1028:0596 Data6 DAT_1028_0596 +1008:219f FUN_1008_2147 READ 1 true 1028:0593 Data6 DAT_1028_0593 +1008:219f FUN_1008_2147 READ 1 false 1028:0597 Data6 DAT_1028_0597 +1008:21a9 FUN_1008_2147 UNCONDITIONAL_CALL 0 true 1008:1f0c Code2 FUN_1008_1f0c FUN_1008_1f0c +1008:21ac FUN_1008_2147 UNCONDITIONAL_JUMP 0 true 1008:21b4 Code2 LAB_1008_21b4 +1008:21ae FUN_1008_2147 DATA 0 true Stack[-0x6] - +1008:21b2 FUN_1008_2147 CONDITIONAL_JUMP 0 true 1008:2177 Code2 LAB_1008_2177 +1008:21bd FUN_1008_21ba WRITE 0 true 1028:058d Data6 DAT_1028_058d +1008:21c2 FUN_1008_21ba READ 0 true 1028:058e Data6 DAT_1028_058e +1008:21c7 FUN_1008_21ba CONDITIONAL_JUMP 0 true 1008:21cc Code2 LAB_1008_21cc +1008:21c9 FUN_1008_21ba UNCONDITIONAL_CALL 0 true 1008:1818 Code2 FUN_1008_1818 FUN_1008_1818 +1008:21d1 FUN_1008_21ce READ 0 true 1028:058e Data6 DAT_1028_058e +1008:21d6 FUN_1008_21ce CONDITIONAL_JUMP 0 true 1008:21db Code2 LAB_1008_21db +1008:21d8 FUN_1008_21ce UNCONDITIONAL_CALL 0 true 1008:185b Code2 FUN_1008_185b FUN_1008_185b +1008:21db FUN_1008_21ce WRITE 0 true 1028:058d Data6 DAT_1028_058d +1008:21e5 FUN_1008_21e2 READ 0 true 1028:4ac4 Data6 DAT_1028_4ac4 +1008:21e9 FUN_1008_21e2 READ 0 true 1028:4ac2 Data6 DAT_1028_4ac2 +1008:21ed FUN_1008_21e2 READ 1 true 1028:0540 Data6 DAT_1028_0540 +1008:21f0 FUN_1008_21e2 READ 0 true 1028:0542 Data6 DAT_1028_0542 +1008:21f5 FUN_1008_21e2 UNCONDITIONAL_CALL 0 true 1020:0147 Code5 FUN_1020_0147 FUN_1020_0147 +1008:21fc FUN_1008_21e2 WRITE 0 true 1028:0544 Data6 DAT_1028_0544 +1008:21ff FUN_1008_21e2 WRITE 0 true 1028:0546 Data6 DAT_1028_0546 +1008:2204 FUN_1008_21e2 WRITE 0 true 1028:0548 Data6 DAT_1028_0548 +1008:2207 FUN_1008_21e2 WRITE 0 true 1028:054a Data6 DAT_1028_054a +1008:220d FUN_1008_21e2 UNCONDITIONAL_CALL 0 true 1228:0194 EXTERNAL POSTQUITMESSAGE POSTQUITMESSAGE +1008:2212 FUN_1008_21e2 WRITE 0 true 1028:058c Data6 DAT_1028_058c +1008:222a FUN_1008_2219 DATA 0 true Stack[-0x8] - +1008:222d FUN_1008_2219 DATA 0 true Stack[-0x6] - +1008:2230 FUN_1008_2219 DATA 1 true Stack[0xc] - +1008:2236 FUN_1008_2219 DATA 1 true Stack[0xa] - +1008:223c FUN_1008_2219 CONDITIONAL_JUMP 0 true 1008:2244 Code2 LAB_1008_2244 +1008:223e FUN_1008_2219 UNCONDITIONAL_CALL 0 true 1008:1d77 Code2 FUN_1008_1d77 FUN_1008_1d77 +1008:2241 FUN_1008_2219 UNCONDITIONAL_JUMP 0 true 1008:22eb Code2 LAB_1008_22eb +1008:2247 FUN_1008_2219 CONDITIONAL_JUMP 0 true 1008:224f Code2 LAB_1008_224f +1008:2249 FUN_1008_2219 UNCONDITIONAL_CALL 0 true 1008:1dcc Code2 FUN_1008_1dcc FUN_1008_1dcc +1008:224c FUN_1008_2219 UNCONDITIONAL_JUMP 0 true 1008:22eb Code2 LAB_1008_22eb +1008:2252 FUN_1008_2219 CONDITIONAL_JUMP 0 true 1008:2264 Code2 LAB_1008_2264 +1008:2258 FUN_1008_2219 DATA 0 true Stack[0x8] - +1008:225b FUN_1008_2219 DATA 0 true Stack[0x4] - +1008:225e FUN_1008_2219 UNCONDITIONAL_CALL 0 true 1008:1f0c Code2 FUN_1008_1f0c FUN_1008_1f0c +1008:2261 FUN_1008_2219 UNCONDITIONAL_JUMP 0 true 1008:22eb Code2 LAB_1008_22eb +1008:2267 FUN_1008_2219 CONDITIONAL_JUMP 0 true 1008:2277 Code2 LAB_1008_2277 +1008:226c FUN_1008_2219 DATA 0 true Stack[0x8] - +1008:226f FUN_1008_2219 DATA 0 true Stack[0x4] - +1008:2272 FUN_1008_2219 UNCONDITIONAL_CALL 0 true 1008:1f0c Code2 FUN_1008_1f0c FUN_1008_1f0c +1008:2275 FUN_1008_2219 UNCONDITIONAL_JUMP 0 true 1008:22eb Code2 LAB_1008_22eb +1008:227a FUN_1008_2219 CONDITIONAL_JUMP 0 true 1008:2287 Code2 LAB_1008_2287 +1008:227c FUN_1008_2219 DATA 0 true Stack[0x4] - +1008:227f FUN_1008_2219 DATA 0 true Stack[0x6] - +1008:2282 FUN_1008_2219 UNCONDITIONAL_CALL 0 true 1008:1f68 Code2 FUN_1008_1f68 FUN_1008_1f68 +1008:2285 FUN_1008_2219 UNCONDITIONAL_JUMP 0 true 1008:22eb Code2 LAB_1008_22eb +1008:228a FUN_1008_2219 CONDITIONAL_JUMP 0 true 1008:2297 Code2 LAB_1008_2297 +1008:228c FUN_1008_2219 DATA 0 true Stack[0x6] - +1008:228f FUN_1008_2219 DATA 0 true Stack[0x4] - +1008:2292 FUN_1008_2219 UNCONDITIONAL_CALL 0 true 1008:1fe8 Code2 FUN_1008_1fe8 FUN_1008_1fe8 +1008:2295 FUN_1008_2219 UNCONDITIONAL_JUMP 0 true 1008:22eb Code2 LAB_1008_22eb +1008:229a FUN_1008_2219 CONDITIONAL_JUMP 0 true 1008:22a5 Code2 LAB_1008_22a5 +1008:229c FUN_1008_2219 DATA 1 true Stack[0x8] - +1008:22a0 FUN_1008_2219 UNCONDITIONAL_CALL 0 true 1008:211a Code2 FUN_1008_211a FUN_1008_211a +1008:22a3 FUN_1008_2219 UNCONDITIONAL_JUMP 0 true 1008:22eb Code2 LAB_1008_22eb +1008:22a8 FUN_1008_2219 CONDITIONAL_JUMP 0 true 1008:22b3 Code2 LAB_1008_22b3 +1008:22aa FUN_1008_2219 DATA 1 true Stack[0x8] - +1008:22ae FUN_1008_2219 UNCONDITIONAL_CALL 0 true 1008:2147 Code2 FUN_1008_2147 FUN_1008_2147 +1008:22b1 FUN_1008_2219 UNCONDITIONAL_JUMP 0 true 1008:22eb Code2 LAB_1008_22eb +1008:22b6 FUN_1008_2219 CONDITIONAL_JUMP 0 true 1008:22bd Code2 LAB_1008_22bd +1008:22b8 FUN_1008_2219 UNCONDITIONAL_CALL 0 true 1008:21ba Code2 FUN_1008_21ba FUN_1008_21ba +1008:22bb FUN_1008_2219 UNCONDITIONAL_JUMP 0 true 1008:22eb Code2 LAB_1008_22eb +1008:22c0 FUN_1008_2219 CONDITIONAL_JUMP 0 true 1008:22c7 Code2 LAB_1008_22c7 +1008:22c2 FUN_1008_2219 UNCONDITIONAL_CALL 0 true 1008:21ce Code2 FUN_1008_21ce FUN_1008_21ce +1008:22c5 FUN_1008_2219 UNCONDITIONAL_JUMP 0 true 1008:22eb Code2 LAB_1008_22eb +1008:22ca FUN_1008_2219 CONDITIONAL_JUMP 0 true 1008:22d1 Code2 LAB_1008_22d1 +1008:22cc FUN_1008_2219 UNCONDITIONAL_CALL 0 true 1008:21e2 Code2 FUN_1008_21e2 FUN_1008_21e2 +1008:22cf FUN_1008_2219 UNCONDITIONAL_JUMP 0 true 1008:22eb Code2 LAB_1008_22eb +1008:22d1 FUN_1008_2219 DATA 0 true Stack[0xc] - +1008:22d4 FUN_1008_2219 DATA 0 true Stack[0xa] - +1008:22d7 FUN_1008_2219 DATA 0 true Stack[0x8] - +1008:22da FUN_1008_2219 DATA 0 true Stack[0x6] - +1008:22dd FUN_1008_2219 DATA 0 true Stack[0x4] - +1008:22e0 FUN_1008_2219 UNCONDITIONAL_CALL 0 true 1228:022c EXTERNAL DEFWINDOWPROC DEFWINDOWPROC +1008:22e5 FUN_1008_2219 DATA 0 true Stack[-0x8] - +1008:22e8 FUN_1008_2219 DATA 0 true Stack[-0x6] - +1008:22eb FUN_1008_2219 DATA 1 true Stack[-0x8] - +1008:22ee FUN_1008_2219 DATA 1 true Stack[-0x6] - +1008:22f3 FUN_1008_2219 DATA 0 true Stack[-0x4] - +1008:2304 FUN_1008_22fc DATA 1 true Stack[0x4] - +1008:230c FUN_1008_22fc CONDITIONAL_JUMP 0 true 1008:232d Code2 LAB_1008_232d +1008:231a FUN_1008_22fc UNCONDITIONAL_CALL 0 true 1008:1b11 Code2 FUN_1008_1b11 FUN_1008_1b11 +1008:231f FUN_1008_22fc DATA 1 true Stack[0x4] - +1008:2328 FUN_1008_22fc UNCONDITIONAL_CALL 0 true 1008:1c03 Code2 FUN_1008_1c03 FUN_1008_1c03 +1008:232f FUN_1008_22fc DATA 0 true Stack[-0x6] - +1008:2332 FUN_1008_22fc DATA 1 true Stack[-0x6] - +1008:2344 FUN_1008_233c DATA 1 true Stack[0x4] - +1008:2353 FUN_1008_233c UNCONDITIONAL_CALL 0 true 1008:1cc6 Code2 FUN_1008_1cc6 FUN_1008_1cc6 +1008:2358 FUN_1008_233c DATA 1 true Stack[0x4] - +1008:2367 FUN_1008_233c DATA 0 true Stack[-0x6] - +1008:236a FUN_1008_233c DATA 1 true Stack[-0x6] - +1008:237e FUN_1008_2374 DATA 0 true Stack[-0x6] - +1008:2381 FUN_1008_2374 DATA 1 true Stack[-0x6] - +1008:2393 FUN_1008_238b DATA 1 true Stack[0x4] - +1008:239c FUN_1008_238b CONDITIONAL_JUMP 0 true 1008:23b8 Code2 LAB_1008_23b8 +1008:23b6 FUN_1008_238b UNCONDITIONAL_JUMP 0 true 1008:23dd Code2 LAB_1008_23dd +1008:23b8 FUN_1008_238b DATA 1 true Stack[0x4] - +1008:23e3 FUN_1008_238b DATA 1 true Stack[0x4] - +1008:23f0 FUN_1008_238b DATA 0 true Stack[-0x6] - +1008:23f3 FUN_1008_238b DATA 1 true Stack[-0x6] - +1008:2405 FUN_1008_23fd DATA 1 true Stack[0x4] - +1008:2447 FUN_1008_2442 READ 0 true 1028:058c Data6 DAT_1028_058c +1008:244c FUN_1008_2442 CONDITIONAL_JUMP 0 true 1008:24a0 Code2 LAB_1008_24a0 +1008:244e FUN_1008_2442 READ 0 true 1028:057a Data6 DAT_1028_057a +1008:2452 FUN_1008_2442 READ 0 true 1028:0578 Data6 DAT_1028_0578 +1008:2462 FUN_1008_2442 READ 0 true 1028:0538 Data6 DAT_1028_0538 +1008:2466 FUN_1008_2442 READ 0 true 1028:053a Data6 DAT_1028_053a +1008:246a FUN_1008_2442 READ 0 true 1028:053c Data6 DAT_1028_053c +1008:246e FUN_1008_2442 READ 0 true 1028:053e Data6 DAT_1028_053e +1008:2478 FUN_1008_2442 READ 0 true 1028:06fe Data6 DAT_1028_06fe +1008:2482 FUN_1008_2442 UNCONDITIONAL_CALL 0 true 1228:01d8 EXTERNAL CREATEWINDOW CREATEWINDOW +1008:2487 FUN_1008_2442 WRITE 0 true 1028:0586 Data6 DAT_1028_0586 +1008:248a FUN_1008_2442 READ 0 true 1028:0586 Data6 DAT_1028_0586 +1008:248e FUN_1008_2442 READ 0 true 1028:0700 Data6 DAT_1028_0700 +1008:2492 FUN_1008_2442 UNCONDITIONAL_CALL 0 true 1228:01dc EXTERNAL SHOWWINDOW SHOWWINDOW +1008:2497 FUN_1008_2442 READ 0 true 1028:0586 Data6 DAT_1028_0586 +1008:249b FUN_1008_2442 UNCONDITIONAL_CALL 0 true 1228:024c EXTERNAL UPDATEWINDOW UPDATEWINDOW +1008:24ae FUN_1008_24a5 READ 1 true 1028:4abe Data6 DAT_1028_4abe +1008:24b1 FUN_1008_24a5 READ 1 true 1028:4ac0 Data6 DAT_1028_4ac0 +1008:24b5 FUN_1008_24a5 WRITE 0 true 1028:0712 Data6 DAT_1028_0712 +1008:24b8 FUN_1008_24a5 WRITE 0 true 1028:0714 Data6 DAT_1028_0714 +1008:24bc FUN_1008_24a5 READ 0 true 1028:058c Data6 DAT_1028_058c +1008:24c1 FUN_1008_24a5 CONDITIONAL_JUMP 0 true 1008:24c6 Code2 LAB_1008_24c6 +1008:24c3 FUN_1008_24a5 UNCONDITIONAL_JUMP 0 true 1008:254f Code2 LAB_1008_254f +1008:24c6 FUN_1008_24a5 READ 1 true 1028:0718 Data6 DAT_1028_0718 +1008:24c9 FUN_1008_24a5 READ 1 true 1028:071a Data6 DAT_1028_071a +1008:24cd FUN_1008_24a5 CONDITIONAL_JUMP 0 true 1008:24d2 Code2 LAB_1008_24d2 +1008:24cf FUN_1008_24a5 UNCONDITIONAL_JUMP 0 true 1008:254f Code2 LAB_1008_254f +1008:24d7 FUN_1008_24a5 DATA 0 true Stack[-0x8] - +1008:24da FUN_1008_24a5 DATA 0 true Stack[-0x6] - +1008:24dd FUN_1008_24a5 DATA 0 true Stack[-0x9a] - +1008:24e3 FUN_1008_24a5 READ 0 true 1028:054e Data6 DAT_1028_054e +1008:24e7 FUN_1008_24a5 READ 0 true 1028:054c Data6 DAT_1028_054c +1008:24eb FUN_1008_24a5 DATA 0 true Stack[-0x8] - +1008:24f0 FUN_1008_24a5 UNCONDITIONAL_CALL 0 true 1228:02ac EXTERNAL WVSPRINTF WVSPRINTF +1008:24f5 FUN_1008_24a5 READ 0 true 1028:0586 Data6 DAT_1028_0586 +1008:24f9 FUN_1008_24a5 DATA 0 true Stack[-0x9a] - +1008:24ff FUN_1008_24a5 UNCONDITIONAL_CALL 0 true 1228:01cc EXTERNAL SETWINDOWTEXT SETWINDOWTEXT +1008:2504 FUN_1008_24a5 READ 0 true 1028:0586 Data6 DAT_1028_0586 +1008:250b FUN_1008_24a5 UNCONDITIONAL_CALL 0 true 1228:0264 EXTERNAL GETSYSTEMMENU GETSYSTEMMENU +1008:2518 FUN_1008_24a5 UNCONDITIONAL_CALL 0 true 1228:0260 EXTERNAL ENABLEMENUITEM ENABLEMENUITEM +1008:251d FUN_1008_24a5 WRITE 0 true 1028:0560 Data6 DAT_1028_0560 +1008:2522 FUN_1008_24a5 DATA 0 true Stack[-0x1a] - +1008:2530 FUN_1008_24a5 UNCONDITIONAL_CALL 0 true 1228:0230 EXTERNAL GETMESSAGE GETMESSAGE +1008:2537 FUN_1008_24a5 CONDITIONAL_JUMP 0 true 1008:254f Code2 LAB_1008_254f +1008:2539 FUN_1008_24a5 DATA 0 true Stack[-0x1a] - +1008:253e FUN_1008_24a5 UNCONDITIONAL_CALL 0 true 1228:0240 EXTERNAL TRANSLATEMESSAGE TRANSLATEMESSAGE +1008:2543 FUN_1008_24a5 DATA 0 true Stack[-0x1a] - +1008:2548 FUN_1008_24a5 UNCONDITIONAL_CALL 0 true 1228:0244 EXTERNAL DISPATCHMESSAGE DISPATCHMESSAGE +1008:254d FUN_1008_24a5 UNCONDITIONAL_JUMP 0 true 1008:2522 Code2 LAB_1008_2522 +1008:2557 FUN_1008_2554 READ 0 true 1028:06fc Data6 DAT_1028_06fc +1008:255c FUN_1008_2554 CONDITIONAL_JUMP 0 true 1008:2598 Code2 LAB_1008_2598 +1008:255e FUN_1008_2554 READ 1 true 1028:06fe Data6 DAT_1028_06fe +1008:2561 FUN_1008_2554 WRITE 0 true 1028:056c Data6 DAT_1028_056c +1008:256e FUN_1008_2554 UNCONDITIONAL_CALL 0 true 1228:027c EXTERNAL LOADICON LOADICON +1008:2573 FUN_1008_2554 WRITE 0 true 1028:056e Data6 DAT_1028_056e +1008:2580 FUN_1008_2554 UNCONDITIONAL_CALL 0 true 1228:0278 EXTERNAL LOADCURSOR LOADCURSOR +1008:2585 FUN_1008_2554 WRITE 0 true 1028:0570 Data6 DAT_1028_0570 +1008:2588 FUN_1008_2554 WRITE 0 true 1028:0572 Data6 DAT_1028_0572 +1008:2593 FUN_1008_2554 UNCONDITIONAL_CALL 0 true 1228:01f0 EXTERNAL REGISTERCLASS REGISTERCLASS +1008:259d FUN_1008_2554 UNCONDITIONAL_CALL 0 true 1008:23fd Code2 FUN_1008_23fd FUN_1008_23fd +1008:25a7 FUN_1008_2554 UNCONDITIONAL_CALL 0 true 1020:0527 Code5 FUN_1020_0527 FUN_1020_0527 +1008:25ac FUN_1008_2554 UNCONDITIONAL_CALL 0 true 1020:038f Code5 FUN_1020_038f FUN_1020_038f +1008:25b6 FUN_1008_2554 UNCONDITIONAL_CALL 0 true 1008:23fd Code2 FUN_1008_23fd FUN_1008_23fd +1008:25c0 FUN_1008_2554 UNCONDITIONAL_CALL 0 true 1020:052c Code5 FUN_1020_052c FUN_1020_052c +1008:25c5 FUN_1008_2554 UNCONDITIONAL_CALL 0 true 1020:038f Code5 FUN_1020_038f FUN_1020_038f +1008:25ca FUN_1008_2554 READ 0 true 1028:06fe Data6 DAT_1028_06fe +1008:25d7 FUN_1008_2554 UNCONDITIONAL_CALL 0 true 1228:0028 EXTERNAL GETMODULEFILENAME GETMODULEFILENAME +1008:25e6 FUN_1008_2554 UNCONDITIONAL_CALL 0 true 1228:02c0 EXTERNAL Ordinal_6 Ordinal_6 +1008:25eb FUN_1008_2554 READ 1 true 1028:0712 Data6 DAT_1028_0712 +1008:25ee FUN_1008_2554 READ 1 true 1028:0714 Data6 DAT_1028_0714 +1008:25f2 FUN_1008_2554 WRITE 0 true 1028:4abe Data6 DAT_1028_4abe +1008:25f5 FUN_1008_2554 WRITE 0 true 1028:4ac0 Data6 DAT_1028_4ac0 +1008:25ff FUN_1008_2554 WRITE 0 true 1028:0712 Data6 DAT_1028_0712 +1008:2602 FUN_1008_2554 WRITE 0 true 1028:0714 Data6 DAT_1028_0714 +1008:2615 FUN_1008_2608 DATA 0 true Stack[-0x52] - +1008:2621 FUN_1008_2608 CONDITIONAL_JUMP 0 true 1008:2626 Code2 LAB_1008_2626 +1008:2624 FUN_1008_2608 CONDITIONAL_JUMP 0 true 1008:261e Code2 LAB_1008_261e +1008:2629 FUN_1008_2608 DATA 0 true Stack[-0x52] - +1008:2630 FUN_1008_2608 UNCONDITIONAL_CALL 0 true 1228:02bc EXTERNAL Ordinal_5 Ordinal_5 +1008:2637 FUN_1008_2608 DATA 0 true Stack[-0x52] - +1008:2648 FUN_1008_2643 DATA 1 true Stack[0x4] - +1008:264b FUN_1008_2643 DATA 1 true Stack[0xc] - +1008:2653 FUN_1008_2643 CONDITIONAL_JUMP 0 true 1008:2660 Code2 LAB_1008_2660 +1008:2655 FUN_1008_2643 DATA 1 true Stack[0x8] - +1008:265b FUN_1008_2643 CONDITIONAL_JUMP 0 true 1008:2660 Code2 LAB_1008_2660 +1008:265e FUN_1008_2643 CONDITIONAL_JUMP 0 true 1008:2658 Code2 LAB_1008_2658 +1008:2663 FUN_1008_2643 DATA 1 true Stack[0xc] - +1008:2669 FUN_1008_2643 UNCONDITIONAL_CALL 0 true 1008:2608 Code2 FUN_1008_2608 FUN_1008_2608 +1008:266e FUN_1008_2643 CONDITIONAL_JUMP 0 true 1008:2676 Code2 LAB_1008_2676 +1008:2674 FUN_1008_2643 CONDITIONAL_JUMP 0 true 1008:26a5 Code2 LAB_1008_26a5 +1008:2676 FUN_1008_2643 DATA 1 true Stack[0xc] - +1008:2681 FUN_1008_2643 CONDITIONAL_JUMP 0 true 1008:26a4 Code2 LAB_1008_26a4 +1008:2685 FUN_1008_2643 CONDITIONAL_JUMP 0 true 1008:2693 Code2 LAB_1008_2693 +1008:2687 FUN_1008_2643 CONDITIONAL_JUMP 0 true 1008:268d Code2 LAB_1008_268d +1008:2690 FUN_1008_2643 CONDITIONAL_JUMP 0 true 1008:2683 Code2 LAB_1008_2683 +1008:2693 FUN_1008_2643 CONDITIONAL_JUMP 0 true 1008:2651 Code2 LAB_1008_2651 +1008:2698 FUN_1008_2643 CONDITIONAL_JUMP 0 true 1008:2651 Code2 LAB_1008_2651 +1008:269e FUN_1008_2643 CONDITIONAL_JUMP 0 true 1008:2651 Code2 LAB_1008_2651 +1008:26a2 FUN_1008_2643 UNCONDITIONAL_JUMP 0 true 1008:2651 Code2 LAB_1008_2651 +1008:26a5 FUN_1008_2643 DATA 1 true Stack[0xc] - +1008:26a8 FUN_1008_2643 DATA 1 true Stack[0xe] - +1008:26b8 FUN_1008_26b0 DATA 0 true Stack[0x12] - +1008:26bb FUN_1008_26b0 DATA 0 true Stack[0x10] - +1008:26c1 FUN_1008_26b0 UNCONDITIONAL_CALL 0 true 1008:2fe3 Code2 FUN_1008_2fe3 FUN_1008_2fe3 +1008:26c6 FUN_1008_26b0 DATA 0 true Stack[-0x10] - +1008:26c9 FUN_1008_26b0 DATA 0 true Stack[-0xe] - +1008:26cc FUN_1008_26b0 DATA 1 true Stack[-0x10] - +1008:26cf FUN_1008_26b0 DATA 1 true Stack[-0xe] - +1008:26d2 FUN_1008_26b0 CONDITIONAL_JUMP 0 true 1008:26e8 Code2 LAB_1008_26e8 +1008:26d4 FUN_1008_26b0 DATA 0 true Stack[0x12] - +1008:26d7 FUN_1008_26b0 DATA 0 true Stack[0x10] - +1008:26dd FUN_1008_26b0 UNCONDITIONAL_CALL 0 true 1008:2fe3 Code2 FUN_1008_2fe3 FUN_1008_2fe3 +1008:26e2 FUN_1008_26b0 DATA 0 true Stack[-0x10] - +1008:26e5 FUN_1008_26b0 DATA 0 true Stack[-0xe] - +1008:26e8 FUN_1008_26b0 DATA 1 true Stack[-0x10] - +1008:26eb FUN_1008_26b0 DATA 1 true Stack[-0xe] - +1008:26ee FUN_1008_26b0 CONDITIONAL_JUMP 0 true 1008:26fe Code2 LAB_1008_26fe +1008:26f0 FUN_1008_26b0 DATA 1 true Stack[0x10] - +1008:26f3 FUN_1008_26b0 DATA 1 true Stack[0x12] - +1008:26f6 FUN_1008_26b0 DATA 0 true Stack[-0x10] - +1008:26f9 FUN_1008_26b0 DATA 0 true Stack[-0xe] - +1008:26fc FUN_1008_26b0 UNCONDITIONAL_JUMP 0 true 1008:2701 Code2 LAB_1008_2701 +1008:26fe FUN_1008_26b0 DATA 0 true Stack[-0x10] - +1008:2701 FUN_1008_26b0 DATA 0 true Stack[-0xe] - +1008:2704 FUN_1008_26b0 DATA 0 true Stack[-0x10] - +1008:270a FUN_1008_26b0 UNCONDITIONAL_CALL 0 true 1008:2fbb Code2 FUN_1008_2fbb FUN_1008_2fbb +1008:270f FUN_1008_26b0 DATA 0 true Stack[-0x14] - +1008:2712 FUN_1008_26b0 DATA 0 true Stack[-0x12] - +1008:2715 FUN_1008_26b0 DATA 1 true Stack[-0x14] - +1008:2718 FUN_1008_26b0 DATA 1 true Stack[-0x12] - +1008:271b FUN_1008_26b0 CONDITIONAL_JUMP 0 true 1008:272e Code2 LAB_1008_272e +1008:271d FUN_1008_26b0 DATA 0 true Stack[-0xe] - +1008:2720 FUN_1008_26b0 DATA 0 true Stack[-0x10] - +1008:2723 FUN_1008_26b0 UNCONDITIONAL_CALL 0 true 1008:2ea9 Code2 FUN_1008_2ea9 FUN_1008_2ea9 +1008:2728 FUN_1008_26b0 DATA 0 true Stack[-0x14] - +1008:272b FUN_1008_26b0 DATA 0 true Stack[-0x12] - +1008:272e FUN_1008_26b0 DATA 1 true Stack[-0x10] - +1008:2731 FUN_1008_26b0 DATA 1 true Stack[0x10] - +1008:2734 FUN_1008_26b0 DATA 0 true Stack[-0x8] - +1008:2737 FUN_1008_26b0 DATA 0 true Stack[-0x8] - +1008:273b FUN_1008_26b0 CONDITIONAL_JUMP 0 true 1008:2742 Code2 LAB_1008_2742 +1008:273d FUN_1008_26b0 DATA 0 true Stack[-0x8] - +1008:2742 FUN_1008_26b0 DATA 1 true Stack[-0x14] - +1008:2745 FUN_1008_26b0 DATA 1 true Stack[-0x10] - +1008:2748 FUN_1008_26b0 DATA 0 true Stack[-0xa] - +1008:274b FUN_1008_26b0 DATA 0 true Stack[-0xa] - +1008:274f FUN_1008_26b0 CONDITIONAL_JUMP 0 true 1008:2756 Code2 LAB_1008_2756 +1008:2751 FUN_1008_26b0 DATA 0 true Stack[-0xa] - +1008:2758 FUN_1008_26b0 DATA 0 true Stack[-0xc] - +1008:275b FUN_1008_26b0 DATA 0 true Stack[-0xe] - +1008:275e FUN_1008_26b0 DATA 0 true Stack[-0x10] - +1008:2764 FUN_1008_26b0 UNCONDITIONAL_CALL 0 true 1008:2fbb Code2 FUN_1008_2fbb FUN_1008_2fbb +1008:276b FUN_1008_26b0 CONDITIONAL_JUMP 0 true 1008:277f Code2 LAB_1008_277f +1008:276d FUN_1008_26b0 DATA 0 true Stack[-0xe] - +1008:2770 FUN_1008_26b0 DATA 0 true Stack[-0x10] - +1008:2776 FUN_1008_26b0 UNCONDITIONAL_CALL 0 true 1008:2fbb Code2 FUN_1008_2fbb FUN_1008_2fbb +1008:277d FUN_1008_26b0 CONDITIONAL_JUMP 0 true 1008:2784 Code2 LAB_1008_2784 +1008:277f FUN_1008_26b0 DATA 0 true Stack[-0xc] - +1008:2784 FUN_1008_26b0 DATA 0 true Stack[-0x8] - +1008:2788 FUN_1008_26b0 CONDITIONAL_JUMP 0 true 1008:2793 Code2 LAB_1008_2793 +1008:278a FUN_1008_26b0 DATA 1 true Stack[-0xc] - +1008:2790 FUN_1008_26b0 DATA 0 true Stack[-0xc] - +1008:2793 FUN_1008_26b0 DATA 0 true Stack[-0xa] - +1008:2797 FUN_1008_26b0 CONDITIONAL_JUMP 0 true 1008:27a2 Code2 LAB_1008_27a2 +1008:2799 FUN_1008_26b0 DATA 1 true Stack[-0xc] - +1008:279f FUN_1008_26b0 DATA 0 true Stack[-0xc] - +1008:27a2 FUN_1008_26b0 DATA 1 true Stack[-0x14] - +1008:27a9 FUN_1008_26b0 CONDITIONAL_JUMP 0 true 1008:27b4 Code2 LAB_1008_27b4 +1008:27ab FUN_1008_26b0 DATA 1 true Stack[-0xc] - +1008:27b1 FUN_1008_26b0 DATA 0 true Stack[-0xc] - +1008:27b4 FUN_1008_26b0 DATA 1 true Stack[0xc] - +1008:27b7 FUN_1008_26b0 DATA 1 true Stack[0xe] - +1008:27ba FUN_1008_26b0 CONDITIONAL_JUMP 0 true 1008:27d0 Code2 LAB_1008_27d0 +1008:27bc FUN_1008_26b0 DATA 0 true Stack[0xe] - +1008:27bf FUN_1008_26b0 DATA 0 true Stack[0xc] - +1008:27c2 FUN_1008_26b0 DATA 0 true Stack[0x12] - +1008:27c5 FUN_1008_26b0 DATA 0 true Stack[0x10] - +1008:27c8 FUN_1008_26b0 DATA 0 true Stack[-0x8] - +1008:27cb FUN_1008_26b0 UNCONDITIONAL_CALL 0 true 1008:2f07 Code2 FUN_1008_2f07 FUN_1008_2f07 +1008:27d0 FUN_1008_26b0 DATA 1 true Stack[0x8] - +1008:27d3 FUN_1008_26b0 DATA 1 true Stack[0xa] - +1008:27d6 FUN_1008_26b0 CONDITIONAL_JUMP 0 true 1008:27ec Code2 LAB_1008_27ec +1008:27d8 FUN_1008_26b0 DATA 0 true Stack[0xa] - +1008:27db FUN_1008_26b0 DATA 0 true Stack[0x8] - +1008:27de FUN_1008_26b0 DATA 0 true Stack[-0xe] - +1008:27e1 FUN_1008_26b0 DATA 0 true Stack[-0x10] - +1008:27e4 FUN_1008_26b0 DATA 0 true Stack[-0xa] - +1008:27e7 FUN_1008_26b0 UNCONDITIONAL_CALL 0 true 1008:2f07 Code2 FUN_1008_2f07 FUN_1008_2f07 +1008:27ec FUN_1008_26b0 DATA 1 true Stack[0x4] - +1008:27ef FUN_1008_26b0 DATA 1 true Stack[0x6] - +1008:27f2 FUN_1008_26b0 CONDITIONAL_JUMP 0 true 1008:2809 Code2 LAB_1008_2809 +1008:27f4 FUN_1008_26b0 DATA 0 true Stack[0x6] - +1008:27f7 FUN_1008_26b0 DATA 0 true Stack[0x4] - +1008:27fa FUN_1008_26b0 DATA 0 true Stack[-0x12] - +1008:27fd FUN_1008_26b0 DATA 0 true Stack[-0x14] - +1008:2804 FUN_1008_26b0 UNCONDITIONAL_CALL 0 true 1008:2f07 Code2 FUN_1008_2f07 FUN_1008_2f07 +1008:2809 FUN_1008_26b0 DATA 1 true Stack[-0xc] - +1008:280c FUN_1008_26b0 DATA 0 true Stack[-0x6] - +1008:280f FUN_1008_26b0 DATA 1 true Stack[-0x6] - +1008:2821 FUN_1008_2819 DATA 0 true Stack[0x6] - +1008:2824 FUN_1008_2819 DATA 0 true Stack[0x4] - +1008:2827 FUN_1008_2819 UNCONDITIONAL_CALL 0 true 1008:2e92 Code2 FUN_1008_2e92 FUN_1008_2e92 +1008:282c FUN_1008_2819 DATA 0 true Stack[-0xa] - +1008:282f FUN_1008_2819 UNCONDITIONAL_CALL 0 true 1228:0074 EXTERNAL GETDOSENVIRONMENT GETDOSENVIRONMENT +1008:2834 FUN_1008_2819 DATA 0 true Stack[-0xe] - +1008:2837 FUN_1008_2819 DATA 0 true Stack[-0xc] - +1008:283a FUN_1008_2819 DATA 1 true Stack[-0xe] - +1008:2841 FUN_1008_2819 CONDITIONAL_JUMP 0 true 1008:288e Code2 LAB_1008_288e +1008:2843 FUN_1008_2819 DATA 0 true Stack[-0xc] - +1008:2846 FUN_1008_2819 DATA 0 true Stack[-0xe] - +1008:2849 FUN_1008_2819 DATA 0 true Stack[0x6] - +1008:284c FUN_1008_2819 DATA 0 true Stack[0x4] - +1008:284f FUN_1008_2819 DATA 0 true Stack[-0xa] - +1008:2852 FUN_1008_2819 UNCONDITIONAL_CALL 0 true 1008:2f70 Code2 FUN_1008_2f70 FUN_1008_2f70 +1008:2859 FUN_1008_2819 CONDITIONAL_JUMP 0 true 1008:287d Code2 LAB_1008_287d +1008:285b FUN_1008_2819 DATA 1 true Stack[-0xa] - +1008:285e FUN_1008_2819 DATA 1 true Stack[-0xe] - +1008:2867 FUN_1008_2819 CONDITIONAL_JUMP 0 true 1008:287d Code2 LAB_1008_287d +1008:2869 FUN_1008_2819 DATA 1 true Stack[-0xe] - +1008:286c FUN_1008_2819 DATA 1 true Stack[-0xc] - +1008:286f FUN_1008_2819 DATA 1 true Stack[-0xa] - +1008:2875 FUN_1008_2819 DATA 0 true Stack[-0x8] - +1008:2878 FUN_1008_2819 DATA 0 true Stack[-0x6] - +1008:287b FUN_1008_2819 UNCONDITIONAL_JUMP 0 true 1008:2896 Code2 LAB_1008_2896 +1008:287d FUN_1008_2819 DATA 0 true Stack[-0xc] - +1008:2880 FUN_1008_2819 DATA 0 true Stack[-0xe] - +1008:2883 FUN_1008_2819 UNCONDITIONAL_CALL 0 true 1008:2e92 Code2 FUN_1008_2e92 FUN_1008_2e92 +1008:2889 FUN_1008_2819 DATA 0 true Stack[-0xe] - +1008:288c FUN_1008_2819 UNCONDITIONAL_JUMP 0 true 1008:283a Code2 LAB_1008_283a +1008:2890 FUN_1008_2819 DATA 0 true Stack[-0x8] - +1008:2893 FUN_1008_2819 DATA 0 true Stack[-0x6] - +1008:2896 FUN_1008_2819 DATA 1 true Stack[-0x8] - +1008:2899 FUN_1008_2819 DATA 1 true Stack[-0x6] - +1008:28a8 FUN_1008_28a3 UNCONDITIONAL_CALL 0 true 1020:03cb Code5 FUN_1020_03cb FUN_1020_03cb +1008:28af FUN_1008_28a3 UNCONDITIONAL_CALL 0 true 1020:03ef Code5 FUN_1020_03ef FUN_1020_03ef +1008:28b4 FUN_1008_28a3 CONDITIONAL_JUMP 0 true 1008:28fd Code2 LAB_1008_28fd +1008:28b9 FUN_1008_28a3 DATA 1 true Stack[0x4] - +1008:28be FUN_1008_28a3 UNCONDITIONAL_CALL 0 true 1008:2d99 Code2 FUN_1008_2d99 FUN_1008_2d99 +1008:28c3 FUN_1008_28a3 DATA 1 true Stack[0x4] - +1008:28cc FUN_1008_28a3 DATA 1 true Stack[0x10] - +1008:28d3 FUN_1008_28a3 DATA 0 true Stack[0xe] - +1008:28d6 FUN_1008_28a3 DATA 0 true Stack[0xc] - +1008:28d9 FUN_1008_28a3 DATA 1 true Stack[0xa] - +1008:28df FUN_1008_28a3 UNCONDITIONAL_CALL 0 true 1008:295c Code2 FUN_1008_295c FUN_1008_295c +1008:28e4 FUN_1008_28a3 DATA 1 true Stack[0x4] - +1008:28f0 FUN_1008_28a3 CONDITIONAL_JUMP 0 true 1008:28f4 Code2 LAB_1008_28f4 +1008:28f2 FUN_1008_28a3 UNCONDITIONAL_JUMP 0 true 1008:28f6 Code2 LAB_1008_28f6 +1008:28f4 FUN_1008_28a3 UNCONDITIONAL_JUMP 0 true 1008:28fd Code2 LAB_1008_28fd +1008:28f8 FUN_1008_28a3 UNCONDITIONAL_CALL 0 true 1020:0439 Code5 FUN_1020_0439 FUN_1020_0439 +1008:28fd FUN_1008_28a3 DATA 1 true Stack[0x4] - +1008:290b FUN_1008_2906 UNCONDITIONAL_CALL 0 true 1020:03cb Code5 FUN_1020_03cb FUN_1020_03cb +1008:2910 FUN_1008_2906 DATA 1 true Stack[0x4] - +1008:2915 FUN_1008_2906 UNCONDITIONAL_CALL 0 true 1008:2932 Code2 FUN_1008_2932 FUN_1008_2932 +1008:291d FUN_1008_2906 DATA 1 true Stack[0x4] - +1008:2922 FUN_1008_2906 UNCONDITIONAL_CALL 0 true 1008:2dcd Code2 FUN_1008_2dcd FUN_1008_2dcd +1008:2929 FUN_1008_2906 UNCONDITIONAL_CALL 0 true 1020:0439 Code5 FUN_1020_0439 FUN_1020_0439 +1008:2937 FUN_1008_2932 UNCONDITIONAL_CALL 0 true 1020:03cb Code5 FUN_1020_03cb FUN_1020_03cb +1008:293c FUN_1008_2932 DATA 1 true Stack[0x4] - +1008:2944 FUN_1008_2932 CONDITIONAL_JUMP 0 true 1008:294f Code2 LAB_1008_294f +1008:294a FUN_1008_2932 UNCONDITIONAL_CALL 0 true 1228:00a8 EXTERNAL TIMEKILLEVENT TIMEKILLEVENT +1008:294f FUN_1008_2932 DATA 1 true Stack[0x4] - +1008:2962 FUN_1008_295c UNCONDITIONAL_CALL 0 true 1020:03cb Code5 FUN_1020_03cb FUN_1020_03cb +1008:296a FUN_1008_295c DATA 1 true Stack[0x4] - +1008:2971 FUN_1008_295c DATA 0 true Stack[0xc] - +1008:2974 FUN_1008_295c DATA 0 true Stack[0xa] - +1008:2977 FUN_1008_295c DATA 1 true Stack[0x8] - +1008:297b FUN_1008_295c UNCONDITIONAL_CALL 0 true 1228:0094 EXTERNAL SYSTEMTIMERMAKE SYSTEMTIMERMAKE +1008:2980 FUN_1008_295c DATA 0 true Stack[-0x4] - +1008:2983 FUN_1008_295c DATA 1 true Stack[-0x4] - +1008:298f FUN_1008_298a UNCONDITIONAL_CALL 0 true 1020:03cb Code5 FUN_1020_03cb FUN_1020_03cb +1008:299d FUN_1008_2996 UNCONDITIONAL_CALL 0 true 1020:03ef Code5 FUN_1020_03ef FUN_1020_03ef +1008:29a2 FUN_1008_2996 CONDITIONAL_JUMP 0 true 1008:2a02 Code2 LAB_1008_2a02 +1008:29a4 FUN_1008_2996 DATA 0 true Stack[0x10] - +1008:29a7 FUN_1008_2996 DATA 0 true Stack[0xe] - +1008:29ad FUN_1008_2996 DATA 1 true Stack[0x4] - +1008:29b2 FUN_1008_2996 UNCONDITIONAL_CALL 0 true 1018:0341 Code4 FUN_1018_0341 FUN_1018_0341 +1008:29b7 FUN_1008_2996 DATA 1 true Stack[0x4] - +1008:29bc FUN_1008_2996 UNCONDITIONAL_CALL 0 true 1018:0627 Code4 FUN_1018_0627 FUN_1018_0627 +1008:29c1 FUN_1008_2996 DATA 0 true Stack[0xc] - +1008:29c5 FUN_1008_2996 CONDITIONAL_JUMP 0 true 1008:29df Code2 LAB_1008_29df +1008:29c7 FUN_1008_2996 DATA 0 true Stack[0xc] - +1008:29ca FUN_1008_2996 DATA 0 true Stack[0xa] - +1008:29cd FUN_1008_2996 UNCONDITIONAL_CALL 0 true 1008:302c Code2 FUN_1008_302c FUN_1008_302c +1008:29d2 FUN_1008_2996 DATA 1 true Stack[0x4] - +1008:29dd FUN_1008_2996 UNCONDITIONAL_JUMP 0 true 1008:29f0 Code2 LAB_1008_29f0 +1008:29df FUN_1008_2996 DATA 1 true Stack[0xa] - +1008:29e2 FUN_1008_2996 DATA 1 true Stack[0xc] - +1008:29e5 FUN_1008_2996 DATA 1 true Stack[0x4] - +1008:29f0 FUN_1008_2996 DATA 1 true Stack[0x4] - +1008:2a02 FUN_1008_2996 DATA 1 true Stack[0x4] - +1008:2a13 FUN_1008_2a0e DATA 1 true Stack[0x4] - +1008:2a1b FUN_1008_2a0e CONDITIONAL_JUMP 0 true 1008:2a2a Code2 LAB_1008_2a2a +1008:2a25 FUN_1008_2a0e UNCONDITIONAL_CALL 0 true 1008:3099 Code2 FUN_1008_3099 FUN_1008_3099 +1008:2a2d FUN_1008_2a0e DATA 1 true Stack[0x4] - +1008:2a32 FUN_1008_2a0e UNCONDITIONAL_CALL 0 true 1018:03ff Code4 FUN_1018_03ff FUN_1018_03ff +1008:2a39 FUN_1008_2a0e UNCONDITIONAL_CALL 0 true 1020:0439 Code5 FUN_1020_0439 FUN_1020_0439 +1008:2a4d FUN_1008_2a45 DATA 1 true Stack[0x4] - +1008:2a55 FUN_1008_2a45 CONDITIONAL_JUMP 0 true 1008:2ac9 Code2 LAB_1008_2ac9 +1008:2a59 FUN_1008_2a45 UNCONDITIONAL_CALL 0 true 1018:0627 Code4 FUN_1018_0627 FUN_1018_0627 +1008:2a5e FUN_1008_2a45 DATA 1 true Stack[0x4] - +1008:2a63 FUN_1008_2a45 UNCONDITIONAL_CALL 0 true 1018:05f3 Code4 FUN_1018_05f3 FUN_1018_05f3 +1008:2a68 FUN_1008_2a45 DATA 1 true Stack[0x4] - +1008:2a78 FUN_1008_2a45 CONDITIONAL_JUMP 0 true 1008:2a81 Code2 LAB_1008_2a81 +1008:2a7c FUN_1008_2a45 DATA 0 true Stack[-0x8] - +1008:2a7f FUN_1008_2a45 UNCONDITIONAL_JUMP 0 true 1008:2a8f Code2 LAB_1008_2a8f +1008:2a81 FUN_1008_2a45 DATA 1 true Stack[0x4] - +1008:2a8c FUN_1008_2a45 DATA 0 true Stack[-0x8] - +1008:2a8f FUN_1008_2a45 READ 0 true 1028:06fe Data6 DAT_1028_06fe +1008:2a93 FUN_1008_2a45 DATA 1 true Stack[0x4] - +1008:2a9e FUN_1008_2a45 DATA 0 true Stack[-0x8] - +1008:2ab1 FUN_1008_2a45 READ 0 true 1028:0654 Data6 DAT_1028_0654 +1008:2ab1 FUN_1008_2a45 READ 0 false 1028:0652 Data6 DAT_1028_0652 +1008:2ab1 FUN_1008_2a45 COMPUTED_CALL -1 true 1228:0294 EXTERNAL CREATEDIALOGPARAM CREATEDIALOGPARAM +1008:2ab5 FUN_1008_2a45 DATA 1 true Stack[0x4] - +1008:2ac1 FUN_1008_2a45 CONDITIONAL_JUMP 0 true 1008:2ac9 Code2 LAB_1008_2ac9 +1008:2ac9 FUN_1008_2a45 DATA 1 true Stack[0x4] - +1008:2ad3 FUN_1008_2a45 CONDITIONAL_JUMP 0 true 1008:2ad6 Code2 LAB_1008_2ad6 +1008:2ad6 FUN_1008_2a45 DATA 0 true Stack[-0x5] - +1008:2ad9 FUN_1008_2a45 DATA 1 true Stack[-0x5] - +1008:2aeb FUN_1008_2ae3 DATA 1 true Stack[0x4] - +1008:2af3 FUN_1008_2ae3 CONDITIONAL_JUMP 0 true 1008:2af8 Code2 LAB_1008_2af8 +1008:2af5 FUN_1008_2ae3 UNCONDITIONAL_JUMP 0 true 1008:2b9d Code2 LAB_1008_2b9d +1008:2afa FUN_1008_2ae3 UNCONDITIONAL_CALL 0 true 1018:0627 Code4 FUN_1018_0627 FUN_1018_0627 +1008:2aff FUN_1008_2ae3 DATA 1 true Stack[0x4] - +1008:2b04 FUN_1008_2ae3 UNCONDITIONAL_CALL 0 true 1018:05f3 Code4 FUN_1018_05f3 FUN_1018_05f3 +1008:2b09 FUN_1008_2ae3 DATA 1 true Stack[0x4] - +1008:2b19 FUN_1008_2ae3 CONDITIONAL_JUMP 0 true 1008:2b22 Code2 LAB_1008_2b22 +1008:2b1d FUN_1008_2ae3 DATA 0 true Stack[-0x8] - +1008:2b20 FUN_1008_2ae3 UNCONDITIONAL_JUMP 0 true 1008:2b30 Code2 LAB_1008_2b30 +1008:2b22 FUN_1008_2ae3 DATA 1 true Stack[0x4] - +1008:2b2d FUN_1008_2ae3 DATA 0 true Stack[-0x8] - +1008:2b30 FUN_1008_2ae3 READ 1 true 1028:064e Data6 DAT_1028_064e +1008:2b3c FUN_1008_2ae3 DATA 0 true Stack[-0xe] - +1008:2b3f FUN_1008_2ae3 DATA 0 true Stack[-0xc] - +1008:2b42 FUN_1008_2ae3 READ 0 true 1028:06fe Data6 DAT_1028_06fe +1008:2b46 FUN_1008_2ae3 DATA 1 true Stack[0x4] - +1008:2b51 FUN_1008_2ae3 DATA 0 true Stack[-0x8] - +1008:2b64 FUN_1008_2ae3 READ 0 true 1028:0658 Data6 DAT_1028_0658 +1008:2b64 FUN_1008_2ae3 READ 0 false 1028:0656 Data6 DAT_1028_0656 +1008:2b64 FUN_1008_2ae3 COMPUTED_CALL -1 true 1228:0290 EXTERNAL DIALOGBOXPARAM DIALOGBOXPARAM +1008:2b68 FUN_1008_2ae3 DATA 0 true Stack[-0xa] - +1008:2b6b FUN_1008_2ae3 DATA 1 true Stack[-0xe] - +1008:2b6e FUN_1008_2ae3 DATA 1 true Stack[-0xc] - +1008:2b71 FUN_1008_2ae3 READ 1 true 1028:064e Data6 DAT_1028_064e +1008:2b7d FUN_1008_2ae3 DATA 0 true Stack[-0xa] - +1008:2b81 FUN_1008_2ae3 CONDITIONAL_JUMP 0 true 1008:2b8c Code2 LAB_1008_2b8c +1008:2b83 FUN_1008_2ae3 DATA 1 true Stack[0x4] - +1008:2b8c FUN_1008_2ae3 DATA 1 true Stack[0x4] - +1008:2b95 FUN_1008_2ae3 DATA 1 true Stack[-0xa] - +1008:2b98 FUN_1008_2ae3 DATA 0 true Stack[-0x6] - +1008:2b9b FUN_1008_2ae3 UNCONDITIONAL_JUMP 0 true 1008:2ba7 Code2 LAB_1008_2ba7 +1008:2b9d FUN_1008_2ae3 DATA 1 true Stack[0x4] - +1008:2ba4 FUN_1008_2ae3 DATA 0 true Stack[-0x6] - +1008:2ba7 FUN_1008_2ae3 DATA 1 true Stack[-0x6] - +1008:2bb6 FUN_1008_2bb1 DATA 1 true Stack[0x6] - +1008:2bbe FUN_1008_2bb1 CONDITIONAL_JUMP 0 true 1008:2bca Code2 LAB_1008_2bca +1008:2bc0 FUN_1008_2bb1 DATA 1 true Stack[0x6] - +1008:2bc5 FUN_1008_2bb1 UNCONDITIONAL_CALL 0 true 1018:060d Code4 FUN_1018_060d FUN_1018_060d +1008:2bd6 FUN_1008_2bd1 DATA 1 true Stack[0x4] - +1008:2bde FUN_1008_2bd1 CONDITIONAL_JUMP 0 true 1008:2c01 Code2 LAB_1008_2c01 +1008:2be8 FUN_1008_2bd1 DATA 1 true Stack[0x4] - +1008:2bed FUN_1008_2bd1 UNCONDITIONAL_CALL 0 true 1018:085a Code4 FUN_1018_085a FUN_1018_085a +1008:2bf2 FUN_1008_2bd1 DATA 1 true Stack[0x4] - +1008:2bf9 FUN_1008_2bd1 DATA 0 true Stack[0x8] - +1008:2bfc FUN_1008_2bd1 UNCONDITIONAL_CALL 0 true 1228:020c EXTERNAL ENDDIALOG ENDDIALOG +1008:2c0d FUN_1008_2c08 DATA 1 true Stack[0x4] - +1008:2c24 FUN_1008_2c1f DATA 1 true Stack[0x4] - +1008:2c2b FUN_1008_2c1f READ 1 true 1028:064e Data6 DAT_1028_064e +1008:2c33 FUN_1008_2c1f CONDITIONAL_JUMP 0 true 1008:2c5d Code2 LAB_1008_2c5d +1008:2c39 FUN_1008_2c1f CONDITIONAL_JUMP 0 true 1008:2c5d Code2 LAB_1008_2c5d +1008:2c3b FUN_1008_2c1f READ 1 true 1028:064e Data6 DAT_1028_064e +1008:2c4b FUN_1008_2c1f CONDITIONAL_JUMP 0 true 1008:2c4e Code2 LAB_1008_2c4e +1008:2c50 FUN_1008_2c1f DATA 1 true Stack[0x8] - +1008:2c5b FUN_1008_2c1f UNCONDITIONAL_JUMP 0 true 1008:2c7c Code2 LAB_1008_2c7c +1008:2c5d FUN_1008_2c1f DATA 1 true Stack[0x4] - +1008:2c6c FUN_1008_2c1f CONDITIONAL_JUMP 0 true 1008:2c6f Code2 LAB_1008_2c6f +1008:2c71 FUN_1008_2c1f DATA 1 true Stack[0x8] - +1008:2c8b FUN_1008_2c83 DATA 1 true Stack[0x8] - +1008:2c92 FUN_1008_2c83 UNCONDITIONAL_CALL 0 true 1228:01a4 EXTERNAL SETFOCUS SETFOCUS +1008:2c97 FUN_1008_2c83 DATA 1 true Stack[0x8] - +1008:2c9e FUN_1008_2c83 UNCONDITIONAL_CALL 0 true 1018:0097 Code4 FUN_1018_0097 FUN_1018_0097 +1008:2ca3 FUN_1008_2c83 DATA 0 true Stack[-0x8] - +1008:2ca6 FUN_1008_2c83 DATA 0 true Stack[-0x6] - +1008:2ca9 FUN_1008_2c83 DATA 1 true Stack[-0x8] - +1008:2cac FUN_1008_2c83 DATA 1 true Stack[-0x6] - +1008:2caf FUN_1008_2c83 CONDITIONAL_JUMP 0 true 1008:2ccd Code2 LAB_1008_2ccd +1008:2cb1 FUN_1008_2c83 DATA 1 true Stack[-0x8] - +1008:2cbc FUN_1008_2c83 CONDITIONAL_JUMP 0 true 1008:2ccd Code2 LAB_1008_2ccd +1008:2cbe FUN_1008_2c83 DATA 1 true Stack[-0x8] - +1008:2ccd FUN_1008_2c83 WRITE 0 true 1028:06f2 Data6 DAT_1028_06f2 +1008:2cde FUN_1008_2cd9 DATA 1 true Stack[0x8] - +1008:2cf7 FUN_1008_2cf2 DATA 1 true Stack[0x4] - +1008:2cff FUN_1008_2cf2 CONDITIONAL_JUMP 0 true 1008:2d29 Code2 LAB_1008_2d29 +1008:2d0b FUN_1008_2cf2 CONDITIONAL_JUMP 0 true 1008:2d27 Code2 LAB_1008_2d27 +1008:2d0f FUN_1008_2cf2 DATA 1 true Stack[0x4] - +1008:2d1c FUN_1008_2cf2 DATA 1 true Stack[0x4] - +1008:2d27 FUN_1008_2cf2 UNCONDITIONAL_JUMP 0 true 1008:2d33 Code2 LAB_1008_2d33 +1008:2d29 FUN_1008_2cf2 DATA 1 true Stack[0x4] - +1008:2d2e FUN_1008_2cf2 UNCONDITIONAL_CALL 0 true 1018:0f38 Code4 FUN_1018_0f38 FUN_1018_0f38 +1008:2d3f FUN_1008_2d3a DATA 1 true Stack[0x4] - +1008:2d47 FUN_1008_2d3a CONDITIONAL_JUMP 0 true 1008:2d55 Code2 LAB_1008_2d55 +1008:2d53 FUN_1008_2d3a UNCONDITIONAL_JUMP 0 true 1008:2d5f Code2 LAB_1008_2d5f +1008:2d55 FUN_1008_2d3a DATA 1 true Stack[0x4] - +1008:2d5a FUN_1008_2d3a UNCONDITIONAL_CALL 0 true 1018:0f38 Code4 FUN_1018_0f38 FUN_1018_0f38 +1008:2d6b FUN_1008_2d66 DATA 1 true Stack[0x8] - +1008:2d70 FUN_1008_2d66 DATA 1 true Stack[0x4] - +1008:2d7b FUN_1008_2d66 UNCONDITIONAL_CALL 0 true 1020:16e1 Code5 FUN_1020_16e1 FUN_1020_16e1 +1008:2d8f FUN_1008_2d87 UNCONDITIONAL_CALL 0 true 1020:005d Code5 FUN_1020_005d FUN_1020_005d +1008:2da0 FUN_1008_2d99 UNCONDITIONAL_CALL 0 true 1020:03ef Code5 FUN_1020_03ef FUN_1020_03ef +1008:2da5 FUN_1008_2d99 CONDITIONAL_JUMP 0 true 1008:2da7 Code2 LAB_1008_2da7 +1008:2da7 FUN_1008_2d99 DATA 1 true Stack[0x4] - +1008:2dbb FUN_1008_2db3 DATA 1 true Stack[0x4] - +1008:2dd4 FUN_1008_2dcd UNCONDITIONAL_CALL 0 true 1020:0439 Code5 FUN_1020_0439 FUN_1020_0439 +1008:2de8 FUN_1008_2de0 READ 1 true 1028:06f6 Data6 DAT_1028_06f6 +1008:2deb FUN_1008_2de0 READ 1 true 1028:06f8 Data6 DAT_1028_06f8 +1008:2df1 FUN_1008_2de0 CONDITIONAL_JUMP 0 true 1008:2df4 Code2 LAB_1008_2df4 +1008:2df4 FUN_1008_2de0 DATA 0 true Stack[-0x5] - +1008:2df7 FUN_1008_2de0 DATA 1 true Stack[-0x5] - +1008:2e04 FUN_1008_2dff UNCONDITIONAL_CALL 0 true 1008:2de0 Code2 FUN_1008_2de0 FUN_1008_2de0 +1008:2e0b FUN_1008_2dff CONDITIONAL_JUMP 0 true 1008:2e1d Code2 LAB_1008_2e1d +1008:2e0d FUN_1008_2dff READ 0 true 1028:06f4 Data6 DAT_1028_06f4 +1008:2e11 FUN_1008_2dff UNCONDITIONAL_CALL 0 true 1020:012d Code5 FUN_1020_012d FUN_1020_012d +1008:2e16 FUN_1008_2dff WRITE 0 true 1028:06f6 Data6 DAT_1028_06f6 +1008:2e19 FUN_1008_2dff WRITE 0 true 1028:06f8 Data6 DAT_1028_06f8 +1008:2e2a FUN_1008_2e22 DATA 0 true Stack[0x4] - +1008:2e2e FUN_1008_2e22 CONDITIONAL_JUMP 0 true 1008:2e6c Code2 LAB_1008_2e6c +1008:2e30 FUN_1008_2e22 READ 0 true 1028:06fa Data6 DAT_1028_06fa +1008:2e35 FUN_1008_2e22 CONDITIONAL_JUMP 0 true 1008:2e3e Code2 LAB_1008_2e3e +1008:2e37 FUN_1008_2e22 DATA 0 true Stack[-0x6] - +1008:2e3c FUN_1008_2e22 UNCONDITIONAL_JUMP 0 true 1008:2e6c Code2 LAB_1008_2e6c +1008:2e3e FUN_1008_2e22 UNCONDITIONAL_CALL 0 true 1008:2de0 Code2 FUN_1008_2de0 FUN_1008_2de0 +1008:2e45 FUN_1008_2e22 CONDITIONAL_JUMP 0 true 1008:2e4e Code2 LAB_1008_2e4e +1008:2e49 FUN_1008_2e22 DATA 0 true Stack[-0x6] - +1008:2e4c FUN_1008_2e22 UNCONDITIONAL_JUMP 0 true 1008:2e6c Code2 LAB_1008_2e6c +1008:2e4e FUN_1008_2e22 READ 0 true 1028:06f8 Data6 DAT_1028_06f8 +1008:2e52 FUN_1008_2e22 READ 0 true 1028:06f6 Data6 DAT_1028_06f6 +1008:2e56 FUN_1008_2e22 READ 0 true 1028:06f4 Data6 DAT_1028_06f4 +1008:2e5a FUN_1008_2e22 UNCONDITIONAL_CALL 0 true 1020:0147 Code5 FUN_1020_0147 FUN_1020_0147 +1008:2e61 FUN_1008_2e22 WRITE 0 true 1028:06f6 Data6 DAT_1028_06f6 +1008:2e64 FUN_1008_2e22 WRITE 0 true 1028:06f8 Data6 DAT_1028_06f8 +1008:2e67 FUN_1008_2e22 DATA 0 true Stack[-0x6] - +1008:2e6c FUN_1008_2e22 DATA 1 true Stack[-0x6] - +1008:2e7b FUN_1008_2e76 UNCONDITIONAL_CALL 0 true 1008:2dff Code2 FUN_1008_2dff FUN_1008_2dff +1008:2e86 FUN_1008_2e76 WRITE 0 true 1028:070e Data6 DAT_1028_070e +1008:2e89 FUN_1008_2e76 WRITE 0 true 1028:0710 Data6 DAT_1028_0710 +1008:2e96 FUN_1008_2e92 DATA 1 true Stack[0x4] - +1008:2ead FUN_1008_2ea9 DATA 1 true Stack[0x4] - +1008:2ec5 FUN_1008_2ec0 DATA 1 true Stack[0x6] - +1008:2ec8 FUN_1008_2ec0 DATA 1 true Stack[0xa] - +1008:2ecf FUN_1008_2ec0 DATA 1 true Stack[0x4] - +1008:2ed4 FUN_1008_2ec0 CONDITIONAL_JUMP 0 true 1008:2edd Code2 LAB_1008_2edd +1008:2eea FUN_1008_2ee5 DATA 1 true Stack[0x4] - +1008:2ef6 FUN_1008_2ee5 DATA 1 true Stack[0x4] - +1008:2ef9 FUN_1008_2ee5 DATA 1 true Stack[0x8] - +1008:2f0c FUN_1008_2f07 DATA 1 true Stack[0x6] - +1008:2f0f FUN_1008_2f07 DATA 1 true Stack[0x4] - +1008:2f1c FUN_1008_2f07 DATA 1 true Stack[0x6] - +1008:2f1f FUN_1008_2f07 DATA 1 true Stack[0xa] - +1008:2f34 FUN_1008_2f2f DATA 1 true Stack[0x4] - +1008:2f37 FUN_1008_2f2f DATA 1 true Stack[0x8] - +1008:2f50 FUN_1008_2f4d DATA 0 true Stack[0xa] - +1008:2f53 FUN_1008_2f4d DATA 0 true Stack[0x8] - +1008:2f57 FUN_1008_2f4d UNCONDITIONAL_CALL 0 true 1008:2ea9 Code2 FUN_1008_2ea9 FUN_1008_2ea9 +1008:2f5c FUN_1008_2f4d DATA 0 true Stack[0x6] - +1008:2f5f FUN_1008_2f4d DATA 0 true Stack[0x4] - +1008:2f63 FUN_1008_2f4d UNCONDITIONAL_CALL 0 true 1008:2ee5 Code2 FUN_1008_2ee5 FUN_1008_2ee5 +1008:2f66 FUN_1008_2f4d DATA 1 true Stack[0x8] - +1008:2f69 FUN_1008_2f4d DATA 1 true Stack[0xa] - +1008:2f75 FUN_1008_2f70 DATA 1 true Stack[0x6] - +1008:2f7a FUN_1008_2f70 DATA 1 true Stack[0x4] - +1008:2f7f FUN_1008_2f70 CONDITIONAL_JUMP 0 true 1008:2fb6 Code2 LAB_1008_2fb6 +1008:2f8d FUN_1008_2f70 DATA 1 true Stack[0xa] - +1008:2f92 FUN_1008_2f70 CONDITIONAL_JUMP 0 true 1008:2fb6 Code2 LAB_1008_2fb6 +1008:2f99 FUN_1008_2f70 CONDITIONAL_JUMP 0 true 1008:2fa1 Code2 LAB_1008_2fa1 +1008:2f9d FUN_1008_2f70 CONDITIONAL_JUMP 0 true 1008:2fa1 Code2 LAB_1008_2fa1 +1008:2fa8 FUN_1008_2f70 CONDITIONAL_JUMP 0 true 1008:2fb2 Code2 LAB_1008_2fb2 +1008:2fad FUN_1008_2f70 CONDITIONAL_JUMP 0 true 1008:2fb2 Code2 LAB_1008_2fb2 +1008:2fb4 FUN_1008_2f70 CONDITIONAL_JUMP 0 true 1008:2f90 Code2 LAB_1008_2f90 +1008:2fbf FUN_1008_2fbb DATA 1 true Stack[0x6] - +1008:2fcf FUN_1008_2fbb DATA 1 true Stack[0x4] - +1008:2fd8 FUN_1008_2fbb CONDITIONAL_JUMP 0 true 1008:2fdf Code2 LAB_1008_2fdf +1008:2fe7 FUN_1008_2fe3 DATA 1 true Stack[0x6] - +1008:2ff5 FUN_1008_2fe3 DATA 1 true Stack[0x4] - +1008:2ffe FUN_1008_2fe3 CONDITIONAL_JUMP 0 true 1008:3005 Code2 LAB_1008_3005 +1008:300f FUN_1008_300a DATA 1 true Stack[0x4] - +1008:301c FUN_1008_300a DATA 1 true Stack[0x4] - +1008:301f FUN_1008_300a DATA 1 true Stack[0x8] - +1008:3036 FUN_1008_302c DATA 0 true Stack[-0x8] - +1008:3039 FUN_1008_302c DATA 0 true Stack[-0x6] - +1008:303c FUN_1008_302c DATA 1 true Stack[0x4] - +1008:303f FUN_1008_302c DATA 1 true Stack[0x6] - +1008:3042 FUN_1008_302c CONDITIONAL_JUMP 0 true 1008:308c Code2 LAB_1008_308c +1008:3044 FUN_1008_302c DATA 1 true Stack[0x4] - +1008:304b FUN_1008_302c CONDITIONAL_JUMP 0 true 1008:308c Code2 LAB_1008_308c +1008:304d FUN_1008_302c DATA 0 true Stack[0x6] - +1008:3050 FUN_1008_302c DATA 0 true Stack[0x4] - +1008:3053 FUN_1008_302c UNCONDITIONAL_CALL 0 true 1008:2e92 Code2 FUN_1008_2e92 FUN_1008_2e92 +1008:3059 FUN_1008_302c DATA 0 true Stack[-0xa] - +1008:305c FUN_1008_302c DATA 0 true Stack[-0xa] - +1008:305f FUN_1008_302c UNCONDITIONAL_CALL 0 true 1020:012d Code5 FUN_1020_012d FUN_1020_012d +1008:3064 FUN_1008_302c DATA 0 true Stack[-0xe] - +1008:3067 FUN_1008_302c DATA 0 true Stack[-0xc] - +1008:306a FUN_1008_302c DATA 1 true Stack[-0xe] - +1008:306d FUN_1008_302c DATA 1 true Stack[-0xc] - +1008:3070 FUN_1008_302c CONDITIONAL_JUMP 0 true 1008:308c Code2 LAB_1008_308c +1008:3072 FUN_1008_302c DATA 0 true Stack[-0xc] - +1008:3075 FUN_1008_302c DATA 0 true Stack[-0xe] - +1008:3078 FUN_1008_302c DATA 0 true Stack[0x6] - +1008:307b FUN_1008_302c DATA 0 true Stack[0x4] - +1008:307e FUN_1008_302c DATA 0 true Stack[-0xa] - +1008:3081 FUN_1008_302c UNCONDITIONAL_CALL 0 true 1008:2ec0 Code2 FUN_1008_2ec0 FUN_1008_2ec0 +1008:3086 FUN_1008_302c DATA 0 true Stack[-0x8] - +1008:3089 FUN_1008_302c DATA 0 true Stack[-0x6] - +1008:308c FUN_1008_302c DATA 1 true Stack[-0x8] - +1008:308f FUN_1008_302c DATA 1 true Stack[-0x6] - +1008:309e FUN_1008_3099 DATA 1 true Stack[0x4] - +1008:30a1 FUN_1008_3099 DATA 1 true Stack[0x6] - +1008:30a4 FUN_1008_3099 CONDITIONAL_JUMP 0 true 1008:30be Code2 LAB_1008_30be +1008:30a6 FUN_1008_3099 DATA 0 true Stack[0x6] - +1008:30a9 FUN_1008_3099 DATA 0 true Stack[0x4] - +1008:30ac FUN_1008_3099 DATA 0 true Stack[0x6] - +1008:30af FUN_1008_3099 DATA 0 true Stack[0x4] - +1008:30b2 FUN_1008_3099 UNCONDITIONAL_CALL 0 true 1008:2e92 Code2 FUN_1008_2e92 FUN_1008_2e92 +1008:30b9 FUN_1008_3099 UNCONDITIONAL_CALL 0 true 1020:0147 Code5 FUN_1020_0147 FUN_1020_0147 +1010:0007 FUN_1010_0002 READ 0 true 1028:4781 Data6 DAT_1028_4781 +1010:000c FUN_1010_0002 CONDITIONAL_JUMP 0 true 1010:0017 Code3 LAB_1010_0017 +1010:000e FUN_1010_0002 READ 0 true 1028:4781 Data6 DAT_1028_4781 +1010:0012 FUN_1010_0002 UNCONDITIONAL_CALL 0 true 1228:0064 EXTERNAL FREELIBRARY FREELIBRARY +1010:0017 FUN_1010_0002 WRITE 0 true 1028:4784 Data6 DAT_1028_4784 +1010:001e FUN_1010_0002 WRITE 0 true 1028:4750 Data6 DAT_1028_4750 +1010:0021 FUN_1010_0002 WRITE 0 true 1028:4752 Data6 DAT_1028_4752 +1010:0026 FUN_1010_0002 WRITE 0 true 1028:4754 Data6 DAT_1028_4754 +1010:0029 FUN_1010_0002 WRITE 0 true 1028:4756 Data6 DAT_1028_4756 +1010:002e FUN_1010_0002 WRITE 0 true 1028:4758 Data6 DAT_1028_4758 +1010:0031 FUN_1010_0002 WRITE 0 true 1028:475a Data6 DAT_1028_475a +1010:0036 FUN_1010_0002 WRITE 0 true 1028:475c Data6 DAT_1028_475c +1010:0039 FUN_1010_0002 WRITE 0 true 1028:475e Data6 DAT_1028_475e +1010:003e FUN_1010_0002 WRITE 0 true 1028:4760 Data6 DAT_1028_4760 +1010:0041 FUN_1010_0002 WRITE 0 true 1028:4762 Data6 DAT_1028_4762 +1010:0046 FUN_1010_0002 WRITE 0 true 1028:4764 Data6 DAT_1028_4764 +1010:0049 FUN_1010_0002 WRITE 0 true 1028:4766 Data6 DAT_1028_4766 +1010:004e FUN_1010_0002 WRITE 0 true 1028:4768 Data6 DAT_1028_4768 +1010:0051 FUN_1010_0002 WRITE 0 true 1028:476a Data6 DAT_1028_476a +1010:0056 FUN_1010_0002 WRITE 0 true 1028:476c Data6 DAT_1028_476c +1010:0059 FUN_1010_0002 WRITE 0 true 1028:476e Data6 DAT_1028_476e +1010:005e FUN_1010_0002 WRITE 0 true 1028:4770 Data6 DAT_1028_4770 +1010:0061 FUN_1010_0002 WRITE 0 true 1028:4772 Data6 DAT_1028_4772 +1010:0066 FUN_1010_0002 WRITE 0 true 1028:4774 Data6 DAT_1028_4774 +1010:0069 FUN_1010_0002 WRITE 0 true 1028:4776 Data6 DAT_1028_4776 +1010:006e FUN_1010_0002 WRITE 0 true 1028:4778 Data6 DAT_1028_4778 +1010:0071 FUN_1010_0002 WRITE 0 true 1028:477a Data6 DAT_1028_477a +1010:007e FUN_1010_0079 READ 0 true 1028:4784 Data6 DAT_1028_4784 +1010:0083 FUN_1010_0079 CONDITIONAL_JUMP 0 true 1010:009d Code3 LAB_1010_009d +1010:0085 FUN_1010_0079 READ 1 true 1028:4778 Data6 DAT_1028_4778 +1010:0088 FUN_1010_0079 READ 1 true 1028:477a Data6 DAT_1028_477a +1010:008c FUN_1010_0079 CONDITIONAL_JUMP 0 true 1010:009d Code3 LAB_1010_009d +1010:008e FUN_1010_0079 UNCONDITIONAL_CALL 0 true 1228:0020 EXTERNAL GETCURRENTTASK GETCURRENTTASK +1010:0094 FUN_1010_0079 READ 0 true 1028:477a Data6 DAT_1028_477a +1010:0094 FUN_1010_0079 READ 0 false 1028:4778 Data6 DAT_1028_4778 +1010:0098 FUN_1010_0079 UNCONDITIONAL_CALL 0 true 1010:0002 Code3 FUN_1010_0002 FUN_1010_0002 +1010:00ab FUN_1010_00a2 DATA 0 true Stack[-0x5] - +1010:00af FUN_1010_00a2 DATA 0 true Stack[-0x155] - +1010:00b4 FUN_1010_00a2 DATA 0 true Stack[-0x55] - +1010:00b9 FUN_1010_00a2 DATA 0 true Stack[0xa] - +1010:00bc FUN_1010_00a2 DATA 0 true Stack[0x8] - +1010:00bf FUN_1010_00a2 DATA 0 true Stack[-0x155] - +1010:00c5 FUN_1010_00a2 UNCONDITIONAL_CALL 0 true 1008:2643 Code2 FUN_1008_2643 FUN_1008_2643 +1010:00ca FUN_1010_00a2 DATA 0 true Stack[-0x55] - +1010:00ce FUN_1010_00a2 CONDITIONAL_JUMP 0 true 1010:00d7 Code3 LAB_1010_00d7 +1010:00d0 FUN_1010_00a2 DATA 0 true Stack[-0x5] - +1010:00d4 FUN_1010_00a2 UNCONDITIONAL_JUMP 0 true 1010:01b8 Code3 LAB_1010_01b8 +1010:00d7 FUN_1010_00a2 DATA 0 true Stack[-0x155] - +1010:00e0 FUN_1010_00a2 UNCONDITIONAL_CALL 0 true 1228:007c EXTERNAL GETWINDOWSDIRECTORY GETWINDOWSDIRECTORY +1010:00e5 FUN_1010_00a2 DATA 0 true Stack[-0x55] - +1010:00ea FUN_1010_00a2 DATA 0 true Stack[0xa] - +1010:00ed FUN_1010_00a2 DATA 0 true Stack[0x8] - +1010:00f0 FUN_1010_00a2 DATA 0 true Stack[-0x155] - +1010:00f6 FUN_1010_00a2 UNCONDITIONAL_CALL 0 true 1008:2643 Code2 FUN_1008_2643 FUN_1008_2643 +1010:00fb FUN_1010_00a2 DATA 0 true Stack[-0x55] - +1010:00ff FUN_1010_00a2 CONDITIONAL_JUMP 0 true 1010:0108 Code3 LAB_1010_0108 +1010:0101 FUN_1010_00a2 DATA 0 true Stack[-0x5] - +1010:0105 FUN_1010_00a2 UNCONDITIONAL_JUMP 0 true 1010:01b8 Code3 LAB_1010_01b8 +1010:0108 FUN_1010_00a2 DATA 0 true Stack[-0x155] - +1010:0111 FUN_1010_00a2 UNCONDITIONAL_CALL 0 true 1228:0080 EXTERNAL GETSYSTEMDIRECTORY GETSYSTEMDIRECTORY +1010:0116 FUN_1010_00a2 DATA 0 true Stack[-0x55] - +1010:011b FUN_1010_00a2 DATA 0 true Stack[0xa] - +1010:011e FUN_1010_00a2 DATA 0 true Stack[0x8] - +1010:0121 FUN_1010_00a2 DATA 0 true Stack[-0x155] - +1010:0127 FUN_1010_00a2 UNCONDITIONAL_CALL 0 true 1008:2643 Code2 FUN_1008_2643 FUN_1008_2643 +1010:012c FUN_1010_00a2 DATA 0 true Stack[-0x55] - +1010:0130 FUN_1010_00a2 CONDITIONAL_JUMP 0 true 1010:0139 Code3 LAB_1010_0139 +1010:0132 FUN_1010_00a2 DATA 0 true Stack[-0x5] - +1010:0136 FUN_1010_00a2 UNCONDITIONAL_JUMP 0 true 1010:01b8 Code3 LAB_1010_01b8 +1010:0139 FUN_1010_00a2 DATA 0 true Stack[0x6] - +1010:013c FUN_1010_00a2 DATA 0 true Stack[0x4] - +1010:013f FUN_1010_00a2 UNCONDITIONAL_CALL 0 true 1228:0024 EXTERNAL GETMODULEHANDLE GETMODULEHANDLE +1010:0145 FUN_1010_00a2 DATA 0 true Stack[-0x155] - +1010:014e FUN_1010_00a2 UNCONDITIONAL_CALL 0 true 1228:0028 EXTERNAL GETMODULEFILENAME GETMODULEFILENAME +1010:0153 FUN_1010_00a2 DATA 0 true Stack[-0x155] - +1010:0159 FUN_1010_00a2 DATA 0 true Stack[-0x155] - +1010:015f FUN_1010_00a2 DATA 0 true Stack[-0x163] - +1010:0165 FUN_1010_00a2 DATA 0 true Stack[-0x15a] - +1010:016b FUN_1010_00a2 UNCONDITIONAL_CALL 0 true 1008:26b0 Code2 FUN_1008_26b0 FUN_1008_26b0 +1010:0170 FUN_1010_00a2 DATA 0 true Stack[-0x55] - +1010:0175 FUN_1010_00a2 DATA 0 true Stack[0xa] - +1010:0178 FUN_1010_00a2 DATA 0 true Stack[0x8] - +1010:017b FUN_1010_00a2 DATA 0 true Stack[-0x155] - +1010:0181 FUN_1010_00a2 UNCONDITIONAL_CALL 0 true 1008:2643 Code2 FUN_1008_2643 FUN_1008_2643 +1010:0186 FUN_1010_00a2 DATA 0 true Stack[-0x55] - +1010:018a FUN_1010_00a2 CONDITIONAL_JUMP 0 true 1010:0192 Code3 LAB_1010_0192 +1010:018c FUN_1010_00a2 DATA 0 true Stack[-0x5] - +1010:0190 FUN_1010_00a2 UNCONDITIONAL_JUMP 0 true 1010:01b8 Code3 LAB_1010_01b8 +1010:0192 FUN_1010_00a2 DATA 0 true Stack[-0x55] - +1010:0197 FUN_1010_00a2 DATA 0 true Stack[0xa] - +1010:019a FUN_1010_00a2 DATA 0 true Stack[0x8] - +1010:01a2 FUN_1010_00a2 UNCONDITIONAL_CALL 0 true 1008:2819 Code2 FUN_1008_2819 FUN_1008_2819 +1010:01a9 FUN_1010_00a2 UNCONDITIONAL_CALL 0 true 1008:2643 Code2 FUN_1008_2643 FUN_1008_2643 +1010:01ae FUN_1010_00a2 DATA 0 true Stack[-0x55] - +1010:01b2 FUN_1010_00a2 CONDITIONAL_JUMP 0 true 1010:01b8 Code3 LAB_1010_01b8 +1010:01b4 FUN_1010_00a2 DATA 0 true Stack[-0x5] - +1010:01b8 FUN_1010_00a2 DATA 1 true Stack[-0x5] - +1010:01ca FUN_1010_01c2 DATA 0 true Stack[-0x5] - +1010:01ce FUN_1010_01c2 READ 0 true 1028:4784 Data6 DAT_1028_4784 +1010:01d3 FUN_1010_01c2 CONDITIONAL_JUMP 0 true 1010:01d8 Code3 LAB_1010_01d8 +1010:01d5 FUN_1010_01c2 UNCONDITIONAL_JUMP 0 true 1010:03a5 Code3 LAB_1010_03a5 +1010:01d8 FUN_1010_01c2 READ 0 true 1028:478c Data6 DAT_1028_478c +1010:01dd FUN_1010_01c2 CONDITIONAL_JUMP 0 true 1010:0209 Code3 LAB_1010_0209 +1010:01e4 FUN_1010_01c2 DATA 0 true Stack[0xc] - +1010:01e7 FUN_1010_01c2 DATA 0 true Stack[0xa] - +1010:01ea FUN_1010_01c2 UNCONDITIONAL_CALL 0 true 1010:00a2 Code3 FUN_1010_00a2 FUN_1010_00a2 +1010:01f1 FUN_1010_01c2 CONDITIONAL_JUMP 0 true 1010:0202 Code3 LAB_1010_0202 +1010:01f8 FUN_1010_01c2 UNCONDITIONAL_CALL 0 true 1228:0060 EXTERNAL LOADLIBRARY LOADLIBRARY +1010:01fd FUN_1010_01c2 WRITE 0 true 1028:4781 Data6 DAT_1028_4781 +1010:0200 FUN_1010_01c2 UNCONDITIONAL_JUMP 0 true 1010:0207 Code3 LAB_1010_0207 +1010:0204 FUN_1010_01c2 WRITE 0 true 1028:4781 Data6 DAT_1028_4781 +1010:0207 FUN_1010_01c2 UNCONDITIONAL_JUMP 0 true 1010:0225 Code3 LAB_1010_0225 +1010:020c FUN_1010_01c2 UNCONDITIONAL_CALL 0 true 1228:0068 EXTERNAL SETERRORMODE SETERRORMODE +1010:0216 FUN_1010_01c2 UNCONDITIONAL_CALL 0 true 1228:0060 EXTERNAL LOADLIBRARY LOADLIBRARY +1010:021b FUN_1010_01c2 WRITE 0 true 1028:4781 Data6 DAT_1028_4781 +1010:0220 FUN_1010_01c2 UNCONDITIONAL_CALL 0 true 1228:0068 EXTERNAL SETERRORMODE SETERRORMODE +1010:0225 FUN_1010_01c2 READ 0 true 1028:4781 Data6 DAT_1028_4781 +1010:022a FUN_1010_01c2 CONDITIONAL_JUMP 0 true 1010:022f Code3 LAB_1010_022f +1010:022c FUN_1010_01c2 UNCONDITIONAL_JUMP 0 true 1010:039f Code3 LAB_1010_039f +1010:022f FUN_1010_01c2 READ 0 true 1028:4781 Data6 DAT_1028_4781 +1010:0238 FUN_1010_01c2 UNCONDITIONAL_CALL 0 true 1228:002c EXTERNAL GETPROCADDRESS GETPROCADDRESS +1010:023d FUN_1010_01c2 WRITE 0 true 1028:4750 Data6 DAT_1028_4750 +1010:0240 FUN_1010_01c2 WRITE 0 true 1028:4752 Data6 DAT_1028_4752 +1010:0244 FUN_1010_01c2 READ 0 true 1028:4781 Data6 DAT_1028_4781 +1010:024d FUN_1010_01c2 UNCONDITIONAL_CALL 0 true 1228:002c EXTERNAL GETPROCADDRESS GETPROCADDRESS +1010:0252 FUN_1010_01c2 WRITE 0 true 1028:4754 Data6 DAT_1028_4754 +1010:0255 FUN_1010_01c2 WRITE 0 true 1028:4756 Data6 DAT_1028_4756 +1010:0259 FUN_1010_01c2 READ 0 true 1028:4781 Data6 DAT_1028_4781 +1010:0262 FUN_1010_01c2 UNCONDITIONAL_CALL 0 true 1228:002c EXTERNAL GETPROCADDRESS GETPROCADDRESS +1010:0267 FUN_1010_01c2 WRITE 0 true 1028:4758 Data6 DAT_1028_4758 +1010:026a FUN_1010_01c2 WRITE 0 true 1028:475a Data6 DAT_1028_475a +1010:026e FUN_1010_01c2 READ 0 true 1028:4781 Data6 DAT_1028_4781 +1010:0277 FUN_1010_01c2 UNCONDITIONAL_CALL 0 true 1228:002c EXTERNAL GETPROCADDRESS GETPROCADDRESS +1010:027c FUN_1010_01c2 WRITE 0 true 1028:475c Data6 DAT_1028_475c +1010:027f FUN_1010_01c2 WRITE 0 true 1028:475e Data6 DAT_1028_475e +1010:0283 FUN_1010_01c2 READ 0 true 1028:4781 Data6 DAT_1028_4781 +1010:028c FUN_1010_01c2 UNCONDITIONAL_CALL 0 true 1228:002c EXTERNAL GETPROCADDRESS GETPROCADDRESS +1010:0291 FUN_1010_01c2 WRITE 0 true 1028:4760 Data6 DAT_1028_4760 +1010:0294 FUN_1010_01c2 WRITE 0 true 1028:4762 Data6 DAT_1028_4762 +1010:0298 FUN_1010_01c2 READ 0 true 1028:4781 Data6 DAT_1028_4781 +1010:02a1 FUN_1010_01c2 UNCONDITIONAL_CALL 0 true 1228:002c EXTERNAL GETPROCADDRESS GETPROCADDRESS +1010:02a6 FUN_1010_01c2 WRITE 0 true 1028:4764 Data6 DAT_1028_4764 +1010:02a9 FUN_1010_01c2 WRITE 0 true 1028:4766 Data6 DAT_1028_4766 +1010:02ad FUN_1010_01c2 READ 0 true 1028:4781 Data6 DAT_1028_4781 +1010:02b6 FUN_1010_01c2 UNCONDITIONAL_CALL 0 true 1228:002c EXTERNAL GETPROCADDRESS GETPROCADDRESS +1010:02bb FUN_1010_01c2 WRITE 0 true 1028:4768 Data6 DAT_1028_4768 +1010:02be FUN_1010_01c2 WRITE 0 true 1028:476a Data6 DAT_1028_476a +1010:02c2 FUN_1010_01c2 READ 0 true 1028:4781 Data6 DAT_1028_4781 +1010:02cb FUN_1010_01c2 UNCONDITIONAL_CALL 0 true 1228:002c EXTERNAL GETPROCADDRESS GETPROCADDRESS +1010:02d0 FUN_1010_01c2 WRITE 0 true 1028:476c Data6 DAT_1028_476c +1010:02d3 FUN_1010_01c2 WRITE 0 true 1028:476e Data6 DAT_1028_476e +1010:02d7 FUN_1010_01c2 READ 0 true 1028:478c Data6 DAT_1028_478c +1010:02dc FUN_1010_01c2 CONDITIONAL_JUMP 0 true 1010:02f5 Code3 LAB_1010_02f5 +1010:02de FUN_1010_01c2 READ 0 true 1028:4781 Data6 DAT_1028_4781 +1010:02e7 FUN_1010_01c2 UNCONDITIONAL_CALL 0 true 1228:002c EXTERNAL GETPROCADDRESS GETPROCADDRESS +1010:02ec FUN_1010_01c2 WRITE 0 true 1028:4770 Data6 DAT_1028_4770 +1010:02ef FUN_1010_01c2 WRITE 0 true 1028:4772 Data6 DAT_1028_4772 +1010:02f3 FUN_1010_01c2 UNCONDITIONAL_JUMP 0 true 1010:02fd Code3 LAB_1010_02fd +1010:02f7 FUN_1010_01c2 WRITE 0 true 1028:4770 Data6 DAT_1028_4770 +1010:02fa FUN_1010_01c2 WRITE 0 true 1028:4772 Data6 DAT_1028_4772 +1010:02fd FUN_1010_01c2 READ 0 true 1028:4781 Data6 DAT_1028_4781 +1010:0306 FUN_1010_01c2 UNCONDITIONAL_CALL 0 true 1228:002c EXTERNAL GETPROCADDRESS GETPROCADDRESS +1010:030b FUN_1010_01c2 WRITE 0 true 1028:4774 Data6 DAT_1028_4774 +1010:030e FUN_1010_01c2 WRITE 0 true 1028:4776 Data6 DAT_1028_4776 +1010:0312 FUN_1010_01c2 READ 0 true 1028:4781 Data6 DAT_1028_4781 +1010:031b FUN_1010_01c2 UNCONDITIONAL_CALL 0 true 1228:002c EXTERNAL GETPROCADDRESS GETPROCADDRESS +1010:0320 FUN_1010_01c2 WRITE 0 true 1028:4778 Data6 DAT_1028_4778 +1010:0323 FUN_1010_01c2 WRITE 0 true 1028:477a Data6 DAT_1028_477a +1010:0327 FUN_1010_01c2 UNCONDITIONAL_CALL 0 true 1228:0020 EXTERNAL GETCURRENTTASK GETCURRENTTASK +1010:032d FUN_1010_01c2 READ 0 true 1028:476a Data6 DAT_1028_476a +1010:032d FUN_1010_01c2 READ 0 false 1028:4768 Data6 DAT_1028_4768 +1010:0337 FUN_1010_01c2 WRITE 0 true 1028:4784 Data6 DAT_1028_4784 +1010:033a FUN_1010_01c2 READ 0 true 1028:4784 Data6 DAT_1028_4784 +1010:033f FUN_1010_01c2 CONDITIONAL_JUMP 0 true 1010:0360 Code3 LAB_1010_0360 +1010:0341 FUN_1010_01c2 READ 0 true 1028:4766 Data6 DAT_1028_4766 +1010:0341 FUN_1010_01c2 READ 0 false 1028:4764 Data6 DAT_1028_4764 +1010:0345 FUN_1010_01c2 WRITE 0 true 1028:477c Data6 DAT_1028_477c +1010:0348 FUN_1010_01c2 READ 0 true 1028:475e Data6 DAT_1028_475e +1010:0348 FUN_1010_01c2 READ 0 false 1028:475c Data6 DAT_1028_475c +1010:034e FUN_1010_01c2 CONDITIONAL_JUMP 0 true 1010:0357 Code3 LAB_1010_0357 +1010:0350 FUN_1010_01c2 READ 0 true 1028:477c Data6 DAT_1028_477c +1010:0355 FUN_1010_01c2 CONDITIONAL_JUMP 0 true 1010:035b Code3 LAB_1010_035b +1010:0359 FUN_1010_01c2 UNCONDITIONAL_JUMP 0 true 1010:035d Code3 LAB_1010_035d +1010:035d FUN_1010_01c2 WRITE 0 true 1028:4784 Data6 DAT_1028_4784 +1010:0360 FUN_1010_01c2 READ 0 true 1028:4784 Data6 DAT_1028_4784 +1010:0365 FUN_1010_01c2 CONDITIONAL_JUMP 0 true 1010:036e Code3 LAB_1010_036e +1010:0367 FUN_1010_01c2 UNCONDITIONAL_CALL 0 true 1010:0002 Code3 FUN_1010_0002 FUN_1010_0002 +1010:036c FUN_1010_01c2 UNCONDITIONAL_JUMP 0 true 1010:039f Code3 LAB_1010_039f +1010:036e FUN_1010_01c2 DATA 1 true Stack[0x6] - +1010:0371 FUN_1010_01c2 WRITE 0 true 1028:477f Data6 DAT_1028_477f +1010:0374 FUN_1010_01c2 DATA 1 true Stack[0x4] - +1010:0377 FUN_1010_01c2 WRITE 0 true 1028:4780 Data6 DAT_1028_4780 +1010:037a FUN_1010_01c2 READ 0 true 1028:478c Data6 DAT_1028_478c +1010:037f FUN_1010_01c2 CONDITIONAL_JUMP 0 true 1010:039a Code3 LAB_1010_039a +1010:0381 FUN_1010_01c2 DATA 0 true Stack[0x8] - +1010:0385 FUN_1010_01c2 CONDITIONAL_JUMP 0 true 1010:039a Code3 LAB_1010_039a +1010:0387 FUN_1010_01c2 READ 0 true 1028:06fe Data6 DAT_1028_06fe +1010:038b FUN_1010_01c2 READ 0 true 1028:4752 Data6 DAT_1028_4752 +1010:038b FUN_1010_01c2 READ 0 false 1028:4750 Data6 DAT_1028_4750 +1010:0395 FUN_1010_01c2 WRITE 0 true 1028:477e Data6 DAT_1028_477e +1010:0398 FUN_1010_01c2 UNCONDITIONAL_JUMP 0 true 1010:039f Code3 LAB_1010_039f +1010:039a FUN_1010_01c2 WRITE 0 true 1028:477e Data6 DAT_1028_477e +1010:039f FUN_1010_01c2 READ 1 true 1028:4784 Data6 DAT_1028_4784 +1010:03a2 FUN_1010_01c2 DATA 0 true Stack[-0x5] - +1010:03a5 FUN_1010_01c2 DATA 1 true Stack[-0x5] - +1010:03b7 FUN_1010_03af DATA 0 true Stack[0xc] - +1010:03ba FUN_1010_03af DATA 0 true Stack[0xa] - +1010:03bd FUN_1010_03af DATA 1 true Stack[0x8] - +1010:03c1 FUN_1010_03af DATA 1 true Stack[0x6] - +1010:03c5 FUN_1010_03af DATA 1 true Stack[0x4] - +1010:03c9 FUN_1010_03af UNCONDITIONAL_CALL 0 true 1010:01c2 Code3 FUN_1010_01c2 FUN_1010_01c2 +1010:03ce FUN_1010_03af DATA 0 true Stack[-0x5] - +1010:03d1 FUN_1010_03af WRITE 0 true 1028:4783 Data6 DAT_1028_4783 +1010:03d6 FUN_1010_03af DATA 1 true Stack[-0x5] - +1010:03e5 FUN_1010_03e0 UNCONDITIONAL_CALL 0 true 1010:0079 Code3 FUN_1010_0079 FUN_1010_0079 +1010:03ed FUN_1010_03e0 DATA 1 true Stack[0x4] - +1010:03f2 FUN_1010_03e0 UNCONDITIONAL_CALL 0 true 1018:1b08 Code4 FUN_1018_1b08 FUN_1018_1b08 +1010:03f9 FUN_1010_03e0 UNCONDITIONAL_CALL 0 true 1020:0439 Code5 FUN_1020_0439 FUN_1020_0439 +1010:0415 FUN_1010_0405 DATA 0 true Stack[-0x105] - +1010:0419 FUN_1010_0405 DATA 1 true Stack[0x4] - +1010:0425 FUN_1010_0405 DATA 0 true Stack[-0x185] - +1010:042b FUN_1010_0405 DATA 0 true Stack[-0x105] - +1010:0431 FUN_1010_0405 UNCONDITIONAL_CALL 0 true 1020:0667 Code5 FUN_1020_0667 FUN_1020_0667 +1010:0436 FUN_1010_0405 DATA 0 true Stack[-0x185] - +1010:043e FUN_1010_0405 UNCONDITIONAL_CALL 0 true 1020:06ab Code5 FUN_1020_06ab FUN_1020_06ab +1010:0443 FUN_1010_0405 UNCONDITIONAL_CALL 0 true 1020:0388 Code5 FUN_1020_0388 FUN_1020_0388 +1010:044a FUN_1010_0405 CONDITIONAL_JUMP 0 true 1010:0462 Code3 LAB_1010_0462 +1010:044c FUN_1010_0405 DATA 0 true Stack[-0x5] - +1010:0450 FUN_1010_0405 DATA 0 true Stack[-0x185] - +1010:0456 FUN_1010_0405 UNCONDITIONAL_CALL 0 true 1020:072c Code5 FUN_1020_072c FUN_1020_072c +1010:045b FUN_1010_0405 UNCONDITIONAL_CALL 0 true 1020:038f Code5 FUN_1020_038f FUN_1020_038f +1010:0460 FUN_1010_0405 UNCONDITIONAL_JUMP 0 true 1010:0466 Code3 LAB_1010_0466 +1010:0462 FUN_1010_0405 DATA 0 true Stack[-0x5] - +1010:0466 FUN_1010_0405 DATA 1 true Stack[-0x5] - +1010:047e FUN_1010_0472 UNCONDITIONAL_CALL 0 true 1228:0080 EXTERNAL GETSYSTEMDIRECTORY GETSYSTEMDIRECTORY +1010:0483 FUN_1010_0472 WRITE 0 true 1028:47a2 Data6 DAT_1028_47a2 +1010:0486 FUN_1010_0472 DATA 0 true Stack[-0x102] - +1010:0491 FUN_1010_0472 UNCONDITIONAL_CALL 0 true 1008:300a Code2 FUN_1008_300a FUN_1008_300a +1010:049b FUN_1010_0472 UNCONDITIONAL_CALL 0 true 1020:0a51 Code5 FUN_1020_0a51 FUN_1020_0a51 +1010:04a0 FUN_1010_0472 DATA 0 true Stack[-0x202] - +1010:04ab FUN_1010_0472 UNCONDITIONAL_CALL 0 true 1008:300a Code2 FUN_1008_300a FUN_1008_300a +1010:04b0 FUN_1010_0472 UNCONDITIONAL_CALL 0 true 1020:0a51 Code5 FUN_1020_0a51 FUN_1020_0a51 +1010:04bd FUN_1010_0472 UNCONDITIONAL_CALL 0 true 1020:09ec Code5 FUN_1020_09ec FUN_1020_09ec +1010:04c2 FUN_1010_0472 DATA 0 true Stack[-0x102] - +1010:04cd FUN_1010_0472 UNCONDITIONAL_CALL 0 true 1008:300a Code2 FUN_1008_300a FUN_1008_300a +1010:04d7 FUN_1010_0472 UNCONDITIONAL_CALL 0 true 1020:0a51 Code5 FUN_1020_0a51 FUN_1020_0a51 +1010:04dc FUN_1010_0472 DATA 0 true Stack[-0x202] - +1010:04e7 FUN_1010_0472 UNCONDITIONAL_CALL 0 true 1008:300a Code2 FUN_1008_300a FUN_1008_300a +1010:04ec FUN_1010_0472 UNCONDITIONAL_CALL 0 true 1020:0a51 Code5 FUN_1020_0a51 FUN_1020_0a51 +1010:04f9 FUN_1010_0472 UNCONDITIONAL_CALL 0 true 1020:09ec Code5 FUN_1020_09ec FUN_1020_09ec +1010:04fe FUN_1010_0472 READ 0 true 1028:47a2 Data6 DAT_1028_47a2 +1010:0503 FUN_1010_0472 CONDITIONAL_JUMP 0 true 1010:0555 Code3 LAB_1010_0555 +1010:050a FUN_1010_0472 DATA 0 true Stack[-0x102] - +1010:0515 FUN_1010_0472 UNCONDITIONAL_CALL 0 true 1008:300a Code2 FUN_1008_300a FUN_1008_300a +1010:051a FUN_1010_0472 UNCONDITIONAL_CALL 0 true 1008:2f2f Code2 FUN_1008_2f2f FUN_1008_2f2f +1010:0524 FUN_1010_0472 UNCONDITIONAL_CALL 0 true 1010:0405 Code3 FUN_1010_0405 FUN_1010_0405 +1010:052b FUN_1010_0472 CONDITIONAL_JUMP 0 true 1010:0555 Code3 LAB_1010_0555 +1010:0532 FUN_1010_0472 UNCONDITIONAL_CALL 0 true 1010:0405 Code3 FUN_1010_0405 FUN_1010_0405 +1010:0539 FUN_1010_0472 CONDITIONAL_JUMP 0 true 1010:0555 Code3 LAB_1010_0555 +1010:0540 FUN_1010_0472 DATA 0 true Stack[-0x102] - +1010:054b FUN_1010_0472 UNCONDITIONAL_CALL 0 true 1008:300a Code2 FUN_1008_300a FUN_1008_300a +1010:0550 FUN_1010_0472 UNCONDITIONAL_CALL 0 true 1008:2f2f Code2 FUN_1008_2f2f FUN_1008_2f2f +1010:0557 FUN_1010_0472 WRITE 0 true 1028:4750 Data6 DAT_1028_4750 +1010:055a FUN_1010_0472 WRITE 0 true 1028:4752 Data6 DAT_1028_4752 +1010:055f FUN_1010_0472 WRITE 0 true 1028:4754 Data6 DAT_1028_4754 +1010:0562 FUN_1010_0472 WRITE 0 true 1028:4756 Data6 DAT_1028_4756 +1010:0567 FUN_1010_0472 WRITE 0 true 1028:4758 Data6 DAT_1028_4758 +1010:056a FUN_1010_0472 WRITE 0 true 1028:475a Data6 DAT_1028_475a +1010:056f FUN_1010_0472 WRITE 0 true 1028:475c Data6 DAT_1028_475c +1010:0572 FUN_1010_0472 WRITE 0 true 1028:475e Data6 DAT_1028_475e +1010:0577 FUN_1010_0472 WRITE 0 true 1028:4760 Data6 DAT_1028_4760 +1010:057a FUN_1010_0472 WRITE 0 true 1028:4762 Data6 DAT_1028_4762 +1010:057f FUN_1010_0472 WRITE 0 true 1028:4764 Data6 DAT_1028_4764 +1010:0582 FUN_1010_0472 WRITE 0 true 1028:4766 Data6 DAT_1028_4766 +1010:0587 FUN_1010_0472 WRITE 0 true 1028:4768 Data6 DAT_1028_4768 +1010:058a FUN_1010_0472 WRITE 0 true 1028:476a Data6 DAT_1028_476a +1010:058f FUN_1010_0472 WRITE 0 true 1028:476c Data6 DAT_1028_476c +1010:0592 FUN_1010_0472 WRITE 0 true 1028:476e Data6 DAT_1028_476e +1010:0597 FUN_1010_0472 WRITE 0 true 1028:4770 Data6 DAT_1028_4770 +1010:059a FUN_1010_0472 WRITE 0 true 1028:4772 Data6 DAT_1028_4772 +1010:059f FUN_1010_0472 WRITE 0 true 1028:4774 Data6 DAT_1028_4774 +1010:05a2 FUN_1010_0472 WRITE 0 true 1028:4776 Data6 DAT_1028_4776 +1010:05a7 FUN_1010_0472 WRITE 0 true 1028:4778 Data6 DAT_1028_4778 +1010:05aa FUN_1010_0472 WRITE 0 true 1028:477a Data6 DAT_1028_477a +1010:05ad FUN_1010_0472 UNCONDITIONAL_CALL 0 true 1228:0000 EXTERNAL GETVERSION GETVERSION +1010:05b2 FUN_1010_0472 WRITE 0 true 1028:478a Data6 DAT_1028_478a +1010:05b5 FUN_1010_0472 READ 0 true 1028:478a Data6 DAT_1028_478a +1010:05ba FUN_1010_0472 CONDITIONAL_JUMP 0 true 1010:05c3 Code3 LAB_1010_05c3 +1010:05bc FUN_1010_0472 READ 0 true 1028:478b Data6 DAT_1028_478b +1010:05c1 FUN_1010_0472 CONDITIONAL_JUMP 0 true 1010:05c7 Code3 LAB_1010_05c7 +1010:05c5 FUN_1010_0472 UNCONDITIONAL_JUMP 0 true 1010:05c9 Code3 LAB_1010_05c9 +1010:05c9 FUN_1010_0472 WRITE 0 true 1028:478c Data6 DAT_1028_478c +1010:05cc FUN_1010_0472 WRITE 0 true 1028:477e Data6 DAT_1028_477e +1010:05d1 FUN_1010_0472 WRITE 0 true 1028:477f Data6 DAT_1028_477f +1010:05d6 FUN_1010_0472 WRITE 0 true 1028:4780 Data6 DAT_1028_4780 +1010:05dd FUN_1010_0472 WRITE 0 true 1028:4781 Data6 DAT_1028_4781 +1010:05e0 FUN_1010_0472 WRITE 0 true 1028:4783 Data6 DAT_1028_4783 +1010:05e5 FUN_1010_0472 WRITE 0 true 1028:4784 Data6 DAT_1028_4784 +1018:0007 FUN_1018_0002 CONDITIONAL_JUMP 0 true 1018:0029 Code4 LAB_1018_0029 +1018:000c FUN_1018_0002 CONDITIONAL_JUMP 0 true 1018:0013 Code4 LAB_1018_0013 +1018:0011 FUN_1018_0002 UNCONDITIONAL_JUMP 0 true 1018:0044 Code4 LAB_1018_0044 +1018:0020 FUN_1018_0002 CONDITIONAL_JUMP 0 true 1018:002f Code4 LAB_1018_002f +1018:0027 FUN_1018_0002 CONDITIONAL_JUMP 0 true 1018:0018 Code4 LAB_1018_0018 +1018:002d FUN_1018_0002 UNCONDITIONAL_JUMP 0 true 1018:0044 Code4 LAB_1018_0044 +1018:004a FUN_1018_0045 DATA 0 true Stack[0x8] - +1018:0052 FUN_1018_0045 DATA 0 true Stack[0x6] - +1018:0055 FUN_1018_0045 UNCONDITIONAL_CALL 0 true 1228:01b4 EXTERNAL SETPROP SETPROP +1018:005a FUN_1018_0045 DATA 0 true Stack[0x8] - +1018:0062 FUN_1018_0045 DATA 0 true Stack[0x4] - +1018:0065 FUN_1018_0045 UNCONDITIONAL_CALL 0 true 1228:01b4 EXTERNAL SETPROP SETPROP +1018:0076 FUN_1018_0071 DATA 0 true Stack[0x4] - +1018:007e FUN_1018_0071 UNCONDITIONAL_CALL 0 true 1228:01ac EXTERNAL REMOVEPROP REMOVEPROP +1018:0083 FUN_1018_0071 DATA 0 true Stack[0x4] - +1018:008b FUN_1018_0071 UNCONDITIONAL_CALL 0 true 1228:01ac EXTERNAL REMOVEPROP REMOVEPROP +1018:009c FUN_1018_0097 DATA 0 true Stack[0x4] - +1018:009f FUN_1018_0097 UNCONDITIONAL_CALL 0 true 1228:01e4 EXTERNAL ISWINDOW ISWINDOW +1018:00a7 FUN_1018_0097 CONDITIONAL_JUMP 0 true 1018:00fc Code4 LAB_1018_00fc +1018:00a9 FUN_1018_0097 DATA 0 true Stack[0x4] - +1018:00b0 FUN_1018_0097 UNCONDITIONAL_CALL 0 true 1228:0258 EXTERNAL GETWINDOWLONG GETWINDOWLONG +1018:00c0 FUN_1018_0097 CONDITIONAL_JUMP 0 true 1018:00e0 Code4 LAB_1018_00e0 +1018:00cb FUN_1018_0097 CONDITIONAL_JUMP 0 true 1018:00e0 Code4 LAB_1018_00e0 +1018:00d4 FUN_1018_0097 CONDITIONAL_JUMP 0 true 1018:00e0 Code4 LAB_1018_00e0 +1018:00de FUN_1018_0097 UNCONDITIONAL_JUMP 0 true 1018:00fc Code4 LAB_1018_00fc +1018:00e0 FUN_1018_0097 DATA 0 true Stack[0x4] - +1018:00e8 FUN_1018_0097 UNCONDITIONAL_CALL 0 true 1228:01b0 EXTERNAL GETPROP GETPROP +1018:00ee FUN_1018_0097 DATA 0 true Stack[0x4] - +1018:00f6 FUN_1018_0097 UNCONDITIONAL_CALL 0 true 1228:01b0 EXTERNAL GETPROP GETPROP +1018:0108 FUN_1018_0103 DATA 1 true Stack[0x6] - +1018:0122 FUN_1018_0103 DATA 1 true Stack[0x2] - +1018:0127 FUN_1018_0103 READ 0 true 1028:0684 Data6 DAT_1028_0684 +1018:0127 FUN_1018_0103 READ 0 false 1028:0682 Data6 DAT_1028_0682 +1018:013f FUN_1018_0133 DATA 1 true Stack[0xc] - +1018:014b FUN_1018_0133 DATA 0 true Stack[0x6] - +1018:014e FUN_1018_0133 DATA 0 true Stack[0x4] - +1018:0151 FUN_1018_0133 DATA 0 true Stack[0x8] - +1018:0154 FUN_1018_0133 DATA 1 true Stack[0xa] - +1018:0164 FUN_1018_0133 CONDITIONAL_JUMP 0 true 1018:016d Code4 LAB_1018_016d +1018:016b FUN_1018_0133 UNCONDITIONAL_JUMP 0 true 1018:0173 Code4 LAB_1018_0173 +1018:0170 FUN_1018_0133 UNCONDITIONAL_CALL 0 true 1018:0002 Code4 FUN_1018_0002 FUN_1018_0002 +1018:0177 FUN_1018_0133 CONDITIONAL_JUMP 0 true 1018:017c Code4 LAB_1018_017c +1018:0179 FUN_1018_0133 UNCONDITIONAL_CALL 0 true 1018:0103 Code4 FUN_1018_0103 FUN_1018_0103 +1018:0197 FUN_1018_018b DATA 0 true Stack[0xc] - +1018:01a8 FUN_1018_018b UNCONDITIONAL_CALL 0 true 1228:025c EXTERNAL SETWINDOWLONG SETWINDOWLONG +1018:01ad FUN_1018_018b DATA 0 true Stack[0xc] - +1018:01b6 FUN_1018_018b UNCONDITIONAL_CALL 0 true 1018:0045 Code4 FUN_1018_0045 FUN_1018_0045 +1018:01bb FUN_1018_018b DATA 0 true Stack[0xc] - +1018:01be FUN_1018_018b DATA 0 true Stack[0xa] - +1018:01c1 FUN_1018_018b DATA 0 true Stack[0x8] - +1018:01c4 FUN_1018_018b DATA 0 true Stack[0x6] - +1018:01c7 FUN_1018_018b DATA 0 true Stack[0x4] - +1018:01e4 FUN_1018_01dc READ 1 true 1028:066e Data6 DAT_1028_066e +1018:01e7 FUN_1018_01dc READ 1 true 1028:0670 Data6 DAT_1028_0670 +1018:01eb FUN_1018_01dc CONDITIONAL_JUMP 0 true 1018:01f0 Code4 LAB_1018_01f0 +1018:01ed FUN_1018_01dc UNCONDITIONAL_JUMP 0 true 1018:02a3 Code4 LAB_1018_02a3 +1018:01f7 FUN_1018_01dc UNCONDITIONAL_CALL 0 true 1228:0004 EXTERNAL GLOBALALLOC GLOBALALLOC +1018:01fd FUN_1018_01dc UNCONDITIONAL_CALL 0 true 1228:000c EXTERNAL GLOBALLOCK GLOBALLOCK +1018:0202 FUN_1018_01dc DATA 0 true Stack[-0xc] - +1018:0205 FUN_1018_01dc DATA 0 true Stack[-0xa] - +1018:0208 FUN_1018_01dc READ 1 true 1028:066c Data6 DAT_1028_066c +1018:020b FUN_1018_01dc DATA 1 true Stack[-0xc] - +1018:0216 FUN_1018_01dc DATA 1 true Stack[-0xc] - +1018:0221 FUN_1018_01dc UNCONDITIONAL_CALL 0 true 1020:16a5 Code5 FUN_1020_16a5 FUN_1020_16a5 +1018:0226 FUN_1018_01dc READ 1 true 1028:0672 Data6 DAT_1028_0672 +1018:0229 FUN_1018_01dc READ 1 true 1028:0674 Data6 DAT_1028_0674 +1018:022d FUN_1018_01dc DATA 1 true Stack[-0xc] - +1018:0238 FUN_1018_01dc DATA 1 true Stack[-0xc] - +1018:0241 FUN_1018_01dc DATA 0 true Stack[-0x10] - +1018:0244 FUN_1018_01dc DATA 0 true Stack[-0xe] - +1018:0247 FUN_1018_01dc DATA 1 true Stack[-0x10] - +1018:024e FUN_1018_01dc DATA 1 true Stack[-0x10] - +1018:0261 FUN_1018_01dc DATA 1 true Stack[-0x10] - +1018:0268 FUN_1018_01dc READ 1 true 1028:066e Data6 DAT_1028_066e +1018:026b FUN_1018_01dc READ 1 true 1028:0670 Data6 DAT_1028_0670 +1018:026f FUN_1018_01dc DATA 1 true Stack[-0x10] - +1018:027a FUN_1018_01dc DATA 1 true Stack[-0x10] - +1018:027d FUN_1018_01dc DATA 1 true Stack[-0xe] - +1018:0280 FUN_1018_01dc WRITE 0 true 1028:066e Data6 DAT_1028_066e +1018:0283 FUN_1018_01dc WRITE 0 true 1028:0670 Data6 DAT_1028_0670 +1018:0287 FUN_1018_01dc DATA 0 true Stack[-0x10] - +1018:028b FUN_1018_01dc DATA 0 true Stack[-0x10] - +1018:0290 FUN_1018_01dc CONDITIONAL_JUMP 0 true 1018:0247 Code4 LAB_1018_0247 +1018:0292 FUN_1018_01dc DATA 1 true Stack[-0xa] - +1018:0295 FUN_1018_01dc WRITE 0 true 1028:066c Data6 DAT_1028_066c +1018:0298 FUN_1018_01dc DATA 0 true Stack[-0xa] - +1018:029b FUN_1018_01dc DATA 0 true Stack[-0xa] - +1018:029e FUN_1018_01dc UNCONDITIONAL_CALL 0 true 1228:0090 EXTERNAL PRESTOCHANGOSELECTOR PRESTOCHANGOSELECTOR +1018:02a3 FUN_1018_01dc READ 1 true 1028:066e Data6 DAT_1028_066e +1018:02a6 FUN_1018_01dc READ 1 true 1028:0670 Data6 DAT_1028_0670 +1018:02aa FUN_1018_01dc DATA 0 true Stack[-0x8] - +1018:02ad FUN_1018_01dc DATA 0 true Stack[-0x6] - +1018:02b0 FUN_1018_01dc READ 1 true 1028:066e Data6 DAT_1028_066e +1018:02b3 FUN_1018_01dc DATA 0 true Stack[-0x10] - +1018:02b6 FUN_1018_01dc READ 0 true 1028:0670 Data6 DAT_1028_0670 +1018:02ba FUN_1018_01dc UNCONDITIONAL_CALL 0 true 1228:0088 EXTERNAL ALLOCCSTODSALIAS ALLOCCSTODSALIAS +1018:02bf FUN_1018_01dc DATA 0 true Stack[-0xe] - +1018:02c2 FUN_1018_01dc DATA 1 true Stack[-0x10] - +1018:02cd FUN_1018_01dc WRITE 0 true 1028:066e Data6 DAT_1028_066e +1018:02d0 FUN_1018_01dc WRITE 0 true 1028:0670 Data6 DAT_1028_0670 +1018:02d4 FUN_1018_01dc DATA 1 true Stack[0x4] - +1018:02d7 FUN_1018_01dc DATA 1 true Stack[0x6] - +1018:02da FUN_1018_01dc DATA 1 true Stack[-0x10] - +1018:02e5 FUN_1018_01dc DATA 0 true Stack[-0xe] - +1018:02e8 FUN_1018_01dc UNCONDITIONAL_CALL 0 true 1228:008c EXTERNAL FREESELECTOR FREESELECTOR +1018:02ed FUN_1018_01dc DATA 1 true Stack[-0x8] - +1018:02f0 FUN_1018_01dc DATA 1 true Stack[-0x6] - +1018:0302 FUN_1018_02fa DATA 1 true Stack[0x4] - +1018:0305 FUN_1018_02fa DATA 0 true Stack[-0x8] - +1018:0308 FUN_1018_02fa DATA 0 true Stack[0x6] - +1018:030b FUN_1018_02fa UNCONDITIONAL_CALL 0 true 1228:0088 EXTERNAL ALLOCCSTODSALIAS ALLOCCSTODSALIAS +1018:0310 FUN_1018_02fa DATA 0 true Stack[-0x6] - +1018:0313 FUN_1018_02fa READ 1 true 1028:066e Data6 DAT_1028_066e +1018:0316 FUN_1018_02fa READ 1 true 1028:0670 Data6 DAT_1028_0670 +1018:031a FUN_1018_02fa DATA 1 true Stack[-0x8] - +1018:0325 FUN_1018_02fa DATA 0 true Stack[-0x6] - +1018:0328 FUN_1018_02fa UNCONDITIONAL_CALL 0 true 1228:008c EXTERNAL FREESELECTOR FREESELECTOR +1018:032d FUN_1018_02fa DATA 1 true Stack[0x4] - +1018:0330 FUN_1018_02fa DATA 1 true Stack[0x6] - +1018:0333 FUN_1018_02fa WRITE 0 true 1028:066e Data6 DAT_1028_066e +1018:0336 FUN_1018_02fa WRITE 0 true 1028:0670 Data6 DAT_1028_0670 +1018:0348 FUN_1018_0341 UNCONDITIONAL_CALL 0 true 1020:03ef Code5 FUN_1020_03ef FUN_1020_03ef +1018:034d FUN_1018_0341 CONDITIONAL_JUMP 0 true 1018:0352 Code4 LAB_1018_0352 +1018:034f FUN_1018_0341 UNCONDITIONAL_JUMP 0 true 1018:03dd Code4 LAB_1018_03dd +1018:0355 FUN_1018_0341 DATA 1 true Stack[0x4] - +1018:035a FUN_1018_0341 UNCONDITIONAL_CALL 0 true 1008:2d99 Code2 FUN_1008_2d99 FUN_1008_2d99 +1018:035f FUN_1018_0341 DATA 1 true Stack[0x4] - +1018:0374 FUN_1018_0341 DATA 1 true Stack[0xa] - +1018:0377 FUN_1018_0341 DATA 1 true Stack[0xc] - +1018:038a FUN_1018_0341 CONDITIONAL_JUMP 0 true 1018:039b Code4 LAB_1018_039b +1018:0394 FUN_1018_0341 UNCONDITIONAL_CALL 0 true 1018:069a Code4 FUN_1018_069a FUN_1018_069a +1018:0399 FUN_1018_0341 UNCONDITIONAL_JUMP 0 true 1018:03a8 Code4 LAB_1018_03a8 +1018:039b FUN_1018_0341 DATA 1 true Stack[0x4] - +1018:03a8 FUN_1018_0341 DATA 1 true Stack[0x4] - +1018:03c1 FUN_1018_0341 UNCONDITIONAL_CALL 0 true 1018:01dc Code4 FUN_1018_01dc FUN_1018_01dc +1018:03c6 FUN_1018_0341 DATA 1 true Stack[0x4] - +1018:03d8 FUN_1018_0341 UNCONDITIONAL_CALL 0 true 1018:060d Code4 FUN_1018_060d FUN_1018_060d +1018:03dd FUN_1018_0341 DATA 1 true Stack[0x4] - +1018:03ee FUN_1018_03e9 DATA 1 true Stack[0x6] - +1018:03f3 FUN_1018_03e9 UNCONDITIONAL_CALL 0 true 1008:2db3 Code2 FUN_1008_2db3 FUN_1008_2db3 +1018:0404 FUN_1018_03ff DATA 1 true Stack[0x4] - +1018:0417 FUN_1018_03ff DATA 1 true Stack[0x4] - +1018:041c FUN_1018_03ff UNCONDITIONAL_CALL 0 true 1018:085a Code4 FUN_1018_085a FUN_1018_085a +1018:0421 FUN_1018_03ff DATA 1 true Stack[0x4] - +1018:042c FUN_1018_03ff CONDITIONAL_JUMP 0 true 1018:043b Code4 LAB_1018_043b +1018:0436 FUN_1018_03ff UNCONDITIONAL_CALL 0 true 1018:071c Code4 FUN_1018_071c FUN_1018_071c +1018:043b FUN_1018_03ff DATA 1 true Stack[0x4] - +1018:0446 FUN_1018_03ff UNCONDITIONAL_CALL 0 true 1018:02fa Code4 FUN_1018_02fa FUN_1018_02fa +1018:044e FUN_1018_03ff DATA 1 true Stack[0x4] - +1018:0453 FUN_1018_03ff UNCONDITIONAL_CALL 0 true 1008:2dcd Code2 FUN_1008_2dcd FUN_1008_2dcd +1018:045a FUN_1018_03ff UNCONDITIONAL_CALL 0 true 1020:0439 Code5 FUN_1020_0439 FUN_1020_0439 +1018:046e FUN_1018_0466 DATA 1 true Stack[0x4] - +1018:047a FUN_1018_0466 DATA 1 true Stack[0x6] - +1018:0485 FUN_1018_0466 CONDITIONAL_JUMP 0 true 1018:048b Code4 LAB_1018_048b +1018:0489 FUN_1018_0466 CONDITIONAL_JUMP 0 true 1018:048f Code4 LAB_1018_048f +1018:048d FUN_1018_0466 UNCONDITIONAL_JUMP 0 true 1018:0491 Code4 LAB_1018_0491 +1018:0491 FUN_1018_0466 DATA 0 true Stack[-0x5] - +1018:0494 FUN_1018_0466 DATA 1 true Stack[-0x5] - +1018:04a6 FUN_1018_049e DATA 1 true Stack[0x6] - +1018:04a9 FUN_1018_049e DATA 0 true Stack[-0x5c] - +1018:04ac FUN_1018_049e DATA 0 true Stack[-0x5a] - +1018:04b3 FUN_1018_049e UNCONDITIONAL_CALL 0 true 1018:0673 Code4 FUN_1018_0673 FUN_1018_0673 +1018:04ba FUN_1018_049e CONDITIONAL_JUMP 0 true 1018:04cf Code4 LAB_1018_04cf +1018:04bc FUN_1018_049e DATA 1 true Stack[-0x5c] - +1018:04c9 FUN_1018_049e CONDITIONAL_JUMP 0 true 1018:04cf Code4 LAB_1018_04cf +1018:04cd FUN_1018_049e UNCONDITIONAL_JUMP 0 true 1018:04d1 Code4 LAB_1018_04d1 +1018:04d1 FUN_1018_049e DATA 0 true Stack[-0x6] - +1018:04d4 FUN_1018_049e DATA 0 true Stack[-0x6] - +1018:04d8 FUN_1018_049e CONDITIONAL_JUMP 0 true 1018:050e Code4 LAB_1018_050e +1018:04da FUN_1018_049e DATA 1 true Stack[-0x5c] - +1018:04e1 FUN_1018_049e UNCONDITIONAL_CALL 0 true 1228:01bc EXTERNAL ISICONIC ISICONIC +1018:04e8 FUN_1018_049e CONDITIONAL_JUMP 0 true 1018:050e Code4 LAB_1018_050e +1018:04ea FUN_1018_049e DATA 1 true Stack[-0x5c] - +1018:04f1 FUN_1018_049e DATA 0 true Stack[-0x58] - +1018:04f8 FUN_1018_049e UNCONDITIONAL_CALL 0 true 1228:01c8 EXTERNAL GETWINDOWTEXT GETWINDOWTEXT +1018:04fd FUN_1018_049e DATA 1 true Stack[-0x5c] - +1018:0504 FUN_1018_049e DATA 0 true Stack[-0x58] - +1018:0509 FUN_1018_049e UNCONDITIONAL_CALL 0 true 1228:01cc EXTERNAL SETWINDOWTEXT SETWINDOWTEXT +1018:050e FUN_1018_049e DATA 0 true Stack[-0x6] - +1018:0514 FUN_1018_049e CONDITIONAL_JUMP 0 true 1018:0517 Code4 LAB_1018_0517 +1018:0517 FUN_1018_049e DATA 0 true Stack[-0x5] - +1018:051a FUN_1018_049e DATA 1 true Stack[-0x5] - +1018:052c FUN_1018_0524 DATA 1 true Stack[0x6] - +1018:0534 FUN_1018_0524 CONDITIONAL_JUMP 0 true 1018:0549 Code4 LAB_1018_0549 +1018:0536 FUN_1018_0524 DATA 0 true Stack[0x8] - +1018:0539 FUN_1018_0524 DATA 0 true Stack[0x6] - +1018:053c FUN_1018_0524 DATA 1 true Stack[0x4] - +1018:0540 FUN_1018_0524 UNCONDITIONAL_CALL 0 true 1018:049e Code4 FUN_1018_049e FUN_1018_049e +1018:0547 FUN_1018_0524 CONDITIONAL_JUMP 0 true 1018:054d Code4 LAB_1018_054d +1018:054b FUN_1018_0524 UNCONDITIONAL_JUMP 0 true 1018:054f Code4 LAB_1018_054f +1018:054f FUN_1018_0524 DATA 0 true Stack[-0x5] - +1018:0552 FUN_1018_0524 DATA 1 true Stack[-0x5] - +1018:0564 FUN_1018_055c DATA 0 true Stack[-0x8] - +1018:0569 FUN_1018_055c DATA 0 true Stack[-0xd] - +1018:0575 FUN_1018_055c DATA 1 true Stack[0x4] - +1018:057a FUN_1018_055c UNCONDITIONAL_CALL 0 true 1018:080d Code4 FUN_1018_080d FUN_1018_080d +1018:057f FUN_1018_055c DATA 0 true Stack[-0xc] - +1018:0582 FUN_1018_055c DATA 0 true Stack[-0xa] - +1018:0585 FUN_1018_055c DATA 1 true Stack[-0xc] - +1018:0588 FUN_1018_055c DATA 1 true Stack[-0xa] - +1018:058b FUN_1018_055c CONDITIONAL_JUMP 0 true 1018:059c Code4 LAB_1018_059c +1018:058d FUN_1018_055c DATA 0 true Stack[-0xa] - +1018:0590 FUN_1018_055c DATA 0 true Stack[-0xc] - +1018:0594 FUN_1018_055c UNCONDITIONAL_CALL 0 true 1018:049e Code4 FUN_1018_049e FUN_1018_049e +1018:0599 FUN_1018_055c DATA 0 true Stack[-0xd] - +1018:059c FUN_1018_055c DATA 0 true Stack[-0x8] - +1018:059f FUN_1018_055c DATA 0 true Stack[-0xd] - +1018:05a3 FUN_1018_055c CONDITIONAL_JUMP 0 true 1018:05ad Code4 LAB_1018_05ad +1018:05a5 FUN_1018_055c DATA 1 true Stack[-0xc] - +1018:05a8 FUN_1018_055c DATA 1 true Stack[-0xa] - +1018:05ab FUN_1018_055c CONDITIONAL_JUMP 0 true 1018:056d Code4 LAB_1018_056d +1018:05ad FUN_1018_055c DATA 0 true Stack[-0xd] - +1018:05b1 FUN_1018_055c CONDITIONAL_JUMP 0 true 1018:05c9 Code4 LAB_1018_05c9 +1018:05bb FUN_1018_055c DATA 1 true Stack[0x4] - +1018:05c0 FUN_1018_055c UNCONDITIONAL_CALL 0 true 1018:080d Code4 FUN_1018_080d FUN_1018_080d +1018:05c7 FUN_1018_055c CONDITIONAL_JUMP 0 true 1018:05cd Code4 LAB_1018_05cd +1018:05cb FUN_1018_055c UNCONDITIONAL_JUMP 0 true 1018:05cf Code4 LAB_1018_05cf +1018:05cf FUN_1018_055c DATA 0 true Stack[-0x5] - +1018:05d2 FUN_1018_055c DATA 1 true Stack[-0x5] - +1018:05e6 FUN_1018_05dc DATA 0 true Stack[-0x6] - +1018:05e9 FUN_1018_05dc DATA 1 true Stack[-0x6] - +1018:05fc FUN_1018_05f3 DATA 1 true Stack[0x4] - +1018:0601 FUN_1018_05f3 UNCONDITIONAL_CALL 0 true 1018:0641 Code4 FUN_1018_0641 FUN_1018_0641 +1018:0616 FUN_1018_060d DATA 1 true Stack[0x4] - +1018:061b FUN_1018_060d UNCONDITIONAL_CALL 0 true 1018:0641 Code4 FUN_1018_0641 FUN_1018_0641 +1018:0630 FUN_1018_0627 DATA 1 true Stack[0x4] - +1018:0635 FUN_1018_0627 UNCONDITIONAL_CALL 0 true 1018:0641 Code4 FUN_1018_0641 FUN_1018_0641 +1018:0646 FUN_1018_0641 DATA 0 true Stack[0x8] - +1018:064a FUN_1018_0641 CONDITIONAL_JUMP 0 true 1018:065c Code4 LAB_1018_065c +1018:064c FUN_1018_0641 DATA 1 true Stack[0x4] - +1018:0653 FUN_1018_0641 DATA 1 true Stack[0xa] - +1018:065a FUN_1018_0641 UNCONDITIONAL_JUMP 0 true 1018:066c Code4 LAB_1018_066c +1018:065c FUN_1018_0641 DATA 1 true Stack[0xa] - +1018:0661 FUN_1018_0641 DATA 1 true Stack[0x4] - +1018:067b FUN_1018_0673 DATA 1 true Stack[0x4] - +1018:0682 FUN_1018_0673 DATA 1 true Stack[0x8] - +1018:0685 FUN_1018_0673 DATA 1 true Stack[0x8] - +1018:068a FUN_1018_0673 CONDITIONAL_JUMP 0 true 1018:068d Code4 LAB_1018_068d +1018:068d FUN_1018_0673 DATA 0 true Stack[-0x5] - +1018:0690 FUN_1018_0673 DATA 1 true Stack[-0x5] - +1018:069f FUN_1018_069a DATA 1 true Stack[0x8] - +1018:06a2 FUN_1018_069a DATA 1 true Stack[0xa] - +1018:06a5 FUN_1018_069a CONDITIONAL_JUMP 0 true 1018:0715 Code4 LAB_1018_0715 +1018:06a7 FUN_1018_069a DATA 1 true Stack[0x4] - +1018:06b2 FUN_1018_069a CONDITIONAL_JUMP 0 true 1018:06d5 Code4 LAB_1018_06d5 +1018:06b4 FUN_1018_069a DATA 1 true Stack[0x8] - +1018:06b7 FUN_1018_069a DATA 1 true Stack[0xa] - +1018:06c2 FUN_1018_069a DATA 1 true Stack[0x8] - +1018:06c5 FUN_1018_069a DATA 1 true Stack[0xa] - +1018:06c8 FUN_1018_069a DATA 1 true Stack[0x8] - +1018:06d3 FUN_1018_069a UNCONDITIONAL_JUMP 0 true 1018:0715 Code4 LAB_1018_0715 +1018:06d5 FUN_1018_069a DATA 1 true Stack[0x4] - +1018:06e4 FUN_1018_069a DATA 1 true Stack[0x8] - +1018:06ef FUN_1018_069a DATA 1 true Stack[0x8] - +1018:06f2 FUN_1018_069a DATA 1 true Stack[0xa] - +1018:06f5 FUN_1018_069a DATA 1 true Stack[0x4] - +1018:0704 FUN_1018_069a DATA 1 true Stack[0x8] - +1018:0707 FUN_1018_069a DATA 1 true Stack[0xa] - +1018:070a FUN_1018_069a DATA 1 true Stack[0x4] - +1018:0724 FUN_1018_071c DATA 1 true Stack[0x4] - +1018:072f FUN_1018_071c CONDITIONAL_JUMP 0 true 1018:0734 Code4 LAB_1018_0734 +1018:0731 FUN_1018_071c UNCONDITIONAL_JUMP 0 true 1018:0806 Code4 LAB_1018_0806 +1018:073c FUN_1018_071c DATA 0 true Stack[-0x8] - +1018:073f FUN_1018_071c DATA 0 true Stack[-0x6] - +1018:0742 FUN_1018_071c DATA 1 true Stack[-0x8] - +1018:0745 FUN_1018_071c DATA 1 true Stack[-0x6] - +1018:0748 FUN_1018_071c DATA 0 true Stack[-0xc] - +1018:074b FUN_1018_071c DATA 0 true Stack[-0xa] - +1018:074e FUN_1018_071c DATA 1 true Stack[-0xc] - +1018:0759 FUN_1018_071c DATA 1 true Stack[-0x6] - +1018:075c FUN_1018_071c CONDITIONAL_JUMP 0 true 1018:0763 Code4 LAB_1018_0763 +1018:075e FUN_1018_071c DATA 1 true Stack[-0x8] - +1018:0761 FUN_1018_071c CONDITIONAL_JUMP 0 true 1018:078b Code4 LAB_1018_078b +1018:0763 FUN_1018_071c DATA 1 true Stack[-0xc] - +1018:076e FUN_1018_071c DATA 1 true Stack[0xa] - +1018:0771 FUN_1018_071c CONDITIONAL_JUMP 0 true 1018:0778 Code4 LAB_1018_0778 +1018:0773 FUN_1018_071c DATA 1 true Stack[0x8] - +1018:0776 FUN_1018_071c CONDITIONAL_JUMP 0 true 1018:078b Code4 LAB_1018_078b +1018:0778 FUN_1018_071c DATA 1 true Stack[-0xc] - +1018:0783 FUN_1018_071c DATA 0 true Stack[-0xc] - +1018:0786 FUN_1018_071c DATA 0 true Stack[-0xa] - +1018:0789 FUN_1018_071c UNCONDITIONAL_JUMP 0 true 1018:074e Code4 LAB_1018_074e +1018:078b FUN_1018_071c DATA 1 true Stack[-0xc] - +1018:0796 FUN_1018_071c DATA 1 true Stack[0xa] - +1018:0799 FUN_1018_071c CONDITIONAL_JUMP 0 true 1018:0806 Code4 LAB_1018_0806 +1018:079b FUN_1018_071c DATA 1 true Stack[0x8] - +1018:079e FUN_1018_071c CONDITIONAL_JUMP 0 true 1018:0806 Code4 LAB_1018_0806 +1018:07a0 FUN_1018_071c DATA 1 true Stack[-0xc] - +1018:07ab FUN_1018_071c DATA 1 true Stack[-0xa] - +1018:07ae FUN_1018_071c CONDITIONAL_JUMP 0 true 1018:07c4 Code4 LAB_1018_07c4 +1018:07b0 FUN_1018_071c DATA 1 true Stack[-0xc] - +1018:07b3 FUN_1018_071c CONDITIONAL_JUMP 0 true 1018:07c4 Code4 LAB_1018_07c4 +1018:07b5 FUN_1018_071c DATA 1 true Stack[0x4] - +1018:07c2 FUN_1018_071c UNCONDITIONAL_JUMP 0 true 1018:0806 Code4 LAB_1018_0806 +1018:07c4 FUN_1018_071c DATA 1 true Stack[-0xc] - +1018:07cf FUN_1018_071c DATA 1 true Stack[0x4] - +1018:07d6 FUN_1018_071c CONDITIONAL_JUMP 0 true 1018:07ec Code4 LAB_1018_07ec +1018:07dc FUN_1018_071c CONDITIONAL_JUMP 0 true 1018:07ec Code4 LAB_1018_07ec +1018:07de FUN_1018_071c DATA 1 true Stack[-0xc] - +1018:07e1 FUN_1018_071c DATA 1 true Stack[-0xa] - +1018:07ec FUN_1018_071c DATA 1 true Stack[-0xc] - +1018:07fb FUN_1018_071c DATA 1 true Stack[-0xc] - +1018:0815 FUN_1018_080d DATA 1 true Stack[0x4] - +1018:0820 FUN_1018_080d CONDITIONAL_JUMP 0 true 1018:084f Code4 LAB_1018_084f +1018:0822 FUN_1018_080d DATA 0 true Stack[-0x8] - +1018:0825 FUN_1018_080d DATA 0 true Stack[-0x6] - +1018:0830 FUN_1018_080d DATA 1 true Stack[-0x2] - +1018:0836 FUN_1018_080d DATA 0 true Stack[0x8] - +1018:083d FUN_1018_080d CONDITIONAL_JUMP 0 true 1018:084f Code4 LAB_1018_084f +1018:083f FUN_1018_080d DATA 1 true Stack[-0x8] - +1018:0842 FUN_1018_080d CONDITIONAL_JUMP 0 true 1018:0828 Code4 LAB_1018_0828 +1018:0846 FUN_1018_080d DATA 1 true Stack[-0x6] - +1018:0849 FUN_1018_080d CONDITIONAL_JUMP 0 true 1018:0828 Code4 LAB_1018_0828 +1018:0862 FUN_1018_085a DATA 1 true Stack[0x4] - +1018:086d FUN_1018_085a CONDITIONAL_JUMP 0 true 1018:08a5 Code4 LAB_1018_08a5 +1018:086f FUN_1018_085a DATA 0 true Stack[-0x8] - +1018:0872 FUN_1018_085a DATA 0 true Stack[-0x6] - +1018:0879 FUN_1018_085a DATA 1 true Stack[-0x8] - +1018:087c FUN_1018_085a CONDITIONAL_JUMP 0 true 1018:0885 Code4 LAB_1018_0885 +1018:0880 FUN_1018_085a DATA 1 true Stack[-0x6] - +1018:0883 FUN_1018_085a CONDITIONAL_JUMP 0 true 1018:089c Code4 LAB_1018_089c +1018:088f FUN_1018_085a DATA 1 true Stack[-0x2] - +1018:0895 FUN_1018_085a DATA 0 true Stack[0x8] - +1018:089a FUN_1018_085a UNCONDITIONAL_JUMP 0 true 1018:0879 Code4 LAB_1018_0879 +1018:089c FUN_1018_085a DATA 1 true Stack[-0x2] - +1018:08a2 FUN_1018_085a DATA 0 true Stack[0x8] - +1018:08b4 FUN_1018_08ac DATA 0 true Stack[-0x6] - +1018:08b9 FUN_1018_08ac DATA 1 true Stack[-0x6] - +1018:08c8 FUN_1018_08c3 DATA 1 true Stack[0x4] - +1018:08cb FUN_1018_08c3 DATA 1 true Stack[0x6] - +1018:08ce FUN_1018_08c3 DATA 1 true Stack[0x8] - +1018:08d3 FUN_1018_08c3 DATA 1 true Stack[0xc] - +1018:08db FUN_1018_08c3 UNCONDITIONAL_CALL 0 true 1018:0002 Code4 FUN_1018_0002 FUN_1018_0002 +1018:08de FUN_1018_08c3 READ 1 true 1028:0684 Data6 DAT_1028_0684 +1018:08e2 FUN_1018_08c3 CONDITIONAL_JUMP 0 true 1018:08e7 Code4 LAB_1018_08e7 +1018:08e4 FUN_1018_08c3 UNCONDITIONAL_CALL 0 true 1018:0103 Code4 FUN_1018_0103 FUN_1018_0103 +1018:08fa FUN_1018_08f0 DATA 1 true Stack[0x4] - +1018:08ff FUN_1018_08f0 UNCONDITIONAL_CALL 0 true 1018:0673 Code4 FUN_1018_0673 FUN_1018_0673 +1018:0906 FUN_1018_08f0 CONDITIONAL_JUMP 0 true 1018:0959 Code4 LAB_1018_0959 +1018:0908 FUN_1018_08f0 DATA 1 true Stack[0x8] - +1018:0913 FUN_1018_08f0 CONDITIONAL_JUMP 0 true 1018:0959 Code4 LAB_1018_0959 +1018:0915 FUN_1018_08f0 DATA 1 true Stack[0x4] - +1018:091c FUN_1018_08f0 DATA 1 true Stack[0x8] - +1018:0923 FUN_1018_08f0 UNCONDITIONAL_CALL 0 true 1228:0214 EXTERNAL GETDLGITEM GETDLGITEM +1018:0928 FUN_1018_08f0 DATA 0 true Stack[-0x8] - +1018:092b FUN_1018_08f0 DATA 0 true Stack[-0x8] - +1018:092f FUN_1018_08f0 CONDITIONAL_JUMP 0 true 1018:0959 Code4 LAB_1018_0959 +1018:0931 FUN_1018_08f0 DATA 0 true Stack[-0x8] - +1018:093d FUN_1018_08f0 UNCONDITIONAL_CALL 0 true 1228:0238 EXTERNAL SENDMESSAGE SENDMESSAGE +1018:0947 FUN_1018_08f0 CONDITIONAL_JUMP 0 true 1018:0959 Code4 LAB_1018_0959 +1018:0949 FUN_1018_08f0 DATA 1 true Stack[-0x8] - +1018:094c FUN_1018_08f0 DATA 1 true Stack[0x8] - +1018:0959 FUN_1018_08f0 DATA 1 true Stack[0x8] - +1018:0961 FUN_1018_08f0 CONDITIONAL_JUMP 0 true 1018:0966 Code4 LAB_1018_0966 +1018:0963 FUN_1018_08f0 UNCONDITIONAL_JUMP 0 true 1018:09fd Code4 LAB_1018_09fd +1018:096c FUN_1018_08f0 CONDITIONAL_JUMP 0 true 1018:09ea Code4 LAB_1018_09ea +1018:096e FUN_1018_08f0 UNCONDITIONAL_CALL 0 true 1228:01a8 EXTERNAL GETFOCUS GETFOCUS +1018:0973 FUN_1018_08f0 DATA 0 true Stack[-0x6] - +1018:0976 FUN_1018_08f0 DATA 0 true Stack[-0x6] - +1018:0979 FUN_1018_08f0 UNCONDITIONAL_CALL 0 true 1018:0097 Code4 FUN_1018_0097 FUN_1018_0097 +1018:097e FUN_1018_08f0 DATA 0 true Stack[-0xc] - +1018:0981 FUN_1018_08f0 DATA 0 true Stack[-0xa] - +1018:0984 FUN_1018_08f0 DATA 1 true Stack[-0xc] - +1018:0987 FUN_1018_08f0 DATA 1 true Stack[-0xa] - +1018:098a FUN_1018_08f0 CONDITIONAL_JUMP 0 true 1018:09b9 Code4 LAB_1018_09b9 +1018:098c FUN_1018_08f0 DATA 0 true Stack[-0x6] - +1018:0990 FUN_1018_08f0 CONDITIONAL_JUMP 0 true 1018:09b9 Code4 LAB_1018_09b9 +1018:0992 FUN_1018_08f0 DATA 1 true Stack[-0x6] - +1018:0995 FUN_1018_08f0 DATA 1 true Stack[0x4] - +1018:099c FUN_1018_08f0 CONDITIONAL_JUMP 0 true 1018:09b9 Code4 LAB_1018_09b9 +1018:099e FUN_1018_08f0 DATA 0 true Stack[-0x6] - +1018:09a1 FUN_1018_08f0 UNCONDITIONAL_CALL 0 true 1228:01e0 EXTERNAL GETPARENT GETPARENT +1018:09a6 FUN_1018_08f0 DATA 0 true Stack[-0x6] - +1018:09a9 FUN_1018_08f0 DATA 0 true Stack[-0x6] - +1018:09ac FUN_1018_08f0 UNCONDITIONAL_CALL 0 true 1018:0097 Code4 FUN_1018_0097 FUN_1018_0097 +1018:09b1 FUN_1018_08f0 DATA 0 true Stack[-0xc] - +1018:09b4 FUN_1018_08f0 DATA 0 true Stack[-0xa] - +1018:09b7 FUN_1018_08f0 UNCONDITIONAL_JUMP 0 true 1018:0984 Code4 LAB_1018_0984 +1018:09b9 FUN_1018_08f0 DATA 1 true Stack[-0xc] - +1018:09bc FUN_1018_08f0 DATA 1 true Stack[-0xa] - +1018:09bf FUN_1018_08f0 CONDITIONAL_JUMP 0 true 1018:09ce Code4 LAB_1018_09ce +1018:09c1 FUN_1018_08f0 DATA 1 true Stack[0x4] - +1018:09c8 FUN_1018_08f0 DATA 0 true Stack[-0xc] - +1018:09cb FUN_1018_08f0 DATA 0 true Stack[-0xa] - +1018:09ce FUN_1018_08f0 DATA 0 true Stack[-0xa] - +1018:09d1 FUN_1018_08f0 DATA 0 true Stack[-0xc] - +1018:09d4 FUN_1018_08f0 DATA 1 true Stack[0x8] - +1018:09e3 FUN_1018_08f0 UNCONDITIONAL_CALL 0 true 1018:08c3 Code4 FUN_1018_08c3 FUN_1018_08c3 +1018:09e8 FUN_1018_08f0 UNCONDITIONAL_JUMP 0 true 1018:09fa Code4 LAB_1018_09fa +1018:09ea FUN_1018_08f0 DATA 1 true Stack[0x8] - +1018:09ef FUN_1018_08f0 DATA 1 true Stack[0x4] - +1018:09fa FUN_1018_08f0 UNCONDITIONAL_JUMP 0 true 1018:0a7e Code4 LAB_1018_0a7e +1018:09fd FUN_1018_08f0 DATA 1 true Stack[0x4] - +1018:0a04 FUN_1018_08f0 DATA 1 true Stack[0x8] - +1018:0a0b FUN_1018_08f0 UNCONDITIONAL_CALL 0 true 1228:0214 EXTERNAL GETDLGITEM GETDLGITEM +1018:0a11 FUN_1018_08f0 UNCONDITIONAL_CALL 0 true 1018:0097 Code4 FUN_1018_0097 FUN_1018_0097 +1018:0a16 FUN_1018_08f0 DATA 0 true Stack[-0xc] - +1018:0a19 FUN_1018_08f0 DATA 0 true Stack[-0xa] - +1018:0a1c FUN_1018_08f0 DATA 1 true Stack[-0xc] - +1018:0a1f FUN_1018_08f0 DATA 1 true Stack[-0xa] - +1018:0a22 FUN_1018_08f0 CONDITIONAL_JUMP 0 true 1018:0a48 Code4 LAB_1018_0a48 +1018:0a24 FUN_1018_08f0 DATA 1 true Stack[0x8] - +1018:0a2d FUN_1018_08f0 CONDITIONAL_JUMP 0 true 1018:0a48 Code4 LAB_1018_0a48 +1018:0a2f FUN_1018_08f0 DATA 0 true Stack[-0xa] - +1018:0a32 FUN_1018_08f0 DATA 0 true Stack[-0xc] - +1018:0a41 FUN_1018_08f0 UNCONDITIONAL_CALL 0 true 1018:08c3 Code4 FUN_1018_08c3 FUN_1018_08c3 +1018:0a46 FUN_1018_08f0 UNCONDITIONAL_JUMP 0 true 1018:0a7e Code4 LAB_1018_0a7e +1018:0a48 FUN_1018_08f0 DATA 1 true Stack[0x8] - +1018:0a51 FUN_1018_08f0 CONDITIONAL_JUMP 0 true 1018:0a6e Code4 LAB_1018_0a6e +1018:0a53 FUN_1018_08f0 DATA 1 true Stack[0x4] - +1018:0a58 FUN_1018_08f0 DATA 1 true Stack[0x8] - +1018:0a67 FUN_1018_08f0 UNCONDITIONAL_CALL 0 true 1018:08c3 Code4 FUN_1018_08c3 FUN_1018_08c3 +1018:0a6c FUN_1018_08f0 UNCONDITIONAL_JUMP 0 true 1018:0a7e Code4 LAB_1018_0a7e +1018:0a6e FUN_1018_08f0 DATA 1 true Stack[0x8] - +1018:0a73 FUN_1018_08f0 DATA 1 true Stack[0x4] - +1018:0a8d FUN_1018_0a85 DATA 1 true Stack[0x8] - +1018:0a95 FUN_1018_0a85 CONDITIONAL_JUMP 0 true 1018:0b0e Code4 LAB_1018_0b0e +1018:0a9b FUN_1018_0a85 UNCONDITIONAL_CALL 0 true 1018:0097 Code4 FUN_1018_0097 FUN_1018_0097 +1018:0aa0 FUN_1018_0a85 DATA 0 true Stack[-0xa] - +1018:0aa3 FUN_1018_0a85 DATA 0 true Stack[-0x8] - +1018:0aa6 FUN_1018_0a85 DATA 1 true Stack[-0xa] - +1018:0aa9 FUN_1018_0a85 DATA 1 true Stack[-0x8] - +1018:0aac FUN_1018_0a85 CONDITIONAL_JUMP 0 true 1018:0aca Code4 LAB_1018_0aca +1018:0aae FUN_1018_0a85 DATA 0 true Stack[-0x8] - +1018:0ab1 FUN_1018_0a85 DATA 0 true Stack[-0xa] - +1018:0ab4 FUN_1018_0a85 DATA 1 true Stack[0x8] - +1018:0ac3 FUN_1018_0a85 UNCONDITIONAL_CALL 0 true 1018:08c3 Code4 FUN_1018_08c3 FUN_1018_08c3 +1018:0ac8 FUN_1018_0a85 UNCONDITIONAL_JUMP 0 true 1018:0b0c Code4 LAB_1018_0b0c +1018:0aca FUN_1018_0a85 DATA 1 true Stack[0x8] - +1018:0ad3 FUN_1018_0a85 UNCONDITIONAL_CALL 0 true 1228:0254 EXTERNAL GETWINDOWWORD GETWINDOWWORD +1018:0ad8 FUN_1018_0a85 DATA 0 true Stack[-0xc] - +1018:0adb FUN_1018_0a85 DATA 0 true Stack[-0xc] - +1018:0ae0 FUN_1018_0a85 CONDITIONAL_JUMP 0 true 1018:0afc Code4 LAB_1018_0afc +1018:0ae2 FUN_1018_0a85 DATA 1 true Stack[0x4] - +1018:0ae7 FUN_1018_0a85 DATA 1 true Stack[0x8] - +1018:0aec FUN_1018_0a85 DATA 1 true Stack[-0xc] - +1018:0af5 FUN_1018_0a85 UNCONDITIONAL_CALL 0 true 1018:08c3 Code4 FUN_1018_08c3 FUN_1018_08c3 +1018:0afa FUN_1018_0a85 UNCONDITIONAL_JUMP 0 true 1018:0b0c Code4 LAB_1018_0b0c +1018:0afc FUN_1018_0a85 DATA 1 true Stack[0x8] - +1018:0b01 FUN_1018_0a85 DATA 1 true Stack[0x4] - +1018:0b0c FUN_1018_0a85 UNCONDITIONAL_JUMP 0 true 1018:0b1e Code4 LAB_1018_0b1e +1018:0b0e FUN_1018_0a85 DATA 1 true Stack[0x8] - +1018:0b13 FUN_1018_0a85 DATA 1 true Stack[0x4] - +1018:0b2a FUN_1018_0b25 DATA 1 true Stack[0x4] - +1018:0b33 FUN_1018_0b25 UNCONDITIONAL_CALL 0 true 1228:0258 EXTERNAL GETWINDOWLONG GETWINDOWLONG +1018:0b41 FUN_1018_0b25 CONDITIONAL_JUMP 0 true 1018:0b55 Code4 LAB_1018_0b55 +1018:0b43 FUN_1018_0b25 DATA 1 true Stack[0x8] - +1018:0b48 FUN_1018_0b25 DATA 1 true Stack[0x4] - +1018:0b53 FUN_1018_0b25 UNCONDITIONAL_JUMP 0 true 1018:0b65 Code4 LAB_1018_0b65 +1018:0b55 FUN_1018_0b25 DATA 1 true Stack[0x8] - +1018:0b5a FUN_1018_0b25 DATA 1 true Stack[0x4] - +1018:0b71 FUN_1018_0b6c DATA 1 true Stack[0x4] - +1018:0b7a FUN_1018_0b6c UNCONDITIONAL_CALL 0 true 1228:0258 EXTERNAL GETWINDOWLONG GETWINDOWLONG +1018:0b88 FUN_1018_0b6c CONDITIONAL_JUMP 0 true 1018:0b9c Code4 LAB_1018_0b9c +1018:0b8a FUN_1018_0b6c DATA 1 true Stack[0x8] - +1018:0b8f FUN_1018_0b6c DATA 1 true Stack[0x4] - +1018:0b9a FUN_1018_0b6c UNCONDITIONAL_JUMP 0 true 1018:0bac Code4 LAB_1018_0bac +1018:0b9c FUN_1018_0b6c DATA 1 true Stack[0x8] - +1018:0ba1 FUN_1018_0b6c DATA 1 true Stack[0x4] - +1018:0bbb FUN_1018_0bb3 DATA 1 true Stack[0x8] - +1018:0bc1 FUN_1018_0bb3 DATA 1 true Stack[0x4] - +1018:0bc8 FUN_1018_0bb3 CONDITIONAL_JUMP 0 true 1018:0bd4 Code4 LAB_1018_0bd4 +1018:0bcc FUN_1018_0bb3 DATA 0 true Stack[-0x8] - +1018:0bcf FUN_1018_0bb3 DATA 0 true Stack[-0x6] - +1018:0bd2 FUN_1018_0bb3 UNCONDITIONAL_JUMP 0 true 1018:0c02 Code4 LAB_1018_0c02 +1018:0bd4 FUN_1018_0bb3 DATA 1 true Stack[0x4] - +1018:0bdf FUN_1018_0bb3 CONDITIONAL_JUMP 0 true 1018:0bf1 Code4 LAB_1018_0bf1 +1018:0be9 FUN_1018_0bb3 DATA 0 true Stack[-0x8] - +1018:0bec FUN_1018_0bb3 DATA 0 true Stack[-0x6] - +1018:0bef FUN_1018_0bb3 UNCONDITIONAL_JUMP 0 true 1018:0c02 Code4 LAB_1018_0c02 +1018:0bf1 FUN_1018_0bb3 DATA 1 true Stack[0x8] - +1018:0bf7 FUN_1018_0bb3 UNCONDITIONAL_CALL 0 true 1018:0097 Code4 FUN_1018_0097 FUN_1018_0097 +1018:0bfc FUN_1018_0bb3 DATA 0 true Stack[-0x8] - +1018:0bff FUN_1018_0bb3 DATA 0 true Stack[-0x6] - +1018:0c02 FUN_1018_0bb3 DATA 1 true Stack[-0x8] - +1018:0c05 FUN_1018_0bb3 DATA 1 true Stack[-0x6] - +1018:0c08 FUN_1018_0bb3 CONDITIONAL_JUMP 0 true 1018:0c1c Code4 LAB_1018_0c1c +1018:0c0a FUN_1018_0bb3 DATA 1 true Stack[0x8] - +1018:0c0f FUN_1018_0bb3 DATA 1 true Stack[0x4] - +1018:0c1a FUN_1018_0bb3 UNCONDITIONAL_JUMP 0 true 1018:0c36 Code4 LAB_1018_0c36 +1018:0c1c FUN_1018_0bb3 DATA 0 true Stack[-0x6] - +1018:0c1f FUN_1018_0bb3 DATA 0 true Stack[-0x8] - +1018:0c22 FUN_1018_0bb3 DATA 1 true Stack[0x8] - +1018:0c31 FUN_1018_0bb3 UNCONDITIONAL_CALL 0 true 1018:08c3 Code4 FUN_1018_08c3 FUN_1018_08c3 +1018:0c42 FUN_1018_0c3d DATA 1 true Stack[0x8] - +1018:0c47 FUN_1018_0c3d DATA 1 true Stack[0x4] - +1018:0c5e FUN_1018_0c59 DATA 1 true Stack[0x4] - +1018:0c69 FUN_1018_0c59 CONDITIONAL_JUMP 0 true 1018:0cc0 Code4 LAB_1018_0cc0 +1018:0c6b FUN_1018_0c59 DATA 1 true Stack[0x8] - +1018:0c74 FUN_1018_0c59 CONDITIONAL_JUMP 0 true 1018:0c97 Code4 LAB_1018_0c97 +1018:0c76 FUN_1018_0c59 DATA 1 true Stack[0x4] - +1018:0c81 FUN_1018_0c59 DATA 1 true Stack[0x8] - +1018:0c90 FUN_1018_0c59 UNCONDITIONAL_CALL 0 true 1018:08c3 Code4 FUN_1018_08c3 FUN_1018_08c3 +1018:0c95 FUN_1018_0c59 UNCONDITIONAL_JUMP 0 true 1018:0cc0 Code4 LAB_1018_0cc0 +1018:0c97 FUN_1018_0c59 DATA 1 true Stack[0x4] - +1018:0ca2 FUN_1018_0c59 DATA 1 true Stack[0x8] - +1018:0ca7 FUN_1018_0c59 DATA 1 true Stack[0x4] - +1018:0cb0 FUN_1018_0c59 UNCONDITIONAL_CALL 0 true 1228:0254 EXTERNAL GETWINDOWWORD GETWINDOWWORD +1018:0cbb FUN_1018_0c59 UNCONDITIONAL_CALL 0 true 1018:08c3 Code4 FUN_1018_08c3 FUN_1018_08c3 +1018:0ccc FUN_1018_0cc7 DATA 1 true Stack[0x6] - +1018:0cd4 FUN_1018_0cc7 CONDITIONAL_JUMP 0 true 1018:0ce0 Code4 LAB_1018_0ce0 +1018:0cd6 FUN_1018_0cc7 DATA 1 true Stack[0x6] - +1018:0cdb FUN_1018_0cc7 UNCONDITIONAL_CALL 0 true 1018:060d Code4 FUN_1018_060d FUN_1018_060d +1018:0cec FUN_1018_0ce7 DATA 1 true Stack[0x4] - +1018:0cf4 FUN_1018_0ce7 CONDITIONAL_JUMP 0 true 1018:0d63 Code4 LAB_1018_0d63 +1018:0cfe FUN_1018_0ce7 DATA 1 true Stack[0x4] - +1018:0d03 FUN_1018_0ce7 UNCONDITIONAL_CALL 0 true 1018:085a Code4 FUN_1018_085a FUN_1018_085a +1018:0d0a FUN_1018_0ce7 DATA 1 true Stack[0x4] - +1018:0d0f FUN_1018_0ce7 UNCONDITIONAL_CALL 0 true 1018:0673 Code4 FUN_1018_0673 FUN_1018_0673 +1018:0d16 FUN_1018_0ce7 CONDITIONAL_JUMP 0 true 1018:0d57 Code4 LAB_1018_0d57 +1018:0d18 FUN_1018_0ce7 DATA 1 true Stack[0x4] - +1018:0d29 FUN_1018_0ce7 CONDITIONAL_JUMP 0 true 1018:0d57 Code4 LAB_1018_0d57 +1018:0d2b FUN_1018_0ce7 DATA 1 true Stack[0x4] - +1018:0d45 FUN_1018_0ce7 DATA 1 true Stack[0x4] - +1018:0d50 FUN_1018_0ce7 UNCONDITIONAL_CALL 0 true 1228:0238 EXTERNAL SENDMESSAGE SENDMESSAGE +1018:0d55 FUN_1018_0ce7 UNCONDITIONAL_JUMP 0 true 1018:0d63 Code4 LAB_1018_0d63 +1018:0d57 FUN_1018_0ce7 DATA 1 true Stack[0x4] - +1018:0d5e FUN_1018_0ce7 UNCONDITIONAL_CALL 0 true 1228:01ec EXTERNAL DESTROYWINDOW DESTROYWINDOW +1018:0d77 FUN_1018_0d6a DATA 0 true Stack[-0x8] - +1018:0d7a FUN_1018_0d6a DATA 0 true Stack[-0x6] - +1018:0d7d FUN_1018_0d6a DATA 1 true Stack[-0x8] - +1018:0d80 FUN_1018_0d6a DATA 1 true Stack[-0x6] - +1018:0d8f FUN_1018_0d8a UNCONDITIONAL_CALL 0 true 1008:2d87 Code2 FUN_1008_2d87 FUN_1008_2d87 +1018:0da0 FUN_1018_0d9b DATA 1 true Stack[0x4] - +1018:0da5 FUN_1018_0d9b UNCONDITIONAL_CALL 0 true 1018:055c Code4 FUN_1018_055c FUN_1018_055c +1018:0dac FUN_1018_0d9b CONDITIONAL_JUMP 0 true 1018:0db9 Code4 LAB_1018_0db9 +1018:0dae FUN_1018_0d9b DATA 1 true Stack[0x4] - +1018:0db7 FUN_1018_0d9b UNCONDITIONAL_JUMP 0 true 1018:0dc6 Code4 LAB_1018_0dc6 +1018:0dbb FUN_1018_0d9b DATA 1 true Stack[0x4] - +1018:0dd4 FUN_1018_0dcd DATA 1 true Stack[0x6] - +1018:0dd9 FUN_1018_0dcd UNCONDITIONAL_CALL 0 true 1018:0673 Code4 FUN_1018_0673 FUN_1018_0673 +1018:0de0 FUN_1018_0dcd CONDITIONAL_JUMP 0 true 1018:0e03 Code4 LAB_1018_0e03 +1018:0de2 FUN_1018_0dcd DATA 1 true Stack[0x4] - +1018:0df1 FUN_1018_0dcd DATA 1 true Stack[0x6] - +1018:0dfc FUN_1018_0dcd DATA 1 true Stack[0x4] - +1018:0e12 FUN_1018_0e0a DATA 1 true Stack[0x4] - +1018:0e1d FUN_1018_0e0a CONDITIONAL_JUMP 0 true 1018:0e3f Code4 LAB_1018_0e3f +1018:0e27 FUN_1018_0e0a DATA 0 true Stack[-0x8] - +1018:0e2a FUN_1018_0e0a DATA 0 true Stack[-0x6] - +1018:0e35 FUN_1018_0e0a DATA 1 true Stack[0x4] - +1018:0e3a FUN_1018_0e0a UNCONDITIONAL_CALL 0 true 1018:085a Code4 FUN_1018_085a FUN_1018_085a +1018:0e4e FUN_1018_0e46 DATA 0 true Stack[-0x5] - +1018:0e52 FUN_1018_0e46 READ 0 true 1028:06fe Data6 DAT_1028_06fe +1018:0e56 FUN_1018_0e46 DATA 1 true Stack[0x4] - +1018:0e63 FUN_1018_0e46 DATA 0 true Stack[-0x20] - +1018:0e68 FUN_1018_0e46 UNCONDITIONAL_CALL 0 true 1228:02a8 EXTERNAL GETCLASSINFO GETCLASSINFO +1018:0e6f FUN_1018_0e46 CONDITIONAL_JUMP 0 true 1018:0e94 Code4 LAB_1018_0e94 +1018:0e71 FUN_1018_0e46 DATA 0 true Stack[-0x20] - +1018:0e76 FUN_1018_0e46 DATA 1 true Stack[0x4] - +1018:0e81 FUN_1018_0e46 DATA 0 true Stack[-0x20] - +1018:0e86 FUN_1018_0e46 UNCONDITIONAL_CALL 0 true 1228:01f0 EXTERNAL REGISTERCLASS REGISTERCLASS +1018:0e91 FUN_1018_0e46 DATA 0 true Stack[-0x5] - +1018:0e94 FUN_1018_0e46 DATA 1 true Stack[-0x5] - +1018:0ea3 FUN_1018_0e9e DATA 1 true Stack[0x4] - +1018:0eab FUN_1018_0e9e CONDITIONAL_JUMP 0 true 1018:0eb9 Code4 LAB_1018_0eb9 +1018:0eb1 FUN_1018_0e9e DATA 0 true Stack[0x8] - +1018:0eb4 FUN_1018_0e9e UNCONDITIONAL_CALL 0 true 1228:01dc EXTERNAL SHOWWINDOW SHOWWINDOW +1018:0ec8 FUN_1018_0ec0 DATA 1 true Stack[0x6] - +1018:0ed0 FUN_1018_0ec0 CONDITIONAL_JUMP 0 true 1018:0ee1 Code4 LAB_1018_0ee1 +1018:0ed2 FUN_1018_0ec0 DATA 1 true Stack[0x6] - +1018:0edf FUN_1018_0ec0 CONDITIONAL_JUMP 0 true 1018:0ee5 Code4 LAB_1018_0ee5 +1018:0ee3 FUN_1018_0ec0 UNCONDITIONAL_JUMP 0 true 1018:0ee7 Code4 LAB_1018_0ee7 +1018:0ee7 FUN_1018_0ec0 DATA 0 true Stack[-0x5] - +1018:0eea FUN_1018_0ec0 DATA 1 true Stack[-0x5] - +1018:0f04 FUN_1018_0ef4 DATA 1 true Stack[0x4] - +1018:0f09 FUN_1018_0ef4 UNCONDITIONAL_CALL 0 true 1018:080d Code4 FUN_1018_080d FUN_1018_080d +1018:0f12 FUN_1018_0ef4 CONDITIONAL_JUMP 0 true 1018:0f15 Code4 LAB_1018_0f15 +1018:0f15 FUN_1018_0ef4 DATA 0 true Stack[-0x5] - +1018:0f18 FUN_1018_0ef4 DATA 1 true Stack[-0x5] - +1018:0f27 FUN_1018_0f22 DATA 1 true Stack[0x4] - +1018:0f2c FUN_1018_0f22 UNCONDITIONAL_CALL 0 true 1018:0f38 Code4 FUN_1018_0f38 FUN_1018_0f38 +1018:0f40 FUN_1018_0f38 DATA 1 true Stack[0x4] - +1018:0f47 FUN_1018_0f38 READ 1 true 1028:064e Data6 DAT_1028_064e +1018:0f4f FUN_1018_0f38 CONDITIONAL_JUMP 0 true 1018:0f68 Code4 LAB_1018_0f68 +1018:0f55 FUN_1018_0f38 CONDITIONAL_JUMP 0 true 1018:0f68 Code4 LAB_1018_0f68 +1018:0f57 FUN_1018_0f38 READ 1 true 1028:064e Data6 DAT_1028_064e +1018:0f63 FUN_1018_0f38 DATA 0 true Stack[-0x5] - +1018:0f66 FUN_1018_0f38 UNCONDITIONAL_JUMP 0 true 1018:0f76 Code4 LAB_1018_0f76 +1018:0f68 FUN_1018_0f38 DATA 1 true Stack[0x4] - +1018:0f73 FUN_1018_0f38 DATA 0 true Stack[-0x5] - +1018:0f76 FUN_1018_0f38 DATA 0 true Stack[-0x5] - +1018:0f7a FUN_1018_0f38 CONDITIONAL_JUMP 0 true 1018:0f86 Code4 LAB_1018_0f86 +1018:0f7c FUN_1018_0f38 DATA 1 true Stack[0x4] - +1018:0f81 FUN_1018_0f38 UNCONDITIONAL_CALL 0 true 1008:2db3 Code2 FUN_1008_2db3 FUN_1008_2db3 +1018:0f92 FUN_1018_0f8d DATA 1 true Stack[0x4] - +1018:0f99 FUN_1018_0f8d READ 1 true 1028:064e Data6 DAT_1028_064e +1018:0fa1 FUN_1018_0f8d CONDITIONAL_JUMP 0 true 1018:0fb5 Code4 LAB_1018_0fb5 +1018:0fa7 FUN_1018_0f8d CONDITIONAL_JUMP 0 true 1018:0fb5 Code4 LAB_1018_0fb5 +1018:0fa9 FUN_1018_0f8d DATA 1 true Stack[0x4] - +1018:0fb0 FUN_1018_0f8d UNCONDITIONAL_CALL 0 true 1228:0194 EXTERNAL POSTQUITMESSAGE POSTQUITMESSAGE +1018:0fb5 FUN_1018_0f8d DATA 1 true Stack[0x8] - +1018:0fba FUN_1018_0f8d DATA 1 true Stack[0x4] - +1018:0fd1 FUN_1018_0fcc DATA 1 true Stack[0x4] - +1018:0fd8 FUN_1018_0fcc UNCONDITIONAL_CALL 0 true 1018:0071 Code4 FUN_1018_0071 FUN_1018_0071 +1018:0fdd FUN_1018_0fcc DATA 1 true Stack[0x8] - +1018:0fe2 FUN_1018_0fcc DATA 1 true Stack[0x4] - +1018:0fed FUN_1018_0fcc DATA 1 true Stack[0x4] - +1018:1002 FUN_1018_0ffd DATA 1 true Stack[0x8] - +1018:1007 FUN_1018_0ffd DATA 1 true Stack[0x4] - +1018:1012 FUN_1018_0ffd DATA 1 true Stack[0x8] - +1018:101a FUN_1018_0ffd CONDITIONAL_JUMP 0 true 1018:104d Code4 LAB_1018_104d +1018:101e FUN_1018_0ffd DATA 1 true Stack[0x4] - +1018:1023 FUN_1018_0ffd UNCONDITIONAL_CALL 0 true 1018:0673 Code4 FUN_1018_0673 FUN_1018_0673 +1018:102a FUN_1018_0ffd CONDITIONAL_JUMP 0 true 1018:103e Code4 LAB_1018_103e +1018:102c FUN_1018_0ffd DATA 1 true Stack[0x4] - +1018:1031 FUN_1018_0ffd READ 1 true 1028:064e Data6 DAT_1028_064e +1018:1037 FUN_1018_0ffd UNCONDITIONAL_CALL 0 true 1018:1bdf Code4 FUN_1018_1bdf FUN_1018_1bdf +1018:103c FUN_1018_0ffd UNCONDITIONAL_JUMP 0 true 1018:104d Code4 LAB_1018_104d +1018:1042 FUN_1018_0ffd READ 1 true 1028:064e Data6 DAT_1028_064e +1018:1048 FUN_1018_0ffd UNCONDITIONAL_CALL 0 true 1018:1bdf Code4 FUN_1018_1bdf FUN_1018_1bdf +1018:1059 FUN_1018_1054 DATA 1 true Stack[0x4] - +1018:1060 FUN_1018_1054 READ 1 true 1028:064e Data6 DAT_1028_064e +1018:1068 FUN_1018_1054 CONDITIONAL_JUMP 0 true 1018:108b Code4 LAB_1018_108b +1018:106e FUN_1018_1054 CONDITIONAL_JUMP 0 true 1018:108b Code4 LAB_1018_108b +1018:1070 FUN_1018_1054 READ 1 true 1028:064e Data6 DAT_1028_064e +1018:107e FUN_1018_1054 DATA 1 true Stack[0x8] - +1018:1089 FUN_1018_1054 UNCONDITIONAL_JUMP 0 true 1018:10a3 Code4 LAB_1018_10a3 +1018:108b FUN_1018_1054 DATA 1 true Stack[0x4] - +1018:1098 FUN_1018_1054 DATA 1 true Stack[0x8] - +1018:10af FUN_1018_10aa DATA 1 true Stack[0x4] - +1018:10b6 FUN_1018_10aa READ 1 true 1028:064e Data6 DAT_1028_064e +1018:10be FUN_1018_10aa CONDITIONAL_JUMP 0 true 1018:10d2 Code4 LAB_1018_10d2 +1018:10c4 FUN_1018_10aa CONDITIONAL_JUMP 0 true 1018:10d2 Code4 LAB_1018_10d2 +1018:10c6 FUN_1018_10aa DATA 1 true Stack[0x4] - +1018:10cb FUN_1018_10aa UNCONDITIONAL_CALL 0 true 1018:0f38 Code4 FUN_1018_0f38 FUN_1018_0f38 +1018:10d0 FUN_1018_10aa UNCONDITIONAL_JUMP 0 true 1018:10e2 Code4 LAB_1018_10e2 +1018:10d2 FUN_1018_10aa DATA 1 true Stack[0x8] - +1018:10d7 FUN_1018_10aa DATA 1 true Stack[0x4] - +1018:10f3 FUN_1018_10e9 DATA 0 true Stack[-0x8] - +1018:10f6 FUN_1018_10e9 DATA 0 true Stack[-0x6] - +1018:10f9 FUN_1018_10e9 DATA 1 true Stack[-0x8] - +1018:10fc FUN_1018_10e9 DATA 1 true Stack[-0x6] - +1018:1110 FUN_1018_1106 UNCONDITIONAL_CALL 0 true 1020:03ef Code5 FUN_1020_03ef FUN_1020_03ef +1018:1115 FUN_1018_1106 CONDITIONAL_JUMP 0 true 1018:111a Code4 LAB_1018_111a +1018:1117 FUN_1018_1106 UNCONDITIONAL_JUMP 0 true 1018:120f Code4 LAB_1018_120f +1018:111a FUN_1018_1106 DATA 0 true Stack[0x10] - +1018:111d FUN_1018_1106 DATA 0 true Stack[0xe] - +1018:1123 FUN_1018_1106 DATA 1 true Stack[0x4] - +1018:1128 FUN_1018_1106 UNCONDITIONAL_CALL 0 true 1018:0341 Code4 FUN_1018_0341 FUN_1018_0341 +1018:112d FUN_1018_1106 DATA 1 true Stack[0x4] - +1018:1134 FUN_1018_1106 DATA 0 true Stack[-0x8] - +1018:1137 FUN_1018_1106 DATA 0 true Stack[-0x6] - +1018:113a FUN_1018_1106 DATA 0 true Stack[0xc] - +1018:113d FUN_1018_1106 DATA 0 true Stack[0xa] - +1018:1140 FUN_1018_1106 UNCONDITIONAL_CALL 0 true 1008:302c Code2 FUN_1008_302c FUN_1008_302c +1018:1145 FUN_1018_1106 DATA 1 true Stack[-0x8] - +1018:1155 FUN_1018_1106 DATA 1 true Stack[0x4] - +1018:1160 FUN_1018_1106 DATA 1 true Stack[0xe] - +1018:1163 FUN_1018_1106 DATA 1 true Stack[0x10] - +1018:1166 FUN_1018_1106 CONDITIONAL_JUMP 0 true 1018:1179 Code4 LAB_1018_1179 +1018:1168 FUN_1018_1106 DATA 1 true Stack[-0x8] - +1018:1177 FUN_1018_1106 UNCONDITIONAL_JUMP 0 true 1018:11c7 Code4 LAB_1018_11c7 +1018:1179 FUN_1018_1106 DATA 1 true Stack[0xe] - +1018:1186 FUN_1018_1106 CONDITIONAL_JUMP 0 true 1018:11b8 Code4 LAB_1018_11b8 +1018:118c FUN_1018_1106 DATA 1 true Stack[0x4] - +1018:1191 FUN_1018_1106 UNCONDITIONAL_CALL 0 true 1018:0641 Code4 FUN_1018_0641 FUN_1018_0641 +1018:119c FUN_1018_1106 DATA 1 true Stack[0x4] - +1018:11a7 FUN_1018_1106 DATA 1 true Stack[-0x8] - +1018:11b6 FUN_1018_1106 UNCONDITIONAL_JUMP 0 true 1018:11c7 Code4 LAB_1018_11c7 +1018:11b8 FUN_1018_1106 DATA 1 true Stack[-0x8] - +1018:11c7 FUN_1018_1106 DATA 1 true Stack[-0x8] - +1018:11fc FUN_1018_1106 DATA 1 true Stack[0x4] - +1018:120f FUN_1018_1106 DATA 1 true Stack[0x4] - +1018:1220 FUN_1018_121b DATA 1 true Stack[0x4] - +1018:122b FUN_1018_121b UNCONDITIONAL_CALL 0 true 1008:3099 Code2 FUN_1008_3099 FUN_1008_3099 +1018:1230 FUN_1018_121b DATA 1 true Stack[0x4] - +1018:123b FUN_1018_121b CONDITIONAL_JUMP 0 true 1018:1259 Code4 LAB_1018_1259 +1018:124c FUN_1018_121b DATA 1 true Stack[0x4] - +1018:125c FUN_1018_121b DATA 1 true Stack[0x4] - +1018:1261 FUN_1018_121b UNCONDITIONAL_CALL 0 true 1018:03ff Code4 FUN_1018_03ff FUN_1018_03ff +1018:1268 FUN_1018_121b UNCONDITIONAL_CALL 0 true 1020:0439 Code5 FUN_1020_0439 FUN_1020_0439 +1018:1279 FUN_1018_1274 DATA 1 true Stack[0x8] - +1018:1288 FUN_1018_1274 READ 1 true 1028:06fe Data6 DAT_1028_06fe +1018:1296 FUN_1018_1274 UNCONDITIONAL_CALL 0 true 1228:027c EXTERNAL LOADICON LOADICON +1018:129b FUN_1018_1274 DATA 1 true Stack[0x8] - +1018:12a9 FUN_1018_1274 UNCONDITIONAL_CALL 0 true 1228:0278 EXTERNAL LOADCURSOR LOADCURSOR +1018:12ae FUN_1018_1274 DATA 1 true Stack[0x8] - +1018:12c5 FUN_1018_1274 DATA 1 true Stack[0x4] - +1018:12d0 FUN_1018_1274 DATA 1 true Stack[0x8] - +1018:12fd FUN_1018_12f5 DATA 1 true Stack[0x4] - +1018:1304 FUN_1018_12f5 DATA 0 true Stack[-0x6] - +1018:1307 FUN_1018_12f5 DATA 1 true Stack[-0x6] - +1018:1316 FUN_1018_1311 DATA 1 true Stack[0x4] - +1018:1325 FUN_1018_1311 DATA 1 true Stack[0x8] - +1018:1338 FUN_1018_1311 UNCONDITIONAL_CALL 0 true 1228:0248 EXTERNAL CALLWINDOWPROC CALLWINDOWPROC +1018:133d FUN_1018_1311 DATA 1 true Stack[0x8] - +1018:1357 FUN_1018_134f DATA 1 true Stack[0x4] - +1018:135f FUN_1018_134f CONDITIONAL_JUMP 0 true 1018:1364 Code4 LAB_1018_1364 +1018:1361 FUN_1018_134f UNCONDITIONAL_JUMP 0 true 1018:152d Code4 LAB_1018_152d +1018:1366 FUN_1018_134f UNCONDITIONAL_CALL 0 true 1018:0627 Code4 FUN_1018_0627 FUN_1018_0627 +1018:136b FUN_1018_134f DATA 1 true Stack[0x4] - +1018:1376 FUN_1018_134f CONDITIONAL_JUMP 0 true 1018:137f Code4 LAB_1018_137f +1018:137a FUN_1018_134f DATA 0 true Stack[-0x8] - +1018:137d FUN_1018_134f UNCONDITIONAL_JUMP 0 true 1018:138d Code4 LAB_1018_138d +1018:137f FUN_1018_134f DATA 1 true Stack[0x4] - +1018:138a FUN_1018_134f DATA 0 true Stack[-0x8] - +1018:138f FUN_1018_134f DATA 1 true Stack[0x4] - +1018:1394 FUN_1018_134f UNCONDITIONAL_CALL 0 true 1018:0673 Code4 FUN_1018_0673 FUN_1018_0673 +1018:139b FUN_1018_134f CONDITIONAL_JUMP 0 true 1018:13a0 Code4 LAB_1018_13a0 +1018:139d FUN_1018_134f UNCONDITIONAL_JUMP 0 true 1018:14be Code4 LAB_1018_14be +1018:13a0 FUN_1018_134f DATA 1 true Stack[0x4] - +1018:13ad FUN_1018_134f CONDITIONAL_JUMP 0 true 1018:13b2 Code4 LAB_1018_13b2 +1018:13af FUN_1018_134f UNCONDITIONAL_JUMP 0 true 1018:14bc Code4 LAB_1018_14bc +1018:13b2 FUN_1018_134f DATA 1 true Stack[0x4] - +1018:13b9 FUN_1018_134f WRITE 0 true 1028:0676 Data6 DAT_1028_0676 +1018:13bc FUN_1018_134f WRITE 0 true 1028:0678 Data6 DAT_1028_0678 +1018:13c4 FUN_1018_134f UNCONDITIONAL_CALL 0 true 1018:0673 Code4 FUN_1018_0673 FUN_1018_0673 +1018:13cb FUN_1018_134f CONDITIONAL_JUMP 0 true 1018:1433 Code4 LAB_1018_1433 +1018:13cd FUN_1018_134f DATA 1 true Stack[0x4] - +1018:13d4 FUN_1018_134f DATA 0 true Stack[-0x2a] - +1018:13d7 FUN_1018_134f DATA 0 true Stack[-0x28] - +1018:13e2 FUN_1018_134f DATA 1 true Stack[0x4] - +1018:13ef FUN_1018_134f DATA 1 true Stack[-0x2a] - +1018:1411 FUN_1018_134f DATA 0 true Stack[-0x8] - +1018:1418 FUN_1018_134f READ 0 true 1028:06fe Data6 DAT_1028_06fe +1018:1424 FUN_1018_134f UNCONDITIONAL_CALL 0 true 1228:02b8 EXTERNAL CREATEWINDOWEX CREATEWINDOWEX +1018:1429 FUN_1018_134f DATA 1 true Stack[0x4] - +1018:1430 FUN_1018_134f UNCONDITIONAL_JUMP 0 true 1018:14bc Code4 LAB_1018_14bc +1018:1433 FUN_1018_134f DATA 1 true Stack[0x4] - +1018:143e FUN_1018_134f DATA 0 true Stack[-0x26] - +1018:1441 FUN_1018_134f DATA 0 true Stack[-0x24] - +1018:1444 FUN_1018_134f DATA 1 true Stack[0x4] - +1018:144f FUN_1018_134f DATA 0 true Stack[-0x22] - +1018:1452 FUN_1018_134f DATA 0 true Stack[-0x20] - +1018:1455 FUN_1018_134f READ 1 true 1028:06fe Data6 DAT_1028_06fe +1018:1458 FUN_1018_134f DATA 0 true Stack[-0x1e] - +1018:145f FUN_1018_134f DATA 0 true Stack[-0x1c] - +1018:1466 FUN_1018_134f DATA 0 true Stack[-0x1a] - +1018:146d FUN_1018_134f DATA 0 true Stack[-0x18] - +1018:1474 FUN_1018_134f DATA 0 true Stack[-0x16] - +1018:147f FUN_1018_134f DATA 0 true Stack[-0x14] - +1018:1482 FUN_1018_134f DATA 0 true Stack[-0x12] - +1018:1491 FUN_1018_134f DATA 0 true Stack[-0xc] - +1018:1494 FUN_1018_134f DATA 0 true Stack[-0xa] - +1018:1497 FUN_1018_134f DATA 1 true Stack[-0xc] - +1018:149a FUN_1018_134f DATA 1 true Stack[-0xa] - +1018:149d FUN_1018_134f CONDITIONAL_JUMP 0 true 1018:14bc Code4 LAB_1018_14bc +1018:149f FUN_1018_134f DATA 1 true Stack[-0xc] - +1018:14ab FUN_1018_134f DATA 0 true Stack[-0x26] - +1018:14b0 FUN_1018_134f UNCONDITIONAL_CALL 0 true 1228:0238 EXTERNAL SENDMESSAGE SENDMESSAGE +1018:14b5 FUN_1018_134f DATA 1 true Stack[0x4] - +1018:14bc FUN_1018_134f UNCONDITIONAL_JUMP 0 true 1018:14d4 Code4 LAB_1018_14d4 +1018:14be FUN_1018_134f DATA 0 true Stack[-0x8] - +1018:14c1 FUN_1018_134f DATA 1 true Stack[0x4] - +1018:14c8 FUN_1018_134f UNCONDITIONAL_CALL 0 true 1228:0214 EXTERNAL GETDLGITEM GETDLGITEM +1018:14cd FUN_1018_134f DATA 1 true Stack[0x4] - +1018:14d4 FUN_1018_134f DATA 1 true Stack[0x4] - +1018:14dc FUN_1018_134f CONDITIONAL_JUMP 0 true 1018:14e6 Code4 LAB_1018_14e6 +1018:14e4 FUN_1018_134f UNCONDITIONAL_JUMP 0 true 1018:152d Code4 LAB_1018_152d +1018:14e6 FUN_1018_134f DATA 1 true Stack[0x4] - +1018:14ed FUN_1018_134f UNCONDITIONAL_CALL 0 true 1018:0097 Code4 FUN_1018_0097 FUN_1018_0097 +1018:14f4 FUN_1018_134f CONDITIONAL_JUMP 0 true 1018:152d Code4 LAB_1018_152d +1018:14f6 FUN_1018_134f DATA 1 true Stack[0x4] - +1018:14ff FUN_1018_134f UNCONDITIONAL_CALL 0 true 1018:0045 Code4 FUN_1018_0045 FUN_1018_0045 +1018:1504 FUN_1018_134f DATA 1 true Stack[0x4] - +1018:1515 FUN_1018_134f UNCONDITIONAL_CALL 0 true 1228:025c EXTERNAL SETWINDOWLONG SETWINDOWLONG +1018:151a FUN_1018_134f DATA 1 true Stack[0x4] - +1018:152d FUN_1018_134f DATA 1 true Stack[0x4] - +1018:1537 FUN_1018_134f CONDITIONAL_JUMP 0 true 1018:153a Code4 LAB_1018_153a +1018:153a FUN_1018_134f DATA 0 true Stack[-0x5] - +1018:153d FUN_1018_134f DATA 1 true Stack[-0x5] - +1018:154c FUN_1018_1547 DATA 1 true Stack[0x4] - +1018:1554 FUN_1018_1547 CONDITIONAL_JUMP 0 true 1018:157f Code4 LAB_1018_157f +1018:155a FUN_1018_1547 UNCONDITIONAL_CALL 0 true 1228:01e4 EXTERNAL ISWINDOW ISWINDOW +1018:1561 FUN_1018_1547 CONDITIONAL_JUMP 0 true 1018:157f Code4 LAB_1018_157f +1018:1563 FUN_1018_1547 DATA 1 true Stack[0x4] - +1018:156a FUN_1018_1547 UNCONDITIONAL_CALL 0 true 1228:01bc EXTERNAL ISICONIC ISICONIC +1018:1571 FUN_1018_1547 CONDITIONAL_JUMP 0 true 1018:157f Code4 LAB_1018_157f +1018:1573 FUN_1018_1547 DATA 1 true Stack[0x4] - +1018:157a FUN_1018_1547 UNCONDITIONAL_CALL 0 true 1228:01a4 EXTERNAL SETFOCUS SETFOCUS +1018:158e FUN_1018_1586 UNCONDITIONAL_CALL 0 true 1228:01a8 EXTERNAL GETFOCUS GETFOCUS +1018:1593 FUN_1018_1586 DATA 0 true Stack[-0x6] - +1018:1596 FUN_1018_1586 DATA 0 true Stack[-0x6] - +1018:159a FUN_1018_1586 CONDITIONAL_JUMP 0 true 1018:15b9 Code4 LAB_1018_15b9 +1018:159c FUN_1018_1586 DATA 1 true Stack[0x4] - +1018:15a3 FUN_1018_1586 DATA 0 true Stack[-0x6] - +1018:15a6 FUN_1018_1586 UNCONDITIONAL_CALL 0 true 1228:01e8 EXTERNAL ISCHILD ISCHILD +1018:15ad FUN_1018_1586 CONDITIONAL_JUMP 0 true 1018:15b9 Code4 LAB_1018_15b9 +1018:15af FUN_1018_1586 DATA 1 true Stack[-0x6] - +1018:15b2 FUN_1018_1586 DATA 1 true Stack[0x4] - +1018:15c8 FUN_1018_15c0 DATA 1 true Stack[0x4] - +1018:15cf FUN_1018_15c0 UNCONDITIONAL_CALL 0 true 1228:01bc EXTERNAL ISICONIC ISICONIC +1018:15d6 FUN_1018_15c0 CONDITIONAL_JUMP 0 true 1018:15db Code4 LAB_1018_15db +1018:15d8 FUN_1018_15c0 UNCONDITIONAL_JUMP 0 true 1018:1696 Code4 LAB_1018_1696 +1018:15db FUN_1018_15c0 DATA 1 true Stack[0x4] - +1018:15e2 FUN_1018_15c0 UNCONDITIONAL_CALL 0 true 1228:0298 EXTERNAL ISZOOMED ISZOOMED +1018:15e9 FUN_1018_15c0 CONDITIONAL_JUMP 0 true 1018:15ee Code4 LAB_1018_15ee +1018:15eb FUN_1018_15c0 UNCONDITIONAL_JUMP 0 true 1018:1696 Code4 LAB_1018_1696 +1018:15ee FUN_1018_15c0 DATA 1 true Stack[0x4] - +1018:15f5 FUN_1018_15c0 DATA 0 true Stack[-0xc] - +1018:15fa FUN_1018_15c0 UNCONDITIONAL_CALL 0 true 1228:01c0 EXTERNAL GETWINDOWRECT GETWINDOWRECT +1018:15ff FUN_1018_15c0 DATA 1 true Stack[-0x8] - +1018:1602 FUN_1018_15c0 DATA 1 true Stack[-0xc] - +1018:1605 FUN_1018_15c0 DATA 1 true Stack[0x4] - +1018:160c FUN_1018_15c0 DATA 1 true Stack[-0x6] - +1018:160f FUN_1018_15c0 DATA 1 true Stack[-0xa] - +1018:161e FUN_1018_15c0 CONDITIONAL_JUMP 0 true 1018:1685 Code4 LAB_1018_1685 +1018:162c FUN_1018_15c0 DATA 0 true Stack[-0x10] - +1018:162f FUN_1018_15c0 DATA 0 true Stack[-0xe] - +1018:1632 FUN_1018_15c0 DATA 1 true Stack[-0x10] - +1018:1635 FUN_1018_15c0 DATA 1 true Stack[-0xe] - +1018:1638 FUN_1018_15c0 CONDITIONAL_JUMP 0 true 1018:165d Code4 LAB_1018_165d +1018:163c FUN_1018_15c0 DATA 1 true Stack[0x4] - +1018:1641 FUN_1018_15c0 UNCONDITIONAL_CALL 0 true 1018:0673 Code4 FUN_1018_0673 FUN_1018_0673 +1018:1648 FUN_1018_15c0 CONDITIONAL_JUMP 0 true 1018:165d Code4 LAB_1018_165d +1018:164a FUN_1018_15c0 DATA 1 true Stack[-0x10] - +1018:1651 FUN_1018_15c0 DATA 0 true Stack[-0xc] - +1018:1656 FUN_1018_15c0 UNCONDITIONAL_CALL 0 true 1228:01b8 EXTERNAL SCREENTOCLIENT SCREENTOCLIENT +1018:165b FUN_1018_15c0 UNCONDITIONAL_JUMP 0 true 1018:1685 Code4 LAB_1018_1685 +1018:165d FUN_1018_15c0 DATA 1 true Stack[0x4] - +1018:1671 FUN_1018_15c0 CONDITIONAL_JUMP 0 true 1018:1685 Code4 LAB_1018_1685 +1018:167b FUN_1018_15c0 DATA 0 true Stack[-0xc] - +1018:1680 FUN_1018_15c0 UNCONDITIONAL_CALL 0 true 1228:01b8 EXTERNAL SCREENTOCLIENT SCREENTOCLIENT +1018:1685 FUN_1018_15c0 DATA 1 true Stack[-0xc] - +1018:1688 FUN_1018_15c0 DATA 1 true Stack[0x4] - +1018:168f FUN_1018_15c0 DATA 1 true Stack[-0xa] - +1018:16a5 FUN_1018_169d DATA 1 true Stack[0x8] - +1018:16aa FUN_1018_169d DATA 1 true Stack[0x4] - +1018:16af FUN_1018_169d UNCONDITIONAL_CALL 0 true 1018:0ffd Code4 FUN_1018_0ffd FUN_1018_0ffd +1018:16b6 FUN_1018_169d DATA 1 true Stack[0x4] - +1018:16bb FUN_1018_169d UNCONDITIONAL_CALL 0 true 1018:0673 Code4 FUN_1018_0673 FUN_1018_0673 +1018:16c2 FUN_1018_169d CONDITIONAL_JUMP 0 true 1018:16e4 Code4 LAB_1018_16e4 +1018:16c4 FUN_1018_169d DATA 1 true Stack[0x8] - +1018:16cc FUN_1018_169d CONDITIONAL_JUMP 0 true 1018:16da Code4 LAB_1018_16da +1018:16ce FUN_1018_169d DATA 1 true Stack[0x4] - +1018:16d3 FUN_1018_169d UNCONDITIONAL_CALL 0 true 1018:1547 Code4 FUN_1018_1547 FUN_1018_1547 +1018:16d8 FUN_1018_169d UNCONDITIONAL_JUMP 0 true 1018:16e4 Code4 LAB_1018_16e4 +1018:16da FUN_1018_169d DATA 1 true Stack[0x4] - +1018:16df FUN_1018_169d UNCONDITIONAL_CALL 0 true 1018:1586 Code4 FUN_1018_1586 FUN_1018_1586 +1018:16f0 FUN_1018_16eb DATA 1 true Stack[0x8] - +1018:16f5 FUN_1018_16eb DATA 1 true Stack[0x4] - +1018:1700 FUN_1018_16eb UNCONDITIONAL_CALL 0 true 1020:16e1 Code5 FUN_1020_16e1 FUN_1020_16e1 +1018:1711 FUN_1018_170c DATA 1 true Stack[0x4] - +1018:1716 FUN_1018_170c UNCONDITIONAL_CALL 0 true 1018:0d9b Code4 FUN_1018_0d9b FUN_1018_0d9b +1018:171d FUN_1018_170c DATA 1 true Stack[0x4] - +1018:1722 FUN_1018_170c UNCONDITIONAL_CALL 0 true 1018:0673 Code4 FUN_1018_0673 FUN_1018_0673 +1018:1729 FUN_1018_170c CONDITIONAL_JUMP 0 true 1018:1737 Code4 LAB_1018_1737 +1018:172b FUN_1018_170c DATA 1 true Stack[0x4] - +1018:1732 FUN_1018_170c UNCONDITIONAL_CALL 0 true 1228:01a4 EXTERNAL SETFOCUS SETFOCUS +1018:1737 FUN_1018_170c DATA 1 true Stack[0x4] - +1018:1742 FUN_1018_170c CONDITIONAL_JUMP 0 true 1018:1750 Code4 LAB_1018_1750 +1018:1750 FUN_1018_170c DATA 1 true Stack[0x4] - +1018:1755 FUN_1018_170c UNCONDITIONAL_CALL 0 true 1018:15c0 Code4 FUN_1018_15c0 FUN_1018_15c0 +1018:1766 FUN_1018_1761 DATA 1 true Stack[0x4] - +1018:1771 FUN_1018_1761 DATA 1 true Stack[0x8] - +1018:1776 FUN_1018_1761 DATA 1 true Stack[0x4] - +1018:178d FUN_1018_1788 DATA 1 true Stack[0x4] - +1018:1796 FUN_1018_1788 UNCONDITIONAL_CALL 0 true 1228:0258 EXTERNAL GETWINDOWLONG GETWINDOWLONG +1018:17a4 FUN_1018_1788 CONDITIONAL_JUMP 0 true 1018:17b8 Code4 LAB_1018_17b8 +1018:17a6 FUN_1018_1788 DATA 1 true Stack[0x8] - +1018:17ab FUN_1018_1788 DATA 1 true Stack[0x4] - +1018:17b6 FUN_1018_1788 UNCONDITIONAL_JUMP 0 true 1018:17f1 Code4 LAB_1018_17f1 +1018:17b8 FUN_1018_1788 DATA 1 true Stack[0x4] - +1018:17c3 FUN_1018_1788 CONDITIONAL_JUMP 0 true 1018:17e1 Code4 LAB_1018_17e1 +1018:17c5 FUN_1018_1788 DATA 1 true Stack[0x8] - +1018:17d0 FUN_1018_1788 DATA 1 true Stack[0x4] - +1018:17df FUN_1018_1788 UNCONDITIONAL_JUMP 0 true 1018:17f1 Code4 LAB_1018_17f1 +1018:17e1 FUN_1018_1788 DATA 1 true Stack[0x8] - +1018:17e6 FUN_1018_1788 DATA 1 true Stack[0x4] - +1018:17fd FUN_1018_17f8 DATA 1 true Stack[0x4] - +1018:1806 FUN_1018_17f8 UNCONDITIONAL_CALL 0 true 1228:0258 EXTERNAL GETWINDOWLONG GETWINDOWLONG +1018:1814 FUN_1018_17f8 CONDITIONAL_JUMP 0 true 1018:1828 Code4 LAB_1018_1828 +1018:1816 FUN_1018_17f8 DATA 1 true Stack[0x8] - +1018:181b FUN_1018_17f8 DATA 1 true Stack[0x4] - +1018:1826 FUN_1018_17f8 UNCONDITIONAL_JUMP 0 true 1018:1861 Code4 LAB_1018_1861 +1018:1828 FUN_1018_17f8 DATA 1 true Stack[0x4] - +1018:1833 FUN_1018_17f8 CONDITIONAL_JUMP 0 true 1018:1851 Code4 LAB_1018_1851 +1018:1835 FUN_1018_17f8 DATA 1 true Stack[0x8] - +1018:1840 FUN_1018_17f8 DATA 1 true Stack[0x4] - +1018:184f FUN_1018_17f8 UNCONDITIONAL_JUMP 0 true 1018:1861 Code4 LAB_1018_1861 +1018:1851 FUN_1018_17f8 DATA 1 true Stack[0x8] - +1018:1856 FUN_1018_17f8 DATA 1 true Stack[0x4] - +1018:1870 FUN_1018_1868 DATA 1 true Stack[0x4] - +1018:1877 FUN_1018_1868 DATA 0 true Stack[-0x24] - +1018:187c FUN_1018_1868 UNCONDITIONAL_CALL 0 true 1228:01d0 EXTERNAL BEGINPAINT BEGINPAINT +1018:1881 FUN_1018_1868 DATA 1 true Stack[0x4] - +1018:188c FUN_1018_1868 CONDITIONAL_JUMP 0 true 1018:18a5 Code4 LAB_1018_18a5 +1018:188e FUN_1018_1868 DATA 0 true Stack[-0x24] - +1018:1891 FUN_1018_1868 DATA 0 true Stack[-0x24] - +1018:1896 FUN_1018_1868 DATA 1 true Stack[0x4] - +1018:18a5 FUN_1018_1868 DATA 0 true Stack[-0x24] - +1018:18a8 FUN_1018_1868 DATA 0 true Stack[-0x24] - +1018:18ad FUN_1018_1868 DATA 1 true Stack[0x4] - +1018:18b8 FUN_1018_1868 DATA 1 true Stack[0x4] - +1018:18c3 FUN_1018_1868 CONDITIONAL_JUMP 0 true 1018:18d1 Code4 LAB_1018_18d1 +1018:18d1 FUN_1018_1868 DATA 1 true Stack[0x4] - +1018:18d8 FUN_1018_1868 DATA 0 true Stack[-0x24] - +1018:18dd FUN_1018_1868 UNCONDITIONAL_CALL 0 true 1228:01d4 EXTERNAL ENDPAINT ENDPAINT +1018:18f1 FUN_1018_18e9 DATA 1 true Stack[0x4] - +1018:18fc FUN_1018_18e9 CONDITIONAL_JUMP 0 true 1018:1917 Code4 LAB_1018_1917 +1018:18fe FUN_1018_18e9 DATA 1 true Stack[0x8] - +1018:1906 FUN_1018_18e9 CONDITIONAL_JUMP 0 true 1018:1917 Code4 LAB_1018_1917 +1018:1908 FUN_1018_18e9 DATA 1 true Stack[0x4] - +1018:1917 FUN_1018_18e9 DATA 1 true Stack[0x8] - +1018:191f FUN_1018_18e9 CONDITIONAL_JUMP 0 true 1018:1949 Code4 LAB_1018_1949 +1018:1921 FUN_1018_18e9 DATA 1 true Stack[0x4] - +1018:1928 FUN_1018_18e9 DATA 0 true Stack[-0xc] - +1018:192d FUN_1018_18e9 UNCONDITIONAL_CALL 0 true 1228:01c0 EXTERNAL GETWINDOWRECT GETWINDOWRECT +1018:1932 FUN_1018_18e9 DATA 1 true Stack[-0x6] - +1018:1935 FUN_1018_18e9 DATA 1 true Stack[-0xa] - +1018:1938 FUN_1018_18e9 DATA 1 true Stack[0x4] - +1018:193f FUN_1018_18e9 DATA 1 true Stack[-0x8] - +1018:1942 FUN_1018_18e9 DATA 1 true Stack[-0xc] - +1018:1949 FUN_1018_18e9 DATA 1 true Stack[0x8] - +1018:194e FUN_1018_18e9 DATA 1 true Stack[0x4] - +1018:1965 FUN_1018_1960 DATA 1 true Stack[0x4] - +1018:196a FUN_1018_1960 UNCONDITIONAL_CALL 0 true 1018:15c0 Code4 FUN_1018_15c0 FUN_1018_15c0 +1018:196f FUN_1018_1960 DATA 1 true Stack[0x8] - +1018:1974 FUN_1018_1960 DATA 1 true Stack[0x4] - +1018:198e FUN_1018_1986 DATA 1 true Stack[0x4] - +1018:1999 FUN_1018_1986 CONDITIONAL_JUMP 0 true 1018:19f7 Code4 LAB_1018_19f7 +1018:19a4 FUN_1018_1986 CONDITIONAL_JUMP 0 true 1018:19f7 Code4 LAB_1018_19f7 +1018:19a6 FUN_1018_1986 DATA 1 true Stack[0x4] - +1018:19ad FUN_1018_1986 UNCONDITIONAL_CALL 0 true 1228:019c EXTERNAL SETCAPTURE SETCAPTURE +1018:19b2 FUN_1018_1986 DATA 0 true Stack[-0x16] - +1018:19bf FUN_1018_1986 UNCONDITIONAL_CALL 0 true 1228:0234 EXTERNAL PEEKMESSAGE PEEKMESSAGE +1018:19c6 FUN_1018_1986 CONDITIONAL_JUMP 0 true 1018:19dc Code4 LAB_1018_19dc +1018:19c8 FUN_1018_1986 DATA 0 true Stack[-0x16] - +1018:19cd FUN_1018_1986 UNCONDITIONAL_CALL 0 true 1228:0240 EXTERNAL TRANSLATEMESSAGE TRANSLATEMESSAGE +1018:19d2 FUN_1018_1986 DATA 0 true Stack[-0x16] - +1018:19d7 FUN_1018_1986 UNCONDITIONAL_CALL 0 true 1228:0244 EXTERNAL DISPATCHMESSAGE DISPATCHMESSAGE +1018:19dc FUN_1018_1986 DATA 1 true Stack[0x4] - +1018:19eb FUN_1018_1986 DATA 0 true Stack[-0x14] - +1018:19f0 FUN_1018_1986 CONDITIONAL_JUMP 0 true 1018:19b2 Code4 LAB_1018_19b2 +1018:19f2 FUN_1018_1986 UNCONDITIONAL_CALL 0 true 1228:01a0 EXTERNAL RELEASECAPTURE RELEASECAPTURE +1018:19f7 FUN_1018_1986 DATA 1 true Stack[0x8] - +1018:19fc FUN_1018_1986 DATA 1 true Stack[0x4] - +1018:1a15 FUN_1018_1a0e DATA 1 true Stack[0x4] - +1018:1a1a FUN_1018_1a0e UNCONDITIONAL_CALL 0 true 1018:0673 Code4 FUN_1018_0673 FUN_1018_0673 +1018:1a21 FUN_1018_1a0e CONDITIONAL_JUMP 0 true 1018:1a4a Code4 LAB_1018_1a4a +1018:1a23 FUN_1018_1a0e DATA 1 true Stack[0x8] - +1018:1a2d FUN_1018_1a0e CONDITIONAL_JUMP 0 true 1018:1a3b Code4 LAB_1018_1a3b +1018:1a2f FUN_1018_1a0e DATA 1 true Stack[0x4] - +1018:1a34 FUN_1018_1a0e UNCONDITIONAL_CALL 0 true 1018:1586 Code4 FUN_1018_1586 FUN_1018_1586 +1018:1a39 FUN_1018_1a0e UNCONDITIONAL_JUMP 0 true 1018:1a4a Code4 LAB_1018_1a4a +1018:1a3e FUN_1018_1a0e CONDITIONAL_JUMP 0 true 1018:1a4a Code4 LAB_1018_1a4a +1018:1a40 FUN_1018_1a0e DATA 1 true Stack[0x4] - +1018:1a45 FUN_1018_1a0e UNCONDITIONAL_CALL 0 true 1018:1547 Code4 FUN_1018_1547 FUN_1018_1547 +1018:1a4a FUN_1018_1a0e DATA 1 true Stack[0x8] - +1018:1a4f FUN_1018_1a0e DATA 1 true Stack[0x4] - +1018:1a68 FUN_1018_1a61 UNCONDITIONAL_CALL 0 true 1020:03ef Code5 FUN_1020_03ef FUN_1020_03ef +1018:1a6d FUN_1018_1a61 CONDITIONAL_JUMP 0 true 1018:1a72 Code4 LAB_1018_1a72 +1018:1a6f FUN_1018_1a61 UNCONDITIONAL_JUMP 0 true 1018:1afc Code4 LAB_1018_1afc +1018:1a75 FUN_1018_1a61 DATA 1 true Stack[0x4] - +1018:1a7a FUN_1018_1a61 UNCONDITIONAL_CALL 0 true 1008:2d99 Code2 FUN_1008_2d99 FUN_1008_2d99 +1018:1a7f FUN_1018_1a61 DATA 1 true Stack[0xa] - +1018:1a82 FUN_1018_1a61 DATA 1 true Stack[0xc] - +1018:1a85 FUN_1018_1a61 DATA 1 true Stack[0x4] - +1018:1a94 FUN_1018_1a61 WRITE 0 true 1028:064e Data6 DAT_1028_064e +1018:1a97 FUN_1018_1a61 WRITE 0 true 1028:0650 Data6 DAT_1028_064e+2 +1018:1ac3 FUN_1018_1a61 READ 0 true 1028:06fe Data6 DAT_1028_06fe +1018:1ac7 FUN_1018_1a61 UNCONDITIONAL_CALL 0 true 1228:0030 EXTERNAL MAKEPROCINSTANCE MAKEPROCINSTANCE +1018:1acc FUN_1018_1a61 WRITE 0 true 1028:0672 Data6 DAT_1028_0672 +1018:1acf FUN_1018_1a61 WRITE 0 true 1028:0674 Data6 DAT_1028_0674 +1018:1ad3 FUN_1018_1a61 UNCONDITIONAL_CALL 0 true 1008:2e76 Code2 FUN_1008_2e76 FUN_1008_2e76 +1018:1ad8 FUN_1018_1a61 READ 0 true 1028:06fc Data6 DAT_1028_06fc +1018:1add FUN_1018_1a61 CONDITIONAL_JUMP 0 true 1018:1aea Code4 LAB_1018_1aea +1018:1adf FUN_1018_1a61 DATA 1 true Stack[0x4] - +1018:1aea FUN_1018_1a61 DATA 1 true Stack[0x4] - +1018:1af2 FUN_1018_1a61 CONDITIONAL_JUMP 0 true 1018:1afc Code4 LAB_1018_1afc +1018:1afc FUN_1018_1a61 DATA 1 true Stack[0x4] - +1018:1b0d FUN_1018_1b08 READ 0 true 1028:0674 Data6 DAT_1028_0674 +1018:1b11 FUN_1018_1b08 READ 0 true 1028:0672 Data6 DAT_1028_0672 +1018:1b15 FUN_1018_1b08 UNCONDITIONAL_CALL 0 true 1228:0034 EXTERNAL FREEPROCINSTANCE FREEPROCINSTANCE +1018:1b1d FUN_1018_1b08 DATA 1 true Stack[0x4] - +1018:1b22 FUN_1018_1b08 UNCONDITIONAL_CALL 0 true 1008:2dcd Code2 FUN_1008_2dcd FUN_1008_2dcd +1018:1b29 FUN_1018_1b08 UNCONDITIONAL_CALL 0 true 1020:0439 Code5 FUN_1020_0439 FUN_1020_0439 +1018:1b3d FUN_1018_1b35 DATA 0 true Stack[-0x5] - +1018:1b41 FUN_1018_1b35 DATA 1 true Stack[-0x5] - +1018:1b5c FUN_1018_1b57 DATA 1 true Stack[0x4] - +1018:1b67 FUN_1018_1b57 DATA 1 true Stack[0x4] - +1018:1b7a FUN_1018_1b57 DATA 1 true Stack[0x4] - +1018:1b8d FUN_1018_1b57 CONDITIONAL_JUMP 0 true 1018:1ba0 Code4 LAB_1018_1ba0 +1018:1b8f FUN_1018_1b57 READ 0 true 1028:0700 Data6 DAT_1028_0700 +1018:1b99 FUN_1018_1b57 UNCONDITIONAL_CALL 0 true 1018:0e9e Code4 FUN_1018_0e9e FUN_1018_0e9e +1018:1b9e FUN_1018_1b57 UNCONDITIONAL_JUMP 0 true 1018:1ba9 Code4 LAB_1018_1ba9 +1018:1ba0 FUN_1018_1b57 DATA 1 true Stack[0x4] - +1018:1bb5 FUN_1018_1bb0 DATA 1 true Stack[0x4] - +1018:1bbd FUN_1018_1bb0 CONDITIONAL_JUMP 0 true 1018:1bc9 Code4 LAB_1018_1bc9 +1018:1bc7 FUN_1018_1bb0 UNCONDITIONAL_JUMP 0 true 1018:1bd8 Code4 LAB_1018_1bd8 +1018:1bc9 FUN_1018_1bb0 DATA 1 true Stack[0x4] - +1018:1be4 FUN_1018_1bdf DATA 1 true Stack[0x8] - +1018:1be7 FUN_1018_1bdf DATA 1 true Stack[0xa] - +1018:1bea FUN_1018_1bdf DATA 1 true Stack[0x4] - +1018:1c04 FUN_1018_1bfc DATA 0 true Stack[-0x17] - +1018:1c08 FUN_1018_1bfc DATA 0 true Stack[-0x16] - +1018:1c15 FUN_1018_1bfc UNCONDITIONAL_CALL 0 true 1228:0234 EXTERNAL PEEKMESSAGE PEEKMESSAGE +1018:1c1c FUN_1018_1bfc CONDITIONAL_JUMP 0 true 1018:1c54 Code4 LAB_1018_1c54 +1018:1c1e FUN_1018_1bfc DATA 0 true Stack[-0x14] - +1018:1c22 FUN_1018_1bfc CONDITIONAL_JUMP 0 true 1018:1c2a Code4 LAB_1018_1c2a +1018:1c24 FUN_1018_1bfc DATA 0 true Stack[-0x17] - +1018:1c28 FUN_1018_1bfc UNCONDITIONAL_JUMP 0 true 1018:1c52 Code4 LAB_1018_1c52 +1018:1c2a FUN_1018_1bfc DATA 0 true Stack[-0x16] - +1018:1c2f FUN_1018_1bfc DATA 1 true Stack[0x4] - +1018:1c3c FUN_1018_1bfc CONDITIONAL_JUMP 0 true 1018:1c52 Code4 LAB_1018_1c52 +1018:1c3e FUN_1018_1bfc DATA 0 true Stack[-0x16] - +1018:1c43 FUN_1018_1bfc UNCONDITIONAL_CALL 0 true 1228:0240 EXTERNAL TRANSLATEMESSAGE TRANSLATEMESSAGE +1018:1c48 FUN_1018_1bfc DATA 0 true Stack[-0x16] - +1018:1c4d FUN_1018_1bfc UNCONDITIONAL_CALL 0 true 1228:0244 EXTERNAL DISPATCHMESSAGE DISPATCHMESSAGE +1018:1c52 FUN_1018_1bfc UNCONDITIONAL_JUMP 0 true 1018:1c68 Code4 LAB_1018_1c68 +1018:1c54 FUN_1018_1bfc DATA 1 true Stack[0x4] - +1018:1c61 FUN_1018_1bfc CONDITIONAL_JUMP 0 true 1018:1c68 Code4 LAB_1018_1c68 +1018:1c63 FUN_1018_1bfc UNCONDITIONAL_CALL 0 true 1228:023c EXTERNAL WAITMESSAGE WAITMESSAGE +1018:1c68 FUN_1018_1bfc DATA 0 true Stack[-0x17] - +1018:1c6c FUN_1018_1bfc CONDITIONAL_JUMP 0 true 1018:1c08 Code4 LAB_1018_1c08 +1018:1c6e FUN_1018_1bfc DATA 1 true Stack[-0x12] - +1018:1c71 FUN_1018_1bfc DATA 1 true Stack[0x4] - +1018:1c87 FUN_1018_1c7f DATA 1 true Stack[0x8] - +1018:1c8c FUN_1018_1c7f DATA 1 true Stack[0x4] - +1018:1c99 FUN_1018_1c7f CONDITIONAL_JUMP 0 true 1018:1cc7 Code4 LAB_1018_1cc7 +1018:1c9b FUN_1018_1c7f DATA 1 true Stack[0x8] - +1018:1ca0 FUN_1018_1c7f DATA 1 true Stack[0x4] - +1018:1cad FUN_1018_1c7f CONDITIONAL_JUMP 0 true 1018:1cc7 Code4 LAB_1018_1cc7 +1018:1caf FUN_1018_1c7f DATA 1 true Stack[0x8] - +1018:1cb4 FUN_1018_1c7f DATA 1 true Stack[0x4] - +1018:1cc1 FUN_1018_1c7f CONDITIONAL_JUMP 0 true 1018:1cc7 Code4 LAB_1018_1cc7 +1018:1cc5 FUN_1018_1c7f UNCONDITIONAL_JUMP 0 true 1018:1cc9 Code4 LAB_1018_1cc9 +1018:1cc9 FUN_1018_1c7f DATA 0 true Stack[-0x5] - +1018:1ccc FUN_1018_1c7f DATA 1 true Stack[-0x5] - +1018:1cde FUN_1018_1cd6 DATA 0 true Stack[-0x5] - +1018:1ce2 FUN_1018_1cd6 DATA 1 true Stack[0x4] - +1018:1ced FUN_1018_1cd6 CONDITIONAL_JUMP 0 true 1018:1d18 Code4 LAB_1018_1d18 +1018:1cf8 FUN_1018_1cd6 CONDITIONAL_JUMP 0 true 1018:1d18 Code4 LAB_1018_1d18 +1018:1cfa FUN_1018_1cd6 DATA 1 true Stack[0x4] - +1018:1d05 FUN_1018_1cd6 DATA 1 true Stack[0x8] - +1018:1d0a FUN_1018_1cd6 UNCONDITIONAL_CALL 0 true 1228:0210 EXTERNAL ISDIALOGMESSAGE ISDIALOGMESSAGE +1018:1d15 FUN_1018_1cd6 DATA 0 true Stack[-0x5] - +1018:1d18 FUN_1018_1cd6 DATA 1 true Stack[-0x5] - +1018:1d2a FUN_1018_1d22 DATA 1 true Stack[0x4] - +1018:1d32 FUN_1018_1d22 CONDITIONAL_JUMP 0 true 1018:1d51 Code4 LAB_1018_1d51 +1018:1d3c FUN_1018_1d22 DATA 1 true Stack[0x4] - +1018:1d43 FUN_1018_1d22 DATA 1 true Stack[0x8] - +1018:1d48 FUN_1018_1d22 UNCONDITIONAL_CALL 0 true 1228:0284 EXTERNAL TRANSLATEACCELERATOR TRANSLATEACCELERATOR +1018:1d4f FUN_1018_1d22 CONDITIONAL_JUMP 0 true 1018:1d55 Code4 LAB_1018_1d55 +1018:1d53 FUN_1018_1d22 UNCONDITIONAL_JUMP 0 true 1018:1d57 Code4 LAB_1018_1d57 +1018:1d57 FUN_1018_1d22 DATA 0 true Stack[-0x5] - +1018:1d5a FUN_1018_1d22 DATA 1 true Stack[-0x5] - +1018:1d6c FUN_1018_1d64 DATA 1 true Stack[0x4] - +1018:1d7b FUN_1018_1d64 DATA 0 true Stack[-0xa] - +1018:1d7e FUN_1018_1d64 DATA 0 true Stack[-0x8] - +1018:1d81 FUN_1018_1d64 DATA 1 true Stack[-0xa] - +1018:1d84 FUN_1018_1d64 DATA 1 true Stack[-0x8] - +1018:1d87 FUN_1018_1d64 CONDITIONAL_JUMP 0 true 1018:1d9e Code4 LAB_1018_1d9e +1018:1d89 FUN_1018_1d64 DATA 1 true Stack[-0xa] - +1018:1d90 FUN_1018_1d64 DATA 1 true Stack[0x8] - +1018:1d95 FUN_1018_1d64 UNCONDITIONAL_CALL 0 true 1228:02b4 EXTERNAL TRANSLATEMDISYSACCEL TRANSLATEMDISYSACCEL +1018:1d9c FUN_1018_1d64 CONDITIONAL_JUMP 0 true 1018:1da2 Code4 LAB_1018_1da2 +1018:1da0 FUN_1018_1d64 UNCONDITIONAL_JUMP 0 true 1018:1da4 Code4 LAB_1018_1da4 +1018:1da4 FUN_1018_1d64 DATA 0 true Stack[-0x5] - +1018:1da7 FUN_1018_1d64 DATA 1 true Stack[-0x5] - +1018:1dbb FUN_1018_1db1 DATA 0 true Stack[-0x8] - +1018:1dbe FUN_1018_1db1 DATA 0 true Stack[-0x6] - +1018:1dc1 FUN_1018_1db1 DATA 1 true Stack[0x8] - +1018:1dc4 FUN_1018_1db1 DATA 1 true Stack[0xa] - +1018:1dc7 FUN_1018_1db1 CONDITIONAL_JUMP 0 true 1018:1e2c Code4 LAB_1018_1e2c +1018:1dc9 FUN_1018_1db1 UNCONDITIONAL_CALL 0 true 1008:2de0 Code2 FUN_1008_2de0 FUN_1008_2de0 +1018:1dd0 FUN_1018_1db1 CONDITIONAL_JUMP 0 true 1018:1df4 Code4 LAB_1018_1df4 +1018:1dd4 FUN_1018_1db1 DATA 1 true Stack[0x4] - +1018:1de2 FUN_1018_1db1 DATA 1 true Stack[0x8] - +1018:1ded FUN_1018_1db1 UNCONDITIONAL_CALL 0 true 1008:2dff Code2 FUN_1008_2dff FUN_1008_2dff +1018:1df2 FUN_1018_1db1 UNCONDITIONAL_JUMP 0 true 1018:1e2c Code4 LAB_1018_1e2c +1018:1df4 FUN_1018_1db1 DATA 1 true Stack[0x8] - +1018:1dfc FUN_1018_1db1 CONDITIONAL_JUMP 0 true 1018:1e20 Code4 LAB_1018_1e20 +1018:1dfe FUN_1018_1db1 DATA 1 true Stack[0x8] - +1018:1e05 FUN_1018_1db1 DATA 1 true Stack[0x4] - +1018:1e13 FUN_1018_1db1 DATA 1 true Stack[0x8] - +1018:1e1e FUN_1018_1db1 UNCONDITIONAL_JUMP 0 true 1018:1e2c Code4 LAB_1018_1e2c +1018:1e20 FUN_1018_1db1 DATA 1 true Stack[0x8] - +1018:1e23 FUN_1018_1db1 DATA 1 true Stack[0xa] - +1018:1e26 FUN_1018_1db1 DATA 0 true Stack[-0x8] - +1018:1e29 FUN_1018_1db1 DATA 0 true Stack[-0x6] - +1018:1e2c FUN_1018_1db1 DATA 1 true Stack[-0x8] - +1018:1e2f FUN_1018_1db1 DATA 1 true Stack[-0x6] - +1018:1e43 FUN_1018_1e39 DATA 0 true Stack[-0x8] - +1018:1e46 FUN_1018_1e39 DATA 0 true Stack[-0x6] - +1018:1e49 FUN_1018_1e39 DATA 1 true Stack[0x8] - +1018:1e4c FUN_1018_1e39 DATA 1 true Stack[0xa] - +1018:1e4f FUN_1018_1e39 CONDITIONAL_JUMP 0 true 1018:1ea3 Code4 LAB_1018_1ea3 +1018:1e51 FUN_1018_1e39 DATA 0 true Stack[0xa] - +1018:1e54 FUN_1018_1e39 DATA 0 true Stack[0x8] - +1018:1e57 FUN_1018_1e39 DATA 1 true Stack[0x4] - +1018:1e64 FUN_1018_1e39 CONDITIONAL_JUMP 0 true 1018:1ea3 Code4 LAB_1018_1ea3 +1018:1e66 FUN_1018_1e39 DATA 1 true Stack[0x8] - +1018:1e73 FUN_1018_1e39 CONDITIONAL_JUMP 0 true 1018:1e97 Code4 LAB_1018_1e97 +1018:1e75 FUN_1018_1e39 DATA 1 true Stack[0x8] - +1018:1e7c FUN_1018_1e39 DATA 1 true Stack[0x4] - +1018:1e8a FUN_1018_1e39 DATA 1 true Stack[0x8] - +1018:1e95 FUN_1018_1e39 UNCONDITIONAL_JUMP 0 true 1018:1ea3 Code4 LAB_1018_1ea3 +1018:1e97 FUN_1018_1e39 DATA 1 true Stack[0x8] - +1018:1e9a FUN_1018_1e39 DATA 1 true Stack[0xa] - +1018:1e9d FUN_1018_1e39 DATA 0 true Stack[-0x8] - +1018:1ea0 FUN_1018_1e39 DATA 0 true Stack[-0x6] - +1018:1ea3 FUN_1018_1e39 DATA 1 true Stack[-0x8] - +1018:1ea6 FUN_1018_1e39 DATA 1 true Stack[-0x6] - +1018:1eb8 FUN_1018_1eb0 DATA 0 true Stack[-0x6] - +1018:1ebd FUN_1018_1eb0 DATA 0 true Stack[0xa] - +1018:1ec0 FUN_1018_1eb0 DATA 0 true Stack[0x8] - +1018:1ec3 FUN_1018_1eb0 DATA 1 true Stack[0x4] - +1018:1ed0 FUN_1018_1eb0 CONDITIONAL_JUMP 0 true 1018:1f0a Code4 LAB_1018_1f0a +1018:1ed2 FUN_1018_1eb0 DATA 1 true Stack[0x8] - +1018:1edd FUN_1018_1eb0 DATA 0 true Stack[-0x8] - +1018:1ee0 FUN_1018_1eb0 DATA 0 true Stack[-0x8] - +1018:1ee4 FUN_1018_1eb0 CONDITIONAL_JUMP 0 true 1018:1ef6 Code4 LAB_1018_1ef6 +1018:1ee6 FUN_1018_1eb0 DATA 0 true Stack[-0x8] - +1018:1ee9 FUN_1018_1eb0 DATA 1 true Stack[0x4] - +1018:1ef4 FUN_1018_1eb0 UNCONDITIONAL_JUMP 0 true 1018:1efc Code4 LAB_1018_1efc +1018:1ef6 FUN_1018_1eb0 DATA 1 true Stack[-0x8] - +1018:1ef9 FUN_1018_1eb0 DATA 0 true Stack[-0x6] - +1018:1eff FUN_1018_1eb0 DATA 1 true Stack[0x8] - +1018:1f0a FUN_1018_1eb0 DATA 1 true Stack[-0x6] - +1018:1f1c FUN_1018_1f14 DATA 0 true Stack[-0x24] - +1018:1f26 FUN_1018_1f14 DATA 0 true Stack[0x8] - +1018:1f2b FUN_1018_1f14 UNCONDITIONAL_CALL 0 true 1228:02ac EXTERNAL WVSPRINTF WVSPRINTF +1018:1f32 FUN_1018_1f14 DATA 0 true Stack[-0x24] - +1018:1f3e FUN_1018_1f14 READ 0 true 1028:0668 Data6 DAT_1028_0668 +1018:1f3e FUN_1018_1f14 READ 0 false 1028:0666 Data6 DAT_1028_0666 +1018:1f3e FUN_1018_1f14 COMPUTED_CALL -1 true 1228:018c EXTERNAL MESSAGEBOX MESSAGEBOX +1018:1f45 FUN_1018_1f14 CONDITIONAL_JUMP 0 true 1018:1f4f Code4 LAB_1018_1f4f +1018:1f47 FUN_1018_1f14 DATA 1 true Stack[0x8] - +1018:1f4a FUN_1018_1f14 UNCONDITIONAL_CALL 0 true 1020:0061 Code5 FUN_1020_0061 FUN_1020_0061 +1018:1f5e FUN_1018_1f56 DATA 1 true Stack[0x4] - +1018:1f6d FUN_1018_1f56 DATA 0 true Stack[-0x5] - +1018:1f70 FUN_1018_1f56 DATA 1 true Stack[-0x5] - +1020:0009 FUN_1020_0002 CONDITIONAL_JUMP 0 true 1020:0058 Code5 LAB_1020_0058 +1020:000b FUN_1020_0002 WRITE 0 true 1028:071c Data6 DAT_1028_071c +1020:000f FUN_1020_0002 WRITE 0 true 1028:06fc Data6 DAT_1028_06fc +1020:0013 FUN_1020_0002 WRITE 0 true 1028:06fe Data6 DAT_1028_06fe +1020:0017 FUN_1020_0002 WRITE 0 true 1028:0700 Data6 DAT_1028_0700 +1020:001b FUN_1020_0002 WRITE 0 true 1028:0702 Data6 DAT_1028_0702 +1020:001f FUN_1020_0002 WRITE 0 true 1028:0704 Data6 DAT_1028_0702+2 +1020:0026 FUN_1020_0002 UNCONDITIONAL_CALL 0 true 1228:001c EXTERNAL WAITEVENT WAITEVENT +1020:002b FUN_1020_0002 READ 0 true 1028:06fe Data6 DAT_1028_06fe +1020:002f FUN_1020_0002 UNCONDITIONAL_CALL 0 true 1228:0190 EXTERNAL INITAPP INITAPP +1020:0036 FUN_1020_0002 CONDITIONAL_JUMP 0 true 1020:0058 Code5 LAB_1020_0058 +1020:0038 FUN_1020_0002 UNCONDITIONAL_CALL 0 true 1228:0078 EXTERNAL GETWINFLAGS GETWINFLAGS +1020:0041 FUN_1020_0002 CONDITIONAL_JUMP 0 true 1020:0049 Code5 LAB_1020_0049 +1020:0046 FUN_1020_0002 CONDITIONAL_JUMP 0 true 1020:0049 Code5 LAB_1020_0049 +1020:0049 FUN_1020_0002 WRITE 0 true 1028:0726 Data6 DAT_1028_0726 +1020:004d FUN_1020_0002 WRITE 0 true 1028:0724 Data6 DAT_1028_0724 +1020:005f FUN_1020_005d UNCONDITIONAL_JUMP 0 true 1020:0065 Code5 LAB_1020_0065 +1020:0065 FUN_1020_0061 WRITE 0 true 1028:0716 Data6 DAT_1028_0716 +1020:006c FUN_1020_0061 CONDITIONAL_JUMP 0 true 1020:007a Code5 LAB_1020_007a +1020:0071 FUN_1020_0061 CONDITIONAL_JUMP 0 true 1020:007a Code5 LAB_1020_007a +1020:007a FUN_1020_0061 WRITE 0 true 1028:0718 Data6 DAT_1028_0718 +1020:007e FUN_1020_0061 WRITE 0 true 1028:071a Data6 DAT_1028_071a +1020:0082 FUN_1020_0061 READ 0 true 1028:071c Data6 DAT_1028_071c +1020:0087 FUN_1020_0061 CONDITIONAL_JUMP 0 true 1020:008c Code5 LAB_1020_008c +1020:0089 FUN_1020_0061 UNCONDITIONAL_CALL 0 true 1020:00d2 Code5 FUN_1020_00d2 FUN_1020_00d2 +1020:008c FUN_1020_0061 READ 1 true 1028:0718 Data6 DAT_1028_0718 +1020:008f FUN_1020_0061 READ 1 true 1028:071a Data6 DAT_1028_071a +1020:0093 FUN_1020_0061 CONDITIONAL_JUMP 0 true 1020:00cb Code5 LAB_1020_00cb +1020:0098 FUN_1020_0061 READ 1 true 1028:0716 Data6 DAT_1028_0716 +1020:00a0 FUN_1020_0061 UNCONDITIONAL_CALL 0 true 1020:00f0 Code5 FUN_1020_00f0 FUN_1020_00f0 +1020:00a6 FUN_1020_0061 READ 1 true 1028:071a Data6 DAT_1028_071a +1020:00ac FUN_1020_0061 UNCONDITIONAL_CALL 0 true 1020:00f0 Code5 FUN_1020_00f0 FUN_1020_00f0 +1020:00af FUN_1020_0061 READ 1 true 1028:0718 Data6 DAT_1028_0718 +1020:00b5 FUN_1020_0061 UNCONDITIONAL_CALL 0 true 1020:00f0 Code5 FUN_1020_00f0 FUN_1020_00f0 +1020:00c6 FUN_1020_0061 UNCONDITIONAL_CALL 0 true 1228:018c EXTERNAL MESSAGEBOX MESSAGEBOX +1020:00cb FUN_1020_0061 READ 1 true 1028:0716 Data6 DAT_1028_0716 +1020:00d2 FUN_1020_00d2 READ 1 true 1028:0712 Data6 DAT_1028_0712 +1020:00da FUN_1020_00d2 CONDITIONAL_JUMP 0 true 1020:00ef Code5 LAB_1020_00ef +1020:00de FUN_1020_00d2 WRITE 0 true 1028:0712 Data6 DAT_1028_0712 +1020:00e1 FUN_1020_00d2 WRITE 0 true 1028:0714 Data6 DAT_1028_0714 +1020:00e4 FUN_1020_00d2 WRITE 0 true 1028:071e Data6 DAT_1028_071e +1020:00fa FUN_1020_00f0 CONDITIONAL_JUMP 0 true 1020:00ff Code5 LAB_1020_00ff +1020:0104 FUN_1020_00f0 CONDITIONAL_JUMP 0 true 1020:00f0 Code5 FUN_1020_00f0 FUN_1020_00f0 +1020:0132 FUN_1020_012d DATA 1 true Stack[0x4] - +1020:0135 FUN_1020_012d UNCONDITIONAL_CALL 0 true 1020:01ca Code5 FUN_1020_01ca FUN_1020_01ca +1020:013c FUN_1020_012d CONDITIONAL_JUMP 0 true 1020:0141 Code5 LAB_1020_0141 +1020:0144 FUN_1020_012d UNCONDITIONAL_CALL 0 true 1020:005d Code5 FUN_1020_005d FUN_1020_005d +1020:014c FUN_1020_0147 DATA 1 true Stack[0x4] - +1020:014f FUN_1020_0147 DATA 1 true Stack[0x6] - +1020:0152 FUN_1020_0147 DATA 1 true Stack[0x8] - +1020:0155 FUN_1020_0147 UNCONDITIONAL_CALL 0 true 1020:02d7 Code5 FUN_1020_02d7 FUN_1020_02d7 +1020:015c FUN_1020_0147 CONDITIONAL_JUMP 0 true 1020:0161 Code5 LAB_1020_0161 +1020:0164 FUN_1020_0147 UNCONDITIONAL_CALL 0 true 1020:005d Code5 FUN_1020_005d FUN_1020_005d +1020:0170 FUN_1020_0167 UNCONDITIONAL_CALL 0 true 1228:0084 EXTERNAL GETFREESPACE GETFREESPACE +1020:0175 FUN_1020_0167 READ 1 true 1028:0706 Data6 DAT_1028_0706 +1020:0179 FUN_1020_0167 CONDITIONAL_JUMP 0 true 1020:0190 Code5 LAB_1020_0190 +1020:018a FUN_1020_0167 READ 1 true 1028:0706 Data6 DAT_1028_0706 +1020:018e FUN_1020_0167 CONDITIONAL_JUMP 0 true 1020:017b Code5 LAB_1020_017b +1020:019e runtime_1020_0195 UNCONDITIONAL_CALL 0 true 1228:0018 EXTERNAL GLOBALCOMPACT GLOBALCOMPACT +1020:01a5 runtime_1020_0195 CONDITIONAL_JUMP 0 true 1020:01c5 Code5 LAB_1020_01c5 +1020:01a7 runtime_1020_0195 READ 1 true 1028:0706 Data6 DAT_1028_0706 +1020:01ab runtime_1020_0195 CONDITIONAL_JUMP 0 true 1020:01c5 Code5 LAB_1020_01c5 +1020:01b4 runtime_1020_0195 CONDITIONAL_JUMP 0 true 1020:01ba Code5 LAB_1020_01ba +1020:01bf runtime_1020_0195 READ 1 true 1028:0706 Data6 DAT_1028_0706 +1020:01c3 runtime_1020_0195 CONDITIONAL_JUMP 0 true 1020:01ad Code5 LAB_1020_01ad +1020:01cc FUN_1020_01ca CONDITIONAL_JUMP 0 true 1020:021e Code5 LAB_1020_021e +1020:01ce FUN_1020_01ca WRITE 0 true 1028:4d38 Data6 DAT_1028_4d38 +1020:01d1 FUN_1020_01ca READ 1 true 1028:0708 Data6 DAT_1028_0708 +1020:01d5 FUN_1020_01ca CONDITIONAL_JUMP 0 true 1020:01f6 Code5 LAB_1020_01f6 +1020:01d7 FUN_1020_01ca UNCONDITIONAL_CALL 0 true 1020:0222 Code5 FUN_1020_0222 FUN_1020_0222 +1020:01da FUN_1020_01ca CONDITIONAL_JUMP 0 true 1020:0221 Code5 LAB_1020_0221 +1020:01dc FUN_1020_01ca READ 0 true 1028:0708 Data6 DAT_1028_0708 +1020:01e1 FUN_1020_01ca CONDITIONAL_JUMP 0 true 1020:0203 Code5 LAB_1020_0203 +1020:01e3 FUN_1020_01ca READ 1 true 1028:4d38 Data6 DAT_1028_4d38 +1020:01e6 FUN_1020_01ca READ 1 true 1028:070a Data6 DAT_1028_070a +1020:01ef FUN_1020_01ca CONDITIONAL_JUMP 0 true 1020:0203 Code5 LAB_1020_0203 +1020:01f1 FUN_1020_01ca UNCONDITIONAL_CALL 0 true 1020:023c Code5 FUN_1020_023c FUN_1020_023c +1020:01f4 FUN_1020_01ca UNCONDITIONAL_JUMP 0 true 1020:0201 Code5 LAB_1020_0201 +1020:01f6 FUN_1020_01ca UNCONDITIONAL_CALL 0 true 1020:023c Code5 FUN_1020_023c FUN_1020_023c +1020:01f9 FUN_1020_01ca CONDITIONAL_JUMP 0 true 1020:0221 Code5 LAB_1020_0221 +1020:01fb FUN_1020_01ca READ 1 true 1028:4d38 Data6 DAT_1028_4d38 +1020:01fe FUN_1020_01ca UNCONDITIONAL_CALL 0 true 1020:0222 Code5 FUN_1020_0222 FUN_1020_0222 +1020:0201 FUN_1020_01ca CONDITIONAL_JUMP 0 true 1020:0221 Code5 LAB_1020_0221 +1020:0203 FUN_1020_01ca READ 1 true 1028:070e Data6 DAT_1028_070e +1020:0206 FUN_1020_01ca READ 1 true 1028:0710 Data6 DAT_1028_0710 +1020:020a FUN_1020_01ca CONDITIONAL_JUMP 0 true 1020:0214 Code5 LAB_1020_0214 +1020:020c FUN_1020_01ca READ 0 true 1028:4d38 Data6 DAT_1028_4d38 +1020:0210 FUN_1020_01ca READ 0 true 1028:0710 Data6 DAT_1028_0710 +1020:0210 FUN_1020_01ca READ 0 false 1028:070e Data6 DAT_1028_070e +1020:0217 FUN_1020_01ca READ 1 true 1028:4d38 Data6 DAT_1028_4d38 +1020:021a FUN_1020_01ca CONDITIONAL_JUMP 0 true 1020:01d1 Code5 LAB_1020_01d1 +1020:021c FUN_1020_01ca CONDITIONAL_JUMP 0 true 1020:0221 Code5 LAB_1020_0221 +1020:0222 FUN_1020_0222 READ 0 true 1028:070c Data6 DAT_1028_070c +1020:022a FUN_1020_0222 UNCONDITIONAL_CALL 0 true 1228:0004 EXTERNAL GLOBALALLOC GLOBALALLOC +1020:0232 FUN_1020_0222 CONDITIONAL_JUMP 0 true 1020:023b Code5 LAB_1020_023b +1020:0235 FUN_1020_0222 UNCONDITIONAL_CALL 0 true 1228:000c EXTERNAL GLOBALLOCK GLOBALLOCK +1020:0241 FUN_1020_023c READ 1 true 1028:0706 Data6 DAT_1028_0706 +1020:0245 FUN_1020_023c CONDITIONAL_JUMP 0 true 1020:0259 Code5 LAB_1020_0259 +1020:0249 FUN_1020_023c UNCONDITIONAL_CALL 0 true 1020:02a6 Code5 FUN_1020_02a6 FUN_1020_02a6 +1020:024c FUN_1020_023c CONDITIONAL_JUMP 0 true 1020:0261 Code5 LAB_1020_0261 +1020:0253 FUN_1020_023c READ 1 true 1028:0706 Data6 DAT_1028_0706 +1020:0257 FUN_1020_023c CONDITIONAL_JUMP 0 true 1020:0247 Code5 LAB_1020_0247 +1020:0259 FUN_1020_023c UNCONDITIONAL_CALL 0 true 1020:026a Code5 FUN_1020_026a FUN_1020_026a +1020:025c FUN_1020_023c CONDITIONAL_JUMP 0 true 1020:0269 Code5 LAB_1020_0269 +1020:025e FUN_1020_023c UNCONDITIONAL_CALL 0 true 1020:02a6 Code5 FUN_1020_02a6 FUN_1020_02a6 +1020:0261 FUN_1020_023c WRITE 0 true 1028:0706 Data6 DAT_1028_0706 +1020:026b FUN_1020_026a READ 1 true 1028:070a Data6 DAT_1028_070a +1020:026e FUN_1020_026a UNCONDITIONAL_CALL 0 true 1020:0222 Code5 FUN_1020_0222 FUN_1020_0222 +1020:0271 FUN_1020_026a CONDITIONAL_JUMP 0 true 1020:02a4 Code5 LAB_1020_02a4 +1020:0286 FUN_1020_026a READ 1 true 1028:070a Data6 DAT_1028_070a +1020:0290 FUN_1020_026a READ 1 true 1028:0706 Data6 DAT_1028_0706 +1020:0294 FUN_1020_026a CONDITIONAL_JUMP 0 true 1020:029e Code5 LAB_1020_029e +1020:02b1 FUN_1020_02a6 CONDITIONAL_JUMP 0 true 1020:02d6 Code5 LAB_1020_02d6 +1020:02b9 FUN_1020_02a6 CONDITIONAL_JUMP 0 true 1020:02a9 Code5 LAB_1020_02a9 +1020:02be FUN_1020_02a6 CONDITIONAL_JUMP 0 true 1020:02cd Code5 LAB_1020_02cd +1020:02d9 FUN_1020_02d7 CONDITIONAL_JUMP 0 true 1020:0340 Code5 LAB_1020_0340 +1020:02db FUN_1020_02d7 CONDITIONAL_JUMP 0 true 1020:0344 Code5 LAB_1020_0344 +1020:02ed FUN_1020_02d7 CONDITIONAL_JUMP 0 true 1020:0342 Code5 LAB_1020_0342 +1020:02f2 FUN_1020_02d7 CONDITIONAL_JUMP 0 true 1020:0342 Code5 LAB_1020_0342 +1020:02fe FUN_1020_02d7 CONDITIONAL_JUMP 0 true 1020:0306 Code5 LAB_1020_0306 +1020:0302 FUN_1020_02d7 CONDITIONAL_JUMP 0 true 1020:02f7 Code5 LAB_1020_02f7 +1020:0304 FUN_1020_02d7 CONDITIONAL_JUMP 0 true 1020:0342 Code5 LAB_1020_0342 +1020:0319 FUN_1020_02d7 READ 1 true 1028:070a Data6 DAT_1028_070a +1020:031d FUN_1020_02d7 CONDITIONAL_JUMP 0 true 1020:0362 Code5 LAB_1020_0362 +1020:031f FUN_1020_02d7 UNCONDITIONAL_CALL 0 true 1020:0327 Code5 FUN_1020_0327 FUN_1020_0327 +1020:0330 FUN_1020_0327 CONDITIONAL_JUMP 0 true 1020:0340 Code5 LAB_1020_0340 +1020:0348 FUN_1020_02d7 CONDITIONAL_JUMP 0 true 1020:0342 Code5 LAB_1020_0342 +1020:034b FUN_1020_02d7 UNCONDITIONAL_CALL 0 true 1228:0014 EXTERNAL GLOBALHANDLE GLOBALHANDLE +1020:0352 FUN_1020_02d7 CONDITIONAL_JUMP 0 true 1020:0342 Code5 LAB_1020_0342 +1020:0356 FUN_1020_02d7 UNCONDITIONAL_CALL 0 true 1228:0010 EXTERNAL GLOBALUNLOCK GLOBALUNLOCK +1020:035b FUN_1020_02d7 UNCONDITIONAL_CALL 0 true 1228:0008 EXTERNAL GLOBALFREE GLOBALFREE +1020:036d FUN_1020_02d7 CONDITIONAL_JUMP 0 true 1020:0383 Code5 LAB_1020_0383 +1020:036f FUN_1020_02d7 READ 1 true 1028:0706 Data6 DAT_1028_0706 +1020:037a FUN_1020_02d7 CONDITIONAL_JUMP 0 true 1020:0372 Code5 LAB_1020_0372 +1020:0383 FUN_1020_02d7 WRITE 0 true 1028:0706 Data6 DAT_1028_0706 +1020:0386 FUN_1020_02d7 UNCONDITIONAL_JUMP 0 true 1020:0344 Code5 LAB_1020_0344 +1020:038a FUN_1020_0388 READ_WRITE 0 true 1028:071e Data6 DAT_1028_071e +1020:038f FUN_1020_038f READ 0 true 1028:071e Data6 DAT_1028_071e +1020:0394 FUN_1020_038f CONDITIONAL_JUMP 0 true 1020:0397 Code5 LAB_1020_0397 +1020:0397 FUN_1020_038f READ 1 true 1028:071e Data6 DAT_1028_071e +1020:039a FUN_1020_038f UNCONDITIONAL_CALL 0 true 1020:005d Code5 FUN_1020_005d FUN_1020_005d +1020:039f FUN_1020_039d DATA 1 true Stack[0x2] - +1020:03a7 FUN_1020_039d CONDITIONAL_JUMP 0 true 1020:03b0 Code5 LAB_1020_03b0 +1020:03a9 FUN_1020_039d CONDITIONAL_JUMP 0 true 1020:03bf Code5 LAB_1020_03bf +1020:03ae FUN_1020_039d CONDITIONAL_JUMP 0 true 1020:03bf Code5 LAB_1020_03bf +1020:03b4 FUN_1020_039d CONDITIONAL_JUMP 0 true 1020:03be Code5 LAB_1020_03be +1020:03b6 FUN_1020_039d CONDITIONAL_JUMP 0 true 1020:03bf Code5 LAB_1020_03bf +1020:03bc FUN_1020_039d CONDITIONAL_JUMP 0 true 1020:03bf Code5 LAB_1020_03bf +1020:03c2 FUN_1020_039d UNCONDITIONAL_CALL 0 true 1020:005d Code5 FUN_1020_005d FUN_1020_005d +1020:03c8 runtime_1020_03c5 UNCONDITIONAL_CALL 0 true 1020:005d Code5 FUN_1020_005d FUN_1020_005d +1020:03ce FUN_1020_03cb CONDITIONAL_JUMP 0 true 1020:03e9 Code5 LAB_1020_03e9 +1020:03d2 FUN_1020_03cb CONDITIONAL_JUMP 0 true 1020:03e9 Code5 LAB_1020_03e9 +1020:03db FUN_1020_03cb CONDITIONAL_JUMP 0 true 1020:03e9 Code5 LAB_1020_03e9 +1020:03e2 FUN_1020_03cb CONDITIONAL_JUMP 0 true 1020:03e8 Code5 LAB_1020_03e8 +1020:03ec FUN_1020_03cb UNCONDITIONAL_CALL 0 true 1020:005d Code5 FUN_1020_005d FUN_1020_005d +1020:03f5 FUN_1020_03ef CONDITIONAL_JUMP 0 true 1020:0408 Code5 LAB_1020_0408 +1020:03fe FUN_1020_03ef CONDITIONAL_JUMP 0 true 1020:0409 Code5 LAB_1020_0409 +1020:0412 FUN_1020_03ef UNCONDITIONAL_CALL 0 true 1020:01ca Code5 FUN_1020_01ca FUN_1020_01ca +1020:041b FUN_1020_03ef CONDITIONAL_JUMP 0 true 1020:042f Code5 LAB_1020_042f +1020:0421 FUN_1020_03ef CONDITIONAL_JUMP 0 true 1020:0408 Code5 LAB_1020_0408 +1020:042d FUN_1020_03ef UNCONDITIONAL_JUMP 0 true 1020:0405 Code5 LAB_1020_0405 +1020:0436 FUN_1020_03ef UNCONDITIONAL_CALL 0 true 1020:005d Code5 FUN_1020_005d FUN_1020_005d +1020:043d FUN_1020_0439 CONDITIONAL_JUMP 0 true 1020:0459 Code5 LAB_1020_0459 +1020:0450 FUN_1020_0439 UNCONDITIONAL_CALL 0 true 1020:02d7 Code5 FUN_1020_02d7 FUN_1020_02d7 +1020:0457 FUN_1020_0439 CONDITIONAL_JUMP 0 true 1020:0462 Code5 LAB_1020_0462 +1020:0469 FUN_1020_0439 UNCONDITIONAL_CALL 0 true 1020:005d Code5 FUN_1020_005d FUN_1020_005d +1020:046f runtime_1020_046c DATA 1 true Stack[0x6] - +1020:0472 runtime_1020_046c DATA 1 true Stack[0x4] - +1020:0480 runtime_1020_046c DATA 1 true Stack[0xa] - +1020:0491 runtime_1020_048f CONDITIONAL_JUMP 0 true 1020:0499 Code5 LAB_1020_0499 +1020:0496 runtime_1020_048f CONDITIONAL_JUMP 0 true 1020:0499 Code5 LAB_1020_0499 +1020:049c runtime_1020_048f UNCONDITIONAL_CALL 0 true 1020:005d Code5 FUN_1020_005d FUN_1020_005d +1020:04a5 runtime_1020_049f DATA 1 true Stack[0x8] - +1020:04a9 runtime_1020_049f DATA 1 true Stack[0x4] - +1020:04dd runtime_1020_049f CONDITIONAL_JUMP 0 true 1020:04e8 Code5 LAB_1020_04e8 +1020:04e2 runtime_1020_049f CONDITIONAL_JUMP 0 true 1020:04e8 Code5 LAB_1020_04e8 +1020:04e6 runtime_1020_049f CONDITIONAL_JUMP 0 true 1020:04f0 Code5 LAB_1020_04f0 +1020:04eb runtime_1020_049f CONDITIONAL_JUMP 0 true 1020:04f0 Code5 LAB_1020_04f0 +1020:04ee runtime_1020_049f CONDITIONAL_JUMP 0 true 1020:04e8 Code5 LAB_1020_04e8 +1020:04f3 runtime_1020_049f UNCONDITIONAL_CALL 0 true 1228:02bc EXTERNAL Ordinal_5 Ordinal_5 +1020:04fe runtime_1020_04fc DATA 1 true Stack[0xa] - +1020:0502 runtime_1020_04fc DATA 1 true Stack[0x4] - +1020:050a runtime_1020_04fc DATA 1 true Stack[0x6] - +1020:0512 runtime_1020_04fc DATA 1 true Stack[0x8] - +1020:052a FUN_1020_0527 UNCONDITIONAL_CALL 0 true 1020:0534 Code5 FUN_1020_0534 FUN_1020_0534 +1020:052f FUN_1020_052c UNCONDITIONAL_CALL 0 true 1020:0534 Code5 FUN_1020_0534 FUN_1020_0534 +1020:0539 FUN_1020_0534 DATA 1 true Stack[0x4] - +1020:0543 FUN_1020_0534 CONDITIONAL_JUMP 0 true 1020:0557 Code5 LAB_1020_0557 +1020:0548 FUN_1020_0534 CONDITIONAL_JUMP 0 true 1020:0557 Code5 LAB_1020_0557 +1020:054d FUN_1020_0534 CONDITIONAL_JUMP 0 true 1020:055f Code5 LAB_1020_055f +1020:054f FUN_1020_0534 WRITE 0 true 1028:071e Data6 DAT_1028_071e +1020:0555 FUN_1020_0534 UNCONDITIONAL_JUMP 0 true 1020:057b Code5 LAB_1020_057b +1020:055b FUN_1020_0534 UNCONDITIONAL_CALL 0 true 1020:0586 Code5 FUN_1020_0586 FUN_1020_0586 +1020:0570 FUN_1020_0534 UNCONDITIONAL_CALL 0 true 1020:05c7 Code5 FUN_1020_05c7 FUN_1020_05c7 +1020:0573 FUN_1020_0534 CONDITIONAL_JUMP 0 true 1020:057b Code5 LAB_1020_057b +1020:0584 UNCONDITIONAL_JUMP 0 true 1020:0588 Code5 LAB_1020_0588 +1020:058d FUN_1020_0586 DATA 1 true Stack[0x4] - +1020:0596 FUN_1020_0586 CONDITIONAL_JUMP 0 true 1020:05b0 Code5 LAB_1020_05b0 +1020:059e FUN_1020_0586 CONDITIONAL_JUMP 0 true 1020:05a8 Code5 LAB_1020_05a8 +1020:05a0 FUN_1020_0586 WRITE 0 true 1028:071e Data6 DAT_1028_071e +1020:05a6 FUN_1020_0586 UNCONDITIONAL_JUMP 0 true 1020:05c0 Code5 LAB_1020_05c0 +1020:05ac FUN_1020_0586 UNCONDITIONAL_CALL 0 true 1020:05c7 Code5 FUN_1020_05c7 FUN_1020_05c7 +1020:05b2 FUN_1020_0586 CONDITIONAL_JUMP 0 true 1020:05c0 Code5 LAB_1020_05c0 +1020:05b7 FUN_1020_0586 UNCONDITIONAL_CALL 0 true 1020:05c7 Code5 FUN_1020_05c7 FUN_1020_05c7 +1020:05d0 FUN_1020_05c7 CONDITIONAL_JUMP 0 true 1020:05d5 Code5 LAB_1020_05d5 +1020:05d2 FUN_1020_05c7 WRITE 0 true 1028:071e Data6 DAT_1028_071e +1020:05db FUN_1020_05d8 DATA 1 true Stack[0x4] - +1020:05ee FUN_1020_05d8 CONDITIONAL_JUMP 0 true 1020:0600 Code5 LAB_1020_0600 +1020:0606 FUN_1020_05d8 UNCONDITIONAL_JUMP 0 true 1020:05f6 Code5 LAB_1020_05f6 +1020:060b FUN_1020_0608 DATA 1 true Stack[0x4] - +1020:0620 FUN_1020_0608 CONDITIONAL_JUMP 0 true 1020:0629 Code5 LAB_1020_0629 +1020:0624 FUN_1020_0608 CONDITIONAL_JUMP 0 true 1020:0629 Code5 LAB_1020_0629 +1020:0630 FUN_1020_062d DATA 1 true Stack[0x4] - +1020:0645 FUN_1020_062d CONDITIONAL_JUMP 0 true 1020:0649 Code5 LAB_1020_0649 +1020:064f FUN_1020_064d DATA 1 true Stack[0x4] - +1020:0659 FUN_1020_064d CONDITIONAL_JUMP 0 true 1020:0661 Code5 LAB_1020_0661 +1020:065f FUN_1020_064d CONDITIONAL_JUMP 0 true 1020:0663 Code5 LAB_1020_0663 +1020:066c FUN_1020_0667 DATA 1 true Stack[0x8] - +1020:0670 FUN_1020_0667 DATA 1 true Stack[0x4] - +1020:068c FUN_1020_0667 CONDITIONAL_JUMP 0 true 1020:0697 Code5 LAB_1020_0697 +1020:0691 FUN_1020_0667 CONDITIONAL_JUMP 0 true 1020:0697 Code5 LAB_1020_0697 +1020:0695 FUN_1020_0667 CONDITIONAL_JUMP 0 true 1020:069f Code5 LAB_1020_069f +1020:069a FUN_1020_0667 CONDITIONAL_JUMP 0 true 1020:069f Code5 LAB_1020_069f +1020:069d FUN_1020_0667 CONDITIONAL_JUMP 0 true 1020:0697 Code5 LAB_1020_0697 +1020:06a2 FUN_1020_0667 UNCONDITIONAL_CALL 0 true 1228:02bc EXTERNAL Ordinal_5 Ordinal_5 +1020:06ab FUN_1020_06ab READ 1 true 1028:0727 Data6 DAT_1028_0727 +1020:06b2 FUN_1020_06ab UNCONDITIONAL_JUMP 0 true 1020:06ba Code5 LAB_1020_06ba +1020:06bd FUN_1020_06ab DATA 1 true Stack[0x6] - +1020:06c6 FUN_1020_06ab CONDITIONAL_JUMP 0 true 1020:06e2 Code5 LAB_1020_06e2 +1020:06ce FUN_1020_06ab CONDITIONAL_JUMP 0 true 1020:06d8 Code5 LAB_1020_06d8 +1020:06d0 FUN_1020_06ab WRITE 0 true 1028:071e Data6 DAT_1028_071e +1020:06d6 FUN_1020_06ab UNCONDITIONAL_JUMP 0 true 1020:070c Code5 LAB_1020_070c +1020:06dd FUN_1020_06ab UNCONDITIONAL_CALL 0 true 1020:072c Code5 FUN_1020_072c FUN_1020_072c +1020:06e7 FUN_1020_06ab CONDITIONAL_JUMP 0 true 1020:06fb Code5 LAB_1020_06fb +1020:06f4 FUN_1020_06ab CONDITIONAL_JUMP 0 true 1020:06fc Code5 LAB_1020_06fc +1020:06f9 FUN_1020_06ab UNCONDITIONAL_JUMP 0 true 1020:070c Code5 LAB_1020_070c +1020:0705 FUN_1020_06ab DATA 1 true Stack[0x4] - +1020:0712 runtime_1020_0710 DATA 1 true Stack[0x4] - +1020:0716 runtime_1020_0710 UNCONDITIONAL_CALL 0 true 1020:0751 Code5 FUN_1020_0751 FUN_1020_0751 +1020:0719 runtime_1020_0710 CONDITIONAL_JUMP 0 true 1020:0729 Code5 LAB_1020_0729 +1020:0724 runtime_1020_0710 CONDITIONAL_JUMP 0 true 1020:0729 Code5 LAB_1020_0729 +1020:0726 runtime_1020_0710 WRITE 0 true 1028:071e Data6 DAT_1028_071e +1020:072e FUN_1020_072c DATA 1 true Stack[0x4] - +1020:0732 FUN_1020_072c UNCONDITIONAL_CALL 0 true 1020:0751 Code5 FUN_1020_0751 FUN_1020_0751 +1020:0735 FUN_1020_072c CONDITIONAL_JUMP 0 true 1020:074e Code5 LAB_1020_074e +1020:073d FUN_1020_072c CONDITIONAL_JUMP 0 true 1020:0748 Code5 LAB_1020_0748 +1020:0743 FUN_1020_072c CONDITIONAL_JUMP 0 true 1020:0748 Code5 LAB_1020_0748 +1020:0745 FUN_1020_072c WRITE 0 true 1028:071e Data6 DAT_1028_071e +1020:0757 FUN_1020_0751 CONDITIONAL_JUMP 0 true 1020:075f Code5 LAB_1020_075f +1020:0759 FUN_1020_0751 WRITE 0 true 1028:071e Data6 DAT_1028_071e +1020:0765 runtime_1020_0760 UNCONDITIONAL_JUMP 0 true 1020:076c Code5 LAB_1020_076c +1020:076f runtime_1020_0760 DATA 1 true Stack[0x8] - +1020:0772 runtime_1020_0760 UNCONDITIONAL_CALL 0 true 1020:0751 Code5 FUN_1020_0751 FUN_1020_0751 +1020:0775 runtime_1020_0760 CONDITIONAL_JUMP 0 true 1020:0792 Code5 LAB_1020_0792 +1020:0779 runtime_1020_0760 DATA 1 true Stack[0x4] - +1020:0787 runtime_1020_0760 CONDITIONAL_JUMP 0 true 1020:078f Code5 LAB_1020_078f +1020:078b runtime_1020_0760 CONDITIONAL_JUMP 0 true 1020:0792 Code5 LAB_1020_0792 +1020:079b runtime_1020_0796 UNCONDITIONAL_JUMP 0 true 1020:07a2 Code5 LAB_1020_07a2 +1020:07a5 runtime_1020_0796 DATA 1 true Stack[0xe] - +1020:07a8 runtime_1020_0796 UNCONDITIONAL_CALL 0 true 1020:0751 Code5 FUN_1020_0751 FUN_1020_0751 +1020:07ab runtime_1020_0796 CONDITIONAL_JUMP 0 true 1020:07ec Code5 LAB_1020_07ec +1020:07ad runtime_1020_0796 DATA 1 true Stack[0x8] - +1020:07b2 runtime_1020_0796 CONDITIONAL_JUMP 0 true 1020:07d0 Code5 LAB_1020_07d0 +1020:07bc runtime_1020_0796 DATA 1 true Stack[0xa] - +1020:07c8 runtime_1020_0796 CONDITIONAL_JUMP 0 true 1020:07e9 Code5 LAB_1020_07e9 +1020:07d0 runtime_1020_0796 DATA 1 true Stack[0x4] - +1020:07d7 runtime_1020_0796 CONDITIONAL_JUMP 0 true 1020:07de Code5 LAB_1020_07de +1020:07dc runtime_1020_0796 UNCONDITIONAL_JUMP 0 true 1020:07fa Code5 LAB_1020_07fa +1020:07de runtime_1020_0796 DATA 1 true Stack[0x8] - +1020:07e1 runtime_1020_0796 CONDITIONAL_JUMP 0 true 1020:07fa Code5 LAB_1020_07fa +1020:07e7 runtime_1020_0796 UNCONDITIONAL_JUMP 0 true 1020:07fa Code5 LAB_1020_07fa +1020:07ec runtime_1020_0796 DATA 1 true Stack[0x4] - +1020:07f3 runtime_1020_0796 CONDITIONAL_JUMP 0 true 1020:07fa Code5 LAB_1020_07fa +1020:0801 FUN_1020_07fe DATA 1 true Stack[0x8] - +1020:0804 FUN_1020_07fe UNCONDITIONAL_CALL 0 true 1020:0751 Code5 FUN_1020_0751 FUN_1020_0751 +1020:0807 FUN_1020_07fe CONDITIONAL_JUMP 0 true 1020:082a Code5 LAB_1020_082a +1020:0809 FUN_1020_07fe DATA 1 true Stack[0x6] - +1020:0812 FUN_1020_07fe DATA 1 true Stack[0x4] - +1020:0825 FUN_1020_07fe CONDITIONAL_JUMP 0 true 1020:082a Code5 LAB_1020_082a +1020:0827 FUN_1020_07fe WRITE 0 true 1028:071e Data6 DAT_1028_071e +1020:0833 FUN_1020_082e DATA 1 true Stack[0x4] - +1020:0836 FUN_1020_082e CONDITIONAL_JUMP 0 true 1020:0848 Code5 LAB_1020_0848 +1020:0839 FUN_1020_082e UNCONDITIONAL_CALL 0 true 1020:0871 Code5 FUN_1020_0871 FUN_1020_0871 +1020:083e FUN_1020_082e DATA 1 true Stack[0x6] - +1020:0846 FUN_1020_082e UNCONDITIONAL_JUMP 0 true 1020:085f Code5 LAB_1020_085f +1020:0848 FUN_1020_082e READ 0 true 1028:06fe Data6 DAT_1028_06fe +1020:084c FUN_1020_082e DATA 1 true Stack[0x6] - +1020:0856 FUN_1020_082e UNCONDITIONAL_CALL 0 true 1228:0028 EXTERNAL GETMODULEFILENAME GETMODULEFILENAME +1020:085b FUN_1020_082e DATA 1 true Stack[0x6] - +1020:0869 runtime_1020_0866 UNCONDITIONAL_CALL 0 true 1020:0871 Code5 FUN_1020_0871 FUN_1020_0871 +1020:0871 FUN_1020_0871 READ 1 true 1028:0702 Data6 DAT_1028_0702 +1020:0879 FUN_1020_0871 CONDITIONAL_JUMP 0 true 1020:087f Code5 LAB_1020_087f +1020:087d FUN_1020_0871 CONDITIONAL_JUMP 0 true 1020:0876 Code5 LAB_1020_0876 +1020:0885 FUN_1020_0871 CONDITIONAL_JUMP 0 true 1020:0882 Code5 LAB_1020_0882 +1020:088c FUN_1020_0871 CONDITIONAL_JUMP 0 true 1020:0890 Code5 LAB_1020_0890 +1020:088e FUN_1020_0871 CONDITIONAL_JUMP 0 true 1020:0876 Code5 LAB_1020_0876 +1020:0895 FUN_1020_0891 DATA 1 true Stack[0xa] - +1020:0899 FUN_1020_0891 DATA 1 true Stack[0x6] - +1020:089d FUN_1020_0891 DATA 1 true Stack[0x4] - +1020:08a9 FUN_1020_08a9 READ 0 true 1028:0726 Data6 DAT_1028_0726 +1020:08ae FUN_1020_08a9 CONDITIONAL_JUMP 0 true 1020:08cb Code5 LAB_1020_08cb +1020:08e6 FUN_1020_08e6 READ 0 true 1028:0726 Data6 DAT_1028_0726 +1020:08eb FUN_1020_08e6 CONDITIONAL_JUMP 0 true 1020:0914 Code5 LAB_1020_0914 +1020:08ff FUN_1020_08e6 CONDITIONAL_JUMP 0 true 1020:095f Code5 LAB_1020_095f +1020:0919 FUN_1020_08e6 CONDITIONAL_JUMP 0 true 1020:0923 Code5 LAB_1020_0923 +1020:0925 FUN_1020_08e6 CONDITIONAL_JUMP 0 true 1020:0965 Code5 LAB_1020_0965 +1020:0927 FUN_1020_08e6 CONDITIONAL_JUMP 0 true 1020:0934 Code5 LAB_1020_0934 +1020:0932 FUN_1020_08e6 CONDITIONAL_JUMP 0 true 1020:0967 Code5 LAB_1020_0967 +1020:0951 FUN_1020_08e6 CONDITIONAL_JUMP 0 true 1020:0958 Code5 LAB_1020_0958 +1020:0959 FUN_1020_08e6 CONDITIONAL_JUMP 0 true 1020:0944 Code5 LAB_1020_0944 +1020:095c FUN_1020_08e6 UNCONDITIONAL_JUMP 0 true 1020:0974 Code5 LAB_1020_0974 +1020:0962 FUN_1020_08e6 UNCONDITIONAL_CALL 0 true 1020:005d Code5 FUN_1020_005d FUN_1020_005d +1020:0965 FUN_1020_08e6 CONDITIONAL_JUMP 0 true 1020:095e Code5 LAB_1020_095e +1020:0976 FUN_1020_08e6 CONDITIONAL_JUMP 0 true 1020:0980 Code5 LAB_1020_0980 +1020:0981 FUN_1020_08e6 CONDITIONAL_JUMP 0 true 1020:098a Code5 LAB_1020_098a +1020:098c runtime_1020_098c READ 0 true 1028:0726 Data6 DAT_1028_0726 +1020:0991 runtime_1020_098c CONDITIONAL_JUMP 0 true 1020:09a3 Code5 LAB_1020_09a3 +1020:09a6 runtime_1020_098c CONDITIONAL_JUMP 0 true 1020:09ae Code5 LAB_1020_09ae +1020:09ac runtime_1020_098c CONDITIONAL_JUMP 0 true 1020:09a8 Code5 LAB_1020_09a8 +1020:09af runtime_1020_09af READ 0 true 1028:0726 Data6 DAT_1028_0726 +1020:09b4 runtime_1020_09af CONDITIONAL_JUMP 0 true 1020:09c6 Code5 LAB_1020_09c6 +1020:09c9 runtime_1020_09af CONDITIONAL_JUMP 0 true 1020:09d1 Code5 LAB_1020_09d1 +1020:09cf runtime_1020_09af CONDITIONAL_JUMP 0 true 1020:09cb Code5 LAB_1020_09cb +1020:09d7 runtime_1020_09d2 DATA 1 true Stack[0x8] - +1020:09db runtime_1020_09d2 DATA 1 true Stack[0x4] - +1020:09f1 FUN_1020_09ec DATA 1 true Stack[0xa] - +1020:09f5 FUN_1020_09ec DATA 1 true Stack[0x6] - +1020:09f9 FUN_1020_09ec DATA 1 true Stack[0x4] - +1020:0a00 FUN_1020_09ec CONDITIONAL_JUMP 0 true 1020:0a04 Code5 LAB_1020_0a04 +1020:0a15 FUN_1020_0a10 DATA 1 true Stack[0xc] - +1020:0a19 FUN_1020_0a10 DATA 1 true Stack[0x8] - +1020:0a21 FUN_1020_0a10 DATA 1 true Stack[0x6] - +1020:0a27 FUN_1020_0a10 CONDITIONAL_JUMP 0 true 1020:0a2c Code5 LAB_1020_0a2c +1020:0a30 FUN_1020_0a10 CONDITIONAL_JUMP 0 true 1020:0a45 Code5 LAB_1020_0a45 +1020:0a33 FUN_1020_0a10 DATA 1 true Stack[0x4] - +1020:0a39 FUN_1020_0a10 CONDITIONAL_JUMP 0 true 1020:0a3d Code5 LAB_1020_0a3d +1020:0a3f FUN_1020_0a10 CONDITIONAL_JUMP 0 true 1020:0a47 Code5 LAB_1020_0a47 +1020:0a43 FUN_1020_0a10 UNCONDITIONAL_JUMP 0 true 1020:0a47 Code5 LAB_1020_0a47 +1020:0a56 FUN_1020_0a51 DATA 1 true Stack[0x8] - +1020:0a5a FUN_1020_0a51 DATA 1 true Stack[0x4] - +1020:0a67 FUN_1020_0a51 CONDITIONAL_JUMP 0 true 1020:0a71 Code5 LAB_1020_0a71 +1020:0a81 FUN_1020_0a7d DATA 1 true Stack[0x8] - +1020:0a88 FUN_1020_0a7d CONDITIONAL_JUMP 0 true 1020:0ab6 Code5 LAB_1020_0ab6 +1020:0a8e FUN_1020_0a7d DATA 1 true Stack[0x4] - +1020:0a98 FUN_1020_0a7d CONDITIONAL_JUMP 0 true 1020:0ab6 Code5 LAB_1020_0ab6 +1020:0a9f FUN_1020_0a7d CONDITIONAL_JUMP 0 true 1020:0ab6 Code5 LAB_1020_0ab6 +1020:0aaa FUN_1020_0a7d CONDITIONAL_JUMP 0 true 1020:0aba Code5 LAB_1020_0aba +1020:0ab0 FUN_1020_0a7d DATA 1 true Stack[0x8] - +1020:0ab4 FUN_1020_0a7d UNCONDITIONAL_JUMP 0 true 1020:0a9c Code5 LAB_1020_0a9c +1020:0ab8 FUN_1020_0a7d UNCONDITIONAL_JUMP 0 true 1020:0abe Code5 LAB_1020_0abe +1020:0abb FUN_1020_0a7d DATA 1 true Stack[0x4] - +1020:0ac8 FUN_1020_0ac3 DATA 1 true Stack[0x8] - +1020:0acc FUN_1020_0ac3 DATA 1 true Stack[0x4] - +1020:0ad9 FUN_1020_0ac3 CONDITIONAL_JUMP 0 true 1020:0add Code5 LAB_1020_0add +1020:0adf FUN_1020_0ac3 CONDITIONAL_JUMP 0 true 1020:0ae7 Code5 LAB_1020_0ae7 +1020:0ae5 FUN_1020_0ac3 CONDITIONAL_JUMP 0 true 1020:0ae9 Code5 LAB_1020_0ae9 +1020:0af1 runtime_1020_0aee DATA 1 true Stack[0x6] - +1020:0af8 runtime_1020_0aee DATA 1 true Stack[0x4] - +1020:0b05 FUN_1020_0b00 DATA 1 true Stack[0xa] - +1020:0b09 FUN_1020_0b00 DATA 1 true Stack[0x6] - +1020:0b0d FUN_1020_0b00 DATA 1 true Stack[0x4] - +1020:0b22 FUN_1020_0b1b DATA 0 true Stack[0x4] - +1020:0b26 FUN_1020_0b1b CONDITIONAL_JUMP 0 true 1020:0b2d Code5 LAB_1020_0b2d +1020:0b28 FUN_1020_0b1b DATA 0 true Stack[0x4] - +1020:0b2d FUN_1020_0b1b DATA 0 true Stack[-0x102] - +1020:0b33 FUN_1020_0b1b DATA 1 true Stack[0x8] - +1020:0b3c FUN_1020_0b1b DATA 1 true Stack[0x4] - +1020:0b42 FUN_1020_0b1b UNCONDITIONAL_CALL 0 true 1020:0a10 Code5 FUN_1020_0a10 FUN_1020_0a10 +1020:0b45 FUN_1020_0b1b DATA 1 true Stack[0xc] - +1020:0b4b FUN_1020_0b1b UNCONDITIONAL_CALL 0 true 1020:0a51 Code5 FUN_1020_0a51 FUN_1020_0a51 +1020:0b4e FUN_1020_0b1b DATA 0 true Stack[-0x202] - +1020:0b54 FUN_1020_0b1b DATA 1 true Stack[0x8] - +1020:0b59 FUN_1020_0b1b DATA 0 true Stack[0x4] - +1020:0b61 FUN_1020_0b1b UNCONDITIONAL_CALL 0 true 1020:0a10 Code5 FUN_1020_0a10 FUN_1020_0a10 +1020:0b65 FUN_1020_0b1b UNCONDITIONAL_CALL 0 true 1020:0a51 Code5 FUN_1020_0a51 FUN_1020_0a51 +1020:0b68 FUN_1020_0b1b DATA 1 true Stack[0x8] - +1020:0b6d FUN_1020_0b1b DATA 0 true Stack[0x6] - +1020:0b71 FUN_1020_0b1b UNCONDITIONAL_CALL 0 true 1020:09ec Code5 FUN_1020_09ec FUN_1020_09ec +1020:0b81 FUN_1020_0b7a DATA 0 true Stack[0x4] - +1020:0b85 FUN_1020_0b7a CONDITIONAL_JUMP 0 true 1020:0be3 Code5 LAB_1020_0be3 +1020:0b87 FUN_1020_0b7a DATA 0 true Stack[0x6] - +1020:0b8b FUN_1020_0b7a CONDITIONAL_JUMP 0 true 1020:0be3 Code5 LAB_1020_0be3 +1020:0b8d FUN_1020_0b7a DATA 0 true Stack[0x6] - +1020:0b92 FUN_1020_0b7a CONDITIONAL_JUMP 0 true 1020:0be3 Code5 LAB_1020_0be3 +1020:0b94 FUN_1020_0b7a DATA 0 true Stack[0x4] - +1020:0b99 FUN_1020_0b7a CONDITIONAL_JUMP 0 true 1020:0ba0 Code5 LAB_1020_0ba0 +1020:0b9b FUN_1020_0b7a DATA 0 true Stack[0x4] - +1020:0ba0 FUN_1020_0b7a DATA 0 true Stack[-0x102] - +1020:0ba6 FUN_1020_0b7a DATA 1 true Stack[0x8] - +1020:0baf FUN_1020_0b7a DATA 1 true Stack[0x6] - +1020:0bb5 FUN_1020_0b7a UNCONDITIONAL_CALL 0 true 1020:0a10 Code5 FUN_1020_0a10 FUN_1020_0a10 +1020:0bb8 FUN_1020_0b7a DATA 0 true Stack[-0x202] - +1020:0bbe FUN_1020_0b7a DATA 1 true Stack[0x8] - +1020:0bc3 FUN_1020_0b7a DATA 1 true Stack[0x6] - +1020:0bc6 FUN_1020_0b7a DATA 1 true Stack[0x4] - +1020:0bcf FUN_1020_0b7a UNCONDITIONAL_CALL 0 true 1020:0a10 Code5 FUN_1020_0a10 FUN_1020_0a10 +1020:0bd3 FUN_1020_0b7a UNCONDITIONAL_CALL 0 true 1020:0a51 Code5 FUN_1020_0a51 FUN_1020_0a51 +1020:0bd6 FUN_1020_0b7a DATA 1 true Stack[0x8] - +1020:0be0 FUN_1020_0b7a UNCONDITIONAL_CALL 0 true 1020:09ec Code5 FUN_1020_09ec FUN_1020_09ec +1020:0bec FUN_1020_0be9 DATA 1 true Stack[0x4] - +1020:0bfc FUN_1020_0be9 CONDITIONAL_JUMP 0 true 1020:0c0b Code5 LAB_1020_0c0b +1020:0c07 FUN_1020_0be9 CONDITIONAL_JUMP 0 true 1020:0c0b Code5 LAB_1020_0c0b +1020:0c0f FUN_1020_0be9 CONDITIONAL_JUMP 0 true 1020:0c1a Code5 LAB_1020_0c1a +1020:0c16 FUN_1020_0be9 CONDITIONAL_JUMP 0 true 1020:0c72 Code5 LAB_1020_0c72 +1020:0c29 FUN_1020_0be9 CONDITIONAL_JUMP 0 true 1020:0c5a Code5 LAB_1020_0c5a +1020:0c3f FUN_1020_0be9 CONDITIONAL_JUMP 0 true 1020:0c55 Code5 LAB_1020_0c55 +1020:0c46 FUN_1020_0be9 CONDITIONAL_JUMP 0 true 1020:0c4b Code5 LAB_1020_0c4b +1020:0c48 FUN_1020_0be9 UNCONDITIONAL_CALL 0 true 1020:0c76 Code5 FUN_1020_0c76 FUN_1020_0c76 +1020:0c87 FUN_1020_0c76 CONDITIONAL_JUMP 0 true 1020:0c8d Code5 LAB_1020_0c8d +1020:0ca5 FUN_1020_0c76 CONDITIONAL_JUMP 0 true 1020:0ca9 Code5 LAB_1020_0ca9 +1020:0cad FUN_1020_0c76 CONDITIONAL_JUMP 0 true 1020:0ccf Code5 LAB_1020_0ccf +1020:0cb4 FUN_1020_0c76 CONDITIONAL_JUMP 0 true 1020:0cb9 Code5 LAB_1020_0cb9 +1020:0cb7 FUN_1020_0c76 UNCONDITIONAL_JUMP 0 true 1020:0cab Code5 LAB_1020_0cab +1020:0cd6 FUN_1020_0cd4 CONDITIONAL_JUMP 0 true 1020:0d53 Code5 LAB_1020_0d53 +1020:0cda FUN_1020_0cd4 CONDITIONAL_JUMP 0 true 1020:0d54 Code5 LAB_1020_0d54 +1020:0cde FUN_1020_0cd4 CONDITIONAL_JUMP 0 true 1020:0ce5 Code5 LAB_1020_0ce5 +1020:0ceb FUN_1020_0cd4 CONDITIONAL_JUMP 0 true 1020:0d54 Code5 LAB_1020_0d54 +1020:0d08 FUN_1020_0cd4 CONDITIONAL_JUMP 0 true 1020:0d1b Code5 LAB_1020_0d1b +1020:0d19 FUN_1020_0cd4 UNCONDITIONAL_JUMP 0 true 1020:0d05 Code5 LAB_1020_0d05 +1020:0d1d FUN_1020_0cd4 CONDITIONAL_JUMP 0 true 1020:0d29 Code5 LAB_1020_0d29 +1020:0d27 FUN_1020_0cd4 CONDITIONAL_JUMP 0 true 1020:0d1f Code5 LAB_1020_0d1f +1020:0d2a FUN_1020_0cd4 CONDITIONAL_JUMP 0 true 1020:0d63 Code5 LAB_1020_0d63 +1020:0d35 FUN_1020_0cd4 CONDITIONAL_JUMP 0 true 1020:0d41 Code5 LAB_1020_0d41 +1020:0d3f FUN_1020_0cd4 CONDITIONAL_JUMP 0 true 1020:0d61 Code5 LAB_1020_0d61 +1020:0d4a FUN_1020_0cd4 CONDITIONAL_JUMP 0 true 1020:0d5b Code5 LAB_1020_0d5b +1020:0d5f FUN_1020_0cd4 CONDITIONAL_JUMP 0 true 1020:0d4c Code5 LAB_1020_0d4c +1020:0d6c FUN_1020_0cd4 CONDITIONAL_JUMP 0 true 1020:0d7e Code5 LAB_1020_0d7e +1020:0d84 FUN_1020_0cd4 CONDITIONAL_JUMP 0 true 1020:0d53 Code5 LAB_1020_0d53 +1020:0d88 FUN_1020_0cd4 CONDITIONAL_JUMP 0 true 1020:0d41 Code5 LAB_1020_0d41 +1020:0d92 FUN_1020_0cd4 CONDITIONAL_JUMP 0 true 1020:0d86 Code5 LAB_1020_0d86 +1020:0d94 FUN_1020_0cd4 UNCONDITIONAL_CALL 0 true 1020:0e93 Code5 FUN_1020_0e93 FUN_1020_0e93 +1020:0d99 FUN_1020_0d97 CONDITIONAL_JUMP 0 true 1020:0d94 Code5 LAB_1020_0d94 +1020:0d9d FUN_1020_0d97 CONDITIONAL_JUMP 0 true 1020:0d94 Code5 LAB_1020_0d94 +1020:0dbb FUN_1020_0d97 CONDITIONAL_JUMP 0 true 1020:0dc1 Code5 LAB_1020_0dc1 +1020:0dbf FUN_1020_0d97 CONDITIONAL_JUMP 0 true 1020:0dce Code5 LAB_1020_0dce +1020:0dc3 FUN_1020_0d97 CONDITIONAL_JUMP 0 true 1020:0deb Code5 LAB_1020_0deb +1020:0dc7 FUN_1020_0d97 CONDITIONAL_JUMP 0 true 1020:0deb Code5 LAB_1020_0deb +1020:0de8 FUN_1020_0d97 UNCONDITIONAL_JUMP 0 true 1020:0e66 Code5 LAB_1020_0e66 +1020:0df5 FUN_1020_0d97 DATA 1 true Stack[-0xf] - +1020:0df8 FUN_1020_0d97 DATA 0 true Stack[-0x9] - +1020:0e01 FUN_1020_0d97 DATA 1 true Stack[-0x10] - +1020:0e04 FUN_1020_0d97 DATA 0 true Stack[-0x8] - +1020:0e0d FUN_1020_0d97 DATA 1 true Stack[-0xe] - +1020:0e10 FUN_1020_0d97 DATA 0 true Stack[-0xa] - +1020:0e1b FUN_1020_0d97 DATA 1 true Stack[-0x10] - +1020:0e1e FUN_1020_0d97 DATA 0 true Stack[-0x6] - +1020:0e27 FUN_1020_0d97 DATA 1 true Stack[-0xe] - +1020:0e2a FUN_1020_0d97 DATA 0 true Stack[-0x8] - +1020:0e33 FUN_1020_0d97 DATA 1 true Stack[-0xc] - +1020:0e36 FUN_1020_0d97 DATA 0 true Stack[-0xa] - +1020:0e41 FUN_1020_0d97 DATA 1 true Stack[-0xe] - +1020:0e44 FUN_1020_0d97 DATA 0 true Stack[-0x6] - +1020:0e4d FUN_1020_0d97 DATA 1 true Stack[-0xc] - +1020:0e50 FUN_1020_0d97 DATA 0 true Stack[-0x8] - +1020:0e59 FUN_1020_0d97 DATA 1 true Stack[-0xc] - +1020:0e5c FUN_1020_0d97 DATA 0 true Stack[-0x6] - +1020:0e6b FUN_1020_0d97 CONDITIONAL_JUMP 0 true 1020:0e74 Code5 LAB_1020_0e74 +1020:0e81 FUN_1020_0d97 CONDITIONAL_JUMP 0 true 1020:0e86 Code5 LAB_1020_0e86 +1020:0e89 FUN_1020_0d97 CONDITIONAL_JUMP 0 true 1020:0e93 Code5 FUN_1020_0e93 FUN_1020_0e93 +1020:0e9c FUN_1020_0e9a CONDITIONAL_JUMP 0 true 1020:0e93 Code5 FUN_1020_0e93 FUN_1020_0e93 +1020:0ebd FUN_1020_0e9a CONDITIONAL_JUMP 0 true 1020:0ec5 Code5 LAB_1020_0ec5 +1020:0ec1 FUN_1020_0e9a CONDITIONAL_JUMP 0 true 1020:0ec5 Code5 LAB_1020_0ec5 +1020:0ec5 FUN_1020_0e9a CONDITIONAL_JUMP 0 true 1020:0ecd Code5 LAB_1020_0ecd +1020:0ecf FUN_1020_0e9a CONDITIONAL_JUMP 0 true 1020:0ee2 Code5 LAB_1020_0ee2 +1020:0ed7 FUN_1020_0e9a CONDITIONAL_JUMP 0 true 1020:0ebb Code5 LAB_1020_0ebb +1020:0ee0 FUN_1020_0e9a UNCONDITIONAL_JUMP 0 true 1020:0ecd Code5 LAB_1020_0ecd +1020:0ee4 FUN_1020_0e9a CONDITIONAL_JUMP 0 true 1020:0ef0 Code5 LAB_1020_0ef0 +1020:0eea FUN_1020_0e9a CONDITIONAL_JUMP 0 true 1020:0ed1 Code5 LAB_1020_0ed1 +1020:0eee FUN_1020_0e9a UNCONDITIONAL_JUMP 0 true 1020:0ed1 Code5 LAB_1020_0ed1 +1020:0f01 FUN_1020_0e9a CONDITIONAL_JUMP 0 true 1020:0f0a Code5 LAB_1020_0f0a +1020:0f0e FUN_1020_0e9a UNCONDITIONAL_JUMP 0 true 1020:0e78 Code5 LAB_1020_0e78 +1020:0f15 FUN_1020_0f11 CONDITIONAL_JUMP 0 true 1020:0f1c Code5 LAB_1020_0f1c +1020:0f1f FUN_1020_0f11 CONDITIONAL_JUMP 0 true 1020:0f28 Code5 FUN_1020_0f28 FUN_1020_0f28 +1020:0f21 FUN_1020_0f11 UNCONDITIONAL_CALL 0 true 1020:0f28 Code5 FUN_1020_0f28 FUN_1020_0f28 +1020:0f24 FUN_1020_0f11 CONDITIONAL_JUMP 0 true 1020:0f3a Code5 LAB_1020_0f3a +1020:0f2a FUN_1020_0f28 CONDITIONAL_JUMP 0 true 1020:0f3a Code5 LAB_1020_0f3a +1020:0f2e FUN_1020_0f28 CONDITIONAL_JUMP 0 true 1020:0f3a Code5 LAB_1020_0f3a +1020:0f32 FUN_1020_0f28 CONDITIONAL_JUMP 0 true 1020:0f3a Code5 LAB_1020_0f3a +1020:0f36 FUN_1020_0f28 CONDITIONAL_JUMP 0 true 1020:0f3a Code5 LAB_1020_0f3a +1020:0f3f FUN_1020_0f3b CONDITIONAL_JUMP 0 true 1020:0f76 Code5 LAB_1020_0f76 +1020:0f45 FUN_1020_0f3b CONDITIONAL_JUMP 0 true 1020:0f4e Code5 LAB_1020_0f4e +1020:0f55 FUN_1020_0f3b CONDITIONAL_JUMP 0 true 1020:0f63 Code5 LAB_1020_0f63 +1020:0f5d FUN_1020_0f3b CONDITIONAL_JUMP 0 true 1020:0f63 Code5 LAB_1020_0f63 +1020:0f65 FUN_1020_0f3b CONDITIONAL_JUMP 0 true 1020:0f6f Code5 LAB_1020_0f6f +1020:0f6d FUN_1020_0f3b CONDITIONAL_JUMP 0 true 1020:0f67 Code5 LAB_1020_0f67 +1020:0f71 FUN_1020_0f3b CONDITIONAL_JUMP 0 true 1020:0f76 Code5 LAB_1020_0f76 +1020:0f7c FUN_1020_0f77 CONDITIONAL_JUMP 0 true 1020:0fd9 Code5 LAB_1020_0fd9 +1020:0f86 FUN_1020_0f77 CONDITIONAL_JUMP 0 true 1020:0fda Code5 LAB_1020_0fda +1020:0f8b FUN_1020_0f77 CONDITIONAL_JUMP 0 true 1020:0f96 Code5 LAB_1020_0f96 +1020:0f99 FUN_1020_0f77 CONDITIONAL_JUMP 0 true 1020:0fa8 Code5 LAB_1020_0fa8 +1020:0faa FUN_1020_0f77 CONDITIONAL_JUMP 0 true 1020:0fb6 Code5 LAB_1020_0fb6 +1020:0fb4 FUN_1020_0f77 CONDITIONAL_JUMP 0 true 1020:0fac Code5 LAB_1020_0fac +1020:0fb8 FUN_1020_0f77 CONDITIONAL_JUMP 0 true 1020:0fc4 Code5 LAB_1020_0fc4 +1020:0fc2 FUN_1020_0f77 CONDITIONAL_JUMP 0 true 1020:0fd9 Code5 LAB_1020_0fd9 +1020:0fc8 FUN_1020_0f77 CONDITIONAL_JUMP 0 true 1020:0fd9 Code5 LAB_1020_0fd9 +1020:0fcc FUN_1020_0f77 CONDITIONAL_JUMP 0 true 1020:0fd5 Code5 LAB_1020_0fd5 +1020:0fe2 FUN_1020_0f77 CONDITIONAL_JUMP 0 true 1020:0fb6 Code5 LAB_1020_0fb6 +1020:0fe5 FUN_1020_0fe5 UNCONDITIONAL_CALL 0 true 1020:0cd4 Code5 FUN_1020_0cd4 FUN_1020_0cd4 +1020:0fe8 FUN_1020_0fe5 CONDITIONAL_JUMP 0 true 1020:1025 Code5 LAB_1020_1025 +1020:0feb FUN_1020_0feb UNCONDITIONAL_CALL 0 true 1020:0cd0 Code5 FUN_1020_0cd0 FUN_1020_0cd0 +1020:0fee FUN_1020_0feb CONDITIONAL_JUMP 0 true 1020:1025 Code5 LAB_1020_1025 +1020:0ff7 FUN_1020_0ff7 UNCONDITIONAL_CALL 0 true 1020:0d97 Code5 FUN_1020_0d97 FUN_1020_0d97 +1020:0ffa FUN_1020_0ff7 CONDITIONAL_JUMP 0 true 1020:1025 Code5 LAB_1020_1025 +1020:0fff FUN_1020_0ffd CONDITIONAL_JUMP 0 true 1020:102b Code5 LAB_1020_102b +1020:1001 FUN_1020_0ffd UNCONDITIONAL_CALL 0 true 1020:0e9a Code5 FUN_1020_0e9a FUN_1020_0e9a +1020:1004 FUN_1020_0ffd CONDITIONAL_JUMP 0 true 1020:1025 Code5 LAB_1020_1025 +1020:1007 FUN_1020_1007 UNCONDITIONAL_CALL 0 true 1020:0f11 Code5 FUN_1020_0f11 FUN_1020_0f11 +1020:100b FUN_1020_100b UNCONDITIONAL_CALL 0 true 1020:0f3b Code5 FUN_1020_0f3b FUN_1020_0f3b +1020:1011 UNCONDITIONAL_CALL 0 true 1020:0f77 Code5 FUN_1020_0f77 FUN_1020_0f77 +1020:1014 CONDITIONAL_JUMP 0 true 1020:101f Code5 LAB_1020_101f +1020:1019 FUN_1020_1017 UNCONDITIONAL_CALL 0 true 1020:0f77 Code5 FUN_1020_0f77 FUN_1020_0f77 +1020:101c FUN_1020_1017 CONDITIONAL_JUMP 0 true 1020:101f Code5 LAB_1020_101f +1020:1022 FUN_1020_1017 UNCONDITIONAL_CALL 0 true 1020:005d Code5 FUN_1020_005d FUN_1020_005d +1020:1028 FUN_1020_0ffd UNCONDITIONAL_CALL 0 true 1020:005d Code5 FUN_1020_005d FUN_1020_005d +1020:102e FUN_1020_0ffd UNCONDITIONAL_CALL 0 true 1020:005d Code5 FUN_1020_005d FUN_1020_005d +1020:1034 FUN_1020_1031 UNCONDITIONAL_CALL 0 true 1020:0cd4 Code5 FUN_1020_0cd4 FUN_1020_0cd4 +1020:103e runtime_1020_103b UNCONDITIONAL_CALL 0 true 1020:0cd0 Code5 FUN_1020_0cd0 FUN_1020_0cd0 +1020:1048 runtime_1020_1045 UNCONDITIONAL_CALL 0 true 1020:0d97 Code5 FUN_1020_0d97 FUN_1020_0d97 +1020:1052 FUN_1020_104f UNCONDITIONAL_CALL 0 true 1020:0e9a Code5 FUN_1020_0e9a FUN_1020_0e9a +1020:105b runtime_1020_1059 CONDITIONAL_JUMP 0 true 1020:10a6 Code5 LAB_1020_10a6 +1020:106c runtime_1020_1059 CONDITIONAL_JUMP 0 true 1020:10a7 Code5 LAB_1020_10a7 +1020:1071 runtime_1020_1059 CONDITIONAL_JUMP 0 true 1020:107f Code5 LAB_1020_107f +1020:107d runtime_1020_1059 UNCONDITIONAL_JUMP 0 true 1020:106e Code5 LAB_1020_106e +1020:1082 runtime_1020_1059 CONDITIONAL_JUMP 0 true 1020:1091 Code5 LAB_1020_1091 +1020:1093 runtime_1020_1059 CONDITIONAL_JUMP 0 true 1020:10a0 Code5 LAB_1020_10a0 +1020:109e runtime_1020_1059 CONDITIONAL_JUMP 0 true 1020:1095 Code5 LAB_1020_1095 +1020:10ae runtime_1020_10aa UNCONDITIONAL_CALL 0 true 1020:1059 Code5 runtime_1020_1059 runtime_1020_1059 +1020:10ba runtime_1020_10aa UNCONDITIONAL_CALL 0 true 1020:0cd0 Code5 FUN_1020_0cd0 FUN_1020_0cd0 +1020:10cc FUN_1020_10be CONDITIONAL_JUMP 0 true 1020:110a Code5 LAB_1020_110a +1020:10d1 FUN_1020_10be CONDITIONAL_JUMP 0 true 1020:1114 Code5 LAB_1020_1114 +1020:10d3 FUN_1020_10be DATA 0 true Stack[-0xa] - +1020:10d6 FUN_1020_10be DATA 0 true Stack[-0x8] - +1020:10d9 FUN_1020_10be DATA 0 true Stack[-0x6] - +1020:10e8 FUN_1020_10be DATA 0 true Stack[-0x4] - +1020:10eb FUN_1020_10be DATA 1 true Stack[-0xa] - +1020:10ee FUN_1020_10be DATA 1 true Stack[-0x8] - +1020:10f1 FUN_1020_10be DATA 1 true Stack[-0x6] - +1020:10f4 FUN_1020_10be UNCONDITIONAL_CALL 0 true 1020:104f Code5 FUN_1020_104f FUN_1020_104f +1020:10f7 FUN_1020_10be UNCONDITIONAL_CALL 0 true 1020:1031 Code5 FUN_1020_1031 FUN_1020_1031 +1020:10ff FUN_1020_10be UNCONDITIONAL_CALL 0 true 1020:0cd0 Code5 FUN_1020_0cd0 FUN_1020_0cd0 +1020:1102 FUN_1020_10be DATA 1 true Stack[-0x4] - +1020:1108 FUN_1020_10be CONDITIONAL_JUMP 0 true 1020:10eb Code5 LAB_1020_10eb +1020:111a FUN_1020_10be UNCONDITIONAL_CALL 0 true 1020:005d Code5 FUN_1020_005d FUN_1020_005d +1020:1126 runtime_1020_111d UNCONDITIONAL_CALL 0 true 1020:0cd4 Code5 FUN_1020_0cd4 FUN_1020_0cd4 +1020:112b runtime_1020_111d CONDITIONAL_JUMP 0 true 1020:1130 Code5 LAB_1020_1130 +1020:1132 runtime_1020_111d CONDITIONAL_JUMP 0 true 1020:1190 Code5 LAB_1020_1190 +1020:1141 runtime_1020_111d UNCONDITIONAL_CALL 0 true 1020:0f11 Code5 FUN_1020_0f11 FUN_1020_0f11 +1020:1145 runtime_1020_111d CONDITIONAL_JUMP 0 true 1020:1157 Code5 LAB_1020_1157 +1020:1147 runtime_1020_111d UNCONDITIONAL_CALL 0 true 1020:104f Code5 FUN_1020_104f FUN_1020_104f +1020:114e runtime_1020_111d UNCONDITIONAL_CALL 0 true 1020:10aa Code5 runtime_1020_10aa runtime_1020_10aa +1020:1154 runtime_1020_111d UNCONDITIONAL_CALL 0 true 1020:1045 Code5 runtime_1020_1045 runtime_1020_1045 +1020:115a runtime_1020_111d CONDITIONAL_JUMP 0 true 1020:115f Code5 LAB_1020_115f +1020:115c runtime_1020_111d UNCONDITIONAL_CALL 0 true 1020:1031 Code5 FUN_1020_1031 FUN_1020_1031 +1020:1161 runtime_1020_111d UNCONDITIONAL_CALL 0 true 1020:0f11 Code5 FUN_1020_0f11 FUN_1020_0f11 +1020:1165 runtime_1020_111d CONDITIONAL_JUMP 0 true 1020:116a Code5 LAB_1020_116a +1020:1167 runtime_1020_111d UNCONDITIONAL_CALL 0 true 1020:103b Code5 runtime_1020_103b runtime_1020_103b +1020:116c runtime_1020_111d UNCONDITIONAL_CALL 0 true 1020:0f11 Code5 FUN_1020_0f11 FUN_1020_0f11 +1020:116f runtime_1020_111d CONDITIONAL_JUMP 0 true 1020:1179 Code5 LAB_1020_1179 +1020:1176 runtime_1020_111d UNCONDITIONAL_CALL 0 true 1020:0cd4 Code5 FUN_1020_0cd4 FUN_1020_0cd4 +1020:117b runtime_1020_111d CONDITIONAL_JUMP 0 true 1020:1186 Code5 LAB_1020_1186 +1020:1183 runtime_1020_111d UNCONDITIONAL_CALL 0 true 1020:143c Code5 FUN_1020_143c FUN_1020_143c +1020:1187 runtime_1020_111d CONDITIONAL_JUMP 0 true 1020:1190 Code5 LAB_1020_1190 +1020:118b runtime_1020_111d CONDITIONAL_JUMP 0 true 1020:1190 Code5 LAB_1020_1190 +1020:11bd runtime_1020_11bb CONDITIONAL_JUMP 0 true 1020:11c4 Code5 LAB_1020_11c4 +1020:11c2 runtime_1020_11bb CONDITIONAL_JUMP 0 true 1020:11ca Code5 LAB_1020_11ca +1020:11c7 runtime_1020_11bb UNCONDITIONAL_CALL 0 true 1020:005d Code5 FUN_1020_005d FUN_1020_005d +1020:11da runtime_1020_11bb UNCONDITIONAL_CALL 0 true 1020:0d97 Code5 FUN_1020_0d97 FUN_1020_0d97 +1020:11ea runtime_1020_11bb UNCONDITIONAL_CALL 0 true 1020:1031 Code5 FUN_1020_1031 FUN_1020_1031 +1020:11f8 runtime_1020_11bb UNCONDITIONAL_CALL 0 true 1020:0cd4 Code5 FUN_1020_0cd4 FUN_1020_0cd4 +1020:11fe runtime_1020_11bb UNCONDITIONAL_CALL 0 true 1020:0e9a Code5 FUN_1020_0e9a FUN_1020_0e9a +1020:1207 runtime_1020_11bb UNCONDITIONAL_CALL 0 true 1020:143c Code5 FUN_1020_143c FUN_1020_143c +1020:1215 runtime_1020_11bb UNCONDITIONAL_CALL 0 true 1020:0cd4 Code5 FUN_1020_0cd4 FUN_1020_0cd4 +1020:1220 runtime_1020_11bb UNCONDITIONAL_CALL 0 true 1020:0f3b Code5 FUN_1020_0f3b FUN_1020_0f3b +1020:122c runtime_1020_11bb UNCONDITIONAL_CALL 0 true 1020:0d97 Code5 FUN_1020_0d97 FUN_1020_0d97 +1020:1232 runtime_1020_11bb UNCONDITIONAL_CALL 0 true 1020:0cd4 Code5 FUN_1020_0cd4 FUN_1020_0cd4 +1020:1237 runtime_1020_11bb CONDITIONAL_JUMP 0 true 1020:123f Code5 LAB_1020_123f +1020:1274 runtime_1020_1264 UNCONDITIONAL_CALL 0 true 1020:0e9a Code5 FUN_1020_0e9a FUN_1020_0e9a +1020:1279 runtime_1020_1264 CONDITIONAL_JUMP 0 true 1020:12d0 Code5 LAB_1020_12d0 +1020:1282 runtime_1020_1264 UNCONDITIONAL_CALL 0 true 1020:0f77 Code5 FUN_1020_0f77 FUN_1020_0f77 +1020:128a runtime_1020_1264 UNCONDITIONAL_CALL 0 true 1020:0f3b Code5 FUN_1020_0f3b FUN_1020_0f3b +1020:1290 runtime_1020_1264 CONDITIONAL_JUMP 0 true 1020:1294 Code5 LAB_1020_1294 +1020:1299 runtime_1020_1264 UNCONDITIONAL_CALL 0 true 1020:0cd0 Code5 FUN_1020_0cd0 FUN_1020_0cd0 +1020:12a2 runtime_1020_1264 UNCONDITIONAL_CALL 0 true 1020:1455 Code5 FUN_1020_1455 FUN_1020_1455 +1020:12a8 runtime_1020_1264 CONDITIONAL_JUMP 0 true 1020:12b8 Code5 LAB_1020_12b8 +1020:12b4 runtime_1020_1264 UNCONDITIONAL_CALL 0 true 1020:0d97 Code5 FUN_1020_0d97 FUN_1020_0d97 +1020:12ba runtime_1020_1264 CONDITIONAL_JUMP 0 true 1020:12d0 Code5 LAB_1020_12d0 +1020:12bd runtime_1020_1264 CONDITIONAL_JUMP 0 true 1020:12cf Code5 LAB_1020_12cf +1020:12cc runtime_1020_1264 UNCONDITIONAL_CALL 0 true 1020:0e9a Code5 FUN_1020_0e9a FUN_1020_0e9a +1020:12d4 runtime_1020_1264 UNCONDITIONAL_CALL 0 true 1020:005d Code5 FUN_1020_005d FUN_1020_005d +1020:130f runtime_1020_1307 CONDITIONAL_JUMP 0 true 1020:1314 Code5 LAB_1020_1314 +1020:1311 runtime_1020_1307 UNCONDITIONAL_JUMP 0 true 1020:13e4 Code5 LAB_1020_13e4 +1020:1319 runtime_1020_1307 CONDITIONAL_JUMP 0 true 1020:131f Code5 LAB_1020_131f +1020:1327 runtime_1020_1307 UNCONDITIONAL_CALL 0 true 1020:0f11 Code5 FUN_1020_0f11 FUN_1020_0f11 +1020:132a runtime_1020_1307 CONDITIONAL_JUMP 0 true 1020:1338 Code5 LAB_1020_1338 +1020:1331 runtime_1020_1307 UNCONDITIONAL_CALL 0 true 1020:0e9a Code5 FUN_1020_0e9a FUN_1020_0e9a +1020:1341 runtime_1020_1307 UNCONDITIONAL_CALL 0 true 1020:0f11 Code5 FUN_1020_0f11 FUN_1020_0f11 +1020:1344 runtime_1020_1307 CONDITIONAL_JUMP 0 true 1020:134b Code5 LAB_1020_134b +1020:1346 runtime_1020_1307 UNCONDITIONAL_CALL 0 true 1020:1436 Code5 runtime_1020_1436 runtime_1020_1436 +1020:1349 runtime_1020_1307 UNCONDITIONAL_JUMP 0 true 1020:13c2 Code5 LAB_1020_13c2 +1020:1353 runtime_1020_1307 READ 1 true 1020:13e8 Code5 real48_table_13e8 +1020:1353 runtime_1020_1307 READ 1 false 1020:13fa Code5 real48_table_13e8[18] +1020:1356 runtime_1020_1307 READ 1 true 1020:13ea Code5 real48_table_13e8[2] +1020:1356 runtime_1020_1307 READ 1 false 1020:13fc Code5 real48_table_13e8[20] +1020:135a runtime_1020_1307 READ 1 true 1020:13ec Code5 real48_table_13e8[4] +1020:135a runtime_1020_1307 READ 1 false 1020:13fe Code5 real48_table_13e8[22] +1020:135e runtime_1020_1307 UNCONDITIONAL_CALL 0 true 1020:0f11 Code5 FUN_1020_0f11 FUN_1020_0f11 +1020:1363 runtime_1020_1307 CONDITIONAL_JUMP 0 true 1020:136d Code5 LAB_1020_136d +1020:1368 runtime_1020_1307 CONDITIONAL_JUMP 0 true 1020:1351 Code5 LAB_1020_1351 +1020:1370 runtime_1020_1307 DATA 0 true Stack[-0x8] - +1020:1373 runtime_1020_1307 DATA 0 true Stack[-0x6] - +1020:1376 runtime_1020_1307 DATA 0 true Stack[-0x4] - +1020:137a runtime_1020_1307 READ 1 true 1020:13fa Code5 real48_table_13e8[18] +1020:137a runtime_1020_1307 READ 1 false 1020:13ee Code5 real48_table_13e8[6] +1020:137d runtime_1020_1307 READ 1 true 1020:13fc Code5 real48_table_13e8[20] +1020:137d runtime_1020_1307 READ 1 false 1020:13f0 Code5 real48_table_13e8[8] +1020:1381 runtime_1020_1307 READ 1 true 1020:13fe Code5 real48_table_13e8[22] +1020:1381 runtime_1020_1307 READ 1 false 1020:13f2 Code5 real48_table_13e8[10] +1020:1385 runtime_1020_1307 UNCONDITIONAL_CALL 0 true 1020:103b Code5 runtime_1020_103b runtime_1020_103b +1020:138b runtime_1020_1307 DATA 1 true Stack[-0x8] - +1020:138e runtime_1020_1307 DATA 1 true Stack[-0x6] - +1020:1391 runtime_1020_1307 DATA 1 true Stack[-0x4] - +1020:1394 runtime_1020_1307 UNCONDITIONAL_CALL 0 true 1020:0d97 Code5 FUN_1020_0d97 FUN_1020_0d97 +1020:139e runtime_1020_1307 UNCONDITIONAL_CALL 0 true 1020:0cd4 Code5 FUN_1020_0cd4 FUN_1020_0cd4 +1020:13aa runtime_1020_1307 UNCONDITIONAL_CALL 0 true 1020:0e9a Code5 FUN_1020_0e9a FUN_1020_0e9a +1020:13ad runtime_1020_1307 UNCONDITIONAL_CALL 0 true 1020:1436 Code5 runtime_1020_1436 runtime_1020_1436 +1020:13bf runtime_1020_1307 UNCONDITIONAL_CALL 0 true 1020:0cd4 Code5 FUN_1020_0cd4 FUN_1020_0cd4 +1020:13c6 runtime_1020_1307 CONDITIONAL_JUMP 0 true 1020:13dc Code5 LAB_1020_13dc +1020:13d8 runtime_1020_1307 UNCONDITIONAL_CALL 0 true 1020:0cd0 Code5 FUN_1020_0cd0 FUN_1020_0cd0 +1020:13df runtime_1020_1307 CONDITIONAL_JUMP 0 true 1020:13e4 Code5 LAB_1020_13e4 +1020:1447 FUN_1020_143c UNCONDITIONAL_CALL 0 true 1020:0d97 Code5 FUN_1020_0d97 FUN_1020_0d97 +1020:144c FUN_1020_143c UNCONDITIONAL_CALL 0 true 1020:1455 Code5 FUN_1020_1455 FUN_1020_1455 +1020:1452 FUN_1020_143c UNCONDITIONAL_CALL 0 true 1020:0d97 Code5 FUN_1020_0d97 FUN_1020_0d97 +1020:145b FUN_1020_1455 DATA 0 true Stack[-0x8] - +1020:145e FUN_1020_1455 DATA 0 true Stack[-0x6] - +1020:1461 FUN_1020_1455 DATA 0 true Stack[-0x4] - +1020:1471 FUN_1020_1455 UNCONDITIONAL_JUMP 0 true 1020:1483 Code5 LAB_1020_1483 +1020:1480 FUN_1020_1455 UNCONDITIONAL_CALL 0 true 1020:0cd4 Code5 FUN_1020_0cd4 FUN_1020_0cd4 +1020:1483 FUN_1020_1455 DATA 1 true Stack[-0x8] - +1020:1486 FUN_1020_1455 DATA 1 true Stack[-0x6] - +1020:1489 FUN_1020_1455 DATA 1 true Stack[-0x4] - +1020:148c FUN_1020_1455 UNCONDITIONAL_CALL 0 true 1020:0d97 Code5 FUN_1020_0d97 FUN_1020_0d97 +1020:1494 FUN_1020_1455 CONDITIONAL_JUMP 0 true 1020:1473 Code5 LAB_1020_1473 +1020:149d FUN_1020_1455 UNCONDITIONAL_CALL 0 true 1020:0cd4 Code5 FUN_1020_0cd4 FUN_1020_0cd4 +1020:14a4 FUN_1020_14a4 UNCONDITIONAL_CALL 0 true 1020:1501 Code5 FUN_1020_1501 FUN_1020_1501 +1020:14ab FUN_1020_14a4 DATA 0 true Stack[0x4] - +1020:14b3 FUN_1020_14a4 DATA 0 true Stack[0x4] - +1020:14c1 FUN_1020_14c1 UNCONDITIONAL_CALL 0 true 1020:1501 Code5 FUN_1020_1501 FUN_1020_1501 +1020:14ce FUN_1020_14c1 CONDITIONAL_JUMP 0 true 1020:14da Code5 LAB_1020_14da +1020:14d6 FUN_1020_14c1 CONDITIONAL_JUMP 0 true 1020:14cb Code5 LAB_1020_14cb +1020:14de runtime_1020_14de UNCONDITIONAL_CALL 0 true 1020:1501 Code5 FUN_1020_1501 FUN_1020_1501 +1020:14e2 runtime_1020_14de READ 0 true 1020:14ff Code5 DAT_1020_14ff +1020:14e8 runtime_1020_14de READ 0 true 1028:0720 Data6 DAT_1028_0720 +1020:14ed runtime_1020_14de READ 0 true 1020:14fb Code5 DAT_1020_14fb +1020:1501 FUN_1020_1501 READ 1 true 1028:0720 Data6 DAT_1028_0720 +1020:1504 FUN_1020_1501 READ 1 true 1028:0722 Data6 DAT_1028_0722 +1020:150a FUN_1020_1501 READ 0 true 1020:1537 Code5 DAT_1020_1537 +1020:152f FUN_1020_1501 WRITE 0 true 1028:0720 Data6 DAT_1028_0720 +1020:1532 FUN_1020_1501 WRITE 0 true 1028:0722 Data6 DAT_1028_0722 +1020:153d runtime_1020_1539 WRITE 0 true 1028:0720 Data6 DAT_1028_0720 +1020:1541 runtime_1020_1539 WRITE 0 true 1028:0722 Data6 DAT_1028_0722 +1020:154f FUN_1020_1546 CONDITIONAL_JUMP 0 true 1020:1562 Code5 FUN_1020_1562 FUN_1020_1562 +1020:1558 FUN_1020_1546 UNCONDITIONAL_CALL 0 true 1020:1562 Code5 FUN_1020_1562 FUN_1020_1562 +1020:1570 FUN_1020_1562 CONDITIONAL_JUMP 0 true 1020:1575 Code5 LAB_1020_1575 +1020:157d FUN_1020_1562 CONDITIONAL_JUMP 0 true 1020:1562 Code5 FUN_1020_1562 FUN_1020_1562 +1020:1588 FUN_1020_1582 CONDITIONAL_JUMP 0 true 1020:15e7 Code5 LAB_1020_15e7 +1020:158e FUN_1020_1582 CONDITIONAL_JUMP 0 true 1020:1597 Code5 LAB_1020_1597 +1020:1594 FUN_1020_1582 CONDITIONAL_JUMP 0 true 1020:159b Code5 LAB_1020_159b +1020:1599 FUN_1020_1582 CONDITIONAL_JUMP 0 true 1020:15e7 Code5 LAB_1020_15e7 +1020:159f FUN_1020_1582 CONDITIONAL_JUMP 0 true 1020:15e9 Code5 LAB_1020_15e9 +1020:15aa FUN_1020_1582 CONDITIONAL_JUMP 0 true 1020:15d1 Code5 LAB_1020_15d1 +1020:15af FUN_1020_1582 CONDITIONAL_JUMP 0 true 1020:15e7 Code5 LAB_1020_15e7 +1020:15cf FUN_1020_1582 CONDITIONAL_JUMP 0 true 1020:15a1 Code5 LAB_1020_15a1 +1020:15d5 FUN_1020_1582 CONDITIONAL_JUMP 0 true 1020:15e6 Code5 LAB_1020_15e6 +1020:15d9 FUN_1020_1582 CONDITIONAL_JUMP 0 true 1020:15e2 Code5 LAB_1020_15e2 +1020:15e4 FUN_1020_1582 CONDITIONAL_JUMP 0 true 1020:15e7 Code5 LAB_1020_15e7 +1020:15eb FUN_1020_1582 CONDITIONAL_JUMP 0 true 1020:15e7 Code5 LAB_1020_15e7 +1020:15f3 FUN_1020_1582 CONDITIONAL_JUMP 0 true 1020:15f8 Code5 LAB_1020_15f8 +1020:15fe FUN_1020_1582 CONDITIONAL_JUMP 0 true 1020:160b Code5 LAB_1020_160b +1020:1606 FUN_1020_1582 CONDITIONAL_JUMP 0 true 1020:15d1 Code5 LAB_1020_15d1 +1020:1611 FUN_1020_1582 CONDITIONAL_JUMP 0 true 1020:15e7 Code5 LAB_1020_15e7 +1020:1615 FUN_1020_1582 CONDITIONAL_JUMP 0 true 1020:160d Code5 LAB_1020_160d +1020:161a FUN_1020_1582 CONDITIONAL_JUMP 0 true 1020:15ed Code5 LAB_1020_15ed +1020:161e FUN_1020_1582 CONDITIONAL_JUMP 0 true 1020:1627 Code5 LAB_1020_1627 +1020:162f FUN_1020_1629 DATA 1 true Stack[0xc] - +1020:1632 FUN_1020_1629 DATA 1 true Stack[0xe] - +1020:1635 FUN_1020_1629 DATA 0 true Stack[-0x2] - +1020:163a FUN_1020_1629 UNCONDITIONAL_CALL 0 true 1020:1546 Code5 FUN_1020_1546 FUN_1020_1546 +1020:1642 FUN_1020_1629 DATA 1 true Stack[0x6] - +1020:1645 FUN_1020_1629 DATA 1 true Stack[0x4] - +1020:1648 FUN_1020_1629 DATA 1 true Stack[0xa] - +1020:164d FUN_1020_1629 CONDITIONAL_JUMP 0 true 1020:1651 Code5 LAB_1020_1651 +1020:1653 FUN_1020_1629 CONDITIONAL_JUMP 0 true 1020:1657 Code5 LAB_1020_1657 +1020:1659 FUN_1020_1629 CONDITIONAL_JUMP 0 true 1020:165d Code5 LAB_1020_165d +1020:1661 FUN_1020_1629 CONDITIONAL_JUMP 0 true 1020:166b Code5 LAB_1020_166b +1020:1677 FUN_1020_1674 DATA 1 true Stack[0x8] - +1020:1680 FUN_1020_1674 CONDITIONAL_JUMP 0 true 1020:168b Code5 LAB_1020_168b +1020:1686 FUN_1020_1674 CONDITIONAL_JUMP 0 true 1020:168b Code5 LAB_1020_168b +1020:1689 FUN_1020_1674 CONDITIONAL_JUMP 0 true 1020:1682 Code5 LAB_1020_1682 +1020:168b FUN_1020_1674 UNCONDITIONAL_CALL 0 true 1020:1582 Code5 FUN_1020_1582 FUN_1020_1582 +1020:168e FUN_1020_1674 CONDITIONAL_JUMP 0 true 1020:1692 Code5 LAB_1020_1692 +1020:1690 FUN_1020_1674 CONDITIONAL_JUMP 0 true 1020:169b Code5 LAB_1020_169b +1020:1694 FUN_1020_1674 DATA 1 true Stack[0x8] - +1020:169b FUN_1020_1674 DATA 1 true Stack[0x4] - +1020:16a9 FUN_1020_16a5 DATA 1 true Stack[0xa] - +1020:16ad FUN_1020_16a5 DATA 1 true Stack[0x6] - +1020:16b1 FUN_1020_16a5 DATA 1 true Stack[0x4] - +1020:16b8 FUN_1020_16a5 CONDITIONAL_JUMP 0 true 1020:16c1 Code5 LAB_1020_16c1 +1020:16cb FUN_1020_16c9 DATA 1 true Stack[0x8] - +1020:16cf FUN_1020_16c9 DATA 1 true Stack[0x6] - +1020:16d3 FUN_1020_16c9 DATA 1 true Stack[0x4] - +1020:16dd runtime_1020_16dd UNCONDITIONAL_CALL 0 true 1020:16e6 Code5 FUN_1020_16e6 FUN_1020_16e6 +1020:16e1 FUN_1020_16e1 UNCONDITIONAL_CALL 0 true 1020:16e6 Code5 FUN_1020_16e6 FUN_1020_16e6 +1020:16ec FUN_1020_16e6 CONDITIONAL_JUMP 0 true 1020:16f2 Code5 LAB_1020_16f2 +1020:1703 FUN_1020_16e6 CONDITIONAL_JUMP 0 true 1020:1713 Code5 LAB_1020_1713 +1020:170a FUN_1020_16e6 CONDITIONAL_JUMP 0 true 1020:16f9 Code5 LAB_1020_16f9 +1020:1710 FUN_1020_16e6 UNCONDITIONAL_CALL 0 true 1020:005d Code5 FUN_1020_005d FUN_1020_005d diff --git a/original/RELOCATIONS.tsv b/original/RELOCATIONS.tsv new file mode 100644 index 0000000..8f201be --- /dev/null +++ b/original/RELOCATIONS.tsv @@ -0,0 +1,2435 @@ +segment record chain_index source_offset source_address source_type additive target_kind target target_address module import_ordinal import_name raw_flags +1 1 0 0x000a 1000:000a far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +1 2 0 0x0015 1000:0015 far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +1 3 0 0x0020 1000:0020 far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +1 4 0 0x002f 1000:002f far-pointer-32 False import-ordinal GDI.ordinal:51 GDI 51 0x01 +1 5 0 0x003e 1000:003e far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 6 0 0x0052 1000:0052 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 7 0 0x0060 1000:0060 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 8 0 0x007f 1000:007f far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 9 0 0x009b 1000:009b far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 10 0 0x00b7 1000:00b7 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 11 0 0x00c2 1000:00c2 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 12 0 0x00cd 1000:00cd far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 13 0 0x00d8 1000:00d8 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 14 0 0x00e0 1000:00e0 far-pointer-32 False import-ordinal GDI.ordinal:69 GDI 69 0x01 +1 15 0 0x00e8 1000:00e8 far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +1 16 0 0x00f0 1000:00f0 far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +1 17 0 0x00f8 1000:00f8 far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +1 18 0 0x0109 1000:0109 far-pointer-32 False internal entry-ordinal:194 1018:1b57 0x00 +1 19 0 0x0119 1000:0119 far-pointer-32 False internal entry-ordinal:101 1010:03af 0x00 +1 20 0 0x013d 1000:013d far-pointer-32 False internal entry-ordinal:3 1000:01d3 0x00 +1 21 0 0x0164 1000:0164 far-pointer-32 False internal entry-ordinal:258 1020:0061 0x00 +1 22 0 0x017a 1000:017a far-pointer-32 False internal entry-ordinal:172 1018:1274 0x00 +1 23 0 0x0190 1000:0190 far-pointer-32 False import-ordinal USER.ordinal:174 USER 174 0x01 +1 24 0 0x01a3 1000:01a3 far-pointer-32 False import-ordinal USER.ordinal:173 USER 173 0x01 +1 25 0 0x01b1 1000:01b1 far-pointer-32 False import-ordinal GDI.ordinal:87 GDI 87 0x01 +1 26 0 0x01da 1000:01da far-pointer-32 False internal entry-ordinal:294 1020:03ef 0x00 +1 27 0 0x01f8 1000:01f8 far-pointer-32 False internal entry-ordinal:170 1018:1106 0x00 +1 28 0 0x0223 1000:0223 far-pointer-32 False import-ordinal USER.ordinal:179 USER 179 0x01 +1 29 0 0x0245 1000:0245 far-pointer-32 False import-ordinal USER.ordinal:179 USER 179 0x01 +1 30 0 0x029b 1000:029b far-pointer-32 False internal entry-ordinal:269 1020:0167 0x00 +1 31 0 0x02c4 1000:02c4 far-pointer-32 False internal entry-ordinal:157 1018:0f38 0x00 +1 32 0 0x02cb 1000:02cb far-pointer-32 False internal entry-ordinal:258 1020:0061 0x00 +1 33 0 0x02d5 1000:02d5 far-pointer-32 False internal entry-ordinal:180 1018:170c 0x00 +1 34 0 0x02e1 1000:02e1 far-pointer-32 False import-ordinal USER.ordinal:173 USER 173 0x01 +1 35 0 0x02e7 1000:02e7 far-pointer-32 False import-ordinal USER.ordinal:69 USER 69 0x01 +1 36 0 0x02f3 1000:02f3 far-pointer-32 False internal entry-ordinal:74 1008:0023 0x00 +1 37 0 0x0306 1000:0306 far-pointer-32 False internal entry-ordinal:93 1008:1326 0x00 +1 38 0 0x030b 1000:030b far-pointer-32 False internal entry-ordinal:92 1008:11c5 0x00 +1 39 0 0x032d 1000:032d far-pointer-32 False import-ordinal USER.ordinal:13 USER 13 0x01 +1 40 0 0x0540 1000:0540 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 41 0 0x0570 1000:0570 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 42 0 0x05b5 1000:05b5 far-pointer-32 False internal entry-ordinal:281 1020:082e 0x00 +1 43 0 0x05ba 1000:05ba far-pointer-32 False internal entry-ordinal:248 1008:2f2f 0x00 +1 44 0 0x05d7 1000:05d7 far-pointer-32 False internal entry-ordinal:281 1020:082e 0x00 +1 45 0 0x05dc 1000:05dc far-pointer-32 False internal entry-ordinal:264 1020:0a7d 0x00 +1 46 0 0x05e2 1000:05e2 far-pointer-32 False internal entry-ordinal:247 1008:2f07 0x00 +1 47 0 0x05f2 1000:05f2 far-pointer-32 False internal entry-ordinal:249 1008:2f4d 0x00 +1 48 0 0x0609 1000:0609 far-pointer-32 False import-ordinal KERNEL.ordinal:127 KERNEL 127 0x01 +1 49 0 0x0637 1000:0637 far-pointer-32 False import-ordinal KERNEL.ordinal:127 KERNEL 127 0x01 +1 50 0 0x077f 1000:077f far-pointer-32 False internal entry-ordinal:128 1008:28a3 0x00 +1 51 0 0x07b0 1000:07b0 far-pointer-32 False internal entry-ordinal:258 1020:0061 0x00 +1 52 0 0x0819 1000:0819 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 53 0 0x0883 1000:0883 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 54 0 0x08ed 1000:08ed far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 55 0 0x0959 1000:0959 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 56 0 0x09c4 1000:09c4 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 57 0 0x0a2d 1000:0a2d far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 58 0 0x0a98 1000:0a98 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 59 0 0x0b02 1000:0b02 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 60 0 0x0b6d 1000:0b6d far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 61 0 0x0bd6 1000:0bd6 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 62 0 0x0c41 1000:0c41 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 63 0 0x0cac 1000:0cac far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 64 0 0x0d16 1000:0d16 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 65 0 0x0d82 1000:0d82 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 66 0 0x0deb 1000:0deb far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 67 0 0x0e55 1000:0e55 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 68 0 0x0ebe 1000:0ebe far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 69 0 0x0f28 1000:0f28 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 70 0 0x0f91 1000:0f91 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 71 0 0x0ff9 1000:0ff9 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 72 0 0x1063 1000:1063 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 73 0 0x10cc 1000:10cc far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 74 0 0x1135 1000:1135 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 75 0 0x119e 1000:119e far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 76 0 0x1207 1000:1207 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 77 0 0x1270 1000:1270 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 78 0 0x12da 1000:12da far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 79 0 0x1345 1000:1345 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 80 0 0x13ae 1000:13ae far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 81 0 0x1417 1000:1417 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 82 0 0x1480 1000:1480 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 83 0 0x14e9 1000:14e9 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 84 0 0x1552 1000:1552 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 85 0 0x15bb 1000:15bb far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 86 0 0x1623 1000:1623 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 87 0 0x168a 1000:168a far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 88 0 0x16f1 1000:16f1 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 89 0 0x1758 1000:1758 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 90 0 0x17bf 1000:17bf far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 91 0 0x1827 1000:1827 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 92 0 0x1890 1000:1890 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 93 0 0x18f8 1000:18f8 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 94 0 0x1961 1000:1961 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 95 0 0x19c9 1000:19c9 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 96 0 0x1a32 1000:1a32 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 97 0 0x1a9a 1000:1a9a far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 98 0 0x1b02 1000:1b02 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 99 0 0x1b6a 1000:1b6a far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 100 0 0x1bd3 1000:1bd3 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 101 0 0x1c3b 1000:1c3b far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 102 0 0x1ca4 1000:1ca4 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 103 0 0x1d0d 1000:1d0d far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 104 0 0x1d81 1000:1d81 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 105 0 0x1df3 1000:1df3 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 106 0 0x1e67 1000:1e67 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 107 0 0x1ecd 1000:1ecd far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 108 0 0x1f38 1000:1f38 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 109 0 0x1f9d 1000:1f9d far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 110 0 0x2002 1000:2002 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 111 0 0x2067 1000:2067 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 112 0 0x20cc 1000:20cc far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 113 0 0x2134 1000:2134 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 114 0 0x219b 1000:219b far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 115 0 0x2204 1000:2204 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 116 0 0x226d 1000:226d far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 117 0 0x22d6 1000:22d6 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 118 0 0x233c 1000:233c far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 119 0 0x23a4 1000:23a4 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 120 0 0x240b 1000:240b far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 121 0 0x2473 1000:2473 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 122 0 0x24da 1000:24da far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 123 0 0x253f 1000:253f far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 124 0 0x25a4 1000:25a4 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 125 0 0x2609 1000:2609 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 126 0 0x266e 1000:266e far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 127 0 0x26d9 1000:26d9 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 128 0 0x2742 1000:2742 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 129 0 0x27ab 1000:27ab far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 130 0 0x2816 1000:2816 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 131 0 0x287f 1000:287f far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 132 0 0x28ea 1000:28ea far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 133 0 0x2951 1000:2951 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 134 0 0x29ba 1000:29ba far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 135 0 0x2a21 1000:2a21 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 136 0 0x2a8a 1000:2a8a far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 137 0 0x2af1 1000:2af1 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 138 0 0x2b57 1000:2b57 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 139 0 0x2bbd 1000:2bbd far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 140 0 0x2c24 1000:2c24 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 141 0 0x2c8b 1000:2c8b far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 142 0 0x2cf0 1000:2cf0 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 143 0 0x2d5e 1000:2d5e far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 144 0 0x2dcc 1000:2dcc far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 145 0 0x2e3a 1000:2e3a far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 146 0 0x2ea8 1000:2ea8 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 147 0 0x2f16 1000:2f16 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 148 0 0x2f84 1000:2f84 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 149 0 0x2ff2 1000:2ff2 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 150 0 0x3060 1000:3060 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 151 0 0x30ce 1000:30ce far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 152 0 0x313c 1000:313c far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 153 0 0x31a9 1000:31a9 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 154 0 0x3216 1000:3216 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 155 0 0x3284 1000:3284 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 156 0 0x32f1 1000:32f1 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 157 0 0x335e 1000:335e far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 158 0 0x33c9 1000:33c9 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 159 0 0x3432 1000:3432 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 160 0 0x34a3 1000:34a3 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 161 0 0x350c 1000:350c far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 162 0 0x357a 1000:357a far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 163 0 0x35e6 1000:35e6 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 164 0 0x3652 1000:3652 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 165 0 0x36c0 1000:36c0 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 166 0 0x372c 1000:372c far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 167 0 0x3798 1000:3798 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 168 0 0x3806 1000:3806 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 169 0 0x3872 1000:3872 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 170 0 0x38de 1000:38de far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 171 0 0x394c 1000:394c far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 172 0 0x39b8 1000:39b8 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 173 0 0x3a24 1000:3a24 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 174 0 0x3a8c 1000:3a8c far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 175 0 0x3af2 1000:3af2 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 176 0 0x3b58 1000:3b58 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 177 0 0x3bc1 1000:3bc1 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 178 0 0x3c29 1000:3c29 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 179 0 0x3c91 1000:3c91 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 180 0 0x3cf8 1000:3cf8 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 181 0 0x3d61 1000:3d61 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 182 0 0x3dc6 1000:3dc6 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 183 0 0x3e2b 1000:3e2b far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 184 0 0x3e91 1000:3e91 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 185 0 0x3ef7 1000:3ef7 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 186 0 0x3f5c 1000:3f5c far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 187 0 0x3fc4 1000:3fc4 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 188 0 0x402c 1000:402c far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 189 0 0x4095 1000:4095 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 190 0 0x40fe 1000:40fe far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 191 0 0x4167 1000:4167 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 192 0 0x41cf 1000:41cf far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 193 0 0x4236 1000:4236 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 194 0 0x429d 1000:429d far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 195 0 0x4304 1000:4304 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 196 0 0x436a 1000:436a far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 197 0 0x43ce 1000:43ce far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 198 0 0x4432 1000:4432 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 199 0 0x4496 1000:4496 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 200 0 0x44fa 1000:44fa far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 201 0 0x455f 1000:455f far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 202 0 0x45c3 1000:45c3 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 203 0 0x462a 1000:462a far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 204 0 0x4691 1000:4691 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 205 0 0x46f8 1000:46f8 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 206 0 0x475f 1000:475f far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 207 0 0x47ca 1000:47ca far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 208 0 0x4833 1000:4833 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 209 0 0x489d 1000:489d far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 210 0 0x4906 1000:4906 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 211 0 0x4970 1000:4970 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 212 0 0x49d9 1000:49d9 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 213 0 0x4a43 1000:4a43 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 214 0 0x4aac 1000:4aac far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 215 0 0x4b16 1000:4b16 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 216 0 0x4b7f 1000:4b7f far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 217 0 0x4be9 1000:4be9 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 218 0 0x4c52 1000:4c52 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 219 0 0x4cbc 1000:4cbc far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 220 0 0x4d23 1000:4d23 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 221 0 0x4d8c 1000:4d8c far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 222 0 0x4df7 1000:4df7 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 223 0 0x4e5f 1000:4e5f far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 224 0 0x4ec8 1000:4ec8 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 225 0 0x4f2f 1000:4f2f far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 226 0 0x4f98 1000:4f98 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 227 0 0x4ffd 1000:4ffd far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 228 0 0x5062 1000:5062 far-pointer-32 False internal entry-ordinal:76 1008:0138 0x00 +1 229 0 0x5073 1000:5073 far-pointer-32 False internal entry-ordinal:77 1008:0787 0x00 +1 230 0 0x5085 1000:5085 far-pointer-32 False internal entry-ordinal:77 1008:0787 0x00 +1 231 0 0x5098 1000:5098 far-pointer-32 False internal entry-ordinal:77 1008:0787 0x00 +1 232 0 0x50ab 1000:50ab far-pointer-32 False internal entry-ordinal:77 1008:0787 0x00 +1 233 0 0x50be 1000:50be far-pointer-32 False internal entry-ordinal:77 1008:0787 0x00 +1 234 0 0x50cd 1000:50cd far-pointer-32 False internal entry-ordinal:77 1008:0787 0x00 +1 235 0 0x50dc 1000:50dc far-pointer-32 False internal entry-ordinal:77 1008:0787 0x00 +1 236 0 0x50eb 1000:50eb far-pointer-32 False internal entry-ordinal:77 1008:0787 0x00 +1 237 0 0x50fa 1000:50fa far-pointer-32 False internal entry-ordinal:77 1008:0787 0x00 +1 238 0 0x5109 1000:5109 far-pointer-32 False internal entry-ordinal:77 1008:0787 0x00 +1 239 0 0x5118 1000:5118 far-pointer-32 False internal entry-ordinal:77 1008:0787 0x00 +1 240 0 0x5127 1000:5127 far-pointer-32 False internal entry-ordinal:77 1008:0787 0x00 +1 241 0 0x5136 1000:5136 far-pointer-32 False internal entry-ordinal:77 1008:0787 0x00 +1 242 0 0x5145 1000:5145 far-pointer-32 False internal entry-ordinal:77 1008:0787 0x00 +1 243 0 0x5154 1000:5154 far-pointer-32 False internal entry-ordinal:77 1008:0787 0x00 +1 244 0 0x5163 1000:5163 far-pointer-32 False internal entry-ordinal:77 1008:0787 0x00 +1 245 0 0x5174 1000:5174 far-pointer-32 False internal entry-ordinal:77 1008:0787 0x00 +1 246 0 0x5185 1000:5185 far-pointer-32 False internal entry-ordinal:77 1008:0787 0x00 +1 247 0 0x5194 1000:5194 far-pointer-32 False internal entry-ordinal:77 1008:0787 0x00 +1 248 0 0x51a3 1000:51a3 far-pointer-32 False internal entry-ordinal:77 1008:0787 0x00 +1 249 0 0x5201 1000:5201 far-pointer-32 False import-ordinal USER.ordinal:173 USER 173 0x01 +1 250 0 0x5207 1000:5207 far-pointer-32 False import-ordinal USER.ordinal:69 USER 69 0x01 +1 251 0 0x520f 1000:520f far-pointer-32 False internal entry-ordinal:88 1008:10e3 0x00 +1 252 0 0x523c 1000:523c far-pointer-32 False internal entry-ordinal:75 1008:00e2 0x00 +1 253 0 0x5248 1000:5248 far-pointer-32 False import-ordinal GDI.ordinal:69 GDI 69 0x01 +1 254 0 0x5251 1000:5251 far-pointer-32 False import-ordinal GDI.ordinal:69 GDI 69 0x01 +1 255 0 0x525a 1000:525a far-pointer-32 False import-ordinal GDI.ordinal:69 GDI 69 0x01 +1 256 0 0x5263 1000:5263 far-pointer-32 False import-ordinal GDI.ordinal:69 GDI 69 0x01 +1 257 0 0x526c 1000:526c far-pointer-32 False import-ordinal GDI.ordinal:69 GDI 69 0x01 +1 258 0 0x5275 1000:5275 far-pointer-32 False import-ordinal GDI.ordinal:69 GDI 69 0x01 +1 259 0 0x527e 1000:527e far-pointer-32 False import-ordinal GDI.ordinal:69 GDI 69 0x01 +1 260 0 0x5287 1000:5287 far-pointer-32 False import-ordinal GDI.ordinal:69 GDI 69 0x01 +1 261 0 0x529f 1000:529f far-pointer-32 False import-ordinal GDI.ordinal:69 GDI 69 0x01 +1 262 0 0x52bd 1000:52bd far-pointer-32 False import-ordinal GDI.ordinal:69 GDI 69 0x01 +1 263 0 0x52db 1000:52db far-pointer-32 False import-ordinal GDI.ordinal:69 GDI 69 0x01 +1 264 0 0x52e9 1000:52e9 far-pointer-32 False import-ordinal USER.ordinal:69 USER 69 0x01 +1 265 0 0x52f0 1000:52f0 far-pointer-32 False import-ordinal USER.ordinal:6 USER 6 0x01 +1 266 0 0x52fd 1000:52fd far-pointer-32 False internal entry-ordinal:171 1018:121b 0x00 +1 267 0 0x530f 1000:530f far-pointer-32 False import-ordinal USER.ordinal:125 USER 125 0x01 +1 268 0 0x5316 1000:5316 far-pointer-32 False internal entry-ordinal:295 1020:0439 0x00 +1 269 0 0x5329 1000:5329 far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +1 270 0 0x533d 1000:533d far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 271 0 0x536c 1000:536c far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 272 0 0x537c 1000:537c far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 273 0 0x5388 1000:5388 far-pointer-32 False import-ordinal GDI.ordinal:69 GDI 69 0x01 +1 274 0 0x539e 1000:539e far-pointer-32 False import-ordinal USER.ordinal:282 USER 282 0x01 +1 275 0 0x53aa 1000:53aa far-pointer-32 False import-ordinal GDI.ordinal:150 GDI 150 0x01 +1 276 0 0x53b2 1000:53b2 far-pointer-32 False import-ordinal USER.ordinal:283 USER 283 0x01 +1 277 0 0x53b7 1000:53b7 far-pointer-32 False internal entry-ordinal:75 1008:00e2 0x00 +1 278 0 0x53cf 1000:53cf far-pointer-32 False internal entry-ordinal:95 1008:149d 0x00 +1 279 0 0x53da 1000:53da far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +1 280 0 0x53e8 1000:53e8 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 281 0 0x5409 1000:5409 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 282 0 0x5414 1000:5414 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 283 0 0x541c 1000:541c far-pointer-32 False import-ordinal GDI.ordinal:69 GDI 69 0x01 +1 284 0 0x5424 1000:5424 far-pointer-32 False import-ordinal GDI.ordinal:69 GDI 69 0x01 +1 285 0 0x5432 1000:5432 far-pointer-32 False internal entry-ordinal:95 1008:149d 0x00 +1 286 0 0x543d 1000:543d far-pointer-32 False internal entry-ordinal:34 1000:531e 0x00 +1 287 0 0x5442 1000:5442 far-pointer-32 False internal entry-ordinal:87 1008:0f2e 0x00 +1 288 0 0x544a 1000:544a far-pointer-32 False internal entry-ordinal:34 1000:531e 0x00 +1 289 0 0x5452 1000:5452 far-pointer-32 False internal entry-ordinal:34 1000:531e 0x00 +1 290 0 0x5460 1000:5460 far-pointer-32 False internal entry-ordinal:95 1008:149d 0x00 +1 291 0 0x546b 1000:546b far-pointer-32 False internal entry-ordinal:34 1000:531e 0x00 +1 292 0 0x5479 1000:5479 far-pointer-32 False internal entry-ordinal:95 1008:149d 0x00 +1 293 0 0x5484 1000:5484 far-pointer-32 False internal entry-ordinal:34 1000:531e 0x00 +1 294 0 0x5492 1000:5492 far-pointer-32 False import-ordinal USER.ordinal:175 USER 175 0x01 +1 295 0 0x54ac 1000:54ac far-pointer-32 False internal entry-ordinal:34 1000:531e 0x00 +1 296 0 0x54be 1000:54be far-pointer-32 False internal entry-ordinal:95 1008:149d 0x00 +1 297 0 0x54e4 1000:54e4 far-pointer-32 False internal entry-ordinal:34 1000:531e 0x00 +1 298 0 0x54f6 1000:54f6 far-pointer-32 False internal entry-ordinal:95 1008:149d 0x00 +1 299 0 0x551c 1000:551c far-pointer-32 False internal entry-ordinal:34 1000:531e 0x00 +1 300 0 0x552e 1000:552e far-pointer-32 False internal entry-ordinal:95 1008:149d 0x00 +1 301 0 0x5545 1000:5545 far-pointer-32 False internal entry-ordinal:34 1000:531e 0x00 +1 302 0 0x5552 1000:5552 far-pointer-32 False import-ordinal USER.ordinal:175 USER 175 0x01 +1 303 0 0x5561 1000:5561 far-pointer-32 False internal entry-ordinal:34 1000:531e 0x00 +1 304 0 0x556f 1000:556f far-pointer-32 False internal entry-ordinal:95 1008:149d 0x00 +1 305 0 0x557a 1000:557a far-pointer-32 False internal entry-ordinal:34 1000:531e 0x00 +1 306 0 0x5587 1000:5587 far-pointer-32 False import-ordinal USER.ordinal:175 USER 175 0x01 +1 307 0 0x5596 1000:5596 far-pointer-32 False internal entry-ordinal:34 1000:531e 0x00 +1 308 0 0x55a4 1000:55a4 far-pointer-32 False internal entry-ordinal:95 1008:149d 0x00 +1 309 0 0x55af 1000:55af far-pointer-32 False internal entry-ordinal:34 1000:531e 0x00 +1 310 0 0x55bd 1000:55bd far-pointer-32 False internal entry-ordinal:95 1008:149d 0x00 +1 311 0 0x55c8 1000:55c8 far-pointer-32 False internal entry-ordinal:34 1000:531e 0x00 +1 312 0 0x55d6 1000:55d6 far-pointer-32 False internal entry-ordinal:95 1008:149d 0x00 +1 313 0 0x55e1 1000:55e1 far-pointer-32 False internal entry-ordinal:34 1000:531e 0x00 +1 314 0 0x55ee 1000:55ee far-pointer-32 False internal entry-ordinal:34 1000:531e 0x00 +1 315 0 0x55f6 1000:55f6 far-pointer-32 False import-ordinal GDI.ordinal:69 GDI 69 0x01 +1 316 0 0x5603 1000:5603 far-pointer-32 False import-ordinal USER.ordinal:282 USER 282 0x01 +1 317 0 0x560f 1000:560f far-pointer-32 False import-ordinal USER.ordinal:173 USER 173 0x01 +1 318 0 0x5615 1000:5615 far-pointer-32 False import-ordinal USER.ordinal:69 USER 69 0x01 +1 319 0 0x5631 1000:5631 far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +1 320 0 0x563c 1000:563c far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +1 321 0 0x5650 1000:5650 far-pointer-32 False import-ordinal USER.ordinal:33 USER 33 0x01 +1 322 0 0x5662 1000:5662 far-pointer-32 False import-ordinal GDI.ordinal:51 GDI 51 0x01 +1 323 0 0x5671 1000:5671 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 324 0 0x567f 1000:567f far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 325 0 0x56a0 1000:56a0 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 326 0 0x56be 1000:56be far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 327 0 0x56dc 1000:56dc far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 328 0 0x56e7 1000:56e7 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 329 0 0x56ef 1000:56ef far-pointer-32 False import-ordinal GDI.ordinal:69 GDI 69 0x01 +1 330 0 0x56f7 1000:56f7 far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +1 331 0 0x5702 1000:5702 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 332 0 0x5752 1000:5752 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 333 0 0x5799 1000:5799 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 334 0 0x57a8 1000:57a8 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 335 0 0x57ec 1000:57ec far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 336 0 0x57f7 1000:57f7 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 337 0 0x57ff 1000:57ff far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +1 338 0 0x581f 1000:581f far-pointer-32 False import-ordinal USER.ordinal:282 USER 282 0x01 +1 339 0 0x582b 1000:582b far-pointer-32 False import-ordinal USER.ordinal:173 USER 173 0x01 +1 340 0 0x5831 1000:5831 far-pointer-32 False import-ordinal USER.ordinal:69 USER 69 0x01 +1 341 0 0x5842 1000:5842 far-pointer-32 False import-ordinal USER.ordinal:33 USER 33 0x01 +1 342 0 0x584e 1000:584e far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 343 0 0x587b 1000:587b far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 344 0 0x5885 1000:5885 far-pointer-32 False internal entry-ordinal:82 1008:0996 0x00 +1 345 0 0x58b3 1000:58b3 far-pointer-32 False internal entry-ordinal:82 1008:0996 0x00 +1 346 0 0x58cb 1000:58cb far-pointer-32 False internal entry-ordinal:83 1008:0b9e 0x00 +1 347 0 0x58da 1000:58da far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 348 0 0x5910 1000:5910 far-pointer-32 False import-ordinal USER.ordinal:31 USER 31 0x01 +1 349 0 0x592b 1000:592b far-pointer-32 False import-ordinal USER.ordinal:125 USER 125 0x01 +1 350 0 0x5937 1000:5937 far-pointer-32 False import-ordinal USER.ordinal:124 USER 124 0x01 +1 351 0 0x597d 1000:597d far-pointer-32 False import-ordinal USER.ordinal:125 USER 125 0x01 +1 352 0 0x5989 1000:5989 far-pointer-32 False import-ordinal USER.ordinal:124 USER 124 0x01 +1 353 0 0x59c1 1000:59c1 far-pointer-32 False import-ordinal USER.ordinal:46 USER 46 0x01 +1 354 0 0x59d8 1000:59d8 far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 355 0 0x59e9 1000:59e9 far-pointer-32 False import-ordinal USER.ordinal:282 USER 282 0x01 +1 356 0 0x59f4 1000:59f4 far-pointer-32 False import-ordinal USER.ordinal:283 USER 283 0x01 +1 357 0 0x59fc 1000:59fc far-pointer-32 False import-ordinal GDI.ordinal:366 GDI 366 0x01 +1 358 0 0x5a09 1000:5a09 far-pointer-32 False import-ordinal USER.ordinal:282 USER 282 0x01 +1 359 0 0x5a18 1000:5a18 far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 360 0 0x5a43 1000:5a43 far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 361 0 0x5a54 1000:5a54 far-pointer-32 False import-ordinal USER.ordinal:282 USER 282 0x01 +1 362 0 0x5a5f 1000:5a5f far-pointer-32 False import-ordinal USER.ordinal:283 USER 283 0x01 +1 363 0 0x5a6f 1000:5a6f far-pointer-32 False import-ordinal USER.ordinal:282 USER 282 0x01 +1 364 0 0x5a7e 1000:5a7e far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 365 0 0x5a96 1000:5a96 far-pointer-32 False import-ordinal USER.ordinal:125 USER 125 0x01 +1 366 0 0x5ac5 1000:5ac5 far-pointer-32 False internal entry-ordinal:172 1018:1274 0x00 +1 367 0 0x5acc 1000:5acc far-pointer-32 False import-ordinal GDI.ordinal:87 GDI 87 0x01 +1 368 0 0x5af1 1000:5af1 far-pointer-32 False internal entry-ordinal:294 1020:03ef 0x00 +1 369 0 0x5b0f 1000:5b0f far-pointer-32 False internal entry-ordinal:170 1018:1106 0x00 +1 370 0 0x5b99 1000:5b99 far-pointer-32 False import-ordinal USER.ordinal:22 USER 22 0x01 +1 371 0 0x5bae 1000:5bae far-pointer-32 False import-ordinal GDI.ordinal:69 GDI 69 0x01 +1 372 0 0x5bd6 1000:5bd6 far-pointer-32 False internal entry-ordinal:171 1018:121b 0x00 +1 373 0 0x5bdd 1000:5bdd far-pointer-32 False internal entry-ordinal:295 1020:0439 0x00 +1 374 0 0x5bee 1000:5bee far-pointer-32 False internal entry-ordinal:180 1018:170c 0x00 +1 375 0 0x5bfc 1000:5bfc far-pointer-32 False internal entry-ordinal:95 1008:149d 0x00 +1 376 0 0x5c0b 1000:5c0b far-pointer-32 False import-ordinal USER.ordinal:22 USER 22 0x01 +1 377 0 0x5c21 1000:5c21 far-pointer-32 False import-ordinal USER.ordinal:282 USER 282 0x01 +1 378 0 0x5c2d 1000:5c2d far-pointer-32 False import-ordinal GDI.ordinal:150 GDI 150 0x01 +1 379 0 0x5c35 1000:5c35 far-pointer-32 False import-ordinal USER.ordinal:283 USER 283 0x01 +1 380 0 0x5c3d 1000:5c3d far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +1 381 0 0x5c4e 1000:5c4e far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 382 0 0x5c5a 1000:5c5a far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +1 383 0 0x5c6c 1000:5c6c far-pointer-32 False import-ordinal GDI.ordinal:51 GDI 51 0x01 +1 384 0 0x5c7d 1000:5c7d far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 385 0 0x5c8a 1000:5c8a far-pointer-32 False import-ordinal GDI.ordinal:90 GDI 90 0x01 +1 386 0 0x5c9b 1000:5c9b far-pointer-32 False import-ordinal GDI.ordinal:346 GDI 346 0x01 +1 387 0 0x5ca9 1000:5ca9 far-pointer-32 False import-ordinal GDI.ordinal:2 GDI 2 0x01 +1 388 0 0x5ccd 1000:5ccd far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 389 0 0x5ce5 1000:5ce5 far-pointer-32 False import-ordinal GDI.ordinal:9 GDI 9 0x01 +1 390 0 0x5cf4 1000:5cf4 far-pointer-32 False internal entry-ordinal:246 1008:2ee5 0x00 +1 391 0 0x5d0c 1000:5d0c far-pointer-32 False internal entry-ordinal:243 1008:2e92 0x00 +1 392 0 0x5d12 1000:5d12 far-pointer-32 False import-ordinal GDI.ordinal:33 GDI 33 0x01 +1 393 0 0x5d35 1000:5d35 far-pointer-32 False import-ordinal GDI.ordinal:346 GDI 346 0x01 +1 394 0 0x5d4b 1000:5d4b far-pointer-32 False internal entry-ordinal:246 1008:2ee5 0x00 +1 395 0 0x5d5c 1000:5d5c far-pointer-32 False internal entry-ordinal:246 1008:2ee5 0x00 +1 396 0 0x5d73 1000:5d73 far-pointer-32 False internal entry-ordinal:283 1020:1629 0x00 +1 397 0 0x5d83 1000:5d83 far-pointer-32 False internal entry-ordinal:248 1008:2f2f 0x00 +1 398 0 0x5d92 1000:5d92 far-pointer-32 False internal entry-ordinal:249 1008:2f4d 0x00 +1 399 0 0x5da1 1000:5da1 far-pointer-32 False internal entry-ordinal:249 1008:2f4d 0x00 +1 400 0 0x5dbe 1000:5dbe far-pointer-32 False internal entry-ordinal:266 1020:0b00 0x00 +1 401 0 0x5dc3 1000:5dc3 far-pointer-32 False internal entry-ordinal:248 1008:2f2f 0x00 +1 402 0 0x5dd2 1000:5dd2 far-pointer-32 False internal entry-ordinal:249 1008:2f4d 0x00 +1 403 0 0x5deb 1000:5deb far-pointer-32 False internal entry-ordinal:243 1008:2e92 0x00 +1 404 0 0x5df1 1000:5df1 far-pointer-32 False import-ordinal GDI.ordinal:33 GDI 33 0x01 +1 405 0 0x5dfc 1000:5dfc far-pointer-32 False import-ordinal GDI.ordinal:346 GDI 346 0x01 +1 406 0 0x5e1b 1000:5e1b far-pointer-32 False internal entry-ordinal:283 1020:1629 0x00 +1 407 0 0x5e2b 1000:5e2b far-pointer-32 False internal entry-ordinal:248 1008:2f2f 0x00 +1 408 0 0x5e45 1000:5e45 far-pointer-32 False internal entry-ordinal:243 1008:2e92 0x00 +1 409 0 0x5e4b 1000:5e4b far-pointer-32 False import-ordinal GDI.ordinal:33 GDI 33 0x01 +1 410 0 0x5e74 1000:5e74 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 411 0 0x5e83 1000:5e83 far-pointer-32 False import-ordinal GDI.ordinal:9 GDI 9 0x01 +1 412 0 0x5e8f 1000:5e8f far-pointer-32 False import-ordinal GDI.ordinal:346 GDI 346 0x01 +1 413 0 0x5e9c 1000:5e9c far-pointer-32 False import-ordinal GDI.ordinal:2 GDI 2 0x01 +1 414 0 0x5ea9 1000:5ea9 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 415 0 0x5eb2 1000:5eb2 far-pointer-32 False import-ordinal GDI.ordinal:69 GDI 69 0x01 +1 416 0 0x5ebb 1000:5ebb far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +1 417 0 0x5ec8 1000:5ec8 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 418 0 0x5ed1 1000:5ed1 far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +1 419 0 0x5ede 1000:5ede far-pointer-32 False import-ordinal USER.ordinal:282 USER 282 0x01 +1 420 0 0x5eea 1000:5eea far-pointer-32 False internal entry-ordinal:75 1008:00e2 0x00 +1 421 0 0x5ef4 1000:5ef4 far-pointer-32 False internal entry-ordinal:157 1018:0f38 0x00 +1 422 0 0x5f14 1000:5f14 far-pointer-32 False internal entry-ordinal:75 1008:00e2 0x00 +1 423 0 0x5f1e 1000:5f1e far-pointer-32 False internal entry-ordinal:157 1018:0f38 0x00 +1 424 0 0x5f4a 1000:5f4a far-pointer-32 False import-ordinal USER.ordinal:46 USER 46 0x01 +1 425 0 0x5f61 1000:5f61 far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 426 0 0x5f72 1000:5f72 far-pointer-32 False import-ordinal USER.ordinal:282 USER 282 0x01 +1 427 0 0x5f7d 1000:5f7d far-pointer-32 False import-ordinal USER.ordinal:283 USER 283 0x01 +1 428 0 0x5f85 1000:5f85 far-pointer-32 False import-ordinal GDI.ordinal:366 GDI 366 0x01 +1 429 0 0x5f92 1000:5f92 far-pointer-32 False import-ordinal USER.ordinal:282 USER 282 0x01 +1 430 0 0x5fa1 1000:5fa1 far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 431 0 0x5fcc 1000:5fcc far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 432 0 0x5fdd 1000:5fdd far-pointer-32 False import-ordinal USER.ordinal:282 USER 282 0x01 +1 433 0 0x5fe8 1000:5fe8 far-pointer-32 False import-ordinal USER.ordinal:283 USER 283 0x01 +1 434 0 0x5ff8 1000:5ff8 far-pointer-32 False import-ordinal USER.ordinal:282 USER 282 0x01 +1 435 0 0x6007 1000:6007 far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 436 0 0x601f 1000:601f far-pointer-32 False import-ordinal USER.ordinal:125 USER 125 0x01 +1 437 0 0x604e 1000:604e far-pointer-32 False internal entry-ordinal:172 1018:1274 0x00 +1 438 0 0x6055 1000:6055 far-pointer-32 False import-ordinal GDI.ordinal:87 GDI 87 0x01 +1 439 0 0x607a 1000:607a far-pointer-32 False internal entry-ordinal:294 1020:03ef 0x00 +1 440 0 0x6095 1000:6095 far-pointer-32 False internal entry-ordinal:170 1018:1106 0x00 +1 441 0 0x60da 1000:60da far-pointer-32 False import-ordinal USER.ordinal:22 USER 22 0x01 +1 442 0 0x610d 1000:610d far-pointer-32 False import-ordinal GDI.ordinal:69 GDI 69 0x01 +1 443 0 0x611a 1000:611a far-pointer-32 False internal entry-ordinal:171 1018:121b 0x00 +1 444 0 0x6121 1000:6121 far-pointer-32 False internal entry-ordinal:295 1020:0439 0x00 +1 445 0 0x6132 1000:6132 far-pointer-32 False internal entry-ordinal:180 1018:170c 0x00 +1 446 0 0x613e 1000:613e far-pointer-32 False import-ordinal USER.ordinal:173 USER 173 0x01 +1 447 0 0x6144 1000:6144 far-pointer-32 False import-ordinal USER.ordinal:69 USER 69 0x01 +1 448 0 0x6157 1000:6157 far-pointer-32 False internal entry-ordinal:95 1008:149d 0x00 +1 449 0 0x6166 1000:6166 far-pointer-32 False import-ordinal USER.ordinal:22 USER 22 0x01 +1 450 0 0x617c 1000:617c far-pointer-32 False import-ordinal USER.ordinal:282 USER 282 0x01 +1 451 0 0x6188 1000:6188 far-pointer-32 False import-ordinal GDI.ordinal:150 GDI 150 0x01 +1 452 0 0x6190 1000:6190 far-pointer-32 False import-ordinal USER.ordinal:283 USER 283 0x01 +1 453 0 0x6198 1000:6198 far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +1 454 0 0x61a7 1000:61a7 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 455 0 0x61c8 1000:61c8 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 456 0 0x61d3 1000:61d3 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 457 0 0x61db 1000:61db far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +1 458 0 0x61e8 1000:61e8 far-pointer-32 False import-ordinal USER.ordinal:282 USER 282 0x01 +1 459 0 0x61f4 1000:61f4 far-pointer-32 False import-ordinal USER.ordinal:173 USER 173 0x01 +1 460 0 0x61fa 1000:61fa far-pointer-32 False import-ordinal USER.ordinal:69 USER 69 0x01 +1 461 0 0x6206 1000:6206 far-pointer-32 False internal entry-ordinal:75 1008:00e2 0x00 +1 462 0 0x6210 1000:6210 far-pointer-32 False internal entry-ordinal:157 1018:0f38 0x00 +1 463 0 0x6230 1000:6230 far-pointer-32 False internal entry-ordinal:75 1008:00e2 0x00 +1 464 0 0x623a 1000:623a far-pointer-32 False internal entry-ordinal:157 1018:0f38 0x00 +1 465 0 0x6266 1000:6266 far-pointer-32 False import-ordinal USER.ordinal:46 USER 46 0x01 +1 466 0 0x627d 1000:627d far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 467 0 0x628e 1000:628e far-pointer-32 False import-ordinal USER.ordinal:282 USER 282 0x01 +1 468 0 0x6299 1000:6299 far-pointer-32 False import-ordinal USER.ordinal:283 USER 283 0x01 +1 469 0 0x62a1 1000:62a1 far-pointer-32 False import-ordinal GDI.ordinal:366 GDI 366 0x01 +1 470 0 0x62ae 1000:62ae far-pointer-32 False import-ordinal USER.ordinal:282 USER 282 0x01 +1 471 0 0x62bd 1000:62bd far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 472 0 0x62e8 1000:62e8 far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 473 0 0x62f9 1000:62f9 far-pointer-32 False import-ordinal USER.ordinal:282 USER 282 0x01 +1 474 0 0x6304 1000:6304 far-pointer-32 False import-ordinal USER.ordinal:283 USER 283 0x01 +1 475 0 0x6314 1000:6314 far-pointer-32 False import-ordinal USER.ordinal:282 USER 282 0x01 +1 476 0 0x6323 1000:6323 far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 477 0 0x633b 1000:633b far-pointer-32 False import-ordinal USER.ordinal:125 USER 125 0x01 +1 478 0 0x6372 1000:6372 far-pointer-32 False internal entry-ordinal:78 1008:07b6 0x00 +1 479 0 0x6386 1000:6386 far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +1 480 0 0x6454 1000:6454 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 481 0 0x6459 1000:6459 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 482 0 0x645e 1000:645e far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 483 0 0x64a8 1000:64a8 far-pointer-32 False internal entry-ordinal:280 1020:14a4 0x00 +1 484 0 0x64e7 1000:64e7 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 485 0 0x64f5 1000:64f5 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 486 0 0x64fa 1000:64fa far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 487 0 0x6520 1000:6520 far-pointer-32 False internal entry-ordinal:280 1020:14a4 0x00 +1 488 0 0x656f 1000:656f far-pointer-32 False internal entry-ordinal:73 1008:0002 0x00 +1 489 0 0x657b 1000:657b far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 490 0 0x6594 1000:6594 far-pointer-32 False internal entry-ordinal:35 1000:635c 0x00 +1 491 0 0x65a3 1000:65a3 far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 492 0 0x65f0 1000:65f0 far-pointer-32 False internal entry-ordinal:73 1008:0002 0x00 +1 493 0 0x65fd 1000:65fd far-pointer-32 False internal entry-ordinal:280 1020:14a4 0x00 +1 494 0 0x6616 1000:6616 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 495 0 0x6645 1000:6645 far-pointer-32 False internal entry-ordinal:280 1020:14a4 0x00 +1 496 0 0x665e 1000:665e far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 497 0 0x6691 1000:6691 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 498 0 0x6699 1000:6699 far-pointer-32 False internal entry-ordinal:293 1020:14c1 0x00 +1 499 0 0x66a6 1000:66a6 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 500 0 0x66b3 1000:66b3 far-pointer-32 False internal entry-ordinal:285 1020:0feb 0x00 +1 501 0 0x66bb 1000:66bb far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 502 0 0x66c0 1000:66c0 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 503 0 0x66de 1000:66de far-pointer-32 False internal entry-ordinal:280 1020:14a4 0x00 +1 504 0 0x66f7 1000:66f7 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 505 0 0x673b 1000:673b far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 506 0 0x6766 1000:6766 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 507 0 0x679a 1000:679a far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 508 0 0x67be 1000:67be far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 509 0 0x67e0 1000:67e0 far-pointer-32 False internal entry-ordinal:280 1020:14a4 0x00 +1 510 0 0x67f5 1000:67f5 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 511 0 0x67ff 1000:67ff far-pointer-32 False internal entry-ordinal:280 1020:14a4 0x00 +1 512 0 0x6814 1000:6814 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 513 0 0x681f 1000:681f far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 514 0 0x6883 1000:6883 far-pointer-32 False internal entry-ordinal:280 1020:14a4 0x00 +1 515 0 0x6896 1000:6896 far-pointer-32 False internal entry-ordinal:73 1008:0002 0x00 +1 516 0 0x68b3 1000:68b3 far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 517 0 0x68c8 1000:68c8 far-pointer-32 False internal entry-ordinal:79 1008:0837 0x00 +1 518 0 0x68da 1000:68da far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +1 519 0 0x68e9 1000:68e9 far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 520 0 0x6942 1000:6942 far-pointer-32 False internal entry-ordinal:73 1008:0002 0x00 +1 521 0 0x69f0 1000:69f0 far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 522 0 0x6a2d 1000:6a2d far-pointer-32 False internal entry-ordinal:80 1008:08bb 0x00 +1 523 0 0x6a4a 1000:6a4a far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +1 524 0 0x6a54 1000:6a54 far-pointer-32 False internal entry-ordinal:84 1008:0dbd 0x00 +1 525 0 0x6a63 1000:6a63 far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 526 0 0x6a75 1000:6a75 far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 527 0 0x6a8b 1000:6a8b far-pointer-32 False internal entry-ordinal:79 1008:0837 0x00 +1 528 0 0x6a9e 1000:6a9e far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +1 529 0 0x6aaa 1000:6aaa far-pointer-32 False internal entry-ordinal:82 1008:0996 0x00 +1 530 0 0x6ab4 1000:6ab4 far-pointer-32 False internal entry-ordinal:83 1008:0b9e 0x00 +1 531 0 0x6ac3 1000:6ac3 far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 532 0 0x6b42 1000:6b42 far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +1 533 0 0x6b52 1000:6b52 far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +1 534 0 0x6b66 1000:6b66 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 535 0 0x6b7a 1000:6b7a far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 536 0 0x6ba2 1000:6ba2 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 537 0 0x6bb2 1000:6bb2 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 538 0 0x6bc2 1000:6bc2 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 539 0 0x6bce 1000:6bce far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +1 540 0 0x6bda 1000:6bda far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +1 541 0 0x6bf0 1000:6bf0 far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +1 542 0 0x6c0d 1000:6c0d far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 543 0 0x6c5a 1000:6c5a far-pointer-32 False internal entry-ordinal:24 1000:6073 0x00 +1 544 0 0x6c80 1000:6c80 far-pointer-32 False internal entry-ordinal:152 1018:0e9e 0x00 +1 545 0 0x6cb5 1000:6cb5 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 546 0 0x6cf3 1000:6cf3 far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 547 0 0x6d1e 1000:6d1e far-pointer-32 False internal entry-ordinal:36 1000:6b37 0x00 +1 548 0 0x6d32 1000:6d32 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 549 0 0x6d4d 1000:6d4d far-pointer-32 False internal entry-ordinal:36 1000:6b37 0x00 +1 550 0 0x6d61 1000:6d61 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 551 0 0x6d7c 1000:6d7c far-pointer-32 False internal entry-ordinal:36 1000:6b37 0x00 +1 552 0 0x6d90 1000:6d90 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 553 0 0x6dab 1000:6dab far-pointer-32 False internal entry-ordinal:36 1000:6b37 0x00 +1 554 0 0x6dbf 1000:6dbf far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 555 0 0x6dda 1000:6dda far-pointer-32 False internal entry-ordinal:36 1000:6b37 0x00 +1 556 0 0x6dee 1000:6dee far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 557 0 0x6e09 1000:6e09 far-pointer-32 False internal entry-ordinal:36 1000:6b37 0x00 +1 558 0 0x6e1d 1000:6e1d far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 559 0 0x6e39 1000:6e39 far-pointer-32 False internal entry-ordinal:36 1000:6b37 0x00 +1 560 0 0x6e4d 1000:6e4d far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 561 0 0x6e69 1000:6e69 far-pointer-32 False internal entry-ordinal:36 1000:6b37 0x00 +1 562 0 0x6e7c 1000:6e7c far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 563 0 0x6e98 1000:6e98 far-pointer-32 False internal entry-ordinal:36 1000:6b37 0x00 +1 564 0 0x6eab 1000:6eab far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 565 0 0x6ec7 1000:6ec7 far-pointer-32 False internal entry-ordinal:36 1000:6b37 0x00 +1 566 0 0x6ed2 1000:6ed2 far-pointer-32 False internal entry-ordinal:36 1000:6b37 0x00 +1 567 0 0x6ee1 1000:6ee1 far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 568 0 0x6f37 1000:6f37 far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 569 0 0x6f42 1000:6f42 far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +1 570 0 0x6f4d 1000:6f4d far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +1 571 0 0x6f5c 1000:6f5c far-pointer-32 False import-ordinal GDI.ordinal:51 GDI 51 0x01 +1 572 0 0x6f6b 1000:6f6b far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 573 0 0x6f79 1000:6f79 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 574 0 0x6fb1 1000:6fb1 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 575 0 0x6fbe 1000:6fbe far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 576 0 0x6fcd 1000:6fcd far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 577 0 0x6fe9 1000:6fe9 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 578 0 0x6ff5 1000:6ff5 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 579 0 0x7111 1000:7111 far-pointer-32 False internal entry-ordinal:46 1000:7e92 0x00 +1 580 0 0x7126 1000:7126 far-pointer-32 False internal entry-ordinal:73 1008:0002 0x00 +1 581 0 0x729f 1000:729f far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 582 0 0x72bf 1000:72bf far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 583 0 0x72e6 1000:72e6 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 584 0 0x7306 1000:7306 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 585 0 0x732d 1000:732d far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 586 0 0x734d 1000:734d far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 587 0 0x7374 1000:7374 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 588 0 0x7394 1000:7394 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 589 0 0x73bb 1000:73bb far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 590 0 0x73db 1000:73db far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 591 0 0x73f7 1000:73f7 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 592 0 0x7402 1000:7402 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 593 0 0x740d 1000:740d far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 594 0 0x7415 1000:7415 far-pointer-32 False import-ordinal GDI.ordinal:69 GDI 69 0x01 +1 595 0 0x741d 1000:741d far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +1 596 0 0x7425 1000:7425 far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +1 597 0 0x7438 1000:7438 far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 598 0 0x7450 1000:7450 far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 599 0 0x745b 1000:745b far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +1 600 0 0x746a 1000:746a far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 601 0 0x7475 1000:7475 far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +1 602 0 0x7484 1000:7484 far-pointer-32 False import-ordinal GDI.ordinal:51 GDI 51 0x01 +1 603 0 0x7492 1000:7492 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 604 0 0x74b1 1000:74b1 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 605 0 0x74bd 1000:74bd far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 606 0 0x74e5 1000:74e5 far-pointer-32 False internal entry-ordinal:73 1008:0002 0x00 +1 607 0 0x74f1 1000:74f1 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 608 0 0x750e 1000:750e far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 609 0 0x7519 1000:7519 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 610 0 0x7533 1000:7533 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 611 0 0x7550 1000:7550 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 612 0 0x7562 1000:7562 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 613 0 0x757c 1000:757c far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 614 0 0x7599 1000:7599 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 615 0 0x75ab 1000:75ab far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 616 0 0x75cb 1000:75cb far-pointer-32 False internal entry-ordinal:90 1008:118f 0x00 +1 617 0 0x75e8 1000:75e8 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 618 0 0x7605 1000:7605 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 619 0 0x7627 1000:7627 far-pointer-32 False internal entry-ordinal:73 1008:0002 0x00 +1 620 0 0x7645 1000:7645 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 621 0 0x7662 1000:7662 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 622 0 0x768a 1000:768a far-pointer-32 False internal entry-ordinal:73 1008:0002 0x00 +1 623 0 0x76a7 1000:76a7 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 624 0 0x76d3 1000:76d3 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 625 0 0x76eb 1000:76eb far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 626 0 0x7707 1000:7707 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 627 0 0x771f 1000:771f far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 628 0 0x7742 1000:7742 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 629 0 0x7760 1000:7760 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 630 0 0x7772 1000:7772 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 631 0 0x7792 1000:7792 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 632 0 0x77b0 1000:77b0 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 633 0 0x77c2 1000:77c2 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 634 0 0x77f8 1000:77f8 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 635 0 0x7816 1000:7816 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 636 0 0x7828 1000:7828 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 637 0 0x7848 1000:7848 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 638 0 0x7865 1000:7865 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 639 0 0x7877 1000:7877 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 640 0 0x7898 1000:7898 far-pointer-32 False internal entry-ordinal:90 1008:118f 0x00 +1 641 0 0x78b5 1000:78b5 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 642 0 0x78de 1000:78de far-pointer-32 False internal entry-ordinal:73 1008:0002 0x00 +1 643 0 0x78fb 1000:78fb far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 644 0 0x7932 1000:7932 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 645 0 0x7950 1000:7950 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 646 0 0x7962 1000:7962 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 647 0 0x7982 1000:7982 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 648 0 0x79a0 1000:79a0 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 649 0 0x79b2 1000:79b2 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 650 0 0x79d0 1000:79d0 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 651 0 0x79e8 1000:79e8 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 652 0 0x7a04 1000:7a04 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 653 0 0x7a1c 1000:7a1c far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 654 0 0x7a60 1000:7a60 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 655 0 0x7a7d 1000:7a7d far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 656 0 0x7aa0 1000:7aa0 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 657 0 0x7abe 1000:7abe far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 658 0 0x7ad0 1000:7ad0 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 659 0 0x7af0 1000:7af0 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 660 0 0x7b0d 1000:7b0d far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 661 0 0x7b1f 1000:7b1f far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 662 0 0x7b46 1000:7b46 far-pointer-32 False internal entry-ordinal:90 1008:118f 0x00 +1 663 0 0x7b64 1000:7b64 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 664 0 0x7b82 1000:7b82 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 665 0 0x7ba0 1000:7ba0 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 666 0 0x7bbd 1000:7bbd far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 667 0 0x7be6 1000:7be6 far-pointer-32 False internal entry-ordinal:73 1008:0002 0x00 +1 668 0 0x7c04 1000:7c04 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 669 0 0x7c22 1000:7c22 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 670 0 0x7c3f 1000:7c3f far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 671 0 0x7c5c 1000:7c5c far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 672 0 0x7c85 1000:7c85 far-pointer-32 False internal entry-ordinal:73 1008:0002 0x00 +1 673 0 0x7ca3 1000:7ca3 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 674 0 0x7cc1 1000:7cc1 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 675 0 0x7ce1 1000:7ce1 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 676 0 0x7cfe 1000:7cfe far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 677 0 0x7d10 1000:7d10 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 678 0 0x7d30 1000:7d30 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 679 0 0x7d4d 1000:7d4d far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 680 0 0x7d5f 1000:7d5f far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 681 0 0x7d7a 1000:7d7a far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 682 0 0x7d86 1000:7d86 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 683 0 0x7da2 1000:7da2 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 684 0 0x7dad 1000:7dad far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 685 0 0x7dc9 1000:7dc9 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 686 0 0x7dd4 1000:7dd4 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 687 0 0x7ddf 1000:7ddf far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 688 0 0x7de7 1000:7de7 far-pointer-32 False import-ordinal GDI.ordinal:69 GDI 69 0x01 +1 689 0 0x7def 1000:7def far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +1 690 0 0x7df7 1000:7df7 far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +1 691 0 0x7e0a 1000:7e0a far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 692 0 0x7e45 1000:7e45 far-pointer-32 False internal entry-ordinal:41 1000:b3f3 0x00 +1 693 0 0x7e53 1000:7e53 far-pointer-32 False internal entry-ordinal:42 1000:b30b 0x00 +1 694 0 0x7e7c 1000:7e7c far-pointer-32 False internal entry-ordinal:42 1000:b30b 0x00 +1 695 0 0x7e8a 1000:7e8a far-pointer-32 False internal entry-ordinal:41 1000:b3f3 0x00 +1 696 0 0x7ebf 1000:7ebf far-pointer-32 False internal entry-ordinal:42 1000:b30b 0x00 +1 697 0 0x7ed1 1000:7ed1 far-pointer-32 False internal entry-ordinal:41 1000:b3f3 0x00 +1 698 0 0x7ee0 1000:7ee0 far-pointer-32 False internal entry-ordinal:73 1008:0002 0x00 +1 699 0 0x7f05 1000:7f05 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 700 0 0x8008 1000:8008 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 701 0 0x80f7 1000:80f7 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 702 0 0x80fc 1000:80fc far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 703 0 0x8101 1000:8101 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 704 0 0x8172 1000:8172 far-pointer-32 False internal entry-ordinal:44 1000:c36b 0x00 +1 705 0 0x819c 1000:819c far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 706 0 0x81be 1000:81be far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 707 0 0x81e2 1000:81e2 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 708 0 0x81fe 1000:81fe far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 709 0 0x8215 1000:8215 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 710 0 0x8228 1000:8228 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 711 0 0x8250 1000:8250 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 712 0 0x8274 1000:8274 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 713 0 0x828b 1000:828b far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 714 0 0x829e 1000:829e far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 715 0 0x82c5 1000:82c5 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 716 0 0x82e7 1000:82e7 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 717 0 0x830b 1000:830b far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 718 0 0x8327 1000:8327 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 719 0 0x833e 1000:833e far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 720 0 0x8351 1000:8351 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 721 0 0x8379 1000:8379 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 722 0 0x839d 1000:839d far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 723 0 0x83b4 1000:83b4 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 724 0 0x83c7 1000:83c7 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 725 0 0x8463 1000:8463 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 726 0 0x8470 1000:8470 far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 727 0 0x8475 1000:8475 far-pointer-32 False internal entry-ordinal:291 1020:0ff1 0x00 +1 728 0 0x848a 1000:848a far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 729 0 0x8497 1000:8497 far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 730 0 0x849c 1000:849c far-pointer-32 False internal entry-ordinal:291 1020:0ff1 0x00 +1 731 0 0x84a4 1000:84a4 far-pointer-32 False internal entry-ordinal:284 1020:0fe5 0x00 +1 732 0 0x84a9 1000:84a9 far-pointer-32 False internal entry-ordinal:292 1020:10be 0x00 +1 733 0 0x84b6 1000:84b6 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 734 0 0x84bb 1000:84bb far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 735 0 0x8583 1000:8583 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 736 0 0x8588 1000:8588 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 737 0 0x858d 1000:858d far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 738 0 0x8592 1000:8592 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 739 0 0x85b9 1000:85b9 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 740 0 0x85be 1000:85be far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 741 0 0x85c3 1000:85c3 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 742 0 0x85c8 1000:85c8 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 743 0 0x863d 1000:863d far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 744 0 0x864b 1000:864b far-pointer-32 False internal entry-ordinal:288 1020:1007 0x00 +1 745 0 0x86ce 1000:86ce far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 746 0 0x86dc 1000:86dc far-pointer-32 False internal entry-ordinal:288 1020:1007 0x00 +1 747 0 0x86ef 1000:86ef far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 748 0 0x871a 1000:871a far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 749 0 0x871f 1000:871f far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 750 0 0x8727 1000:8727 far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 751 0 0x872c 1000:872c far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 752 0 0x8793 1000:8793 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 753 0 0x8798 1000:8798 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 754 0 0x879d 1000:879d far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 755 0 0x87d5 1000:87d5 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 756 0 0x87ee 1000:87ee far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 757 0 0x87fc 1000:87fc far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 758 0 0x8815 1000:8815 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 759 0 0x8823 1000:8823 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 760 0 0x882b 1000:882b far-pointer-32 False internal entry-ordinal:284 1020:0fe5 0x00 +1 761 0 0x8837 1000:8837 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 762 0 0x883f 1000:883f far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 763 0 0x8844 1000:8844 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 764 0 0x885d 1000:885d far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 765 0 0x8876 1000:8876 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 766 0 0x8884 1000:8884 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 767 0 0x889d 1000:889d far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 768 0 0x88ab 1000:88ab far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 769 0 0x88b3 1000:88b3 far-pointer-32 False internal entry-ordinal:285 1020:0feb 0x00 +1 770 0 0x88bb 1000:88bb far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 771 0 0x88c0 1000:88c0 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 772 0 0x88d1 1000:88d1 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 773 0 0x88df 1000:88df far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 774 0 0x88e7 1000:88e7 far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 775 0 0x88ec 1000:88ec far-pointer-32 False internal entry-ordinal:292 1020:10be 0x00 +1 776 0 0x88f8 1000:88f8 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 777 0 0x8906 1000:8906 far-pointer-32 False internal entry-ordinal:284 1020:0fe5 0x00 +1 778 0 0x891a 1000:891a far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 779 0 0x8939 1000:8939 far-pointer-32 False internal entry-ordinal:284 1020:0fe5 0x00 +1 780 0 0x8941 1000:8941 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 781 0 0x8946 1000:8946 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 782 0 0x8960 1000:8960 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 783 0 0x896e 1000:896e far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 784 0 0x8973 1000:8973 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 785 0 0x898a 1000:898a far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 786 0 0x8998 1000:8998 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 787 0 0x89a6 1000:89a6 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 788 0 0x89b4 1000:89b4 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 789 0 0x89c2 1000:89c2 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 790 0 0x89ca 1000:89ca far-pointer-32 False internal entry-ordinal:285 1020:0feb 0x00 +1 791 0 0x89d2 1000:89d2 far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 792 0 0x89d7 1000:89d7 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 793 0 0x89fd 1000:89fd far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 794 0 0x8a0b 1000:8a0b far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 795 0 0x8a19 1000:8a19 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 796 0 0x8a27 1000:8a27 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 797 0 0x8a35 1000:8a35 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 798 0 0x8a3d 1000:8a3d far-pointer-32 False internal entry-ordinal:284 1020:0fe5 0x00 +1 799 0 0x8a45 1000:8a45 far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 800 0 0x8a4a 1000:8a4a far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 801 0 0x8a74 1000:8a74 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 802 0 0x8a95 1000:8a95 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 803 0 0x8a9a 1000:8a9a far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 804 0 0x8aa2 1000:8aa2 far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 805 0 0x8aa7 1000:8aa7 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 806 0 0x8ac8 1000:8ac8 far-pointer-32 False internal entry-ordinal:38 1000:beff 0x00 +1 807 0 0x8aed 1000:8aed far-pointer-32 False internal entry-ordinal:45 1000:c426 0x00 +1 808 0 0x8b21 1000:8b21 far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 809 0 0x8b83 1000:8b83 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 810 0 0x8b88 1000:8b88 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 811 0 0x8b8d 1000:8b8d far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 812 0 0x8bc7 1000:8bc7 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 813 0 0x8bcc 1000:8bcc far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 814 0 0x8bd1 1000:8bd1 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 815 0 0x8c0b 1000:8c0b far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 816 0 0x8c10 1000:8c10 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 817 0 0x8c15 1000:8c15 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 818 0 0x8c4f 1000:8c4f far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 819 0 0x8c54 1000:8c54 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 820 0 0x8c59 1000:8c59 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 821 0 0x8e27 1000:8e27 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 822 0 0x8e2c 1000:8e2c far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 823 0 0x8e31 1000:8e31 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 824 0 0x8e6d 1000:8e6d far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 825 0 0x8e72 1000:8e72 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 826 0 0x8e77 1000:8e77 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 827 0 0x8eb3 1000:8eb3 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 828 0 0x8eb8 1000:8eb8 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 829 0 0x8ebd 1000:8ebd far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 830 0 0x8ef9 1000:8ef9 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 831 0 0x8efe 1000:8efe far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 832 0 0x8f03 1000:8f03 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 833 0 0x8f3f 1000:8f3f far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 834 0 0x8f44 1000:8f44 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 835 0 0x8f49 1000:8f49 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 836 0 0x8f85 1000:8f85 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 837 0 0x8f8a 1000:8f8a far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 838 0 0x8f8f 1000:8f8f far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 839 0 0x8fcb 1000:8fcb far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 840 0 0x8fd0 1000:8fd0 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 841 0 0x8fd5 1000:8fd5 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 842 0 0x9013 1000:9013 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 843 0 0x9018 1000:9018 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 844 0 0x901d 1000:901d far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 845 0 0x905b 1000:905b far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 846 0 0x9060 1000:9060 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 847 0 0x9065 1000:9065 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 848 0 0x90a3 1000:90a3 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 849 0 0x90a8 1000:90a8 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 850 0 0x90ad 1000:90ad far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 851 0 0x92bb 1000:92bb far-pointer-32 False internal entry-ordinal:80 1008:08bb 0x00 +1 852 0 0x92ce 1000:92ce far-pointer-32 False internal entry-ordinal:79 1008:0837 0x00 +1 853 0 0x92df 1000:92df far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +1 854 0 0x92fe 1000:92fe far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 855 0 0x933c 1000:933c far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 856 0 0x937a 1000:937a far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 857 0 0x93b8 1000:93b8 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 858 0 0x95b2 1000:95b2 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 859 0 0x95ee 1000:95ee far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 860 0 0x962a 1000:962a far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 861 0 0x9666 1000:9666 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 862 0 0x96a2 1000:96a2 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 863 0 0x96de 1000:96de far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 864 0 0x971a 1000:971a far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 865 0 0x9754 1000:9754 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 866 0 0x978e 1000:978e far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 867 0 0x97c8 1000:97c8 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 868 0 0x99ab 1000:99ab far-pointer-32 False internal entry-ordinal:80 1008:08bb 0x00 +1 869 0 0x99bf 1000:99bf far-pointer-32 False internal entry-ordinal:79 1008:0837 0x00 +1 870 0 0x99d1 1000:99d1 far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +1 871 0 0x99e8 1000:99e8 far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 872 0 0x9a1d 1000:9a1d far-pointer-32 False internal entry-ordinal:49 1000:7ed9 0x00 +1 873 0 0x9a29 1000:9a29 far-pointer-32 False internal entry-ordinal:51 1000:8b0d 0x00 +1 874 0 0x9a58 1000:9a58 far-pointer-32 False internal entry-ordinal:49 1000:7ed9 0x00 +1 875 0 0x9a64 1000:9a64 far-pointer-32 False internal entry-ordinal:51 1000:8b0d 0x00 +1 876 0 0x9a91 1000:9a91 far-pointer-32 False internal entry-ordinal:49 1000:7ed9 0x00 +1 877 0 0x9a9d 1000:9a9d far-pointer-32 False internal entry-ordinal:51 1000:8b0d 0x00 +1 878 0 0x9acc 1000:9acc far-pointer-32 False internal entry-ordinal:49 1000:7ed9 0x00 +1 879 0 0x9ad8 1000:9ad8 far-pointer-32 False internal entry-ordinal:51 1000:8b0d 0x00 +1 880 0 0x9be2 1000:9be2 far-pointer-32 False import-ordinal USER.ordinal:33 USER 33 0x01 +1 881 0 0x9bf2 1000:9bf2 far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 882 0 0x9c02 1000:9c02 far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +1 883 0 0x9c12 1000:9c12 far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +1 884 0 0x9c22 1000:9c22 far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +1 885 0 0x9c36 1000:9c36 far-pointer-32 False import-ordinal GDI.ordinal:51 GDI 51 0x01 +1 886 0 0x9c54 1000:9c54 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 887 0 0x9c82 1000:9c82 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 888 0 0x9cf3 1000:9cf3 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 889 0 0x9d07 1000:9d07 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 890 0 0x9d34 1000:9d34 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 891 0 0x9d4b 1000:9d4b far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 892 0 0x9d71 1000:9d71 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 893 0 0x9d88 1000:9d88 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 894 0 0x9dae 1000:9dae far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 895 0 0x9e06 1000:9e06 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 896 0 0x9e16 1000:9e16 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 897 0 0x9e26 1000:9e26 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 898 0 0x9e36 1000:9e36 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 899 0 0x9e42 1000:9e42 far-pointer-32 False import-ordinal GDI.ordinal:69 GDI 69 0x01 +1 900 0 0x9e4e 1000:9e4e far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +1 901 0 0x9e5a 1000:9e5a far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +1 902 0 0x9e66 1000:9e66 far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +1 903 0 0x9e7d 1000:9e7d far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 904 0 0x9f6b 1000:9f6b far-pointer-32 False internal entry-ordinal:54 1000:9bca 0x00 +1 905 0 0x9f8b 1000:9f8b far-pointer-32 False import-ordinal USER.ordinal:33 USER 33 0x01 +1 906 0 0x9f9b 1000:9f9b far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 907 0 0x9fab 1000:9fab far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +1 908 0 0x9fbb 1000:9fbb far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +1 909 0 0x9fcb 1000:9fcb far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +1 910 0 0x9fdf 1000:9fdf far-pointer-32 False import-ordinal GDI.ordinal:51 GDI 51 0x01 +1 911 0 0x9ffd 1000:9ffd far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 912 0 0xa02b 1000:a02b far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 913 0 0xa05d 1000:a05d far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 914 0 0xa089 1000:a089 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 915 0 0xa1fc 1000:a1fc far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 916 0 0xa210 1000:a210 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 917 0 0xa23d 1000:a23d far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 918 0 0xa254 1000:a254 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 919 0 0xa27a 1000:a27a far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 920 0 0xa291 1000:a291 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 921 0 0xa2b7 1000:a2b7 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 922 0 0xa30f 1000:a30f far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 923 0 0xa31f 1000:a31f far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 924 0 0xa32f 1000:a32f far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 925 0 0xa33f 1000:a33f far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 926 0 0xa34b 1000:a34b far-pointer-32 False import-ordinal GDI.ordinal:69 GDI 69 0x01 +1 927 0 0xa357 1000:a357 far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +1 928 0 0xa363 1000:a363 far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +1 929 0 0xa36f 1000:a36f far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +1 930 0 0xa386 1000:a386 far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 931 0 0xa3a6 1000:a3a6 far-pointer-32 False import-ordinal USER.ordinal:33 USER 33 0x01 +1 932 0 0xa3b6 1000:a3b6 far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 933 0 0xa3c6 1000:a3c6 far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +1 934 0 0xa3d6 1000:a3d6 far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +1 935 0 0xa3e6 1000:a3e6 far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +1 936 0 0xa3fa 1000:a3fa far-pointer-32 False import-ordinal GDI.ordinal:51 GDI 51 0x01 +1 937 0 0xa422 1000:a422 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 938 0 0xa453 1000:a453 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 939 0 0xa4e6 1000:a4e6 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 940 0 0xa4fa 1000:a4fa far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 941 0 0xa527 1000:a527 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 942 0 0xa585 1000:a585 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 943 0 0xa595 1000:a595 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 944 0 0xa5a5 1000:a5a5 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 945 0 0xa5b5 1000:a5b5 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 946 0 0xa5c1 1000:a5c1 far-pointer-32 False import-ordinal GDI.ordinal:69 GDI 69 0x01 +1 947 0 0xa5cd 1000:a5cd far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +1 948 0 0xa5d9 1000:a5d9 far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +1 949 0 0xa5e5 1000:a5e5 far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +1 950 0 0xa5fc 1000:a5fc far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 951 0 0xa614 1000:a614 far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 952 0 0xa641 1000:a641 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 953 0 0xa6a3 1000:a6a3 far-pointer-32 False internal entry-ordinal:79 1008:0837 0x00 +1 954 0 0xa6c3 1000:a6c3 far-pointer-32 False internal entry-ordinal:80 1008:08bb 0x00 +1 955 0 0xa6e1 1000:a6e1 far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +1 956 0 0xa706 1000:a706 far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 957 0 0xa744 1000:a744 far-pointer-32 False internal entry-ordinal:43 1000:7e12 0x00 +1 958 0 0xa7a2 1000:a7a2 far-pointer-32 False internal entry-ordinal:41 1000:b3f3 0x00 +1 959 0 0xa7b5 1000:a7b5 far-pointer-32 False internal entry-ordinal:40 1000:bda2 0x00 +1 960 0 0xa825 1000:a825 far-pointer-32 False internal entry-ordinal:39 1000:bc36 0x00 +1 961 0 0xa860 1000:a860 far-pointer-32 False internal entry-ordinal:58 1000:a604 0x00 +1 962 0 0xa8dc 1000:a8dc far-pointer-32 False internal entry-ordinal:46 1000:7e92 0x00 +1 963 0 0xa8f6 1000:a8f6 far-pointer-32 False import-ordinal KERNEL.ordinal:83 KERNEL 83 0x01 +1 964 0 0xa912 1000:a912 far-pointer-32 False internal entry-ordinal:279 1020:16c9 0x00 +1 965 0 0xa957 1000:a957 far-pointer-32 False internal entry-ordinal:246 1008:2ee5 0x00 +1 966 0 0xa96c 1000:a96c far-pointer-32 False import-ordinal KERNEL.ordinal:86 KERNEL 86 0x01 +1 967 0 0xa97b 1000:a97b far-pointer-32 False import-ordinal KERNEL.ordinal:86 KERNEL 86 0x01 +1 968 0 0xa98c 1000:a98c far-pointer-32 False import-ordinal KERNEL.ordinal:86 KERNEL 86 0x01 +1 969 0 0xa994 1000:a994 far-pointer-32 False import-ordinal KERNEL.ordinal:81 KERNEL 81 0x01 +1 970 0 0xa9ac 1000:a9ac far-pointer-32 False import-ordinal KERNEL.ordinal:85 KERNEL 85 0x01 +1 971 0 0xa9c1 1000:a9c1 far-pointer-32 False import-ordinal KERNEL.ordinal:85 KERNEL 85 0x01 +1 972 0 0xa9dc 1000:a9dc far-pointer-32 False import-ordinal KERNEL.ordinal:82 KERNEL 82 0x01 +1 973 0 0xa9ee 1000:a9ee far-pointer-32 False internal entry-ordinal:266 1020:0b00 0x00 +1 974 0 0xaa00 1000:aa00 far-pointer-32 False internal entry-ordinal:266 1020:0b00 0x00 +1 975 0 0xaa05 1000:aa05 far-pointer-32 False internal entry-ordinal:265 1020:0ac3 0x00 +1 976 0 0xaa1a 1000:aa1a far-pointer-32 False import-ordinal KERNEL.ordinal:82 KERNEL 82 0x01 +1 977 0 0xaa2a 1000:aa2a far-pointer-32 False import-ordinal KERNEL.ordinal:82 KERNEL 82 0x01 +1 978 0 0xaa64 1000:aa64 far-pointer-32 False import-ordinal KERNEL.ordinal:81 KERNEL 81 0x01 +1 979 0 0xaa8a 1000:aa8a far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 980 0 0xaaad 1000:aaad far-pointer-32 False internal entry-ordinal:246 1008:2ee5 0x00 +1 981 0 0xaabc 1000:aabc far-pointer-32 False internal entry-ordinal:246 1008:2ee5 0x00 +1 982 0 0xaacb 1000:aacb far-pointer-32 False internal entry-ordinal:246 1008:2ee5 0x00 +1 983 0 0xaada 1000:aada far-pointer-32 False internal entry-ordinal:246 1008:2ee5 0x00 +1 984 0 0xaae9 1000:aae9 far-pointer-32 False internal entry-ordinal:246 1008:2ee5 0x00 +1 985 0 0xaaf8 1000:aaf8 far-pointer-32 False internal entry-ordinal:246 1008:2ee5 0x00 +1 986 0 0xab07 1000:ab07 far-pointer-32 False internal entry-ordinal:246 1008:2ee5 0x00 +1 987 0 0xab16 1000:ab16 far-pointer-32 False internal entry-ordinal:246 1008:2ee5 0x00 +1 988 0 0xab25 1000:ab25 far-pointer-32 False internal entry-ordinal:246 1008:2ee5 0x00 +1 989 0 0xab34 1000:ab34 far-pointer-32 False internal entry-ordinal:246 1008:2ee5 0x00 +1 990 0 0xab5a 1000:ab5a far-pointer-32 False internal entry-ordinal:246 1008:2ee5 0x00 +1 991 0 0xab8a 1000:ab8a far-pointer-32 False internal entry-ordinal:106 1008:1607 0x00 +1 992 0 0xabb3 1000:abb3 far-pointer-32 False internal entry-ordinal:15 1000:5aea 0x00 +1 993 0 0xabdd 1000:abdd far-pointer-32 False internal entry-ordinal:152 1018:0e9e 0x00 +1 994 0 0xac6f 1000:ac6f far-pointer-32 False internal entry-ordinal:259 1020:0891 0x00 +1 995 0 0xaca6 1000:aca6 far-pointer-32 False internal entry-ordinal:63 1000:ab3c 0x00 +1 996 0 0xacaf 1000:acaf far-pointer-32 False internal entry-ordinal:61 1000:a8ea 0x00 +1 997 0 0xacd2 1000:acd2 far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 998 0 0xad18 1000:ad18 far-pointer-32 False internal entry-ordinal:79 1008:0837 0x00 +1 999 0 0xad37 1000:ad37 far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +1 1000 0 0xad58 1000:ad58 far-pointer-32 False internal entry-ordinal:39 1000:bc36 0x00 +1 1001 0 0xad84 1000:ad84 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 1002 0 0xad8f 1000:ad8f far-pointer-32 False internal entry-ordinal:40 1000:bda2 0x00 +1 1003 0 0xada6 1000:ada6 far-pointer-32 False internal entry-ordinal:33 1000:0002 0x00 +1 1004 0 0xadb7 1000:adb7 far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +1 1005 0 0xadd5 1000:add5 far-pointer-32 False internal entry-ordinal:79 1008:0837 0x00 +1 1006 0 0xadf3 1000:adf3 far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +1 1007 0 0xae02 1000:ae02 far-pointer-32 False internal entry-ordinal:39 1000:bc36 0x00 +1 1008 0 0xae20 1000:ae20 far-pointer-32 False internal entry-ordinal:80 1008:08bb 0x00 +1 1009 0 0xae3e 1000:ae3e far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +1 1010 0 0xae66 1000:ae66 far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 1011 0 0xae92 1000:ae92 far-pointer-32 False internal entry-ordinal:57 1000:a38e 0x00 +1 1012 0 0xaef3 1000:aef3 far-pointer-32 False internal entry-ordinal:41 1000:b3f3 0x00 +1 1013 0 0xaf00 1000:af00 far-pointer-32 False internal entry-ordinal:66 1000:bdde 0x00 +1 1014 0 0xaf20 1000:af20 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1015 0 0xaf2e 1000:af2e far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1016 0 0xaf33 1000:af33 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1017 0 0xaf88 1000:af88 far-pointer-32 False internal entry-ordinal:73 1008:0002 0x00 +1 1018 0 0xaf93 1000:af93 far-pointer-32 False internal entry-ordinal:57 1000:a38e 0x00 +1 1019 0 0xafe0 1000:afe0 far-pointer-32 False internal entry-ordinal:62 1000:a99c 0x00 +1 1020 0 0xafe9 1000:afe9 far-pointer-32 False internal entry-ordinal:64 1000:abe5 0x00 +1 1021 0 0xb12b 1000:b12b far-pointer-32 False internal entry-ordinal:43 1000:7e12 0x00 +1 1022 0 0xb151 1000:b151 far-pointer-32 False internal entry-ordinal:46 1000:7e92 0x00 +1 1023 0 0xb183 1000:b183 far-pointer-32 False internal entry-ordinal:42 1000:b30b 0x00 +1 1024 0 0xb1de 1000:b1de far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 1025 0 0xb1ec 1000:b1ec far-pointer-32 False internal entry-ordinal:84 1008:0dbd 0x00 +1 1026 0 0xb1f8 1000:b1f8 far-pointer-32 False internal entry-ordinal:83 1008:0b9e 0x00 +1 1027 0 0xb20b 1000:b20b far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 1028 0 0xb214 1000:b214 far-pointer-32 False internal entry-ordinal:65 1000:acc2 0x00 +1 1029 0 0xb23a 1000:b23a far-pointer-32 False internal entry-ordinal:55 1000:9e85 0x00 +1 1030 0 0xb24a 1000:b24a far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 1031 0 0xb25f 1000:b25f far-pointer-32 False internal entry-ordinal:80 1008:08bb 0x00 +1 1032 0 0xb271 1000:b271 far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +1 1033 0 0xb284 1000:b284 far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 1034 0 0xb28d 1000:b28d far-pointer-32 False internal entry-ordinal:58 1000:a604 0x00 +1 1035 0 0xb29d 1000:b29d far-pointer-32 False internal entry-ordinal:59 1000:a70e 0x00 +1 1036 0 0xb2c0 1000:b2c0 far-pointer-32 False internal entry-ordinal:63 1000:ab3c 0x00 +1 1037 0 0xb2e5 1000:b2e5 far-pointer-32 False internal entry-ordinal:79 1008:0837 0x00 +1 1038 0 0xb303 1000:b303 far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +1 1039 0 0xb31b 1000:b31b far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 1040 0 0xb348 1000:b348 far-pointer-32 False internal entry-ordinal:68 1000:b2c8 0x00 +1 1041 0 0xb36a 1000:b36a far-pointer-32 False internal entry-ordinal:84 1008:0dbd 0x00 +1 1042 0 0xb395 1000:b395 far-pointer-32 False internal entry-ordinal:68 1000:b2c8 0x00 +1 1043 0 0xb3a8 1000:b3a8 far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 1044 0 0xb3cd 1000:b3cd far-pointer-32 False internal entry-ordinal:80 1008:08bb 0x00 +1 1045 0 0xb3eb 1000:b3eb far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +1 1046 0 0xb403 1000:b403 far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 1047 0 0xb430 1000:b430 far-pointer-32 False internal entry-ordinal:69 1000:b3b0 0x00 +1 1048 0 0xb45b 1000:b45b far-pointer-32 False internal entry-ordinal:69 1000:b3b0 0x00 +1 1049 0 0xb46e 1000:b46e far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 1050 0 0xb4d3 1000:b4d3 far-pointer-32 False internal entry-ordinal:42 1000:b30b 0x00 +1 1051 0 0xb4fe 1000:b4fe far-pointer-32 False internal entry-ordinal:43 1000:7e12 0x00 +1 1052 0 0xb55d 1000:b55d far-pointer-32 False internal entry-ordinal:73 1008:0002 0x00 +1 1053 0 0xb586 1000:b586 far-pointer-32 False internal entry-ordinal:42 1000:b30b 0x00 +1 1054 0 0xb5b5 1000:b5b5 far-pointer-32 False internal entry-ordinal:280 1020:14a4 0x00 +1 1055 0 0xb5e7 1000:b5e7 far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 1056 0 0xb5ff 1000:b5ff far-pointer-32 False internal entry-ordinal:33 1000:0002 0x00 +1 1057 0 0xb60f 1000:b60f far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +1 1058 0 0xb622 1000:b622 far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 1059 0 0xb637 1000:b637 far-pointer-32 False internal entry-ordinal:73 1008:0002 0x00 +1 1060 0 0xb678 1000:b678 far-pointer-32 False internal entry-ordinal:73 1008:0002 0x00 +1 1061 0 0xb694 1000:b694 far-pointer-32 False internal entry-ordinal:39 1000:bc36 0x00 +1 1062 0 0xb6e8 1000:b6e8 far-pointer-32 False internal entry-ordinal:42 1000:b30b 0x00 +1 1063 0 0xb74e 1000:b74e far-pointer-32 False internal entry-ordinal:43 1000:7e12 0x00 +1 1064 0 0xb769 1000:b769 far-pointer-32 False internal entry-ordinal:73 1008:0002 0x00 +1 1065 0 0xb7ed 1000:b7ed far-pointer-32 False internal entry-ordinal:73 1008:0002 0x00 +1 1066 0 0xb820 1000:b820 far-pointer-32 False internal entry-ordinal:42 1000:b30b 0x00 +1 1067 0 0xb832 1000:b832 far-pointer-32 False internal entry-ordinal:39 1000:bc36 0x00 +1 1068 0 0xb845 1000:b845 far-pointer-32 False internal entry-ordinal:73 1008:0002 0x00 +1 1069 0 0xb878 1000:b878 far-pointer-32 False internal entry-ordinal:42 1000:b30b 0x00 +1 1070 0 0xb88a 1000:b88a far-pointer-32 False internal entry-ordinal:39 1000:bc36 0x00 +1 1071 0 0xb8af 1000:b8af far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 1072 0 0xb8d4 1000:b8d4 far-pointer-32 False internal entry-ordinal:79 1008:0837 0x00 +1 1073 0 0xb8f6 1000:b8f6 far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +1 1074 0 0xb918 1000:b918 far-pointer-32 False internal entry-ordinal:79 1008:0837 0x00 +1 1075 0 0xb93a 1000:b93a far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +1 1076 0 0xb95c 1000:b95c far-pointer-32 False internal entry-ordinal:79 1008:0837 0x00 +1 1077 0 0xb97e 1000:b97e far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +1 1078 0 0xb991 1000:b991 far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 1079 0 0xb99b 1000:b99b far-pointer-32 False internal entry-ordinal:73 1008:0002 0x00 +1 1080 0 0xba02 1000:ba02 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 1081 0 0xba0d 1000:ba0d far-pointer-32 False internal entry-ordinal:40 1000:bda2 0x00 +1 1082 0 0xba82 1000:ba82 far-pointer-32 False internal entry-ordinal:43 1000:7e12 0x00 +1 1083 0 0xbab7 1000:bab7 far-pointer-32 False internal entry-ordinal:42 1000:b30b 0x00 +1 1084 0 0xbac8 1000:bac8 far-pointer-32 False internal entry-ordinal:42 1000:b30b 0x00 +1 1085 0 0xbae8 1000:bae8 far-pointer-32 False internal entry-ordinal:42 1000:b30b 0x00 +1 1086 0 0xbaf8 1000:baf8 far-pointer-32 False internal entry-ordinal:42 1000:b30b 0x00 +1 1087 0 0xbb18 1000:bb18 far-pointer-32 False internal entry-ordinal:42 1000:b30b 0x00 +1 1088 0 0xbb29 1000:bb29 far-pointer-32 False internal entry-ordinal:42 1000:b30b 0x00 +1 1089 0 0xbb46 1000:bb46 far-pointer-32 False internal entry-ordinal:73 1008:0002 0x00 +1 1090 0 0xbb5e 1000:bb5e far-pointer-32 False internal entry-ordinal:42 1000:b30b 0x00 +1 1091 0 0xbb7c 1000:bb7c far-pointer-32 False internal entry-ordinal:39 1000:bc36 0x00 +1 1092 0 0xbb8b 1000:bb8b far-pointer-32 False internal entry-ordinal:73 1008:0002 0x00 +1 1093 0 0xbba3 1000:bba3 far-pointer-32 False internal entry-ordinal:42 1000:b30b 0x00 +1 1094 0 0xbbc1 1000:bbc1 far-pointer-32 False internal entry-ordinal:39 1000:bc36 0x00 +1 1095 0 0xbbcf 1000:bbcf far-pointer-32 False internal entry-ordinal:73 1008:0002 0x00 +1 1096 0 0xbbe7 1000:bbe7 far-pointer-32 False internal entry-ordinal:42 1000:b30b 0x00 +1 1097 0 0xbc05 1000:bc05 far-pointer-32 False internal entry-ordinal:39 1000:bc36 0x00 +1 1098 0 0xbc2e 1000:bc2e far-pointer-32 False internal entry-ordinal:42 1000:b30b 0x00 +1 1099 0 0xbc46 1000:bc46 far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 1100 0 0xbc79 1000:bc79 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 1101 0 0xbc9e 1000:bc9e far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 1102 0 0xbd40 1000:bd40 far-pointer-32 False internal entry-ordinal:73 1008:0002 0x00 +1 1103 0 0xbd6a 1000:bd6a far-pointer-32 False internal entry-ordinal:58 1000:a604 0x00 +1 1104 0 0xbd76 1000:bd76 far-pointer-32 False internal entry-ordinal:83 1008:0b9e 0x00 +1 1105 0 0xbd87 1000:bd87 far-pointer-32 False internal entry-ordinal:82 1008:0996 0x00 +1 1106 0 0xbd9a 1000:bd9a far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 1107 0 0xbdb2 1000:bdb2 far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 1108 0 0xbdc3 1000:bdc3 far-pointer-32 False internal entry-ordinal:82 1008:0996 0x00 +1 1109 0 0xbdd6 1000:bdd6 far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 1110 0 0xbf17 1000:bf17 far-pointer-32 False import-ordinal USER.ordinal:33 USER 33 0x01 +1 1111 0 0xbf27 1000:bf27 far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 1112 0 0xbf37 1000:bf37 far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +1 1113 0 0xbf47 1000:bf47 far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +1 1114 0 0xbf57 1000:bf57 far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +1 1115 0 0xbf6b 1000:bf6b far-pointer-32 False import-ordinal GDI.ordinal:51 GDI 51 0x01 +1 1116 0 0xbfda 1000:bfda far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 1117 0 0xc008 1000:c008 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 1118 0 0xc03a 1000:c03a far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 1119 0 0xc066 1000:c066 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 1120 0 0xc1d9 1000:c1d9 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 1121 0 0xc1ed 1000:c1ed far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 1122 0 0xc21a 1000:c21a far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 1123 0 0xc231 1000:c231 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 1124 0 0xc257 1000:c257 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 1125 0 0xc26e 1000:c26e far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 1126 0 0xc294 1000:c294 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 1127 0 0xc2ec 1000:c2ec far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 1128 0 0xc2fc 1000:c2fc far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 1129 0 0xc30c 1000:c30c far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 1130 0 0xc31c 1000:c31c far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 1131 0 0xc328 1000:c328 far-pointer-32 False import-ordinal GDI.ordinal:69 GDI 69 0x01 +1 1132 0 0xc334 1000:c334 far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +1 1133 0 0xc340 1000:c340 far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +1 1134 0 0xc34c 1000:c34c far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +1 1135 0 0xc363 1000:c363 far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 1136 0 0xc54a 1000:c54a far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 1137 0 0xc555 1000:c555 far-pointer-32 False internal entry-ordinal:40 1000:bda2 0x00 +1 1138 0 0xc5b5 1000:c5b5 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 1139 0 0xc5c0 1000:c5c0 far-pointer-32 False internal entry-ordinal:40 1000:bda2 0x00 +1 1140 0 0xc620 1000:c620 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 1141 0 0xc62b 1000:c62b far-pointer-32 False internal entry-ordinal:40 1000:bda2 0x00 +1 1142 0 0xc68b 1000:c68b far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 1143 0 0xc696 1000:c696 far-pointer-32 False internal entry-ordinal:40 1000:bda2 0x00 +1 1144 0 0xc6f6 1000:c6f6 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 1145 0 0xc701 1000:c701 far-pointer-32 False internal entry-ordinal:40 1000:bda2 0x00 +1 1146 0 0xc733 1000:c733 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 1147 0 0xc73e 1000:c73e far-pointer-32 False internal entry-ordinal:39 1000:bc36 0x00 +1 1148 0 0xc75f 1000:c75f far-pointer-32 False internal entry-ordinal:40 1000:bda2 0x00 +1 1149 0 0xc7ef 1000:c7ef far-pointer-32 False internal entry-ordinal:44 1000:c36b 0x00 +1 1150 0 0xc867 1000:c867 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1151 0 0xc874 1000:c874 far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1152 0 0xc879 1000:c879 far-pointer-32 False internal entry-ordinal:291 1020:0ff1 0x00 +1 1153 0 0xc892 1000:c892 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1154 0 0xc89f 1000:c89f far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1155 0 0xc8a4 1000:c8a4 far-pointer-32 False internal entry-ordinal:291 1020:0ff1 0x00 +1 1156 0 0xc8ac 1000:c8ac far-pointer-32 False internal entry-ordinal:284 1020:0fe5 0x00 +1 1157 0 0xc8b1 1000:c8b1 far-pointer-32 False internal entry-ordinal:292 1020:10be 0x00 +1 1158 0 0xc8be 1000:c8be far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1159 0 0xc8c3 1000:c8c3 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1160 0 0xc8f5 1000:c8f5 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1161 0 0xc912 1000:c912 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1162 0 0xc91a 1000:c91a far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1163 0 0xc933 1000:c933 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1164 0 0xc93b 1000:c93b far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1165 0 0xc940 1000:c940 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1166 0 0xc96e 1000:c96e far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1167 0 0xc98b 1000:c98b far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1168 0 0xc993 1000:c993 far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1169 0 0xc9ac 1000:c9ac far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1170 0 0xc9b4 1000:c9b4 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1171 0 0xc9b9 1000:c9b9 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1172 0 0xca72 1000:ca72 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1173 0 0xca91 1000:ca91 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1174 0 0xcb43 1000:cb43 far-pointer-32 False internal entry-ordinal:67 1000:ae6e 0x00 +1 1175 0 0xcbc5 1000:cbc5 far-pointer-32 False internal entry-ordinal:53 1000:9b69 0x00 +1 1176 0 0xcc06 1000:cc06 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1177 0 0xcc13 1000:cc13 far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1178 0 0xcc18 1000:cc18 far-pointer-32 False internal entry-ordinal:291 1020:0ff1 0x00 +1 1179 0 0xcc3d 1000:cc3d far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1180 0 0xcc4a 1000:cc4a far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1181 0 0xcc4f 1000:cc4f far-pointer-32 False internal entry-ordinal:291 1020:0ff1 0x00 +1 1182 0 0xcc57 1000:cc57 far-pointer-32 False internal entry-ordinal:284 1020:0fe5 0x00 +1 1183 0 0xcc5c 1000:cc5c far-pointer-32 False internal entry-ordinal:292 1020:10be 0x00 +1 1184 0 0xcc69 1000:cc69 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1185 0 0xcc6e 1000:cc6e far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1186 0 0xcc94 1000:cc94 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1187 0 0xcd37 1000:cd37 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 1188 0 0xcd50 1000:cd50 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1189 0 0xcd55 1000:cd55 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1190 0 0xcd5a 1000:cd5a far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1191 0 0xcd86 1000:cd86 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 1192 0 0xcd97 1000:cd97 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1193 0 0xcd9c 1000:cd9c far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1194 0 0xcda1 1000:cda1 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1195 0 0xcdd0 1000:cdd0 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 1196 0 0xcde9 1000:cde9 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1197 0 0xcdee 1000:cdee far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1198 0 0xcdf3 1000:cdf3 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1199 0 0xce1f 1000:ce1f far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 1200 0 0xce30 1000:ce30 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1201 0 0xce35 1000:ce35 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1202 0 0xce3a 1000:ce3a far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1203 0 0xce96 1000:ce96 far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1204 0 0xce9b 1000:ce9b far-pointer-32 False internal entry-ordinal:291 1020:0ff1 0x00 +1 1205 0 0xceb4 1000:ceb4 far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1206 0 0xceb9 1000:ceb9 far-pointer-32 False internal entry-ordinal:291 1020:0ff1 0x00 +1 1207 0 0xcec1 1000:cec1 far-pointer-32 False internal entry-ordinal:284 1020:0fe5 0x00 +1 1208 0 0xcec6 1000:cec6 far-pointer-32 False internal entry-ordinal:292 1020:10be 0x00 +1 1209 0 0xced3 1000:ced3 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1210 0 0xced8 1000:ced8 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1211 0 0xcef7 1000:cef7 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1212 0 0xcf14 1000:cf14 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1213 0 0xcf2e 1000:cf2e far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1214 0 0xcf36 1000:cf36 far-pointer-32 False internal entry-ordinal:285 1020:0feb 0x00 +1 1215 0 0xcf3e 1000:cf3e far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1216 0 0xcf43 1000:cf43 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1217 0 0xcfdc 1000:cfdc far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1218 0 0xd007 1000:d007 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1219 0 0xd014 1000:d014 far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1220 0 0xd019 1000:d019 far-pointer-32 False internal entry-ordinal:291 1020:0ff1 0x00 +1 1221 0 0xd035 1000:d035 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1222 0 0xd042 1000:d042 far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1223 0 0xd047 1000:d047 far-pointer-32 False internal entry-ordinal:291 1020:0ff1 0x00 +1 1224 0 0xd04f 1000:d04f far-pointer-32 False internal entry-ordinal:284 1020:0fe5 0x00 +1 1225 0 0xd054 1000:d054 far-pointer-32 False internal entry-ordinal:292 1020:10be 0x00 +1 1226 0 0xd061 1000:d061 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1227 0 0xd066 1000:d066 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1228 0 0xd090 1000:d090 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1229 0 0xd09d 1000:d09d far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1230 0 0xd0a2 1000:d0a2 far-pointer-32 False internal entry-ordinal:291 1020:0ff1 0x00 +1 1231 0 0xd0be 1000:d0be far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1232 0 0xd0cb 1000:d0cb far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1233 0 0xd0d0 1000:d0d0 far-pointer-32 False internal entry-ordinal:291 1020:0ff1 0x00 +1 1234 0 0xd0d8 1000:d0d8 far-pointer-32 False internal entry-ordinal:284 1020:0fe5 0x00 +1 1235 0 0xd0dd 1000:d0dd far-pointer-32 False internal entry-ordinal:292 1020:10be 0x00 +1 1236 0 0xd0ea 1000:d0ea far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1237 0 0xd0ef 1000:d0ef far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1238 0 0xd115 1000:d115 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1239 0 0xd14c 1000:d14c far-pointer-32 False internal entry-ordinal:73 1008:0002 0x00 +1 1240 0 0xd16c 1000:d16c far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 1241 0 0xd177 1000:d177 far-pointer-32 False internal entry-ordinal:39 1000:bc36 0x00 +1 1242 0 0xd1b2 1000:d1b2 far-pointer-32 False internal entry-ordinal:41 1000:b3f3 0x00 +1 1243 0 0xd1be 1000:d1be far-pointer-32 False internal entry-ordinal:71 1000:c4e1 0x00 +1 1244 0 0xd1ce 1000:d1ce far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 1245 0 0xd1ec 1000:d1ec far-pointer-32 False internal entry-ordinal:33 1000:0002 0x00 +1 1246 0 0xd1fd 1000:d1fd far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +1 1247 0 0xd211 1000:d211 far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 1248 0 0xd225 1000:d225 far-pointer-32 False internal entry-ordinal:70 1000:b476 0x00 +1 1249 0 0xd22a 1000:d22a far-pointer-32 False internal entry-ordinal:293 1020:14c1 0x00 +1 1250 0 0xd238 1000:d238 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1251 0 0xd24c 1000:d24c far-pointer-32 False internal entry-ordinal:285 1020:0feb 0x00 +1 1252 0 0xd25a 1000:d25a far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1253 0 0xd262 1000:d262 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1254 0 0xd267 1000:d267 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1255 0 0xd272 1000:d272 far-pointer-32 False internal entry-ordinal:293 1020:14c1 0x00 +1 1256 0 0xd280 1000:d280 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1257 0 0xd294 1000:d294 far-pointer-32 False internal entry-ordinal:285 1020:0feb 0x00 +1 1258 0 0xd2a2 1000:d2a2 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1259 0 0xd2aa 1000:d2aa far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1260 0 0xd2af 1000:d2af far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1261 0 0xd2f6 1000:d2f6 far-pointer-32 False internal entry-ordinal:52 1000:9ae0 0x00 +1 1262 0 0xd31f 1000:d31f far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1263 0 0xd32d 1000:d32d far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1264 0 0xd332 1000:d332 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1265 0 0xd34c 1000:d34c far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1266 0 0xd354 1000:d354 far-pointer-32 False internal entry-ordinal:293 1020:14c1 0x00 +1 1267 0 0xd362 1000:d362 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1268 0 0xd374 1000:d374 far-pointer-32 False internal entry-ordinal:285 1020:0feb 0x00 +1 1269 0 0xd37c 1000:d37c far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1270 0 0xd381 1000:d381 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1271 0 0xd3e3 1000:d3e3 far-pointer-32 False internal entry-ordinal:53 1000:9b69 0x00 +1 1272 0 0xd3fc 1000:d3fc far-pointer-32 False internal entry-ordinal:41 1000:b3f3 0x00 +1 1273 0 0xd41f 1000:d41f far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1274 0 0xd441 1000:d441 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1275 0 0xd460 1000:d460 far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1276 0 0xd465 1000:d465 far-pointer-32 False internal entry-ordinal:291 1020:0ff1 0x00 +1 1277 0 0xd47e 1000:d47e far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1278 0 0xd483 1000:d483 far-pointer-32 False internal entry-ordinal:291 1020:0ff1 0x00 +1 1279 0 0xd48b 1000:d48b far-pointer-32 False internal entry-ordinal:284 1020:0fe5 0x00 +1 1280 0 0xd490 1000:d490 far-pointer-32 False internal entry-ordinal:292 1020:10be 0x00 +1 1281 0 0xd49d 1000:d49d far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1282 0 0xd4a2 1000:d4a2 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1283 0 0xd4b3 1000:d4b3 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1284 0 0xd4c0 1000:d4c0 far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1285 0 0xd4d9 1000:d4d9 far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1286 0 0xd4fe 1000:d4fe far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1287 0 0xd506 1000:d506 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1288 0 0xd51f 1000:d51f far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1289 0 0xd544 1000:d544 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1290 0 0xd54c 1000:d54c far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1291 0 0xd554 1000:d554 far-pointer-32 False internal entry-ordinal:285 1020:0feb 0x00 +1 1292 0 0xd55c 1000:d55c far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1293 0 0xd564 1000:d564 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1294 0 0xd575 1000:d575 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1295 0 0xd582 1000:d582 far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1296 0 0xd59b 1000:d59b far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1297 0 0xd5ac 1000:d5ac far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1298 0 0xd5c5 1000:d5c5 far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1299 0 0xd5d3 1000:d5d3 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1300 0 0xd5db 1000:d5db far-pointer-32 False internal entry-ordinal:285 1020:0feb 0x00 +1 1301 0 0xd5e3 1000:d5e3 far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1302 0 0xd5e8 1000:d5e8 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1303 0 0xd694 1000:d694 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 1304 0 0xd6d3 1000:d6d3 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 1305 0 0xd728 1000:d728 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 1306 0 0xd767 1000:d767 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 1307 0 0xd7a7 1000:d7a7 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1308 0 0xd7b4 1000:d7b4 far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1309 0 0xd7b9 1000:d7b9 far-pointer-32 False internal entry-ordinal:291 1020:0ff1 0x00 +1 1310 0 0xd7d5 1000:d7d5 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1311 0 0xd7e2 1000:d7e2 far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1312 0 0xd7e7 1000:d7e7 far-pointer-32 False internal entry-ordinal:291 1020:0ff1 0x00 +1 1313 0 0xd7ef 1000:d7ef far-pointer-32 False internal entry-ordinal:284 1020:0fe5 0x00 +1 1314 0 0xd7f4 1000:d7f4 far-pointer-32 False internal entry-ordinal:292 1020:10be 0x00 +1 1315 0 0xd801 1000:d801 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1316 0 0xd806 1000:d806 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1317 0 0xd82c 1000:d82c far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1318 0 0xd9af 1000:d9af far-pointer-32 False internal entry-ordinal:73 1008:0002 0x00 +1 1319 0 0xda23 1000:da23 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 1320 0 0xda30 1000:da30 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1321 0 0xda3e 1000:da3e far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1322 0 0xda43 1000:da43 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1323 0 0xda6a 1000:da6a far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 1324 0 0xda77 1000:da77 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1325 0 0xda85 1000:da85 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1326 0 0xda8a 1000:da8a far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1327 0 0xdac9 1000:dac9 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 1328 0 0xdad6 1000:dad6 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1329 0 0xdae4 1000:dae4 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1330 0 0xdae9 1000:dae9 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1331 0 0xdb10 1000:db10 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 1332 0 0xdb1d 1000:db1d far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1333 0 0xdb2b 1000:db2b far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1334 0 0xdb30 1000:db30 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1335 0 0xdb5e 1000:db5e far-pointer-32 False internal entry-ordinal:280 1020:14a4 0x00 +1 1336 0 0xdc22 1000:dc22 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 1337 0 0xdca0 1000:dca0 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 1338 0 0xdcab 1000:dcab far-pointer-32 False internal entry-ordinal:39 1000:bc36 0x00 +1 1339 0 0xdce0 1000:dce0 far-pointer-32 False internal entry-ordinal:58 1000:a604 0x00 +1 1340 0 0xdcf0 1000:dcf0 far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 1341 0 0xdd08 1000:dd08 far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 1342 0 0xdd78 1000:dd78 far-pointer-32 False internal entry-ordinal:42 1000:b30b 0x00 +1 1343 0 0xdda2 1000:dda2 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 1344 0 0xddad 1000:ddad far-pointer-32 False internal entry-ordinal:40 1000:bda2 0x00 +1 1345 0 0xddd9 1000:ddd9 far-pointer-32 False internal entry-ordinal:42 1000:b30b 0x00 +1 1346 0 0xde20 1000:de20 far-pointer-32 False internal entry-ordinal:67 1000:ae6e 0x00 +1 1347 0 0xdef8 1000:def8 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1348 0 0xdefd 1000:defd far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1349 0 0xdf02 1000:df02 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1350 0 0xdf2d 1000:df2d far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1351 0 0xdf32 1000:df32 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1352 0 0xdf37 1000:df37 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1353 0 0xdf56 1000:df56 far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1354 0 0xdf5b 1000:df5b far-pointer-32 False internal entry-ordinal:291 1020:0ff1 0x00 +1 1355 0 0xdf74 1000:df74 far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1356 0 0xdf79 1000:df79 far-pointer-32 False internal entry-ordinal:291 1020:0ff1 0x00 +1 1357 0 0xdf81 1000:df81 far-pointer-32 False internal entry-ordinal:284 1020:0fe5 0x00 +1 1358 0 0xdf86 1000:df86 far-pointer-32 False internal entry-ordinal:292 1020:10be 0x00 +1 1359 0 0xdf93 1000:df93 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1360 0 0xdf98 1000:df98 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1361 0 0xdfb7 1000:dfb7 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1362 0 0xdfd4 1000:dfd4 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1363 0 0xdfee 1000:dfee far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1364 0 0xdff6 1000:dff6 far-pointer-32 False internal entry-ordinal:285 1020:0feb 0x00 +1 1365 0 0xdffe 1000:dffe far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1366 0 0xe003 1000:e003 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1367 0 0xe1e1 1000:e1e1 far-pointer-32 False internal entry-ordinal:70 1000:b476 0x00 +1 1368 0 0xe202 1000:e202 far-pointer-32 False internal entry-ordinal:288 1020:1007 0x00 +1 1369 0 0xe215 1000:e215 far-pointer-32 False internal entry-ordinal:39 1000:bc36 0x00 +1 1370 0 0xe22e 1000:e22e far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1371 0 0xe233 1000:e233 far-pointer-32 False internal entry-ordinal:291 1020:0ff1 0x00 +1 1372 0 0xe24f 1000:e24f far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1373 0 0xe254 1000:e254 far-pointer-32 False internal entry-ordinal:291 1020:0ff1 0x00 +1 1374 0 0xe25c 1000:e25c far-pointer-32 False internal entry-ordinal:284 1020:0fe5 0x00 +1 1375 0 0xe261 1000:e261 far-pointer-32 False internal entry-ordinal:292 1020:10be 0x00 +1 1376 0 0xe26e 1000:e26e far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1377 0 0xe273 1000:e273 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1378 0 0xe284 1000:e284 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1379 0 0xe2a4 1000:e2a4 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1380 0 0xe2c1 1000:e2c1 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1381 0 0xe2c9 1000:e2c9 far-pointer-32 False internal entry-ordinal:284 1020:0fe5 0x00 +1 1382 0 0xe2d1 1000:e2d1 far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1383 0 0xe2d6 1000:e2d6 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1384 0 0xe2e7 1000:e2e7 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1385 0 0xe304 1000:e304 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1386 0 0xe30c 1000:e30c far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1387 0 0xe32d 1000:e32d far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1388 0 0xe33e 1000:e33e far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1389 0 0xe382 1000:e382 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1390 0 0xe39e 1000:e39e far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1391 0 0xe3a3 1000:e3a3 far-pointer-32 False internal entry-ordinal:292 1020:10be 0x00 +1 1392 0 0xe3ab 1000:e3ab far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1393 0 0xe3ce 1000:e3ce far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1394 0 0xe3e7 1000:e3e7 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1395 0 0xe3f5 1000:e3f5 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1396 0 0xe3fd 1000:e3fd far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1397 0 0xe417 1000:e417 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1398 0 0xe41f 1000:e41f far-pointer-32 False internal entry-ordinal:285 1020:0feb 0x00 +1 1399 0 0xe430 1000:e430 far-pointer-32 False internal entry-ordinal:285 1020:0feb 0x00 +1 1400 0 0xe435 1000:e435 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1401 0 0xe452 1000:e452 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1402 0 0xe460 1000:e460 far-pointer-32 False internal entry-ordinal:284 1020:0fe5 0x00 +1 1403 0 0xe4a9 1000:e4a9 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1404 0 0xe4b9 1000:e4b9 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1405 0 0xe4ca 1000:e4ca far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1406 0 0xe4d2 1000:e4d2 far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1407 0 0xe4d7 1000:e4d7 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1408 0 0xe516 1000:e516 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1409 0 0xe526 1000:e526 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1410 0 0xe537 1000:e537 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1411 0 0xe53f 1000:e53f far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1412 0 0xe544 1000:e544 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1413 0 0xe599 1000:e599 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1414 0 0xe5a7 1000:e5a7 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1415 0 0xe5c2 1000:e5c2 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1416 0 0xe5d0 1000:e5d0 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1417 0 0xe5d8 1000:e5d8 far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1418 0 0xe5f3 1000:e5f3 far-pointer-32 False internal entry-ordinal:284 1020:0fe5 0x00 +1 1419 0 0xe5fb 1000:e5fb far-pointer-32 False internal entry-ordinal:285 1020:0feb 0x00 +1 1420 0 0xe603 1000:e603 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1421 0 0xe608 1000:e608 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1422 0 0xe62f 1000:e62f far-pointer-32 False internal entry-ordinal:288 1020:1007 0x00 +1 1423 0 0xe648 1000:e648 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1424 0 0xe659 1000:e659 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1425 0 0xe65e 1000:e65e far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1426 0 0xe687 1000:e687 far-pointer-32 False internal entry-ordinal:39 1000:bc36 0x00 +1 1427 0 0xe690 1000:e690 far-pointer-32 False internal entry-ordinal:73 1008:0002 0x00 +1 1428 0 0xe6a4 1000:e6a4 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1429 0 0xe6b5 1000:e6b5 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1430 0 0xe6ba 1000:e6ba far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1431 0 0xe6d9 1000:e6d9 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1432 0 0xe6e7 1000:e6e7 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1433 0 0xe6f8 1000:e6f8 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1434 0 0xe706 1000:e706 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1435 0 0xe717 1000:e717 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1436 0 0xe71f 1000:e71f far-pointer-32 False internal entry-ordinal:285 1020:0feb 0x00 +1 1437 0 0xe727 1000:e727 far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1438 0 0xe72c 1000:e72c far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1439 0 0xe73d 1000:e73d far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1440 0 0xe74b 1000:e74b far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1441 0 0xe75c 1000:e75c far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1442 0 0xe76a 1000:e76a far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1443 0 0xe77b 1000:e77b far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1444 0 0xe783 1000:e783 far-pointer-32 False internal entry-ordinal:284 1020:0fe5 0x00 +1 1445 0 0xe78b 1000:e78b far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1446 0 0xe790 1000:e790 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1447 0 0xe82d 1000:e82d far-pointer-32 False internal entry-ordinal:67 1000:ae6e 0x00 +1 1448 0 0xe88d 1000:e88d far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1449 0 0xe89a 1000:e89a far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1450 0 0xe89f 1000:e89f far-pointer-32 False internal entry-ordinal:291 1020:0ff1 0x00 +1 1451 0 0xe8b8 1000:e8b8 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1452 0 0xe8c5 1000:e8c5 far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1453 0 0xe8ca 1000:e8ca far-pointer-32 False internal entry-ordinal:291 1020:0ff1 0x00 +1 1454 0 0xe8d2 1000:e8d2 far-pointer-32 False internal entry-ordinal:284 1020:0fe5 0x00 +1 1455 0 0xe8d7 1000:e8d7 far-pointer-32 False internal entry-ordinal:292 1020:10be 0x00 +1 1456 0 0xe8e4 1000:e8e4 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1457 0 0xe8e9 1000:e8e9 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1458 0 0xe91b 1000:e91b far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1459 0 0xe942 1000:e942 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 1460 0 0xe947 1000:e947 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1461 0 0xe94f 1000:e94f far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1462 0 0xe954 1000:e954 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1463 0 0xe982 1000:e982 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1464 0 0xe9a9 1000:e9a9 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 1465 0 0xe9ae 1000:e9ae far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1466 0 0xe9b6 1000:e9b6 far-pointer-32 False internal entry-ordinal:287 1020:0ffd 0x00 +1 1467 0 0xe9bb 1000:e9bb far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1468 0 0xea32 1000:ea32 far-pointer-32 False internal entry-ordinal:66 1000:bdde 0x00 +1 1469 0 0xea7f 1000:ea7f far-pointer-32 False internal entry-ordinal:56 1000:9f73 0x00 +1 1470 0 0xea9d 1000:ea9d far-pointer-32 False internal entry-ordinal:45 1000:c426 0x00 +1 1471 0 0xeb21 1000:eb21 far-pointer-32 False internal entry-ordinal:43 1000:7e12 0x00 +1 1472 0 0xeb6b 1000:eb6b far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 1473 0 0xeb97 1000:eb97 far-pointer-32 False internal entry-ordinal:85 1008:0e08 0x00 +1 1474 0 0xeba6 1000:eba6 far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 1475 0 0xebbc 1000:ebbc far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 1476 0 0xebcb 1000:ebcb far-pointer-32 False internal entry-ordinal:85 1008:0e08 0x00 +1 1477 0 0xebda 1000:ebda far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 1478 0 0xec0e 1000:ec0e far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 1479 0 0xec1f 1000:ec1f far-pointer-32 False internal entry-ordinal:85 1008:0e08 0x00 +1 1480 0 0xec2e 1000:ec2e far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 1481 0 0xec8f 1000:ec8f far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1482 0 0xec9d 1000:ec9d far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1483 0 0xeca2 1000:eca2 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1484 0 0xecbc 1000:ecbc far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1485 0 0xecc7 1000:ecc7 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1486 0 0xeccc 1000:eccc far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1487 0 0xed09 1000:ed09 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1488 0 0xed17 1000:ed17 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1489 0 0xed1c 1000:ed1c far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1490 0 0xed36 1000:ed36 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1491 0 0xed44 1000:ed44 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1492 0 0xed49 1000:ed49 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1493 0 0xed86 1000:ed86 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1494 0 0xed94 1000:ed94 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1495 0 0xed99 1000:ed99 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1496 0 0xedb3 1000:edb3 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1497 0 0xedc1 1000:edc1 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1498 0 0xedc6 1000:edc6 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1499 0 0xee03 1000:ee03 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1500 0 0xee11 1000:ee11 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1501 0 0xee16 1000:ee16 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1502 0 0xee30 1000:ee30 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1503 0 0xee3e 1000:ee3e far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1504 0 0xee43 1000:ee43 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1505 0 0xee80 1000:ee80 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1506 0 0xee8e 1000:ee8e far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1507 0 0xee93 1000:ee93 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1508 0 0xeead 1000:eead far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1509 0 0xeebb 1000:eebb far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1510 0 0xeec0 1000:eec0 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1511 0 0xeefd 1000:eefd far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1512 0 0xef0b 1000:ef0b far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1513 0 0xef10 1000:ef10 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1514 0 0xef2a 1000:ef2a far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1515 0 0xef38 1000:ef38 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1516 0 0xef3d 1000:ef3d far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1517 0 0xef7a 1000:ef7a far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1518 0 0xef88 1000:ef88 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1519 0 0xef8d 1000:ef8d far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1520 0 0xefa7 1000:efa7 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1521 0 0xefb5 1000:efb5 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1522 0 0xefba 1000:efba far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1523 0 0xeff7 1000:eff7 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1524 0 0xf005 1000:f005 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1525 0 0xf00a 1000:f00a far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1526 0 0xf024 1000:f024 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1527 0 0xf032 1000:f032 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1528 0 0xf037 1000:f037 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1529 0 0xf074 1000:f074 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1530 0 0xf082 1000:f082 far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1531 0 0xf087 1000:f087 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1532 0 0xf0a1 1000:f0a1 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1533 0 0xf0af 1000:f0af far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1534 0 0xf0b4 1000:f0b4 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1535 0 0xf107 1000:f107 far-pointer-32 False internal entry-ordinal:45 1000:c426 0x00 +1 1536 0 0xf10d 1000:f10d far-pointer-32 False internal entry-ordinal:54 1000:9bca 0x00 +1 1537 0 0xf114 1000:f114 far-pointer-32 False internal entry-ordinal:73 1008:0002 0x00 +1 1538 0 0xf15a 1000:f15a far-pointer-32 False internal entry-ordinal:41 1000:b3f3 0x00 +1 1539 0 0xf188 1000:f188 far-pointer-32 False internal entry-ordinal:47 1000:6f27 0x00 +1 1540 0 0xf1d8 1000:f1d8 far-pointer-32 False internal entry-ordinal:57 1000:a38e 0x00 +1 1541 0 0xf224 1000:f224 far-pointer-32 False internal entry-ordinal:67 1000:ae6e 0x00 +1 1542 0 0xf28c 1000:f28c far-pointer-32 False internal entry-ordinal:44 1000:c36b 0x00 +1 1543 0 0xf2cf 1000:f2cf far-pointer-32 False internal entry-ordinal:57 1000:a38e 0x00 +1 1544 0 0xf2f1 1000:f2f1 far-pointer-32 False internal entry-ordinal:44 1000:c36b 0x00 +1 1545 0 0xf30a 1000:f30a far-pointer-32 False internal entry-ordinal:37 1000:c79c 0x00 +1 1546 0 0xf325 1000:f325 far-pointer-32 False internal entry-ordinal:45 1000:c426 0x00 +1 1547 0 0xf32f 1000:f32f far-pointer-32 False internal entry-ordinal:66 1000:bdde 0x00 +1 1548 0 0xf335 1000:f335 far-pointer-32 False internal entry-ordinal:55 1000:9e85 0x00 +1 1549 0 0xf341 1000:f341 far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 1550 0 0xf356 1000:f356 far-pointer-32 False internal entry-ordinal:80 1008:08bb 0x00 +1 1551 0 0xf368 1000:f368 far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +1 1552 0 0xf377 1000:f377 far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 1553 0 0xf381 1000:f381 far-pointer-32 False internal entry-ordinal:45 1000:c426 0x00 +1 1554 0 0xf38b 1000:f38b far-pointer-32 False internal entry-ordinal:66 1000:bdde 0x00 +1 1555 0 0xf3a3 1000:f3a3 far-pointer-32 False internal entry-ordinal:45 1000:c426 0x00 +1 1556 0 0xf3ad 1000:f3ad far-pointer-32 False internal entry-ordinal:66 1000:bdde 0x00 +1 1557 0 0xf3f6 1000:f3f6 far-pointer-32 False internal entry-ordinal:57 1000:a38e 0x00 +1 1558 0 0xf412 1000:f412 far-pointer-32 False internal entry-ordinal:41 1000:b3f3 0x00 +1 1559 0 0xf42e 1000:f42e far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +1 1560 0 0xf43c 1000:f43c far-pointer-32 False internal entry-ordinal:286 1020:0ff7 0x00 +1 1561 0 0xf441 1000:f441 far-pointer-32 False internal entry-ordinal:290 1020:1017 0x00 +1 1562 0 0xf47f 1000:f47f far-pointer-32 False internal entry-ordinal:45 1000:c426 0x00 +1 1563 0 0xf489 1000:f489 far-pointer-32 False internal entry-ordinal:66 1000:bdde 0x00 +1 1564 0 0xf4c4 1000:f4c4 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 1565 0 0xf4dd 1000:f4dd far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 1566 0 0xf4eb 1000:f4eb far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 1567 0 0xf508 1000:f508 far-pointer-32 False internal entry-ordinal:42 1000:b30b 0x00 +1 1568 0 0xf521 1000:f521 far-pointer-32 False internal entry-ordinal:41 1000:b3f3 0x00 +1 1569 0 0xf532 1000:f532 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 1570 0 0xf54e 1000:f54e far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 1571 0 0xf55c 1000:f55c far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 1572 0 0xf570 1000:f570 far-pointer-32 False internal entry-ordinal:42 1000:b30b 0x00 +1 1573 0 0xf579 1000:f579 far-pointer-32 False internal entry-ordinal:41 1000:b3f3 0x00 +1 1574 0 0xf592 1000:f592 far-pointer-32 False internal entry-ordinal:42 1000:b30b 0x00 +1 1575 0 0xf59f 1000:f59f far-pointer-32 False internal entry-ordinal:41 1000:b3f3 0x00 +1 1576 0 0xf5b8 1000:f5b8 far-pointer-32 False internal entry-ordinal:42 1000:b30b 0x00 +1 1577 0 0xf5c5 1000:f5c5 far-pointer-32 False internal entry-ordinal:41 1000:b3f3 0x00 +1 1578 0 0xf5d6 1000:f5d6 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 1579 0 0xf5e8 1000:f5e8 far-pointer-32 False internal entry-ordinal:42 1000:b30b 0x00 +1 1580 0 0xf5f1 1000:f5f1 far-pointer-32 False internal entry-ordinal:42 1000:b30b 0x00 +1 1581 0 0xf5f9 1000:f5f9 far-pointer-32 False internal entry-ordinal:42 1000:b30b 0x00 +1 1582 0 0xf609 1000:f609 far-pointer-32 False internal entry-ordinal:41 1000:b3f3 0x00 +1 1583 0 0xf612 1000:f612 far-pointer-32 False internal entry-ordinal:41 1000:b3f3 0x00 +1 1584 0 0xf61a 1000:f61a far-pointer-32 False internal entry-ordinal:41 1000:b3f3 0x00 +1 1585 0 0xf62b 1000:f62b far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 1586 0 0xf642 1000:f642 far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 1587 0 0xf656 1000:f656 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 1588 0 0xf664 1000:f664 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 1589 0 0xf6ae 1000:f6ae far-pointer-32 False internal entry-ordinal:79 1008:0837 0x00 +1 1590 0 0xf6d7 1000:f6d7 far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +1 1591 0 0xf71d 1000:f71d far-pointer-32 False internal entry-ordinal:80 1008:08bb 0x00 +1 1592 0 0xf746 1000:f746 far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +1 1593 0 0xf755 1000:f755 far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 1594 0 0xf766 1000:f766 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 1595 0 0xf77d 1000:f77d far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 1596 0 0xf791 1000:f791 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 1597 0 0xf79f 1000:f79f far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 1598 0 0xf7bc 1000:f7bc far-pointer-32 False internal entry-ordinal:79 1008:0837 0x00 +1 1599 0 0xf7ce 1000:f7ce far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +1 1600 0 0xf7e0 1000:f7e0 far-pointer-32 False internal entry-ordinal:80 1008:08bb 0x00 +1 1601 0 0xf7f2 1000:f7f2 far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +1 1602 0 0xf80c 1000:f80c far-pointer-32 False internal entry-ordinal:79 1008:0837 0x00 +1 1603 0 0xf81e 1000:f81e far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +1 1604 0 0xf830 1000:f830 far-pointer-32 False internal entry-ordinal:80 1008:08bb 0x00 +1 1605 0 0xf842 1000:f842 far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +1 1606 0 0xf85c 1000:f85c far-pointer-32 False internal entry-ordinal:79 1008:0837 0x00 +1 1607 0 0xf86e 1000:f86e far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +1 1608 0 0xf880 1000:f880 far-pointer-32 False internal entry-ordinal:80 1008:08bb 0x00 +1 1609 0 0xf892 1000:f892 far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +1 1610 0 0xf8ab 1000:f8ab far-pointer-32 False internal entry-ordinal:79 1008:0837 0x00 +1 1611 0 0xf8bd 1000:f8bd far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +1 1612 0 0xf8cf 1000:f8cf far-pointer-32 False internal entry-ordinal:80 1008:08bb 0x00 +1 1613 0 0xf8e1 1000:f8e1 far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +1 1614 0 0xf8f0 1000:f8f0 far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 1615 0 0xf901 1000:f901 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 1616 0 0xf915 1000:f915 far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 1617 0 0xf929 1000:f929 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 1618 0 0xf937 1000:f937 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 1619 0 0xf94b 1000:f94b far-pointer-32 False internal entry-ordinal:84 1008:0dbd 0x00 +1 1620 0 0xf95c 1000:f95c far-pointer-32 False internal entry-ordinal:84 1008:0dbd 0x00 +1 1621 0 0xf96b 1000:f96b far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 1622 0 0xf97c 1000:f97c far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 1623 0 0xf99d 1000:f99d far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 1624 0 0xf9a8 1000:f9a8 far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +1 1625 0 0xf9b3 1000:f9b3 far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +1 1626 0 0xf9c3 1000:f9c3 far-pointer-32 False import-ordinal GDI.ordinal:51 GDI 51 0x01 +1 1627 0 0xf9d2 1000:f9d2 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 1628 0 0xf9e0 1000:f9e0 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 1629 0 0xfa01 1000:fa01 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 1630 0 0xfa20 1000:fa20 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 1631 0 0xfa2c 1000:fa2c far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 1632 0 0xfa3d 1000:fa3d far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 1633 0 0xfa5e 1000:fa5e far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 1634 0 0xfa8e 1000:fa8e far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 1635 0 0xfaa2 1000:faa2 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 1636 0 0xfab6 1000:fab6 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 1637 0 0xfad1 1000:fad1 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 1638 0 0xfae5 1000:fae5 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 1639 0 0xfb09 1000:fb09 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 1640 0 0xfb1d 1000:fb1d far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 1641 0 0xfb31 1000:fb31 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 1642 0 0xfb45 1000:fb45 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 1643 0 0xfb59 1000:fb59 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 1644 0 0xfb7a 1000:fb7a far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +1 1645 0 0xfb8e 1000:fb8e far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +1 1646 0 0xfba4 1000:fba4 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 1647 0 0xfbc3 1000:fbc3 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +1 1648 0 0xfbce 1000:fbce far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 1649 0 0xfbd9 1000:fbd9 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +1 1650 0 0xfbe1 1000:fbe1 far-pointer-32 False import-ordinal GDI.ordinal:69 GDI 69 0x01 +1 1651 0 0xfbe9 1000:fbe9 far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +1 1652 0 0xfbf1 1000:fbf1 far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +1 1653 0 0xfc00 1000:fc00 far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 1654 0 0xfc68 1000:fc68 far-pointer-32 False internal entry-ordinal:48 1000:7440 0x00 +1 1655 0 0xfc89 1000:fc89 far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 1656 0 0xfc9c 1000:fc9c far-pointer-32 False internal entry-ordinal:80 1008:08bb 0x00 +1 1657 0 0xfcac 1000:fcac far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +1 1658 0 0xfcbb 1000:fcbb far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 1659 0 0xfcf9 1000:fcf9 far-pointer-32 False internal entry-ordinal:60 1000:a72c 0x00 +1 1660 0 0xfcff 1000:fcff far-pointer-32 False internal entry-ordinal:65 1000:acc2 0x00 +1 1661 0 0xfd05 1000:fd05 far-pointer-32 False internal entry-ordinal:58 1000:a604 0x00 +1 1662 0 0xfd0b 1000:fd0b far-pointer-32 False internal entry-ordinal:55 1000:9e85 0x00 +1 1663 0 0xfd17 1000:fd17 far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +1 1664 0 0xfd2c 1000:fd2c far-pointer-32 False internal entry-ordinal:80 1008:08bb 0x00 +1 1665 0 0xfd3e 1000:fd3e far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +1 1666 0 0xfd4d 1000:fd4d far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +1 1667 0 0xfd5b 1000:fd5b far-pointer-32 False internal entry-ordinal:50 1000:99f0 0x00 +1 1668 0 0xfd60 1000:fd60 far-pointer-32 False internal entry-ordinal:75 1008:00e2 0x00 +1 1669 0 0xfd86 1000:fd86 far-pointer-32 False import-ordinal KERNEL.ordinal:91 KERNEL 91 0x01 +1 1670 0 0xfd8b 1000:fd8b far-pointer-32 False internal entry-ordinal:256 1020:0002 0x00 +1 1671 0 0xfd90 1000:fd90 far-pointer-32 False internal entry-ordinal:132 1008:298a 0x00 +1 1672 0 0xfd95 1000:fd95 far-pointer-32 False internal entry-ordinal:109 1008:2554 0x00 +1 1673 0 0xfd9a 1000:fd9a far-pointer-32 False internal entry-ordinal:98 1010:0472 0x00 +1 1674 0 0xfd9f 1000:fd9f far-pointer-32 False internal entry-ordinal:91 1008:15c2 0x00 +1 1675 0 0xfda4 1000:fda4 far-pointer-32 False internal entry-ordinal:86 1008:11b8 0x00 +1 1676 0 0xfda9 1000:fda9 far-pointer-32 False internal entry-ordinal:72 1008:0f27 0x00 +1 1677 0 0xfdb1 1000:fdb1 far-pointer-32 False import-ordinal KERNEL.ordinal:3 KERNEL 3 0x01 +1 1678 0 0xfe17 1000:fe17 far-pointer-32 False internal entry-ordinal:190 1018:1a61 0x00 +1 1679 0 0xfe36 1000:fe36 far-pointer-32 False internal entry-ordinal:258 1020:0061 0x00 +2 1 0 0x0018 1008:0018 far-pointer-32 False internal entry-ordinal:89 1008:1131 0x00 +2 2 0 0x002b 1008:002b far-pointer-32 False internal entry-ordinal:267 1020:012d 0x00 +2 3 0 0x008b 1008:008b far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +2 4 0 0x009b 1008:009b far-pointer-32 False import-ordinal GDI.ordinal:360 GDI 360 0x01 +2 5 0 0x00a3 1008:00a3 far-pointer-32 False import-ordinal USER.ordinal:282 USER 282 0x01 +2 6 0 0x00ae 1008:00ae far-pointer-32 False import-ordinal USER.ordinal:283 USER 283 0x01 +2 7 0 0x00bb 1008:00bb far-pointer-32 False import-ordinal USER.ordinal:282 USER 282 0x01 +2 8 0 0x00c1 1008:00c1 far-pointer-32 False import-ordinal GDI.ordinal:69 GDI 69 0x01 +2 9 0 0x00cc 1008:00cc far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +2 10 0 0x00da 1008:00da far-pointer-32 False internal entry-ordinal:268 1020:0147 0x00 +2 11 0 0x00f4 1008:00f4 far-pointer-32 False import-ordinal USER.ordinal:109 USER 109 0x01 +2 12 0 0x0122 1008:0122 far-pointer-32 False import-ordinal USER.ordinal:113 USER 113 0x01 +2 13 0 0x012c 1008:012c far-pointer-32 False import-ordinal USER.ordinal:114 USER 114 0x01 +2 14 0 0x0234 1008:0234 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +2 15 0 0x024f 1008:024f far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +2 16 0 0x028d 1008:028d far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +2 17 0 0x02a8 1008:02a8 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +2 18 0 0x02cb 1008:02cb far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +2 19 0 0x02ec 1008:02ec far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +2 20 0 0x0327 1008:0327 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +2 21 0 0x0342 1008:0342 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +2 22 0 0x0380 1008:0380 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +2 23 0 0x039b 1008:039b far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +2 24 0 0x03be 1008:03be far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +2 25 0 0x03df 1008:03df far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +2 26 0 0x0404 1008:0404 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +2 27 0 0x041f 1008:041f far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +2 28 0 0x044e 1008:044e far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +2 29 0 0x0453 1008:0453 far-pointer-32 False internal entry-ordinal:289 1020:100b 0x00 +2 30 0 0x04a3 1008:04a3 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +2 31 0 0x04fa 1008:04fa far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +2 32 0 0x0551 1008:0551 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +2 33 0 0x05a8 1008:05a8 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +2 34 0 0x064a 1008:064a far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +2 35 0 0x0665 1008:0665 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +2 36 0 0x0680 1008:0680 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +2 37 0 0x069b 1008:069b far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +2 38 0 0x07be 1008:07be far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +2 39 0 0x07c9 1008:07c9 far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +2 40 0 0x07d8 1008:07d8 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +2 41 0 0x07e6 1008:07e6 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +2 42 0 0x0809 1008:0809 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +2 43 0 0x0814 1008:0814 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +2 44 0 0x081f 1008:081f far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +2 45 0 0x0827 1008:0827 far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +2 46 0 0x082f 1008:082f far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +2 47 0 0x083f 1008:083f far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +2 48 0 0x084a 1008:084a far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +2 49 0 0x0859 1008:0859 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +2 50 0 0x0868 1008:0868 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +2 51 0 0x088d 1008:088d far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +2 52 0 0x0898 1008:0898 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +2 53 0 0x08a3 1008:08a3 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +2 54 0 0x08ab 1008:08ab far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +2 55 0 0x08b3 1008:08b3 far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +2 56 0 0x08c3 1008:08c3 far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +2 57 0 0x08ce 1008:08ce far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +2 58 0 0x08dd 1008:08dd far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +2 59 0 0x08ec 1008:08ec far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +2 60 0 0x0911 1008:0911 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +2 61 0 0x091c 1008:091c far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +2 62 0 0x0927 1008:0927 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +2 63 0 0x092f 1008:092f far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +2 64 0 0x0937 1008:0937 far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +2 65 0 0x0947 1008:0947 far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +2 66 0 0x0956 1008:0956 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +2 67 0 0x097b 1008:097b far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +2 68 0 0x0986 1008:0986 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +2 69 0 0x098e 1008:098e far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +2 70 0 0x099e 1008:099e far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +2 71 0 0x09a9 1008:09a9 far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +2 72 0 0x09b9 1008:09b9 far-pointer-32 False import-ordinal GDI.ordinal:51 GDI 51 0x01 +2 73 0 0x0a73 1008:0a73 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +2 74 0 0x0a81 1008:0a81 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +2 75 0 0x0aa3 1008:0aa3 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +2 76 0 0x0abc 1008:0abc far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +2 77 0 0x0ad3 1008:0ad3 far-pointer-32 False internal entry-ordinal:261 1020:08e6 0x00 +2 78 0 0x0b1b 1008:0b1b far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +2 79 0 0x0b40 1008:0b40 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +2 80 0 0x0b68 1008:0b68 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +2 81 0 0x0b73 1008:0b73 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +2 82 0 0x0b7e 1008:0b7e far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +2 83 0 0x0b86 1008:0b86 far-pointer-32 False import-ordinal GDI.ordinal:69 GDI 69 0x01 +2 84 0 0x0b8e 1008:0b8e far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +2 85 0 0x0b96 1008:0b96 far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +2 86 0 0x0c7e 1008:0c7e far-pointer-32 False internal entry-ordinal:78 1008:07b6 0x00 +2 87 0 0x0c93 1008:0c93 far-pointer-32 False internal entry-ordinal:79 1008:0837 0x00 +2 88 0 0x0ca6 1008:0ca6 far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +2 89 0 0x0cd4 1008:0cd4 far-pointer-32 False internal entry-ordinal:79 1008:0837 0x00 +2 90 0 0x0cf0 1008:0cf0 far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +2 91 0 0x0d0e 1008:0d0e far-pointer-32 False internal entry-ordinal:80 1008:08bb 0x00 +2 92 0 0x0d2a 1008:0d2a far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +2 93 0 0x0d54 1008:0d54 far-pointer-32 False internal entry-ordinal:80 1008:08bb 0x00 +2 94 0 0x0d67 1008:0d67 far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +2 95 0 0x0d8d 1008:0d8d far-pointer-32 False internal entry-ordinal:80 1008:08bb 0x00 +2 96 0 0x0da9 1008:0da9 far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +2 97 0 0x0ddc 1008:0ddc far-pointer-32 False internal entry-ordinal:78 1008:07b6 0x00 +2 98 0 0x0def 1008:0def far-pointer-32 False internal entry-ordinal:80 1008:08bb 0x00 +2 99 0 0x0e00 1008:0e00 far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +2 100 0 0x0e1f 1008:0e1f far-pointer-32 False internal entry-ordinal:80 1008:08bb 0x00 +2 101 0 0x0e30 1008:0e30 far-pointer-32 False internal entry-ordinal:81 1008:093f 0x00 +2 102 0 0x0e3b 1008:0e3b far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +2 103 0 0x0e46 1008:0e46 far-pointer-32 False import-ordinal GDI.ordinal:52 GDI 52 0x01 +2 104 0 0x0e55 1008:0e55 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +2 105 0 0x0e64 1008:0e64 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +2 106 0 0x0ed7 1008:0ed7 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +2 107 0 0x0ef9 1008:0ef9 far-pointer-32 False import-ordinal GDI.ordinal:34 GDI 34 0x01 +2 108 0 0x0f04 1008:0f04 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +2 109 0 0x0f0f 1008:0f0f far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +2 110 0 0x0f17 1008:0f17 far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +2 111 0 0x0f1f 1008:0f1f far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +2 112 0 0x0f54 1008:0f54 far-pointer-32 False internal entry-ordinal:281 1020:082e 0x00 +2 113 0 0x0f59 1008:0f59 far-pointer-32 False internal entry-ordinal:248 1008:2f2f 0x00 +2 114 0 0x0f76 1008:0f76 far-pointer-32 False internal entry-ordinal:281 1020:082e 0x00 +2 115 0 0x0f7b 1008:0f7b far-pointer-32 False internal entry-ordinal:264 1020:0a7d 0x00 +2 116 0 0x0f81 1008:0f81 far-pointer-32 False internal entry-ordinal:247 1008:2f07 0x00 +2 117 0 0x0f91 1008:0f91 far-pointer-32 False internal entry-ordinal:249 1008:2f4d 0x00 +2 118 0 0x0fa8 1008:0fa8 far-pointer-32 False import-ordinal KERNEL.ordinal:127 KERNEL 127 0x01 +2 119 0 0x0fb9 1008:0fb9 far-pointer-32 False import-ordinal MMSYSTEM.ordinal:401 MMSYSTEM 401 0x01 +2 120 0 0x0fd6 1008:0fd6 far-pointer-32 False import-ordinal MMSYSTEM.ordinal:402 MMSYSTEM 402 0x01 +2 121 0 0x1012 1008:1012 far-pointer-32 False import-ordinal MMSYSTEM.ordinal:415 MMSYSTEM 415 0x01 +2 122 0 0x1062 1008:1062 far-pointer-32 False import-ordinal KERNEL.ordinal:60 KERNEL 60 0x01 +2 123 0 0x1068 1008:1068 far-pointer-32 False import-ordinal KERNEL.ordinal:61 KERNEL 61 0x01 +2 124 0 0x1080 1008:1080 far-pointer-32 False internal entry-ordinal:96 1008:15c7 0x00 +2 125 0 0x1096 1008:1096 far-pointer-32 False import-ordinal KERNEL.ordinal:62 KERNEL 62 0x01 +2 126 0 0x10bc 1008:10bc far-pointer-32 False internal entry-ordinal:282 1020:16a5 0x00 +2 127 0 0x10c4 1008:10c4 far-pointer-32 False import-ordinal KERNEL.ordinal:19 KERNEL 19 0x01 +2 128 0 0x10cc 1008:10cc far-pointer-32 False import-ordinal KERNEL.ordinal:63 KERNEL 63 0x01 +2 129 0 0x1100 1008:1100 far-pointer-32 False import-ordinal MMSYSTEM.ordinal:2 MMSYSTEM 2 0x01 +2 130 0 0x111d 1008:111d far-pointer-32 False internal entry-ordinal:97 1008:15e7 0x00 +2 131 0 0x1165 1008:1165 far-pointer-32 False import-ordinal MMSYSTEM.ordinal:2 MMSYSTEM 2 0x01 +2 132 0 0x1178 1008:1178 far-pointer-32 False import-ordinal MMSYSTEM.ordinal:2 MMSYSTEM 2 0x01 +2 133 0 0x11ac 1008:11ac far-pointer-32 False import-ordinal MMSYSTEM.ordinal:2 MMSYSTEM 2 0x01 +2 134 0 0x11e9 1008:11e9 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +2 135 0 0x11fd 1008:11fd far-pointer-32 False internal entry-ordinal:267 1020:012d 0x00 +2 136 0 0x125d 1008:125d far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +2 137 0 0x1282 1008:1282 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +2 138 0 0x12ad 1008:12ad far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +2 139 0 0x12f8 1008:12f8 far-pointer-32 False import-ordinal GDI.ordinal:360 GDI 360 0x01 +2 140 0 0x130f 1008:130f far-pointer-32 False internal entry-ordinal:272 1020:039d 0x00 +2 141 0 0x1315 1008:1315 far-pointer-32 False internal entry-ordinal:268 1020:0147 0x00 +2 142 0 0x133d 1008:133d far-pointer-32 False import-ordinal KERNEL.ordinal:60 KERNEL 60 0x01 +2 143 0 0x134b 1008:134b far-pointer-32 False import-ordinal KERNEL.ordinal:61 KERNEL 61 0x01 +2 144 0 0x1356 1008:1356 far-pointer-32 False import-ordinal KERNEL.ordinal:62 KERNEL 62 0x01 +2 145 0 0x1372 1008:1372 far-pointer-32 False internal entry-ordinal:272 1020:039d 0x00 +2 146 0 0x1386 1008:1386 far-pointer-32 False internal entry-ordinal:272 1020:039d 0x00 +2 147 0 0x139d 1008:139d far-pointer-32 False import-ordinal KERNEL.ordinal:19 KERNEL 19 0x01 +2 148 0 0x13d6 1008:13d6 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +2 149 0 0x1404 1008:1404 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +2 150 0 0x1429 1008:1429 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +2 151 0 0x1454 1008:1454 far-pointer-32 False internal entry-ordinal:260 1020:08a9 0x00 +2 152 0 0x14b4 1008:14b4 far-pointer-32 False import-ordinal KERNEL.ordinal:60 KERNEL 60 0x01 +2 153 0 0x14c2 1008:14c2 far-pointer-32 False import-ordinal KERNEL.ordinal:61 KERNEL 61 0x01 +2 154 0 0x14cd 1008:14cd far-pointer-32 False import-ordinal KERNEL.ordinal:62 KERNEL 62 0x01 +2 155 0 0x14e4 1008:14e4 far-pointer-32 False internal entry-ordinal:259 1020:0891 0x00 +2 156 0 0x1512 1008:1512 far-pointer-32 False internal entry-ordinal:267 1020:012d 0x00 +2 157 0 0x1529 1008:1529 far-pointer-32 False internal entry-ordinal:259 1020:0891 0x00 +2 158 0 0x1533 1008:1533 far-pointer-32 False internal entry-ordinal:94 1008:13a8 0x00 +2 159 0 0x1549 1008:1549 far-pointer-32 False import-ordinal GDI.ordinal:53 GDI 53 0x01 +2 160 0 0x155a 1008:155a far-pointer-32 False import-ordinal USER.ordinal:282 USER 282 0x01 +2 161 0 0x1566 1008:1566 far-pointer-32 False import-ordinal GDI.ordinal:150 GDI 150 0x01 +2 162 0 0x156e 1008:156e far-pointer-32 False import-ordinal USER.ordinal:283 USER 283 0x01 +2 163 0 0x158c 1008:158c far-pointer-32 False import-ordinal GDI.ordinal:442 GDI 442 0x01 +2 164 0 0x159c 1008:159c far-pointer-32 False import-ordinal USER.ordinal:282 USER 282 0x01 +2 165 0 0x15a4 1008:15a4 far-pointer-32 False import-ordinal GDI.ordinal:68 GDI 68 0x01 +2 166 0 0x15ac 1008:15ac far-pointer-32 False import-ordinal KERNEL.ordinal:19 KERNEL 19 0x01 +2 167 0 0x15b4 1008:15b4 far-pointer-32 False import-ordinal KERNEL.ordinal:63 KERNEL 63 0x01 +2 168 0 0x15d6 1008:15d6 far-pointer-32 False import-ordinal KERNEL.ordinal:15 KERNEL 15 0x01 +2 169 0 0x15dc 1008:15dc far-pointer-32 False import-ordinal KERNEL.ordinal:18 KERNEL 18 0x01 +2 170 0 0x15f0 1008:15f0 far-pointer-32 False import-ordinal KERNEL.ordinal:21 KERNEL 21 0x01 +2 171 0 0x15f7 1008:15f7 far-pointer-32 False import-ordinal KERNEL.ordinal:19 KERNEL 19 0x01 +2 172 0 0x15fc 1008:15fc far-pointer-32 False import-ordinal KERNEL.ordinal:17 KERNEL 17 0x01 +2 173 0 0x1612 1008:1612 far-pointer-32 False internal entry-ordinal:294 1020:03ef 0x00 +2 174 0 0x164a 1008:164a far-pointer-32 False internal entry-ordinal:222 1008:2996 0x00 +2 175 0 0x16ac 1008:16ac far-pointer-32 False import-ordinal USER.ordinal:93 USER 93 0x01 +2 176 0 0x16c9 1008:16c9 far-pointer-32 False internal entry-ordinal:151 1018:0d9b 0x00 +2 177 0 0x16dd 1008:16dd far-pointer-32 False import-ordinal USER.ordinal:37 USER 37 0x01 +2 178 0 0x16f3 1008:16f3 far-pointer-32 False import-ordinal USER.ordinal:92 USER 92 0x01 +2 179 0 0x1709 1008:1709 far-pointer-32 False import-ordinal USER.ordinal:92 USER 92 0x01 +2 180 0 0x1724 1008:1724 far-pointer-32 False import-ordinal USER.ordinal:101 USER 101 0x01 +2 181 0 0x178d 1008:178d far-pointer-32 False import-ordinal USER.ordinal:39 USER 39 0x01 +2 182 0 0x179b 1008:179b far-pointer-32 False import-ordinal USER.ordinal:66 USER 66 0x01 +2 183 0 0x17ab 1008:17ab far-pointer-32 False import-ordinal GDI.ordinal:87 GDI 87 0x01 +2 184 0 0x17b1 1008:17b1 far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +2 185 0 0x17c1 1008:17c1 far-pointer-32 False import-ordinal USER.ordinal:180 USER 180 0x01 +2 186 0 0x17c8 1008:17c8 far-pointer-32 False import-ordinal GDI.ordinal:9 GDI 9 0x01 +2 187 0 0x17d5 1008:17d5 far-pointer-32 False import-ordinal USER.ordinal:180 USER 180 0x01 +2 188 0 0x17dc 1008:17dc far-pointer-32 False import-ordinal GDI.ordinal:1 GDI 1 0x01 +2 189 0 0x17ee 1008:17ee far-pointer-32 False import-ordinal GDI.ordinal:45 GDI 45 0x01 +2 190 0 0x1803 1008:1803 far-pointer-32 False import-ordinal USER.ordinal:40 USER 40 0x01 +2 191 0 0x1812 1008:1812 far-pointer-32 False import-ordinal USER.ordinal:68 USER 68 0x01 +2 192 0 0x182b 1008:182b far-pointer-32 False import-ordinal USER.ordinal:163 USER 163 0x01 +2 193 0 0x184c 1008:184c far-pointer-32 False import-ordinal USER.ordinal:165 USER 165 0x01 +2 194 0 0x1855 1008:1855 far-pointer-32 False import-ordinal USER.ordinal:167 USER 167 0x01 +2 195 0 0x185f 1008:185f far-pointer-32 False import-ordinal USER.ordinal:164 USER 164 0x01 +2 196 0 0x1882 1008:1882 far-pointer-32 False import-ordinal USER.ordinal:64 USER 64 0x01 +2 197 0 0x1896 1008:1896 far-pointer-32 False import-ordinal USER.ordinal:62 USER 62 0x01 +2 198 0 0x18b5 1008:18b5 far-pointer-32 False import-ordinal USER.ordinal:64 USER 64 0x01 +2 199 0 0x18ca 1008:18ca far-pointer-32 False import-ordinal USER.ordinal:62 USER 62 0x01 +2 200 0 0x18e8 1008:18e8 far-pointer-32 False internal entry-ordinal:258 1020:0061 0x00 +2 201 0 0x194f 1008:194f far-pointer-32 False import-ordinal USER.ordinal:62 USER 62 0x01 +2 202 0 0x196c 1008:196c far-pointer-32 False import-ordinal USER.ordinal:62 USER 62 0x01 +2 203 0 0x1997 1008:1997 far-pointer-32 False import-ordinal USER.ordinal:61 USER 61 0x01 +2 204 0 0x19ac 1008:19ac far-pointer-32 False import-ordinal USER.ordinal:124 USER 124 0x01 +2 205 0 0x19ef 1008:19ef far-pointer-32 False internal entry-ordinal:116 1008:18ee 0x00 +2 206 0 0x1a77 1008:1a77 far-pointer-32 False import-ordinal GDI.ordinal:33 GDI 33 0x01 +2 207 0 0x1ae2 1008:1ae2 far-pointer-32 False internal entry-ordinal:279 1020:16c9 0x00 +2 208 0 0x1b00 1008:1b00 far-pointer-32 False import-ordinal USER.ordinal:61 USER 61 0x01 +2 209 0 0x1b09 1008:1b09 far-pointer-32 False import-ordinal USER.ordinal:124 USER 124 0x01 +2 210 0 0x1b1a 1008:1b1a far-pointer-32 False internal entry-ordinal:110 1008:2442 0x00 +2 211 0 0x1bc0 1008:1bc0 far-pointer-32 False import-ordinal USER.ordinal:104 USER 104 0x01 +2 212 0 0x1bde 1008:1bde far-pointer-32 False internal entry-ordinal:117 1008:19b7 0x00 +2 213 0 0x1bf8 1008:1bf8 far-pointer-32 False internal entry-ordinal:111 1008:1b11 0x00 +2 214 0 0x1c0c 1008:1c0c far-pointer-32 False internal entry-ordinal:110 1008:2442 0x00 +2 215 0 0x1c23 1008:1c23 far-pointer-32 False import-ordinal USER.ordinal:109 USER 109 0x01 +2 216 0 0x1c3a 1008:1c3a far-pointer-32 False import-ordinal USER.ordinal:113 USER 113 0x01 +2 217 0 0x1c44 1008:1c44 far-pointer-32 False import-ordinal USER.ordinal:114 USER 114 0x01 +2 218 0 0x1c68 1008:1c68 far-pointer-32 False internal entry-ordinal:117 1008:19b7 0x00 +2 219 0 0x1c6d 1008:1c6d far-pointer-32 False internal entry-ordinal:113 1008:1c03 0x00 +2 220 0 0x1c85 1008:1c85 far-pointer-32 False import-ordinal USER.ordinal:112 USER 112 0x01 +2 221 0 0x1c8a 1008:1c8a far-pointer-32 False internal entry-ordinal:113 1008:1c03 0x00 +2 222 0 0x1cba 1008:1cba far-pointer-32 False internal entry-ordinal:282 1020:16a5 0x00 +2 223 0 0x1cd4 1008:1cd4 far-pointer-32 False internal entry-ordinal:114 1008:1c5f 0x00 +2 224 0 0x1cef 1008:1cef far-pointer-32 False internal entry-ordinal:112 1008:1be9 0x00 +2 225 0 0x1d1d 1008:1d1d far-pointer-32 False internal entry-ordinal:112 1008:1be9 0x00 +2 226 0 0x1d5e 1008:1d5e far-pointer-32 False internal entry-ordinal:112 1008:1be9 0x00 +2 227 0 0x1d63 1008:1d63 far-pointer-32 False internal entry-ordinal:117 1008:19b7 0x00 +2 228 0 0x1d88 1008:1d88 far-pointer-32 False internal entry-ordinal:267 1020:012d 0x00 +2 229 0 0x1da5 1008:1da5 far-pointer-32 False internal entry-ordinal:279 1020:16c9 0x00 +2 230 0 0x1db8 1008:1db8 far-pointer-32 False import-ordinal USER.ordinal:156 USER 156 0x01 +2 231 0 0x1dc6 1008:1dc6 far-pointer-32 False import-ordinal USER.ordinal:155 USER 155 0x01 +2 232 0 0x1e75 1008:1e75 far-pointer-32 False import-ordinal GDI.ordinal:33 GDI 33 0x01 +2 233 0 0x1f5e 1008:1f5e far-pointer-32 False internal entry-ordinal:116 1008:18ee 0x00 +2 234 0 0x1ffb 1008:1ffb far-pointer-32 False import-ordinal GDI.ordinal:93 GDI 93 0x01 +2 235 0 0x2019 1008:2019 far-pointer-32 False import-ordinal USER.ordinal:179 USER 179 0x01 +2 236 0 0x2025 1008:2025 far-pointer-32 False import-ordinal USER.ordinal:179 USER 179 0x01 +2 237 0 0x2039 1008:2039 far-pointer-32 False import-ordinal USER.ordinal:179 USER 179 0x01 +2 238 0 0x204c 1008:204c far-pointer-32 False import-ordinal USER.ordinal:179 USER 179 0x01 +2 239 0 0x2058 1008:2058 far-pointer-32 False import-ordinal USER.ordinal:179 USER 179 0x01 +2 240 0 0x2062 1008:2062 far-pointer-32 False import-ordinal USER.ordinal:179 USER 179 0x01 +2 241 0 0x207a 1008:207a far-pointer-32 False import-ordinal USER.ordinal:179 USER 179 0x01 +2 242 0 0x20a1 1008:20a1 far-pointer-32 False import-ordinal USER.ordinal:179 USER 179 0x01 +2 243 0 0x20ad 1008:20ad far-pointer-32 False import-ordinal USER.ordinal:179 USER 179 0x01 +2 244 0 0x20cb 1008:20cb far-pointer-32 False import-ordinal USER.ordinal:179 USER 179 0x01 +2 245 0 0x20d5 1008:20d5 far-pointer-32 False import-ordinal USER.ordinal:179 USER 179 0x01 +2 246 0 0x20e1 1008:20e1 far-pointer-32 False import-ordinal USER.ordinal:179 USER 179 0x01 +2 247 0 0x2162 1008:2162 far-pointer-32 False import-ordinal USER.ordinal:106 USER 106 0x01 +2 248 0 0x21f6 1008:21f6 far-pointer-32 False internal entry-ordinal:268 1020:0147 0x00 +2 249 0 0x220e 1008:220e far-pointer-32 False import-ordinal USER.ordinal:6 USER 6 0x01 +2 250 0 0x22e1 1008:22e1 far-pointer-32 False import-ordinal USER.ordinal:107 USER 107 0x01 +2 251 0 0x231b 1008:231b far-pointer-32 False internal entry-ordinal:111 1008:1b11 0x00 +2 252 0 0x2329 1008:2329 far-pointer-32 False internal entry-ordinal:113 1008:1c03 0x00 +2 253 0 0x2354 1008:2354 far-pointer-32 False internal entry-ordinal:115 1008:1cc6 0x00 +2 254 0 0x239f 1008:239f offset-16 False internal entry-ordinal:121 1008:233c 0x00 +2 255 0 0x23a2 1008:23a2 selector-16 False internal entry-ordinal:121 1008:233c 0x00 +2 256 0 0x23c2 1008:23c2 offset-16 False internal entry-ordinal:120 1008:22fc 0x00 +2 257 0 0x23c5 1008:23c5 selector-16 False internal entry-ordinal:120 1008:22fc 0x00 +2 258 0 0x23d0 1008:23d0 offset-16 False internal entry-ordinal:120 1008:22fc 0x00 +2 259 0 0x23d3 1008:23d3 selector-16 False internal entry-ordinal:120 1008:22fc 0x00 +2 260 0 0x23de 1008:23de offset-16 False internal entry-ordinal:122 1008:2374 0x00 +2 261 0 0x23e1 1008:23e1 selector-16 False internal entry-ordinal:122 1008:2374 0x00 +2 262 0 0x2429 1008:2429 offset-16 False internal entry-ordinal:123 1008:238b 0x00 +2 263 0 0x242c 1008:242c selector-16 False internal entry-ordinal:123 1008:238b 0x00 +2 264 0 0x2483 1008:2483 far-pointer-32 False import-ordinal USER.ordinal:41 USER 41 0x01 +2 265 0 0x2493 1008:2493 far-pointer-32 False import-ordinal USER.ordinal:42 USER 42 0x01 +2 266 0 0x249c 1008:249c far-pointer-32 False import-ordinal USER.ordinal:124 USER 124 0x01 +2 267 0 0x24f1 1008:24f1 far-pointer-32 False import-ordinal USER.ordinal:421 USER 421 0x01 +2 268 0 0x2500 1008:2500 far-pointer-32 False import-ordinal USER.ordinal:37 USER 37 0x01 +2 269 0 0x250c 1008:250c far-pointer-32 False import-ordinal USER.ordinal:156 USER 156 0x01 +2 270 0 0x2519 1008:2519 far-pointer-32 False import-ordinal USER.ordinal:155 USER 155 0x01 +2 271 0 0x2531 1008:2531 far-pointer-32 False import-ordinal USER.ordinal:108 USER 108 0x01 +2 272 0 0x253f 1008:253f far-pointer-32 False import-ordinal USER.ordinal:113 USER 113 0x01 +2 273 0 0x2549 1008:2549 far-pointer-32 False import-ordinal USER.ordinal:114 USER 114 0x01 +2 274 0 0x256f 1008:256f far-pointer-32 False import-ordinal USER.ordinal:174 USER 174 0x01 +2 275 0 0x2581 1008:2581 far-pointer-32 False import-ordinal USER.ordinal:173 USER 173 0x01 +2 276 0 0x2594 1008:2594 far-pointer-32 False import-ordinal USER.ordinal:57 USER 57 0x01 +2 277 0 0x259e 1008:259e far-pointer-32 False internal entry-ordinal:118 1008:23fd 0x00 +2 278 0 0x25a8 1008:25a8 far-pointer-32 False internal entry-ordinal:274 1020:0527 0x00 +2 279 0 0x25ad 1008:25ad far-pointer-32 False internal entry-ordinal:271 1020:038f 0x00 +2 280 0 0x25b7 1008:25b7 far-pointer-32 False internal entry-ordinal:118 1008:23fd 0x00 +2 281 0 0x25c1 1008:25c1 far-pointer-32 False internal entry-ordinal:275 1020:052c 0x00 +2 282 0 0x25c6 1008:25c6 far-pointer-32 False internal entry-ordinal:271 1020:038f 0x00 +2 283 0 0x25d8 1008:25d8 far-pointer-32 False import-ordinal KERNEL.ordinal:49 KERNEL 49 0x01 +2 284 0 0x25e7 1008:25e7 far-pointer-32 False import-ordinal KEYBOARD.ordinal:6 KEYBOARD 6 0x01 +2 285 0 0x25fa 1008:25fa offset-16 False internal entry-ordinal:124 1008:24a5 0x00 +2 286 0 0x25fd 1008:25fd selector-16 False internal entry-ordinal:124 1008:24a5 0x00 +2 287 0 0x2631 1008:2631 far-pointer-32 False import-ordinal KEYBOARD.ordinal:5 KEYBOARD 5 0x01 +2 288 0 0x26c2 1008:26c2 far-pointer-32 False internal entry-ordinal:252 1008:2fe3 0x00 +2 289 0 0x26de 1008:26de far-pointer-32 False internal entry-ordinal:252 1008:2fe3 0x00 +2 290 0 0x270b 1008:270b far-pointer-32 False internal entry-ordinal:251 1008:2fbb 0x00 +2 291 0 0x2724 1008:2724 far-pointer-32 False internal entry-ordinal:244 1008:2ea9 0x00 +2 292 0 0x2765 1008:2765 far-pointer-32 False internal entry-ordinal:251 1008:2fbb 0x00 +2 293 0 0x2777 1008:2777 far-pointer-32 False internal entry-ordinal:251 1008:2fbb 0x00 +2 294 0 0x27cc 1008:27cc far-pointer-32 False internal entry-ordinal:247 1008:2f07 0x00 +2 295 0 0x27e8 1008:27e8 far-pointer-32 False internal entry-ordinal:247 1008:2f07 0x00 +2 296 0 0x2805 1008:2805 far-pointer-32 False internal entry-ordinal:247 1008:2f07 0x00 +2 297 0 0x2828 1008:2828 far-pointer-32 False internal entry-ordinal:243 1008:2e92 0x00 +2 298 0 0x2830 1008:2830 far-pointer-32 False import-ordinal KERNEL.ordinal:131 KERNEL 131 0x01 +2 299 0 0x2853 1008:2853 far-pointer-32 False internal entry-ordinal:250 1008:2f70 0x00 +2 300 0 0x2884 1008:2884 far-pointer-32 False internal entry-ordinal:243 1008:2e92 0x00 +2 301 0 0x28a9 1008:28a9 far-pointer-32 False internal entry-ordinal:273 1020:03cb 0x00 +2 302 0 0x28b0 1008:28b0 far-pointer-32 False internal entry-ordinal:294 1020:03ef 0x00 +2 303 0 0x28bf 1008:28bf far-pointer-32 False internal entry-ordinal:235 1008:2d99 0x00 +2 304 0 0x28e0 1008:28e0 far-pointer-32 False internal entry-ordinal:131 1008:295c 0x00 +2 305 0 0x28f9 1008:28f9 far-pointer-32 False internal entry-ordinal:295 1020:0439 0x00 +2 306 0 0x290c 1008:290c far-pointer-32 False internal entry-ordinal:273 1020:03cb 0x00 +2 307 0 0x2916 1008:2916 far-pointer-32 False internal entry-ordinal:130 1008:2932 0x00 +2 308 0 0x2923 1008:2923 far-pointer-32 False internal entry-ordinal:237 1008:2dcd 0x00 +2 309 0 0x292a 1008:292a far-pointer-32 False internal entry-ordinal:295 1020:0439 0x00 +2 310 0 0x2938 1008:2938 far-pointer-32 False internal entry-ordinal:273 1020:03cb 0x00 +2 311 0 0x294b 1008:294b far-pointer-32 False import-ordinal MMSYSTEM.ordinal:603 MMSYSTEM 603 0x01 +2 312 0 0x2963 1008:2963 far-pointer-32 False internal entry-ordinal:273 1020:03cb 0x00 +2 313 0 0x297c 1008:297c far-pointer-32 False import-ordinal MMTIMER.ordinal:1 MMTIMER 1 0x01 +2 314 0 0x2990 1008:2990 far-pointer-32 False internal entry-ordinal:273 1020:03cb 0x00 +2 315 0 0x299e 1008:299e far-pointer-32 False internal entry-ordinal:294 1020:03ef 0x00 +2 316 0 0x29b3 1008:29b3 far-pointer-32 False internal entry-ordinal:133 1018:0341 0x00 +2 317 0 0x29bd 1008:29bd far-pointer-32 False internal entry-ordinal:144 1018:0627 0x00 +2 318 0 0x29ce 1008:29ce far-pointer-32 False internal entry-ordinal:254 1008:302c 0x00 +2 319 0 0x2a26 1008:2a26 far-pointer-32 False internal entry-ordinal:255 1008:3099 0x00 +2 320 0 0x2a33 1008:2a33 far-pointer-32 False internal entry-ordinal:134 1018:03ff 0x00 +2 321 0 0x2a3a 1008:2a3a far-pointer-32 False internal entry-ordinal:295 1020:0439 0x00 +2 322 0 0x2a5a 1008:2a5a far-pointer-32 False internal entry-ordinal:144 1018:0627 0x00 +2 323 0 0x2a64 1008:2a64 far-pointer-32 False internal entry-ordinal:142 1018:05f3 0x00 +2 324 0 0x2afb 1008:2afb far-pointer-32 False internal entry-ordinal:144 1018:0627 0x00 +2 325 0 0x2b05 1008:2b05 far-pointer-32 False internal entry-ordinal:142 1018:05f3 0x00 +2 326 0 0x2bc6 1008:2bc6 far-pointer-32 False internal entry-ordinal:143 1018:060d 0x00 +2 327 0 0x2be1 1008:2be1 offset-16 False internal entry-ordinal:234 1008:2bb1 0x00 +2 328 0 0x2be4 1008:2be4 selector-16 False internal entry-ordinal:234 1008:2bb1 0x00 +2 329 0 0x2bee 1008:2bee far-pointer-32 False internal entry-ordinal:141 1018:085a 0x00 +2 330 0 0x2bfd 1008:2bfd far-pointer-32 False import-ordinal USER.ordinal:88 USER 88 0x01 +2 331 0 0x2c93 1008:2c93 far-pointer-32 False import-ordinal USER.ordinal:22 USER 22 0x01 +2 332 0 0x2c9f 1008:2c9f far-pointer-32 False internal entry-ordinal:207 1018:0097 0x00 +2 333 0 0x2d2f 1008:2d2f far-pointer-32 False internal entry-ordinal:157 1018:0f38 0x00 +2 334 0 0x2d5b 1008:2d5b far-pointer-32 False internal entry-ordinal:157 1018:0f38 0x00 +2 335 0 0x2d7c 1008:2d7c far-pointer-32 False internal entry-ordinal:296 1020:16e1 0x00 +2 336 0 0x2d90 1008:2d90 far-pointer-32 False internal entry-ordinal:257 1020:005d 0x00 +2 337 0 0x2da1 1008:2da1 far-pointer-32 False internal entry-ordinal:294 1020:03ef 0x00 +2 338 0 0x2dd5 1008:2dd5 far-pointer-32 False internal entry-ordinal:295 1020:0439 0x00 +2 339 0 0x2e05 1008:2e05 far-pointer-32 False internal entry-ordinal:240 1008:2de0 0x00 +2 340 0 0x2e12 1008:2e12 far-pointer-32 False internal entry-ordinal:267 1020:012d 0x00 +2 341 0 0x2e3f 1008:2e3f far-pointer-32 False internal entry-ordinal:240 1008:2de0 0x00 +2 342 0 0x2e5b 1008:2e5b far-pointer-32 False internal entry-ordinal:268 1020:0147 0x00 +2 343 0 0x2e7c 1008:2e7c far-pointer-32 False internal entry-ordinal:241 1008:2dff 0x00 +2 344 0 0x2e81 1008:2e81 offset-16 False internal entry-ordinal:242 1008:2e22 0x00 +2 345 0 0x2e84 1008:2e84 selector-16 False internal entry-ordinal:242 1008:2e22 0x00 +2 346 0 0x3054 1008:3054 far-pointer-32 False internal entry-ordinal:243 1008:2e92 0x00 +2 347 0 0x3060 1008:3060 far-pointer-32 False internal entry-ordinal:267 1020:012d 0x00 +2 348 0 0x3082 1008:3082 far-pointer-32 False internal entry-ordinal:245 1008:2ec0 0x00 +2 349 0 0x30b3 1008:30b3 far-pointer-32 False internal entry-ordinal:243 1008:2e92 0x00 +2 350 0 0x30ba 1008:30ba far-pointer-32 False internal entry-ordinal:268 1020:0147 0x00 +3 1 0 0x0013 1010:0013 far-pointer-32 False import-ordinal KERNEL.ordinal:96 KERNEL 96 0x01 +3 2 0 0x008f 1010:008f far-pointer-32 False import-ordinal KERNEL.ordinal:36 KERNEL 36 0x01 +3 3 0 0x0099 1010:0099 far-pointer-32 False internal entry-ordinal:102 1010:0002 0x00 +3 4 0 0x00c6 1010:00c6 far-pointer-32 False internal entry-ordinal:125 1008:2643 0x00 +3 5 0 0x00e1 1010:00e1 far-pointer-32 False import-ordinal KERNEL.ordinal:134 KERNEL 134 0x01 +3 6 0 0x00f7 1010:00f7 far-pointer-32 False internal entry-ordinal:125 1008:2643 0x00 +3 7 0 0x0112 1010:0112 far-pointer-32 False import-ordinal KERNEL.ordinal:135 KERNEL 135 0x01 +3 8 0 0x0128 1010:0128 far-pointer-32 False internal entry-ordinal:125 1008:2643 0x00 +3 9 0 0x0140 1010:0140 far-pointer-32 False import-ordinal KERNEL.ordinal:47 KERNEL 47 0x01 +3 10 0 0x014f 1010:014f far-pointer-32 False import-ordinal KERNEL.ordinal:49 KERNEL 49 0x01 +3 11 0 0x016c 1010:016c far-pointer-32 False internal entry-ordinal:126 1008:26b0 0x00 +3 12 0 0x0182 1010:0182 far-pointer-32 False internal entry-ordinal:125 1008:2643 0x00 +3 13 0 0x01a3 1010:01a3 far-pointer-32 False internal entry-ordinal:127 1008:2819 0x00 +3 14 0 0x01aa 1010:01aa far-pointer-32 False internal entry-ordinal:125 1008:2643 0x00 +3 15 0 0x01eb 1010:01eb far-pointer-32 False internal entry-ordinal:103 1010:00a2 0x00 +3 16 0 0x01f9 1010:01f9 far-pointer-32 False import-ordinal KERNEL.ordinal:95 KERNEL 95 0x01 +3 17 0 0x020d 1010:020d far-pointer-32 False import-ordinal KERNEL.ordinal:107 KERNEL 107 0x01 +3 18 0 0x0217 1010:0217 far-pointer-32 False import-ordinal KERNEL.ordinal:95 KERNEL 95 0x01 +3 19 0 0x0221 1010:0221 far-pointer-32 False import-ordinal KERNEL.ordinal:107 KERNEL 107 0x01 +3 20 0 0x0239 1010:0239 far-pointer-32 False import-ordinal KERNEL.ordinal:50 KERNEL 50 0x01 +3 21 0 0x024e 1010:024e far-pointer-32 False import-ordinal KERNEL.ordinal:50 KERNEL 50 0x01 +3 22 0 0x0263 1010:0263 far-pointer-32 False import-ordinal KERNEL.ordinal:50 KERNEL 50 0x01 +3 23 0 0x0278 1010:0278 far-pointer-32 False import-ordinal KERNEL.ordinal:50 KERNEL 50 0x01 +3 24 0 0x028d 1010:028d far-pointer-32 False import-ordinal KERNEL.ordinal:50 KERNEL 50 0x01 +3 25 0 0x02a2 1010:02a2 far-pointer-32 False import-ordinal KERNEL.ordinal:50 KERNEL 50 0x01 +3 26 0 0x02b7 1010:02b7 far-pointer-32 False import-ordinal KERNEL.ordinal:50 KERNEL 50 0x01 +3 27 0 0x02cc 1010:02cc far-pointer-32 False import-ordinal KERNEL.ordinal:50 KERNEL 50 0x01 +3 28 0 0x02e8 1010:02e8 far-pointer-32 False import-ordinal KERNEL.ordinal:50 KERNEL 50 0x01 +3 29 0 0x0307 1010:0307 far-pointer-32 False import-ordinal KERNEL.ordinal:50 KERNEL 50 0x01 +3 30 0 0x031c 1010:031c far-pointer-32 False import-ordinal KERNEL.ordinal:50 KERNEL 50 0x01 +3 31 0 0x0328 1010:0328 far-pointer-32 False import-ordinal KERNEL.ordinal:36 KERNEL 36 0x01 +3 32 0 0x0368 1010:0368 far-pointer-32 False internal entry-ordinal:102 1010:0002 0x00 +3 33 0 0x03ca 1010:03ca far-pointer-32 False internal entry-ordinal:104 1010:01c2 0x00 +3 34 0 0x03e6 1010:03e6 far-pointer-32 False internal entry-ordinal:100 1010:0079 0x00 +3 35 0 0x03f3 1010:03f3 far-pointer-32 False internal entry-ordinal:191 1018:1b08 0x00 +3 36 0 0x03fa 1010:03fa far-pointer-32 False internal entry-ordinal:295 1020:0439 0x00 +3 37 0 0x0432 1010:0432 far-pointer-32 False internal entry-ordinal:276 1020:0667 0x00 +3 38 0 0x043f 1010:043f far-pointer-32 False internal entry-ordinal:277 1020:06ab 0x00 +3 39 0 0x0444 1010:0444 far-pointer-32 False internal entry-ordinal:270 1020:0388 0x00 +3 40 0 0x0457 1010:0457 far-pointer-32 False internal entry-ordinal:278 1020:072c 0x00 +3 41 0 0x045c 1010:045c far-pointer-32 False internal entry-ordinal:271 1020:038f 0x00 +3 42 0 0x047f 1010:047f far-pointer-32 False import-ordinal KERNEL.ordinal:135 KERNEL 135 0x01 +3 43 0 0x0492 1010:0492 far-pointer-32 False internal entry-ordinal:253 1008:300a 0x00 +3 44 0 0x049c 1010:049c far-pointer-32 False internal entry-ordinal:263 1020:0a51 0x00 +3 45 0 0x04ac 1010:04ac far-pointer-32 False internal entry-ordinal:253 1008:300a 0x00 +3 46 0 0x04b1 1010:04b1 far-pointer-32 False internal entry-ordinal:263 1020:0a51 0x00 +3 47 0 0x04be 1010:04be far-pointer-32 False internal entry-ordinal:262 1020:09ec 0x00 +3 48 0 0x04ce 1010:04ce far-pointer-32 False internal entry-ordinal:253 1008:300a 0x00 +3 49 0 0x04d8 1010:04d8 far-pointer-32 False internal entry-ordinal:263 1020:0a51 0x00 +3 50 0 0x04e8 1010:04e8 far-pointer-32 False internal entry-ordinal:253 1008:300a 0x00 +3 51 0 0x04ed 1010:04ed far-pointer-32 False internal entry-ordinal:263 1020:0a51 0x00 +3 52 0 0x04fa 1010:04fa far-pointer-32 False internal entry-ordinal:262 1020:09ec 0x00 +3 53 0 0x0516 1010:0516 far-pointer-32 False internal entry-ordinal:253 1008:300a 0x00 +3 54 0 0x051b 1010:051b far-pointer-32 False internal entry-ordinal:248 1008:2f2f 0x00 +3 55 0 0x0525 1010:0525 far-pointer-32 False internal entry-ordinal:105 1010:0405 0x00 +3 56 0 0x0533 1010:0533 far-pointer-32 False internal entry-ordinal:105 1010:0405 0x00 +3 57 0 0x054c 1010:054c far-pointer-32 False internal entry-ordinal:253 1008:300a 0x00 +3 58 0 0x0551 1010:0551 far-pointer-32 False internal entry-ordinal:248 1008:2f2f 0x00 +3 59 0 0x05ae 1010:05ae far-pointer-32 False import-ordinal KERNEL.ordinal:3 KERNEL 3 0x01 +4 1 0 0x0056 1018:0056 far-pointer-32 False import-ordinal USER.ordinal:26 USER 26 0x01 +4 2 0 0x0066 1018:0066 far-pointer-32 False import-ordinal USER.ordinal:26 USER 26 0x01 +4 3 0 0x007f 1018:007f far-pointer-32 False import-ordinal USER.ordinal:24 USER 24 0x01 +4 4 0 0x008c 1018:008c far-pointer-32 False import-ordinal USER.ordinal:24 USER 24 0x01 +4 5 0 0x00a0 1018:00a0 far-pointer-32 False import-ordinal USER.ordinal:47 USER 47 0x01 +4 6 0 0x00b1 1018:00b1 far-pointer-32 False import-ordinal USER.ordinal:135 USER 135 0x01 +4 7 0 0x00e9 1018:00e9 far-pointer-32 False import-ordinal USER.ordinal:25 USER 25 0x01 +4 8 0 0x00f7 1018:00f7 far-pointer-32 False import-ordinal USER.ordinal:25 USER 25 0x01 +4 9 0 0x01a9 1018:01a9 far-pointer-32 False import-ordinal USER.ordinal:136 USER 136 0x01 +4 10 0 0x01b7 1018:01b7 far-pointer-32 False internal entry-ordinal:208 1018:0045 0x00 +4 11 0 0x01f8 1018:01f8 far-pointer-32 False import-ordinal KERNEL.ordinal:15 KERNEL 15 0x01 +4 12 0 0x01fe 1018:01fe far-pointer-32 False import-ordinal KERNEL.ordinal:18 KERNEL 18 0x01 +4 13 0 0x0222 1018:0222 far-pointer-32 False internal entry-ordinal:282 1020:16a5 0x00 +4 14 0 0x029f 1018:029f far-pointer-32 False import-ordinal KERNEL.ordinal:177 KERNEL 177 0x01 +4 15 0 0x02bb 1018:02bb far-pointer-32 False import-ordinal KERNEL.ordinal:170 KERNEL 170 0x01 +4 16 0 0x02e9 1018:02e9 far-pointer-32 False import-ordinal KERNEL.ordinal:176 KERNEL 176 0x01 +4 17 0 0x030c 1018:030c far-pointer-32 False import-ordinal KERNEL.ordinal:170 KERNEL 170 0x01 +4 18 0 0x0329 1018:0329 far-pointer-32 False import-ordinal KERNEL.ordinal:176 KERNEL 176 0x01 +4 19 0 0x0349 1018:0349 far-pointer-32 False internal entry-ordinal:294 1020:03ef 0x00 +4 20 0 0x035b 1018:035b far-pointer-32 False internal entry-ordinal:235 1008:2d99 0x00 +4 21 0 0x0395 1018:0395 far-pointer-32 False internal entry-ordinal:158 1018:069a 0x00 +4 22 0 0x03c2 1018:03c2 far-pointer-32 False internal entry-ordinal:212 1018:01dc 0x00 +4 23 0 0x03d9 1018:03d9 far-pointer-32 False internal entry-ordinal:143 1018:060d 0x00 +4 24 0 0x03f4 1018:03f4 far-pointer-32 False internal entry-ordinal:236 1008:2db3 0x00 +4 25 0 0x0410 1018:0410 offset-16 False internal entry-ordinal:214 1018:03e9 0x00 +4 26 0 0x0413 1018:0413 selector-16 False internal entry-ordinal:214 1018:03e9 0x00 +4 27 0 0x041d 1018:041d far-pointer-32 False internal entry-ordinal:141 1018:085a 0x00 +4 28 0 0x0437 1018:0437 far-pointer-32 False internal entry-ordinal:159 1018:071c 0x00 +4 29 0 0x0447 1018:0447 far-pointer-32 False internal entry-ordinal:213 1018:02fa 0x00 +4 30 0 0x0454 1018:0454 far-pointer-32 False internal entry-ordinal:237 1008:2dcd 0x00 +4 31 0 0x045b 1018:045b far-pointer-32 False internal entry-ordinal:295 1020:0439 0x00 +4 32 0 0x04b4 1018:04b4 far-pointer-32 False internal entry-ordinal:139 1018:0673 0x00 +4 33 0 0x04e2 1018:04e2 far-pointer-32 False import-ordinal USER.ordinal:31 USER 31 0x01 +4 34 0 0x04f9 1018:04f9 far-pointer-32 False import-ordinal USER.ordinal:36 USER 36 0x01 +4 35 0 0x050a 1018:050a far-pointer-32 False import-ordinal USER.ordinal:37 USER 37 0x01 +4 36 0 0x0541 1018:0541 far-pointer-32 False internal entry-ordinal:216 1018:049e 0x00 +4 37 0 0x056e 1018:056e offset-16 False internal entry-ordinal:215 1018:0466 0x00 +4 38 0 0x0571 1018:0571 selector-16 False internal entry-ordinal:215 1018:0466 0x00 +4 39 0 0x057b 1018:057b far-pointer-32 False internal entry-ordinal:140 1018:080d 0x00 +4 40 0 0x0595 1018:0595 far-pointer-32 False internal entry-ordinal:216 1018:049e 0x00 +4 41 0 0x05b4 1018:05b4 offset-16 False internal entry-ordinal:217 1018:0524 0x00 +4 42 0 0x05b7 1018:05b7 selector-16 False internal entry-ordinal:217 1018:0524 0x00 +4 43 0 0x05c1 1018:05c1 far-pointer-32 False internal entry-ordinal:140 1018:080d 0x00 +4 44 0 0x0602 1018:0602 far-pointer-32 False internal entry-ordinal:138 1018:0641 0x00 +4 45 0 0x061c 1018:061c far-pointer-32 False internal entry-ordinal:138 1018:0641 0x00 +4 46 0 0x0636 1018:0636 far-pointer-32 False internal entry-ordinal:138 1018:0641 0x00 +4 47 0 0x0900 1018:0900 far-pointer-32 False internal entry-ordinal:139 1018:0673 0x00 +4 48 0 0x0924 1018:0924 far-pointer-32 False import-ordinal USER.ordinal:91 USER 91 0x01 +4 49 0 0x093e 1018:093e far-pointer-32 False import-ordinal USER.ordinal:111 USER 111 0x01 +4 50 0 0x096f 1018:096f far-pointer-32 False import-ordinal USER.ordinal:23 USER 23 0x01 +4 51 0 0x097a 1018:097a far-pointer-32 False internal entry-ordinal:207 1018:0097 0x00 +4 52 0 0x09a2 1018:09a2 far-pointer-32 False import-ordinal USER.ordinal:46 USER 46 0x01 +4 53 0 0x09ad 1018:09ad far-pointer-32 False internal entry-ordinal:207 1018:0097 0x00 +4 54 0 0x09e4 1018:09e4 far-pointer-32 False internal entry-ordinal:218 1018:08c3 0x00 +4 55 0 0x0a0c 1018:0a0c far-pointer-32 False import-ordinal USER.ordinal:91 USER 91 0x01 +4 56 0 0x0a12 1018:0a12 far-pointer-32 False internal entry-ordinal:207 1018:0097 0x00 +4 57 0 0x0a42 1018:0a42 far-pointer-32 False internal entry-ordinal:218 1018:08c3 0x00 +4 58 0 0x0a68 1018:0a68 far-pointer-32 False internal entry-ordinal:218 1018:08c3 0x00 +4 59 0 0x0a9c 1018:0a9c far-pointer-32 False internal entry-ordinal:207 1018:0097 0x00 +4 60 0 0x0ac4 1018:0ac4 far-pointer-32 False internal entry-ordinal:218 1018:08c3 0x00 +4 61 0 0x0ad4 1018:0ad4 far-pointer-32 False import-ordinal USER.ordinal:133 USER 133 0x01 +4 62 0 0x0af6 1018:0af6 far-pointer-32 False internal entry-ordinal:218 1018:08c3 0x00 +4 63 0 0x0b34 1018:0b34 far-pointer-32 False import-ordinal USER.ordinal:135 USER 135 0x01 +4 64 0 0x0b7b 1018:0b7b far-pointer-32 False import-ordinal USER.ordinal:135 USER 135 0x01 +4 65 0 0x0bf8 1018:0bf8 far-pointer-32 False internal entry-ordinal:207 1018:0097 0x00 +4 66 0 0x0c32 1018:0c32 far-pointer-32 False internal entry-ordinal:218 1018:08c3 0x00 +4 67 0 0x0c91 1018:0c91 far-pointer-32 False internal entry-ordinal:218 1018:08c3 0x00 +4 68 0 0x0cb1 1018:0cb1 far-pointer-32 False import-ordinal USER.ordinal:133 USER 133 0x01 +4 69 0 0x0cbc 1018:0cbc far-pointer-32 False internal entry-ordinal:218 1018:08c3 0x00 +4 70 0 0x0cdc 1018:0cdc far-pointer-32 False internal entry-ordinal:143 1018:060d 0x00 +4 71 0 0x0cf7 1018:0cf7 offset-16 False internal entry-ordinal:219 1018:0cc7 0x00 +4 72 0 0x0cfa 1018:0cfa selector-16 False internal entry-ordinal:219 1018:0cc7 0x00 +4 73 0 0x0d04 1018:0d04 far-pointer-32 False internal entry-ordinal:141 1018:085a 0x00 +4 74 0 0x0d10 1018:0d10 far-pointer-32 False internal entry-ordinal:139 1018:0673 0x00 +4 75 0 0x0d51 1018:0d51 far-pointer-32 False import-ordinal USER.ordinal:111 USER 111 0x01 +4 76 0 0x0d5f 1018:0d5f far-pointer-32 False import-ordinal USER.ordinal:53 USER 53 0x01 +4 77 0 0x0d90 1018:0d90 far-pointer-32 False internal entry-ordinal:238 1008:2d87 0x00 +4 78 0 0x0da6 1018:0da6 far-pointer-32 False internal entry-ordinal:160 1018:055c 0x00 +4 79 0 0x0dda 1018:0dda far-pointer-32 False internal entry-ordinal:139 1018:0673 0x00 +4 80 0 0x0e2e 1018:0e2e offset-16 False internal entry-ordinal:220 1018:0dcd 0x00 +4 81 0 0x0e31 1018:0e31 selector-16 False internal entry-ordinal:220 1018:0dcd 0x00 +4 82 0 0x0e3b 1018:0e3b far-pointer-32 False internal entry-ordinal:141 1018:085a 0x00 +4 83 0 0x0e69 1018:0e69 far-pointer-32 False import-ordinal USER.ordinal:404 USER 404 0x01 +4 84 0 0x0e87 1018:0e87 far-pointer-32 False import-ordinal USER.ordinal:57 USER 57 0x01 +4 85 0 0x0eb5 1018:0eb5 far-pointer-32 False import-ordinal USER.ordinal:42 USER 42 0x01 +4 86 0 0x0efd 1018:0efd offset-16 False internal entry-ordinal:221 1018:0ec0 0x00 +4 87 0 0x0f00 1018:0f00 selector-16 False internal entry-ordinal:221 1018:0ec0 0x00 +4 88 0 0x0f0a 1018:0f0a far-pointer-32 False internal entry-ordinal:140 1018:080d 0x00 +4 89 0 0x0f2d 1018:0f2d far-pointer-32 False internal entry-ordinal:157 1018:0f38 0x00 +4 90 0 0x0f82 1018:0f82 far-pointer-32 False internal entry-ordinal:236 1008:2db3 0x00 +4 91 0 0x0fb1 1018:0fb1 far-pointer-32 False import-ordinal USER.ordinal:6 USER 6 0x01 +4 92 0 0x0fd9 1018:0fd9 far-pointer-32 False internal entry-ordinal:209 1018:0071 0x00 +4 93 0 0x1024 1018:1024 far-pointer-32 False internal entry-ordinal:139 1018:0673 0x00 +4 94 0 0x1038 1018:1038 far-pointer-32 False internal entry-ordinal:196 1018:1bdf 0x00 +4 95 0 0x1049 1018:1049 far-pointer-32 False internal entry-ordinal:196 1018:1bdf 0x00 +4 96 0 0x10cc 1018:10cc far-pointer-32 False internal entry-ordinal:157 1018:0f38 0x00 +4 97 0 0x1111 1018:1111 far-pointer-32 False internal entry-ordinal:294 1020:03ef 0x00 +4 98 0 0x1129 1018:1129 far-pointer-32 False internal entry-ordinal:133 1018:0341 0x00 +4 99 0 0x1141 1018:1141 far-pointer-32 False internal entry-ordinal:254 1008:302c 0x00 +4 100 0 0x1150 1018:1150 offset-16 False import-ordinal USER.ordinal:107 USER 107 0x01 +4 101 0 0x1153 1018:1153 selector-16 False import-ordinal USER.ordinal:107 USER 107 0x01 +4 102 0 0x1192 1018:1192 far-pointer-32 False internal entry-ordinal:138 1018:0641 0x00 +4 103 0 0x1197 1018:1197 offset-16 False import-ordinal USER.ordinal:447 USER 447 0x01 +4 104 0 0x119a 1018:119a selector-16 False import-ordinal USER.ordinal:447 USER 447 0x01 +4 105 0 0x122c 1018:122c far-pointer-32 False internal entry-ordinal:255 1008:3099 0x00 +4 106 0 0x1262 1018:1262 far-pointer-32 False internal entry-ordinal:134 1018:03ff 0x00 +4 107 0 0x1269 1018:1269 far-pointer-32 False internal entry-ordinal:295 1020:0439 0x00 +4 108 0 0x1297 1018:1297 far-pointer-32 False import-ordinal USER.ordinal:174 USER 174 0x01 +4 109 0 0x12aa 1018:12aa far-pointer-32 False import-ordinal USER.ordinal:173 USER 173 0x01 +4 110 0 0x12e1 1018:12e1 offset-16 False internal entry-ordinal:211 1018:018b 0x00 +4 111 0 0x12e4 1018:12e4 selector-16 False internal entry-ordinal:211 1018:018b 0x00 +4 112 0 0x1339 1018:1339 far-pointer-32 False import-ordinal USER.ordinal:122 USER 122 0x01 +4 113 0 0x1367 1018:1367 far-pointer-32 False internal entry-ordinal:144 1018:0627 0x00 +4 114 0 0x1395 1018:1395 far-pointer-32 False internal entry-ordinal:139 1018:0673 0x00 +4 115 0 0x13c5 1018:13c5 far-pointer-32 False internal entry-ordinal:139 1018:0673 0x00 +4 116 0 0x1425 1018:1425 far-pointer-32 False import-ordinal USER.ordinal:452 USER 452 0x01 +4 117 0 0x14b1 1018:14b1 far-pointer-32 False import-ordinal USER.ordinal:111 USER 111 0x01 +4 118 0 0x14c9 1018:14c9 far-pointer-32 False import-ordinal USER.ordinal:91 USER 91 0x01 +4 119 0 0x14ee 1018:14ee far-pointer-32 False internal entry-ordinal:207 1018:0097 0x00 +4 120 0 0x1500 1018:1500 far-pointer-32 False internal entry-ordinal:208 1018:0045 0x00 +4 121 0 0x1516 1018:1516 far-pointer-32 False import-ordinal USER.ordinal:136 USER 136 0x01 +4 122 0 0x155b 1018:155b far-pointer-32 False import-ordinal USER.ordinal:47 USER 47 0x01 +4 123 0 0x156b 1018:156b far-pointer-32 False import-ordinal USER.ordinal:31 USER 31 0x01 +4 124 0 0x157b 1018:157b far-pointer-32 False import-ordinal USER.ordinal:22 USER 22 0x01 +4 125 0 0x158f 1018:158f far-pointer-32 False import-ordinal USER.ordinal:23 USER 23 0x01 +4 126 0 0x15a7 1018:15a7 far-pointer-32 False import-ordinal USER.ordinal:48 USER 48 0x01 +4 127 0 0x15d0 1018:15d0 far-pointer-32 False import-ordinal USER.ordinal:31 USER 31 0x01 +4 128 0 0x15e3 1018:15e3 far-pointer-32 False import-ordinal USER.ordinal:272 USER 272 0x01 +4 129 0 0x15fb 1018:15fb far-pointer-32 False import-ordinal USER.ordinal:32 USER 32 0x01 +4 130 0 0x1642 1018:1642 far-pointer-32 False internal entry-ordinal:139 1018:0673 0x00 +4 131 0 0x1657 1018:1657 far-pointer-32 False import-ordinal USER.ordinal:29 USER 29 0x01 +4 132 0 0x1681 1018:1681 far-pointer-32 False import-ordinal USER.ordinal:29 USER 29 0x01 +4 133 0 0x16b0 1018:16b0 far-pointer-32 False internal entry-ordinal:167 1018:0ffd 0x00 +4 134 0 0x16bc 1018:16bc far-pointer-32 False internal entry-ordinal:139 1018:0673 0x00 +4 135 0 0x16d4 1018:16d4 far-pointer-32 False internal entry-ordinal:173 1018:1547 0x00 +4 136 0 0x16e0 1018:16e0 far-pointer-32 False internal entry-ordinal:174 1018:1586 0x00 +4 137 0 0x1701 1018:1701 far-pointer-32 False internal entry-ordinal:296 1020:16e1 0x00 +4 138 0 0x1717 1018:1717 far-pointer-32 False internal entry-ordinal:151 1018:0d9b 0x00 +4 139 0 0x1723 1018:1723 far-pointer-32 False internal entry-ordinal:139 1018:0673 0x00 +4 140 0 0x1733 1018:1733 far-pointer-32 False import-ordinal USER.ordinal:22 USER 22 0x01 +4 141 0 0x1756 1018:1756 far-pointer-32 False internal entry-ordinal:189 1018:15c0 0x00 +4 142 0 0x1797 1018:1797 far-pointer-32 False import-ordinal USER.ordinal:135 USER 135 0x01 +4 143 0 0x1807 1018:1807 far-pointer-32 False import-ordinal USER.ordinal:135 USER 135 0x01 +4 144 0 0x187d 1018:187d far-pointer-32 False import-ordinal USER.ordinal:39 USER 39 0x01 +4 145 0 0x18de 1018:18de far-pointer-32 False import-ordinal USER.ordinal:40 USER 40 0x01 +4 146 0 0x192e 1018:192e far-pointer-32 False import-ordinal USER.ordinal:32 USER 32 0x01 +4 147 0 0x196b 1018:196b far-pointer-32 False internal entry-ordinal:189 1018:15c0 0x00 +4 148 0 0x19ae 1018:19ae far-pointer-32 False import-ordinal USER.ordinal:18 USER 18 0x01 +4 149 0 0x19c0 1018:19c0 far-pointer-32 False import-ordinal USER.ordinal:109 USER 109 0x01 +4 150 0 0x19ce 1018:19ce far-pointer-32 False import-ordinal USER.ordinal:113 USER 113 0x01 +4 151 0 0x19d8 1018:19d8 far-pointer-32 False import-ordinal USER.ordinal:114 USER 114 0x01 +4 152 0 0x19f3 1018:19f3 far-pointer-32 False import-ordinal USER.ordinal:19 USER 19 0x01 +4 153 0 0x1a1b 1018:1a1b far-pointer-32 False internal entry-ordinal:139 1018:0673 0x00 +4 154 0 0x1a35 1018:1a35 far-pointer-32 False internal entry-ordinal:174 1018:1586 0x00 +4 155 0 0x1a46 1018:1a46 far-pointer-32 False internal entry-ordinal:173 1018:1547 0x00 +4 156 0 0x1a69 1018:1a69 far-pointer-32 False internal entry-ordinal:294 1020:03ef 0x00 +4 157 0 0x1a7b 1018:1a7b far-pointer-32 False internal entry-ordinal:235 1008:2d99 0x00 +4 158 0 0x1abc 1018:1abc offset-16 False internal entry-ordinal:210 1018:0133 0x00 +4 159 0 0x1abf 1018:1abf selector-16 False internal entry-ordinal:210 1018:0133 0x00 +4 160 0 0x1ac8 1018:1ac8 far-pointer-32 False import-ordinal KERNEL.ordinal:51 KERNEL 51 0x01 +4 161 0 0x1ad4 1018:1ad4 far-pointer-32 False internal entry-ordinal:239 1008:2e76 0x00 +4 162 0 0x1b16 1018:1b16 far-pointer-32 False import-ordinal KERNEL.ordinal:52 KERNEL 52 0x01 +4 163 0 0x1b23 1018:1b23 far-pointer-32 False internal entry-ordinal:237 1008:2dcd 0x00 +4 164 0 0x1b2a 1018:1b2a far-pointer-32 False internal entry-ordinal:295 1020:0439 0x00 +4 165 0 0x1b9a 1018:1b9a far-pointer-32 False internal entry-ordinal:152 1018:0e9e 0x00 +4 166 0 0x1c16 1018:1c16 far-pointer-32 False import-ordinal USER.ordinal:109 USER 109 0x01 +4 167 0 0x1c44 1018:1c44 far-pointer-32 False import-ordinal USER.ordinal:113 USER 113 0x01 +4 168 0 0x1c4e 1018:1c4e far-pointer-32 False import-ordinal USER.ordinal:114 USER 114 0x01 +4 169 0 0x1c64 1018:1c64 far-pointer-32 False import-ordinal USER.ordinal:112 USER 112 0x01 +4 170 0 0x1d0b 1018:1d0b far-pointer-32 False import-ordinal USER.ordinal:90 USER 90 0x01 +4 171 0 0x1d49 1018:1d49 far-pointer-32 False import-ordinal USER.ordinal:178 USER 178 0x01 +4 172 0 0x1d96 1018:1d96 far-pointer-32 False import-ordinal USER.ordinal:451 USER 451 0x01 +4 173 0 0x1dca 1018:1dca far-pointer-32 False internal entry-ordinal:240 1008:2de0 0x00 +4 174 0 0x1dee 1018:1dee far-pointer-32 False internal entry-ordinal:241 1008:2dff 0x00 +4 175 0 0x1f2c 1018:1f2c far-pointer-32 False import-ordinal USER.ordinal:421 USER 421 0x01 +4 176 0 0x1f4b 1018:1f4b far-pointer-32 False internal entry-ordinal:258 1020:0061 0x00 +5 1 0 0x0027 1020:0027 far-pointer-32 False import-ordinal KERNEL.ordinal:30 KERNEL 30 0x01 +5 2 0 0x0030 1020:0030 far-pointer-32 False import-ordinal USER.ordinal:5 USER 5 0x01 +5 3 0 0x0039 1020:0039 far-pointer-32 False import-ordinal KERNEL.ordinal:132 KERNEL 132 0x01 +5 4 0 0x0051 1020:0051 offset-16 False import-ordinal KERNEL.ordinal:114 KERNEL 114 0x01 +5 5 0 0x00c7 1020:00c7 far-pointer-32 False import-ordinal USER.ordinal:1 USER 1 0x01 +5 6 0 0x0171 1020:0171 far-pointer-32 False import-ordinal KERNEL.ordinal:169 KERNEL 169 0x01 +5 7 0 0x019f 1020:019f far-pointer-32 False import-ordinal KERNEL.ordinal:25 KERNEL 25 0x01 +5 8 0 0x022b 1020:022b far-pointer-32 False import-ordinal KERNEL.ordinal:15 KERNEL 15 0x01 +5 9 0 0x0236 1020:0236 far-pointer-32 False import-ordinal KERNEL.ordinal:18 KERNEL 18 0x01 +5 10 0 0x034c 1020:034c far-pointer-32 False import-ordinal KERNEL.ordinal:21 KERNEL 21 0x01 +5 11 0 0x0357 1020:0357 far-pointer-32 False import-ordinal KERNEL.ordinal:19 KERNEL 19 0x01 +5 12 0 0x035c 1020:035c far-pointer-32 False import-ordinal KERNEL.ordinal:17 KERNEL 17 0x01 +5 13 0 0x04c6 1020:04c6 offset-16 False internal entry-ordinal:297 1020:0be9 0x00 +5 14 0 0x04ca 1020:04ca selector-16 False internal entry-ordinal:297 1020:0be9 0x00 +5 15 0 0x04f4 1020:04f4 far-pointer-32 False import-ordinal KEYBOARD.ordinal:5 KEYBOARD 5 0x01 +5 16 0 0x06a3 1020:06a3 far-pointer-32 False import-ordinal KEYBOARD.ordinal:5 KEYBOARD 5 0x01 +5 17 0 0x0857 1020:0857 far-pointer-32 False import-ordinal KERNEL.ordinal:49 KERNEL 49 0x01 +5 18 0 0x0c1b 1020:0c1b offset-16 False internal entry-ordinal:298 1020:05d8 0x00 +5 19 0 0x0c1e 1020:0c1e selector-16 False internal entry-ordinal:298 1020:05d8 0x00 +5 20 0 0x0c36 1020:0c36 offset-16 False internal entry-ordinal:300 1020:062d 0x00 +5 21 0 0x0c39 1020:0c39 selector-16 False internal entry-ordinal:300 1020:062d 0x00 +5 22 0 0x0c4c 1020:0c4c offset-16 False internal entry-ordinal:299 1020:0608 0x00 +5 23 0 0x0c4f 1020:0c4f selector-16 False internal entry-ordinal:299 1020:0608 0x00 +5 24 0 0x0c69 1020:0c69 offset-16 False internal entry-ordinal:301 1020:064d 0x00 +5 25 0 0x0c6e 1020:0c6e selector-16 False internal entry-ordinal:301 1020:064d 0x00 +5 26 0 0x14e1 1020:14e1 offset-16 True os-fixup os-fixup:3:0 0x07 +5 27 0 0x14ec 1020:14ec offset-16 True os-fixup os-fixup:3:0 0x07 +5 28 0 0x14e7 1020:14e7 offset-16 True os-fixup os-fixup:5:0 0x07 +5 29 0 0x14f2 1020:14f2 offset-16 True os-fixup os-fixup:5:0 0x07 +5 30 0 0x14f5 1020:14f5 offset-16 True os-fixup os-fixup:5:0 0x07 +5 31 0 0x14f8 1020:14f8 offset-16 True os-fixup os-fixup:6:0 0x07 +6 1 0 0x0038 1028:0038 far-pointer-32 False internal entry-ordinal:1 1000:0100 0x00 +6 2 0 0x003c 1028:003c far-pointer-32 False internal entry-ordinal:2 1000:0121 0x00 +6 3 0 0x002c 1028:002c far-pointer-32 False internal entry-ordinal:99 1010:03e0 0x00 +6 4 0 0x0030 1028:0030 far-pointer-32 False internal entry-ordinal:192 1018:1b35 0x00 +6 5 0 0x0034 1028:0034 far-pointer-32 False internal entry-ordinal:193 1018:1b4b 0x00 +6 6 0 0x0040 1028:0040 far-pointer-32 False internal entry-ordinal:195 1018:1bb0 0x00 +6 7 0 0x0044 1028:0044 far-pointer-32 False internal entry-ordinal:197 1018:1bfc 0x00 +6 8 0 0x0048 1028:0048 far-pointer-32 False internal entry-ordinal:198 1018:1c7f 0x00 +6 9 0 0x004c 1028:004c far-pointer-32 False internal entry-ordinal:199 1018:1cd6 0x00 +6 10 0 0x0050 1028:0050 far-pointer-32 False internal entry-ordinal:200 1018:1d22 0x00 +6 11 0 0x0054 1028:0054 far-pointer-32 False internal entry-ordinal:201 1018:1d64 0x00 +6 12 0 0x0058 1028:0058 far-pointer-32 False internal entry-ordinal:202 1018:1e39 0x00 +6 13 0 0x005c 1028:005c far-pointer-32 False internal entry-ordinal:203 1018:1eb0 0x00 +6 14 0 0x0060 1028:0060 far-pointer-32 False internal entry-ordinal:204 1018:1db1 0x00 +6 15 0 0x0064 1028:0064 far-pointer-32 False internal entry-ordinal:205 1018:1f14 0x00 +6 16 0 0x0068 1028:0068 far-pointer-32 False internal entry-ordinal:206 1018:1f56 0x00 +6 17 0 0x0082 1028:0082 far-pointer-32 False internal entry-ordinal:8 1000:6bf8 0x00 +6 18 0 0x0086 1028:0086 far-pointer-32 False internal entry-ordinal:9 1000:638e 0x00 +6 19 0 0x008a 1028:008a far-pointer-32 False internal entry-ordinal:10 1000:eab1 0x00 +6 20 0 0x008e 1028:008e far-pointer-32 False internal entry-ordinal:11 1000:58e7 0x00 +6 21 0 0x0092 1028:0092 far-pointer-32 False internal entry-ordinal:12 1000:5956 0x00 +6 22 0 0x0096 1028:0096 far-pointer-32 False internal entry-ordinal:13 1000:59a0 0x00 +6 23 0 0x009a 1028:009a far-pointer-32 False internal entry-ordinal:14 1000:5a37 0x00 +6 24 0 0x00d2 1028:00d2 far-pointer-32 False internal entry-ordinal:4 1000:016c 0x00 +6 25 0 0x00a6 1028:00a6 far-pointer-32 False internal entry-ordinal:5 1000:51f5 0x00 +6 26 0 0x00d6 1028:00d6 far-pointer-32 False internal entry-ordinal:6 1000:0270 0x00 +6 27 0 0x00ea 1028:00ea far-pointer-32 False internal entry-ordinal:7 1000:5390 0x00 +6 28 0 0x00c6 1028:00c6 far-pointer-32 False internal entry-ordinal:175 1018:12f5 0x00 +6 29 0 0x00be 1028:00be far-pointer-32 False internal entry-ordinal:176 1018:134f 0x00 +6 30 0 0x00aa 1028:00aa far-pointer-32 False internal entry-ordinal:177 1018:1311 0x00 +6 31 0 0x00ae 1028:00ae far-pointer-32 False internal entry-ordinal:135 1018:0bb3 0x00 +6 32 0 0x00b2 1028:00b2 far-pointer-32 False internal entry-ordinal:136 1018:0c3d 0x00 +6 33 0 0x00b6 1028:00b6 far-pointer-32 False internal entry-ordinal:137 1018:0c59 0x00 +6 34 0 0x00ba 1028:00ba far-pointer-32 False internal entry-ordinal:145 1018:0e46 0x00 +6 35 0 0x00c2 1028:00c2 far-pointer-32 False internal entry-ordinal:146 1018:0ce7 0x00 +6 36 0 0x00ca 1028:00ca far-pointer-32 False internal entry-ordinal:148 1018:0d6a 0x00 +6 37 0 0x00ce 1028:00ce far-pointer-32 False internal entry-ordinal:149 1018:10e9 0x00 +6 38 0 0x00da 1028:00da far-pointer-32 False internal entry-ordinal:153 1018:0ef4 0x00 +6 39 0 0x00de 1028:00de far-pointer-32 False internal entry-ordinal:154 1018:05dc 0x00 +6 40 0 0x00e2 1028:00e2 far-pointer-32 False internal entry-ordinal:155 1018:0e0a 0x00 +6 41 0 0x00e6 1028:00e6 far-pointer-32 False internal entry-ordinal:156 1018:0a85 0x00 +6 42 0 0x00fe 1028:00fe far-pointer-32 False internal entry-ordinal:20 1000:5ee6 0x00 +6 43 0 0x0102 1028:0102 far-pointer-32 False internal entry-ordinal:21 1000:5efc 0x00 +6 44 0 0x0106 1028:0106 far-pointer-32 False internal entry-ordinal:22 1000:5f29 0x00 +6 45 0 0x010a 1028:010a far-pointer-32 False internal entry-ordinal:23 1000:5fc0 0x00 +6 46 0 0x0142 1028:0142 far-pointer-32 False internal entry-ordinal:16 1000:5ab7 0x00 +6 47 0 0x0116 1028:0116 far-pointer-32 False internal entry-ordinal:17 1000:5ba6 0x00 +6 48 0 0x0146 1028:0146 far-pointer-32 False internal entry-ordinal:18 1000:5be5 0x00 +6 49 0 0x015a 1028:015a far-pointer-32 False internal entry-ordinal:19 1000:5c13 0x00 +6 50 0 0x0136 1028:0136 far-pointer-32 False internal entry-ordinal:175 1018:12f5 0x00 +6 51 0 0x012e 1028:012e far-pointer-32 False internal entry-ordinal:176 1018:134f 0x00 +6 52 0 0x011a 1028:011a far-pointer-32 False internal entry-ordinal:177 1018:1311 0x00 +6 53 0 0x011e 1028:011e far-pointer-32 False internal entry-ordinal:135 1018:0bb3 0x00 +6 54 0 0x0122 1028:0122 far-pointer-32 False internal entry-ordinal:136 1018:0c3d 0x00 +6 55 0 0x0126 1028:0126 far-pointer-32 False internal entry-ordinal:137 1018:0c59 0x00 +6 56 0 0x012a 1028:012a far-pointer-32 False internal entry-ordinal:145 1018:0e46 0x00 +6 57 0 0x0132 1028:0132 far-pointer-32 False internal entry-ordinal:146 1018:0ce7 0x00 +6 58 0 0x013a 1028:013a far-pointer-32 False internal entry-ordinal:148 1018:0d6a 0x00 +6 59 0 0x013e 1028:013e far-pointer-32 False internal entry-ordinal:149 1018:10e9 0x00 +6 60 0 0x014a 1028:014a far-pointer-32 False internal entry-ordinal:153 1018:0ef4 0x00 +6 61 0 0x014e 1028:014e far-pointer-32 False internal entry-ordinal:154 1018:05dc 0x00 +6 62 0 0x0152 1028:0152 far-pointer-32 False internal entry-ordinal:155 1018:0e0a 0x00 +6 63 0 0x0156 1028:0156 far-pointer-32 False internal entry-ordinal:156 1018:0a85 0x00 +6 64 0 0x016e 1028:016e far-pointer-32 False internal entry-ordinal:29 1000:6202 0x00 +6 65 0 0x0172 1028:0172 far-pointer-32 False internal entry-ordinal:30 1000:6218 0x00 +6 66 0 0x0176 1028:0176 far-pointer-32 False internal entry-ordinal:31 1000:6245 0x00 +6 67 0 0x017a 1028:017a far-pointer-32 False internal entry-ordinal:32 1000:62dc 0x00 +6 68 0 0x01b2 1028:01b2 far-pointer-32 False internal entry-ordinal:25 1000:6040 0x00 +6 69 0 0x0186 1028:0186 far-pointer-32 False internal entry-ordinal:26 1000:60e7 0x00 +6 70 0 0x01b6 1028:01b6 far-pointer-32 False internal entry-ordinal:27 1000:6129 0x00 +6 71 0 0x01ca 1028:01ca far-pointer-32 False internal entry-ordinal:28 1000:616e 0x00 +6 72 0 0x01a6 1028:01a6 far-pointer-32 False internal entry-ordinal:175 1018:12f5 0x00 +6 73 0 0x019e 1028:019e far-pointer-32 False internal entry-ordinal:176 1018:134f 0x00 +6 74 0 0x018a 1028:018a far-pointer-32 False internal entry-ordinal:177 1018:1311 0x00 +6 75 0 0x018e 1028:018e far-pointer-32 False internal entry-ordinal:135 1018:0bb3 0x00 +6 76 0 0x0192 1028:0192 far-pointer-32 False internal entry-ordinal:136 1018:0c3d 0x00 +6 77 0 0x0196 1028:0196 far-pointer-32 False internal entry-ordinal:137 1018:0c59 0x00 +6 78 0 0x019a 1028:019a far-pointer-32 False internal entry-ordinal:145 1018:0e46 0x00 +6 79 0 0x01a2 1028:01a2 far-pointer-32 False internal entry-ordinal:146 1018:0ce7 0x00 +6 80 0 0x01aa 1028:01aa far-pointer-32 False internal entry-ordinal:148 1018:0d6a 0x00 +6 81 0 0x01ae 1028:01ae far-pointer-32 False internal entry-ordinal:149 1018:10e9 0x00 +6 82 0 0x01ba 1028:01ba far-pointer-32 False internal entry-ordinal:153 1018:0ef4 0x00 +6 83 0 0x01be 1028:01be far-pointer-32 False internal entry-ordinal:154 1018:05dc 0x00 +6 84 0 0x01c2 1028:01c2 far-pointer-32 False internal entry-ordinal:155 1018:0e0a 0x00 +6 85 0 0x01c6 1028:01c6 far-pointer-32 False internal entry-ordinal:156 1018:0a85 0x00 +6 86 0 0x020a 1028:020a far-pointer-32 False internal entry-ordinal:107 1008:168e 0x00 +6 87 0 0x0206 1028:0206 far-pointer-32 False internal entry-ordinal:108 1008:16be 0x00 +6 88 0 0x01d6 1028:01d6 far-pointer-32 False internal entry-ordinal:223 1008:2a0e 0x00 +6 89 0 0x01ee 1028:01ee far-pointer-32 False internal entry-ordinal:224 1008:2a45 0x00 +6 90 0 0x021a 1028:021a far-pointer-32 False internal entry-ordinal:225 1008:2ae3 0x00 +6 91 0 0x021e 1028:021e far-pointer-32 False internal entry-ordinal:226 1008:2bd1 0x00 +6 92 0 0x01da 1028:01da far-pointer-32 False internal entry-ordinal:233 1008:2cd9 0x00 +6 93 0 0x01de 1028:01de far-pointer-32 False internal entry-ordinal:135 1018:0bb3 0x00 +6 94 0 0x01e2 1028:01e2 far-pointer-32 False internal entry-ordinal:136 1018:0c3d 0x00 +6 95 0 0x01e6 1028:01e6 far-pointer-32 False internal entry-ordinal:137 1018:0c59 0x00 +6 96 0 0x01ea 1028:01ea far-pointer-32 False internal entry-ordinal:145 1018:0e46 0x00 +6 97 0 0x01f2 1028:01f2 far-pointer-32 False internal entry-ordinal:146 1018:0ce7 0x00 +6 98 0 0x01f6 1028:01f6 far-pointer-32 False internal entry-ordinal:147 1018:08ac 0x00 +6 99 0 0x01fa 1028:01fa far-pointer-32 False internal entry-ordinal:148 1018:0d6a 0x00 +6 100 0 0x01fe 1028:01fe far-pointer-32 False internal entry-ordinal:149 1018:10e9 0x00 +6 101 0 0x0202 1028:0202 far-pointer-32 False internal entry-ordinal:150 1018:0d8a 0x00 +6 102 0 0x020e 1028:020e far-pointer-32 False internal entry-ordinal:154 1018:05dc 0x00 +6 103 0 0x0212 1028:0212 far-pointer-32 False internal entry-ordinal:155 1018:0e0a 0x00 +6 104 0 0x0216 1028:0216 far-pointer-32 False internal entry-ordinal:156 1018:0a85 0x00 +6 105 0 0x054c 1028:054c far-pointer-32 False internal segment:6:offset:0550 1028:0550 0x00 +6 106 0 0x0564 1028:0564 far-pointer-32 False internal entry-ordinal:119 1008:2219 0x00 +6 107 0 0x0578 1028:0578 far-pointer-32 False internal segment:6:offset:057c 1028:057c 0x00 +6 108 0 0x05c8 1028:05c8 far-pointer-32 False internal entry-ordinal:129 1008:2906 0x00 +6 109 0 0x06da 1028:06da far-pointer-32 False internal entry-ordinal:227 1008:2cf2 0x00 +6 110 0 0x06de 1028:06de far-pointer-32 False internal entry-ordinal:228 1008:2d3a 0x00 +6 111 0 0x06e2 1028:06e2 far-pointer-32 False internal entry-ordinal:229 1008:2c08 0x00 +6 112 0 0x06e6 1028:06e6 far-pointer-32 False internal entry-ordinal:230 1008:2c1f 0x00 +6 113 0 0x06ea 1028:06ea far-pointer-32 False internal entry-ordinal:231 1008:2d66 0x00 +6 114 0 0x06ee 1028:06ee far-pointer-32 False internal entry-ordinal:232 1008:2c83 0x00 +6 115 0 0x05e6 1028:05e6 far-pointer-32 False internal entry-ordinal:161 1018:0b25 0x00 +6 116 0 0x05ea 1028:05ea far-pointer-32 False internal entry-ordinal:162 1018:0b6c 0x00 +6 117 0 0x05ee 1028:05ee far-pointer-32 False internal entry-ordinal:163 1018:08f0 0x00 +6 118 0 0x05f2 1028:05f2 far-pointer-32 False internal entry-ordinal:164 1018:0f22 0x00 +6 119 0 0x05f6 1028:05f6 far-pointer-32 False internal entry-ordinal:165 1018:0f8d 0x00 +6 120 0 0x05fa 1028:05fa far-pointer-32 False internal entry-ordinal:166 1018:0fcc 0x00 +6 121 0 0x05fe 1028:05fe far-pointer-32 False internal entry-ordinal:167 1018:0ffd 0x00 +6 122 0 0x0602 1028:0602 far-pointer-32 False internal entry-ordinal:168 1018:1054 0x00 +6 123 0 0x0606 1028:0606 far-pointer-32 False internal entry-ordinal:169 1018:10aa 0x00 +6 124 0 0x0626 1028:0626 far-pointer-32 False internal entry-ordinal:178 1018:169d 0x00 +6 125 0 0x062a 1028:062a far-pointer-32 False internal entry-ordinal:179 1018:16eb 0x00 +6 126 0 0x062e 1028:062e far-pointer-32 False internal entry-ordinal:181 1018:1761 0x00 +6 127 0 0x0632 1028:0632 far-pointer-32 False internal entry-ordinal:182 1018:1788 0x00 +6 128 0 0x0636 1028:0636 far-pointer-32 False internal entry-ordinal:183 1018:17f8 0x00 +6 129 0 0x063a 1028:063a far-pointer-32 False internal entry-ordinal:184 1018:1868 0x00 +6 130 0 0x063e 1028:063e far-pointer-32 False internal entry-ordinal:185 1018:18e9 0x00 +6 131 0 0x0642 1028:0642 far-pointer-32 False internal entry-ordinal:186 1018:1960 0x00 +6 132 0 0x0646 1028:0646 far-pointer-32 False internal entry-ordinal:187 1018:1986 0x00 +6 133 0 0x064a 1028:064a far-pointer-32 False internal entry-ordinal:188 1018:1a0e 0x00 +6 134 0 0x0652 1028:0652 far-pointer-32 False import-ordinal USER.ordinal:241 USER 241 0x01 +6 135 0 0x0656 1028:0656 far-pointer-32 False import-ordinal USER.ordinal:239 USER 239 0x01 +6 136 0 0x065a 1028:065a far-pointer-32 False import-ordinal USER.ordinal:107 USER 107 0x01 +6 137 0 0x065e 1028:065e far-pointer-32 False import-ordinal USER.ordinal:447 USER 447 0x01 +6 138 0 0x0662 1028:0662 far-pointer-32 False import-ordinal USER.ordinal:308 USER 308 0x01 +6 139 0 0x0666 1028:0666 far-pointer-32 False import-ordinal USER.ordinal:1 USER 1 0x01 diff --git a/original/RESOURCE_RECONSTRUCTION.tsv b/original/RESOURCE_RECONSTRUCTION.tsv new file mode 100644 index 0000000..f88faa6 --- /dev/null +++ b/original/RESOURCE_RECONSTRUCTION.tsv @@ -0,0 +1,64 @@ +type id file_offset allocated_size raw_sha256 raw_path decoded_paths status stage users behavior notes +DAT 400 118272 5632 ae9dbc3c6b2d559a17c5ccd5827d5e7b89bdebb48b3dbbd350696076d518a7da assets/raw/DAT/00400.bin assets/decoded/images/dat_00400.png verified fully-mapped 1000:5390,1008:149d,1000:0002,1000:51f5 42x123 player-emblem sprite 0. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DAT 401 123904 5632 599086497dcc01ebc63d007ae3d0599d581b0434eb91333f42a5f099b92efd6e assets/raw/DAT/00401.bin assets/decoded/images/dat_00401.png verified fully-mapped 1000:5390,1008:149d,1000:0002,1000:51f5 42x123 player-emblem sprite 1. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DAT 402 129536 5632 4bc9cf746a6c09f8a29a4a77c2e6b9288cd7b0688df81f18aad2b9f7182f1019 assets/raw/DAT/00402.bin assets/decoded/images/dat_00402.png verified fully-mapped 1000:5390,1008:149d,1000:0002,1000:51f5 42x123 player-emblem sprite 2. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DAT 403 135168 5632 b21eb9ce2c8a27966ff9b762545ca6a468eec31add1fbdab0128ef58b450ede5 assets/raw/DAT/00403.bin assets/decoded/images/dat_00403.png verified fully-mapped 1000:5390,1008:149d,1000:0002,1000:51f5 42x123 player-emblem sprite 3. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DAT 404 140800 5632 c5edea71429f419f688a49b2e494bb3b82b90912b38d59e0b5d6c15f10b75406 assets/raw/DAT/00404.bin assets/decoded/images/dat_00404.png verified fully-mapped 1000:5390,1008:149d,1000:0002,1000:51f5 42x123 player-emblem sprite 4. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DAT 405 146432 5632 2302a4e768636fc3165a78e1c65f0f604f8db780d5ff2b4007773593945e5537 assets/raw/DAT/00405.bin assets/decoded/images/dat_00405.png verified fully-mapped 1000:5390,1008:149d,1000:0002,1000:51f5 42x123 player-emblem sprite 5. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DAT 406 152064 5632 a785985480c2e4839d5a4e7aab24d9de67e7cb6f5c1f6b60539e154fc82100d7 assets/raw/DAT/00406.bin assets/decoded/images/dat_00406.png verified fully-mapped 1000:5390,1008:149d,1000:0002,1000:51f5 42x123 player-emblem sprite 6. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DAT 407 157696 5632 b9b046bf77ac926cba371f1114693705b8b3b086f48a3d5697f1cd707e7a7735 assets/raw/DAT/00407.bin assets/decoded/images/dat_00407.png verified fully-mapped 1000:5390,1008:149d,1000:0002,1000:51f5 42x123 player-emblem sprite 7. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DAT 600 163328 98048 b40c7f5cd5431ca29f238ac291f7c9c26d9823450acb77b14fed5d06748f5d3e assets/raw/DAT/00600.bin assets/decoded/images/dat_00600.png verified fully-mapped 1000:5390,1008:149d,1000:6f27,1000:7440,1000:51f5 544x180 rotating-target and panel-animation atlas. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DAT 701 261376 21248 52143c98872d315408ba017aab36985939af1a54d6a2caac770c54b78d450da8 assets/raw/DAT/00701.bin assets/decoded/images/dat_00701.png verified fully-mapped 1000:5390,1008:149d,1008:0b9e,1000:51f5 146x142 score-status level 1. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DAT 702 282624 21248 debd1d66cf09ad330408acaf19010dab75fcf5376ee55edd7e1d05e491bf974f assets/raw/DAT/00702.bin assets/decoded/images/dat_00702.png verified fully-mapped 1000:5390,1008:149d,1008:0b9e,1000:51f5 146x142 score-status level 2. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DAT 703 303872 21248 b3972c40b7a3758e48ee1e4d24119a5d3cf9be032d83d4890e792aed2b9b9500 assets/raw/DAT/00703.bin assets/decoded/images/dat_00703.png verified fully-mapped 1000:5390,1008:149d,1008:0b9e,1000:51f5 146x142 score-status level 3. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DAT 704 325120 21248 33aca071ff68e5e9a886b206122796c1c9027ef5bce6e7ea71442574597ee45f assets/raw/DAT/00704.bin assets/decoded/images/dat_00704.png verified fully-mapped 1000:5390,1008:149d,1008:0b9e,1000:51f5 146x142 score-status level 4. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DAT 801 346368 4352 5bd5bd78a5f68b0f271337139a7e8cc8214a9c6ac5229f45fe351f2f33ad311f assets/raw/DAT/00801.bin assets/decoded/images/dat_00801.png verified fully-mapped 1000:5390,1008:149d,1008:0dbd,1000:51f5 68x61 collected-item display count 1. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DAT 802 350720 4352 8296a852c3e068ff98697aa97feefbd0ba47909eb8f4b3365525b9948bac8f9c assets/raw/DAT/00802.bin assets/decoded/images/dat_00802.png verified fully-mapped 1000:5390,1008:149d,1008:0dbd,1000:51f5 68x61 collected-item display count 2. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DAT 803 355072 4352 326f266c75b125bf9bf6af068efc8e7035ab14abe8da23188ab6765f64f7b47e assets/raw/DAT/00803.bin assets/decoded/images/dat_00803.png verified fully-mapped 1000:5390,1008:149d,1008:0dbd,1000:51f5 68x61 collected-item display count 3. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DAT 804 359424 4352 5ff7c04e4e1d0ab63d140ee76997a67e12cfed331fa8c0548bd8bb41bd1a15bd assets/raw/DAT/00804.bin assets/decoded/images/dat_00804.png verified fully-mapped 1000:5390,1008:149d,1008:0dbd,1000:51f5 68x61 collected-item display count 4. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DAT 805 363776 4352 a21cbbad25b01174ecce93a93e1a164913b50b926f8cbd2ceb207c99d1a4378f assets/raw/DAT/00805.bin assets/decoded/images/dat_00805.png verified fully-mapped 1000:5390,1008:149d,1008:0dbd,1000:51f5 68x61 collected-item display count 5. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DAT 806 368128 4352 e4f340dca8dd79f8059ba75abe89cefd27ff8a14f53a8e3dc430787473f3d86b assets/raw/DAT/00806.bin assets/decoded/images/dat_00806.png verified fully-mapped 1000:5390,1008:149d,1008:0dbd,1000:51f5 68x61 collected-item display count 6. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DAT 807 372480 4352 20000cf4ffa7174bbb6868a418ec8d0ea413e091d1d976d44f20e019bb71dd10 assets/raw/DAT/00807.bin assets/decoded/images/dat_00807.png verified fully-mapped 1000:5390,1008:149d,1008:0dbd,1000:51f5 68x61 collected-item display count 7. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DAT 808 376832 4352 a605eb26f9a6f33d789a546993eb5fcb95109d11a4a6a429a1e03129d00b0243 assets/raw/DAT/00808.bin assets/decoded/images/dat_00808.png verified fully-mapped 1000:5390,1008:149d,1008:0dbd,1000:51f5 68x61 collected-item display count 8. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DAT 809 381184 4352 f1aa5c93967908af758f23b711bde4026899cc467f13ddaf02249083b3fe007e assets/raw/DAT/00809.bin assets/decoded/images/dat_00809.png verified fully-mapped 1000:5390,1008:149d,1008:0dbd,1000:51f5 68x61 collected-item display count 9. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DAT 900 385536 266496 25c31f3d3a628f2b102bbe07f09a91c038328fef19004e599bcc601bdbfd43bc assets/raw/DAT/00900.bin assets/decoded/images/dat_00900.png verified fully-mapped 1000:5390,1008:149d,1008:0e08,1000:51f5 900x296 18-frame claw atlas. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DAT 901 652032 4096 7b4a732ef13e24c395209841aabcc16c4431096322627fa9beb95d945913b30d assets/raw/DAT/00901.bin assets/decoded/images/dat_00901.png verified fully-mapped 1000:5390,1008:149d,1000:638e,1000:6b37,1000:51f5 230x17 launcher and velocity-row decoration atlas. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DAT 993 656128 108288 d8fa546a48c16750bb40715babc6b310a9e8012598fc4448fb4c622894b6afe2 assets/raw/DAT/00993.bin assets/decoded/images/dat_00993.png verified fully-mapped 1000:5be5,1008:149d,1000:5c13,1000:5ba6 360x300 high-score background. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DAT 994 764416 3328 add4499d6497e08a41d2621a9edc5a9207db55ca7269344b186699023a058085 assets/raw/DAT/00994.bin assets/decoded/images/dat_00994.png verified fully-mapped 1000:5390,1000:531e,1008:149d 237x13 asset-loading progress strip. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DAT 995 767744 294656 28d528340d536b7085c06be9da4d094450463b5b5bed5a6fc04a6e3ef8bae0af assets/raw/DAT/00995.bin assets/decoded/images/dat_00995.png verified fully-mapped 1000:5390,1008:149d 640x460 one-shot board splash. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DAT 997 1062400 294656 8f353daefc21cd5dc13caff892d45bf8f119abe5570ec02cb5e65c5fac471417 assets/raw/DAT/00997.bin assets/decoded/images/dat_00997.png verified fully-mapped 1000:5390,1008:149d,1008:0837,1000:7440,1000:eab1,1000:51f5 640x460 immutable restore overlay A. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DAT 998 1357056 294656 75a50e0fa18ee1fae783aeca89a08d23f9e58b4dc4a35d25dbb2677711cdf1ba assets/raw/DAT/00998.bin assets/decoded/images/dat_00998.png verified fully-mapped 1000:5390,1008:149d,1008:07b6,1008:08bb,1008:093f,1008:0996,1008:0e08,1000:51f5 640x460 restore overlay B and mutable background. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DAT 1001 1651712 294656 2db3a4b5d33883c3d4e9687b03275e75f559b1e0ed57d91e286e6a97404c1be8 assets/raw/DAT/01001.bin assets/decoded/images/dat_01001.png verified fully-mapped 1000:6129,1008:149d,1000:616e,1000:60e7 640x460 board background selected by index 1. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DAT 1002 1946368 294656 df11fbc3b043a540d0231804a01a106a5b5dfe48aff9b3d6bdeb83a4b13928c2 assets/raw/DAT/01002.bin assets/decoded/images/dat_01002.png verified fully-mapped 1000:6129,1008:149d,1000:616e,1000:60e7 640x460 board background selected by index 2. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DAT 1003 2241024 294656 27cfcf709f21256135bfaf8bb506897b0996225ddcf69cab2cd934cbf0d9a2d9 assets/raw/DAT/01003.bin assets/decoded/images/dat_01003.png verified fully-mapped 1000:6129,1008:149d,1000:616e,1000:60e7 640x460 board background selected by index 3. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DAT 1004 2535680 294656 12929d04af2525a10b621a135eedd17eea71ee3511adfd7f80359812fc43d668 assets/raw/DAT/01004.bin assets/decoded/images/dat_01004.png verified fully-mapped 1000:6129,1008:149d,1000:616e,1000:60e7 640x460 board background selected by index 4. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DAT 1005 2830336 294656 70cc938c97efe772759859524f3855bda4454c8bbf403ac0aa04a8d04a9ecf34 assets/raw/DAT/01005.bin assets/decoded/images/dat_01005.png verified fully-mapped 1000:6129,1008:149d,1000:616e,1000:60e7 640x460 board background selected by index 5. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +PAL 999 3124992 768 a116d7bbef4ee4f8228aa0fcaf5eea63057e460323d6ad9584fd1ffbc20d60d9 assets/raw/PAL/00999.bin assets/decoded/palettes/palette_0999.png,assets/decoded/palettes/palette_0999.gpl verified fully-mapped 1008:1326,1008:11c5,1008:13a8,1008:149d 256 RGB triples shared by all custom DAT DIBs. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +WAV 2001 3125760 6400 751d21b1ed7d7f2acd4f8f52478dcf7d57be42ebc3059343c706a9253a84cdd8 assets/raw/WAV/02001.bin assets/decoded/audio/wav_02001.wav verified fully-mapped 1008:0f2e,1008:1131,1008:10e3,1000:638e add-player cue. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +WAV 2002 3132160 4608 ecc192f2d6bfd706f4d3f91cc6cbeb40fa91c50bd2f933da3e35c0258b637172 assets/raw/WAV/02002.bin assets/decoded/audio/wav_02002.wav verified fully-mapped 1008:0f2e,1008:1131,1008:10e3,1000:638e launcher-release cue. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +WAV 2004 3136768 7680 d84f7a3285fca2b40a219b7e796066bd0294692b2761f565d55b0deb6254f305 assets/raw/WAV/02004.bin assets/decoded/audio/wav_02004.wav verified fully-mapped 1008:0f2e,1008:1131,1008:10e3,1000:c79c trigger-activation cue. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +WAV 2006 3144448 3072 c803e22b0cfcc1dbd4ff8bfe966894d95b0f3217c4fc4954ca3ebf9dc5077e07 assets/raw/WAV/02006.bin assets/decoded/audio/wav_02006.wav verified fully-mapped 1008:0f2e,1008:1131,1008:10e3,1000:b476 timed target 51..53 hit cue. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +WAV 2007 3147520 30464 2e6d4a0ac436e0d5ceb508f4239e871081bf8319c8c44226e83d30dc780f90ab assets/raw/WAV/02007.bin assets/decoded/audio/wav_02007.wav verified fully-mapped 1008:0f2e,1008:1131,1008:10e3,1000:b476,1000:bc36 score-marker or full-item-bank award cue. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +WAV 2008 3177984 39168 b9a9af48f0794d51a8e3c0ee8c30e21382d35d8bbc76a28dc595940fbfe0eab1 assets/raw/WAV/02008.bin assets/decoded/audio/wav_02008.wav verified fully-mapped 1008:0f2e,1008:1131,1008:10e3,1000:ae6e normal ball-end cue. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +WAV 2011 3217152 6912 f7046a06ec0c990b334a1572d81a50d2215f31b112270c5a24344132dc805072 assets/raw/WAV/02011.bin assets/decoded/audio/wav_02011.wav verified fully-mapped 1008:0f2e,1008:1131,1008:10e3,1000:6f27 rotating-target mechanism cue. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +WAV 2012 3224064 512 c46c9b564f04eef86143875ece96f32171d0f9b788215e13f81738694403bb77 assets/raw/WAV/02012.bin assets/decoded/audio/wav_02012.wav verified fully-mapped 1008:0f2e,1008:1131,1008:10e3,1000:b476,1000:7440 target and panel transition cue. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +WAV 2013 3224576 46592 5dc24553391a2cc17e7388747f42ee63897c0e8f8cd74e18f83f60ff2986cacb assets/raw/WAV/02013.bin assets/decoded/audio/wav_02013.wav verified fully-mapped 1008:0f2e,1008:1131,1008:10e3,1000:7440 panel-mechanism motion cue. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +WAV 2015 3271168 8192 4e7fc9f71e187f7b89d5296583d400afc92cd84310c3b6e114a14c6c18cdd4db assets/raw/WAV/02015.bin assets/decoded/audio/wav_02015.wav verified fully-mapped 1008:0f2e,1008:1131,1008:10e3,1000:c79c ball-capture cue. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +WAV 2016 3279360 3584 72c76e72e9933d02dd4ca4c44434acd1a79591fe486f9bd6da73f59748ee0f1f assets/raw/WAV/02016.bin assets/decoded/audio/wav_02016.wav verified fully-mapped 1008:0f2e,1008:1131,1008:10e3,1000:eab1 claw ball-release cue. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +WAV 2017 3282944 35072 f7c91915c93302cb55cb703278e55ae3d08e3bb50b31ce50fbefe9a708f99926 assets/raw/WAV/02017.bin assets/decoded/audio/wav_02017.wav verified fully-mapped 1008:0f2e,1008:1131,1008:10e3,1000:b476 completed target-bank/item award cue. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +WAV 2019 3318016 5376 2b65c01e848225791efc58e9018f6b9e24e6da5cc753ca74c43b52cab1532cc6 assets/raw/WAV/02019.bin assets/decoded/audio/wav_02019.wav verified fully-mapped 1008:0f2e,1008:1131,1008:10e3,1000:638e,1000:c79c table-nudge or kick-response cue. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +WAV 2020 3323392 30208 45f03303ce04dc9dc470863bc2cbb638fa6b644afdd9792d8b47667130f71886 assets/raw/WAV/02020.bin assets/decoded/audio/wav_02020.wav verified fully-mapped 1008:0f2e,1008:1131,1008:10e3,1000:638e tilt cue. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +WAV 2021 3353600 3328 9f9be797898500c85a6494d2d157f535025f8858b4b085d52843f6605495a494 assets/raw/WAV/02021.bin assets/decoded/audio/wav_02021.wav verified fully-mapped 1008:0f2e,1008:1131,1008:10e3,1000:7ed9 flipper-motion cue. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +WAV 2022 3356928 22272 e10196861e6eaf5656a5ba475c6226a9c2948b53ca7ee095a1fe7754d511410b assets/raw/WAV/02022.bin assets/decoded/audio/wav_02022.wav verified fully-mapped 1008:0f2e,1008:1131,1008:10e3 loaded and freed sound slot 22 with no in-image playback selector. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +BITMAP 101 3379200 256 828e3a3f570b6d5eb2406a4e751a1992b35f134138b22b3cda6f628eddc3268d assets/raw/BITMAP/00101.bin assets/decoded/images/bitmap_00101.bmp,assets/decoded/images/bitmap_00101.png verified fully-mapped 1000:5390,1000:9bca,1000:9f73,1000:a38e,1000:51f5 16x16 SRCPAINT object-composition image. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +BITMAP 102 3379456 256 8ddb45855da1a1edd14bf2a760f1ec87f77e107519821c9931097c9369f36fa9 assets/raw/BITMAP/00102.bin assets/decoded/images/bitmap_00102.bmp,assets/decoded/images/bitmap_00102.png verified fully-mapped 1000:5390,1000:9bca,1000:9f73,1000:a38e 16x16 SRCAND object-composition mask. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +BITMAP 500 3379712 13568 03bd8020f22a9d05abba8df794a9fedfdbbd3efe9c512d36aa3fdbfe939c73ed assets/raw/BITMAP/00500.bin assets/decoded/images/bitmap_00500.bmp,assets/decoded/images/bitmap_00500.png verified fully-mapped 1000:5390,1008:0996,1000:eab1,1000:51f5 944x28 score-digit and timer-indicator atlas. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +ICON 1 3393280 768 7700e0cb938f72c273919288a1d93f2d651d0fd1cc0aaf0fc6820ecb852a0cb5 assets/raw/ICON/00001.bin assets/decoded/icons/icon_00001.ico,assets/decoded/icons/icon_00001.png verified system-resolved GROUP_ICON:996 -> USER:LoadIcon 32x32 image selected by GROUP_ICON 996. Lossless extraction is verified; the Windows resource-system relationship and the absence of any additional in-image loader are fully accounted. +GROUP_ICON 996 3394048 256 b6436bbb9fca95b8a94008d045bf87f404b0a02d7690a0191861d229841dc25b assets/raw/GROUP_ICON/00996.bin verified system-resolved 1000:016c main-window icon group loaded at 1000:016c. Lossless extraction is verified; the Windows resource-system relationship and the absence of any additional in-image loader are fully accounted. +VERSION 1 3394304 512 95f627c29e452fff1032c16384f37128496a3bbc822c39247050f1382507dacc assets/raw/VERSION/00001.bin assets/decoded/metadata/version_00001.json verified system-resolved Windows resource/version consumers; no in-image call Windows version metadata with no image-code loader. Lossless extraction is verified; the Windows resource-system relationship and the absence of any additional in-image loader are fully accounted. +DIALOG 32512 3394816 256 544570c3e1ac0cbcd690365d2191b71ffc1e6cb1fb525085cec317d41cac9be1 assets/raw/DIALOG/32512.bin assets/decoded/dialogs/dialog_32512.json verified linked-unused none (complete verified template-selector inventory) Borland 2D File Open template. Lossless extraction and decoded template structure are verified; the complete selector inventory across 391 verified functions has no user, so this Borland library template is explicitly retained as unused. +DIALOG 32513 3395072 256 2e64029d822874a8a74c0ba1367c454d95d999ee8feda1465fe8b3f585d1b03d assets/raw/DIALOG/32513.bin assets/decoded/dialogs/dialog_32513.json verified linked-unused none (complete verified template-selector inventory) Borland 2D File Save As template. Lossless extraction and decoded template structure are verified; the complete selector inventory across 391 verified functions has no user, so this Borland library template is explicitly retained as unused. +DIALOG 32514 3395328 256 f7f38c4f14d5fba42e370c438fc41e041e744aaef73c65a618070338b650cba1 assets/raw/DIALOG/32514.bin assets/decoded/dialogs/dialog_32514.json verified fully-mapped 1008:1607,1008:2996,1008:2a45,1008:2ae3 2D text-entry template selected at 1008:1607. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. +DIALOG 32515 3395584 512 75a4de77aa549d3edbe4825c1345093ed8d6ae81559aad4514b0a853ec50921b assets/raw/DIALOG/32515.bin assets/decoded/dialogs/dialog_32515.json verified linked-unused none (complete verified template-selector inventory) Borland CTL3D File Open template. Lossless extraction and decoded template structure are verified; the complete selector inventory across 391 verified functions has no user, so this Borland library template is explicitly retained as unused. +DIALOG 32516 3396096 512 dddb764f91fbd212481c1510c50875a289f9f525674c2bc7eefbf94b8ce892ef assets/raw/DIALOG/32516.bin assets/decoded/dialogs/dialog_32516.json verified linked-unused none (complete verified template-selector inventory) Borland CTL3D File Save As template. Lossless extraction and decoded template structure are verified; the complete selector inventory across 391 verified functions has no user, so this Borland library template is explicitly retained as unused. +DIALOG 32517 3396608 256 be406a27876296e9ac46021d67b1591f9bffa0a98a9a55a53ecb9adddc660ef6 assets/raw/DIALOG/32517.bin assets/decoded/dialogs/dialog_32517.json verified fully-mapped 1008:1607,1008:2996,1008:2a45,1008:2ae3 CTL3D text-entry template selected at 1008:1607. Lossless extraction, decoded derivative, exact load/use/release lifecycle, and complete verified function closure are represented in reconstructed/tdkpin_resources.c and the cited reconstruction units. diff --git a/original/SHARED_ENTRY_POINTS.tsv b/original/SHARED_ENTRY_POINTS.tsv new file mode 100644 index 0000000..30dbb07 --- /dev/null +++ b/original/SHARED_ENTRY_POINTS.tsv @@ -0,0 +1,7 @@ +address containing_function status reconstructed_name evidence notes +1020:04a0 1020:049f verified borland_assign_text_short bytes 1020:049f-04a1 decode as MOV DX,0xd233 at 049f and XOR DX,DX at 04a0; common body 04a2-04fb Overlapping Borland runtime entry for Pascal ShortString names; containing ledger row accounts for the shared executable body. +1020:06b4 1020:06ab verified borland_create_generic_file bytes 1020:06ab-06b9 select AH=3d/global access and empty-name handle 0 at 06ab or AH=3c/attributes 0 and empty-name handle 1 at 06b4; common body 06ba-070f Overlapping Open/Create generic-file entry pair. +1020:0765 1020:0760 verified borland_file_write_record bytes 1020:0760-0769 select AH=3f/error 0x64 at 0760 or AH=40/error 0x65 at 0765; common body 076a-0795 Overlapping single-record Read/Write entry pair. +1020:079b 1020:0796 verified borland_file_block_write bytes 1020:0796-079f select BL=3f/error 0x64 at 0796 or BL=40/error 0x65 at 079b; common body 07a0-07fd Overlapping BlockRead/BlockWrite entry pair. +1020:100f 1020:1017 verified borland_real48_truncate_to_i32 bytes 1020:100f-1016 set CH=0, call conversion core 0f77, and RETF on success; bytes 101f-1024 are the Runtime Error 207 tail shared with Round entry 1017 disassembleOnly evidence was previously structural; readable Trunc semantics, overflow candidate, and shared error tail are now explicitly represented and DOSBox-differentially tested. +1020:1130 1020:111d verified borland_real48_sin bytes 1020:111d-112f form the Cos-only pi/2-x prelude; 1130-1190 are a complete shared Sin body ending RETF; table 1191-11ba contains -1/15! through -1/3! Exact modulo-2pi, quadrant folding, odd polynomial, small-argument bypass, half-cycle sign, and independent Sin entry are represented and differentially tested against original-offset bytes. diff --git a/original/SYMBOLS.tsv b/original/SYMBOLS.tsv new file mode 100644 index 0000000..925c4ab --- /dev/null +++ b/original/SYMBOLS.tsv @@ -0,0 +1,2843 @@ +address block name symbol_type source primary dynamic +EXTERNAL:00000001 GETVERSION Function IMPORTED true false +EXTERNAL:00000002 GLOBALALLOC Function IMPORTED true false +EXTERNAL:00000003 GLOBALFREE Function IMPORTED true false +EXTERNAL:00000004 GLOBALLOCK Function IMPORTED true false +EXTERNAL:00000005 GLOBALUNLOCK Function IMPORTED true false +EXTERNAL:00000006 GLOBALHANDLE Function IMPORTED true false +EXTERNAL:00000007 GLOBALCOMPACT Function IMPORTED true false +EXTERNAL:00000008 WAITEVENT Function IMPORTED true false +EXTERNAL:00000009 GETCURRENTTASK Function IMPORTED true false +EXTERNAL:0000000a GETMODULEHANDLE Function IMPORTED true false +EXTERNAL:0000000b GETMODULEFILENAME Function IMPORTED true false +EXTERNAL:0000000c GETPROCADDRESS Function IMPORTED true false +EXTERNAL:0000000d MAKEPROCINSTANCE Function IMPORTED true false +EXTERNAL:0000000e FREEPROCINSTANCE Function IMPORTED true false +EXTERNAL:0000000f FINDRESOURCE Function IMPORTED true false +EXTERNAL:00000010 LOADRESOURCE Function IMPORTED true false +EXTERNAL:00000011 LOCKRESOURCE Function IMPORTED true false +EXTERNAL:00000012 FREERESOURCE Function IMPORTED true false +EXTERNAL:00000013 _LCLOSE Function IMPORTED true false +EXTERNAL:00000014 _LREAD Function IMPORTED true false +EXTERNAL:00000015 _LCREAT Function IMPORTED true false +EXTERNAL:00000016 _LOPEN Function IMPORTED true false +EXTERNAL:00000017 _LWRITE Function IMPORTED true false +EXTERNAL:00000018 INITTASK Function IMPORTED true false +EXTERNAL:00000019 LOADLIBRARY Function IMPORTED true false +EXTERNAL:0000001a FREELIBRARY Function IMPORTED true false +EXTERNAL:0000001b SETERRORMODE Function IMPORTED true false +EXTERNAL:0000001c __AHINCR Function IMPORTED true false +EXTERNAL:0000001d GETPRIVATEPROFILEINT Function IMPORTED true false +EXTERNAL:0000001e GETDOSENVIRONMENT Function IMPORTED true false +EXTERNAL:0000001f GETWINFLAGS Function IMPORTED true false +EXTERNAL:00000020 GETWINDOWSDIRECTORY Function IMPORTED true false +EXTERNAL:00000021 GETSYSTEMDIRECTORY Function IMPORTED true false +EXTERNAL:00000022 GETFREESPACE Function IMPORTED true false +EXTERNAL:00000023 ALLOCCSTODSALIAS Function IMPORTED true false +EXTERNAL:00000024 FREESELECTOR Function IMPORTED true false +EXTERNAL:00000025 PRESTOCHANGOSELECTOR Function IMPORTED true false +EXTERNAL:00000026 SYSTEMTIMERMAKE Function IMPORTED true false +EXTERNAL:00000027 SNDPLAYSOUND Function IMPORTED true false +EXTERNAL:00000028 WAVEOUTGETNUMDEVS Function IMPORTED true false +EXTERNAL:00000029 WAVEOUTGETDEVCAPS Function IMPORTED true false +EXTERNAL:0000002a WAVEOUTGETVOLUME Function IMPORTED true false +EXTERNAL:0000002b TIMEKILLEVENT Function IMPORTED true false +EXTERNAL:0000002c SETBKCOLOR Function IMPORTED true false +EXTERNAL:0000002d SETBKMODE Function IMPORTED true false +EXTERNAL:0000002e SETTEXTCOLOR Function IMPORTED true false +EXTERNAL:0000002f TEXTOUT Function IMPORTED true false +EXTERNAL:00000030 BITBLT Function IMPORTED true false +EXTERNAL:00000031 SELECTOBJECT Function IMPORTED true false +EXTERNAL:00000032 CREATECOMPATIBLEBITMAP Function IMPORTED true false +EXTERNAL:00000033 CREATECOMPATIBLEDC Function IMPORTED true false +EXTERNAL:00000034 CREATEDC Function IMPORTED true false +EXTERNAL:00000035 DELETEDC Function IMPORTED true false +EXTERNAL:00000036 DELETEOBJECT Function IMPORTED true false +EXTERNAL:00000037 GETSTOCKOBJECT Function IMPORTED true false +EXTERNAL:00000038 GETTEXTCOLOR Function IMPORTED true false +EXTERNAL:00000039 GETTEXTMETRICS Function IMPORTED true false +EXTERNAL:0000003a UNREALIZEOBJECT Function IMPORTED true false +EXTERNAL:0000003b SETTEXTALIGN Function IMPORTED true false +EXTERNAL:0000003c CREATEPALETTE Function IMPORTED true false +EXTERNAL:0000003d UPDATECOLORS Function IMPORTED true false +EXTERNAL:0000003e CREATEDIBITMAP Function IMPORTED true false +EXTERNAL:0000003f MESSAGEBOX Function IMPORTED true false +EXTERNAL:00000040 INITAPP Function IMPORTED true false +EXTERNAL:00000041 POSTQUITMESSAGE Function IMPORTED true false +EXTERNAL:00000042 GETTICKCOUNT Function IMPORTED true false +EXTERNAL:00000043 SETCAPTURE Function IMPORTED true false +EXTERNAL:00000044 RELEASECAPTURE Function IMPORTED true false +EXTERNAL:00000045 SETFOCUS Function IMPORTED true false +EXTERNAL:00000046 GETFOCUS Function IMPORTED true false +EXTERNAL:00000047 REMOVEPROP Function IMPORTED true false +EXTERNAL:00000048 GETPROP Function IMPORTED true false +EXTERNAL:00000049 SETPROP Function IMPORTED true false +EXTERNAL:0000004a SCREENTOCLIENT Function IMPORTED true false +EXTERNAL:0000004b ISICONIC Function IMPORTED true false +EXTERNAL:0000004c GETWINDOWRECT Function IMPORTED true false +EXTERNAL:0000004d GETCLIENTRECT Function IMPORTED true false +EXTERNAL:0000004e GETWINDOWTEXT Function IMPORTED true false +EXTERNAL:0000004f SETWINDOWTEXT Function IMPORTED true false +EXTERNAL:00000050 BEGINPAINT Function IMPORTED true false +EXTERNAL:00000051 ENDPAINT Function IMPORTED true false +EXTERNAL:00000052 CREATEWINDOW Function IMPORTED true false +EXTERNAL:00000053 SHOWWINDOW Function IMPORTED true false +EXTERNAL:00000054 GETPARENT Function IMPORTED true false +EXTERNAL:00000055 ISWINDOW Function IMPORTED true false +EXTERNAL:00000056 ISCHILD Function IMPORTED true false +EXTERNAL:00000057 DESTROYWINDOW Function IMPORTED true false +EXTERNAL:00000058 REGISTERCLASS Function IMPORTED true false +EXTERNAL:00000059 SCROLLWINDOW Function IMPORTED true false +EXTERNAL:0000005a SETSCROLLPOS Function IMPORTED true false +EXTERNAL:0000005b SETSCROLLRANGE Function IMPORTED true false +EXTERNAL:0000005c GETDC Function IMPORTED true false +EXTERNAL:0000005d RELEASEDC Function IMPORTED true false +EXTERNAL:0000005e SETCURSOR Function IMPORTED true false +EXTERNAL:0000005f ENDDIALOG Function IMPORTED true false +EXTERNAL:00000060 ISDIALOGMESSAGE Function IMPORTED true false +EXTERNAL:00000061 GETDLGITEM Function IMPORTED true false +EXTERNAL:00000062 SETDLGITEMTEXT Function IMPORTED true false +EXTERNAL:00000063 GETDLGITEMTEXT Function IMPORTED true false +EXTERNAL:00000064 SENDDLGITEMMESSAGE Function IMPORTED true false +EXTERNAL:00000065 MESSAGEBEEP Function IMPORTED true false +EXTERNAL:00000066 GETKEYSTATE Function IMPORTED true false +EXTERNAL:00000067 DEFWINDOWPROC Function IMPORTED true false +EXTERNAL:00000068 GETMESSAGE Function IMPORTED true false +EXTERNAL:00000069 PEEKMESSAGE Function IMPORTED true false +EXTERNAL:0000006a SENDMESSAGE Function IMPORTED true false +EXTERNAL:0000006b WAITMESSAGE Function IMPORTED true false +EXTERNAL:0000006c TRANSLATEMESSAGE Function IMPORTED true false +EXTERNAL:0000006d DISPATCHMESSAGE Function IMPORTED true false +EXTERNAL:0000006e CALLWINDOWPROC Function IMPORTED true false +EXTERNAL:0000006f UPDATEWINDOW Function IMPORTED true false +EXTERNAL:00000070 INVALIDATERECT Function IMPORTED true false +EXTERNAL:00000071 GETWINDOWWORD Function IMPORTED true false +EXTERNAL:00000072 GETWINDOWLONG Function IMPORTED true false +EXTERNAL:00000073 SETWINDOWLONG Function IMPORTED true false +EXTERNAL:00000074 ENABLEMENUITEM Function IMPORTED true false +EXTERNAL:00000075 GETSYSTEMMENU Function IMPORTED true false +EXTERNAL:00000076 CREATECARET Function IMPORTED true false +EXTERNAL:00000077 DESTROYCARET Function IMPORTED true false +EXTERNAL:00000078 SETCARETPOS Function IMPORTED true false +EXTERNAL:00000079 SHOWCARET Function IMPORTED true false +EXTERNAL:0000007a LOADCURSOR Function IMPORTED true false +EXTERNAL:0000007b LOADICON Function IMPORTED true false +EXTERNAL:0000007c LOADBITMAP Function IMPORTED true false +EXTERNAL:0000007d TRANSLATEACCELERATOR Function IMPORTED true false +EXTERNAL:0000007e GETSYSTEMMETRICS Function IMPORTED true false +EXTERNAL:0000007f GETSYSCOLOR Function IMPORTED true false +EXTERNAL:00000080 DIALOGBOXPARAM Function IMPORTED true false +EXTERNAL:00000081 CREATEDIALOGPARAM Function IMPORTED true false +EXTERNAL:00000082 ISZOOMED Function IMPORTED true false +EXTERNAL:00000083 SELECTPALETTE Function IMPORTED true false +EXTERNAL:00000084 REALIZEPALETTE Function IMPORTED true false +EXTERNAL:00000085 DEFDLGPROC Function IMPORTED true false +EXTERNAL:00000086 GETCLASSINFO Function IMPORTED true false +EXTERNAL:00000087 WVSPRINTF Function IMPORTED true false +EXTERNAL:00000088 DEFMDICHILDPROC Function IMPORTED true false +EXTERNAL:00000089 TRANSLATEMDISYSACCEL Function IMPORTED true false +EXTERNAL:0000008a CREATEWINDOWEX Function IMPORTED true false +EXTERNAL:0000008b Ordinal_5 Function IMPORTED true false +EXTERNAL:0000008c Ordinal_6 Function IMPORTED true false +1000:0000 Code1 code_segment_1_tag Label USER_DEFINED true false +1000:0002 Code1 FUN_1000_0002 Function DEFAULT true false +1000:0100 Code1 FUN_1000_0100 Function DEFAULT true false +1000:0121 Code1 FUN_1000_0121 Function DEFAULT true false +1000:014e Code1 LAB_1000_014e Label DEFAULT true true +1000:0168 Code1 LAB_1000_0168 Label DEFAULT true true +1000:016c Code1 FUN_1000_016c Function DEFAULT true false +1000:01d3 Code1 FUN_1000_01d3 Function DEFAULT true false +1000:01e3 Code1 LAB_1000_01e3 Label DEFAULT true true +1000:0265 Code1 LAB_1000_0265 Label DEFAULT true true +1000:026e Code1 code1_embedded_word_026e Label USER_DEFINED true false +1000:0270 Code1 FUN_1000_0270 Function DEFAULT true false +1000:02ab Code1 LAB_1000_02ab Label DEFAULT true true +1000:02cf Code1 LAB_1000_02cf Label DEFAULT true true +1000:041c Code1 LAB_1000_041c Label DEFAULT true true +1000:041f Code1 LAB_1000_041f Label DEFAULT true true +1000:0464 Code1 LAB_1000_0464 Label DEFAULT true true +1000:0467 Code1 LAB_1000_0467 Label DEFAULT true true +1000:061e Code1 LAB_1000_061e Label DEFAULT true true +1000:0624 Code1 LAB_1000_0624 Label DEFAULT true true +1000:0650 Code1 LAB_1000_0650 Label DEFAULT true true +1000:0658 Code1 LAB_1000_0658 Label DEFAULT true true +1000:068a Code1 LAB_1000_068a Label DEFAULT true true +1000:06b8 Code1 LAB_1000_06b8 Label DEFAULT true true +1000:06e6 Code1 LAB_1000_06e6 Label DEFAULT true true +1000:0713 Code1 LAB_1000_0713 Label DEFAULT true true +1000:0740 Code1 LAB_1000_0740 Label DEFAULT true true +1000:0767 Code1 LAB_1000_0767 Label DEFAULT true true +1000:07b4 Code1 LAB_1000_07b4 Label DEFAULT true true +1000:51ae Code1 LAB_1000_51ae Label DEFAULT true true +1000:51b1 Code1 LAB_1000_51b1 Label DEFAULT true true +1000:51f5 Code1 FUN_1000_51f5 Function DEFAULT true false +1000:523b Code1 LAB_1000_523b Label DEFAULT true true +1000:5292 Code1 LAB_1000_5292 Label DEFAULT true true +1000:5295 Code1 LAB_1000_5295 Label DEFAULT true true +1000:52b0 Code1 LAB_1000_52b0 Label DEFAULT true true +1000:52b3 Code1 LAB_1000_52b3 Label DEFAULT true true +1000:52ce Code1 LAB_1000_52ce Label DEFAULT true true +1000:52d1 Code1 LAB_1000_52d1 Label DEFAULT true true +1000:531e Code1 FUN_1000_531e Function DEFAULT true false +1000:5390 Code1 FUN_1000_5390 Function DEFAULT true false +1000:53c5 Code1 LAB_1000_53c5 Label DEFAULT true true +1000:54a0 Code1 LAB_1000_54a0 Label DEFAULT true true +1000:54a3 Code1 LAB_1000_54a3 Label DEFAULT true true +1000:54d8 Code1 LAB_1000_54d8 Label DEFAULT true true +1000:54db Code1 LAB_1000_54db Label DEFAULT true true +1000:5510 Code1 LAB_1000_5510 Label DEFAULT true true +1000:5513 Code1 LAB_1000_5513 Label DEFAULT true true +1000:5619 Code1 LAB_1000_5619 Label DEFAULT true true +1000:5627 Code1 LAB_1000_5627 Label DEFAULT true true +1000:5716 Code1 LAB_1000_5716 Label DEFAULT true true +1000:5721 Code1 LAB_1000_5721 Label DEFAULT true true +1000:5731 Code1 LAB_1000_5731 Label DEFAULT true true +1000:573c Code1 LAB_1000_573c Label DEFAULT true true +1000:574a Code1 LAB_1000_574a Label DEFAULT true true +1000:57fb Code1 LAB_1000_57fb Label DEFAULT true true +1000:5890 Code1 LAB_1000_5890 Label DEFAULT true true +1000:5893 Code1 LAB_1000_5893 Label DEFAULT true true +1000:58a9 Code1 LAB_1000_58a9 Label DEFAULT true true +1000:58b7 Code1 LAB_1000_58b7 Label DEFAULT true true +1000:58e3 Code1 LAB_1000_58e3 Label DEFAULT true true +1000:58e7 Code1 FUN_1000_58e7 Function DEFAULT true false +1000:5901 Code1 LAB_1000_5901 Label DEFAULT true true +1000:594f Code1 LAB_1000_594f Label DEFAULT true true +1000:5956 Code1 FUN_1000_5956 Function DEFAULT true false +1000:599c Code1 LAB_1000_599c Label DEFAULT true true +1000:59a0 Code1 FUN_1000_59a0 Function DEFAULT true false +1000:59ce Code1 LAB_1000_59ce Label DEFAULT true true +1000:59d0 Code1 LAB_1000_59d0 Label DEFAULT true true +1000:5a30 Code1 LAB_1000_5a30 Label DEFAULT true true +1000:5a37 Code1 FUN_1000_5a37 Function DEFAULT true false +1000:5a9a Code1 LAB_1000_5a9a Label DEFAULT true true +1000:5ab7 Code1 FUN_1000_5ab7 Function DEFAULT true false +1000:5aea Code1 FUN_1000_5aea Function DEFAULT true false +1000:5afa Code1 LAB_1000_5afa Label DEFAULT true true +1000:5b9d Code1 LAB_1000_5b9d Label DEFAULT true true +1000:5ba6 Code1 FUN_1000_5ba6 Function DEFAULT true false +1000:5be5 Code1 FUN_1000_5be5 Function DEFAULT true false +1000:5c13 Code1 FUN_1000_5c13 Function DEFAULT true false +1000:5d1e Code1 LAB_1000_5d1e Label DEFAULT true true +1000:5d22 Code1 LAB_1000_5d22 Label DEFAULT true true +1000:5d51 Code1 LAB_1000_5d51 Label DEFAULT true true +1000:5d60 Code1 LAB_1000_5d60 Label DEFAULT true true +1000:5e59 Code1 LAB_1000_5e59 Label DEFAULT true true +1000:5ee6 Code1 FUN_1000_5ee6 Function DEFAULT true false +1000:5efc Code1 FUN_1000_5efc Function DEFAULT true false +1000:5f22 Code1 LAB_1000_5f22 Label DEFAULT true true +1000:5f29 Code1 FUN_1000_5f29 Function DEFAULT true false +1000:5f57 Code1 LAB_1000_5f57 Label DEFAULT true true +1000:5f59 Code1 LAB_1000_5f59 Label DEFAULT true true +1000:5fb9 Code1 LAB_1000_5fb9 Label DEFAULT true true +1000:5fc0 Code1 FUN_1000_5fc0 Function DEFAULT true false +1000:6023 Code1 LAB_1000_6023 Label DEFAULT true true +1000:6040 Code1 FUN_1000_6040 Function DEFAULT true false +1000:6073 Code1 FUN_1000_6073 Function DEFAULT true false +1000:60de Code1 LAB_1000_60de Label DEFAULT true true +1000:60e7 Code1 FUN_1000_60e7 Function DEFAULT true false +1000:6129 Code1 FUN_1000_6129 Function DEFAULT true false +1000:616e Code1 FUN_1000_616e Function DEFAULT true false +1000:6202 Code1 FUN_1000_6202 Function DEFAULT true false +1000:6218 Code1 FUN_1000_6218 Function DEFAULT true false +1000:623e Code1 LAB_1000_623e Label DEFAULT true true +1000:6245 Code1 FUN_1000_6245 Function DEFAULT true false +1000:6273 Code1 LAB_1000_6273 Label DEFAULT true true +1000:6275 Code1 LAB_1000_6275 Label DEFAULT true true +1000:62d5 Code1 LAB_1000_62d5 Label DEFAULT true true +1000:62dc Code1 FUN_1000_62dc Function DEFAULT true false +1000:633f Code1 LAB_1000_633f Label DEFAULT true true +1000:635c Code1 FUN_1000_635c Function DEFAULT true false +1000:638e Code1 FUN_1000_638e Function DEFAULT true false +1000:63a2 Code1 LAB_1000_63a2 Label DEFAULT true true +1000:63af Code1 LAB_1000_63af Label DEFAULT true true +1000:63d6 Code1 LAB_1000_63d6 Label DEFAULT true true +1000:641a Code1 LAB_1000_641a Label DEFAULT true true +1000:6428 Code1 LAB_1000_6428 Label DEFAULT true true +1000:6433 Code1 LAB_1000_6433 Label DEFAULT true true +1000:643c Code1 LAB_1000_643c Label DEFAULT true true +1000:6446 Code1 LAB_1000_6446 Label DEFAULT true true +1000:64a0 Code1 LAB_1000_64a0 Label DEFAULT true true +1000:64db Code1 LAB_1000_64db Label DEFAULT true true +1000:6518 Code1 LAB_1000_6518 Label DEFAULT true true +1000:654c Code1 LAB_1000_654c Label DEFAULT true true +1000:65aa Code1 LAB_1000_65aa Label DEFAULT true true +1000:65bc Code1 LAB_1000_65bc Label DEFAULT true true +1000:65ce Code1 LAB_1000_65ce Label DEFAULT true true +1000:65d8 Code1 LAB_1000_65d8 Label DEFAULT true true +1000:65ed Code1 LAB_1000_65ed Label DEFAULT true true +1000:663c Code1 LAB_1000_663c Label DEFAULT true true +1000:667c Code1 LAB_1000_667c Label DEFAULT true true +1000:6685 Code1 LAB_1000_6685 Label DEFAULT true true +1000:671a Code1 LAB_1000_671a Label DEFAULT true true +1000:6727 Code1 LAB_1000_6727 Label DEFAULT true true +1000:6783 Code1 LAB_1000_6783 Label DEFAULT true true +1000:67d4 Code1 LAB_1000_67d4 Label DEFAULT true true +1000:67dd Code1 LAB_1000_67dd Label DEFAULT true true +1000:6872 Code1 LAB_1000_6872 Label DEFAULT true true +1000:68ed Code1 LAB_1000_68ed Label DEFAULT true true +1000:68f0 Code1 LAB_1000_68f0 Label DEFAULT true true +1000:6909 Code1 LAB_1000_6909 Label DEFAULT true true +1000:690b Code1 LAB_1000_690b Label DEFAULT true true +1000:6910 Code1 LAB_1000_6910 Label DEFAULT true true +1000:6913 Code1 LAB_1000_6913 Label DEFAULT true true +1000:6921 Code1 LAB_1000_6921 Label DEFAULT true true +1000:6930 Code1 LAB_1000_6930 Label DEFAULT true true +1000:693a Code1 LAB_1000_693a Label DEFAULT true true +1000:696e Code1 LAB_1000_696e Label DEFAULT true true +1000:6971 Code1 LAB_1000_6971 Label DEFAULT true true +1000:6986 Code1 LAB_1000_6986 Label DEFAULT true true +1000:6989 Code1 LAB_1000_6989 Label DEFAULT true true +1000:6a4e Code1 LAB_1000_6a4e Label DEFAULT true true +1000:6ac7 Code1 LAB_1000_6ac7 Label DEFAULT true true +1000:6ad0 Code1 LAB_1000_6ad0 Label DEFAULT true true +1000:6ad6 Code1 LAB_1000_6ad6 Label DEFAULT true true +1000:6ad9 Code1 LAB_1000_6ad9 Label DEFAULT true true +1000:6b1c Code1 LAB_1000_6b1c Label DEFAULT true true +1000:6b37 Code1 FUN_1000_6b37 Function DEFAULT true false +1000:6bf8 Code1 FUN_1000_6bf8 Function DEFAULT true false +1000:6c27 Code1 LAB_1000_6c27 Label DEFAULT true true +1000:6c34 Code1 LAB_1000_6c34 Label DEFAULT true true +1000:6c87 Code1 LAB_1000_6c87 Label DEFAULT true true +1000:6c95 Code1 LAB_1000_6c95 Label DEFAULT true true +1000:6ca0 Code1 LAB_1000_6ca0 Label DEFAULT true true +1000:6ca9 Code1 LAB_1000_6ca9 Label DEFAULT true true +1000:6cee Code1 LAB_1000_6cee Label DEFAULT true true +1000:6d1a Code1 LAB_1000_6d1a Label DEFAULT true true +1000:6d25 Code1 LAB_1000_6d25 Label DEFAULT true true +1000:6d49 Code1 LAB_1000_6d49 Label DEFAULT true true +1000:6d54 Code1 LAB_1000_6d54 Label DEFAULT true true +1000:6d78 Code1 LAB_1000_6d78 Label DEFAULT true true +1000:6d83 Code1 LAB_1000_6d83 Label DEFAULT true true +1000:6da7 Code1 LAB_1000_6da7 Label DEFAULT true true +1000:6db2 Code1 LAB_1000_6db2 Label DEFAULT true true +1000:6dd6 Code1 LAB_1000_6dd6 Label DEFAULT true true +1000:6de1 Code1 LAB_1000_6de1 Label DEFAULT true true +1000:6e05 Code1 LAB_1000_6e05 Label DEFAULT true true +1000:6e10 Code1 LAB_1000_6e10 Label DEFAULT true true +1000:6e34 Code1 LAB_1000_6e34 Label DEFAULT true true +1000:6e40 Code1 LAB_1000_6e40 Label DEFAULT true true +1000:6e64 Code1 LAB_1000_6e64 Label DEFAULT true true +1000:6e6f Code1 LAB_1000_6e6f Label DEFAULT true true +1000:6e93 Code1 LAB_1000_6e93 Label DEFAULT true true +1000:6e9e Code1 LAB_1000_6e9e Label DEFAULT true true +1000:6ec2 Code1 LAB_1000_6ec2 Label DEFAULT true true +1000:6ecd Code1 LAB_1000_6ecd Label DEFAULT true true +1000:6ed6 Code1 LAB_1000_6ed6 Label DEFAULT true true +1000:6ee5 Code1 LAB_1000_6ee5 Label DEFAULT true true +1000:6ee7 Code1 LAB_1000_6ee7 Label DEFAULT true true +1000:6efd Code1 LAB_1000_6efd Label DEFAULT true true +1000:6f0c Code1 LAB_1000_6f0c Label DEFAULT true true +1000:6f20 Code1 LAB_1000_6f20 Label DEFAULT true true +1000:6f27 Code1 FUN_1000_6f27 Function DEFAULT true false +1000:6f90 Code1 LAB_1000_6f90 Label DEFAULT true true +1000:6fc5 Code1 LAB_1000_6fc5 Label DEFAULT true true +1000:7106 Code1 LAB_1000_7106 Label DEFAULT true true +1000:7109 Code1 LAB_1000_7109 Label DEFAULT true true +1000:711b Code1 LAB_1000_711b Label DEFAULT true true +1000:715f Code1 LAB_1000_715f Label DEFAULT true true +1000:7199 Code1 LAB_1000_7199 Label DEFAULT true true +1000:71d3 Code1 LAB_1000_71d3 Label DEFAULT true true +1000:720c Code1 LAB_1000_720c Label DEFAULT true true +1000:7245 Code1 LAB_1000_7245 Label DEFAULT true true +1000:727c Code1 LAB_1000_727c Label DEFAULT true true +1000:72c3 Code1 LAB_1000_72c3 Label DEFAULT true true +1000:730a Code1 LAB_1000_730a Label DEFAULT true true +1000:7351 Code1 LAB_1000_7351 Label DEFAULT true true +1000:7398 Code1 LAB_1000_7398 Label DEFAULT true true +1000:73df Code1 LAB_1000_73df Label DEFAULT true true +1000:7440 Code1 FUN_1000_7440 Function DEFAULT true false +1000:74cc Code1 LAB_1000_74cc Label DEFAULT true true +1000:74d4 Code1 LAB_1000_74d4 Label DEFAULT true true +1000:751d Code1 LAB_1000_751d Label DEFAULT true true +1000:75b2 Code1 LAB_1000_75b2 Label DEFAULT true true +1000:75cf Code1 LAB_1000_75cf Label DEFAULT true true +1000:760c Code1 LAB_1000_760c Label DEFAULT true true +1000:762b Code1 LAB_1000_762b Label DEFAULT true true +1000:7669 Code1 LAB_1000_7669 Label DEFAULT true true +1000:7671 Code1 LAB_1000_7671 Label DEFAULT true true +1000:7679 Code1 LAB_1000_7679 Label DEFAULT true true +1000:768e Code1 LAB_1000_768e Label DEFAULT true true +1000:76bb Code1 LAB_1000_76bb Label DEFAULT true true +1000:7726 Code1 LAB_1000_7726 Label DEFAULT true true +1000:77c6 Code1 LAB_1000_77c6 Label DEFAULT true true +1000:77d2 Code1 LAB_1000_77d2 Label DEFAULT true true +1000:77dc Code1 LAB_1000_77dc Label DEFAULT true true +1000:787b Code1 LAB_1000_787b Label DEFAULT true true +1000:787e Code1 LAB_1000_787e Label DEFAULT true true +1000:789c Code1 LAB_1000_789c Label DEFAULT true true +1000:78bc Code1 LAB_1000_78bc Label DEFAULT true true +1000:78c4 Code1 LAB_1000_78c4 Label DEFAULT true true +1000:78cc Code1 LAB_1000_78cc Label DEFAULT true true +1000:78e2 Code1 LAB_1000_78e2 Label DEFAULT true true +1000:790b Code1 LAB_1000_790b Label DEFAULT true true +1000:7916 Code1 LAB_1000_7916 Label DEFAULT true true +1000:79b8 Code1 LAB_1000_79b8 Label DEFAULT true true +1000:7a20 Code1 LAB_1000_7a20 Label DEFAULT true true +1000:7a2c Code1 LAB_1000_7a2c Label DEFAULT true true +1000:7a37 Code1 LAB_1000_7a37 Label DEFAULT true true +1000:7a84 Code1 LAB_1000_7a84 Label DEFAULT true true +1000:7b23 Code1 LAB_1000_7b23 Label DEFAULT true true +1000:7b26 Code1 LAB_1000_7b26 Label DEFAULT true true +1000:7b2e Code1 LAB_1000_7b2e Label DEFAULT true true +1000:7b36 Code1 LAB_1000_7b36 Label DEFAULT true true +1000:7b4a Code1 LAB_1000_7b4a Label DEFAULT true true +1000:7bc4 Code1 LAB_1000_7bc4 Label DEFAULT true true +1000:7bcc Code1 LAB_1000_7bcc Label DEFAULT true true +1000:7bd4 Code1 LAB_1000_7bd4 Label DEFAULT true true +1000:7bea Code1 LAB_1000_7bea Label DEFAULT true true +1000:7c63 Code1 LAB_1000_7c63 Label DEFAULT true true +1000:7c6b Code1 LAB_1000_7c6b Label DEFAULT true true +1000:7c73 Code1 LAB_1000_7c73 Label DEFAULT true true +1000:7c89 Code1 LAB_1000_7c89 Label DEFAULT true true +1000:7db1 Code1 LAB_1000_7db1 Label DEFAULT true true +1000:7e12 Code1 FUN_1000_7e12 Function DEFAULT true false +1000:7e4b Code1 LAB_1000_7e4b Label DEFAULT true true +1000:7e57 Code1 LAB_1000_7e57 Label DEFAULT true true +1000:7e59 Code1 LAB_1000_7e59 Label DEFAULT true true +1000:7e82 Code1 LAB_1000_7e82 Label DEFAULT true true +1000:7e8e Code1 LAB_1000_7e8e Label DEFAULT true true +1000:7e92 Code1 FUN_1000_7e92 Function DEFAULT true false +1000:7ec5 Code1 LAB_1000_7ec5 Label DEFAULT true true +1000:7ed5 Code1 LAB_1000_7ed5 Label DEFAULT true true +1000:7ed9 Code1 FUN_1000_7ed9 Function DEFAULT true false +1000:7eef Code1 LAB_1000_7eef Label DEFAULT true true +1000:7fe0 Code1 LAB_1000_7fe0 Label DEFAULT true true +1000:7fe7 Code1 LAB_1000_7fe7 Label DEFAULT true true +1000:7fea Code1 LAB_1000_7fea Label DEFAULT true true +1000:7ff2 Code1 LAB_1000_7ff2 Label DEFAULT true true +1000:80e1 Code1 LAB_1000_80e1 Label DEFAULT true true +1000:80ea Code1 LAB_1000_80ea Label DEFAULT true true +1000:8136 Code1 LAB_1000_8136 Label DEFAULT true true +1000:8141 Code1 LAB_1000_8141 Label DEFAULT true true +1000:8149 Code1 LAB_1000_8149 Label DEFAULT true true +1000:8151 Code1 LAB_1000_8151 Label DEFAULT true true +1000:8176 Code1 LAB_1000_8176 Label DEFAULT true true +1000:817f Code1 LAB_1000_817f Label DEFAULT true true +1000:8188 Code1 LAB_1000_8188 Label DEFAULT true true +1000:82b1 Code1 LAB_1000_82b1 Label DEFAULT true true +1000:83d7 Code1 LAB_1000_83d7 Label DEFAULT true true +1000:83f9 Code1 LAB_1000_83f9 Label DEFAULT true true +1000:8419 Code1 LAB_1000_8419 Label DEFAULT true true +1000:8433 Code1 LAB_1000_8433 Label DEFAULT true true +1000:843b Code1 LAB_1000_843b Label DEFAULT true true +1000:844d Code1 LAB_1000_844d Label DEFAULT true true +1000:8455 Code1 LAB_1000_8455 Label DEFAULT true true +1000:84d5 Code1 LAB_1000_84d5 Label DEFAULT true true +1000:84dd Code1 LAB_1000_84dd Label DEFAULT true true +1000:84f8 Code1 LAB_1000_84f8 Label DEFAULT true true +1000:8507 Code1 LAB_1000_8507 Label DEFAULT true true +1000:851a Code1 LAB_1000_851a Label DEFAULT true true +1000:8523 Code1 LAB_1000_8523 Label DEFAULT true true +1000:852c Code1 LAB_1000_852c Label DEFAULT true true +1000:8537 Code1 LAB_1000_8537 Label DEFAULT true true +1000:8541 Code1 LAB_1000_8541 Label DEFAULT true true +1000:854c Code1 LAB_1000_854c Label DEFAULT true true +1000:8556 Code1 LAB_1000_8556 Label DEFAULT true true +1000:8567 Code1 LAB_1000_8567 Label DEFAULT true true +1000:856f Code1 LAB_1000_856f Label DEFAULT true true +1000:85f1 Code1 LAB_1000_85f1 Label DEFAULT true true +1000:860a Code1 LAB_1000_860a Label DEFAULT true true +1000:8613 Code1 LAB_1000_8613 Label DEFAULT true true +1000:861c Code1 LAB_1000_861c Label DEFAULT true true +1000:8625 Code1 LAB_1000_8625 Label DEFAULT true true +1000:863c Code1 LAB_1000_863c Label DEFAULT true true +1000:8669 Code1 LAB_1000_8669 Label DEFAULT true true +1000:8687 Code1 LAB_1000_8687 Label DEFAULT true true +1000:869b Code1 LAB_1000_869b Label DEFAULT true true +1000:86b6 Code1 LAB_1000_86b6 Label DEFAULT true true +1000:86cd Code1 LAB_1000_86cd Label DEFAULT true true +1000:8748 Code1 LAB_1000_8748 Label DEFAULT true true +1000:875c Code1 LAB_1000_875c Label DEFAULT true true +1000:8774 Code1 LAB_1000_8774 Label DEFAULT true true +1000:8784 Code1 LAB_1000_8784 Label DEFAULT true true +1000:87b2 Code1 LAB_1000_87b2 Label DEFAULT true true +1000:87bc Code1 LAB_1000_87bc Label DEFAULT true true +1000:8acc Code1 LAB_1000_8acc Label DEFAULT true true +1000:8af1 Code1 LAB_1000_8af1 Label DEFAULT true true +1000:8b00 Code1 LAB_1000_8b00 Label DEFAULT true true +1000:8b09 Code1 LAB_1000_8b09 Label DEFAULT true true +1000:8b0d Code1 FUN_1000_8b0d Function DEFAULT true false +1000:8b4f Code1 LAB_1000_8b4f Label DEFAULT true true +1000:8b68 Code1 LAB_1000_8b68 Label DEFAULT true true +1000:8b72 Code1 LAB_1000_8b72 Label DEFAULT true true +1000:8caf Code1 LAB_1000_8caf Label DEFAULT true true +1000:8d01 Code1 LAB_1000_8d01 Label DEFAULT true true +1000:8d51 Code1 LAB_1000_8d51 Label DEFAULT true true +1000:8d79 Code1 LAB_1000_8d79 Label DEFAULT true true +1000:8dcb Code1 LAB_1000_8dcb Label DEFAULT true true +1000:8e1b Code1 LAB_1000_8e1b Label DEFAULT true true +1000:910b Code1 LAB_1000_910b Label DEFAULT true true +1000:9165 Code1 LAB_1000_9165 Label DEFAULT true true +1000:91bd Code1 LAB_1000_91bd Label DEFAULT true true +1000:91e9 Code1 LAB_1000_91e9 Label DEFAULT true true +1000:9243 Code1 LAB_1000_9243 Label DEFAULT true true +1000:929b Code1 LAB_1000_929b Label DEFAULT true true +1000:92c1 Code1 LAB_1000_92c1 Label DEFAULT true true +1000:92d2 Code1 LAB_1000_92d2 Label DEFAULT true true +1000:92e6 Code1 LAB_1000_92e6 Label DEFAULT true true +1000:92ed Code1 LAB_1000_92ed Label DEFAULT true true +1000:9416 Code1 LAB_1000_9416 Label DEFAULT true true +1000:9470 Code1 LAB_1000_9470 Label DEFAULT true true +1000:94c8 Code1 LAB_1000_94c8 Label DEFAULT true true +1000:94f4 Code1 LAB_1000_94f4 Label DEFAULT true true +1000:954e Code1 LAB_1000_954e Label DEFAULT true true +1000:95a6 Code1 LAB_1000_95a6 Label DEFAULT true true +1000:981e Code1 LAB_1000_981e Label DEFAULT true true +1000:9870 Code1 LAB_1000_9870 Label DEFAULT true true +1000:98c0 Code1 LAB_1000_98c0 Label DEFAULT true true +1000:98e8 Code1 LAB_1000_98e8 Label DEFAULT true true +1000:993a Code1 LAB_1000_993a Label DEFAULT true true +1000:998a Code1 LAB_1000_998a Label DEFAULT true true +1000:99b1 Code1 LAB_1000_99b1 Label DEFAULT true true +1000:99c3 Code1 LAB_1000_99c3 Label DEFAULT true true +1000:99d5 Code1 LAB_1000_99d5 Label DEFAULT true true +1000:99f0 Code1 FUN_1000_99f0 Function DEFAULT true false +1000:9a2f Code1 LAB_1000_9a2f Label DEFAULT true true +1000:9a68 Code1 LAB_1000_9a68 Label DEFAULT true true +1000:9aa3 Code1 LAB_1000_9aa3 Label DEFAULT true true +1000:9adc Code1 LAB_1000_9adc Label DEFAULT true true +1000:9ae0 Code1 FUN_1000_9ae0 Function DEFAULT true false +1000:9b01 Code1 LAB_1000_9b01 Label DEFAULT true true +1000:9b1e Code1 LAB_1000_9b1e Label DEFAULT true true +1000:9b3b Code1 LAB_1000_9b3b Label DEFAULT true true +1000:9b58 Code1 LAB_1000_9b58 Label DEFAULT true true +1000:9b5e Code1 LAB_1000_9b5e Label DEFAULT true true +1000:9b62 Code1 LAB_1000_9b62 Label DEFAULT true true +1000:9b69 Code1 FUN_1000_9b69 Function DEFAULT true false +1000:9b80 Code1 LAB_1000_9b80 Label DEFAULT true true +1000:9b93 Code1 LAB_1000_9b93 Label DEFAULT true true +1000:9ba6 Code1 LAB_1000_9ba6 Label DEFAULT true true +1000:9bb9 Code1 LAB_1000_9bb9 Label DEFAULT true true +1000:9bbf Code1 LAB_1000_9bbf Label DEFAULT true true +1000:9bc3 Code1 LAB_1000_9bc3 Label DEFAULT true true +1000:9bca Code1 FUN_1000_9bca Function DEFAULT true false +1000:9dd2 Code1 LAB_1000_9dd2 Label DEFAULT true true +1000:9de1 Code1 LAB_1000_9de1 Label DEFAULT true true +1000:9e85 Code1 FUN_1000_9e85 Function DEFAULT true false +1000:9ec5 Code1 LAB_1000_9ec5 Label DEFAULT true true +1000:9f73 Code1 FUN_1000_9f73 Function DEFAULT true false +1000:a0b0 Code1 LAB_1000_a0b0 Label DEFAULT true true +1000:a0f8 Code1 LAB_1000_a0f8 Label DEFAULT true true +1000:a11c Code1 LAB_1000_a11c Label DEFAULT true true +1000:a135 Code1 LAB_1000_a135 Label DEFAULT true true +1000:a17d Code1 LAB_1000_a17d Label DEFAULT true true +1000:a1a1 Code1 LAB_1000_a1a1 Label DEFAULT true true +1000:a1bd Code1 LAB_1000_a1bd Label DEFAULT true true +1000:a1e6 Code1 LAB_1000_a1e6 Label DEFAULT true true +1000:a2db Code1 LAB_1000_a2db Label DEFAULT true true +1000:a2ea Code1 LAB_1000_a2ea Label DEFAULT true true +1000:a38e Code1 FUN_1000_a38e Function DEFAULT true false +1000:a54b Code1 LAB_1000_a54b Label DEFAULT true true +1000:a55a Code1 LAB_1000_a55a Label DEFAULT true true +1000:a589 Code1 LAB_1000_a589 Label DEFAULT true true +1000:a604 Code1 FUN_1000_a604 Function DEFAULT true false +1000:a627 Code1 LAB_1000_a627 Label DEFAULT true true +1000:a62f Code1 LAB_1000_a62f Label DEFAULT true true +1000:a689 Code1 LAB_1000_a689 Label DEFAULT true true +1000:a6a9 Code1 LAB_1000_a6a9 Label DEFAULT true true +1000:a6c7 Code1 LAB_1000_a6c7 Label DEFAULT true true +1000:a6ee Code1 LAB_1000_a6ee Label DEFAULT true true +1000:a6f7 Code1 LAB_1000_a6f7 Label DEFAULT true true +1000:a70e Code1 FUN_1000_a70e Function DEFAULT true false +1000:a72c Code1 FUN_1000_a72c Function DEFAULT true false +1000:a736 Code1 LAB_1000_a736 Label DEFAULT true true +1000:a739 Code1 LAB_1000_a739 Label DEFAULT true true +1000:a74e Code1 LAB_1000_a74e Label DEFAULT true true +1000:a751 Code1 LAB_1000_a751 Label DEFAULT true true +1000:a791 Code1 LAB_1000_a791 Label DEFAULT true true +1000:a794 Code1 LAB_1000_a794 Label DEFAULT true true +1000:a7c4 Code1 LAB_1000_a7c4 Label DEFAULT true true +1000:a7c7 Code1 LAB_1000_a7c7 Label DEFAULT true true +1000:a7d3 Code1 LAB_1000_a7d3 Label DEFAULT true true +1000:a84c Code1 LAB_1000_a84c Label DEFAULT true true +1000:a85b Code1 LAB_1000_a85b Label DEFAULT true true +1000:a88c Code1 LAB_1000_a88c Label DEFAULT true true +1000:a88f Code1 LAB_1000_a88f Label DEFAULT true true +1000:a8b5 Code1 LAB_1000_a8b5 Label DEFAULT true true +1000:a8be Code1 LAB_1000_a8be Label DEFAULT true true +1000:a8ce Code1 LAB_1000_a8ce Label DEFAULT true true +1000:a8d1 Code1 LAB_1000_a8d1 Label DEFAULT true true +1000:a8ea Code1 FUN_1000_a8ea Function DEFAULT true false +1000:a906 Code1 LAB_1000_a906 Label DEFAULT true true +1000:a91d Code1 LAB_1000_a91d Label DEFAULT true true +1000:a920 Code1 LAB_1000_a920 Label DEFAULT true true +1000:a998 Code1 LAB_1000_a998 Label DEFAULT true true +1000:a99c Code1 FUN_1000_a99c Function DEFAULT true false +1000:a9c8 Code1 LAB_1000_a9c8 Label DEFAULT true true +1000:a9d1 Code1 LAB_1000_a9d1 Label DEFAULT true true +1000:aa35 Code1 LAB_1000_aa35 Label DEFAULT true true +1000:aa38 Code1 LAB_1000_aa38 Label DEFAULT true true +1000:aa60 Code1 LAB_1000_aa60 Label DEFAULT true true +1000:aa68 Code1 LAB_1000_aa68 Label DEFAULT true true +1000:aa71 Code1 LAB_1000_aa71 Label DEFAULT true true +1000:aa78 Code1 LAB_1000_aa78 Label DEFAULT true true +1000:aa7b Code1 LAB_1000_aa7b Label DEFAULT true true +1000:ab38 Code1 LAB_1000_ab38 Label DEFAULT true true +1000:ab3c Code1 FUN_1000_ab3c Function DEFAULT true false +1000:ab9c Code1 LAB_1000_ab9c Label DEFAULT true true +1000:abe5 Code1 FUN_1000_abe5 Function DEFAULT true false +1000:abf0 Code1 LAB_1000_abf0 Label DEFAULT true true +1000:abf3 Code1 LAB_1000_abf3 Label DEFAULT true true +1000:ac16 Code1 LAB_1000_ac16 Label DEFAULT true true +1000:ac1f Code1 LAB_1000_ac1f Label DEFAULT true true +1000:ac33 Code1 LAB_1000_ac33 Label DEFAULT true true +1000:ac36 Code1 LAB_1000_ac36 Label DEFAULT true true +1000:ac7b Code1 LAB_1000_ac7b Label DEFAULT true true +1000:acb5 Code1 LAB_1000_acb5 Label DEFAULT true true +1000:acbe Code1 LAB_1000_acbe Label DEFAULT true true +1000:acc2 Code1 FUN_1000_acc2 Function DEFAULT true false +1000:acf3 Code1 LAB_1000_acf3 Label DEFAULT true true +1000:acf9 Code1 LAB_1000_acf9 Label DEFAULT true true +1000:acfd Code1 LAB_1000_acfd Label DEFAULT true true +1000:ad4f Code1 LAB_1000_ad4f Label DEFAULT true true +1000:adf9 Code1 LAB_1000_adf9 Label DEFAULT true true +1000:ae42 Code1 LAB_1000_ae42 Label DEFAULT true true +1000:ae4f Code1 LAB_1000_ae4f Label DEFAULT true true +1000:ae6e Code1 FUN_1000_ae6e Function DEFAULT true false +1000:ae7c Code1 LAB_1000_ae7c Label DEFAULT true true +1000:ae86 Code1 LAB_1000_ae86 Label DEFAULT true true +1000:af80 Code1 LAB_1000_af80 Label DEFAULT true true +1000:afab Code1 LAB_1000_afab Label DEFAULT true true +1000:afed Code1 LAB_1000_afed Label DEFAULT true true +1000:b00f Code1 LAB_1000_b00f Label DEFAULT true true +1000:b012 Code1 LAB_1000_b012 Label DEFAULT true true +1000:b077 Code1 LAB_1000_b077 Label DEFAULT true true +1000:b0a3 Code1 LAB_1000_b0a3 Label DEFAULT true true +1000:b0b6 Code1 LAB_1000_b0b6 Label DEFAULT true true +1000:b0bc Code1 LAB_1000_b0bc Label DEFAULT true true +1000:b0bf Code1 LAB_1000_b0bf Label DEFAULT true true +1000:b12f Code1 LAB_1000_b12f Label DEFAULT true true +1000:b13b Code1 LAB_1000_b13b Label DEFAULT true true +1000:b13e Code1 LAB_1000_b13e Label DEFAULT true true +1000:b155 Code1 LAB_1000_b155 Label DEFAULT true true +1000:b161 Code1 LAB_1000_b161 Label DEFAULT true true +1000:b164 Code1 LAB_1000_b164 Label DEFAULT true true +1000:b187 Code1 LAB_1000_b187 Label DEFAULT true true +1000:b1a0 Code1 LAB_1000_b1a0 Label DEFAULT true true +1000:b1a3 Code1 LAB_1000_b1a3 Label DEFAULT true true +1000:b1cc Code1 LAB_1000_b1cc Label DEFAULT true true +1000:b20f Code1 LAB_1000_b20f Label DEFAULT true true +1000:b293 Code1 LAB_1000_b293 Label DEFAULT true true +1000:b2c4 Code1 LAB_1000_b2c4 Label DEFAULT true true +1000:b2c8 Code1 FUN_1000_b2c8 Function DEFAULT true false +1000:b30b Code1 FUN_1000_b30b Function DEFAULT true false +1000:b34e Code1 LAB_1000_b34e Label DEFAULT true true +1000:b370 Code1 LAB_1000_b370 Label DEFAULT true true +1000:b399 Code1 LAB_1000_b399 Label DEFAULT true true +1000:b3b0 Code1 FUN_1000_b3b0 Function DEFAULT true false +1000:b3f3 Code1 FUN_1000_b3f3 Function DEFAULT true false +1000:b436 Code1 LAB_1000_b436 Label DEFAULT true true +1000:b45f Code1 LAB_1000_b45f Label DEFAULT true true +1000:b476 Code1 FUN_1000_b476 Function DEFAULT true false +1000:b484 Code1 LAB_1000_b484 Label DEFAULT true true +1000:b4d7 Code1 LAB_1000_b4d7 Label DEFAULT true true +1000:b526 Code1 LAB_1000_b526 Label DEFAULT true true +1000:b54c Code1 LAB_1000_b54c Label DEFAULT true true +1000:b55a Code1 LAB_1000_b55a Label DEFAULT true true +1000:b5a2 Code1 LAB_1000_b5a2 Label DEFAULT true true +1000:b5b2 Code1 LAB_1000_b5b2 Label DEFAULT true true +1000:b5db Code1 LAB_1000_b5db Label DEFAULT true true +1000:b626 Code1 LAB_1000_b626 Label DEFAULT true true +1000:b634 Code1 LAB_1000_b634 Label DEFAULT true true +1000:b645 Code1 LAB_1000_b645 Label DEFAULT true true +1000:b648 Code1 LAB_1000_b648 Label DEFAULT true true +1000:b666 Code1 LAB_1000_b666 Label DEFAULT true true +1000:b66c Code1 LAB_1000_b66c Label DEFAULT true true +1000:b675 Code1 LAB_1000_b675 Label DEFAULT true true +1000:b69a Code1 LAB_1000_b69a Label DEFAULT true true +1000:b6b6 Code1 LAB_1000_b6b6 Label DEFAULT true true +1000:b6d1 Code1 LAB_1000_b6d1 Label DEFAULT true true +1000:b6ec Code1 LAB_1000_b6ec Label DEFAULT true true +1000:b6f2 Code1 LAB_1000_b6f2 Label DEFAULT true true +1000:b6f5 Code1 LAB_1000_b6f5 Label DEFAULT true true +1000:b758 Code1 LAB_1000_b758 Label DEFAULT true true +1000:b766 Code1 LAB_1000_b766 Label DEFAULT true true +1000:b777 Code1 LAB_1000_b777 Label DEFAULT true true +1000:b77a Code1 LAB_1000_b77a Label DEFAULT true true +1000:b798 Code1 LAB_1000_b798 Label DEFAULT true true +1000:b79e Code1 LAB_1000_b79e Label DEFAULT true true +1000:b7a7 Code1 LAB_1000_b7a7 Label DEFAULT true true +1000:b7b2 Code1 LAB_1000_b7b2 Label DEFAULT true true +1000:b7b5 Code1 LAB_1000_b7b5 Label DEFAULT true true +1000:b7de Code1 LAB_1000_b7de Label DEFAULT true true +1000:b839 Code1 LAB_1000_b839 Label DEFAULT true true +1000:b842 Code1 LAB_1000_b842 Label DEFAULT true true +1000:b998 Code1 LAB_1000_b998 Label DEFAULT true true +1000:ba13 Code1 LAB_1000_ba13 Label DEFAULT true true +1000:ba20 Code1 LAB_1000_ba20 Label DEFAULT true true +1000:ba26 Code1 LAB_1000_ba26 Label DEFAULT true true +1000:ba29 Code1 LAB_1000_ba29 Label DEFAULT true true +1000:ba8c Code1 LAB_1000_ba8c Label DEFAULT true true +1000:ba9a Code1 LAB_1000_ba9a Label DEFAULT true true +1000:bace Code1 LAB_1000_bace Label DEFAULT true true +1000:bafe Code1 LAB_1000_bafe Label DEFAULT true true +1000:bb2d Code1 LAB_1000_bb2d Label DEFAULT true true +1000:bb3b Code1 LAB_1000_bb3b Label DEFAULT true true +1000:bb83 Code1 LAB_1000_bb83 Label DEFAULT true true +1000:bbc7 Code1 LAB_1000_bbc7 Label DEFAULT true true +1000:bc0b Code1 LAB_1000_bc0b Label DEFAULT true true +1000:bc32 Code1 LAB_1000_bc32 Label DEFAULT true true +1000:bc36 Code1 FUN_1000_bc36 Function DEFAULT true false +1000:bc5c Code1 LAB_1000_bc5c Label DEFAULT true true +1000:bc66 Code1 LAB_1000_bc66 Label DEFAULT true true +1000:bc83 Code1 LAB_1000_bc83 Label DEFAULT true true +1000:bca8 Code1 LAB_1000_bca8 Label DEFAULT true true +1000:bd08 Code1 LAB_1000_bd08 Label DEFAULT true true +1000:bd3d Code1 LAB_1000_bd3d Label DEFAULT true true +1000:bd6e Code1 LAB_1000_bd6e Label DEFAULT true true +1000:bd7a Code1 LAB_1000_bd7a Label DEFAULT true true +1000:bda2 Code1 FUN_1000_bda2 Function DEFAULT true false +1000:bdde Code1 FUN_1000_bdde Function DEFAULT true false +1000:beff Code1 FUN_1000_beff Function DEFAULT true false +1000:c08d Code1 LAB_1000_c08d Label DEFAULT true true +1000:c0d5 Code1 LAB_1000_c0d5 Label DEFAULT true true +1000:c0f9 Code1 LAB_1000_c0f9 Label DEFAULT true true +1000:c112 Code1 LAB_1000_c112 Label DEFAULT true true +1000:c15a Code1 LAB_1000_c15a Label DEFAULT true true +1000:c17e Code1 LAB_1000_c17e Label DEFAULT true true +1000:c19a Code1 LAB_1000_c19a Label DEFAULT true true +1000:c1c3 Code1 LAB_1000_c1c3 Label DEFAULT true true +1000:c2b8 Code1 LAB_1000_c2b8 Label DEFAULT true true +1000:c2c7 Code1 LAB_1000_c2c7 Label DEFAULT true true +1000:c36b Code1 FUN_1000_c36b Function DEFAULT true false +1000:c426 Code1 FUN_1000_c426 Function DEFAULT true false +1000:c4e1 Code1 FUN_1000_c4e1 Function DEFAULT true false +1000:c55c Code1 LAB_1000_c55c Label DEFAULT true true +1000:c5c7 Code1 LAB_1000_c5c7 Label DEFAULT true true +1000:c632 Code1 LAB_1000_c632 Label DEFAULT true true +1000:c69d Code1 LAB_1000_c69d Label DEFAULT true true +1000:c708 Code1 LAB_1000_c708 Label DEFAULT true true +1000:c765 Code1 LAB_1000_c765 Label DEFAULT true true +1000:c786 Code1 LAB_1000_c786 Label DEFAULT true true +1000:c798 Code1 LAB_1000_c798 Label DEFAULT true true +1000:c79c Code1 FUN_1000_c79c Function DEFAULT true false +1000:c7cd Code1 LAB_1000_c7cd Label DEFAULT true true +1000:c7d2 Code1 LAB_1000_c7d2 Label DEFAULT true true +1000:c7d5 Code1 LAB_1000_c7d5 Label DEFAULT true true +1000:c7f3 Code1 LAB_1000_c7f3 Label DEFAULT true true +1000:c82f Code1 LAB_1000_c82f Label DEFAULT true true +1000:c835 Code1 LAB_1000_c835 Label DEFAULT true true +1000:c839 Code1 LAB_1000_c839 Label DEFAULT true true +1000:c8e5 Code1 LAB_1000_c8e5 Label DEFAULT true true +1000:c8ee Code1 LAB_1000_c8ee Label DEFAULT true true +1000:c9ee Code1 LAB_1000_c9ee Label DEFAULT true true +1000:cae8 Code1 LAB_1000_cae8 Label DEFAULT true true +1000:caf9 Code1 LAB_1000_caf9 Label DEFAULT true true +1000:cb09 Code1 LAB_1000_cb09 Label DEFAULT true true +1000:cb1a Code1 LAB_1000_cb1a Label DEFAULT true true +1000:cb3e Code1 LAB_1000_cb3e Label DEFAULT true true +1000:cb47 Code1 LAB_1000_cb47 Label DEFAULT true true +1000:cb58 Code1 LAB_1000_cb58 Label DEFAULT true true +1000:cb60 Code1 LAB_1000_cb60 Label DEFAULT true true +1000:cb66 Code1 LAB_1000_cb66 Label DEFAULT true true +1000:cb6d Code1 LAB_1000_cb6d Label DEFAULT true true +1000:cb70 Code1 LAB_1000_cb70 Label DEFAULT true true +1000:cb96 Code1 LAB_1000_cb96 Label DEFAULT true true +1000:cba0 Code1 LAB_1000_cba0 Label DEFAULT true true +1000:cbd0 Code1 LAB_1000_cbd0 Label DEFAULT true true +1000:cbde Code1 LAB_1000_cbde Label DEFAULT true true +1000:cbec Code1 LAB_1000_cbec Label DEFAULT true true +1000:cc7d Code1 LAB_1000_cc7d Label DEFAULT true true +1000:cccf Code1 LAB_1000_cccf Label DEFAULT true true +1000:ccdd Code1 LAB_1000_ccdd Label DEFAULT true true +1000:cd03 Code1 LAB_1000_cd03 Label DEFAULT true true +1000:cd0a Code1 LAB_1000_cd0a Label DEFAULT true true +1000:cd18 Code1 LAB_1000_cd18 Label DEFAULT true true +1000:cdb1 Code1 LAB_1000_cdb1 Label DEFAULT true true +1000:ce47 Code1 LAB_1000_ce47 Label DEFAULT true true +1000:ce62 Code1 LAB_1000_ce62 Label DEFAULT true true +1000:ce7b Code1 LAB_1000_ce7b Label DEFAULT true true +1000:ce84 Code1 LAB_1000_ce84 Label DEFAULT true true +1000:cef0 Code1 LAB_1000_cef0 Label DEFAULT true true +1000:cf4f Code1 LAB_1000_cf4f Label DEFAULT true true +1000:cf57 Code1 LAB_1000_cf57 Label DEFAULT true true +1000:cf65 Code1 LAB_1000_cf65 Label DEFAULT true true +1000:cf76 Code1 LAB_1000_cf76 Label DEFAULT true true +1000:cf91 Code1 LAB_1000_cf91 Label DEFAULT true true +1000:cf9b Code1 LAB_1000_cf9b Label DEFAULT true true +1000:cfb2 Code1 LAB_1000_cfb2 Label DEFAULT true true +1000:cfb5 Code1 LAB_1000_cfb5 Label DEFAULT true true +1000:cfbc Code1 LAB_1000_cfbc Label DEFAULT true true +1000:cfc6 Code1 LAB_1000_cfc6 Label DEFAULT true true +1000:cfea Code1 LAB_1000_cfea Label DEFAULT true true +1000:cff2 Code1 LAB_1000_cff2 Label DEFAULT true true +1000:d075 Code1 LAB_1000_d075 Label DEFAULT true true +1000:d0fe Code1 LAB_1000_d0fe Label DEFAULT true true +1000:d123 Code1 LAB_1000_d123 Label DEFAULT true true +1000:d12b Code1 LAB_1000_d12b Label DEFAULT true true +1000:d13e Code1 LAB_1000_d13e Label DEFAULT true true +1000:d185 Code1 LAB_1000_d185 Label DEFAULT true true +1000:d215 Code1 LAB_1000_d215 Label DEFAULT true true +1000:d2b9 Code1 LAB_1000_d2b9 Label DEFAULT true true +1000:d2bb Code1 LAB_1000_d2bb Label DEFAULT true true +1000:d2ca Code1 LAB_1000_d2ca Label DEFAULT true true +1000:d2cd Code1 LAB_1000_d2cd Label DEFAULT true true +1000:d301 Code1 LAB_1000_d301 Label DEFAULT true true +1000:d318 Code1 LAB_1000_d318 Label DEFAULT true true +1000:d3f4 Code1 LAB_1000_d3f4 Label DEFAULT true true +1000:d400 Code1 LAB_1000_d400 Label DEFAULT true true +1000:d403 Code1 LAB_1000_d403 Label DEFAULT true true +1000:d40a Code1 LAB_1000_d40a Label DEFAULT true true +1000:d608 Code1 LAB_1000_d608 Label DEFAULT true true +1000:d610 Code1 LAB_1000_d610 Label DEFAULT true true +1000:d61b Code1 LAB_1000_d61b Label DEFAULT true true +1000:d624 Code1 LAB_1000_d624 Label DEFAULT true true +1000:d64b Code1 LAB_1000_d64b Label DEFAULT true true +1000:d654 Code1 LAB_1000_d654 Label DEFAULT true true +1000:d65b Code1 LAB_1000_d65b Label DEFAULT true true +1000:d6e7 Code1 LAB_1000_d6e7 Label DEFAULT true true +1000:d6ef Code1 LAB_1000_d6ef Label DEFAULT true true +1000:d77d Code1 LAB_1000_d77d Label DEFAULT true true +1000:d782 Code1 LAB_1000_d782 Label DEFAULT true true +1000:d785 Code1 LAB_1000_d785 Label DEFAULT true true +1000:d78c Code1 LAB_1000_d78c Label DEFAULT true true +1000:d815 Code1 LAB_1000_d815 Label DEFAULT true true +1000:d84f Code1 LAB_1000_d84f Label DEFAULT true true +1000:d859 Code1 LAB_1000_d859 Label DEFAULT true true +1000:d879 Code1 LAB_1000_d879 Label DEFAULT true true +1000:d892 Code1 LAB_1000_d892 Label DEFAULT true true +1000:d899 Code1 LAB_1000_d899 Label DEFAULT true true +1000:d8aa Code1 LAB_1000_d8aa Label DEFAULT true true +1000:d8be Code1 LAB_1000_d8be Label DEFAULT true true +1000:d8ca Code1 LAB_1000_d8ca Label DEFAULT true true +1000:d8f2 Code1 LAB_1000_d8f2 Label DEFAULT true true +1000:d8fc Code1 LAB_1000_d8fc Label DEFAULT true true +1000:d904 Code1 LAB_1000_d904 Label DEFAULT true true +1000:d92c Code1 LAB_1000_d92c Label DEFAULT true true +1000:d936 Code1 LAB_1000_d936 Label DEFAULT true true +1000:d93e Code1 LAB_1000_d93e Label DEFAULT true true +1000:d94f Code1 LAB_1000_d94f Label DEFAULT true true +1000:d959 Code1 LAB_1000_d959 Label DEFAULT true true +1000:d961 Code1 LAB_1000_d961 Label DEFAULT true true +1000:d972 Code1 LAB_1000_d972 Label DEFAULT true true +1000:d97e Code1 LAB_1000_d97e Label DEFAULT true true +1000:d9b3 Code1 LAB_1000_d9b3 Label DEFAULT true true +1000:d9d0 Code1 LAB_1000_d9d0 Label DEFAULT true true +1000:d9f1 Code1 LAB_1000_d9f1 Label DEFAULT true true +1000:d9f4 Code1 LAB_1000_d9f4 Label DEFAULT true true +1000:da0e Code1 LAB_1000_da0e Label DEFAULT true true +1000:da55 Code1 LAB_1000_da55 Label DEFAULT true true +1000:da9a Code1 LAB_1000_da9a Label DEFAULT true true +1000:dab4 Code1 LAB_1000_dab4 Label DEFAULT true true +1000:dafb Code1 LAB_1000_dafb Label DEFAULT true true +1000:db40 Code1 LAB_1000_db40 Label DEFAULT true true +1000:db43 Code1 LAB_1000_db43 Label DEFAULT true true +1000:db4c Code1 LAB_1000_db4c Label DEFAULT true true +1000:db56 Code1 LAB_1000_db56 Label DEFAULT true true +1000:db70 Code1 LAB_1000_db70 Label DEFAULT true true +1000:db7d Code1 LAB_1000_db7d Label DEFAULT true true +1000:db8a Code1 LAB_1000_db8a Label DEFAULT true true +1000:db95 Code1 LAB_1000_db95 Label DEFAULT true true +1000:dbbe Code1 LAB_1000_dbbe Label DEFAULT true true +1000:dbc2 Code1 LAB_1000_dbc2 Label DEFAULT true true +1000:dbd3 Code1 LAB_1000_dbd3 Label DEFAULT true true +1000:dbd6 Code1 LAB_1000_dbd6 Label DEFAULT true true +1000:dbe0 Code1 LAB_1000_dbe0 Label DEFAULT true true +1000:dbea Code1 LAB_1000_dbea Label DEFAULT true true +1000:dbfe Code1 LAB_1000_dbfe Label DEFAULT true true +1000:dc02 Code1 LAB_1000_dc02 Label DEFAULT true true +1000:dc2e Code1 LAB_1000_dc2e Label DEFAULT true true +1000:dc6f Code1 LAB_1000_dc6f Label DEFAULT true true +1000:dc7a Code1 LAB_1000_dc7a Label DEFAULT true true +1000:dd3b Code1 LAB_1000_dd3b Label DEFAULT true true +1000:dd42 Code1 LAB_1000_dd42 Label DEFAULT true true +1000:dd7c Code1 LAB_1000_dd7c Label DEFAULT true true +1000:ddb3 Code1 LAB_1000_ddb3 Label DEFAULT true true +1000:dddd Code1 LAB_1000_dddd Label DEFAULT true true +1000:de0a Code1 LAB_1000_de0a Label DEFAULT true true +1000:de14 Code1 LAB_1000_de14 Label DEFAULT true true +1000:de26 Code1 LAB_1000_de26 Label DEFAULT true true +1000:de33 Code1 LAB_1000_de33 Label DEFAULT true true +1000:de35 Code1 LAB_1000_de35 Label DEFAULT true true +1000:de5b Code1 LAB_1000_de5b Label DEFAULT true true +1000:de5e Code1 LAB_1000_de5e Label DEFAULT true true +1000:de6d Code1 LAB_1000_de6d Label DEFAULT true true +1000:dea3 Code1 LAB_1000_dea3 Label DEFAULT true true +1000:deb3 Code1 LAB_1000_deb3 Label DEFAULT true true +1000:debb Code1 LAB_1000_debb Label DEFAULT true true +1000:dec6 Code1 LAB_1000_dec6 Label DEFAULT true true +1000:ded0 Code1 LAB_1000_ded0 Label DEFAULT true true +1000:dede Code1 LAB_1000_dede Label DEFAULT true true +1000:dfb0 Code1 LAB_1000_dfb0 Label DEFAULT true true +1000:e00f Code1 LAB_1000_e00f Label DEFAULT true true +1000:e017 Code1 LAB_1000_e017 Label DEFAULT true true +1000:e025 Code1 LAB_1000_e025 Label DEFAULT true true +1000:e036 Code1 LAB_1000_e036 Label DEFAULT true true +1000:e051 Code1 LAB_1000_e051 Label DEFAULT true true +1000:e05b Code1 LAB_1000_e05b Label DEFAULT true true +1000:e060 Code1 LAB_1000_e060 Label DEFAULT true true +1000:e06a Code1 LAB_1000_e06a Label DEFAULT true true +1000:e08d Code1 LAB_1000_e08d Label DEFAULT true true +1000:e095 Code1 LAB_1000_e095 Label DEFAULT true true +1000:e1b9 Code1 LAB_1000_e1b9 Label DEFAULT true true +1000:e1c3 Code1 LAB_1000_e1c3 Label DEFAULT true true +1000:e1cd Code1 LAB_1000_e1cd Label DEFAULT true true +1000:e1e5 Code1 LAB_1000_e1e5 Label DEFAULT true true +1000:e219 Code1 LAB_1000_e219 Label DEFAULT true true +1000:e32c Code1 LAB_1000_e32c Label DEFAULT true true +1000:e35c Code1 LAB_1000_e35c Label DEFAULT true true +1000:e36f Code1 LAB_1000_e36f Label DEFAULT true true +1000:e37b Code1 LAB_1000_e37b Label DEFAULT true true +1000:e3e6 Code1 LAB_1000_e3e6 Label DEFAULT true true +1000:e480 Code1 LAB_1000_e480 Label DEFAULT true true +1000:e498 Code1 LAB_1000_e498 Label DEFAULT true true +1000:e4a2 Code1 LAB_1000_e4a2 Label DEFAULT true true +1000:e590 Code1 LAB_1000_e590 Label DEFAULT true true +1000:e5c1 Code1 LAB_1000_e5c1 Label DEFAULT true true +1000:e61c Code1 LAB_1000_e61c Label DEFAULT true true +1000:e638 Code1 LAB_1000_e638 Label DEFAULT true true +1000:e670 Code1 LAB_1000_e670 Label DEFAULT true true +1000:e68d Code1 LAB_1000_e68d Label DEFAULT true true +1000:e694 Code1 LAB_1000_e694 Label DEFAULT true true +1000:e6d2 Code1 LAB_1000_e6d2 Label DEFAULT true true +1000:e7d4 Code1 LAB_1000_e7d4 Label DEFAULT true true +1000:e7f3 Code1 LAB_1000_e7f3 Label DEFAULT true true +1000:e7fb Code1 LAB_1000_e7fb Label DEFAULT true true +1000:e7fd Code1 LAB_1000_e7fd Label DEFAULT true true +1000:e828 Code1 LAB_1000_e828 Label DEFAULT true true +1000:e831 Code1 LAB_1000_e831 Label DEFAULT true true +1000:e843 Code1 LAB_1000_e843 Label DEFAULT true true +1000:e90b Code1 LAB_1000_e90b Label DEFAULT true true +1000:e914 Code1 LAB_1000_e914 Label DEFAULT true true +1000:e9f0 Code1 LAB_1000_e9f0 Label DEFAULT true true +1000:ea36 Code1 LAB_1000_ea36 Label DEFAULT true true +1000:ea54 Code1 LAB_1000_ea54 Label DEFAULT true true +1000:ea56 Code1 LAB_1000_ea56 Label DEFAULT true true +1000:ea63 Code1 LAB_1000_ea63 Label DEFAULT true true +1000:ea83 Code1 LAB_1000_ea83 Label DEFAULT true true +1000:eaa1 Code1 LAB_1000_eaa1 Label DEFAULT true true +1000:eaad Code1 LAB_1000_eaad Label DEFAULT true true +1000:eab1 Code1 exported_ordinal_10 Function USER_DEFINED true false +1000:eac5 Code1 LAB_1000_eac5 Label DEFAULT true true +1000:ead2 Code1 LAB_1000_ead2 Label DEFAULT true true +1000:eadd Code1 LAB_1000_eadd Label DEFAULT true true +1000:eae8 Code1 LAB_1000_eae8 Label DEFAULT true true +1000:eaf2 Code1 LAB_1000_eaf2 Label DEFAULT true true +1000:eafc Code1 LAB_1000_eafc Label DEFAULT true true +1000:eb06 Code1 LAB_1000_eb06 Label DEFAULT true true +1000:eb19 Code1 LAB_1000_eb19 Label DEFAULT true true +1000:eb1c Code1 LAB_1000_eb1c Label DEFAULT true true +1000:eb31 Code1 LAB_1000_eb31 Label DEFAULT true true +1000:eb49 Code1 LAB_1000_eb49 Label DEFAULT true true +1000:eb53 Code1 LAB_1000_eb53 Label DEFAULT true true +1000:eb5d Code1 LAB_1000_eb5d Label DEFAULT true true +1000:eb84 Code1 LAB_1000_eb84 Label DEFAULT true true +1000:eb8b Code1 LAB_1000_eb8b Label DEFAULT true true +1000:ebad Code1 LAB_1000_ebad Label DEFAULT true true +1000:ebf1 Code1 LAB_1000_ebf1 Label DEFAULT true true +1000:ebf4 Code1 LAB_1000_ebf4 Label DEFAULT true true +1000:ec03 Code1 LAB_1000_ec03 Label DEFAULT true true +1000:ec06 Code1 LAB_1000_ec06 Label DEFAULT true true +1000:ece0 Code1 LAB_1000_ece0 Label DEFAULT true true +1000:ed5d Code1 LAB_1000_ed5d Label DEFAULT true true +1000:edda Code1 LAB_1000_edda Label DEFAULT true true +1000:ee57 Code1 LAB_1000_ee57 Label DEFAULT true true +1000:eed4 Code1 LAB_1000_eed4 Label DEFAULT true true +1000:ef51 Code1 LAB_1000_ef51 Label DEFAULT true true +1000:efce Code1 LAB_1000_efce Label DEFAULT true true +1000:f04b Code1 LAB_1000_f04b Label DEFAULT true true +1000:f0c7 Code1 LAB_1000_f0c7 Label DEFAULT true true +1000:f101 Code1 LAB_1000_f101 Label DEFAULT true true +1000:f121 Code1 LAB_1000_f121 Label DEFAULT true true +1000:f128 Code1 LAB_1000_f128 Label DEFAULT true true +1000:f12b Code1 LAB_1000_f12b Label DEFAULT true true +1000:f15e Code1 LAB_1000_f15e Label DEFAULT true true +1000:f17c Code1 LAB_1000_f17c Label DEFAULT true true +1000:f18e Code1 LAB_1000_f18e Label DEFAULT true true +1000:f193 Code1 LAB_1000_f193 Label DEFAULT true true +1000:f1a0 Code1 LAB_1000_f1a0 Label DEFAULT true true +1000:f1aa Code1 LAB_1000_f1aa Label DEFAULT true true +1000:f1de Code1 LAB_1000_f1de Label DEFAULT true true +1000:f1e7 Code1 LAB_1000_f1e7 Label DEFAULT true true +1000:f22a Code1 LAB_1000_f22a Label DEFAULT true true +1000:f295 Code1 LAB_1000_f295 Label DEFAULT true true +1000:f297 Code1 LAB_1000_f297 Label DEFAULT true true +1000:f2d5 Code1 LAB_1000_f2d5 Label DEFAULT true true +1000:f2de Code1 LAB_1000_f2de Label DEFAULT true true +1000:f2f5 Code1 LAB_1000_f2f5 Label DEFAULT true true +1000:f30e Code1 LAB_1000_f30e Label DEFAULT true true +1000:f38f Code1 LAB_1000_f38f Label DEFAULT true true +1000:f39d Code1 LAB_1000_f39d Label DEFAULT true true +1000:f4aa Code1 LAB_1000_f4aa Label DEFAULT true true +1000:f4ad Code1 LAB_1000_f4ad Label DEFAULT true true +1000:f4b7 Code1 LAB_1000_f4b7 Label DEFAULT true true +1000:f50e Code1 LAB_1000_f50e Label DEFAULT true true +1000:f525 Code1 LAB_1000_f525 Label DEFAULT true true +1000:f541 Code1 LAB_1000_f541 Label DEFAULT true true +1000:f57f Code1 LAB_1000_f57f Label DEFAULT true true +1000:f5a5 Code1 LAB_1000_f5a5 Label DEFAULT true true +1000:f5c9 Code1 LAB_1000_f5c9 Label DEFAULT true true +1000:f5ff Code1 LAB_1000_f5ff Label DEFAULT true true +1000:f61e Code1 LAB_1000_f61e Label DEFAULT true true +1000:f63a Code1 LAB_1000_f63a Label DEFAULT true true +1000:f6dd Code1 LAB_1000_f6dd Label DEFAULT true true +1000:f74a Code1 LAB_1000_f74a Label DEFAULT true true +1000:f759 Code1 LAB_1000_f759 Label DEFAULT true true +1000:f775 Code1 LAB_1000_f775 Label DEFAULT true true +1000:f7f9 Code1 LAB_1000_f7f9 Label DEFAULT true true +1000:f849 Code1 LAB_1000_f849 Label DEFAULT true true +1000:f898 Code1 LAB_1000_f898 Label DEFAULT true true +1000:f8e5 Code1 LAB_1000_f8e5 Label DEFAULT true true +1000:f8f4 Code1 LAB_1000_f8f4 Label DEFAULT true true +1000:f951 Code1 LAB_1000_f951 Label DEFAULT true true +1000:f960 Code1 LAB_1000_f960 Label DEFAULT true true +1000:f96f Code1 LAB_1000_f96f Label DEFAULT true true +1000:f98b Code1 LAB_1000_f98b Label DEFAULT true true +1000:fa51 Code1 LAB_1000_fa51 Label DEFAULT true true +1000:fa72 Code1 LAB_1000_fa72 Label DEFAULT true true +1000:fabd Code1 LAB_1000_fabd Label DEFAULT true true +1000:fba8 Code1 LAB_1000_fba8 Label DEFAULT true true +1000:fc04 Code1 LAB_1000_fc04 Label DEFAULT true true +1000:fc0e Code1 LAB_1000_fc0e Label DEFAULT true true +1000:fc1c Code1 LAB_1000_fc1c Label DEFAULT true true +1000:fc33 Code1 LAB_1000_fc33 Label DEFAULT true true +1000:fc48 Code1 LAB_1000_fc48 Label DEFAULT true true +1000:fc4b Code1 LAB_1000_fc4b Label DEFAULT true true +1000:fc5c Code1 LAB_1000_fc5c Label DEFAULT true true +1000:fc6e Code1 LAB_1000_fc6e Label DEFAULT true true +1000:fcc6 Code1 LAB_1000_fcc6 Label DEFAULT true true +1000:fcc9 Code1 LAB_1000_fcc9 Label DEFAULT true true +1000:fce7 Code1 LAB_1000_fce7 Label DEFAULT true true +1000:fd59 Code1 LAB_1000_fd59 Label DEFAULT true true +1000:fd7a Code1 LAB_1000_fd7a Label DEFAULT true true +1000:fd81 Code1 LAB_1000_fd81 Label DEFAULT true true +1000:fd85 Code1 entry Label IMPORTED false false +1000:fd85 Code1 ne_program_entry Function USER_DEFINED true false +1000:fdf4 Code1 LAB_1000_fdf4 Label DEFAULT true true +1000:fe08 Code1 LAB_1000_fe08 Label DEFAULT true true +1000:fe32 Code1 LAB_1000_fe32 Label DEFAULT true true +1008:0000 Code2 code_segment_2_tag Label USER_DEFINED true false +1008:0002 Code2 FUN_1008_0002 Function DEFAULT true false +1008:001f Code2 LAB_1008_001f Label DEFAULT true true +1008:0023 Code2 FUN_1008_0023 Function DEFAULT true false +1008:0040 Code2 LAB_1008_0040 Label DEFAULT true true +1008:005b Code2 LAB_1008_005b Label DEFAULT true true +1008:005e Code2 LAB_1008_005e Label DEFAULT true true +1008:00de Code2 LAB_1008_00de Label DEFAULT true true +1008:00e2 Code2 FUN_1008_00e2 Function DEFAULT true false +1008:00e6 Code2 LAB_1008_00e6 Label DEFAULT true true +1008:0130 Code2 LAB_1008_0130 Label DEFAULT true true +1008:0138 Code2 FUN_1008_0138 Function DEFAULT true false +1008:0146 Code2 LAB_1008_0146 Label DEFAULT true true +1008:016a Code2 LAB_1008_016a Label DEFAULT true true +1008:016e Code2 LAB_1008_016e Label DEFAULT true true +1008:01c0 Code2 LAB_1008_01c0 Label DEFAULT true true +1008:0208 Code2 LAB_1008_0208 Label DEFAULT true true +1008:0216 Code2 LAB_1008_0216 Label DEFAULT true true +1008:0228 Code2 LAB_1008_0228 Label DEFAULT true true +1008:0261 Code2 LAB_1008_0261 Label DEFAULT true true +1008:026f Code2 LAB_1008_026f Label DEFAULT true true +1008:0281 Code2 LAB_1008_0281 Label DEFAULT true true +1008:02b9 Code2 LAB_1008_02b9 Label DEFAULT true true +1008:02fb Code2 LAB_1008_02fb Label DEFAULT true true +1008:0309 Code2 LAB_1008_0309 Label DEFAULT true true +1008:031b Code2 LAB_1008_031b Label DEFAULT true true +1008:0354 Code2 LAB_1008_0354 Label DEFAULT true true +1008:0362 Code2 LAB_1008_0362 Label DEFAULT true true +1008:0374 Code2 LAB_1008_0374 Label DEFAULT true true +1008:03ac Code2 LAB_1008_03ac Label DEFAULT true true +1008:03ee Code2 LAB_1008_03ee Label DEFAULT true true +1008:03f8 Code2 LAB_1008_03f8 Label DEFAULT true true +1008:047c Code2 LAB_1008_047c Label DEFAULT true true +1008:0497 Code2 LAB_1008_0497 Label DEFAULT true true +1008:04ba Code2 LAB_1008_04ba Label DEFAULT true true +1008:04d3 Code2 LAB_1008_04d3 Label DEFAULT true true +1008:04ee Code2 LAB_1008_04ee Label DEFAULT true true +1008:0511 Code2 LAB_1008_0511 Label DEFAULT true true +1008:052a Code2 LAB_1008_052a Label DEFAULT true true +1008:0545 Code2 LAB_1008_0545 Label DEFAULT true true +1008:0568 Code2 LAB_1008_0568 Label DEFAULT true true +1008:0581 Code2 LAB_1008_0581 Label DEFAULT true true +1008:059c Code2 LAB_1008_059c Label DEFAULT true true +1008:05bf Code2 LAB_1008_05bf Label DEFAULT true true +1008:05dc Code2 LAB_1008_05dc Label DEFAULT true true +1008:05e3 Code2 LAB_1008_05e3 Label DEFAULT true true +1008:06d6 Code2 LAB_1008_06d6 Label DEFAULT true true +1008:0783 Code2 LAB_1008_0783 Label DEFAULT true true +1008:0787 Code2 FUN_1008_0787 Function DEFAULT true false +1008:07b6 Code2 FUN_1008_07b6 Function DEFAULT true false +1008:0837 Code2 FUN_1008_0837 Function DEFAULT true false +1008:08bb Code2 FUN_1008_08bb Function DEFAULT true false +1008:093f Code2 FUN_1008_093f Function DEFAULT true false +1008:0996 Code2 FUN_1008_0996 Function DEFAULT true false +1008:09de Code2 LAB_1008_09de Label DEFAULT true true +1008:09ef Code2 LAB_1008_09ef Label DEFAULT true true +1008:0a00 Code2 LAB_1008_0a00 Label DEFAULT true true +1008:0a11 Code2 LAB_1008_0a11 Label DEFAULT true true +1008:0a1b Code2 LAB_1008_0a1b Label DEFAULT true true +1008:0a3b Code2 LAB_1008_0a3b Label DEFAULT true true +1008:0a49 Code2 LAB_1008_0a49 Label DEFAULT true true +1008:0a57 Code2 LAB_1008_0a57 Label DEFAULT true true +1008:0a6b Code2 LAB_1008_0a6b Label DEFAULT true true +1008:0aad Code2 LAB_1008_0aad Label DEFAULT true true +1008:0ab0 Code2 LAB_1008_0ab0 Label DEFAULT true true +1008:0af1 Code2 LAB_1008_0af1 Label DEFAULT true true +1008:0afd Code2 LAB_1008_0afd Label DEFAULT true true +1008:0b44 Code2 LAB_1008_0b44 Label DEFAULT true true +1008:0b4d Code2 LAB_1008_0b4d Label DEFAULT true true +1008:0b9e Code2 FUN_1008_0b9e Function DEFAULT true false +1008:0bb5 Code2 LAB_1008_0bb5 Label DEFAULT true true +1008:0bbe Code2 LAB_1008_0bbe Label DEFAULT true true +1008:0bc7 Code2 LAB_1008_0bc7 Label DEFAULT true true +1008:0be2 Code2 LAB_1008_0be2 Label DEFAULT true true +1008:0be9 Code2 LAB_1008_0be9 Label DEFAULT true true +1008:0c04 Code2 LAB_1008_0c04 Label DEFAULT true true +1008:0c0b Code2 LAB_1008_0c0b Label DEFAULT true true +1008:0c26 Code2 LAB_1008_0c26 Label DEFAULT true true +1008:0c2d Code2 LAB_1008_0c2d Label DEFAULT true true +1008:0c48 Code2 LAB_1008_0c48 Label DEFAULT true true +1008:0c4f Code2 LAB_1008_0c4f Label DEFAULT true true +1008:0c54 Code2 LAB_1008_0c54 Label DEFAULT true true +1008:0c60 Code2 LAB_1008_0c60 Label DEFAULT true true +1008:0c84 Code2 LAB_1008_0c84 Label DEFAULT true true +1008:0c97 Code2 LAB_1008_0c97 Label DEFAULT true true +1008:0cb1 Code2 LAB_1008_0cb1 Label DEFAULT true true +1008:0cb4 Code2 LAB_1008_0cb4 Label DEFAULT true true +1008:0cf6 Code2 LAB_1008_0cf6 Label DEFAULT true true +1008:0d2e Code2 LAB_1008_0d2e Label DEFAULT true true +1008:0d37 Code2 LAB_1008_0d37 Label DEFAULT true true +1008:0d3f Code2 LAB_1008_0d3f Label DEFAULT true true +1008:0d72 Code2 LAB_1008_0d72 Label DEFAULT true true +1008:0d75 Code2 LAB_1008_0d75 Label DEFAULT true true +1008:0db9 Code2 LAB_1008_0db9 Label DEFAULT true true +1008:0dbd Code2 FUN_1008_0dbd Function DEFAULT true false +1008:0de2 Code2 LAB_1008_0de2 Label DEFAULT true true +1008:0df3 Code2 LAB_1008_0df3 Label DEFAULT true true +1008:0e08 Code2 FUN_1008_0e08 Function DEFAULT true false +1008:0e37 Code2 LAB_1008_0e37 Label DEFAULT true true +1008:0e97 Code2 LAB_1008_0e97 Label DEFAULT true true +1008:0eaf Code2 LAB_1008_0eaf Label DEFAULT true true +1008:0f23 Code2 LAB_1008_0f23 Label DEFAULT true true +1008:0f27 Code2 FUN_1008_0f27 Function DEFAULT true false +1008:0f2c Code2 code2_embedded_word_0f2c Label USER_DEFINED true false +1008:0f2e Code2 FUN_1008_0f2e Function DEFAULT true false +1008:0fb8 Code2 LAB_1008_0fb8 Label DEFAULT true true +1008:0fca Code2 LAB_1008_0fca Label DEFAULT true true +1008:0fe6 Code2 LAB_1008_0fe6 Label DEFAULT true true +1008:1000 Code2 LAB_1008_1000 Label DEFAULT true true +1008:1029 Code2 LAB_1008_1029 Label DEFAULT true true +1008:102e Code2 LAB_1008_102e Label DEFAULT true true +1008:1035 Code2 LAB_1008_1035 Label DEFAULT true true +1008:1038 Code2 LAB_1008_1038 Label DEFAULT true true +1008:104b Code2 LAB_1008_104b Label DEFAULT true true +1008:10d0 Code2 LAB_1008_10d0 Label DEFAULT true true +1008:10d9 Code2 LAB_1008_10d9 Label DEFAULT true true +1008:10de Code2 LAB_1008_10de Label DEFAULT true true +1008:10e3 Code2 FUN_1008_10e3 Function DEFAULT true false +1008:1104 Code2 LAB_1008_1104 Label DEFAULT true true +1008:110b Code2 LAB_1008_110b Label DEFAULT true true +1008:110e Code2 LAB_1008_110e Label DEFAULT true true +1008:112c Code2 LAB_1008_112c Label DEFAULT true true +1008:1131 Code2 FUN_1008_1131 Function DEFAULT true false +1008:1169 Code2 LAB_1008_1169 Label DEFAULT true true +1008:1185 Code2 LAB_1008_1185 Label DEFAULT true true +1008:118f Code2 FUN_1008_118f Function DEFAULT true false +1008:11b0 Code2 LAB_1008_11b0 Label DEFAULT true true +1008:11b8 Code2 FUN_1008_11b8 Function DEFAULT true false +1008:11bd Code2 code2_embedded_words_11bd Label USER_DEFINED true false +1008:11c5 Code2 FUN_1008_11c5 Function DEFAULT true false +1008:1237 Code2 LAB_1008_1237 Label DEFAULT true true +1008:1241 Code2 LAB_1008_1241 Label DEFAULT true true +1008:1249 Code2 LAB_1008_1249 Label DEFAULT true true +1008:1251 Code2 LAB_1008_1251 Label DEFAULT true true +1008:12ea Code2 LAB_1008_12ea Label DEFAULT true true +1008:12f2 Code2 LAB_1008_12f2 Label DEFAULT true true +1008:131e Code2 code2_embedded_words_131e Label USER_DEFINED true false +1008:1326 Code2 FUN_1008_1326 Function DEFAULT true false +1008:1367 Code2 LAB_1008_1367 Label DEFAULT true true +1008:136a Code2 LAB_1008_136a Label DEFAULT true true +1008:13a8 Code2 FUN_1008_13a8 Function DEFAULT true false +1008:13f0 Code2 LAB_1008_13f0 Label DEFAULT true true +1008:13f8 Code2 LAB_1008_13f8 Label DEFAULT true true +1008:148c Code2 LAB_1008_148c Label DEFAULT true true +1008:1496 Code2 LAB_1008_1496 Label DEFAULT true true +1008:149d Code2 FUN_1008_149d Function DEFAULT true false +1008:15c2 Code2 FUN_1008_15c2 Function DEFAULT true false +1008:15c7 Code2 FUN_1008_15c7 Function DEFAULT true false +1008:15e7 Code2 FUN_1008_15e7 Function DEFAULT true false +1008:1607 Code2 FUN_1008_1607 Function DEFAULT true false +1008:162b Code2 LAB_1008_162b Label DEFAULT true true +1008:1635 Code2 LAB_1008_1635 Label DEFAULT true true +1008:1682 Code2 LAB_1008_1682 Label DEFAULT true true +1008:168e Code2 FUN_1008_168e Function DEFAULT true false +1008:16be Code2 FUN_1008_16be Function DEFAULT true false +1008:172f Code2 FUN_1008_172f Function DEFAULT true false +1008:1745 Code2 LAB_1008_1745 Label DEFAULT true true +1008:174b Code2 LAB_1008_174b Label DEFAULT true true +1008:1754 Code2 FUN_1008_1754 Function DEFAULT true false +1008:176a Code2 LAB_1008_176a Label DEFAULT true true +1008:1770 Code2 LAB_1008_1770 Label DEFAULT true true +1008:1779 Code2 FUN_1008_1779 Function DEFAULT true false +1008:1796 Code2 LAB_1008_1796 Label DEFAULT true true +1008:17a2 Code2 LAB_1008_17a2 Label DEFAULT true true +1008:17e2 Code2 FUN_1008_17e2 Function DEFAULT true false +1008:1809 Code2 LAB_1008_1809 Label DEFAULT true true +1008:1816 Code2 LAB_1008_1816 Label DEFAULT true true +1008:1818 Code2 FUN_1008_1818 Function DEFAULT true false +1008:185b Code2 FUN_1008_185b Function DEFAULT true false +1008:1865 Code2 FUN_1008_1865 Function DEFAULT true false +1008:18d0 Code2 FUN_1008_18d0 Function DEFAULT true false +1008:18e4 Code2 LAB_1008_18e4 Label DEFAULT true true +1008:18ee Code2 FUN_1008_18ee Function DEFAULT true false +1008:18fd Code2 LAB_1008_18fd Label DEFAULT true true +1008:1937 Code2 LAB_1008_1937 Label DEFAULT true true +1008:1953 Code2 LAB_1008_1953 Label DEFAULT true true +1008:1970 Code2 LAB_1008_1970 Label DEFAULT true true +1008:19b0 Code2 LAB_1008_19b0 Label DEFAULT true true +1008:19b7 Code2 FUN_1008_19b7 Function DEFAULT true false +1008:19f8 Code2 FUN_1008_19f8 Function DEFAULT true false +1008:1a13 Code2 LAB_1008_1a13 Label DEFAULT true true +1008:1a39 Code2 FUN_1008_1a39 Function DEFAULT true false +1008:1a7e Code2 LAB_1008_1a7e Label DEFAULT true true +1008:1a82 Code2 FUN_1008_1a82 Function DEFAULT true false +1008:1aca Code2 LAB_1008_1aca Label DEFAULT true true +1008:1b0d Code2 LAB_1008_1b0d Label DEFAULT true true +1008:1b11 Code2 FUN_1008_1b11 Function DEFAULT true false +1008:1b2a Code2 LAB_1008_1b2a Label DEFAULT true true +1008:1b33 Code2 LAB_1008_1b33 Label DEFAULT true true +1008:1b6d Code2 LAB_1008_1b6d Label DEFAULT true true +1008:1b7a Code2 LAB_1008_1b7a Label DEFAULT true true +1008:1b7c Code2 LAB_1008_1b7c Label DEFAULT true true +1008:1b86 Code2 LAB_1008_1b86 Label DEFAULT true true +1008:1bb6 Code2 LAB_1008_1bb6 Label DEFAULT true true +1008:1bb8 Code2 LAB_1008_1bb8 Label DEFAULT true true +1008:1bc4 Code2 LAB_1008_1bc4 Label DEFAULT true true +1008:1bcd Code2 LAB_1008_1bcd Label DEFAULT true true +1008:1be2 Code2 LAB_1008_1be2 Label DEFAULT true true +1008:1be9 Code2 FUN_1008_1be9 Function DEFAULT true false +1008:1c03 Code2 FUN_1008_1c03 Function DEFAULT true false +1008:1c10 Code2 LAB_1008_1c10 Label DEFAULT true true +1008:1c34 Code2 LAB_1008_1c34 Label DEFAULT true true +1008:1c4a Code2 LAB_1008_1c4a Label DEFAULT true true +1008:1c54 Code2 LAB_1008_1c54 Label DEFAULT true true +1008:1c5f Code2 FUN_1008_1c5f Function DEFAULT true false +1008:1c84 Code2 LAB_1008_1c84 Label DEFAULT true true +1008:1c9c Code2 LAB_1008_1c9c Label DEFAULT true true +1008:1ca1 Code2 LAB_1008_1ca1 Label DEFAULT true true +1008:1cc6 Code2 FUN_1008_1cc6 Function DEFAULT true false +1008:1cd3 Code2 LAB_1008_1cd3 Label DEFAULT true true +1008:1cf3 Code2 LAB_1008_1cf3 Label DEFAULT true true +1008:1cf5 Code2 LAB_1008_1cf5 Label DEFAULT true true +1008:1d21 Code2 LAB_1008_1d21 Label DEFAULT true true +1008:1d34 Code2 LAB_1008_1d34 Label DEFAULT true true +1008:1d62 Code2 LAB_1008_1d62 Label DEFAULT true true +1008:1d77 Code2 FUN_1008_1d77 Function DEFAULT true false +1008:1dca Code2 LAB_1008_1dca Label DEFAULT true true +1008:1dcc Code2 FUN_1008_1dcc Function DEFAULT true false +1008:1e3e Code2 LAB_1008_1e3e Label DEFAULT true true +1008:1e7e Code2 LAB_1008_1e7e Label DEFAULT true true +1008:1e8a Code2 FUN_1008_1e8a Function DEFAULT true false +1008:1ea5 Code2 LAB_1008_1ea5 Label DEFAULT true true +1008:1eb3 Code2 LAB_1008_1eb3 Label DEFAULT true true +1008:1ec3 Code2 LAB_1008_1ec3 Label DEFAULT true true +1008:1ed3 Code2 LAB_1008_1ed3 Label DEFAULT true true +1008:1edf Code2 LAB_1008_1edf Label DEFAULT true true +1008:1eec Code2 LAB_1008_1eec Label DEFAULT true true +1008:1efd Code2 LAB_1008_1efd Label DEFAULT true true +1008:1f03 Code2 LAB_1008_1f03 Label DEFAULT true true +1008:1f0c Code2 FUN_1008_1f0c Function DEFAULT true false +1008:1f40 Code2 LAB_1008_1f40 Label DEFAULT true true +1008:1f57 Code2 LAB_1008_1f57 Label DEFAULT true true +1008:1f68 Code2 FUN_1008_1f68 Function DEFAULT true false +1008:1f7c Code2 LAB_1008_1f7c Label DEFAULT true true +1008:1fe4 Code2 LAB_1008_1fe4 Label DEFAULT true true +1008:1fe8 Code2 FUN_1008_1fe8 Function DEFAULT true false +1008:211a Code2 FUN_1008_211a Function DEFAULT true false +1008:212d Code2 LAB_1008_212d Label DEFAULT true true +1008:2143 Code2 LAB_1008_2143 Label DEFAULT true true +1008:2147 Code2 FUN_1008_2147 Function DEFAULT true false +1008:215d Code2 LAB_1008_215d Label DEFAULT true true +1008:216d Code2 LAB_1008_216d Label DEFAULT true true +1008:2177 Code2 LAB_1008_2177 Label DEFAULT true true +1008:217a Code2 LAB_1008_217a Label DEFAULT true true +1008:21ae Code2 LAB_1008_21ae Label DEFAULT true true +1008:21b4 Code2 LAB_1008_21b4 Label DEFAULT true true +1008:21ba Code2 FUN_1008_21ba Function DEFAULT true false +1008:21cc Code2 LAB_1008_21cc Label DEFAULT true true +1008:21ce Code2 FUN_1008_21ce Function DEFAULT true false +1008:21db Code2 LAB_1008_21db Label DEFAULT true true +1008:21e2 Code2 FUN_1008_21e2 Function DEFAULT true false +1008:2219 Code2 FUN_1008_2219 Function DEFAULT true false +1008:2244 Code2 LAB_1008_2244 Label DEFAULT true true +1008:224f Code2 LAB_1008_224f Label DEFAULT true true +1008:2264 Code2 LAB_1008_2264 Label DEFAULT true true +1008:2277 Code2 LAB_1008_2277 Label DEFAULT true true +1008:2287 Code2 LAB_1008_2287 Label DEFAULT true true +1008:2297 Code2 LAB_1008_2297 Label DEFAULT true true +1008:22a5 Code2 LAB_1008_22a5 Label DEFAULT true true +1008:22b3 Code2 LAB_1008_22b3 Label DEFAULT true true +1008:22bd Code2 LAB_1008_22bd Label DEFAULT true true +1008:22c7 Code2 LAB_1008_22c7 Label DEFAULT true true +1008:22d1 Code2 LAB_1008_22d1 Label DEFAULT true true +1008:22eb Code2 LAB_1008_22eb Label DEFAULT true true +1008:22fc Code2 FUN_1008_22fc Function DEFAULT true false +1008:232d Code2 LAB_1008_232d Label DEFAULT true true +1008:233c Code2 FUN_1008_233c Function DEFAULT true false +1008:2374 Code2 FUN_1008_2374 Function DEFAULT true false +1008:238b Code2 FUN_1008_238b Function DEFAULT true false +1008:23b8 Code2 LAB_1008_23b8 Label DEFAULT true true +1008:23dd Code2 LAB_1008_23dd Label DEFAULT true true +1008:23fd Code2 FUN_1008_23fd Function DEFAULT true false +1008:2442 Code2 FUN_1008_2442 Function DEFAULT true false +1008:24a0 Code2 LAB_1008_24a0 Label DEFAULT true true +1008:24a5 Code2 FUN_1008_24a5 Function DEFAULT true false +1008:24c6 Code2 LAB_1008_24c6 Label DEFAULT true true +1008:24d2 Code2 LAB_1008_24d2 Label DEFAULT true true +1008:2522 Code2 LAB_1008_2522 Label DEFAULT true true +1008:254f Code2 LAB_1008_254f Label DEFAULT true true +1008:2554 Code2 FUN_1008_2554 Function DEFAULT true false +1008:2598 Code2 LAB_1008_2598 Label DEFAULT true true +1008:2608 Code2 FUN_1008_2608 Function DEFAULT true false +1008:261e Code2 LAB_1008_261e Label DEFAULT true true +1008:2626 Code2 LAB_1008_2626 Label DEFAULT true true +1008:2643 Code2 FUN_1008_2643 Function DEFAULT true false +1008:2651 Code2 LAB_1008_2651 Label DEFAULT true true +1008:2658 Code2 LAB_1008_2658 Label DEFAULT true true +1008:2660 Code2 LAB_1008_2660 Label DEFAULT true true +1008:2676 Code2 LAB_1008_2676 Label DEFAULT true true +1008:2683 Code2 LAB_1008_2683 Label DEFAULT true true +1008:268d Code2 LAB_1008_268d Label DEFAULT true true +1008:2693 Code2 LAB_1008_2693 Label DEFAULT true true +1008:26a4 Code2 LAB_1008_26a4 Label DEFAULT true true +1008:26a5 Code2 LAB_1008_26a5 Label DEFAULT true true +1008:26b0 Code2 FUN_1008_26b0 Function DEFAULT true false +1008:26e8 Code2 LAB_1008_26e8 Label DEFAULT true true +1008:26fe Code2 LAB_1008_26fe Label DEFAULT true true +1008:2701 Code2 LAB_1008_2701 Label DEFAULT true true +1008:272e Code2 LAB_1008_272e Label DEFAULT true true +1008:2742 Code2 LAB_1008_2742 Label DEFAULT true true +1008:2756 Code2 LAB_1008_2756 Label DEFAULT true true +1008:277f Code2 LAB_1008_277f Label DEFAULT true true +1008:2784 Code2 LAB_1008_2784 Label DEFAULT true true +1008:2793 Code2 LAB_1008_2793 Label DEFAULT true true +1008:27a2 Code2 LAB_1008_27a2 Label DEFAULT true true +1008:27b4 Code2 LAB_1008_27b4 Label DEFAULT true true +1008:27d0 Code2 LAB_1008_27d0 Label DEFAULT true true +1008:27ec Code2 LAB_1008_27ec Label DEFAULT true true +1008:2809 Code2 LAB_1008_2809 Label DEFAULT true true +1008:2819 Code2 FUN_1008_2819 Function DEFAULT true false +1008:283a Code2 LAB_1008_283a Label DEFAULT true true +1008:287d Code2 LAB_1008_287d Label DEFAULT true true +1008:288e Code2 LAB_1008_288e Label DEFAULT true true +1008:2896 Code2 LAB_1008_2896 Label DEFAULT true true +1008:28a3 Code2 FUN_1008_28a3 Function DEFAULT true false +1008:28f4 Code2 LAB_1008_28f4 Label DEFAULT true true +1008:28f6 Code2 LAB_1008_28f6 Label DEFAULT true true +1008:28fd Code2 LAB_1008_28fd Label DEFAULT true true +1008:2906 Code2 FUN_1008_2906 Function DEFAULT true false +1008:2932 Code2 FUN_1008_2932 Function DEFAULT true false +1008:294f Code2 LAB_1008_294f Label DEFAULT true true +1008:295c Code2 FUN_1008_295c Function DEFAULT true false +1008:298a Code2 FUN_1008_298a Function DEFAULT true false +1008:2996 Code2 FUN_1008_2996 Function DEFAULT true false +1008:29df Code2 LAB_1008_29df Label DEFAULT true true +1008:29f0 Code2 LAB_1008_29f0 Label DEFAULT true true +1008:2a02 Code2 LAB_1008_2a02 Label DEFAULT true true +1008:2a0e Code2 FUN_1008_2a0e Function DEFAULT true false +1008:2a2a Code2 LAB_1008_2a2a Label DEFAULT true true +1008:2a45 Code2 FUN_1008_2a45 Function DEFAULT true false +1008:2a81 Code2 LAB_1008_2a81 Label DEFAULT true true +1008:2a8f Code2 LAB_1008_2a8f Label DEFAULT true true +1008:2ac9 Code2 LAB_1008_2ac9 Label DEFAULT true true +1008:2ad6 Code2 LAB_1008_2ad6 Label DEFAULT true true +1008:2ae3 Code2 FUN_1008_2ae3 Function DEFAULT true false +1008:2af8 Code2 LAB_1008_2af8 Label DEFAULT true true +1008:2b22 Code2 LAB_1008_2b22 Label DEFAULT true true +1008:2b30 Code2 LAB_1008_2b30 Label DEFAULT true true +1008:2b8c Code2 LAB_1008_2b8c Label DEFAULT true true +1008:2b9d Code2 LAB_1008_2b9d Label DEFAULT true true +1008:2ba7 Code2 LAB_1008_2ba7 Label DEFAULT true true +1008:2bb1 Code2 FUN_1008_2bb1 Function DEFAULT true false +1008:2bca Code2 LAB_1008_2bca Label DEFAULT true true +1008:2bd1 Code2 FUN_1008_2bd1 Function DEFAULT true false +1008:2c01 Code2 LAB_1008_2c01 Label DEFAULT true true +1008:2c08 Code2 FUN_1008_2c08 Function DEFAULT true false +1008:2c1f Code2 FUN_1008_2c1f Function DEFAULT true false +1008:2c4e Code2 LAB_1008_2c4e Label DEFAULT true true +1008:2c5d Code2 LAB_1008_2c5d Label DEFAULT true true +1008:2c6f Code2 LAB_1008_2c6f Label DEFAULT true true +1008:2c7c Code2 LAB_1008_2c7c Label DEFAULT true true +1008:2c83 Code2 FUN_1008_2c83 Function DEFAULT true false +1008:2ccd Code2 LAB_1008_2ccd Label DEFAULT true true +1008:2cd9 Code2 FUN_1008_2cd9 Function DEFAULT true false +1008:2cf2 Code2 FUN_1008_2cf2 Function DEFAULT true false +1008:2d27 Code2 LAB_1008_2d27 Label DEFAULT true true +1008:2d29 Code2 LAB_1008_2d29 Label DEFAULT true true +1008:2d33 Code2 LAB_1008_2d33 Label DEFAULT true true +1008:2d3a Code2 FUN_1008_2d3a Function DEFAULT true false +1008:2d55 Code2 LAB_1008_2d55 Label DEFAULT true true +1008:2d5f Code2 LAB_1008_2d5f Label DEFAULT true true +1008:2d66 Code2 FUN_1008_2d66 Function DEFAULT true false +1008:2d87 Code2 FUN_1008_2d87 Function DEFAULT true false +1008:2d99 Code2 FUN_1008_2d99 Function DEFAULT true false +1008:2da7 Code2 LAB_1008_2da7 Label DEFAULT true true +1008:2db3 Code2 FUN_1008_2db3 Function DEFAULT true false +1008:2dcd Code2 FUN_1008_2dcd Function DEFAULT true false +1008:2de0 Code2 FUN_1008_2de0 Function DEFAULT true false +1008:2df4 Code2 LAB_1008_2df4 Label DEFAULT true true +1008:2dff Code2 FUN_1008_2dff Function DEFAULT true false +1008:2e1d Code2 LAB_1008_2e1d Label DEFAULT true true +1008:2e22 Code2 FUN_1008_2e22 Function DEFAULT true false +1008:2e3e Code2 LAB_1008_2e3e Label DEFAULT true true +1008:2e4e Code2 LAB_1008_2e4e Label DEFAULT true true +1008:2e6c Code2 LAB_1008_2e6c Label DEFAULT true true +1008:2e76 Code2 FUN_1008_2e76 Function DEFAULT true false +1008:2e92 Code2 FUN_1008_2e92 Function DEFAULT true false +1008:2ea9 Code2 FUN_1008_2ea9 Function DEFAULT true false +1008:2ec0 Code2 FUN_1008_2ec0 Function DEFAULT true false +1008:2edd Code2 LAB_1008_2edd Label DEFAULT true true +1008:2ee5 Code2 FUN_1008_2ee5 Function DEFAULT true false +1008:2f07 Code2 FUN_1008_2f07 Function DEFAULT true false +1008:2f2f Code2 FUN_1008_2f2f Function DEFAULT true false +1008:2f4d Code2 FUN_1008_2f4d Function DEFAULT true false +1008:2f70 Code2 FUN_1008_2f70 Function DEFAULT true false +1008:2f90 Code2 LAB_1008_2f90 Label DEFAULT true true +1008:2fa1 Code2 LAB_1008_2fa1 Label DEFAULT true true +1008:2fb2 Code2 LAB_1008_2fb2 Label DEFAULT true true +1008:2fb6 Code2 LAB_1008_2fb6 Label DEFAULT true true +1008:2fbb Code2 FUN_1008_2fbb Function DEFAULT true false +1008:2fdf Code2 LAB_1008_2fdf Label DEFAULT true true +1008:2fe3 Code2 FUN_1008_2fe3 Function DEFAULT true false +1008:3005 Code2 LAB_1008_3005 Label DEFAULT true true +1008:300a Code2 FUN_1008_300a Function DEFAULT true false +1008:302c Code2 FUN_1008_302c Function DEFAULT true false +1008:308c Code2 LAB_1008_308c Label DEFAULT true true +1008:3099 Code2 FUN_1008_3099 Function DEFAULT true false +1008:30be Code2 LAB_1008_30be Label DEFAULT true true +1010:0000 Code3 code_segment_3_tag Label USER_DEFINED true false +1010:0002 Code3 FUN_1010_0002 Function DEFAULT true false +1010:0017 Code3 LAB_1010_0017 Label DEFAULT true true +1010:0079 Code3 FUN_1010_0079 Function DEFAULT true false +1010:009d Code3 LAB_1010_009d Label DEFAULT true true +1010:00a2 Code3 FUN_1010_00a2 Function DEFAULT true false +1010:00d7 Code3 LAB_1010_00d7 Label DEFAULT true true +1010:0108 Code3 LAB_1010_0108 Label DEFAULT true true +1010:0139 Code3 LAB_1010_0139 Label DEFAULT true true +1010:0192 Code3 LAB_1010_0192 Label DEFAULT true true +1010:01b8 Code3 LAB_1010_01b8 Label DEFAULT true true +1010:01c2 Code3 FUN_1010_01c2 Function DEFAULT true false +1010:01d8 Code3 LAB_1010_01d8 Label DEFAULT true true +1010:0202 Code3 LAB_1010_0202 Label DEFAULT true true +1010:0207 Code3 LAB_1010_0207 Label DEFAULT true true +1010:0209 Code3 LAB_1010_0209 Label DEFAULT true true +1010:0225 Code3 LAB_1010_0225 Label DEFAULT true true +1010:022f Code3 LAB_1010_022f Label DEFAULT true true +1010:02f5 Code3 LAB_1010_02f5 Label DEFAULT true true +1010:02fd Code3 LAB_1010_02fd Label DEFAULT true true +1010:0357 Code3 LAB_1010_0357 Label DEFAULT true true +1010:035b Code3 LAB_1010_035b Label DEFAULT true true +1010:035d Code3 LAB_1010_035d Label DEFAULT true true +1010:0360 Code3 LAB_1010_0360 Label DEFAULT true true +1010:036e Code3 LAB_1010_036e Label DEFAULT true true +1010:039a Code3 LAB_1010_039a Label DEFAULT true true +1010:039f Code3 LAB_1010_039f Label DEFAULT true true +1010:03a5 Code3 LAB_1010_03a5 Label DEFAULT true true +1010:03af Code3 FUN_1010_03af Function DEFAULT true false +1010:03e0 Code3 FUN_1010_03e0 Function DEFAULT true false +1010:0405 Code3 FUN_1010_0405 Function DEFAULT true false +1010:0462 Code3 LAB_1010_0462 Label DEFAULT true true +1010:0466 Code3 LAB_1010_0466 Label DEFAULT true true +1010:0470 Code3 code3_embedded_word_0470 Label USER_DEFINED true false +1010:0472 Code3 FUN_1010_0472 Function DEFAULT true false +1010:0555 Code3 LAB_1010_0555 Label DEFAULT true true +1010:05c3 Code3 LAB_1010_05c3 Label DEFAULT true true +1010:05c7 Code3 LAB_1010_05c7 Label DEFAULT true true +1010:05c9 Code3 LAB_1010_05c9 Label DEFAULT true true +1018:0000 Code4 code_segment_4_tag Label USER_DEFINED true false +1018:0002 Code4 FUN_1018_0002 Function DEFAULT true false +1018:0013 Code4 LAB_1018_0013 Label DEFAULT true true +1018:0018 Code4 LAB_1018_0018 Label DEFAULT true true +1018:0029 Code4 LAB_1018_0029 Label DEFAULT true true +1018:002f Code4 LAB_1018_002f Label DEFAULT true true +1018:0044 Code4 LAB_1018_0044 Label DEFAULT true true +1018:0045 Code4 FUN_1018_0045 Function DEFAULT true false +1018:0071 Code4 FUN_1018_0071 Function DEFAULT true false +1018:0097 Code4 FUN_1018_0097 Function DEFAULT true false +1018:00e0 Code4 LAB_1018_00e0 Label DEFAULT true true +1018:00fc Code4 LAB_1018_00fc Label DEFAULT true true +1018:0103 Code4 FUN_1018_0103 Function DEFAULT true false +1018:0133 Code4 FUN_1018_0133 Function DEFAULT true false +1018:016d Code4 LAB_1018_016d Label DEFAULT true true +1018:0173 Code4 LAB_1018_0173 Label DEFAULT true true +1018:017c Code4 LAB_1018_017c Label DEFAULT true true +1018:018b Code4 FUN_1018_018b Function DEFAULT true false +1018:01dc Code4 FUN_1018_01dc Function DEFAULT true false +1018:01f0 Code4 LAB_1018_01f0 Label DEFAULT true true +1018:0247 Code4 LAB_1018_0247 Label DEFAULT true true +1018:02a3 Code4 LAB_1018_02a3 Label DEFAULT true true +1018:02fa Code4 FUN_1018_02fa Function DEFAULT true false +1018:0341 Code4 FUN_1018_0341 Function DEFAULT true false +1018:0352 Code4 LAB_1018_0352 Label DEFAULT true true +1018:039b Code4 LAB_1018_039b Label DEFAULT true true +1018:03a8 Code4 LAB_1018_03a8 Label DEFAULT true true +1018:03dd Code4 LAB_1018_03dd Label DEFAULT true true +1018:03e9 Code4 FUN_1018_03e9 Function DEFAULT true false +1018:03ff Code4 FUN_1018_03ff Function DEFAULT true false +1018:043b Code4 LAB_1018_043b Label DEFAULT true true +1018:0466 Code4 FUN_1018_0466 Function DEFAULT true false +1018:048b Code4 LAB_1018_048b Label DEFAULT true true +1018:048f Code4 LAB_1018_048f Label DEFAULT true true +1018:0491 Code4 LAB_1018_0491 Label DEFAULT true true +1018:049e Code4 FUN_1018_049e Function DEFAULT true false +1018:04cf Code4 LAB_1018_04cf Label DEFAULT true true +1018:04d1 Code4 LAB_1018_04d1 Label DEFAULT true true +1018:050e Code4 LAB_1018_050e Label DEFAULT true true +1018:0517 Code4 LAB_1018_0517 Label DEFAULT true true +1018:0524 Code4 FUN_1018_0524 Function DEFAULT true false +1018:0549 Code4 LAB_1018_0549 Label DEFAULT true true +1018:054d Code4 LAB_1018_054d Label DEFAULT true true +1018:054f Code4 LAB_1018_054f Label DEFAULT true true +1018:055c Code4 FUN_1018_055c Function DEFAULT true false +1018:056d Code4 LAB_1018_056d Label DEFAULT true true +1018:059c Code4 LAB_1018_059c Label DEFAULT true true +1018:05ad Code4 LAB_1018_05ad Label DEFAULT true true +1018:05c9 Code4 LAB_1018_05c9 Label DEFAULT true true +1018:05cd Code4 LAB_1018_05cd Label DEFAULT true true +1018:05cf Code4 LAB_1018_05cf Label DEFAULT true true +1018:05dc Code4 FUN_1018_05dc Function DEFAULT true false +1018:05f3 Code4 FUN_1018_05f3 Function DEFAULT true false +1018:060d Code4 FUN_1018_060d Function DEFAULT true false +1018:0627 Code4 FUN_1018_0627 Function DEFAULT true false +1018:0641 Code4 FUN_1018_0641 Function DEFAULT true false +1018:065c Code4 LAB_1018_065c Label DEFAULT true true +1018:066c Code4 LAB_1018_066c Label DEFAULT true true +1018:0673 Code4 FUN_1018_0673 Function DEFAULT true false +1018:068d Code4 LAB_1018_068d Label DEFAULT true true +1018:069a Code4 FUN_1018_069a Function DEFAULT true false +1018:06d5 Code4 LAB_1018_06d5 Label DEFAULT true true +1018:0715 Code4 LAB_1018_0715 Label DEFAULT true true +1018:071c Code4 FUN_1018_071c Function DEFAULT true false +1018:0734 Code4 LAB_1018_0734 Label DEFAULT true true +1018:074e Code4 LAB_1018_074e Label DEFAULT true true +1018:0763 Code4 LAB_1018_0763 Label DEFAULT true true +1018:0778 Code4 LAB_1018_0778 Label DEFAULT true true +1018:078b Code4 LAB_1018_078b Label DEFAULT true true +1018:07c4 Code4 LAB_1018_07c4 Label DEFAULT true true +1018:07ec Code4 LAB_1018_07ec Label DEFAULT true true +1018:0806 Code4 LAB_1018_0806 Label DEFAULT true true +1018:080d Code4 FUN_1018_080d Function DEFAULT true false +1018:0828 Code4 LAB_1018_0828 Label DEFAULT true true +1018:084f Code4 LAB_1018_084f Label DEFAULT true true +1018:085a Code4 FUN_1018_085a Function DEFAULT true false +1018:0879 Code4 LAB_1018_0879 Label DEFAULT true true +1018:0885 Code4 LAB_1018_0885 Label DEFAULT true true +1018:089c Code4 LAB_1018_089c Label DEFAULT true true +1018:08a5 Code4 LAB_1018_08a5 Label DEFAULT true true +1018:08ac Code4 FUN_1018_08ac Function DEFAULT true false +1018:08c3 Code4 FUN_1018_08c3 Function DEFAULT true false +1018:08e7 Code4 LAB_1018_08e7 Label DEFAULT true true +1018:08f0 Code4 FUN_1018_08f0 Function DEFAULT true false +1018:0959 Code4 LAB_1018_0959 Label DEFAULT true true +1018:0966 Code4 LAB_1018_0966 Label DEFAULT true true +1018:0984 Code4 LAB_1018_0984 Label DEFAULT true true +1018:09b9 Code4 LAB_1018_09b9 Label DEFAULT true true +1018:09ce Code4 LAB_1018_09ce Label DEFAULT true true +1018:09ea Code4 LAB_1018_09ea Label DEFAULT true true +1018:09fa Code4 LAB_1018_09fa Label DEFAULT true true +1018:09fd Code4 LAB_1018_09fd Label DEFAULT true true +1018:0a48 Code4 LAB_1018_0a48 Label DEFAULT true true +1018:0a6e Code4 LAB_1018_0a6e Label DEFAULT true true +1018:0a7e Code4 LAB_1018_0a7e Label DEFAULT true true +1018:0a85 Code4 FUN_1018_0a85 Function DEFAULT true false +1018:0aca Code4 LAB_1018_0aca Label DEFAULT true true +1018:0afc Code4 LAB_1018_0afc Label DEFAULT true true +1018:0b0c Code4 LAB_1018_0b0c Label DEFAULT true true +1018:0b0e Code4 LAB_1018_0b0e Label DEFAULT true true +1018:0b1e Code4 LAB_1018_0b1e Label DEFAULT true true +1018:0b25 Code4 FUN_1018_0b25 Function DEFAULT true false +1018:0b55 Code4 LAB_1018_0b55 Label DEFAULT true true +1018:0b65 Code4 LAB_1018_0b65 Label DEFAULT true true +1018:0b6c Code4 FUN_1018_0b6c Function DEFAULT true false +1018:0b9c Code4 LAB_1018_0b9c Label DEFAULT true true +1018:0bac Code4 LAB_1018_0bac Label DEFAULT true true +1018:0bb3 Code4 FUN_1018_0bb3 Function DEFAULT true false +1018:0bd4 Code4 LAB_1018_0bd4 Label DEFAULT true true +1018:0bf1 Code4 LAB_1018_0bf1 Label DEFAULT true true +1018:0c02 Code4 LAB_1018_0c02 Label DEFAULT true true +1018:0c1c Code4 LAB_1018_0c1c Label DEFAULT true true +1018:0c36 Code4 LAB_1018_0c36 Label DEFAULT true true +1018:0c3d Code4 FUN_1018_0c3d Function DEFAULT true false +1018:0c59 Code4 FUN_1018_0c59 Function DEFAULT true false +1018:0c97 Code4 LAB_1018_0c97 Label DEFAULT true true +1018:0cc0 Code4 LAB_1018_0cc0 Label DEFAULT true true +1018:0cc7 Code4 FUN_1018_0cc7 Function DEFAULT true false +1018:0ce0 Code4 LAB_1018_0ce0 Label DEFAULT true true +1018:0ce7 Code4 FUN_1018_0ce7 Function DEFAULT true false +1018:0d57 Code4 LAB_1018_0d57 Label DEFAULT true true +1018:0d63 Code4 LAB_1018_0d63 Label DEFAULT true true +1018:0d6a Code4 FUN_1018_0d6a Function DEFAULT true false +1018:0d8a Code4 FUN_1018_0d8a Function DEFAULT true false +1018:0d9b Code4 FUN_1018_0d9b Function DEFAULT true false +1018:0db9 Code4 LAB_1018_0db9 Label DEFAULT true true +1018:0dc6 Code4 LAB_1018_0dc6 Label DEFAULT true true +1018:0dcd Code4 FUN_1018_0dcd Function DEFAULT true false +1018:0e03 Code4 LAB_1018_0e03 Label DEFAULT true true +1018:0e0a Code4 FUN_1018_0e0a Function DEFAULT true false +1018:0e3f Code4 LAB_1018_0e3f Label DEFAULT true true +1018:0e46 Code4 FUN_1018_0e46 Function DEFAULT true false +1018:0e94 Code4 LAB_1018_0e94 Label DEFAULT true true +1018:0e9e Code4 FUN_1018_0e9e Function DEFAULT true false +1018:0eb9 Code4 LAB_1018_0eb9 Label DEFAULT true true +1018:0ec0 Code4 FUN_1018_0ec0 Function DEFAULT true false +1018:0ee1 Code4 LAB_1018_0ee1 Label DEFAULT true true +1018:0ee5 Code4 LAB_1018_0ee5 Label DEFAULT true true +1018:0ee7 Code4 LAB_1018_0ee7 Label DEFAULT true true +1018:0ef4 Code4 FUN_1018_0ef4 Function DEFAULT true false +1018:0f15 Code4 LAB_1018_0f15 Label DEFAULT true true +1018:0f22 Code4 FUN_1018_0f22 Function DEFAULT true false +1018:0f38 Code4 FUN_1018_0f38 Function DEFAULT true false +1018:0f68 Code4 LAB_1018_0f68 Label DEFAULT true true +1018:0f76 Code4 LAB_1018_0f76 Label DEFAULT true true +1018:0f86 Code4 LAB_1018_0f86 Label DEFAULT true true +1018:0f8d Code4 FUN_1018_0f8d Function DEFAULT true false +1018:0fb5 Code4 LAB_1018_0fb5 Label DEFAULT true true +1018:0fcc Code4 FUN_1018_0fcc Function DEFAULT true false +1018:0ffd Code4 FUN_1018_0ffd Function DEFAULT true false +1018:103e Code4 LAB_1018_103e Label DEFAULT true true +1018:104d Code4 LAB_1018_104d Label DEFAULT true true +1018:1054 Code4 FUN_1018_1054 Function DEFAULT true false +1018:108b Code4 LAB_1018_108b Label DEFAULT true true +1018:10a3 Code4 LAB_1018_10a3 Label DEFAULT true true +1018:10aa Code4 FUN_1018_10aa Function DEFAULT true false +1018:10d2 Code4 LAB_1018_10d2 Label DEFAULT true true +1018:10e2 Code4 LAB_1018_10e2 Label DEFAULT true true +1018:10e9 Code4 FUN_1018_10e9 Function DEFAULT true false +1018:1106 Code4 FUN_1018_1106 Function DEFAULT true false +1018:111a Code4 LAB_1018_111a Label DEFAULT true true +1018:1179 Code4 LAB_1018_1179 Label DEFAULT true true +1018:11b8 Code4 LAB_1018_11b8 Label DEFAULT true true +1018:11c7 Code4 LAB_1018_11c7 Label DEFAULT true true +1018:120f Code4 LAB_1018_120f Label DEFAULT true true +1018:121b Code4 FUN_1018_121b Function DEFAULT true false +1018:1259 Code4 LAB_1018_1259 Label DEFAULT true true +1018:1274 Code4 FUN_1018_1274 Function DEFAULT true false +1018:12f5 Code4 FUN_1018_12f5 Function DEFAULT true false +1018:1311 Code4 FUN_1018_1311 Function DEFAULT true false +1018:134f Code4 FUN_1018_134f Function DEFAULT true false +1018:1364 Code4 LAB_1018_1364 Label DEFAULT true true +1018:137f Code4 LAB_1018_137f Label DEFAULT true true +1018:138d Code4 LAB_1018_138d Label DEFAULT true true +1018:13a0 Code4 LAB_1018_13a0 Label DEFAULT true true +1018:13b2 Code4 LAB_1018_13b2 Label DEFAULT true true +1018:1433 Code4 LAB_1018_1433 Label DEFAULT true true +1018:14bc Code4 LAB_1018_14bc Label DEFAULT true true +1018:14be Code4 LAB_1018_14be Label DEFAULT true true +1018:14d4 Code4 LAB_1018_14d4 Label DEFAULT true true +1018:14e6 Code4 LAB_1018_14e6 Label DEFAULT true true +1018:152d Code4 LAB_1018_152d Label DEFAULT true true +1018:153a Code4 LAB_1018_153a Label DEFAULT true true +1018:1547 Code4 FUN_1018_1547 Function DEFAULT true false +1018:157f Code4 LAB_1018_157f Label DEFAULT true true +1018:1586 Code4 FUN_1018_1586 Function DEFAULT true false +1018:15b9 Code4 LAB_1018_15b9 Label DEFAULT true true +1018:15c0 Code4 FUN_1018_15c0 Function DEFAULT true false +1018:15db Code4 LAB_1018_15db Label DEFAULT true true +1018:15ee Code4 LAB_1018_15ee Label DEFAULT true true +1018:165d Code4 LAB_1018_165d Label DEFAULT true true +1018:1685 Code4 LAB_1018_1685 Label DEFAULT true true +1018:1696 Code4 LAB_1018_1696 Label DEFAULT true true +1018:169d Code4 FUN_1018_169d Function DEFAULT true false +1018:16da Code4 LAB_1018_16da Label DEFAULT true true +1018:16e4 Code4 LAB_1018_16e4 Label DEFAULT true true +1018:16eb Code4 FUN_1018_16eb Function DEFAULT true false +1018:170c Code4 FUN_1018_170c Function DEFAULT true false +1018:1737 Code4 LAB_1018_1737 Label DEFAULT true true +1018:1750 Code4 LAB_1018_1750 Label DEFAULT true true +1018:1761 Code4 FUN_1018_1761 Function DEFAULT true false +1018:1788 Code4 FUN_1018_1788 Function DEFAULT true false +1018:17b8 Code4 LAB_1018_17b8 Label DEFAULT true true +1018:17e1 Code4 LAB_1018_17e1 Label DEFAULT true true +1018:17f1 Code4 LAB_1018_17f1 Label DEFAULT true true +1018:17f8 Code4 FUN_1018_17f8 Function DEFAULT true false +1018:1828 Code4 LAB_1018_1828 Label DEFAULT true true +1018:1851 Code4 LAB_1018_1851 Label DEFAULT true true +1018:1861 Code4 LAB_1018_1861 Label DEFAULT true true +1018:1868 Code4 FUN_1018_1868 Function DEFAULT true false +1018:18a5 Code4 LAB_1018_18a5 Label DEFAULT true true +1018:18d1 Code4 LAB_1018_18d1 Label DEFAULT true true +1018:18e9 Code4 FUN_1018_18e9 Function DEFAULT true false +1018:1917 Code4 LAB_1018_1917 Label DEFAULT true true +1018:1949 Code4 LAB_1018_1949 Label DEFAULT true true +1018:1960 Code4 FUN_1018_1960 Function DEFAULT true false +1018:1986 Code4 FUN_1018_1986 Function DEFAULT true false +1018:19b2 Code4 LAB_1018_19b2 Label DEFAULT true true +1018:19dc Code4 LAB_1018_19dc Label DEFAULT true true +1018:19f7 Code4 LAB_1018_19f7 Label DEFAULT true true +1018:1a0e Code4 FUN_1018_1a0e Function DEFAULT true false +1018:1a3b Code4 LAB_1018_1a3b Label DEFAULT true true +1018:1a4a Code4 LAB_1018_1a4a Label DEFAULT true true +1018:1a61 Code4 FUN_1018_1a61 Function DEFAULT true false +1018:1a72 Code4 LAB_1018_1a72 Label DEFAULT true true +1018:1aea Code4 LAB_1018_1aea Label DEFAULT true true +1018:1afc Code4 LAB_1018_1afc Label DEFAULT true true +1018:1b08 Code4 FUN_1018_1b08 Function DEFAULT true false +1018:1b35 Code4 FUN_1018_1b35 Function DEFAULT true false +1018:1b4b Code4 FUN_1018_1b4b Function DEFAULT true false +1018:1b57 Code4 FUN_1018_1b57 Function DEFAULT true false +1018:1ba0 Code4 LAB_1018_1ba0 Label DEFAULT true true +1018:1ba9 Code4 LAB_1018_1ba9 Label DEFAULT true true +1018:1bb0 Code4 FUN_1018_1bb0 Function DEFAULT true false +1018:1bc9 Code4 LAB_1018_1bc9 Label DEFAULT true true +1018:1bd8 Code4 LAB_1018_1bd8 Label DEFAULT true true +1018:1bdf Code4 FUN_1018_1bdf Function DEFAULT true false +1018:1bfc Code4 FUN_1018_1bfc Function DEFAULT true false +1018:1c08 Code4 LAB_1018_1c08 Label DEFAULT true true +1018:1c2a Code4 LAB_1018_1c2a Label DEFAULT true true +1018:1c52 Code4 LAB_1018_1c52 Label DEFAULT true true +1018:1c54 Code4 LAB_1018_1c54 Label DEFAULT true true +1018:1c68 Code4 LAB_1018_1c68 Label DEFAULT true true +1018:1c7f Code4 FUN_1018_1c7f Function DEFAULT true false +1018:1cc7 Code4 LAB_1018_1cc7 Label DEFAULT true true +1018:1cc9 Code4 LAB_1018_1cc9 Label DEFAULT true true +1018:1cd6 Code4 FUN_1018_1cd6 Function DEFAULT true false +1018:1d18 Code4 LAB_1018_1d18 Label DEFAULT true true +1018:1d22 Code4 FUN_1018_1d22 Function DEFAULT true false +1018:1d51 Code4 LAB_1018_1d51 Label DEFAULT true true +1018:1d55 Code4 LAB_1018_1d55 Label DEFAULT true true +1018:1d57 Code4 LAB_1018_1d57 Label DEFAULT true true +1018:1d64 Code4 FUN_1018_1d64 Function DEFAULT true false +1018:1d9e Code4 LAB_1018_1d9e Label DEFAULT true true +1018:1da2 Code4 LAB_1018_1da2 Label DEFAULT true true +1018:1da4 Code4 LAB_1018_1da4 Label DEFAULT true true +1018:1db1 Code4 FUN_1018_1db1 Function DEFAULT true false +1018:1df4 Code4 LAB_1018_1df4 Label DEFAULT true true +1018:1e20 Code4 LAB_1018_1e20 Label DEFAULT true true +1018:1e2c Code4 LAB_1018_1e2c Label DEFAULT true true +1018:1e39 Code4 FUN_1018_1e39 Function DEFAULT true false +1018:1e97 Code4 LAB_1018_1e97 Label DEFAULT true true +1018:1ea3 Code4 LAB_1018_1ea3 Label DEFAULT true true +1018:1eb0 Code4 FUN_1018_1eb0 Function DEFAULT true false +1018:1ef6 Code4 LAB_1018_1ef6 Label DEFAULT true true +1018:1efc Code4 LAB_1018_1efc Label DEFAULT true true +1018:1f0a Code4 LAB_1018_1f0a Label DEFAULT true true +1018:1f14 Code4 FUN_1018_1f14 Function DEFAULT true false +1018:1f4f Code4 LAB_1018_1f4f Label DEFAULT true true +1018:1f56 Code4 FUN_1018_1f56 Function DEFAULT true false +1020:0000 Code5 code_segment_5_tag Label USER_DEFINED true false +1020:0002 Code5 FUN_1020_0002 Function DEFAULT true false +1020:0049 Code5 LAB_1020_0049 Label DEFAULT true true +1020:0058 Code5 LAB_1020_0058 Label DEFAULT true true +1020:005d Code5 FUN_1020_005d Function DEFAULT true false +1020:0061 Code5 FUN_1020_0061 Function DEFAULT true false +1020:0065 Code5 LAB_1020_0065 Label DEFAULT true true +1020:007a Code5 LAB_1020_007a Label DEFAULT true true +1020:008c Code5 LAB_1020_008c Label DEFAULT true true +1020:00cb Code5 LAB_1020_00cb Label DEFAULT true true +1020:00d2 Code5 FUN_1020_00d2 Function DEFAULT true false +1020:00ef Code5 LAB_1020_00ef Label DEFAULT true true +1020:00f0 Code5 FUN_1020_00f0 Function DEFAULT true false +1020:00ff Code5 LAB_1020_00ff Label DEFAULT true true +1020:0107 Code5 borland_runtime_copyright Label USER_DEFINED true false +1020:012d Code5 FUN_1020_012d Function DEFAULT true false +1020:0141 Code5 LAB_1020_0141 Label DEFAULT true true +1020:0147 Code5 FUN_1020_0147 Function DEFAULT true false +1020:0161 Code5 LAB_1020_0161 Label DEFAULT true true +1020:0167 Code5 FUN_1020_0167 Function DEFAULT true false +1020:017b Code5 LAB_1020_017b Label DEFAULT true true +1020:0190 Code5 LAB_1020_0190 Label DEFAULT true true +1020:0195 Code5 runtime_1020_0195 Function USER_DEFINED true false +1020:01ad Code5 LAB_1020_01ad Label DEFAULT true true +1020:01ba Code5 LAB_1020_01ba Label DEFAULT true true +1020:01c5 Code5 LAB_1020_01c5 Label DEFAULT true true +1020:01ca Code5 FUN_1020_01ca Function DEFAULT true false +1020:01d1 Code5 LAB_1020_01d1 Label DEFAULT true true +1020:01f6 Code5 LAB_1020_01f6 Label DEFAULT true true +1020:0201 Code5 LAB_1020_0201 Label DEFAULT true true +1020:0203 Code5 LAB_1020_0203 Label DEFAULT true true +1020:0214 Code5 LAB_1020_0214 Label DEFAULT true true +1020:021e Code5 LAB_1020_021e Label DEFAULT true true +1020:0221 Code5 LAB_1020_0221 Label DEFAULT true true +1020:0222 Code5 FUN_1020_0222 Function DEFAULT true false +1020:023b Code5 LAB_1020_023b Label DEFAULT true true +1020:023c Code5 FUN_1020_023c Function DEFAULT true false +1020:0247 Code5 LAB_1020_0247 Label DEFAULT true true +1020:0259 Code5 LAB_1020_0259 Label DEFAULT true true +1020:0261 Code5 LAB_1020_0261 Label DEFAULT true true +1020:0269 Code5 LAB_1020_0269 Label DEFAULT true true +1020:026a Code5 FUN_1020_026a Function DEFAULT true false +1020:029e Code5 LAB_1020_029e Label DEFAULT true true +1020:02a4 Code5 LAB_1020_02a4 Label DEFAULT true true +1020:02a6 Code5 FUN_1020_02a6 Function DEFAULT true false +1020:02a9 Code5 LAB_1020_02a9 Label DEFAULT true true +1020:02cd Code5 LAB_1020_02cd Label DEFAULT true true +1020:02d6 Code5 LAB_1020_02d6 Label DEFAULT true true +1020:02d7 Code5 FUN_1020_02d7 Function DEFAULT true false +1020:02f7 Code5 LAB_1020_02f7 Label DEFAULT true true +1020:0306 Code5 LAB_1020_0306 Label DEFAULT true true +1020:0327 Code5 FUN_1020_0327 Function DEFAULT true false +1020:0340 Code5 LAB_1020_0340 Label DEFAULT true true +1020:0342 Code5 LAB_1020_0342 Label DEFAULT true true +1020:0344 Code5 LAB_1020_0344 Label DEFAULT true true +1020:0362 Code5 LAB_1020_0362 Label DEFAULT true true +1020:0372 Code5 LAB_1020_0372 Label DEFAULT true true +1020:0383 Code5 LAB_1020_0383 Label DEFAULT true true +1020:0388 Code5 FUN_1020_0388 Function DEFAULT true false +1020:038f Code5 FUN_1020_038f Function DEFAULT true false +1020:0397 Code5 LAB_1020_0397 Label DEFAULT true true +1020:039d Code5 FUN_1020_039d Function DEFAULT true false +1020:03b0 Code5 LAB_1020_03b0 Label DEFAULT true true +1020:03be Code5 LAB_1020_03be Label DEFAULT true true +1020:03bf Code5 LAB_1020_03bf Label DEFAULT true true +1020:03c5 Code5 runtime_1020_03c5 Function USER_DEFINED true false +1020:03cb Code5 FUN_1020_03cb Function DEFAULT true false +1020:03e8 Code5 LAB_1020_03e8 Label DEFAULT true true +1020:03e9 Code5 LAB_1020_03e9 Label DEFAULT true true +1020:03ef Code5 FUN_1020_03ef Function DEFAULT true false +1020:0405 Code5 LAB_1020_0405 Label DEFAULT true true +1020:0408 Code5 LAB_1020_0408 Label DEFAULT true true +1020:0409 Code5 LAB_1020_0409 Label DEFAULT true true +1020:042f Code5 LAB_1020_042f Label DEFAULT true true +1020:0439 Code5 FUN_1020_0439 Function DEFAULT true false +1020:0459 Code5 LAB_1020_0459 Label DEFAULT true true +1020:0462 Code5 LAB_1020_0462 Label DEFAULT true true +1020:046c Code5 runtime_1020_046c Function USER_DEFINED true false +1020:048f Code5 runtime_1020_048f Function USER_DEFINED true false +1020:0499 Code5 LAB_1020_0499 Label DEFAULT true true +1020:049f Code5 runtime_1020_049f Function USER_DEFINED true false +1020:04e8 Code5 LAB_1020_04e8 Label DEFAULT true true +1020:04f0 Code5 LAB_1020_04f0 Label DEFAULT true true +1020:04fc Code5 runtime_1020_04fc Function USER_DEFINED true false +1020:0527 Code5 FUN_1020_0527 Function DEFAULT true false +1020:052c Code5 FUN_1020_052c Function DEFAULT true false +1020:0534 Code5 FUN_1020_0534 Function DEFAULT true false +1020:0557 Code5 LAB_1020_0557 Label DEFAULT true true +1020:055f Code5 LAB_1020_055f Label DEFAULT true true +1020:057b Code5 LAB_1020_057b Label DEFAULT true true +1020:0586 Code5 FUN_1020_0586 Function DEFAULT true false +1020:0588 Code5 LAB_1020_0588 Label DEFAULT true true +1020:05a8 Code5 LAB_1020_05a8 Label DEFAULT true true +1020:05b0 Code5 LAB_1020_05b0 Label DEFAULT true true +1020:05c0 Code5 LAB_1020_05c0 Label DEFAULT true true +1020:05c7 Code5 FUN_1020_05c7 Function DEFAULT true false +1020:05d5 Code5 LAB_1020_05d5 Label DEFAULT true true +1020:05d8 Code5 FUN_1020_05d8 Function DEFAULT true false +1020:05f6 Code5 LAB_1020_05f6 Label DEFAULT true true +1020:0600 Code5 LAB_1020_0600 Label DEFAULT true true +1020:0608 Code5 FUN_1020_0608 Function DEFAULT true false +1020:0629 Code5 LAB_1020_0629 Label DEFAULT true true +1020:062d Code5 FUN_1020_062d Function DEFAULT true false +1020:0649 Code5 LAB_1020_0649 Label DEFAULT true true +1020:064d Code5 FUN_1020_064d Function DEFAULT true false +1020:0661 Code5 LAB_1020_0661 Label DEFAULT true true +1020:0663 Code5 LAB_1020_0663 Label DEFAULT true true +1020:0667 Code5 FUN_1020_0667 Function DEFAULT true false +1020:0697 Code5 LAB_1020_0697 Label DEFAULT true true +1020:069f Code5 LAB_1020_069f Label DEFAULT true true +1020:06ab Code5 FUN_1020_06ab Function DEFAULT true false +1020:06ba Code5 LAB_1020_06ba Label DEFAULT true true +1020:06d8 Code5 LAB_1020_06d8 Label DEFAULT true true +1020:06e2 Code5 LAB_1020_06e2 Label DEFAULT true true +1020:06fb Code5 LAB_1020_06fb Label DEFAULT true true +1020:06fc Code5 LAB_1020_06fc Label DEFAULT true true +1020:070c Code5 LAB_1020_070c Label DEFAULT true true +1020:0710 Code5 runtime_1020_0710 Function USER_DEFINED true false +1020:0729 Code5 LAB_1020_0729 Label DEFAULT true true +1020:072c Code5 FUN_1020_072c Function DEFAULT true false +1020:0748 Code5 LAB_1020_0748 Label DEFAULT true true +1020:074e Code5 LAB_1020_074e Label DEFAULT true true +1020:0751 Code5 FUN_1020_0751 Function DEFAULT true false +1020:075f Code5 LAB_1020_075f Label DEFAULT true true +1020:0760 Code5 runtime_1020_0760 Function USER_DEFINED true false +1020:076c Code5 LAB_1020_076c Label DEFAULT true true +1020:078f Code5 LAB_1020_078f Label DEFAULT true true +1020:0792 Code5 LAB_1020_0792 Label DEFAULT true true +1020:0796 Code5 runtime_1020_0796 Function USER_DEFINED true false +1020:07a2 Code5 LAB_1020_07a2 Label DEFAULT true true +1020:07d0 Code5 LAB_1020_07d0 Label DEFAULT true true +1020:07de Code5 LAB_1020_07de Label DEFAULT true true +1020:07e9 Code5 LAB_1020_07e9 Label DEFAULT true true +1020:07ec Code5 LAB_1020_07ec Label DEFAULT true true +1020:07fa Code5 LAB_1020_07fa Label DEFAULT true true +1020:07fe Code5 FUN_1020_07fe Function DEFAULT true false +1020:082a Code5 LAB_1020_082a Label DEFAULT true true +1020:082e Code5 FUN_1020_082e Function DEFAULT true false +1020:0848 Code5 LAB_1020_0848 Label DEFAULT true true +1020:085f Code5 LAB_1020_085f Label DEFAULT true true +1020:0866 Code5 runtime_1020_0866 Function USER_DEFINED true false +1020:0871 Code5 FUN_1020_0871 Function DEFAULT true false +1020:0876 Code5 LAB_1020_0876 Label DEFAULT true true +1020:087f Code5 LAB_1020_087f Label DEFAULT true true +1020:0882 Code5 LAB_1020_0882 Label DEFAULT true true +1020:0890 Code5 LAB_1020_0890 Label DEFAULT true true +1020:0891 Code5 FUN_1020_0891 Function DEFAULT true false +1020:08a9 Code5 FUN_1020_08a9 Function DEFAULT true false +1020:08cb Code5 LAB_1020_08cb Label DEFAULT true true +1020:08e6 Code5 FUN_1020_08e6 Function DEFAULT true false +1020:0914 Code5 LAB_1020_0914 Label DEFAULT true true +1020:0923 Code5 LAB_1020_0923 Label DEFAULT true true +1020:0934 Code5 LAB_1020_0934 Label DEFAULT true true +1020:0944 Code5 LAB_1020_0944 Label DEFAULT true true +1020:0958 Code5 LAB_1020_0958 Label DEFAULT true true +1020:095e Code5 LAB_1020_095e Label DEFAULT true true +1020:095f Code5 LAB_1020_095f Label DEFAULT true true +1020:0965 Code5 LAB_1020_0965 Label DEFAULT true true +1020:0967 Code5 LAB_1020_0967 Label DEFAULT true true +1020:0974 Code5 LAB_1020_0974 Label DEFAULT true true +1020:0980 Code5 LAB_1020_0980 Label DEFAULT true true +1020:098a Code5 LAB_1020_098a Label DEFAULT true true +1020:098c Code5 runtime_1020_098c Function USER_DEFINED true false +1020:09a3 Code5 LAB_1020_09a3 Label DEFAULT true true +1020:09a8 Code5 LAB_1020_09a8 Label DEFAULT true true +1020:09ae Code5 LAB_1020_09ae Label DEFAULT true true +1020:09af Code5 runtime_1020_09af Function USER_DEFINED true false +1020:09c6 Code5 LAB_1020_09c6 Label DEFAULT true true +1020:09cb Code5 LAB_1020_09cb Label DEFAULT true true +1020:09d1 Code5 LAB_1020_09d1 Label DEFAULT true true +1020:09d2 Code5 runtime_1020_09d2 Function USER_DEFINED true false +1020:09ec Code5 FUN_1020_09ec Function DEFAULT true false +1020:0a04 Code5 LAB_1020_0a04 Label DEFAULT true true +1020:0a10 Code5 FUN_1020_0a10 Function DEFAULT true false +1020:0a2c Code5 LAB_1020_0a2c Label DEFAULT true true +1020:0a3d Code5 LAB_1020_0a3d Label DEFAULT true true +1020:0a45 Code5 LAB_1020_0a45 Label DEFAULT true true +1020:0a47 Code5 LAB_1020_0a47 Label DEFAULT true true +1020:0a51 Code5 FUN_1020_0a51 Function DEFAULT true false +1020:0a71 Code5 LAB_1020_0a71 Label DEFAULT true true +1020:0a7d Code5 FUN_1020_0a7d Function DEFAULT true false +1020:0a9c Code5 LAB_1020_0a9c Label DEFAULT true true +1020:0ab6 Code5 LAB_1020_0ab6 Label DEFAULT true true +1020:0aba Code5 LAB_1020_0aba Label DEFAULT true true +1020:0abe Code5 LAB_1020_0abe Label DEFAULT true true +1020:0ac3 Code5 FUN_1020_0ac3 Function DEFAULT true false +1020:0add Code5 LAB_1020_0add Label DEFAULT true true +1020:0ae7 Code5 LAB_1020_0ae7 Label DEFAULT true true +1020:0ae9 Code5 LAB_1020_0ae9 Label DEFAULT true true +1020:0aee Code5 runtime_1020_0aee Function USER_DEFINED true false +1020:0b00 Code5 FUN_1020_0b00 Function DEFAULT true false +1020:0b1b Code5 FUN_1020_0b1b Function DEFAULT true false +1020:0b2d Code5 LAB_1020_0b2d Label DEFAULT true true +1020:0b7a Code5 FUN_1020_0b7a Function DEFAULT true false +1020:0ba0 Code5 LAB_1020_0ba0 Label DEFAULT true true +1020:0be3 Code5 LAB_1020_0be3 Label DEFAULT true true +1020:0be9 Code5 FUN_1020_0be9 Function DEFAULT true false +1020:0c0b Code5 LAB_1020_0c0b Label DEFAULT true true +1020:0c1a Code5 LAB_1020_0c1a Label DEFAULT true true +1020:0c4b Code5 LAB_1020_0c4b Label DEFAULT true true +1020:0c55 Code5 LAB_1020_0c55 Label DEFAULT true true +1020:0c5a Code5 LAB_1020_0c5a Label DEFAULT true true +1020:0c72 Code5 LAB_1020_0c72 Label DEFAULT true true +1020:0c76 Code5 FUN_1020_0c76 Function DEFAULT true false +1020:0c8d Code5 LAB_1020_0c8d Label DEFAULT true true +1020:0ca9 Code5 LAB_1020_0ca9 Label DEFAULT true true +1020:0cab Code5 LAB_1020_0cab Label DEFAULT true true +1020:0cb9 Code5 LAB_1020_0cb9 Label DEFAULT true true +1020:0ccf Code5 LAB_1020_0ccf Label DEFAULT true true +1020:0cd0 Code5 FUN_1020_0cd0 Function DEFAULT true false +1020:0cd4 Code5 FUN_1020_0cd4 Function DEFAULT true false +1020:0ce5 Code5 LAB_1020_0ce5 Label DEFAULT true true +1020:0d05 Code5 LAB_1020_0d05 Label DEFAULT true true +1020:0d1b Code5 LAB_1020_0d1b Label DEFAULT true true +1020:0d1f Code5 LAB_1020_0d1f Label DEFAULT true true +1020:0d29 Code5 LAB_1020_0d29 Label DEFAULT true true +1020:0d41 Code5 LAB_1020_0d41 Label DEFAULT true true +1020:0d4c Code5 LAB_1020_0d4c Label DEFAULT true true +1020:0d53 Code5 LAB_1020_0d53 Label DEFAULT true true +1020:0d54 Code5 LAB_1020_0d54 Label DEFAULT true true +1020:0d5b Code5 LAB_1020_0d5b Label DEFAULT true true +1020:0d61 Code5 LAB_1020_0d61 Label DEFAULT true true +1020:0d63 Code5 LAB_1020_0d63 Label DEFAULT true true +1020:0d7e Code5 LAB_1020_0d7e Label DEFAULT true true +1020:0d86 Code5 LAB_1020_0d86 Label DEFAULT true true +1020:0d94 Code5 LAB_1020_0d94 Label DEFAULT true true +1020:0d97 Code5 FUN_1020_0d97 Function DEFAULT true false +1020:0dc1 Code5 LAB_1020_0dc1 Label DEFAULT true true +1020:0dce Code5 LAB_1020_0dce Label DEFAULT true true +1020:0deb Code5 LAB_1020_0deb Label DEFAULT true true +1020:0e66 Code5 LAB_1020_0e66 Label DEFAULT true true +1020:0e74 Code5 LAB_1020_0e74 Label DEFAULT true true +1020:0e78 Code5 LAB_1020_0e78 Label DEFAULT true true +1020:0e86 Code5 LAB_1020_0e86 Label DEFAULT true true +1020:0e93 Code5 FUN_1020_0e93 Function DEFAULT true false +1020:0e9a Code5 FUN_1020_0e9a Function DEFAULT true false +1020:0ebb Code5 LAB_1020_0ebb Label DEFAULT true true +1020:0ec5 Code5 LAB_1020_0ec5 Label DEFAULT true true +1020:0ecd Code5 LAB_1020_0ecd Label DEFAULT true true +1020:0ed1 Code5 LAB_1020_0ed1 Label DEFAULT true true +1020:0ee2 Code5 LAB_1020_0ee2 Label DEFAULT true true +1020:0ef0 Code5 LAB_1020_0ef0 Label DEFAULT true true +1020:0f0a Code5 LAB_1020_0f0a Label DEFAULT true true +1020:0f11 Code5 FUN_1020_0f11 Function DEFAULT true false +1020:0f1c Code5 LAB_1020_0f1c Label DEFAULT true true +1020:0f28 Code5 FUN_1020_0f28 Function DEFAULT true false +1020:0f3a Code5 LAB_1020_0f3a Label DEFAULT true true +1020:0f3b Code5 FUN_1020_0f3b Function DEFAULT true false +1020:0f4e Code5 LAB_1020_0f4e Label DEFAULT true true +1020:0f63 Code5 LAB_1020_0f63 Label DEFAULT true true +1020:0f67 Code5 LAB_1020_0f67 Label DEFAULT true true +1020:0f6f Code5 LAB_1020_0f6f Label DEFAULT true true +1020:0f76 Code5 LAB_1020_0f76 Label DEFAULT true true +1020:0f77 Code5 FUN_1020_0f77 Function DEFAULT true false +1020:0f96 Code5 LAB_1020_0f96 Label DEFAULT true true +1020:0fa8 Code5 LAB_1020_0fa8 Label DEFAULT true true +1020:0fac Code5 LAB_1020_0fac Label DEFAULT true true +1020:0fb6 Code5 LAB_1020_0fb6 Label DEFAULT true true +1020:0fc4 Code5 LAB_1020_0fc4 Label DEFAULT true true +1020:0fd5 Code5 LAB_1020_0fd5 Label DEFAULT true true +1020:0fd9 Code5 LAB_1020_0fd9 Label DEFAULT true true +1020:0fda Code5 LAB_1020_0fda Label DEFAULT true true +1020:0fe5 Code5 FUN_1020_0fe5 Function DEFAULT true false +1020:0feb Code5 FUN_1020_0feb Function DEFAULT true false +1020:0ff1 Code5 FUN_1020_0ff1 Function DEFAULT true false +1020:0ff7 Code5 FUN_1020_0ff7 Function DEFAULT true false +1020:0ffd Code5 FUN_1020_0ffd Function DEFAULT true false +1020:1007 Code5 FUN_1020_1007 Function DEFAULT true false +1020:100b Code5 FUN_1020_100b Function DEFAULT true false +1020:1017 Code5 FUN_1020_1017 Function DEFAULT true false +1020:101f Code5 LAB_1020_101f Label DEFAULT true true +1020:1025 Code5 LAB_1020_1025 Label DEFAULT true true +1020:102b Code5 LAB_1020_102b Label DEFAULT true true +1020:1031 Code5 FUN_1020_1031 Function DEFAULT true false +1020:103b Code5 runtime_1020_103b Function USER_DEFINED true false +1020:1045 Code5 runtime_1020_1045 Function USER_DEFINED true false +1020:104f Code5 FUN_1020_104f Function DEFAULT true false +1020:1059 Code5 runtime_1020_1059 Function USER_DEFINED true false +1020:106e Code5 LAB_1020_106e Label DEFAULT true true +1020:107f Code5 LAB_1020_107f Label DEFAULT true true +1020:1091 Code5 LAB_1020_1091 Label DEFAULT true true +1020:1095 Code5 LAB_1020_1095 Label DEFAULT true true +1020:10a0 Code5 LAB_1020_10a0 Label DEFAULT true true +1020:10a6 Code5 LAB_1020_10a6 Label DEFAULT true true +1020:10a7 Code5 LAB_1020_10a7 Label DEFAULT true true +1020:10aa Code5 runtime_1020_10aa Function USER_DEFINED true false +1020:10be Code5 FUN_1020_10be Function DEFAULT true false +1020:10eb Code5 LAB_1020_10eb Label DEFAULT true true +1020:110a Code5 LAB_1020_110a Label DEFAULT true true +1020:1114 Code5 LAB_1020_1114 Label DEFAULT true true +1020:111d Code5 runtime_1020_111d Function USER_DEFINED true false +1020:1130 Code5 LAB_1020_1130 Label DEFAULT true true +1020:1157 Code5 LAB_1020_1157 Label DEFAULT true true +1020:115f Code5 LAB_1020_115f Label DEFAULT true true +1020:116a Code5 LAB_1020_116a Label DEFAULT true true +1020:1179 Code5 LAB_1020_1179 Label DEFAULT true true +1020:1186 Code5 LAB_1020_1186 Label DEFAULT true true +1020:1190 Code5 LAB_1020_1190 Label DEFAULT true true +1020:1191 Code5 real48_table_1191 Label USER_DEFINED true false +1020:11bb Code5 runtime_1020_11bb Function USER_DEFINED true false +1020:11c4 Code5 LAB_1020_11c4 Label DEFAULT true true +1020:11ca Code5 LAB_1020_11ca Label DEFAULT true true +1020:123f Code5 LAB_1020_123f Label DEFAULT true true +1020:1240 Code5 real48_table_1240 Label USER_DEFINED true false +1020:1264 Code5 runtime_1020_1264 Function USER_DEFINED true false +1020:1294 Code5 LAB_1020_1294 Label DEFAULT true true +1020:12b8 Code5 LAB_1020_12b8 Label DEFAULT true true +1020:12cf Code5 LAB_1020_12cf Label DEFAULT true true +1020:12d0 Code5 LAB_1020_12d0 Label DEFAULT true true +1020:12d7 Code5 real48_table_12d7 Label USER_DEFINED true false +1020:1307 Code5 runtime_1020_1307 Function USER_DEFINED true false +1020:1314 Code5 LAB_1020_1314 Label DEFAULT true true +1020:131f Code5 LAB_1020_131f Label DEFAULT true true +1020:1338 Code5 LAB_1020_1338 Label DEFAULT true true +1020:134b Code5 LAB_1020_134b Label DEFAULT true true +1020:1351 Code5 LAB_1020_1351 Label DEFAULT true true +1020:136d Code5 LAB_1020_136d Label DEFAULT true true +1020:13c2 Code5 LAB_1020_13c2 Label DEFAULT true true +1020:13dc Code5 LAB_1020_13dc Label DEFAULT true true +1020:13e4 Code5 LAB_1020_13e4 Label DEFAULT true true +1020:13e8 Code5 real48_table_13e8 Label USER_DEFINED true false +1020:13ea Code5 real48_table_13e8[2] Label DEFAULT true true +1020:13ec Code5 real48_table_13e8[4] Label DEFAULT true true +1020:13ee Code5 real48_table_13e8[6] Label DEFAULT true true +1020:13f0 Code5 real48_table_13e8[8] Label DEFAULT true true +1020:13f2 Code5 real48_table_13e8[10] Label DEFAULT true true +1020:13fa Code5 real48_table_13e8[18] Label DEFAULT true true +1020:13fc Code5 real48_table_13e8[20] Label DEFAULT true true +1020:13fe Code5 real48_table_13e8[22] Label DEFAULT true true +1020:1436 Code5 runtime_1020_1436 Function USER_DEFINED true false +1020:143c Code5 FUN_1020_143c Function DEFAULT true false +1020:1455 Code5 FUN_1020_1455 Function DEFAULT true false +1020:1473 Code5 LAB_1020_1473 Label DEFAULT true true +1020:1483 Code5 LAB_1020_1483 Label DEFAULT true true +1020:14a4 Code5 FUN_1020_14a4 Function DEFAULT true false +1020:14c1 Code5 FUN_1020_14c1 Function DEFAULT true false +1020:14cb Code5 LAB_1020_14cb Label DEFAULT true true +1020:14da Code5 LAB_1020_14da Label DEFAULT true true +1020:14de Code5 runtime_1020_14de Function USER_DEFINED true false +1020:14fb Code5 DAT_1020_14fb Label DEFAULT true true +1020:14ff Code5 DAT_1020_14ff Label DEFAULT true true +1020:1501 Code5 FUN_1020_1501 Function DEFAULT true false +1020:1537 Code5 DAT_1020_1537 Label DEFAULT true true +1020:1539 Code5 runtime_1020_1539 Function USER_DEFINED true false +1020:1546 Code5 FUN_1020_1546 Function DEFAULT true false +1020:1562 Code5 FUN_1020_1562 Function DEFAULT true false +1020:1575 Code5 LAB_1020_1575 Label DEFAULT true true +1020:1582 Code5 FUN_1020_1582 Function DEFAULT true false +1020:1597 Code5 LAB_1020_1597 Label DEFAULT true true +1020:159b Code5 LAB_1020_159b Label DEFAULT true true +1020:15a1 Code5 LAB_1020_15a1 Label DEFAULT true true +1020:15d1 Code5 LAB_1020_15d1 Label DEFAULT true true +1020:15e2 Code5 LAB_1020_15e2 Label DEFAULT true true +1020:15e6 Code5 LAB_1020_15e6 Label DEFAULT true true +1020:15e7 Code5 LAB_1020_15e7 Label DEFAULT true true +1020:15e9 Code5 LAB_1020_15e9 Label DEFAULT true true +1020:15ed Code5 LAB_1020_15ed Label DEFAULT true true +1020:15f8 Code5 LAB_1020_15f8 Label DEFAULT true true +1020:160b Code5 LAB_1020_160b Label DEFAULT true true +1020:160d Code5 LAB_1020_160d Label DEFAULT true true +1020:1627 Code5 LAB_1020_1627 Label DEFAULT true true +1020:1629 Code5 FUN_1020_1629 Function DEFAULT true false +1020:1651 Code5 LAB_1020_1651 Label DEFAULT true true +1020:1657 Code5 LAB_1020_1657 Label DEFAULT true true +1020:165d Code5 LAB_1020_165d Label DEFAULT true true +1020:166b Code5 LAB_1020_166b Label DEFAULT true true +1020:1674 Code5 FUN_1020_1674 Function DEFAULT true false +1020:1682 Code5 LAB_1020_1682 Label DEFAULT true true +1020:168b Code5 LAB_1020_168b Label DEFAULT true true +1020:1692 Code5 LAB_1020_1692 Label DEFAULT true true +1020:169b Code5 LAB_1020_169b Label DEFAULT true true +1020:16a5 Code5 FUN_1020_16a5 Function DEFAULT true false +1020:16c1 Code5 LAB_1020_16c1 Label DEFAULT true true +1020:16c9 Code5 FUN_1020_16c9 Function DEFAULT true false +1020:16dd Code5 runtime_1020_16dd Function USER_DEFINED true false +1020:16e1 Code5 FUN_1020_16e1 Function DEFAULT true false +1020:16e6 Code5 FUN_1020_16e6 Function DEFAULT true false +1020:16f2 Code5 LAB_1020_16f2 Label DEFAULT true true +1020:16f9 Code5 LAB_1020_16f9 Label DEFAULT true true +1020:1713 Code5 LAB_1020_1713 Label DEFAULT true true +1028:0010 Data6 s_IWIKTDK_Highscores_1028_0010 Label DEFAULT true true +1028:0012 Data6 s_IKTDK_Highscores_1028_0010+2 Label DEFAULT true true +1028:03ea Data6 DAT_1028_03ea Label DEFAULT true true +1028:03ec Data6 DAT_1028_03ec Label DEFAULT true true +1028:03ee Data6 DAT_1028_03ee Label DEFAULT true true +1028:03f0 Data6 DAT_1028_03f0 Label DEFAULT true true +1028:0538 Data6 DAT_1028_0538 Label DEFAULT true true +1028:053a Data6 DAT_1028_053a Label DEFAULT true true +1028:053c Data6 DAT_1028_053c Label DEFAULT true true +1028:053e Data6 DAT_1028_053e Label DEFAULT true true +1028:0540 Data6 DAT_1028_0540 Label DEFAULT true true +1028:0542 Data6 DAT_1028_0542 Label DEFAULT true true +1028:0544 Data6 DAT_1028_0544 Label DEFAULT true true +1028:0546 Data6 DAT_1028_0546 Label DEFAULT true true +1028:0548 Data6 DAT_1028_0548 Label DEFAULT true true +1028:054a Data6 DAT_1028_054a Label DEFAULT true true +1028:054c Data6 DAT_1028_054c Label DEFAULT true true +1028:054e Data6 DAT_1028_054e Label DEFAULT true true +1028:055e Data6 DAT_1028_055e Label DEFAULT true true +1028:055f Data6 DAT_1028_055f Label DEFAULT true true +1028:0560 Data6 DAT_1028_0560 Label DEFAULT true true +1028:056c Data6 DAT_1028_056c Label DEFAULT true true +1028:056e Data6 DAT_1028_056e Label DEFAULT true true +1028:0570 Data6 DAT_1028_0570 Label DEFAULT true true +1028:0572 Data6 DAT_1028_0572 Label DEFAULT true true +1028:0578 Data6 DAT_1028_0578 Label DEFAULT true true +1028:057a Data6 DAT_1028_057a Label DEFAULT true true +1028:0586 Data6 DAT_1028_0586 Label DEFAULT true true +1028:0588 Data6 DAT_1028_0588 Label DEFAULT true true +1028:058a Data6 DAT_1028_058a Label DEFAULT true true +1028:058c Data6 DAT_1028_058c Label DEFAULT true true +1028:058d Data6 DAT_1028_058d Label DEFAULT true true +1028:058e Data6 DAT_1028_058e Label DEFAULT true true +1028:058f Data6 DAT_1028_058f Label DEFAULT true true +1028:0590 Data6 DAT_1028_0590 Label DEFAULT true true +1028:0591 Data6 DAT_1028_0591 Label DEFAULT true true +1028:0592 Data6 DAT_1028_0592 Label DEFAULT true true +1028:0593 Data6 DAT_1028_0593 Label DEFAULT true true +1028:0594 Data6 DAT_1028_0594 Label DEFAULT true true +1028:0595 Data6 DAT_1028_0595 Label DEFAULT true true +1028:0596 Data6 DAT_1028_0596 Label DEFAULT true true +1028:0597 Data6 DAT_1028_0597 Label DEFAULT true true +1028:064e Data6 DAT_1028_064e Label DEFAULT true true +1028:0650 Data6 DAT_1028_064e+2 Label DEFAULT true true +1028:0652 Data6 DAT_1028_0652 Label DEFAULT true true +1028:0654 Data6 DAT_1028_0654 Label DEFAULT true true +1028:0656 Data6 DAT_1028_0656 Label DEFAULT true true +1028:0658 Data6 DAT_1028_0658 Label DEFAULT true true +1028:0666 Data6 DAT_1028_0666 Label DEFAULT true true +1028:0668 Data6 DAT_1028_0668 Label DEFAULT true true +1028:066a Data6 DAT_1028_066a Label DEFAULT true true +1028:066c Data6 DAT_1028_066c Label DEFAULT true true +1028:066e Data6 DAT_1028_066e Label DEFAULT true true +1028:0670 Data6 DAT_1028_0670 Label DEFAULT true true +1028:0672 Data6 DAT_1028_0672 Label DEFAULT true true +1028:0674 Data6 DAT_1028_0674 Label DEFAULT true true +1028:0676 Data6 DAT_1028_0676 Label DEFAULT true true +1028:0678 Data6 DAT_1028_0678 Label DEFAULT true true +1028:0682 Data6 DAT_1028_0682 Label DEFAULT true true +1028:0684 Data6 DAT_1028_0684 Label DEFAULT true true +1028:06f2 Data6 DAT_1028_06f2 Label DEFAULT true true +1028:06f4 Data6 DAT_1028_06f4 Label DEFAULT true true +1028:06f6 Data6 DAT_1028_06f6 Label DEFAULT true true +1028:06f8 Data6 DAT_1028_06f8 Label DEFAULT true true +1028:06fa Data6 DAT_1028_06fa Label DEFAULT true true +1028:06fc Data6 DAT_1028_06fc Label DEFAULT true true +1028:06fe Data6 DAT_1028_06fe Label DEFAULT true true +1028:0700 Data6 DAT_1028_0700 Label DEFAULT true true +1028:0702 Data6 DAT_1028_0702 Label DEFAULT true true +1028:0704 Data6 DAT_1028_0702+2 Label DEFAULT true true +1028:0706 Data6 DAT_1028_0706 Label DEFAULT true true +1028:0708 Data6 DAT_1028_0708 Label DEFAULT true true +1028:070a Data6 DAT_1028_070a Label DEFAULT true true +1028:070c Data6 DAT_1028_070c Label DEFAULT true true +1028:070e Data6 DAT_1028_070e Label DEFAULT true true +1028:0710 Data6 DAT_1028_0710 Label DEFAULT true true +1028:0712 Data6 DAT_1028_0712 Label DEFAULT true true +1028:0714 Data6 DAT_1028_0714 Label DEFAULT true true +1028:0716 Data6 DAT_1028_0716 Label DEFAULT true true +1028:0718 Data6 DAT_1028_0718 Label DEFAULT true true +1028:071a Data6 DAT_1028_071a Label DEFAULT true true +1028:071c Data6 DAT_1028_071c Label DEFAULT true true +1028:071e Data6 DAT_1028_071e Label DEFAULT true true +1028:0720 Data6 DAT_1028_0720 Label DEFAULT true true +1028:0722 Data6 DAT_1028_0722 Label DEFAULT true true +1028:0724 Data6 DAT_1028_0724 Label DEFAULT true true +1028:0726 Data6 DAT_1028_0726 Label DEFAULT true true +1028:0727 Data6 DAT_1028_0727 Label DEFAULT true true +1028:0748 Data6 DAT_1028_0748 Label DEFAULT true true +1028:07bf Data6 DAT_1028_07bf Label DEFAULT true true +1028:07c1 Data6 DAT_1028_07c1 Label DEFAULT true true +1028:07c4 Data6 DAT_1028_07c4 Label DEFAULT true true +1028:07c5 Data6 DAT_1028_07c5 Label DEFAULT true true +1028:07c6 Data6 DAT_1028_07c6 Label DEFAULT true true +1028:07c7 Data6 DAT_1028_07c7 Label DEFAULT true true +1028:07c8 Data6 DAT_1028_07c8 Label DEFAULT true true +1028:07c9 Data6 DAT_1028_07c9 Label DEFAULT true true +1028:07ca Data6 DAT_1028_07ca Label DEFAULT true true +1028:07cb Data6 DAT_1028_07cb Label DEFAULT true true +1028:07cc Data6 DAT_1028_07cc Label DEFAULT true true +1028:07cd Data6 DAT_1028_07cd Label DEFAULT true true +1028:07cf Data6 DAT_1028_07cf Label DEFAULT true true +1028:07d0 Data6 DAT_1028_07d0 Label DEFAULT true true +1028:07d1 Data6 DAT_1028_07d1 Label DEFAULT true true +1028:07d2 Data6 DAT_1028_07d2 Label DEFAULT true true +1028:07d3 Data6 DAT_1028_07d3 Label DEFAULT true true +1028:07d5 Data6 DAT_1028_07d5 Label DEFAULT true true +1028:07d7 Data6 DAT_1028_07d7 Label DEFAULT true true +1028:07d9 Data6 DAT_1028_07d9 Label DEFAULT true true +1028:07db Data6 DAT_1028_07db Label DEFAULT true true +1028:07dd Data6 DAT_1028_07dd Label DEFAULT true true +1028:07df Data6 DAT_1028_07df Label DEFAULT true true +1028:07e1 Data6 DAT_1028_07e1 Label DEFAULT true true +1028:07e3 Data6 DAT_1028_07e3 Label DEFAULT true true +1028:07e5 Data6 DAT_1028_07e5 Label DEFAULT true true +1028:07e7 Data6 DAT_1028_07e7 Label DEFAULT true true +1028:07e9 Data6 DAT_1028_07e9 Label DEFAULT true true +1028:07eb Data6 DAT_1028_07eb Label DEFAULT true true +1028:07ed Data6 DAT_1028_07ed Label DEFAULT true true +1028:07ef Data6 DAT_1028_07ef Label DEFAULT true true +1028:07f1 Data6 DAT_1028_07f1 Label DEFAULT true true +1028:07f3 Data6 DAT_1028_07f3 Label DEFAULT true true +1028:07f5 Data6 DAT_1028_07f5 Label DEFAULT true true +1028:07f7 Data6 DAT_1028_07f7 Label DEFAULT true true +1028:07f9 Data6 DAT_1028_07f9 Label DEFAULT true true +1028:07fb Data6 DAT_1028_07fb Label DEFAULT true true +1028:07fd Data6 DAT_1028_07fd Label DEFAULT true true +1028:07ff Data6 DAT_1028_07ff Label DEFAULT true true +1028:0801 Data6 DAT_1028_0801 Label DEFAULT true true +1028:0803 Data6 DAT_1028_0803 Label DEFAULT true true +1028:0805 Data6 DAT_1028_0805 Label DEFAULT true true +1028:0807 Data6 DAT_1028_0807 Label DEFAULT true true +1028:0809 Data6 DAT_1028_0809 Label DEFAULT true true +1028:080b Data6 DAT_1028_080b Label DEFAULT true true +1028:080d Data6 DAT_1028_080d Label DEFAULT true true +1028:080f Data6 DAT_1028_080f Label DEFAULT true true +1028:0811 Data6 DAT_1028_0811 Label DEFAULT true true +1028:0813 Data6 DAT_1028_0813 Label DEFAULT true true +1028:0815 Data6 DAT_1028_0815 Label DEFAULT true true +1028:0817 Data6 DAT_1028_0817 Label DEFAULT true true +1028:0818 Data6 DAT_1028_0818 Label DEFAULT true true +1028:081b Data6 DAT_1028_081b Label DEFAULT true true +1028:081c Data6 DAT_1028_081c Label DEFAULT true true +1028:0821 Data6 DAT_1028_0821 Label DEFAULT true true +1028:0823 Data6 DAT_1028_0823 Label DEFAULT true true +1028:0829 Data6 DAT_1028_0829 Label DEFAULT true true +1028:082b Data6 DAT_1028_082b Label DEFAULT true true +1028:082d Data6 DAT_1028_082d Label DEFAULT true true +1028:082f Data6 DAT_1028_082f Label DEFAULT true true +1028:0831 Data6 DAT_1028_0831 Label DEFAULT true true +1028:0833 Data6 DAT_1028_0833 Label DEFAULT true true +1028:0835 Data6 DAT_1028_0835 Label DEFAULT true true +1028:0837 Data6 DAT_1028_0837 Label DEFAULT true true +1028:0839 Data6 DAT_1028_0839 Label DEFAULT true true +1028:083b Data6 DAT_1028_083b Label DEFAULT true true +1028:083d Data6 DAT_1028_083d Label DEFAULT true true +1028:083f Data6 DAT_1028_083f Label DEFAULT true true +1028:0849 Data6 DAT_1028_0849 Label DEFAULT true true +1028:084b Data6 DAT_1028_084b Label DEFAULT true true +1028:084d Data6 DAT_1028_084d Label DEFAULT true true +1028:084f Data6 DAT_1028_084f Label DEFAULT true true +1028:0851 Data6 DAT_1028_0851 Label DEFAULT true true +1028:0853 Data6 DAT_1028_0853 Label DEFAULT true true +1028:0855 Data6 DAT_1028_0855 Label DEFAULT true true +1028:0857 Data6 DAT_1028_0857 Label DEFAULT true true +1028:0859 Data6 DAT_1028_0859 Label DEFAULT true true +1028:085b Data6 DAT_1028_085b Label DEFAULT true true +1028:085d Data6 DAT_1028_085d Label DEFAULT true true +1028:085f Data6 DAT_1028_085f Label DEFAULT true true +1028:0861 Data6 DAT_1028_0861 Label DEFAULT true true +1028:0863 Data6 DAT_1028_0863 Label DEFAULT true true +1028:0865 Data6 DAT_1028_0865 Label DEFAULT true true +1028:0867 Data6 DAT_1028_0867 Label DEFAULT true true +1028:0869 Data6 DAT_1028_0869 Label DEFAULT true true +1028:086b Data6 DAT_1028_086b Label DEFAULT true true +1028:086d Data6 DAT_1028_086d Label DEFAULT true true +1028:086f Data6 DAT_1028_086f Label DEFAULT true true +1028:0871 Data6 DAT_1028_0871 Label DEFAULT true true +1028:0873 Data6 DAT_1028_0873 Label DEFAULT true true +1028:0874 Data6 DAT_1028_0874 Label DEFAULT true true +1028:0875 Data6 DAT_1028_0875 Label DEFAULT true true +1028:0876 Data6 DAT_1028_0876 Label DEFAULT true true +1028:0878 Data6 DAT_1028_0878 Label DEFAULT true true +1028:087a Data6 DAT_1028_087a Label DEFAULT true true +1028:087c Data6 DAT_1028_087c Label DEFAULT true true +1028:087e Data6 DAT_1028_087e Label DEFAULT true true +1028:0880 Data6 DAT_1028_0880 Label DEFAULT true true +1028:0882 Data6 DAT_1028_0882 Label DEFAULT true true +1028:0884 Data6 DAT_1028_0884 Label DEFAULT true true +1028:089a Data6 DAT_1028_089a Label DEFAULT true true +1028:089c Data6 DAT_1028_089c Label DEFAULT true true +1028:089e Data6 DAT_1028_089e Label DEFAULT true true +1028:08a0 Data6 DAT_1028_08a0 Label DEFAULT true true +1028:08a2 Data6 DAT_1028_08a2 Label DEFAULT true true +1028:08a4 Data6 DAT_1028_08a4 Label DEFAULT true true +1028:0982 Data6 DAT_1028_0982 Label DEFAULT true true +1028:0984 Data6 DAT_1028_0984 Label DEFAULT true true +1028:0986 Data6 DAT_1028_0986 Label DEFAULT true true +1028:0988 Data6 DAT_1028_0988 Label DEFAULT true true +1028:0992 Data6 DAT_1028_0992 Label DEFAULT true true +1028:0994 Data6 DAT_1028_0994 Label DEFAULT true true +1028:0996 Data6 DAT_1028_0996 Label DEFAULT true true +1028:0998 Data6 DAT_1028_0998 Label DEFAULT true true +1028:09a2 Data6 DAT_1028_09a2 Label DEFAULT true true +1028:09a3 Data6 DAT_1028_09a3 Label DEFAULT true true +1028:09a6 Data6 DAT_1028_09a6 Label DEFAULT true true +1028:09a8 Data6 DAT_1028_09a8 Label DEFAULT true true +1028:09e2 Data6 DAT_1028_09e2 Label DEFAULT true true +1028:09f1 Data6 DAT_1028_09f1 Label DEFAULT true true +1028:09f7 Data6 DAT_1028_09f7 Label DEFAULT true true +1028:0a01 Data6 DAT_1028_0a01 Label DEFAULT true true +1028:0a02 Data6 DAT_1028_0a02 Label DEFAULT true true +1028:0a03 Data6 DAT_1028_0a03 Label DEFAULT true true +1028:0a05 Data6 DAT_1028_0a05 Label DEFAULT true true +1028:0a07 Data6 DAT_1028_0a07 Label DEFAULT true true +1028:0a09 Data6 DAT_1028_0a09 Label DEFAULT true true +1028:0a0b Data6 DAT_1028_0a0b Label DEFAULT true true +1028:0a0d Data6 DAT_1028_0a0d Label DEFAULT true true +1028:0a0f Data6 DAT_1028_0a0f Label DEFAULT true true +1028:0a11 Data6 DAT_1028_0a11 Label DEFAULT true true +1028:0a13 Data6 DAT_1028_0a13 Label DEFAULT true true +1028:0a15 Data6 DAT_1028_0a15 Label DEFAULT true true +1028:0a17 Data6 DAT_1028_0a17 Label DEFAULT true true +1028:0a19 Data6 DAT_1028_0a19 Label DEFAULT true true +1028:0a1b Data6 DAT_1028_0a1b Label DEFAULT true true +1028:0a1d Data6 DAT_1028_0a1d Label DEFAULT true true +1028:0a1f Data6 DAT_1028_0a1f Label DEFAULT true true +1028:0a21 Data6 DAT_1028_0a21 Label DEFAULT true true +1028:0a23 Data6 DAT_1028_0a23 Label DEFAULT true true +1028:0a25 Data6 DAT_1028_0a25 Label DEFAULT true true +1028:0a27 Data6 DAT_1028_0a27 Label DEFAULT true true +1028:0a29 Data6 DAT_1028_0a29 Label DEFAULT true true +1028:0a2b Data6 DAT_1028_0a2b Label DEFAULT true true +1028:0a2d Data6 DAT_1028_0a2d Label DEFAULT true true +1028:0a2f Data6 DAT_1028_0a2f Label DEFAULT true true +1028:0a31 Data6 DAT_1028_0a31 Label DEFAULT true true +1028:0a33 Data6 DAT_1028_0a33 Label DEFAULT true true +1028:0a35 Data6 DAT_1028_0a35 Label DEFAULT true true +1028:0a36 Data6 DAT_1028_0a36 Label DEFAULT true true +1028:0a38 Data6 DAT_1028_0a38 Label DEFAULT true true +1028:0a3a Data6 DAT_1028_0a3a Label DEFAULT true true +1028:0a3c Data6 DAT_1028_0a3c Label DEFAULT true true +1028:0a3e Data6 DAT_1028_0a3e Label DEFAULT true true +1028:0a40 Data6 DAT_1028_0a40 Label DEFAULT true true +1028:0a42 Data6 DAT_1028_0a42 Label DEFAULT true true +1028:0a44 Data6 DAT_1028_0a44 Label DEFAULT true true +1028:0a46 Data6 DAT_1028_0a46 Label DEFAULT true true +1028:0a48 Data6 DAT_1028_0a48 Label DEFAULT true true +1028:0a4a Data6 DAT_1028_0a4a Label DEFAULT true true +1028:0b81 Data6 DAT_1028_0b81 Label DEFAULT true true +1028:0b98 Data6 DAT_1028_0b98 Label DEFAULT true true +1028:0b9a Data6 DAT_1028_0b9a Label DEFAULT true true +1028:0b9c Data6 DAT_1028_0b9c Label DEFAULT true true +1028:0b9e Data6 DAT_1028_0b9e Label DEFAULT true true +1028:0d73 Data6 DAT_1028_0d73 Label DEFAULT true true +1028:0dc6 Data6 DAT_1028_0dc6 Label DEFAULT true true +1028:1e80 Data6 DAT_1028_1e80 Label DEFAULT true true +1028:1e82 Data6 DAT_1028_1e82 Label DEFAULT true true +1028:1e84 Data6 DAT_1028_1e84 Label DEFAULT true true +1028:1e86 Data6 DAT_1028_1e86 Label DEFAULT true true +1028:1e90 Data6 DAT_1028_1e90 Label DEFAULT true true +1028:1e92 Data6 DAT_1028_1e92 Label DEFAULT true true +1028:1e94 Data6 DAT_1028_1e94 Label DEFAULT true true +1028:1ec3 Data6 DAT_1028_1ec3 Label DEFAULT true true +1028:1ec5 Data6 DAT_1028_1ec5 Label DEFAULT true true +1028:1ec7 Data6 DAT_1028_1ec7 Label DEFAULT true true +1028:1ec9 Data6 DAT_1028_1ec9 Label DEFAULT true true +1028:1ecb Data6 DAT_1028_1ecb Label DEFAULT true true +1028:1ecd Data6 DAT_1028_1ecd Label DEFAULT true true +1028:1ecf Data6 DAT_1028_1ecf Label DEFAULT true true +1028:1ed1 Data6 DAT_1028_1ed1 Label DEFAULT true true +1028:1ed3 Data6 DAT_1028_1ed3 Label DEFAULT true true +1028:1ed5 Data6 DAT_1028_1ed5 Label DEFAULT true true +1028:1ed7 Data6 DAT_1028_1ed7 Label DEFAULT true true +1028:1ed9 Data6 DAT_1028_1ed9 Label DEFAULT true true +1028:1edb Data6 DAT_1028_1edb Label DEFAULT true true +1028:1edd Data6 DAT_1028_1edd Label DEFAULT true true +1028:1edf Data6 DAT_1028_1edf Label DEFAULT true true +1028:1ee1 Data6 DAT_1028_1ee1 Label DEFAULT true true +1028:1f16 Data6 DAT_1028_1f16 Label DEFAULT true true +1028:1f18 Data6 DAT_1028_1f18 Label DEFAULT true true +1028:1f1a Data6 DAT_1028_1f1a Label DEFAULT true true +1028:1f1c Data6 DAT_1028_1f1c Label DEFAULT true true +1028:1f1e Data6 DAT_1028_1f1e Label DEFAULT true true +1028:1f20 Data6 DAT_1028_1f20 Label DEFAULT true true +1028:1f22 Data6 DAT_1028_1f22 Label DEFAULT true true +1028:1f24 Data6 DAT_1028_1f24 Label DEFAULT true true +1028:1f26 Data6 DAT_1028_1f26 Label DEFAULT true true +1028:1f28 Data6 DAT_1028_1f28 Label DEFAULT true true +1028:1f2a Data6 DAT_1028_1f2a Label DEFAULT true true +1028:1f2c Data6 DAT_1028_1f2c Label DEFAULT true true +1028:1f69 Data6 DAT_1028_1f69 Label DEFAULT true true +1028:1f6b Data6 DAT_1028_1f6b Label DEFAULT true true +1028:1f6d Data6 DAT_1028_1f6d Label DEFAULT true true +1028:1f6f Data6 DAT_1028_1f6f Label DEFAULT true true +1028:1f71 Data6 DAT_1028_1f71 Label DEFAULT true true +1028:1f73 Data6 DAT_1028_1f73 Label DEFAULT true true +1028:1f75 Data6 DAT_1028_1f75 Label DEFAULT true true +1028:1f77 Data6 DAT_1028_1f77 Label DEFAULT true true +1028:1f79 Data6 DAT_1028_1f79 Label DEFAULT true true +1028:1f7b Data6 DAT_1028_1f7b Label DEFAULT true true +1028:1f7d Data6 DAT_1028_1f7d Label DEFAULT true true +1028:1f7f Data6 DAT_1028_1f7f Label DEFAULT true true +1028:1f81 Data6 DAT_1028_1f81 Label DEFAULT true true +1028:1f83 Data6 DAT_1028_1f83 Label DEFAULT true true +1028:1f85 Data6 DAT_1028_1f85 Label DEFAULT true true +1028:1f87 Data6 DAT_1028_1f87 Label DEFAULT true true +1028:235d Data6 DAT_1028_235d Label DEFAULT true true +1028:235f Data6 DAT_1028_235f Label DEFAULT true true +1028:2361 Data6 DAT_1028_2361 Label DEFAULT true true +1028:2363 Data6 DAT_1028_2363 Label DEFAULT true true +1028:236d Data6 DAT_1028_236d Label DEFAULT true true +1028:236f Data6 DAT_1028_236f Label DEFAULT true true +1028:2371 Data6 DAT_1028_2371 Label DEFAULT true true +1028:23a0 Data6 DAT_1028_23a0 Label DEFAULT true true +1028:23a2 Data6 DAT_1028_23a2 Label DEFAULT true true +1028:23a4 Data6 DAT_1028_23a4 Label DEFAULT true true +1028:23a6 Data6 DAT_1028_23a6 Label DEFAULT true true +1028:23a8 Data6 DAT_1028_23a8 Label DEFAULT true true +1028:23aa Data6 DAT_1028_23aa Label DEFAULT true true +1028:23ac Data6 DAT_1028_23ac Label DEFAULT true true +1028:23ae Data6 DAT_1028_23ae Label DEFAULT true true +1028:23b0 Data6 DAT_1028_23b0 Label DEFAULT true true +1028:23b2 Data6 DAT_1028_23b2 Label DEFAULT true true +1028:23b4 Data6 DAT_1028_23b4 Label DEFAULT true true +1028:23b6 Data6 DAT_1028_23b6 Label DEFAULT true true +1028:23b8 Data6 DAT_1028_23b8 Label DEFAULT true true +1028:23ba Data6 DAT_1028_23ba Label DEFAULT true true +1028:23bc Data6 DAT_1028_23bc Label DEFAULT true true +1028:23be Data6 DAT_1028_23be Label DEFAULT true true +1028:23f3 Data6 DAT_1028_23f3 Label DEFAULT true true +1028:23f5 Data6 DAT_1028_23f5 Label DEFAULT true true +1028:23f7 Data6 DAT_1028_23f7 Label DEFAULT true true +1028:23f9 Data6 DAT_1028_23f9 Label DEFAULT true true +1028:23fb Data6 DAT_1028_23fb Label DEFAULT true true +1028:23fd Data6 DAT_1028_23fd Label DEFAULT true true +1028:23ff Data6 DAT_1028_23ff Label DEFAULT true true +1028:2401 Data6 DAT_1028_2401 Label DEFAULT true true +1028:2403 Data6 DAT_1028_2403 Label DEFAULT true true +1028:2405 Data6 DAT_1028_2405 Label DEFAULT true true +1028:2407 Data6 DAT_1028_2407 Label DEFAULT true true +1028:2409 Data6 DAT_1028_2409 Label DEFAULT true true +1028:2446 Data6 DAT_1028_2446 Label DEFAULT true true +1028:2448 Data6 DAT_1028_2448 Label DEFAULT true true +1028:244a Data6 DAT_1028_244a Label DEFAULT true true +1028:244c Data6 DAT_1028_244c Label DEFAULT true true +1028:244e Data6 DAT_1028_244e Label DEFAULT true true +1028:2450 Data6 DAT_1028_2450 Label DEFAULT true true +1028:2452 Data6 DAT_1028_2452 Label DEFAULT true true +1028:2454 Data6 DAT_1028_2454 Label DEFAULT true true +1028:2456 Data6 DAT_1028_2456 Label DEFAULT true true +1028:2458 Data6 DAT_1028_2458 Label DEFAULT true true +1028:245a Data6 DAT_1028_245a Label DEFAULT true true +1028:245c Data6 DAT_1028_245c Label DEFAULT true true +1028:245e Data6 DAT_1028_245e Label DEFAULT true true +1028:2460 Data6 DAT_1028_2460 Label DEFAULT true true +1028:2462 Data6 DAT_1028_2462 Label DEFAULT true true +1028:2464 Data6 DAT_1028_2464 Label DEFAULT true true +1028:2679 Data6 DAT_1028_2679 Label DEFAULT true true +1028:3340 Data6 DAT_1028_3340 Label DEFAULT true true +1028:3342 Data6 DAT_1028_3342 Label DEFAULT true true +1028:3344 Data6 DAT_1028_3344 Label DEFAULT true true +1028:3346 Data6 DAT_1028_3346 Label DEFAULT true true +1028:3371 Data6 DAT_1028_3371 Label DEFAULT true true +1028:33c4 Data6 DAT_1028_33c4 Label DEFAULT true true +1028:3417 Data6 DAT_1028_3417 Label DEFAULT true true +1028:346a Data6 DAT_1028_346a Label DEFAULT true true +1028:34bd Data6 DAT_1028_34bd Label DEFAULT true true +1028:3969 Data6 DAT_1028_3969 Label DEFAULT true true +1028:396b Data6 DAT_1028_396b Label DEFAULT true true +1028:396d Data6 DAT_1028_396d Label DEFAULT true true +1028:396f Data6 DAT_1028_396f Label DEFAULT true true +1028:399a Data6 DAT_1028_399a Label DEFAULT true true +1028:39de Data6 DAT_1028_39de Label DEFAULT true true +1028:3b2a Data6 DAT_1028_3b2a Label DEFAULT true true +1028:3b41 Data6 DAT_1028_3b41 Label DEFAULT true true +1028:3b43 Data6 DAT_1028_3b43 Label DEFAULT true true +1028:3b45 Data6 DAT_1028_3b45 Label DEFAULT true true +1028:3b47 Data6 DAT_1028_3b47 Label DEFAULT true true +1028:3b7d Data6 DAT_1028_3b7d Label DEFAULT true true +1028:3b94 Data6 DAT_1028_3b94 Label DEFAULT true true +1028:3b96 Data6 DAT_1028_3b96 Label DEFAULT true true +1028:3b98 Data6 DAT_1028_3b98 Label DEFAULT true true +1028:3b9a Data6 DAT_1028_3b9a Label DEFAULT true true +1028:41f9 Data6 DAT_1028_41f9 Label DEFAULT true true +1028:424c Data6 DAT_1028_424c Label DEFAULT true true +1028:431b Data6 DAT_1028_431b Label DEFAULT true true +1028:431d Data6 DAT_1028_431d Label DEFAULT true true +1028:4321 Data6 DAT_1028_4321 Label DEFAULT true true +1028:4323 Data6 DAT_1028_4323 Label DEFAULT true true +1028:4325 Data6 DAT_1028_4325 Label DEFAULT true true +1028:43ea Data6 DAT_1028_43ea Label DEFAULT true true +1028:43ec Data6 DAT_1028_43ec Label DEFAULT true true +1028:43ee Data6 DAT_1028_43ee Label DEFAULT true true +1028:43f0 Data6 DAT_1028_43f0 Label DEFAULT true true +1028:43f2 Data6 DAT_1028_43f2 Label DEFAULT true true +1028:43f3 Data6 DAT_1028_43f3 Label DEFAULT true true +1028:43f4 Data6 DAT_1028_43f4 Label DEFAULT true true +1028:43f6 Data6 DAT_1028_43f6 Label DEFAULT true true +1028:43f8 Data6 DAT_1028_43f8 Label DEFAULT true true +1028:43fa Data6 DAT_1028_43fa Label DEFAULT true true +1028:43fc Data6 DAT_1028_43fa+2 Label DEFAULT true true +1028:444e Data6 DAT_1028_444e Label DEFAULT true true +1028:4750 Data6 DAT_1028_4750 Label DEFAULT true true +1028:4752 Data6 DAT_1028_4752 Label DEFAULT true true +1028:4754 Data6 DAT_1028_4754 Label DEFAULT true true +1028:4756 Data6 DAT_1028_4756 Label DEFAULT true true +1028:4758 Data6 DAT_1028_4758 Label DEFAULT true true +1028:475a Data6 DAT_1028_475a Label DEFAULT true true +1028:475c Data6 DAT_1028_475c Label DEFAULT true true +1028:475e Data6 DAT_1028_475e Label DEFAULT true true +1028:4760 Data6 DAT_1028_4760 Label DEFAULT true true +1028:4762 Data6 DAT_1028_4762 Label DEFAULT true true +1028:4764 Data6 DAT_1028_4764 Label DEFAULT true true +1028:4766 Data6 DAT_1028_4766 Label DEFAULT true true +1028:4768 Data6 DAT_1028_4768 Label DEFAULT true true +1028:476a Data6 DAT_1028_476a Label DEFAULT true true +1028:476c Data6 DAT_1028_476c Label DEFAULT true true +1028:476e Data6 DAT_1028_476e Label DEFAULT true true +1028:4770 Data6 DAT_1028_4770 Label DEFAULT true true +1028:4772 Data6 DAT_1028_4772 Label DEFAULT true true +1028:4774 Data6 DAT_1028_4774 Label DEFAULT true true +1028:4776 Data6 DAT_1028_4776 Label DEFAULT true true +1028:4778 Data6 DAT_1028_4778 Label DEFAULT true true +1028:477a Data6 DAT_1028_477a Label DEFAULT true true +1028:477c Data6 DAT_1028_477c Label DEFAULT true true +1028:477e Data6 DAT_1028_477e Label DEFAULT true true +1028:477f Data6 DAT_1028_477f Label DEFAULT true true +1028:4780 Data6 DAT_1028_4780 Label DEFAULT true true +1028:4781 Data6 DAT_1028_4781 Label DEFAULT true true +1028:4783 Data6 DAT_1028_4783 Label DEFAULT true true +1028:4784 Data6 DAT_1028_4784 Label DEFAULT true true +1028:478a Data6 DAT_1028_478a Label DEFAULT true true +1028:478b Data6 DAT_1028_478b Label DEFAULT true true +1028:478c Data6 DAT_1028_478c Label DEFAULT true true +1028:47a2 Data6 DAT_1028_47a2 Label DEFAULT true true +1028:4abe Data6 DAT_1028_4abe Label DEFAULT true true +1028:4ac0 Data6 DAT_1028_4ac0 Label DEFAULT true true +1028:4ac2 Data6 DAT_1028_4ac2 Label DEFAULT true true +1028:4ac4 Data6 DAT_1028_4ac4 Label DEFAULT true true +1028:4ac6 Data6 DAT_1028_4ac6 Label DEFAULT true true +1028:4ac8 Data6 DAT_1028_4ac8 Label DEFAULT true true +1028:4aca Data6 DAT_1028_4aca Label DEFAULT true true +1028:4acc Data6 DAT_1028_4acc Label DEFAULT true true +1028:4ace Data6 DAT_1028_4ace Label DEFAULT true true +1028:4ad0 Data6 DAT_1028_4ad0 Label DEFAULT true true +1028:4ad2 Data6 DAT_1028_4ad2 Label DEFAULT true true +1028:4ad4 Data6 DAT_1028_4ad4 Label DEFAULT true true +1028:4ada Data6 DAT_1028_4ada Label DEFAULT true true +1028:4adc Data6 DAT_1028_4adc Label DEFAULT true true +1028:4ade Data6 DAT_1028_4ade Label DEFAULT true true +1028:4ae0 Data6 DAT_1028_4ae0 Label DEFAULT true true +1028:4af6 Data6 DAT_1028_4af6 Label DEFAULT true true +1028:4af8 Data6 DAT_1028_4af8 Label DEFAULT true true +1028:4d38 Data6 DAT_1028_4d38 Label DEFAULT true true +1228:0000 EXTERNAL GETVERSION Function DEFAULT true false +1228:0004 EXTERNAL GLOBALALLOC Function DEFAULT true false +1228:0008 EXTERNAL GLOBALFREE Function DEFAULT true false +1228:000c EXTERNAL GLOBALLOCK Function DEFAULT true false +1228:0010 EXTERNAL GLOBALUNLOCK Function DEFAULT true false +1228:0014 EXTERNAL GLOBALHANDLE Function DEFAULT true false +1228:0018 EXTERNAL GLOBALCOMPACT Function DEFAULT true false +1228:001c EXTERNAL WAITEVENT Function DEFAULT true false +1228:0020 EXTERNAL GETCURRENTTASK Function DEFAULT true false +1228:0024 EXTERNAL GETMODULEHANDLE Function DEFAULT true false +1228:0028 EXTERNAL GETMODULEFILENAME Function DEFAULT true false +1228:002c EXTERNAL GETPROCADDRESS Function DEFAULT true false +1228:0030 EXTERNAL MAKEPROCINSTANCE Function DEFAULT true false +1228:0034 EXTERNAL FREEPROCINSTANCE Function DEFAULT true false +1228:0038 EXTERNAL FINDRESOURCE Function DEFAULT true false +1228:003c EXTERNAL LOADRESOURCE Function DEFAULT true false +1228:0040 EXTERNAL LOCKRESOURCE Function DEFAULT true false +1228:0044 EXTERNAL FREERESOURCE Function DEFAULT true false +1228:0048 EXTERNAL _LCLOSE Function DEFAULT true false +1228:004c EXTERNAL _LREAD Function DEFAULT true false +1228:0050 EXTERNAL _LCREAT Function DEFAULT true false +1228:0054 EXTERNAL _LOPEN Function DEFAULT true false +1228:0058 EXTERNAL _LWRITE Function DEFAULT true false +1228:005c EXTERNAL INITTASK Function DEFAULT true false +1228:0060 EXTERNAL LOADLIBRARY Function DEFAULT true false +1228:0064 EXTERNAL FREELIBRARY Function DEFAULT true false +1228:0068 EXTERNAL SETERRORMODE Function DEFAULT true false +1228:006c EXTERNAL __AHINCR Function DEFAULT true false +1228:0070 EXTERNAL GETPRIVATEPROFILEINT Function DEFAULT true false +1228:0074 EXTERNAL GETDOSENVIRONMENT Function DEFAULT true false +1228:0078 EXTERNAL GETWINFLAGS Function DEFAULT true false +1228:007c EXTERNAL GETWINDOWSDIRECTORY Function DEFAULT true false +1228:0080 EXTERNAL GETSYSTEMDIRECTORY Function DEFAULT true false +1228:0084 EXTERNAL GETFREESPACE Function DEFAULT true false +1228:0088 EXTERNAL ALLOCCSTODSALIAS Function DEFAULT true false +1228:008c EXTERNAL FREESELECTOR Function DEFAULT true false +1228:0090 EXTERNAL PRESTOCHANGOSELECTOR Function DEFAULT true false +1228:0094 EXTERNAL SYSTEMTIMERMAKE Function DEFAULT true false +1228:0098 EXTERNAL SNDPLAYSOUND Function DEFAULT true false +1228:009c EXTERNAL WAVEOUTGETNUMDEVS Function DEFAULT true false +1228:00a0 EXTERNAL WAVEOUTGETDEVCAPS Function DEFAULT true false +1228:00a4 EXTERNAL WAVEOUTGETVOLUME Function DEFAULT true false +1228:00a8 EXTERNAL TIMEKILLEVENT Function DEFAULT true false +1228:00ac EXTERNAL GETVERSION Function DEFAULT true false +1228:00b0 EXTERNAL GLOBALALLOC Function DEFAULT true false +1228:00b4 EXTERNAL GLOBALFREE Function DEFAULT true false +1228:00b8 EXTERNAL GLOBALLOCK Function DEFAULT true false +1228:00bc EXTERNAL GLOBALUNLOCK Function DEFAULT true false +1228:00c0 EXTERNAL GLOBALHANDLE Function DEFAULT true false +1228:00c4 EXTERNAL GLOBALCOMPACT Function DEFAULT true false +1228:00c8 EXTERNAL WAITEVENT Function DEFAULT true false +1228:00cc EXTERNAL GETCURRENTTASK Function DEFAULT true false +1228:00d0 EXTERNAL GETMODULEHANDLE Function DEFAULT true false +1228:00d4 EXTERNAL GETMODULEFILENAME Function DEFAULT true false +1228:00d8 EXTERNAL GETPROCADDRESS Function DEFAULT true false +1228:00dc EXTERNAL MAKEPROCINSTANCE Function DEFAULT true false +1228:00e0 EXTERNAL FREEPROCINSTANCE Function DEFAULT true false +1228:00e4 EXTERNAL FINDRESOURCE Function DEFAULT true false +1228:00e8 EXTERNAL LOADRESOURCE Function DEFAULT true false +1228:00ec EXTERNAL LOCKRESOURCE Function DEFAULT true false +1228:00f0 EXTERNAL FREERESOURCE Function DEFAULT true false +1228:00f4 EXTERNAL _LCLOSE Function DEFAULT true false +1228:00f8 EXTERNAL _LREAD Function DEFAULT true false +1228:00fc EXTERNAL _LCREAT Function DEFAULT true false +1228:0100 EXTERNAL _LOPEN Function DEFAULT true false +1228:0104 EXTERNAL _LWRITE Function DEFAULT true false +1228:0108 EXTERNAL INITTASK Function DEFAULT true false +1228:010c EXTERNAL LOADLIBRARY Function DEFAULT true false +1228:0110 EXTERNAL FREELIBRARY Function DEFAULT true false +1228:0114 EXTERNAL SETERRORMODE Function DEFAULT true false +1228:0118 EXTERNAL __AHINCR Function DEFAULT true false +1228:011c EXTERNAL GETPRIVATEPROFILEINT Function DEFAULT true false +1228:0120 EXTERNAL GETDOSENVIRONMENT Function DEFAULT true false +1228:0124 EXTERNAL GETWINFLAGS Function DEFAULT true false +1228:0128 EXTERNAL GETWINDOWSDIRECTORY Function DEFAULT true false +1228:012c EXTERNAL GETSYSTEMDIRECTORY Function DEFAULT true false +1228:0130 EXTERNAL GETFREESPACE Function DEFAULT true false +1228:0134 EXTERNAL ALLOCCSTODSALIAS Function DEFAULT true false +1228:0138 EXTERNAL FREESELECTOR Function DEFAULT true false +1228:013c EXTERNAL PRESTOCHANGOSELECTOR Function DEFAULT true false +1228:0140 EXTERNAL SETBKCOLOR Function DEFAULT true false +1228:0144 EXTERNAL SETBKMODE Function DEFAULT true false +1228:0148 EXTERNAL SETTEXTCOLOR Function DEFAULT true false +1228:014c EXTERNAL TEXTOUT Function DEFAULT true false +1228:0150 EXTERNAL BITBLT Function DEFAULT true false +1228:0154 EXTERNAL SELECTOBJECT Function DEFAULT true false +1228:0158 EXTERNAL CREATECOMPATIBLEBITMAP Function DEFAULT true false +1228:015c EXTERNAL CREATECOMPATIBLEDC Function DEFAULT true false +1228:0160 EXTERNAL CREATEDC Function DEFAULT true false +1228:0164 EXTERNAL DELETEDC Function DEFAULT true false +1228:0168 EXTERNAL DELETEOBJECT Function DEFAULT true false +1228:016c EXTERNAL GETSTOCKOBJECT Function DEFAULT true false +1228:0170 EXTERNAL GETTEXTCOLOR Function DEFAULT true false +1228:0174 EXTERNAL GETTEXTMETRICS Function DEFAULT true false +1228:0178 EXTERNAL UNREALIZEOBJECT Function DEFAULT true false +1228:017c EXTERNAL SETTEXTALIGN Function DEFAULT true false +1228:0180 EXTERNAL CREATEPALETTE Function DEFAULT true false +1228:0184 EXTERNAL UPDATECOLORS Function DEFAULT true false +1228:0188 EXTERNAL CREATEDIBITMAP Function DEFAULT true false +1228:018c EXTERNAL MESSAGEBOX Function DEFAULT true false +1228:0190 EXTERNAL INITAPP Function DEFAULT true false +1228:0194 EXTERNAL POSTQUITMESSAGE Function DEFAULT true false +1228:0198 EXTERNAL GETTICKCOUNT Function DEFAULT true false +1228:019c EXTERNAL SETCAPTURE Function DEFAULT true false +1228:01a0 EXTERNAL RELEASECAPTURE Function DEFAULT true false +1228:01a4 EXTERNAL SETFOCUS Function DEFAULT true false +1228:01a8 EXTERNAL GETFOCUS Function DEFAULT true false +1228:01ac EXTERNAL REMOVEPROP Function DEFAULT true false +1228:01b0 EXTERNAL GETPROP Function DEFAULT true false +1228:01b4 EXTERNAL SETPROP Function DEFAULT true false +1228:01b8 EXTERNAL SCREENTOCLIENT Function DEFAULT true false +1228:01bc EXTERNAL ISICONIC Function DEFAULT true false +1228:01c0 EXTERNAL GETWINDOWRECT Function DEFAULT true false +1228:01c4 EXTERNAL GETCLIENTRECT Function DEFAULT true false +1228:01c8 EXTERNAL GETWINDOWTEXT Function DEFAULT true false +1228:01cc EXTERNAL SETWINDOWTEXT Function DEFAULT true false +1228:01d0 EXTERNAL BEGINPAINT Function DEFAULT true false +1228:01d4 EXTERNAL ENDPAINT Function DEFAULT true false +1228:01d8 EXTERNAL CREATEWINDOW Function DEFAULT true false +1228:01dc EXTERNAL SHOWWINDOW Function DEFAULT true false +1228:01e0 EXTERNAL GETPARENT Function DEFAULT true false +1228:01e4 EXTERNAL ISWINDOW Function DEFAULT true false +1228:01e8 EXTERNAL ISCHILD Function DEFAULT true false +1228:01ec EXTERNAL DESTROYWINDOW Function DEFAULT true false +1228:01f0 EXTERNAL REGISTERCLASS Function DEFAULT true false +1228:01f4 EXTERNAL SCROLLWINDOW Function DEFAULT true false +1228:01f8 EXTERNAL SETSCROLLPOS Function DEFAULT true false +1228:01fc EXTERNAL SETSCROLLRANGE Function DEFAULT true false +1228:0200 EXTERNAL GETDC Function DEFAULT true false +1228:0204 EXTERNAL RELEASEDC Function DEFAULT true false +1228:0208 EXTERNAL SETCURSOR Function DEFAULT true false +1228:020c EXTERNAL ENDDIALOG Function DEFAULT true false +1228:0210 EXTERNAL ISDIALOGMESSAGE Function DEFAULT true false +1228:0214 EXTERNAL GETDLGITEM Function DEFAULT true false +1228:0218 EXTERNAL SETDLGITEMTEXT Function DEFAULT true false +1228:021c EXTERNAL GETDLGITEMTEXT Function DEFAULT true false +1228:0220 EXTERNAL SENDDLGITEMMESSAGE Function DEFAULT true false +1228:0224 EXTERNAL MESSAGEBEEP Function DEFAULT true false +1228:0228 EXTERNAL GETKEYSTATE Function DEFAULT true false +1228:022c EXTERNAL DEFWINDOWPROC Function DEFAULT true false +1228:0230 EXTERNAL GETMESSAGE Function DEFAULT true false +1228:0234 EXTERNAL PEEKMESSAGE Function DEFAULT true false +1228:0238 EXTERNAL SENDMESSAGE Function DEFAULT true false +1228:023c EXTERNAL WAITMESSAGE Function DEFAULT true false +1228:0240 EXTERNAL TRANSLATEMESSAGE Function DEFAULT true false +1228:0244 EXTERNAL DISPATCHMESSAGE Function DEFAULT true false +1228:0248 EXTERNAL CALLWINDOWPROC Function DEFAULT true false +1228:024c EXTERNAL UPDATEWINDOW Function DEFAULT true false +1228:0250 EXTERNAL INVALIDATERECT Function DEFAULT true false +1228:0254 EXTERNAL GETWINDOWWORD Function DEFAULT true false +1228:0258 EXTERNAL GETWINDOWLONG Function DEFAULT true false +1228:025c EXTERNAL SETWINDOWLONG Function DEFAULT true false +1228:0260 EXTERNAL ENABLEMENUITEM Function DEFAULT true false +1228:0264 EXTERNAL GETSYSTEMMENU Function DEFAULT true false +1228:0268 EXTERNAL CREATECARET Function DEFAULT true false +1228:026c EXTERNAL DESTROYCARET Function DEFAULT true false +1228:0270 EXTERNAL SETCARETPOS Function DEFAULT true false +1228:0274 EXTERNAL SHOWCARET Function DEFAULT true false +1228:0278 EXTERNAL LOADCURSOR Function DEFAULT true false +1228:027c EXTERNAL LOADICON Function DEFAULT true false +1228:0280 EXTERNAL LOADBITMAP Function DEFAULT true false +1228:0284 EXTERNAL TRANSLATEACCELERATOR Function DEFAULT true false +1228:0288 EXTERNAL GETSYSTEMMETRICS Function DEFAULT true false +1228:028c EXTERNAL GETSYSCOLOR Function DEFAULT true false +1228:0290 EXTERNAL DIALOGBOXPARAM Function DEFAULT true false +1228:0294 EXTERNAL CREATEDIALOGPARAM Function DEFAULT true false +1228:0298 EXTERNAL ISZOOMED Function DEFAULT true false +1228:029c EXTERNAL SELECTPALETTE Function DEFAULT true false +1228:02a0 EXTERNAL REALIZEPALETTE Function DEFAULT true false +1228:02a4 EXTERNAL DEFDLGPROC Function DEFAULT true false +1228:02a8 EXTERNAL GETCLASSINFO Function DEFAULT true false +1228:02ac EXTERNAL WVSPRINTF Function DEFAULT true false +1228:02b0 EXTERNAL DEFMDICHILDPROC Function DEFAULT true false +1228:02b4 EXTERNAL TRANSLATEMDISYSACCEL Function DEFAULT true false +1228:02b8 EXTERNAL CREATEWINDOWEX Function DEFAULT true false +1228:02bc EXTERNAL Ordinal_5 Function DEFAULT true false +1228:02c0 EXTERNAL Ordinal_6 Function DEFAULT true false +1228:02c4 EXTERNAL GETVERSION Function DEFAULT true false +1228:02c8 EXTERNAL GLOBALALLOC Function DEFAULT true false +1228:02cc EXTERNAL GLOBALFREE Function DEFAULT true false +1228:02d0 EXTERNAL GLOBALLOCK Function DEFAULT true false +1228:02d4 EXTERNAL GLOBALUNLOCK Function DEFAULT true false +1228:02d8 EXTERNAL GLOBALHANDLE Function DEFAULT true false +1228:02dc EXTERNAL GLOBALCOMPACT Function DEFAULT true false +1228:02e0 EXTERNAL WAITEVENT Function DEFAULT true false +1228:02e4 EXTERNAL GETCURRENTTASK Function DEFAULT true false +1228:02e8 EXTERNAL GETMODULEHANDLE Function DEFAULT true false +1228:02ec EXTERNAL GETMODULEFILENAME Function DEFAULT true false +1228:02f0 EXTERNAL GETPROCADDRESS Function DEFAULT true false +1228:02f4 EXTERNAL MAKEPROCINSTANCE Function DEFAULT true false +1228:02f8 EXTERNAL FREEPROCINSTANCE Function DEFAULT true false +1228:02fc EXTERNAL FINDRESOURCE Function DEFAULT true false +1228:0300 EXTERNAL LOADRESOURCE Function DEFAULT true false +1228:0304 EXTERNAL LOCKRESOURCE Function DEFAULT true false +1228:0308 EXTERNAL FREERESOURCE Function DEFAULT true false +1228:030c EXTERNAL _LCLOSE Function DEFAULT true false +1228:0310 EXTERNAL _LREAD Function DEFAULT true false +1228:0314 EXTERNAL _LCREAT Function DEFAULT true false +1228:0318 EXTERNAL _LOPEN Function DEFAULT true false +1228:031c EXTERNAL _LWRITE Function DEFAULT true false +1228:0320 EXTERNAL INITTASK Function DEFAULT true false +1228:0324 EXTERNAL LOADLIBRARY Function DEFAULT true false +1228:0328 EXTERNAL FREELIBRARY Function DEFAULT true false +1228:032c EXTERNAL SETERRORMODE Function DEFAULT true false +1228:0330 EXTERNAL __AHINCR Function DEFAULT true false +1228:0334 EXTERNAL GETPRIVATEPROFILEINT Function DEFAULT true false +1228:0338 EXTERNAL GETDOSENVIRONMENT Function DEFAULT true false +1228:033c EXTERNAL GETWINFLAGS Function DEFAULT true false +1228:0340 EXTERNAL GETWINDOWSDIRECTORY Function DEFAULT true false +1228:0344 EXTERNAL GETSYSTEMDIRECTORY Function DEFAULT true false +1228:0348 EXTERNAL GETFREESPACE Function DEFAULT true false +1228:034c EXTERNAL ALLOCCSTODSALIAS Function DEFAULT true false +1228:0350 EXTERNAL FREESELECTOR Function DEFAULT true false +1228:0354 EXTERNAL PRESTOCHANGOSELECTOR Function DEFAULT true false +1228:0358 EXTERNAL MESSAGEBOX Function DEFAULT true false +1228:035c EXTERNAL INITAPP Function DEFAULT true false +1228:0360 EXTERNAL POSTQUITMESSAGE Function DEFAULT true false +1228:0364 EXTERNAL GETTICKCOUNT Function DEFAULT true false +1228:0368 EXTERNAL SETCAPTURE Function DEFAULT true false +1228:036c EXTERNAL RELEASECAPTURE Function DEFAULT true false +1228:0370 EXTERNAL SETFOCUS Function DEFAULT true false +1228:0374 EXTERNAL GETFOCUS Function DEFAULT true false +1228:0378 EXTERNAL REMOVEPROP Function DEFAULT true false +1228:037c EXTERNAL GETPROP Function DEFAULT true false +1228:0380 EXTERNAL SETPROP Function DEFAULT true false +1228:0384 EXTERNAL SCREENTOCLIENT Function DEFAULT true false +1228:0388 EXTERNAL ISICONIC Function DEFAULT true false +1228:038c EXTERNAL GETWINDOWRECT Function DEFAULT true false +1228:0390 EXTERNAL GETCLIENTRECT Function DEFAULT true false +1228:0394 EXTERNAL GETWINDOWTEXT Function DEFAULT true false +1228:0398 EXTERNAL SETWINDOWTEXT Function DEFAULT true false +1228:039c EXTERNAL BEGINPAINT Function DEFAULT true false +1228:03a0 EXTERNAL ENDPAINT Function DEFAULT true false +1228:03a4 EXTERNAL CREATEWINDOW Function DEFAULT true false +1228:03a8 EXTERNAL SHOWWINDOW Function DEFAULT true false +1228:03ac EXTERNAL GETPARENT Function DEFAULT true false +1228:03b0 EXTERNAL ISWINDOW Function DEFAULT true false +1228:03b4 EXTERNAL ISCHILD Function DEFAULT true false +1228:03b8 EXTERNAL DESTROYWINDOW Function DEFAULT true false +1228:03bc EXTERNAL REGISTERCLASS Function DEFAULT true false +1228:03c0 EXTERNAL SCROLLWINDOW Function DEFAULT true false +1228:03c4 EXTERNAL SETSCROLLPOS Function DEFAULT true false +1228:03c8 EXTERNAL SETSCROLLRANGE Function DEFAULT true false +1228:03cc EXTERNAL GETDC Function DEFAULT true false +1228:03d0 EXTERNAL RELEASEDC Function DEFAULT true false +1228:03d4 EXTERNAL SETCURSOR Function DEFAULT true false +1228:03d8 EXTERNAL ENDDIALOG Function DEFAULT true false +1228:03dc EXTERNAL ISDIALOGMESSAGE Function DEFAULT true false +1228:03e0 EXTERNAL GETDLGITEM Function DEFAULT true false +1228:03e4 EXTERNAL SETDLGITEMTEXT Function DEFAULT true false +1228:03e8 EXTERNAL GETDLGITEMTEXT Function DEFAULT true false +1228:03ec EXTERNAL SENDDLGITEMMESSAGE Function DEFAULT true false +1228:03f0 EXTERNAL MESSAGEBEEP Function DEFAULT true false +1228:03f4 EXTERNAL GETKEYSTATE Function DEFAULT true false +1228:03f8 EXTERNAL DEFWINDOWPROC Function DEFAULT true false +1228:03fc EXTERNAL GETMESSAGE Function DEFAULT true false +1228:0400 EXTERNAL PEEKMESSAGE Function DEFAULT true false +1228:0404 EXTERNAL SENDMESSAGE Function DEFAULT true false +1228:0408 EXTERNAL WAITMESSAGE Function DEFAULT true false +1228:040c EXTERNAL TRANSLATEMESSAGE Function DEFAULT true false +1228:0410 EXTERNAL DISPATCHMESSAGE Function DEFAULT true false +1228:0414 EXTERNAL CALLWINDOWPROC Function DEFAULT true false +1228:0418 EXTERNAL UPDATEWINDOW Function DEFAULT true false +1228:041c EXTERNAL INVALIDATERECT Function DEFAULT true false +1228:0420 EXTERNAL GETWINDOWWORD Function DEFAULT true false +1228:0424 EXTERNAL GETWINDOWLONG Function DEFAULT true false +1228:0428 EXTERNAL SETWINDOWLONG Function DEFAULT true false +1228:042c EXTERNAL ENABLEMENUITEM Function DEFAULT true false +1228:0430 EXTERNAL GETSYSTEMMENU Function DEFAULT true false +1228:0434 EXTERNAL CREATECARET Function DEFAULT true false +1228:0438 EXTERNAL DESTROYCARET Function DEFAULT true false +1228:043c EXTERNAL SETCARETPOS Function DEFAULT true false +1228:0440 EXTERNAL SHOWCARET Function DEFAULT true false +1228:0444 EXTERNAL LOADCURSOR Function DEFAULT true false +1228:0448 EXTERNAL LOADICON Function DEFAULT true false +1228:044c EXTERNAL LOADBITMAP Function DEFAULT true false +1228:0450 EXTERNAL TRANSLATEACCELERATOR Function DEFAULT true false +1228:0454 EXTERNAL GETSYSTEMMETRICS Function DEFAULT true false +1228:0458 EXTERNAL GETSYSCOLOR Function DEFAULT true false +1228:045c EXTERNAL DIALOGBOXPARAM Function DEFAULT true false +1228:0460 EXTERNAL CREATEDIALOGPARAM Function DEFAULT true false +1228:0464 EXTERNAL ISZOOMED Function DEFAULT true false +1228:0468 EXTERNAL SELECTPALETTE Function DEFAULT true false +1228:046c EXTERNAL REALIZEPALETTE Function DEFAULT true false +1228:0470 EXTERNAL DEFDLGPROC Function DEFAULT true false +1228:0474 EXTERNAL GETCLASSINFO Function DEFAULT true false +1228:0478 EXTERNAL WVSPRINTF Function DEFAULT true false +1228:047c EXTERNAL DEFMDICHILDPROC Function DEFAULT true false +1228:0480 EXTERNAL TRANSLATEMDISYSACCEL Function DEFAULT true false +1228:0484 EXTERNAL CREATEWINDOWEX Function DEFAULT true false +1228:0488 EXTERNAL Ordinal_5 Function DEFAULT true false +1228:048c EXTERNAL Ordinal_6 Function DEFAULT true false diff --git a/original/TDKPIN_GHIDRA_COMPLETE_RAW.c b/original/TDKPIN_GHIDRA_COMPLETE_RAW.c new file mode 100644 index 0000000..fba32d2 --- /dev/null +++ b/original/TDKPIN_GHIDRA_COMPLETE_RAW.c @@ -0,0 +1,16661 @@ +/* + * Raw Ghidra decompilation of TDKPIN.EXE. + * Function boundaries and names are analysis artifacts, not original source symbols. + */ + +/* ===== 1000:0002 FUN_1000_0002 ===== */ + +void __stdcall16far FUN_1000_0002(int param_1,undefined2 param_2) + +{ + undefined2 uVar1; + undefined2 uVar2; + undefined2 uVar3; + undefined2 uVar4; + undefined2 uVar5; + undefined2 uVar6; + undefined2 uVar7; + undefined2 uVar8; + undefined2 uVar9; + + uVar6 = param_2; + uVar1 = CREATECOMPATIBLEDC(); + uVar2 = CREATECOMPATIBLEDC(0x1228,param_2,uVar6); + uVar3 = CREATECOMPATIBLEDC(0x1228,param_2); + uVar4 = CREATECOMPATIBLEBITMAP(0x1228,0xe,0xe); + uVar5 = SELECTOBJECT(0x1228,DAT_1028_085b); + uVar6 = SELECTOBJECT(0x1228,*(undefined2 *)(param_1 * 2 + 0x430b)); + uVar7 = SELECTOBJECT(0x1228,uVar4); + BITBLT(0x1228,0x20,0xcc,0x4d,0x54,uVar1,0xe,0xe,0,0); + BITBLT(0x1228,0x20,0xcc,0,0,uVar2,0x7b,0x2a,0x4f,0x37); + uVar9 = uVar1; + BITBLT(0x1228,0x20,0xcc,0,0,uVar3,0xe,0xe,0x4d,0x54); + uVar8 = uVar3; + SELECTOBJECT(0x1228,uVar7); + uVar7 = uVar2; + SELECTOBJECT(0x1228,uVar6); + uVar6 = uVar1; + SELECTOBJECT(0x1228,uVar5); + DELETEOBJECT(0x1228,uVar4,uVar6,uVar7,uVar8,uVar9); + DELETEDC(0x1228,uVar3); + DELETEDC(0x1228,uVar2); + DELETEDC(0x1228,uVar1); + return; +} + + +/* ===== 1000:0100 FUN_1000_0100 ===== */ + +void __stdcall16far FUN_1000_0100(undefined4 param_1) + +{ + FUN_1018_1b57((int)param_1,(int)((ulong)param_1 >> 0x10)); + FUN_1010_03af(1,1,1,0x222,0x1028); + return; +} + + +/* ===== 1000:0121 FUN_1000_0121 ===== */ + +void __stdcall16far FUN_1000_0121(undefined4 param_1) + +{ + undefined2 uVar1; + undefined4 uVar2; + + if (DAT_1028_06fc == 0) { + uVar2 = FUN_1000_01d3(0,0,0x9e,0x22c,0x1028,0,0); + uVar1 = (undefined2)((ulong)param_1 >> 0x10); + *(undefined2 *)((int)param_1 + 8) = (int)uVar2; + *(undefined2 *)((int)param_1 + 10) = (int)((ulong)uVar2 >> 0x10); + } + else { + (*DAT_1028_0666)(); + FUN_1020_0061(); + } + return; +} + + +/* ===== 1000:016c FUN_1000_016c ===== */ + +void __stdcall16far FUN_1000_016c(undefined4 param_1,undefined2 *param_2) + +{ + undefined2 uVar1; + undefined2 uVar2; + undefined2 *puVar3; + undefined2 uVar4; + undefined2 uVar5; + + uVar4 = (undefined2)((ulong)param_2 >> 0x10); + puVar3 = (undefined2 *)param_2; + FUN_1018_1274((int)param_1,(int)((ulong)param_1 >> 0x10),puVar3,uVar4); + *param_2 = 0x3000; + uVar2 = DAT_1028_06fe; + uVar1 = LOADICON(0x1018,0x3e4,0); + puVar3[6] = uVar1; + uVar5 = 0; + uVar1 = LOADCURSOR(0x1228,0x7f00,0); + puVar3[7] = uVar1; + uVar2 = GETSTOCKOBJECT(0x1228,0,uVar5,uVar2); + puVar3[8] = uVar2; + puVar3[5] = DAT_1028_06fe; + puVar3[3] = 0; + puVar3[4] = 0; + return; +} + + +/* ===== 1000:01d3 FUN_1000_01d3 ===== */ + +undefined4 __stdcall16far +FUN_1000_01d3(undefined4 param_1,undefined2 param_2,undefined2 param_3,undefined2 param_4, + undefined2 param_5,undefined2 param_6) + +{ + int iVar1; + int iVar2; + undefined2 uVar3; + bool bVar4; + int iVar5; + + bVar4 = true; + FUN_1020_03ef(); + if (!bVar4) { + uVar3 = (undefined2)((ulong)param_1 >> 0x10); + iVar2 = (int)param_1; + FUN_1018_1106(iVar2,uVar3,0,param_3,param_4,param_5,param_6); + *(undefined2 *)(iVar2 + 0x2d) = 0x280; + *(undefined2 *)(iVar2 + 0x2f) = 0x1e0; + iVar5 = 0x1018; + iVar1 = GETSYSTEMMETRICS(0x1018,0,*(int *)(iVar2 + 0x2d) / 2); + *(int *)(iVar2 + 0x29) = iVar1 / 2 - iVar5; + iVar5 = 0x1228; + iVar1 = GETSYSTEMMETRICS(0x1228,1,*(int *)(iVar2 + 0x2f) / 2); + *(int *)(iVar2 + 0x2b) = iVar1 / 2 - iVar5; + *(undefined2 *)(iVar2 + 0x21) = 0; + *(undefined2 *)(iVar2 + 0x23) = 0x86ca; + } + return param_1; +} + + +/* ===== 1000:0270 FUN_1000_0270 ===== */ + +void __stdcall16far FUN_1000_0270(undefined4 param_1) + +{ + char cVar1; + undefined1 uVar2; + undefined2 uVar3; + int in_DX; + int iVar4; + int iVar5; + undefined2 uVar6; + undefined2 unaff_SS; + undefined4 uVar7; + undefined1 *puVar8; + undefined2 uVar9; + undefined2 uVar10; + undefined1 *puVar11; + undefined1 *puVar12; + undefined2 uVar13; + undefined2 uVar14; + undefined1 local_2d2 [256]; + undefined2 local_1d2; + undefined1 local_d0 [101]; + undefined1 local_6b [103]; + int local_4; + + DAT_1028_07cf = 0; + DAT_1028_0874 = 0; + DAT_1028_0875 = 0; + uVar6 = (undefined2)((ulong)param_1 >> 0x10); + iVar5 = (int)param_1; + *(undefined2 *)(iVar5 + 0x41) = 0; + *(undefined2 *)(iVar5 + 0x43) = 0; + *(undefined2 *)(iVar5 + 0x45) = 0; + *(undefined2 *)(iVar5 + 0x47) = 0; + FUN_1020_0167(); + if (in_DX < 0x40) { + (*DAT_1028_0666)(0x1020,0x2010,0x2aa,0x1028,0x260,0x1028,0); + FUN_1018_0f38(iVar5,uVar6); + FUN_1020_0061(0x1018); + } + FUN_1018_170c(iVar5,uVar6); + uVar14 = 0; + uVar3 = LOADCURSOR(0x1018,0x7f02,0); + SETCURSOR(0x1228,uVar3,uVar14); + FUN_1008_0023(*(undefined2 *)(iVar5 + 4)); + FUN_1008_1326(0x4450,0x1028,999,0,DAT_1028_06fe); + FUN_1008_11c5(); + DAT_1028_07cc = 1; + *(undefined2 *)(iVar5 + 0x4d) = 0; + *(undefined2 *)(iVar5 + 0x4f) = 0; + *(undefined1 *)(iVar5 + 0x51) = 0; + *(undefined1 *)(iVar5 + 0xbd8) = 0; + uVar7 = GETTICKCOUNT(0x1008); + DAT_1028_0722 = (undefined2)((ulong)uVar7 >> 0x10); + DAT_1028_0720 = (undefined2)uVar7; + *(undefined2 *)(iVar5 + 0xbe3) = 0; + DAT_1028_07c7 = 0; + DAT_1028_07c8 = 0; + DAT_1028_086d = 10; + DAT_1028_086f = 10; + DAT_1028_0873 = 0; + DAT_1028_07ca = 0; + DAT_1028_07cb = 0; + DAT_1028_07c9 = 1; + *(undefined2 *)(iVar5 + 0xbca) = 0; + *(undefined2 *)(iVar5 + 0xbcc) = 0; + *(undefined1 *)(iVar5 + 0xbd9) = 0; + *(undefined2 *)(iVar5 + 0xbc2) = 0xf588; + *(undefined2 *)(iVar5 + 0xbc4) = 4; + *(undefined2 *)(iVar5 + 0xbc6) = 0x4d48; + *(undefined2 *)(iVar5 + 0xbc8) = 6; + DAT_1028_07d3 = *(uint *)(iVar5 + 0xbc2); + DAT_1028_07d5 = *(int *)(iVar5 + 0xbc4); + DAT_1028_07d7 = *(uint *)(iVar5 + 0xbc6); + DAT_1028_07d9 = *(int *)(iVar5 + 0xbc8); + *(undefined1 *)(iVar5 + 0xbdd) = 0; + *(undefined1 *)(iVar5 + 0xbdf) = 0; + *(undefined1 *)(iVar5 + 0xbdc) = 0; + *(undefined1 *)(iVar5 + 0xbe0) = 0; + *(undefined1 *)(iVar5 + 0xbe1) = 0; + *(undefined1 *)(iVar5 + 0xbe2) = 0; + DAT_1028_07c5 = 0; + *(undefined1 *)(iVar5 + 0xbde) = 1; + DAT_1028_07d0 = 0; + DAT_1028_07d1 = 0; + *(undefined1 *)(iVar5 + 0x61) = 1; + DAT_1028_086b = 99; + DAT_1028_0869 = 0; + DAT_1028_0876 = 0; + DAT_1028_0878 = 0; + DAT_1028_087a = 0; + DAT_1028_087c = 0; + local_4 = 1; + while( true ) { + *(undefined1 *)(iVar5 + local_4 + 0x47b) = 0; + *(undefined1 *)(iVar5 + local_4 + 0x48f) = 0; + *(undefined1 *)(iVar5 + local_4 + 0x4a3) = 0; + *(undefined1 *)(iVar5 + local_4 + 0x4b7) = 0; + if (local_4 == 0x14) break; + local_4 = local_4 + 1; + } + local_4 = 1; + while( true ) { + *(undefined2 *)(local_4 * 4 + 0x97e) = 0; + *(undefined2 *)(local_4 * 4 + 0x980) = 0; + *(undefined2 *)(local_4 * 4 + 0x98e) = 0; + *(undefined2 *)(local_4 * 4 + 0x990) = 0; + *(undefined1 *)(local_4 + 0x9a1) = 1; + *(undefined2 *)(local_4 * 2 + 0x9a4) = 0; + *(undefined2 *)(local_4 * 2 + 0x81f) = 0xffff; + *(undefined1 *)(local_4 + 0x816) = 1; + *(undefined2 *)(local_4 * 4 + 0x835) = 1; + *(undefined2 *)(local_4 * 4 + 0x837) = 0; + *(undefined1 *)(local_4 + 0x81a) = 1; + if (local_4 == 4) break; + local_4 = local_4 + 1; + } + DAT_1028_0829 = 0x22e0; + DAT_1028_082b = 2; + DAT_1028_082d = 0xeb10; + DAT_1028_082f = 9; + DAT_1028_0831 = 0xd620; + DAT_1028_0833 = 0x13; + DAT_1028_0835 = 0x900; + DAT_1028_0837 = 0x3d; + *(undefined2 *)(iVar5 + 0xbaa) = 0; + *(undefined2 *)(iVar5 + 0xbac) = 0; + *(undefined2 *)(iVar5 + 0xbae) = 0; + *(undefined2 *)(iVar5 + 0xbb0) = 0; + *(undefined2 *)(iVar5 + 0xbce) = 0; + *(undefined2 *)(iVar5 + 0xbd0) = 0; + *(undefined2 *)(iVar5 + 0xbd2) = 0; + iVar4 = DAT_1028_07d5 + (uint)(0xfe0b < DAT_1028_07d3); + uVar3 = FUN_1020_08e6(); + *(undefined2 *)(iVar5 + 0xba2) = uVar3; + *(int *)(iVar5 + 0xba4) = iVar4; + *(undefined2 *)(iVar5 + 0xbb2) = 0; + *(undefined2 *)(iVar5 + 0xbb4) = 0; + iVar4 = DAT_1028_07d9 + (uint)(0xfe0b < DAT_1028_07d7); + uVar3 = FUN_1020_08e6(); + *(undefined2 *)(iVar5 + 0xba6) = uVar3; + *(int *)(iVar5 + 0xba8) = iVar4; + *(undefined2 *)(iVar5 + 0xbb6) = 0; + *(undefined2 *)(iVar5 + 3000) = 0; + *(undefined1 *)(iVar5 + 0xbda) = 0; + *(undefined1 *)(iVar5 + 0xbdb) = 0; + *(undefined2 *)(iVar5 + 0xbd4) = 0; + *(undefined2 *)(iVar5 + 0xbd6) = 0; + puVar12 = local_6b; + puVar11 = local_2d2; + uVar3 = unaff_SS; + uVar14 = unaff_SS; + FUN_1020_082e(0); + FUN_1008_2f2f(puVar11,uVar3,puVar12,uVar14); + puVar11 = local_d0; + puVar12 = local_6b; + uVar10 = 0x1008; + uVar9 = 0x26e; + puVar8 = local_2d2; + uVar3 = unaff_SS; + uVar14 = unaff_SS; + uVar13 = unaff_SS; + FUN_1020_082e(0); + uVar3 = FUN_1020_0a7d(puVar8,uVar3,uVar9,uVar10); + FUN_1008_2f07(uVar3,puVar12,uVar14,puVar11,uVar13); + FUN_1008_2f4d(0x2c3,0x1028,local_d0,unaff_SS); + uVar3 = 0x1028; + DAT_1028_07cd = GETPRIVATEPROFILEINT(0x1008,local_d0,unaff_SS,1,0x2d0,0x1028,0x2c7); + if ((DAT_1028_07cd == 0) || (5 < DAT_1028_07cd)) { + DAT_1028_07cd = 1; + } + uVar14 = 0x1028; + uVar2 = GETPRIVATEPROFILEINT(0x1228,local_d0,unaff_SS,3,0x2d9,0x1028,0x2c7); + *(undefined1 *)(iVar5 + 0x60) = uVar2; + if ((*(char *)(iVar5 + 0x60) == '\0') || (5 < *(byte *)(iVar5 + 0x60))) { + *(undefined1 *)(iVar5 + 0x60) = 3; + } + cVar1 = *(char *)(iVar5 + 0x60); + if (cVar1 == '\x01') { + *(undefined2 *)(iVar5 + 0x5a) = 0xf; + *(undefined2 *)(iVar5 + 0x5c) = 0; + *(undefined2 *)(iVar5 + 0x56) = 0xed8; + *(undefined2 *)(iVar5 + 0x58) = 0; + local_1d2 = 0x32; + DAT_1028_0871 = 5; + } + else if (cVar1 == '\x02') { + *(undefined2 *)(iVar5 + 0x5a) = 0xf; + *(undefined2 *)(iVar5 + 0x5c) = 0; + *(undefined2 *)(iVar5 + 0x56) = 0xed8; + *(undefined2 *)(iVar5 + 0x58) = 0; + local_1d2 = 0x28; + DAT_1028_0871 = 4; + } + else if (cVar1 == '\x03') { + *(undefined2 *)(iVar5 + 0x5a) = 0xf; + *(undefined2 *)(iVar5 + 0x5c) = 0; + *(undefined2 *)(iVar5 + 0x56) = 0xed8; + *(undefined2 *)(iVar5 + 0x58) = 0; + local_1d2 = 0x1e; + DAT_1028_0871 = 3; + } + else if (cVar1 == '\x04') { + *(undefined2 *)(iVar5 + 0x5a) = 0xf; + *(undefined2 *)(iVar5 + 0x5c) = 0; + *(undefined2 *)(iVar5 + 0x56) = 0xed8; + *(undefined2 *)(iVar5 + 0x58) = 0; + local_1d2 = 0x14; + DAT_1028_0871 = 2; + } + else if (cVar1 == '\x05') { + *(undefined2 *)(iVar5 + 0x5a) = 0xf; + *(undefined2 *)(iVar5 + 0x5c) = 0; + *(undefined2 *)(iVar5 + 0x56) = 0xed8; + *(undefined2 *)(iVar5 + 0x58) = 0; + local_1d2 = 10; + DAT_1028_0871 = 1; + } + else { + *(undefined2 *)(iVar5 + 0x5a) = 0xf; + *(undefined2 *)(iVar5 + 0x5c) = 0; + *(undefined2 *)(iVar5 + 0x56) = 0xed8; + *(undefined2 *)(iVar5 + 0x58) = 0; + local_1d2 = 0x1e; + DAT_1028_0871 = 3; + } + uVar7 = FUN_1008_28a3(0,0,0x5c0,0,1,local_1d2,*(undefined2 *)(iVar5 + 4)); + *(undefined2 *)(iVar5 + 0x49) = (int)uVar7; + *(undefined2 *)(iVar5 + 0x4b) = (int)((ulong)uVar7 >> 0x10); + if (*(int *)(iVar5 + 0x49) == 0 && *(int *)(iVar5 + 0x4b) == 0) { + (*DAT_1028_0666)(0x1008,0x2010,0x2aa,0x1028,0x2df,0x1028,*(undefined2 *)(iVar5 + 4),uVar14,uVar3 + ); + FUN_1020_0061(0x1008); + } + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x1c9,0,0x7d,0,0x1a1,0,7,0,0,0,2,1,1); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x1db,0,300,0,0x1db,0,10,0,0,0,2,1,2); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0xcd7d,0xcccc,0x4ccc,0,0, + 0x1d8,0,0x78,0,0x1c4,0,0x78,0,0,0,2,1,0xa9); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0xcd7d,0xcccc,0x4ccc,0,0, + 0x1c4,0,0xc3,0,0x1d8,0,0xc3,0,0,0,2,1,0xaa); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0xcd7d,0xcccc,0x4ccc,0,0, + 0x1bd,0,0x86,0,0x1ce,0,0x86,0,0,0,2,1,3); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,8,0, + 0,0,0,0,0x1be,0,0x8d,0,0,1,1,1,4); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x1d3,0,0x94,0,0x1bd,0,0x94,0,0,0,2,1,5); + FUN_1008_0138(0x1b5,0xa3,0x185,0x97,0,0,0,0,2,0,0,6,0x102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x1d3,0,0xa4 + ,0,0x1be,0,0x94,0,0,0,4,0,6); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x1d2,0,0xa4,0,0x1bd,0,0xa5,0,0,0,2,1,7); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,8,0, + 0,0,0,0,0x1be,0,0xac,0,0,1,1,1,8); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0xcd7d,0xcccc,0x4ccc,0,0, + 0x1d3,0,0xb4,0,0x1bd,0,0xb3,0,0,0,2,1,9); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x19e,0,0x130,0,0x1c9,0,0xb7,0,0,0,2,1,10); + FUN_1008_0138(0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x3d,0,0x12a,0,0xa5,0,0x12a,0,0,0,2,1,0xb); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,5000,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0 + ,0,0x8e,0,0x12a,0,0x8e,0,0x136,0,0,0,2,1,0xc); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,7,0, + 0,0,0,0,0x88,0,0x12a,0,0,1,1,1,0xd); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x68,0,0x124,0,0x88,0,0x123,0,0,0,2,1,0xe); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0xcd7f,0xcccc,0x4ccc,0,0, + 100,0,0x119,0,0x6d,0,300,0,0,0,2,1,0xf); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0xcd7f,0xcccc,0x4ccc,0,0, + 0x87,0,0x113,0,0x60,0,0x122,0,0,0,2,1,0x10); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,7,0, + 0,0,0,0,0x86,0,0x10d,0,0,1,1,1,0x11); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,7,0, + 0,0,0,0,0x73,0,0x101,0,0,1,1,1,0x1a); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x72,0,0xf8,0,0x8b,0,0x108,0,0,0,2,1,0x12); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x5b,0,0x101,0,0x72,0,0xf9,0,0,0,2,1,0x13); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x31,0,0x115,0,0x5b,0,0x101,0,0,0,2,1,0x14); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x20,0,0x11f,0,0x33,0,0x115,0,0,0,2,1,0x15); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x30,0,0x12f,0,0x2a,0,0x11b,0,0,0,2,1,0x16); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x44,0,0x140,0,0x30,0,0x12e,0,0,0,2,1,0x17); + FUN_1008_0138(0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x1c9,0,0x140,0,0x44,0,0x140,0,0,0,2,1,0x18); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0xcd7d,0xcccc,0x4ccc,0,0, + 0x1b1,0,0x14c,0,0x1b1,0,0x13b,0,0,0,2,1,0x19); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7e,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x43,0,0x146,0,0x4e,0,0x148,0,0,0,2,1,0x1b); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7e,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x39,0,0x142,0,0x43,0,0x146,0,0,0,2,1,0x1c); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7e,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x30,0,0x13c,0,0x39,0,0x142,0,0,0,2,1,0x1d); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7e,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x29,0,0x133,0,0x30,0,0x13c,0,0,0,2,1,0x1e); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7e,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x24,0,0x128,0,0x29,0,0x133,0,0,0,2,1,0x1f); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7e,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x23,0,0x11d,0,0x24,0,0x128,0,0,0,2,1,0x20); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x23,0,0x70,0,0x23,0,0x11d,0,0,0,2,1,0x21); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x28,0,99,0,0x22,0,0x79,0,0,0,2,1,0x22); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x33,0,0x4e,0,0x28,0,100,0,0,0,2,1,0x23); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x45,0,0x42,0,0x32,0,0x4f,0,0,0,2,1,0x24); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x5d,0,0x39,0,0x41,0,0x44,0,0,0,2,1,0x25); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0xae,0,0x3b,0,0x52,0,0x3b,0,0,0,2,1,0x26); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0xbe,0,0x43,0,0xa7,0,0x3a,0,0,0,2,1,0x27); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,8,0, + 0,0,0,0,0xc1,0,0x3c,0,0,1,1,1,0x28); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0xd2,0,0x29,0,199,0,0x40,0,0,0,2,1,0x29); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,8,0, + 0,0,0,0,0xcb,0,0x26,0,0,1,1,1,0x2a); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0xb9,0,0x16,0,0xce,0,0x1f,0,0,0,2,1,0x2b); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x1f,0,0x16,0,0xb9,0,0x16,0,0,0,2,1,0x2c); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0x86a0,1,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0xcd7f,0xcccc,0x4ccc + ,0,0,0x21,0,0xb,0,0x21,0,0x17,0,0,0,2,1,0x2d); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0xbe,0,0xd,0,0x1e,0,0xd,0,0,0,2,1,0x2e); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0xfa,0,0x20,0,0xb9,0,0xc,0,0,0,2,1,0x2f); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,8,0, + 0,0,0,0,0xfb,0,0x19,0,0,1,1,1,0x30); + FUN_1008_0138(0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x140,0,10,0,0xfb,0,0x21,0,0,0,2,1,0x31); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x1ab,0,0xc,0,0x119,0,0xc,0,0,0,2,1,0x32); + FUN_1008_0138(0xa3,0xb4,0x85,0x96,0,0,0,0,1,1000,0,0,0x40,0xcd7f,0xcccc,0x4ccc,0xcd7d,0xcccc, + 0xcccc,0xcd7d,0xcccc,0x4ccc,0xcd80,0xcccc,0x4ccc,0x17,0,0,0,0,0,0xa8,0,0xa5,0,0,1,1, + 1,0x33); + FUN_1008_0138(0x7d,0xdd,0x5f,0xbf,0,0,0,0,1,1000,0,0,0x40,0xcd7f,0xcccc,0x4ccc,0xcd7d,0xcccc, + 0xcccc,0xcd7d,0xcccc,0x4ccc,0xcd80,0xcccc,0x4ccc,0x17,0,0,0,0,0,0x82,0,0xce,0,0,1,1, + 1,0x34); + FUN_1008_0138(0xb4,0xea,0x96,0xcc,0,0,0,0,1,1000,0,0,0x40,0xcd7f,0xcccc,0x4ccc,0xcd7d,0xcccc, + 0xcccc,0xcd7d,0xcccc,0x4ccc,0xcd80,0xcccc,0x4ccc,0x17,0,0,0,0,0,0xb9,0,0xdb,0,0,1,1, + 1,0x35); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x80,0,0,8,0,0,0,0,0, + 0x138,0,0x35,0,0,1,1,1,0x36); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0xcd7f,0xcccc,0x4ccc,0xcd7f,0xcccc,0xcccc,0xcd7d,0xcccc, + 0x4ccc,0x80,0,0,0,0,0x48,0,0x30,0,0xfffb,0xffff,6,0,1,0,2,1,0x37); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x80,0,0,8,0,0,0,0,0,0,0, + 0xfff7,0xffff,1,1,1,1,0x38); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x80,0,0,0,0,0xffe6, + 0xffff,0xffd1,0xffff,7,0,0xffff,0xffff,1,0,2,1,0x39); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x80,0,0,8,0,0,0,0,0, + 0xfff9,0xffff,3,0,1,1,1,1,0x3a); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x80,0,0,0,0,0xffd3, + 0xffff,0,0,0,0,0xfff8,0xffff,1,0,2,1,0x3b); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,10,0 + ,0,0,0,0,0x13a,0,0x1d,0,0,1,1,1,0x3c); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x80,0,0,0,0,0x16f,0,0x25 + ,0,0x138,0,0x25,0,0,0,2,1,0x3d); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7c,0xcccc,0x4ccc,0xcd7f,0xcccc,0x4ccc,0,0, + 0x194,0,0x6e,0,0x16f,0,0x25,0,0,0,2,1,0x3e); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x195,0,0x13,0,0x1ac,0,0x5c,0,0,0,2,1,0x3f); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x137,0,0x13,0,0x195,0,0x13,0,0,0,2,1,0x40); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x80,0,0,0xf,0,0,0,0,0, + 0x1a1,0,0x67,0,0,1,1,1,0x41); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7e,0xcccc,0x4ccc,0x80,0,0,0,0,0x1b1,0,0x8d + ,0,0x196,0,0x70,0,0,0,2,1,0x42); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7e,0xcccc,0x4ccc,0x80,0,0,9,0,0,0,0,0, + 0x1b7,0,0x86,0,0,1,1,1,0x43); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7e,0xcccc,0x4ccc,0x80,0,0,0,0,0x1af,0,0x61 + ,0,0x1bf,0,0x82,0,0,0,2,1,0x44); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x80,0,0,8,0,0,0,0,0, + 0x138,0,0x104,0,0,1,1,1,0x45); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x80,0,0,0,0,0x2d,0,0,0,0 + ,0,7,0,1,0,2,1,0x46); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x80,0,0,8,0,0,0,0,0, + 0xffff,0xffff,0xfff9,0xffff,1,1,1,1,0x47); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x80,0,0,0,0,0x16,0, + 0xffd1,0xffff,8,0,1,0,1,0,2,1,0x48); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x80,0,0,8,0,0,0,0,0, + 0xfff8,0xffff,0,0,1,1,1,1,0x49); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0xcd7f,0xcccc,0x4ccc,0xcd7f,0xcccc,0xcccc,0xcd7d,0xcccc, + 0x4ccc,0x80,0,0,0,0,0xffb9,0xffff,0x32,0,0xfffe,0xffff,0xfff7,0xffff,1,0,2,1,0x4a); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,9,0, + 0,0,0,0,0x138,0,0x11c,0,0,1,1,1,0x4b); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x80,0,0,0,0,0x195,0, + 0x124,0,0x137,0,0x124,0,0,0,2,1,0x4c); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x1ac,0,0xdd,0,0x195,0,0x124,0,0,0,2,1,0x4d); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7c,0xcccc,0x4ccc,0x80,0,0,0,0,0x16f,0, + 0x113,0,0x194,0,0xcd,0,0,0,2,1,0x4e); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x138,0,0x113,0,0x16f,0,0x113,0,0,0,2,1,0x4f); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7e,0xcccc,0x4ccc,0x80,0,0,0xf,0,0,0,0,0, + 0x1a1,0,0xd2,0,0,1,1,1,0x50); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7e,0xcccc,0x4ccc,0x80,0,0,0,0,0x1bf,0,0xb1 + ,0,0x1af,0,0xd8,0,0,0,2,1,0x51); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7e,0xcccc,0x4ccc,0x80,0,0,9,0,0,0,0,0, + 0x1b7,0,0xb3,0,0,1,1,1,0x52); + FUN_1008_0138(0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0xcd7e,0xcccc,0x4ccc,0x80,0,0,0,0,0x196,0,0xc9 + ,0,0x1b1,0,0xac,0,0,0,2,1,0x53); + FUN_1008_0138(0,0,0,0,0,0,0,0,3,0x5dc,0,0,4,0,0,0,0,0,0,0,0,0,0x9a80,0x9999,0x1999,0,0,0xdd,0,0x28 + ,0,0xcd,0,0x49,0,0,0,2,1,0x54); + FUN_1008_0138(0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0x9a80,0x9999,0x1999,0,0,0xcd,0,0x49,0, + 0xc1,0,0x43,0,0,0,2,1,0x55); + FUN_1008_0138(0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0x9a80,0x9999,0x1999,0,0,0xd1,0,0x22,0, + 0xdd,0,0x28,0,0,0,2,1,0x56); + FUN_1008_0138(0,0,0,0,0,0,0,0,3,0x5dc,0,0x55,6,0,0,0,0,0,0,0,0,0,0x9a80,0x9999,0x1999,0,0,0xe7,0, + 0x2a,0,0xd5,0,0x4c,0,0,0,2,0,0x57); + FUN_1008_0138(0,0,0,0,0,0,0,0,3,0x5dc,0,0x56,6,0,0,0,0,0,0,0,0,0,0x9a80,0x9999,0x1999,0,0,0xef,0, + 0x2d,0,0xdd,0,0x4f,0,0,0,2,0,0x58); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0x9a80,0x9999,0x1999,0x13,0,0,0,0,0,0x72 + ,0,0x121,0,0,0,3,1,0x59); + FUN_1008_0138(0xf6,0x132,0xe7,0x11a,0,0,0,0,3,0x5dc,0,0x5a,0x208a,0,0,0,0,0,0,0,0,0,0x9a80,0x9999, + 0x1999,0,0,0xf7,0,0x124,0,0x111,0,0x124,0,0,0,2,1,0x5a); + FUN_1008_0138(0xf6,0x132,0xe7,0x11a,0,0,0,0,3,0x5dc,0,0x5a,0x208a,0,0,0,0,0,0,0,0,0,0xcd7f,0xcccc, + 0x4ccc,0,0,0x111,0,0x124,0,0x111,0,0x12e,0,0,0,2,1,0x5b); + FUN_1008_0138(0xf6,0x132,0xe7,0x11a,0,0,0,0,3,0x5dc,0,0x5a,0x208a,0,0,0,0,0,0,0,0,0,0xcd7f,0xcccc, + 0x4ccc,0,0,0xf7,0,0x12e,0,0xf7,0,0x124,0,0,0,2,1,0x5c); + FUN_1008_0138(0xe7,0x132,0xd9,0x11a,0,0,0,0,3,0x5dc,0,0x5d,0x208a,0,0,0,0,0,0,0,0,0,0x9a80,0x9999, + 0x1999,0,0,0xe7,0,0x124,0,0x100,0,0x124,0,0,0,2,1,0x5d); + FUN_1008_0138(0xe7,0x132,0xd9,0x11a,0,0,0,0,3,0x5dc,0,0x5d,0x208a,0,0,0,0,0,0,0,0,0,0xcd7f,0xcccc, + 0x4ccc,0,0,0x100,0,0x124,0,0x100,0,0x12e,0,0,0,2,1,0x5e); + FUN_1008_0138(0xe7,0x132,0xd9,0x11a,0,0,0,0,3,0x5dc,0,0x5d,0x208a,0,0,0,0,0,0,0,0,0,0xcd7f,0xcccc, + 0x4ccc,0,0,0xe7,0,0x12e,0,0xe7,0,0x124,0,0,0,2,1,0x5f); + FUN_1008_0138(0xd8,0x132,0xca,0x11a,0,0,0,0,3,0x5dc,0,0x60,0x208a,0,0,0,0,0,0,0,0,0,0x9a80,0x9999, + 0x1999,0,0,0xd9,0,0x124,0,0xf1,0,0x124,0,0,0,2,1,0x60); + FUN_1008_0138(0xd8,0x132,0xca,0x11a,0,0,0,0,3,0x5dc,0,0x60,0x208a,0,0,0,0,0,0,0,0,0,0xcd7f,0xcccc, + 0x4ccc,0,0,0xf1,0,0x124,0,0xf1,0,0x12e,0,0,0,2,1,0x61); + FUN_1008_0138(0xd8,0x132,0xca,0x11a,0,0,0,0,3,0x5dc,0,0x60,0x208a,0,0,0,0,0,0,0,0,0,0xcd7f,0xcccc, + 0x4ccc,0,0,0xd9,0,0x12e,0,0xd9,0,0x124,0,0,0,2,1,0x62); + FUN_1008_0138(0xc9,0x132,0xbb,0x11a,0,0,0,0,3,0x5dc,0,99,0x208a,0,0,0,0,0,0,0,0,0,0x9a80,0x9999, + 0x1999,0,0,0xc9,0,0x124,0,0xe2,0,0x124,0,0,0,2,1,99); + FUN_1008_0138(0xc9,0x132,0xbb,0x11a,0,0,0,0,3,0,0,99,0x208a,0,0,0,0,0,0,0,0,0,0xcd7f,0xcccc,0x4ccc + ,0,0,0xe2,0,0x124,0,0xe2,0,0x12e,0,0,0,2,1,100); + FUN_1008_0138(0xc9,0x132,0xbb,0x11a,0,0,0,0,3,0,0,99,0x208a,0,0,0,0,0,0,0,0,0,0xcd7f,0xcccc,0x4ccc + ,0,0,0xca,0,0x12e,0,0xca,0,0x124,0,0,0,2,1,0x65); + FUN_1008_0138(0xba,0x132,0xae,0x11a,0,0,0,0,3,0x5dc,0,0x66,0x208a,0,0,0,0,0,0,0,0,0,0x9a80,0x9999, + 0x1999,0,0,0xbb,0,0x124,0,0xd2,0,0x124,0,0,0,2,1,0x66); + FUN_1008_0138(0xba,0x132,0xae,0x11a,0,0,0,0,3,0,0,0x66,0x208a,0,0,0,0,0,0,0,0,0,0xcd7f,0xcccc, + 0x4ccc,0,0,0xd1,0,0x124,0,0xd2,0,0x12e,0,0,0,2,1,0x67); + FUN_1008_0138(0xba,0x132,0xae,0x11a,0,0,0,0,3,0,0,0x66,0x208a,0,0,0,0,0,0,0,0,0,0xcd7f,0xcccc, + 0x4ccc,0,0,0xb7,0,0x12e,0,0xbc,0,0x124,0,0,0,2,1,0x68); + FUN_1008_0138(0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0xcd7e,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0xe0,0,0x94,0,0xf2,0,0xcb,0,0,0,2,1,0x69); + FUN_1008_0138(0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0xe, + 0,0,0,0,0,0xd4,0,0x9c,0,0,1,1,1,0x6a); + FUN_1008_0138(0,0,0,0,0,0,0,0,3,0,0,0,0,0x9a7f,0x9999,0x1999,0xcd7f,0xcccc,0xcccc,0xcd7d,0xcccc, + 0x4ccc,0x9a80,0x9999,0x1999,0,0,0xd9,0,0xd7,0,0xc6,0,0x9e,0,0,0,2,1,0x6b); + FUN_1008_0138(0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0xe, + 0,0,0,0,0,0xe6,0,0xd2,0,0,1,1,1,0x6c); + FUN_1008_0138(0xec,0xce,0xd6,0xc0,0,0,0,0,3,0x5dc,0,0x6d,0x2092,0,0,0,0,0,0,0,0,0,0x9a80,0x9999, + 0x1999,0,0,0xf6,0,0xbb,0,0xfd,0,0xd1,0,0,0,2,1,0x6d); + FUN_1008_0138(0xdc,0xcd,0xd6,0xc0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0x9a80,0x9999,0x1999,0,0, + 0xfd,0,0xd1,0,0xee,0,0xd6,0,0,0,2,1,0x6e); + FUN_1008_0138(0xdc,0xcd,0xd6,0xc0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0x9a80,0x9999,0x1999,0,0, + 0xea,0,0xbf,0,0xf6,0,0xbb,0,0,0,2,1,0x6f); + FUN_1008_0138(0xe7,0xbf,0xd1,0xb2,0,0,0,0,3,0x5dc,0,0x70,0x2092,0,0,0,0,0,0,0,0,0,0x9a80,0x9999, + 0x1999,0,0,0xef,0,0xa9,0,0xf9,0,0xc6,0,0,0,2,1,0x70); + FUN_1008_0138(0xdc,0xcd,0xd6,0xc0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0x9a80,0x9999,0x1999,0,0, + 0xf9,0,0xc6,0,0xed,0,0xca,0,0,0,2,1,0x71); + FUN_1008_0138(0xdc,0xcd,0xd6,0xc0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0x9a80,0x9999,0x1999,0,0, + 0xe3,0,0xad,0,0xef,0,0xa9,0,0,0,2,1,0x72); + FUN_1008_0138(0xe2,0xb1,0xcc,0xa3,0,0,0,0,3,0x5dc,0,0x73,0x2092,0,0,0,0,0,0,0,0,0,0x9a80,0x9999, + 0x1999,0,0,0xe9,0,0x99,0,0xf3,0,0xb6,0,0,0,2,1,0x73); + FUN_1008_0138(0xdc,0xcd,0xd6,0xc0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0x9a80,0x9999,0x1999,0,0, + 0xf3,0,0xb6,0,0xe7,0,0xba,0,0,0,2,1,0x74); + FUN_1008_0138(0xdc,0xcd,0xd6,0xc0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0x9a80,0x9999,0x1999,0,0, + 0xdd,0,0x9d,0,0xe9,0,0x99,0,0,0,2,1,0x75); + FUN_1008_0138(0xdd,0xa3,0xc6,0x95,0,0,0,0,3,0x5dc,0,0x76,0x2092,0,0,0,0,0,0,0,0,0,0x9a80,0x9999, + 0x1999,0,0,0xe2,0,0x8b,0,0xed,0,0xa3,0,0,0,2,1,0x76); + FUN_1008_0138(0xdc,0xcd,0xd6,0xc0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0x9a80,0x9999,0x1999,0,0, + 0xed,0,0xa3,0,0xe1,0,0xa7,0,0,0,2,1,0x77); + FUN_1008_0138(0xdc,0xcd,0xd6,0xc0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0x9a80,0x9999,0x1999,0,0, + 0xd3,0,0x90,0,0xe2,0,0x8b,0,0,0,2,1,0x78); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,2000,0,0,0x400,0,0,0,0,0,0,0,0,0,0x9a80,0x9999,0x1999,0,0,0xa0,0, + 0x54,0,0x95,0,0x69,0,0,0,2,1,0x79); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0x9a80,0x9999,0x1999,0,0,0x95,0,0x69,0, + 0x8b,0,0x65,0,0,0,2,1,0x7a); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0x9a80,0x9999,0x1999,0,0,0x96,0,0x50,0, + 0xa0,0,0x54,0,0,0,2,1,0x7b); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x97,0,0x57,0,0x8b,0,0x6f,0,0,0,2,1,0x7c); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,8,0, + 0,0,0,0,0x92,0,0x54,0,0,1,1,1,0x7d); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x6c,0,0x4d,0,0x93,0,0x4d,0,0,0,2,1,0x7e); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x6a,0,0x57,0,0x6c,0,0x4d,0,0,0,2,1,0x7f); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x8d,0,0x6e,0,0x6a,0,0x57,0,0,0,2,1,0x80); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0x9a80,0x9999,0x1999,0x13,0,0,0,0,0,0x60 + ,0,0x60,0,0,0,3,1,0x81); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0x9a80,0x9999,0x1999,0x13,0,0,0,0,0,0x45 + ,0,0x73,0,0,0,3,1,0x82); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0x9a80,0x9999,0x1999,0x13,0,0,0,0,0,0x50 + ,0,0x93,0,0,0,3,1,0x83); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0x9a80,0x9999,0x1999,0x13,0,0,0,0,0,0x70 + ,0,0x93,0,0,0,3,1,0x84); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0x9a80,0x9999,0x1999,0x13,0,0,0,0,0,0x7b + ,0,0x73,0,0,0,3,1,0x85); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0x14 + ,0,0,0,0,0,0x60,0,0x7c,0,0,1,1,1,0x86); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0x11 + ,0,0,0,0,0,0x4e,0,100,0,0,1,1,1,0x87); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0x11 + ,0,0,0,0,0,0x44,0,0x85,0,0,1,1,1,0x88); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0x11 + ,0,0,0,0,0,0x60,0,0x9a,0,0,1,1,1,0x89); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0x11 + ,0,0,0,0,0,0x7d,0,0x85,0,0,1,1,1,0x8a); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0x11 + ,0,0,0,0,0,0x72,0,100,0,0,1,1,1,0x8b); + FUN_1008_0138(0xbc,0x1f,0xae,0x11,0,0,0,0,1,1000,0,0,0xc0,0,0,0,0,0,0,0,0,0,0,0,0,0xc,0,0,0,0,0, + 0xca,0,0x18,0,0,0,4,1,0x8c); + FUN_1008_0138(0xa9,0x19,0x9b,0xb,0,0,0,0,1,1000,0,0,0xc0,0,0,0,0,0,0,0,0,0,0,0,0,0xc,0,0,0,0,0, + 0xb6,0,0x12,0,0,0,4,1,0x8d); + FUN_1008_0138(0x96,0x18,0x88,10,0,0,0,0,1,0x5dc,0,0,0xc0,0,0,0,0,0,0,0,0,0,0,0,0,0xc,0,0,0,0,0, + 0xa4,0,0x11,0,0,0,4,1,0x8e); + FUN_1008_0138(0x83,0x18,0x75,10,0,0,0,0,1,0x5dc,0,0,0xc0,0,0,0,0,0,0,0,0,0,0,0,0,0xc,0,0,0,0,0, + 0x91,0,0x11,0,0,0,4,1,0x8f); + FUN_1008_0138(0x70,0x18,0x62,10,0,0,0,0,1,2000,0,0,0xc0,0,0,0,0,0,0,0,0,0,0,0,0,0xc,0,0,0,0,0,0x7e + ,0,0x11,0,0,0,4,1,0x90); + FUN_1008_0138(0x5d,0x18,0x4f,10,0,0,0,0,1,2000,0,0,0xc0,0,0,0,0,0,0,0,0,0,0,0,0,0xc,0,0,0,0,0,0x6b + ,0,0x11,0,0,0,4,1,0x91); + FUN_1008_0138(0x4f,0x18,0x3c,10,0,0,0,0,1,0x9c4,0,0,0xc0,0,0,0,0,0,0,0,0,0,0,0,0,0xc,0,0,0,0,0, + 0x57,0,0x11,0,0,0,4,1,0x92); + FUN_1008_0138(0x37,0x18,0x29,10,0,0,0,0,1,3000,0,0,0xc0,0,0,0,0,0,0,0,0,0,0,0,0,0xc,0,0,0,0,0,0x44 + ,0,0x11,0,0,0,4,1,0x93); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0x9a80,0x9999,0x1999,0x13,0,0,0,0,0,0x2b + ,0,0x11,0,0,0,3,1,0x94); + FUN_1008_0138(0x49,0x4d,0x39,0x3c,0,0,0,0,1,500,0,0,0x140,0,0,0,0,0,0,0,0,0,0,0,0,0x10,0,0,0,0,0, + 0x55,0,0x44,0,0,0,4,0,0x95); + FUN_1008_0138(0x32,0xd3,0x28,199,0,0,0,0,1,500,0,0,0x1000,0,0,0,0,0,0,0,0,0,0,0,0,0xb,0,0,0,0,0, + 0x43,0,0xcd,0,0,0,4,1,0x96); + FUN_1008_0138(0x33,0xf0,0x29,0xe4,0,0,0,0,1,500,0,0,0x1000,0,0,0,0,0,0,0,0,0,0,0,0,0xb,0,0,0,0,0, + 0x42,0,0xe9,0,0,0,4,1,0x97); + FUN_1008_0138(0x34,0x10d,0x2a,0x101,0,0,0,0,1,500,0,0,0x1000,0,0,0,0,0,0,0,0,0,0,0,0,0xb,0,0,0,0,0 + ,0x42,0,0x108,0,0,0,4,1,0x98); + FUN_1008_0138(0x188,0x17,0x158,0xb,0,0,0,0,2,0,0,0,0x100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x194,0,0x1b, + 0,0x154,0,6,0,0,0,4,0,0x99); + FUN_1008_0138(0x18a,0x12f,0x15a,0x123,0,0,0,0,2,0,0,0,0x100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x192,0, + 0x133,0,0x154,0,0x11b,0,0,0,4,0,0x9a); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0xb, + 0,0,0,0,0,0x4f,0,0xb7,0,0,1,1,1,0x9b); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x34,0,0xb8,0,0x4b,0,0xac,0,0,0,2,1,0x9c); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0xb, + 0,0,0,0,0,0x38,0,0xc3,0,0,1,1,1,0x9d); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x52,0,0xc1,0,0x3d,0,0xcd,0,0,0,2,1,0x9e); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0xb, + 0,0,0,0,0,0x4f,0,0xd4,0,0,1,1,1,0x9f); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x34,0,0xd5,0,0x4b,0,0xc9,0,0,0,2,1,0xa0); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0xb, + 0,0,0,0,0,0x38,0,0xe0,0,0,1,1,1,0xa1); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x52,0,0xde,0,0x3d,0,0xea,0,0,0,2,1,0xa2); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0xb, + 0,0,0,0,0,0x4f,0,0xf1,0,0,1,1,1,0xa3); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x34,0,0xf2,0,0x4b,0,0xe6,0,0,0,2,1,0xa4); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0xb, + 0,0,0,0,0,0x38,0,0xfd,0,0,1,1,1,0xa5); + FUN_1008_0138(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x52,0,0xfb,0,0x3d,0,0x107,0,0,0,2,1,0xa6); + FUN_1008_0138(0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0x9a80,0x9999,0x1999,9,0,0,0,0,0,0x10c,0 + ,299,0,0,0,1,1,0xa7); + FUN_1008_0138(0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0x9a80,0x9999,0x1999,0,0,0x111,0,0x123,0 + ,0x123,0,0x12a,0,0,0,2,1,0xa8); + FUN_1008_0138(0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0xcd7d,0xcccc,0x4ccc,0x9a80,0x9999,0x1999,0,0, + 0x4e,0,0x148,0,0x1ba,0,0x148,0,0,0,2,1,0xa9); + FUN_1008_0138(0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0x9a80,0x9999,0x1999,0,0,100,0,0x12a,0, + 0x1a4,0,0x12a,0,0,0,2,1,0xaa); + FUN_1008_0138(0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0x9a80,0x9999,0x1999,0,0,0xbe,0,0x12a,0, + 0x10b,0,0x12a,0,0,0,2,1,0xab); + FUN_1008_0138(0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0x9a80,0x9999,0x1999,9,0,0,0,0,0,0xbf,0, + 299,0,0,0,1,1,0xac); + FUN_1008_0138(0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0x9a80,0x9999,0x1999,0,0,0xa5,0,0x12a,0, + 0xbc,0,0x123,0,0,0,2,1,0xad); + FUN_1008_0138(0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0x6680,0x6666,0x6666,0x11,0,0,0,0,0,0,0, + 0,0,0,1,1,1,0xae); + FUN_1008_0138(0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0x6680,0x6666,0x6666,0x11,0,0,0,0,0,0,0, + 0,0,0,1,1,0,0xaf); + FUN_1008_0787(0x143,0x79,0x130,0x67,1); + FUN_1008_0787(299,0x89,0x118,0x77,2); + FUN_1008_0787(0x123,0xa6,0x110,0x94,3); + FUN_1008_0787(299,0xc3,0x118,0xb1,4); + FUN_1008_0787(0x142,0xd3,0x12f,0xc1,5); + FUN_1008_0787(0x14,0,0x14,0,6); + FUN_1008_0787(0x14,0,0x14,0,7); + FUN_1008_0787(0x14,0,0x14,0,8); + FUN_1008_0787(0x14,0,0x14,0,9); + FUN_1008_0787(0x14,0,0x14,0,10); + FUN_1008_0787(0x14,0,0x14,0,0xb); + FUN_1008_0787(0x14,0,0x14,0,0xc); + FUN_1008_0787(0x14,0,0x14,0,0xd); + FUN_1008_0787(0x14,0,0x14,0,0xe); + FUN_1008_0787(0x54,0x67,0x44,0x57,0xf); + FUN_1008_0787(0x39,0x7b,0x29,0x69,0x10); + FUN_1008_0787(0x43,0x9a,0x33,0x8a,0x11); + FUN_1008_0787(99,0x9a,0x53,0x8a,0x12); + FUN_1008_0787(0x6e,0x7a,0x5e,0x6a,0x13); + FUN_1008_0787(0x1e,0x19,0xe,9,0x14); + local_4 = 1; + while( true ) { + *(undefined1 *)(iVar5 + local_4 + 0x3cc) = *(undefined1 *)(local_4 * 0x53 + 0x98f); + *(undefined2 *)(iVar5 + local_4 * 2 + 0xa42) = *(undefined2 *)(local_4 * 0x53 + 0x99e); + *(undefined1 *)(iVar5 + local_4 + 0x61) = 0; + if (local_4 == 0xaf) break; + local_4 = local_4 + 1; + } + return; +} + + +/* ===== 1000:51f5 FUN_1000_51f5 ===== */ + +void __stdcall16far FUN_1000_51f5(undefined4 param_1) + +{ + int *piVar1; + undefined2 uVar2; + undefined2 uVar3; + uint uVar4; + int iVar5; + undefined2 unaff_CS; + undefined2 uVar6; + int local_4; + + uVar6 = 0; + uVar2 = LOADCURSOR(unaff_CS,0x7f02,0); + uVar3 = SETCURSOR(0x1228,uVar2,uVar6); + FUN_1008_10e3(uVar2,uVar6,uVar3); + uVar2 = (undefined2)((ulong)param_1 >> 0x10); + iVar5 = (int)param_1; + *(undefined1 *)(iVar5 + 0xbd9) = 1; + *(undefined1 *)(iVar5 + 0xbd8) = 1; + uVar4 = *(uint *)(iVar5 + 0x49) | *(uint *)(iVar5 + 0x4b); + if (uVar4 != 0) { + piVar1 = (int *)*(undefined4 *)(iVar5 + 0x49); + (*(code *)*(undefined2 *)(*piVar1 + 8)) + (0x1008,(int *)piVar1,(int)((ulong)piVar1 >> 0x10),CONCAT11((char)(uVar4 >> 8),1)); + } + FUN_1008_00e2(); + DELETEOBJECT(0x1008,*(undefined2 *)(iVar5 + 0x52)); + DELETEOBJECT(0x1228,DAT_1028_0859); + DELETEOBJECT(0x1228,DAT_1028_0863); + DELETEOBJECT(0x1228,DAT_1028_0865); + DELETEOBJECT(0x1228,DAT_1028_085f); + DELETEOBJECT(0x1228,DAT_1028_085b); + DELETEOBJECT(0x1228,DAT_1028_0861); + DELETEOBJECT(0x1228,DAT_1028_085d); + local_4 = 0; + while( true ) { + DELETEOBJECT(0x1228,*(undefined2 *)(local_4 * 2 + 0x430b)); + if (local_4 == 7) break; + local_4 = local_4 + 1; + } + local_4 = 1; + while( true ) { + DELETEOBJECT(0x1228,*(undefined2 *)(local_4 * 2 + 0x4319)); + if (local_4 == 4) break; + local_4 = local_4 + 1; + } + local_4 = 1; + while( true ) { + DELETEOBJECT(0x1228,((undefined2 *)&DAT_1028_4321)[local_4]); + if (local_4 == 9) break; + local_4 = local_4 + 1; + } + SETCURSOR(0x1228,uVar3); + POSTQUITMESSAGE(0x1228,0x12); + FUN_1018_121b(iVar5,uVar2,0); + INVALIDATERECT(0x1018,1,0,0,*(undefined2 *)(iVar5 + 4)); + FUN_1020_0439(); + return; +} + + +/* ===== 1000:531e FUN_1000_531e ===== */ + +void __stdcall16far FUN_1000_531e(int param_1,byte param_2) + +{ + undefined2 uVar1; + undefined2 uVar2; + undefined2 unaff_SS; + undefined2 uVar3; + undefined2 uVar4; + + uVar4 = *(undefined2 *)(param_1 + 0xe); + uVar1 = CREATECOMPATIBLEDC(); + *(undefined2 *)(param_1 + -0xc) = uVar1; + uVar1 = *(undefined2 *)(param_1 + -0xc); + uVar2 = SELECTOBJECT(0x1228,*(undefined2 *)(param_1 + -2)); + *(undefined2 *)(param_1 + -4) = uVar2; + uVar2 = *(undefined2 *)(param_1 + 0xe); + BITBLT(0x1228,0x20,0xcc,0,0,*(undefined2 *)(param_1 + -0xc),0xd,(param_2 - 1) * 7,0x148,0xca); + uVar3 = *(undefined2 *)(param_1 + -0xc); + SELECTOBJECT(0x1228,*(undefined2 *)(param_1 + -4)); + DELETEOBJECT(0x1228,*(undefined2 *)(param_1 + -0xc),uVar3,uVar2,uVar1,uVar4); + return; +} + + +/* ===== 1000:5390 FUN_1000_5390 ===== */ + +void __stdcall16far +FUN_1000_5390(undefined4 param_1,undefined2 param_2,undefined2 param_3,undefined2 param_4) + +{ + undefined2 uVar1; + undefined2 uVar2; + int iVar3; + undefined2 unaff_CS; + undefined2 uVar4; + undefined2 unaff_SS; + undefined2 uVar5; + undefined2 uVar6; + undefined2 uVar7; + undefined2 uVar8; + undefined2 uVar9; + int local_20; + undefined1 local_16 [4]; + int local_12; + int local_10; + undefined2 local_e; + undefined2 local_c; + undefined2 local_a; + undefined2 local_8; + undefined2 local_6; + undefined2 local_4; + + uVar2 = param_4; + uVar1 = SELECTPALETTE(unaff_CS,0,DAT_1028_444e); + UNREALIZEOBJECT(0x1228,DAT_1028_444e,uVar2); + REALIZEPALETTE(0x1228,param_4); + uVar4 = 0x1008; + FUN_1008_00e2(); + iVar3 = (int)param_1; + uVar2 = (undefined2)((ulong)param_1 >> 0x10); + if (DAT_1028_07cc != '\0') { + local_4 = FUN_1008_149d(0x3e3,0,DAT_1028_06fe); + uVar6 = CREATECOMPATIBLEDC(0x1008,param_4); + local_e = uVar6; + local_6 = SELECTOBJECT(0x1228,local_4); + uVar5 = param_4; + BITBLT(0x1228,0x20,0xcc,0,0,local_e,0x1e0,0x280,0,0); + uVar4 = local_e; + SELECTOBJECT(0x1228,local_6); + DELETEOBJECT(0x1228,local_e,uVar4,uVar5,uVar6); + DELETEOBJECT(0x1228,local_4); + local_4 = FUN_1008_149d(0x3e2,0,DAT_1028_06fe); + FUN_1000_531e(&stack0xfffe,2); + FUN_1008_0f2e(); + FUN_1000_531e(&stack0xfffe,3); + FUN_1000_531e(&stack0xfffe,4); + DAT_1028_085d = FUN_1008_149d(0x3e6,0,DAT_1028_06fe); + FUN_1000_531e(&stack0xfffe,5); + DAT_1028_085b = FUN_1008_149d(0x3e6,0,DAT_1028_06fe); + FUN_1000_531e(&stack0xfffe,6); + DAT_1028_0861 = LOADBITMAP(0x1000,500,0); + local_20 = 0; + while( true ) { + FUN_1000_531e(&stack0xfffe,local_20 + 7); + uVar4 = FUN_1008_149d(local_20 + 400,local_20 + 400 >> 0xf,DAT_1028_06fe); + *(undefined2 *)(local_20 * 2 + 0x430b) = uVar4; + if (local_20 == 7) break; + local_20 = local_20 + 1; + } + local_20 = 1; + while( true ) { + FUN_1000_531e(&stack0xfffe,local_20 + 0xe); + uVar4 = FUN_1008_149d(local_20 + 700,local_20 + 700 >> 0xf,DAT_1028_06fe); + *(undefined2 *)(local_20 * 2 + 0x4319) = uVar4; + if (local_20 == 4) break; + local_20 = local_20 + 1; + } + local_20 = 1; + while( true ) { + FUN_1000_531e(&stack0xfffe,local_20 + 0x12); + uVar4 = FUN_1008_149d(local_20 + 800,local_20 + 800 >> 0xf,DAT_1028_06fe); + ((undefined2 *)&DAT_1028_4321)[local_20] = uVar4; + if (local_20 == 9) break; + local_20 = local_20 + 1; + } + FUN_1000_531e(&stack0xfffe,0x1c); + uVar4 = LOADBITMAP(0x1000,0x66,0); + *(undefined2 *)(iVar3 + 0x54) = uVar4; + FUN_1000_531e(&stack0xfffe,0x1d); + DAT_1028_0863 = FUN_1008_149d(900,0,DAT_1028_06fe); + FUN_1000_531e(&stack0xfffe,0x1e); + uVar4 = LOADBITMAP(0x1000,0x65,0); + *(undefined2 *)(iVar3 + 0x52) = uVar4; + FUN_1000_531e(&stack0xfffe,0x1f); + DAT_1028_085f = FUN_1008_149d(0x3e5,0,DAT_1028_06fe); + FUN_1000_531e(&stack0xfffe,0x20); + DAT_1028_0865 = FUN_1008_149d(0x385,0,DAT_1028_06fe); + FUN_1000_531e(&stack0xfffe,0x21); + DAT_1028_0859 = FUN_1008_149d(600,0,DAT_1028_06fe); + FUN_1000_531e(&stack0xfffe,0x22); + DAT_1028_07cc = '\0'; + FUN_1000_531e(&stack0xfffe,0x23); + DELETEOBJECT(0x1000,local_4); + uVar5 = param_4; + SELECTPALETTE(0x1228,0,uVar1); + uVar7 = 0; + uVar6 = LOADCURSOR(0x1228,0x7f00,0); + uVar4 = 0x1228; + SETCURSOR(0x1228,uVar6,uVar7,uVar5); + } + if (*(char *)(iVar3 + 0xbd8) == '\0') { + *(undefined1 *)(iVar3 + 0xbd9) = 1; + local_c = CREATECOMPATIBLEDC(uVar4,param_4); + local_e = CREATECOMPATIBLEDC(0x1228,param_4); + GETCLIENTRECT(0x1228,local_16,unaff_SS); + local_a = CREATECOMPATIBLEBITMAP(0x1228,local_10 + 1,local_12 + 1); + local_6 = SELECTOBJECT(0x1228,DAT_1028_085b); + local_8 = SELECTOBJECT(0x1228,local_a); + uVar9 = local_e; + BITBLT(0x1228,0x20,0xcc,0,0,local_c,local_10,local_12,0,0); + uVar8 = local_c; + BITBLT(0x1228,0x20,0xcc,0,0,local_e,local_10,local_12,0,0); + uVar5 = 0xcc; + uVar4 = 0x20; + uVar7 = param_4; + BITBLT(0x1228,0x20,0xcc,0,0,local_e,local_10,local_12,0,0); + uVar6 = local_e; + SELECTOBJECT(0x1228,local_8); + DELETEOBJECT(0x1228,local_a,uVar6,uVar7,uVar8,uVar9); + DELETEDC(0x1228,local_e); + uVar7 = 0x1228; + uVar6 = 0x5706; + uVar8 = local_6; + uVar9 = local_c; + SELECTOBJECT(0x1228,local_6); + if ((((0 < *(int *)(iVar3 + 0xba4)) || + ((-1 < *(int *)(iVar3 + 0xba4) && (*(int *)(iVar3 + 0xba2) != 0)))) && + ((0 < *(int *)(iVar3 + 0xba8) || + ((-1 < *(int *)(iVar3 + 0xba8) && (*(int *)(iVar3 + 0xba6) != 0)))))) && + (*(char *)(iVar3 + 0xbde) == '\0')) { + uVar8 = local_c; + local_6 = SELECTOBJECT(0x1228,*(undefined2 *)(iVar3 + 0x54)); + uVar7 = param_4; + BITBLT(0x1228,0xc6,0x88,0,0,local_c,*(int *)(iVar3 + 0xba6) + 0x13, + *(int *)(iVar3 + 0xba2) + 0x13,*(undefined2 *)(iVar3 + 0xba6), + *(undefined2 *)(iVar3 + 0xba2)); + uVar6 = local_c; + SELECTOBJECT(0x1228,*(undefined2 *)(iVar3 + 0x52)); + uVar5 = param_4; + BITBLT(0x1228,0x86,0xee,0,0,local_c,*(int *)(iVar3 + 0xba6) + 0x13, + *(int *)(iVar3 + 0xba2) + 0x13,*(undefined2 *)(iVar3 + 0xba6), + *(undefined2 *)(iVar3 + 0xba2)); + uVar4 = local_c; + SELECTOBJECT(0x1228,local_6); + } + DELETEDC(0x1228,local_c,uVar4,uVar5,uVar6,uVar7,uVar8,uVar9); + *(undefined2 *)(iVar3 + 0x4d) = 0; + *(undefined2 *)(iVar3 + 0x4f) = 0; + *(undefined1 *)(iVar3 + 0xbd9) = 0; + SELECTPALETTE(0x1228,0,uVar1); + uVar4 = 0; + uVar1 = LOADCURSOR(0x1228,0x7f00,0); + SETCURSOR(0x1228,uVar1,uVar4,param_4); + uVar1 = *(undefined2 *)(iVar3 + 4); + GETCLIENTRECT(0x1228,local_16,unaff_SS); + local_e = GETDC(0x1228,*(undefined2 *)(iVar3 + 4),uVar1); + uVar2 = *(undefined2 *)((uint)DAT_1028_07d1 * 4 + 0x990); + uVar1 = FUN_1020_08a9(); + FUN_1008_0996(local_e,uVar1,uVar2); + local_20 = 1; + while( true ) { + iVar3 = *(int *)(local_20 * 4 + 0x980); + if ((0 < iVar3) || ((-1 < iVar3 && (*(int *)(local_20 * 4 + 0x97e) != 0)))) { + FUN_1008_0996(local_e,local_20,local_20 >> 0xf); + } + if (local_20 == 4) break; + local_20 = local_20 + 1; + } + DAT_1028_086b = 99; + FUN_1008_0b9e(DAT_1028_07d1,local_e); + RELEASEDC(0x1008,local_e); + DAT_1028_07cb = 1; + } + return; +} + + +/* ===== 1000:58e7 FUN_1000_58e7 ===== */ + +undefined2 __stdcall16far FUN_1000_58e7(undefined4 param_1,undefined4 param_2) + +{ + int iVar1; + int iVar2; + undefined2 uVar3; + undefined2 uVar4; + undefined2 local_4; + + uVar3 = (undefined2)((ulong)param_2 >> 0x10); + iVar2 = (int)param_2; + if (*(int *)(iVar2 + 4) == 0) { + DAT_1028_07c4 = '\0'; + local_4 = 0; + } + else if (DAT_1028_07c4 == '\0') { + uVar4 = (undefined2)((ulong)param_1 >> 0x10); + iVar1 = ISICONIC(); + if (iVar1 == 0) { + DAT_1028_07c4 = '\x01'; + INVALIDATERECT(0x1228,0,0,0,*(undefined2 *)((int)param_1 + 4)); + UPDATEWINDOW(0x1228,*(undefined2 *)((int)param_1 + 4)); + *(undefined2 *)(iVar2 + 10) = 0; + *(undefined2 *)(iVar2 + 0xc) = 0; + local_4 = 0; + } + } + return local_4; +} + + +/* ===== 1000:5956 FUN_1000_5956 ===== */ + +void __stdcall16far FUN_1000_5956(undefined4 param_1,undefined4 param_2) + +{ + int iVar1; + undefined2 uVar2; + undefined2 uVar3; + undefined2 unaff_CS; + + uVar2 = (undefined2)((ulong)param_2 >> 0x10); + iVar1 = (int)param_2; + if ((*(int *)(iVar1 + 4) == 0) && (DAT_1028_07c4 == '\0')) { + DAT_1028_07c4 = '\x01'; + uVar3 = (undefined2)((ulong)param_1 >> 0x10); + INVALIDATERECT(unaff_CS,0,0,0,*(undefined2 *)((int)param_1 + 4)); + UPDATEWINDOW(0x1228,*(undefined2 *)((int)param_1 + 4)); + *(undefined2 *)(iVar1 + 10) = 0; + *(undefined2 *)(iVar1 + 0xc) = 0; + } + return; +} + + +/* ===== 1000:59a0 FUN_1000_59a0 ===== */ + +undefined2 __stdcall16far FUN_1000_59a0(undefined4 param_1,undefined4 param_2) + +{ + int iVar1; + undefined2 uVar2; + undefined2 uVar3; + int iVar4; + int iVar5; + undefined2 uVar6; + undefined2 uVar7; + undefined2 uVar8; + undefined2 uVar9; + undefined2 local_4; + + local_4 = 1; + uVar6 = (undefined2)((ulong)param_2 >> 0x10); + iVar4 = (int)param_2; + uVar7 = (undefined2)((ulong)param_1 >> 0x10); + iVar5 = (int)param_1; + if (*(int *)(iVar4 + 4) != *(int *)(iVar5 + 4)) { + uVar9 = *(undefined2 *)(iVar4 + 4); + iVar1 = GETPARENT(); + if (iVar1 != *(int *)(iVar5 + 4)) { + uVar7 = *(undefined2 *)(iVar5 + 4); + uVar2 = GETDC(0x1228,uVar7,uVar9); + uVar8 = uVar2; + uVar3 = SELECTPALETTE(0x1228,1,DAT_1028_444e); + REALIZEPALETTE(0x1228,uVar2,uVar8,uVar7,uVar9,uVar3); + UPDATECOLORS(0x1228,uVar2); + SELECTPALETTE(0x1228,0,uVar3); + RELEASEDC(0x1228,uVar2); + *(undefined2 *)(iVar4 + 10) = 0; + *(undefined2 *)(iVar4 + 0xc) = 0; + local_4 = 0; + } + } + return local_4; +} + + +/* ===== 1000:5a37 FUN_1000_5a37 ===== */ + +int __stdcall16far FUN_1000_5a37(undefined4 param_1,undefined4 param_2) + +{ + undefined2 uVar1; + undefined2 uVar2; + int iVar3; + undefined2 uVar4; + undefined2 uVar5; + undefined2 uVar6; + + uVar4 = (undefined2)((ulong)param_1 >> 0x10); + uVar5 = *(undefined2 *)((int)param_1 + 4); + uVar1 = GETDC(); + uVar6 = uVar1; + uVar2 = SELECTPALETTE(0x1228,0,DAT_1028_444e); + iVar3 = REALIZEPALETTE(0x1228,uVar1,uVar6,uVar5); + SELECTPALETTE(0x1228,0,uVar2); + RELEASEDC(0x1228,uVar1); + if (0 < iVar3) { + INVALIDATERECT(0x1228,0,0,0,*(undefined2 *)((int)param_1 + 4)); + } + uVar5 = (undefined2)((ulong)param_2 >> 0x10); + *(int *)((int)param_2 + 10) = iVar3; + *(undefined2 *)((int)param_2 + 0xc) = 0; + return iVar3; +} + + +/* ===== 1000:5ab7 FUN_1000_5ab7 ===== */ + +void __stdcall16far FUN_1000_5ab7(undefined4 param_1,uint *param_2) + +{ + uint uVar1; + undefined2 uVar2; + + uVar2 = (undefined2)((ulong)param_2 >> 0x10); + FUN_1018_1274((int)param_1,(int)((ulong)param_1 >> 0x10),(uint *)param_2,uVar2); + uVar1 = GETSTOCKOBJECT(0x1018,5); + ((uint *)param_2)[8] = uVar1; + *param_2 = *param_2 | 0x3800; + return; +} + + +/* ===== 1000:5aea FUN_1000_5aea ===== */ + +undefined4 __stdcall16far +FUN_1000_5aea(undefined4 param_1,undefined2 param_2,undefined2 param_3,undefined2 param_4, + undefined2 param_5,undefined2 param_6) + +{ + uint uVar1; + int iVar2; + undefined2 uVar3; + bool bVar4; + + bVar4 = true; + FUN_1020_03ef(); + if (!bVar4) { + uVar3 = (undefined2)((ulong)param_1 >> 0x10); + iVar2 = (int)param_1; + FUN_1018_1106(iVar2,uVar3,0,param_3,param_4,param_5,param_6); + *(undefined2 *)(iVar2 + 0x41) = param_5; + *(undefined2 *)(iVar2 + 0x43) = param_6; + *(undefined2 *)(iVar2 + 0x2d) = 0x168; + *(undefined2 *)(iVar2 + 0x2f) = 300; + *(int *)(iVar2 + 0x29) = 0x140 - *(int *)(iVar2 + 0x2d) / 2; + *(int *)(iVar2 + 0x2b) = 0xe6 - *(int *)(iVar2 + 0x2f) / 2; + uVar1 = *(uint *)(iVar2 + 0x23); + *(uint *)(iVar2 + 0x21) = *(uint *)(iVar2 + 0x21) | 2; + *(uint *)(iVar2 + 0x23) = uVar1 | 0x4680; + SETFOCUS(0x1018,*(undefined2 *)(iVar2 + 4)); + } + return param_1; +} + + +/* ===== 1000:5ba6 FUN_1000_5ba6 ===== */ + +void __stdcall16far FUN_1000_5ba6(undefined4 param_1) + +{ + int iVar1; + int iVar2; + undefined2 uVar3; + undefined2 uVar4; + undefined2 uVar5; + + uVar5 = DAT_1028_0867; + DELETEOBJECT(); + uVar3 = (undefined2)((ulong)param_1 >> 0x10); + iVar1 = (int)param_1; + uVar4 = (undefined2)((ulong)*(undefined4 *)(iVar1 + 0x41) >> 0x10); + iVar2 = (int)*(undefined4 *)(iVar1 + 0x41); + *(undefined2 *)(iVar2 + 0x41) = 0; + *(undefined2 *)(iVar2 + 0x43) = 0; + *(undefined2 *)(iVar1 + 0x41) = 0; + *(undefined2 *)(iVar1 + 0x43) = 0; + FUN_1018_121b(iVar1,uVar3,0); + FUN_1020_0439(uVar5); + return; +} + + +/* ===== 1000:5be5 FUN_1000_5be5 ===== */ + +void __stdcall16far FUN_1000_5be5(undefined4 param_1) + +{ + undefined2 uVar1; + + uVar1 = (undefined2)((ulong)param_1 >> 0x10); + FUN_1018_170c((int)param_1,uVar1); + DAT_1028_0867 = FUN_1008_149d(0x3e1,0,DAT_1028_06fe); + SETFOCUS(0x1008,*(undefined2 *)((int)param_1 + 4)); + return; +} + + +/* ===== 1000:5c13 FUN_1000_5c13 ===== */ + +void __stdcall16far FUN_1000_5c13(void) + +{ + undefined2 uVar1; + undefined2 uVar2; + undefined2 unaff_CS; + undefined2 unaff_SS; + undefined2 in_stack_0000000c; + undefined1 *puVar3; + int iVar4; + undefined1 *puVar5; + undefined2 uVar6; + undefined2 uVar7; + undefined1 local_26c [256]; + undefined2 local_16c; + undefined2 local_16a; + undefined2 local_168; + undefined2 local_166; + undefined2 local_164; + undefined2 local_162; + int local_160; + int local_15e; + undefined1 local_15c [256]; + undefined1 local_5c [41]; + undefined1 local_33 [41]; + undefined2 local_a; + undefined4 local_8; + undefined2 local_4; + + uVar1 = in_stack_0000000c; + local_4 = SELECTPALETTE(unaff_CS,0,DAT_1028_444e); + UNREALIZEOBJECT(0x1228,DAT_1028_444e,uVar1); + REALIZEPALETTE(0x1228,in_stack_0000000c); + uVar1 = CREATECOMPATIBLEDC(0x1228,in_stack_0000000c); + local_16a = uVar1; + local_164 = SELECTOBJECT(0x1228,DAT_1028_0867); + local_16c = CREATECOMPATIBLEDC(0x1228,in_stack_0000000c,uVar1); + local_168 = CREATECOMPATIBLEBITMAP(0x1228,300,0x168); + uVar1 = local_16c; + local_166 = SELECTOBJECT(0x1228,local_168); + local_8 = GETTEXTCOLOR(0x1228,local_16c,uVar1,in_stack_0000000c); + local_a = SETTEXTALIGN(0x1228,6); + local_162 = SETBKMODE(0x1228,1); + BITBLT(0x1228,0x20,0xcc,0,0,local_16a,300,0x168,0,0); + SETTEXTCOLOR(0x1228,0,0); + FUN_1008_2ee5(0x2f4,0x1028,local_33,unaff_SS); + uVar7 = 0xb4; + uVar6 = 0x1b; + puVar3 = local_33; + uVar1 = unaff_SS; + uVar2 = FUN_1008_2e92(local_33,unaff_SS); + TEXTOUT(0x1008,uVar2,puVar3,uVar1,uVar6,uVar7); + local_15e = 1; + while( true ) { + local_160 = local_15e * 0x14 + 0x28; + SETTEXTALIGN(0x1228,0); + if (local_15e < 10) { + FUN_1008_2ee5(0x300,0x1028,local_33,unaff_SS); + } + else { + FUN_1008_2ee5(0x2ff,0x1028,local_33,unaff_SS); + } + FUN_1020_1629(0xff,local_15c,unaff_SS,0,local_15e,local_15e >> 0xf); + FUN_1008_2f2f(local_15c,unaff_SS,local_5c,unaff_SS); + FUN_1008_2f4d(local_5c,unaff_SS,local_33,unaff_SS); + FUN_1008_2f4d(0x303,0x1028,local_33,unaff_SS); + puVar3 = local_5c; + puVar5 = local_26c; + uVar1 = unaff_SS; + uVar2 = unaff_SS; + FUN_1020_0b00(0x16,local_15e * 0x16 + 0x890,0x1028); + FUN_1008_2f2f(puVar5,uVar1,puVar3,uVar2); + FUN_1008_2f4d(local_5c,unaff_SS,local_33,unaff_SS); + uVar6 = 0x1e; + puVar3 = local_33; + uVar1 = unaff_SS; + iVar4 = local_160; + uVar2 = FUN_1008_2e92(local_33,unaff_SS); + TEXTOUT(0x1008,uVar2,puVar3,uVar1,iVar4,uVar6); + SETTEXTALIGN(0x1228,2); + FUN_1020_1629(0xff,local_15c,unaff_SS,0,*(undefined2 *)(local_15e * 4 + 0x87a), + *(undefined2 *)(local_15e * 4 + 0x87c)); + FUN_1008_2f2f(local_15c,unaff_SS,local_33,unaff_SS); + uVar6 = 0x140; + puVar3 = local_33; + uVar1 = unaff_SS; + iVar4 = local_160; + uVar2 = FUN_1008_2e92(local_33,unaff_SS); + TEXTOUT(0x1008,uVar2,puVar3,uVar1,iVar4,uVar6); + if (local_15e == 10) break; + local_15e = local_15e + 1; + } + BITBLT(0x1228,0x20,0xcc,0,0,local_16c,300,0x168,0,0); + uVar7 = local_16c; + SETTEXTCOLOR(0x1228,local_8); + uVar6 = local_16c; + SETTEXTALIGN(0x1228,local_a); + uVar2 = local_16c; + SETBKMODE(0x1228,local_162); + uVar1 = local_16c; + SELECTOBJECT(0x1228,local_166); + DELETEOBJECT(0x1228,local_168,uVar1,uVar2,uVar6,uVar7); + DELETEDC(0x1228,local_16c); + uVar1 = local_16a; + SELECTOBJECT(0x1228,local_164); + DELETEDC(0x1228,local_16a,uVar1); + SELECTPALETTE(0x1228,0,local_4); + return; +} + + +/* ===== 1000:5ee6 FUN_1000_5ee6 ===== */ + +void __stdcall16far FUN_1000_5ee6(undefined4 param_1) + +{ + FUN_1008_00e2(); + FUN_1018_0f38((int)param_1,(int)((ulong)param_1 >> 0x10)); + return; +} + + +/* ===== 1000:5efc FUN_1000_5efc ===== */ + +undefined2 __stdcall16far FUN_1000_5efc(undefined4 param_1,undefined4 param_2) + +{ + undefined2 local_4; + + if ((*(uint *)((int)param_2 + 8) & 0xff) != 0x1c) { + FUN_1008_00e2(); + FUN_1018_0f38((int)param_1,(int)((ulong)param_1 >> 0x10)); + } + return local_4; +} + + +/* ===== 1000:5f29 FUN_1000_5f29 ===== */ + +undefined2 __stdcall16far FUN_1000_5f29(undefined4 param_1,undefined4 param_2) + +{ + int iVar1; + undefined2 uVar2; + undefined2 uVar3; + int iVar4; + int iVar5; + undefined2 uVar6; + undefined2 uVar7; + undefined2 uVar8; + undefined2 uVar9; + undefined2 local_4; + + local_4 = 1; + uVar6 = (undefined2)((ulong)param_2 >> 0x10); + iVar4 = (int)param_2; + uVar7 = (undefined2)((ulong)param_1 >> 0x10); + iVar5 = (int)param_1; + if (*(int *)(iVar4 + 4) != *(int *)(iVar5 + 4)) { + uVar9 = *(undefined2 *)(iVar4 + 4); + iVar1 = GETPARENT(); + if (iVar1 != *(int *)(iVar5 + 4)) { + uVar7 = *(undefined2 *)(iVar5 + 4); + uVar2 = GETDC(0x1228,uVar7,uVar9); + uVar8 = uVar2; + uVar3 = SELECTPALETTE(0x1228,1,DAT_1028_444e); + REALIZEPALETTE(0x1228,uVar2,uVar8,uVar7,uVar9,uVar3); + UPDATECOLORS(0x1228,uVar2); + SELECTPALETTE(0x1228,0,uVar3); + RELEASEDC(0x1228,uVar2); + *(undefined2 *)(iVar4 + 10) = 0; + *(undefined2 *)(iVar4 + 0xc) = 0; + local_4 = 0; + } + } + return local_4; +} + + +/* ===== 1000:5fc0 FUN_1000_5fc0 ===== */ + +int __stdcall16far FUN_1000_5fc0(undefined4 param_1,undefined4 param_2) + +{ + undefined2 uVar1; + undefined2 uVar2; + int iVar3; + undefined2 uVar4; + undefined2 uVar5; + undefined2 uVar6; + + uVar4 = (undefined2)((ulong)param_1 >> 0x10); + uVar5 = *(undefined2 *)((int)param_1 + 4); + uVar1 = GETDC(); + uVar6 = uVar1; + uVar2 = SELECTPALETTE(0x1228,0,DAT_1028_444e); + iVar3 = REALIZEPALETTE(0x1228,uVar1,uVar6,uVar5); + SELECTPALETTE(0x1228,0,uVar2); + RELEASEDC(0x1228,uVar1); + if (0 < iVar3) { + INVALIDATERECT(0x1228,0,0,0,*(undefined2 *)((int)param_1 + 4)); + } + uVar5 = (undefined2)((ulong)param_2 >> 0x10); + *(int *)((int)param_2 + 10) = iVar3; + *(undefined2 *)((int)param_2 + 0xc) = 0; + return iVar3; +} + + +/* ===== 1000:6040 FUN_1000_6040 ===== */ + +void __stdcall16far FUN_1000_6040(undefined4 param_1,uint *param_2) + +{ + uint uVar1; + undefined2 uVar2; + + uVar2 = (undefined2)((ulong)param_2 >> 0x10); + FUN_1018_1274((int)param_1,(int)((ulong)param_1 >> 0x10),(uint *)param_2,uVar2); + uVar1 = GETSTOCKOBJECT(0x1018,5); + ((uint *)param_2)[8] = uVar1; + *param_2 = *param_2 | 0x3800; + return; +} + + +/* ===== 1000:6073 FUN_1000_6073 ===== */ + +undefined4 __stdcall16far +FUN_1000_6073(undefined4 param_1,undefined2 param_2,undefined2 param_3,undefined2 param_4, + undefined2 param_5,undefined2 param_6) + +{ + int iVar1; + undefined2 uVar2; + bool bVar3; + + bVar3 = true; + FUN_1020_03ef(); + if (!bVar3) { + uVar2 = (undefined2)((ulong)param_1 >> 0x10); + iVar1 = (int)param_1; + FUN_1018_1106(iVar1,uVar2,0,param_3,param_4,param_5,param_6); + *(undefined2 *)(iVar1 + 0x41) = param_5; + *(undefined2 *)(iVar1 + 0x43) = param_6; + *(undefined2 *)(iVar1 + 0x2d) = 0x280; + *(undefined2 *)(iVar1 + 0x2f) = 0x1cc; + *(undefined2 *)(iVar1 + 0x29) = 0; + *(undefined2 *)(iVar1 + 0x2b) = 0; + *(undefined2 *)(iVar1 + 0x21) = 2; + *(undefined2 *)(iVar1 + 0x23) = 0x4600; + SETFOCUS(0x1018,*(undefined2 *)(iVar1 + 4)); + } + return param_1; +} + + +/* ===== 1000:60e7 FUN_1000_60e7 ===== */ + +void __stdcall16far FUN_1000_60e7(undefined4 param_1) + +{ + int iVar1; + int iVar2; + undefined2 uVar3; + undefined2 uVar4; + + uVar3 = (undefined2)((ulong)param_1 >> 0x10); + iVar1 = (int)param_1; + uVar4 = (undefined2)((ulong)*(undefined4 *)(iVar1 + 0x41) >> 0x10); + iVar2 = (int)*(undefined4 *)(iVar1 + 0x41); + *(undefined2 *)(iVar2 + 0x45) = 0; + *(undefined2 *)(iVar2 + 0x47) = 0; + *(undefined2 *)(iVar1 + 0x41) = 0; + *(undefined2 *)(iVar1 + 0x43) = 0; + uVar4 = DAT_1028_0867; + DELETEOBJECT(); + FUN_1018_121b(iVar1,uVar3,0); + FUN_1020_0439(uVar4); + return; +} + + +/* ===== 1000:6129 FUN_1000_6129 ===== */ + +void __stdcall16far FUN_1000_6129(undefined4 param_1) + +{ + undefined2 uVar1; + undefined2 uVar2; + undefined2 uVar3; + + uVar2 = (undefined2)((ulong)param_1 >> 0x10); + FUN_1018_170c((int)param_1,uVar2); + uVar3 = 0; + uVar1 = LOADCURSOR(0x1018,0x7f02,0); + SETCURSOR(0x1228,uVar1,uVar3); + DAT_1028_0867 = FUN_1008_149d(DAT_1028_07cd + 1000,0,DAT_1028_06fe); + SETFOCUS(0x1008,*(undefined2 *)((int)param_1 + 4)); + return; +} + + +/* ===== 1000:616e FUN_1000_616e ===== */ + +void __stdcall16far FUN_1000_616e(void) + +{ + undefined2 uVar1; + undefined2 uVar2; + undefined2 uVar3; + undefined2 uVar4; + undefined2 unaff_CS; + undefined2 in_stack_0000000c; + undefined2 uVar5; + undefined2 uVar6; + + uVar4 = in_stack_0000000c; + uVar1 = SELECTPALETTE(unaff_CS,0,DAT_1028_444e); + UNREALIZEOBJECT(0x1228,DAT_1028_444e,uVar4); + REALIZEPALETTE(0x1228,in_stack_0000000c); + uVar2 = CREATECOMPATIBLEDC(0x1228,in_stack_0000000c); + uVar6 = uVar2; + uVar3 = SELECTOBJECT(0x1228,DAT_1028_0867); + uVar5 = in_stack_0000000c; + BITBLT(0x1228,0x20,0xcc,0,0,uVar2,0x1cc,0x280,0,0); + uVar4 = uVar2; + SELECTOBJECT(0x1228,uVar3); + DELETEDC(0x1228,uVar2,uVar4,uVar5,uVar6); + SELECTPALETTE(0x1228,0,uVar1); + uVar5 = 0; + uVar4 = LOADCURSOR(0x1228,0x7f00,0); + SETCURSOR(0x1228,uVar4,uVar5,in_stack_0000000c); + return; +} + + +/* ===== 1000:6202 FUN_1000_6202 ===== */ + +void __stdcall16far FUN_1000_6202(undefined4 param_1) + +{ + FUN_1008_00e2(); + FUN_1018_0f38((int)param_1,(int)((ulong)param_1 >> 0x10)); + return; +} + + +/* ===== 1000:6218 FUN_1000_6218 ===== */ + +undefined2 __stdcall16far FUN_1000_6218(undefined4 param_1,undefined4 param_2) + +{ + undefined2 local_4; + + if ((*(uint *)((int)param_2 + 8) & 0xff) != 0x3b) { + FUN_1008_00e2(); + FUN_1018_0f38((int)param_1,(int)((ulong)param_1 >> 0x10)); + } + return local_4; +} + + +/* ===== 1000:6245 FUN_1000_6245 ===== */ + +undefined2 __stdcall16far FUN_1000_6245(undefined4 param_1,undefined4 param_2) + +{ + int iVar1; + undefined2 uVar2; + undefined2 uVar3; + int iVar4; + int iVar5; + undefined2 uVar6; + undefined2 uVar7; + undefined2 uVar8; + undefined2 uVar9; + undefined2 local_4; + + local_4 = 1; + uVar6 = (undefined2)((ulong)param_2 >> 0x10); + iVar4 = (int)param_2; + uVar7 = (undefined2)((ulong)param_1 >> 0x10); + iVar5 = (int)param_1; + if (*(int *)(iVar4 + 4) != *(int *)(iVar5 + 4)) { + uVar9 = *(undefined2 *)(iVar4 + 4); + iVar1 = GETPARENT(); + if (iVar1 != *(int *)(iVar5 + 4)) { + uVar7 = *(undefined2 *)(iVar5 + 4); + uVar2 = GETDC(0x1228,uVar7,uVar9); + uVar8 = uVar2; + uVar3 = SELECTPALETTE(0x1228,1,DAT_1028_444e); + REALIZEPALETTE(0x1228,uVar2,uVar8,uVar7,uVar9,uVar3); + UPDATECOLORS(0x1228,uVar2); + SELECTPALETTE(0x1228,0,uVar3); + RELEASEDC(0x1228,uVar2); + *(undefined2 *)(iVar4 + 10) = 0; + *(undefined2 *)(iVar4 + 0xc) = 0; + local_4 = 0; + } + } + return local_4; +} + + +/* ===== 1000:62dc FUN_1000_62dc ===== */ + +int __stdcall16far FUN_1000_62dc(undefined4 param_1,undefined4 param_2) + +{ + undefined2 uVar1; + undefined2 uVar2; + int iVar3; + undefined2 uVar4; + undefined2 uVar5; + undefined2 uVar6; + + uVar4 = (undefined2)((ulong)param_1 >> 0x10); + uVar5 = *(undefined2 *)((int)param_1 + 4); + uVar1 = GETDC(); + uVar6 = uVar1; + uVar2 = SELECTPALETTE(0x1228,0,DAT_1028_444e); + iVar3 = REALIZEPALETTE(0x1228,uVar1,uVar6,uVar5); + SELECTPALETTE(0x1228,0,uVar2); + RELEASEDC(0x1228,uVar1); + if (0 < iVar3) { + INVALIDATERECT(0x1228,0,0,0,*(undefined2 *)((int)param_1 + 4)); + } + uVar5 = (undefined2)((ulong)param_2 >> 0x10); + *(int *)((int)param_2 + 10) = iVar3; + *(undefined2 *)((int)param_2 + 0xc) = 0; + return iVar3; +} + + +/* ===== 1000:635c FUN_1000_635c ===== */ + +void __stdcall16far +FUN_1000_635c(undefined2 param_1,undefined2 param_2,undefined2 param_3,undefined2 param_4, + undefined2 param_5,undefined2 param_6) + +{ + FUN_1008_07b6(param_1,param_2,param_3,param_4,param_5,param_6); + FUN_1008_093f(param_2,param_3,param_4,param_5,param_6); + return; +} + + +/* ===== 1000:638e FUN_1000_638e ===== */ + +undefined2 __stdcall16far FUN_1000_638e(undefined4 param_1,undefined4 param_2) + +{ + uint uVar1; + uint uVar2; + uint uVar3; + int iVar4; + int iVar5; + undefined2 in_BX; + int iVar6; + int iVar7; + undefined2 uVar8; + undefined2 uVar9; + undefined2 uVar10; + bool bVar11; + undefined2 uVar12; + byte local_a; + byte local_9; + + uVar8 = (undefined2)((ulong)param_1 >> 0x10); + iVar6 = (int)param_1; + iVar7 = (int)param_2; + uVar9 = (undefined2)((ulong)param_2 >> 0x10); + if ((*(int *)(iVar6 + 0x41) == 0 && *(int *)(iVar6 + 0x43) == 0) && + (*(int *)(iVar6 + 0x45) == 0 && *(int *)(iVar6 + 0x47) == 0)) { + uVar1 = *(uint *)(iVar7 + 8) & 0xff; + if ((DAT_1028_07cf != '\0') && (uVar1 == 0x3c)) { + DAT_1028_0855 = 0; + DAT_1028_0857 = 0; + DAT_1028_07c7 = 1; + } + if ((DAT_1028_07cf != '\0') && (uVar1 == 0x41)) { + DAT_1028_07d3 = DAT_1028_3340; + DAT_1028_07d5 = DAT_1028_3342; + DAT_1028_07d7 = DAT_1028_3344; + DAT_1028_07d9 = DAT_1028_3346; + *(undefined2 *)(iVar6 + 0xbaa) = 0; + *(undefined2 *)(iVar6 + 0xbac) = 0; + *(undefined2 *)(iVar6 + 0xbae) = 0; + *(undefined2 *)(iVar6 + 0xbb0) = 0; + } + if ((((*(char *)(iVar6 + 0xbdd) == '\0') && (*(char *)(iVar6 + 0xbdf) == '\0')) && + (uVar1 == 0x50)) && (DAT_1028_07d0 != 0)) { + iVar4 = *(int *)(iVar6 + 0x5c); + FUN_1020_08a9(); + FUN_1020_100b(); + uVar3 = FUN_1020_1017(); + uVar1 = *(uint *)(iVar6 + 0xbae); + iVar5 = *(int *)(iVar6 + 0xbb0); + *(int *)(iVar6 + 0xbae) = uVar1 - uVar3; + *(int *)(iVar6 + 0xbb0) = (iVar5 - iVar4) - (uint)(uVar1 < uVar3); + iVar4 = *(int *)(iVar6 + 0x56); + iVar5 = (~*(uint *)(iVar6 + 0x58) + 1) - (uint)(iVar4 != 0); + if ((*(int *)(iVar6 + 0xbb0) < iVar5) || + ((*(int *)(iVar6 + 0xbb0) <= iVar5 && + (*(uint *)(iVar6 + 0xbae) <= (uint)-iVar4 && -*(uint *)(iVar6 + 0xbae) != iVar4)))) { + uVar3 = FUN_1020_14a4(*(undefined2 *)(iVar6 + 0x56)); + iVar4 = *(int *)(iVar6 + 0x56); + uVar1 = *(uint *)(iVar6 + 0x58); + uVar2 = -iVar4; + *(int *)(iVar6 + 0xbae) = uVar2 + uVar3 / 0x28; + *(int *)(iVar6 + 0xbb0) = + ((~uVar1 + 1) - (uint)(iVar4 != 0)) + (uint)CARRY2(uVar2,uVar3 / 0x28); + } + else { + uVar1 = *(uint *)(iVar6 + 0x58); + FUN_1020_100b(); + FUN_1020_0ff7(); + iVar4 = FUN_1020_1017(); + iVar5 = (~uVar1 + 1) - (uint)(iVar4 != 0); + if ((iVar5 < *(int *)(iVar6 + 0xbb0)) || + ((iVar5 <= *(int *)(iVar6 + 0xbb0) && + ((uint)-iVar4 < *(uint *)(iVar6 + 0xbae) || -*(uint *)(iVar6 + 0xbae) == iVar4)))) { + uVar3 = FUN_1020_14a4(*(undefined2 *)(iVar6 + 0x56)); + uVar1 = *(uint *)(iVar6 + 0xbae); + iVar4 = *(int *)(iVar6 + 0xbb0); + *(int *)(iVar6 + 0xbae) = uVar1 - uVar3 / 0x28; + *(int *)(iVar6 + 0xbb0) = iVar4 - (uint)(uVar1 < uVar3 / 0x28); + } + } + DAT_1028_07fb = *(uint *)(iVar6 + 0xbae); + DAT_1028_07fd = *(int *)(iVar6 + 0xbb0); + *(undefined1 *)(iVar6 + 0xbdd) = 1; + *(undefined1 *)(iVar6 + 0xbde) = 0; + FUN_1008_0002(2); + uVar8 = GETDC(0x1008,*(undefined2 *)(iVar6 + 4)); + FUN_1000_635c(DAT_1028_0865,0x12,0x15,0x1aa,0x13a,uVar8); + RELEASEDC(0x1000,uVar8); + } + else if (uVar1 == 0x1d) { + *(undefined1 *)(iVar6 + 0xbda) = 0; + } + else if (uVar1 == 0x1c) { + *(undefined1 *)(iVar6 + 0xbdb) = 0; + } + else if ((DAT_1028_07c6 == '\0') && (((uVar1 == 0x2a || (uVar1 == 0x51)) || (uVar1 == 0x39)))) { + FUN_1008_0002(0x13); + if (uVar1 == 0x2a) { + FUN_1020_14a4(0x14); + iVar5 = 0; + uVar2 = FUN_1020_08a9(); + uVar3 = *(uint *)(iVar6 + 0xbaa); + iVar4 = *(int *)(iVar6 + 0xbac); + *(int *)(iVar6 + 0xbaa) = uVar3 - uVar2; + *(int *)(iVar6 + 0xbac) = (iVar4 - iVar5) - (uint)(uVar3 < uVar2); + } + else if (uVar1 == 0x51) { + FUN_1020_14a4(0x14); + iVar5 = 0; + uVar2 = FUN_1020_08a9(); + uVar3 = *(uint *)(iVar6 + 0xbaa); + iVar4 = *(int *)(iVar6 + 0xbac); + *(int *)(iVar6 + 0xbaa) = uVar2 + *(uint *)(iVar6 + 0xbaa); + *(int *)(iVar6 + 0xbac) = iVar5 + iVar4 + (uint)CARRY2(uVar2,uVar3); + } + else if (uVar1 == 0x39) { + iVar4 = *(int *)(iVar6 + 0x5c); + uVar10 = FUN_1020_100b(); + FUN_1020_14c1(uVar10,in_BX,iVar4); + FUN_1020_0ff7(); + FUN_1020_0feb(); + FUN_1020_0ff7(); + uVar2 = FUN_1020_1017(); + uVar3 = *(uint *)(iVar6 + 0xbaa); + iVar5 = *(int *)(iVar6 + 0xbac); + *(int *)(iVar6 + 0xbaa) = uVar2 + *(uint *)(iVar6 + 0xbaa); + *(int *)(iVar6 + 0xbac) = iVar4 + iVar5 + (uint)CARRY2(uVar2,uVar3); + FUN_1020_14a4(0x14); + iVar5 = 0; + uVar2 = FUN_1020_08a9(); + uVar3 = *(uint *)(iVar6 + 0xbae); + iVar4 = *(int *)(iVar6 + 0xbb0); + *(int *)(iVar6 + 0xbae) = uVar3 - uVar2; + *(int *)(iVar6 + 0xbb0) = (iVar4 - iVar5) - (uint)(uVar3 < uVar2); + } + if (1 < *(byte *)(iVar6 + 0x61)) { + if (uVar1 == 0x2a) { + iVar4 = *(int *)(iVar6 + 0x5c); + uVar1 = FUN_1020_08a9(); + bVar11 = DAT_1028_07f3 < uVar1; + DAT_1028_07f3 = DAT_1028_07f3 - uVar1; + DAT_1028_07f5 = (DAT_1028_07f5 - iVar4) - (uint)bVar11; + iVar4 = *(int *)(iVar6 + 0x5c); + uVar1 = FUN_1020_08a9(); + bVar11 = DAT_1028_07f7 < uVar1; + DAT_1028_07f7 = DAT_1028_07f7 - uVar1; + DAT_1028_07f9 = (DAT_1028_07f9 - iVar4) - (uint)bVar11; + } + else if (uVar1 == 0x51) { + iVar4 = *(int *)(iVar6 + 0x5c); + uVar1 = FUN_1020_08a9(); + bVar11 = CARRY2(uVar1,DAT_1028_07f3); + DAT_1028_07f3 = uVar1 + DAT_1028_07f3; + DAT_1028_07f5 = iVar4 + DAT_1028_07f5 + (uint)bVar11; + iVar4 = *(int *)(iVar6 + 0x5c); + uVar1 = FUN_1020_08a9(); + bVar11 = CARRY2(uVar1,DAT_1028_07f7); + DAT_1028_07f7 = uVar1 + DAT_1028_07f7; + DAT_1028_07f9 = iVar4 + DAT_1028_07f9 + (uint)bVar11; + } + else if (uVar1 == 0x39) { + FUN_1020_14a4(0x15); + uVar1 = FUN_1020_08a9(); + FUN_1020_14a4(100); + FUN_1020_08a9(); + uVar3 = FUN_1020_08a9(); + bVar11 = CARRY2(uVar1,DAT_1028_07f3); + DAT_1028_07f3 = uVar1 + DAT_1028_07f3; + DAT_1028_07f5 = ((int)uVar1 >> 0xf) + DAT_1028_07f5 + (uint)bVar11; + bVar11 = CARRY2(uVar1,DAT_1028_07f7); + DAT_1028_07f7 = uVar1 + DAT_1028_07f7; + DAT_1028_07f9 = ((int)uVar1 >> 0xf) + DAT_1028_07f9 + (uint)bVar11; + bVar11 = CARRY2(uVar3,DAT_1028_07fb); + DAT_1028_07fb = uVar3 + DAT_1028_07fb; + DAT_1028_07fd = ((int)uVar3 >> 0xf) + DAT_1028_07fd + (uint)bVar11; + bVar11 = CARRY2(uVar3,DAT_1028_07ff); + DAT_1028_07ff = uVar3 + DAT_1028_07ff; + DAT_1028_0801 = ((int)uVar3 >> 0xf) + DAT_1028_0801 + (uint)bVar11; + } + } + *(int *)(iVar6 + 0x5e) = *(int *)(iVar6 + 0x5e) + 0x19; + iVar4 = FUN_1020_14a4(10); + if (iVar4 + 0x1eU < *(uint *)(iVar6 + 0x5e)) { + FUN_1008_0002(0x14); + DAT_1028_07c6 = '\x01'; + *(undefined1 *)(iVar6 + 0xbda) = 0; + *(undefined1 *)(iVar6 + 0xbdb) = 0; + uVar8 = GETDC(0x1008,*(undefined2 *)(iVar6 + 4)); + FUN_1008_0837(0x14,0x94,0xf3,0x54,uVar8); + FUN_1008_093f(0x14,0x94,0xf3,0x54,uVar8); + RELEASEDC(0x1008,uVar8); + } + } + else if (uVar1 == 0x58) { + if (DAT_1028_43f2 == '\0') { + if (DAT_1028_43ee != 0) { + DAT_1028_43f2 = '\x01'; + } + } + else { + DAT_1028_43f2 = '\0'; + } + } + else if (((*(char *)(iVar6 + 0xbde) != '\0') && ((uVar1 == 0x4e || (uVar1 == 0x1b)))) && + (DAT_1028_07d0 < 4)) { + DAT_1028_07c9 = 0; + uVar10 = 0x1008; + FUN_1008_0002(1); + DAT_1028_07d0 = DAT_1028_07d0 + 1; + *(undefined1 *)(iVar6 + 0xbdd) = 0; + *(undefined1 *)(iVar6 + 0xbdf) = 0; + DAT_1028_07c5 = 1; + *(undefined1 *)(iVar6 + 0x61) = 1; + DAT_1028_0874 = 0; + local_9 = 1; + while( true ) { + *(undefined2 *)((uint)local_9 * 2 + 0x81f) = 0xffff; + local_a = 1; + while( true ) { + *(undefined1 *)(iVar6 + (uint)local_9 * 0xaf + (uint)local_a + 0x61) = + *(undefined1 *)(iVar6 + (uint)local_a + 0x3cc); + *(undefined2 *)(iVar6 + (uint)local_9 * 0x15e + (uint)local_a * 2 + 0x36c) = + *(undefined2 *)(iVar6 + (uint)local_a * 2 + 0xa42); + if (local_a == 0xaf) break; + local_a = local_a + 1; + } + uVar10 = GETDC(uVar10,*(undefined2 *)(iVar6 + 4)); + if (DAT_1028_07d0 < local_9) { + *(undefined2 *)((uint)local_9 * 4 + 0x97e) = 0; + *(undefined2 *)((uint)local_9 * 4 + 0x980) = 0; + FUN_1008_08bb(0x2a,0x11c,(local_9 - 1) * 0x2d + 0x10e,0x15c,uVar10); + FUN_1008_093f(0x2a,0x11c,(local_9 - 1) * 0x2d + 0x10e,0x15c,uVar10); + } + FUN_1008_0dbd(0,uVar10); + uVar12 = *(undefined2 *)(iVar6 + 4); + RELEASEDC(0x1008,uVar10); + if (local_9 == 1) { + uVar10 = GETDC(0x1228,*(undefined2 *)(iVar6 + 4),uVar12); + FUN_1008_0837(0x1e,0x11c,0xe8,0x173,uVar10); + FUN_1008_093f(0x1e,0x11c,0xe8,0x173,uVar10); + FUN_1008_0996(uVar10,0,0); + FUN_1008_0b9e(1,uVar10); + RELEASEDC(0x1008,uVar10); + } + uVar10 = 0x1228; + if (local_9 == 4) break; + local_9 = local_9 + 1; + } + local_a = 1; + while( true ) { + *(undefined1 *)((uint)local_a * 0x53 + 0x98f) = + *(undefined1 *)(iVar6 + (uint)local_a + 0x3cc); + *(undefined2 *)((uint)local_a * 0x53 + 0x99e) = + *(undefined2 *)(iVar6 + (uint)local_a * 2 + 0xa42); + if (local_a == 0xaf) break; + local_a = local_a + 1; + } + DAT_1028_07d1 = 1; + } + } + *(undefined2 *)(iVar7 + 10) = 0; + *(undefined2 *)(iVar7 + 0xc) = 0; + return 0; +} + + +/* ===== 1000:6b37 FUN_1000_6b37 ===== */ + +void __stdcall16far FUN_1000_6b37(int param_1,undefined2 param_2) + +{ + undefined2 uVar1; + undefined2 uVar2; + undefined2 unaff_SS; + undefined2 uVar3; + undefined2 uVar4; + + uVar2 = *(undefined2 *)(param_1 + -0xc); + uVar1 = CREATECOMPATIBLEDC(); + *(undefined2 *)(param_1 + -0xe) = uVar1; + uVar2 = CREATECOMPATIBLEDC(0x1228,*(undefined2 *)(param_1 + -0xc),uVar2); + *(undefined2 *)(param_1 + -0x10) = uVar2; + uVar2 = SELECTOBJECT(0x1228,DAT_1028_085b); + *(undefined2 *)(param_1 + -0x12) = uVar2; + uVar2 = *(undefined2 *)(param_1 + -0x10); + uVar1 = SELECTOBJECT(0x1228,DAT_1028_0865); + *(undefined2 *)(param_1 + -0x14) = uVar1; + uVar1 = *(undefined2 *)(param_1 + -0xe); + BITBLT(0x1228,0x20,0xcc,0,param_2,*(undefined2 *)(param_1 + -0x10),0x12,0x15,0x1aa,0x13a); + uVar4 = *(undefined2 *)(param_1 + -0x10); + SELECTOBJECT(0x1228,*(undefined2 *)(param_1 + -0x14)); + uVar3 = *(undefined2 *)(param_1 + -0xe); + SELECTOBJECT(0x1228,*(undefined2 *)(param_1 + -0x12)); + DELETEDC(0x1228,*(undefined2 *)(param_1 + -0x10),uVar3,uVar4,uVar1,uVar2); + DELETEDC(0x1228,*(undefined2 *)(param_1 + -0xe)); + FUN_1008_093f(0x12,0x15,0x1aa,0x13a,*(undefined2 *)(param_1 + -0xc)); + return; +} + + +/* ===== 1000:6bf8 FUN_1000_6bf8 ===== */ + +undefined2 __stdcall16far FUN_1000_6bf8(undefined4 param_1,undefined4 param_2) + +{ + int iVar1; + uint uVar2; + uint uVar3; + undefined2 uVar4; + uint uVar5; + uint uVar6; + int iVar7; + int iVar8; + int iVar9; + undefined2 uVar10; + undefined2 uVar11; + undefined4 uVar12; + undefined2 local_4; + + uVar10 = (undefined2)((ulong)param_1 >> 0x10); + iVar8 = (int)param_1; + uVar6 = *(uint *)(iVar8 + 0x5c); + iVar1 = FUN_1020_08a9(); + iVar9 = (int)param_2; + uVar11 = (undefined2)((ulong)param_2 >> 0x10); + if ((*(int *)(iVar8 + 0x41) == 0 && *(int *)(iVar8 + 0x43) == 0) && + (*(int *)(iVar8 + 0x45) == 0 && *(int *)(iVar8 + 0x47) == 0)) { + uVar2 = *(uint *)(iVar9 + 8) & 0xff; + if (uVar2 == 0x3b) { + uVar12 = FUN_1000_6073(0,0,0x17e,0x306,0x1028,iVar8,uVar10); + uVar12 = (*(code *)*(undefined2 *)(*DAT_1028_064e + 0x34)) + (0x1000,(int *)DAT_1028_064e,(int)((ulong)DAT_1028_064e >> 0x10),uVar12); + *(undefined2 *)(iVar8 + 0x45) = (int)uVar12; + *(undefined2 *)(iVar8 + 0x47) = (int)((ulong)uVar12 >> 0x10); + FUN_1018_0e9e((int)*(undefined4 *)(iVar8 + 0x45), + (int)((ulong)*(undefined4 *)(iVar8 + 0x45) >> 0x10),1); + return local_4; + } + if (((*(char *)(iVar8 + 0xbdd) == '\0') && (*(char *)(iVar8 + 0xbdf) == '\0')) && + (uVar2 == 0x50)) { + uVar5 = uVar6; + uVar3 = FUN_1020_08e6(); + uVar2 = *(uint *)(iVar8 + 0xbae); + iVar7 = *(int *)(iVar8 + 0xbb0); + *(int *)(iVar8 + 0xbae) = uVar2 - uVar3; + *(int *)(iVar8 + 0xbb0) = (iVar7 - uVar5) - (uint)(uVar2 < uVar3); + *(undefined2 *)(iVar8 + 0xbaa) = 0; + *(undefined2 *)(iVar8 + 0xbac) = 0; + if (DAT_1028_07d0 != '\0') { + uVar4 = GETDC(0x1020,*(undefined2 *)(iVar8 + 4)); + iVar7 = (~uVar6 + 1) - (uint)(iVar1 != 0); + if ((iVar7 < *(int *)(iVar8 + 0xbb0)) || + ((iVar7 <= *(int *)(iVar8 + 0xbb0) && ((uint)-iVar1 < *(uint *)(iVar8 + 0xbae))))) { + FUN_1000_6b37(&stack0xfffe,0x15); + } + else { + uVar2 = uVar6; + uVar5 = FUN_1020_08a9(); + if (((int)uVar2 < *(int *)(iVar8 + 0xbb0)) || + (((int)uVar2 <= *(int *)(iVar8 + 0xbb0) && (uVar5 < *(uint *)(iVar8 + 0xbae))))) { + FUN_1000_6b37(&stack0xfffe,0x2a); + } + else { + uVar2 = uVar6; + uVar5 = FUN_1020_08a9(); + if (((int)uVar2 < *(int *)(iVar8 + 0xbb0)) || + (((int)uVar2 <= *(int *)(iVar8 + 0xbb0) && (uVar5 < *(uint *)(iVar8 + 0xbae))))) { + FUN_1000_6b37(&stack0xfffe,0x3f); + } + else { + uVar2 = uVar6; + uVar5 = FUN_1020_08a9(); + if (((int)uVar2 < *(int *)(iVar8 + 0xbb0)) || + (((int)uVar2 <= *(int *)(iVar8 + 0xbb0) && (uVar5 < *(uint *)(iVar8 + 0xbae))))) { + FUN_1000_6b37(&stack0xfffe,0x54); + } + else { + uVar2 = uVar6; + uVar5 = FUN_1020_08a9(); + if (((int)uVar2 < *(int *)(iVar8 + 0xbb0)) || + (((int)uVar2 <= *(int *)(iVar8 + 0xbb0) && (uVar5 < *(uint *)(iVar8 + 0xbae))))) + { + FUN_1000_6b37(&stack0xfffe,0x69); + } + else { + uVar2 = uVar6; + uVar5 = FUN_1020_08a9(); + if (((int)uVar2 < *(int *)(iVar8 + 0xbb0)) || + (((int)uVar2 <= *(int *)(iVar8 + 0xbb0) && (uVar5 < *(uint *)(iVar8 + 0xbae)))) + ) { + FUN_1000_6b37(&stack0xfffe,0x7e); + } + else { + uVar2 = uVar6; + uVar5 = FUN_1020_08a9(); + if (((int)uVar2 < *(int *)(iVar8 + 0xbb0)) || + (((int)uVar2 <= *(int *)(iVar8 + 0xbb0) && (uVar5 < *(uint *)(iVar8 + 0xbae)) + ))) { + FUN_1000_6b37(&stack0xfffe,0x93); + } + else { + uVar2 = uVar6; + uVar5 = FUN_1020_08a9(); + if (((int)uVar2 < *(int *)(iVar8 + 0xbb0)) || + (((int)uVar2 <= *(int *)(iVar8 + 0xbb0) && + (uVar5 < *(uint *)(iVar8 + 0xbae))))) { + FUN_1000_6b37(&stack0xfffe,0xa8); + } + else { + uVar2 = uVar6; + uVar5 = FUN_1020_08a9(); + if (((int)uVar2 < *(int *)(iVar8 + 0xbb0)) || + (((int)uVar2 <= *(int *)(iVar8 + 0xbb0) && + (uVar5 < *(uint *)(iVar8 + 0xbae))))) { + FUN_1000_6b37(&stack0xfffe,0xbd); + } + else { + uVar2 = FUN_1020_08a9(); + if (((int)uVar6 < *(int *)(iVar8 + 0xbb0)) || + (((int)uVar6 <= *(int *)(iVar8 + 0xbb0) && + (uVar2 < *(uint *)(iVar8 + 0xbae))))) { + FUN_1000_6b37(&stack0xfffe,0xd2); + } + else { + FUN_1000_6b37(&stack0xfffe,0xe7); + } + } + } + } + } + } + } + } + } + } + RELEASEDC(0x1000,uVar4); + } + } + else if (DAT_1028_07c6 == '\0') { + if (uVar2 == 0x1d) { + *(undefined1 *)(iVar8 + 0xbda) = 1; + } + if (uVar2 == 0x1c) { + *(undefined1 *)(iVar8 + 0xbdb) = 1; + } + } + } + *(undefined2 *)(iVar9 + 10) = 0; + *(undefined2 *)(iVar9 + 0xc) = 0; + return 0; +} + + +/* ===== 1000:6f27 FUN_1000_6f27 ===== */ + +void __stdcall16far FUN_1000_6f27(int param_1) + +{ + undefined1 uVar1; + int iVar2; + undefined2 uVar3; + undefined2 uVar4; + undefined2 uVar5; + undefined2 uVar6; + undefined2 uVar7; + undefined2 uVar8; + undefined2 uVar9; + undefined2 uVar10; + undefined2 unaff_SS; + undefined2 uVar11; + undefined2 uVar12; + undefined2 uVar13; + undefined2 uVar14; + undefined2 uVar15; + undefined2 uVar16; + undefined2 local_24; + undefined2 local_22; + undefined2 local_20; + undefined2 local_1e; + undefined2 local_1c; + undefined2 local_1a; + undefined2 local_18; + undefined2 local_16; + undefined2 local_14; + undefined2 local_12; + undefined2 local_10; + + uVar10 = *(undefined2 *)((int)*(undefined4 *)(param_1 + 6) + 4); + uVar3 = GETDC(); + uVar4 = CREATECOMPATIBLEDC(0x1228,uVar3,uVar10); + uVar5 = CREATECOMPATIBLEDC(0x1228,uVar3); + uVar14 = uVar3; + uVar6 = CREATECOMPATIBLEBITMAP(0x1228,0x5a,0x5b); + uVar9 = uVar4; + uVar7 = SELECTOBJECT(0x1228,DAT_1028_0859); + uVar10 = uVar5; + uVar8 = SELECTOBJECT(0x1228,uVar6); + if ((DAT_1028_0857 < 0) || ((DAT_1028_0857 < 1 && (DAT_1028_0855 < 6)))) { + uVar16 = 0; + uVar15 = 0; + uVar13 = 0x5b; + uVar12 = 0x5a; + uVar11 = uVar4; + uVar9 = FUN_1020_08a9(uVar4,0x5a,0x5b,0,0,uVar5,uVar10,uVar9,uVar14); + uVar10 = 0x1228; + BITBLT(0x1020,0x20,0xcc,0,uVar9,uVar11,uVar12,uVar13,uVar15,uVar16); + } + else { + SELECTOBJECT(0x1228,DAT_1028_085d); + BITBLT(0x1228,0x20,0xcc,0x21,0x4f,uVar4,0x5a,0x5b,0,0); + SELECTOBJECT(0x1228,DAT_1028_0859); + iVar2 = DAT_1028_3371; + DAT_1028_3371 = DAT_1028_33c4; + DAT_1028_33c4 = DAT_1028_3417; + DAT_1028_3417 = DAT_1028_346a; + DAT_1028_346a = DAT_1028_34bd; + DAT_1028_34bd = iVar2; + uVar1 = *(undefined1 *)((int)*(undefined4 *)(param_1 + 6) + (uint)DAT_1028_07d1 * 0x14 + 0x476); + *(undefined1 *)((int)*(undefined4 *)(param_1 + 6) + (uint)DAT_1028_07d1 * 0x14 + 0x476) = + *(undefined1 *)((int)*(undefined4 *)(param_1 + 6) + (uint)DAT_1028_07d1 * 0x14 + 0x477); + *(undefined1 *)((int)*(undefined4 *)(param_1 + 6) + (uint)DAT_1028_07d1 * 0x14 + 0x477) = + *(undefined1 *)((int)*(undefined4 *)(param_1 + 6) + (uint)DAT_1028_07d1 * 0x14 + 0x478); + *(undefined1 *)((int)*(undefined4 *)(param_1 + 6) + (uint)DAT_1028_07d1 * 0x14 + 0x478) = + *(undefined1 *)((int)*(undefined4 *)(param_1 + 6) + (uint)DAT_1028_07d1 * 0x14 + 0x479); + *(undefined1 *)((int)*(undefined4 *)(param_1 + 6) + (uint)DAT_1028_07d1 * 0x14 + 0x479) = + *(undefined1 *)((int)*(undefined4 *)(param_1 + 6) + (uint)DAT_1028_07d1 * 0x14 + 0x47a); + *(undefined1 *)((int)*(undefined4 *)(param_1 + 6) + (uint)DAT_1028_07d1 * 0x14 + 0x47a) = uVar1; + local_10 = 0xf; + while( true ) { + uVar10 = 0x1000; + FUN_1000_7e92(param_1,local_10); + if (local_10 == 0x13) break; + local_10 = local_10 + 1; + } + } + if (DAT_1028_0855 == 1) { + uVar10 = 0x1008; + FUN_1008_0002(0xb); + local_12 = 9; + local_1c = 0x29; + local_14 = 0x17; + local_1e = 0xb; + local_16 = 0x38; + local_20 = 0xe; + local_18 = 0x3f; + local_22 = 0x2f; + local_1a = 0x23; + local_24 = 0x3f; + } + else if (DAT_1028_0855 == 2) { + local_12 = 0xb; + local_1c = 0x2d; + local_14 = 0x12; + local_1e = 0xd; + local_16 = 0x34; + local_20 = 0xb; + local_18 = 0x3f; + local_22 = 0x2a; + local_1a = 0x27; + local_24 = 0x40; + } + else if (DAT_1028_0855 == 3) { + local_12 = 0xd; + local_1c = 0x32; + local_14 = 0xf; + local_1e = 0x11; + local_16 = 0x2e; + local_20 = 9; + local_18 = 0x40; + local_22 = 0x25; + local_1a = 0x2c; + local_24 = 0x3e; + } + else if (DAT_1028_0855 == 4) { + local_12 = 0x11; + local_1c = 0x37; + local_14 = 0xb; + local_1e = 0x17; + local_16 = 0x27; + local_20 = 7; + local_18 = 0x40; + local_22 = 0x1e; + local_1a = 0x32; + local_24 = 0x3b; + } + else if (DAT_1028_0855 == 5) { + local_12 = 0x15; + local_1c = 0x3c; + local_14 = 9; + local_1e = 0x1c; + local_16 = 0x23; + local_20 = 7; + local_18 = 0x3e; + local_22 = 0x19; + local_1a = 0x36; + local_24 = 0x38; + } + else if (DAT_1028_0855 == 6) { + local_12 = 8; + local_1c = 0x23; + local_14 = 0x1a; + local_1e = 8; + local_16 = 0x3b; + local_20 = 0x12; + local_18 = 0x3b; + local_22 = 0x32; + local_1a = 0x1b; + local_24 = 0x3d; + } + if (DAT_1028_3371 != 0) { + BITBLT(uVar10,0xc6,0x88,0x11,0x1c7,uVar4,0x11,0x11,local_1c,local_12); + uVar10 = 0x1228; + BITBLT(0x1228,0x86,0xee,0,0x1c7,uVar4,0x11,0x11,local_1c,local_12); + } + if (DAT_1028_33c4 != 0) { + BITBLT(uVar10,0xc6,0x88,0x11,0x1c7,uVar4,0x11,0x11,local_1e,local_14); + uVar10 = 0x1228; + BITBLT(0x1228,0x86,0xee,0,0x1c7,uVar4,0x11,0x11,local_1e,local_14); + } + if (DAT_1028_3417 != 0) { + BITBLT(uVar10,0xc6,0x88,0x11,0x1c7,uVar4,0x11,0x11,local_20,local_16); + uVar10 = 0x1228; + BITBLT(0x1228,0x86,0xee,0,0x1c7,uVar4,0x11,0x11,local_20,local_16); + } + if (DAT_1028_346a != 0) { + BITBLT(uVar10,0xc6,0x88,0x11,0x1c7,uVar4,0x11,0x11,local_22,local_18); + uVar10 = 0x1228; + BITBLT(0x1228,0x86,0xee,0,0x1c7,uVar4,0x11,0x11,local_22,local_18); + } + if (DAT_1028_34bd != 0) { + BITBLT(uVar10,0xc6,0x88,0x11,0x1c7,uVar4,0x11,0x11,local_24,local_1a); + uVar10 = 0x1228; + BITBLT(0x1228,0x86,0xee,0,0x1c7,uVar4,0x11,0x11,local_24,local_1a); + } + uVar14 = uVar3; + BITBLT(uVar10,0x20,0xcc,0,0,uVar5,0x5a,0x5b,0x21,0x4f); + uVar9 = uVar4; + SELECTOBJECT(0x1228,uVar7); + uVar10 = uVar5; + SELECTOBJECT(0x1228,uVar8); + DELETEOBJECT(0x1228,uVar6,uVar10,uVar9,uVar14); + DELETEDC(0x1228,uVar5); + DELETEDC(0x1228,uVar4); + RELEASEDC(0x1228,uVar3); + return; +} + + +/* ===== 1000:7440 FUN_1000_7440 ===== */ + +void __stdcall16far FUN_1000_7440(int param_1) + +{ + undefined2 uVar1; + undefined2 uVar2; + undefined2 uVar3; + undefined2 uVar4; + undefined2 uVar5; + undefined2 uVar6; + undefined2 uVar7; + int iVar8; + undefined2 uVar9; + undefined2 unaff_SS; + undefined2 uVar10; + undefined2 uVar11; + undefined2 uVar12; + undefined2 uVar13; + undefined2 uVar14; + undefined2 uVar15; + undefined2 uVar16; + undefined2 uVar17; + undefined2 uVar18; + undefined2 uVar19; + + uVar7 = *(undefined2 *)((int)*(undefined4 *)(param_1 + 6) + 4); + uVar1 = GETDC(); + uVar2 = CREATECOMPATIBLEDC(0x1228,uVar1,uVar7); + uVar7 = uVar2; + uVar3 = SELECTOBJECT(0x1228,DAT_1028_085f); + uVar4 = CREATECOMPATIBLEDC(0x1228,uVar1,uVar7); + uVar5 = CREATECOMPATIBLEBITMAP(0x1228,0x7b,0x5b); + uVar19 = uVar4; + uVar6 = SELECTOBJECT(0x1228,uVar5); + uVar14 = 0x4f; + uVar12 = 0; + uVar7 = uVar2; + uVar16 = uVar4; + BITBLT(0x1228,0x20,0xcc,0,0x4f,uVar2,0x7b,0x5b,0,0); + uVar18 = 0x1228; + uVar9 = 0x1228; + uVar17 = 0x74c1; + uVar13 = DAT_1028_0859; + uVar15 = uVar2; + SELECTOBJECT(0x1228,DAT_1028_0859); + if (((int)DAT_1028_0851 < 1) || (0x2c < (int)DAT_1028_0851)) { + if (((int)DAT_1028_0851 < 0x2d) || (0x39 < (int)DAT_1028_0851)) { + if (((int)DAT_1028_0851 < 0x3a) || (0x41 < (int)DAT_1028_0851)) { + if (((int)DAT_1028_0851 < 0x42) || (0x80 < (int)DAT_1028_0851)) { + if (((int)DAT_1028_0851 < 0x81) || (0x9e < (int)DAT_1028_0851)) { + if (((int)DAT_1028_0851 < 0x9f) || (0xdd < (int)DAT_1028_0851)) { + if (((int)DAT_1028_0851 < 0xde) || (0xe5 < (int)DAT_1028_0851)) { + if (((int)DAT_1028_0851 < 0xe6) || (0xed < (int)DAT_1028_0851)) { + if ((0xed < (int)DAT_1028_0851) && ((int)DAT_1028_0851 < 0x11a)) { + if ((DAT_1028_0853 == 0) && (DAT_1028_0851 == 0xee)) { + uVar9 = 0x1008; + FUN_1008_0002(0xd); + } + uVar17 = uVar4; + BITBLT(uVar9,0xc6,0x88,0x5a,0x16a,uVar2,0x5a,0x5b,0x21,0); + uVar7 = uVar4; + BITBLT(0x1228,0x86,0xee,0x5a,0x1c5,uVar2,0x5a,0x5b,0x21,0); + uVar16 = 0x14; + uVar15 = 0; + uVar13 = 0x2d; + uVar17 = FUN_1020_08a9(0x2d,0,0x14,uVar4,uVar7,uVar17); + uVar18 = 0x2d; + uVar7 = uVar2; + iVar8 = FUN_1020_08a9(0x2d,uVar2,uVar17); + BITBLT(0x1020,0xc6,0x88,iVar8 + 0x5a,uVar18,uVar7,uVar17,uVar13,uVar15,uVar16); + uVar16 = 0x14; + uVar15 = 0; + uVar13 = 0x2d; + uVar17 = FUN_1020_08a9(0x2d,0,0x14,uVar4); + uVar18 = 0; + uVar7 = uVar2; + iVar8 = FUN_1020_08a9(0,uVar2,uVar17); + BITBLT(0x1020,0x86,0xee,iVar8 + 0x5a,uVar18,uVar7,uVar17,uVar13,uVar15,uVar16); + if ((DAT_1028_0853 == 0) && (DAT_1028_0851 == 0x119)) { + SELECTOBJECT(0x1228,DAT_1028_085b); + SELECTOBJECT(0x1228,DAT_1028_085d); + BITBLT(0x1228,0x20,0xcc,0,0x4f,uVar2,0x5a,0x5b,0,0x4f); + SELECTOBJECT(0x1228,uVar5); + } + } + } + else { + if ((DAT_1028_0853 == 0) && (DAT_1028_0851 == 0xe6)) { + uVar9 = 0x1008; + FUN_1008_0002(0xc); + } + BITBLT(uVar9,0xc6,0x88,0x5a,0x16a,uVar2,0x5a,0x5b,0x21,0); + BITBLT(0x1228,0x86,0xee,0x5a,0x1c5,uVar2,0x5a,0x5b,0x21,0); + BITBLT(0x1228,0xc6,0x88,0x5a,0x2d,uVar2,0x58,0x2d,0,0x14); + BITBLT(0x1228,0x86,0xee,0x5a,0,uVar2,0x58,0x2d,0,0x14); + } + } + else { + if ((DAT_1028_0853 == 0) && (DAT_1028_0851 == 0xde)) { + uVar9 = 0x1008; + FUN_1008_118f(); + } + BITBLT(uVar9,0xc6,0x88,0x5a,0x16a,uVar2,0x5a,0x5b,0x21,0); + BITBLT(0x1228,0x86,0xee,0x5a,0x1c5,uVar2,0x5a,0x5b,0x21,0); + BITBLT(0x1228,0xc6,0x88,0x5a,0x87,uVar2,0x58,0x2d,0,0x14); + BITBLT(0x1228,0x86,0xee,0x5a,0x5a,uVar2,0x58,0x2d,0,0x14); + } + } + else { + if ((DAT_1028_0853 == 0) && (DAT_1028_0851 == 0x9f)) { + uVar9 = 0x1008; + FUN_1008_0002(0xd); + } + uVar7 = uVar4; + BITBLT(uVar9,0x20,0xcc,0x5a,0xb4,uVar2,0x5a,0x5b,0x21,0); + if ((DAT_1028_0853 < 0) || ((DAT_1028_0853 < 1 && (DAT_1028_0851 < 0xcc)))) { + uVar16 = 0; + uVar15 = 0; + uVar13 = 0x5b; + uVar17 = FUN_1020_08a9(0x5b,0,0,uVar4,uVar7); + uVar18 = 0x16a; + uVar7 = uVar2; + iVar8 = FUN_1020_08a9(0x16a,uVar2,uVar17); + BITBLT(0x1020,0xc6,0x88,iVar8 + 0x5a,uVar18,uVar7,uVar17,uVar13,uVar15,uVar16); + uVar16 = 0; + uVar15 = 0; + uVar13 = 0x5b; + uVar17 = FUN_1020_08a9(0x5b,0,0,uVar4); + uVar18 = 0x1c5; + uVar7 = uVar2; + iVar8 = FUN_1020_08a9(0x1c5,uVar2,uVar17); + BITBLT(0x1020,0x86,0xee,iVar8 + 0x5a,uVar18,uVar7,uVar17,uVar13,uVar15,uVar16); + } + else { + uVar17 = 0; + uVar7 = FUN_1020_08a9(0,uVar4); + BITBLT(0x1020,0xc6,0x88,0x5a,0x16a,uVar2,0x5a,0x5b,uVar7,uVar17); + uVar17 = 0; + uVar7 = FUN_1020_08a9(0,uVar4); + BITBLT(0x1020,0x86,0xee,0x5a,0x1c5,uVar2,0x5a,0x5b,uVar7,uVar17); + } + if ((0 < DAT_1028_0853) || ((-1 < DAT_1028_0853 && (0xb0 < DAT_1028_0851)))) { + if ((DAT_1028_0853 == 0) && (DAT_1028_0851 == 0xdd)) { + BITBLT(0x1228,0xc6,0x88,0x5a,0x87,uVar2,0x58,0x2d,0,0x14); + BITBLT(0x1228,0x86,0xee,0x5a,0x5a,uVar2,0x58,0x2d,0,0x14); + } + else { + uVar16 = 0x14; + uVar15 = 0; + uVar13 = 0x2d; + uVar17 = FUN_1020_08a9(0x2d,0,0x14,uVar4); + uVar18 = 0x87; + uVar7 = uVar2; + iVar8 = FUN_1020_08a9(0x87,uVar2,uVar17); + BITBLT(0x1020,0xc6,0x88,iVar8 + 0x59,uVar18,uVar7,uVar17,uVar13,uVar15,uVar16); + uVar16 = 0x14; + uVar15 = 0; + uVar13 = 0x2d; + uVar17 = FUN_1020_08a9(0x2d,0,0x14,uVar4); + uVar18 = 0x5a; + uVar7 = uVar2; + iVar8 = FUN_1020_08a9(0x5a,uVar2,uVar17); + BITBLT(0x1020,0x86,0xee,iVar8 + 0x59,uVar18,uVar7,uVar17,uVar13,uVar15,uVar16); + } + } + } + } + else { + if ((DAT_1028_0853 == 0) && (DAT_1028_0851 == 0x81)) { + uVar9 = 0x1008; + FUN_1008_118f(); + } + BITBLT(uVar9,0x20,0xcc,0x5a,0xb4,uVar2,0x5a,0x5b,0x21,0); + } + } + else { + if ((DAT_1028_0853 == 0) && (DAT_1028_0851 == 0x42)) { + uVar9 = 0x1008; + FUN_1008_0002(0xd); + } + uVar7 = uVar4; + BITBLT(uVar9,0x20,0xcc,0x5a,0xb4,uVar2,0x5a,0x5b,0x21,0); + if ((DAT_1028_0853 < 0) || ((DAT_1028_0853 < 1 && (DAT_1028_0851 < 0x53)))) { + uVar17 = 0; + uVar7 = FUN_1020_08a9(0,uVar4); + BITBLT(0x1020,0xc6,0x88,0x5a,0x16a,uVar2,0x5a,0x5b,uVar7,uVar17); + uVar17 = 0; + uVar7 = FUN_1020_08a9(0,uVar4); + BITBLT(0x1020,0x86,0xee,0x5a,0x10f,uVar2,0x5a,0x5b,uVar7,uVar17); + } + else { + uVar16 = 0; + uVar15 = 0; + uVar13 = 0x5b; + uVar17 = FUN_1020_08a9(0x5b,0,0,uVar4,uVar7); + uVar18 = 0x16a; + uVar7 = uVar2; + iVar8 = FUN_1020_08a9(0x16a,uVar2,uVar17); + BITBLT(0x1020,0xc6,0x88,iVar8 + 0x5a,uVar18,uVar7,uVar17,uVar13,uVar15,uVar16); + uVar16 = 0; + uVar15 = 0; + uVar13 = 0x5b; + uVar17 = FUN_1020_08a9(0x5b,0,0,uVar4); + uVar18 = 0x10f; + uVar7 = uVar2; + iVar8 = FUN_1020_08a9(0x10f,uVar2,uVar17); + BITBLT(0x1020,0x86,0xee,iVar8 + 0x5a,uVar18,uVar7,uVar17,uVar13,uVar15,uVar16); + } + if ((DAT_1028_0853 < 0) || ((DAT_1028_0853 < 1 && (DAT_1028_0851 < 0x6f)))) { + uVar16 = 0x14; + uVar15 = 0; + uVar13 = 0x2d; + uVar17 = FUN_1020_08a9(0x2d,0,0x14,uVar4); + uVar18 = 0x87; + uVar7 = uVar2; + iVar8 = FUN_1020_08a9(0x87,uVar2,uVar17); + BITBLT(0x1020,0xc6,0x88,iVar8 + 0x5a,uVar18,uVar7,uVar17,uVar13,uVar15,uVar16); + uVar16 = 0x14; + uVar15 = 0; + uVar13 = 0x2d; + uVar17 = FUN_1020_08a9(0x2d,0,0x14,uVar4); + uVar18 = 0x5a; + uVar7 = uVar2; + iVar8 = FUN_1020_08a9(0x5a,uVar2,uVar17); + BITBLT(0x1020,0x86,0xee,iVar8 + 0x5a,uVar18,uVar7,uVar17,uVar13,uVar15,uVar16); + } + } + } + else { + if ((DAT_1028_0853 == 0) && (DAT_1028_0851 == 0x3a)) { + uVar9 = 0x1008; + FUN_1008_0002(0xc); + } + BITBLT(uVar9,0xc6,0x88,0x5a,0x87,uVar2,0x58,0x2d,0,0x14); + BITBLT(0x1228,0x86,0xee,0x5a,0x5a,uVar2,0x58,0x2d,0,0x14); + } + } + else { + if ((DAT_1028_0853 == 0) && (DAT_1028_0851 == 0x2d)) { + uVar9 = 0x1008; + FUN_1008_118f(); + } + BITBLT(uVar9,0xc6,0x88,0x5a,0x2d,uVar2,0x58,0x2d,0,0x14); + BITBLT(0x1228,0x86,0xee,0x5a,0,uVar2,0x58,0x2d,0,0x14); + } + } + else { + if ((DAT_1028_0853 == 0) && (DAT_1028_0851 == 1)) { + FUN_1008_0002(0xd); + uVar13 = uVar4; + SELECTOBJECT(0x1008,DAT_1028_085b); + uVar18 = uVar4; + BITBLT(0x1228,0x20,0xcc,0x5a,0x10f,uVar2,0x5a,0x5b,0,0x4f); + uVar14 = 0x1228; + uVar12 = 0x751d; + uVar7 = uVar5; + uVar17 = uVar4; + SELECTOBJECT(0x1228,uVar5); + } + uVar11 = 0x14; + uVar10 = 0; + uVar9 = 0x2d; + uVar17 = FUN_1020_08a9(0x2d,0,0x14,uVar4,uVar12,uVar14,uVar7,uVar17,uVar18,uVar13,uVar15,uVar16, + uVar19); + uVar18 = 0x2d; + uVar7 = uVar2; + iVar8 = FUN_1020_08a9(0x2d,uVar2,uVar17); + BITBLT(0x1020,0xc6,0x88,iVar8 + 0x59,uVar18,uVar7,uVar17,uVar9,uVar10,uVar11); + uVar16 = 0x14; + uVar15 = 0; + uVar13 = 0x2d; + uVar17 = FUN_1020_08a9(0x2d,0,0x14,uVar4); + uVar18 = 0; + uVar7 = uVar2; + iVar8 = FUN_1020_08a9(0,uVar2,uVar17); + BITBLT(0x1020,0x86,0xee,iVar8 + 0x59,uVar18,uVar7,uVar17,uVar13,uVar15,uVar16); + } + uVar18 = uVar1; + BITBLT(0x1228,0x20,0xcc,0,0,uVar4,0x7b,0x5b,0,0x4f); + uVar17 = uVar4; + SELECTOBJECT(0x1228,uVar6); + uVar7 = uVar2; + SELECTOBJECT(0x1228,uVar3); + DELETEOBJECT(0x1228,uVar5,uVar7,uVar17,uVar18); + DELETEDC(0x1228,uVar4); + DELETEDC(0x1228,uVar2); + RELEASEDC(0x1228,uVar1); + return; +} + + +/* ===== 1000:7e12 FUN_1000_7e12 ===== */ + +void __stdcall16far FUN_1000_7e12(undefined2 param_1,uint param_2) + +{ + if ((param_2 != 0) && (param_2 < 0xb0)) { + if ((*(uint *)(param_2 * 0x53 + 0x99c) & 0x80) == 0x80) { + if (*(char *)(param_2 * 0x53 + 0x98f) == '\0') { + FUN_1000_b30b(param_1,param_2); + } + else { + FUN_1000_b3f3(param_1,param_2); + } + } + else if ((*(uint *)(param_2 * 0x53 + 0x99c) & 0x100) == 0x100) { + if (*(char *)(param_2 * 0x53 + 0x98f) == '\0') { + FUN_1000_b3f3(param_1,param_2); + } + else { + FUN_1000_b30b(param_1,param_2); + } + } + } + return; +} + + +/* ===== 1000:7e92 FUN_1000_7e92 ===== */ + +void __stdcall16far FUN_1000_7e92(int param_1,int param_2) + +{ + undefined2 unaff_SS; + + if (*(char *)((int)*(undefined4 *)(param_1 + 6) + (uint)DAT_1028_07d1 * 0x14 + param_2 + 0x467) == + '\0') { + FUN_1000_b3f3(param_1,param_2 + 1000); + } + else { + FUN_1000_b30b(param_1,param_2 + 1000); + } + return; +} + + +/* ===== 1000:7ed9 FUN_1000_7ed9 ===== */ + +/* WARNING: Removing unreachable block (ram,0x10008133) */ + +void __stdcall16far FUN_1000_7ed9(int param_1,int param_2,uint param_3,int param_4,int param_5) + +{ + uint uVar1; + uint uVar2; + uint uVar3; + uint uVar4; + uint uVar5; + undefined2 uVar6; + undefined2 uVar7; + undefined2 uVar8; + int iVar9; + int iVar10; + int iVar11; + int iVar12; + uint uVar13; + int extraout_DX; + undefined2 uVar14; + int iVar15; + undefined2 unaff_SS; + bool bVar16; + undefined1 uVar17; + undefined1 uVar18; + undefined4 uVar19; + uint local_86; + uint local_84; + uint local_76; + int local_74; + uint local_36; + int local_34; + uint local_32; + int local_30; + uint local_2e; + int local_2c; + uint local_2a; + int local_28; + uint local_1e; + int local_1c; + uint local_1a; + int local_18; + uint local_a; + uint local_8; + uint local_6; + uint local_4; + + FUN_1008_0002(0x15); + if (param_4 == 1) { + FUN_1020_1017(); + local_1a = DAT_1028_1e80 + 0xd8f0; + local_18 = DAT_1028_1e82 - (uint)(DAT_1028_1e80 < 10000); + local_1e = DAT_1028_1e84; + local_1c = DAT_1028_1e86; + local_2a = DAT_1028_1edb + 20000; + local_28 = DAT_1028_1edd + (uint)(0xb1df < DAT_1028_1edb); + local_2e = DAT_1028_1edf; + local_2c = DAT_1028_1ee1; + local_32 = DAT_1028_1f79 + 20000; + local_30 = DAT_1028_1f7b + (uint)(0xb1df < DAT_1028_1f79); + local_36 = DAT_1028_1f7d; + local_34 = DAT_1028_1f7f; + } + else if (param_4 == 2) { + FUN_1020_1017(); + local_1a = DAT_1028_235d + 10000; + local_18 = DAT_1028_235f + (uint)(0xd8ef < DAT_1028_235d); + local_1e = DAT_1028_2361; + local_1c = DAT_1028_2363; + local_2a = DAT_1028_2456 + 0xb1e0; + local_28 = DAT_1028_2458 - (uint)(DAT_1028_2456 < 20000); + local_2e = DAT_1028_245a; + local_2c = DAT_1028_245c; + local_32 = DAT_1028_23b8 + 0xb1e0; + local_30 = DAT_1028_23ba - (uint)(DAT_1028_23b8 < 20000); + local_36 = DAT_1028_23bc; + local_34 = DAT_1028_23be; + } + uVar3 = param_3; + FUN_1020_08a9(); + FUN_1020_100b(); + uVar1 = FUN_1020_1017(); + uVar2 = uVar1 + local_1e; + iVar9 = uVar3 + local_1c + (uint)CARRY2(uVar1,local_1e); + uVar3 = (uint)*(byte *)((int)*(undefined4 *)(param_1 + 6) + 0x61); + if (uVar3 != 0) { + local_76 = 1; + local_74 = 0; + while( true ) { + if (1 < *(byte *)((int)*(undefined4 *)(param_1 + 6) + 0x61)) { + FUN_1000_c36b(param_1,local_76 - 1,local_74 - (uint)(local_76 == 0)); + } + if ((param_3 == 0xffff) && (param_2 == -1)) { + iVar10 = (local_28 - DAT_1028_07d5) - (uint)(local_2a < DAT_1028_07d3); + FUN_1020_08e6(); + FUN_1020_08e6(); + iVar11 = ((local_2c - (uint)(local_2e < 43000)) - DAT_1028_07d9) - + (uint)(local_2e + 0x5808 < DAT_1028_07d7); + FUN_1020_08e6(); + FUN_1020_08e6(); + uVar1 = FUN_1020_08a9(); + iVar12 = iVar10; + uVar4 = FUN_1020_08a9(); + local_6 = uVar4 - uVar1; + local_4 = (iVar12 - iVar11) - (uint)(uVar4 < uVar1); + FUN_1020_08e6(); + iVar12 = ((local_2c + (uint)(0xd11f < local_2e)) - DAT_1028_07d9) - + (uint)(local_2e + 12000 < DAT_1028_07d7); + FUN_1020_08e6(); + uVar1 = FUN_1020_08a9(); + uVar4 = FUN_1020_08a9(); + local_a = uVar4 - uVar1; + local_8 = (iVar10 - iVar12) - (uint)(uVar4 < uVar1); + } + else { + iVar10 = (local_30 - DAT_1028_07d5) - (uint)(local_32 < DAT_1028_07d3); + FUN_1020_08e6(); + FUN_1020_08e6(); + iVar11 = ((local_34 - (uint)(local_36 < 12000)) - DAT_1028_07d9) - + (uint)(local_36 + 0xd120 < DAT_1028_07d7); + FUN_1020_08e6(); + FUN_1020_08e6(); + uVar1 = FUN_1020_08a9(); + iVar12 = iVar10; + uVar4 = FUN_1020_08a9(); + local_6 = uVar4 - uVar1; + local_4 = (iVar12 - iVar11) - (uint)(uVar4 < uVar1); + FUN_1020_08e6(); + iVar12 = ((local_34 + (uint)(0x5807 < local_36)) - DAT_1028_07d9) - + (uint)(local_36 + 43000 < DAT_1028_07d7); + FUN_1020_08e6(); + uVar1 = FUN_1020_08a9(); + uVar4 = FUN_1020_08a9(); + local_a = uVar4 - uVar1; + local_8 = (iVar10 - iVar12) - (uint)(uVar4 < uVar1); + } + uVar1 = DAT_1028_07d3 - local_1a; + uVar4 = (DAT_1028_07d5 - local_18) - (uint)(DAT_1028_07d3 < local_1a); + if ((int)uVar4 < 0) { + bVar16 = uVar1 != 0; + uVar1 = -uVar1; + uVar4 = (~uVar4 + 1) - (uint)bVar16; + } + uVar5 = DAT_1028_07d7 - uVar2; + uVar13 = (DAT_1028_07d9 - iVar9) - (uint)(DAT_1028_07d7 < uVar2); + if ((int)uVar13 < 0) { + bVar16 = uVar5 != 0; + uVar5 = -uVar5; + uVar13 = (~uVar13 + 1) - (uint)bVar16; + } + if ((((int)uVar4 < 0) || (((int)uVar4 < 1 && (uVar1 < 54000)))) && + (((int)uVar13 < 0 || (((int)uVar13 < 1 && (uVar5 < 54000)))))) { + FUN_1020_100b(); + FUN_1020_0ffd(); + uVar19 = FUN_1020_0ff1(0x1020); + FUN_1020_100b((int)uVar19,iVar12,(int)((ulong)uVar19 >> 0x10)); + FUN_1020_0ffd(); + FUN_1020_0ff1(0x1020); + iVar12 = extraout_DX; + FUN_1020_0fe5(); + FUN_1020_10be(); + FUN_1020_0ff7(); + uVar1 = FUN_1020_1017(); + if (((iVar12 < 0) || ((iVar12 < 1 && (uVar1 < 0xd2f1)))) && + (((((param_5 == 0 && + ((param_4 == 1 && ((local_4 < 0x8000 || ((-2 < (int)local_4 && (0xfc18 < local_6))))) + ))) && (((int)local_8 < 0 || (((int)local_8 < 1 && (local_a < 1000)))))) && + ((local_18 < DAT_1028_07d5 || + ((local_18 <= DAT_1028_07d5 && (local_1a < DAT_1028_07d3)))))) || + (((((param_5 == 0 && (param_4 == 2)) && + (((int)local_4 < 0 || (((int)local_4 < 1 && (local_6 < 1000)))))) && + ((local_8 < 0x8000 || ((-2 < (int)local_8 && (0xfc18 < local_a)))))) && + ((DAT_1028_07d5 < local_18 || + ((DAT_1028_07d5 <= local_18 && (DAT_1028_07d3 < local_1a)))))))))) { + FUN_1020_08a9(); + FUN_1020_100b(); + FUN_1020_1017(); + FUN_1020_100b(); + uVar1 = param_3; + FUN_1020_08a9(); + FUN_1020_100b(); + FUN_1020_1017(); + FUN_1020_100b(); + if ((param_3 == 0xffff) && (param_2 == -1)) { + uVar4 = (local_28 - local_18) - (uint)(local_2a < local_1a); + uVar17 = false; + uVar18 = uVar4 == 0; + if ((int)uVar4 < 0) { + uVar5 = ~uVar4 + 1; + uVar17 = ~uVar4 != 0xffff || uVar5 < (local_2a != local_1a); + uVar18 = uVar5 == (local_2a != local_1a); + } + FUN_1020_100b(); + FUN_1020_1007(); + if ((bool)uVar17 || (bool)uVar18) { + local_86 = local_2e + 0x5808; + local_84 = local_2c - (uint)(local_2e < 43000); + } + else { + uVar4 = DAT_1028_07d3 - local_1a; + uVar1 = (DAT_1028_07d5 - local_18) - (uint)(DAT_1028_07d3 < local_1a); + if ((int)uVar1 < 0) { + bVar16 = uVar4 != 0; + uVar4 = -uVar4; + uVar1 = (~uVar1 + 1) - (uint)bVar16; + } + local_86 = (uVar2 - uVar4) + 5000; + local_84 = ((iVar9 - uVar1) - (uint)(uVar2 < uVar4)) + (uint)(0xec77 < uVar2 - uVar4); + } + local_84 = (local_84 - DAT_1028_07d9) - (uint)(local_86 < DAT_1028_07d7); + } + else { + uVar4 = (local_30 - local_18) - (uint)(local_32 < local_1a); + uVar17 = false; + uVar18 = uVar4 == 0; + if ((int)uVar4 < 0) { + uVar5 = ~uVar4 + 1; + uVar17 = ~uVar4 != 0xffff || uVar5 < (local_32 != local_1a); + uVar18 = uVar5 == (local_32 != local_1a); + } + FUN_1020_100b(); + FUN_1020_1007(); + if ((bool)uVar17 || (bool)uVar18) { + local_86 = local_36 + 43000; + local_84 = local_34 + (uint)(0x5807 < local_36); + } + else { + iVar12 = (local_30 - local_18) - (uint)(local_32 < local_1a); + uVar6 = FUN_1020_100b(); + uVar4 = (DAT_1028_07d5 - local_18) - (uint)(DAT_1028_07d3 < local_1a); + FUN_1020_08a9(uVar6,uVar1,iVar12); + FUN_1020_100b(); + FUN_1020_0ffd(); + uVar1 = FUN_1020_1017(); + local_86 = uVar2 - uVar1; + local_84 = (iVar9 - uVar4) - (uint)(uVar2 < uVar1); + uVar1 = uVar4; + } + local_84 = (local_84 - DAT_1028_07d9) - (uint)(local_86 < DAT_1028_07d7); + } + if ((int)local_84 < 0) { + uVar1 = param_3; + FUN_1020_08a9(); + FUN_1020_100b(); + iVar12 = FUN_1020_1017(); + local_86 = -iVar12; + local_84 = (~local_84 + 1) - (uint)(iVar12 != 0); + } + else { + local_86 = 0; + local_84 = 0; + } + uVar14 = 0; + uVar8 = uVar14; + uVar7 = FUN_1020_100b(); + uVar6 = *(undefined2 *)((int)*(undefined4 *)(param_1 + 6) + 0xbb0); + FUN_1020_100b(uVar7,uVar1,uVar8); + uVar8 = FUN_1020_0ff7(); + FUN_1020_100b(uVar8,uVar1,uVar6); + FUN_1020_0ff7(); + FUN_1020_0fe5(); + FUN_1020_0ff7(); + FUN_1020_0ffd(); + FUN_1020_1017(); + uVar8 = uVar14; + uVar7 = FUN_1020_100b(); + uVar6 = *(undefined2 *)((int)*(undefined4 *)(param_1 + 6) + 0xbb0); + FUN_1020_100b(uVar7,uVar1,uVar8); + uVar7 = FUN_1020_0ff7(); + uVar8 = *(undefined2 *)((int)*(undefined4 *)(param_1 + 6) + 0xbac); + FUN_1020_100b(uVar7,uVar1,uVar6); + FUN_1020_0ff7(); + FUN_1020_0feb(); + FUN_1020_0ffd(); + FUN_1020_1017(); + uVar6 = uVar14; + uVar7 = FUN_1020_100b(); + FUN_1020_100b(uVar7,uVar1,uVar6); + FUN_1020_0ffd(); + FUN_1020_10be(); + FUN_1020_0ff7(); + FUN_1020_0fe5(); + uVar6 = FUN_1020_100b(); + uVar7 = 0; + iVar11 = 0; + FUN_1020_0fe5(uVar6,uVar1,uVar8); + FUN_1020_0ff7(); + uVar1 = FUN_1020_1017(); + iVar12 = *(int *)((int)*(undefined4 *)(param_1 + 6) + 0x58); + FUN_1020_100b(); + FUN_1020_0ff7(); + uVar4 = FUN_1020_1017(); + iVar10 = iVar12 + iVar11 + (uint)CARRY2(uVar4,uVar1); + uVar6 = uVar14; + uVar8 = FUN_1020_100b(); + iVar11 = iVar10; + FUN_1020_100b(uVar8,uVar7,uVar6); + uVar6 = FUN_1020_0ff7(); + iVar12 = 0; + FUN_1020_100b(uVar6,uVar7,iVar11); + FUN_1020_0ff7(); + FUN_1020_0feb(); + FUN_1020_0ffd(); + uVar4 = FUN_1020_1017(); + uVar6 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar15 = (int)*(undefined4 *)(param_1 + 6); + uVar1 = *(uint *)(iVar15 + 0xbaa); + iVar11 = *(int *)(iVar15 + 0xbac); + *(int *)(iVar15 + 0xbaa) = uVar4 + *(uint *)(iVar15 + 0xbaa); + *(int *)(iVar15 + 0xbac) = iVar12 + iVar11 + (uint)CARRY2(uVar4,uVar1); + uVar8 = FUN_1020_100b(); + uVar6 = 0; + FUN_1020_100b(uVar8,uVar7,uVar14); + uVar8 = FUN_1020_0ff7(); + FUN_1020_100b(uVar8,uVar7,uVar6); + FUN_1020_0ff7(); + FUN_1020_0fe5(); + FUN_1020_0ffd(); + uVar4 = FUN_1020_1017(); + uVar6 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar11 = (int)*(undefined4 *)(param_1 + 6); + uVar1 = *(uint *)(iVar11 + 0xbae); + iVar12 = *(int *)(iVar11 + 0xbb0); + *(int *)(iVar11 + 0xbae) = uVar4 + *(uint *)(iVar11 + 0xbae); + *(int *)(iVar11 + 0xbb0) = iVar10 + iVar12 + (uint)CARRY2(uVar4,uVar1); + uVar6 = *(undefined2 *)(iVar11 + 0xbb0); + uVar8 = FUN_1020_100b(); + uVar1 = local_84; + FUN_1020_08a9(uVar8,uVar7,uVar6); + FUN_1020_100b(); + FUN_1020_0ffd(); + uVar6 = FUN_1020_1017(); + FUN_1000_beff(param_1,uVar6,uVar1,local_86,local_84); + } + } + if (1 < *(byte *)((int)*(undefined4 *)(param_1 + 6) + 0x61)) { + FUN_1000_c426(param_1,local_76 - 1,local_74 - (uint)(local_76 == 0)); + } + if ((local_74 == 0) && (local_76 == uVar3)) break; + bVar16 = 0xfffe < local_76; + local_76 = local_76 + 1; + local_74 = local_74 + (uint)bVar16; + } + } + return; +} + + +/* ===== 1000:8b0d FUN_1000_8b0d ===== */ + +void __stdcall16far FUN_1000_8b0d(int param_1,int param_2,int param_3,char param_4) + +{ + undefined4 uVar1; + uint uVar2; + undefined2 uVar3; + uint uVar4; + int iVar5; + undefined2 uVar6; + undefined2 unaff_SS; + bool bVar7; + undefined2 uVar8; + + uVar1 = *(undefined4 *)(*(int *)(param_1 + 6) + 6); + uVar8 = *(undefined2 *)((int)uVar1 + 4); + uVar6 = 0x1228; + uVar3 = GETDC(); + if ((param_3 == 0) && (param_2 == 1)) { + *(undefined2 *)(param_1 + -4) = 0; + *(undefined2 *)(param_1 + -2) = 0; + *(undefined2 *)(param_1 + -8) = 43000; + *(undefined2 *)(param_1 + -6) = 0; + } + else { + *(undefined2 *)(param_1 + -4) = 0; + *(undefined2 *)(param_1 + -2) = 0; + *(undefined2 *)(param_1 + -8) = 0x5808; + *(undefined2 *)(param_1 + -6) = 0xffff; + } + if (param_4 == '\x01') { + iVar5 = param_3; + FUN_1020_08a9(uVar8); + FUN_1020_100b(); + uVar4 = FUN_1020_1017(); + bVar7 = CARRY2(DAT_1028_1ed3,uVar4); + DAT_1028_1ed3 = DAT_1028_1ed3 + uVar4; + DAT_1028_1ed5 = DAT_1028_1ed5 + iVar5 + (uint)bVar7; + iVar5 = param_3; + FUN_1020_08a9(); + FUN_1020_100b(); + uVar4 = FUN_1020_1017(); + bVar7 = CARRY2(DAT_1028_1ed7,uVar4); + DAT_1028_1ed7 = DAT_1028_1ed7 + uVar4; + DAT_1028_1ed9 = DAT_1028_1ed9 + iVar5 + (uint)bVar7; + iVar5 = param_3; + FUN_1020_08a9(); + FUN_1020_100b(); + uVar4 = FUN_1020_1017(); + bVar7 = CARRY2(DAT_1028_1edb,uVar4); + DAT_1028_1edb = DAT_1028_1edb + uVar4; + DAT_1028_1edd = DAT_1028_1edd + iVar5 + (uint)bVar7; + iVar5 = param_3; + FUN_1020_08a9(); + FUN_1020_100b(); + uVar4 = FUN_1020_1017(); + bVar7 = CARRY2(DAT_1028_1edf,uVar4); + DAT_1028_1edf = DAT_1028_1edf + uVar4; + DAT_1028_1ee1 = DAT_1028_1ee1 + iVar5 + (uint)bVar7; + if ((DAT_1028_1ed5 < DAT_1028_1edd) || + ((DAT_1028_1ed5 <= DAT_1028_1edd && (DAT_1028_1ed3 < DAT_1028_1edb)))) { + DAT_1028_1ec5 = DAT_1028_1ed5 - (uint)(DAT_1028_1ed3 < 5000); + DAT_1028_1ecd = DAT_1028_1edd + (uint)(0xec77 < DAT_1028_1edb); + uVar4 = DAT_1028_1ed3; + uVar2 = DAT_1028_1edb; + } + else { + DAT_1028_1ec5 = DAT_1028_1edd - (uint)(DAT_1028_1edb < 5000); + DAT_1028_1ecd = DAT_1028_1ed5 + (uint)(0xec77 < DAT_1028_1ed3); + uVar4 = DAT_1028_1edb; + uVar2 = DAT_1028_1ed3; + } + DAT_1028_1ecb = uVar2 + 5000; + DAT_1028_1ec3 = uVar4 + 0xec78; + if ((DAT_1028_1ed9 < DAT_1028_1ee1) || + ((DAT_1028_1ed9 <= DAT_1028_1ee1 && (DAT_1028_1ed7 < DAT_1028_1edf)))) { + DAT_1028_1ec9 = DAT_1028_1ed9 - (uint)(DAT_1028_1ed7 < 5000); + DAT_1028_1ed1 = DAT_1028_1ee1 + (uint)(0xec77 < DAT_1028_1edf); + uVar4 = DAT_1028_1ed7; + uVar2 = DAT_1028_1edf; + } + else { + DAT_1028_1ec9 = DAT_1028_1ee1 - (uint)(DAT_1028_1edf < 5000); + DAT_1028_1ed1 = DAT_1028_1ed9 + (uint)(0xec77 < DAT_1028_1ed7); + uVar4 = DAT_1028_1edf; + uVar2 = DAT_1028_1ed7; + } + DAT_1028_1ecf = uVar2 + 5000; + DAT_1028_1ec7 = uVar4 + 0xec78; + iVar5 = param_3; + FUN_1020_08a9(); + FUN_1020_100b(); + uVar4 = FUN_1020_1017(); + bVar7 = CARRY2(DAT_1028_1f26,uVar4); + DAT_1028_1f26 = DAT_1028_1f26 + uVar4; + DAT_1028_1f28 = DAT_1028_1f28 + iVar5 + (uint)bVar7; + iVar5 = param_3; + FUN_1020_08a9(); + FUN_1020_100b(); + uVar4 = FUN_1020_1017(); + bVar7 = CARRY2(DAT_1028_1f2a,uVar4); + DAT_1028_1f2a = DAT_1028_1f2a + uVar4; + DAT_1028_1f2c = DAT_1028_1f2c + iVar5 + (uint)bVar7; + iVar5 = param_3; + FUN_1020_08a9(); + FUN_1020_100b(); + uVar4 = FUN_1020_1017(); + bVar7 = CARRY2(DAT_1028_1f16,uVar4); + DAT_1028_1f16 = DAT_1028_1f16 + uVar4; + DAT_1028_1f18 = DAT_1028_1f18 + iVar5 + (uint)bVar7; + iVar5 = param_3; + FUN_1020_08a9(); + FUN_1020_100b(); + uVar4 = FUN_1020_1017(); + bVar7 = CARRY2(DAT_1028_1f1a,uVar4); + DAT_1028_1f1a = DAT_1028_1f1a + uVar4; + DAT_1028_1f1c = DAT_1028_1f1c + iVar5 + (uint)bVar7; + iVar5 = param_3; + FUN_1020_08a9(); + FUN_1020_100b(); + uVar4 = FUN_1020_1017(); + bVar7 = DAT_1028_1f1e < uVar4; + DAT_1028_1f1e = DAT_1028_1f1e - uVar4; + DAT_1028_1f20 = (DAT_1028_1f20 - iVar5) - (uint)bVar7; + iVar5 = param_3; + FUN_1020_08a9(); + FUN_1020_100b(); + uVar4 = FUN_1020_1017(); + bVar7 = DAT_1028_1f22 < uVar4; + DAT_1028_1f22 = DAT_1028_1f22 - uVar4; + DAT_1028_1f24 = (DAT_1028_1f24 - iVar5) - (uint)bVar7; + iVar5 = param_3; + FUN_1020_08a9(); + FUN_1020_100b(); + uVar4 = FUN_1020_1017(); + bVar7 = DAT_1028_1f79 < uVar4; + DAT_1028_1f79 = DAT_1028_1f79 - uVar4; + DAT_1028_1f7b = (DAT_1028_1f7b - iVar5) - (uint)bVar7; + iVar5 = param_3; + FUN_1020_08a9(); + FUN_1020_100b(); + uVar4 = FUN_1020_1017(); + bVar7 = CARRY2(DAT_1028_1f7d,uVar4); + DAT_1028_1f7d = DAT_1028_1f7d + uVar4; + DAT_1028_1f7f = DAT_1028_1f7f + iVar5 + (uint)bVar7; + iVar5 = param_3; + FUN_1020_08a9(); + FUN_1020_100b(); + uVar4 = FUN_1020_1017(); + bVar7 = DAT_1028_1f81 < uVar4; + DAT_1028_1f81 = DAT_1028_1f81 - uVar4; + DAT_1028_1f83 = (DAT_1028_1f83 - iVar5) - (uint)bVar7; + FUN_1020_08a9(); + FUN_1020_100b(); + uVar4 = FUN_1020_1017(); + bVar7 = CARRY2(DAT_1028_1f85,uVar4); + DAT_1028_1f85 = DAT_1028_1f85 + uVar4; + DAT_1028_1f87 = DAT_1028_1f87 + param_3 + (uint)bVar7; + if ((DAT_1028_1f7b < DAT_1028_1f83) || + ((DAT_1028_1f7b <= DAT_1028_1f83 && (DAT_1028_1f79 < DAT_1028_1f81)))) { + DAT_1028_1f6b = DAT_1028_1f7b - (uint)(DAT_1028_1f79 < 5000); + DAT_1028_1f73 = DAT_1028_1f83 + (uint)(0xec77 < DAT_1028_1f81); + uVar4 = DAT_1028_1f79; + uVar2 = DAT_1028_1f81; + } + else { + DAT_1028_1f6b = DAT_1028_1f83 - (uint)(DAT_1028_1f81 < 5000); + DAT_1028_1f73 = DAT_1028_1f7b + (uint)(0xec77 < DAT_1028_1f79); + uVar4 = DAT_1028_1f81; + uVar2 = DAT_1028_1f79; + } + DAT_1028_1f71 = uVar2 + 5000; + DAT_1028_1f69 = uVar4 + 0xec78; + if ((DAT_1028_1f7f < DAT_1028_1f87) || + ((DAT_1028_1f7f <= DAT_1028_1f87 && (DAT_1028_1f7d < DAT_1028_1f85)))) { + DAT_1028_1f6f = DAT_1028_1f7f - (uint)(DAT_1028_1f7d < 5000); + DAT_1028_1f77 = DAT_1028_1f87 + (uint)(0xec77 < DAT_1028_1f85); + uVar4 = DAT_1028_1f7d; + uVar2 = DAT_1028_1f85; + } + else { + DAT_1028_1f6f = DAT_1028_1f87 - (uint)(DAT_1028_1f85 < 5000); + DAT_1028_1f77 = DAT_1028_1f7f + (uint)(0xec77 < DAT_1028_1f7d); + uVar4 = DAT_1028_1f85; + uVar2 = DAT_1028_1f7d; + } + DAT_1028_1f75 = uVar2 + 5000; + DAT_1028_1f6d = uVar4 + 0xec78; + uVar1 = *(undefined4 *)(*(int *)(param_1 + 6) + 6); + if (*(int *)((int)uVar1 + 0xbd4) == 0) { + FUN_1008_08bb(0x34,0x2f,0x175,0x5d,uVar3); + } + else { + FUN_1008_0837(0x34,0x2f,0x175,0x5d,uVar3); + } + uVar6 = 0x1008; + FUN_1008_093f(0x34,0x2f,0x175,0x5d,uVar3); + } + else if (param_4 == '\x02') { + iVar5 = param_3; + uVar4 = FUN_1020_08a9(uVar8); + bVar7 = DAT_1028_245e < uVar4; + DAT_1028_245e = DAT_1028_245e - uVar4; + DAT_1028_2460 = (DAT_1028_2460 - iVar5) - (uint)bVar7; + iVar5 = param_3; + uVar4 = FUN_1020_08a9(); + bVar7 = CARRY2(DAT_1028_2462,uVar4); + DAT_1028_2462 = DAT_1028_2462 + uVar4; + DAT_1028_2464 = DAT_1028_2464 + iVar5 + (uint)bVar7; + iVar5 = param_3; + uVar4 = FUN_1020_08a9(); + bVar7 = DAT_1028_2456 < uVar4; + DAT_1028_2456 = DAT_1028_2456 - uVar4; + DAT_1028_2458 = (DAT_1028_2458 - iVar5) - (uint)bVar7; + iVar5 = param_3; + uVar4 = FUN_1020_08a9(); + bVar7 = CARRY2(DAT_1028_245a,uVar4); + DAT_1028_245a = DAT_1028_245a + uVar4; + DAT_1028_245c = DAT_1028_245c + iVar5 + (uint)bVar7; + if ((DAT_1028_2458 < DAT_1028_2460) || + ((DAT_1028_2458 <= DAT_1028_2460 && (DAT_1028_2456 < DAT_1028_245e)))) { + DAT_1028_2448 = DAT_1028_2458 - (uint)(DAT_1028_2456 < 5000); + DAT_1028_2450 = DAT_1028_2460 + (uint)(0xec77 < DAT_1028_245e); + uVar4 = DAT_1028_2456; + uVar2 = DAT_1028_245e; + } + else { + DAT_1028_2448 = DAT_1028_2460 - (uint)(DAT_1028_245e < 5000); + DAT_1028_2450 = DAT_1028_2458 + (uint)(0xec77 < DAT_1028_2456); + uVar4 = DAT_1028_245e; + uVar2 = DAT_1028_2456; + } + DAT_1028_244e = uVar2 + 5000; + DAT_1028_2446 = uVar4 + 0xec78; + if ((DAT_1028_245c < DAT_1028_2464) || + ((DAT_1028_245c <= DAT_1028_2464 && (DAT_1028_245a < DAT_1028_2462)))) { + DAT_1028_244c = DAT_1028_245c - (uint)(DAT_1028_245a < 5000); + DAT_1028_2454 = DAT_1028_2464 + (uint)(0xec77 < DAT_1028_2462); + uVar4 = DAT_1028_245a; + uVar2 = DAT_1028_2462; + } + else { + DAT_1028_244c = DAT_1028_2464 - (uint)(DAT_1028_2462 < 5000); + DAT_1028_2454 = DAT_1028_245c + (uint)(0xec77 < DAT_1028_245a); + uVar4 = DAT_1028_2462; + uVar2 = DAT_1028_245a; + } + DAT_1028_2452 = uVar2 + 5000; + DAT_1028_244a = uVar4 + 0xec78; + iVar5 = param_3; + uVar4 = FUN_1020_08a9(); + bVar7 = DAT_1028_2403 < uVar4; + DAT_1028_2403 = DAT_1028_2403 - uVar4; + DAT_1028_2405 = (DAT_1028_2405 - iVar5) - (uint)bVar7; + iVar5 = param_3; + uVar4 = FUN_1020_08a9(); + bVar7 = CARRY2(DAT_1028_2407,uVar4); + DAT_1028_2407 = DAT_1028_2407 + uVar4; + DAT_1028_2409 = DAT_1028_2409 + iVar5 + (uint)bVar7; + iVar5 = param_3; + uVar4 = FUN_1020_08a9(); + bVar7 = DAT_1028_23f3 < uVar4; + DAT_1028_23f3 = DAT_1028_23f3 - uVar4; + DAT_1028_23f5 = (DAT_1028_23f5 - iVar5) - (uint)bVar7; + iVar5 = param_3; + uVar4 = FUN_1020_08a9(); + bVar7 = CARRY2(DAT_1028_23f7,uVar4); + DAT_1028_23f7 = DAT_1028_23f7 + uVar4; + DAT_1028_23f9 = DAT_1028_23f9 + iVar5 + (uint)bVar7; + iVar5 = param_3; + uVar4 = FUN_1020_08a9(); + bVar7 = CARRY2(DAT_1028_23fb,uVar4); + DAT_1028_23fb = DAT_1028_23fb + uVar4; + DAT_1028_23fd = DAT_1028_23fd + iVar5 + (uint)bVar7; + iVar5 = param_3; + uVar4 = FUN_1020_08a9(); + bVar7 = DAT_1028_23ff < uVar4; + DAT_1028_23ff = DAT_1028_23ff - uVar4; + DAT_1028_2401 = (DAT_1028_2401 - iVar5) - (uint)bVar7; + iVar5 = param_3; + uVar4 = FUN_1020_08a9(); + bVar7 = CARRY2(DAT_1028_23b8,uVar4); + DAT_1028_23b8 = DAT_1028_23b8 + uVar4; + DAT_1028_23ba = DAT_1028_23ba + iVar5 + (uint)bVar7; + iVar5 = param_3; + uVar4 = FUN_1020_08a9(); + bVar7 = CARRY2(DAT_1028_23bc,uVar4); + DAT_1028_23bc = DAT_1028_23bc + uVar4; + DAT_1028_23be = DAT_1028_23be + iVar5 + (uint)bVar7; + iVar5 = param_3; + uVar4 = FUN_1020_08a9(); + bVar7 = CARRY2(DAT_1028_23b0,uVar4); + DAT_1028_23b0 = DAT_1028_23b0 + uVar4; + DAT_1028_23b2 = DAT_1028_23b2 + iVar5 + (uint)bVar7; + uVar4 = FUN_1020_08a9(); + bVar7 = CARRY2(DAT_1028_23b4,uVar4); + DAT_1028_23b4 = DAT_1028_23b4 + uVar4; + DAT_1028_23b6 = DAT_1028_23b6 + param_3 + (uint)bVar7; + if ((DAT_1028_23b2 < DAT_1028_23ba) || + ((DAT_1028_23b2 <= DAT_1028_23ba && (DAT_1028_23b0 < DAT_1028_23b8)))) { + DAT_1028_23a2 = DAT_1028_23b2 - (uint)(DAT_1028_23b0 < 5000); + DAT_1028_23aa = DAT_1028_23ba + (uint)(0xec77 < DAT_1028_23b8); + uVar4 = DAT_1028_23b0; + uVar2 = DAT_1028_23b8; + } + else { + DAT_1028_23a2 = DAT_1028_23ba - (uint)(DAT_1028_23b8 < 5000); + DAT_1028_23aa = DAT_1028_23b2 + (uint)(0xec77 < DAT_1028_23b0); + uVar4 = DAT_1028_23b8; + uVar2 = DAT_1028_23b0; + } + DAT_1028_23a8 = uVar2 + 5000; + DAT_1028_23a0 = uVar4 + 0xec78; + if ((DAT_1028_23b6 < DAT_1028_23be) || + ((DAT_1028_23b6 <= DAT_1028_23be && (DAT_1028_23b4 < DAT_1028_23bc)))) { + DAT_1028_23a6 = DAT_1028_23b6 - (uint)(DAT_1028_23b4 < 5000); + DAT_1028_23ae = DAT_1028_23be + (uint)(0xec77 < DAT_1028_23bc); + uVar4 = DAT_1028_23b4; + uVar2 = DAT_1028_23bc; + } + else { + DAT_1028_23a6 = DAT_1028_23be - (uint)(DAT_1028_23bc < 5000); + DAT_1028_23ae = DAT_1028_23b6 + (uint)(0xec77 < DAT_1028_23b4); + uVar4 = DAT_1028_23bc; + uVar2 = DAT_1028_23b4; + } + DAT_1028_23ac = uVar2 + 5000; + DAT_1028_23a4 = uVar4 + 0xec78; + uVar1 = *(undefined4 *)(*(int *)(param_1 + 6) + 6); + if (*(int *)((int)uVar1 + 0xbd6) == 0) { + FUN_1008_08bb(0x35,0x2d,0x174,0xaf,uVar3); + } + else { + FUN_1008_0837(0x35,0x2d,0x174,0xaf,uVar3); + } + uVar6 = 0x1008; + FUN_1008_093f(0x35,0x2d,0x174,0xaf,uVar3); + } + RELEASEDC(uVar6,uVar3); + return; +} + + +/* ===== 1000:99f0 FUN_1000_99f0 ===== */ + +void __stdcall16far FUN_1000_99f0(int param_1) + +{ + int iVar1; + undefined2 uVar2; + undefined2 unaff_SS; + + uVar2 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar1 = (int)*(undefined4 *)(param_1 + 6); + if ((*(char *)(iVar1 + 0xbda) == '\0') || (*(int *)(iVar1 + 0xbd4) != 0)) { + uVar2 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar1 = (int)*(undefined4 *)(param_1 + 6); + if ((*(char *)(iVar1 + 0xbda) == '\0') && (*(int *)(iVar1 + 0xbd4) != 0)) { + *(int *)(iVar1 + 0xbd4) = *(int *)(iVar1 + 0xbd4) + -1; + FUN_1000_7ed9(param_1,1,0,1,0); + FUN_1000_8b0d(&stack0xfffe,1,0,1); + } + } + else { + *(int *)(iVar1 + 0xbd4) = *(int *)(iVar1 + 0xbd4) + 1; + FUN_1000_7ed9(param_1,0xffff,0xffff,1,0); + FUN_1000_8b0d(&stack0xfffe,0xffff,0xffff,1); + } + uVar2 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar1 = (int)*(undefined4 *)(param_1 + 6); + if ((*(char *)(iVar1 + 0xbdb) == '\0') || (*(int *)(iVar1 + 0xbd6) != 0)) { + uVar2 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar1 = (int)*(undefined4 *)(param_1 + 6); + if ((*(char *)(iVar1 + 0xbdb) == '\0') && (*(int *)(iVar1 + 0xbd6) != 0)) { + *(int *)(iVar1 + 0xbd6) = *(int *)(iVar1 + 0xbd6) + -1; + FUN_1000_7ed9(param_1,1,0,2,0); + FUN_1000_8b0d(&stack0xfffe,1,0,2); + } + } + else { + *(int *)(iVar1 + 0xbd6) = *(int *)(iVar1 + 0xbd6) + 1; + FUN_1000_7ed9(param_1,0xffff,0xffff,2,0); + FUN_1000_8b0d(&stack0xfffe,0xffff,0xffff,2); + } + return; +} + + +/* ===== 1000:9ae0 FUN_1000_9ae0 ===== */ + +undefined2 __stdcall16far +FUN_1000_9ae0(int param_1,uint param_2,int param_3,uint param_4,int param_5,uint param_6,int param_7 + ,uint param_8,int param_9) + +{ + uint uVar1; + int iVar2; + undefined2 uVar3; + undefined2 unaff_SS; + undefined1 local_3; + + uVar3 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar2 = (int)*(undefined4 *)(param_1 + 6); + uVar1 = *(uint *)(iVar2 + 0xbba); + iVar2 = *(int *)(iVar2 + 0xbbc); + if ((param_9 < iVar2) || ((param_9 <= iVar2 && (param_8 <= uVar1)))) { + uVar3 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar2 = (int)*(undefined4 *)(param_1 + 6); + uVar1 = *(uint *)(iVar2 + 0xbbe); + iVar2 = *(int *)(iVar2 + 0xbc0); + if ((param_7 < iVar2) || ((param_7 <= iVar2 && (param_6 <= uVar1)))) { + uVar3 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar2 = (int)*(undefined4 *)(param_1 + 6); + uVar1 = *(uint *)(iVar2 + 0xbba); + iVar2 = *(int *)(iVar2 + 0xbbc); + if ((iVar2 < param_5) || ((iVar2 <= param_5 && (uVar1 <= param_4)))) { + uVar3 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar2 = (int)*(undefined4 *)(param_1 + 6); + uVar1 = *(uint *)(iVar2 + 0xbbe); + iVar2 = *(int *)(iVar2 + 0xbc0); + if ((iVar2 < param_3) || ((iVar2 <= param_3 && (uVar1 <= param_2)))) { + local_3 = 1; + goto LAB_1000_9b62; + } + } + } + } + local_3 = 0; +LAB_1000_9b62: + return CONCAT11((char)(uVar1 >> 8),local_3); +} + + +/* ===== 1000:9b69 FUN_1000_9b69 ===== */ + +undefined2 __stdcall16far +FUN_1000_9b69(undefined2 param_1,uint param_2,int param_3,uint param_4,int param_5,uint param_6, + int param_7,uint param_8,int param_9) + +{ + uint uVar1; + undefined1 local_3; + + uVar1 = DAT_1028_07db; + if ((param_9 < DAT_1028_07dd) || ((param_9 <= DAT_1028_07dd && (param_8 <= DAT_1028_07db)))) { + if ((param_7 < DAT_1028_07e1) || + ((uVar1 = DAT_1028_07df, param_7 <= DAT_1028_07e1 && + (uVar1 = DAT_1028_07df, param_6 <= DAT_1028_07df)))) { + if ((DAT_1028_07dd < param_5) || + ((uVar1 = DAT_1028_07db, DAT_1028_07dd <= param_5 && (DAT_1028_07db <= param_4)))) { + uVar1 = DAT_1028_07df; + if ((DAT_1028_07e1 < param_3) || ((DAT_1028_07e1 <= param_3 && (DAT_1028_07df <= param_2)))) + { + local_3 = 1; + goto LAB_1000_9bc3; + } + } + } + } + local_3 = 0; +LAB_1000_9bc3: + return CONCAT11((char)(uVar1 >> 8),local_3); +} + + +/* ===== 1000:9bca FUN_1000_9bca ===== */ + +void __stdcall16far FUN_1000_9bca(int param_1) + +{ + undefined2 uVar1; + undefined2 uVar2; + uint uVar3; + int iVar4; + int iVar5; + undefined2 unaff_CS; + undefined2 unaff_SS; + undefined2 uVar6; + undefined2 uVar7; + + uVar1 = *(undefined2 *)((int)*(undefined4 *)(param_1 + 6) + 4); + GETCLIENTRECT(unaff_CS,param_1 + -0x1a,unaff_SS); + uVar1 = GETDC(0x1228,*(undefined2 *)((int)*(undefined4 *)(param_1 + 6) + 4),uVar1); + *(undefined2 *)(param_1 + -0xc) = uVar1; + uVar1 = CREATECOMPATIBLEDC(0x1228,*(undefined2 *)(param_1 + -0xc)); + *(undefined2 *)(param_1 + -0xe) = uVar1; + uVar1 = CREATECOMPATIBLEDC(0x1228,*(undefined2 *)(param_1 + -0xc)); + *(undefined2 *)(param_1 + -0x10) = uVar1; + uVar1 = CREATECOMPATIBLEDC(0x1228,*(undefined2 *)(param_1 + -0xc)); + *(undefined2 *)(param_1 + -0x12) = uVar1; + uVar1 = *(undefined2 *)(param_1 + -0xc); + uVar2 = CREATECOMPATIBLEBITMAP(0x1228,100,100); + *(undefined2 *)(param_1 + -8) = uVar2; + iVar4 = DAT_1028_07d5 + (uint)(0xfe0b < DAT_1028_07d3); + uVar3 = FUN_1020_08e6(uVar1); + uVar1 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar5 = (int)*(undefined4 *)(param_1 + 6); + *(int *)(iVar5 + 0xba2) = uVar3 - 8; + *(int *)(iVar5 + 0xba4) = iVar4 - (uint)(uVar3 < 8); + iVar4 = DAT_1028_07d9 + (uint)(0xfe0b < DAT_1028_07d7); + uVar3 = FUN_1020_08e6(); + uVar1 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar5 = (int)*(undefined4 *)(param_1 + 6); + *(int *)(iVar5 + 0xba6) = uVar3 - 8; + *(int *)(iVar5 + 0xba8) = iVar4 - (uint)(uVar3 < 8); + *(int *)(param_1 + -0x20) = *(int *)(iVar5 + 0xba2) + -1; + *(undefined2 *)(param_1 + -0x1c) = 1; + *(int *)(param_1 + -0x22) = *(int *)((int)*(undefined4 *)(param_1 + 6) + 0xba6) + -1; + *(undefined2 *)(param_1 + -0x1e) = 1; + *(undefined2 *)(param_1 + -0x28) = 0x13; + *(undefined2 *)(param_1 + -0x2a) = 0x13; + uVar1 = SELECTOBJECT(0x1020,DAT_1028_085b); + *(undefined2 *)(param_1 + -2) = uVar1; + uVar1 = SELECTOBJECT(0x1228,*(undefined2 *)(param_1 + -8)); + *(undefined2 *)(param_1 + -4) = uVar1; + BITBLT(0x1228,0x20,0xcc,*(undefined2 *)(param_1 + -0x22),*(undefined2 *)(param_1 + -0x20), + *(undefined2 *)(param_1 + -0xe),*(undefined2 *)(param_1 + -0x2a), + *(undefined2 *)(param_1 + -0x28),0,0); + SELECTOBJECT(0x1228,*(undefined2 *)((int)*(undefined4 *)(param_1 + 6) + 0x54)); + BITBLT(0x1228,0xc6,0x88,0,0,*(undefined2 *)(param_1 + -0xe),0x13,0x13, + *(undefined2 *)(param_1 + -0x1e),*(undefined2 *)(param_1 + -0x1c)); + SELECTOBJECT(0x1228,*(undefined2 *)((int)*(undefined4 *)(param_1 + 6) + 0x52)); + BITBLT(0x1228,0x86,0xee,0,0,*(undefined2 *)(param_1 + -0xe),0x13,0x13, + *(undefined2 *)(param_1 + -0x1e),*(undefined2 *)(param_1 + -0x1c)); + if (0x1ba < *(int *)(param_1 + -0x22) + *(int *)(param_1 + -0x2a)) { + if (*(int *)(param_1 + -0x22) < 0x1bb) { + *(int *)(param_1 + -0x2a) = 0x1bb - *(int *)(param_1 + -0x22); + } + else { + *(undefined2 *)(param_1 + -0x2a) = 0; + } + } + uVar1 = *(undefined2 *)(param_1 + -0xc); + BITBLT(0x1228,0x20,0xcc,0,0,*(undefined2 *)(param_1 + -0x10),*(undefined2 *)(param_1 + -0x2a), + *(undefined2 *)(param_1 + -0x28),*(undefined2 *)(param_1 + -0x22), + *(undefined2 *)(param_1 + -0x20)); + uVar2 = *(undefined2 *)(param_1 + -0xe); + SELECTOBJECT(0x1228,*(undefined2 *)(param_1 + -2)); + uVar7 = *(undefined2 *)(param_1 + -0x10); + SELECTOBJECT(0x1228,*(undefined2 *)(param_1 + -4)); + uVar6 = *(undefined2 *)(param_1 + -0x12); + SELECTOBJECT(0x1228,*(undefined2 *)(param_1 + -6)); + DELETEOBJECT(0x1228,*(undefined2 *)(param_1 + -8),uVar6,uVar7,uVar2,uVar1); + DELETEDC(0x1228,*(undefined2 *)(param_1 + -0xe)); + DELETEDC(0x1228,*(undefined2 *)(param_1 + -0x10)); + DELETEDC(0x1228,*(undefined2 *)(param_1 + -0x12)); + RELEASEDC(0x1228,*(undefined2 *)(param_1 + -0xc)); + return; +} + + +/* ===== 1000:9e85 FUN_1000_9e85 ===== */ + +void __stdcall16far FUN_1000_9e85(int param_1) + +{ + int iVar1; + undefined2 uVar2; + undefined2 unaff_SS; + + if ((((DAT_1028_3371 != 0) && (DAT_1028_33c4 != 0)) && (DAT_1028_3417 != 0)) && + ((DAT_1028_346a != 0 && (DAT_1028_34bd != 0)))) { + DAT_1028_0851 = 0; + DAT_1028_0853 = 0; + DAT_1028_07c8 = 1; + *(undefined1 *)((int)*(undefined4 *)(param_1 + 6) + 0xbdd) = 0; + } + DAT_1028_07c6 = 0; + uVar2 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar1 = (int)*(undefined4 *)(param_1 + 6); + *(undefined2 *)(iVar1 + 0x5e) = 0; + DAT_1028_07d3 = 0xf588; + DAT_1028_07d5 = 4; + DAT_1028_07d7 = 0x4d48; + DAT_1028_07d9 = 6; + *(undefined2 *)(iVar1 + 0xbba) = 0xf588; + *(undefined2 *)(iVar1 + 0xbbc) = 4; + *(undefined2 *)(iVar1 + 0xbbe) = 0x4d48; + *(undefined2 *)(iVar1 + 0xbc0) = 6; + *(undefined2 *)(iVar1 + 0xbc2) = 0xf588; + *(undefined2 *)(iVar1 + 0xbc4) = 4; + *(undefined2 *)(iVar1 + 0xbc6) = 0x4d48; + *(undefined2 *)(iVar1 + 0xbc8) = 6; + *(undefined2 *)(iVar1 + 0xbae) = 0; + *(undefined2 *)(iVar1 + 0xbb0) = 0; + *(undefined2 *)(iVar1 + 0xbaa) = 0; + *(undefined2 *)(iVar1 + 0xbac) = 0; + *(undefined2 *)(iVar1 + 0xbce) = 0; + *(undefined2 *)(iVar1 + 0xbd0) = 0; + *(undefined2 *)(iVar1 + 0xbd2) = 0; + *(undefined2 *)(iVar1 + 0xbca) = 0; + *(undefined2 *)(iVar1 + 0xbcc) = 0; + *(undefined1 *)(iVar1 + 0xbdd) = 0; + FUN_1000_9bca(param_1); + return; +} + + +/* ===== 1000:9f73 FUN_1000_9f73 ===== */ + +void __stdcall16far FUN_1000_9f73(int param_1) + +{ + undefined2 uVar1; + undefined2 uVar2; + uint uVar3; + int iVar4; + int iVar5; + undefined2 unaff_CS; + undefined2 unaff_SS; + undefined2 uVar6; + undefined2 uVar7; + + uVar1 = *(undefined2 *)((int)*(undefined4 *)(param_1 + 6) + 4); + GETCLIENTRECT(unaff_CS,param_1 + -0x1a,unaff_SS); + uVar1 = GETDC(0x1228,*(undefined2 *)((int)*(undefined4 *)(param_1 + 6) + 4),uVar1); + *(undefined2 *)(param_1 + -0xc) = uVar1; + uVar1 = CREATECOMPATIBLEDC(0x1228,*(undefined2 *)(param_1 + -0xc)); + *(undefined2 *)(param_1 + -0xe) = uVar1; + uVar1 = CREATECOMPATIBLEDC(0x1228,*(undefined2 *)(param_1 + -0xc)); + *(undefined2 *)(param_1 + -0x10) = uVar1; + uVar1 = CREATECOMPATIBLEDC(0x1228,*(undefined2 *)(param_1 + -0xc)); + *(undefined2 *)(param_1 + -0x12) = uVar1; + uVar1 = *(undefined2 *)(param_1 + -0xc); + uVar2 = CREATECOMPATIBLEBITMAP(0x1228,100,100); + *(undefined2 *)(param_1 + -8) = uVar2; + iVar4 = DAT_1028_07d5 + (uint)(0xfe0b < DAT_1028_07d3); + uVar3 = FUN_1020_08e6(uVar1); + uVar1 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar5 = (int)*(undefined4 *)(param_1 + 6); + *(int *)(iVar5 + 0xba2) = uVar3 - 8; + *(int *)(iVar5 + 0xba4) = iVar4 - (uint)(uVar3 < 8); + iVar4 = DAT_1028_07d9 + (uint)(0xfe0b < DAT_1028_07d7); + uVar3 = FUN_1020_08e6(); + uVar1 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar5 = (int)*(undefined4 *)(param_1 + 6); + *(int *)(iVar5 + 0xba6) = uVar3 - 8; + *(int *)(iVar5 + 0xba8) = iVar4 - (uint)(uVar3 < 8); + iVar4 = (DAT_1028_07d5 - *(int *)(iVar5 + 0xbc4)) - + (uint)(DAT_1028_07d3 < *(uint *)(iVar5 + 0xbc2)); + uVar1 = FUN_1020_08e6(); + uVar2 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar5 = (int)*(undefined4 *)(param_1 + 6); + *(undefined2 *)(iVar5 + 0xbb2) = uVar1; + *(int *)(iVar5 + 0xbb4) = iVar4; + iVar4 = (DAT_1028_07d9 - *(int *)(iVar5 + 0xbc8)) - + (uint)(DAT_1028_07d7 < *(uint *)(iVar5 + 0xbc6)); + uVar1 = FUN_1020_08e6(); + uVar2 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar5 = (int)*(undefined4 *)(param_1 + 6); + *(undefined2 *)(iVar5 + 0xbb6) = uVar1; + *(int *)(iVar5 + 3000) = iVar4; + if ((*(int *)(iVar5 + 0xbb4) < 1) && + ((*(int *)(iVar5 + 0xbb4) < 0 || (*(int *)(iVar5 + 0xbb2) == 0)))) { + *(int *)(param_1 + -0x20) = *(int *)((int)*(undefined4 *)(param_1 + 6) + 0xba2) + -1; + *(undefined2 *)(param_1 + -0x1c) = 1; + } + else { + uVar1 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar4 = (int)*(undefined4 *)(param_1 + 6); + *(int *)(param_1 + -0x20) = (*(int *)(iVar4 + 0xba2) - *(int *)(iVar4 + 0xbb2)) + -1; + *(int *)(param_1 + -0x1c) = *(int *)((int)*(undefined4 *)(param_1 + 6) + 0xbb2) + 1; + } + uVar1 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar5 = (int)*(undefined4 *)(param_1 + 6); + iVar4 = *(int *)(iVar5 + 3000); + if ((iVar4 < 1) && ((iVar4 < 0 || (*(int *)(iVar5 + 0xbb6) == 0)))) { + *(int *)(param_1 + -0x22) = *(int *)((int)*(undefined4 *)(param_1 + 6) + 0xba6) + -1; + *(undefined2 *)(param_1 + -0x1e) = 1; + } + else { + uVar1 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar4 = (int)*(undefined4 *)(param_1 + 6); + *(int *)(param_1 + -0x22) = (*(int *)(iVar4 + 0xba6) - *(int *)(iVar4 + 0xbb6)) + -1; + *(int *)(param_1 + -0x1e) = *(int *)((int)*(undefined4 *)(param_1 + 6) + 0xbb6) + 1; + } + uVar1 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar5 = (int)*(undefined4 *)(param_1 + 6); + iVar4 = *(int *)(iVar5 + 0xbb2); + if (*(int *)(iVar5 + 0xbb4) < 0) { + iVar4 = -iVar4; + } + *(int *)(param_1 + -0x28) = iVar4 + 0x13; + uVar1 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar5 = (int)*(undefined4 *)(param_1 + 6); + iVar4 = *(int *)(iVar5 + 0xbb6); + if (*(int *)(iVar5 + 3000) < 0) { + iVar4 = -iVar4; + } + *(int *)(param_1 + -0x2a) = iVar4 + 0x13; + uVar1 = SELECTOBJECT(0x1020,DAT_1028_085b); + *(undefined2 *)(param_1 + -2) = uVar1; + uVar1 = SELECTOBJECT(0x1228,*(undefined2 *)(param_1 + -8)); + *(undefined2 *)(param_1 + -4) = uVar1; + BITBLT(0x1228,0x20,0xcc,*(undefined2 *)(param_1 + -0x22),*(undefined2 *)(param_1 + -0x20), + *(undefined2 *)(param_1 + -0xe),*(undefined2 *)(param_1 + -0x2a), + *(undefined2 *)(param_1 + -0x28),0,0); + SELECTOBJECT(0x1228,*(undefined2 *)((int)*(undefined4 *)(param_1 + 6) + 0x54)); + BITBLT(0x1228,0xc6,0x88,0,0,*(undefined2 *)(param_1 + -0xe),0x13,0x13, + *(undefined2 *)(param_1 + -0x1e),*(undefined2 *)(param_1 + -0x1c)); + SELECTOBJECT(0x1228,*(undefined2 *)((int)*(undefined4 *)(param_1 + 6) + 0x52)); + BITBLT(0x1228,0x86,0xee,0,0,*(undefined2 *)(param_1 + -0xe),0x13,0x13, + *(undefined2 *)(param_1 + -0x1e),*(undefined2 *)(param_1 + -0x1c)); + if (0x1ba < *(int *)(param_1 + -0x22) + *(int *)(param_1 + -0x2a)) { + if (*(int *)(param_1 + -0x22) < 0x1bb) { + *(int *)(param_1 + -0x2a) = 0x1bb - *(int *)(param_1 + -0x22); + } + else { + *(undefined2 *)(param_1 + -0x2a) = 0; + } + } + uVar1 = *(undefined2 *)(param_1 + -0xc); + BITBLT(0x1228,0x20,0xcc,0,0,*(undefined2 *)(param_1 + -0x10),*(undefined2 *)(param_1 + -0x2a), + *(undefined2 *)(param_1 + -0x28),*(undefined2 *)(param_1 + -0x22), + *(undefined2 *)(param_1 + -0x20)); + uVar2 = *(undefined2 *)(param_1 + -0xe); + SELECTOBJECT(0x1228,*(undefined2 *)(param_1 + -2)); + uVar7 = *(undefined2 *)(param_1 + -0x10); + SELECTOBJECT(0x1228,*(undefined2 *)(param_1 + -4)); + uVar6 = *(undefined2 *)(param_1 + -0x12); + SELECTOBJECT(0x1228,*(undefined2 *)(param_1 + -6)); + DELETEOBJECT(0x1228,*(undefined2 *)(param_1 + -8),uVar6,uVar7,uVar2,uVar1); + DELETEDC(0x1228,*(undefined2 *)(param_1 + -0xe)); + DELETEDC(0x1228,*(undefined2 *)(param_1 + -0x10)); + DELETEDC(0x1228,*(undefined2 *)(param_1 + -0x12)); + RELEASEDC(0x1228,*(undefined2 *)(param_1 + -0xc)); + return; +} + + +/* ===== 1000:a38e FUN_1000_a38e ===== */ + +void __stdcall16far FUN_1000_a38e(int param_1,char param_2) + +{ + undefined2 uVar1; + undefined2 uVar2; + uint uVar3; + int iVar4; + int iVar5; + undefined2 unaff_CS; + undefined2 unaff_SS; + undefined2 uVar6; + + uVar1 = *(undefined2 *)((int)*(undefined4 *)(param_1 + 6) + 4); + GETCLIENTRECT(unaff_CS,param_1 + -0x1a,unaff_SS); + uVar1 = GETDC(0x1228,*(undefined2 *)((int)*(undefined4 *)(param_1 + 6) + 4),uVar1); + *(undefined2 *)(param_1 + -0xc) = uVar1; + uVar1 = CREATECOMPATIBLEDC(0x1228,*(undefined2 *)(param_1 + -0xc)); + *(undefined2 *)(param_1 + -0xe) = uVar1; + uVar1 = CREATECOMPATIBLEDC(0x1228,*(undefined2 *)(param_1 + -0xc)); + *(undefined2 *)(param_1 + -0x10) = uVar1; + uVar1 = CREATECOMPATIBLEDC(0x1228,*(undefined2 *)(param_1 + -0xc)); + *(undefined2 *)(param_1 + -0x12) = uVar1; + uVar1 = *(undefined2 *)(param_1 + -0xc); + uVar2 = CREATECOMPATIBLEBITMAP(0x1228,100,100); + *(undefined2 *)(param_1 + -8) = uVar2; + uVar2 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar4 = (int)*(undefined4 *)(param_1 + 6); + iVar4 = *(int *)(iVar4 + 0xbc4) + (uint)(0xfe0b < *(uint *)(iVar4 + 0xbc2)); + uVar3 = FUN_1020_08e6(uVar1); + uVar1 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar5 = (int)*(undefined4 *)(param_1 + 6); + *(int *)(iVar5 + 0xba2) = uVar3 - 8; + *(int *)(iVar5 + 0xba4) = iVar4 - (uint)(uVar3 < 8); + iVar4 = *(int *)(iVar5 + 0xbc8) + (uint)(0xfe0b < *(uint *)(iVar5 + 0xbc6)); + uVar3 = FUN_1020_08e6(); + uVar1 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar5 = (int)*(undefined4 *)(param_1 + 6); + *(int *)(iVar5 + 0xba6) = uVar3 - 8; + *(int *)(iVar5 + 0xba8) = iVar4 - (uint)(uVar3 < 8); + *(int *)(param_1 + -0x20) = *(int *)(iVar5 + 0xba2) + -1; + *(undefined2 *)(param_1 + -0x1c) = 1; + *(int *)(param_1 + -0x22) = *(int *)((int)*(undefined4 *)(param_1 + 6) + 0xba6) + -1; + *(undefined2 *)(param_1 + -0x1e) = 1; + *(undefined2 *)(param_1 + -0x28) = 0x13; + *(undefined2 *)(param_1 + -0x2a) = 0x13; + uVar1 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar4 = (int)*(undefined4 *)(param_1 + 6); + *(undefined2 *)(iVar4 + 0xbaa) = 0; + *(undefined2 *)(iVar4 + 0xbac) = 0; + *(undefined2 *)(iVar4 + 0xbae) = 0; + *(undefined2 *)(iVar4 + 0xbb0) = 0; + uVar1 = SELECTOBJECT(0x1020,DAT_1028_085b); + *(undefined2 *)(param_1 + -2) = uVar1; + uVar1 = SELECTOBJECT(0x1228,*(undefined2 *)(param_1 + -8)); + *(undefined2 *)(param_1 + -4) = uVar1; + BITBLT(0x1228,0x20,0xcc,*(undefined2 *)(param_1 + -0x22),*(undefined2 *)(param_1 + -0x20), + *(undefined2 *)(param_1 + -0xe),*(undefined2 *)(param_1 + -0x2a), + *(undefined2 *)(param_1 + -0x28),0,0); + if (0x1ba < *(int *)(param_1 + -0x22) + *(int *)(param_1 + -0x2a)) { + if (*(int *)(param_1 + -0x22) < 0x1bb) { + *(int *)(param_1 + -0x2a) = 0x1bb - *(int *)(param_1 + -0x22); + } + else { + *(undefined2 *)(param_1 + -0x2a) = 0; + } + } + if (param_2 == '\0') { + BITBLT(0x1228,0x20,0xcc,0,0,*(undefined2 *)(param_1 + -0x10),*(undefined2 *)(param_1 + -0x2a), + *(undefined2 *)(param_1 + -0x28),*(undefined2 *)(param_1 + -0x22), + *(undefined2 *)(param_1 + -0x20)); + } + uVar1 = *(undefined2 *)(param_1 + -0xe); + SELECTOBJECT(0x1228,*(undefined2 *)(param_1 + -2)); + uVar2 = *(undefined2 *)(param_1 + -0x10); + SELECTOBJECT(0x1228,*(undefined2 *)(param_1 + -4)); + uVar6 = *(undefined2 *)(param_1 + -0x12); + SELECTOBJECT(0x1228,*(undefined2 *)(param_1 + -6)); + DELETEOBJECT(0x1228,*(undefined2 *)(param_1 + -8),uVar6,uVar2,uVar1); + DELETEDC(0x1228,*(undefined2 *)(param_1 + -0xe)); + DELETEDC(0x1228,*(undefined2 *)(param_1 + -0x10)); + DELETEDC(0x1228,*(undefined2 *)(param_1 + -0x12)); + RELEASEDC(0x1228,*(undefined2 *)(param_1 + -0xc)); + return; +} + + +/* ===== 1000:a604 FUN_1000_a604 ===== */ + +void __stdcall16far FUN_1000_a604(int param_1) + +{ + uint uVar1; + undefined2 uVar2; + int iVar3; + int iVar4; + int iVar5; + int iVar6; + int iVar7; + undefined2 unaff_SS; + bool bVar8; + undefined2 uVar9; + uint local_16; + int local_14; + + uVar9 = *(undefined2 *)((int)*(undefined4 *)(param_1 + 6) + 4); + uVar2 = GETDC(); + local_16 = 1; + local_14 = 0; + while( true ) { + iVar3 = FUN_1020_08a9(uVar9,uVar2); + iVar4 = iVar3 + 0x187; + iVar3 = iVar3 + 0x18b; + iVar5 = (DAT_1028_07d1 - 1) * 0x2c; + iVar6 = iVar5 + 0x12a; + iVar5 = iVar5 + 0x12e; + uVar1 = *(uint *)((uint)DAT_1028_07d1 * 2 + 0x81f); + iVar7 = (int)uVar1 >> 0xf; + if ((local_14 < iVar7) || ((local_14 <= iVar7 && (local_16 <= uVar1)))) { + FUN_1008_0837((iVar5 - iVar6) + 1,(iVar3 - iVar4) + 1,iVar6,iVar4,uVar2); + } + else { + FUN_1008_08bb((iVar5 - iVar6) + 1,(iVar3 - iVar4) + 1,iVar6,iVar4,uVar2); + } + FUN_1008_093f((iVar5 - iVar6) + 1,(iVar3 - iVar4) + 1,iVar6,iVar4,uVar2); + if ((local_14 == 0) && (local_16 == 6)) break; + bVar8 = 0xfffe < local_16; + local_16 = local_16 + 1; + local_14 = local_14 + (uint)bVar8; + } + RELEASEDC(0x1008,uVar2); + return; +} + + +/* ===== 1000:a70e FUN_1000_a70e ===== */ + +void __stdcall16far FUN_1000_a70e(int param_1) + +{ + undefined2 unaff_SS; + + DAT_1028_07d0 = 0; + *(undefined1 *)((int)*(undefined4 *)(param_1 + 6) + 0xbde) = 1; + DAT_1028_07c9 = 1; + return; +} + + +/* ===== 1000:a72c FUN_1000_a72c ===== */ + +void __stdcall16far FUN_1000_a72c(int param_1) + +{ + undefined2 unaff_SS; + byte local_4; + byte local_3; + + local_3 = 1; + while( true ) { + FUN_1000_7e12(param_1,local_3); + for (local_4 = 1; + *(undefined2 *) + ((int)*(undefined4 *)(param_1 + 6) + (uint)local_4 * 0x15e + (uint)local_3 * 2 + 0x36c) = + *(undefined2 *)((uint)local_3 * 0x53 + 0x99e), local_4 != 4; local_4 = local_4 + 1) { + } + if (local_3 == 0xaf) break; + local_3 = local_3 + 1; + } + for (local_3 = 1; FUN_1000_b3f3(param_1,local_3 + 1000), local_3 != 5; local_3 = local_3 + 1) { + } + FUN_1000_bda2(param_1,0,0); + DAT_1028_0874 = 0; + local_3 = 1; + while( true ) { + if (local_3 <= DAT_1028_07d0) { + DAT_1028_07d1 = local_3; + *(undefined2 *)((uint)local_3 * 4 + 0x97e) = 0; + *(undefined2 *)((uint)local_3 * 4 + 0x980) = 0; + *(undefined2 *)((uint)local_3 * 4 + 0x98e) = 0; + *(undefined2 *)((uint)local_3 * 4 + 0x990) = 0; + *(undefined1 *)(local_3 + 0x9a1) = 1; + *(undefined2 *)((uint)local_3 * 2 + 0x9a4) = 0; + FUN_1000_bc36(param_1,0,0); + *(undefined1 *)(local_3 + 0x816) = 1; + if (local_3 < 2) { + *(undefined2 *)((uint)local_3 * 2 + 0x81f) = 2; + } + else { + *(undefined2 *)((uint)local_3 * 2 + 0x81f) = 3; + } + FUN_1000_a604(param_1); + *(undefined2 *)((uint)local_3 * 4 + 0x835) = 1; + *(undefined2 *)((uint)local_3 * 4 + 0x837) = 0; + *(undefined1 *)(local_3 + 0x81a) = 1; + for (local_4 = 1; + *(undefined1 *) + ((int)*(undefined4 *)(param_1 + 6) + (uint)local_3 * 0x14 + (uint)local_4 + 0x467) = 0, + local_4 != 0x14; local_4 = local_4 + 1) { + } + } + if (local_3 == 4) break; + local_3 = local_3 + 1; + } + DAT_1028_07d1 = 1; + DAT_1028_07d2 = 0; + for (local_4 = '\x01'; FUN_1000_7e92(param_1,local_4), local_4 != '\x14'; + local_4 = local_4 + '\x01') { + } + return; +} + + +/* ===== 1000:a8ea FUN_1000_a8ea ===== */ + +void __stdcall16far FUN_1000_a8ea(void) + +{ + uint uVar1; + int iVar2; + void *unaff_SS; + ushort in_stack_0000fef6; + uint auStack_32 [22]; + ushort local_6; + int local_4; + + local_6 = _LCREAT((char *)0x3120000,0x1028); + if (local_6 != 0xffff) { + FUN_1020_16c9(); + local_4 = 1; + while( true ) { + iVar2 = local_4; + uVar1 = *(uint *)(local_4 * 4 + 0x87c); + auStack_32[local_4 * 2] = + *(uint *)(local_4 * 4 + 0x87a) ^ s_IWIKTDK_Highscores_1028_0010._0_2_; + auStack_32[iVar2 * 2 + 1] = uVar1 ^ s_IWIKTDK_Highscores_1028_0010._2_2_; + FUN_1008_2ee5(); + if (local_4 == 10) break; + local_4 = local_4 + 1; + } + _LWRITE(0x10,(void *)CONCAT22(local_6,(void *)0x1028),in_stack_0000fef6); + _LWRITE(0x28,(void *)CONCAT22(local_6,unaff_SS),in_stack_0000fef6); + _LWRITE(0xdc,(void *)CONCAT22(local_6,unaff_SS),in_stack_0000fef6); + _LCLOSE(local_6); + } + return; +} + + +/* ===== 1000:a99c FUN_1000_a99c ===== */ + +void __stdcall16far FUN_1000_a99c(void) + +{ + undefined2 uVar1; + uint uVar2; + undefined2 uVar3; + void *unaff_SS; + undefined1 uVar4; + undefined1 *puVar5; + void *pvVar6; + undefined1 *puVar7; + void *pvVar8; + ushort in_stack_0000fdc0; + undefined1 local_13f [252]; + uint auStack_43 [22]; + undefined1 local_17 [16]; + char local_7; + ushort local_6; + int local_4; + + local_7 = '\0'; + local_6 = _LOPEN((char *)0x3200000,0x1028); + if (local_6 == 0xffff) { + local_6 = _LOPEN((char *)0x3200040,0x1028); + } + uVar4 = local_6 == 0xffff; + if (!(bool)uVar4) { + _LREAD(0x10,(void *)CONCAT22(local_6,unaff_SS),in_stack_0000fdc0); + puVar7 = local_13f; + pvVar8 = unaff_SS; + FUN_1020_0b00(0x10,local_17,unaff_SS); + puVar5 = &stack0xfdc1; + pvVar6 = unaff_SS; + FUN_1020_0b00(0x10,0x14,0x1028); + FUN_1020_0ac3(puVar5,pvVar6,puVar7,pvVar8); + if ((bool)uVar4) { + local_7 = '\x01'; + _LREAD(0x28,(void *)CONCAT22(local_6,unaff_SS),in_stack_0000fdc0); + _LREAD(0xdc,(void *)CONCAT22(local_6,(void *)0x1028),in_stack_0000fdc0); + local_4 = 1; + while( true ) { + uVar2 = auStack_43[local_4 * 2 + 1] ^ s_IWIKTDK_Highscores_1028_0010._2_2_; + *(uint *)(local_4 * 4 + 0x87a) = + auStack_43[local_4 * 2] ^ s_IWIKTDK_Highscores_1028_0010._0_2_; + *(uint *)(local_4 * 4 + 0x87c) = uVar2; + if (local_4 == 10) break; + local_4 = local_4 + 1; + } + } + _LCLOSE(local_6); + } + if (local_7 == '\0') { + local_4 = 1; + while( true ) { + uVar3 = 0; + uVar1 = FUN_1020_08a9(); + *(undefined2 *)(local_4 * 4 + 0x87a) = uVar1; + *(undefined2 *)(local_4 * 4 + 0x87c) = uVar3; + if (local_4 == 10) break; + local_4 = local_4 + 1; + } + FUN_1008_2ee5(0x32d,0x1028,0x8a6,0x1028); + FUN_1008_2ee5(0x32d,0x1028,0x8bc,0x1028); + FUN_1008_2ee5(0x32d,0x1028,0x8d2,0x1028); + FUN_1008_2ee5(0x32d,0x1028,0x8e8,0x1028); + FUN_1008_2ee5(0x32d,0x1028,0x8fe,0x1028); + FUN_1008_2ee5(0x32d,0x1028,0x914,0x1028); + FUN_1008_2ee5(0x32d,0x1028,0x92a,0x1028); + FUN_1008_2ee5(0x32d,0x1028,0x940,0x1028); + FUN_1008_2ee5(0x32d,0x1028,0x956,0x1028); + FUN_1008_2ee5(0x32d,0x1028,0x96c,0x1028); + } + return; +} + + +/* ===== 1000:ab3c FUN_1000_ab3c ===== */ + +void __stdcall16far FUN_1000_ab3c(int param_1) + +{ + int iVar1; + undefined2 uVar2; + undefined2 unaff_SS; + undefined4 uVar3; + + if (DAT_1028_07d2 != 0) { + FUN_1008_2ee5(0x336,0x1028,(uint)DAT_1028_07d2 * 0x16 + 0x890,0x1028); + uVar3 = FUN_1008_1607(0,0,0x1ce,0x16,(uint)DAT_1028_07d2 * 0x16 + 0x890,0x1028,0x373,0x1028, + 0x349,0x1028,(int)*(undefined4 *)(param_1 + 6), + (int)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10)); + (*(code *)*(undefined2 *)(*DAT_1028_064e + 0x38)) + (0x1008,(int *)DAT_1028_064e,(int)((ulong)DAT_1028_064e >> 0x10),uVar3); + } + uVar3 = FUN_1000_5aea(0,0,0x10e,0x38b,0x1028,(int)*(undefined4 *)(param_1 + 6), + (int)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10)); + uVar3 = (*(code *)*(undefined2 *)(*DAT_1028_064e + 0x34)) + (0x1000,(int *)DAT_1028_064e,(int)((ulong)DAT_1028_064e >> 0x10),uVar3); + uVar2 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar1 = (int)*(undefined4 *)(param_1 + 6); + *(undefined2 *)(iVar1 + 0x41) = (int)uVar3; + *(undefined2 *)(iVar1 + 0x43) = (int)((ulong)uVar3 >> 0x10); + FUN_1018_0e9e((int)*(undefined4 *)(iVar1 + 0x41), + (int)((ulong)*(undefined4 *)(iVar1 + 0x41) >> 0x10),1); + return; +} + + +/* ===== 1000:abe5 FUN_1000_abe5 ===== */ + +void __stdcall16far FUN_1000_abe5(undefined2 param_1) + +{ + int iVar1; + undefined2 uVar2; + int iVar3; + uint local_8; + int local_6; + + local_6 = 1; + while( true ) { + iVar3 = *(int *)((uint)DAT_1028_07d1 * 4 + 0x980); + iVar1 = *(int *)(local_6 * 4 + 0x87c); + if ((iVar1 < iVar3) || + ((iVar1 <= iVar3 && + (*(uint *)(local_6 * 4 + 0x87a) < *(uint *)((uint)DAT_1028_07d1 * 4 + 0x97e))))) break; + if (local_6 == 10) { + return; + } + local_6 = local_6 + 1; + } + if (local_6 + 1U < 0xb) { + local_8 = 10; + while( true ) { + iVar3 = (local_8 - 1) * 4; + uVar2 = *(undefined2 *)(iVar3 + 0x87c); + *(undefined2 *)(local_8 * 4 + 0x87a) = *(undefined2 *)(iVar3 + 0x87a); + *(undefined2 *)(local_8 * 4 + 0x87c) = uVar2; + FUN_1020_0891(0x16,local_8 * 0x16 + 0x890,0x1028,(local_8 - 1) * 0x16 + 0x890,0x1028); + if (local_8 == local_6 + 1U) break; + local_8 = local_8 - 1; + } + } + uVar2 = *(undefined2 *)((uint)DAT_1028_07d1 * 4 + 0x980); + *(undefined2 *)(local_6 * 4 + 0x87a) = *(undefined2 *)((uint)DAT_1028_07d1 * 4 + 0x97e); + *(undefined2 *)(local_6 * 4 + 0x87c) = uVar2; + DAT_1028_07d2 = (undefined1)local_6; + FUN_1000_ab3c(param_1); + FUN_1000_a8ea(param_1); + return; +} + + +/* ===== 1000:acc2 FUN_1000_acc2 ===== */ + +void __stdcall16far FUN_1000_acc2(undefined2 param_1) + +{ + byte bVar1; + byte bVar2; + undefined2 uVar3; + undefined2 uVar4; + undefined2 uVar5; + undefined1 local_14c; + + uVar5 = 0x1228; + uVar3 = GETDC(); + bVar2 = DAT_1028_07d1; + bVar1 = DAT_1028_07d0; + if (DAT_1028_07d0 != 0) { + local_14c = 1; + while( true ) { + FUN_1008_0837(0x1f,0x8b,(local_14c - 1) * 0x2c + 0x114,0x1d8,uVar3); + FUN_1008_093f(0x1f,0x8b,(local_14c - 1) * 0x2c + 0x114,0x1d8,uVar3); + DAT_1028_07d1 = local_14c; + if (local_14c == bVar2) { + FUN_1000_bc36(param_1,0,0); + uVar5 = *(undefined2 *)((uint)local_14c * 4 + 0x990); + uVar4 = FUN_1020_08a9(); + FUN_1000_bda2(param_1,uVar4,uVar5); + FUN_1000_0002(*(undefined2 *)((uint)local_14c * 2 + 0x9a4),uVar3); + FUN_1008_093f(0x7b,0x2a,0x4f,0x37,uVar3); + FUN_1008_0837(0xb,0xb,(local_14c - 1) * 0x2c + 0x118,0x174,uVar3); + FUN_1008_093f(0xb,0xb,(local_14c - 1) * 0x2c + 0x118,0x174,uVar3); + } + else { + FUN_1000_bc36(param_1,0xffff,0xffff); + FUN_1008_08bb(0xb,0xb,(local_14c - 1) * 0x2c + 0x118,0x174,uVar3); + FUN_1008_093f(0xb,0xb,(local_14c - 1) * 0x2c + 0x118,0x174,uVar3); + } + uVar5 = 0x1008; + if (local_14c == bVar1) break; + local_14c = local_14c + 1; + } + } + DAT_1028_07d1 = bVar2; + RELEASEDC(uVar5,uVar3); + return; +} + + +/* ===== 1000:ae6e FUN_1000_ae6e ===== */ + +void __stdcall16far FUN_1000_ae6e(int param_1) + +{ + byte bVar1; + uint uVar2; + undefined1 extraout_AH; + int iVar3; + int iVar4; + undefined2 uVar5; + undefined2 uVar6; + undefined2 uVar7; + undefined2 unaff_SS; + int local_9; + byte local_4; + + if ((DAT_1028_0874 == '\0') && (DAT_1028_399a != 0)) { + DAT_1028_0874 = '\0'; + FUN_1000_a38e(param_1,0); + uVar7 = DAT_1028_396b; + DAT_1028_07d3 = DAT_1028_3969; + DAT_1028_07d5 = DAT_1028_396b; + DAT_1028_07d7 = DAT_1028_396d; + DAT_1028_07d9 = DAT_1028_396f; + uVar5 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar3 = (int)*(undefined4 *)(param_1 + 6); + *(undefined2 *)(iVar3 + 0xbc2) = DAT_1028_3969; + *(undefined2 *)(iVar3 + 0xbc4) = uVar7; + uVar7 = DAT_1028_07d9; + *(undefined2 *)(iVar3 + 0xbc6) = DAT_1028_07d7; + *(undefined2 *)(iVar3 + 0xbc8) = uVar7; + *(undefined1 *)(iVar3 + (uint)DAT_1028_07d1 * 0x14 + 0x47b) = 0; + FUN_1000_b3f3(param_1,0x3fc); + FUN_1000_bdde(param_1,1,0); + uVar7 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar3 = (int)*(undefined4 *)(param_1 + 6); + *(undefined2 *)(iVar3 + 0xbaa) = 0; + *(undefined2 *)(iVar3 + 0xbac) = 0; + uVar7 = *(undefined2 *)(iVar3 + 0x58); + FUN_1020_100b(); + FUN_1020_0ff7(); + uVar5 = FUN_1020_1017(); + uVar6 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar3 = (int)*(undefined4 *)(param_1 + 6); + *(undefined2 *)(iVar3 + 0xbae) = uVar5; + *(undefined2 *)(iVar3 + 0xbb0) = uVar7; + *(undefined2 *)(iVar3 + 0xbca) = 0; + *(undefined2 *)(iVar3 + 0xbcc) = 0; + *(undefined2 *)(iVar3 + 0xbce) = 0; + *(undefined2 *)(iVar3 + 0xbd0) = 0; + *(undefined2 *)(iVar3 + 0xbd2) = 0; + DAT_1028_399a = 0; + DAT_1028_0875 = 1; + DAT_1028_41f9 = 1; + *(undefined1 *)(iVar3 + 0x61) = 1; + } + else { + DAT_1028_0875 = 0; + FUN_1008_0002(8); + iVar3 = param_1; + FUN_1000_a38e(param_1,0); + if (DAT_1028_0874 == '\0') { + *(undefined1 *)((int)*(undefined4 *)(param_1 + 6) + 0xbdd) = 0; + } + *(undefined1 *)((int)*(undefined4 *)(param_1 + 6) + 0xbdc) = 0; + if (*(int *)((uint)DAT_1028_07d1 * 2 + 0x81f) == 0) { + uVar7 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar3 = (int)*(undefined4 *)(param_1 + 6); + *(undefined1 *)(iVar3 + 0xbda) = 0; + *(undefined1 *)(iVar3 + 0xbdb) = 0; + FUN_1000_a99c(param_1); + iVar3 = 0x1000; + FUN_1000_abe5(param_1); + } + uVar7 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar4 = (int)*(undefined4 *)(param_1 + 6); + *(undefined2 *)(iVar4 + 0xbce) = 0; + *(undefined2 *)(iVar4 + 0xbd0) = 0; + *(undefined2 *)(iVar4 + 0xbd2) = 0; + local_4 = 1; + while( true ) { + *(undefined1 *) + ((int)*(undefined4 *)(param_1 + 6) + (uint)DAT_1028_07d1 * 0xaf + (uint)local_4 + 0x61) = + *(undefined1 *)((uint)local_4 * 0x53 + 0x98f); + *(undefined2 *) + ((int)*(undefined4 *)(param_1 + 6) + (uint)DAT_1028_07d1 * 0x15e + (uint)local_4 * 2 + 0x36c) + = *(undefined2 *)((uint)local_4 * 0x53 + 0x99e); + bVar1 = DAT_1028_07d1; + if (local_4 == 0xaf) break; + local_4 = local_4 + 1; + } + do { + uVar2 = (uint)DAT_1028_07d1 % (uint)DAT_1028_07d0 + 1; + DAT_1028_07d1 = (byte)uVar2; + if (0 < *(int *)((uVar2 & 0xff) * 2 + 0x81f)) break; + } while (DAT_1028_07d1 != bVar1); + if (*(int *)((uVar2 & 0xff) * 2 + 0x81f) < 1) { + DAT_1028_07d1 = 0; + FUN_1000_a70e(param_1); + if (DAT_1028_07d2 == '\0') { + uVar7 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar3 = (int)*(undefined4 *)(param_1 + 6); + *(undefined1 *)(iVar3 + 0xbda) = 0; + *(undefined1 *)(iVar3 + 0xbdb) = 0; + FUN_1000_ab3c(param_1); + } + } + else { + local_4 = 1; + while( true ) { + *(undefined1 *)((uint)local_4 * 0x53 + 0x98f) = + *(undefined1 *) + ((int)*(undefined4 *)(param_1 + 6) + (uint)DAT_1028_07d1 * 0xaf + (uint)local_4 + 0x61 + ); + *(undefined2 *)((uint)local_4 * 0x53 + 0x99e) = + *(undefined2 *) + ((int)*(undefined4 *)(param_1 + 6) + (uint)DAT_1028_07d1 * 0x15e + (uint)local_4 * 2 + + 0x36c); + if (DAT_1028_07d1 != bVar1) { + iVar3 = param_1; + FUN_1000_7e12(param_1,local_4); + } + if (local_4 == 0xaf) break; + local_4 = local_4 + 1; + } + local_4 = '\x01'; + while( true ) { + if (DAT_1028_07d1 != bVar1) { + iVar3 = param_1; + FUN_1000_7e92(param_1,local_4); + } + if (local_4 == '\x14') break; + local_4 = local_4 + '\x01'; + } + local_4 = 2; + while( true ) { + if (local_4 <= *(byte *)(DAT_1028_07d1 + 0x816)) { + iVar3 = param_1; + FUN_1000_b30b(param_1,local_4 + 999); + } + if (local_4 == 6) break; + local_4 = local_4 + 1; + } + if (DAT_1028_07d1 != bVar1) { + local_9 = 0; + local_4 = 1; + while( true ) { + if (*(char *)((int)*(undefined4 *)(param_1 + 6) + (uint)DAT_1028_07d1 * 0x14 + + (uint)local_4 + 0x46c) != '\0') { + local_9 = local_9 + 1; + } + if (local_4 == 9) break; + local_4 = local_4 + 1; + } + uVar7 = GETDC(0x1000,*(undefined2 *)((int)*(undefined4 *)(param_1 + 6) + 4)); + FUN_1008_0dbd(local_9,uVar7); + FUN_1008_0b9e(CONCAT11(extraout_AH,DAT_1028_07d1),uVar7); + iVar3 = *(int *)((int)*(undefined4 *)(param_1 + 6) + 4); + RELEASEDC(0x1008,uVar7); + } + FUN_1000_acc2(param_1); + *(int *)((uint)DAT_1028_07d1 * 2 + 0x81f) = *(int *)((uint)DAT_1028_07d1 * 2 + 0x81f) + -1; + FUN_1000_9e85(param_1); + uVar7 = GETDC(0x1000,*(undefined2 *)((int)*(undefined4 *)(param_1 + 6) + 4),iVar3); + FUN_1008_08bb(0x14,0x94,0xf3,0x54,uVar7); + FUN_1008_093f(0x14,0x94,0xf3,0x54,uVar7); + RELEASEDC(0x1008,uVar7); + FUN_1000_a604(param_1); + } + } + return; +} + + +/* ===== 1000:b2c8 FUN_1000_b2c8 ===== */ + +void __stdcall16far +FUN_1000_b2c8(undefined2 param_1,int param_2,int param_3,int param_4,int param_5,undefined2 param_6) + +{ + FUN_1008_0837((param_2 - param_4) + 1,(param_3 - param_5) + 1,param_4,param_5,param_6); + FUN_1008_093f((param_2 - param_4) + 1,(param_3 - param_5) + 1,param_4,param_5,param_6); + return; +} + + +/* ===== 1000:b30b FUN_1000_b30b ===== */ + +void __stdcall16far FUN_1000_b30b(undefined2 param_1,uint param_2) + +{ + undefined2 uVar1; + int iVar2; + undefined2 uVar3; + + uVar1 = GETDC(); + if (param_2 < 0xb0) { + iVar2 = param_2 * 0x53; + uVar3 = 0x1000; + FUN_1000_b2c8(&stack0xfffe,*(undefined2 *)(iVar2 + 0x9ac),*(undefined2 *)(iVar2 + 0x9aa), + *(undefined2 *)(iVar2 + 0x9a8),*(undefined2 *)(iVar2 + 0x9a6),uVar1); + } + else if ((param_2 < 0x3ee) || (0x3f6 < param_2)) { + iVar2 = (param_2 - 1000) * 8; + uVar3 = 0x1000; + FUN_1000_b2c8(&stack0xfffe,*(undefined2 *)(iVar2 + 0x4269),*(undefined2 *)(iVar2 + 16999), + *(undefined2 *)(iVar2 + 0x4265),*(undefined2 *)(iVar2 + 0x4263),uVar1); + } + else { + uVar3 = 0x1008; + FUN_1008_0dbd(param_2 - 0x3ed,uVar1); + } + RELEASEDC(uVar3,uVar1); + return; +} + + +/* ===== 1000:b3b0 FUN_1000_b3b0 ===== */ + +void __stdcall16far +FUN_1000_b3b0(undefined2 param_1,int param_2,int param_3,int param_4,int param_5,undefined2 param_6) + +{ + FUN_1008_08bb((param_2 - param_4) + 1,(param_3 - param_5) + 1,param_4,param_5,param_6); + FUN_1008_093f((param_2 - param_4) + 1,(param_3 - param_5) + 1,param_4,param_5,param_6); + return; +} + + +/* ===== 1000:b3f3 FUN_1000_b3f3 ===== */ + +void __stdcall16far FUN_1000_b3f3(undefined2 param_1,uint param_2) + +{ + undefined2 uVar1; + int iVar2; + + uVar1 = GETDC(); + if (param_2 < 0xb0) { + iVar2 = param_2 * 0x53; + FUN_1000_b3b0(&stack0xfffe,*(undefined2 *)(iVar2 + 0x9ac),*(undefined2 *)(iVar2 + 0x9aa), + *(undefined2 *)(iVar2 + 0x9a8),*(undefined2 *)(iVar2 + 0x9a6),uVar1); + } + else { + iVar2 = (param_2 - 1000) * 8; + FUN_1000_b3b0(&stack0xfffe,*(undefined2 *)(iVar2 + 0x4269),*(undefined2 *)(iVar2 + 16999), + *(undefined2 *)(iVar2 + 0x4265),*(undefined2 *)(iVar2 + 0x4263),uVar1); + } + RELEASEDC(0x1000,uVar1); + return; +} + + +/* ===== 1000:b476 FUN_1000_b476 ===== */ + +void __stdcall16far FUN_1000_b476(int param_1,uint param_2,uint param_3) + +{ + uint uVar1; + bool bVar2; + int iVar3; + uint uVar4; + undefined2 uVar5; + int iVar6; + undefined2 uVar7; + undefined2 unaff_SS; + uint local_7; + byte local_3; + + if (DAT_1028_07c6 == '\0') { + if ((((param_2 & 1) == 1) && (0x80 < param_3)) && (param_3 < 0x86)) { + *(undefined1 *) + ((int)*(undefined4 *)(param_1 + 6) + (uint)DAT_1028_07d1 * 0x14 + param_3 + 0x3f5) = 1; + FUN_1000_b30b(param_1,param_3 + 0x376); + } + if ((param_2 & 2) == 2) { + iVar6 = *(int *)(param_3 * 0x53 + 0x99e); + *(undefined1 *)(iVar6 * 0x53 + 0x98f) = 0; + FUN_1000_7e12(param_1,iVar6); + if ((param_2 & 0x2000) == 0x2000) { + *(undefined1 *)((iVar6 + 1) * 0x53 + 0x98f) = 0; + *(undefined1 *)((iVar6 + 2) * 0x53 + 0x98f) = 0; + } + } + if ((((param_2 & 0x400) == 0x400) && (DAT_1028_07c7 == '\0')) && (DAT_1028_07c8 == '\0')) { + DAT_1028_0855 = 0; + DAT_1028_0857 = 0; + DAT_1028_07c7 = '\x01'; + } + if ((param_2 & 4) == 4) { + FUN_1008_0002(0xc); + DAT_1028_39de = 1; + *(undefined1 *)((int)*(undefined4 *)(param_1 + 6) + (uint)DAT_1028_07d1 * 0xaf + 0xf6) = 1; + uVar7 = 0x1000; + FUN_1000_b30b(param_1,0x95); + if (DAT_1028_399a == 0) { + iVar6 = *(int *)((uint)DAT_1028_07d1 * 2 + 0x9a4); + do { + uVar7 = 0x1020; + iVar3 = FUN_1020_14a4(6); + *(int *)((uint)DAT_1028_07d1 * 2 + 0x9a4) = iVar3 + 1; + } while (*(int *)((uint)DAT_1028_07d1 * 2 + 0x9a4) == iVar6); + } + else { + *(undefined2 *)((uint)DAT_1028_07d1 * 2 + 0x9a4) = 7; + } + uVar7 = GETDC(uVar7,*(undefined2 *)((int)*(undefined4 *)(param_1 + 6) + 4)); + FUN_1000_0002(*(undefined2 *)((uint)DAT_1028_07d1 * 2 + 0x9a4),uVar7); + FUN_1008_093f(0x7b,0x2a,0x4f,0x37,uVar7); + RELEASEDC(0x1008,uVar7); + } + if ((param_2 & 8) == 8) { + FUN_1008_0002(0xc); + bVar2 = true; + local_3 = 0; + while (*(char *)(((uint)local_3 * 3 + 0x5a) * 0x53 + 0x98f) == '\0') { + if (local_3 == 4) goto LAB_1000_b66c; + local_3 = local_3 + 1; + } + bVar2 = false; +LAB_1000_b66c: + if (bVar2) { + FUN_1008_0002(0x11); + if (*(char *)(DAT_1028_07d1 + 0x816) == '\x06') { + FUN_1000_bc36(param_1,50000,0); + } + else { + if (*(char *)(DAT_1028_07d1 + 0x816) == '\x01') { + *(undefined1 *)(DAT_1028_07d1 + 0x816) = 2; + } + else { + *(char *)(DAT_1028_07d1 + 0x816) = *(char *)(DAT_1028_07d1 + 0x816) + '\x01'; + } + FUN_1000_b30b(param_1,*(byte *)(DAT_1028_07d1 + 0x816) + 999); + } + local_3 = 0; + while( true ) { + *(undefined1 *)(((uint)local_3 * 3 + 0x5a) * 0x53 + 0x98f) = 1; + *(undefined1 *)(((uint)local_3 * 3 + 0x5b) * 0x53 + 0x98f) = 1; + *(undefined1 *)(((uint)local_3 * 3 + 0x5c) * 0x53 + 0x98f) = 1; + FUN_1000_7e12(param_1,(uint)local_3 * 3 + 0x5a); + if (local_3 == 4) break; + local_3 = local_3 + 1; + } + } + } + if ((param_2 & 0x10) == 0x10) { + FUN_1008_0002(0xc); + bVar2 = true; + local_3 = 0; + while (*(char *)(((uint)local_3 * 3 + 0x6d) * 0x53 + 0x98f) == '\0') { + if (local_3 == 3) goto LAB_1000_b79e; + local_3 = local_3 + 1; + } + bVar2 = false; +LAB_1000_b79e: + if (bVar2) { + local_7 = 1; + local_3 = 1; + while( true ) { + if (*(char *)((int)*(undefined4 *)(param_1 + 6) + (uint)DAT_1028_07d1 * 0x14 + + (uint)local_3 + 0x46c) != '\0') { + local_7 = local_7 + 1; + } + if (local_3 == 9) break; + local_3 = local_3 + 1; + } + if (local_7 < 9) { + FUN_1008_0002(0x11); + *(undefined1 *) + ((int)*(undefined4 *)(param_1 + 6) + (uint)DAT_1028_07d1 * 0x14 + local_7 + 0x46c) = 1; + FUN_1000_b30b(param_1,local_7 + 0x3ed); + FUN_1000_bc36(param_1,local_7 * 10000,0); + } + else if (local_7 == 9) { + FUN_1008_0002(0x11); + *(undefined1 *)((int)*(undefined4 *)(param_1 + 6) + (uint)DAT_1028_07d1 * 0x14 + 0x475) = + 1; + FUN_1000_b30b(param_1,0x3f6); + FUN_1000_bc36(param_1,0x5f90,0); + uVar7 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar6 = (int)*(undefined4 *)(param_1 + 6); + *(undefined1 *)(iVar6 + 0xbdc) = 1; + DAT_1028_3b2a = 1; + DAT_1028_0b81 = 1; + DAT_1028_3b7d = 1; + uVar7 = GETDC(0x1000,*(undefined2 *)(iVar6 + 4)); + FUN_1008_0837((DAT_1028_3b47 - DAT_1028_3b43) + 1,(DAT_1028_3b45 - DAT_1028_3b41) + 1, + DAT_1028_3b43,DAT_1028_3b41,uVar7); + FUN_1008_093f((DAT_1028_3b47 - DAT_1028_3b43) + 1,(DAT_1028_3b45 - DAT_1028_3b41) + 1, + DAT_1028_3b43,DAT_1028_3b41,uVar7); + FUN_1008_0837((DAT_1028_3b9a - DAT_1028_3b96) + 1,(DAT_1028_3b98 - DAT_1028_3b94) + 1, + DAT_1028_3b96,DAT_1028_3b94,uVar7); + FUN_1008_093f((DAT_1028_3b9a - DAT_1028_3b96) + 1,(DAT_1028_3b98 - DAT_1028_3b94) + 1, + DAT_1028_3b96,DAT_1028_3b94,uVar7); + FUN_1008_0837((DAT_1028_0b9e - DAT_1028_0b9a) + 1,(DAT_1028_0b9c - DAT_1028_0b98) + 1, + DAT_1028_0b9a,DAT_1028_0b98,uVar7); + FUN_1008_093f((DAT_1028_0b9e - DAT_1028_0b9a) + 1,(DAT_1028_0b9c - DAT_1028_0b98) + 1, + DAT_1028_0b9a,DAT_1028_0b98,uVar7); + RELEASEDC(0x1008,uVar7); + } + else { + FUN_1008_0002(7); + if (*(char *)((int)*(undefined4 *)(param_1 + 6) + 0xbdc) == '\0') { + *(undefined1 *)((int)*(undefined4 *)(param_1 + 6) + 0xbdc) = 1; + } + else { + uVar1 = *(uint *)((uint)DAT_1028_07d1 * 4 + 0x98e); + iVar6 = *(int *)((uint)DAT_1028_07d1 * 4 + 0x990); + uVar4 = (uint)DAT_1028_07d1; + *(int *)(uVar4 * 4 + 0x98e) = uVar1 + 0x86a0; + *(int *)(uVar4 * 4 + 0x990) = iVar6 + 1 + (uint)(0x795f < uVar1); + uVar7 = *(undefined2 *)((uint)DAT_1028_07d1 * 4 + 0x990); + uVar5 = FUN_1020_08a9(); + FUN_1000_bda2(param_1,uVar5,uVar7); + } + } + local_3 = 0; + while( true ) { + *(undefined1 *)(((uint)local_3 * 3 + 0x6d) * 0x53 + 0x98f) = 1; + *(undefined1 *)(((uint)local_3 * 3 + 0x6e) * 0x53 + 0x98f) = 1; + *(undefined1 *)(((uint)local_3 * 3 + 0x6f) * 0x53 + 0x98f) = 1; + FUN_1000_7e12(param_1,(uint)local_3 * 3 + 0x6d); + if (local_3 == 3) break; + local_3 = local_3 + 1; + } + } + } + if ((param_2 & 0x1000) == 0x1000) { + if (param_3 == 0x96) { + *(undefined1 *)((int)*(undefined4 *)(param_1 + 6) + 0xf7) = 10; + FUN_1000_b30b(param_1,0x96); + DAT_1028_3b2a = 1; + FUN_1000_b30b(param_1,0x99); + } + else if (param_3 == 0x97) { + *(undefined1 *)((int)*(undefined4 *)(param_1 + 6) + 0xf8) = 10; + FUN_1000_b30b(param_1,0x97); + DAT_1028_0b81 = 1; + FUN_1000_b30b(param_1,6); + } + else if (param_3 == 0x98) { + *(undefined1 *)((int)*(undefined4 *)(param_1 + 6) + 0xf9) = 10; + FUN_1000_b30b(param_1,0x98); + DAT_1028_3b7d = 1; + FUN_1000_b30b(param_1,0x9a); + } + } + if ((param_2 & 0x40) == 0x40) { + if (param_3 == 0x33) { + FUN_1008_0002(6); + *(undefined1 *)((int)*(undefined4 *)(param_1 + 6) + 0x94) = 5; + FUN_1000_b30b(param_1,0x33); + iVar6 = (*(byte *)(DAT_1028_07d1 + 0x816) - 1) * 1000; + FUN_1000_bc36(param_1,iVar6,iVar6 >> 0xf); + } + else if (param_3 == 0x34) { + FUN_1008_0002(6); + *(undefined1 *)((int)*(undefined4 *)(param_1 + 6) + 0x95) = 5; + FUN_1000_b30b(param_1,0x34); + iVar6 = (*(byte *)(DAT_1028_07d1 + 0x816) - 1) * 1000; + FUN_1000_bc36(param_1,iVar6,iVar6 >> 0xf); + } + else if (param_3 == 0x35) { + FUN_1008_0002(6); + *(undefined1 *)((int)*(undefined4 *)(param_1 + 6) + 0x96) = 5; + FUN_1000_b30b(param_1,0x35); + iVar6 = (*(byte *)(DAT_1028_07d1 + 0x816) - 1) * 1000; + FUN_1000_bc36(param_1,iVar6,iVar6 >> 0xf); + } + else if ((0x8b < param_3) && (param_3 < 0x94)) { + *(undefined1 *)((int)*(undefined4 *)(param_1 + 6) + param_3 + 0x61) = 0x14; + FUN_1000_b30b(param_1,param_3); + } + } + } + return; +} + + +/* ===== 1000:bc36 FUN_1000_bc36 ===== */ + +void __stdcall16far FUN_1000_bc36(int param_1,uint param_2,int param_3) + +{ + uint *puVar1; + int *piVar2; + uint uVar3; + int iVar4; + int iVar5; + undefined2 uVar6; + uint uVar7; + int iVar8; + undefined2 unaff_SS; + undefined2 uVar9; + + uVar9 = *(undefined2 *)((int)*(undefined4 *)(param_1 + 6) + 4); + uVar6 = GETDC(); + if (((param_3 != -1) || (param_2 != 0xffff)) && (DAT_1028_07c6 == '\0')) { + if (DAT_1028_0874 != '\0') { + param_2 = FUN_1020_08a9(uVar9); + } + if (*(char *)((int)*(undefined4 *)(param_1 + 6) + 0xbdc) != '\0') { + param_2 = FUN_1020_08a9(uVar9); + } + uVar3 = *(uint *)((uint)DAT_1028_07d1 * 4 + 0x97e); + iVar4 = *(int *)((uint)DAT_1028_07d1 * 4 + 0x980); + uVar7 = (uint)DAT_1028_07d1; + *(int *)(uVar7 * 4 + 0x97e) = uVar3 + param_2; + *(int *)(uVar7 * 4 + 0x980) = iVar4 + param_3 + (uint)CARRY2(uVar3,param_2); + iVar4 = *(int *)((uint)DAT_1028_07d1 * 4 + 0x837); + if ((iVar4 < 0) || ((iVar4 < 1 && (*(uint *)((uint)DAT_1028_07d1 * 4 + 0x835) < 5)))) { + iVar8 = *(int *)((uint)DAT_1028_07d1 * 4 + 0x835) * 4; + iVar4 = *(int *)(iVar8 + 0x827); + iVar5 = *(int *)((uint)DAT_1028_07d1 * 4 + 0x980); + if ((iVar4 < iVar5) || + ((iVar4 <= iVar5 && + (*(uint *)(iVar8 + 0x825) <= *(uint *)((uint)DAT_1028_07d1 * 4 + 0x97e))))) { + FUN_1008_0002(7); + uVar7 = (uint)DAT_1028_07d1; + puVar1 = (uint *)(uVar7 * 4 + 0x835); + uVar3 = *puVar1; + *puVar1 = *puVar1 + 1; + piVar2 = (int *)(uVar7 * 4 + 0x837); + *piVar2 = *piVar2 + (uint)(0xfffe < uVar3); + piVar2 = (int *)((uint)DAT_1028_07d1 * 2 + 0x81f); + *piVar2 = *piVar2 + 1; + FUN_1000_a604(param_1); + } + } + FUN_1008_0b9e(DAT_1028_07d1,uVar6); + } + FUN_1008_0996(uVar6,DAT_1028_07d1,0); + RELEASEDC(0x1008,uVar6); + return; +} + + +/* ===== 1000:bda2 FUN_1000_bda2 ===== */ + +void __stdcall16far FUN_1000_bda2(undefined2 param_1,undefined2 param_2,undefined2 param_3) + +{ + undefined2 uVar1; + + uVar1 = GETDC(); + FUN_1008_0996(uVar1,param_2,param_3); + RELEASEDC(0x1008,uVar1); + return; +} + + +/* ===== 1000:bdde FUN_1000_bdde ===== */ + +void __stdcall16far FUN_1000_bdde(undefined2 param_1,int param_2) + +{ + uint uVar1; + int iVar2; + int iVar3; + + iVar2 = DAT_1028_07d5; + iVar3 = (param_2 + 0xad) * 0x53; + *(uint *)(iVar3 + 0x96d) = DAT_1028_07d3; + *(int *)(iVar3 + 0x96f) = iVar2; + iVar2 = DAT_1028_07d9; + iVar3 = (param_2 + 0xad) * 0x53; + *(uint *)(iVar3 + 0x971) = DAT_1028_07d7; + *(int *)(iVar3 + 0x973) = iVar2; + uVar1 = DAT_1028_07d3 + 0xc180; + iVar2 = DAT_1028_07d5 - (uint)(DAT_1028_07d3 < 16000); + iVar3 = (param_2 + 0xad) * 0x53; + *(int *)(iVar3 + 0x95d) = DAT_1028_07d3 + 0xadf8; + *(int *)(iVar3 + 0x95f) = iVar2 - (uint)(uVar1 < 5000); + uVar1 = DAT_1028_07d7 + 0xc180; + iVar2 = DAT_1028_07d9 - (uint)(DAT_1028_07d7 < 16000); + iVar3 = (param_2 + 0xad) * 0x53; + *(int *)(iVar3 + 0x961) = DAT_1028_07d7 + 0xadf8; + *(int *)(iVar3 + 0x963) = iVar2 - (uint)(uVar1 < 5000); + uVar1 = DAT_1028_07d3 + 16000; + iVar2 = DAT_1028_07d5 + (uint)(0xc17f < DAT_1028_07d3); + iVar3 = (param_2 + 0xad) * 0x53; + *(int *)(iVar3 + 0x965) = DAT_1028_07d3 + 21000; + *(int *)(iVar3 + 0x967) = iVar2 + (uint)(0xec77 < uVar1); + uVar1 = DAT_1028_07d7 + 16000; + iVar2 = DAT_1028_07d9 + (uint)(0xc17f < DAT_1028_07d7); + iVar3 = (param_2 + 0xad) * 0x53; + *(int *)(iVar3 + 0x969) = DAT_1028_07d7 + 21000; + *(int *)(iVar3 + 0x96b) = iVar2 + (uint)(0xec77 < uVar1); + return; +} + + +/* ===== 1000:beff FUN_1000_beff ===== */ + +void __stdcall16far FUN_1000_beff(int param_1,uint param_2,int param_3,uint param_4,int param_5) + +{ + undefined2 uVar1; + undefined2 uVar2; + uint uVar3; + int iVar4; + int iVar5; + undefined2 unaff_CS; + undefined2 unaff_SS; + bool bVar6; + undefined2 uVar7; + undefined2 uVar8; + + uVar1 = *(undefined2 *)((int)*(undefined4 *)(param_1 + 6) + 4); + GETCLIENTRECT(unaff_CS,param_1 + -0x1a,unaff_SS); + uVar1 = GETDC(0x1228,*(undefined2 *)((int)*(undefined4 *)(param_1 + 6) + 4),uVar1); + *(undefined2 *)(param_1 + -0xc) = uVar1; + uVar1 = CREATECOMPATIBLEDC(0x1228,*(undefined2 *)(param_1 + -0xc)); + *(undefined2 *)(param_1 + -0xe) = uVar1; + uVar1 = CREATECOMPATIBLEDC(0x1228,*(undefined2 *)(param_1 + -0xc)); + *(undefined2 *)(param_1 + -0x10) = uVar1; + uVar1 = CREATECOMPATIBLEDC(0x1228,*(undefined2 *)(param_1 + -0xc)); + *(undefined2 *)(param_1 + -0x12) = uVar1; + uVar1 = *(undefined2 *)(param_1 + -0xc); + uVar2 = CREATECOMPATIBLEBITMAP(0x1228,100,100); + *(undefined2 *)(param_1 + -8) = uVar2; + iVar4 = DAT_1028_07d5; + uVar2 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar5 = (int)*(undefined4 *)(param_1 + 6); + *(uint *)(iVar5 + 0xbc2) = DAT_1028_07d3; + *(int *)(iVar5 + 0xbc4) = iVar4; + iVar4 = DAT_1028_07d9; + *(uint *)(iVar5 + 0xbc6) = DAT_1028_07d7; + *(int *)(iVar5 + 0xbc8) = iVar4; + bVar6 = CARRY2(DAT_1028_07d7,param_4); + DAT_1028_07d7 = DAT_1028_07d7 + param_4; + DAT_1028_07d9 = DAT_1028_07d9 + param_5 + (uint)bVar6; + bVar6 = CARRY2(DAT_1028_07d3,param_2); + DAT_1028_07d3 = DAT_1028_07d3 + param_2; + DAT_1028_07d5 = DAT_1028_07d5 + param_3 + (uint)bVar6; + iVar4 = DAT_1028_07d5 + (uint)(0xfe0b < DAT_1028_07d3); + uVar3 = FUN_1020_08e6(uVar1); + uVar1 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar5 = (int)*(undefined4 *)(param_1 + 6); + *(int *)(iVar5 + 0xba2) = uVar3 - 8; + *(int *)(iVar5 + 0xba4) = iVar4 - (uint)(uVar3 < 8); + iVar4 = DAT_1028_07d9 + (uint)(0xfe0b < DAT_1028_07d7); + uVar3 = FUN_1020_08e6(); + uVar1 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar5 = (int)*(undefined4 *)(param_1 + 6); + *(int *)(iVar5 + 0xba6) = uVar3 - 8; + *(int *)(iVar5 + 0xba8) = iVar4 - (uint)(uVar3 < 8); + iVar4 = (DAT_1028_07d5 - *(int *)(iVar5 + 0xbc4)) - + (uint)(DAT_1028_07d3 < *(uint *)(iVar5 + 0xbc2)); + uVar1 = FUN_1020_08e6(); + uVar2 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar5 = (int)*(undefined4 *)(param_1 + 6); + *(undefined2 *)(iVar5 + 0xbb2) = uVar1; + *(int *)(iVar5 + 0xbb4) = iVar4; + iVar4 = (DAT_1028_07d9 - *(int *)(iVar5 + 0xbc8)) - + (uint)(DAT_1028_07d7 < *(uint *)(iVar5 + 0xbc6)); + uVar1 = FUN_1020_08e6(); + uVar2 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar5 = (int)*(undefined4 *)(param_1 + 6); + *(undefined2 *)(iVar5 + 0xbb6) = uVar1; + *(int *)(iVar5 + 3000) = iVar4; + if ((*(int *)(iVar5 + 0xbb4) < 1) && + ((*(int *)(iVar5 + 0xbb4) < 0 || (*(int *)(iVar5 + 0xbb2) == 0)))) { + *(int *)(param_1 + -0x20) = *(int *)((int)*(undefined4 *)(param_1 + 6) + 0xba2) + -1; + *(undefined2 *)(param_1 + -0x1c) = 1; + } + else { + uVar1 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar4 = (int)*(undefined4 *)(param_1 + 6); + *(int *)(param_1 + -0x20) = (*(int *)(iVar4 + 0xba2) - *(int *)(iVar4 + 0xbb2)) + -1; + *(int *)(param_1 + -0x1c) = *(int *)((int)*(undefined4 *)(param_1 + 6) + 0xbb2) + 1; + } + uVar1 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar5 = (int)*(undefined4 *)(param_1 + 6); + iVar4 = *(int *)(iVar5 + 3000); + if ((iVar4 < 1) && ((iVar4 < 0 || (*(int *)(iVar5 + 0xbb6) == 0)))) { + *(int *)(param_1 + -0x22) = *(int *)((int)*(undefined4 *)(param_1 + 6) + 0xba6) + -1; + *(undefined2 *)(param_1 + -0x1e) = 1; + } + else { + uVar1 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar4 = (int)*(undefined4 *)(param_1 + 6); + *(int *)(param_1 + -0x22) = (*(int *)(iVar4 + 0xba6) - *(int *)(iVar4 + 0xbb6)) + -1; + *(int *)(param_1 + -0x1e) = *(int *)((int)*(undefined4 *)(param_1 + 6) + 0xbb6) + 1; + } + uVar1 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar5 = (int)*(undefined4 *)(param_1 + 6); + iVar4 = *(int *)(iVar5 + 0xbb2); + if (*(int *)(iVar5 + 0xbb4) < 0) { + iVar4 = -iVar4; + } + *(int *)(param_1 + -0x28) = iVar4 + 0x13; + uVar1 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar5 = (int)*(undefined4 *)(param_1 + 6); + iVar4 = *(int *)(iVar5 + 0xbb6); + if (*(int *)(iVar5 + 3000) < 0) { + iVar4 = -iVar4; + } + *(int *)(param_1 + -0x2a) = iVar4 + 0x13; + uVar1 = SELECTOBJECT(0x1020,DAT_1028_085b); + *(undefined2 *)(param_1 + -2) = uVar1; + uVar1 = SELECTOBJECT(0x1228,*(undefined2 *)(param_1 + -8)); + *(undefined2 *)(param_1 + -4) = uVar1; + BITBLT(0x1228,0x20,0xcc,*(undefined2 *)(param_1 + -0x22),*(undefined2 *)(param_1 + -0x20), + *(undefined2 *)(param_1 + -0xe),*(undefined2 *)(param_1 + -0x2a), + *(undefined2 *)(param_1 + -0x28),0,0); + SELECTOBJECT(0x1228,*(undefined2 *)((int)*(undefined4 *)(param_1 + 6) + 0x54)); + BITBLT(0x1228,0xc6,0x88,0,0,*(undefined2 *)(param_1 + -0xe),0x13,0x13, + *(undefined2 *)(param_1 + -0x1e),*(undefined2 *)(param_1 + -0x1c)); + SELECTOBJECT(0x1228,*(undefined2 *)((int)*(undefined4 *)(param_1 + 6) + 0x52)); + BITBLT(0x1228,0x86,0xee,0,0,*(undefined2 *)(param_1 + -0xe),0x13,0x13, + *(undefined2 *)(param_1 + -0x1e),*(undefined2 *)(param_1 + -0x1c)); + if (0x1ba < *(int *)(param_1 + -0x22) + *(int *)(param_1 + -0x2a)) { + if (*(int *)(param_1 + -0x22) < 0x1bb) { + *(int *)(param_1 + -0x2a) = 0x1bb - *(int *)(param_1 + -0x22); + } + else { + *(undefined2 *)(param_1 + -0x2a) = 0; + } + } + uVar1 = *(undefined2 *)(param_1 + -0xc); + BITBLT(0x1228,0x20,0xcc,0,0,*(undefined2 *)(param_1 + -0x10),*(undefined2 *)(param_1 + -0x2a), + *(undefined2 *)(param_1 + -0x28),*(undefined2 *)(param_1 + -0x22), + *(undefined2 *)(param_1 + -0x20)); + uVar2 = *(undefined2 *)(param_1 + -0xe); + SELECTOBJECT(0x1228,*(undefined2 *)(param_1 + -2)); + uVar8 = *(undefined2 *)(param_1 + -0x10); + SELECTOBJECT(0x1228,*(undefined2 *)(param_1 + -4)); + uVar7 = *(undefined2 *)(param_1 + -0x12); + SELECTOBJECT(0x1228,*(undefined2 *)(param_1 + -6)); + DELETEOBJECT(0x1228,*(undefined2 *)(param_1 + -8),uVar7,uVar8,uVar2,uVar1); + DELETEDC(0x1228,*(undefined2 *)(param_1 + -0xe)); + DELETEDC(0x1228,*(undefined2 *)(param_1 + -0x10)); + DELETEDC(0x1228,*(undefined2 *)(param_1 + -0x12)); + RELEASEDC(0x1228,*(undefined2 *)(param_1 + -0xc)); + return; +} + + +/* ===== 1000:c36b FUN_1000_c36b ===== */ + +void __stdcall16far FUN_1000_c36b(int param_1,int param_2) + +{ + undefined2 uVar1; + int iVar2; + int iVar3; + undefined2 uVar4; + undefined2 uVar5; + undefined2 unaff_SS; + + DAT_1028_07d3 = *(undefined2 *)(param_2 * 4 + 0x7e3); + DAT_1028_07d5 = *(undefined2 *)(param_2 * 4 + 0x7e5); + DAT_1028_07d7 = *(undefined2 *)(param_2 * 4 + 0x7eb); + DAT_1028_07d9 = *(undefined2 *)(param_2 * 4 + 0x7ed); + uVar1 = *(undefined2 *)(param_2 * 4 + 0x7f5); + uVar4 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar2 = (int)*(undefined4 *)(param_1 + 6); + *(undefined2 *)(iVar2 + 0xbaa) = *(undefined2 *)(param_2 * 4 + 0x7f3); + *(undefined2 *)(iVar2 + 0xbac) = uVar1; + uVar1 = *(undefined2 *)(param_2 * 4 + 0x7fd); + uVar4 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar2 = (int)*(undefined4 *)(param_1 + 6); + *(undefined2 *)(iVar2 + 0xbae) = *(undefined2 *)(param_2 * 4 + 0x7fb); + *(undefined2 *)(iVar2 + 0xbb0) = uVar1; + iVar2 = param_2 * 6; + uVar1 = *(undefined2 *)(iVar2 + 0x80d); + uVar4 = *(undefined2 *)(iVar2 + 0x80f); + uVar5 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar3 = (int)*(undefined4 *)(param_1 + 6); + *(undefined2 *)(iVar3 + 0xbce) = *(undefined2 *)(iVar2 + 0x80b); + *(undefined2 *)(iVar3 + 0xbd0) = uVar1; + *(undefined2 *)(iVar3 + 0xbd2) = uVar4; + uVar1 = *(undefined2 *)(param_2 * 4 + 0x805); + uVar4 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar2 = (int)*(undefined4 *)(param_1 + 6); + *(undefined2 *)(iVar2 + 0xbca) = *(undefined2 *)(param_2 * 4 + 0x803); + *(undefined2 *)(iVar2 + 0xbcc) = uVar1; + return; +} + + +/* ===== 1000:c426 FUN_1000_c426 ===== */ + +void __stdcall16far FUN_1000_c426(int param_1,int param_2) + +{ + undefined2 uVar1; + int iVar2; + int iVar3; + undefined2 uVar4; + undefined2 uVar5; + undefined2 unaff_SS; + + uVar1 = DAT_1028_07d5; + *(undefined2 *)(param_2 * 4 + 0x7e3) = DAT_1028_07d3; + *(undefined2 *)(param_2 * 4 + 0x7e5) = uVar1; + uVar1 = DAT_1028_07d9; + *(undefined2 *)(param_2 * 4 + 0x7eb) = DAT_1028_07d7; + *(undefined2 *)(param_2 * 4 + 0x7ed) = uVar1; + uVar4 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar2 = (int)*(undefined4 *)(param_1 + 6); + uVar1 = *(undefined2 *)(iVar2 + 0xbac); + *(undefined2 *)(param_2 * 4 + 0x7f3) = *(undefined2 *)(iVar2 + 0xbaa); + *(undefined2 *)(param_2 * 4 + 0x7f5) = uVar1; + uVar4 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar2 = (int)*(undefined4 *)(param_1 + 6); + uVar1 = *(undefined2 *)(iVar2 + 0xbb0); + *(undefined2 *)(param_2 * 4 + 0x7fb) = *(undefined2 *)(iVar2 + 0xbae); + *(undefined2 *)(param_2 * 4 + 0x7fd) = uVar1; + uVar5 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar3 = (int)*(undefined4 *)(param_1 + 6); + uVar1 = *(undefined2 *)(iVar3 + 0xbd0); + uVar4 = *(undefined2 *)(iVar3 + 0xbd2); + iVar2 = param_2 * 6; + *(undefined2 *)(iVar2 + 0x80b) = *(undefined2 *)(iVar3 + 0xbce); + *(undefined2 *)(iVar2 + 0x80d) = uVar1; + *(undefined2 *)(iVar2 + 0x80f) = uVar4; + uVar4 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar2 = (int)*(undefined4 *)(param_1 + 6); + uVar1 = *(undefined2 *)(iVar2 + 0xbcc); + *(undefined2 *)(param_2 * 4 + 0x803) = *(undefined2 *)(iVar2 + 0xbca); + *(undefined2 *)(param_2 * 4 + 0x805) = uVar1; + return; +} + + +/* ===== 1000:c4e1 FUN_1000_c4e1 ===== */ + +void __stdcall16far FUN_1000_c4e1(int param_1,int param_2) + +{ + int iVar1; + uint uVar2; + undefined2 uVar3; + uint uVar4; + undefined2 uVar5; + undefined2 unaff_SS; + + iVar1 = *(int *)((uint)DAT_1028_07d1 * 2 + 0x9a4); + if (iVar1 == 1) { + uVar4 = *(uint *)((uint)DAT_1028_07d1 * 4 + 0x98e); + iVar1 = *(int *)((uint)DAT_1028_07d1 * 4 + 0x990); + uVar2 = (uint)DAT_1028_07d1; + *(int *)(uVar2 * 4 + 0x98e) = uVar4 + 10000; + *(int *)(uVar2 * 4 + 0x990) = iVar1 + (uint)(0xd8ef < uVar4); + uVar5 = *(undefined2 *)((uint)DAT_1028_07d1 * 4 + 0x990); + uVar3 = FUN_1020_08a9(); + FUN_1000_bda2(param_1,uVar3,uVar5); + } + else if (iVar1 == 2) { + uVar4 = *(uint *)((uint)DAT_1028_07d1 * 4 + 0x98e); + iVar1 = *(int *)((uint)DAT_1028_07d1 * 4 + 0x990); + uVar2 = (uint)DAT_1028_07d1; + *(int *)(uVar2 * 4 + 0x98e) = uVar4 + 20000; + *(int *)(uVar2 * 4 + 0x990) = iVar1 + (uint)(0xb1df < uVar4); + uVar5 = *(undefined2 *)((uint)DAT_1028_07d1 * 4 + 0x990); + uVar3 = FUN_1020_08a9(); + FUN_1000_bda2(param_1,uVar3,uVar5); + } + else if (iVar1 == 3) { + uVar4 = *(uint *)((uint)DAT_1028_07d1 * 4 + 0x98e); + iVar1 = *(int *)((uint)DAT_1028_07d1 * 4 + 0x990); + uVar2 = (uint)DAT_1028_07d1; + *(int *)(uVar2 * 4 + 0x98e) = uVar4 + 50000; + *(int *)(uVar2 * 4 + 0x990) = iVar1 + (uint)(0x3caf < uVar4); + uVar5 = *(undefined2 *)((uint)DAT_1028_07d1 * 4 + 0x990); + uVar3 = FUN_1020_08a9(); + FUN_1000_bda2(param_1,uVar3,uVar5); + } + else if (iVar1 == 4) { + uVar4 = *(uint *)((uint)DAT_1028_07d1 * 4 + 0x98e); + iVar1 = *(int *)((uint)DAT_1028_07d1 * 4 + 0x990); + uVar2 = (uint)DAT_1028_07d1; + *(int *)(uVar2 * 4 + 0x98e) = uVar4 + 0x86a0; + *(int *)(uVar2 * 4 + 0x990) = iVar1 + 1 + (uint)(0x795f < uVar4); + uVar5 = *(undefined2 *)((uint)DAT_1028_07d1 * 4 + 0x990); + uVar3 = FUN_1020_08a9(); + FUN_1000_bda2(param_1,uVar3,uVar5); + } + else if (iVar1 == 5) { + uVar4 = *(uint *)((uint)DAT_1028_07d1 * 4 + 0x98e); + iVar1 = *(int *)((uint)DAT_1028_07d1 * 4 + 0x990); + uVar2 = (uint)DAT_1028_07d1; + *(int *)(uVar2 * 4 + 0x98e) = uVar4 + 0xd40; + *(int *)(uVar2 * 4 + 0x990) = iVar1 + 3 + (uint)(0xf2bf < uVar4); + uVar5 = *(undefined2 *)((uint)DAT_1028_07d1 * 4 + 0x990); + uVar3 = FUN_1020_08a9(); + FUN_1000_bda2(param_1,uVar3,uVar5); + } + else if (iVar1 == 6) { + uVar5 = *(undefined2 *)((uint)DAT_1028_07d1 * 4 + 0x990); + uVar3 = FUN_1020_08a9(); + FUN_1000_bc36(param_1,uVar3,uVar5); + uVar4 = (uint)DAT_1028_07d1; + *(undefined2 *)(uVar4 * 4 + 0x98e) = 0; + *(undefined2 *)(uVar4 * 4 + 0x990) = 0; + FUN_1000_bda2(param_1,0,0); + } + else if ((iVar1 == 7) && (DAT_1028_399a != 0)) { + if ((param_2 < 0) || (DAT_1028_399a != param_2)) { + *(undefined1 *)((int)*(undefined4 *)(param_1 + 6) + 0xbe0) = 1; + DAT_1028_0874 = 1; + } + } + return; +} + + +/* ===== 1000:c79c FUN_1000_c79c ===== */ + +void __stdcall16far FUN_1000_c79c(int param_1) + +{ + uint *puVar1; + int *piVar2; + byte bVar3; + undefined2 uVar4; + int iVar5; + char cVar6; + uint uVar7; + uint uVar8; + uint uVar9; + uint uVar10; + uint uVar11; + uint extraout_DX; + uint extraout_DX_00; + int extraout_DX_01; + uint extraout_DX_02; + uint extraout_DX_03; + uint extraout_DX_04; + uint uVar12; + int extraout_DX_05; + int extraout_DX_06; + uint in_BX; + int iVar13; + int iVar14; + int iVar15; + int iVar16; + int iVar17; + int iVar18; + undefined2 uVar19; + undefined2 unaff_SS; + bool bVar20; + bool bVar21; + uint uVar22; + int in_stack_0000d8a2; + uint in_stack_0000d8b0; + int in_stack_0000d8b2; + uint in_stack_0000d8c2; + int in_stack_0000d8cc; + int in_stack_0000d8ce; + int in_stack_0000d8d0; + undefined2 local_7c; + uint local_7a; + uint local_78; + undefined2 local_76; + uint local_74; + uint local_72; + uint local_70; + uint local_6e; + uint local_68; + uint local_66; + uint local_64; + uint local_62; + undefined2 local_40; + uint local_3e; + undefined2 local_3c; + uint local_16; + uint local_14; + uint local_12; + uint local_10; + uint local_e; + uint local_c; + uint local_8; + int local_4; + + uVar19 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar13 = (int)*(undefined4 *)(param_1 + 6); + puVar1 = (uint *)(iVar13 + 0x4d); + uVar10 = *puVar1; + *puVar1 = *puVar1 + 1; + *(int *)(iVar13 + 0x4f) = *(int *)(iVar13 + 0x4f) + (uint)(0xfffe < uVar10); + iVar5 = DAT_1028_0871; + bVar3 = *(byte *)(iVar13 + 0x61); + if (bVar3 == 0) { + return; + } + local_8 = 1; + while( true ) { + if (1 < *(byte *)((int)*(undefined4 *)(param_1 + 6) + 0x61)) { + FUN_1000_c36b(); + } + iVar13 = DAT_1028_07d5; + uVar19 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar14 = (int)*(undefined4 *)(param_1 + 6); + *(uint *)(iVar14 + 0xbc2) = DAT_1028_07d3; + *(int *)(iVar14 + 0xbc4) = iVar13; + iVar13 = DAT_1028_07d9; + *(uint *)(iVar14 + 0xbc6) = DAT_1028_07d7; + *(int *)(iVar14 + 0xbc8) = iVar13; + if (iVar5 != 0) break; +LAB_1000_ea63: + uVar19 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar13 = (int)*(undefined4 *)(param_1 + 6); + if ((*(char *)(iVar13 + 0xbdd) != '\0') && (*(char *)(iVar13 + 0xbe2) == '\0')) { + FUN_1000_9f73(); + } + if (1 < *(byte *)((int)*(undefined4 *)(param_1 + 6) + 0x61)) { + FUN_1000_c426(); + } + if (local_8 == bVar3) { + return; + } + local_8 = local_8 + 1; + } + iVar13 = 1; +LAB_1000_c839: + uVar19 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar15 = (int)*(undefined4 *)(param_1 + 6); + uVar10 = *(uint *)(iVar15 + 0xbae); + iVar14 = *(int *)(iVar15 + 0xbb0); + uVar11 = *(uint *)(iVar15 + 0x5a); + iVar16 = *(int *)(iVar15 + 0x5c); + *(int *)(iVar15 + 0xbae) = uVar10 + *(uint *)(iVar15 + 0x5a); + *(int *)(iVar15 + 0xbb0) = iVar14 + iVar16 + (uint)CARRY2(uVar10,uVar11); + FUN_1020_100b(); + FUN_1020_0ffd(); + FUN_1020_0ff1(); + FUN_1020_100b(); + FUN_1020_0ffd(); + FUN_1020_0ff1(); + local_14 = extraout_DX; + FUN_1020_0fe5(); + FUN_1020_10be(); + FUN_1020_0ff7(); + local_16 = FUN_1020_1017(); + uVar19 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar16 = (int)*(undefined4 *)(param_1 + 6); + iVar14 = *(int *)(iVar16 + 0x58); + if ((iVar14 < (int)local_14) || + ((uVar10 = in_BX, iVar14 <= (int)local_14 && (*(uint *)(iVar16 + 0x56) < local_16)))) { + FUN_1020_100b(); + FUN_1020_100b(); + FUN_1020_0ffd(); + iVar14 = *(int *)((int)*(undefined4 *)(param_1 + 6) + 0xbac); + FUN_1020_100b(); + FUN_1020_0ff7(); + uVar11 = FUN_1020_1017(); + uVar19 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar15 = (int)*(undefined4 *)(param_1 + 6); + uVar10 = *(uint *)(iVar15 + 0xbaa); + iVar16 = *(int *)(iVar15 + 0xbac); + *(int *)(iVar15 + 0xbaa) = uVar10 - uVar11; + *(int *)(iVar15 + 0xbac) = (iVar16 - iVar14) - (uint)(uVar10 < uVar11); + FUN_1020_100b(); + FUN_1020_100b(); + FUN_1020_0ffd(); + uVar10 = *(uint *)((int)*(undefined4 *)(param_1 + 6) + 0xbb0); + FUN_1020_100b(); + FUN_1020_0ff7(); + uVar22 = FUN_1020_1017(); + uVar19 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar16 = (int)*(undefined4 *)(param_1 + 6); + uVar11 = *(uint *)(iVar16 + 0xbae); + iVar14 = *(int *)(iVar16 + 0xbb0); + *(int *)(iVar16 + 0xbae) = uVar11 - uVar22; + *(int *)(iVar16 + 0xbb0) = (iVar14 - uVar10) - (uint)(uVar11 < uVar22); + local_16 = *(uint *)(iVar16 + 0x56); + local_14 = *(uint *)(iVar16 + 0x58); + } + iVar14 = DAT_1028_07d5; + uVar19 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar16 = (int)*(undefined4 *)(param_1 + 6); + *(uint *)(iVar16 + 0xbba) = DAT_1028_07d3; + *(int *)(iVar16 + 0xbbc) = iVar14; + iVar14 = DAT_1028_07d9; + *(uint *)(iVar16 + 0xbbe) = DAT_1028_07d7; + *(int *)(iVar16 + 0xbc0) = iVar14; + DAT_1028_07db = DAT_1028_07d3 + *(uint *)(iVar16 + 0xbaa); + DAT_1028_07dd = + DAT_1028_07d5 + *(int *)(iVar16 + 0xbac) + + (uint)CARRY2(DAT_1028_07d3,*(uint *)(iVar16 + 0xbaa)); + DAT_1028_07df = DAT_1028_07d7 + *(uint *)(iVar16 + 0xbae); + DAT_1028_07e1 = + DAT_1028_07d9 + *(int *)(iVar16 + 0xbb0) + + (uint)CARRY2(DAT_1028_07d7,*(uint *)(iVar16 + 0xbae)); + local_e = *(uint *)(iVar16 + 0xbaa); + local_c = *(uint *)(iVar16 + 0xbac); + local_12 = *(uint *)(iVar16 + 0xbae); + local_10 = *(uint *)(iVar16 + 0xbb0); + uVar11 = *(uint *)(iVar16 + 0xbac); + FUN_1020_100b(); + FUN_1020_100b(); + uVar19 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar14 = (int)*(undefined4 *)(param_1 + 6); + local_40 = *(undefined2 *)(iVar14 + 0xbce); + local_3e = *(uint *)(iVar14 + 0xbd0); + local_3c = *(undefined2 *)(iVar14 + 0xbd2); + iVar14 = 0; + local_70 = 0x423f; + local_6e = 0xf; + in_BX = local_3e; + if (((((DAT_1028_07dd < 0) || + (((DAT_1028_07dd < 1 && (DAT_1028_07db == 0)) || (5 < DAT_1028_07dd)))) || + (((4 < DAT_1028_07dd && (0x3020 < DAT_1028_07db)) || (DAT_1028_07e1 < 0)))) || + ((DAT_1028_07e1 < 1 && (DAT_1028_07df == 0)))) || + ((7 < DAT_1028_07e1 || ((6 < DAT_1028_07e1 && (0x4e0 < DAT_1028_07df)))))) { + if (*(byte *)((int)*(undefined4 *)(param_1 + 6) + 0x61) < 2) { + FUN_1000_ae6e(); + } + else { + *(undefined1 *)((local_8 + 0xad) * 0x53 + 0x98f) = 0; + DAT_1028_0874 = '\0'; + } + } + if ((DAT_1028_07d9 < 3) || ((DAT_1028_07d9 < 4 && (DAT_1028_07d7 < 0xd860)))) { + uVar22 = 1; + } + else { + uVar22 = 2; + } + local_4 = 1; + do { + iVar16 = local_4 * 0x53; + bVar21 = false; + if ((((*(uint *)(iVar16 + 0x9a4) & uVar22) != 0) && (*(char *)(iVar16 + 0x98f) == '\x01')) && + (cVar6 = FUN_1000_9b69(), cVar6 != '\0')) { + cVar6 = *(char *)CONCAT22(0x1028,(char *)(iVar16 + 0x95b)); + uVar12 = in_BX; + if (cVar6 == '\x01') { + if (0xaf - local_8 != local_4) { + FUN_1020_100b(); + FUN_1020_0ffd(); + FUN_1020_0ff1(); + FUN_1020_100b(); + FUN_1020_0ffd(); + FUN_1020_0ff1(); + uVar7 = extraout_DX_00; + FUN_1020_0fe5(); + FUN_1020_10be(); + FUN_1020_0ff7(); + uVar9 = FUN_1020_1017(); + if ((int)uVar7 < 0) { + bVar20 = uVar9 != 0; + uVar9 = -uVar9; + uVar7 = (~uVar7 + 1) - (uint)bVar20; + } + uVar12 = *(uint *)(iVar16 + 0x981); + uVar8 = FUN_1020_1017(); + local_68 = uVar9 - uVar8; + local_66 = (uVar7 - uVar12) - (uint)(uVar9 < uVar8); + if ((*(char *)(iVar16 + 0x95c) == '\x01') && + (((int)local_66 < (int)local_14 || + (((int)local_66 <= (int)local_14 && (local_68 <= local_16)))))) { +LAB_1000_cd0a: + if (*(char *)(iVar16 + 0x95c) == '\x01') { + uVar19 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar15 = (int)*(undefined4 *)(param_1 + 6); + local_74 = *(int *)(iVar15 + 0xbc0) + DAT_1028_07e1 + + (uint)CARRY2(*(uint *)(iVar15 + 0xbbe),DAT_1028_07df); + uVar12 = FUN_1020_08e6(); + local_72 = (*(int *)(iVar16 + 0x973) - local_74) - + (uint)(*(uint *)(iVar16 + 0x971) < uVar12); + FUN_1020_100b(); + FUN_1020_1017(); + local_76 = FUN_1020_100b(); + uVar19 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar15 = (int)*(undefined4 *)(param_1 + 6); + iVar15 = *(int *)(iVar15 + 0xbbc) + DAT_1028_07dd + + (uint)CARRY2(*(uint *)(iVar15 + 0xbba),DAT_1028_07db); + local_7a = 0; + uVar12 = FUN_1020_08e6(); + local_78 = (iVar15 - *(int *)(iVar16 + 0x96f)) - + (uint)(uVar12 < *(uint *)(iVar16 + 0x96d)); + FUN_1020_100b(); + FUN_1020_1017(); + local_7c = FUN_1020_100b(); + } + else { + uVar19 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar15 = (int)*(undefined4 *)(param_1 + 6); + local_74 = *(int *)(iVar15 + 0xbc0) + DAT_1028_07e1 + + (uint)CARRY2(*(uint *)(iVar15 + 0xbbe),DAT_1028_07df); + uVar12 = FUN_1020_08e6(); + local_72 = (*(int *)(iVar16 + 0x973) - local_74) - + (uint)(*(uint *)(iVar16 + 0x971) < uVar12); + FUN_1020_100b(); + FUN_1020_1017(); + local_76 = FUN_1020_100b(); + uVar19 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar15 = (int)*(undefined4 *)(param_1 + 6); + iVar15 = *(int *)(iVar15 + 0xbbc) + DAT_1028_07dd + + (uint)CARRY2(*(uint *)(iVar15 + 0xbba),DAT_1028_07db); + local_7a = 0; + uVar12 = FUN_1020_08e6(); + local_78 = (iVar15 - *(int *)(iVar16 + 0x96f)) - + (uint)(uVar12 < *(uint *)(iVar16 + 0x96d)); + FUN_1020_100b(); + FUN_1020_1017(); + local_7c = FUN_1020_100b(); + } + if (*(char *)(iVar16 + 0x95c) == '\x02') { + if ((char)local_76 != '\0') { + local_72 = local_72 ^ 0x8000; + } + if ((char)local_7c != '\0') { + local_78 = local_78 ^ 0x8000; + } + } + FUN_1020_0ffd(); + FUN_1020_0ff1(); + uVar12 = local_74; + FUN_1020_0ffd(); + FUN_1020_0ff1(); + iVar15 = extraout_DX_01; + FUN_1020_0fe5(); + FUN_1020_10be(); + FUN_1020_0ff7(); + iVar17 = FUN_1020_1017(); + if ((iVar15 < 1) && ((iVar15 < 0 || (iVar17 == 0)))) { + local_64 = 0; + local_62 = 0; + } + else { + FUN_1020_100b(); + FUN_1020_0ff7(); + local_62 = uVar11; + uVar12 = uVar10; + FUN_1020_0ff7(); + FUN_1020_0feb(); + FUN_1020_0ffd(); + local_64 = FUN_1020_1017(); + } + if ((int)local_62 < 0) { + uVar7 = local_68; + uVar12 = local_66; + if ((int)local_66 < 0) { + uVar7 = -local_68; + uVar12 = (~local_66 + 1) - (uint)(local_68 != 0); + } + uVar9 = local_64; + uVar8 = local_62; + if ((int)local_62 < 0) { + uVar9 = -local_64; + uVar8 = (~local_62 + 1) - (uint)(local_64 != 0); + } + if (((int)uVar12 < (int)uVar8) || (((int)uVar12 <= (int)uVar8 && (uVar7 <= uVar9)))) { + bVar21 = 0xf447 < local_68; + local_68 = local_68 + 3000; + local_66 = local_66 + bVar21; + bVar21 = true; + } + } + } + else if (*(char *)(iVar16 + 0x95c) == '\x02') { + iVar15 = (~local_66 + 1) - (uint)(local_68 != 0); + if ((iVar15 < (int)local_14) || + ((uVar12 = local_14, iVar15 <= (int)local_14 && + (-local_68 < local_16 || -local_16 == local_68)))) goto LAB_1000_cd0a; + } + } + } + else if (cVar6 == '\x04') { + if (DAT_1028_07c6 == '\0') { + DAT_1028_0875 = '\0'; + uVar12 = *(uint *)(iVar16 + 0x97f); + iVar15 = *(int *)(iVar16 + 0x981); + iVar17 = FUN_1020_1017(); + if ((iVar15 < 1) && ((iVar15 < 0 || (iVar17 == 0)))) { + cVar6 = FUN_1000_9ae0(); + if ((cVar6 != '\0') && (((local_4 == 0x99 || (local_4 == 0x9a)) || (local_4 == 6)))) { + FUN_1020_100b(); + FUN_1020_0ff7(); + local_e = FUN_1020_1017(); + FUN_1020_100b(); + FUN_1020_14c1(); + FUN_1020_0ff7(); + uVar12 = 0; + uVar7 = 0; + FUN_1020_0feb(); + FUN_1020_0ff7(); + iVar15 = FUN_1020_1017(); + local_12 = -iVar15; + local_10 = (~uVar7 + 1) - (uint)(iVar15 != 0); + DAT_1028_07db = DAT_1028_07d3 + local_e; + DAT_1028_07dd = DAT_1028_07d5 + local_c + (uint)CARRY2(DAT_1028_07d3,local_e); + DAT_1028_07df = DAT_1028_07d7 + local_12; + DAT_1028_07e1 = DAT_1028_07d9 + local_10 + (uint)CARRY2(DAT_1028_07d7,local_12); + cVar6 = FUN_1000_9b69(); + if (cVar6 == '\0') { + *(undefined1 *)(local_4 * 0x53 + 0x98f) = 0; + } + FUN_1000_b3f3(); + } + } + else { + FUN_1020_100b(); + FUN_1020_0ffd(); + FUN_1020_0ff1(); + FUN_1020_100b(); + FUN_1020_0ffd(); + FUN_1020_0ff1(); + local_66 = extraout_DX_02; + FUN_1020_0fe5(); + FUN_1020_10be(); + FUN_1020_0ff7(); + local_68 = FUN_1020_1017(); + if ((int)local_66 < 0) { + bVar20 = local_68 != 0; + local_68 = -local_68; + local_66 = (~local_66 + 1) - (uint)bVar20; + } + FUN_1020_100b(); + FUN_1020_0ffd(); + FUN_1020_0ff1(); + FUN_1020_100b(); + FUN_1020_0ffd(); + FUN_1020_0ff1(); + uVar7 = extraout_DX_03; + FUN_1020_0fe5(); + FUN_1020_10be(); + FUN_1020_0ff7(); + uVar9 = FUN_1020_1017(); + if ((int)uVar7 < 0) { + bVar20 = uVar9 != 0; + uVar9 = -uVar9; + uVar7 = (~uVar7 + 1) - (uint)bVar20; + } + uVar12 = *(uint *)(iVar16 + 0x97f); + iVar15 = *(int *)(iVar16 + 0x981); + uVar8 = FUN_1020_1017(); + if (((int)uVar7 < iVar15) || (((int)uVar7 <= iVar15 && (uVar9 <= uVar8)))) { + if ((*(uint *)(iVar16 + 0x99c) & 0x4000) != 0x4000) { + *(uint *)(iVar16 + 0x99c) = *(uint *)(iVar16 + 0x99c) | 0x4000; + FUN_1008_0002(); + FUN_1020_08a9(); + FUN_1000_bc36(); + if (local_4 == 0x95) { + DAT_1028_39de = 0; + *(undefined1 *) + ((int)*(undefined4 *)(param_1 + 6) + (uint)DAT_1028_07d1 * 0xaf + 0xf6) = 0; + FUN_1000_b3f3(); + FUN_1000_c4e1(); + GETDC(); + *(undefined2 *)((uint)DAT_1028_07d1 * 2 + 0x9a4) = 0; + FUN_1000_0002(); + FUN_1008_093f(); + RELEASEDC(); + } + FUN_1000_b476(); + FUN_1020_14c1(); + FUN_1020_0ff7(); + FUN_1020_0feb(); + FUN_1020_100b(); + FUN_1020_0ff7(); + local_e = FUN_1020_1017(); + FUN_1020_14c1(); + FUN_1020_0ff7(); + uVar12 = 0xa3d; + FUN_1020_0feb(); + FUN_1020_100b(); + FUN_1020_0ff7(); + local_12 = FUN_1020_1017(); + } + } + else { + *(uint *)(iVar16 + 0x99c) = *(uint *)(iVar16 + 0x99c) & 0xbfff; + } + } + } + } + else if (cVar6 == '\x02') { + local_72 = (*(int *)(iVar16 + 0x977) - *(int *)(iVar16 + 0x96f)) - + (uint)(*(uint *)(iVar16 + 0x975) < *(uint *)(iVar16 + 0x96d)); + local_76 = FUN_1020_100b(); + local_78 = (*(int *)(iVar16 + 0x97b) - *(int *)(iVar16 + 0x973)) - + (uint)(*(uint *)(iVar16 + 0x979) < *(uint *)(iVar16 + 0x971)); + local_7a = in_BX; + local_7c = FUN_1020_100b(); + FUN_1020_0ffd(); + FUN_1020_0ff1(); + FUN_1020_0ffd(); + FUN_1020_0ff1(); + FUN_1020_0fe5(); + FUN_1020_10be(); + FUN_1020_0ff7(); + FUN_1020_1017(); + FUN_1020_100b(); + FUN_1020_0ffd(); + FUN_1020_0ffd(); + FUN_1020_100b(); + FUN_1020_0ff7(); + FUN_1020_0ffd(); + uVar19 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar15 = (int)*(undefined4 *)(param_1 + 6); + uVar12 = (*(int *)(iVar15 + 0xbbc) - *(int *)(iVar16 + 0x96f)) - + (uint)(*(uint *)(iVar15 + 0xbba) < *(uint *)(iVar16 + 0x96d)); + FUN_1020_100b(); + FUN_1020_0ff7(); + FUN_1020_0feb(); + FUN_1020_0ffd(); + local_66 = uVar12 & 0x7fff; + local_68 = FUN_1020_1017(); + FUN_1020_100b(); + FUN_1020_0ffd(); + FUN_1020_0ffd(); + FUN_1020_0ff7(); + local_62 = local_78; + uVar12 = local_7a; + FUN_1020_0ffd(); + FUN_1020_0ff7(); + FUN_1020_0feb(); + FUN_1020_0ffd(); + local_64 = FUN_1020_1017(); + if ((((int)local_66 < (int)local_14) || + ((local_74 = in_BX, (int)local_66 <= (int)local_14 && + (local_74 = in_BX, local_68 <= local_16)))) && + (((int)local_62 < 0 || + ((local_74 = in_BX, (int)local_62 < 1 && (local_74 = in_BX, local_64 < 0xb)))))) { + uVar12 = local_66 - (local_68 < 10); + uVar7 = local_64; + uVar9 = local_62; + if ((int)local_62 < 0) { + uVar7 = -local_64; + uVar9 = (~local_62 + 1) - (uint)(local_64 != 0); + } + if (((int)uVar12 < (int)uVar9) || + ((local_74 = in_BX, (int)uVar12 <= (int)uVar9 && + (local_74 = in_BX, local_68 - 10 <= uVar7)))) { + uVar12 = (*(int *)(iVar16 + 0x96f) - DAT_1028_07d5) - + (uint)(*(uint *)(iVar16 + 0x96d) < DAT_1028_07d3); + uVar7 = FUN_1020_08a9(); + iVar15 = (*(int *)(iVar16 + 0x973) - DAT_1028_07d9) - + (uint)(*(uint *)(iVar16 + 0x971) < DAT_1028_07d7); + uVar9 = FUN_1020_08a9(); + uVar8 = (iVar15 - uVar12) - (uint)(uVar9 < uVar7); + if ((uVar8 < 0x8000) || + ((local_74 = in_BX, -2 < (int)uVar8 && (local_74 = in_BX, 0xfff5 < uVar9 - uVar7)))) + { + uVar12 = (*(int *)(iVar16 + 0x977) - DAT_1028_07d5) - + (uint)(*(uint *)(iVar16 + 0x975) < DAT_1028_07d3); + uVar7 = FUN_1020_08a9(); + iVar15 = (*(int *)(iVar16 + 0x97b) - DAT_1028_07d9) - + (uint)(*(uint *)(iVar16 + 0x979) < DAT_1028_07d7); + uVar9 = FUN_1020_08a9(); + iVar15 = (iVar15 - uVar12) - (uint)(uVar9 < uVar7); + if ((iVar15 < 0) || + ((local_74 = in_BX, iVar15 < 1 && (local_74 = in_BX, uVar9 - uVar7 < 0xb)))) { + bVar21 = true; + local_74 = in_BX; + } + } + } + } + } + else if (cVar6 == '\x03') { + FUN_1020_100b(); + FUN_1020_0ffd(); + FUN_1020_0ff1(); + FUN_1020_100b(); + FUN_1020_0ffd(); + FUN_1020_0ff1(); + uVar12 = extraout_DX_04; + FUN_1020_0fe5(); + FUN_1020_10be(); + FUN_1020_0ff7(); + uVar7 = FUN_1020_1017(); + if ((int)uVar12 < 0) { + bVar20 = uVar7 != 0; + uVar7 = -uVar7; + uVar12 = (~uVar12 + 1) - (uint)bVar20; + } + uVar9 = *(uint *)(iVar16 + 0x981); + uVar8 = FUN_1020_1017(); + local_68 = uVar7 - uVar8; + local_66 = (uVar12 - uVar9) - (uint)(uVar7 < uVar8); + uVar12 = (int)local_8 >> 0xf; + if (((((int)local_66 < -1) || (((int)local_66 < 0 && (local_68 < 0xd509)))) && + ((*(int *)(iVar16 + 0x99e) == 0 || + (((*(int *)(iVar16 + 0x99e) != 99 && + (*(char *)((int)*(undefined4 *)(param_1 + 6) + 0x61) == '\x01')) || + ((uVar9 = uVar12, -1 < (int)local_8 && (*(uint *)(iVar16 + 0x99e) == local_8)))))))) + && ((local_4 != 0x94 || (DAT_1028_0875 == '\0')))) { + uVar19 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar17 = (int)*(undefined4 *)(param_1 + 6); + iVar15 = *(int *)(iVar17 + 0xbcc); + if ((iVar15 < 0) || ((iVar15 < 1 && (*(uint *)(iVar17 + 0xbca) < 300)))) { + uVar19 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar15 = (int)*(undefined4 *)(param_1 + 6); + puVar1 = (uint *)(iVar15 + 0xbba); + uVar12 = *(uint *)(iVar16 + 0x96d) - *puVar1; + uVar7 = (*(int *)(iVar16 + 0x96f) - *(int *)(iVar15 + 0xbbc)) - + (uint)(*(uint *)(iVar16 + 0x96d) < *puVar1); + if ((int)uVar7 < 0) { + bVar20 = uVar12 != 0; + uVar12 = -uVar12; + uVar7 = (~uVar7 + 1) - (uint)bVar20; + } + if (((int)uVar7 < 0) || (((int)uVar7 < 1 && (uVar12 < 500)))) { + uVar19 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar15 = (int)*(undefined4 *)(param_1 + 6); + puVar1 = (uint *)(iVar15 + 0xbbe); + uVar12 = *(uint *)(iVar16 + 0x971) - *puVar1; + uVar7 = (*(int *)(iVar16 + 0x973) - *(int *)(iVar15 + 0xbc0)) - + (uint)(*(uint *)(iVar16 + 0x971) < *puVar1); + if ((int)uVar7 < 0) { + bVar20 = uVar12 != 0; + uVar12 = -uVar12; + uVar7 = (~uVar7 + 1) - (uint)bVar20; + } + if (((int)uVar7 < 0) || (((int)uVar7 < 1 && (uVar12 < 500)))) { + uVar12 = local_c; + if ((int)local_c < 0) { + bVar20 = local_e != 0; + local_e = -local_e; + uVar12 = (~local_c + 1) - (uint)bVar20; + } + if (((int)uVar12 < 0) || (((int)uVar12 < 1 && (local_e < 500)))) { + uVar12 = local_10; + if ((int)local_10 < 0) { + bVar20 = local_12 != 0; + local_12 = -local_12; + uVar12 = (~local_10 + 1) - (uint)bVar20; + } + if (((int)uVar12 < 0) || (((int)uVar12 < 1 && (local_12 < 500)))) { + local_e = 0; + local_c = 0; + local_12 = 0; + local_10 = 0; + uVar19 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar15 = (int)*(undefined4 *)(param_1 + 6); + if (*(int *)(iVar15 + 0xbca) == 0 && *(int *)(iVar15 + 0xbcc) == 0) { + *(uint *)(iVar16 + 0x99e) = local_8; + FUN_1008_0002(); + } + uVar12 = uVar9; + if (local_4 == 0x59) { + uVar19 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar15 = (int)*(undefined4 *)(param_1 + 6); + *(undefined2 *)(iVar15 + 0xbca) = 300; + *(undefined2 *)(iVar15 + 0xbcc) = 0; + } + else { + uVar19 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar17 = (int)*(undefined4 *)(param_1 + 6); + uVar7 = *(uint *)(iVar17 + 0xbca); + iVar15 = *(int *)(iVar17 + 0xbcc); + *(int *)(iVar17 + 0xbca) = uVar7 + 5; + *(int *)(iVar17 + 0xbcc) = iVar15 + (uint)(0xfffa < uVar7); + } + goto LAB_1000_e060; + } + } + } + } + if ((DAT_1028_07d5 < *(int *)(iVar16 + 0x96f)) || + ((DAT_1028_07d5 <= *(int *)(iVar16 + 0x96f) && + (DAT_1028_07d3 < *(uint *)(iVar16 + 0x96d))))) { + iVar15 = *(int *)((int)*(undefined4 *)(param_1 + 6) + 0x5c); + uVar12 = FUN_1020_08a9(); + FUN_1020_100b(); + FUN_1020_0ff7(); + uVar7 = FUN_1020_1017(); + local_e = uVar7 + uVar12; + local_c = local_c + iVar15 + (uint)CARRY2(uVar7,uVar12); + } + else { + iVar15 = *(int *)((int)*(undefined4 *)(param_1 + 6) + 0x5c); + uVar12 = FUN_1020_08a9(); + FUN_1020_100b(); + FUN_1020_0ff7(); + uVar7 = FUN_1020_1017(); + local_e = uVar7 - uVar12; + local_c = (local_c - iVar15) - (uint)(uVar7 < uVar12); + } + if ((DAT_1028_07d9 < *(int *)(iVar16 + 0x973)) || + ((DAT_1028_07d9 <= *(int *)(iVar16 + 0x973) && + (DAT_1028_07d7 < *(uint *)(iVar16 + 0x971))))) { + uVar12 = *(uint *)((int)*(undefined4 *)(param_1 + 6) + 0x5c); + uVar7 = FUN_1020_08a9(); + FUN_1020_100b(); + FUN_1020_0ff7(); + uVar9 = FUN_1020_1017(); + local_12 = uVar9 + uVar7; + local_10 = local_10 + uVar12 + (uint)CARRY2(uVar9,uVar7); + } + else { + uVar12 = *(uint *)((int)*(undefined4 *)(param_1 + 6) + 0x5c); + uVar7 = FUN_1020_08a9(); + FUN_1020_100b(); + FUN_1020_0ff7(); + uVar9 = FUN_1020_1017(); + local_12 = uVar9 - uVar7; + local_10 = (local_10 - uVar12) - (uint)(uVar9 < uVar7); + } + } + else if (local_4 == 0x59) { + uVar12 = uVar9; + if (DAT_1028_0874 == '\0') { + DAT_1028_07ca = 1; + iVar15 = FUN_1020_14a4(); + if (iVar15 == 0) { + DAT_1028_086f = 1; + } + else if (iVar15 == 1) { + DAT_1028_086f = 6; + } + else if (iVar15 == 2) { + DAT_1028_086f = 7; + } + else if (iVar15 == 3) { + DAT_1028_086f = 0x12; + } + DAT_1028_0873 = 1; + *(undefined1 *)((int)*(undefined4 *)(param_1 + 6) + 0xbdf) = 1; + local_40 = 0; + local_3e = 0; + local_3c = 0; + for (iVar15 = 0xc; *(undefined1 *)(iVar15 * 0x53 + 0x98f) = 0, uVar12 = uVar9, + iVar15 != 0x14; iVar15 = iVar15 + 1) { + } + } + } + else { + if ((local_4 < 0x81) || (0x85 < local_4)) { + if (local_4 == 0x94) { + *(undefined1 *) + ((int)*(undefined4 *)(param_1 + 6) + (uint)DAT_1028_07d1 * 0x14 + 0x47b) = 1; + FUN_1000_b30b(); + } + } + else { + uVar12 = 5000; + iVar17 = 0; + iVar15 = 1; + while( true ) { + if (*(int *)((iVar15 + 0x80) * 0x53 + 0x99e) != 0) { + uVar12 = FUN_1020_08a9(); + } + if (iVar15 == 5) break; + iVar15 = iVar15 + 1; + } + uVar7 = *(uint *)((uint)DAT_1028_07d1 * 4 + 0x98e); + iVar15 = *(int *)((uint)DAT_1028_07d1 * 4 + 0x990); + uVar9 = (uint)DAT_1028_07d1; + *(int *)(uVar9 * 4 + 0x98e) = uVar7 + uVar12; + *(int *)(uVar9 * 4 + 0x990) = iVar15 + iVar17 + (uint)CARRY2(uVar7,uVar12); + if ((iVar17 == 2) && (uVar12 == 0x7100)) { + FUN_1020_08a9(); + FUN_1000_bc36(); + uVar12 = (uint)DAT_1028_07d1; + *(undefined2 *)(uVar12 * 4 + 0x98e) = 0; + *(undefined2 *)(uVar12 * 4 + 0x990) = 0; + *(char *)(DAT_1028_07d1 + 0x9a1) = *(char *)(DAT_1028_07d1 + 0x9a1) + '\x01'; + piVar2 = (int *)((uint)DAT_1028_07d1 * 2 + 0x81f); + *piVar2 = *piVar2 + 1; + FUN_1000_a604(); + GETDC(); + RELEASEDC(); + if (((DAT_1028_07c7 == '\0') && (DAT_1028_07c8 == '\0')) && (DAT_1028_0874 == '\0')) + { + DAT_1028_0851 = 0; + DAT_1028_0853 = 0; + DAT_1028_07c8 = '\x01'; + *(undefined1 *)((int)*(undefined4 *)(param_1 + 6) + 0xbdd) = 0; + } + DAT_1028_0874 = '\0'; + } + else { + *(undefined1 *) + ((int)*(undefined4 *)(param_1 + 6) + (uint)DAT_1028_07d1 * 0x14 + local_4 + 0x3f5) + = 1; + FUN_1000_b30b(); + } + uVar9 = 0; + FUN_1020_08a9(); + FUN_1000_bda2(); + } + uVar19 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar15 = (int)*(undefined4 *)(param_1 + 6); + *(undefined2 *)(iVar15 + 0xbca) = 0; + *(undefined2 *)(iVar15 + 0xbcc) = 0; + uVar12 = uVar9; + if (*(char *)(iVar15 + 0x61) == '\x01') { + if (local_4 == 0x94) { + DAT_1028_399a = 2; + } + else { + *(undefined2 *)(iVar16 + 0x99e) = 99; + } + if (DAT_1028_07c6 == '\0') { + *(undefined1 *)((int)*(undefined4 *)(param_1 + 6) + 0xbe2) = 1; + } + else { + FUN_1000_ae6e(); + uVar12 = uVar9; + } + } + else { + *(undefined1 *)((int)*(undefined4 *)(param_1 + 6) + 0xbe1) = 1; + *(undefined1 *)((local_8 + 0xad) * 0x53 + 0x98f) = 0; + *(undefined2 *)(iVar16 + 0x99e) = 2; + } + } + } + else if (((local_66 < 0x8000) || ((-2 < (int)local_66 && (0xd508 < local_68)))) && + ((uVar9 = uVar12, -1 < (int)local_8 && (*(uint *)(iVar16 + 0x99e) == local_8)))) { + *(undefined2 *)(iVar16 + 0x99e) = 0; + uVar19 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar15 = (int)*(undefined4 *)(param_1 + 6); + *(undefined2 *)(iVar15 + 0xbca) = 0; + *(undefined2 *)(iVar15 + 0xbcc) = 0; + } + else { + uVar12 = uVar9; + if ((((int)local_66 < (int)local_14) || + (((int)local_66 <= (int)local_14 && (local_68 <= local_16)))) && + (((local_66 < 0x8000 || ((-2 < (int)local_66 && (0xd507 < local_68)))) && + (*(int *)(iVar16 + 0x99e) != 0)))) { + uVar19 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar15 = (int)*(undefined4 *)(param_1 + 6); + local_72 = (*(int *)(iVar16 + 0x973) - *(int *)(iVar15 + 0xbc0)) - + (uint)(*(uint *)(iVar16 + 0x971) < *(uint *)(iVar15 + 0xbbe)); + FUN_1020_100b(); + FUN_1020_1017(); + local_76 = FUN_1020_100b(); + uVar19 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar15 = (int)*(undefined4 *)(param_1 + 6); + local_78 = (*(int *)(iVar15 + 0xbbc) - *(int *)(iVar16 + 0x96f)) - + (uint)(*(uint *)(iVar15 + 0xbba) < *(uint *)(iVar16 + 0x96d)); + local_7a = uVar9; + FUN_1020_100b(); + FUN_1020_1017(); + local_7c = FUN_1020_100b(); + FUN_1020_0ffd(); + FUN_1020_0ff1(); + uVar12 = uVar9; + FUN_1020_0ffd(); + FUN_1020_0ff1(); + iVar15 = extraout_DX_05; + FUN_1020_0fe5(); + FUN_1020_10be(); + FUN_1020_0ff7(); + iVar17 = FUN_1020_1017(); + if ((iVar15 < 1) && ((iVar15 < 0 || (iVar17 == 0)))) { + local_64 = 0; + local_62 = 0; + } + else { + FUN_1020_100b(); + FUN_1020_0ff7(); + local_62 = uVar11; + uVar12 = uVar10; + FUN_1020_0ff7(); + FUN_1020_0feb(); + FUN_1020_0ffd(); + local_64 = FUN_1020_1017(); + } + local_74 = uVar9; + if ((int)local_62 < 0) { + uVar7 = local_68; + uVar12 = local_66; + if ((int)local_66 < 0) { + uVar7 = -local_68; + uVar12 = (~local_66 + 1) - (uint)(local_68 != 0); + } + uVar9 = local_64; + uVar8 = local_62; + if ((int)local_62 < 0) { + uVar9 = -local_64; + uVar8 = (~local_62 + 1) - (uint)(local_64 != 0); + } + if (((int)uVar12 < (int)uVar8) || (((int)uVar12 <= (int)uVar8 && (uVar7 <= uVar9)))) { + bVar21 = true; + } + } + } + } + } +LAB_1000_e060: + in_BX = uVar12; + if (bVar21) { + uVar19 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar15 = (int)*(undefined4 *)(param_1 + 6); + *(undefined2 *)(iVar15 + 0xbca) = 0; + *(undefined2 *)(iVar15 + 0xbcc) = 0; + if (((int)local_66 < (int)local_6e) || + (((int)local_66 <= (int)local_6e && (local_68 <= local_70)))) { + local_70 = local_68; + local_6e = local_66; + iVar14 = iVar14 + 1; + iVar15 = iVar14 * 0x34; + *(uint *)(&stack0xd89e + iVar15) = local_68; + *(uint *)(&stack0xd8a0 + iVar15) = local_66; + *(int *)(&stack0xd86e + iVar15) = local_4; + *(undefined2 *)(&stack0xd870 + iVar15) = local_76; + *(uint *)(&stack0xd872 + iVar15) = local_74; + *(uint *)(&stack0xd874 + iVar15) = local_72; + *(undefined2 *)(&stack0xd876 + iVar15) = local_7c; + *(uint *)(&stack0xd878 + iVar15) = local_7a; + *(uint *)(&stack0xd87a + iVar15) = local_78; + uVar19 = *(undefined2 *)(iVar16 + 0x98b); + uVar4 = *(undefined2 *)(iVar16 + 0x98d); + *(undefined2 *)(&stack0xd886 + iVar15) = *(undefined2 *)(iVar16 + 0x989); + *(undefined2 *)(&stack0xd888 + iVar15) = uVar19; + *(undefined2 *)(&stack0xd88a + iVar15) = uVar4; + uVar19 = *(undefined2 *)(iVar16 + 0x985); + uVar4 = *(undefined2 *)(iVar16 + 0x987); + *(undefined2 *)(&stack0xd880 + iVar15) = *(undefined2 *)(iVar16 + 0x983); + *(undefined2 *)(&stack0xd882 + iVar15) = uVar19; + *(undefined2 *)(&stack0xd884 + iVar15) = uVar4; + *(uint *)(&stack0xd87c + iVar15) = local_64; + *(uint *)(&stack0xd87e + iVar15) = local_62; + uVar19 = *(undefined2 *)(iVar16 + 0x992); + uVar4 = *(undefined2 *)(iVar16 + 0x994); + *(undefined2 *)(&stack0xd88c + iVar15) = *(undefined2 *)(iVar16 + 0x990); + *(undefined2 *)(&stack0xd88e + iVar15) = uVar19; + *(undefined2 *)(&stack0xd890 + iVar15) = uVar4; + in_BX = *(uint *)(iVar16 + 0x998); + uVar19 = *(undefined2 *)(iVar16 + 0x99a); + *(undefined2 *)(&stack0xd892 + iVar15) = *(undefined2 *)(iVar16 + 0x996); + *(uint *)(&stack0xd894 + iVar15) = in_BX; + *(undefined2 *)(&stack0xd896 + iVar15) = uVar19; + *(undefined2 *)(&stack0xd898 + iVar15) = *(undefined2 *)(iVar16 + 0x99c); + uVar19 = *(undefined2 *)(iVar16 + 0x9a2); + *(undefined2 *)(&stack0xd89a + iVar15) = *(undefined2 *)(iVar16 + 0x9a0); + *(undefined2 *)(&stack0xd89c + iVar15) = uVar19; + } + } + } + if (local_4 == 0xaf) break; + local_4 = local_4 + 1; + } while( true ); + if (iVar14 != 0) { + if (in_stack_0000d8cc != 0) { + FUN_1000_b476(); + } + if (in_stack_0000d8ce != 0 || in_stack_0000d8d0 != 0) { + bVar21 = true; + FUN_1020_1007(); + if (bVar21) { + FUN_1000_bc36(); + } + } + FUN_1020_0ffd(); + FUN_1020_0ff1(); + FUN_1020_0ffd(); + FUN_1020_0ff1(); + FUN_1020_0fe5(); + FUN_1020_10be(); + FUN_1020_0ff7(); + FUN_1020_1017(); + FUN_1020_100b(); + FUN_1020_0ff7(); + FUN_1020_0ff7(); + FUN_1020_0fe5(); + FUN_1020_0ffd(); + FUN_1020_1017(); + FUN_1020_100b(); + FUN_1020_0ff7(); + FUN_1020_0ff7(); + FUN_1020_100b(); + FUN_1020_0ff7(); + FUN_1020_100b(); + FUN_1020_0ff7(); + FUN_1020_10be(); + FUN_1020_0ffd(); + FUN_1020_100b(); + FUN_1020_100b(); + FUN_1020_0ff7(); + FUN_1020_0ffd(); + iVar16 = 0x4ccc; + FUN_1020_0ff7(); + FUN_1020_0feb(); + FUN_1020_0feb(); + FUN_1020_1017(); + local_3e = 0x9999; + local_3c = 0x1999; + FUN_1020_0ff7(); + local_40 = FUN_1020_0fe5(); + if ((in_stack_0000d8a2 == 0xae) || (in_stack_0000d8a2 == 0xaf)) { + iVar17 = (in_stack_0000d8a2 + -0xae) * 4; + iVar15 = *(int *)(iVar17 + 0x805); + if ((iVar15 < 0) || ((iVar15 < 1 && (*(int *)(iVar17 + 0x803) == 0)))) { + FUN_1020_100b(); + iVar17 = in_stack_0000d8b2; + FUN_1020_100b(); + FUN_1020_0ff7(); + FUN_1020_0ffd(); + uVar11 = FUN_1020_1017(); + iVar15 = (in_stack_0000d8a2 + -0xae) * 4; + uVar10 = *(uint *)(iVar15 + 0x7f3); + iVar15 = *(int *)(iVar15 + 0x7f5); + iVar18 = (in_stack_0000d8a2 + -0xae) * 4; + *(int *)(iVar18 + 0x7f3) = uVar10 + uVar11; + *(int *)(iVar18 + 0x7f5) = iVar15 + iVar17 + (uint)CARRY2(uVar10,uVar11); + FUN_1020_100b(); + iVar17 = in_stack_0000d8b2; + FUN_1020_100b(); + FUN_1020_0ff7(); + FUN_1020_0ffd(); + uVar11 = FUN_1020_1017(); + iVar15 = (in_stack_0000d8a2 + -0xae) * 4; + uVar10 = *(uint *)(iVar15 + 0x7fb); + iVar15 = *(int *)(iVar15 + 0x7fd); + iVar18 = (in_stack_0000d8a2 + -0xae) * 4; + *(int *)(iVar18 + 0x7fb) = uVar10 - uVar11; + *(int *)(iVar18 + 0x7fd) = (iVar15 - iVar17) - (uint)(uVar10 < uVar11); + } + } + FUN_1020_100b(); + FUN_1020_100b(); + FUN_1020_100b(); + FUN_1020_0ff7(); + FUN_1020_0ffd(); + in_BX = 0; + local_62 = 0; + FUN_1020_0fe5(); + FUN_1020_0feb(); + FUN_1020_0ff7(); + local_64 = FUN_1020_1017(); + if (DAT_1028_07c6 == '\0') { + bVar21 = false; + in_BX = in_stack_0000d8c2; + FUN_1020_1007(); + if (bVar21) { + iVar15 = *(int *)((int)*(undefined4 *)(param_1 + 6) + 0x58); + FUN_1020_100b(); + FUN_1020_0ff7(); + uVar10 = FUN_1020_1017(); + if ((in_stack_0000d8b2 < iVar15) || + ((in_stack_0000d8b2 <= iVar15 && (in_stack_0000d8b0 < uVar10)))) { + if (in_stack_0000d8ce == 0 && in_stack_0000d8d0 == 0) { + FUN_1008_0002(); + } + else { + FUN_1000_bc36(); + } + in_BX = *(uint *)((int)*(undefined4 *)(param_1 + 6) + 0x58); + FUN_1020_100b(); + FUN_1020_0ff7(); + uVar10 = FUN_1020_1017(); + bVar21 = local_64 < uVar10; + local_64 = local_64 - uVar10; + local_62 = (local_62 - in_BX) - (uint)bVar21; + } + } + } + FUN_1020_100b(); + FUN_1020_100b(); + FUN_1020_0ff7(); + FUN_1020_100b(); + FUN_1020_0ff7(); + FUN_1020_0feb(); + FUN_1020_0ffd(); + uVar11 = FUN_1020_1017(); + FUN_1020_100b(); + FUN_1020_100b(); + FUN_1020_0ff7(); + uVar10 = local_62; + FUN_1020_100b(); + FUN_1020_0ff7(); + FUN_1020_0fe5(); + FUN_1020_0ffd(); + uVar22 = FUN_1020_1017(); + bVar21 = CARRY2(local_e,uVar11); + local_e = local_e + uVar11; + local_c = local_c + iVar16 + (uint)bVar21; + bVar21 = CARRY2(local_12,uVar22); + local_12 = local_12 + uVar22; + local_10 = local_10 + uVar10 + (uint)bVar21; + if (in_stack_0000d8a2 == 0x19) { + if (((int)local_14 < 0) || (((int)local_14 < 1 && (local_16 < 1000)))) { + *(undefined1 *)((int)*(undefined4 *)(param_1 + 6) + 0xbdd) = 0; + local_12 = 0; + local_10 = 0; + } + local_c = 0; + local_e = 0; + } + else if (in_stack_0000d8a2 == 2) { + if (*(byte *)((int)*(undefined4 *)(param_1 + 6) + 0x61) < 2) { + FUN_1000_ae6e(); + } + else { + *(undefined1 *)((local_8 + 0xad) * 0x53 + 0x98f) = 0; + DAT_1028_0874 = '\0'; + } + } + } + if (*(char *)((int)*(undefined4 *)(param_1 + 6) + 0xbdd) != '\0') { + uVar19 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar16 = (int)*(undefined4 *)(param_1 + 6); + *(undefined2 *)(iVar16 + 0xbce) = local_40; + *(uint *)(iVar16 + 0xbd0) = local_3e; + *(undefined2 *)(iVar16 + 0xbd2) = local_3c; + *(uint *)(iVar16 + 0xbaa) = local_e; + *(uint *)(iVar16 + 0xbac) = local_c; + *(uint *)(iVar16 + 0xbae) = local_12; + *(uint *)(iVar16 + 0xbb0) = local_10; + FUN_1020_100b(); + FUN_1020_0ffd(); + FUN_1020_0ff1(); + FUN_1020_100b(); + FUN_1020_0ffd(); + FUN_1020_0ff1(); + iVar15 = extraout_DX_06; + FUN_1020_0fe5(); + FUN_1020_10be(); + FUN_1020_0ff7(); + uVar10 = FUN_1020_1017(); + uVar19 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar17 = (int)*(undefined4 *)(param_1 + 6); + iVar16 = *(int *)(iVar17 + 0x58); + if ((iVar16 < iVar15) || + ((in_BX = local_3e, iVar16 <= iVar15 && (*(uint *)(iVar17 + 0x56) < uVar10)))) { + FUN_1020_100b(); + uVar19 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar16 = (int)*(undefined4 *)(param_1 + 6); + iVar17 = (iVar15 - *(int *)(iVar16 + 0x58)) - (uint)(uVar10 < *(uint *)(iVar16 + 0x56)); + FUN_1020_08a9(); + FUN_1020_100b(); + FUN_1020_0ffd(); + uVar22 = FUN_1020_1017(); + uVar19 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar18 = (int)*(undefined4 *)(param_1 + 6); + uVar11 = *(uint *)(iVar18 + 0xbaa); + iVar16 = *(int *)(iVar18 + 0xbac); + *(int *)(iVar18 + 0xbaa) = uVar11 - uVar22; + *(int *)(iVar18 + 0xbac) = (iVar16 - iVar17) - (uint)(uVar11 < uVar22); + FUN_1020_100b(); + uVar19 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar16 = (int)*(undefined4 *)(param_1 + 6); + in_BX = (iVar15 - *(int *)(iVar16 + 0x58)) - (uint)(uVar10 < *(uint *)(iVar16 + 0x56)); + FUN_1020_08a9(); + FUN_1020_100b(); + FUN_1020_0ffd(); + uVar11 = FUN_1020_1017(); + uVar19 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar15 = (int)*(undefined4 *)(param_1 + 6); + uVar10 = *(uint *)(iVar15 + 0xbae); + iVar16 = *(int *)(iVar15 + 0xbb0); + *(int *)(iVar15 + 0xbae) = uVar10 - uVar11; + *(int *)(iVar15 + 0xbb0) = (iVar16 - in_BX) - (uint)(uVar10 < uVar11); + } + uVar19 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar16 = (int)*(undefined4 *)(param_1 + 6); + bVar21 = CARRY2(DAT_1028_07d3,*(uint *)(iVar16 + 0xbaa)); + DAT_1028_07d3 = DAT_1028_07d3 + *(uint *)(iVar16 + 0xbaa); + DAT_1028_07d5 = DAT_1028_07d5 + *(int *)(iVar16 + 0xbac) + (uint)bVar21; + bVar21 = CARRY2(DAT_1028_07d7,*(uint *)(iVar16 + 0xbae)); + DAT_1028_07d7 = DAT_1028_07d7 + *(uint *)(iVar16 + 0xbae); + DAT_1028_07d9 = DAT_1028_07d9 + *(int *)(iVar16 + 0xbb0) + (uint)bVar21; + FUN_1000_bdde(); + } + if (iVar14 != 0) goto LAB_1000_ea63; + uVar19 = (undefined2)((ulong)*(undefined4 *)(param_1 + 6) >> 0x10); + iVar14 = (int)*(undefined4 *)(param_1 + 6); + if (((*(char *)(iVar14 + 0xbe2) == '\x01') || (*(char *)(iVar14 + 0xbe1) == '\x01')) || + (iVar13 == iVar5)) goto LAB_1000_ea63; + iVar13 = iVar13 + 1; + goto LAB_1000_c839; +} + + +/* ===== 1000:eab1 exported_ordinal_10 ===== */ + +void __stdcall16far exported_ordinal_10(undefined4 param_1) + +{ + char *pcVar1; + undefined1 uVar2; + undefined1 uVar3; + undefined2 uVar4; + undefined2 uVar5; + undefined2 uVar6; + undefined2 uVar7; + undefined2 uVar8; + int iVar9; + uint uVar10; + int iVar11; + int iVar12; + undefined2 uVar13; + undefined2 unaff_CS; + bool bVar14; + undefined2 uVar15; + undefined2 uVar16; + undefined2 uVar17; + undefined2 uVar18; + undefined1 local_4d; + int local_30; + int local_2e; + + uVar13 = (undefined2)((ulong)param_1 >> 0x10); + iVar12 = (int)param_1; + if (*(int *)(iVar12 + 0x41) != 0 || *(int *)(iVar12 + 0x43) != 0) { + return; + } + if (*(int *)(iVar12 + 0x45) != 0 || *(int *)(iVar12 + 0x47) != 0) { + return; + } + if (*(char *)(iVar12 + 0xbd8) != '\0') { + return; + } + if (*(char *)(iVar12 + 0xbd9) != '\0') { + return; + } + if (DAT_1028_07cc != '\0') { + return; + } + if (*(char *)(iVar12 + 0x51) != '\0') { + return; + } + if (DAT_1028_07c4 == '\0') { + return; + } + *(undefined1 *)(iVar12 + 0x51) = 1; + if (DAT_1028_07c5 != '\0') { + local_30 = 1; + while( true ) { + unaff_CS = 0x1000; + FUN_1000_7e12(&stack0xfffe,local_30); + if (local_30 == 0xaf) break; + local_30 = local_30 + 1; + } + DAT_1028_07c5 = '\0'; + } + bVar14 = 0xfffe < DAT_1028_0876; + DAT_1028_0876 = DAT_1028_0876 + 1; + DAT_1028_0878 = DAT_1028_0878 + (uint)bVar14; + if (*(char *)(iVar12 + 0xbdd) != '\0') { + if ((DAT_1028_07ca != '\0') && (DAT_1028_0874 == '\0')) { + if (DAT_1028_086d == DAT_1028_086f) { + if (DAT_1028_086d == 10) { + uVar8 = GETDC(unaff_CS,*(undefined2 *)(iVar12 + 4)); + FUN_1008_0e08(0,0,uVar8); + RELEASEDC(0x1008,uVar8); + if (DAT_1028_0873 == '\0') { + DAT_1028_07ca = '\0'; + for (local_2e = 0xc; *(undefined1 *)(local_2e * 0x53 + 0x98f) = 1, local_2e != 0x14; + local_2e = local_2e + 1) { + } + } + } + else { + uVar18 = GETDC(unaff_CS,*(undefined2 *)(iVar12 + 4)); + FUN_1008_0e08(0,DAT_1028_086d,uVar18); + uVar8 = *(undefined2 *)(iVar12 + 4); + RELEASEDC(0x1008,uVar18); + DAT_1028_086f = 10; + DAT_1028_0873 = '\0'; + DAT_1028_2679 = 0; + *(undefined2 *)(iVar12 + 0xbca) = 0; + *(undefined2 *)(iVar12 + 0xbcc) = 0; + *(undefined2 *)(iVar12 + 0xbce) = 0; + *(undefined2 *)(iVar12 + 0xbd0) = 0; + *(undefined2 *)(iVar12 + 0xbd2) = 0; + if (DAT_1028_086d == 1) { + DAT_1028_07d3 = 0xefd0; + DAT_1028_07d5 = 3; + DAT_1028_07d7 = 0x30b0; + DAT_1028_07d9 = 1; + uVar18 = *(undefined2 *)(iVar12 + 0x58); + FUN_1020_100b(uVar8); + FUN_1020_0ff7(); + uVar8 = FUN_1020_1017(); + *(undefined2 *)(iVar12 + 0xbaa) = uVar8; + *(undefined2 *)(iVar12 + 0xbac) = uVar18; + uVar8 = *(undefined2 *)(iVar12 + 0x58); + FUN_1020_100b(); + FUN_1020_0ff7(); + uVar18 = FUN_1020_1017(); + *(undefined2 *)(iVar12 + 0xbae) = uVar18; + *(undefined2 *)(iVar12 + 0xbb0) = uVar8; + } + else if (DAT_1028_086d == 2) { + DAT_1028_07d3 = 0xf3b8; + DAT_1028_07d5 = 3; + DAT_1028_07d7 = 0x3c68; + DAT_1028_07d9 = 1; + uVar18 = *(undefined2 *)(iVar12 + 0x58); + FUN_1020_100b(uVar8); + FUN_1020_0ff7(); + uVar8 = FUN_1020_1017(); + *(undefined2 *)(iVar12 + 0xbaa) = uVar8; + *(undefined2 *)(iVar12 + 0xbac) = uVar18; + uVar8 = *(undefined2 *)(iVar12 + 0x58); + FUN_1020_100b(); + FUN_1020_0ff7(); + uVar18 = FUN_1020_1017(); + *(undefined2 *)(iVar12 + 0xbae) = uVar18; + *(undefined2 *)(iVar12 + 0xbb0) = uVar8; + } + else if (DAT_1028_086d == 3) { + DAT_1028_07d3 = 0xefd0; + DAT_1028_07d5 = 3; + DAT_1028_07d7 = 0x30b0; + DAT_1028_07d9 = 1; + uVar18 = *(undefined2 *)(iVar12 + 0x58); + FUN_1020_100b(uVar8); + FUN_1020_0ff7(); + uVar8 = FUN_1020_1017(); + *(undefined2 *)(iVar12 + 0xbaa) = uVar8; + *(undefined2 *)(iVar12 + 0xbac) = uVar18; + uVar8 = *(undefined2 *)(iVar12 + 0x58); + FUN_1020_100b(); + FUN_1020_0ff7(); + uVar18 = FUN_1020_1017(); + *(undefined2 *)(iVar12 + 0xbae) = uVar18; + *(undefined2 *)(iVar12 + 0xbb0) = uVar8; + } + else if (DAT_1028_086d == 4) { + DAT_1028_07d3 = 0xfb88; + DAT_1028_07d5 = 3; + DAT_1028_07d7 = 0x4ff0; + DAT_1028_07d9 = 1; + uVar18 = *(undefined2 *)(iVar12 + 0x58); + FUN_1020_100b(uVar8); + FUN_1020_0ff7(); + uVar8 = FUN_1020_1017(); + *(undefined2 *)(iVar12 + 0xbaa) = uVar8; + *(undefined2 *)(iVar12 + 0xbac) = uVar18; + uVar8 = *(undefined2 *)(iVar12 + 0x58); + FUN_1020_100b(); + FUN_1020_0ff7(); + uVar18 = FUN_1020_1017(); + *(undefined2 *)(iVar12 + 0xbae) = uVar18; + *(undefined2 *)(iVar12 + 0xbb0) = uVar8; + } + else if (DAT_1028_086d == 5) { + DAT_1028_07d3 = 0xf10; + DAT_1028_07d5 = 4; + DAT_1028_07d7 = 0x5f90; + DAT_1028_07d9 = 1; + uVar18 = *(undefined2 *)(iVar12 + 0x58); + FUN_1020_100b(uVar8); + FUN_1020_0ff7(); + uVar8 = FUN_1020_1017(); + *(undefined2 *)(iVar12 + 0xbaa) = uVar8; + *(undefined2 *)(iVar12 + 0xbac) = uVar18; + uVar8 = *(undefined2 *)(iVar12 + 0x58); + FUN_1020_100b(); + FUN_1020_0ff7(); + uVar18 = FUN_1020_1017(); + *(undefined2 *)(iVar12 + 0xbae) = uVar18; + *(undefined2 *)(iVar12 + 0xbb0) = uVar8; + } + else if (DAT_1028_086d == 6) { + DAT_1028_07d3 = 0x1eb0; + DAT_1028_07d5 = 4; + DAT_1028_07d7 = 0x6f30; + DAT_1028_07d9 = 1; + uVar18 = *(undefined2 *)(iVar12 + 0x58); + FUN_1020_100b(uVar8); + FUN_1020_0ff7(); + uVar8 = FUN_1020_1017(); + *(undefined2 *)(iVar12 + 0xbaa) = uVar8; + *(undefined2 *)(iVar12 + 0xbac) = uVar18; + uVar8 = *(undefined2 *)(iVar12 + 0x58); + FUN_1020_100b(); + FUN_1020_0ff7(); + uVar18 = FUN_1020_1017(); + *(undefined2 *)(iVar12 + 0xbae) = uVar18; + *(undefined2 *)(iVar12 + 0xbb0) = uVar8; + } + else if (DAT_1028_086d == 7) { + DAT_1028_07d3 = 0x3238; + DAT_1028_07d5 = 4; + DAT_1028_07d7 = 0x7ae8; + DAT_1028_07d9 = 1; + uVar18 = *(undefined2 *)(iVar12 + 0x58); + FUN_1020_100b(uVar8); + FUN_1020_0ff7(); + uVar8 = FUN_1020_1017(); + *(undefined2 *)(iVar12 + 0xbaa) = uVar8; + *(undefined2 *)(iVar12 + 0xbac) = uVar18; + uVar8 = *(undefined2 *)(iVar12 + 0x58); + FUN_1020_100b(); + FUN_1020_0ff7(); + uVar18 = FUN_1020_1017(); + *(undefined2 *)(iVar12 + 0xbae) = uVar18; + *(undefined2 *)(iVar12 + 0xbb0) = uVar8; + } + else if (DAT_1028_086d == 8) { + DAT_1028_07d3 = 0x3df0; + DAT_1028_07d5 = 4; + DAT_1028_07d7 = 0x7ed0; + DAT_1028_07d9 = 1; + uVar18 = *(undefined2 *)(iVar12 + 0x58); + FUN_1020_100b(uVar8); + FUN_1020_0ff7(); + uVar8 = FUN_1020_1017(); + *(undefined2 *)(iVar12 + 0xbaa) = uVar8; + *(undefined2 *)(iVar12 + 0xbac) = uVar18; + uVar8 = *(undefined2 *)(iVar12 + 0x58); + FUN_1020_100b(); + FUN_1020_0ff7(); + uVar18 = FUN_1020_1017(); + *(undefined2 *)(iVar12 + 0xbae) = uVar18; + *(undefined2 *)(iVar12 + 0xbb0) = uVar8; + } + else if (DAT_1028_086d == 9) { + DAT_1028_07d3 = 0x4d90; + DAT_1028_07d5 = 4; + DAT_1028_07d7 = 0x8a88; + DAT_1028_07d9 = 1; + uVar18 = *(undefined2 *)(iVar12 + 0x58); + FUN_1020_100b(uVar8); + FUN_1020_0ff7(); + uVar8 = FUN_1020_1017(); + *(undefined2 *)(iVar12 + 0xbaa) = uVar8; + *(undefined2 *)(iVar12 + 0xbac) = uVar18; + uVar8 = *(undefined2 *)(iVar12 + 0x58); + FUN_1020_100b(); + FUN_1020_0ff7(); + uVar18 = FUN_1020_1017(); + *(undefined2 *)(iVar12 + 0xbae) = uVar18; + *(undefined2 *)(iVar12 + 0xbb0) = uVar8; + } + else if (DAT_1028_086d == 0x12) { + DAT_1028_07d3 = 0xf588; + DAT_1028_07d5 = 4; + DAT_1028_07d7 = 0x6760; + DAT_1028_07d9 = 1; + *(undefined2 *)(iVar12 + 0xbaa) = 0; + *(undefined2 *)(iVar12 + 0xbac) = 0; + *(undefined2 *)(iVar12 + 0xbae) = 1000; + *(undefined2 *)(iVar12 + 0xbb0) = 0; + } + FUN_1000_c426(&stack0xfffe,1,0); + FUN_1000_9bca(&stack0xfffe); + FUN_1008_0002(0x10); + *(undefined1 *)(iVar12 + 0xbdf) = 0; + } + } + else { + uVar8 = GETDC(unaff_CS,*(undefined2 *)(iVar12 + 4)); + if (DAT_1028_086d < DAT_1028_086f) { + DAT_1028_086d = DAT_1028_086d + 1; + } + else { + DAT_1028_086d = DAT_1028_086d - 1; + } + FUN_1008_0e08(CONCAT11((char)(DAT_1028_086d >> 8),DAT_1028_0873),DAT_1028_086d,uVar8); + RELEASEDC(0x1008,uVar8); + } + } + local_2e = 1; + while( true ) { + if ((*(char *)(iVar12 + local_2e + 0x61) != '\0') && + (pcVar1 = (char *)(iVar12 + local_2e + 0x61), *pcVar1 = *pcVar1 + -1, + *(char *)(iVar12 + local_2e + 0x61) == '\0')) { + FUN_1000_b3f3(&stack0xfffe,local_2e); + } + if (local_2e == 0xaf) break; + local_2e = local_2e + 1; + } + if (DAT_1028_07c7 != '\0') { + if ((DAT_1028_0857 < 0) || ((DAT_1028_0857 < 1 && (DAT_1028_0855 < 6)))) { + bVar14 = 0xfffe < DAT_1028_0855; + DAT_1028_0855 = DAT_1028_0855 + 1; + DAT_1028_0857 = DAT_1028_0857 + (uint)bVar14; + FUN_1000_6f27(&stack0xfffe); + } + else { + DAT_1028_07c7 = '\0'; + } + } + uVar18 = DAT_1028_07e9; + uVar8 = DAT_1028_07e5; + if (1 < *(byte *)(iVar12 + 0x61)) { + if (DAT_1028_41f9 == '\0') { + if (*(char *)(iVar12 + 0xbe1) == '\0') { + *(undefined2 *)(iVar12 + 0xbc2) = DAT_1028_07e3; + *(undefined2 *)(iVar12 + 0xbc4) = uVar8; + uVar8 = DAT_1028_07ed; + *(undefined2 *)(iVar12 + 0xbc6) = DAT_1028_07eb; + *(undefined2 *)(iVar12 + 0xbc8) = uVar8; + FUN_1000_a38e(&stack0xfffe,0); + } + else { + *(undefined1 *)(iVar12 + 0xbe1) = 0; + } + *(undefined1 *)(iVar12 + 0x61) = 1; + uVar8 = DAT_1028_07e9; + DAT_1028_0874 = '\0'; + DAT_1028_41f9 = '\x01'; + if (DAT_1028_424c == '\0') { + *(undefined2 *)(iVar12 + 0xbc2) = DAT_1028_07e7; + *(undefined2 *)(iVar12 + 0xbc4) = uVar8; + uVar8 = DAT_1028_07f1; + *(undefined2 *)(iVar12 + 0xbc6) = DAT_1028_07ef; + *(undefined2 *)(iVar12 + 0xbc8) = uVar8; + FUN_1000_ae6e(&stack0xfffe); + } + else { + DAT_1028_07e3 = DAT_1028_07e7; + DAT_1028_07e5 = DAT_1028_07e9; + DAT_1028_07eb = DAT_1028_07ef; + DAT_1028_07ed = DAT_1028_07f1; + DAT_1028_07f3 = DAT_1028_07f7; + DAT_1028_07f5 = DAT_1028_07f9; + DAT_1028_07fb = DAT_1028_07ff; + DAT_1028_07fd = DAT_1028_0801; + DAT_1028_080b = DAT_1028_0811; + DAT_1028_080d = DAT_1028_0813; + DAT_1028_080f = DAT_1028_0815; + DAT_1028_0803 = DAT_1028_0807; + DAT_1028_0805 = DAT_1028_0809; + FUN_1000_c36b(&stack0xfffe,0,0); + DAT_1028_424c = '\0'; + } + } + else if (DAT_1028_424c == '\0') { + if (*(char *)(iVar12 + 0xbe1) == '\0') { + *(undefined2 *)(iVar12 + 0xbc2) = DAT_1028_07e7; + *(undefined2 *)(iVar12 + 0xbc4) = uVar18; + uVar8 = DAT_1028_07f1; + *(undefined2 *)(iVar12 + 0xbc6) = DAT_1028_07ef; + *(undefined2 *)(iVar12 + 0xbc8) = uVar8; + FUN_1000_a38e(&stack0xfffe,0); + } + else { + *(undefined1 *)(iVar12 + 0xbe1) = 0; + } + *(undefined1 *)(iVar12 + 0x61) = 1; + DAT_1028_0874 = '\0'; + FUN_1000_c36b(&stack0xfffe,0,0); + } + } + if ((*(char *)(iVar12 + 0xbd8) == '\0') && (*(char *)(iVar12 + 0xbdf) == '\0')) { + FUN_1000_c79c(&stack0xfffe); + } + if (*(char *)(iVar12 + 0xbe2) == '\x01') { + *(undefined1 *)(iVar12 + 0xbe2) = 0; + FUN_1000_c426(&stack0xfffe,1,0); + FUN_1000_bdde(&stack0xfffe,2,0); + FUN_1000_9e85(&stack0xfffe); + uVar8 = GETDC(0x1000,*(undefined2 *)(iVar12 + 4)); + FUN_1008_08bb(0x14,0x94,0xf3,0x54,uVar8); + FUN_1008_093f(0x14,0x94,0xf3,0x54,uVar8); + RELEASEDC(0x1008,uVar8); + FUN_1000_c426(&stack0xfffe,0,0); + FUN_1000_bdde(&stack0xfffe,1,0); + } + if (*(char *)(iVar12 + 0xbe0) == '\x01') { + FUN_1000_c426(&stack0xfffe,0,0); + FUN_1000_bdde(&stack0xfffe,1,0); + uVar8 = DAT_1028_396b; + DAT_1028_07d3 = DAT_1028_3969; + DAT_1028_07d5 = DAT_1028_396b; + DAT_1028_07d7 = DAT_1028_396d; + DAT_1028_07d9 = DAT_1028_396f; + *(undefined2 *)(iVar12 + 0xbc2) = DAT_1028_3969; + *(undefined2 *)(iVar12 + 0xbc4) = uVar8; + uVar8 = DAT_1028_07d9; + *(undefined2 *)(iVar12 + 0xbc6) = DAT_1028_07d7; + *(undefined2 *)(iVar12 + 0xbc8) = uVar8; + FUN_1000_a38e(&stack0xfffe,0); + *(undefined1 *)(iVar12 + (uint)DAT_1028_07d1 * 0x14 + 0x47b) = 0; + FUN_1000_b3f3(&stack0xfffe,0x3fc); + *(undefined2 *)(iVar12 + 0xbaa) = 0; + *(undefined2 *)(iVar12 + 0xbac) = 0; + uVar8 = *(undefined2 *)(iVar12 + 0x58); + FUN_1020_100b(); + FUN_1020_0ff7(); + uVar18 = FUN_1020_1017(); + *(undefined2 *)(iVar12 + 0xbae) = uVar18; + *(undefined2 *)(iVar12 + 0xbb0) = uVar8; + *(undefined2 *)(iVar12 + 0xbca) = 0; + *(undefined2 *)(iVar12 + 0xbcc) = 0; + *(undefined2 *)(iVar12 + 0xbce) = 0; + *(undefined2 *)(iVar12 + 0xbd0) = 0; + *(undefined2 *)(iVar12 + 0xbd2) = 0; + DAT_1028_399a = 2; + FUN_1000_c426(&stack0xfffe,1,0); + FUN_1000_bdde(&stack0xfffe,2,0); + DAT_1028_41f9 = '\x01'; + DAT_1028_424c = '\x01'; + *(undefined1 *)(iVar12 + 0x61) = 2; + DAT_1028_0874 = '\x01'; + *(undefined1 *)(iVar12 + 0xbe0) = 0; + } + goto LAB_1000_fd59; + } + if (DAT_1028_07c9 != '\0') { + iVar9 = 2; + iVar11 = 0; + FUN_1020_08e6(); + if (iVar9 == 0 && iVar11 == 0) { + FUN_1020_08e6(); + iVar9 = FUN_1020_08e6(); + if ((iVar9 < 0) || (7 < iVar9)) { + if ((7 < iVar9) && (iVar9 < 0x10)) { + FUN_1000_b3f3(&stack0xfffe,iVar9 + 0x84); + } + } + else { + FUN_1000_b30b(&stack0xfffe,iVar9 + 0x8c); + } + } + iVar9 = 4; + iVar11 = 0; + FUN_1020_08e6(); + if (iVar9 == 0 && iVar11 == 0) { + FUN_1020_08e6(); + iVar9 = FUN_1020_08e6(); + if (iVar9 == 0) { + FUN_1000_b30b(&stack0xfffe,0x3e9); + FUN_1000_b3f3(&stack0xfffe,0x3ea); + } + else if ((iVar9 < 1) || (4 < iVar9)) { + if ((4 < iVar9) && (iVar9 < 9)) { + FUN_1000_b30b(&stack0xfffe,0x3f1 - iVar9); + FUN_1000_b3f3(&stack0xfffe,0x3f2 - iVar9); + } + } + else { + FUN_1000_b30b(&stack0xfffe,iVar9 + 0x3e9); + FUN_1000_b3f3(&stack0xfffe,iVar9 + 1000); + } + } + iVar9 = 0x20; + uVar8 = 0x1020; + FUN_1020_08e6(); + if (iVar9 == 0) { + FUN_1000_b30b(&stack0xfffe,0x99); + FUN_1000_b30b(&stack0xfffe,0x9a); + uVar8 = 0x1000; + FUN_1000_b30b(&stack0xfffe,6); + } + else if (iVar9 == 0x10) { + FUN_1000_b3f3(&stack0xfffe,0x99); + FUN_1000_b3f3(&stack0xfffe,0x9a); + uVar8 = 0x1000; + FUN_1000_b3f3(&stack0xfffe,6); + } + iVar9 = 4; + iVar11 = 0; + uVar18 = 0xf62f; + FUN_1020_08e6(); + if (iVar9 == 0 && iVar11 == 0) { + uVar8 = *(undefined2 *)(iVar12 + 4); + uVar15 = GETDC(0x1020,uVar8); + FUN_1020_08e6(); + iVar9 = FUN_1020_08e6(); + if (iVar9 < 5) { + iVar9 = (iVar9 * 3 + 0x5a) * 0x53; + local_4d = (undefined1)(iVar9 + 0x95b); + uVar2 = (undefined1)((uint)(iVar9 + 0x95b) >> 8); + uVar3 = 0x10; + FUN_1008_0837((*(int *)(iVar9 + 0x9ac) - *(int *)(iVar9 + 0x9a8)) + 1, + (*(int *)(iVar9 + 0x9aa) - *(int *)(iVar9 + 0x9a6)) + -10, + *(undefined2 *)(iVar9 + 0x9a8),*(undefined2 *)(iVar9 + 0x9a6),uVar15); + iVar9 = CONCAT11(uVar2,local_4d); + uVar18 = (undefined2)(CONCAT13(uVar3,CONCAT12(0x28,iVar9)) >> 0x10); + FUN_1008_093f((*(int *)(iVar9 + 0x51) - *(int *)(iVar9 + 0x4d)) + 1, + (*(int *)(iVar9 + 0x4f) - *(int *)(iVar9 + 0x4b)) + -10, + *(undefined2 *)(iVar9 + 0x4d),*(undefined2 *)(iVar9 + 0x4b),uVar15); + } + else { + iVar9 = ((iVar9 + -5) * 3 + 0x5a) * 0x53; + local_4d = (undefined1)(iVar9 + 0x95b); + uVar2 = (undefined1)((uint)(iVar9 + 0x95b) >> 8); + uVar3 = 0x10; + FUN_1008_08bb((*(int *)(iVar9 + 0x9ac) - *(int *)(iVar9 + 0x9a8)) + 1, + (*(int *)(iVar9 + 0x9aa) - *(int *)(iVar9 + 0x9a6)) + -10, + *(undefined2 *)(iVar9 + 0x9a8),*(undefined2 *)(iVar9 + 0x9a6),uVar15); + iVar9 = CONCAT11(uVar2,local_4d); + uVar18 = (undefined2)(CONCAT13(uVar3,CONCAT12(0x28,iVar9)) >> 0x10); + FUN_1008_093f((*(int *)(iVar9 + 0x51) - *(int *)(iVar9 + 0x4d)) + 1, + (*(int *)(iVar9 + 0x4f) - *(int *)(iVar9 + 0x4b)) + -10, + *(undefined2 *)(iVar9 + 0x4d),*(undefined2 *)(iVar9 + 0x4b),uVar15); + } + uVar18 = *(undefined2 *)(iVar12 + 4); + RELEASEDC(0x1008,uVar15); + } + iVar9 = 4; + iVar11 = 0; + FUN_1020_08e6(uVar18,uVar8); + if (iVar9 == 0 && iVar11 == 0) { + uVar15 = GETDC(0x1020,*(undefined2 *)(iVar12 + 4)); + FUN_1020_08e6(); + uVar16 = 0x1020; + iVar9 = FUN_1020_08e6(); + if (iVar9 == 0) { + FUN_1008_0837(9,9,0xd1,0x96,uVar15); + FUN_1008_093f(9,9,0xd1,0x96,uVar15); + FUN_1008_08bb(9,9,0xe0,0xc0,uVar15); + uVar16 = 0x1008; + FUN_1008_093f(9,9,0xe0,0xc0,uVar15); + } + else if (iVar9 == 1) { + FUN_1008_0837(9,9,0xd6,0xa4,uVar15); + FUN_1008_093f(9,9,0xd6,0xa4,uVar15); + FUN_1008_08bb(9,9,0xd1,0x96,uVar15); + uVar16 = 0x1008; + FUN_1008_093f(9,9,0xd1,0x96,uVar15); + } + else if (iVar9 == 2) { + FUN_1008_0837(9,9,0xdb,0xb2,uVar15); + FUN_1008_093f(9,9,0xdb,0xb2,uVar15); + FUN_1008_08bb(9,9,0xd6,0xa4,uVar15); + uVar16 = 0x1008; + FUN_1008_093f(9,9,0xd6,0xa4,uVar15); + } + else if (iVar9 == 3) { + FUN_1008_0837(9,9,0xe0,0xc0,uVar15); + FUN_1008_093f(9,9,0xe0,0xc0,uVar15); + FUN_1008_08bb(9,9,0xdb,0xb2,uVar15); + uVar16 = 0x1008; + FUN_1008_093f(9,9,0xdb,0xb2,uVar15); + } + RELEASEDC(uVar16,uVar15); + } + iVar9 = 8; + iVar11 = 0; + FUN_1020_08e6(uVar18,uVar8); + if (iVar9 == 0 && iVar11 == 0) { + uVar8 = GETDC(0x1020,*(undefined2 *)(iVar12 + 4)); + FUN_1020_08e6(); + iVar9 = FUN_1020_08e6(); + if (iVar9 < 10) { + FUN_1008_0dbd(iVar9,uVar8); + } + else { + FUN_1008_0dbd(0x12 - iVar9,uVar8); + } + RELEASEDC(0x1008,uVar8); + } + iVar9 = 6; + iVar11 = 0; + unaff_CS = 0x1020; + FUN_1020_08e6(); + if (iVar9 == 0 && iVar11 == 0) { + bVar14 = 0xfffe < DAT_1028_087a; + DAT_1028_087a = DAT_1028_087a + 1; + DAT_1028_087c = DAT_1028_087c + (uint)bVar14; + uVar4 = GETDC(0x1020,*(undefined2 *)(iVar12 + 4)); + uVar5 = CREATECOMPATIBLEDC(0x1228,uVar4); + uVar6 = CREATECOMPATIBLEDC(0x1228,uVar4); + uVar7 = CREATECOMPATIBLEBITMAP(0x1228,0x1e,0x11c); + uVar2 = SELECTOBJECT(0x1228,DAT_1028_085f); + uVar16 = uVar6; + uVar3 = SELECTOBJECT(0x1228,uVar7); + uVar15 = uVar6; + BITBLT(0x1228,0x20,0xcc,0x115,0x1d9,uVar5,0x1e,100,0,0); + uVar18 = uVar6; + BITBLT(0x1228,0x20,0xcc,0xe9,0x1d8,uVar5,0x1e,0x89,0,100); + uVar8 = uVar5; + SELECTOBJECT(0x1228,DAT_1028_0861); + iVar9 = 0x31; + iVar11 = 0; + FUN_1020_08e6(uVar8,uVar18,uVar15,uVar16); + if ((iVar11 < 1) && ((iVar11 < 0 || (iVar9 == 0)))) { +LAB_1000_fabd: + uVar16 = 0; + uVar15 = 0; + FUN_1020_08e6(0,0,uVar6); + iVar9 = FUN_1020_08a9(); + iVar9 = 0xed - iVar9; + uVar18 = 0x1e; + uVar8 = uVar5; + FUN_1020_08e6(uVar5,0x1e,iVar9); + iVar11 = FUN_1020_08a9(); + BITBLT(0x1020,0xc6,0x88,0,iVar11 + 400,uVar8,uVar18,iVar9,uVar15,uVar16); + FUN_1020_08e6(uVar6); + iVar9 = FUN_1020_08a9(); + iVar9 = 0xed - iVar9; + uVar18 = 0; + FUN_1020_08e6(0,iVar9); + uVar8 = FUN_1020_08a9(); + BITBLT(0x1020,0xc6,0x88,0,0xa0,uVar5,0x1e,uVar8,uVar18,iVar9); + } + else { + uVar10 = 0x31; + iVar9 = 0; + FUN_1020_08e6(uVar8,uVar18,uVar15); + if ((-1 < iVar9) && ((0 < iVar9 || (0x15 < uVar10)))) goto LAB_1000_fabd; + uVar17 = 0; + uVar16 = 0; + uVar15 = 0xed; + uVar18 = 0x1e; + uVar8 = uVar5; + FUN_1020_08e6(uVar5,0x1e,0xed,0,0,uVar6); + iVar9 = FUN_1020_08a9(); + BITBLT(0x1020,0xc6,0x88,0,iVar9 + 400,uVar8,uVar18,uVar15,uVar16,uVar17); + } + uVar18 = uVar4; + BITBLT(0x1228,0x20,0xcc,0,0,uVar6,0x1e,0xed,0xe9,0x174); + uVar8 = uVar5; + SELECTOBJECT(0x28,uVar2); + uVar2 = (undefined1)uVar6; + SELECTOBJECT(0x28,uVar3); + DELETEOBJECT(0x28,(char)uVar7,uVar2,uVar8,uVar18); + DELETEDC(0x1228,(char)uVar5); + DELETEDC(0x1228,uVar6); + unaff_CS = 0x1228; + RELEASEDC(0x1228,uVar4); + } + } + if ((DAT_1028_07c8 != '\0') && (*(char *)(iVar12 + 0xbdd) == '\0')) { + *(undefined1 *)(iVar12 + 0xbdf) = 1; + if ((DAT_1028_0853 < 0) || ((DAT_1028_0853 < 1 && (DAT_1028_0851 < 0x119)))) { + if ((DAT_1028_0853 == 0) && (DAT_1028_0851 == 1)) { + for (local_30 = 0x81; *(undefined2 *)(local_30 * 0x53 + 0x99e) = 0, local_30 != 0x85; + local_30 = local_30 + 1) { + } + } + bVar14 = 0xfffe < DAT_1028_0851; + DAT_1028_0851 = DAT_1028_0851 + 1; + DAT_1028_0853 = DAT_1028_0853 + (uint)bVar14; + FUN_1000_7440(&stack0xfffe); + } + else { + DAT_1028_07c8 = '\0'; + *(undefined1 *)(iVar12 + 0xbdf) = 0; + DAT_1028_0851 = 0; + DAT_1028_0853 = 0; + uVar8 = GETDC(unaff_CS,*(undefined2 *)(iVar12 + 4)); + FUN_1008_08bb(0x46,0x44,0x29,0x57,uVar8); + FUN_1008_093f(0x46,0x44,0x29,0x57,uVar8); + RELEASEDC(0x1008,uVar8); + for (local_30 = 0xf; + *(undefined1 *)(iVar12 + (uint)DAT_1028_07d1 * 0x14 + local_30 + 0x467) = 0, + local_30 != 0x13; local_30 = local_30 + 1) { + } + } + } + if (*(int *)((uint)DAT_1028_07d0 * 2 + 0x81f) == -1) { + FUN_1000_a72c(&stack0xfffe); + FUN_1000_acc2(&stack0xfffe); + FUN_1000_a604(&stack0xfffe); + FUN_1000_9e85(&stack0xfffe); + uVar8 = GETDC(0x1000,*(undefined2 *)(iVar12 + 4)); + FUN_1008_08bb(0x14,0x94,0xf3,0x54,uVar8); + FUN_1008_093f(0x14,0x94,0xf3,0x54,uVar8); + RELEASEDC(0x1008,uVar8); + DAT_1028_0876 = 0; + DAT_1028_0878 = 0; + } +LAB_1000_fd59: + FUN_1000_99f0(&stack0xfffe); + FUN_1008_00e2(); + *(undefined1 *)(iVar12 + 0x51) = 0; + if (*(int *)(iVar12 + 0x5e) != 0) { + *(int *)(iVar12 + 0x5e) = *(int *)(iVar12 + 0x5e) + -1; + } + return; +} + + +/* ===== 1000:fd85 ne_program_entry ===== */ + +/* WARNING: Control flow encountered bad instruction data */ + +void ne_program_entry(void) + +{ + undefined2 extraout_DX; + undefined2 uVar1; + undefined2 uVar2; + + INITTASK(); + uVar1 = extraout_DX; + FUN_1020_0002(); + FUN_1008_298a(); + FUN_1008_2554(); + FUN_1010_0472(); + FUN_1008_15c2(); + FUN_1008_11b8(); + FUN_1008_0f27(); + uVar2 = 0x1228; + DAT_1028_07bf = GETVERSION(); + DAT_1028_07c1 = uVar1; + if ((byte)DAT_1028_07bf < 3) { +LAB_1000_fdf4: + (*DAT_1028_0666)(0x1228,0x10,0x3c8,0x1028,0x396,0x1028,0); + } + else { + if ((byte)DAT_1028_07bf == 3) { + if ((byte)(DAT_1028_07bf >> 8) < 10) goto LAB_1000_fdf4; + } + uVar2 = 0x1018; + FUN_1018_1a61(0x748,0x1028,0x24,0x3e1,0x1028); + (*(code *)*(undefined2 *)(DAT_1028_0748 + 0x1c))(0x1018,0x748,0x1028); + (*(code *)*(undefined2 *)(DAT_1028_0748 + 8))(0x1018,0x748,0x1028,0); + } + FUN_1020_0061(uVar2); + /* WARNING: Bad instruction - Truncating control flow here */ + halt_baddata(); +} + + +/* ===== 1008:0002 FUN_1008_0002 ===== */ + +void __stdcall16far FUN_1008_0002(undefined2 param_1) + +{ + if ((DAT_1028_07c6 == '\0') && (DAT_1028_43f2 != '\0')) { + FUN_1008_1131(param_1); + } + return; +} + + +/* ===== 1008:0023 FUN_1008_0023 ===== */ + +void __stdcall16far FUN_1008_0023(undefined2 param_1) + +{ + undefined2 *puVar1; + undefined2 uVar2; + undefined2 uVar3; + undefined2 uVar4; + undefined2 *puVar5; + undefined2 uVar6; + int local_8; + + puVar5 = (undefined2 *)FUN_1020_012d(0x404); + uVar6 = (undefined2)((ulong)puVar5 >> 0x10); + puVar1 = (undefined2 *)puVar5; + if (puVar5 != (undefined2 *)0x0) { + *puVar5 = 0x300; + puVar1[1] = 0x100; + local_8 = 0; + while( true ) { + *(undefined1 *)(puVar1 + local_8 * 2 + 2) = 0; + *(undefined1 *)((int)puVar1 + local_8 * 4 + 5) = 0; + *(undefined1 *)(puVar1 + local_8 * 2 + 3) = 0; + *(undefined1 *)((int)puVar1 + local_8 * 4 + 7) = 4; + if (local_8 == 0xff) break; + local_8 = local_8 + 1; + } + uVar2 = GETDC(0x1020,param_1); + uVar4 = uVar2; + uVar3 = CREATEPALETTE(0x1228,puVar1); + uVar3 = SELECTPALETTE(0x1228,0,uVar3); + REALIZEPALETTE(0x1228,uVar2,uVar6,uVar4); + uVar6 = uVar2; + uVar4 = SELECTPALETTE(0x1228,1,uVar3); + DELETEOBJECT(0x1228,uVar4,uVar6); + RELEASEDC(0x1228,uVar2); + FUN_1020_0147(0x404,puVar5); + } + return; +} + + +/* ===== 1008:00e2 FUN_1008_00e2 ===== */ + +void __cdecl16far FUN_1008_00e2(void) + +{ + int iVar1; + undefined2 unaff_CS; + undefined2 unaff_SS; + undefined1 local_14 [2]; + int local_12; + + do { + iVar1 = PEEKMESSAGE(unaff_CS,1,0x32,0,0,local_14,unaff_SS); + if ((((iVar1 != 0) && (local_12 != 0x580)) && (local_12 != 0x100)) && (local_12 != 0x101)) { + TRANSLATEMESSAGE(0x1228,local_14); + DISPATCHMESSAGE(0x1228,local_14); + } + unaff_CS = 0x1228; + } while (iVar1 != 0); + return; +} + + +/* ===== 1008:0138 FUN_1008_0138 ===== */ + +void __stdcall16far +FUN_1008_0138(undefined2 param_1,undefined2 param_2,undefined2 param_3,undefined2 param_4, + undefined2 param_5,int param_6,undefined2 param_7,int param_8,undefined2 param_9, + undefined2 param_10,undefined2 param_11,undefined2 param_12,undefined2 param_13, + undefined2 param_14,undefined2 param_15,undefined2 param_16,undefined2 param_17, + undefined2 param_18,undefined2 param_19,undefined2 param_20,undefined2 param_21, + undefined2 param_22,undefined2 param_23,undefined2 param_24,undefined2 param_25, + uint param_26,int param_27,uint param_28,int param_29,uint param_30,int param_31, + uint param_32,int param_33,uint param_34,int param_35,char param_36,undefined1 param_37 + ,char param_38,undefined1 param_39,uint param_40) + +{ + uint uVar1; + undefined2 uVar2; + uint uVar3; + int iVar4; + int iVar5; + undefined2 uVar6; + int iVar7; + bool bVar8; + uint local_a; + int local_8; + uint local_6; + int local_4; + + if (param_40 < 0xb0) { + iVar7 = param_40 * 0x53; + *(undefined1 *)(iVar7 + 0x95b) = param_38; + if (param_26 == 0 && param_27 == 0) { + param_38 = '\x02'; + } + else { + param_38 = '\x01'; + } + if (param_36 == '\x01') { + bVar8 = CARRY2(DAT_1028_0849,param_34); + param_34 = DAT_1028_0849 + param_34; + param_35 = DAT_1028_084b + param_35 + (uint)bVar8; + bVar8 = CARRY2(DAT_1028_084d,param_32); + param_32 = DAT_1028_084d + param_32; + param_33 = DAT_1028_084f + param_33 + (uint)bVar8; + local_6 = param_34 + param_30; + local_4 = param_35 + param_31 + (uint)CARRY2(param_34,param_30); + local_a = param_32 + param_28; + local_8 = param_33 + param_29 + (uint)CARRY2(param_32,param_28); + } + else { + bVar8 = 0x13 < param_32; + param_32 = param_32 - 0x14; + param_33 = param_33 + -1 + (uint)bVar8; + local_6 = param_30; + local_4 = param_31; + local_a = param_28 - 0x14; + local_8 = param_29 + -1 + (uint)(0x13 < param_28); + } + if (((local_4 < 1) && ((local_4 < 0 || (local_6 == 0)))) || + ((local_4 <= param_35 && ((local_4 < param_35 || (local_6 <= param_34)))))) { + if (((local_4 < 1) && ((local_4 < 0 || (local_6 == 0)))) || + ((param_35 <= local_4 && ((param_35 < local_4 || (param_34 <= local_6)))))) { + iVar4 = (param_35 - param_27) - (uint)(param_34 < param_26); + uVar2 = FUN_1020_08a9(); + *(undefined2 *)(iVar7 + 0x95d) = uVar2; + *(int *)(iVar7 + 0x95f) = iVar4; + iVar4 = param_35 + param_27 + (uint)CARRY2(param_34,param_26); + uVar2 = FUN_1020_08a9(); + *(undefined2 *)(iVar7 + 0x965) = uVar2; + *(int *)(iVar7 + 0x967) = iVar4; + } + else { + iVar4 = local_4; + uVar2 = FUN_1020_08a9(); + *(undefined2 *)(iVar7 + 0x95d) = uVar2; + *(int *)(iVar7 + 0x95f) = iVar4; + iVar4 = param_35; + uVar2 = FUN_1020_08a9(); + *(undefined2 *)(iVar7 + 0x965) = uVar2; + *(int *)(iVar7 + 0x967) = iVar4; + } + } + else { + iVar4 = param_35; + uVar2 = FUN_1020_08a9(); + *(undefined2 *)(iVar7 + 0x95d) = uVar2; + *(int *)(iVar7 + 0x95f) = iVar4; + iVar4 = local_4; + uVar2 = FUN_1020_08a9(); + *(undefined2 *)(iVar7 + 0x965) = uVar2; + *(int *)(iVar7 + 0x967) = iVar4; + } + if (((local_8 < 1) && ((local_8 < 0 || (local_a == 0)))) || + ((local_8 <= param_33 && ((local_8 < param_33 || (local_a <= param_32)))))) { + if (((local_8 < 1) && ((local_8 < 0 || (local_a == 0)))) || + ((param_33 <= local_8 && ((param_33 < local_8 || (param_32 <= local_a)))))) { + iVar4 = (param_33 - param_27) - (uint)(param_32 < param_26); + uVar2 = FUN_1020_08a9(); + *(undefined2 *)(iVar7 + 0x961) = uVar2; + *(int *)(iVar7 + 0x963) = iVar4; + iVar4 = param_33 + param_27 + (uint)CARRY2(param_32,param_26); + uVar2 = FUN_1020_08a9(); + *(undefined2 *)(iVar7 + 0x969) = uVar2; + *(int *)(iVar7 + 0x96b) = iVar4; + } + else { + iVar4 = local_8; + uVar2 = FUN_1020_08a9(); + *(undefined2 *)(iVar7 + 0x961) = uVar2; + *(int *)(iVar7 + 0x963) = iVar4; + iVar4 = param_33; + uVar2 = FUN_1020_08a9(); + *(undefined2 *)(iVar7 + 0x969) = uVar2; + *(int *)(iVar7 + 0x96b) = iVar4; + } + } + else { + iVar4 = param_33; + uVar2 = FUN_1020_08a9(); + *(undefined2 *)(iVar7 + 0x961) = uVar2; + *(int *)(iVar7 + 0x963) = iVar4; + iVar4 = local_8; + uVar2 = FUN_1020_08a9(); + *(undefined2 *)(iVar7 + 0x969) = uVar2; + *(int *)(iVar7 + 0x96b) = iVar4; + } + if (param_38 == '\x01') { + iVar4 = param_35; + uVar2 = FUN_1020_08a9(); + *(undefined2 *)(iVar7 + 0x96d) = uVar2; + *(int *)(iVar7 + 0x96f) = iVar4; + iVar4 = param_33; + uVar2 = FUN_1020_08a9(); + *(undefined2 *)(iVar7 + 0x971) = uVar2; + *(int *)(iVar7 + 0x973) = iVar4; + *(undefined2 *)(iVar7 + 0x975) = 0; + *(undefined2 *)(iVar7 + 0x977) = 0; + *(undefined2 *)(iVar7 + 0x979) = 0; + *(undefined2 *)(iVar7 + 0x97b) = 0; + uVar6 = 0; + FUN_1020_08a9(); + uVar2 = FUN_1020_100b(); + *(undefined2 *)(iVar7 + 0x97d) = uVar2; + *(undefined2 *)(iVar7 + 0x97f) = uVar6; + *(int *)(iVar7 + 0x981) = param_27; + if ((*(int *)(iVar7 + 0x95f) < *(int *)(iVar7 + 0x96f)) || + ((*(int *)(iVar7 + 0x95f) <= *(int *)(iVar7 + 0x96f) && + (*(uint *)(iVar7 + 0x95d) < *(uint *)(iVar7 + 0x96d))))) { + uVar1 = *(uint *)(iVar7 + 0x95d); + iVar4 = *(int *)(iVar7 + 0x95f); + *(int *)(iVar7 + 0x95d) = uVar1 + 0xec78; + *(int *)(iVar7 + 0x95f) = iVar4 - (uint)(uVar1 < 5000); + } + else { + iVar5 = param_8; + uVar3 = FUN_1020_08a9(); + uVar1 = *(uint *)(iVar7 + 0x95d); + iVar4 = *(int *)(iVar7 + 0x95f); + *(int *)(iVar7 + 0x95d) = uVar3 + *(uint *)(iVar7 + 0x95d); + *(int *)(iVar7 + 0x95f) = iVar5 + iVar4 + (uint)CARRY2(uVar3,uVar1); + } + if ((*(int *)(iVar7 + 0x963) < *(int *)(iVar7 + 0x973)) || + ((*(int *)(iVar7 + 0x963) <= *(int *)(iVar7 + 0x973) && + (*(uint *)(iVar7 + 0x961) < *(uint *)(iVar7 + 0x971))))) { + uVar1 = *(uint *)(iVar7 + 0x961); + iVar4 = *(int *)(iVar7 + 0x963); + *(int *)(iVar7 + 0x961) = uVar1 + 0xec78; + *(int *)(iVar7 + 0x963) = iVar4 - (uint)(uVar1 < 5000); + } + else { + iVar5 = param_6; + uVar3 = FUN_1020_08a9(); + uVar1 = *(uint *)(iVar7 + 0x961); + iVar4 = *(int *)(iVar7 + 0x963); + *(int *)(iVar7 + 0x961) = uVar3 + *(uint *)(iVar7 + 0x961); + *(int *)(iVar7 + 0x963) = iVar5 + iVar4 + (uint)CARRY2(uVar3,uVar1); + } + if ((*(int *)(iVar7 + 0x96f) < *(int *)(iVar7 + 0x967)) || + ((*(int *)(iVar7 + 0x96f) <= *(int *)(iVar7 + 0x967) && + (*(uint *)(iVar7 + 0x96d) < *(uint *)(iVar7 + 0x965))))) { + uVar1 = *(uint *)(iVar7 + 0x965); + iVar4 = *(int *)(iVar7 + 0x967); + *(int *)(iVar7 + 0x965) = uVar1 + 5000; + *(int *)(iVar7 + 0x967) = iVar4 + (uint)(0xec77 < uVar1); + } + else { + uVar3 = FUN_1020_08a9(); + uVar1 = *(uint *)(iVar7 + 0x965); + iVar4 = *(int *)(iVar7 + 0x967); + *(int *)(iVar7 + 0x965) = uVar3 + *(uint *)(iVar7 + 0x965); + *(int *)(iVar7 + 0x967) = param_8 + iVar4 + (uint)CARRY2(uVar3,uVar1); + } + if ((*(int *)(iVar7 + 0x973) < *(int *)(iVar7 + 0x96b)) || + ((*(int *)(iVar7 + 0x973) <= *(int *)(iVar7 + 0x96b) && + (*(uint *)(iVar7 + 0x971) < *(uint *)(iVar7 + 0x969))))) { + uVar1 = *(uint *)(iVar7 + 0x969); + iVar4 = *(int *)(iVar7 + 0x96b); + *(int *)(iVar7 + 0x969) = uVar1 + 5000; + *(int *)(iVar7 + 0x96b) = iVar4 + (uint)(0xec77 < uVar1); + } + else { + uVar3 = FUN_1020_08a9(); + uVar1 = *(uint *)(iVar7 + 0x969); + iVar4 = *(int *)(iVar7 + 0x96b); + *(int *)(iVar7 + 0x969) = uVar3 + *(uint *)(iVar7 + 0x969); + *(int *)(iVar7 + 0x96b) = param_6 + iVar4 + (uint)CARRY2(uVar3,uVar1); + } + DAT_1028_0849 = param_34; + DAT_1028_084b = param_35; + DAT_1028_084d = param_32; + DAT_1028_084f = param_33; + } + else if (param_38 == '\x02') { + uVar1 = *(uint *)(iVar7 + 0x95d); + iVar4 = *(int *)(iVar7 + 0x95f); + *(int *)(iVar7 + 0x95d) = uVar1 + 0xec78; + *(int *)(iVar7 + 0x95f) = iVar4 - (uint)(uVar1 < 5000); + uVar1 = *(uint *)(iVar7 + 0x965); + iVar4 = *(int *)(iVar7 + 0x967); + *(int *)(iVar7 + 0x965) = uVar1 + 5000; + *(int *)(iVar7 + 0x967) = iVar4 + (uint)(0xec77 < uVar1); + uVar1 = *(uint *)(iVar7 + 0x961); + iVar4 = *(int *)(iVar7 + 0x963); + *(int *)(iVar7 + 0x961) = uVar1 + 0xec78; + *(int *)(iVar7 + 0x963) = iVar4 - (uint)(uVar1 < 5000); + uVar1 = *(uint *)(iVar7 + 0x969); + iVar4 = *(int *)(iVar7 + 0x96b); + *(int *)(iVar7 + 0x969) = uVar1 + 5000; + *(int *)(iVar7 + 0x96b) = iVar4 + (uint)(0xec77 < uVar1); + uVar2 = FUN_1020_08a9(); + *(undefined2 *)(iVar7 + 0x96d) = uVar2; + *(int *)(iVar7 + 0x96f) = param_35; + uVar2 = FUN_1020_08a9(); + *(undefined2 *)(iVar7 + 0x971) = uVar2; + *(int *)(iVar7 + 0x973) = param_33; + iVar4 = local_4; + uVar2 = FUN_1020_08a9(); + *(undefined2 *)(iVar7 + 0x975) = uVar2; + *(int *)(iVar7 + 0x977) = iVar4; + iVar4 = local_8; + uVar2 = FUN_1020_08a9(); + *(undefined2 *)(iVar7 + 0x979) = uVar2; + *(int *)(iVar7 + 0x97b) = iVar4; + DAT_1028_0849 = local_6; + DAT_1028_084b = local_4; + DAT_1028_084d = local_a; + DAT_1028_084f = local_8; + *(undefined2 *)(iVar7 + 0x97d) = 0; + *(undefined2 *)(iVar7 + 0x97f) = 0; + *(undefined2 *)(iVar7 + 0x981) = 0; + } + *(undefined2 *)(iVar7 + 0x983) = param_23; + *(undefined2 *)(iVar7 + 0x985) = param_24; + *(undefined2 *)(iVar7 + 0x987) = param_25; + *(undefined2 *)(iVar7 + 0x989) = param_20; + *(undefined2 *)(iVar7 + 0x98b) = param_21; + *(undefined2 *)(iVar7 + 0x98d) = param_22; + *(undefined1 *)(iVar7 + 0x98f) = param_39; + *(undefined2 *)(iVar7 + 0x990) = param_17; + *(undefined2 *)(iVar7 + 0x992) = param_18; + *(undefined2 *)(iVar7 + 0x994) = param_19; + *(undefined2 *)(iVar7 + 0x996) = param_14; + *(undefined2 *)(iVar7 + 0x998) = param_15; + *(undefined2 *)(iVar7 + 0x99a) = param_16; + *(undefined1 *)(iVar7 + 0x95c) = param_37; + *(undefined2 *)(iVar7 + 0x99c) = param_13; + *(undefined2 *)(iVar7 + 0x99e) = param_12; + *(undefined2 *)(iVar7 + 0x9a0) = param_10; + *(undefined2 *)(iVar7 + 0x9a2) = param_11; + *(undefined2 *)(iVar7 + 0x9a4) = param_9; + *(undefined2 *)(iVar7 + 0x9a6) = param_4; + *(undefined2 *)(iVar7 + 0x9a8) = param_3; + *(undefined2 *)(iVar7 + 0x9aa) = param_2; + *(undefined2 *)(iVar7 + 0x9ac) = param_1; + } + return; +} + + +/* ===== 1008:0787 FUN_1008_0787 ===== */ + +void __stdcall16far +FUN_1008_0787(undefined2 param_1,undefined2 param_2,undefined2 param_3,undefined2 param_4, + int param_5) + +{ + param_5 = param_5 * 8; + *(undefined2 *)(param_5 + 0x4263) = param_4; + *(undefined2 *)(param_5 + 0x4265) = param_3; + *(undefined2 *)(param_5 + 16999) = param_2; + *(undefined2 *)(param_5 + 0x4269) = param_1; + return; +} + + +/* ===== 1008:07b6 FUN_1008_07b6 ===== */ + +void __stdcall16far +FUN_1008_07b6(undefined2 param_1,undefined2 param_2,undefined2 param_3,undefined2 param_4, + undefined2 param_5,undefined2 param_6) + +{ + undefined2 uVar1; + undefined2 uVar2; + undefined2 uVar3; + undefined2 uVar4; + undefined2 uVar5; + undefined2 uVar6; + undefined2 uVar7; + + uVar4 = param_6; + uVar1 = CREATECOMPATIBLEDC(); + uVar2 = CREATECOMPATIBLEDC(0x1228,param_6,uVar4); + uVar3 = SELECTOBJECT(0x1228,DAT_1028_085b); + uVar7 = uVar2; + uVar4 = SELECTOBJECT(0x1228,param_1); + uVar6 = uVar1; + BITBLT(0x1228,0x20,0xcc,0,0,uVar2,param_2,param_3,param_4,param_5); + uVar5 = uVar2; + SELECTOBJECT(0x1228,uVar4); + uVar4 = uVar1; + SELECTOBJECT(0x1228,uVar3); + DELETEDC(0x1228,uVar2,uVar4,uVar5,uVar6,uVar7); + DELETEDC(0x1228,uVar1); + return; +} + + +/* ===== 1008:0837 FUN_1008_0837 ===== */ + +void __stdcall16far +FUN_1008_0837(undefined2 param_1,undefined2 param_2,undefined2 param_3,undefined2 param_4, + undefined2 param_5) + +{ + undefined2 uVar1; + undefined2 uVar2; + undefined2 uVar3; + undefined2 uVar4; + undefined2 uVar5; + undefined2 uVar6; + undefined2 uVar7; + + uVar4 = param_5; + uVar1 = CREATECOMPATIBLEDC(); + uVar2 = CREATECOMPATIBLEDC(0x1228,param_5,uVar4); + uVar3 = SELECTOBJECT(0x1228,DAT_1028_085b); + uVar7 = uVar2; + uVar4 = SELECTOBJECT(0x1228,DAT_1028_085f); + uVar6 = uVar1; + BITBLT(0x1228,0x20,0xcc,param_3,param_4,uVar2,param_1,param_2,param_3,param_4); + uVar5 = uVar2; + SELECTOBJECT(0x1228,uVar4); + uVar4 = uVar1; + SELECTOBJECT(0x1228,uVar3); + DELETEDC(0x1228,uVar2,uVar4,uVar5,uVar6,uVar7); + DELETEDC(0x1228,uVar1); + return; +} + + +/* ===== 1008:08bb FUN_1008_08bb ===== */ + +void __stdcall16far +FUN_1008_08bb(undefined2 param_1,undefined2 param_2,undefined2 param_3,undefined2 param_4, + undefined2 param_5) + +{ + undefined2 uVar1; + undefined2 uVar2; + undefined2 uVar3; + undefined2 uVar4; + undefined2 uVar5; + undefined2 uVar6; + undefined2 uVar7; + + uVar4 = param_5; + uVar1 = CREATECOMPATIBLEDC(); + uVar2 = CREATECOMPATIBLEDC(0x1228,param_5,uVar4); + uVar3 = SELECTOBJECT(0x1228,DAT_1028_085b); + uVar7 = uVar2; + uVar4 = SELECTOBJECT(0x1228,DAT_1028_085d); + uVar6 = uVar1; + BITBLT(0x1228,0x20,0xcc,param_3,param_4,uVar2,param_1,param_2,param_3,param_4); + uVar5 = uVar2; + SELECTOBJECT(0x1228,uVar4); + uVar4 = uVar1; + SELECTOBJECT(0x1228,uVar3); + DELETEDC(0x1228,uVar2,uVar4,uVar5,uVar6,uVar7); + DELETEDC(0x1228,uVar1); + return; +} + + +/* ===== 1008:093f FUN_1008_093f ===== */ + +void __stdcall16far +FUN_1008_093f(undefined2 param_1,undefined2 param_2,undefined2 param_3,undefined2 param_4, + undefined2 param_5) + +{ + undefined2 uVar1; + undefined2 uVar2; + undefined2 uVar3; + undefined2 uVar4; + undefined2 uVar5; + + uVar5 = param_5; + uVar1 = CREATECOMPATIBLEDC(); + uVar4 = uVar1; + uVar2 = SELECTOBJECT(0x1228,DAT_1028_085b); + BITBLT(0x1228,0x20,0xcc,param_3,param_4,uVar1,param_1,param_2,param_3,param_4); + uVar3 = uVar1; + SELECTOBJECT(0x1228,uVar2); + DELETEDC(0x1228,uVar1,uVar3,param_5,uVar4,uVar5); + return; +} + + +/* ===== 1008:0996 FUN_1008_0996 ===== */ + +void __stdcall16far FUN_1008_0996(undefined2 param_1,uint param_2,int param_3) + +{ + undefined2 uVar1; + undefined2 uVar2; + undefined2 uVar3; + undefined2 uVar4; + undefined2 uVar5; + int iVar6; + byte bVar7; + undefined2 uVar8; + undefined2 uVar9; + undefined2 uVar10; + undefined2 uVar11; + undefined2 local_32; + undefined2 local_1c; + undefined1 local_4; + + uVar2 = param_1; + uVar1 = CREATECOMPATIBLEDC(); + uVar2 = CREATECOMPATIBLEDC(0x1228,param_1,uVar2); + uVar3 = CREATECOMPATIBLEBITMAP(0x1228,0x28,0x96); + if (param_2 == 1) { + local_32 = 0x129; + } + else if (param_2 == 2) { + local_32 = 0x155; + } + else if (param_2 == 3) { + local_32 = 0x181; + } + else if (param_2 == 4) { + local_32 = 0x1ad; + } + else { + local_32 = 0xfd; + } + if ((param_3 < 0) || + ((((param_3 < 1 && (param_2 == 0)) || (0 < param_3)) || ((-1 < param_3 && (4 < param_2)))))) { + local_1c = param_3; + } + else { + local_1c = *(int *)(param_2 * 4 + 0x980); + } + uVar11 = uVar1; + uVar4 = SELECTOBJECT(0x1228,DAT_1028_085b); + uVar10 = uVar2; + uVar5 = SELECTOBJECT(0x1228,uVar3); + uVar9 = uVar2; + BITBLT(0x1228,0x20,0xcc,local_32 + -0x14,0x1de,uVar1,0x28,0x82,0,0); + local_4 = 0; + while( true ) { + bVar7 = 10; + FUN_1020_08e6(uVar9,uVar10,uVar11); + uVar8 = 0x1020; + iVar6 = FUN_1020_08e6(); + if ((((bVar7 != 0) || (0 < local_1c)) || ((-1 < local_1c && (iVar6 != 0)))) || (local_4 == 0)) { + SELECTOBJECT(0x1020,DAT_1028_0861); + uVar8 = 0x1228; + BITBLT(0x1228,0xc6,0x88,0,(uint)bVar7 << 4,uVar1,0x1c,0x10,0,(7 - (uint)local_4) * 0x10); + } + if (local_4 == 7) break; + local_4 = local_4 + 1; + } + BITBLT(uVar8,0x20,0xcc,0,0,uVar2,0x28,0x82,local_32 + -0x14,0x1de); + uVar10 = uVar1; + SELECTOBJECT(0x1228,uVar4); + uVar9 = uVar2; + SELECTOBJECT(0x1228,uVar5); + DELETEOBJECT(0x1228,uVar3,uVar9,uVar10,param_1); + DELETEDC(0x1228,uVar1); + DELETEDC(0x1228,uVar2); + return; +} + + +/* ===== 1008:0b9e FUN_1008_0b9e ===== */ + +void __stdcall16far FUN_1008_0b9e(byte param_1,undefined2 param_2) + +{ + int iVar1; + int local_6; + int local_4; + + if ((((param_1 == DAT_1028_07d1) || (DAT_1028_086b == 99)) && (param_1 != 0)) && (param_1 < 5)) { + iVar1 = *(int *)((uint)param_1 * 4 + 0x980); + if ((iVar1 < 0x14) && ((iVar1 < 0x13 || (*(uint *)((uint)param_1 * 4 + 0x97e) < 0xd621)))) { + iVar1 = *(int *)((uint)param_1 * 4 + 0x980); + if ((iVar1 < 10) && ((iVar1 < 9 || (*(uint *)((uint)param_1 * 4 + 0x97e) < 0xeb11)))) { + iVar1 = *(int *)((uint)param_1 * 4 + 0x980); + if ((iVar1 < 3) && ((iVar1 < 2 || (*(uint *)((uint)param_1 * 4 + 0x97e) < 0x22e1)))) { + iVar1 = *(int *)((uint)param_1 * 4 + 0x980); + if ((iVar1 < 1) && ((iVar1 < 0 || (*(uint *)((uint)param_1 * 4 + 0x97e) < 0x7d1)))) { + local_4 = 0; + } + else { + local_4 = 1; + } + } + else { + local_4 = 2; + } + } + else { + local_4 = 3; + } + } + else { + local_4 = 4; + } + if (local_4 != DAT_1028_086b) { + if (local_4 == 0) { + FUN_1008_0837(0x8e,0x92,0x45,0x17c,param_2); + } + else { + FUN_1008_07b6(*(undefined2 *)(local_4 * 2 + 0x4319),0x8e,0x92,0x45,0x17c,param_2); + } + FUN_1008_093f(0x8e,0x92,0x45,0x17c,param_2); + local_6 = 0; + while( true ) { + if (local_6 == local_4) { + FUN_1008_0837(0xb,0xb,(4 - local_6) * 0x17 + 0x4d,0x220,param_2); + FUN_1008_093f(0xb,0xb,(4 - local_6) * 0x17 + 0x4d,0x220,param_2); + } + else { + FUN_1008_08bb(0xb,0xb,(4 - local_6) * 0x17 + 0x4d,0x220,param_2); + FUN_1008_093f(0xb,0xb,(4 - local_6) * 0x17 + 0x4d,0x220,param_2); + } + if (local_6 == 4) break; + local_6 = local_6 + 1; + } + } + DAT_1028_086b = local_4; + } + else if (param_1 == 0) { + FUN_1008_08bb(0x8e,0x92,0x45,0x17c,param_2); + FUN_1008_093f(0x8e,0x92,0x45,0x17c,param_2); + local_6 = 0; + while( true ) { + FUN_1008_08bb(0xb,0xb,(4 - local_6) * 0x17 + 0x4d,0x220,param_2); + FUN_1008_093f(0xb,0xb,(4 - local_6) * 0x17 + 0x4d,0x220,param_2); + if (local_6 == 4) break; + local_6 = local_6 + 1; + } + DAT_1028_086b = 99; + } + return; +} + + +/* ===== 1008:0dbd FUN_1008_0dbd ===== */ + +void __stdcall16far FUN_1008_0dbd(int param_1,undefined2 param_2) + +{ + if (param_1 == 0) { + FUN_1008_08bb(0x3d,0x44,300,0x7b,param_2); + } + else { + FUN_1008_07b6(((undefined2 *)&DAT_1028_4321)[param_1],0x3d,0x44,300,0x7b,param_2); + } + FUN_1008_093f(0x3d,0x44,300,0x7b,param_2); + return; +} + + +/* ===== 1008:0e08 FUN_1008_0e08 ===== */ + +void __stdcall16far FUN_1008_0e08(char param_1,uint param_2,undefined2 param_3) + +{ + int iVar1; + undefined2 uVar2; + undefined2 uVar3; + undefined2 uVar4; + undefined2 uVar5; + undefined2 uVar6; + undefined2 uVar7; + undefined2 local_16; + + if (param_2 == 0) { + FUN_1008_08bb(0x4a,100,0x2f,0xee,param_3); + FUN_1008_093f(0x4a,100,0x2f,0xee,param_3); + } + else { + uVar3 = param_3; + uVar2 = CREATECOMPATIBLEDC(); + uVar3 = CREATECOMPATIBLEDC(0x1228,param_3,uVar3); + uVar4 = SELECTOBJECT(0x1228,DAT_1028_085b); + uVar5 = SELECTOBJECT(0x1228,DAT_1028_0863); + local_16 = 0; + if (param_1 == '\0') { + local_16 = 0x94; + } + if (9 < param_2) { + local_16 = local_16 + 0x4a; + param_2 = param_2 - 9; + } + iVar1 = (param_2 - 1) * 100; + uVar7 = uVar2; + BITBLT(0x1228,0x20,0xcc,local_16,iVar1,uVar3,0x4a,100,0x2f,0xee); + BITBLT(0x1228,0x20,0xcc,local_16,iVar1,uVar3,0x4a,100,0x2f,0xee); + uVar6 = uVar2; + SELECTOBJECT(0x1228,uVar4); + uVar4 = uVar3; + SELECTOBJECT(0x1228,uVar5); + DELETEDC(0x1228,uVar3,uVar4,uVar6,param_3,uVar7); + DELETEDC(0x1228,uVar2); + } + return; +} + + +/* ===== 1008:0f27 FUN_1008_0f27 ===== */ + +void __cdecl16far FUN_1008_0f27(void) + +{ + return; +} + + +/* ===== 1008:0f2e FUN_1008_0f2e ===== */ + +void __cdecl16far FUN_1008_0f2e(void) + +{ + int iVar1; + ushort arg1; + uint uVar2; + int unaff_BP; + undefined2 unaff_SS; + undefined4 uVar3; + undefined1 *puVar4; + word *pwVar5; + char *arg3; + undefined1 *puVar6; + undefined1 *puVar7; + undefined2 uVar8; + undefined2 uVar9; + undefined1 local_2de [512]; + undefined1 local_de [102]; + undefined1 local_78 [102]; + ushort local_12; + uint local_10; + undefined2 uStack_e; + int local_c; + int local_a; + undefined2 local_8; + undefined2 local_6; + undefined2 uStack_4; + int iStack_2; + + iStack_2 = unaff_BP + 1; + uStack_4 = 0x1028; + DAT_1028_43f2 = 0; + DAT_1028_43f3 = 0; + DAT_1028_43ee = 0; + puVar7 = local_78; + puVar6 = local_2de; + uVar9 = unaff_SS; + uVar8 = unaff_SS; + FUN_1020_082e(); + FUN_1008_2f2f(puVar6,uVar9,puVar7,uVar8); + pwVar5 = code2_embedded_word_0f2c; + puVar4 = (undefined1 *)CONCAT22(unaff_SS,local_2de); + FUN_1020_082e(0); + FUN_1020_0a7d(puVar4,pwVar5); + FUN_1008_2f07(); + FUN_1008_2f4d(0x442,0x1028,local_de,unaff_SS); + uVar9 = 0x1028; + local_c = GETPRIVATEPROFILEINT(0x1008,local_de,unaff_SS,1,0x44f,0x1028,0x446); + if ((local_c != 0) && (DAT_1028_43ee = WAVEOUTGETNUMDEVS(0x1228,uVar9), DAT_1028_43ee != 0)) { + iVar1 = WAVEOUTGETDEVCAPS(); + if (iVar1 == 0) { + if ((DAT_1028_43ea & 4) == 0) { + DAT_1028_43f4 = -1; + } + else { + local_8 = 0; + local_6 = 0; + WAVEOUTGETVOLUME(); + DAT_1028_43f4 = (local_8._1_1_ / 10) * '\n'; + } + local_a = 1; + while( true ) { + if (*(int *)(local_a * 4 + 0x3e6) != 0 || *(int *)(local_a * 4 + 1000) != 0) { + arg3 = (char *)CONCAT22(DAT_1028_06fe,DAT_1028_06fe); + arg1 = FINDRESOURCE(0x455,(char *)(long)(local_a + 2000),arg3); + local_12 = LOADRESOURCE(arg1,(ushort)((ulong)arg3 >> 0x10)); + uVar3 = FUN_1008_15c7(); + uVar9 = (undefined2)((ulong)uVar3 >> 0x10); + *(int *)((undefined1 *)&DAT_1028_43f2 + local_a * 4) = (int)uVar3; + *(undefined2 *)((undefined1 *)&DAT_1028_43f4 + local_a * 4) = uVar9; + uVar2 = LOCKRESOURCE(local_12); + _local_10 = CONCAT22(uVar9,uVar2); + FUN_1020_16a5(*(undefined2 *)(local_a * 4 + 0x3e6), + (int)*(undefined4 *)((undefined1 *)&DAT_1028_43f2 + local_a * 4), + (int)((ulong)*(undefined4 *)((undefined1 *)&DAT_1028_43f2 + local_a * 4) >> + 0x10),uVar2,uVar9); + GLOBALUNLOCK(local_12); + FREERESOURCE(local_12); + } + if (local_a == 0x16) break; + local_a = local_a + 1; + } + DAT_1028_43f2 = 1; + } + else { + DAT_1028_43ee = 0; + } + } + return; +} + + +/* ===== 1008:10e3 FUN_1008_10e3 ===== */ + +void __cdecl16far FUN_1008_10e3(void) + +{ + undefined2 unaff_CS; + int local_6; + + if (DAT_1028_43ee != 0) { + if (DAT_1028_43f3 != '\0') { + SNDPLAYSOUND(unaff_CS,0,0); + } + local_6 = 1; + while( true ) { + FUN_1008_15e7(*(undefined2 *)((undefined1 *)&DAT_1028_43f2 + local_6 * 4), + *(undefined2 *)((undefined1 *)&DAT_1028_43f4 + local_6 * 4)); + if (local_6 == 0x16) break; + local_6 = local_6 + 1; + } + DAT_1028_43f3 = '\0'; + } + return; +} + + +/* ===== 1008:1131 FUN_1008_1131 ===== */ + +undefined2 __stdcall16far FUN_1008_1131(int param_1) + +{ + int iVar1; + undefined2 unaff_CS; + undefined2 uVar2; + undefined2 local_6; + + if (((DAT_1028_43ee != 0) && (DAT_1028_43f2 != '\0')) && + (*(int *)(param_1 * 4 + 0x3e6) != 0 || *(int *)(param_1 * 4 + 1000) != 0)) { + uVar2 = unaff_CS; + if (DAT_1028_43f3 != '\0') { + uVar2 = 0x1228; + SNDPLAYSOUND(unaff_CS,0,0); + } + iVar1 = SNDPLAYSOUND(uVar2,5,(int)*(undefined4 *)((undefined1 *)&DAT_1028_43f2 + param_1 * 4)); + DAT_1028_43f3 = iVar1 != 0; + } + return local_6; +} + + +/* ===== 1008:118f FUN_1008_118f ===== */ + +undefined2 __cdecl16far FUN_1008_118f(void) + +{ + undefined2 unaff_CS; + undefined2 local_6; + + if ((DAT_1028_43ee != 0) && (DAT_1028_43f3 != '\0')) { + SNDPLAYSOUND(unaff_CS,0,0); + } + return local_6; +} + + +/* ===== 1008:11b8 FUN_1008_11b8 ===== */ + +void __cdecl16far FUN_1008_11b8(void) + +{ + return; +} + + +/* ===== 1008:11c5 FUN_1008_11c5 ===== */ + +/* WARNING: Removing unreachable block (ram,0x1008123e) */ +/* WARNING: Removing unreachable block (ram,0x10081234) */ + +void __cdecl16far FUN_1008_11c5(void) + +{ + int iVar1; + undefined2 *puVar2; + undefined2 uVar3; + bool bVar4; + undefined2 *puVar5; + uint local_10; + int local_e; + + iVar1 = FUN_1020_08a9(); + puVar5 = (undefined2 *)FUN_1020_012d(iVar1 + 8); + uVar3 = (undefined2)((ulong)puVar5 >> 0x10); + puVar2 = (undefined2 *)puVar5; + puVar2[1] = 0x100; + *puVar5 = 0x300; + local_10 = 0; + local_e = 0; + while( true ) { + iVar1 = FUN_1020_08a9(); + *(undefined1 *)(puVar2 + local_10 * 2 + 2) = *(undefined1 *)(iVar1 + 0x4450); + iVar1 = FUN_1020_08a9(); + *(undefined1 *)((int)puVar2 + local_10 * 4 + 5) = *(undefined1 *)(iVar1 + 0x4451); + iVar1 = FUN_1020_08a9(); + *(undefined1 *)(puVar2 + local_10 * 2 + 3) = *(undefined1 *)(iVar1 + 0x4452); + *(undefined1 *)((int)puVar2 + local_10 * 4 + 7) = 0; + if ((local_e == 0) && (local_10 == 0xff)) break; + bVar4 = 0xfffe < local_10; + local_10 = local_10 + 1; + local_e = local_e + (uint)bVar4; + } + DAT_1028_444e = CREATEPALETTE(0x1020,puVar2); + uVar3 = FUN_1020_039d(puVar5,uVar3); + FUN_1020_0147(uVar3,puVar5); + return; +} + + +/* ===== 1008:1326 FUN_1008_1326 ===== */ + +void __stdcall16far FUN_1008_1326(undefined4 param_1,char *param_2,undefined2 param_3,char *param_4) + +{ + ushort uVar1; + uint uVar2; + int iVar3; + undefined1 uVar4; + undefined2 in_DX; + undefined4 in_stack_0000fff0; + int iVar5; + + uVar1 = FINDRESOURCE(0x45a,(char *)CONCAT22(param_3,param_2), + (char *)CONCAT22((int)((ulong)in_stack_0000fff0 >> 0x10),param_4)); + uVar1 = LOADRESOURCE(uVar1,(ushort)param_4); + uVar2 = LOCKRESOURCE(uVar1); + iVar5 = 0; + while( true ) { + iVar3 = FUN_1020_039d(); + uVar4 = *(undefined1 *)(uVar2 + iVar3); + iVar3 = FUN_1020_039d(); + *(undefined1 *)((int)param_1 + iVar3) = uVar4; + if (iVar5 == 0x2ff) break; + iVar5 = iVar5 + 1; + } + GLOBALUNLOCK(uVar1); + return; +} + + +/* ===== 1008:13a8 FUN_1008_13a8 ===== */ + +void __stdcall16far FUN_1008_13a8(undefined4 param_1) + +{ + uint uVar1; + int iVar2; + int iVar3; + int iVar4; + int iVar5; + undefined2 uVar6; + bool bVar7; + uint local_10; + int local_e; + + uVar6 = (undefined2)((ulong)param_1 >> 0x10); + iVar5 = (int)param_1; + iVar4 = -(uint)(1 << ((byte)*(undefined2 *)(iVar5 + 0xe) & 0x1f) == 0); + uVar1 = FUN_1020_08a9(); + iVar2 = uVar1 + 8; + iVar4 = iVar4 + (uint)(0xfff7 < uVar1); + local_10 = 0; + local_e = 0; + while( true ) { + iVar3 = FUN_1020_08a9(iVar2,iVar4); + *(undefined1 *)(iVar5 + local_10 * 4 + 0x2a) = *(undefined1 *)(iVar3 + 0x4450); + iVar3 = FUN_1020_08a9(); + *(undefined1 *)(iVar5 + local_10 * 4 + 0x29) = *(undefined1 *)(iVar3 + 0x4451); + iVar3 = FUN_1020_08a9(); + *(undefined1 *)(iVar5 + local_10 * 4 + 0x28) = *(undefined1 *)(iVar3 + 0x4452); + *(undefined1 *)(iVar5 + local_10 * 4 + 0x2b) = 0; + if ((local_e == 0) && (local_10 == 0xff)) break; + bVar7 = 0xfffe < local_10; + local_10 = local_10 + 1; + local_e = local_e + (uint)bVar7; + } + return; +} + + +/* ===== 1008:149d FUN_1008_149d ===== */ + +undefined2 __stdcall16far FUN_1008_149d(char *param_1,undefined2 param_2,char *param_3) + +{ + uint uVar1; + undefined2 uVar2; + undefined2 uVar3; + undefined2 in_DX; + int unaff_BP; + undefined2 unaff_SS; + undefined4 uVar4; + undefined2 uVar5; + undefined2 uVar6; + undefined2 in_stack_0000ff90; + undefined1 local_32 [14]; + byte local_24; + ushort local_a; + ushort local_8; + undefined2 local_6; + undefined2 uStack_4; + int iStack_2; + + iStack_2 = unaff_BP + 1; + uStack_4 = 0x1028; + local_a = FINDRESOURCE(0x45e,(char *)CONCAT22(param_2,param_1), + (char *)CONCAT22(in_stack_0000ff90,param_3)); + local_8 = LOADRESOURCE(local_a,(ushort)param_3); + uVar1 = LOCKRESOURCE(local_8); + FUN_1020_0891(0x28,local_32,unaff_SS,uVar1,in_DX); + uVar4 = FUN_1020_012d((1 << (local_24 & 0x1f)) * 4 + 0x28); + FUN_1020_0891(0x28,uVar4,local_32,unaff_SS); + FUN_1008_13a8(); + uVar6 = 0x1028; + uVar2 = CREATEDC(0x1008,0,0,0,0,0,0,0x462); + uVar5 = uVar2; + uVar3 = SELECTPALETTE(0x1228,0,DAT_1028_444e); + UNREALIZEOBJECT(0x1228,DAT_1028_444e,uVar5,uVar6); + REALIZEPALETTE(0x1228,uVar2); + uVar6 = uVar2; + local_6 = CREATEDIBITMAP(0x1228,0,uVar4,uVar1 + 0x28,in_DX,4,0,local_32,unaff_SS); + uVar5 = uVar2; + SELECTPALETTE(0x1228,0,uVar3); + DELETEDC(0x1228,uVar2,uVar5,uVar6); + GLOBALUNLOCK(local_8); + FREERESOURCE(local_8); + return local_6; +} + + +/* ===== 1008:15c2 FUN_1008_15c2 ===== */ + +void __cdecl16far FUN_1008_15c2(void) + +{ + return; +} + + +/* ===== 1008:15c7 FUN_1008_15c7 ===== */ + +void __stdcall16far FUN_1008_15c7(ushort param_1,uint param_2) + +{ + ushort arg1; + + arg1 = GLOBALALLOC(param_1,param_2); + GLOBALLOCK(arg1); + return; +} + + +/* ===== 1008:15e7 FUN_1008_15e7 ===== */ + +void __stdcall16far FUN_1008_15e7(undefined2 param_1,ushort param_2) + +{ + uint arg1; + + arg1 = GLOBALHANDLE(param_2); + GLOBALUNLOCK(arg1); + GLOBALFREE(arg1); + return; +} + + +/* ===== 1008:1607 FUN_1008_1607 ===== */ + +undefined4 __stdcall16far +FUN_1008_1607(undefined4 param_1,undefined2 param_2,undefined2 param_3,undefined2 param_4, + undefined2 param_5,undefined2 param_6,undefined2 param_7,undefined2 param_8, + undefined2 param_9,undefined2 param_10,undefined2 param_11) + +{ + int iVar1; + undefined2 uVar2; + bool bVar3; + undefined2 local_8; + + bVar3 = true; + FUN_1020_03ef(); + if (!bVar3) { + if (DAT_1028_066a == '\0') { + local_8 = 0x7f02; + } + else { + local_8 = 0x7f05; + } + uVar2 = (undefined2)((ulong)param_1 >> 0x10); + iVar1 = (int)param_1; + FUN_1008_2996(iVar1,uVar2,0,local_8,0,param_10,param_11); + *(undefined2 *)(iVar1 + 0x26) = param_8; + *(undefined2 *)(iVar1 + 0x28) = param_9; + *(undefined2 *)(iVar1 + 0x2a) = param_6; + *(undefined2 *)(iVar1 + 0x2c) = param_7; + *(undefined2 *)(iVar1 + 0x2e) = param_4; + *(undefined2 *)(iVar1 + 0x30) = param_5; + *(undefined2 *)(iVar1 + 0x32) = param_3; + } + return param_1; +} + + +/* ===== 1008:168e FUN_1008_168e ===== */ + +undefined1 __stdcall16far FUN_1008_168e(undefined4 param_1) + +{ + int iVar1; + undefined2 uVar2; + undefined2 unaff_CS; + + uVar2 = (undefined2)((ulong)param_1 >> 0x10); + iVar1 = (int)param_1; + GETDLGITEMTEXT(unaff_CS,*(undefined2 *)(iVar1 + 0x32),*(undefined2 *)(iVar1 + 0x2e), + *(undefined2 *)(iVar1 + 0x30),0x65); + return 1; +} + + +/* ===== 1008:16be FUN_1008_16be ===== */ + +void __stdcall16far FUN_1008_16be(undefined4 param_1) + +{ + int unaff_BP; + int iVar1; + int iVar2; + undefined2 uVar3; + undefined2 uVar4; + + iVar1 = unaff_BP + 1; + uVar4 = 0x1028; + uVar3 = (undefined2)((ulong)param_1 >> 0x10); + iVar2 = (int)param_1; + FUN_1018_0d9b(iVar2,uVar3); + SETWINDOWTEXT(0x1018,*(undefined2 *)(iVar2 + 0x26),*(undefined2 *)(iVar2 + 0x28), + *(undefined2 *)(iVar2 + 4),uVar4,iVar1); + SETDLGITEMTEXT(0x1228,*(undefined2 *)(iVar2 + 0x2a),*(undefined2 *)(iVar2 + 0x2c),100); + SETDLGITEMTEXT(0x1228,*(undefined2 *)(iVar2 + 0x2e),*(undefined2 *)(iVar2 + 0x30),0x65); + SENDDLGITEMMESSAGE(0x1228,0,0,*(int *)(iVar2 + 0x32) + -1,0x415,0x65); + return; +} + + +/* ===== 1008:172f FUN_1008_172f ===== */ + +int FUN_1008_172f(int param_1,int param_2) + +{ + undefined2 local_4; + + if (param_2 < param_1) { + local_4 = param_2; + } + else { + local_4 = param_1; + } + return local_4; +} + + +/* ===== 1008:1754 FUN_1008_1754 ===== */ + +int FUN_1008_1754(int param_1,int param_2) + +{ + undefined2 local_4; + + if (param_1 < param_2) { + local_4 = param_2; + } + else { + local_4 = param_1; + } + return local_4; +} + + +/* ===== 1008:1779 FUN_1008_1779 ===== */ + +void __cdecl16near FUN_1008_1779(void) + +{ + undefined2 uVar1; + undefined2 unaff_CS; + undefined4 uVar2; + + uVar1 = DAT_1028_0586; + if (DAT_1028_058f == '\0') { + DAT_1028_4ad4 = GETDC(); + } + else { + DAT_1028_4ad4 = BEGINPAINT(unaff_CS,0x4ad6,0x1028,DAT_1028_0586); + } + uVar1 = GETSTOCKOBJECT(0x1228,0x10,DAT_1028_4ad4,uVar1); + DAT_1028_4af6 = SELECTOBJECT(0x1228,uVar1); + uVar2 = GETSYSCOLOR(0x1228,8,DAT_1028_4ad4); + SETTEXTCOLOR(0x1228,uVar2); + uVar2 = GETSYSCOLOR(0x1228,5,DAT_1028_4ad4); + SETBKCOLOR(0x1228,uVar2); + return; +} + + +/* ===== 1008:17e2 FUN_1008_17e2 ===== */ + +void __cdecl16near FUN_1008_17e2(void) + +{ + undefined2 unaff_CS; + + SELECTOBJECT(unaff_CS,DAT_1028_4af6); + if (DAT_1028_058f == '\0') { + RELEASEDC(0x1228,DAT_1028_4ad4); + } + else { + ENDPAINT(0x1228,0x4ad6,0x1028); + } + return; +} + + +/* ===== 1008:1818 FUN_1008_1818 ===== */ + +void __cdecl16near FUN_1008_1818(void) + +{ + undefined2 unaff_CS; + int iVar1; + undefined2 uVar2; + + uVar2 = DAT_1028_0586; + CREATECARET(unaff_CS,2,DAT_1028_4ace,0); + iVar1 = (DAT_1028_0544 - DAT_1028_0548) * DAT_1028_4ace; + SETCARETPOS(0x1228,(DAT_1028_0546 - DAT_1028_054a) * DAT_1028_4ad0 + DAT_1028_4ad2); + SHOWCARET(0x1228,DAT_1028_0586,iVar1,uVar2); + return; +} + + +/* ===== 1008:185b FUN_1008_185b ===== */ + +void __cdecl16near FUN_1008_185b(void) + +{ + DESTROYCARET(); + return; +} + + +/* ===== 1008:1865 FUN_1008_1865 ===== */ + +void __cdecl16near FUN_1008_1865(void) + +{ + undefined2 uVar1; + undefined2 unaff_CS; + undefined2 uVar2; + undefined2 uVar3; + + uVar3 = 0; + uVar2 = 0; + uVar1 = FUN_1008_1754(DAT_1028_4aca,1); + SETSCROLLRANGE(unaff_CS,0,uVar1,uVar2,uVar3); + SETSCROLLPOS(0x1228,1,DAT_1028_0548,0); + uVar3 = 1; + uVar2 = 0; + uVar1 = FUN_1008_1754(DAT_1028_4acc,1); + SETSCROLLRANGE(0x1228,0,uVar1,uVar2,uVar3); + SETSCROLLPOS(0x1228,1,DAT_1028_054a,1); + return; +} + + +/* ===== 1008:18d0 FUN_1008_18d0 ===== */ + +void __cdecl16near FUN_1008_18d0(void) + +{ + if ((DAT_1028_058d != '\0') && (DAT_1028_058e != '\0')) { + FUN_1008_185b(); + } + FUN_1020_0061(); + return; +} + + +/* ===== 1008:18ee FUN_1008_18ee ===== */ + +void __stdcall16far FUN_1008_18ee(undefined2 param_1,undefined2 param_2) + +{ + undefined2 uVar1; + int iVar2; + int iVar3; + undefined2 unaff_CS; + undefined2 uVar4; + undefined2 uVar5; + + if (DAT_1028_058c != '\0') { + uVar5 = 0; + uVar1 = FUN_1008_172f(DAT_1028_4aca,param_2); + iVar2 = FUN_1008_1754(uVar1,uVar5); + uVar1 = 0; + uVar5 = FUN_1008_172f(DAT_1028_4acc,param_1); + iVar3 = FUN_1008_1754(uVar5,uVar1); + if ((iVar2 != DAT_1028_0548) || (iVar3 != DAT_1028_054a)) { + uVar5 = unaff_CS; + if (iVar2 != DAT_1028_0548) { + uVar5 = 0x1228; + uVar1 = DAT_1028_0586; + SETSCROLLPOS(unaff_CS,1,iVar2,0); + } + uVar4 = uVar5; + if (iVar3 != DAT_1028_054a) { + uVar4 = 0x1228; + SETSCROLLPOS(uVar5,1,iVar3,1); + } + uVar5 = DAT_1028_0586; + SCROLLWINDOW(uVar4,0,0,0,0,(DAT_1028_054a - iVar3) * DAT_1028_4ad0, + (DAT_1028_0548 - iVar2) * DAT_1028_4ace); + DAT_1028_0548 = iVar2; + DAT_1028_054a = iVar3; + UPDATEWINDOW(0x1228,DAT_1028_0586,uVar5,uVar1); + } + } + return; +} + + +/* ===== 1008:19b7 FUN_1008_19b7 ===== */ + +void __cdecl16far FUN_1008_19b7(void) + +{ + int iVar1; + undefined2 uVar2; + undefined2 uVar3; + + iVar1 = (DAT_1028_0544 - DAT_1028_4ac6) + 1; + uVar2 = FUN_1008_172f(DAT_1028_0544,DAT_1028_0548); + uVar2 = FUN_1008_1754(uVar2,iVar1); + iVar1 = (DAT_1028_0546 - DAT_1028_4ac8) + 1; + uVar3 = FUN_1008_172f(DAT_1028_0546,DAT_1028_054a); + uVar3 = FUN_1008_1754(uVar3,iVar1); + FUN_1008_18ee(uVar3,uVar2); + return; +} + + +/* ===== 1008:19f8 FUN_1008_19f8 ===== */ + +/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */ + +undefined4 FUN_1008_19f8(int param_1,int param_2) + +{ + param_1 = param_1 + DAT_1028_0588; + if (DAT_1028_0542 <= param_1) { + param_1 = param_1 - DAT_1028_0542; + } + return CONCAT22((int)((ulong)_DAT_1028_4ac2 >> 0x10), + (int)_DAT_1028_4ac2 + param_1 * DAT_1028_0540 + param_2); +} + + +/* ===== 1008:1a39 FUN_1008_1a39 ===== */ + +void FUN_1008_1a39(int param_1,int param_2) + +{ + undefined2 unaff_CS; + undefined4 uVar1; + int iVar2; + int iVar3; + undefined2 uVar4; + + if (param_2 < param_1) { + FUN_1008_1779(); + iVar3 = (param_2 - DAT_1028_0548) * DAT_1028_4ace; + iVar2 = (DAT_1028_0546 - DAT_1028_054a) * DAT_1028_4ad0; + uVar4 = DAT_1028_4ad4; + uVar1 = FUN_1008_19f8(DAT_1028_0546,param_2); + TEXTOUT(unaff_CS,param_1 - param_2,uVar1,iVar2,iVar3); + FUN_1008_17e2(uVar4); + } + return; +} + + +/* ===== 1008:1a82 FUN_1008_1a82 ===== */ + +void FUN_1008_1a82(int param_1) + +{ + int iVar1; + undefined2 unaff_SS; + undefined4 uVar2; + undefined2 uVar3; + + FUN_1008_1a39(*(undefined2 *)(param_1 + -6),*(undefined2 *)(param_1 + -4)); + *(undefined2 *)(param_1 + -4) = 0; + *(undefined2 *)(param_1 + -6) = 0; + DAT_1028_0544 = 0; + iVar1 = DAT_1028_0546 + 1; + if (DAT_1028_0546 + 1 == DAT_1028_0542) { + DAT_1028_0588 = DAT_1028_0588 + 1; + if (DAT_1028_0588 == DAT_1028_0542) { + DAT_1028_0588 = 0; + } + uVar2 = FUN_1008_19f8(DAT_1028_0546,0); + FUN_1020_16c9(0x20,DAT_1028_0540,uVar2); + uVar3 = DAT_1028_0586; + SCROLLWINDOW(0x1020,0,0,0,0,-DAT_1028_4ad0,0); + UPDATEWINDOW(0x1228,DAT_1028_0586,uVar3); + iVar1 = DAT_1028_0546; + } + DAT_1028_0546 = iVar1; + return; +} + + +/* ===== 1008:1b11 FUN_1008_1b11 ===== */ + +void __stdcall16far FUN_1008_1b11(int param_1,byte *param_2) + +{ + int unaff_BP; + undefined2 uVar1; + byte *pbVar2; + undefined1 *puVar3; + byte bVar4; + int iVar5; + int iVar6; + undefined2 uVar7; + int iStack_2; + + iStack_2 = unaff_BP + 1; + uVar7 = 0x1028; + uVar1 = 0x1008; + FUN_1008_2442(); + iVar5 = DAT_1028_0544; + iVar6 = DAT_1028_0544; + for (; param_1 != 0; param_1 = param_1 + -1) { + bVar4 = *param_2; + if (bVar4 < 0x20) { + if (bVar4 == 0xd) { + FUN_1008_1a82(&iStack_2); + } + else if (bVar4 == 8) { + if (0 < DAT_1028_0544) { + DAT_1028_0544 = DAT_1028_0544 + -1; + puVar3 = (undefined1 *)FUN_1008_19f8(DAT_1028_0546,DAT_1028_0544); + *puVar3 = 0x20; + if (DAT_1028_0544 < iVar6) { + iVar6 = DAT_1028_0544; + } + } + } + else if (bVar4 == 7) { + MESSAGEBEEP(uVar1,0,iVar5,iVar6,uVar7); + uVar1 = 0x1228; + } + } + else { + bVar4 = *param_2; + pbVar2 = (byte *)FUN_1008_19f8(DAT_1028_0546,DAT_1028_0544); + *pbVar2 = bVar4; + DAT_1028_0544 = DAT_1028_0544 + 1; + if (iVar5 < DAT_1028_0544) { + iVar5 = DAT_1028_0544; + } + if (DAT_1028_0544 == DAT_1028_0540) { + FUN_1008_1a82(&iStack_2); + } + } + param_2 = (byte *)CONCAT22(param_2._2_2_,(byte *)param_2 + 1); + } + FUN_1008_1a39(iVar5,iVar6); + if (DAT_1028_055e != '\0') { + FUN_1008_19b7(); + } + return; +} + + +/* ===== 1008:1be9 FUN_1008_1be9 ===== */ + +void __stdcall16far FUN_1008_1be9(void) + +{ + undefined2 unaff_SS; + + FUN_1008_1b11(1,&stack0x0004,unaff_SS); + return; +} + + +/* ===== 1008:1c03 FUN_1008_1c03 ===== */ + +bool __cdecl16far FUN_1008_1c03(void) + +{ + int iVar1; + int unaff_BP; + undefined2 uVar2; + undefined2 unaff_SS; + undefined1 local_18 [2]; + int local_16; + undefined2 uStack_4; + int iStack_2; + + iStack_2 = unaff_BP + 1; + uStack_4 = 0x1028; + uVar2 = 0x1008; + FUN_1008_2442(); + while (iVar1 = PEEKMESSAGE(uVar2,1,0,0,0,local_18,unaff_SS), iVar1 != 0) { + if (local_16 == 0x12) { + FUN_1008_18d0(); + } + TRANSLATEMESSAGE(0x1228,local_18); + uVar2 = 0x1228; + DISPATCHMESSAGE(0x1228,local_18); + } + return 0 < DAT_1028_058a; +} + + +/* ===== 1008:1c5f FUN_1008_1c5f ===== */ + +undefined1 __cdecl16far FUN_1008_1c5f(void) + +{ + char cVar1; + int unaff_BP; + int iVar2; + undefined2 uVar3; + undefined1 uVar4; + undefined2 uVar5; + + iVar2 = unaff_BP + 1; + uVar5 = 0x1028; + FUN_1008_19b7(); + uVar3 = 0x1008; + cVar1 = FUN_1008_1c03(); + if (cVar1 == '\0') { + DAT_1028_058e = 1; + if (DAT_1028_058d != '\0') { + uVar3 = 0x1c84; + FUN_1008_1818(); + } + do { + WAITMESSAGE(uVar3,0x1008,uVar5,iVar2); + cVar1 = FUN_1008_1c03(); + } while (cVar1 == '\0'); + if (DAT_1028_058d != '\0') { + FUN_1008_185b(); + } + DAT_1028_058e = 0; + } + DAT_1028_058a = DAT_1028_058a + -1; + uVar4 = DAT_1028_4af8; + FUN_1020_16a5(DAT_1028_058a,(undefined1 *)&DAT_1028_4af8,0x1028,0x4af9,0x1028); + return uVar4; +} + + +/* ===== 1008:1cc6 FUN_1008_1cc6 ===== */ + +int __stdcall16far FUN_1008_1cc6(int param_1,undefined4 param_2) + +{ + uint uVar1; + byte bVar2; + int iVar3; + undefined2 uVar4; + uint local_a; + + local_a = 0; + do { + bVar2 = FUN_1008_1c5f(); + iVar3 = (int)param_2; + uVar4 = (undefined2)((ulong)param_2 >> 0x10); + if (bVar2 == 8) { + if (local_a != 0) { + local_a = local_a - 1; + FUN_1008_1be9(8); + } + } + else if ((0x1f < bVar2) && (local_a < param_1 - 2U)) { + *(byte *)(iVar3 + local_a) = bVar2; + FUN_1008_1be9(CONCAT11((char)(local_a >> 8),bVar2)); + local_a = local_a + 1; + } + } while ((bVar2 != 0xd) && ((DAT_1028_055f == '\0' || (bVar2 != 0x1a)))); + *(byte *)(iVar3 + local_a) = bVar2; + uVar1 = local_a + 1; + if (bVar2 == 0xd) { + *(undefined1 *)(iVar3 + uVar1) = 10; + FUN_1008_1be9(CONCAT11((char)(uVar1 >> 8),0xd)); + uVar1 = local_a + 2; + } + local_a = uVar1; + FUN_1008_19b7(); + return local_a; +} + + +/* ===== 1008:1d77 FUN_1008_1d77 ===== */ + +/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */ + +void __cdecl16near FUN_1008_1d77(void) + +{ + DAT_1028_058c = 1; + _DAT_1028_4ac2 = FUN_1020_012d(DAT_1028_0540 * DAT_1028_0542); + FUN_1020_16c9(CONCAT11((char)((uint)(DAT_1028_0540 * DAT_1028_0542) >> 8),0x20), + DAT_1028_0540 * DAT_1028_0542,_DAT_1028_4ac2); + if (DAT_1028_0560 == '\0') { + GETSYSTEMMENU(0x1020,0); + ENABLEMENUITEM(0x1228,3,0xf060); + } + return; +} + + +/* ===== 1008:1dcc FUN_1008_1dcc ===== */ + +void __cdecl16near FUN_1008_1dcc(void) + +{ + int iVar1; + int iVar2; + int iVar3; + undefined2 unaff_CS; + undefined4 uVar4; + int iVar5; + int iVar6; + int local_8; + + DAT_1028_058f = 1; + FUN_1008_1779(); + iVar1 = FUN_1008_1754(DAT_1028_4ada / DAT_1028_4ace + DAT_1028_0548,0); + iVar2 = FUN_1008_172f((DAT_1028_4ade + DAT_1028_4ace + -1) / DAT_1028_4ace + DAT_1028_0548, + DAT_1028_0540); + local_8 = FUN_1008_1754(DAT_1028_4adc / DAT_1028_4ad0 + DAT_1028_054a,0); + iVar3 = FUN_1008_172f((DAT_1028_4ae0 + DAT_1028_4ad0 + -1) / DAT_1028_4ad0 + DAT_1028_054a, + DAT_1028_0542); + for (; local_8 < iVar3; local_8 = local_8 + 1) { + iVar6 = (iVar1 - DAT_1028_0548) * DAT_1028_4ace; + iVar5 = (local_8 - DAT_1028_054a) * DAT_1028_4ad0; + uVar4 = FUN_1008_19f8(local_8,iVar1); + TEXTOUT(unaff_CS,iVar2 - iVar1,uVar4,iVar5,iVar6); + unaff_CS = 0x1228; + } + FUN_1008_17e2(); + DAT_1028_058f = 0; + return; +} + + +/* ===== 1008:1e8a FUN_1008_1e8a ===== */ + +int FUN_1008_1e8a(int param_1,int param_2,int param_3,int param_4) + +{ + int iVar1; + undefined2 unaff_SS; + undefined2 local_4; + + iVar1 = *(int *)(param_1 + 6); + if (iVar1 == 0) { + local_4 = param_4 + -1; + } + else if (iVar1 == 1) { + local_4 = param_4 + 1; + } + else if (iVar1 == 2) { + local_4 = param_4 - param_3; + } + else if (iVar1 == 3) { + local_4 = param_4 + param_3; + } + else if (iVar1 == 6) { + local_4 = 0; + } + else if (iVar1 == 7) { + local_4 = param_2; + } + else if (iVar1 == 4) { + local_4 = *(int *)(param_1 + 4); + } + else { + local_4 = param_4; + } + return local_4; +} + + +/* ===== 1008:1f0c FUN_1008_1f0c ===== */ + +void FUN_1008_1f0c(undefined2 param_1,undefined2 param_2,int param_3) + +{ + undefined2 local_6; + undefined2 local_4; + + local_4 = DAT_1028_0548; + local_6 = DAT_1028_054a; + if (param_3 == 0) { + local_4 = FUN_1008_1e8a(&stack0xfffe,DAT_1028_4aca,DAT_1028_4ac6 / 2,DAT_1028_0548); + } + else if (param_3 == 1) { + local_6 = FUN_1008_1e8a(&stack0xfffe,DAT_1028_4acc,DAT_1028_4ac8,DAT_1028_054a); + } + FUN_1008_18ee(local_6,local_4); + return; +} + + +/* ===== 1008:1f68 FUN_1008_1f68 ===== */ + +void FUN_1008_1f68(int param_1,int param_2) + +{ + if ((DAT_1028_058d != '\0') && (DAT_1028_058e != '\0')) { + FUN_1008_185b(); + } + DAT_1028_4ac6 = param_2 / DAT_1028_4ace; + DAT_1028_4ac8 = param_1 / DAT_1028_4ad0; + DAT_1028_4aca = FUN_1008_1754(DAT_1028_0540 - DAT_1028_4ac6,0); + DAT_1028_4acc = FUN_1008_1754(DAT_1028_0542 - DAT_1028_4ac8,0); + DAT_1028_0548 = FUN_1008_172f(DAT_1028_4aca,DAT_1028_0548); + DAT_1028_054a = FUN_1008_172f(DAT_1028_4acc,DAT_1028_054a); + FUN_1008_1865(); + if ((DAT_1028_058d != '\0') && (DAT_1028_058e != '\0')) { + FUN_1008_1818(); + } + return; +} + + +/* ===== 1008:1fe8 FUN_1008_1fe8 ===== */ + +void FUN_1008_1fe8(undefined4 param_1) + +{ + int iVar1; + undefined2 uVar2; + undefined2 unaff_CS; + undefined2 unaff_SS; + int iVar3; + int iVar4; + undefined2 uVar5; + int iVar6; + int local_26; + undefined2 local_24; + int local_1e; + int local_1a; + int local_6; + int local_4; + + FUN_1008_1779(); + uVar2 = DAT_1028_4ad4; + GETTEXTMETRICS(unaff_CS,&local_26,unaff_SS); + DAT_1028_4ace = local_1a; + DAT_1028_4ad0 = local_26 + local_1e; + DAT_1028_4ad2 = local_24; + iVar1 = GETSYSTEMMETRICS(0x1228,0x20,uVar2); + iVar1 = GETSYSTEMMETRICS(0x1228,2,iVar1 << 1); + iVar6 = 0; + uVar5 = 0x1228; + uVar2 = GETSYSTEMMETRICS(0x1228,0,DAT_1028_0540 * DAT_1028_4ace + iVar1); + local_4 = FUN_1008_172f(uVar2,uVar5); + local_4 = local_4 + iVar6; + iVar1 = GETSYSTEMMETRICS(0x1228,0x21); + uVar2 = GETSYSTEMMETRICS(0x1228,4,iVar1 << 1); + iVar4 = 0x1228; + iVar1 = GETSYSTEMMETRICS(0x1228,3,uVar2); + iVar6 = 1; + uVar5 = 0x1228; + uVar2 = GETSYSTEMMETRICS(0x1228,1,DAT_1028_0542 * DAT_1028_4ad0 + iVar1 + iVar4); + local_6 = FUN_1008_172f(uVar2,uVar5); + local_6 = local_6 + iVar6; + uVar5 = (undefined2)((ulong)param_1 >> 0x10); + iVar6 = (int)param_1; + *(int *)(iVar6 + 4) = local_4; + *(int *)(iVar6 + 6) = local_6; + iVar1 = GETSYSTEMMETRICS(0x1228,0x20); + iVar4 = 0x1228; + iVar1 = GETSYSTEMMETRICS(0x1228,2,iVar1 << 1); + *(int *)(iVar6 + 0xc) = DAT_1028_4ace * 0x10 + iVar1 + iVar4; + uVar2 = GETSYSTEMMETRICS(0x1228,4); + iVar1 = GETSYSTEMMETRICS(0x1228,0x21,uVar2); + iVar3 = 3; + iVar4 = 0x1228; + iVar1 = GETSYSTEMMETRICS(0x1228,3,iVar1 << 1); + *(int *)(iVar6 + 0xe) = DAT_1028_4ad0 * 4 + iVar1 + iVar4 + iVar3; + *(int *)(iVar6 + 0x10) = local_4; + *(int *)(iVar6 + 0x12) = local_6; + FUN_1008_17e2(); + return; +} + + +/* ===== 1008:211a FUN_1008_211a ===== */ + +void FUN_1008_211a(char param_1) + +{ + if ((DAT_1028_0560 != '\0') && (param_1 == '\x03')) { + FUN_1008_18d0(); + } + if (DAT_1028_058a < 0x40) { + ((undefined1 *)&DAT_1028_4af8)[DAT_1028_058a] = param_1; + DAT_1028_058a = DAT_1028_058a + 1; + } + return; +} + + +/* ===== 1008:2147 FUN_1008_2147 ===== */ + +void FUN_1008_2147(char param_1) + +{ + int iVar1; + int iVar2; + int local_6; + + if ((DAT_1028_0560 != '\0') && (param_1 == '\x03')) { + FUN_1008_18d0(); + } + iVar1 = GETKEYSTATE(); + local_6 = 1; + while ((iVar2 = local_6 * 4, *(char *)(iVar2 + 0x58c) != param_1 || + ((bool)*(char *)(iVar2 + 0x58d) != iVar1 < 0))) { + if (local_6 == 0xc) { + return; + } + local_6 = local_6 + 1; + } + FUN_1008_1f0c(0,*(undefined1 *)(iVar2 + 0x58f),*(undefined1 *)(iVar2 + 0x58e)); + return; +} + + +/* ===== 1008:21ba FUN_1008_21ba ===== */ + +void __cdecl16near FUN_1008_21ba(void) + +{ + DAT_1028_058d = 1; + if (DAT_1028_058e != '\0') { + FUN_1008_1818(); + } + return; +} + + +/* ===== 1008:21ce FUN_1008_21ce ===== */ + +void __cdecl16near FUN_1008_21ce(void) + +{ + if (DAT_1028_058e != '\0') { + FUN_1008_185b(); + } + DAT_1028_058d = 0; + return; +} + + +/* ===== 1008:21e2 FUN_1008_21e2 ===== */ + +/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */ + +void __cdecl16near FUN_1008_21e2(void) + +{ + FUN_1020_0147(DAT_1028_0540 * DAT_1028_0542,DAT_1028_4ac2,_DAT_1028_4ac4); + DAT_1028_0544 = 0; + DAT_1028_0546 = 0; + DAT_1028_0548 = 0; + DAT_1028_054a = 0; + POSTQUITMESSAGE(0x1020,0); + DAT_1028_058c = 0; + return; +} + + +/* ===== 1008:2219 FUN_1008_2219 ===== */ + +undefined4 __stdcall16far +FUN_1008_2219(undefined2 param_1,undefined2 param_2,undefined2 param_3,int param_4, + undefined2 param_5) + +{ + undefined2 unaff_CS; + undefined2 unaff_SS; + undefined4 uVar1; + + uVar1 = 0; + *(undefined2 *)&DAT_1028_0586 = param_5; + if (param_4 == 1) { + FUN_1008_1d77(); + uVar1 = 0; + } + else if (param_4 == 0xf) { + FUN_1008_1dcc(); + uVar1 = 0; + } + else if (param_4 == 0x115) { + FUN_1008_1f0c(param_1,param_3,1); + uVar1 = 0; + } + else if (param_4 == 0x114) { + FUN_1008_1f0c(param_1,param_3,0); + uVar1 = 0; + } + else if (param_4 == 5) { + FUN_1008_1f68(param_2,param_1); + uVar1 = 0; + } + else if (param_4 == 0x24) { + FUN_1008_1fe8(param_1,param_2); + uVar1 = 0; + } + else if (param_4 == 0x102) { + FUN_1008_211a(CONCAT11(1,(undefined1)param_3)); + uVar1 = 0; + } + else if (param_4 == 0x100) { + FUN_1008_2147(CONCAT11(1,(undefined1)param_3)); + uVar1 = 0; + } + else if (param_4 == 7) { + FUN_1008_21ba(); + uVar1 = 0; + } + else if (param_4 == 8) { + FUN_1008_21ce(); + uVar1 = 0; + } + else if (param_4 == 2) { + FUN_1008_21e2(); + } + else { + uVar1 = DEFWINDOWPROC(unaff_CS,param_1,param_2,param_3,param_4); + } + return uVar1; +} + + +/* ===== 1008:22fc FUN_1008_22fc ===== */ + +undefined2 __stdcall16far FUN_1008_22fc(undefined4 param_1) + +{ + int iVar1; + undefined2 uVar2; + + uVar2 = (undefined2)((ulong)param_1 >> 0x10); + iVar1 = (int)param_1; + if (*(int *)(iVar1 + 8) != 0) { + FUN_1008_1b11(*(undefined2 *)(iVar1 + 8),*(undefined2 *)(iVar1 + 0xc), + *(undefined2 *)(iVar1 + 0xe)); + *(undefined2 *)(iVar1 + 8) = 0; + FUN_1008_1c03(); + } + return 0; +} + + +/* ===== 1008:233c FUN_1008_233c ===== */ + +undefined2 __stdcall16far FUN_1008_233c(undefined4 param_1) + +{ + undefined2 uVar1; + int iVar2; + undefined2 uVar3; + + uVar3 = (undefined2)((ulong)param_1 >> 0x10); + iVar2 = (int)param_1; + uVar1 = FUN_1008_1cc6(*(undefined2 *)(iVar2 + 4),*(undefined2 *)(iVar2 + 0xc), + *(undefined2 *)(iVar2 + 0xe)); + *(undefined2 *)(iVar2 + 10) = uVar1; + *(undefined2 *)(iVar2 + 8) = 0; + return 0; +} + + +/* ===== 1008:2374 FUN_1008_2374 ===== */ + +undefined2 __stdcall16far FUN_1008_2374(void) + +{ + return 0; +} + + +/* ===== 1008:238b FUN_1008_238b ===== */ + +undefined2 __stdcall16far FUN_1008_238b(undefined4 param_1) + +{ + int iVar1; + undefined2 uVar2; + + uVar2 = (undefined2)((ulong)param_1 >> 0x10); + iVar1 = (int)param_1; + if (*(int *)(iVar1 + 2) == -0x284f) { + *(undefined2 *)(iVar1 + 0x14) = 0x233c; + *(undefined2 *)(iVar1 + 0x16) = 0x1008; + *(undefined2 *)(iVar1 + 0x18) = 0; + *(undefined2 *)(iVar1 + 0x1a) = 0; + } + else { + *(undefined2 *)(iVar1 + 2) = 0xd7b2; + *(undefined2 *)(iVar1 + 0x14) = 0x22fc; + *(undefined2 *)(iVar1 + 0x16) = 0x1008; + *(undefined2 *)(iVar1 + 0x18) = 0x22fc; + *(undefined2 *)(iVar1 + 0x1a) = 0x1008; + } + *(undefined2 *)(iVar1 + 0x1c) = 0x2374; + *(undefined2 *)(iVar1 + 0x1e) = 0x1008; + return 0; +} + + +/* ===== 1008:23fd FUN_1008_23fd ===== */ + +void __stdcall16far FUN_1008_23fd(undefined2 *param_1) + +{ + undefined2 *puVar1; + undefined2 uVar2; + + uVar2 = (undefined2)((ulong)param_1 >> 0x10); + puVar1 = (undefined2 *)param_1; + *param_1 = 0xffff; + puVar1[1] = 0xd7b0; + puVar1[2] = 0x80; + puVar1[6] = puVar1 + 0x40; + puVar1[7] = uVar2; + puVar1[8] = 0x238b; + puVar1[9] = 0x1008; + *(undefined1 *)(puVar1 + 0x18) = 0; + return; +} + + +/* ===== 1008:2442 FUN_1008_2442 ===== */ + +void __cdecl16far FUN_1008_2442(void) + +{ + int unaff_BP; + int iVar1; + undefined2 unaff_CS; + undefined2 uVar2; + + iVar1 = unaff_BP + 1; + if (DAT_1028_058c == '\0') { + DAT_1028_0586 = + CREATEWINDOW(unaff_CS,0,0,DAT_1028_06fe,0,0,DAT_1028_053e,DAT_1028_053c,DAT_1028_053a, + DAT_1028_0538,0,0xff,0x4a6e,0x1028,DAT_1028_0578,DAT_1028_057a,0x1028); + uVar2 = DAT_1028_0586; + SHOWWINDOW(0x1228,DAT_1028_0700); + UPDATEWINDOW(0x1228,DAT_1028_0586,uVar2,iVar1); + } + return; +} + + +/* ===== 1008:24a5 FUN_1008_24a5 ===== */ + +void __cdecl16far FUN_1008_24a5(void) + +{ + undefined2 uVar1; + int iVar2; + int unaff_BP; + undefined2 unaff_CS; + undefined2 unaff_SS; + undefined1 local_9a [128]; + undefined1 local_1a [18]; + undefined2 local_8; + undefined2 local_6; + undefined2 uStack_4; + int iStack_2; + + iStack_2 = unaff_BP + 1; + uStack_4 = 0x1028; + DAT_1028_0712 = DAT_1028_4abe; + DAT_1028_0714 = DAT_1028_4ac0; + if ((DAT_1028_058c != '\0') && (DAT_1028_0718 == 0 && DAT_1028_071a == 0)) { + local_8 = 0x4a6e; + local_6 = 0x1028; + WVSPRINTF(unaff_CS,&local_8,unaff_SS,DAT_1028_054c,DAT_1028_054e,local_9a); + SETWINDOWTEXT(0x1228,local_9a); + uVar1 = GETSYSTEMMENU(0x1228,0); + ENABLEMENUITEM(0x1228,0,0xf060); + DAT_1028_0560 = 0; + while (iVar2 = GETMESSAGE(0x1228,0,0,0,local_1a,unaff_SS,uVar1), iVar2 != 0) { + uVar1 = unaff_SS; + TRANSLATEMESSAGE(0x1228,local_1a); + DISPATCHMESSAGE(0x1228,local_1a); + } + } + return; +} + + +/* ===== 1008:2554 FUN_1008_2554 ===== */ + +void __cdecl16far FUN_1008_2554(void) + +{ + undefined2 unaff_CS; + short arg3; + undefined2 uVar1; + + if (DAT_1028_06fc == 0) { + DAT_1028_056c = DAT_1028_06fe; + DAT_1028_056e = LOADICON(unaff_CS,0x7f00,0); + DAT_1028_0570 = LOADCURSOR(0x1228,0x7f00,0); + DAT_1028_0572 = 6; + REGISTERCLASS(0x1228,0x562); + } + FUN_1008_23fd(0x4b38,0x1028); + uVar1 = 0x1028; + FUN_1020_0527(); + FUN_1020_038f(uVar1); + FUN_1008_23fd(); + arg3 = 0x1028; + FUN_1020_052c(0x1008,0x4c38); + FUN_1020_038f(); + GETMODULEFILENAME(0x50,(void *)CONCAT22(DAT_1028_06fe,(void *)0x1028),arg3); + Ordinal_6(0x1228,0x4a6e,0x1028,0x4a6e,0x1028); + DAT_1028_4abe = DAT_1028_0712; + DAT_1028_4ac0 = DAT_1028_0714; + DAT_1028_0712 = 0x24a5; + DAT_1028_0714 = 0x1008; + return; +} + + +/* ===== 1008:2608 FUN_1008_2608 ===== */ + +void __cdecl16near FUN_1008_2608(void) + +{ + char *pcVar1; + char *pcVar2; + code *pcVar3; + int iVar4; + char *unaff_DI; + char *pcVar5; + undefined2 unaff_ES; + undefined2 unaff_SS; + char local_52 [80]; + + pcVar5 = local_52; + iVar4 = 0x4f; + do { + pcVar1 = unaff_DI; + unaff_DI = unaff_DI + 1; + if (*pcVar1 == '\0') break; + pcVar2 = pcVar5; + pcVar5 = pcVar5 + 1; + *pcVar2 = *pcVar1; + iVar4 = iVar4 + -1; + } while (iVar4 != 0); + *pcVar5 = '\0'; + Ordinal_5(); + pcVar3 = (code *)swi(0x21); + (*pcVar3)(); + return; +} + + +/* ===== 1008:2643 FUN_1008_2643 ===== */ + +char * __stdcall16far FUN_1008_2643(char *param_1,char *param_2,char *param_3) + +{ + char *pcVar1; + char *pcVar2; + char cVar3; + char cVar4; + uint uVar5; + char *pcVar6; + char *pcVar7; + char *pcVar8; + undefined2 uVar9; + undefined2 uVar10; + bool bVar11; + undefined2 uVar12; + + uVar12 = 0x1028; + uVar10 = (undefined2)((ulong)param_1 >> 0x10); + pcVar6 = (char *)param_1; + uVar9 = (undefined2)((ulong)param_3 >> 0x10); + uVar5 = 0x4f; + pcVar8 = (char *)param_3; + do { + if (uVar5 != 0) { + pcVar7 = (char *)param_2; + do { + pcVar1 = pcVar7; + pcVar7 = pcVar7 + 1; + if (*pcVar1 == '\0') break; + pcVar2 = pcVar8; + pcVar8 = pcVar8 + 1; + *pcVar2 = *pcVar1; + uVar5 = uVar5 - 1; + } while (uVar5 != 0); + } + bVar11 = false; + *pcVar8 = '\0'; + FUN_1008_2608(pcVar6,uVar10,uVar12); + if ((!bVar11) && ((uVar5 & 0x18) == 0)) { + return param_3; + } + uVar5 = 0x4f; + cVar3 = *pcVar6; + cVar4 = '\0'; + pcVar8 = (char *)param_3; + if (cVar3 == '\0') { + *param_3 = '\0'; + return param_3; + } + do { + pcVar6 = pcVar6 + 1; + if (cVar3 == ';') break; + if (uVar5 != 0) { + pcVar1 = pcVar8; + pcVar8 = pcVar8 + 1; + *pcVar1 = cVar3; + uVar5 = uVar5 - 1; + cVar4 = cVar3; + } + cVar3 = *pcVar6; + } while (cVar3 != '\0'); + if (((uVar5 != 0) && (cVar4 != ':')) && (cVar4 != '\\')) { + pcVar1 = pcVar8; + pcVar8 = pcVar8 + 1; + *pcVar1 = '\\'; + uVar5 = uVar5 - 1; + } + } while( true ); +} + + +/* ===== 1008:26b0 FUN_1008_26b0 ===== */ + +uint __stdcall16far +FUN_1008_26b0(int param_1,int param_2,int param_3,int param_4,int param_5,int param_6,int param_7, + undefined2 param_8) + +{ + long lVar1; + undefined4 local_14; + int local_10; + undefined2 local_e; + uint local_c; + uint local_a; + uint local_8; + + lVar1 = FUN_1008_2fe3(0x5c,param_7,param_8); + if (lVar1 == 0) { + lVar1 = FUN_1008_2fe3(0x3a,param_7,param_8); + } + local_e = (undefined2)((ulong)lVar1 >> 0x10); + local_10 = (int)lVar1; + if (lVar1 == 0) { + local_10 = param_7; + local_e = param_8; + } + else { + local_10 = local_10 + 1; + } + local_14 = (char *)FUN_1008_2fbb(0x2e,local_10,local_e); + if (local_14 == (char *)0x0) { + local_14 = (char *)FUN_1008_2ea9(local_10,local_e); + } + local_8 = local_10 - param_7; + if (0x43 < local_8) { + local_8 = 0x43; + } + local_a = (int)(char *)local_14 - local_10; + if (8 < local_a) { + local_a = 8; + } + local_c = 0; + lVar1 = FUN_1008_2fbb(0x3f,local_10,local_e); + if (lVar1 == 0) { + lVar1 = FUN_1008_2fbb(0x2a,local_10,local_e); + if (lVar1 == 0) goto LAB_1008_2784; + } + local_c = 8; +LAB_1008_2784: + if (local_8 != 0) { + local_c = local_c | 4; + } + if (local_a != 0) { + local_c = local_c | 2; + } + if (*local_14 != '\0') { + local_c = local_c | 1; + } + if (param_5 != 0 || param_6 != 0) { + FUN_1008_2f07(local_8,param_7,param_8,param_5,param_6); + } + if (param_3 != 0 || param_4 != 0) { + FUN_1008_2f07(local_a,local_10,local_e,param_3,param_4); + } + if (param_1 != 0 || param_2 != 0) { + FUN_1008_2f07(4,(char *)local_14,local_14._2_2_,param_1,param_2); + } + return local_c; +} + + +/* ===== 1008:2819 FUN_1008_2819 ===== */ + +char * __stdcall16far FUN_1008_2819(undefined2 param_1,undefined2 param_2) + +{ + int iVar1; + int iVar2; + undefined4 local_e; + char *local_8; + undefined2 local_6; + + iVar1 = FUN_1008_2e92(param_1,param_2); + local_e = (char *)GETDOSENVIRONMENT(0x1008); + do { + if (*local_e == '\0') { + local_8 = (char *)0x0; + local_6 = 0; +LAB_1008_2896: + return (char *)CONCAT22(local_6,local_8); + } + iVar2 = FUN_1008_2f70(iVar1,param_1,param_2,(char *)local_e,local_e._2_2_); + if ((iVar2 == 0) && (((char *)local_e)[iVar1] == '=')) { + local_8 = (char *)local_e + iVar1 + 1; + local_6 = local_e._2_2_; + goto LAB_1008_2896; + } + iVar2 = FUN_1008_2e92((char *)local_e,local_e._2_2_); + local_e = (char *)CONCAT22(local_e._2_2_,(char *)local_e + iVar2 + 1); + } while( true ); +} + + +/* ===== 1008:28a3 FUN_1008_28a3 ===== */ + +undefined4 __stdcall16far +FUN_1008_28a3(undefined4 param_1,undefined2 param_2,undefined1 param_3,undefined2 param_4, + undefined2 param_5,undefined2 param_6) + +{ + undefined2 uVar1; + int iVar2; + undefined2 uVar3; + bool bVar4; + + FUN_1020_03cb(); + bVar4 = true; + FUN_1020_03ef(); + if (!bVar4) { + uVar3 = (undefined2)((ulong)param_1 >> 0x10); + iVar2 = (int)param_1; + FUN_1008_2d99(iVar2,uVar3,0); + *(undefined2 *)(iVar2 + 2) = 0; + *(undefined2 *)(iVar2 + 4) = param_6; + uVar1 = FUN_1008_295c(iVar2,uVar3,param_3,param_4,param_5); + *(undefined2 *)(iVar2 + 2) = uVar1; + if (*(int *)(iVar2 + 2) == 0) { + FUN_1020_0439(); + } + } + return param_1; +} + + +/* ===== 1008:2906 FUN_1008_2906 ===== */ + +void __stdcall16far FUN_1008_2906(undefined4 param_1) + +{ + undefined2 uVar1; + + FUN_1020_03cb(); + uVar1 = (undefined2)((ulong)param_1 >> 0x10); + FUN_1008_2932((int)param_1,uVar1); + FUN_1008_2dcd((int)param_1,uVar1,0); + FUN_1020_0439(); + return; +} + + +/* ===== 1008:2932 FUN_1008_2932 ===== */ + +void __stdcall16far FUN_1008_2932(undefined4 param_1) + +{ + int iVar1; + undefined2 uVar2; + + FUN_1020_03cb(); + uVar2 = (undefined2)((ulong)param_1 >> 0x10); + iVar1 = (int)param_1; + if (*(int *)(iVar1 + 2) != 0) { + TIMEKILLEVENT(0x1020,*(undefined2 *)(iVar1 + 2)); + } + *(undefined2 *)(iVar1 + 2) = 0; + return; +} + + +/* ===== 1008:295c FUN_1008_295c ===== */ + +undefined2 __stdcall16far +FUN_1008_295c(undefined2 param_1,undefined2 param_2,undefined1 param_3,undefined2 param_4, + undefined2 param_5) + +{ + undefined1 extraout_AH; + undefined2 uVar1; + + FUN_1020_03cb(); + uVar1 = SYSTEMTIMERMAKE(0x1020,CONCAT11(extraout_AH,param_3),param_4,param_5); + return uVar1; +} + + +/* ===== 1008:298a FUN_1008_298a ===== */ + +void __cdecl16far FUN_1008_298a(void) + +{ + FUN_1020_03cb(); + return; +} + + +/* ===== 1008:2996 FUN_1008_2996 ===== */ + +undefined4 __stdcall16far +FUN_1008_2996(undefined4 param_1,undefined2 param_2,undefined2 param_3,int param_4, + undefined2 param_5,undefined2 param_6) + +{ + int unaff_BP; + int iVar1; + undefined2 uVar2; + bool bVar3; + undefined4 uVar4; + + bVar3 = true; + FUN_1020_03ef(0x1028,unaff_BP + 1); + if (!bVar3) { + uVar2 = (undefined2)((ulong)param_1 >> 0x10); + iVar1 = (int)param_1; + FUN_1018_0341(iVar1,uVar2,0,param_5,param_6); + FUN_1018_0627(iVar1,uVar2); + if (param_4 == 0) { + *(undefined2 *)(iVar1 + 0x1d) = param_3; + *(undefined2 *)(iVar1 + 0x1f) = 0; + } + else { + uVar4 = FUN_1008_302c(param_3,param_4); + *(undefined2 *)(iVar1 + 0x1d) = (int)uVar4; + *(undefined2 *)(iVar1 + 0x1f) = (int)((ulong)uVar4 >> 0x10); + } + *(undefined2 *)(iVar1 + 0x21) = 0; + *(undefined2 *)(iVar1 + 0x23) = 0; + *(undefined1 *)(iVar1 + 0x25) = 0; + } + return param_1; +} + + +/* ===== 1008:2a0e FUN_1008_2a0e ===== */ + +void __stdcall16far FUN_1008_2a0e(undefined4 param_1) + +{ + int unaff_BP; + int iVar1; + int iVar2; + undefined2 uVar3; + undefined2 uVar4; + + iVar1 = unaff_BP + 1; + uVar4 = 0x1028; + uVar3 = (undefined2)((ulong)param_1 >> 0x10); + iVar2 = (int)param_1; + if (*(int *)(iVar2 + 0x1f) != 0) { + FUN_1008_3099(*(undefined2 *)(iVar2 + 0x1d),*(undefined2 *)(iVar2 + 0x1f)); + } + FUN_1018_03ff(iVar2,uVar3,0); + FUN_1020_0439(uVar4,iVar1); + return; +} + + +/* ===== 1008:2a45 FUN_1008_2a45 ===== */ + +uint __stdcall16far FUN_1008_2a45(undefined4 param_1) + +{ + uint in_AX; + uint uVar1; + int iVar2; + undefined2 uVar3; + undefined2 local_8; + + uVar3 = (undefined2)((ulong)param_1 >> 0x10); + iVar2 = (int)param_1; + if (*(int *)(iVar2 + 2) == 0) { + FUN_1018_0627(iVar2,uVar3); + FUN_1018_05f3(iVar2,uVar3); + *(undefined1 *)(iVar2 + 0x25) = 0; + if (*(int *)(iVar2 + 6) == 0 && *(int *)(iVar2 + 8) == 0) { + local_8 = 0; + } + else { + local_8 = *(undefined2 *)((int)*(undefined4 *)(iVar2 + 6) + 4); + } + in_AX = (*DAT_1028_0652)(0x1018,*(undefined2 *)(iVar2 + 0x21),*(undefined2 *)(iVar2 + 0x23), + *(undefined2 *)(iVar2 + 0x12),*(undefined2 *)(iVar2 + 0x14),local_8, + *(undefined2 *)(iVar2 + 0x1d),*(undefined2 *)(iVar2 + 0x1f), + DAT_1028_06fe); + *(uint *)(iVar2 + 4) = in_AX; + if (*(int *)(iVar2 + 4) == 0) { + *(undefined2 *)(iVar2 + 2) = 0xffff; + } + } + uVar1 = in_AX & 0xff00; + if (*(int *)(iVar2 + 2) == 0) { + uVar1 = uVar1 + 1; + } + return uVar1; +} + + +/* ===== 1008:2ae3 FUN_1008_2ae3 ===== */ + +int __stdcall16far FUN_1008_2ae3(undefined4 param_1) + +{ + undefined2 uVar1; + int iVar2; + int iVar3; + undefined2 uVar4; + undefined2 uVar5; + undefined2 uVar6; + undefined2 local_8; + undefined2 local_6; + + uVar4 = (undefined2)((ulong)param_1 >> 0x10); + iVar2 = (int)param_1; + if (*(int *)(iVar2 + 2) == 0) { + FUN_1018_0627(iVar2,uVar4); + FUN_1018_05f3(iVar2,uVar4); + *(undefined1 *)(iVar2 + 0x25) = 1; + if (*(int *)(iVar2 + 6) == 0 && *(int *)(iVar2 + 8) == 0) { + local_8 = 0; + } + else { + local_8 = *(undefined2 *)((int)*(undefined4 *)(iVar2 + 6) + 4); + } + uVar5 = (undefined2)((ulong)DAT_1028_064e >> 0x10); + uVar1 = *(undefined2 *)((int)DAT_1028_064e + 0xe); + uVar5 = *(undefined2 *)((int)DAT_1028_064e + 0x10); + local_6 = (*DAT_1028_0656)(0x1018,*(undefined2 *)(iVar2 + 0x21),*(undefined2 *)(iVar2 + 0x23), + *(undefined2 *)(iVar2 + 0x12),*(undefined2 *)(iVar2 + 0x14),local_8, + *(undefined2 *)(iVar2 + 0x1d),*(undefined2 *)(iVar2 + 0x1f), + DAT_1028_06fe); + uVar6 = (undefined2)((ulong)DAT_1028_064e >> 0x10); + iVar3 = (int)DAT_1028_064e; + *(undefined2 *)(iVar3 + 0xe) = uVar1; + *(undefined2 *)(iVar3 + 0x10) = uVar5; + if (local_6 == -1) { + *(undefined2 *)(iVar2 + 2) = 0xffff; + } + *(undefined2 *)(iVar2 + 4) = 0; + } + else { + local_6 = *(int *)(iVar2 + 2); + } + return local_6; +} + + +/* ===== 1008:2bb1 FUN_1008_2bb1 ===== */ + +void __stdcall16far FUN_1008_2bb1(undefined2 param_1,undefined4 param_2) + +{ + undefined2 uVar1; + + uVar1 = (undefined2)((ulong)param_2 >> 0x10); + if (*(int *)((int)param_2 + 4) != 0) { + FUN_1018_060d((int)param_2,uVar1); + } + return; +} + + +/* ===== 1008:2bd1 FUN_1008_2bd1 ===== */ + +void __stdcall16far FUN_1008_2bd1(undefined4 param_1,undefined2 param_2) + +{ + undefined2 uVar1; + + uVar1 = (undefined2)((ulong)param_1 >> 0x10); + if (*(char *)((int)param_1 + 0x25) != '\0') { + FUN_1018_085a((int)param_1,uVar1,0x2bb1,0x1008); + ENDDIALOG(0x1018,param_2); + } + return; +} + + +/* ===== 1008:2c08 FUN_1008_2c08 ===== */ + +void __stdcall16far FUN_1008_2c08(int *param_1) + +{ + (*(code *)*(undefined2 *)(*param_1 + 0x38))(); + return; +} + + +/* ===== 1008:2c1f FUN_1008_2c1f ===== */ + +void __stdcall16far FUN_1008_2c1f(int *param_1,undefined4 param_2) + +{ + char cVar1; + int iVar2; + undefined2 uVar3; + undefined2 uVar4; + + uVar3 = (undefined2)((ulong)DAT_1028_064e >> 0x10); + iVar2 = (int)param_2; + uVar4 = (undefined2)((ulong)param_2 >> 0x10); + if (((int)((ulong)param_1 >> 0x10) == ((int *)DAT_1028_064e)[5]) && + ((int *)param_1 == (int *)((int *)DAT_1028_064e)[4])) { + cVar1 = (*(code *)*(undefined2 *)(*DAT_1028_064e + 0x44))(); + *(int *)(iVar2 + 10) = (int)(cVar1 == '\0'); + *(undefined2 *)(iVar2 + 0xc) = 0; + } + else { + cVar1 = (*(code *)*(undefined2 *)(*param_1 + 0x3c))(); + *(int *)(iVar2 + 10) = (int)(cVar1 == '\0'); + *(undefined2 *)(iVar2 + 0xc) = 0; + } + return; +} + + +/* ===== 1008:2c83 FUN_1008_2c83 ===== */ + +void __stdcall16far FUN_1008_2c83(undefined2 param_1,undefined2 param_2,undefined4 param_3) + +{ + int *piVar1; + int iVar2; + int unaff_BP; + int iVar3; + undefined2 uVar4; + long lVar5; + undefined2 uVar6; + undefined2 uVar7; + + iVar3 = unaff_BP + 1; + uVar7 = 0x1028; + uVar4 = (undefined2)((ulong)param_3 >> 0x10); + uVar6 = *(undefined2 *)((int)param_3 + 4); + SETFOCUS(); + lVar5 = FUN_1018_0097(*(undefined2 *)((int)param_3 + 4)); + uVar4 = (undefined2)((ulong)lVar5 >> 0x10); + iVar2 = (int)lVar5; + if ((lVar5 != 0) && (*(int *)(iVar2 + 0x43) != 0 || *(int *)(iVar2 + 0x45) != 0)) { + piVar1 = (int *)*(undefined4 *)(iVar2 + 0x43); + (*(code *)*(undefined2 *)(*piVar1 + 0xc)) + (0x1018,(int *)piVar1,(int)((ulong)piVar1 >> 0x10),uVar6,lVar5,uVar7,iVar3); + } + DAT_1028_06f2 = 1; + return; +} + + +/* ===== 1008:2cd9 FUN_1008_2cd9 ===== */ + +void __stdcall16far FUN_1008_2cd9(undefined2 param_1,undefined2 param_2,undefined4 param_3) + +{ + undefined2 uVar1; + + uVar1 = (undefined2)((ulong)param_3 >> 0x10); + *(undefined2 *)((int)param_3 + 10) = 0; + *(undefined2 *)((int)param_3 + 0xc) = 0; + return; +} + + +/* ===== 1008:2cf2 FUN_1008_2cf2 ===== */ + +void __stdcall16far FUN_1008_2cf2(int *param_1) + +{ + char cVar1; + undefined2 uVar2; + + uVar2 = (undefined2)((ulong)param_1 >> 0x10); + if (*(char *)((int)(int *)param_1 + 0x25) == '\0') { + FUN_1018_0f38((int *)param_1,uVar2); + } + else { + cVar1 = (*(code *)*(undefined2 *)(*param_1 + 0x3c))(); + if (cVar1 != '\0') { + (*(code *)*(undefined2 *)(*param_1 + 0x44))(); + (*(code *)*(undefined2 *)(*param_1 + 0x50))(); + } + } + return; +} + + +/* ===== 1008:2d3a FUN_1008_2d3a ===== */ + +void __stdcall16far FUN_1008_2d3a(int *param_1) + +{ + undefined2 uVar1; + + uVar1 = (undefined2)((ulong)param_1 >> 0x10); + if (*(char *)((int)(int *)param_1 + 0x25) == '\0') { + FUN_1018_0f38((int *)param_1,uVar1); + } + else { + (*(code *)*(undefined2 *)(*param_1 + 0x50))(); + } + return; +} + + +/* ===== 1008:2d66 FUN_1008_2d66 ===== */ + +void __stdcall16far FUN_1008_2d66(void) + +{ + FUN_1020_16e1(); + return; +} + + +/* ===== 1008:2d87 FUN_1008_2d87 ===== */ + +void __cdecl16far FUN_1008_2d87(void) + +{ + FUN_1020_005d(); + return; +} + + +/* ===== 1008:2d99 FUN_1008_2d99 ===== */ + +undefined4 __stdcall16far FUN_1008_2d99(undefined4 param_1) + +{ + int unaff_BP; + + FUN_1020_03ef(0x1028,unaff_BP + 1); + return param_1; +} + + +/* ===== 1008:2db3 FUN_1008_2db3 ===== */ + +void __stdcall16far FUN_1008_2db3(int *param_1) + +{ + (*(code *)*(undefined2 *)(*param_1 + 8))(); + return; +} + + +/* ===== 1008:2dcd FUN_1008_2dcd ===== */ + +void __stdcall16far FUN_1008_2dcd(void) + +{ + int unaff_BP; + + FUN_1020_0439(0x1028,unaff_BP + 1); + return; +} + + +/* ===== 1008:2de0 FUN_1008_2de0 ===== */ + +uint __cdecl16far FUN_1008_2de0(void) + +{ + uint uVar1; + + uVar1 = (DAT_1028_06f6 | DAT_1028_06f8) & 0xff00; + if ((DAT_1028_06f6 | DAT_1028_06f8) == 0) { + uVar1 = 1; + } + return uVar1; +} + + +/* ===== 1008:2dff FUN_1008_2dff ===== */ + +void __cdecl16far FUN_1008_2dff(void) + +{ + char cVar1; + int unaff_BP; + undefined4 uVar2; + + cVar1 = FUN_1008_2de0(0x1028,unaff_BP + 1); + uVar2 = CONCAT22(DAT_1028_06f8,DAT_1028_06f6); + if (cVar1 != '\0') { + uVar2 = FUN_1020_012d(DAT_1028_06f4); + } + DAT_1028_06f8 = (undefined2)((ulong)uVar2 >> 0x10); + DAT_1028_06f6 = (undefined2)uVar2; + return; +} + + +/* ===== 1008:2e22 FUN_1008_2e22 ===== */ + +undefined2 __stdcall16far FUN_1008_2e22(int param_1) + +{ + char cVar1; + undefined2 local_6; + + if (param_1 != 0) { + if (DAT_1028_06fa == '\0') { + cVar1 = FUN_1008_2de0(); + if (cVar1 == '\0') { + FUN_1020_0147(DAT_1028_06f4,DAT_1028_06f6,DAT_1028_06f8); + DAT_1028_06f6 = 0; + DAT_1028_06f8 = 0; + local_6 = 2; + } + else { + local_6 = 0; + } + } + else { + local_6 = 1; + } + } + return local_6; +} + + +/* ===== 1008:2e76 FUN_1008_2e76 ===== */ + +void __cdecl16far FUN_1008_2e76(void) + +{ + int unaff_BP; + + FUN_1008_2dff(0x1028,unaff_BP + 1); + DAT_1028_070e = 0x2e22; + DAT_1028_0710 = 0x1008; + return; +} + + +/* ===== 1008:2e92 FUN_1008_2e92 ===== */ + +int __stdcall16far FUN_1008_2e92(char *param_1) + +{ + char *pcVar1; + int iVar2; + char *pcVar3; + + pcVar3 = (char *)param_1; + iVar2 = -1; + do { + if (iVar2 == 0) break; + iVar2 = iVar2 + -1; + pcVar1 = pcVar3; + pcVar3 = pcVar3 + 1; + } while (*pcVar1 != '\0'); + return -2 - iVar2; +} + + +/* ===== 1008:2ea9 FUN_1008_2ea9 ===== */ + +char * __stdcall16far FUN_1008_2ea9(char *param_1) + +{ + char *pcVar1; + int iVar2; + char *pcVar3; + undefined2 uVar4; + + uVar4 = (undefined2)((ulong)param_1 >> 0x10); + pcVar3 = (char *)param_1; + iVar2 = -1; + do { + if (iVar2 == 0) break; + iVar2 = iVar2 + -1; + pcVar1 = pcVar3; + pcVar3 = pcVar3 + 1; + } while (*pcVar1 != '\0'); + return (char *)CONCAT22(uVar4,pcVar3 + -1); +} + + +/* ===== 1008:2ec0 FUN_1008_2ec0 ===== */ + +undefined1 * __stdcall16far FUN_1008_2ec0(int param_1,undefined1 *param_2,undefined1 *param_3) + +{ + undefined1 *puVar1; + undefined1 *puVar2; + undefined1 *puVar3; + undefined1 *puVar4; + byte bVar5; + + bVar5 = 0; + puVar3 = (undefined1 *)param_2; + puVar4 = (undefined1 *)param_3; + if (puVar3 < puVar4) { + bVar5 = 1; + puVar3 = puVar3 + param_1 + -1; + puVar4 = puVar4 + param_1 + -1; + } + for (; param_1 != 0; param_1 = param_1 + -1) { + puVar2 = puVar4; + puVar4 = puVar4 + (uint)bVar5 * -2 + 1; + puVar1 = puVar3; + puVar3 = puVar3 + (uint)bVar5 * -2 + 1; + *puVar2 = *puVar1; + } + return param_3; +} + + +/* ===== 1008:2ee5 FUN_1008_2ee5 ===== */ + +char * __stdcall16far FUN_1008_2ee5(char *param_1,char *param_2) + +{ + char *pcVar1; + char *pcVar2; + uint uVar3; + char *pcVar4; + char *pcVar5; + undefined2 uVar6; + + uVar6 = (undefined2)((ulong)param_1 >> 0x10); + pcVar4 = (char *)param_1; + uVar3 = 0xffff; + pcVar5 = pcVar4; + do { + if (uVar3 == 0) break; + uVar3 = uVar3 - 1; + pcVar1 = pcVar5; + pcVar5 = pcVar5 + 1; + } while (*pcVar1 != '\0'); + pcVar5 = (char *)param_2; + for (uVar3 = ~uVar3; uVar3 != 0; uVar3 = uVar3 - 1) { + pcVar2 = pcVar5; + pcVar5 = pcVar5 + 1; + pcVar1 = pcVar4; + pcVar4 = pcVar4 + 1; + *pcVar2 = *pcVar1; + } + return param_2; +} + + +/* ===== 1008:2f07 FUN_1008_2f07 ===== */ + +char * __stdcall16far FUN_1008_2f07(int param_1,char *param_2,char *param_3) + +{ + char *pcVar1; + char *pcVar2; + int iVar3; + char *pcVar4; + char *pcVar5; + undefined2 uVar6; + undefined2 uVar7; + + uVar6 = (undefined2)((ulong)param_2 >> 0x10); + pcVar4 = (char *)param_2; + iVar3 = param_1; + pcVar5 = pcVar4; + do { + if (iVar3 == 0) break; + iVar3 = iVar3 + -1; + pcVar1 = pcVar5; + pcVar5 = pcVar5 + 1; + } while (*pcVar1 != '\0'); + uVar7 = (undefined2)((ulong)param_3 >> 0x10); + pcVar5 = (char *)param_3; + for (param_1 = param_1 - iVar3; param_1 != 0; param_1 = param_1 + -1) { + pcVar2 = pcVar5; + pcVar5 = pcVar5 + 1; + pcVar1 = pcVar4; + pcVar4 = pcVar4 + 1; + *pcVar2 = *pcVar1; + } + *pcVar5 = '\0'; + return param_3; +} + + +/* ===== 1008:2f2f FUN_1008_2f2f ===== */ + +byte * __stdcall16far FUN_1008_2f2f(byte *param_1,byte *param_2) + +{ + byte *pbVar1; + uint uVar2; + byte *pbVar3; + byte *pbVar4; + undefined2 uVar5; + + pbVar3 = (byte *)param_1; + uVar5 = (undefined2)((ulong)param_2 >> 0x10); + pbVar4 = (byte *)param_2; + for (uVar2 = (uint)*param_1; pbVar3 = pbVar3 + 1, uVar2 != 0; uVar2 = uVar2 - 1) { + pbVar1 = pbVar4; + pbVar4 = pbVar4 + 1; + *pbVar1 = *pbVar3; + } + *pbVar4 = 0; + return param_2; +} + + +/* ===== 1008:2f4d FUN_1008_2f4d ===== */ + +undefined4 __stdcall16far +FUN_1008_2f4d(undefined2 param_1,undefined2 param_2,undefined2 param_3,undefined2 param_4) + +{ + undefined4 uVar1; + + uVar1 = FUN_1008_2ea9(param_3,param_4); + FUN_1008_2ee5(param_1,param_2,uVar1); + return CONCAT22(param_4,param_3); +} + + +/* ===== 1008:2f70 FUN_1008_2f70 ===== */ + +void __stdcall16far FUN_1008_2f70(int param_1,char *param_2,char *param_3) + +{ + char *pcVar1; + char *pcVar2; + byte bVar3; + int iVar4; + undefined1 uVar5; + int iVar6; + uint uVar7; + char *pcVar8; + char *pcVar9; + undefined2 uVar10; + undefined2 uVar11; + bool bVar12; + + uVar10 = (undefined2)((ulong)param_2 >> 0x10); + pcVar9 = (char *)param_2; + if (param_1 != 0) { + iVar4 = 0; + iVar6 = param_1; + pcVar8 = pcVar9; + do { + if (iVar6 == 0) break; + iVar6 = iVar6 + -1; + pcVar1 = pcVar8; + pcVar8 = pcVar8 + 1; + } while (*pcVar1 != '\0'); + param_1 = param_1 - iVar6; + bVar12 = param_1 == 0; + uVar11 = (undefined2)((ulong)param_3 >> 0x10); + pcVar8 = (char *)param_3; +LAB_1008_2f90: + do { + if (param_1 != 0) { + param_1 = param_1 + -1; + pcVar2 = pcVar9; + pcVar9 = pcVar9 + 1; + pcVar1 = pcVar8; + pcVar8 = pcVar8 + 1; + bVar12 = *pcVar1 == *pcVar2; + if (bVar12) goto LAB_1008_2f90; + } + if (bVar12) { + return; + } + bVar3 = pcVar8[-1]; + uVar5 = (undefined1)((uint)iVar4 >> 8); + iVar4 = CONCAT11(uVar5,bVar3); + if ((0x60 < bVar3) && (bVar3 < 0x7b)) { + iVar4 = CONCAT11(uVar5,bVar3 - 0x20); + } + bVar3 = pcVar9[-1]; + uVar7 = (uint)bVar3; + if ((0x60 < bVar3) && (bVar3 < 0x7b)) { + uVar7 = (uint)(byte)(bVar3 - 0x20); + } + iVar4 = iVar4 - uVar7; + bVar12 = true; + } while (iVar4 == 0); + } + return; +} + + +/* ===== 1008:2fbb FUN_1008_2fbb ===== */ + +char * __stdcall16far FUN_1008_2fbb(char param_1,char *param_2) + +{ + char *pcVar1; + char *pcVar2; + uint uVar3; + undefined2 uVar4; + char *pcVar5; + undefined2 uVar6; + bool bVar7; + + uVar6 = (undefined2)((ulong)param_2 >> 0x10); + pcVar5 = (char *)param_2; + uVar3 = 0xffff; + bVar7 = true; + pcVar2 = pcVar5; + do { + if (uVar3 == 0) break; + uVar3 = uVar3 - 1; + pcVar1 = pcVar2; + pcVar2 = pcVar2 + 1; + bVar7 = *pcVar1 == '\0'; + } while (!bVar7); + uVar3 = ~uVar3; + do { + if (uVar3 == 0) break; + uVar3 = uVar3 - 1; + pcVar1 = pcVar5; + pcVar5 = pcVar5 + 1; + bVar7 = param_1 == *pcVar1; + } while (!bVar7); + pcVar2 = (char *)0x0; + uVar4 = 0; + if (bVar7) { + pcVar2 = pcVar5 + -1; + uVar4 = uVar6; + } + return (char *)CONCAT22(uVar4,pcVar2); +} + + +/* ===== 1008:2fe3 FUN_1008_2fe3 ===== */ + +char * __stdcall16far FUN_1008_2fe3(char param_1,char *param_2) + +{ + char *pcVar1; + char *pcVar2; + uint uVar3; + undefined2 uVar4; + char *pcVar5; + undefined2 uVar6; + bool bVar7; + + uVar6 = (undefined2)((ulong)param_2 >> 0x10); + pcVar5 = (char *)param_2; + uVar3 = 0xffff; + do { + if (uVar3 == 0) break; + uVar3 = uVar3 - 1; + pcVar1 = pcVar5; + pcVar5 = pcVar5 + 1; + } while (*pcVar1 != '\0'); + uVar3 = ~uVar3; + pcVar5 = pcVar5 + -1; + bVar7 = pcVar5 == (char *)0x0; + do { + if (uVar3 == 0) break; + uVar3 = uVar3 - 1; + pcVar1 = pcVar5; + pcVar5 = pcVar5 + -1; + bVar7 = param_1 == *pcVar1; + } while (!bVar7); + pcVar2 = (char *)0x0; + uVar4 = 0; + if (bVar7) { + pcVar2 = pcVar5 + 1; + uVar4 = uVar6; + } + return (char *)CONCAT22(uVar4,pcVar2); +} + + +/* ===== 1008:300a FUN_1008_300a ===== */ + +void __stdcall16far FUN_1008_300a(char *param_1,char *param_2) + +{ + char *pcVar1; + uint uVar2; + int iVar3; + char *pcVar4; + char *pcVar5; + undefined2 uVar6; + + uVar6 = (undefined2)((ulong)param_1 >> 0x10); + pcVar4 = (char *)param_1; + uVar2 = 0xffff; + pcVar5 = pcVar4; + do { + if (uVar2 == 0) break; + uVar2 = uVar2 - 1; + pcVar1 = pcVar5; + pcVar5 = pcVar5 + 1; + } while (*pcVar1 != '\0'); + iVar3 = ~uVar2 - 1; + pcVar5 = (char *)param_2; + *param_2 = (char)iVar3; + for (; pcVar5 = pcVar5 + 1, iVar3 != 0; iVar3 = iVar3 + -1) { + pcVar1 = pcVar4; + pcVar4 = pcVar4 + 1; + *pcVar5 = *pcVar1; + } + return; +} + + +/* ===== 1008:302c FUN_1008_302c ===== */ + +undefined4 __stdcall16far FUN_1008_302c(char *param_1) + +{ + int iVar1; + long lVar2; + undefined4 uVar3; + + uVar3 = 0; + if (((char *)param_1 != (char *)0x0 || param_1._2_2_ != 0) && (uVar3 = 0, *param_1 != '\0')) { + iVar1 = FUN_1008_2e92((char *)param_1,param_1._2_2_); + lVar2 = FUN_1020_012d(iVar1 + 1); + uVar3 = 0; + if (lVar2 != 0) { + uVar3 = FUN_1008_2ec0(iVar1 + 1,(char *)param_1,param_1._2_2_,lVar2); + } + } + return uVar3; +} + + +/* ===== 1008:3099 FUN_1008_3099 ===== */ + +void __stdcall16far FUN_1008_3099(int param_1,int param_2) + +{ + int iVar1; + + if (param_1 != 0 || param_2 != 0) { + iVar1 = FUN_1008_2e92(param_1,param_2); + FUN_1020_0147(iVar1 + 1,param_1,param_2); + } + return; +} + + +/* ===== 1010:0002 FUN_1010_0002 ===== */ + +void __cdecl16far FUN_1010_0002(void) + +{ + if (0x1f < DAT_1028_4781) { + FREELIBRARY(DAT_1028_4781); + } + DAT_1028_4784 = 0; + DAT_1028_4750 = 0; + DAT_1028_4752 = 0; + DAT_1028_4754 = 0; + DAT_1028_4756 = 0; + DAT_1028_4758 = 0; + DAT_1028_475a = 0; + DAT_1028_475c = 0; + DAT_1028_475e = 0; + DAT_1028_4760 = 0; + DAT_1028_4762 = 0; + DAT_1028_4764 = 0; + DAT_1028_4766 = 0; + DAT_1028_4768 = 0; + DAT_1028_476a = 0; + DAT_1028_476c = 0; + DAT_1028_476e = 0; + DAT_1028_4770 = 0; + DAT_1028_4772 = 0; + DAT_1028_4774 = 0; + DAT_1028_4776 = 0; + DAT_1028_4778 = 0; + DAT_1028_477a = 0; + return; +} + + +/* ===== 1010:0079 FUN_1010_0079 ===== */ + +void __cdecl16far FUN_1010_0079(void) + +{ + uint uVar1; + int unaff_BP; + int iVar2; + undefined2 uVar3; + + iVar2 = unaff_BP + 1; + uVar3 = 0x1028; + if ((DAT_1028_4784 != '\0') && (DAT_1028_4778 != (code *)0x0 || DAT_1028_477a != 0)) { + uVar1 = GETCURRENTTASK(); + (*DAT_1028_4778)(0x1228,uVar1,uVar3,iVar2); + FUN_1010_0002(); + } + return; +} + + +/* ===== 1010:00a2 FUN_1010_00a2 ===== */ + +undefined2 __stdcall16far +FUN_1010_00a2(char *param_1,undefined2 param_2,undefined2 param_3,undefined2 param_4) + +{ + undefined1 extraout_AH; + undefined1 extraout_AH_00; + undefined1 extraout_AH_01; + uint uVar1; + undefined1 extraout_AH_02; + undefined1 extraout_AH_03; + undefined1 uVar2; + int unaff_BP; + void *unaff_SS; + undefined4 uVar3; + char *pcVar4; + void *arg3; + undefined1 local_163 [9]; + undefined1 local_15a [5]; + undefined1 local_155 [256]; + char local_55 [80]; + undefined1 local_5; + undefined2 uStack_4; + int iStack_2; + + iStack_2 = unaff_BP + 1; + uStack_4 = 0x1028; + local_5 = 0; + local_155[0] = 0; + FUN_1008_2643(local_155,unaff_SS,param_3,param_4,local_55,unaff_SS); + if (local_55[0] == '\0') { + GETWINDOWSDIRECTORY(0x1008,0xff,local_155); + FUN_1008_2643(local_155,unaff_SS,param_3,param_4,local_55,unaff_SS); + if (local_55[0] == '\0') { + arg3 = unaff_SS; + GETSYSTEMDIRECTORY(0x1008,0xff,local_155); + FUN_1008_2643(local_155,unaff_SS,param_3,param_4,local_55,unaff_SS); + if (local_55[0] == '\0') { + uVar1 = GETMODULEHANDLE((char *)CONCAT22(param_2,param_1)); + GETMODULEFILENAME(0x100,(void *)CONCAT22(uVar1,unaff_SS),(short)arg3); + FUN_1008_26b0(local_15a,unaff_SS,local_163,unaff_SS,local_155,unaff_SS,local_155,unaff_SS); + FUN_1008_2643(local_155,unaff_SS,param_3,param_4,local_55,unaff_SS); + if (local_55[0] == '\0') { + pcVar4 = (char *)CONCAT22(unaff_SS,local_55); + uVar3 = FUN_1008_2819(0x46a,0x1028); + FUN_1008_2643(uVar3,param_3,param_4,pcVar4); + uVar2 = extraout_AH_03; + if (local_55[0] != '\0') { + local_5 = 1; + } + } + else { + local_5 = 1; + uVar2 = extraout_AH_02; + } + } + else { + local_5 = 1; + uVar2 = extraout_AH_01; + } + } + else { + local_5 = 1; + uVar2 = extraout_AH_00; + } + } + else { + local_5 = 1; + uVar2 = extraout_AH; + } + return CONCAT11(uVar2,local_5); +} + + +/* ===== 1010:01c2 FUN_1010_01c2 ===== */ + +char __stdcall16far +FUN_1010_01c2(undefined1 param_1,undefined1 param_2,char param_3,undefined2 param_4, + undefined2 param_5) + +{ + char cVar1; + uint uVar2; + int iVar3; + undefined2 in_DX; + undefined2 extraout_DX; + undefined1 in_stack_0000fffa; + char cVar4; + + cVar4 = '\x01'; + cVar1 = cVar4; + if (DAT_1028_4784 == '\0') { + if (DAT_1028_478c == '\0') { + SETERRORMODE(0x8000); + DAT_1028_4781 = LOADLIBRARY((char *)0x1028478d); + SETERRORMODE(0); + } + else { + cVar1 = FUN_1010_00a2(param_4,param_5,0x478d,0x1028); + in_DX = extraout_DX; + if (cVar1 == '\0') { + DAT_1028_4781 = 0; + } + else { + DAT_1028_4781 = LOADLIBRARY((char *)0x1028478d); + } + } + cVar1 = DAT_1028_4784; + if (0x1f < DAT_1028_4781) { + DAT_1028_4750 = + (code *)GETPROCADDRESS(0x470,(char *)CONCAT13(cVar4,CONCAT12(in_stack_0000fffa, + DAT_1028_4781))); + DAT_1028_4752 = in_DX; + DAT_1028_4754 = + GETPROCADDRESS(0x482,(char *)CONCAT13(cVar4,CONCAT12(in_stack_0000fffa,DAT_1028_4781))); + DAT_1028_4756 = in_DX; + DAT_1028_4758 = + GETPROCADDRESS(0x493,(char *)CONCAT13(cVar4,CONCAT12(in_stack_0000fffa,DAT_1028_4781))); + DAT_1028_475a = in_DX; + DAT_1028_475c = + (code *)GETPROCADDRESS(0x4a3,(char *)CONCAT13(cVar4,CONCAT12(in_stack_0000fffa, + DAT_1028_4781))); + DAT_1028_475e = in_DX; + DAT_1028_4760 = + GETPROCADDRESS(0x4b0,(char *)CONCAT13(cVar4,CONCAT12(in_stack_0000fffa,DAT_1028_4781))); + DAT_1028_4762 = in_DX; + DAT_1028_4764 = + (code *)GETPROCADDRESS(0x4c3,(char *)CONCAT13(cVar4,CONCAT12(in_stack_0000fffa, + DAT_1028_4781))); + DAT_1028_4766 = in_DX; + DAT_1028_4768 = + (code *)GETPROCADDRESS(0x4cf,(char *)CONCAT13(cVar4,CONCAT12(in_stack_0000fffa, + DAT_1028_4781))); + DAT_1028_476a = in_DX; + DAT_1028_476c = + GETPROCADDRESS(0x4dd,(char *)CONCAT13(cVar4,CONCAT12(in_stack_0000fffa,DAT_1028_4781))); + DAT_1028_476e = in_DX; + if (DAT_1028_478c == '\0') { + DAT_1028_4770 = + GETPROCADDRESS(0x4ee,(char *)CONCAT13(cVar4,CONCAT12(in_stack_0000fffa,DAT_1028_4781))) + ; + DAT_1028_4772 = in_DX; + } + else { + DAT_1028_4770 = 0; + DAT_1028_4772 = 0; + } + DAT_1028_4774 = + GETPROCADDRESS(0x501,(char *)CONCAT13(cVar4,CONCAT12(in_stack_0000fffa,DAT_1028_4781))); + DAT_1028_4776 = in_DX; + DAT_1028_4778 = + GETPROCADDRESS(0x512,(char *)CONCAT13(cVar4,CONCAT12(in_stack_0000fffa,DAT_1028_4781))); + DAT_1028_477a = in_DX; + uVar2 = GETCURRENTTASK(); + iVar3 = (*DAT_1028_4768)(0x1228,uVar2); + DAT_1028_4784 = iVar3 != 0; + if ((bool)DAT_1028_4784) { + DAT_1028_477c = (*DAT_1028_4764)(0x1228); + iVar3 = (*DAT_1028_475c)(0x1228); + if ((iVar3 == 0) || (DAT_1028_477c < 9)) { + DAT_1028_4784 = false; + } + else { + DAT_1028_4784 = true; + } + } + if ((bool)DAT_1028_4784 == false) { + FUN_1010_0002(); + cVar1 = DAT_1028_4784; + } + else { + DAT_1028_477f = param_2; + DAT_1028_4780 = param_1; + if ((DAT_1028_478c == '\0') && (param_3 != '\0')) { + iVar3 = (*DAT_1028_4750)(0x1228,DAT_1028_06fe); + DAT_1028_477e = iVar3 != 0; + cVar1 = DAT_1028_4784; + } + else { + DAT_1028_477e = 0; + cVar1 = DAT_1028_4784; + } + } + } + } + return cVar1; +} + + +/* ===== 1010:03af FUN_1010_03af ===== */ + +undefined2 __stdcall16far +FUN_1010_03af(undefined1 param_1,undefined1 param_2,undefined1 param_3,undefined2 param_4, + undefined2 param_5) + +{ + undefined2 uVar1; + + uVar1 = FUN_1010_01c2(param_1,param_2,param_3,param_4,param_5); + DAT_1028_4783 = 0; + return uVar1; +} + + +/* ===== 1010:03e0 FUN_1010_03e0 ===== */ + +void __stdcall16far FUN_1010_03e0(undefined4 param_1) + +{ + int unaff_BP; + + FUN_1010_0079(0x1028,unaff_BP + 1); + FUN_1018_1b08((int)param_1,(int)((ulong)param_1 >> 0x10),0); + FUN_1020_0439(); + return; +} + + +/* ===== 1010:0405 FUN_1010_0405 ===== */ + +undefined1 __stdcall16far FUN_1010_0405(byte *param_1) + +{ + byte *pbVar1; + byte *pbVar2; + int iVar3; + uint uVar4; + int unaff_BP; + byte *pbVar5; + undefined2 unaff_SS; + undefined1 local_185 [128]; + byte local_105; + byte abStack_104 [255]; + undefined1 local_5; + undefined2 uStack_4; + int iStack_2; + + iStack_2 = unaff_BP + 1; + uStack_4 = 0x1028; + pbVar5 = (byte *)param_1; + local_105 = *param_1; + pbVar2 = abStack_104; + for (uVar4 = (uint)local_105; pbVar5 = pbVar5 + 1, uVar4 != 0; uVar4 = uVar4 - 1) { + pbVar1 = pbVar2; + pbVar2 = pbVar2 + 1; + *pbVar1 = *pbVar5; + } + FUN_1020_0667(&local_105,unaff_SS,local_185,unaff_SS); + FUN_1020_06ab(1,local_185,unaff_SS); + iVar3 = FUN_1020_0388(); + if (iVar3 == 0) { + local_5 = 1; + FUN_1020_072c(local_185,unaff_SS); + FUN_1020_038f(); + } + else { + local_5 = 0; + } + return local_5; +} + + +/* ===== 1010:0472 FUN_1010_0472 ===== */ + +/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */ + +void __cdecl16far FUN_1010_0472(void) + +{ + uint uVar1; + char cVar2; + undefined2 unaff_CS; + undefined2 unaff_SS; + undefined1 *puVar3; + undefined1 *puVar4; + undefined2 uVar5; + undefined2 uVar6; + undefined2 uVar7; + undefined1 local_202 [256]; + undefined1 local_102 [256]; + + DAT_1028_47a2 = GETSYSTEMDIRECTORY(unaff_CS,200,0x47a4); + puVar4 = local_102; + uVar5 = unaff_SS; + FUN_1008_300a(0x47a4,0x1028); + FUN_1020_0a51(0x470,0x1008); + puVar3 = local_202; + uVar6 = unaff_SS; + FUN_1008_300a(0x522,0x1028); + FUN_1020_0a51(puVar3,uVar6); + FUN_1020_09ec(0xff,0x486d,0x1028,puVar4,uVar5); + puVar4 = local_102; + uVar5 = unaff_SS; + FUN_1008_300a(0x47a4,0x1028); + FUN_1020_0a51(0x470,0x1008); + puVar3 = local_202; + uVar6 = unaff_SS; + FUN_1008_300a(0x52c,0x1028); + FUN_1020_0a51(puVar3,uVar6); + FUN_1020_09ec(0xff,0x496d,0x1028,puVar4,uVar5); + if (DAT_1028_47a2 != 0) { + uVar7 = 0x1028; + uVar5 = 0x478d; + puVar4 = local_102; + uVar6 = unaff_SS; + FUN_1008_300a(0x52c,0x1028); + FUN_1008_2f2f(puVar4,uVar6,uVar5,uVar7); + cVar2 = FUN_1010_0405(0x496d,0x1028); + if (cVar2 == '\0') { + cVar2 = FUN_1010_0405(0x486d,0x1028); + if (cVar2 != '\0') { + uVar5 = 0x1028; + uVar6 = 0x478d; + puVar4 = local_102; + FUN_1008_300a(0x522,0x1028); + FUN_1008_2f2f(puVar4,unaff_SS,uVar6,uVar5); + } + } + } + DAT_1028_4750 = 0; + DAT_1028_4752 = 0; + DAT_1028_4754 = 0; + DAT_1028_4756 = 0; + DAT_1028_4758 = 0; + DAT_1028_475a = 0; + DAT_1028_475c = 0; + DAT_1028_475e = 0; + DAT_1028_4760 = 0; + DAT_1028_4762 = 0; + DAT_1028_4764 = 0; + DAT_1028_4766 = 0; + DAT_1028_4768 = 0; + DAT_1028_476a = 0; + DAT_1028_476c = 0; + DAT_1028_476e = 0; + DAT_1028_4770 = 0; + DAT_1028_4772 = 0; + DAT_1028_4774 = 0; + DAT_1028_4776 = 0; + DAT_1028_4778 = 0; + DAT_1028_477a = 0; + _DAT_1028_478a = GETVERSION(); + uVar1 = _DAT_1028_478a; + if ((DAT_1028_478a == '\x03') && (DAT_1028_478b = (byte)(_DAT_1028_478a >> 8), DAT_1028_478b < 10) + ) { + DAT_1028_478c = 1; + } + else { + DAT_1028_478c = 0; + } + DAT_1028_477e = 0; + DAT_1028_477f = 0; + DAT_1028_4780 = 1; + DAT_1028_4781 = 0; + DAT_1028_4783 = 0; + DAT_1028_4784 = 0; + _DAT_1028_478a = uVar1; + return; +} + + +/* ===== 1018:0002 FUN_1018_0002 ===== */ + +void __cdecl16near FUN_1018_0002(void) + +{ + int *piVar1; + int iVar2; + int iVar3; + int in_AX; + int iVar4; + int in_BX; + int *piVar5; + int *piVar6; + bool bVar7; + + piVar5 = (int *)*(int *)(in_BX + 4); + if ((piVar5 != (int *)0x0) && (in_AX != piVar5[1])) { + bVar7 = false; + do { + iVar4 = piVar5[3]; + piVar6 = piVar5 + 4; + do { + if (iVar4 == 0) break; + iVar4 = iVar4 + -1; + piVar1 = piVar6; + piVar6 = piVar6 + 1; + bVar7 = in_AX == *piVar1; + } while (!bVar7); + if (bVar7) { + iVar2 = piVar5[3]; + iVar3 = *(int *)(in_BX + 4); + *(int *)(iVar3 + 2) = in_AX; + *(undefined2 *)(iVar3 + 4) = piVar6 + ((iVar2 + -1) * 2 - iVar4); + return; + } + piVar5 = (int *)*piVar5; + bVar7 = piVar5 == (int *)0x0; + } while (!bVar7); + } + return; +} + + +/* ===== 1018:0045 FUN_1018_0045 ===== */ + +void __stdcall16far FUN_1018_0045(undefined2 param_1,undefined2 param_2) + +{ + undefined2 unaff_CS; + + SETPROP(unaff_CS,param_2,0x67a,0x1028); + SETPROP(0x1228,param_1,0x67e,0x1028); + return; +} + + +/* ===== 1018:0071 FUN_1018_0071 ===== */ + +void __stdcall16far FUN_1018_0071(void) + +{ + undefined2 unaff_CS; + + REMOVEPROP(unaff_CS,0x67a,0x1028); + REMOVEPROP(0x1228,0x67e,0x1028); + return; +} + + +/* ===== 1018:0097 FUN_1018_0097 ===== */ + +undefined4 __stdcall16far FUN_1018_0097(int param_1) + +{ + int iVar1; + char *pcVar2; + undefined2 uVar3; + int iVar4; + undefined2 uVar5; + char *pcVar6; + + iVar1 = ISWINDOW(); + iVar4 = iVar1 >> 0xf; + uVar3 = 0; + if (iVar1 != 0) { + pcVar6 = (char *)GETWINDOWLONG(0x1228,0xfffc); + uVar5 = (undefined2)((ulong)pcVar6 >> 0x10); + pcVar2 = (char *)pcVar6; + if (((*pcVar6 == -0x18) && (-1 - (int)pcVar2 == *(int *)(pcVar2 + 1))) && + (*(int *)0x2 == 0x2e5b)) { + uVar3 = *(undefined2 *)(pcVar2 + 3); + iVar4 = *(int *)(pcVar2 + 5); + } + else { + GETPROP(0x1228,0x67a,0x1028); + iVar4 = param_1; + uVar3 = GETPROP(0x1228,0x67e,0x1028); + } + } + return CONCAT22(iVar4,uVar3); +} + + +/* ===== 1018:0103 FUN_1018_0103 ===== */ + +void __cdecl16near FUN_1018_0103(void) + +{ + (*DAT_1028_0682)(); + return; +} + + +/* ===== 1018:0133 FUN_1018_0133 ===== */ + +undefined4 __stdcall16far +FUN_1018_0133(undefined2 param_1,undefined2 param_2,undefined2 param_3,int param_4,int param_5) + +{ + int *in_BX; + undefined2 *unaff_DI; + undefined2 unaff_ES; + undefined2 unaff_SS; + + in_BX[2] = param_5; + if (param_4 < 0) { + unaff_DI = (undefined2 *)(*in_BX + 0xc); + } + else { + FUN_1018_0002(); + } + if (*(int *)&DAT_1028_0684 != 0) { + FUN_1018_0103(); + } + (*(code *)*unaff_DI)(); + return CONCAT22(param_3,param_4); +} + + +/* ===== 1018:018b FUN_1018_018b ===== */ + +void __stdcall16far +FUN_1018_018b(undefined2 param_1,undefined2 param_2,undefined2 param_3,undefined2 param_4, + undefined2 param_5) + +{ + undefined2 *puVar1; + undefined4 uVar2; + undefined2 unaff_CS; + undefined2 unaff_SS; + undefined2 uVar3; + + uVar2 = *(undefined4 *)((int)*(undefined4 *)&DAT_1028_0676 + 0x12); + uVar3 = param_5; + SETWINDOWLONG(unaff_CS,(int)uVar2,(int)((ulong)uVar2 >> 0x10),0xfffc); + FUN_1018_0045((int)*(undefined4 *)&DAT_1028_0676, + (int)((ulong)*(undefined4 *)&DAT_1028_0676 >> 0x10),param_5); + puVar1 = (undefined2 *)((int)*(undefined4 *)&DAT_1028_0676 + 0x12); + (*(code *)*puVar1)(0x1018,param_1,param_2,param_3,param_4,param_5,uVar3); + return; +} + + +/* ===== 1018:01dc FUN_1018_01dc ===== */ + +undefined1 * __stdcall16far FUN_1018_01dc(undefined2 param_1,undefined2 param_2) + +{ + undefined1 *puVar1; + ushort arg1; + undefined2 *puVar2; + undefined2 uVar3; + undefined2 in_DX; + int iVar4; + undefined2 unaff_CS; + undefined4 local_10; + undefined4 local_c; + + if (DAT_1028_066e == (undefined1 *)0x0 && DAT_1028_0670 == 0) { + arg1 = GLOBALALLOC(0x100,0); + puVar2 = (undefined2 *)GLOBALLOCK(arg1); + local_c = (undefined2 *)CONCAT22(in_DX,puVar2); + *local_c = DAT_1028_066c; + FUN_1020_16a5(5,puVar2 + 1,in_DX,0x686,0x1028); + uVar3 = DAT_1028_0674; + *(undefined2 *)((int)puVar2 + 7) = DAT_1028_0672; + *(undefined2 *)((int)puVar2 + 9) = uVar3; + local_10 = (undefined1 *)CONCAT22(in_DX,(undefined1 *)((int)puVar2 + 0xb)); + do { + *local_10 = 0xe8; + iVar4 = (int)((ulong)local_10 >> 0x10); + *(int *)((undefined1 *)local_10 + 1) = -1 - (int)(undefined1 *)local_10; + *(undefined1 **)((undefined1 *)local_10 + 3) = DAT_1028_066e; + *(int *)((undefined1 *)local_10 + 5) = DAT_1028_0670; + DAT_1028_066e = (undefined1 *)local_10; + local_10._0_2_ = (undefined1 *)local_10 + 7; + local_10 = (undefined1 *)CONCAT22(iVar4,(undefined1 *)local_10); + DAT_1028_0670 = iVar4; + } while ((undefined1 *)local_10 != (undefined1 *)0x100); + unaff_CS = 0x1228; + DAT_1028_066c = in_DX; + PRESTOCHANGOSELECTOR(0x1020,in_DX); + } + iVar4 = DAT_1028_0670; + puVar1 = DAT_1028_066e; + uVar3 = ALLOCCSTODSALIAS(unaff_CS,DAT_1028_0670); + DAT_1028_066e = *(undefined1 **)(puVar1 + 3); + DAT_1028_0670 = *(int *)(puVar1 + 5); + *(undefined2 *)(puVar1 + 3) = param_1; + *(undefined2 *)(puVar1 + 5) = param_2; + FREESELECTOR(0x1228,uVar3); + return (undefined1 *)CONCAT22(iVar4,puVar1); +} + + +/* ===== 1018:02fa FUN_1018_02fa ===== */ + +void __stdcall16far FUN_1018_02fa(int param_1,undefined2 param_2) + +{ + undefined2 uVar1; + undefined2 uVar2; + int unaff_BP; + int iVar3; + undefined2 uVar4; + int iVar5; + undefined2 uVar6; + + iVar3 = unaff_BP + 1; + uVar6 = 0x1028; + uVar4 = param_2; + iVar5 = param_1; + uVar2 = ALLOCCSTODSALIAS(); + uVar1 = DAT_1028_0670; + *(undefined2 *)(iVar5 + 3) = DAT_1028_066e; + *(undefined2 *)(iVar5 + 5) = uVar1; + FREESELECTOR(0x1228,uVar2,uVar4,iVar5,uVar2,uVar6,iVar3); + DAT_1028_066e = param_1; + DAT_1028_0670 = param_2; + return; +} + + +/* ===== 1018:0341 FUN_1018_0341 ===== */ + +undefined4 __stdcall16far +FUN_1018_0341(undefined4 param_1,undefined2 param_2,undefined2 param_3,undefined2 param_4) + +{ + int unaff_BP; + int iVar1; + undefined2 uVar2; + bool bVar3; + undefined4 uVar4; + + bVar3 = true; + FUN_1020_03ef(0x1028,unaff_BP + 1); + if (!bVar3) { + uVar2 = (undefined2)((ulong)param_1 >> 0x10); + iVar1 = (int)param_1; + FUN_1008_2d99(iVar1,uVar2,0); + *(undefined2 *)(iVar1 + 2) = 0; + *(undefined2 *)(iVar1 + 4) = 0; + *(undefined2 *)(iVar1 + 0x17) = 0; + *(undefined2 *)(iVar1 + 6) = param_3; + *(undefined2 *)(iVar1 + 8) = param_4; + if (*(int *)(iVar1 + 6) == 0 && *(int *)(iVar1 + 8) == 0) { + *(undefined2 *)(iVar1 + 0x19) = 0; + *(undefined2 *)(iVar1 + 0x1b) = 0; + } + else { + FUN_1018_069a((int)*(undefined4 *)(iVar1 + 6),(int)((ulong)*(undefined4 *)(iVar1 + 6) >> 0x10) + ,iVar1,uVar2); + } + *(undefined2 *)(iVar1 + 10) = 0; + *(undefined2 *)(iVar1 + 0xc) = 0; + *(undefined2 *)(iVar1 + 0xe) = 0; + *(undefined2 *)(iVar1 + 0x10) = 0; + uVar4 = FUN_1018_01dc(iVar1,uVar2); + *(undefined2 *)(iVar1 + 0x12) = (int)uVar4; + *(undefined2 *)(iVar1 + 0x14) = (int)((ulong)uVar4 >> 0x10); + *(undefined1 *)(iVar1 + 0x16) = 0; + FUN_1018_060d(iVar1,uVar2); + } + return param_1; +} + + +/* ===== 1018:03e9 FUN_1018_03e9 ===== */ + +void __stdcall16far FUN_1018_03e9(undefined2 param_1,undefined4 param_2) + +{ + FUN_1008_2db3((int)param_2,(int)((ulong)param_2 >> 0x10)); + return; +} + + +/* ===== 1018:03ff FUN_1018_03ff ===== */ + +void __stdcall16far FUN_1018_03ff(int *param_1) + +{ + int *piVar1; + undefined2 uVar2; + + uVar2 = (undefined2)((ulong)param_1 >> 0x10); + piVar1 = (int *)param_1; + (*(code *)*(undefined2 *)(*param_1 + 0x24))(); + FUN_1018_085a(piVar1,uVar2,0x3e9,0x1018); + if (piVar1[3] != 0 || piVar1[4] != 0) { + FUN_1018_071c((int)*(undefined4 *)(piVar1 + 3),(int)((ulong)*(undefined4 *)(piVar1 + 3) >> 0x10) + ,piVar1,uVar2); + } + FUN_1018_02fa(piVar1[9],piVar1[10]); + FUN_1008_2dcd(piVar1,uVar2,0); + FUN_1020_0439(); + return; +} + + +/* ===== 1018:0466 FUN_1018_0466 ===== */ + +undefined2 __stdcall16far FUN_1018_0466(int param_1,undefined4 param_2) + +{ + int iVar1; + undefined1 uVar2; + undefined2 unaff_SS; + + iVar1 = *(int *)((int)param_2 + 0x17); + if ((*(int *)(param_1 + -6) < 0) || (iVar1 != *(int *)(param_1 + -6))) { + uVar2 = 0; + } + else { + uVar2 = 1; + } + return CONCAT11((char)((uint)iVar1 >> 8),uVar2); +} + + +/* ===== 1018:049e FUN_1018_049e ===== */ + +uint __stdcall16far FUN_1018_049e(undefined2 param_1,int *param_2) + +{ + uint uVar1; + int iVar2; + int unaff_BP; + int *piVar3; + undefined2 uVar4; + undefined1 local_58 [82]; + char local_6; + undefined2 uStack_4; + int iStack_2; + + iStack_2 = unaff_BP + 1; + uStack_4 = 0x1028; + uVar4 = (undefined2)((ulong)param_2 >> 0x10); + piVar3 = (int *)param_2; + uVar1 = FUN_1018_0673(piVar3,uVar4,4); + if ((char)uVar1 != '\0') { + uVar1 = (*(code *)*(undefined2 *)(*param_2 + 0x20))(0x1018,piVar3,uVar4); + if ((char)uVar1 == '\0') { + uVar1 = uVar1 & 0xff00; + goto LAB_1018_04d1; + } + } + uVar1 = CONCAT11((char)(uVar1 >> 8),1); +LAB_1018_04d1: + local_6 = (char)uVar1; + if (local_6 != '\0') { + iVar2 = ISICONIC(0x1018,piVar3[2]); + uVar1 = 0; + if (iVar2 != 0) { + GETWINDOWTEXT(0x1228,0x51,local_58); + uVar1 = SETWINDOWTEXT(0x1228,local_58); + } + } + uVar1 = uVar1 & 0xff00; + if (local_6 == '\0') { + uVar1 = uVar1 + 1; + } + return uVar1; +} + + +/* ===== 1018:0524 FUN_1018_0524 ===== */ + +undefined1 __stdcall16far FUN_1018_0524(undefined2 param_1,undefined4 param_2) + +{ + char cVar1; + undefined2 uVar2; + + uVar2 = (undefined2)((ulong)param_2 >> 0x10); + if ((*(int *)((int)param_2 + 0x17) == 0) && + (cVar1 = FUN_1018_049e(param_1,(int)param_2,uVar2), cVar1 != '\0')) { + return 1; + } + return 0; +} + + +/* ===== 1018:055c FUN_1018_055c ===== */ + +uint __stdcall16far FUN_1018_055c(undefined4 param_1) + +{ + uint uVar1; + int unaff_BP; + undefined2 uVar2; + long lVar3; + undefined4 uVar4; + char local_d; + int iStack_2; + + iStack_2 = unaff_BP + 1; + local_d = '\0'; + do { + uVar2 = (undefined2)((ulong)param_1 >> 0x10); + lVar3 = FUN_1018_080d((int)param_1,uVar2,0x466,0x1018); + uVar1 = 0; + if (lVar3 != 0) { + uVar1 = FUN_1018_049e(&iStack_2,lVar3); + local_d = (char)uVar1; + } + } while ((local_d == '\0') && (uVar1 = 0, lVar3 != 0)); + if (local_d == '\0') { + uVar4 = FUN_1018_080d((int)param_1,uVar2,0x524,0x1018); + uVar1 = (uint)uVar4 | (uint)((ulong)uVar4 >> 0x10); + if (uVar1 == 0) { + return 1; + } + } + return uVar1 & 0xff00; +} + + +/* ===== 1018:05dc FUN_1018_05dc ===== */ + +undefined2 __stdcall16far FUN_1018_05dc(void) + +{ + return 0; +} + + +/* ===== 1018:05f3 FUN_1018_05f3 ===== */ + +void __stdcall16far FUN_1018_05f3(undefined4 param_1) + +{ + FUN_1018_0641((int)param_1,(int)((ulong)param_1 >> 0x10),1,1); + return; +} + + +/* ===== 1018:060d FUN_1018_060d ===== */ + +void __stdcall16far FUN_1018_060d(undefined4 param_1) + +{ + FUN_1018_0641((int)param_1,(int)((ulong)param_1 >> 0x10),1,4); + return; +} + + +/* ===== 1018:0627 FUN_1018_0627 ===== */ + +void __stdcall16far FUN_1018_0627(undefined4 param_1) + +{ + FUN_1018_0641((int)param_1,(int)((ulong)param_1 >> 0x10),0,4); + return; +} + + +/* ===== 1018:0641 FUN_1018_0641 ===== */ + +void __stdcall16far FUN_1018_0641(undefined4 param_1,char param_2,byte param_3) + +{ + int iVar1; + undefined2 uVar2; + + iVar1 = (int)param_1; + uVar2 = (undefined2)((ulong)param_1 >> 0x10); + if (param_2 == '\0') { + *(byte *)(iVar1 + 0x16) = ~param_3 & *(byte *)(iVar1 + 0x16); + } + else { + *(byte *)(iVar1 + 0x16) = *(byte *)(iVar1 + 0x16) | param_3; + } + return; +} + + +/* ===== 1018:0673 FUN_1018_0673 ===== */ + +uint __stdcall16far FUN_1018_0673(undefined4 param_1,byte param_2) + +{ + uint in_AX; + uint uVar1; + + uVar1 = in_AX & 0xff00; + if ((*(byte *)((int)param_1 + 0x16) & param_2) == param_2) { + uVar1 = uVar1 + 1; + } + return uVar1; +} + + +/* ===== 1018:069a FUN_1018_069a ===== */ + +void __stdcall16far FUN_1018_069a(undefined4 param_1,undefined4 param_2) + +{ + int iVar1; + int iVar2; + undefined2 uVar3; + undefined2 uVar4; + undefined2 uVar5; + + if ((int)param_2 != 0 || param_2._2_2_ != 0) { + uVar3 = (undefined2)((ulong)param_1 >> 0x10); + iVar1 = (int)param_1; + if (*(int *)(iVar1 + 10) == 0 && *(int *)(iVar1 + 0xc) == 0) { + *(int *)(iVar1 + 10) = (int)param_2; + *(int *)(iVar1 + 0xc) = param_2._2_2_; + *(int *)((int)param_2 + 0x19) = (int)param_2; + *(int *)((int)param_2 + 0x1b) = param_2._2_2_; + } + else { + uVar4 = (undefined2)((ulong)*(undefined4 *)(iVar1 + 10) >> 0x10); + iVar2 = (int)*(undefined4 *)(iVar1 + 10); + uVar5 = *(undefined2 *)(iVar2 + 0x1b); + *(undefined2 *)((int)param_2 + 0x19) = *(undefined2 *)(iVar2 + 0x19); + *(undefined2 *)((int)param_2 + 0x1b) = uVar5; + uVar5 = (undefined2)((ulong)*(undefined4 *)(iVar1 + 10) >> 0x10); + iVar2 = (int)*(undefined4 *)(iVar1 + 10); + *(int *)(iVar2 + 0x19) = (int)param_2; + *(int *)(iVar2 + 0x1b) = param_2._2_2_; + *(int *)(iVar1 + 10) = (int)param_2; + *(int *)(iVar1 + 0xc) = param_2._2_2_; + } + } + return; +} + + +/* ===== 1018:071c FUN_1018_071c ===== */ + +void __stdcall16far FUN_1018_071c(undefined4 param_1,int param_2,int param_3) + +{ + int *piVar1; + int iVar2; + undefined2 uVar3; + undefined2 uVar4; + int local_c; + int iStack_a; + + uVar3 = (undefined2)((ulong)param_1 >> 0x10); + iVar2 = (int)param_1; + if (*(int *)(iVar2 + 10) != 0 || *(int *)(iVar2 + 0xc) != 0) { + local_c = *(int *)(iVar2 + 10); + iStack_a = *(int *)(iVar2 + 0xc); + while (((*(int *)(local_c + 0x1b) != *(int *)(iVar2 + 0xc) || + (*(int *)(local_c + 0x19) != *(int *)(iVar2 + 10))) && + ((*(int *)(local_c + 0x1b) != param_3 || (*(int *)(local_c + 0x19) != param_2))))) { + piVar1 = (int *)(local_c + 0x19); + iStack_a = *(int *)(local_c + 0x1b); + local_c = *piVar1; + } + if ((*(int *)(local_c + 0x1b) == param_3) && (*(int *)(local_c + 0x19) == param_2)) { + if ((*(int *)(local_c + 0x1b) == iStack_a) && (*(int *)(local_c + 0x19) == local_c)) { + *(undefined2 *)(iVar2 + 10) = 0; + *(undefined2 *)(iVar2 + 0xc) = 0; + } + else { + if ((*(int *)(local_c + 0x1b) == *(int *)(iVar2 + 0xc)) && + (*(int *)(local_c + 0x19) == *(int *)(iVar2 + 10))) { + *(int *)(iVar2 + 10) = local_c; + *(int *)(iVar2 + 0xc) = iStack_a; + } + uVar4 = (undefined2)((ulong)*(undefined4 *)(local_c + 0x19) >> 0x10); + iVar2 = (int)*(undefined4 *)(local_c + 0x19); + uVar3 = *(undefined2 *)(iVar2 + 0x1b); + *(undefined2 *)(local_c + 0x19) = *(undefined2 *)(iVar2 + 0x19); + *(undefined2 *)(local_c + 0x1b) = uVar3; + } + } + } + return; +} + + +/* ===== 1018:080d FUN_1018_080d ===== */ + +undefined4 __stdcall16far FUN_1018_080d(undefined4 param_1,code *param_2) + +{ + undefined4 uVar1; + char cVar2; + int iVar3; + int iVar4; + int iVar5; + int iVar6; + int iVar7; + + uVar1 = *(undefined4 *)((int)param_1 + 10); + iVar5 = (int)((ulong)uVar1 >> 0x10); + iVar3 = (int)uVar1; + iVar4 = iVar3; + iVar6 = iVar5; + iVar7 = iVar5; + if (iVar5 != 0 || iVar3 != 0) { + do { + iVar6 = (int)((ulong)*(undefined4 *)(iVar4 + 0x19) >> 0x10); + iVar4 = (int)*(undefined4 *)(iVar4 + 0x19); + cVar2 = (*param_2)(); + if (cVar2 != '\0') goto LAB_1018_084f; + iVar7 = iVar6; + } while ((iVar4 != iVar3) || (iVar6 != iVar5)); + iVar4 = 0; + iVar6 = 0; + } +LAB_1018_084f: + return CONCAT22(iVar6,iVar4); +} + + +/* ===== 1018:085a FUN_1018_085a ===== */ + +void __stdcall16far FUN_1018_085a(undefined4 param_1,code *param_2) + +{ + int iVar1; + undefined4 uVar2; + int iVar3; + int iVar4; + int iVar5; + int iVar6; + + uVar2 = *(undefined4 *)((int)param_1 + 10); + iVar5 = (int)((ulong)uVar2 >> 0x10); + iVar3 = (int)uVar2; + if (iVar5 != 0 || iVar3 != 0) { + iVar4 = (int)*(undefined4 *)(iVar3 + 0x19); + iVar6 = (int)((ulong)*(undefined4 *)(iVar3 + 0x19) >> 0x10); + while ((iVar4 != iVar3 || (iVar6 != iVar5))) { + iVar1 = *(int *)(iVar4 + 0x1b); + iVar4 = *(int *)(iVar4 + 0x19); + (*param_2)(); + iVar6 = iVar1; + } + (*param_2)(); + } + return; +} + + +/* ===== 1018:08ac FUN_1018_08ac ===== */ + +undefined2 __stdcall16far FUN_1018_08ac(void) + +{ + return 0xffff; +} + + +/* ===== 1018:08c3 FUN_1018_08c3 ===== */ + +void __stdcall16far +FUN_1018_08c3(undefined2 param_1,undefined2 param_2,undefined2 *param_3,undefined4 param_4) + +{ + undefined2 *puVar1; + int unaff_BP; + + FUN_1018_0002((int)param_4,(int)((ulong)param_4 >> 0x10),(undefined2 *)param_3, + (int)((ulong)param_3 >> 0x10),0x1028,unaff_BP + 1); + if (DAT_1028_0684 != 0) { + FUN_1018_0103(); + } + puVar1 = (undefined2 *)param_3; + (*(code *)*puVar1)(); + return; +} + + +/* ===== 1018:08f0 FUN_1018_08f0 ===== */ + +void __stdcall16far FUN_1018_08f0(int *param_1,undefined4 param_2) + +{ + char cVar1; + int iVar2; + uint uVar3; + int *piVar4; + int iVar5; + int iVar6; + undefined2 uVar7; + undefined2 uVar8; + int *piVar9; + long lVar10; + int iVar11; + int iVar12; + int local_6; + + iVar12 = 1; + iVar6 = (int)((ulong)param_1 >> 0x10); + piVar4 = (int *)param_1; + uVar8 = 0x1018; + iVar11 = iVar6; + cVar1 = FUN_1018_0673(param_1,1); + iVar5 = (int)param_2; + uVar7 = (undefined2)((ulong)param_2 >> 0x10); + if ((cVar1 != '\0') && (*(int *)(iVar5 + 6) == 0 && *(int *)(iVar5 + 8) == 0)) { + iVar12 = piVar4[2]; + iVar11 = *(int *)(iVar5 + 4); + uVar8 = 0x1228; + iVar2 = GETDLGITEM(0x1018,iVar11); + if (iVar2 != 0) { + uVar8 = 0x1228; + iVar11 = iVar2; + uVar3 = SENDMESSAGE(0x1228,0,0,0,0x87); + if ((uVar3 & 0x30) != 0) { + *(int *)(iVar5 + 6) = iVar2; + *(undefined2 *)(iVar5 + 8) = 0; + } + } + } + if (*(int *)(iVar5 + 6) == 0) { + if (*(uint *)(iVar5 + 4) < 0x6000) { + local_6 = GETFOCUS(uVar8); + piVar9 = (int *)FUN_1018_0097(local_6); + while (((piVar9 == (int *)0x0 && (local_6 != 0)) && (local_6 != piVar4[2]))) { + local_6 = GETPARENT(0x1018,local_6); + piVar9 = (int *)FUN_1018_0097(local_6); + } + if (piVar9 == (int *)0x0) { + piVar9 = param_1; + } + FUN_1018_08c3(0x10,*(int *)(iVar5 + 4) + -0x6000,iVar5,uVar7,piVar9); + } + else { + (*(code *)*(undefined2 *)(*param_1 + 0xc))(uVar8,param_1,iVar5,uVar7,iVar11,iVar12); + } + } + else { + iVar12 = piVar4[2]; + uVar8 = GETDLGITEM(uVar8,*(undefined2 *)(iVar5 + 4)); + lVar10 = FUN_1018_0097(uVar8); + if ((lVar10 == 0) || (0xfff < *(uint *)(iVar5 + 8))) { + if (*(uint *)(iVar5 + 4) < 0x1000) { + FUN_1018_08c3(0x14,*(int *)(iVar5 + 4) + -0x8000,iVar5,uVar7,param_1); + } + else { + (*(code *)*(undefined2 *)(*param_1 + 0x14))(0x1018,param_1,iVar5,uVar7,iVar12); + } + } + else { + FUN_1018_08c3(0x18,*(int *)(iVar5 + 8) + -0x7000,iVar5,uVar7,lVar10); + } + } + return; +} + + +/* ===== 1018:0a85 FUN_1018_0a85 ===== */ + +void __stdcall16far FUN_1018_0a85(int *param_1,undefined4 param_2) + +{ + uint uVar1; + int iVar2; + undefined2 uVar3; + undefined2 uVar4; + long lVar5; + undefined2 uVar6; + + uVar3 = (undefined2)((ulong)param_2 >> 0x10); + iVar2 = (int)param_2; + uVar4 = (undefined2)((ulong)param_1 >> 0x10); + if (*(int *)(iVar2 + 8) == 0) { + (*(code *)*(undefined2 *)(*param_1 + 0xc))(); + } + else { + lVar5 = FUN_1018_0097(*(undefined2 *)(iVar2 + 8)); + if (lVar5 == 0) { + uVar6 = *(undefined2 *)(iVar2 + 8); + uVar1 = GETWINDOWWORD(0x1018,0xfff4); + if (uVar1 < 0x1000) { + FUN_1018_08c3(0x14,uVar1 + 0x8000,iVar2,uVar3,(int *)param_1,uVar4); + } + else { + (*(code *)*(undefined2 *)(*param_1 + 0x14))(0x1228,(int *)param_1,uVar4,iVar2,uVar3,uVar6); + } + } + else { + FUN_1018_08c3(0x18,*(int *)(iVar2 + 4) + -0x7000,iVar2,uVar3,lVar5); + } + } + return; +} + + +/* ===== 1018:0b25 FUN_1018_0b25 ===== */ + +void __stdcall16far FUN_1018_0b25(int *param_1,undefined4 param_2) + +{ + uint extraout_DX; + int unaff_BP; + int iVar1; + int *piVar2; + undefined2 uVar3; + undefined2 uVar4; + undefined2 unaff_CS; + int iVar5; + undefined2 uVar6; + + iVar1 = unaff_BP + 1; + uVar6 = 0x1028; + uVar3 = (undefined2)((ulong)param_1 >> 0x10); + piVar2 = (int *)param_1; + iVar5 = piVar2[2]; + GETWINDOWLONG(unaff_CS,0xfff0); + uVar4 = (undefined2)((ulong)param_2 >> 0x10); + if ((extraout_DX & 0x20) == 0) { + (*(code *)*(undefined2 *)(*param_1 + 0x48))(0x1228,piVar2,uVar3,(int)param_2,uVar4); + } + else { + (*(code *)*(undefined2 *)(*param_1 + 0xc)) + (0x1228,piVar2,uVar3,(int)param_2,uVar4,iVar5,uVar6,iVar1); + } + return; +} + + +/* ===== 1018:0b6c FUN_1018_0b6c ===== */ + +void __stdcall16far FUN_1018_0b6c(int *param_1,undefined4 param_2) + +{ + uint extraout_DX; + int unaff_BP; + int iVar1; + int *piVar2; + undefined2 uVar3; + undefined2 uVar4; + undefined2 unaff_CS; + int iVar5; + undefined2 uVar6; + + iVar1 = unaff_BP + 1; + uVar6 = 0x1028; + uVar3 = (undefined2)((ulong)param_1 >> 0x10); + piVar2 = (int *)param_1; + iVar5 = piVar2[2]; + GETWINDOWLONG(unaff_CS,0xfff0); + uVar4 = (undefined2)((ulong)param_2 >> 0x10); + if ((extraout_DX & 0x10) == 0) { + (*(code *)*(undefined2 *)(*param_1 + 0x48))(0x1228,piVar2,uVar3,(int)param_2,uVar4); + } + else { + (*(code *)*(undefined2 *)(*param_1 + 0xc)) + (0x1228,piVar2,uVar3,(int)param_2,uVar4,iVar5,uVar6,iVar1); + } + return; +} + + +/* ===== 1018:0bb3 FUN_1018_0bb3 ===== */ + +void __stdcall16far FUN_1018_0bb3(int *param_1,int *param_2) + +{ + int unaff_BP; + int iVar1; + int *piVar2; + int *piVar3; + undefined2 uVar4; + undefined2 uVar5; + undefined2 unaff_CS; + long lVar6; + undefined2 uVar7; + + iVar1 = unaff_BP + 1; + uVar7 = 0x1028; + uVar4 = (undefined2)((ulong)param_1 >> 0x10); + piVar2 = (int *)param_1; + if (*param_2 == piVar2[2]) { + lVar6 = 0; + } + else if (piVar2[3] == 0 && piVar2[4] == 0) { + unaff_CS = 0x1018; + lVar6 = FUN_1018_0097(*param_2); + } + else { + lVar6 = CONCAT22(piVar2[4],piVar2[3]); + } + piVar3 = (int *)param_2; + uVar5 = (undefined2)((ulong)param_2 >> 0x10); + if (lVar6 == 0) { + (*(code *)*(undefined2 *)(*param_1 + 0xc))(unaff_CS,piVar2,uVar4,piVar3,uVar5,0,0,uVar7,iVar1); + } + else { + FUN_1018_08c3(0x10,piVar3[2] + -0x6000,piVar3,uVar5,lVar6); + } + return; +} + + +/* ===== 1018:0c3d FUN_1018_0c3d ===== */ + +void __stdcall16far FUN_1018_0c3d(int *param_1) + +{ + (*(code *)*(undefined2 *)(*param_1 + 0xc))(); + return; +} + + +/* ===== 1018:0c59 FUN_1018_0c59 ===== */ + +void __stdcall16far FUN_1018_0c59(undefined4 param_1,undefined4 param_2) + +{ + int iVar1; + int iVar2; + undefined2 uVar3; + undefined2 uVar4; + undefined2 unaff_CS; + undefined2 uVar5; + + uVar3 = (undefined2)((ulong)param_1 >> 0x10); + iVar1 = (int)param_1; + if (*(int *)(iVar1 + 6) != 0 || *(int *)(iVar1 + 8) != 0) { + uVar4 = (undefined2)((ulong)param_2 >> 0x10); + iVar2 = (int)param_2; + if (*(int *)(iVar2 + 2) == 0x111) { + FUN_1018_08c3(0x14,*(int *)(iVar2 + 4) + -0x8000,iVar2,uVar4,*(undefined2 *)(iVar1 + 6), + *(undefined2 *)(iVar1 + 8)); + } + else { + uVar5 = *(undefined2 *)(iVar1 + 6); + uVar3 = *(undefined2 *)(iVar1 + 4); + iVar1 = GETWINDOWWORD(unaff_CS,0xfff4); + FUN_1018_08c3(0x14,iVar1 + -0x8000,uVar3,iVar2,uVar4,uVar5); + } + } + return; +} + + +/* ===== 1018:0cc7 FUN_1018_0cc7 ===== */ + +void __stdcall16far FUN_1018_0cc7(undefined2 param_1,undefined4 param_2) + +{ + undefined2 uVar1; + + uVar1 = (undefined2)((ulong)param_2 >> 0x10); + if (*(int *)((int)param_2 + 4) != 0) { + FUN_1018_060d((int)param_2,uVar1); + } + return; +} + + +/* ===== 1018:0ce7 FUN_1018_0ce7 ===== */ + +void __stdcall16far FUN_1018_0ce7(undefined4 param_1) + +{ + int *piVar1; + char cVar2; + int unaff_BP; + int iVar3; + int iVar4; + undefined2 uVar5; + long lVar6; + undefined2 uVar7; + + iVar3 = unaff_BP + 1; + uVar7 = 0x1028; + uVar5 = (undefined2)((ulong)param_1 >> 0x10); + iVar4 = (int)param_1; + if (*(int *)(iVar4 + 4) != 0) { + FUN_1018_085a(iVar4,uVar5,0xcc7,0x1018); + cVar2 = FUN_1018_0673(iVar4,uVar5,8); + if (cVar2 != '\0') { + piVar1 = (int *)*(undefined4 *)(iVar4 + 6); + lVar6 = (*(code *)*(undefined2 *)(*piVar1 + 0x30)) + (0x1018,(int *)piVar1,(int)((ulong)piVar1 >> 0x10),uVar7,iVar3); + if (lVar6 != 0) { + piVar1 = (int *)*(undefined4 *)(iVar4 + 6); + (*(code *)*(undefined2 *)(*piVar1 + 0x30)) + (0x1018,(int *)piVar1,(int)((ulong)piVar1 >> 0x10)); + SENDMESSAGE(0x1018,0,0,*(undefined2 *)(iVar4 + 4),0x221); + return; + } + } + DESTROYWINDOW(0x1018,*(undefined2 *)(iVar4 + 4)); + } + return; +} + + +/* ===== 1018:0d6a FUN_1018_0d6a ===== */ + +char * __stdcall16far FUN_1018_0d6a(void) + +{ + return s_TurboWindow_1028_068c; +} + + +/* ===== 1018:0d8a FUN_1018_0d8a ===== */ + +void __stdcall16far FUN_1018_0d8a(void) + +{ + int unaff_BP; + + FUN_1008_2d87(0x1028,unaff_BP + 1); + return; +} + + +/* ===== 1018:0d9b FUN_1018_0d9b ===== */ + +void __stdcall16far FUN_1018_0d9b(int *param_1) + +{ + char cVar1; + int unaff_BP; + int iVar2; + int *piVar3; + undefined2 uVar4; + undefined2 uVar5; + + iVar2 = unaff_BP + 1; + uVar5 = 0x1028; + uVar4 = (undefined2)((ulong)param_1 >> 0x10); + piVar3 = (int *)param_1; + cVar1 = FUN_1018_055c(piVar3,uVar4); + if (cVar1 == '\0') { + piVar3[1] = -4; + } + else { + (*(code *)*(undefined2 *)(*param_1 + 0x44))(0x1018,piVar3,uVar4,2,uVar5,iVar2); + } + return; +} + + +/* ===== 1018:0dcd FUN_1018_0dcd ===== */ + +void __stdcall16far FUN_1018_0dcd(int param_1,int *param_2) + +{ + char cVar1; + int unaff_BP; + int iVar2; + undefined2 uVar3; + undefined2 unaff_SS; + undefined2 uVar4; + + iVar2 = unaff_BP + 1; + uVar4 = 0x1028; + uVar3 = (undefined2)((ulong)param_2 >> 0x10); + cVar1 = FUN_1018_0673((int *)param_2,uVar3,0x10); + if (cVar1 != '\0') { + iVar2 = (*(code *)*(undefined2 *)(*param_2 + 0x40)) + (0x1018,(int *)param_2,uVar3,*(undefined2 *)(param_1 + 10), + *(undefined2 *)(param_1 + -6),*(undefined2 *)(param_1 + -4),uVar4,iVar2); + *(int *)(param_1 + -6) = *(int *)(param_1 + -6) + iVar2; + } + return; +} + + +/* ===== 1018:0e0a FUN_1018_0e0a ===== */ + +void __stdcall16far FUN_1018_0e0a(undefined4 param_1) + +{ + int iVar1; + undefined2 uVar2; + + uVar2 = (undefined2)((ulong)param_1 >> 0x10); + iVar1 = (int)param_1; + if (*(int *)(iVar1 + 0xe) != 0 || *(int *)(iVar1 + 0x10) != 0) { + FUN_1018_085a(iVar1,uVar2,0xdcd,0x1018); + } + return; +} + + +/* ===== 1018:0e46 FUN_1018_0e46 ===== */ + +undefined1 __stdcall16far FUN_1018_0e46(int *param_1) + +{ + int iVar1; + int unaff_BP; + undefined2 unaff_CS; + undefined2 unaff_SS; + undefined4 uVar2; + undefined1 local_20 [27]; + undefined1 local_5; + undefined2 uStack_4; + int iStack_2; + + iStack_2 = unaff_BP + 1; + uStack_4 = 0x1028; + local_5 = 1; + uVar2 = (*(code *)*(undefined2 *)(*param_1 + 0x2c))(); + iVar1 = GETCLASSINFO(unaff_CS,local_20,unaff_SS,uVar2); + if (iVar1 == 0) { + (*(code *)*(undefined2 *)(*param_1 + 0x34)) + (0x1228,(int *)param_1,(int)((ulong)param_1 >> 0x10),local_20); + iVar1 = REGISTERCLASS(0x1228,local_20); + local_5 = iVar1 != 0; + } + return local_5; +} + + +/* ===== 1018:0e9e FUN_1018_0e9e ===== */ + +void __stdcall16far FUN_1018_0e9e(undefined4 param_1,undefined2 param_2) + +{ + undefined2 unaff_CS; + + if (*(int *)((int)param_1 + 4) != 0) { + SHOWWINDOW(unaff_CS,param_2); + } + return; +} + + +/* ===== 1018:0ec0 FUN_1018_0ec0 ===== */ + +undefined1 __stdcall16far FUN_1018_0ec0(undefined2 param_1,int *param_2) + +{ + char cVar1; + + if ((((int *)param_2)[2] != 0) && + (cVar1 = (*(code *)*(undefined2 *)(*param_2 + 0x3c))(), cVar1 == '\0')) { + return 1; + } + return 0; +} + + +/* ===== 1018:0ef4 FUN_1018_0ef4 ===== */ + +uint __stdcall16far FUN_1018_0ef4(undefined4 param_1) + +{ + uint uVar1; + uint uVar2; + undefined4 uVar3; + + uVar3 = FUN_1018_080d((int)param_1,(int)((ulong)param_1 >> 0x10),0xec0,0x1018); + uVar1 = (uint)uVar3 | (uint)((ulong)uVar3 >> 0x10); + uVar2 = uVar1 & 0xff00; + if (uVar1 == 0) { + uVar2 = 1; + } + return uVar2; +} + + +/* ===== 1018:0f22 FUN_1018_0f22 ===== */ + +void __stdcall16far FUN_1018_0f22(undefined4 param_1) + +{ + FUN_1018_0f38((int)param_1,(int)((ulong)param_1 >> 0x10)); + return; +} + + +/* ===== 1018:0f38 FUN_1018_0f38 ===== */ + +void __stdcall16far FUN_1018_0f38(int *param_1) + +{ + int iVar1; + undefined2 uVar2; + char local_5; + + iVar1 = (int)((ulong)param_1 >> 0x10); + uVar2 = (undefined2)((ulong)DAT_1028_064e >> 0x10); + if ((iVar1 == ((int *)DAT_1028_064e)[5]) && ((int *)param_1 == (int *)((int *)DAT_1028_064e)[4])) + { + local_5 = (*(code *)*(undefined2 *)(*DAT_1028_064e + 0x44))(); + } + else { + local_5 = (*(code *)*(undefined2 *)(*param_1 + 0x3c))(); + } + if (local_5 != '\0') { + FUN_1008_2db3((int *)param_1,iVar1); + } + return; +} + + +/* ===== 1018:0f8d FUN_1018_0f8d ===== */ + +void __stdcall16far FUN_1018_0f8d(int *param_1,undefined4 param_2) + +{ + int iVar1; + undefined2 uVar2; + undefined2 unaff_CS; + + iVar1 = (int)((ulong)param_1 >> 0x10); + uVar2 = (undefined2)((ulong)DAT_1028_064e >> 0x10); + if ((iVar1 == *(int *)((int)DAT_1028_064e + 10)) && + ((int *)param_1 == (int *)*(int *)((int)DAT_1028_064e + 8))) { + unaff_CS = 0x1228; + POSTQUITMESSAGE(); + } + (*(code *)*(undefined2 *)(*param_1 + 0xc)) + (unaff_CS,(int *)param_1,iVar1,(int)param_2,(int)((ulong)param_2 >> 0x10)); + return; +} + + +/* ===== 1018:0fcc FUN_1018_0fcc ===== */ + +void __stdcall16far FUN_1018_0fcc(int *param_1,undefined4 param_2) + +{ + int unaff_BP; + int iVar1; + int *piVar2; + undefined2 uVar3; + undefined2 uVar4; + + iVar1 = unaff_BP + 1; + uVar4 = 0x1028; + uVar3 = (undefined2)((ulong)param_1 >> 0x10); + piVar2 = (int *)param_1; + FUN_1018_0071(piVar2[2]); + (*(code *)*(undefined2 *)(*param_1 + 0xc)) + (0x1018,piVar2,uVar3,(int)param_2,(int)((ulong)param_2 >> 0x10),uVar4,iVar1); + piVar2[2] = 0; + return; +} + + +/* ===== 1018:0ffd FUN_1018_0ffd ===== */ + +void __stdcall16far FUN_1018_0ffd(int *param_1,undefined4 param_2) + +{ + char cVar1; + undefined2 uVar2; + undefined2 uVar3; + + uVar2 = (undefined2)((ulong)param_1 >> 0x10); + (*(code *)*(undefined2 *)(*param_1 + 0xc))(); + if (*(int *)((int)param_2 + 4) != 0) { + cVar1 = FUN_1018_0673((int *)param_1,uVar2,1); + uVar3 = (undefined2)((ulong)DAT_1028_064e >> 0x10); + if (cVar1 == '\0') { + FUN_1018_1bdf((int)DAT_1028_064e,uVar3,0,0); + } + else { + FUN_1018_1bdf((int)DAT_1028_064e,uVar3,(int *)param_1,uVar2); + } + } + return; +} + + +/* ===== 1018:1054 FUN_1018_1054 ===== */ + +void __stdcall16far FUN_1018_1054(int *param_1,undefined4 param_2) + +{ + char cVar1; + int iVar2; + undefined2 uVar3; + undefined2 uVar4; + + uVar3 = (undefined2)((ulong)DAT_1028_064e >> 0x10); + iVar2 = (int)param_2; + uVar4 = (undefined2)((ulong)param_2 >> 0x10); + if (((int)((ulong)param_1 >> 0x10) == ((int *)DAT_1028_064e)[5]) && + ((int *)param_1 == (int *)((int *)DAT_1028_064e)[4])) { + cVar1 = (*(code *)*(undefined2 *)(*DAT_1028_064e + 0x44))(); + *(int *)(iVar2 + 10) = (int)cVar1; + *(int *)(iVar2 + 0xc) = (int)cVar1 >> 0xf; + } + else { + cVar1 = (*(code *)*(undefined2 *)(*param_1 + 0x3c))(); + *(int *)(iVar2 + 10) = (int)cVar1; + *(int *)(iVar2 + 0xc) = (int)cVar1 >> 0xf; + } + return; +} + + +/* ===== 1018:10aa FUN_1018_10aa ===== */ + +void __stdcall16far FUN_1018_10aa(int *param_1) + +{ + int iVar1; + undefined2 uVar2; + + iVar1 = (int)((ulong)param_1 >> 0x10); + uVar2 = (undefined2)((ulong)DAT_1028_064e >> 0x10); + if ((iVar1 == *(int *)((int)DAT_1028_064e + 10)) && + ((int *)param_1 == (int *)*(int *)((int)DAT_1028_064e + 8))) { + FUN_1018_0f38((int *)param_1,iVar1); + } + else { + (*(code *)*(undefined2 *)(*param_1 + 0x10))(); + } + return; +} + + +/* ===== 1018:10e9 FUN_1018_10e9 ===== */ + +undefined4 __stdcall16far FUN_1018_10e9(void) + +{ + return 0; +} + + +/* ===== 1018:1106 FUN_1018_1106 ===== */ + +undefined4 __stdcall16far +FUN_1018_1106(undefined4 param_1,undefined2 param_2,undefined2 param_3,undefined2 param_4, + int *param_5) + +{ + int unaff_BP; + int iVar1; + int iVar2; + undefined2 *puVar3; + undefined2 uVar4; + undefined2 uVar5; + bool bVar6; + undefined4 uVar7; + long lVar8; + undefined2 *puVar9; + undefined2 uVar10; + + iVar1 = unaff_BP + 1; + uVar10 = 0x1028; + bVar6 = true; + FUN_1020_03ef(); + if (!bVar6) { + uVar4 = (undefined2)((ulong)param_1 >> 0x10); + iVar2 = (int)param_1; + FUN_1018_0341(iVar2,uVar4,0,(int *)param_5,param_5._2_2_); + puVar9 = (undefined2 *)CONCAT22(uVar4,(undefined2 *)(iVar2 + 0x1d)); + uVar7 = FUN_1008_302c(param_3,param_4); + uVar5 = (undefined2)((ulong)puVar9 >> 0x10); + puVar3 = (undefined2 *)puVar9; + *puVar9 = (int)uVar7; + puVar3[1] = (int)((ulong)uVar7 >> 0x10); + *(undefined2 *)(iVar2 + 0x37) = 0x22c; + *(undefined2 *)(iVar2 + 0x39) = 0x1228; + if ((int *)param_5 == (int *)0x0 && param_5._2_2_ == 0) { + puVar3[2] = 0; + puVar3[3] = 0xcf; + } + else { + lVar8 = (*(code *)*(undefined2 *)(*param_5 + 0x30)) + (0x1008,(int *)param_5,param_5._2_2_,puVar9,uVar10,iVar1); + if (lVar8 == 0) { + uVar10 = (undefined2)((ulong)puVar9 >> 0x10); + ((undefined2 *)puVar9)[2] = 0; + ((undefined2 *)puVar9)[3] = 0x1000; + } + else { + FUN_1018_0641(iVar2,uVar4,1,8); + *(undefined2 *)(iVar2 + 0x37) = 0x2b0; + *(undefined2 *)(iVar2 + 0x39) = 0x1228; + uVar10 = (undefined2)((ulong)puVar9 >> 0x10); + ((undefined2 *)puVar9)[2] = 0; + ((undefined2 *)puVar9)[3] = 0x400; + } + } + uVar10 = (undefined2)((ulong)puVar9 >> 0x10); + puVar3 = (undefined2 *)puVar9; + puVar3[4] = 0; + puVar3[5] = 0; + puVar3[6] = 0x8000; + puVar3[7] = 0; + puVar3[8] = 0x8000; + puVar3[9] = 0; + puVar3[10] = 0; + puVar3[0xb] = 0; + puVar3[0xc] = 0; + *(undefined2 *)(iVar2 + 0x3b) = 0; + *(undefined2 *)(iVar2 + 0x3d) = 0; + *(undefined2 *)(iVar2 + 0x3f) = 0; + } + return param_1; +} + + +/* ===== 1018:121b FUN_1018_121b ===== */ + +void __stdcall16far FUN_1018_121b(undefined4 param_1) + +{ + int *piVar1; + uint uVar2; + int unaff_BP; + int iVar3; + int iVar4; + undefined2 uVar5; + undefined2 uVar6; + + iVar3 = unaff_BP + 1; + uVar6 = 0x1028; + uVar5 = (undefined2)((ulong)param_1 >> 0x10); + iVar4 = (int)param_1; + FUN_1008_3099(*(undefined2 *)(iVar4 + 0x1d),*(undefined2 *)(iVar4 + 0x1f)); + uVar2 = *(uint *)(iVar4 + 0x3b) | *(uint *)(iVar4 + 0x3d); + if (uVar2 != 0) { + piVar1 = (int *)*(undefined4 *)(iVar4 + 0x3b); + (*(code *)*(undefined2 *)(*piVar1 + 8)) + (0x1008,(int *)piVar1,(int)((ulong)piVar1 >> 0x10),CONCAT11((char)(uVar2 >> 8),1), + uVar6,iVar3); + *(undefined2 *)(iVar4 + 0x3b) = 0; + *(undefined2 *)(iVar4 + 0x3d) = 0; + } + FUN_1018_03ff(iVar4,uVar5,0); + FUN_1020_0439(); + return; +} + + +/* ===== 1018:1274 FUN_1018_1274 ===== */ + +void __stdcall16far FUN_1018_1274(int *param_1,undefined2 *param_2) + +{ + undefined2 uVar1; + int unaff_BP; + int iVar2; + undefined2 *puVar3; + undefined2 uVar4; + undefined2 unaff_CS; + undefined4 uVar5; + undefined2 uVar6; + undefined2 uVar7; + undefined2 uVar8; + + iVar2 = unaff_BP + 1; + uVar8 = 0x1028; + uVar4 = (undefined2)((ulong)param_2 >> 0x10); + puVar3 = (undefined2 *)param_2; + puVar3[3] = 0; + puVar3[4] = 0; + puVar3[5] = DAT_1028_06fe; + uVar7 = 0; + uVar1 = LOADICON(unaff_CS,0x7f00,0); + puVar3[6] = uVar1; + uVar6 = 0; + uVar1 = LOADCURSOR(0x1228,0x7f00,0); + puVar3[7] = uVar1; + puVar3[8] = 6; + puVar3[9] = 0; + puVar3[10] = 0; + uVar5 = (*(code *)*(undefined2 *)(*param_1 + 0x2c)) + (0x1228,(int *)param_1,(int)((ulong)param_1 >> 0x10),uVar6,uVar7,uVar8,iVar2); + puVar3[0xb] = (int)uVar5; + puVar3[0xc] = (int)((ulong)uVar5 >> 0x10); + *param_2 = 3; + puVar3[1] = 0x18b; + puVar3[2] = 0x1018; + return; +} + + +/* ===== 1018:12f5 FUN_1018_12f5 ===== */ + +undefined2 __stdcall16far FUN_1018_12f5(undefined4 param_1) + +{ + return *(undefined2 *)((int)param_1 + 0x35); +} + + +/* ===== 1018:1311 FUN_1018_1311 ===== */ + +void __stdcall16far FUN_1018_1311(undefined4 param_1,undefined4 param_2) + +{ + int iVar1; + undefined2 uVar2; + undefined2 uVar3; + undefined2 unaff_CS; + undefined4 uVar4; + + uVar2 = (undefined2)((ulong)param_1 >> 0x10); + uVar3 = (undefined2)((ulong)param_2 >> 0x10); + iVar1 = (int)param_2; + uVar4 = CALLWINDOWPROC(unaff_CS,*(undefined2 *)(iVar1 + 6),*(undefined2 *)(iVar1 + 8), + *(undefined2 *)(iVar1 + 4),*(undefined2 *)(iVar1 + 2), + *(undefined2 *)((int)param_1 + 4),*(undefined2 *)((int)param_1 + 0x37)); + *(undefined2 *)(iVar1 + 10) = (int)uVar4; + *(undefined2 *)(iVar1 + 0xc) = (int)((ulong)uVar4 >> 0x10); + return; +} + + +/* ===== 1018:134f FUN_1018_134f ===== */ + +uint __stdcall16far FUN_1018_134f(int *param_1) + +{ + int *piVar1; + char cVar2; + uint in_AX; + uint uVar3; + int unaff_BP; + int *piVar4; + undefined2 uVar5; + undefined2 unaff_SS; + undefined4 uVar6; + undefined2 uVar7; + int iVar8; + undefined4 local_2a; + undefined4 local_26; + undefined2 local_22; + undefined2 local_20; + undefined2 local_1e; + undefined2 local_1c; + undefined2 local_1a; + undefined2 local_18; + undefined2 local_16; + undefined2 local_14; + undefined2 local_12; + long local_c; + undefined2 local_8; + undefined2 uStack_4; + int iStack_2; + + iStack_2 = unaff_BP + 1; + uStack_4 = 0x1028; + uVar5 = (undefined2)((ulong)param_1 >> 0x10); + piVar4 = (int *)param_1; + if (piVar4[1] == 0) { + FUN_1018_0627(piVar4,uVar5); + if (piVar4[3] == 0 && piVar4[4] == 0) { + local_8 = 0; + } + else { + local_8 = *(undefined2 *)((int)*(undefined4 *)(piVar4 + 3) + 4); + } + cVar2 = FUN_1018_0673(piVar4,uVar5,2); + if (cVar2 == '\0') { + in_AX = (*(code *)*(undefined2 *)(*param_1 + 0x1c))(0x1018,piVar4,uVar5); + if ((char)in_AX != '\0') { + DAT_1028_0676 = piVar4; + DAT_1028_0678 = uVar5; + cVar2 = FUN_1018_0673(piVar4,uVar5,8); + if (cVar2 == '\0') { + local_2a = (undefined2 *)CONCAT22(uVar5,(undefined2 *)((int)piVar4 + 0x1d)); + uVar7 = *(undefined2 *)((int)piVar4 + 0x27); + uVar6 = (*(code *)*(undefined2 *)(*param_1 + 0x2c)) + (0x1018,piVar4,uVar5,*(undefined2 *)((int)piVar4 + 0x25),uVar7); + in_AX = CREATEWINDOWEX(0x1018,*(undefined2 *)((int)piVar4 + 0x31), + *(undefined2 *)((int)piVar4 + 0x33),DAT_1028_06fe, + *(undefined2 *)((int)piVar4 + 0x35),local_8, + *(undefined2 *)((int)piVar4 + 0x2f), + *(undefined2 *)((int)piVar4 + 0x2d), + *(undefined2 *)((int)piVar4 + 0x2b), + *(undefined2 *)((int)piVar4 + 0x29), + *(undefined2 *)((int)piVar4 + 0x21), + *(undefined2 *)((int)piVar4 + 0x23),*local_2a, + *(undefined2 *)((int)piVar4 + 0x1f),uVar6,uVar7); + piVar4[2] = in_AX; + } + else { + local_26 = (*(code *)*(undefined2 *)(*param_1 + 0x2c))(0x1018,piVar4,uVar5); + local_22 = *(undefined2 *)((int)piVar4 + 0x1d); + local_20 = *(undefined2 *)((int)piVar4 + 0x1f); + local_1e = DAT_1028_06fe; + local_1c = *(undefined2 *)((int)piVar4 + 0x29); + local_1a = *(undefined2 *)((int)piVar4 + 0x2b); + local_18 = *(undefined2 *)((int)piVar4 + 0x2d); + local_16 = *(undefined2 *)((int)piVar4 + 0x2f); + local_14 = *(undefined2 *)((int)piVar4 + 0x21); + local_12 = *(undefined2 *)((int)piVar4 + 0x23); + piVar1 = *(int **)(piVar4 + 3); + local_c = (*(code *)*(undefined2 *)(*piVar1 + 0x30)) + (0x1018,(int *)piVar1,(int)((ulong)piVar1 >> 0x10)); + in_AX = 0; + if (local_c != 0) { + in_AX = SENDMESSAGE(0x1018,&local_26,unaff_SS,0,0x220); + piVar4[2] = in_AX; + } + } + } + } + else { + in_AX = GETDLGITEM(0x1018,*(undefined2 *)((int)piVar4 + 0x35)); + piVar4[2] = in_AX; + } + if (piVar4[2] == 0) { + piVar4[1] = -1; + } + else { + uVar6 = FUN_1018_0097(piVar4[2]); + in_AX = (uint)uVar6 | (uint)((ulong)uVar6 >> 0x10); + if (in_AX == 0) { + FUN_1018_0045(piVar4,uVar5,piVar4[2]); + iVar8 = piVar4[2]; + uVar6 = SETWINDOWLONG(0x1018,piVar4[9],piVar4[10],0xfffc); + *(undefined2 *)((int)piVar4 + 0x37) = (int)uVar6; + *(undefined2 *)((int)piVar4 + 0x39) = (int)((ulong)uVar6 >> 0x10); + in_AX = (*(code *)*(undefined2 *)(*param_1 + 0x38))(0x1228,piVar4,uVar5,iVar8); + } + } + } + uVar3 = in_AX & 0xff00; + if (piVar4[1] == 0) { + uVar3 = uVar3 + 1; + } + return uVar3; +} + + +/* ===== 1018:1547 FUN_1018_1547 ===== */ + +void __stdcall16far FUN_1018_1547(undefined4 param_1) + +{ + int iVar1; + int iVar2; + undefined2 uVar3; + + uVar3 = (undefined2)((ulong)param_1 >> 0x10); + iVar2 = (int)param_1; + if (*(int *)(iVar2 + 0x3f) != 0) { + iVar1 = ISWINDOW(); + if (iVar1 != 0) { + iVar1 = ISICONIC(0x1228,*(undefined2 *)(iVar2 + 4)); + if (iVar1 == 0) { + SETFOCUS(0x1228,*(undefined2 *)(iVar2 + 0x3f)); + } + } + } + return; +} + + +/* ===== 1018:1586 FUN_1018_1586 ===== */ + +void __stdcall16far FUN_1018_1586(undefined4 param_1) + +{ + int iVar1; + int iVar2; + undefined2 uVar3; + + iVar1 = GETFOCUS(); + if (iVar1 != 0) { + uVar3 = (undefined2)((ulong)param_1 >> 0x10); + iVar2 = ISCHILD(0x1228,iVar1,*(undefined2 *)((int)param_1 + 4)); + if (iVar2 != 0) { + *(int *)((int)param_1 + 0x3f) = iVar1; + } + } + return; +} + + +/* ===== 1018:15c0 FUN_1018_15c0 ===== */ + +void __stdcall16far FUN_1018_15c0(undefined4 param_1) + +{ + int *piVar1; + char cVar2; + int iVar3; + int unaff_BP; + int iVar4; + undefined2 uVar5; + undefined2 uVar6; + undefined2 unaff_SS; + long lVar7; + undefined2 uVar8; + int local_c; + int local_a; + int local_8; + int local_6; + undefined2 uStack_4; + int iStack_2; + + iStack_2 = unaff_BP + 1; + uStack_4 = 0x1028; + uVar5 = (undefined2)((ulong)param_1 >> 0x10); + iVar4 = (int)param_1; + iVar3 = ISICONIC(); + if (iVar3 != 0) { + return; + } + iVar3 = ISZOOMED(0x1228,*(undefined2 *)(iVar4 + 4)); + if (iVar3 != 0) { + return; + } + uVar8 = *(undefined2 *)(iVar4 + 4); + uVar6 = 0x1228; + GETWINDOWRECT(0x1228,&local_c,unaff_SS); + *(int *)(iVar4 + 0x2d) = local_8 - local_c; + *(int *)(iVar4 + 0x2f) = local_6 - local_a; + if (*(int *)(iVar4 + 6) != 0 || *(int *)(iVar4 + 8) != 0) { + piVar1 = (int *)*(undefined4 *)(iVar4 + 6); + lVar7 = (*(code *)*(undefined2 *)(*piVar1 + 0x30)) + (0x1228,(int *)piVar1,(int)((ulong)piVar1 >> 0x10),uVar8); + if (lVar7 != 0) { + uVar6 = 0x1018; + cVar2 = FUN_1018_0673(iVar4,uVar5,8); + if (cVar2 != '\0') { + SCREENTOCLIENT(0x1018,&local_c,unaff_SS); + goto LAB_1018_1685; + } + } + if ((*(uint *)(iVar4 + 0x23) & 0x4000) != 0) { + SCREENTOCLIENT(uVar6,&local_c,unaff_SS); + } + } +LAB_1018_1685: + *(int *)(iVar4 + 0x29) = local_c; + *(int *)(iVar4 + 0x2b) = local_a; + return; +} + + +/* ===== 1018:169d FUN_1018_169d ===== */ + +void __stdcall16far FUN_1018_169d(undefined4 param_1,undefined4 param_2) + +{ + char cVar1; + undefined2 uVar2; + undefined2 uVar3; + undefined2 uVar4; + + uVar3 = (undefined2)((ulong)param_2 >> 0x10); + uVar4 = (undefined2)((ulong)param_1 >> 0x10); + uVar2 = (undefined2)param_1; + FUN_1018_0ffd(uVar2,uVar4,(int)param_2,uVar3); + cVar1 = FUN_1018_0673(uVar2,uVar4,1); + if (cVar1 != '\0') { + if (*(int *)((int)param_2 + 4) == 0) { + FUN_1018_1586(uVar2,uVar4); + } + else { + FUN_1018_1547(uVar2,uVar4); + } + } + return; +} + + +/* ===== 1018:16eb FUN_1018_16eb ===== */ + +void __stdcall16far FUN_1018_16eb(void) + +{ + FUN_1020_16e1(); + return; +} + + +/* ===== 1018:170c FUN_1018_170c ===== */ + +void __stdcall16far FUN_1018_170c(undefined4 param_1) + +{ + int *piVar1; + char cVar2; + int unaff_BP; + int iVar3; + int iVar4; + undefined2 uVar5; + undefined2 uVar6; + undefined2 uVar7; + + iVar3 = unaff_BP + 1; + uVar7 = 0x1028; + uVar5 = (undefined2)((ulong)param_1 >> 0x10); + iVar4 = (int)param_1; + FUN_1018_0d9b(iVar4,uVar5); + uVar6 = 0x1018; + cVar2 = FUN_1018_0673(iVar4,uVar5,8); + if (cVar2 != '\0') { + uVar6 = 0x1228; + SETFOCUS(0x1018,*(undefined2 *)(iVar4 + 4),uVar7,iVar3); + } + if (*(int *)(iVar4 + 0x3b) != 0 || *(int *)(iVar4 + 0x3d) != 0) { + piVar1 = (int *)*(undefined4 *)(iVar4 + 0x3b); + (*(code *)*(undefined2 *)(*piVar1 + 0x10))(uVar6,(int *)piVar1,(int)((ulong)piVar1 >> 0x10)); + } + FUN_1018_15c0(iVar4,uVar5); + return; +} + + +/* ===== 1018:1761 FUN_1018_1761 ===== */ + +void __stdcall16far FUN_1018_1761(int *param_1) + +{ + (*(code *)*(undefined2 *)(*param_1 + 0x38))(); + (*(code *)*(undefined2 *)(*param_1 + 0xc))(); + return; +} + + +/* ===== 1018:1788 FUN_1018_1788 ===== */ + +void __stdcall16far FUN_1018_1788(int *param_1,undefined4 param_2) + +{ + int *piVar1; + uint extraout_DX; + int unaff_BP; + int iVar2; + int *piVar3; + int iVar4; + undefined2 uVar5; + undefined2 uVar6; + undefined2 unaff_CS; + int iVar7; + undefined2 uVar8; + + iVar2 = unaff_BP + 1; + uVar8 = 0x1028; + uVar5 = (undefined2)((ulong)param_1 >> 0x10); + piVar3 = (int *)param_1; + iVar7 = piVar3[2]; + GETWINDOWLONG(unaff_CS,0xfff0); + iVar4 = (int)param_2; + uVar6 = (undefined2)((ulong)param_2 >> 0x10); + if ((extraout_DX & 0x10) == 0) { + (*(code *)*(undefined2 *)(*param_1 + 0x48))(0x1228,piVar3,uVar5,iVar4,uVar6); + } + else if (*(int *)((int)piVar3 + 0x3b) == 0 && *(int *)((int)piVar3 + 0x3d) == 0) { + (*(code *)*(undefined2 *)(*param_1 + 0xc))(0x1228,piVar3,uVar5,iVar4,uVar6,iVar7,uVar8,iVar2); + } + else { + piVar1 = (int *)*(undefined4 *)((int)piVar3 + 0x3b); + (*(code *)*(undefined2 *)(*piVar1 + 0x20)) + (0x1228,(int *)piVar1,(int)((ulong)piVar1 >> 0x10),*(undefined2 *)(iVar4 + 6), + *(undefined2 *)(iVar4 + 4)); + } + return; +} + + +/* ===== 1018:17f8 FUN_1018_17f8 ===== */ + +void __stdcall16far FUN_1018_17f8(int *param_1,undefined4 param_2) + +{ + int *piVar1; + uint extraout_DX; + int unaff_BP; + int iVar2; + int *piVar3; + int iVar4; + undefined2 uVar5; + undefined2 uVar6; + undefined2 unaff_CS; + int iVar7; + undefined2 uVar8; + + iVar2 = unaff_BP + 1; + uVar8 = 0x1028; + uVar5 = (undefined2)((ulong)param_1 >> 0x10); + piVar3 = (int *)param_1; + iVar7 = piVar3[2]; + GETWINDOWLONG(unaff_CS,0xfff0); + iVar4 = (int)param_2; + uVar6 = (undefined2)((ulong)param_2 >> 0x10); + if ((extraout_DX & 0x20) == 0) { + (*(code *)*(undefined2 *)(*param_1 + 0x48))(0x1228,piVar3,uVar5,iVar4,uVar6); + } + else if (*(int *)((int)piVar3 + 0x3b) == 0 && *(int *)((int)piVar3 + 0x3d) == 0) { + (*(code *)*(undefined2 *)(*param_1 + 0xc))(0x1228,piVar3,uVar5,iVar4,uVar6,iVar7,uVar8,iVar2); + } + else { + piVar1 = (int *)*(undefined4 *)((int)piVar3 + 0x3b); + (*(code *)*(undefined2 *)(*piVar1 + 0x1c)) + (0x1228,(int *)piVar1,(int)((ulong)piVar1 >> 0x10),*(undefined2 *)(iVar4 + 6), + *(undefined2 *)(iVar4 + 4)); + } + return; +} + + +/* ===== 1018:1868 FUN_1018_1868 ===== */ + +void __stdcall16far FUN_1018_1868(int *param_1) + +{ + int *piVar1; + int unaff_BP; + int *piVar2; + undefined2 uVar3; + undefined2 unaff_CS; + undefined2 unaff_SS; + undefined1 local_24 [32]; + undefined2 uStack_4; + int iStack_2; + + iStack_2 = unaff_BP + 1; + uStack_4 = 0x1028; + uVar3 = (undefined2)((ulong)param_1 >> 0x10); + piVar2 = (int *)param_1; + BEGINPAINT(unaff_CS,local_24,unaff_SS,piVar2[2]); + if (*(int *)((int)piVar2 + 0x3b) != 0 || *(int *)((int)piVar2 + 0x3d) != 0) { + piVar1 = (int *)*(undefined4 *)((int)piVar2 + 0x3b); + (*(code *)*(undefined2 *)(*piVar1 + 0x14)) + (0x1228,(int *)piVar1,(int)((ulong)piVar1 >> 0x10),local_24); + } + (*(code *)*(undefined2 *)(*param_1 + 0x4c))(0x1228,piVar2,uVar3,local_24); + if (*(int *)((int)piVar2 + 0x3b) != 0 || *(int *)((int)piVar2 + 0x3d) != 0) { + piVar1 = (int *)*(undefined4 *)((int)piVar2 + 0x3b); + (*(code *)*(undefined2 *)(*piVar1 + 0x18))(0x1228,(int *)piVar1,(int)((ulong)piVar1 >> 0x10)); + } + ENDPAINT(0x1228,local_24,unaff_SS); + return; +} + + +/* ===== 1018:18e9 FUN_1018_18e9 ===== */ + +void __stdcall16far FUN_1018_18e9(int *param_1,undefined4 param_2) + +{ + undefined2 *puVar1; + int unaff_BP; + int *piVar2; + int iVar3; + undefined2 uVar4; + undefined2 uVar5; + undefined2 unaff_CS; + undefined2 uVar6; + undefined2 unaff_SS; + int local_c; + int local_a; + int local_8; + int local_6; + undefined2 uStack_4; + int iStack_2; + + iStack_2 = unaff_BP + 1; + uStack_4 = 0x1028; + uVar4 = (undefined2)((ulong)param_1 >> 0x10); + piVar2 = (int *)param_1; + iVar3 = (int)param_2; + uVar5 = (undefined2)((ulong)param_2 >> 0x10); + if ((*(int *)((int)piVar2 + 0x3b) != 0 || *(int *)((int)piVar2 + 0x3d) != 0) && + (*(int *)(iVar3 + 4) != 1)) { + puVar1 = (undefined2 *)(*(int *)*(undefined4 *)((int)piVar2 + 0x3b) + 0xc); + (*(code *)*puVar1)(); + } + uVar6 = unaff_CS; + if (*(int *)(iVar3 + 4) == 0) { + uVar6 = 0x1228; + GETWINDOWRECT(unaff_CS,&local_c,unaff_SS); + *(int *)((int)piVar2 + 0x2f) = local_6 - local_a; + *(int *)((int)piVar2 + 0x2d) = local_8 - local_c; + } + (*(code *)*(undefined2 *)(*param_1 + 0xc))(uVar6,piVar2,uVar4,iVar3,uVar5); + return; +} + + +/* ===== 1018:1960 FUN_1018_1960 ===== */ + +void __stdcall16far FUN_1018_1960(int *param_1,undefined4 param_2) + +{ + int unaff_BP; + int iVar1; + undefined2 uVar2; + undefined2 uVar3; + + iVar1 = unaff_BP + 1; + uVar3 = 0x1028; + uVar2 = (undefined2)((ulong)param_1 >> 0x10); + FUN_1018_15c0((int *)param_1,uVar2); + (*(code *)*(undefined2 *)(*param_1 + 0xc)) + (0x1018,(int *)param_1,uVar2,(int)param_2,(int)((ulong)param_2 >> 0x10),uVar3,iVar1); + return; +} + + +/* ===== 1018:1986 FUN_1018_1986 ===== */ + +void __stdcall16far FUN_1018_1986(int *param_1,undefined4 param_2) + +{ + int *piVar1; + int iVar2; + int unaff_BP; + int *piVar3; + undefined2 uVar4; + undefined2 unaff_CS; + undefined2 unaff_SS; + int iVar5; + undefined1 local_16 [2]; + int local_14; + undefined2 uStack_4; + int iStack_2; + + iStack_2 = unaff_BP + 1; + uStack_4 = 0x1028; + uVar4 = (undefined2)((ulong)param_1 >> 0x10); + piVar3 = (int *)param_1; + if ((*(int *)((int)piVar3 + 0x3b) != 0 || *(int *)((int)piVar3 + 0x3d) != 0) && + (*(char *)((int)*(undefined4 *)((int)piVar3 + 0x3b) + 0x22) != '\0')) { + iVar5 = piVar3[2]; + SETCAPTURE(); + do { + iVar2 = PEEKMESSAGE(0x1228,1,0,0,0,local_16,unaff_SS); + if (iVar2 != 0) { + TRANSLATEMESSAGE(0x1228,local_16); + DISPATCHMESSAGE(0x1228,local_16); + } + piVar1 = (int *)*(undefined4 *)((int)piVar3 + 0x3b); + (*(code *)*(undefined2 *)(*piVar1 + 0x24)) + (0x1228,(int *)piVar1,(int)((ulong)piVar1 >> 0x10),iVar5); + } while (local_14 != 0x202); + unaff_CS = 0x1228; + RELEASECAPTURE(0x1228); + } + (*(code *)*(undefined2 *)(*param_1 + 0xc)) + (unaff_CS,piVar3,uVar4,(int)param_2,(int)((ulong)param_2 >> 0x10)); + return; +} + + +/* ===== 1018:1a0e FUN_1018_1a0e ===== */ + +void __stdcall16far FUN_1018_1a0e(int *param_1,undefined4 param_2) + +{ + int iVar1; + char cVar2; + int unaff_BP; + int iVar3; + int *piVar4; + undefined2 uVar5; + undefined2 uVar6; + undefined2 uVar7; + + iVar3 = unaff_BP + 1; + uVar7 = 0x1028; + uVar5 = (undefined2)((ulong)param_1 >> 0x10); + piVar4 = (int *)param_1; + cVar2 = FUN_1018_0673(piVar4,uVar5,1); + uVar6 = (undefined2)((ulong)param_2 >> 0x10); + if (cVar2 != '\0') { + iVar1 = *(int *)((int)param_2 + 4); + if (iVar1 == -0xfe0) { + FUN_1018_1586(piVar4,uVar5); + } + else if (iVar1 == -0xee0) { + FUN_1018_1547(piVar4,uVar5); + } + } + (*(code *)*(undefined2 *)(*param_1 + 0xc))(0x1018,piVar4,uVar5,(int)param_2,uVar6,uVar7,iVar3); + return; +} + + +/* ===== 1018:1a61 FUN_1018_1a61 ===== */ + +int * __stdcall16far FUN_1018_1a61(int *param_1,undefined2 param_2,int param_3,int param_4) + +{ + undefined2 uVar1; + int unaff_BP; + int *piVar2; + undefined2 uVar3; + bool bVar4; + + bVar4 = true; + FUN_1020_03ef(0x1028,unaff_BP + 1); + if (!bVar4) { + uVar3 = (undefined2)((ulong)param_1 >> 0x10); + piVar2 = (int *)param_1; + FUN_1008_2d99(piVar2,uVar3,0); + piVar2[2] = param_3; + piVar2[3] = param_4; + DAT_1028_064e._0_2_ = piVar2; + DAT_1028_064e._2_2_ = uVar3; + piVar2[6] = 0; + piVar2[1] = 0; + piVar2[4] = 0; + piVar2[5] = 0; + piVar2[7] = 0; + piVar2[8] = 0; + uVar1 = uVar3; + DAT_1028_0672 = MAKEPROCINSTANCE((void *)CONCAT22(0x133,DAT_1028_06fe),0x1018); + DAT_1028_0674 = uVar1; + FUN_1008_2e76(); + if (DAT_1028_06fc == 0) { + (*(code *)*(undefined2 *)(*param_1 + 0x10))(0x1008,piVar2,uVar3); + } + if (piVar2[1] == 0) { + (*(code *)*(undefined2 *)(*param_1 + 0x14))(0x1008,piVar2,uVar3); + } + } + return param_1; +} + + +/* ===== 1018:1b08 FUN_1018_1b08 ===== */ + +void __stdcall16far FUN_1018_1b08(undefined4 param_1) + +{ + int unaff_BP; + int iVar1; + undefined2 uVar2; + + iVar1 = unaff_BP + 1; + uVar2 = 0x1028; + FREEPROCINSTANCE((void *)CONCAT22(DAT_1028_0674,DAT_1028_0672)); + FUN_1008_2dcd((int)param_1,(int)((ulong)param_1 >> 0x10),0); + FUN_1020_0439(uVar2,iVar1); + return; +} + + +/* ===== 1018:1b35 FUN_1018_1b35 ===== */ + +undefined1 __stdcall16far FUN_1018_1b35(void) + +{ + return 0; +} + + +/* ===== 1018:1b4b FUN_1018_1b4b ===== */ + +void __stdcall16far FUN_1018_1b4b(void) + +{ + return; +} + + +/* ===== 1018:1b57 FUN_1018_1b57 ===== */ + +void __stdcall16far FUN_1018_1b57(int *param_1) + +{ + int *piVar1; + undefined2 uVar2; + undefined4 uVar3; + + uVar2 = (undefined2)((ulong)param_1 >> 0x10); + piVar1 = (int *)param_1; + (*(code *)*(undefined2 *)(*param_1 + 0x18))(); + uVar3 = (*(code *)*(undefined2 *)(*param_1 + 0x34))(); + piVar1[4] = (int)uVar3; + piVar1[5] = (int)((ulong)uVar3 >> 0x10); + if (piVar1[4] == 0 && piVar1[5] == 0) { + piVar1[1] = -5; + } + else { + FUN_1018_0e9e((int)*(undefined4 *)(piVar1 + 4),(int)((ulong)*(undefined4 *)(piVar1 + 4) >> 0x10) + ,DAT_1028_0700); + } + return; +} + + +/* ===== 1018:1bb0 FUN_1018_1bb0 ===== */ + +void __stdcall16far FUN_1018_1bb0(int *param_1) + +{ + if (((int *)param_1)[1] == 0) { + (*(code *)*(undefined2 *)(*param_1 + 0x20))(); + } + else { + (*(code *)*(undefined2 *)(*param_1 + 0x40))(); + } + return; +} + + +/* ===== 1018:1bdf FUN_1018_1bdf ===== */ + +void __stdcall16far FUN_1018_1bdf(undefined4 param_1,undefined2 param_2,undefined2 param_3) + +{ + undefined2 uVar1; + + uVar1 = (undefined2)((ulong)param_1 >> 0x10); + *(undefined2 *)((int)param_1 + 0xe) = param_2; + *(undefined2 *)((int)param_1 + 0x10) = param_3; + return; +} + + +/* ===== 1018:1bfc FUN_1018_1bfc ===== */ + +void __stdcall16far FUN_1018_1bfc(int *param_1) + +{ + char cVar1; + char cVar2; + int iVar3; + int unaff_BP; + int *piVar4; + undefined2 uVar5; + undefined2 unaff_CS; + undefined2 unaff_SS; + undefined1 local_16 [2]; + int local_14; + int local_12; + undefined2 uStack_4; + int iStack_2; + + iStack_2 = unaff_BP + 1; + uStack_4 = 0x1028; + cVar1 = '\0'; + do { + iVar3 = PEEKMESSAGE(unaff_CS,1,0,0,0,local_16,unaff_SS); + piVar4 = (int *)param_1; + uVar5 = (undefined2)((ulong)param_1 >> 0x10); + if (iVar3 == 0) { + cVar2 = (*(code *)*(undefined2 *)(*param_1 + 0xc))(0x1228,piVar4,uVar5); + if (cVar2 == '\0') { + cVar1 = '\x12'; + WAITMESSAGE(); + } + } + else if (local_14 == 0x12) { + cVar1 = '\x01'; + } + else { + cVar2 = (*(code *)*(undefined2 *)(*param_1 + 0x24))(0x1228,piVar4,uVar5,local_16); + if (cVar2 == '\0') { + TRANSLATEMESSAGE(0x1228,local_16); + DISPATCHMESSAGE(0x1228,local_16); + } + } + unaff_CS = 0x1228; + } while (cVar1 == '\0'); + piVar4[1] = local_12; + return; +} + + +/* ===== 1018:1c7f FUN_1018_1c7f ===== */ + +undefined1 __stdcall16far FUN_1018_1c7f(int *param_1) + +{ + char cVar1; + + cVar1 = (*(code *)*(undefined2 *)(*param_1 + 0x28))(); + if (((cVar1 == '\0') && (cVar1 = (*(code *)*(undefined2 *)(*param_1 + 0x30))(), cVar1 == '\0')) && + (cVar1 = (*(code *)*(undefined2 *)(*param_1 + 0x2c))(), cVar1 == '\0')) { + return 0; + } + return 1; +} + + +/* ===== 1018:1cd6 FUN_1018_1cd6 ===== */ + +undefined2 __stdcall16far FUN_1018_1cd6(undefined4 param_1,undefined4 param_2) + +{ + uint uVar1; + int iVar2; + undefined2 uVar3; + undefined2 unaff_CS; + undefined1 local_5; + + local_5 = false; + uVar3 = (undefined2)((ulong)param_1 >> 0x10); + iVar2 = (int)param_1; + uVar1 = *(uint *)(iVar2 + 0xe) | *(uint *)(iVar2 + 0x10); + if ((uVar1 != 0) && (*(int *)((int)*(undefined4 *)(iVar2 + 0xe) + 4) != 0)) { + iVar2 = ISDIALOGMESSAGE(unaff_CS,(int)param_2,(int)((ulong)param_2 >> 0x10)); + local_5 = iVar2 != 0; + uVar1 = CONCAT11((char)((uint)-iVar2 >> 8),local_5); + } + return CONCAT11((char)(uVar1 >> 8),local_5); +} + + +/* ===== 1018:1d22 FUN_1018_1d22 ===== */ + +undefined2 __stdcall16far FUN_1018_1d22(undefined4 param_1,undefined4 param_2) + +{ + int iVar1; + undefined2 uVar2; + undefined2 unaff_CS; + + uVar2 = (undefined2)((ulong)param_1 >> 0x10); + if (*(int *)((int)param_1 + 0xc) != 0) { + iVar1 = TRANSLATEACCELERATOR + (unaff_CS,(int)param_2,(int)((ulong)param_2 >> 0x10), + *(undefined2 *)((int)param_1 + 0xc)); + if (iVar1 != 0) { + return 1; + } + } + return 0; +} + + +/* ===== 1018:1d64 FUN_1018_1d64 ===== */ + +undefined2 __stdcall16far FUN_1018_1d64(undefined4 param_1,undefined4 param_2) + +{ + undefined2 *puVar1; + int iVar2; + undefined2 unaff_CS; + long lVar3; + + puVar1 = (undefined2 *)(*(int *)*(undefined4 *)((int)param_1 + 8) + 0x30); + lVar3 = (*(code *)*puVar1)(); + if ((lVar3 != 0) && + (iVar2 = TRANSLATEMDISYSACCEL(unaff_CS,(int)param_2,(int)((ulong)param_2 >> 0x10)), iVar2 != 0) + ) { + return 1; + } + return 0; +} + + +/* ===== 1018:1db1 FUN_1018_1db1 ===== */ + +int * __stdcall16far FUN_1018_1db1(int *param_1,int *param_2) + +{ + char cVar1; + undefined1 extraout_AH; + undefined1 extraout_AH_00; + int unaff_BP; + undefined2 uVar2; + int *piVar3; + int *piVar4; + int iVar5; + int iVar6; + + piVar3 = (int *)0x0; + iVar5 = 0; + piVar4 = piVar3; + iVar6 = iVar5; + if ((int *)param_2 != (int *)0x0 || param_2._2_2_ != 0) { + cVar1 = FUN_1008_2de0(0,0,0x1028,unaff_BP + 1); + uVar2 = (undefined2)((ulong)param_1 >> 0x10); + if (cVar1 == '\0') { + piVar4 = (int *)param_2; + iVar6 = param_2._2_2_; + if (((int *)param_2)[1] != 0) { + (*(code *)*(undefined2 *)(*param_1 + 0x40))(0x1008,(int *)param_1,uVar2,((int *)param_2)[1]) + ; + (*(code *)*(undefined2 *)(*param_2 + 8)) + (0x1008,(int *)param_2,param_2._2_2_,CONCAT11(extraout_AH_00,1)); + piVar4 = piVar3; + iVar6 = iVar5; + } + } + else { + (*(code *)*(undefined2 *)(*param_1 + 0x40))(0x1008,(int *)param_1,uVar2,0xfffe); + (*(code *)*(undefined2 *)(*param_2 + 8)) + (0x1008,(int *)param_2,param_2._2_2_,CONCAT11(extraout_AH,1)); + FUN_1008_2dff(); + piVar4 = piVar3; + iVar6 = iVar5; + } + } + return (int *)CONCAT22(iVar6,piVar4); +} + + +/* ===== 1018:1e39 FUN_1018_1e39 ===== */ + +int * __stdcall16far FUN_1018_1e39(int *param_1,int *param_2) + +{ + char cVar1; + long lVar2; + int *local_8; + int local_6; + + local_8 = (int *)0x0; + local_6 = 0; + if ((int *)param_2 != (int *)0x0 || param_2._2_2_ != 0) { + lVar2 = (*(code *)*(undefined2 *)(*param_1 + 0x3c))(); + if (lVar2 != 0) { + cVar1 = (*(code *)*(undefined2 *)(*param_2 + 0x20))(); + if (cVar1 == '\0') { + (*(code *)*(undefined2 *)(*param_1 + 0x40))(); + (*(code *)*(undefined2 *)(*param_2 + 8))(); + } + else { + local_8 = (int *)param_2; + local_6 = param_2._2_2_; + } + } + } + return (int *)CONCAT22(local_6,local_8); +} + + +/* ===== 1018:1eb0 FUN_1018_1eb0 ===== */ + +int __stdcall16far FUN_1018_1eb0(int *param_1,int *param_2) + +{ + int iVar1; + long lVar2; + int local_6; + + local_6 = 2; + lVar2 = (*(code *)*(undefined2 *)(*param_1 + 0x3c))(); + if (lVar2 != 0) { + iVar1 = (*(code *)*(undefined2 *)(*param_2 + 0x4c))(); + if (iVar1 < 0) { + (*(code *)*(undefined2 *)(*param_1 + 0x40))(); + iVar1 = local_6; + } + local_6 = iVar1; + (*(code *)*(undefined2 *)(*param_2 + 8))(); + } + return local_6; +} + + +/* ===== 1018:1f14 FUN_1018_1f14 ===== */ + +void __stdcall16far FUN_1018_1f14(void) + +{ + int iVar1; + int unaff_BP; + undefined2 unaff_CS; + undefined2 unaff_SS; + undefined1 local_24 [32]; + undefined2 uStack_4; + int iStack_2; + + iStack_2 = unaff_BP + 1; + uStack_4 = 0x1028; + WVSPRINTF(unaff_CS,&stack0x0008,unaff_SS,0x698,0x1028,local_24); + iVar1 = (*DAT_1028_0666)(0x1228,0x14,0x6b3,0x1028,local_24); + if (iVar1 == 7) { + FUN_1020_0061(0x1228); + } + return; +} + + +/* ===== 1018:1f56 FUN_1018_1f56 ===== */ + +undefined1 __stdcall16far FUN_1018_1f56(undefined4 param_1) + +{ + undefined2 *puVar1; + undefined1 uVar2; + + puVar1 = (undefined2 *)(*(int *)*(undefined4 *)((int)param_1 + 8) + 0x3c); + uVar2 = (*(code *)*puVar1)(); + return uVar2; +} + + +/* ===== 1020:0002 FUN_1020_0002 ===== */ + +/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */ + +void __cdecl16far FUN_1020_0002(void) + +{ + code *pcVar1; + int in_AX; + int iVar2; + uint uVar3; + undefined2 in_DX; + undefined2 in_BX; + int unaff_BP; + int iVar4; + undefined2 unaff_SI; + undefined2 unaff_DI; + int unaff_ES; + undefined2 unaff_CS; + int in_stack_00000000; + undefined2 uVar5; + + iVar4 = unaff_BP + 1; + uVar5 = 0x1028; + if (in_AX != 0) { + DAT_1028_06fc = unaff_SI; + DAT_1028_06fe = unaff_DI; + DAT_1028_0700 = in_DX; + DAT_1028_0702._0_2_ = in_BX; + DAT_1028_0702._2_2_ = unaff_ES; + DAT_1028_071c = unaff_ES; + WAITEVENT(0); + unaff_CS = 0x1228; + iVar2 = INITAPP(0x1228,DAT_1028_06fe); + if (iVar2 != 0) { + uVar3 = GETWINFLAGS(0x1228); + DAT_1028_0726 = 0; + if (((uVar3 & 0xc0) == 0) && (DAT_1028_0726 = 1, (uVar3 & 2) == 0)) { + DAT_1028_0726 = 2; + } + DAT_1028_0724 = 0x6c; + return; + } + } + pcVar1 = (code *)swi(0x21); + _DAT_1028_0716 = (*pcVar1)(uVar5); + DAT_1028_0718 = iVar4; + if ((DAT_1028_0718 != 0 || in_stack_00000000 != 0) && (in_stack_00000000 != -1)) { + in_stack_00000000 = *(int *)0x0; + } + DAT_1028_071a = in_stack_00000000; + if (DAT_1028_071c != 0) { + FUN_1020_00d2(); + } + if (DAT_1028_0718 != 0 || DAT_1028_071a != 0) { + FUN_1020_00f0(); + FUN_1020_00f0(); + FUN_1020_00f0(); + MESSAGEBOX(unaff_CS,0x1010,0,0,0x728,0x1028); + } + pcVar1 = (code *)swi(0x21); + (*pcVar1)(); + if ((int)((ulong)_DAT_1028_0712 >> 0x10) != 0 || (int)_DAT_1028_0712 != 0) { + _DAT_1028_0712 = 0; + DAT_1028_071e = 0; + return; + } + return; +} + + +/* ===== 1020:005d FUN_1020_005d ===== */ + +/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */ + +void FUN_1020_005d(int param_1) + +{ + code *pcVar1; + undefined2 in_AX; + undefined2 unaff_CS; + int in_stack_00000000; + + if ((in_stack_00000000 != 0 || param_1 != 0) && (param_1 != -1)) { + param_1 = *(int *)0x0; + } + _DAT_1028_0716 = in_AX; + DAT_1028_0718 = in_stack_00000000; + DAT_1028_071a = param_1; + if (DAT_1028_071c != 0) { + FUN_1020_00d2(); + } + if (DAT_1028_0718 != 0 || DAT_1028_071a != 0) { + FUN_1020_00f0(); + FUN_1020_00f0(); + FUN_1020_00f0(); + MESSAGEBOX(unaff_CS,0x1010,0,0,0x728); + } + pcVar1 = (code *)swi(0x21); + (*pcVar1)(); + if ((int)((ulong)_DAT_1028_0712 >> 0x10) != 0 || (int)_DAT_1028_0712 != 0) { + _DAT_1028_0712 = 0; + DAT_1028_071e = 0; + return; + } + return; +} + + +/* ===== 1020:0061 FUN_1020_0061 ===== */ + +/* WARNING: Removing unreachable block (ram,0x1020006e) */ +/* WARNING: Removing unreachable block (ram,0x10200073) */ +/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */ + +void FUN_1020_0061(void) + +{ + code *pcVar1; + undefined2 in_AX; + undefined2 unaff_CS; + + DAT_1028_0718 = 0; + DAT_1028_071a = 0; + _DAT_1028_0716 = in_AX; + if (DAT_1028_071c != 0) { + FUN_1020_00d2(); + } + if (DAT_1028_0718 != 0 || DAT_1028_071a != 0) { + FUN_1020_00f0(); + FUN_1020_00f0(); + FUN_1020_00f0(); + MESSAGEBOX(unaff_CS,0x1010,0,0,0x728,0x1028); + } + pcVar1 = (code *)swi(0x21); + (*pcVar1)(); + if ((int)((ulong)_DAT_1028_0712 >> 0x10) == 0 && (int)_DAT_1028_0712 == 0) { + return; + } + _DAT_1028_0712 = 0; + DAT_1028_071e = 0; + return; +} + + +/* ===== 1020:00d2 FUN_1020_00d2 ===== */ + +/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */ + +void __cdecl16near FUN_1020_00d2(void) + +{ + if ((int)((ulong)_DAT_1028_0712 >> 0x10) != 0 || (int)_DAT_1028_0712 != 0) { + _DAT_1028_0712 = 0; + DAT_1028_071e = 0; + return; + } + return; +} + + +/* ===== 1020:00f0 FUN_1020_00f0 ===== */ + +void __cdecl16near FUN_1020_00f0(void) + +{ + uint in_AX; + uint uVar1; + uint in_CX; + byte bVar2; + byte *in_BX; + char cVar3; + + do { + uVar1 = in_AX / in_CX; + cVar3 = (char)(in_AX % in_CX); + bVar2 = cVar3 + 0x30; + if (0x39 < bVar2) { + bVar2 = cVar3 + 0x37; + } + in_BX = in_BX + -1; + *in_BX = bVar2; + in_AX = uVar1; + } while (uVar1 != 0); + return; +} + + +/* ===== 1020:012d FUN_1020_012d ===== */ + +void __stdcall16far FUN_1020_012d(void) + +{ + int unaff_BP; + undefined1 in_CF; + + FUN_1020_01ca(0x1028,unaff_BP + 1); + if (!(bool)in_CF) { + return; + } + FUN_1020_005d(); + return; +} + + +/* ===== 1020:0147 FUN_1020_0147 ===== */ + +void __stdcall16far FUN_1020_0147(void) + +{ + int unaff_BP; + undefined1 in_CF; + + FUN_1020_02d7(0x1028,unaff_BP + 1); + if (!(bool)in_CF) { + return; + } + FUN_1020_005d(); + return; +} + + +/* ===== 1020:0167 FUN_1020_0167 ===== */ + +int __cdecl16far FUN_1020_0167(void) + +{ + int iVar1; + int iVar2; + + iVar1 = GETFREESPACE(); + iVar2 = DAT_1028_0706; + if (DAT_1028_0706 != 0) { + do { + iVar1 = iVar1 + *(int *)0x8; + iVar2 = *(int *)0xa; + } while (iVar2 != DAT_1028_0706); + } + return iVar1; +} + + +/* ===== 1020:0195 runtime_1020_0195 ===== */ + +void __cdecl16far runtime_1020_0195(void) + +{ + uint uVar1; + int iVar2; + int in_DX; + + uVar1 = GLOBALCOMPACT(0); + if ((in_DX == 0) && (iVar2 = DAT_1028_0706, DAT_1028_0706 != 0)) { + do { + if (uVar1 < *(uint *)0x8) { + uVar1 = *(uint *)0x8; + } + iVar2 = *(int *)0xa; + } while (iVar2 != DAT_1028_0706); + } + return; +} + + +/* ===== 1020:01ca FUN_1020_01ca ===== */ + +void __cdecl16near FUN_1020_01ca(void) + +{ + uint uVar1; + uint in_AX; + uint uVar2; + undefined1 uVar3; + + uVar1 = in_AX; + if (in_AX != 0) { + do { + DAT_1028_4d38 = uVar1; + uVar3 = DAT_1028_4d38 < DAT_1028_0708; + if ((bool)uVar3) { + FUN_1020_023c(); + if (!(bool)uVar3) { + return; + } + FUN_1020_0222(); +LAB_1020_0201: + if (!(bool)uVar3) { + return; + } + } + else { + FUN_1020_0222(); + if (!(bool)uVar3) { + return; + } + if ((DAT_1028_0708 != 0) && + (uVar3 = DAT_1028_4d38 < DAT_1028_070a - 0xcU, DAT_1028_4d38 <= DAT_1028_070a - 0xcU)) { + FUN_1020_023c(); + goto LAB_1020_0201; + } + } + uVar2 = 0; + if (DAT_1028_070e != (code *)0x0 || DAT_1028_0710 != 0) { + uVar2 = (*DAT_1028_070e)(); + } + uVar1 = DAT_1028_4d38; + } while (1 < uVar2); + } + return; +} + + +/* ===== 1020:0222 FUN_1020_0222 ===== */ + +void __cdecl16near FUN_1020_0222(void) + +{ + ushort in_AX; + ushort arg1; + + arg1 = GLOBALALLOC(in_AX,0); + if (arg1 != 0) { + GLOBALLOCK(arg1); + } + return; +} + + +/* ===== 1020:023c FUN_1020_023c ===== */ + +undefined2 __cdecl16near FUN_1020_023c(void) + +{ + uint uVar1; + undefined2 uVar2; + undefined2 in_BX; + uint unaff_ES; + bool bVar3; + + bVar3 = false; + uVar1 = DAT_1028_0706; + if (DAT_1028_0706 != 0) { + do { + unaff_ES = uVar1; + FUN_1020_02a6(); + if (!bVar3) { + DAT_1028_0706 = unaff_ES; + return in_BX; + } + uVar1 = *(uint *)0xa; + bVar3 = uVar1 < DAT_1028_0706; + } while (uVar1 != DAT_1028_0706); + } + uVar2 = FUN_1020_026a(); + if (!bVar3) { + uVar2 = in_BX; + FUN_1020_02a6(); + DAT_1028_0706 = unaff_ES; + } + return uVar2; +} + + +/* ===== 1020:026a FUN_1020_026a ===== */ + +undefined2 __cdecl16near FUN_1020_026a(void) + +{ + undefined2 in_AX; + int iVar1; + undefined2 uVar2; + undefined2 extraout_DX; + undefined1 in_CF; + + FUN_1020_0222(); + if (!(bool)in_CF) { + *(undefined2 *)0x0 = 0x5054; + *(undefined2 *)0x2 = 0; + *(undefined2 *)0x4 = 0xc; + *(undefined2 *)0x6 = 0; + iVar1 = DAT_1028_070a + -0xc; + *(int *)0x8 = iVar1; + uVar2 = extraout_DX; + if (DAT_1028_0706 != 0) { + LOCK(); + uVar2 = *(undefined2 *)0xa; + *(undefined2 *)0xa = extraout_DX; + UNLOCK(); + } + *(undefined2 *)0xa = uVar2; + *(undefined2 *)0xc = 0; + *(int *)0xe = iVar1; + } + return in_AX; +} + + +/* ===== 1020:02a6 FUN_1020_02a6 ===== */ + +void __cdecl16near FUN_1020_02a6(void) + +{ + int *piVar1; + uint in_AX; + int iVar2; + int *piVar3; + int *piVar4; + undefined2 unaff_ES; + + piVar1 = (int *)0x4; + do { + piVar3 = piVar1; + piVar1 = (int *)*piVar3; + if (piVar1 == (int *)0x0) { + return; + } + iVar2 = piVar1[1] - in_AX; + } while ((uint)piVar1[1] < in_AX); + piVar4 = (int *)*piVar1; + if (iVar2 != 0) { + piVar4 = (int *)((int)piVar1 + in_AX); + *piVar4 = *piVar1; + piVar4[1] = iVar2; + } + *piVar3 = (int)piVar4; + *(int *)0x8 = *(int *)0x8 - in_AX; + return; +} + + +/* ===== 1020:02d7 FUN_1020_02d7 ===== */ + +void __cdecl16near FUN_1020_02d7(void) + +{ + ushort uVar1; + int in_AX; + int iVar2; + uint uVar3; + uint *in_CX; + ushort in_BX; + uint *puVar4; + uint *puVar5; + + if (in_AX == 0) { + return; + } + if (in_CX != (uint *)0x0) { + uVar3 = in_AX + 3U & 0xfffc; + if (*(int *)0x0 != 0x5054) { + return; + } + if (((uint)in_CX & 3) != 0) { + return; + } + puVar5 = (uint *)0x4; + do { + puVar4 = puVar5; + puVar5 = (uint *)*puVar4; + if (puVar5 == (uint *)0x0) goto LAB_1020_0306; + } while (puVar5 <= in_CX && in_CX != puVar5); + if (in_CX == puVar5) { + return; + } +LAB_1020_0306: + *in_CX = (uint)puVar5; + in_CX[1] = uVar3; + iVar2 = uVar3 + *(int *)0x8; + *(int *)0x8 = iVar2; + if (iVar2 + 0xc != DAT_1028_070a) { + FUN_1020_0327(); + *puVar4 = (uint)in_CX; + puVar5 = (uint *)((int)puVar4 + puVar4[1]); + if (puVar5 != (uint *)*puVar4) { + return; + } + *puVar4 = *puVar5; + puVar4[1] = puVar4[1] + puVar5[1]; + return; + } + uVar1 = DAT_1028_0706; + DAT_1028_0706 = 0; + if (in_BX != *(ushort *)0xa) { + do { + DAT_1028_0706 = uVar1; + uVar1 = *(ushort *)0xa; + } while (*(ushort *)0xa != in_BX); + *(ushort *)0xa = *(ushort *)0xa; + } + } + if ((in_BX != 0x1028) && (uVar3 = GLOBALHANDLE(in_BX), uVar3 != 0)) { + GLOBALUNLOCK(uVar3); + GLOBALFREE(uVar3); + return; + } + return; +} + + +/* ===== 1020:0327 FUN_1020_0327 ===== */ + +void __cdecl16near FUN_1020_0327(void) + +{ + int *in_BX; + int *piVar1; + undefined2 unaff_ES; + + piVar1 = (int *)((int)in_BX + in_BX[1]); + if (piVar1 == (int *)*in_BX) { + *in_BX = *piVar1; + in_BX[1] = in_BX[1] + piVar1[1]; + } + return; +} + + +/* ===== 1020:0388 FUN_1020_0388 ===== */ + +undefined2 __cdecl16far FUN_1020_0388(void) + +{ + undefined2 uVar1; + + uVar1 = DAT_1028_071e; + LOCK(); + DAT_1028_071e = 0; + UNLOCK(); + return uVar1; +} + + +/* ===== 1020:038f FUN_1020_038f ===== */ + +void __cdecl16far FUN_1020_038f(void) + +{ + if (DAT_1028_071e == 0) { + return; + } + FUN_1020_005d(); + return; +} + + +/* ===== 1020:039d FUN_1020_039d ===== */ + +void __cdecl16far FUN_1020_039d(void) + +{ + uint in_AX; + int in_DX; + uint *unaff_DI; + undefined2 in_stack_00000002; + + if ((((int)unaff_DI[1] < in_DX) || (((int)unaff_DI[1] <= in_DX && (*unaff_DI <= in_AX)))) && + ((in_DX < (int)unaff_DI[3] || ((in_DX <= (int)unaff_DI[3] && (in_AX <= unaff_DI[2])))))) { + return; + } + FUN_1020_005d(); + return; +} + + +/* ===== 1020:03c5 runtime_1020_03c5 ===== */ + +void runtime_1020_03c5(void) + +{ + FUN_1020_005d(); + return; +} + + +/* ===== 1020:03cb FUN_1020_03cb ===== */ + +void __cdecl16far FUN_1020_03cb(void) + +{ + uint in_AX; + uint uVar1; + undefined2 unaff_SS; + + if (((in_AX < 0xfc00) && ((undefined1 *)(in_AX + 0x400) < &stack0x0000)) && + (uVar1 = -((int)(in_AX + 0x400) - (int)&stack0x0000), *(uint *)0xa <= uVar1)) { + if (uVar1 < *(uint *)0xe) { + *(uint *)0xe = uVar1; + } + return; + } + FUN_1020_005d(); + return; +} + + +/* ===== 1020:03ef FUN_1020_03ef ===== */ + +/* WARNING: Unable to track spacebase fully for stack */ + +void __cdecl16far FUN_1020_03ef(void) + +{ + int iVar1; + int unaff_BP; + int unaff_DI; + undefined2 unaff_SS; + bool bVar2; + long lVar3; + + iVar1 = *(int *)(unaff_BP + 10); + if (iVar1 != 0) { + lVar3 = *(long *)(unaff_BP + 6); + bVar2 = false; + if (lVar3 == 0) { + lVar3 = FUN_1020_01ca(); + if (bVar2) { + FUN_1020_005d(); + return; + } + if (lVar3 == 0) { + return; + } + *(undefined2 *)(unaff_BP + 6) = (int)lVar3; + *(undefined2 *)(unaff_BP + 8) = (int)((ulong)lVar3 >> 0x10); + } + else { + *(undefined2 *)(unaff_BP + 10) = 0; + } + *(int *)((int)lVar3 + unaff_DI) = iVar1; + } + return; +} + + +/* ===== 1020:0439 FUN_1020_0439 ===== */ + +/* WARNING: Unable to track spacebase fully for stack */ + +void __cdecl16far FUN_1020_0439(void) + +{ + int unaff_BP; + undefined2 unaff_SS; + bool bVar1; + + bVar1 = false; + if (*(int *)(unaff_BP + 10) != 0) { + FUN_1020_02d7(0x1028); + if (bVar1) { + FUN_1020_005d(); + return; + } + } + *(undefined2 *)(unaff_BP + 6) = 0; + *(undefined2 *)(unaff_BP + 8) = 0; + return; +} + + +/* ===== 1020:046c runtime_1020_046c ===== */ + +void __stdcall16far runtime_1020_046c(int param_1,undefined1 *param_2,undefined1 *param_3) + +{ + undefined1 *puVar1; + undefined1 *puVar2; + int *piVar3; + int iVar4; + undefined2 *puVar5; + undefined1 *puVar6; + undefined1 *puVar7; + undefined2 uVar8; + + uVar8 = (undefined2)((ulong)param_2 >> 0x10); + puVar7 = (undefined1 *)param_2; + puVar5 = (undefined2 *)(puVar7 + param_1); + piVar3 = (int *)*puVar5; + puVar6 = (undefined1 *)param_3; + for (iVar4 = *piVar3; iVar4 != 0; iVar4 = iVar4 + -1) { + puVar2 = puVar7; + puVar7 = puVar7 + 1; + puVar1 = puVar6; + puVar6 = puVar6 + 1; + *puVar2 = *puVar1; + } + *puVar5 = piVar3; + return; +} + + +/* ===== 1020:048f runtime_1020_048f ===== */ + +void __cdecl16far runtime_1020_048f(void) + +{ + int *unaff_DI; + + if ((*unaff_DI != 0) && (*unaff_DI + unaff_DI[1] == 0)) { + return; + } + FUN_1020_005d(); + return; +} + + +/* ===== 1020:049f runtime_1020_049f ===== */ + +/* WARNING: Removing unreachable block (ram,0x102004df) */ +/* WARNING: Removing unreachable block (ram,0x102004e4) */ + +void __stdcall16far runtime_1020_049f(char *param_1,undefined2 *param_2) + +{ + char *pcVar1; + char *pcVar2; + int iVar3; + char *pcVar4; + undefined2 *puVar5; + char *pcVar6; + undefined2 uVar7; + + uVar7 = (undefined2)((ulong)param_2 >> 0x10); + puVar5 = (undefined2 *)param_2; + pcVar4 = (char *)param_1; + *param_2 = 0; + puVar5[1] = 0xd7b0; + puVar5[2] = 0x80; + puVar5[3] = 0; + puVar5[4] = 0; + puVar5[5] = 0; + puVar5[6] = puVar5 + 0x40; + puVar5[7] = uVar7; + pcVar6 = (char *)(puVar5 + 9); + puVar5[8] = 0xbe9; + pcVar6[0] = ' '; + pcVar6[1] = '\x10'; + for (iVar3 = 0xe; pcVar6 = pcVar6 + 2, iVar3 != 0; iVar3 = iVar3 + -1) { + pcVar6[0] = '\0'; + pcVar6[1] = '\0'; + } + iVar3 = 0x4f; + do { + pcVar1 = pcVar4; + pcVar4 = pcVar4 + 1; + if (*pcVar1 == '\0') break; + pcVar2 = pcVar6; + pcVar6 = pcVar6 + 1; + *pcVar2 = *pcVar1; + iVar3 = iVar3 + -1; + } while (iVar3 != 0); + *pcVar6 = '\0'; + Ordinal_5(); + return; +} + + +/* ===== 1020:04fc runtime_1020_04fc ===== */ + +void __stdcall16far +runtime_1020_04fc(undefined2 param_1,undefined2 param_2,undefined2 param_3,undefined4 param_4) + +{ + int iVar1; + undefined2 uVar2; + + uVar2 = (undefined2)((ulong)param_4 >> 0x10); + iVar1 = (int)param_4; + *(undefined2 *)(iVar1 + 4) = param_1; + *(undefined2 *)(iVar1 + 0xc) = param_2; + *(undefined2 *)(iVar1 + 0xe) = param_3; + *(undefined2 *)(iVar1 + 8) = 0; + *(undefined2 *)(iVar1 + 10) = 0; + return; +} + + +/* ===== 1020:0527 FUN_1020_0527 ===== */ + +void FUN_1020_0527(void) + +{ + FUN_1020_0534(); + return; +} + + +/* ===== 1020:052c FUN_1020_052c ===== */ + +void FUN_1020_052c(void) + +{ + FUN_1020_0534(); + return; +} + + +/* ===== 1020:0534 FUN_1020_0534 ===== */ + +void __stdcall16far FUN_1020_0534(undefined4 param_1) + +{ + int iVar1; + undefined2 in_DX; + int unaff_BP; + int iVar2; + int iVar3; + undefined2 uVar4; + bool bVar5; + undefined2 uVar6; + + iVar2 = unaff_BP + 1; + uVar6 = 0x1028; + uVar4 = (undefined2)((ulong)param_1 >> 0x10); + iVar3 = (int)param_1; + iVar1 = *(int *)(iVar3 + 2); + if ((iVar1 == -0x284f) || (iVar1 == -0x284e)) { + FUN_1020_0586(iVar3,uVar4); + } + else if (iVar1 != -0x2850) { + DAT_1028_071e = 0x66; + return; + } + bVar5 = true; + *(undefined2 *)(iVar3 + 2) = in_DX; + *(undefined2 *)(iVar3 + 8) = 0; + *(undefined2 *)(iVar3 + 10) = 0; + FUN_1020_05c7(uVar6,iVar2); + if (!bVar5) { + *(undefined2 *)(iVar3 + 2) = 0xd7b0; + } + return; +} + + +/* ===== 1020:0586 FUN_1020_0586 ===== */ + +void __stdcall16far FUN_1020_0586(undefined4 param_1) + +{ + char cVar1; + int unaff_BP; + int iVar2; + undefined2 uVar3; + + cVar1 = '\x01'; + uVar3 = (undefined2)((ulong)param_1 >> 0x10); + iVar2 = (int)param_1; + if (*(int *)(iVar2 + 2) != -0x284f) { + if (*(int *)(iVar2 + 2) != -0x284e) { + DAT_1028_071e = 0x67; + return; + } + cVar1 = '\x01'; + FUN_1020_05c7(1,0x1028,unaff_BP + 1); + } + if (cVar1 != '\0') { + FUN_1020_05c7(); + *(undefined2 *)(iVar2 + 2) = 0xd7b0; + } + return; +} + + +/* ===== 1020:05c7 FUN_1020_05c7 ===== */ + +void __cdecl16near FUN_1020_05c7(void) + +{ + int iVar1; + int in_BX; + int unaff_DI; + + iVar1 = (*(code *)*(undefined2 *)(in_BX + unaff_DI))(); + if (iVar1 != 0) { + DAT_1028_071e = iVar1; + } + return; +} + + +/* ===== 1020:05d8 FUN_1020_05d8 ===== */ + +undefined2 __stdcall16far FUN_1020_05d8(undefined4 param_1) + +{ + code *pcVar1; + undefined2 uVar2; + int iVar3; + undefined2 uVar4; + undefined1 in_CF; + + uVar4 = (undefined2)((ulong)param_1 >> 0x10); + iVar3 = (int)param_1; + pcVar1 = (code *)swi(0x21); + uVar2 = (*pcVar1)(); + if ((bool)in_CF) { + *(undefined2 *)(iVar3 + 10) = 0; + } + else { + *(undefined2 *)(iVar3 + 10) = uVar2; + uVar2 = 0; + } + *(undefined2 *)(iVar3 + 8) = 0; + return uVar2; +} + + +/* ===== 1020:0608 FUN_1020_0608 ===== */ + +int __stdcall16far FUN_1020_0608(undefined4 param_1) + +{ + int *piVar1; + code *pcVar2; + int iVar3; + int iVar4; + bool bVar5; + + bVar5 = false; + LOCK(); + piVar1 = (int *)((int)param_1 + 8); + iVar4 = *piVar1; + *piVar1 = 0; + UNLOCK(); + pcVar2 = (code *)swi(0x21); + iVar3 = (*pcVar2)(); + if ((!bVar5) && (bVar5 = iVar3 != iVar4, iVar3 = 0, bVar5)) { + iVar3 = 0x65; + } + return iVar3; +} + + +/* ===== 1020:062d FUN_1020_062d ===== */ + +undefined2 __stdcall16far FUN_1020_062d(undefined4 param_1) + +{ + code *pcVar1; + undefined2 uVar2; + bool bVar3; + + bVar3 = false; + LOCK(); + *(undefined2 *)((int)param_1 + 8) = 0; + UNLOCK(); + pcVar1 = (code *)swi(0x21); + uVar2 = (*pcVar1)(); + if (!bVar3) { + uVar2 = 0; + } + return uVar2; +} + + +/* ===== 1020:064d FUN_1020_064d ===== */ + +undefined2 __stdcall16far FUN_1020_064d(uint *param_1) + +{ + code *pcVar1; + undefined2 uVar2; + bool bVar3; + + bVar3 = *param_1 < 4; + if (4 < *param_1) { + pcVar1 = (code *)swi(0x21); + uVar2 = (*pcVar1)(); + if (bVar3) { + return uVar2; + } + } + return 0; +} + + +/* ===== 1020:0667 FUN_1020_0667 ===== */ + +void __stdcall16far FUN_1020_0667(byte *param_1,undefined2 *param_2) + +{ + byte *pbVar1; + byte *pbVar2; + int iVar3; + uint uVar4; + byte *pbVar5; + byte *pbVar6; + undefined2 uVar7; + + uVar7 = (undefined2)((ulong)param_2 >> 0x10); + pbVar6 = (byte *)((undefined2 *)param_2 + 1); + *param_2 = 0; + pbVar6[0] = 0xb0; + pbVar6[1] = 0xd7; + for (iVar3 = 0x16; pbVar6 = pbVar6 + 2, iVar3 != 0; iVar3 = iVar3 + -1) { + pbVar6[0] = 0; + pbVar6[1] = 0; + } + uVar4 = 0x4f; + pbVar5 = (byte *)param_1 + 1; + if (0x4e < *param_1) goto LAB_1020_0697; + for (uVar4 = (uint)*param_1; uVar4 != 0; uVar4 = uVar4 - 1) { +LAB_1020_0697: + pbVar1 = pbVar5; + pbVar5 = pbVar5 + 1; + if (*pbVar1 == 0) break; + pbVar2 = pbVar6; + pbVar6 = pbVar6 + 1; + *pbVar2 = *pbVar1; + } + *pbVar6 = 0; + Ordinal_5(); + return; +} + + +/* ===== 1020:06ab FUN_1020_06ab ===== */ + +void __stdcall16far FUN_1020_06ab(undefined2 param_1,undefined2 *param_2) + +{ + code *pcVar1; + undefined2 uVar2; + undefined2 *puVar3; + undefined2 uVar4; + bool bVar5; + undefined2 in_stack_00000000; + + uVar4 = (undefined2)((ulong)param_2 >> 0x10); + puVar3 = (undefined2 *)param_2; + if (puVar3[1] != -0x2850) { + if (puVar3[1] != -0x284d) { + DAT_1028_071e = 0x66; + return; + } + FUN_1020_072c(puVar3,uVar4); + } + uVar2 = 0; + if (*(char *)(puVar3 + 0x18) != '\0') { + bVar5 = false; + pcVar1 = (code *)swi(0x21); + uVar2 = (*pcVar1)(); + if (bVar5) { + *(undefined2 *)&DAT_1028_071e = uVar2; + return; + } + } + puVar3[1] = 0xd7b3; + *param_2 = uVar2; + puVar3[2] = param_1; + return; +} + + +/* ===== 1020:0710 runtime_1020_0710 ===== */ + +void __stdcall16far runtime_1020_0710(void) + +{ + code *pcVar1; + undefined2 uVar2; + bool bVar3; + undefined1 in_ZF; + + FUN_1020_0751(); + if ((bool)in_ZF) { + bVar3 = false; + pcVar1 = (code *)swi(0x21); + uVar2 = (*pcVar1)(); + if (bVar3) { + DAT_1028_071e = uVar2; + } + } + return; +} + + +/* ===== 1020:072c FUN_1020_072c ===== */ + +void __stdcall16far FUN_1020_072c(uint *param_1) + +{ + code *pcVar1; + undefined2 uVar2; + bool bVar3; + undefined1 in_ZF; + + FUN_1020_0751(); + if ((bool)in_ZF) { + bVar3 = *param_1 < 4; + if (4 < *param_1) { + pcVar1 = (code *)swi(0x21); + uVar2 = (*pcVar1)(); + if (bVar3) { + DAT_1028_071e = uVar2; + } + } + ((uint *)param_1)[1] = 0xd7b0; + } + return; +} + + +/* ===== 1020:0751 FUN_1020_0751 ===== */ + +void __cdecl16near FUN_1020_0751(void) + +{ + int unaff_DI; + undefined2 unaff_ES; + + if (*(int *)(unaff_DI + 2) != -0x284d) { + DAT_1028_071e = 0x67; + } + return; +} + + +/* ===== 1020:0760 runtime_1020_0760 ===== */ + +void __stdcall16far runtime_1020_0760(undefined2 param_1,undefined2 param_2,undefined4 param_3) + +{ + code *pcVar1; + int iVar2; + int iVar3; + int iVar4; + int unaff_BP; + undefined1 in_CF; + undefined1 in_ZF; + undefined2 in_stack_00000000; + + FUN_1020_0751(); + if ((bool)in_ZF) { + iVar4 = *(int *)((int)param_3 + 4); + pcVar1 = (code *)swi(0x21); + iVar2 = (*pcVar1)(0x1028); + iVar3 = iVar2; + if (((bool)in_CF) || (iVar3 = unaff_BP, iVar2 != iVar4)) { + *(int *)&DAT_1028_071e = iVar3; + } + } + return; +} + + +/* ===== 1020:0796 runtime_1020_0796 ===== */ + +void __stdcall16far +runtime_1020_0796(uint *param_1,uint param_2,undefined2 param_3,undefined2 param_4, + undefined4 param_5) + +{ + code *pcVar1; + uint uVar2; + undefined2 uVar3; + undefined2 unaff_BP; + undefined2 uVar4; + int iVar5; + undefined2 uVar6; + bool bVar7; + undefined1 in_ZF; + undefined2 in_stack_00000000; + + uVar3 = 100; + uVar4 = (undefined2)((ulong)param_5 >> 0x10); + FUN_1020_0751(); + iVar5 = (int)((ulong)param_1 >> 0x10); + if ((bool)in_ZF) { + uVar2 = 0; + uVar6 = 0x1028; + if (param_2 != 0) { + bVar7 = (int)((ulong)param_2 * (ulong)*(uint *)((int)param_5 + 4) >> 0x10) != 0; + pcVar1 = (code *)swi(0x21); + uVar2 = (*pcVar1)(0x1028); + if (bVar7) { + *(uint *)&DAT_1028_071e = uVar2; + goto LAB_1020_07ec; + } + uVar2 = uVar2 / *(uint *)((int)param_5 + 4); + uVar3 = unaff_BP; + uVar6 = in_stack_00000000; + } + if (iVar5 == 0 && (uint *)param_1 == (uint *)0x0) { + if (uVar2 != param_2) { + *(undefined2 *)&DAT_1028_071e = uVar3; + } + } + else { + *param_1 = uVar2; + } + } + else { +LAB_1020_07ec: + if (iVar5 != 0 || (uint *)param_1 != (uint *)0x0) { + *param_1 = 0; + } + } + return; +} + + +/* ===== 1020:07fe FUN_1020_07fe ===== */ + +void __stdcall16far FUN_1020_07fe(uint param_1,int param_2,undefined4 param_3) + +{ + code *pcVar1; + undefined2 uVar2; + bool bVar3; + undefined1 in_ZF; + + uVar2 = (undefined2)((ulong)param_3 >> 0x10); + FUN_1020_0751(); + if ((bool)in_ZF) { + bVar3 = CARRY2(param_2 * *(int *)((int)param_3 + 4), + (uint)((ulong)param_1 * (ulong)*(uint *)((int)param_3 + 4) >> 0x10)); + pcVar1 = (code *)swi(0x21); + uVar2 = (*pcVar1)(); + if (bVar3) { + DAT_1028_071e = uVar2; + } + } + return; +} + + +/* ===== 1020:082e FUN_1020_082e ===== */ + +ushort __stdcall16far FUN_1020_082e(ushort param_1,undefined1 *param_2) + +{ + undefined1 *puVar1; + int iVar2; + undefined1 *in_BX; + undefined1 *puVar3; + void *pvVar4; + + puVar3 = (undefined1 *)param_2; + pvVar4 = (void *)((ulong)param_2 >> 0x10); + if (param_1 == 0) { + param_1 = GETMODULEFILENAME(0xff,(void *)CONCAT22(DAT_1028_06fe,pvVar4),0x1028); + *param_2 = (char)param_1; + } + else { + iVar2 = FUN_1020_0871(); + *param_2 = (char)iVar2; + for (; puVar3 = puVar3 + 1, iVar2 != 0; iVar2 = iVar2 + -1) { + puVar1 = in_BX; + in_BX = in_BX + 1; + *puVar3 = *puVar1; + } + } + return param_1; +} + + +/* ===== 1020:0866 runtime_1020_0866 ===== */ + +int __cdecl16far runtime_1020_0866(void) + +{ + int iVar1; + + iVar1 = 0; + FUN_1020_0871(0x1028); + return -iVar1; +} + + +/* ===== 1020:0871 FUN_1020_0871 ===== */ + +void __cdecl16near FUN_1020_0871(void) + +{ + byte *pbVar1; + int in_CX; + byte *pbVar2; + byte *pbVar3; + undefined2 uVar4; + + uVar4 = (undefined2)((ulong)DAT_1028_0702 >> 0x10); + pbVar3 = (byte *)DAT_1028_0702; +LAB_1020_0876: + do { + pbVar2 = pbVar3; + pbVar1 = pbVar2; + if (*pbVar2 != 0) { + pbVar3 = pbVar2 + 1; + if (*pbVar2 < 0x21) goto LAB_1020_0876; + } + do { + pbVar3 = pbVar1; + pbVar1 = pbVar3 + 1; + } while (0x20 < *pbVar3); + if ((pbVar3 == pbVar2) || (in_CX = in_CX + -1, in_CX == 0)) { + return; + } + } while( true ); +} + + +/* ===== 1020:0891 FUN_1020_0891 ===== */ + +void __stdcall16far FUN_1020_0891(int param_1,undefined1 *param_2,undefined1 *param_3) + +{ + undefined1 *puVar1; + undefined1 *puVar2; + undefined1 *puVar3; + undefined1 *puVar4; + + puVar3 = (undefined1 *)param_3; + puVar4 = (undefined1 *)param_2; + for (; param_1 != 0; param_1 = param_1 + -1) { + puVar2 = puVar4; + puVar4 = puVar4 + 1; + puVar1 = puVar3; + puVar3 = puVar3 + 1; + *puVar2 = *puVar1; + } + return; +} + + +/* ===== 1020:08a9 FUN_1020_08a9 ===== */ + +int __cdecl16far FUN_1020_08a9(void) + +{ + int in_AX; + int in_CX; + + if (1 < DAT_1028_0726) { + return in_AX * in_CX; + } + return in_AX * in_CX; +} + + +/* ===== 1020:08e6 FUN_1020_08e6 ===== */ + +int __cdecl16far FUN_1020_08e6(void) + +{ + uint uVar1; + uint in_AX; + int iVar2; + int iVar3; + uint in_CX; + uint uVar4; + uint in_DX; + uint in_BX; + int iVar5; + uint uVar6; + uint uVar7; + int iVar8; + bool bVar9; + bool bVar10; + + if (1 < DAT_1028_0726) { + if (CONCAT22(in_BX,in_CX) != 0) { + return (int)(CONCAT22(in_DX,in_AX) / CONCAT22(in_BX,in_CX)); + } +LAB_1020_095f: + iVar3 = FUN_1020_005d(); + return iVar3; + } + bVar10 = (int)in_DX < 0; + if (bVar10) { + bVar9 = in_AX != 0; + in_AX = -in_AX; + in_DX = -(in_DX + bVar9); + } + uVar7 = (uint)bVar10; + if (in_BX == 0) { + if (in_CX == 0) goto LAB_1020_095f; +LAB_1020_0967: + iVar3 = (int)(((ulong)in_DX % (ulong)in_CX << 0x10 | (ulong)in_AX) / (ulong)in_CX); + } + else { + if ((int)in_BX < 0) { + uVar7 = uVar7 + 2; + bVar9 = in_CX != 0; + in_CX = -in_CX; + in_BX = -(in_BX + bVar9); + if (in_BX == 0) goto LAB_1020_0967; + } + iVar5 = 0; + iVar3 = 0; + iVar8 = 0x10; + do { + iVar2 = iVar3 * 2; + bVar9 = (int)in_AX < 0; + in_AX = in_AX << 1 | (uint)(iVar3 < 0); + uVar4 = in_DX << 1 | (uint)bVar9; + uVar6 = iVar5 << 1 | (uint)((int)in_DX < 0); + in_DX = uVar4 - in_CX; + uVar4 = (uint)(uVar4 < in_CX); + uVar1 = uVar6 - in_BX; + iVar5 = uVar1 - uVar4; + iVar3 = iVar2 + 1; + if (uVar6 < in_BX || uVar1 < uVar4) { + bVar9 = CARRY2(in_DX,in_CX); + in_DX = in_DX + in_CX; + iVar5 = iVar5 + in_BX + (uint)bVar9; + iVar3 = iVar2; + } + iVar8 = iVar8 + -1; + } while (iVar8 != 0); + } + uVar7 = uVar7 >> 1; + if (bVar10) { + uVar7 = uVar7 + 1; + } + if (uVar7 == 1) { + iVar3 = -iVar3; + } + return iVar3; +} + + +/* ===== 1020:098c runtime_1020_098c ===== */ + +uint __cdecl16far runtime_1020_098c(void) + +{ + ulong uVar1; + uint in_AX; + uint in_CX; + uint uVar2; + ulong in_EDX; + + if (DAT_1028_0726 < 2) { + for (uVar2 = in_CX & 0x1f; uVar2 != 0; uVar2 = uVar2 - 1) { + uVar1 = in_EDX & 1; + in_EDX = in_EDX >> 1 & 0x7fff; + in_AX = in_AX >> 1 | (uint)(uVar1 != 0) << 0xf; + } + return in_AX; + } + return (uint)(CONCAT22((int)in_EDX,in_AX) >> ((byte)in_CX & 0x1f)); +} + + +/* ===== 1020:09af runtime_1020_09af ===== */ + +int __cdecl16far runtime_1020_09af(void) + +{ + int in_AX; + uint in_CX; + uint uVar1; + + if (DAT_1028_0726 < 2) { + for (uVar1 = in_CX & 0x1f; uVar1 != 0; uVar1 = uVar1 - 1) { + in_AX = in_AX << 1; + } + return in_AX; + } + return in_AX << ((byte)in_CX & 0x1f); +} + + +/* ===== 1020:09d2 runtime_1020_09d2 ===== */ + +void __stdcall16far runtime_1020_09d2(byte *param_1,byte *param_2) + +{ + byte bVar1; + uint uVar2; + byte *pbVar3; + byte *pbVar4; + + pbVar4 = (byte *)param_2; + pbVar3 = (byte *)param_1; + bVar1 = *param_1; + *param_2 = bVar1; + uVar2 = (uint)bVar1; + while( true ) { + pbVar4 = pbVar4 + 1; + pbVar3 = pbVar3 + 1; + if (uVar2 == 0) break; + uVar2 = uVar2 - 1; + *pbVar4 = *pbVar3; + } + return; +} + + +/* ===== 1020:09ec FUN_1020_09ec ===== */ + +void __stdcall16far FUN_1020_09ec(byte param_1,byte *param_2,byte *param_3) + +{ + byte bVar1; + uint uVar2; + byte *pbVar3; + byte *pbVar4; + + pbVar3 = (byte *)param_3; + pbVar4 = (byte *)param_2; + bVar1 = *param_3; + if (param_1 < *param_3) { + bVar1 = param_1; + } + *param_2 = bVar1; + uVar2 = (uint)bVar1; + while( true ) { + pbVar4 = pbVar4 + 1; + pbVar3 = pbVar3 + 1; + if (uVar2 == 0) break; + uVar2 = uVar2 - 1; + *pbVar4 = *pbVar3; + } + return; +} + + +/* ===== 1020:0a10 FUN_1020_0a10 ===== */ + +void __stdcall16far FUN_1020_0a10(uint param_1,uint param_2,byte *param_3,byte *param_4) + +{ + byte *pbVar1; + uint uVar2; + byte *pbVar3; + byte *pbVar4; + + pbVar4 = (byte *)param_4; + if ((int)param_2 < 1) { + param_2 = 1; + } + pbVar3 = (byte *)param_3 + param_2; + if (*param_3 < param_2) { + uVar2 = 0; + } + else { + uVar2 = (*param_3 - param_2) + 1; + if ((int)param_1 < 0) { + param_1 = 0; + } + if (param_1 < uVar2) { + uVar2 = param_1; + } + } + *param_4 = (byte)uVar2; + for (; pbVar4 = pbVar4 + 1, uVar2 != 0; uVar2 = uVar2 - 1) { + pbVar1 = pbVar3; + pbVar3 = pbVar3 + 1; + *pbVar4 = *pbVar1; + } + return; +} + + +/* ===== 1020:0a51 FUN_1020_0a51 ===== */ + +void __stdcall16far FUN_1020_0a51(byte *param_1,byte *param_2) + +{ + byte bVar1; + byte bVar2; + byte bVar3; + uint uVar4; + byte *pbVar5; + byte *pbVar6; + + pbVar5 = (byte *)param_1; + bVar2 = *param_2; + bVar3 = *param_1; + bVar1 = *param_2; + *param_2 = *param_2 + bVar3; + if (CARRY1(bVar1,bVar3)) { + *param_2 = 0xff; + bVar3 = ~bVar2; + } + pbVar6 = (byte *)param_2 + bVar2; + uVar4 = (uint)bVar3; + while( true ) { + pbVar6 = pbVar6 + 1; + pbVar5 = pbVar5 + 1; + if (uVar4 == 0) break; + uVar4 = uVar4 - 1; + *pbVar6 = *pbVar5; + } + return; +} + + +/* ===== 1020:0a7d FUN_1020_0a7d ===== */ + +byte * __stdcall16far FUN_1020_0a7d(byte *param_1,byte *param_2) + +{ + byte *pbVar1; + int iVar2; + int iVar3; + uint uVar4; + byte *pbVar5; + byte *pbVar6; + byte *pbVar7; + undefined2 uVar8; + undefined2 uVar9; + bool bVar10; + + uVar9 = (undefined2)((ulong)param_2 >> 0x10); + if (*param_2 != 0) { + uVar4 = (uint)*param_2; + uVar8 = (undefined2)((ulong)param_1 >> 0x10); + if (uVar4 <= *param_1) { + iVar2 = (*param_1 - uVar4) + 1; + pbVar7 = (byte *)param_1 + 1; + pbVar6 = pbVar7; + do { + pbVar5 = (byte *)param_2 + 1; + bVar10 = pbVar6 == (byte *)0x0; + do { + if (iVar2 == 0) break; + iVar2 = iVar2 + -1; + pbVar1 = pbVar7; + pbVar7 = pbVar7 + 1; + bVar10 = *pbVar5 == *pbVar1; + } while (!bVar10); + if (!bVar10) { + return (byte *)0x0; + } + iVar3 = uVar4 - 1; + bVar10 = iVar3 == 0; + pbVar6 = pbVar7; + do { + pbVar5 = pbVar5 + 1; + if (iVar3 == 0) break; + iVar3 = iVar3 + -1; + pbVar1 = pbVar6; + pbVar6 = pbVar6 + 1; + bVar10 = *pbVar5 == *pbVar1; + } while (bVar10); + if (bVar10) { + return pbVar7 + (-1 - (int)(byte *)param_1); + } + pbVar6 = (byte *)param_2 + 1; + } while( true ); + } + } + return (byte *)0x0; +} + + +/* ===== 1020:0ac3 FUN_1020_0ac3 ===== */ + +void __stdcall16far FUN_1020_0ac3(byte *param_1,byte *param_2) + +{ + byte bVar1; + uint uVar2; + byte *pbVar3; + byte *pbVar4; + + pbVar3 = (byte *)param_2; + pbVar4 = (byte *)param_1; + bVar1 = *param_2; + if (*param_1 < *param_2) { + bVar1 = *param_1; + } + if (bVar1 != 0) { + uVar2 = (uint)bVar1; + do { + pbVar4 = pbVar4 + 1; + pbVar3 = pbVar3 + 1; + if (uVar2 == 0) { + return; + } + uVar2 = uVar2 - 1; + } while (*pbVar3 == *pbVar4); + } + return; +} + + +/* ===== 1020:0aee runtime_1020_0aee ===== */ + +void __stdcall16far runtime_1020_0aee(undefined1 param_1,undefined1 *param_2) + +{ + *param_2 = 1; + ((undefined1 *)param_2)[1] = param_1; + return; +} + + +/* ===== 1020:0b00 FUN_1020_0b00 ===== */ + +void __stdcall16far FUN_1020_0b00(int param_1,undefined1 *param_2,undefined1 *param_3) + +{ + undefined1 *puVar1; + undefined1 *puVar2; + undefined1 *puVar3; + + puVar3 = (undefined1 *)param_3; + puVar2 = (undefined1 *)param_2; + *param_3 = (char)param_1; + for (; puVar3 = puVar3 + 1, param_1 != 0; param_1 = param_1 + -1) { + puVar1 = puVar2; + puVar2 = puVar2 + 1; + *puVar3 = *puVar1; + } + return; +} + + +/* ===== 1020:0b1b FUN_1020_0b1b ===== */ + +void __stdcall16far +FUN_1020_0b1b(int param_1,undefined2 param_2,undefined4 param_3,undefined4 param_4) + +{ + undefined2 uVar1; + undefined2 uVar2; + undefined2 unaff_SS; + undefined1 *puVar3; + undefined1 *puVar4; + undefined2 uVar5; + undefined1 local_202 [256]; + undefined1 local_102 [256]; + + if (param_1 < 1) { + param_1 = 1; + } + puVar4 = local_102; + uVar2 = (undefined2)((ulong)param_3 >> 0x10); + uVar1 = (undefined2)param_3; + uVar5 = unaff_SS; + FUN_1020_0a10(param_1 + -1,1,uVar1,uVar2); + FUN_1020_0a51((int)param_4,(int)((ulong)param_4 >> 0x10)); + puVar3 = local_202; + FUN_1020_0a10(0xff,param_1,uVar1,uVar2); + FUN_1020_0a51(puVar3,unaff_SS); + FUN_1020_09ec(param_2,uVar1,uVar2,puVar4,uVar5); + return; +} + + +/* ===== 1020:0b7a FUN_1020_0b7a ===== */ + +void __stdcall16far FUN_1020_0b7a(int param_1,int param_2,undefined4 param_3) + +{ + undefined2 uVar1; + undefined2 uVar2; + undefined2 unaff_SS; + undefined1 *puVar3; + undefined1 *puVar4; + undefined2 uVar5; + undefined1 local_202 [256]; + undefined1 local_102 [256]; + + if (((0 < param_1) && (0 < param_2)) && (param_2 < 0x100)) { + if (0xff < param_1) { + param_1 = 0xff; + } + puVar4 = local_102; + uVar2 = (undefined2)((ulong)param_3 >> 0x10); + uVar1 = (undefined2)param_3; + uVar5 = unaff_SS; + FUN_1020_0a10(param_2 + -1,1,uVar1,uVar2); + puVar3 = local_202; + FUN_1020_0a10(0xff,param_2 + param_1,uVar1,uVar2); + FUN_1020_0a51(puVar3,unaff_SS); + FUN_1020_09ec(0xff,uVar1,uVar2,puVar4,uVar5); + } + return; +} + + +/* ===== 1020:0be9 FUN_1020_0be9 ===== */ + +int __stdcall16far FUN_1020_0be9(int *param_1) + +{ + code *pcVar1; + int iVar2; + int iVar3; + uint extraout_DX; + int iVar4; + int *piVar5; + undefined2 uVar6; + bool bVar7; + + uVar6 = (undefined2)((ulong)param_1 >> 0x10); + piVar5 = (int *)param_1; + *param_1 = 0; + if (piVar5[1] != -0x284f) { + *param_1 = *param_1 + 1; + } + bVar7 = false; + if ((char)piVar5[0x18] != '\0') { + pcVar1 = (code *)swi(0x21); + iVar2 = (*pcVar1)(); + if (bVar7) { + return iVar2; + } + *param_1 = iVar2; + } + iVar2 = 0x5d8; + iVar3 = 0; + iVar4 = 0; + if (piVar5[1] != -0x284f) { + pcVar1 = (code *)swi(0x21); + (*pcVar1)(); + iVar2 = 0x62d; + iVar3 = 0x62d; + iVar4 = 0x1020; + if ((extraout_DX & 0x80) == 0) { + if (piVar5[1] == -0x284d) { + FUN_1020_0c76(); + } + iVar2 = 0x608; + iVar3 = 0; + iVar4 = 0; + } + piVar5[1] = -0x284e; + } + piVar5[10] = iVar2; + piVar5[0xb] = 0x1020; + piVar5[0xc] = iVar3; + piVar5[0xd] = iVar4; + piVar5[0xe] = 0x64d; + piVar5[0xf] = 0x1020; + return 0; +} + + +/* ===== 1020:0c76 FUN_1020_0c76 ===== */ + +void __cdecl16near FUN_1020_0c76(void) + +{ + bool bVar1; + code *pcVar2; + int iVar3; + int iVar4; + int unaff_DI; + undefined1 uVar5; + undefined4 uVar6; + + pcVar2 = (code *)swi(0x21); + uVar6 = (*pcVar2)(); + bVar1 = (uint)((ulong)uVar6 >> 0x10) < (uint)((uint)uVar6 < 0x80); + uVar5 = !bVar1 && bVar1; + pcVar2 = (code *)swi(0x21); + (*pcVar2)(); + pcVar2 = (code *)swi(0x21); + iVar3 = (*pcVar2)(); + if ((bool)uVar5) { + iVar3 = 0; + } + iVar4 = 0; + while( true ) { + if (iVar4 == iVar3) { + return; + } + if (*(char *)(iVar4 + unaff_DI + 0x80) == '\x1a') break; + iVar4 = iVar4 + 1; + } + pcVar2 = (code *)swi(0x21); + (*pcVar2)(); + pcVar2 = (code *)swi(0x21); + (*pcVar2)(); + return; +} + + +/* ===== 1020:0cd0 FUN_1020_0cd0 ===== */ + +undefined4 FUN_1020_0cd0(void) + +{ + uint uVar1; + byte bVar2; + uint in_AX; + uint uVar3; + uint uVar4; + char cVar5; + uint in_CX; + uint uVar6; + uint in_DX; + uint uVar7; + uint in_BX; + uint uVar8; + uint uVar9; + uint unaff_SI; + uint unaff_DI; + uint uVar10; + uint uVar11; + bool bVar12; + bool bVar13; + undefined4 uVar14; + + uVar10 = unaff_DI ^ 0x8000; + if ((byte)in_CX != 0) { + if ((byte)in_AX == 0) { +LAB_1020_0d54: + return CONCAT22(uVar10,in_CX); + } + uVar4 = in_AX; + uVar7 = in_DX; + uVar8 = in_BX; + if ((byte)in_CX < (byte)in_AX) { + uVar4 = in_CX; + in_CX = in_AX; + uVar7 = uVar10; + uVar8 = unaff_SI; + unaff_SI = in_BX; + uVar10 = in_DX; + } + bVar2 = -((char)uVar4 - (char)in_CX); + if (0x28 < bVar2) goto LAB_1020_0d54; + uVar3 = CONCAT11((char)(uVar7 >> 8),(char)in_CX) & 0x80ff; + uVar4 = uVar4 & 0xff00; + uVar7 = uVar7 | 0x8000; + uVar11 = uVar10 | 0x8000; + for (; 7 < bVar2; bVar2 = bVar2 - 8) { + uVar4 = CONCAT11((char)uVar8,(char)(uVar4 >> 8)); + uVar8 = CONCAT11((char)uVar7,(char)(uVar8 >> 8)); + uVar7 = uVar7 >> 8; + } + uVar6 = CONCAT11((char)(in_CX >> 8),bVar2); + while (bVar2 != 0) { + uVar1 = uVar7 & 1; + uVar7 = uVar7 >> 1; + uVar9 = uVar8 & 1; + uVar8 = uVar8 >> 1 | (uint)(uVar1 != 0) << 0xf; + uVar4 = uVar4 >> 1 | (uint)(uVar9 != 0) << 0xf; + bVar2 = (char)uVar6 - 1; + uVar6 = CONCAT11((char)(uVar6 >> 8),bVar2); + } + if ((int)(uVar3 ^ uVar10) < 0) { + in_AX = uVar4 - uVar6; + uVar9 = (uVar8 - unaff_SI) - (uint)(uVar4 < uVar6); + uVar10 = (uint)(uVar8 < unaff_SI || uVar8 - unaff_SI < (uint)(uVar4 < uVar6)); + in_DX = (uVar7 - uVar11) - uVar10; + if (uVar7 < uVar11 || uVar7 - uVar11 < uVar10) { + uVar10 = ~uVar9; + bVar12 = in_AX == 0; + in_AX = -in_AX; + uVar9 = uVar10 + bVar12; + in_DX = ~in_DX + (uint)CARRY2(uVar10,(uint)bVar12); + uVar3 = uVar3 ^ 0x8000; + } + if ((in_DX == 0 && uVar9 == 0) && in_AX == 0) goto LAB_1020_0d53; + while (-1 < (int)in_DX) { + bVar12 = (int)in_AX < 0; + in_AX = in_AX << 1; + bVar13 = (int)uVar9 < 0; + uVar9 = uVar9 << 1 | (uint)bVar12; + in_DX = in_DX << 1 | (uint)bVar13; + cVar5 = (char)uVar3 + -1; + uVar3 = CONCAT11((char)(uVar3 >> 8),cVar5); + if (cVar5 == '\0') { + uVar14 = FUN_1020_0e93(); + return uVar14; + } + } + } + else { + in_AX = uVar4 + uVar6; + uVar9 = uVar8 + unaff_SI + (uint)CARRY2(uVar4,uVar6); + uVar10 = (uint)(CARRY2(uVar8,unaff_SI) || CARRY2(uVar8 + unaff_SI,(uint)CARRY2(uVar4,uVar6))); + uVar4 = uVar7 + uVar11; + in_DX = uVar4 + uVar10; + if (CARRY2(uVar7,uVar11) || CARRY2(uVar4,uVar10)) { + uVar8 = in_DX & 1; + in_DX = in_DX >> 1 | (uint)(CARRY2(uVar7,uVar11) || CARRY2(uVar4,uVar10)) << 0xf; + uVar10 = uVar9 & 1; + uVar9 = uVar9 >> 1 | (uint)(uVar8 != 0) << 0xf; + in_AX = in_AX >> 1 | (uint)(uVar10 != 0) << 0xf; + cVar5 = (char)uVar3 + '\x01'; + uVar3 = CONCAT11((char)(uVar3 >> 8),cVar5); + if (cVar5 == '\0') goto LAB_1020_0d61; + } + } + bVar12 = 0xff7f < in_AX; + in_AX = in_AX + 0x80; + uVar10 = (uint)CARRY2(uVar9,(uint)bVar12); + bVar12 = CARRY2(in_DX,uVar10); + in_DX = in_DX + uVar10; + if (bVar12) { + in_DX = in_DX >> 1 | 0x8000; + cVar5 = (char)uVar3 + '\x01'; + uVar3 = CONCAT11((char)(uVar3 >> 8),cVar5); + if (cVar5 == '\0') { +LAB_1020_0d61: + return CONCAT22(in_DX,in_AX); + } + } + in_AX = CONCAT11((char)(in_AX >> 8),(char)uVar3); + in_DX = CONCAT11((byte)((in_DX & 0x7fff) >> 8) | (byte)(uVar3 >> 8),(char)(in_DX & 0x7fff)); + } +LAB_1020_0d53: + return CONCAT22(in_DX,in_AX); +} + + +/* ===== 1020:0cd4 FUN_1020_0cd4 ===== */ + +undefined4 __cdecl16near FUN_1020_0cd4(void) + +{ + uint uVar1; + byte bVar2; + uint in_AX; + uint uVar3; + uint uVar4; + char cVar5; + uint in_CX; + uint uVar6; + uint in_DX; + uint uVar7; + uint in_BX; + uint uVar8; + uint uVar9; + uint unaff_SI; + uint unaff_DI; + uint uVar10; + bool bVar11; + bool bVar12; + undefined4 uVar13; + + if ((byte)in_CX != 0) { + if ((byte)in_AX == 0) { +LAB_1020_0d54: + return CONCAT22(unaff_DI,in_CX); + } + uVar4 = in_AX; + uVar7 = in_DX; + uVar8 = in_BX; + if ((byte)in_CX < (byte)in_AX) { + uVar4 = in_CX; + in_CX = in_AX; + uVar7 = unaff_DI; + uVar8 = unaff_SI; + unaff_SI = in_BX; + unaff_DI = in_DX; + } + bVar2 = -((char)uVar4 - (char)in_CX); + if (0x28 < bVar2) goto LAB_1020_0d54; + uVar3 = CONCAT11((char)(uVar7 >> 8),(char)in_CX) & 0x80ff; + uVar4 = uVar4 & 0xff00; + uVar7 = uVar7 | 0x8000; + uVar10 = unaff_DI | 0x8000; + for (; 7 < bVar2; bVar2 = bVar2 - 8) { + uVar4 = CONCAT11((char)uVar8,(char)(uVar4 >> 8)); + uVar8 = CONCAT11((char)uVar7,(char)(uVar8 >> 8)); + uVar7 = uVar7 >> 8; + } + uVar6 = CONCAT11((char)(in_CX >> 8),bVar2); + while (bVar2 != 0) { + uVar1 = uVar7 & 1; + uVar7 = uVar7 >> 1; + uVar9 = uVar8 & 1; + uVar8 = uVar8 >> 1 | (uint)(uVar1 != 0) << 0xf; + uVar4 = uVar4 >> 1 | (uint)(uVar9 != 0) << 0xf; + bVar2 = (char)uVar6 - 1; + uVar6 = CONCAT11((char)(uVar6 >> 8),bVar2); + } + if ((int)(uVar3 ^ unaff_DI) < 0) { + in_AX = uVar4 - uVar6; + uVar9 = (uVar8 - unaff_SI) - (uint)(uVar4 < uVar6); + uVar4 = (uint)(uVar8 < unaff_SI || uVar8 - unaff_SI < (uint)(uVar4 < uVar6)); + in_DX = (uVar7 - uVar10) - uVar4; + if (uVar7 < uVar10 || uVar7 - uVar10 < uVar4) { + uVar7 = ~uVar9; + bVar11 = in_AX == 0; + in_AX = -in_AX; + uVar9 = uVar7 + bVar11; + in_DX = ~in_DX + (uint)CARRY2(uVar7,(uint)bVar11); + uVar3 = uVar3 ^ 0x8000; + } + if ((in_DX == 0 && uVar9 == 0) && in_AX == 0) goto LAB_1020_0d53; + while (-1 < (int)in_DX) { + bVar11 = (int)in_AX < 0; + in_AX = in_AX << 1; + bVar12 = (int)uVar9 < 0; + uVar9 = uVar9 << 1 | (uint)bVar11; + in_DX = in_DX << 1 | (uint)bVar12; + cVar5 = (char)uVar3 + -1; + uVar3 = CONCAT11((char)(uVar3 >> 8),cVar5); + if (cVar5 == '\0') { + uVar13 = FUN_1020_0e93(); + return uVar13; + } + } + } + else { + in_AX = uVar4 + uVar6; + uVar9 = uVar8 + unaff_SI + (uint)CARRY2(uVar4,uVar6); + uVar4 = (uint)(CARRY2(uVar8,unaff_SI) || CARRY2(uVar8 + unaff_SI,(uint)CARRY2(uVar4,uVar6))); + uVar8 = uVar7 + uVar10; + in_DX = uVar8 + uVar4; + if (CARRY2(uVar7,uVar10) || CARRY2(uVar8,uVar4)) { + uVar6 = in_DX & 1; + in_DX = in_DX >> 1 | (uint)(CARRY2(uVar7,uVar10) || CARRY2(uVar8,uVar4)) << 0xf; + uVar7 = uVar9 & 1; + uVar9 = uVar9 >> 1 | (uint)(uVar6 != 0) << 0xf; + in_AX = in_AX >> 1 | (uint)(uVar7 != 0) << 0xf; + cVar5 = (char)uVar3 + '\x01'; + uVar3 = CONCAT11((char)(uVar3 >> 8),cVar5); + if (cVar5 == '\0') goto LAB_1020_0d61; + } + } + bVar11 = 0xff7f < in_AX; + in_AX = in_AX + 0x80; + uVar7 = (uint)CARRY2(uVar9,(uint)bVar11); + bVar11 = CARRY2(in_DX,uVar7); + in_DX = in_DX + uVar7; + if (bVar11) { + in_DX = in_DX >> 1 | 0x8000; + cVar5 = (char)uVar3 + '\x01'; + uVar3 = CONCAT11((char)(uVar3 >> 8),cVar5); + if (cVar5 == '\0') { +LAB_1020_0d61: + return CONCAT22(in_DX,in_AX); + } + } + in_AX = CONCAT11((char)(in_AX >> 8),(char)uVar3); + in_DX = CONCAT11((byte)((in_DX & 0x7fff) >> 8) | (byte)(uVar3 >> 8),(char)(in_DX & 0x7fff)); + } +LAB_1020_0d53: + return CONCAT22(in_DX,in_AX); +} + + +/* ===== 1020:0d97 FUN_1020_0d97 ===== */ + +undefined4 __cdecl16near FUN_1020_0d97(void) + +{ + long lVar1; + long lVar2; + ulong uVar3; + long lVar4; + byte bVar5; + undefined2 in_AX; + byte bVar7; + uint uVar6; + byte bVar8; + uint in_CX; + int iVar9; + uint in_DX; + uint uVar10; + uint uVar11; + uint uVar12; + uint uVar13; + uint uVar14; + uint in_BX; + uint uVar15; + uint uVar16; + uint uVar17; + uint uVar18; + uint uVar19; + uint uVar20; + uint unaff_SI; + uint unaff_DI; + uint uVar21; + uint uVar22; + uint uVar23; + bool bVar24; + undefined4 uVar25; + + bVar5 = (byte)in_AX; + bVar7 = (byte)((uint)in_AX >> 8); + if ((bVar5 == 0) || (bVar8 = (byte)in_CX, bVar8 == 0)) { + uVar25 = FUN_1020_0e93(); + return uVar25; + } + iVar9 = CONCAT11((((byte)(in_DX >> 8) ^ (byte)(unaff_DI >> 8)) & 0x80) + CARRY1(bVar5,bVar8), + bVar5 + bVar8); + bVar5 = (byte)(in_CX >> 8); + uVar20 = in_DX | 0x8000; + uVar21 = unaff_DI | 0x8000; + if (((bVar7 == 0) && + (uVar6 = in_CX & 0xff00, uVar14 = uVar20, uVar10 = unaff_SI, uVar22 = uVar21, in_BX == 0)) || + ((bVar5 == 0 && + (uVar6 = (uint)bVar7 << 8, uVar14 = uVar21, uVar10 = in_BX, uVar22 = uVar20, unaff_SI == 0)))) + { + uVar3 = (ulong)uVar10 * (ulong)uVar14 + ((ulong)uVar6 * (ulong)uVar14 >> 0x10); + uVar15 = (uint)uVar3; + lVar1 = (ulong)uVar22 * (ulong)uVar14 + (uVar3 >> 0x10); + } + else { + lVar1 = (ulong)bVar7 * 0x100 * (ulong)unaff_SI; + lVar4 = lVar1 + (ulong)((uint)bVar7 * (uint)bVar5); + uVar22 = (uint)((ulong)lVar4 >> 0x10); + lVar2 = (ulong)in_BX * (ulong)bVar5 * 0x100; + uVar10 = (uint)((ulong)lVar2 >> 0x10); + uVar6 = (uint)CARRY2((uint)lVar4,(uint)lVar2); + uVar14 = uVar22 + uVar10; + uVar15 = uVar14 + uVar6; + uVar16 = (uint)CARRY2((uint)((ulong)lVar1 >> 0x10), + (uint)CARRY2((uint)bVar7 * (uint)bVar5,(uint)lVar1)) + + (uint)(CARRY2(uVar22,uVar10) || CARRY2(uVar14,uVar6)); + lVar1 = (ulong)bVar7 * 0x100 * (ulong)uVar21; + uVar11 = (uint)((ulong)lVar1 >> 0x10); + uVar6 = (uint)lVar1; + uVar23 = uVar15 + uVar6; + uVar6 = (uint)CARRY2(uVar15,uVar6); + uVar22 = uVar16 + uVar11; + uVar17 = uVar22 + uVar6; + uVar12 = (uint)((ulong)in_BX * (ulong)unaff_SI >> 0x10); + uVar10 = (uint)((ulong)in_BX * (ulong)unaff_SI); + uVar14 = (uint)CARRY2(uVar23,uVar10); + uVar15 = uVar17 + uVar12; + uVar18 = uVar15 + uVar14; + lVar1 = (ulong)uVar20 * (ulong)bVar5 * 0x100; + uVar13 = (uint)((ulong)lVar1 >> 0x10); + uVar10 = (uint)CARRY2(uVar23 + uVar10,(uint)lVar1); + uVar23 = uVar18 + uVar13; + uVar19 = uVar23 + uVar10; + uVar12 = (uint)(CARRY2(uVar16,uVar11) || CARRY2(uVar22,uVar6)) + + (uint)(CARRY2(uVar17,uVar12) || CARRY2(uVar15,uVar14)) + + (uint)(CARRY2(uVar18,uVar13) || CARRY2(uVar23,uVar10)); + uVar23 = (uint)((ulong)in_BX * (ulong)uVar21 >> 0x10); + uVar6 = (uint)((ulong)in_BX * (ulong)uVar21); + uVar22 = uVar19 + uVar6; + uVar6 = (uint)CARRY2(uVar19,uVar6); + uVar10 = uVar12 + uVar23; + uVar13 = uVar10 + uVar6; + uVar11 = (uint)((ulong)uVar20 * (ulong)unaff_SI >> 0x10); + uVar14 = (uint)((ulong)uVar20 * (ulong)unaff_SI); + uVar15 = uVar22 + uVar14; + uVar14 = (uint)CARRY2(uVar22,uVar14); + uVar22 = uVar13 + uVar11; + lVar1 = (ulong)uVar20 * (ulong)uVar21 + + CONCAT22((uint)(CARRY2(uVar12,uVar23) || CARRY2(uVar10,uVar6)) + + (uint)(CARRY2(uVar13,uVar11) || CARRY2(uVar22,uVar14)),uVar22 + uVar14); + } + if (-1 < lVar1) { + bVar24 = (int)uVar15 < 0; + uVar15 = uVar15 << 1; + lVar1 = CONCAT22((int)((ulong)lVar1 >> 0x10) << 1 | (uint)((int)lVar1 < 0), + (int)lVar1 << 1 | (uint)bVar24); + iVar9 = iVar9 + -1; + } + uVar6 = (uint)((ulong)lVar1 >> 0x10); + uVar21 = iVar9 + 0x7f7f; + uVar20 = (uint)CARRY2((uint)lVar1,(uint)(0xff7f < uVar15)); + uVar14 = uVar6 + uVar20; + if (CARRY2(uVar6,uVar20)) { + uVar14 = uVar14 >> 1 | 0x8000; + uVar21 = iVar9 + 0x7f80; + } + if ((uVar21 & 0x4000) != 0) { + return 0; + } + return CONCAT22(CONCAT11((byte)(uVar14 >> 8) ^ (byte)(uVar21 + 1 >> 8),(char)uVar14), + CONCAT11((char)(uVar15 + 0x80 >> 8),(char)(uVar21 + 1))); +} + + +/* ===== 1020:0e93 FUN_1020_0e93 ===== */ + +void __cdecl16near FUN_1020_0e93(void) + +{ + return; +} + + +/* ===== 1020:0e9a FUN_1020_0e9a ===== */ + +undefined4 __cdecl16near FUN_1020_0e9a(void) + +{ + byte bVar1; + undefined1 uVar2; + char cVar3; + undefined2 in_AX; + int iVar4; + byte bVar5; + undefined2 in_CX; + byte bVar7; + uint uVar6; + uint in_DX; + char cVar9; + uint uVar8; + uint in_BX; + uint uVar10; + uint unaff_BP; + uint uVar11; + uint unaff_SI; + uint unaff_DI; + uint uVar12; + bool bVar13; + bool bVar14; + int in_stack_00000000; + + bVar1 = (byte)in_AX; + if (bVar1 == 0) { + return 0; + } + uVar12 = unaff_DI | 0x8000; + uVar11 = in_DX | 0x8000; + cVar9 = (((byte)(in_DX >> 8) ^ (byte)(unaff_DI >> 8)) & 0x80) - (bVar1 < (byte)in_CX); + iVar4 = CONCAT11((char)((uint)in_AX >> 8),2); + uVar8 = 1; + do { + bVar13 = uVar11 < uVar12; + bVar7 = (byte)((uint)in_CX >> 8); + bVar5 = (byte)((uint)iVar4 >> 8); + if ((uVar11 == uVar12) && (bVar13 = in_BX < unaff_SI, in_BX == unaff_SI)) { + bVar13 = bVar5 < bVar7; + } + if (!bVar13) { + iVar4 = CONCAT11(bVar5 - bVar7,(char)iVar4); + bVar13 = in_BX < unaff_SI; + uVar10 = in_BX - unaff_SI; + in_BX = uVar10 - (bVar5 < bVar7); + uVar10 = (uint)(bVar13 || uVar10 < (bVar5 < bVar7)); + bVar13 = uVar11 < uVar12 || uVar11 - uVar12 < uVar10; + uVar11 = (uVar11 - uVar12) - uVar10; + } + while( true ) { + bVar14 = (int)uVar8 < 0; + uVar8 = uVar8 << 1 | (uint)bVar13; + if (bVar14) { + cVar3 = (char)iVar4 + -1; + iVar4 = CONCAT11((char)((uint)iVar4 >> 8),cVar3); + if (cVar3 < '\0') { + uVar11 = ~(uVar8 << 6); + uVar10 = ~CONCAT11(cVar9,bVar1 - (byte)in_CX); + uVar12 = unaff_BP ^ 0xffff; + if (-1 < (int)uVar12) { + uVar11 = uVar11 << 1; + uVar10 = uVar10 << 1 | (uint)(-1 < (int)(uVar8 << 6)); + uVar12 = uVar12 << 1 | (uint)(-1 < cVar9); + in_stack_00000000 = in_stack_00000000 + -1; + } + uVar6 = in_stack_00000000 + 0x8080; + uVar8 = (uint)CARRY2(uVar10,(uint)(0xff7f < uVar11)); + uVar10 = uVar12 + uVar8; + if (CARRY2(uVar12,uVar8)) { + uVar10 = uVar10 >> 1 | 0x8000; + uVar6 = in_stack_00000000 + 0x8081; + } + if ((uVar6 & 0x4000) != 0) { + return 0; + } + return CONCAT22(CONCAT11((byte)(uVar10 >> 8) ^ (byte)(uVar6 + 1 >> 8),(char)uVar10), + CONCAT11((char)(uVar11 + 0x80 >> 8),(char)(uVar6 + 1))); + } + uVar8 = 1; + if (cVar3 == '\0') { + uVar8 = 0x40; + } + } + bVar13 = iVar4 < 0; + uVar2 = (undefined1)iVar4; + bVar5 = (char)((uint)iVar4 >> 8) * '\x02'; + iVar4 = CONCAT11(bVar5,uVar2); + bVar14 = (int)in_BX < 0; + in_BX = in_BX << 1 | (uint)bVar13; + bVar13 = -1 < (int)uVar11; + uVar11 = uVar11 << 1 | (uint)bVar14; + if (bVar13) break; + iVar4 = CONCAT11(bVar5 - bVar7,uVar2); + bVar13 = in_BX < unaff_SI; + uVar10 = in_BX - unaff_SI; + in_BX = uVar10 - (bVar5 < bVar7); + uVar11 = (uVar11 - uVar12) - (uint)(bVar13 || uVar10 < (bVar5 < bVar7)); + bVar13 = false; + } + } while( true ); +} + + +/* ===== 1020:0f11 FUN_1020_0f11 ===== */ + +void __cdecl16near FUN_1020_0f11(void) + +{ + uint in_DX; + uint unaff_DI; + bool bVar1; + + if ((int)(in_DX ^ unaff_DI) < 0) { + return; + } + bVar1 = (in_DX & 0x8000) == 0; + if ((!bVar1) && (FUN_1020_0f28(), !bVar1)) { + return; + } + return; +} + + +/* ===== 1020:0f28 FUN_1020_0f28 ===== */ + +void __cdecl16near FUN_1020_0f28(void) + +{ + return; +} + + +/* ===== 1020:0f3b FUN_1020_0f3b ===== */ + +void __cdecl16near FUN_1020_0f3b(void) + +{ + uint uVar1; + uint in_AX; + uint in_DX; + bool bVar2; + + if (in_AX != 0 || in_DX != 0) { + if ((int)in_DX < 0) { + bVar2 = in_AX != 0; + in_AX = -in_AX; + in_DX = -(uint)bVar2 - in_DX; + } + uVar1 = in_AX; + if ((in_DX == 0) && (uVar1 = 0, in_DX = in_AX, (char)(in_AX >> 8) == '\0')) { + in_DX = in_AX << 8; + } + while (-1 < (int)in_DX) { + in_DX = in_DX * 2 + (uint)CARRY2(uVar1,uVar1); + uVar1 = uVar1 * 2; + } + } + return; +} + + +/* ===== 1020:0f77 FUN_1020_0f77 ===== */ + +void __cdecl16near FUN_1020_0f77(void) + +{ + byte in_AL; + byte bVar1; + + bVar1 = -in_AL + 0xa0; + if (in_AL < 0xa1) { + if (bVar1 < 0x20) { + if (0xf < bVar1) { + bVar1 = -in_AL + 0x90; + } + if (7 < bVar1) { + bVar1 = bVar1 - 8; + } + for (; bVar1 != 0; bVar1 = bVar1 - 1) { + } + } + else if (bVar1 != 0x20) { + return; + } + } + return; +} + + +/* ===== 1020:0fe5 FUN_1020_0fe5 ===== */ + +void __cdecl16far FUN_1020_0fe5(void) + +{ + undefined1 in_CF; + + FUN_1020_0cd4(); + if (!(bool)in_CF) { + return; + } + FUN_1020_005d(); + return; +} + + +/* ===== 1020:0feb FUN_1020_0feb ===== */ + +void __cdecl16far FUN_1020_0feb(void) + +{ + undefined1 in_CF; + + FUN_1020_0cd0(); + if (!(bool)in_CF) { + return; + } + FUN_1020_005d(); + return; +} + + +/* ===== 1020:0ff1 FUN_1020_0ff1 ===== */ + +void FUN_1020_0ff1(void) + +{ + undefined1 in_CF; + + FUN_1020_0d97(); + if (!(bool)in_CF) { + return; + } + FUN_1020_005d(); + return; +} + + +/* ===== 1020:0ff7 FUN_1020_0ff7 ===== */ + +void __cdecl16far FUN_1020_0ff7(void) + +{ + undefined1 in_CF; + + FUN_1020_0d97(); + if (!(bool)in_CF) { + return; + } + FUN_1020_005d(); + return; +} + + +/* ===== 1020:0ffd FUN_1020_0ffd ===== */ + +void __cdecl16far FUN_1020_0ffd(void) + +{ + char in_CL; + bool bVar1; + + bVar1 = false; + if (in_CL == '\0') { + FUN_1020_005d(); + return; + } + FUN_1020_0e9a(); + if (!bVar1) { + return; + } + FUN_1020_005d(); + return; +} + + +/* ===== 1020:1007 FUN_1020_1007 ===== */ + +void __cdecl16far FUN_1020_1007(void) + +{ + FUN_1020_0f11(); + return; +} + + +/* ===== 1020:100b FUN_1020_100b ===== */ + +void __cdecl16far FUN_1020_100b(void) + +{ + FUN_1020_0f3b(); + return; +} + + +/* ===== 1020:1017 FUN_1020_1017 ===== */ + +void __cdecl16far FUN_1020_1017(void) + +{ + undefined1 in_CF; + + FUN_1020_0f77(); + if (!(bool)in_CF) { + return; + } + FUN_1020_005d(); + return; +} + + +/* ===== 1020:1031 FUN_1020_1031 ===== */ + +void __cdecl16near FUN_1020_1031(void) + +{ + FUN_1020_0cd4(); + return; +} + + +/* ===== 1020:103b runtime_1020_103b ===== */ + +void __cdecl16near runtime_1020_103b(void) + +{ + FUN_1020_0cd0(); + return; +} + + +/* ===== 1020:1045 runtime_1020_1045 ===== */ + +void __cdecl16near runtime_1020_1045(void) + +{ + FUN_1020_0d97(); + return; +} + + +/* ===== 1020:104f FUN_1020_104f ===== */ + +void __cdecl16near FUN_1020_104f(void) + +{ + FUN_1020_0e9a(); + return; +} + + +/* ===== 1020:1059 runtime_1020_1059 ===== */ + +uint __cdecl16far runtime_1020_1059(void) + +{ + uint uVar1; + uint uVar2; + byte bVar3; + uint in_AX; + uint uVar4; + byte bVar5; + uint uVar6; + undefined1 uVar8; + uint uVar7; + + bVar3 = (byte)in_AX; + if (bVar3 < 0xa8) { + uVar4 = in_AX & 0xff; + bVar5 = bVar3 + 0x80; + uVar1 = 0; + uVar7 = 0; + if (bVar3 < 0x80 || bVar5 == 0) { + return 0; + } + while( true ) { + uVar6 = uVar1; + uVar8 = (undefined1)(uVar7 >> 8); + if (bVar5 < 0x10) break; + uVar4 = CONCAT11(uVar8,(char)uVar4); + bVar5 = bVar5 - 0x10; + uVar1 = 0xffff; + uVar7 = uVar6; + } + if (7 < bVar5) { + uVar4 = CONCAT11((char)uVar7,(char)uVar4); + uVar7 = CONCAT11((char)uVar6,uVar8); + uVar6 = CONCAT11(0xff,(char)(uVar6 >> 8)); + bVar5 = bVar5 - 8; + } + while( true ) { + bVar3 = (byte)(uVar4 >> 8); + if (bVar5 == 0) break; + uVar1 = uVar6 & 1; + uVar6 = uVar6 >> 1 | 0x8000; + uVar2 = uVar7 & 1; + uVar7 = uVar7 >> 1 | (uint)(uVar1 != 0) << 0xf; + uVar4 = CONCAT11(bVar3 >> 1 | (uVar2 != 0) << 7,(char)uVar4); + bVar5 = bVar5 - 1; + } + in_AX = CONCAT11(bVar3 & (byte)(in_AX >> 8),(char)uVar4); + } + return in_AX; +} + + +/* ===== 1020:10aa runtime_1020_10aa ===== */ + +void __cdecl16far runtime_1020_10aa(void) + +{ + runtime_1020_1059(); + FUN_1020_0cd0(); + return; +} + + +/* ===== 1020:10be FUN_1020_10be ===== */ + +uint __cdecl16far FUN_1020_10be(void) + +{ + char cVar1; + byte bVar2; + uint in_AX; + uint uVar3; + uint in_DX; + undefined2 in_BX; + undefined2 uVar4; + undefined4 uVar5; + + cVar1 = (char)in_AX; + if (cVar1 != '\0') { + if ((in_DX & 0x8000) != 0) { + uVar3 = FUN_1020_005d(); + return uVar3; + } + do { + uVar4 = in_BX; + FUN_1020_104f(); + uVar5 = FUN_1020_1031(); + in_AX = (uint)(byte)((char)uVar5 - 1); + bVar2 = FUN_1020_0cd0(in_AX,uVar4,(int)((ulong)uVar5 >> 0x10)); + } while ((byte)(((char)(cVar1 + -0x80) >> 1) + 0x6cU) <= bVar2); + } + return in_AX; +} + + +/* ===== 1020:111d runtime_1020_111d ===== */ + +void __cdecl16far runtime_1020_111d(void) + +{ + byte bVar1; + undefined2 uVar2; + uint extraout_DX; + uint uVar3; + uint extraout_DX_00; + bool bVar4; + undefined1 uVar5; + + bVar1 = FUN_1020_0cd4(); + uVar3 = extraout_DX; + if (bVar1 != 0) { + uVar3 = extraout_DX ^ 0x8000; + } + if (0x6b < bVar1) { + uVar2 = 0x2183; + bVar4 = false; + FUN_1020_0f11(); + if (!bVar4) { + FUN_1020_104f(); + runtime_1020_10aa(uVar2,0xdaa2,0x490f); + runtime_1020_1045(); + uVar3 = extraout_DX_00; + } + uVar5 = 0; + if ((uVar3 & 0x8000) != 0) { + FUN_1020_1031(); + } + FUN_1020_0f11(); + if (!(bool)uVar5) { + runtime_1020_103b(); + } + bVar1 = FUN_1020_0f11(); + if (!(bool)uVar5) { + bVar1 = FUN_1020_0cd4(); + } + if (0x6b < bVar1) { + FUN_1020_143c(); + } + } + return; +} + + +/* ===== 1020:11bb runtime_1020_11bb ===== */ + +undefined2 __cdecl16far runtime_1020_11bb(void) + +{ + char in_AL; + undefined2 uVar1; + uint in_DX; + undefined2 uVar2; + undefined4 uVar3; + + if ((in_AL != '\0') && ((in_DX & 0x8000) == 0)) { + FUN_1020_0d97(in_AL + '\x7f'); + uVar1 = 0; + uVar3 = FUN_1020_1031(); + uVar2 = 0; + FUN_1020_0cd4((int)uVar3,uVar1,(int)((ulong)uVar3 >> 0x10)); + FUN_1020_0e9a(); + FUN_1020_143c(); + uVar3 = FUN_1020_0cd4(); + FUN_1020_0f3b((int)uVar3,uVar2,(int)((ulong)uVar3 >> 0x10)); + FUN_1020_0d97(); + uVar1 = FUN_1020_0cd4(); + if ((byte)uVar1 < 0x67) { + uVar1 = 0; + } + return uVar1; + } + uVar1 = FUN_1020_005d(); + return uVar1; +} + + +/* ===== 1020:1264 runtime_1020_1264 ===== */ + +char __cdecl16far runtime_1020_1264(void) + +{ + byte bVar1; + char cVar2; + uint uVar3; + byte bVar4; + uint in_DX; + undefined2 in_BX; + undefined4 uVar5; + undefined2 uVar6; + + uVar5 = FUN_1020_0e9a(); + uVar6 = (undefined2)uVar5; + if ((byte)uVar5 < 0x88) { + uVar3 = FUN_1020_0f77(uVar6,in_BX,(int)((ulong)uVar5 >> 0x10)); + FUN_1020_0f3b(uVar6); + FUN_1020_0cd0(); + bVar1 = FUN_1020_1455(); + bVar4 = (byte)(uVar3 >> 1); + if ((uVar3 & 1) != 0) { + bVar1 = FUN_1020_0d97(); + } + cVar2 = bVar1 + bVar4; + if (!CARRY1(bVar1,bVar4)) { + if ((in_DX & 0x8000) != 0) { + cVar2 = FUN_1020_0e9a(); + } + return cVar2; + } + } + cVar2 = FUN_1020_005d(); + return cVar2; +} + + +/* ===== 1020:1307 runtime_1020_1307 ===== */ + +void __cdecl16far runtime_1020_1307(void) + +{ + char in_AL; + uint uVar1; + int iVar2; + uint in_DX; + undefined2 in_BX; + uint uVar3; + undefined1 uVar4; + undefined4 uVar5; + uint in_stack_0000fff8; + + if (in_AL != '\0') { + uVar1 = (uint)((in_DX & 0x8000) != 0); + uVar4 = false; + FUN_1020_0f11(uVar1); + if (!(bool)uVar4) { + in_BX = 0; + FUN_1020_0e9a(); + uVar1 = uVar1 + 2; + } + FUN_1020_0f11(uVar1); + if ((bool)uVar4) { + runtime_1020_1436(); + } + else { + uVar1 = 0x13e8; + iVar2 = 2; + do { + uVar3 = uVar1; + in_stack_0000fff8 = FUN_1020_0f11(); + if ((bool)uVar4) goto LAB_1020_136d; + uVar4 = 0xffed < uVar3; + uVar1 = uVar3 + 0x12; + iVar2 = iVar2 + -1; + } while (iVar2 != 0); + uVar3 = uVar3 + 0xc; +LAB_1020_136d: + uVar5 = runtime_1020_103b(uVar3 + 6); + FUN_1020_0d97((int)uVar5,in_BX,(int)((ulong)uVar5 >> 0x10)); + FUN_1020_0cd4(); + FUN_1020_0e9a(); + runtime_1020_1436(); + FUN_1020_0cd4(); + } + if ((in_stack_0000fff8 & 2) != 0) { + FUN_1020_0cd0(in_stack_0000fff8); + } + } + return; +} + + +/* ===== 1020:1436 runtime_1020_1436 ===== */ + +void runtime_1020_1436(void) + +{ + FUN_1020_0d97(0x1418,5); + FUN_1020_1455(); + FUN_1020_0d97(); + return; +} + + +/* ===== 1020:143c FUN_1020_143c ===== */ + +void FUN_1020_143c(void) + +{ + FUN_1020_0d97(); + FUN_1020_1455(); + FUN_1020_0d97(); + return; +} + + +/* ===== 1020:1455 FUN_1020_1455 ===== */ + +void __cdecl16near FUN_1020_1455(void) + +{ + int in_CX; + int unaff_DI; + undefined2 uStack_a; + + uStack_a = in_CX; + while( true ) { + FUN_1020_0d97(); + unaff_DI = unaff_DI + 6; + uStack_a = uStack_a + -1; + if (uStack_a == 0) break; + FUN_1020_0cd4(unaff_DI); + } + FUN_1020_0cd4(); + return; +} + + +/* ===== 1020:14a4 FUN_1020_14a4 ===== */ + +int __stdcall16far FUN_1020_14a4(uint param_1) + +{ + long lVar1; + ulong uVar2; + + uVar2 = FUN_1020_1501(); + lVar1 = (uVar2 >> 0x10) * (ulong)param_1; + return (int)((ulong)lVar1 >> 0x10) + + (uint)CARRY2((uint)lVar1,(uint)((uVar2 & 0xffff) * (ulong)param_1 >> 0x10)); +} + + +/* ===== 1020:14c1 FUN_1020_14c1 ===== */ + +char __cdecl16far FUN_1020_14c1(void) + +{ + char cVar1; + int iVar2; + ulong uVar3; + + uVar3 = FUN_1020_1501(); + cVar1 = -0x80; + iVar2 = 0x20; + do { + if ((uVar3 & 0x80000000) != 0) { + return cVar1; + } + uVar3 = CONCAT22((int)(uVar3 >> 0x10) << 1 | (uint)((int)uVar3 < 0),(int)uVar3 << 1); + cVar1 = cVar1 + -1; + iVar2 = iVar2 + -1; + } while (iVar2 != 0); + return '\0'; +} + + +/* ===== 1020:14de runtime_1020_14de ===== */ + +/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */ + +void __cdecl16far runtime_1020_14de(void) + +{ + FUN_1020_1501(); + fscale((longdouble)_DAT_1028_0720 + (longdouble)DAT_1020_14fb,(longdouble)DAT_1020_14ff); + return; +} + + +/* ===== 1020:1501 FUN_1020_1501 ===== */ + +void __cdecl16near FUN_1020_1501(void) + +{ + uint uVar1; + char cVar2; + int iVar3; + + uVar1 = (uint)((ulong)DAT_1028_0720 * (ulong)DAT_1020_1537); + cVar2 = (char)(DAT_1028_0720 << 3); + iVar3 = (int)((ulong)DAT_1028_0720 * (ulong)DAT_1020_1537 >> 0x10) + + CONCAT11((char)((DAT_1028_0720 << 3) >> 8) + cVar2,cVar2) + DAT_1028_0722 * 5; + DAT_1028_0720 = uVar1 + 1; + DAT_1028_0722 = + CONCAT11((char)((uint)iVar3 >> 8) + (char)DAT_1028_0722 * '\x04' + (char)(DAT_1028_0722 << 7) + ,(char)iVar3) + (uint)(0xfffe < uVar1); + return; +} + + +/* ===== 1020:1539 runtime_1020_1539 ===== */ + +void __cdecl16far runtime_1020_1539(void) + +{ + code *pcVar1; + undefined2 in_CX; + undefined2 extraout_DX; + + pcVar1 = (code *)swi(0x21); + (*pcVar1)(); + DAT_1028_0720 = in_CX; + DAT_1028_0722 = extraout_DX; + return; +} + + +/* ===== 1020:1546 FUN_1020_1546 ===== */ + +void __cdecl16near FUN_1020_1546(void) + +{ + ulong uVar1; + uint in_AX; + byte bVar2; + uint in_DX; + byte *unaff_DI; + undefined2 unaff_ES; + char cVar3; + + if ((int)in_DX < 0) { + FUN_1020_1562(); + unaff_DI[-1] = 0x2d; + return; + } + do { + uVar1 = (ulong)in_DX; + in_DX = in_DX / 10; + uVar1 = uVar1 % 10 << 0x10 | (ulong)in_AX; + in_AX = (uint)(uVar1 / 10); + cVar3 = (char)(uVar1 % 10); + bVar2 = cVar3 + 0x30; + if (0x39 < bVar2) { + bVar2 = cVar3 + 0x37; + } + unaff_DI = unaff_DI + -1; + *unaff_DI = bVar2; + } while (in_AX != 0 || in_DX != 0); + return; +} + + +/* ===== 1020:1562 FUN_1020_1562 ===== */ + +void __cdecl16near FUN_1020_1562(void) + +{ + ulong uVar1; + uint in_AX; + byte bVar2; + uint in_BX; + uint unaff_SI; + byte *unaff_DI; + undefined2 unaff_ES; + char cVar3; + + do { + uVar1 = (ulong)in_BX; + in_BX = in_BX / unaff_SI; + uVar1 = uVar1 % (ulong)unaff_SI << 0x10 | (ulong)in_AX; + in_AX = (uint)(uVar1 / unaff_SI); + cVar3 = (char)(uVar1 % (ulong)unaff_SI); + bVar2 = cVar3 + 0x30; + if (0x39 < bVar2) { + bVar2 = cVar3 + 0x37; + } + unaff_DI = unaff_DI + -1; + *unaff_DI = bVar2; + } while (in_AX != 0 || in_BX != 0); + return; +} + + +/* ===== 1020:1582 FUN_1020_1582 ===== */ + +undefined4 __cdecl16near FUN_1020_1582(void) + +{ + int iVar1; + uint uVar2; + int iVar3; + uint uVar4; + int in_CX; + uint uVar5; + uint uVar6; + byte bVar7; + byte bVar8; + uint uVar9; + char cVar10; + uint uVar11; + byte *unaff_DI; + undefined2 unaff_ES; + bool bVar12; + bool bVar13; + + iVar1 = 0; + uVar5 = 0; + uVar11 = 0; + if (in_CX == 0) goto LAB_1020_15e7; + if (*unaff_DI == 0x2b) { +LAB_1020_1597: + unaff_DI = unaff_DI + 1; + in_CX = in_CX + -1; + if (in_CX == 0) goto LAB_1020_15e7; + } + else if (*unaff_DI == 0x2d) { + uVar11 = 0xffff; + goto LAB_1020_1597; + } + if (*unaff_DI != 0x24) { + do { + uVar9 = (uint)(byte)(*unaff_DI - 0x30); + if ((byte)(*unaff_DI - 0x3a) < 0xf6) break; + if ((uVar5 & 0xf000) != 0) goto LAB_1020_15e7; + uVar2 = iVar1 * 2; + uVar6 = uVar5 << 1 | (uint)(iVar1 < 0); + iVar3 = iVar1 << 2; + uVar4 = iVar1 * 8; + uVar5 = iVar1 * 10; + iVar1 = uVar5 + uVar9; + uVar5 = ((uVar6 << 1 | (uint)((int)uVar2 < 0)) << 1 | (uint)(iVar3 < 0)) + uVar6 + + (uint)CARRY2(uVar4,uVar2) + (uint)CARRY2(uVar5,uVar9); + unaff_DI = unaff_DI + 1; + in_CX = in_CX + -1; + } while (in_CX != 0); +LAB_1020_15d1: + if (iVar1 != 0 || uVar5 != 0) { + if ((int)uVar11 < 0) { + bVar12 = iVar1 != 0; + iVar1 = -iVar1; + uVar5 = -(uint)bVar12 - uVar5; + } + if ((int)(uVar11 ^ uVar5) < 0) goto LAB_1020_15e7; + } + return CONCAT22(uVar5,iVar1); + } + iVar3 = in_CX + -1; + if (iVar3 != 0) { + do { + unaff_DI = unaff_DI + 1; + bVar7 = *unaff_DI; + if (0x60 < bVar7) { + bVar7 = bVar7 - 0x20; + } + bVar8 = bVar7 - 0x30; + if ((byte)(bVar7 - 0x3a) < 0xf6) { + if ((byte)(bVar7 + 0xb9) < 0xfa) goto LAB_1020_15d1; + bVar8 = bVar7 - 0x37; + } + cVar10 = '\x04'; + do { + bVar12 = iVar1 < 0; + iVar1 = iVar1 << 1; + bVar13 = (int)uVar5 < 0; + uVar5 = uVar5 << 1 | (uint)bVar12; + if (bVar13) goto LAB_1020_15e7; + cVar10 = cVar10 + -1; + } while (cVar10 != '\0'); + iVar1 = CONCAT11((char)((uint)iVar1 >> 8),(byte)iVar1 | bVar8); + iVar3 = iVar3 + -1; + if (iVar3 == 0) { + if ((int)uVar11 < 0) { + bVar12 = iVar1 != 0; + iVar1 = -iVar1; + uVar5 = -(uint)bVar12 - uVar5; + } + return CONCAT22(uVar5,iVar1); + } + } while( true ); + } +LAB_1020_15e7: + return CONCAT22(uVar5,iVar1); +} + + +/* ===== 1020:1629 FUN_1020_1629 ===== */ + +void __stdcall16far FUN_1020_1629(int param_1,undefined1 *param_2,int param_3) + +{ + undefined1 *puVar1; + int in_CX; + undefined1 *puVar2; + undefined1 *puVar3; + undefined2 uVar4; + undefined2 unaff_SS; + + FUN_1020_1546(); + uVar4 = (undefined2)((ulong)param_2 >> 0x10); + if (param_1 < param_3) { + param_3 = param_1; + } + if (param_1 < in_CX) { + in_CX = param_1; + } + if (param_3 < in_CX) { + param_3 = in_CX; + } + puVar3 = (undefined1 *)param_2 + 1; + *param_2 = (char)param_3; + param_3 = param_3 - in_CX; + puVar2 = &stack0xfffe; + if (param_3 != 0) { + for (; puVar2 = &stack0xfffe, param_3 != 0; param_3 = param_3 + -1) { + puVar1 = puVar3; + puVar3 = puVar3 + 1; + *puVar1 = 0x20; + } + } + for (; in_CX != 0; in_CX = in_CX + -1) { + puVar1 = puVar3; + puVar3 = puVar3 + 1; + *puVar1 = *puVar2; + puVar2 = puVar2 + 1; + } + return; +} + + +/* ===== 1020:1674 FUN_1020_1674 ===== */ + +undefined2 __stdcall16far FUN_1020_1674(int *param_1,byte *param_2) + +{ + undefined2 uVar1; + uint uVar2; + int iVar3; + byte *pbVar4; + bool bVar5; + + bVar5 = false; + uVar2 = (uint)*param_2; + pbVar4 = (byte *)param_2; + while ((pbVar4 = pbVar4 + 1, uVar2 != 0 && (bVar5 = *pbVar4 < 0x20, *pbVar4 == 0x20))) { + uVar2 = uVar2 - 1; + } + uVar1 = FUN_1020_1582(); + if ((bVar5) || (iVar3 = 0, uVar2 != 0)) { + iVar3 = (int)pbVar4 - (int)(byte *)param_2; + uVar1 = 0; + } + *param_1 = iVar3; + return uVar1; +} + + +/* ===== 1020:16a5 FUN_1020_16a5 ===== */ + +void __stdcall16far FUN_1020_16a5(int param_1,undefined1 *param_2,undefined1 *param_3) + +{ + undefined1 *puVar1; + undefined1 *puVar2; + undefined1 *puVar3; + undefined1 *puVar4; + byte bVar5; + + puVar3 = (undefined1 *)param_3; + puVar4 = (undefined1 *)param_2; + bVar5 = 0; + if (puVar3 < puVar4) { + puVar3 = puVar3 + param_1 + -1; + puVar4 = puVar4 + param_1 + -1; + bVar5 = 1; + } + for (; param_1 != 0; param_1 = param_1 + -1) { + puVar2 = puVar4; + puVar4 = puVar4 + (uint)bVar5 * -2 + 1; + puVar1 = puVar3; + puVar3 = puVar3 + (uint)bVar5 * -2 + 1; + *puVar2 = *puVar1; + } + return; +} + + +/* ===== 1020:16c9 FUN_1020_16c9 ===== */ + +void __stdcall16far FUN_1020_16c9(undefined1 param_1,int param_2,undefined1 *param_3) + +{ + undefined1 *puVar1; + undefined1 *puVar2; + + puVar2 = (undefined1 *)param_3; + for (; param_2 != 0; param_2 = param_2 + -1) { + puVar1 = puVar2; + puVar2 = puVar2 + 1; + *puVar1 = param_1; + } + return; +} + + +/* ===== 1020:16dd runtime_1020_16dd ===== */ + +void __cdecl16far runtime_1020_16dd(void) + +{ + FUN_1020_16e6(); + return; +} + + +/* ===== 1020:16e1 FUN_1020_16e1 ===== */ + +void FUN_1020_16e1(void) + +{ + uint *unaff_DI; + + FUN_1020_16e6(); + /* WARNING: Could not recover jumptable at 0x102016e4. Too many branches */ + /* WARNING: Treating indirect jump as call */ + (*(code *)(ulong)*unaff_DI)(); + return; +} + + +/* ===== 1020:16e6 FUN_1020_16e6 ===== */ + +void __cdecl16near FUN_1020_16e6(void) + +{ + int *piVar1; + int *piVar2; + int iVar3; + int in_AX; + int iVar4; + int *piVar5; + int unaff_DI; + int *piVar6; + bool bVar7; + + piVar2 = (int *)*(int *)(unaff_DI + 4); + piVar5 = piVar2; + if (in_AX == piVar2[1]) { + return; + } + do { + bVar7 = false; + iVar3 = piVar5[3]; + piVar6 = piVar5 + 4; + iVar4 = iVar3; + do { + if (iVar4 == 0) break; + iVar4 = iVar4 + -1; + piVar1 = piVar6; + piVar6 = piVar6 + 1; + bVar7 = in_AX == *piVar1; + } while (!bVar7); + if (bVar7) { + piVar2[1] = in_AX; + piVar2[2] = (int)(piVar6 + ((iVar3 + -1) * 2 - iVar4)); + return; + } + piVar1 = piVar5; + piVar5 = (int *)*piVar1; + if ((int *)*piVar1 == (int *)0x0) { + FUN_1020_005d(); + return; + } + } while( true ); +} + + +/* SUMMARY: total=683 internal=391 external=292 succeeded=391 failed=0 */ diff --git a/original/TDKPIN_MECHANICS_RESTORED.c b/original/TDKPIN_MECHANICS_RESTORED.c index 826af67..47879c9 100644 --- a/original/TDKPIN_MECHANICS_RESTORED.c +++ b/original/TDKPIN_MECHANICS_RESTORED.c @@ -1,13 +1,14 @@ /* - * Readable mechanics transcription for TDKPIN.EXE. + * HISTORICAL PARTIAL mechanics transcription for TDKPIN.EXE. * * Target SHA-256: * a9022f1894e3e6e21fc42e8f6c932f7c549ca77f63aaa0c488bb9d55d9d0174c * - * This is a named, reviewable companion to TDKPIN_GHIDRA_RAW.c. It is not - * claimed to be the vendor's source or a buildable replacement. Every - * restored routine below names its raw address, and unresolved conversions - * stay explicit instead of being filled with guessed values. + * This superseded intermediate is retained only as provenance for the earlier + * live-probe work. It is not part of the completed readable-C deliverable. + * The authoritative complete address-linked implementations are under + * reconstructed/, especially tdkpin_flipper_collision.c, + * tdkpin_flipper_bitmap_geometry.c, tdkpin_physics.c, and tdkpin_timer_tick.c. */ #include diff --git a/original/TDKPIN_PHYSICS_RESTORED.c b/original/TDKPIN_PHYSICS_RESTORED.c index 2e76bad..9ac94e0 100644 --- a/original/TDKPIN_PHYSICS_RESTORED.c +++ b/original/TDKPIN_PHYSICS_RESTORED.c @@ -1,5 +1,5 @@ /* - * Readable fixed-point physics transcription for TDKPIN.EXE. + * HISTORICAL PARTIAL fixed-point physics transcription for TDKPIN.EXE. * * Authority: * SHA-256 a9022f1894e3e6e21fc42e8f6c932f7c549ca77f63aaa0c488bb9d55d9d0174c @@ -12,10 +12,11 @@ * FUN_1000_7ed9 / FUN_1000_8b0d (moving flipper records) * FUN_1000_b476 (rule flags) * - * This file transcribes behavior that has both static and live differential - * evidence. It is not claimed to be the vendor's source. Unrestored rule and - * persistent-contact branches remain in TDKPIN_GHIDRA_RAW.c rather than being - * replaced here with plausible code. + * This superseded intermediate is retained only as provenance for earlier + * static/live comparison work and is not part of the completed deliverable. + * The complete 1000:c79c implementation is reconstructed/tdkpin_physics.c; + * its rule and persistent-contact dependencies are likewise represented by + * address-linked verified modules under reconstructed/. */ #include diff --git a/original/UNEXPLAINED.tsv b/original/UNEXPLAINED.tsv new file mode 100644 index 0000000..cb8c7cd --- /dev/null +++ b/original/UNEXPLAINED.tsv @@ -0,0 +1,3 @@ +start end bytes hex classification evidence +1020:0666 1020:0666 1 ba overlapping-entry-opcode BA 33 D2 is mov dx,0xd233 at 0666; entry 0667 intentionally decodes 33 D2 as xor dx,dx +1020:0dea 1020:0dea 1 90 alignment single NOP between the 0d97 and 0e93 Borland runtime routines diff --git a/original/reconstructed/tdkpin_application.c b/original/reconstructed/tdkpin_application.c new file mode 100644 index 0000000..98cc85d --- /dev/null +++ b/original/reconstructed/tdkpin_application.c @@ -0,0 +1,442 @@ +/* ObjectWindows TApplication construction/destruction used by TDKPIN. */ + +#include "tdkpin_application.h" + +const char object_windows_error_format[] = "Error code = %d. Continue?"; +const char object_windows_error_caption[] = "Application Error"; + +enum { + APPLICATION_STATUS_OFFSET = 2, + APPLICATION_NAME_OFFSET = 4, + APPLICATION_FIELD_08_OFFSET = 8, + APPLICATION_FIELD_0A_OFFSET = 10, + APPLICATION_FIELD_0C_OFFSET = 12, + APPLICATION_FIELD_0E_OFFSET = 14, + APPLICATION_FIELD_10_OFFSET = 16, + APPLICATION_INIT_APPLICATION_SLOT = 0x10, + APPLICATION_INIT_INSTANCE_SLOT = 0x14, + APPLICATION_PREPROCESS_MESSAGE_SLOT = 0x24, + APPLICATION_DIALOG_MESSAGE_SLOT = 0x28, + APPLICATION_ACCELERATOR_SLOT = 0x2c, + APPLICATION_MDI_ACCELERATOR_SLOT = 0x30, + APPLICATION_RUN_SLOT = 0x20, + APPLICATION_ERROR_SLOT = 0x40, + APPLICATION_SETUP_SLOT = 0x18, + APPLICATION_CREATE_MAIN_WINDOW_SLOT = 0x34, + APPLICATION_VALIDATE_WINDOW_SLOT = 0x3c, + APPLICATION_ERROR_SLOT_FOR_WINDOW = 0x40, + APPLICATION_IDLE_SLOT = 0x0c, + APPLICATION_ACCELERATOR_OFFSET = 0x0c, + APPLICATION_ACTIVE_DIALOG_OFFSET = 0x0e, + APPLICATION_MAIN_WINDOW_OFFSET = 8, + OBJECT_WINDOWS_BOUND_DISPATCH_OFFSET = 0x0133, + OBJECT_WINDOWS_OBJECT_HANDLE_OFFSET = 4, + OBJECT_WINDOWS_MDI_CLIENT_SLOT = 0x30, + OBJECT_WINDOWS_CAN_CLOSE_SLOT = 0x3c, + OBJECT_WINDOWS_CREATE_SLOT = 0x20, + OBJECT_WINDOWS_EXEC_DIALOG_SLOT = 0x4c, + WIN16_WM_QUIT = 0x0012, + WIN16_PM_REMOVE = 1, + WIN16_MB_YESNO_ICONHAND = 0x0014, + WIN16_IDNO = 7, +}; + +static void call_application_vmt_slot( + Win16FarPtr application, uint16_t slot) +{ + uint16_t vmt = win16_read_u16(application); + Win16FarPtr procedure = + win16_read_far_pointer(win16_dgroup_pointer(vmt), slot); + win16_call_object_method(procedure, application); +} + +/* + * 1018:1a61 — construct ObjectWindows' application root. + * + * The process-global application pointer is published before virtual + * initialization. InitApplication (+0x10) runs only for the first Win16 + * instance; InitInstance (+0x14) runs only while the status word remains zero. + */ +Win16FarPtr object_windows_application_construct( + Win16FarPtr object, uint16_t vmt, Win16FarPtr name) +{ + BorlandObjectCallFrame frame = {object, vmt}; + if (!borland_enter_object_constructor(&frame, 0)) { + return frame.object; + } + + frame.object = borland_default_object_constructor(frame.object, 0); + win16_write_u16(frame.object, APPLICATION_NAME_OFFSET, + win16_far_offset(name)); + win16_write_u16(frame.object, APPLICATION_NAME_OFFSET + 2, + win16_far_selector(name)); + g_object_windows_application = frame.object; + win16_write_u16(frame.object, APPLICATION_FIELD_0C_OFFSET, 0); + win16_write_u16(frame.object, APPLICATION_STATUS_OFFSET, 0); + win16_write_u16(frame.object, APPLICATION_FIELD_08_OFFSET, 0); + win16_write_u16(frame.object, APPLICATION_FIELD_0A_OFFSET, 0); + win16_write_u16(frame.object, APPLICATION_FIELD_0E_OFFSET, 0); + win16_write_u16(frame.object, APPLICATION_FIELD_10_OFFSET, 0); + + g_object_windows_dispatch_proc = MakeProcInstance16( + win16_relocated_code_pointer( + 4, OBJECT_WINDOWS_BOUND_DISPATCH_OFFSET), + g_win16_instance); + borland_initialize_heap_reserve(); + + if (g_win16_previous_instance == 0) { + call_application_vmt_slot( + frame.object, APPLICATION_INIT_APPLICATION_SLOT); + } + if (win16_read_u16(win16_far_add_offset( + frame.object, APPLICATION_STATUS_OFFSET)) == 0) { + call_application_vmt_slot( + frame.object, APPLICATION_INIT_INSTANCE_SLOT); + } + return frame.object; +} + +/* 1018:1b08 — release the shared proc instance, then destroy/free the object. */ +void object_windows_application_destruct(Win16FarPtr object, uint16_t vmt) +{ + FreeProcInstance16(g_object_windows_dispatch_proc); + borland_default_object_destructor(object, 0); + BorlandObjectCallFrame frame = {object, vmt}; + borland_finish_object_destructor(&frame, 0); +} + +/* 1018:1b35 — default IdleAction: no background work was performed. */ +bool object_windows_application_idle_default(Win16FarPtr application) +{ + (void)application; + return false; +} + +/* 1018:1b4b — default first-instance InitApplication hook is intentionally empty. */ +void object_windows_application_init_application_default( + Win16FarPtr application) +{ + (void)application; +} + +/* + * 1018:1bdf — publish the currently active dialog at object +0x0e/+0x10. + * The modal-dialog path saves and restores this exact far pointer, and the + * message loop uses it as the IsDialogMessage16 target. + */ +void object_windows_application_set_active_dialog( + Win16FarPtr application, Win16FarPtr dialog) +{ + win16_write_u16(application, APPLICATION_FIELD_0E_OFFSET, + win16_far_offset(dialog)); + win16_write_u16(application, APPLICATION_FIELD_10_OFFSET, + win16_far_selector(dialog)); +} + +static Win16FarPtr application_vmt_procedure( + Win16FarPtr application, uint16_t slot) +{ + uint16_t vmt = win16_read_u16(application); + return win16_read_far_pointer(win16_dgroup_pointer(vmt), slot); +} + +/* 1018:0e9e — show one ObjectWindows object only after it owns an HWND. */ +void object_windows_show(Win16FarPtr object, INT16 command) +{ + HWND16 window = win16_read_u16(win16_far_add_offset( + object, OBJECT_WINDOWS_OBJECT_HANDLE_OFFSET)); + if (window != 0) { + (void)ShowWindow16(window, command); + } +} + +/* + * 1018:1b57 — run setup, create/publish MainWindow, then show it. A null + * creator result stores ObjectWindows status -5 instead. + */ +void object_windows_application_initialize(Win16FarPtr application) +{ + win16_call_object_method( + application_vmt_procedure(application, APPLICATION_SETUP_SLOT), + application); + Win16FarPtr main_window = win16_call_object_far_method( + application_vmt_procedure( + application, APPLICATION_CREATE_MAIN_WINDOW_SLOT), + application); + win16_write_u16(application, APPLICATION_MAIN_WINDOW_OFFSET, + win16_far_offset(main_window)); + win16_write_u16(application, APPLICATION_MAIN_WINDOW_OFFSET + 2, + win16_far_selector(main_window)); + if (main_window == 0) { + win16_write_u16(application, APPLICATION_STATUS_OFFSET, 0xfffb); + return; + } + object_windows_show(main_window, (INT16)g_win16_show_command); +} + +/* 1018:1bb0 — enter the message loop, or report a preexisting status error. */ +void object_windows_application_run(Win16FarPtr application) +{ + uint16_t status = win16_read_u16(win16_far_add_offset( + application, APPLICATION_STATUS_OFFSET)); + if (status == 0) { + win16_call_object_method( + application_vmt_procedure(application, APPLICATION_RUN_SLOT), + application); + return; + } + win16_call_object_u16_method( + application_vmt_procedure(application, APPLICATION_ERROR_SLOT), + application, + status); +} + +/* + * 1018:1bfc — ObjectWindows application message loop. + * Only WM_QUIT terminates the loop. With an empty queue, a false IdleAction + * result causes WaitMessage; either idle outcome then repeats the loop. + */ +void object_windows_application_message_loop(Win16FarPtr application) +{ + MSG16 message; + bool quit = false; + do { + if (PeekMessage16(&message, 0, 0, 0, WIN16_PM_REMOVE) != 0) { + if (message.message == WIN16_WM_QUIT) { + quit = true; + } else { + Win16FarPtr filter = application_vmt_procedure( + application, APPLICATION_PREPROCESS_MESSAGE_SLOT); + if (!win16_call_application_message_filter( + filter, application, &message)) { + (void)TranslateMessage16(&message); + (void)DispatchMessage16(&message); + } + } + } else { + Win16FarPtr idle = application_vmt_procedure( + application, APPLICATION_IDLE_SLOT); + if (!win16_call_object_bool_method(idle, application)) { + (void)WaitMessage16(); + } + } + } while (!quit); + win16_write_u16(application, APPLICATION_STATUS_OFFSET, message.wparam); +} + +/* 1018:1c7f — dialog, MDI, then ordinary accelerator preprocessing. */ +bool object_windows_application_preprocess_message( + Win16FarPtr application, MSG16 *message) +{ + static const uint16_t slots[] = { + APPLICATION_DIALOG_MESSAGE_SLOT, + APPLICATION_MDI_ACCELERATOR_SLOT, + APPLICATION_ACCELERATOR_SLOT, + }; + for (size_t index = 0; index < sizeof(slots) / sizeof(slots[0]); index++) { + Win16FarPtr filter = + application_vmt_procedure(application, slots[index]); + if (win16_call_application_message_filter( + filter, application, message)) { + return true; + } + } + return false; +} + +/* + * 1018:1cd6 — route through the active dialog's HWND when present. + * NEG AX; SBB AL,AL; NEG AL normalizes only AL, deliberately preserving AH + * from the negated Win16 BOOL return. + */ +uint16_t object_windows_application_process_dialog_message( + Win16FarPtr application, MSG16 *message) +{ + Win16FarPtr dialog = + win16_read_far_pointer(application, APPLICATION_ACTIVE_DIALOG_OFFSET); + if (dialog == 0) { + return 0; + } + HWND16 window = win16_read_u16(win16_far_add_offset( + dialog, OBJECT_WINDOWS_OBJECT_HANDLE_OFFSET)); + if (window == 0) { + return 0; + } + uint16_t api_result = (uint16_t)IsDialogMessage16(window, message); + uint16_t negated = (uint16_t)(0u - api_result); + return (uint16_t)((negated & 0xff00u) | (api_result != 0 ? 1u : 0u)); +} + +/* 1018:1d22 — process the application's ordinary accelerator table. */ +bool object_windows_application_process_accelerator( + Win16FarPtr application, MSG16 *message) +{ + HACCEL16 accelerator = win16_read_u16(win16_far_add_offset( + application, APPLICATION_ACCELERATOR_OFFSET)); + if (accelerator == 0) { + return false; + } + Win16FarPtr main_window = win16_read_far_pointer( + application, APPLICATION_MAIN_WINDOW_OFFSET); + HWND16 window = win16_read_u16(win16_far_add_offset( + main_window, OBJECT_WINDOWS_OBJECT_HANDLE_OFFSET)); + return TranslateAccelerator16(window, accelerator, message) != 0; +} + +/* 1018:1d64 — ask the main window for its MDI client, then translate there. */ +bool object_windows_application_process_mdi_accelerator( + Win16FarPtr application, MSG16 *message) +{ + Win16FarPtr main_window = win16_read_far_pointer( + application, APPLICATION_MAIN_WINDOW_OFFSET); + uint16_t main_vmt = win16_read_u16(main_window); + Win16FarPtr getter = win16_read_far_pointer( + win16_dgroup_pointer(main_vmt), OBJECT_WINDOWS_MDI_CLIENT_SLOT); + Win16FarPtr client = + win16_call_object_far_method(getter, main_window); + if (client == 0) { + return false; + } + HWND16 window = win16_read_u16(win16_far_add_offset( + client, OBJECT_WINDOWS_OBJECT_HANDLE_OFFSET)); + return TranslateMDISysAccel16(window, message) != 0; +} + +/* 1018:1f56 — delegate application shutdown approval to MainWindow.CanClose. */ +bool object_windows_application_can_close(Win16FarPtr application) +{ + Win16FarPtr main_window = win16_read_far_pointer( + application, APPLICATION_MAIN_WINDOW_OFFSET); + uint16_t vmt = win16_read_u16(main_window); + Win16FarPtr can_close = win16_read_far_pointer( + win16_dgroup_pointer(vmt), OBJECT_WINDOWS_CAN_CLOSE_SLOT); + return win16_call_object_bool_method(can_close, main_window); +} + +/* 1018:10e9 — default TWindow VMT +0x30: this is not an MDI frame. */ +Win16FarPtr object_windows_window_get_mdi_client_default( + Win16FarPtr window) +{ + (void)window; + return 0; +} + +static void report_application_error( + Win16FarPtr application, uint16_t error) +{ + win16_call_object_u16_method( + application_vmt_procedure( + application, APPLICATION_ERROR_SLOT_FOR_WINDOW), + application, + error); +} + +/* + * 1018:1db1 — validate a newly constructed window against heap-reserve and + * object-status failures. Every failure reports through VMT +0x40 and invokes + * the candidate's virtual destructor with dispose mode 1. OOM (-2) also + * reprovisions the Borland emergency reserve afterward. + */ +Win16FarPtr object_windows_application_validate_window( + Win16FarPtr application, Win16FarPtr window) +{ + if (window == 0) { + return 0; + } + if (borland_heap_reserve_is_unallocated()) { + report_application_error(application, 0xfffe); + borland_dispose_object(window); + borland_ensure_heap_reserve(); + return 0; + } + + uint16_t status = win16_read_u16(win16_far_add_offset(window, 2)); + if (status != 0) { + report_application_error(application, status); + borland_dispose_object(window); + return 0; + } + return window; +} + +/* 1018:1e39 — validate and create a modeless window, disposing failures. */ +Win16FarPtr object_windows_application_make_window( + Win16FarPtr application, Win16FarPtr window) +{ + if (window == 0) { + return 0; + } + Win16FarPtr validated = win16_call_application_window_method( + application_vmt_procedure( + application, APPLICATION_VALIDATE_WINDOW_SLOT), + application, + window); + if (validated == 0) { + return 0; + } + + uint16_t vmt = win16_read_u16(window); + Win16FarPtr create = win16_read_far_pointer( + win16_dgroup_pointer(vmt), OBJECT_WINDOWS_CREATE_SLOT); + if (win16_call_object_bool_method(create, window)) { + return window; + } + report_application_error( + application, win16_read_u16(win16_far_add_offset(window, 2))); + borland_dispose_object(window); + return 0; +} + +/* + * 1018:1eb0 — validate, execute, and always dispose a modal dialog. Negative + * execution results are reported and translated to the fixed fallback 2. + */ +int16_t object_windows_application_exec_dialog( + Win16FarPtr application, Win16FarPtr dialog) +{ + int16_t result = 2; + Win16FarPtr validated = win16_call_application_window_method( + application_vmt_procedure( + application, APPLICATION_VALIDATE_WINDOW_SLOT), + application, + dialog); + if (validated == 0) { + return result; + } + + uint16_t vmt = win16_read_u16(dialog); + Win16FarPtr execute = win16_read_far_pointer( + win16_dgroup_pointer(vmt), OBJECT_WINDOWS_EXEC_DIALOG_SLOT); + int16_t execute_result = + win16_call_object_int_method(execute, dialog); + if (execute_result < 0) { + report_application_error(application, (uint16_t)execute_result); + } else { + result = execute_result; + } + borland_dispose_object(dialog); + return result; +} + +/* + * 1018:1f14 — format and display one ObjectWindows application error. + * The original passes a far pointer to the caller's uint16 error word as the + * wvsprintf argument list. Choosing IDNO (7) exits with that full AX word. + */ +void object_windows_application_error( + Win16FarPtr application, uint16_t error) +{ + (void)application; + char text[32]; + uint16_t arguments[1] = {error}; + (void)wvsprintf16(text, object_windows_error_format, arguments); + INT16 response = win16_call_message_box( + g_win16_message_box, + 0, + text, + object_windows_error_caption, + WIN16_MB_YESNO_ICONHAND); + if (response == WIN16_IDNO) { + borland_runtime_exit(error); + } +} diff --git a/original/reconstructed/tdkpin_application.h b/original/reconstructed/tdkpin_application.h new file mode 100644 index 0000000..ad2ef74 --- /dev/null +++ b/original/reconstructed/tdkpin_application.h @@ -0,0 +1,75 @@ +#ifndef TDKPIN_APPLICATION_H +#define TDKPIN_APPLICATION_H + +#include "tdkpin_borland_objects.h" +#include "tdkpin_object_windows.h" + +extern Win16FarPtr g_object_windows_application; /* 1028:064e/0650 */ +extern HINSTANCE16 g_win16_previous_instance; /* 1028:06fc */ +extern HINSTANCE16 g_win16_instance; /* 1028:06fe */ +extern uint16_t g_win16_show_command; /* 1028:0700 */ +extern Win16FarPtr g_win16_message_box; /* 1028:0666/0668 */ +extern const char object_windows_error_format[]; /* 1028:0698 */ +extern const char object_windows_error_caption[]; /* 1028:06b3 */ + +Win16FarPtr object_windows_application_construct( + Win16FarPtr object, + uint16_t vmt, + Win16FarPtr name); /* 1018:1a61 */ +void object_windows_application_destruct( + Win16FarPtr object, uint16_t vmt); /* 1018:1b08 */ +bool object_windows_application_idle_default( + Win16FarPtr application); /* 1018:1b35 */ +void object_windows_application_init_application_default( + Win16FarPtr application); /* 1018:1b4b */ +void object_windows_application_set_active_dialog( + Win16FarPtr application, + Win16FarPtr dialog); /* 1018:1bdf */ +void object_windows_application_message_loop( + Win16FarPtr application); /* 1018:1bfc */ +void object_windows_application_run( + Win16FarPtr application); /* 1018:1bb0 */ +void object_windows_application_initialize( + Win16FarPtr application); /* 1018:1b57 */ +void object_windows_show( + Win16FarPtr object, INT16 command); /* 1018:0e9e */ +bool object_windows_application_preprocess_message( + Win16FarPtr application, MSG16 *message); /* 1018:1c7f */ +uint16_t object_windows_application_process_dialog_message( + Win16FarPtr application, MSG16 *message); /* 1018:1cd6 */ +bool object_windows_application_process_accelerator( + Win16FarPtr application, MSG16 *message); /* 1018:1d22 */ +bool object_windows_application_process_mdi_accelerator( + Win16FarPtr application, MSG16 *message); /* 1018:1d64 */ +bool object_windows_application_can_close( + Win16FarPtr application); /* 1018:1f56 */ +Win16FarPtr object_windows_window_get_mdi_client_default( + Win16FarPtr window); /* 1018:10e9 */ +Win16FarPtr object_windows_application_validate_window( + Win16FarPtr application, Win16FarPtr window); /* 1018:1db1 */ +Win16FarPtr object_windows_application_make_window( + Win16FarPtr application, Win16FarPtr window); /* 1018:1e39 */ +int16_t object_windows_application_exec_dialog( + Win16FarPtr application, Win16FarPtr dialog); /* 1018:1eb0 */ +void object_windows_application_error( + Win16FarPtr application, uint16_t error); /* 1018:1f14 */ + +/* Platform bridge for virtual ObjectWindows calls. */ +bool win16_call_object_bool_method( + Win16FarPtr procedure, Win16FarPtr object); +bool win16_call_application_message_filter( + Win16FarPtr procedure, Win16FarPtr application, MSG16 *message); +Win16FarPtr win16_call_object_far_method( + Win16FarPtr procedure, Win16FarPtr object); +Win16FarPtr win16_call_application_window_method( + Win16FarPtr procedure, + Win16FarPtr application, + Win16FarPtr window); +int16_t win16_call_application_dialog_method( + Win16FarPtr procedure, + Win16FarPtr application, + Win16FarPtr dialog); +int16_t win16_call_object_int_method( + Win16FarPtr procedure, Win16FarPtr object); + +#endif diff --git a/original/reconstructed/tdkpin_arithmetic.c b/original/reconstructed/tdkpin_arithmetic.c new file mode 100644 index 0000000..e32cc07 --- /dev/null +++ b/original/reconstructed/tdkpin_arithmetic.c @@ -0,0 +1,43 @@ +#include "tdkpin_arithmetic.h" +#include "tdkpin_borland_runtime.h" + +/* Low 32 bits of signed DX:AX * BX:CX, independent of CPU implementation path. */ +int32_t borland_multiply_i32(int32_t left, int32_t right) +{ + uint32_t bits = (uint32_t)((uint64_t)(uint32_t)left * (uint32_t)right); + return (int32_t)bits; +} + +BorlandDivI32Result borland_divide_i32(int32_t dividend, int32_t divisor) +{ + if (divisor == 0) { + borland_runtime_error(200); + } + if (dividend == INT32_MIN && divisor == -1) { + if (g_borland_cpu_level >= 2) { + win16_integer_divide_fault(); + } + return (BorlandDivI32Result){INT32_MIN, 0}; + } + + bool quotient_negative = (dividend < 0) != (divisor < 0); + bool remainder_negative = dividend < 0; + uint32_t dividend_magnitude = dividend < 0 + ? (uint32_t)(0u - (uint32_t)dividend) + : (uint32_t)dividend; + uint32_t divisor_magnitude = divisor < 0 + ? (uint32_t)(0u - (uint32_t)divisor) + : (uint32_t)divisor; + uint32_t quotient_bits = dividend_magnitude / divisor_magnitude; + uint32_t remainder_bits = dividend_magnitude % divisor_magnitude; + if (quotient_negative) { + quotient_bits = 0u - quotient_bits; + } + if (remainder_negative) { + remainder_bits = 0u - remainder_bits; + } + return (BorlandDivI32Result){ + (int32_t)quotient_bits, + (int32_t)remainder_bits, + }; +} diff --git a/original/reconstructed/tdkpin_arithmetic.h b/original/reconstructed/tdkpin_arithmetic.h new file mode 100644 index 0000000..3177a47 --- /dev/null +++ b/original/reconstructed/tdkpin_arithmetic.h @@ -0,0 +1,18 @@ +#ifndef TDKPIN_ARITHMETIC_H +#define TDKPIN_ARITHMETIC_H + +#include + +int32_t borland_multiply_i32(int32_t left, int32_t right); /* 1020:08a9 */ + +extern uint8_t g_borland_cpu_level; /* 1028:0726 */ + +typedef struct { + int32_t quotient; + int32_t remainder; +} BorlandDivI32Result; + +BorlandDivI32Result borland_divide_i32( + int32_t dividend, int32_t divisor); /* 1020:08e6 */ + +#endif diff --git a/original/reconstructed/tdkpin_asset_cleanup.c b/original/reconstructed/tdkpin_asset_cleanup.c new file mode 100644 index 0000000..6f6f061 --- /dev/null +++ b/original/reconstructed/tdkpin_asset_cleanup.c @@ -0,0 +1,82 @@ +/* TDKPIN global asset and main-window shutdown sequence. */ + +#include "tdkpin_game_assets.h" + +#include "tdkpin_borland_objects.h" +#include "tdkpin_message_pump.h" +#include "tdkpin_sound.h" +#include "tdkpin_window_lifecycle.h" + +enum { + DGROUP_GLOBAL_BITMAP_FIRST = 0x0859, + DGROUP_SPRITE_BITMAPS = 0x430b, + DGROUP_STATUS_BITMAPS_BASE = 0x4319, + DGROUP_ITEM_BITMAPS_BASE = 0x4321, + WINDOW_HANDLE_OFFSET = 4, + WINDOW_MASK_BITMAP_OFFSET = 0x52, + WINDOW_OWNED_OBJECT_OFFSET = 0x49, + WINDOW_ALREADY_REDRAWN_OFFSET = 0x0bd8, + WINDOW_REDRAW_BUSY_OFFSET = 0x0bd9, + WIN16_IDC_WAIT = 0x7f02, +}; + +static void delete_dgroup_bitmap(uint16_t offset) +{ + (void)DeleteObject16( + win16_read_u16(win16_dgroup_pointer(offset))); +} + +/* + * 1000:51f5 — stop sound, dispose all globally published image assets, restore + * the cursor, post quit code 18, then run TWindow and derived destructor exits. + * Handles are intentionally left stale in their slots, exactly like the image. + */ +void tdkpin_asset_window_destruct( + Win16FarPtr window, uint16_t vmt) +{ + HCURSOR16 wait = LoadCursor16( + 0, win16_make_far_pointer(0, WIN16_IDC_WAIT)); + HCURSOR16 previous_cursor = SetCursor16(wait); + tdkpin_unload_sounds(); + win16_write_u8( + win16_far_add_offset(window, WINDOW_REDRAW_BUSY_OFFSET), 1); + win16_write_u8( + win16_far_add_offset(window, WINDOW_ALREADY_REDRAWN_OFFSET), 1); + Win16FarPtr owned = + win16_read_far_pointer(window, WINDOW_OWNED_OBJECT_OFFSET); + if (owned != 0) { + borland_dispose_object(owned); + } + tdkpin_drain_messages_except_input(); + + (void)DeleteObject16( + win16_read_u16(win16_far_add_offset( + window, WINDOW_MASK_BITMAP_OFFSET))); + delete_dgroup_bitmap(DGROUP_GLOBAL_BITMAP_FIRST); + delete_dgroup_bitmap(0x0863); + delete_dgroup_bitmap(0x0865); + delete_dgroup_bitmap(0x085f); + delete_dgroup_bitmap(0x085b); + delete_dgroup_bitmap(0x0861); + delete_dgroup_bitmap(0x085d); + for (uint16_t index = 0; index < 8; index++) { + delete_dgroup_bitmap( + (uint16_t)(DGROUP_SPRITE_BITMAPS + index * 2)); + } + for (uint16_t index = 1; index <= 4; index++) { + delete_dgroup_bitmap( + (uint16_t)(DGROUP_STATUS_BITMAPS_BASE + index * 2)); + } + for (uint16_t index = 1; index <= 9; index++) { + delete_dgroup_bitmap( + (uint16_t)(DGROUP_ITEM_BITMAPS_BASE + index * 2)); + } + (void)SetCursor16(previous_cursor); + PostQuitMessage16(0x12); + object_windows_window_destruct(window, 0); + HWND16 handle = + win16_read_u16(win16_far_add_offset(window, WINDOW_HANDLE_OFFSET)); + (void)InvalidateRect16(handle, 0, 1); + BorlandObjectCallFrame frame = {window, vmt}; + borland_finish_object_destructor(&frame, 0); +} diff --git a/original/reconstructed/tdkpin_asset_initializer.c b/original/reconstructed/tdkpin_asset_initializer.c new file mode 100644 index 0000000..25c2409 --- /dev/null +++ b/original/reconstructed/tdkpin_asset_initializer.c @@ -0,0 +1,278 @@ +/* One-time TDKPIN asset loading and subsequent board redraw. */ + +#include "tdkpin_game_assets.h" + +#include "tdkpin_arithmetic.h" +#include "tdkpin_message_pump.h" +#include "tdkpin_palette.h" +#include "tdkpin_render.h" +#include "tdkpin_sound.h" + +enum { + DGROUP_INSTANCE = 0x06fe, + DGROUP_SCENE_READY = 0x07cb, + DGROUP_ASSETS_PENDING = 0x07cc, + DGROUP_CURRENT_PLAYER = 0x07d1, + DGROUP_BACKGROUND_BITMAP = 0x085b, + DGROUP_BACKGROUND_OVERLAY_B = 0x085d, + DGROUP_BACKGROUND_OVERLAY_A = 0x085f, + DGROUP_DIGIT_BITMAP = 0x0861, + DGROUP_CLAW_BITMAP = 0x0863, + DGROUP_BOARD_DECORATION_BITMAP = 0x0865, + DGROUP_DISPLAYED_STATUS_LEVEL = 0x086b, + DGROUP_SPRITE_BITMAPS = 0x430b, + DGROUP_STATUS_BITMAPS_BASE = 0x4319, + DGROUP_ITEM_BITMAPS_BASE = 0x4321, + DGROUP_PALETTE = 0x444e, + DGROUP_PLAYER_SCORE_INDEX_BASE = 0x097e, + DGROUP_SCORE_FACTOR_VALUES_BASE = 0x098e, + DGROUP_SCORE_FACTORS_BASE = 0x09a1, + WINDOW_HANDLE_OFFSET = 4, + WINDOW_MASK_BITMAP_OFFSET = 0x52, + WINDOW_IMAGE_BITMAP_OFFSET = 0x54, + WINDOW_TRANSIENT_1_OFFSET = 0x4d, + WINDOW_TRANSIENT_2_OFFSET = 0x4f, + WINDOW_X_VALUE_OFFSET = 0x0ba2, + WINDOW_Y_VALUE_OFFSET = 0x0ba6, + WINDOW_ALREADY_REDRAWN_OFFSET = 0x0bd8, + WINDOW_REDRAW_BUSY_OFFSET = 0x0bd9, + WINDOW_HIDE_OBJECT_OFFSET = 0x0bde, + WIN16_SRCCOPY = 0x00cc0020, + WIN16_MASK_ROP = 0x00c60088, + WIN16_IMAGE_ROP = 0x00ee0086, + WIN16_IDC_ARROW = 0x7f00, +}; + +static HBITMAP16 load_dat(uint16_t resource_id) +{ + return tdkpin_load_bitmap_resource( + win16_make_far_pointer(0, resource_id), g_win16_instance); +} + +static void write_dgroup_handle(uint16_t offset, HBITMAP16 bitmap) +{ + win16_write_u16(win16_dgroup_pointer(offset), 0, bitmap); +} + +static void draw_loading_stage( + Win16FarPtr progress_frame, uint8_t stage) +{ + tdkpin_draw_loading_stage(progress_frame, stage); +} + +/* 1000:53c5..5618 — one-time exact resource/handle publication sequence. */ +static void load_all_assets( + HDC16 destination, + Win16FarPtr progress_frame) +{ + HBITMAP16 splash = load_dat(995); + HDC16 splash_dc = CreateCompatibleDC16(destination); + HGDIOBJ16 previous_splash = SelectObject16(splash_dc, splash); + (void)BitBlt16( + destination, 0, 0, 640, 480, + splash_dc, 0, 0, WIN16_SRCCOPY); + (void)SelectObject16(splash_dc, previous_splash); + (void)DeleteObject16(splash_dc); + (void)DeleteObject16(splash); + + HBITMAP16 loading_bitmap = load_dat(994); + win16_write_u16(progress_frame, 0xfffe, loading_bitmap); + draw_loading_stage(progress_frame, 2); + tdkpin_initialize_sounds(); + draw_loading_stage(progress_frame, 3); + draw_loading_stage(progress_frame, 4); + write_dgroup_handle(DGROUP_BACKGROUND_OVERLAY_B, load_dat(998)); + draw_loading_stage(progress_frame, 5); + write_dgroup_handle(DGROUP_BACKGROUND_BITMAP, load_dat(998)); + draw_loading_stage(progress_frame, 6); + write_dgroup_handle( + DGROUP_DIGIT_BITMAP, + LoadBitmap16(g_win16_instance, win16_make_far_pointer(0, 500))); + + for (uint16_t index = 0; index < 8; index++) { + draw_loading_stage(progress_frame, (uint8_t)(index + 7)); + write_dgroup_handle( + (uint16_t)(DGROUP_SPRITE_BITMAPS + index * 2), + load_dat((uint16_t)(400 + index))); + } + for (uint16_t index = 1; index <= 4; index++) { + draw_loading_stage(progress_frame, (uint8_t)(index + 14)); + write_dgroup_handle( + (uint16_t)(DGROUP_STATUS_BITMAPS_BASE + index * 2), + load_dat((uint16_t)(700 + index))); + } + for (uint16_t index = 1; index <= 9; index++) { + draw_loading_stage(progress_frame, (uint8_t)(index + 18)); + write_dgroup_handle( + (uint16_t)(DGROUP_ITEM_BITMAPS_BASE + index * 2), + load_dat((uint16_t)(800 + index))); + } + + (void)loading_bitmap; +} + +static bool positive_i32_at(Win16FarPtr object, uint16_t offset) +{ + return (int32_t)win16_read_u32(win16_far_add_offset(object, offset)) > 0; +} + +/* 1000:5619..58e2 — transient board redraw and score/status publication. */ +static void redraw_scene( + Win16FarPtr window, + HDC16 destination, + HPALETTE16 previous_palette) +{ + if (win16_read_u8( + win16_far_add_offset(window, WINDOW_ALREADY_REDRAWN_OFFSET)) != 0) { + return; + } + win16_write_u8( + win16_far_add_offset(window, WINDOW_REDRAW_BUSY_OFFSET), 1); + HDC16 background_dc = CreateCompatibleDC16(destination); + HDC16 surface_dc = CreateCompatibleDC16(destination); + RECT16 rectangle; + (void)GetClientRect16( + win16_read_u16(win16_far_add_offset(window, WINDOW_HANDLE_OFFSET)), + win16_stack_pointer(&rectangle)); + HBITMAP16 surface = CreateCompatibleBitmap16( + destination, + (INT16)(rectangle.right + 1), + (INT16)(rectangle.bottom + 1)); + HGDIOBJ16 old_background = SelectObject16( + background_dc, + win16_read_u16(win16_dgroup_pointer(DGROUP_BACKGROUND_BITMAP))); + HGDIOBJ16 old_surface = SelectObject16(surface_dc, surface); + (void)BitBlt16( + surface_dc, 0, 0, rectangle.right, rectangle.bottom, + background_dc, 0, 0, WIN16_SRCCOPY); + (void)BitBlt16( + background_dc, 0, 0, rectangle.right, rectangle.bottom, + surface_dc, 0, 0, WIN16_SRCCOPY); + (void)BitBlt16( + destination, 0, 0, rectangle.right, rectangle.bottom, + surface_dc, 0, 0, WIN16_SRCCOPY); + (void)SelectObject16(surface_dc, old_surface); + (void)DeleteObject16(surface); + (void)DeleteDC16(surface_dc); + (void)SelectObject16(background_dc, old_background); + + if (positive_i32_at(window, WINDOW_X_VALUE_OFFSET) && + positive_i32_at(window, WINDOW_Y_VALUE_OFFSET) && + win16_read_u8( + win16_far_add_offset(window, WINDOW_HIDE_OBJECT_OFFSET)) == 0) { + uint16_t x = win16_read_u16( + win16_far_add_offset(window, WINDOW_X_VALUE_OFFSET)); + uint16_t y = win16_read_u16( + win16_far_add_offset(window, WINDOW_Y_VALUE_OFFSET)); + uint16_t width = (uint16_t)( + win16_read_u32(win16_far_add_offset(window, WINDOW_X_VALUE_OFFSET)) + 19); + uint16_t height = (uint16_t)( + win16_read_u32(win16_far_add_offset(window, WINDOW_Y_VALUE_OFFSET)) + 19); + HGDIOBJ16 previous = SelectObject16( + background_dc, + win16_read_u16(win16_far_add_offset( + window, WINDOW_IMAGE_BITMAP_OFFSET))); + (void)BitBlt16( + destination, (INT16)x, (INT16)y, (INT16)width, (INT16)height, + background_dc, 0, 0, WIN16_MASK_ROP); + (void)SelectObject16( + background_dc, + win16_read_u16(win16_far_add_offset( + window, WINDOW_MASK_BITMAP_OFFSET))); + (void)BitBlt16( + destination, (INT16)x, (INT16)y, (INT16)width, (INT16)height, + background_dc, 0, 0, WIN16_IMAGE_ROP); + (void)SelectObject16(background_dc, previous); + } + (void)DeleteDC16(background_dc); + win16_write_u16(window, WINDOW_TRANSIENT_1_OFFSET, 0); + win16_write_u16(window, WINDOW_TRANSIENT_2_OFFSET, 0); + win16_write_u8( + win16_far_add_offset(window, WINDOW_REDRAW_BUSY_OFFSET), 0); + (void)SelectPalette16(destination, previous_palette, 0); + HCURSOR16 arrow = LoadCursor16( + 0, win16_make_far_pointer(0, WIN16_IDC_ARROW)); + (void)SetCursor16(arrow); + + (void)GetClientRect16( + win16_read_u16(win16_far_add_offset(window, WINDOW_HANDLE_OFFSET)), + win16_stack_pointer(&rectangle)); + HWND16 handle = + win16_read_u16(win16_far_add_offset(window, WINDOW_HANDLE_OFFSET)); + HDC16 window_dc = GetDC16(handle); + uint8_t current_player = win16_read_u8( + win16_dgroup_pointer(DGROUP_CURRENT_PLAYER)); + uint8_t factor = win16_read_u8(win16_dgroup_pointer( + (uint16_t)(DGROUP_SCORE_FACTORS_BASE + current_player))); + int32_t factor_value = (int32_t)win16_read_u32(win16_dgroup_pointer( + (uint16_t)(DGROUP_SCORE_FACTOR_VALUES_BASE + current_player * 4))); + tdkpin_draw_score( + window_dc, borland_multiply_i32(factor, factor_value)); + for (uint16_t player = 1; player <= 4; player++) { + int32_t score = (int32_t)win16_read_u32(win16_dgroup_pointer( + (uint16_t)(DGROUP_PLAYER_SCORE_INDEX_BASE + player * 4))); + if (score > 0) { + tdkpin_draw_score(window_dc, player); + } + } + win16_write_u16( + win16_dgroup_pointer(DGROUP_DISPLAYED_STATUS_LEVEL), 0, 99); + tdkpin_update_status_display(current_player, window_dc); + (void)ReleaseDC16(handle, window_dc); + win16_write_u8(win16_dgroup_pointer(DGROUP_SCENE_READY), 1); +} + +/* + * 1000:5390 — exact public entry. Two middle words are ABI-preserved but unused. + */ +void tdkpin_initialize_assets_and_redraw( + Win16FarPtr window, + uint16_t ignored_1, + uint16_t ignored_2, + HDC16 destination) +{ + (void)ignored_1; + (void)ignored_2; + HPALETTE16 palette = + win16_read_u16(win16_dgroup_pointer(DGROUP_PALETTE)); + HPALETTE16 previous_palette = SelectPalette16(destination, palette, 0); + (void)UnrealizeObject16(palette); + (void)RealizePalette16(destination); + tdkpin_drain_messages_except_input(); + + uint8_t progress_storage[64] = {0}; + Win16FarPtr progress_frame = + win16_stack_pointer(progress_storage + 24); + win16_write_u16(progress_frame, 0x0e, destination); + if (win16_read_u8( + win16_dgroup_pointer(DGROUP_ASSETS_PENDING)) != 0) { + load_all_assets(destination, progress_frame); + HBITMAP16 loading_bitmap = + win16_read_u16(win16_far_add_offset(progress_frame, 0xfffe)); + draw_loading_stage(progress_frame, 28); + win16_write_u16( + window, WINDOW_IMAGE_BITMAP_OFFSET, + LoadBitmap16(g_win16_instance, win16_make_far_pointer(0, 102))); + draw_loading_stage(progress_frame, 29); + write_dgroup_handle(DGROUP_CLAW_BITMAP, load_dat(900)); + draw_loading_stage(progress_frame, 30); + win16_write_u16( + window, WINDOW_MASK_BITMAP_OFFSET, + LoadBitmap16(g_win16_instance, win16_make_far_pointer(0, 101))); + draw_loading_stage(progress_frame, 31); + write_dgroup_handle(DGROUP_BACKGROUND_OVERLAY_A, load_dat(997)); + draw_loading_stage(progress_frame, 32); + write_dgroup_handle(DGROUP_BOARD_DECORATION_BITMAP, load_dat(901)); + draw_loading_stage(progress_frame, 33); + write_dgroup_handle(0x0859, load_dat(600)); + draw_loading_stage(progress_frame, 34); + win16_write_u8(win16_dgroup_pointer(DGROUP_ASSETS_PENDING), 0); + draw_loading_stage(progress_frame, 35); + (void)DeleteObject16(loading_bitmap); + (void)SelectPalette16(destination, previous_palette, 0); + HCURSOR16 arrow = LoadCursor16( + 0, win16_make_far_pointer(0, WIN16_IDC_ARROW)); + (void)SetCursor16(arrow); + } + redraw_scene(window, destination, previous_palette); +} diff --git a/original/reconstructed/tdkpin_borland_files.c b/original/reconstructed/tdkpin_borland_files.c new file mode 100644 index 0000000..20f1b99 --- /dev/null +++ b/original/reconstructed/tdkpin_borland_files.c @@ -0,0 +1,438 @@ +/* Borland Pascal generic file open/close dispatcher. */ + +#include "tdkpin_borland_files.h" + +enum { + FILE_MODE_OFFSET = 2, + FILE_BUFFER_POSITION_OFFSET = 8, + FILE_BUFFER_END_OFFSET = 10, + FILE_OPEN_PROCEDURE_OFFSET = 0x10, + FILE_IN_OUT_PROCEDURE_OFFSET = 0x14, + FILE_CLOSE_PROCEDURE_OFFSET = 0x1c, + IO_ERROR_NOT_CLOSED = 0x66, + IO_ERROR_NOT_OPEN = 0x67, +}; + +/* 1020:05c7 — invoke one far FileProc and publish nonzero AX to IOResult. */ +uint16_t borland_call_file_procedure( + Win16FarPtr record, uint16_t procedure_offset) +{ + Win16FarPtr procedure = + win16_read_far_pointer(record, procedure_offset); + uint16_t result = win16_call_file_procedure(procedure, record); + if (result != 0) { + atomic_store(&g_borland_io_result, result); + } + return result; +} + +/* 1020:0586 — close input/output files; output files flush first. */ +void borland_close_file(Win16FarPtr record) +{ + uint16_t mode = win16_read_u16(win16_far_add_offset( + record, FILE_MODE_OFFSET)); + if (mode == BORLAND_FILE_OUTPUT) { + (void)borland_call_file_procedure( + record, FILE_IN_OUT_PROCEDURE_OFFSET); + } else if (mode != BORLAND_FILE_INPUT) { + atomic_store(&g_borland_io_result, IO_ERROR_NOT_OPEN); + return; + } + (void)borland_call_file_procedure(record, FILE_CLOSE_PROCEDURE_OFFSET); + win16_write_u16(record, FILE_MODE_OFFSET, BORLAND_FILE_CLOSED); +} + +/* 1020:0534 — common Reset/Rewrite entry selected by DX. */ +void borland_open_file(Win16FarPtr record, uint16_t mode) +{ + uint16_t current = win16_read_u16(win16_far_add_offset( + record, FILE_MODE_OFFSET)); + if (current == BORLAND_FILE_INPUT || current == BORLAND_FILE_OUTPUT) { + borland_close_file(record); + } else if (current != BORLAND_FILE_CLOSED) { + atomic_store(&g_borland_io_result, IO_ERROR_NOT_CLOSED); + return; + } + + win16_write_u16(record, FILE_MODE_OFFSET, mode); + win16_write_u16(record, FILE_BUFFER_POSITION_OFFSET, 0); + win16_write_u16(record, FILE_BUFFER_END_OFFSET, 0); + if (borland_call_file_procedure( + record, FILE_OPEN_PROCEDURE_OFFSET) != 0) { + win16_write_u16(record, FILE_MODE_OFFSET, BORLAND_FILE_CLOSED); + } +} + +/* 1020:0527/052c — five-byte mode-selecting tail entries. */ +void borland_reset_file(Win16FarPtr record) +{ + borland_open_file(record, BORLAND_FILE_INPUT); +} + +void borland_rewrite_file(Win16FarPtr record) +{ + borland_open_file(record, BORLAND_FILE_OUTPUT); +} + +/* 1020:05d8 — DOS AH=3f buffered read. */ +uint16_t borland_file_read_buffer(Win16FarPtr record) +{ + uint16_t handle = win16_read_u16(record); + uint16_t count = win16_read_u16(win16_far_add_offset(record, 4)); + Win16FarPtr buffer = win16_read_far_pointer(record, 12); + Win16DosResult result = win16_dos_read(handle, buffer, count); + win16_write_u16(record, 10, result.carry ? 0 : result.ax); + win16_write_u16(record, 8, 0); + return result.carry ? result.ax : 0; +} + +static Win16DosResult write_pending_bytes(Win16FarPtr record) +{ + uint16_t count = win16_exchange_u16( + win16_far_add_offset(record, 8), 0); + uint16_t handle = win16_read_u16(record); + Win16FarPtr buffer = win16_read_far_pointer(record, 12); + Win16DosResult result = win16_dos_write(handle, buffer, count); + if (!result.carry && result.ax != count) { + result.ax = 0x65; + result.carry = true; + } + return result; +} + +/* 1020:0608 — buffered flush with short-write detection. */ +uint16_t borland_file_flush_buffer(Win16FarPtr record) +{ + Win16DosResult result = write_pending_bytes(record); + return result.carry ? result.ax : 0; +} + +/* 1020:062d — same DOS write, but only carry is an error. */ +uint16_t borland_file_write_buffer(Win16FarPtr record) +{ + uint16_t count = win16_exchange_u16( + win16_far_add_offset(record, 8), 0); + Win16DosResult result = win16_dos_write( + win16_read_u16(record), win16_read_far_pointer(record, 12), count); + return result.carry ? result.ax : 0; +} + +/* 1020:064d — preserve DOS standard handles 0..4; close larger handles. */ +uint16_t borland_file_close_handle(Win16FarPtr record) +{ + uint16_t handle = win16_read_u16(record); + if (handle <= 4) { + return 0; + } + Win16DosResult result = win16_dos_close(handle); + return result.carry ? result.ax : 0; +} + +/* 1020:0751 — generic files must be in open sentinel mode 0xd7b3. */ +bool borland_validate_open_file(Win16FarPtr record) +{ + if (win16_read_u16(win16_far_add_offset(record, 2)) == 0xd7b3) { + return true; + } + atomic_store(&g_borland_io_result, 0x67); + return false; +} + +/* 1020:0710 — DOS zero-byte write truncates at the current file position. */ +void borland_truncate_file(Win16FarPtr record) +{ + if (!borland_validate_open_file(record)) { + return; + } + uint16_t indeterminate = win16_indeterminate_u16(); + Win16DosResult result = win16_dos_write( + win16_read_u16(record), + win16_make_far_pointer(indeterminate, indeterminate), + 0); + if (result.carry) { + atomic_store(&g_borland_io_result, result.ax); + } +} + +/* 1020:072c — close a valid generic file and always mark it closed. */ +void borland_close_generic_file(Win16FarPtr record) +{ + if (!borland_validate_open_file(record)) { + return; + } + uint16_t handle = win16_read_u16(record); + if (handle > 4) { + Win16DosResult result = win16_dos_close(handle); + if (result.carry) { + atomic_store(&g_borland_io_result, result.ax); + } + } + win16_write_u16(record, 2, BORLAND_FILE_CLOSED); +} + +static void transfer_one_record( + Win16FarPtr buffer, Win16FarPtr record, bool write) +{ + if (!borland_validate_open_file(record)) { + return; + } + uint16_t bytes = win16_read_u16(win16_far_add_offset(record, 4)); + Win16DosResult result = write + ? win16_dos_write(win16_read_u16(record), buffer, bytes) + : win16_dos_read(win16_read_u16(record), buffer, bytes); + if (result.carry) { + atomic_store(&g_borland_io_result, result.ax); + } else if (result.ax != bytes) { + atomic_store(&g_borland_io_result, write ? 0x65 : 0x64); + } +} + +void borland_file_read_record(Win16FarPtr buffer, Win16FarPtr record) +{ + transfer_one_record(buffer, record, false); +} + +void borland_file_write_record(Win16FarPtr buffer, Win16FarPtr record) +{ + transfer_one_record(buffer, record, true); +} + +static void transfer_record_block( + Win16FarPtr result_count, + uint16_t requested_records, + Win16FarPtr buffer, + Win16FarPtr record, + bool write) +{ + uint16_t records_transferred = 0; + if (borland_validate_open_file(record)) { + uint16_t record_size = + win16_read_u16(win16_far_add_offset(record, 4)); + if (requested_records != 0) { + uint16_t byte_count = + (uint16_t)((uint32_t)requested_records * record_size); + Win16DosResult result = write + ? win16_dos_write( + win16_read_u16(record), buffer, byte_count) + : win16_dos_read( + win16_read_u16(record), buffer, byte_count); + if (result.carry) { + atomic_store(&g_borland_io_result, result.ax); + goto publish; + } + if (record_size == 0) { + win16_integer_divide_fault(); + } + records_transferred = (uint16_t)(result.ax / record_size); + } + if (result_count == 0 && records_transferred != requested_records) { + atomic_store(&g_borland_io_result, write ? 0x65 : 0x64); + } + } + +publish: + if (result_count != 0) { + win16_write_u16(result_count, 0, records_transferred); + } +} + +void borland_file_block_read( + Win16FarPtr result_count, + uint16_t requested_records, + Win16FarPtr buffer, + Win16FarPtr record) +{ + transfer_record_block( + result_count, requested_records, buffer, record, false); +} + +void borland_file_block_write( + Win16FarPtr result_count, + uint16_t requested_records, + Win16FarPtr buffer, + Win16FarPtr record) +{ + transfer_record_block( + result_count, requested_records, buffer, record, true); +} + +void borland_file_seek_record(uint32_t record_index, Win16FarPtr record) +{ + if (!borland_validate_open_file(record)) { + return; + } + uint16_t record_size = + win16_read_u16(win16_far_add_offset(record, 4)); + uint32_t byte_offset = record_index * record_size; + Win16DosResult result = + win16_dos_seek(win16_read_u16(record), byte_offset, 0); + if (result.carry) { + atomic_store(&g_borland_io_result, result.ax); + } +} + +static void open_or_create_generic_file( + uint16_t record_size, Win16FarPtr record, bool create) +{ + uint16_t mode = win16_read_u16(win16_far_add_offset(record, 2)); + if (mode == 0xd7b3) { + borland_close_generic_file(record); + } else if (mode != BORLAND_FILE_CLOSED) { + atomic_store(&g_borland_io_result, 0x66); + return; + } + + Win16FarPtr name = win16_far_add_offset(record, 48); + Win16DosResult result; + if (win16_read_u8(name) == 0) { + result = (Win16DosResult){create ? 1 : 0, false}; + } else { + result = create + ? win16_dos_create(name, 0) + : win16_dos_open(name, g_borland_file_mode); + if (result.carry) { + atomic_store(&g_borland_io_result, result.ax); + return; + } + } + win16_write_u16(record, 2, 0xd7b3); + win16_write_u16(record, 0, result.ax); + win16_write_u16(record, 4, record_size); +} + +void borland_open_generic_file(uint16_t record_size, Win16FarPtr record) +{ + open_or_create_generic_file(record_size, record, false); +} + +void borland_create_generic_file(uint16_t record_size, Win16FarPtr record) +{ + open_or_create_generic_file(record_size, record, true); +} + +/* + * 1020:0c76 -- when Append opens an ordinary DOS file, inspect only its last + * 128 bytes and remove the first DOS text EOF marker (Ctrl-Z) found there. + * Every INT 21h error is deliberately ignored by the original helper. + */ +void borland_text_truncate_at_ctrl_z(Win16FarPtr record) +{ + uint16_t handle = win16_read_u16(record); + Win16DosExtendedResult end = + win16_dos_seek_extended(handle, 0, 2); + uint32_t file_size = ((uint32_t)end.dx << 16) | end.ax; + uint32_t scan_start = file_size >= 128 ? file_size - 128 : 0; + + (void)win16_dos_seek_extended(handle, scan_start, 0); + Win16FarPtr buffer = win16_far_add_offset(record, 0x80); + Win16DosResult read = win16_dos_read(handle, buffer, 128); + uint16_t bytes_read = read.carry ? 0 : read.ax; + + for (uint16_t index = 0; index != bytes_read; index++) { + if (win16_read_u8(win16_far_add_offset(buffer, index)) != 0x1a) { + continue; + } + + /* CX:DX = FFFF:(index-bytes_read), exactly as the 16-bit SUB forms it. */ + uint32_t relative_offset = + 0xffff0000u | (uint16_t)(index - bytes_read); + Win16DosExtendedResult position = + win16_dos_seek_extended(handle, relative_offset, 2); + Win16FarPtr ignored_buffer = win16_make_far_pointer( + win16_far_selector(record), position.dx); + (void)win16_dos_write(handle, ignored_buffer, 0); + return; + } +} + +static void write_text_procedure( + Win16FarPtr record, uint16_t offset, Win16FarPtr procedure) +{ + win16_write_u16(record, offset, win16_far_offset(procedure)); + win16_write_u16( + record, + (uint16_t)(offset + 2), + win16_far_selector(procedure)); +} + +/* + * 1020:0be9 -- TextRec OpenFunc. The incoming mode selects Reset (input), + * Rewrite (create output), or Append (read/write output). On success it + * installs the relocated Borland buffer callbacks used by the generic text + * dispatcher. DOS character devices use the unbuffered write callback in + * both InOutFunc and FlushFunc; ordinary files use the buffered flush callback + * in InOutFunc and a null FlushFunc. + */ +uint16_t borland_open_text_record(Win16FarPtr record) +{ + enum { + TEXTREC_MODE_OFFSET = 2, + TEXTREC_NAME_OFFSET = 0x30, + TEXTREC_IN_OUT_PROCEDURE_OFFSET = 0x14, + TEXTREC_FLUSH_PROCEDURE_OFFSET = 0x18, + TEXTREC_CLOSE_PROCEDURE_OFFSET = 0x1c, + BORLAND_READ_BUFFER_OFFSET = 0x05d8, + BORLAND_FLUSH_BUFFER_OFFSET = 0x0608, + BORLAND_WRITE_BUFFER_OFFSET = 0x062d, + BORLAND_CLOSE_HANDLE_OFFSET = 0x064d, + }; + + uint16_t mode = win16_read_u16( + win16_far_add_offset(record, TEXTREC_MODE_OFFSET)); + uint16_t default_handle = mode == BORLAND_FILE_INPUT ? 0 : 1; + win16_write_u16(record, 0, default_handle); + + Win16FarPtr name = win16_far_add_offset(record, TEXTREC_NAME_OFFSET); + if (win16_read_u8(name) != 0) { + Win16DosResult opened; + if (mode == BORLAND_FILE_INPUT) { + opened = win16_dos_open(name, 0); + } else if (mode == BORLAND_TEXT_APPEND) { + opened = win16_dos_open(name, 2); + } else { + opened = win16_dos_create(name, 0); + } + if (opened.carry) { + return opened.ax; + } + win16_write_u16(record, 0, opened.ax); + } + + Win16FarPtr in_out_procedure = win16_relocated_code_pointer( + 5, BORLAND_READ_BUFFER_OFFSET); + Win16FarPtr flush_procedure = 0; + + if (mode != BORLAND_FILE_INPUT) { + Win16DosExtendedResult device = win16_dos_get_device_info( + win16_read_u16(record)); + if ((device.dx & 0x0080u) != 0) { + in_out_procedure = win16_relocated_code_pointer( + 5, BORLAND_WRITE_BUFFER_OFFSET); + flush_procedure = in_out_procedure; + } else { + if (mode == BORLAND_TEXT_APPEND) { + borland_text_truncate_at_ctrl_z(record); + } + in_out_procedure = win16_relocated_code_pointer( + 5, BORLAND_FLUSH_BUFFER_OFFSET); + } + win16_write_u16(record, TEXTREC_MODE_OFFSET, BORLAND_FILE_OUTPUT); + } + + write_text_procedure( + record, TEXTREC_IN_OUT_PROCEDURE_OFFSET, in_out_procedure); + write_text_procedure( + record, TEXTREC_FLUSH_PROCEDURE_OFFSET, flush_procedure); + write_text_procedure( + record, + TEXTREC_CLOSE_PROCEDURE_OFFSET, + win16_relocated_code_pointer(5, BORLAND_CLOSE_HANDLE_OFFSET)); + return 0; +} + +/* 1008:2374 — stored FileProc callback; receiver ignored, AX=0. */ +uint16_t tdkpin_file_close_noop(Win16FarPtr record) +{ + (void)record; + return 0; +} diff --git a/original/reconstructed/tdkpin_borland_files.h b/original/reconstructed/tdkpin_borland_files.h new file mode 100644 index 0000000..09f0fa0 --- /dev/null +++ b/original/reconstructed/tdkpin_borland_files.h @@ -0,0 +1,60 @@ +#ifndef TDKPIN_BORLAND_FILES_H +#define TDKPIN_BORLAND_FILES_H + +#include "tdkpin_borland_runtime.h" + +enum BorlandFileMode { + BORLAND_FILE_CLOSED = 0xd7b0, + BORLAND_FILE_INPUT = 0xd7b1, + BORLAND_FILE_OUTPUT = 0xd7b2, + BORLAND_TEXT_APPEND = 0xd7b3, + BORLAND_GENERIC_FILE_OPEN = 0xd7b3, +}; + +void borland_reset_file(Win16FarPtr record); /* 1020:0527 */ +void borland_rewrite_file(Win16FarPtr record); /* 1020:052c */ +void borland_open_file( + Win16FarPtr record, uint16_t mode); /* 1020:0534 */ +void borland_close_file(Win16FarPtr record); /* 1020:0586 */ +uint16_t borland_call_file_procedure( + Win16FarPtr record, uint16_t procedure_offset); /* 1020:05c7 */ + +uint16_t win16_call_file_procedure( + Win16FarPtr procedure, Win16FarPtr record); + +uint16_t borland_file_read_buffer(Win16FarPtr record); /* 1020:05d8 */ +uint16_t borland_file_flush_buffer(Win16FarPtr record); /* 1020:0608 */ +uint16_t borland_file_write_buffer(Win16FarPtr record); /* 1020:062d */ +uint16_t borland_file_close_handle(Win16FarPtr record); /* 1020:064d */ +bool borland_validate_open_file(Win16FarPtr record); /* 1020:0751 */ +void borland_truncate_file(Win16FarPtr record); /* 1020:0710 */ +void borland_close_generic_file(Win16FarPtr record); /* 1020:072c */ +void borland_file_read_record( + Win16FarPtr buffer, Win16FarPtr record); /* 1020:0760 */ +void borland_file_write_record( + Win16FarPtr buffer, Win16FarPtr record); /* shared 1020:0765 */ +void borland_file_block_read( + Win16FarPtr result_count, + uint16_t requested_records, + Win16FarPtr buffer, + Win16FarPtr record); /* 1020:0796 */ +void borland_file_block_write( + Win16FarPtr result_count, + uint16_t requested_records, + Win16FarPtr buffer, + Win16FarPtr record); /* shared 1020:079b */ +void borland_file_seek_record( + uint32_t record_index, Win16FarPtr record); /* 1020:07fe */ +void borland_open_generic_file( + uint16_t record_size, Win16FarPtr record); /* 1020:06ab */ +void borland_create_generic_file( + uint16_t record_size, Win16FarPtr record); /* shared 1020:06b4 */ +uint16_t borland_open_text_record( + Win16FarPtr record); /* 1020:0be9 */ +void borland_text_truncate_at_ctrl_z( + Win16FarPtr record); /* 1020:0c76 */ +uint16_t tdkpin_file_close_noop(Win16FarPtr record); /* 1008:2374 */ + +extern uint8_t g_borland_file_mode; /* 1028:0727 */ + +#endif diff --git a/original/reconstructed/tdkpin_borland_objects.c b/original/reconstructed/tdkpin_borland_objects.c new file mode 100644 index 0000000..f231333 --- /dev/null +++ b/original/reconstructed/tdkpin_borland_objects.c @@ -0,0 +1,103 @@ +/* Borland Pascal object construction and destruction protocol. */ + +#include "tdkpin_borland_objects.h" + +/* + * 1020:03ef — constructor entry helper. + * + * The VMT is a near DGROUP pointer. Its first word is the instance size, and + * DI in the register ABI supplies the offset of the object's VMT field. For an + * already allocated object the helper clears the caller's hidden VMT argument; + * compiler-generated failure cleanup uses that mutation to avoid freeing an + * object which it did not allocate. + */ +bool borland_enter_object_constructor( + BorlandObjectCallFrame *frame, uint16_t vmt_field_offset) +{ + uint16_t vmt = frame->vmt_argument; + if (vmt == 0) { + return true; + } + + if (frame->object != 0) { + frame->vmt_argument = 0; + } else { + uint16_t object_size = win16_read_u16(win16_dgroup_pointer(vmt)); + BorlandAllocationAttempt allocation = + borland_try_get_mem(object_size); + if (allocation.failed) { + borland_runtime_error(203); + } + if (allocation.block == 0) { + return false; + } + frame->object = allocation.block; + } + + win16_write_u16( + frame->object, vmt_field_offset, vmt); + return true; +} + +/* + * 1020:0439 — destructor exit helper. A nonzero hidden VMT argument says that + * this destructor invocation owns the allocation. The size is recovered from + * the VMT currently installed in the object, then the caller's object pointer + * is cleared after a successful release. + */ +void borland_finish_object_destructor( + BorlandObjectCallFrame *frame, uint16_t vmt_field_offset) +{ + if (frame->vmt_argument == 0) { + return; + } + + uint16_t vmt = win16_read_u16(win16_far_add_offset( + frame->object, vmt_field_offset)); + uint16_t object_size = win16_read_u16(win16_dgroup_pointer(vmt)); + if (borland_try_free_mem(frame->object, object_size)) { + borland_runtime_error(204); + } + frame->object = 0; +} + +/* 1008:2d99 — the root object's constructor has its VMT field at offset zero. */ +Win16FarPtr borland_default_object_constructor( + Win16FarPtr object, uint16_t vmt) +{ + BorlandObjectCallFrame frame = {object, vmt}; + borland_enter_object_constructor(&frame, 0); + return frame.object; +} + +/* 1008:2dcd — root destructor cleanup with the VMT field at offset zero. */ +void borland_default_object_destructor(Win16FarPtr object, uint16_t vmt) +{ + BorlandObjectCallFrame frame = {object, vmt}; + borland_finish_object_destructor(&frame, 0); +} + +/* + * 1008:2db3 — Pascal Dispose: call VMT slot +8 with hidden dispose mode 1. + * The virtual destructor itself ultimately reaches 1020:0439 and frees the + * allocation according to the VMT size. + */ +void borland_dispose_object(Win16FarPtr object) +{ + uint16_t vmt = win16_read_u16(object); + Win16FarPtr destructor = + win16_read_far_pointer(win16_dgroup_pointer(vmt), 8); + win16_call_object_destructor(destructor, object, 1); +} + +/* 1008:2d87 — Borland's abstract virtual-method trap. */ +_Noreturn void borland_abstract_method_error(void) +{ + borland_runtime_error(211); +} + +/* 1018:0d8a — ObjectWindows abstract slot forwarding to the Borland trap. */ +_Noreturn void object_windows_abstract_method(void) +{ + borland_abstract_method_error(); +} diff --git a/original/reconstructed/tdkpin_borland_objects.h b/original/reconstructed/tdkpin_borland_objects.h new file mode 100644 index 0000000..b0984a6 --- /dev/null +++ b/original/reconstructed/tdkpin_borland_objects.h @@ -0,0 +1,27 @@ +#ifndef TDKPIN_BORLAND_OBJECTS_H +#define TDKPIN_BORLAND_OBJECTS_H + +#include "tdkpin_borland_runtime.h" + +/* Mutable hidden stack fields used by Borland constructor/destructor calls. */ +typedef struct { + Win16FarPtr object; + uint16_t vmt_argument; +} BorlandObjectCallFrame; + +bool borland_enter_object_constructor( + BorlandObjectCallFrame *frame, + uint16_t vmt_field_offset); /* 1020:03ef */ +void borland_finish_object_destructor( + BorlandObjectCallFrame *frame, + uint16_t vmt_field_offset); /* 1020:0439 */ + +Win16FarPtr borland_default_object_constructor( + Win16FarPtr object, uint16_t vmt); /* 1008:2d99 */ +void borland_default_object_destructor( + Win16FarPtr object, uint16_t vmt); /* 1008:2dcd */ +void borland_dispose_object(Win16FarPtr object); /* 1008:2db3 */ +_Noreturn void borland_abstract_method_error(void); /* 1008:2d87 */ +_Noreturn void object_windows_abstract_method(void); /* 1018:0d8a */ + +#endif diff --git a/original/reconstructed/tdkpin_borland_records.c b/original/reconstructed/tdkpin_borland_records.c new file mode 100644 index 0000000..5ba247e --- /dev/null +++ b/original/reconstructed/tdkpin_borland_records.c @@ -0,0 +1,123 @@ +/* Borland VMT validation and text/file record initialization. */ + +#include "tdkpin_borland_records.h" + +enum { + TEXTREC_NAME_OFFSET = 48, + TEXTREC_NAME_CAPACITY = 79, + TEXTREC_BUFFER_OFFSET = 128, + TEXTREC_DEFAULT_BUFFER_BYTES = 128, + TEXTREC_CLOSED_SENTINEL = 0xd7b0, + TEXTREC_OPEN_PROC_OFFSET = 0x0be9, +}; + +/* 1020:048f — Runtime Error 210 unless size and negative size form a VMT. */ +void borland_validate_vmt_descriptor(Win16FarPtr vmt) +{ + uint16_t size = win16_read_u16(vmt); + int16_t negative_size = + (int16_t)win16_read_u16(win16_far_add_offset(vmt, 2)); + if (size == 0 || (uint16_t)(size + (uint16_t)negative_size) != 0) { + borland_runtime_error(210); + } +} + +static void initialize_text_record( + Win16FarPtr name, Win16FarPtr record, bool short_string) +{ + win16_write_u16(record, 0, 0); + win16_write_u16(record, 2, TEXTREC_CLOSED_SENTINEL); + win16_write_u16(record, 4, TEXTREC_DEFAULT_BUFFER_BYTES); + win16_write_u16(record, 6, 0); + win16_write_u16(record, 8, 0); + win16_write_u16(record, 10, 0); + Win16FarPtr buffer = win16_far_add_offset(record, TEXTREC_BUFFER_OFFSET); + win16_write_u16(record, 12, win16_far_offset(buffer)); + win16_write_u16(record, 14, win16_far_selector(buffer)); + Win16FarPtr open_procedure = + win16_relocated_code_pointer(5, TEXTREC_OPEN_PROC_OFFSET); + win16_write_u16(record, 16, win16_far_offset(open_procedure)); + win16_write_u16(record, 18, win16_far_selector(open_procedure)); + for (uint16_t offset = 20; offset < TEXTREC_NAME_OFFSET; offset += 2) { + win16_write_u16(record, offset, 0); + } + + uint16_t maximum = TEXTREC_NAME_CAPACITY; + uint16_t source_offset = 0; + if (short_string) { + uint8_t length = win16_read_u8(name); + source_offset = 1; + if (length < maximum) { + maximum = length; + } + } + uint16_t copied = 0; + while (copied < maximum) { + uint8_t byte = win16_read_u8( + win16_far_add_offset(name, (uint16_t)(source_offset + copied))); + if (byte == 0) { + break; + } + win16_write_u8( + win16_far_add_offset( + record, (uint16_t)(TEXTREC_NAME_OFFSET + copied)), + byte); + copied++; + } + Win16FarPtr destination = win16_far_add_offset(record, TEXTREC_NAME_OFFSET); + win16_write_u8(win16_far_add_offset(destination, copied), 0); + (void)AnsiToOem16(destination, destination); +} + +/* 1020:049f — C-string entry; MOV DX,0xd233 forces the non-short branch. */ +void borland_assign_text_c(Win16FarPtr name, Win16FarPtr record) +{ + initialize_text_record(name, record, false); +} + +/* 1020:04a0 — overlapping XOR DX,DX entry for Turbo Pascal ShortString. */ +void borland_assign_text_short(Win16FarPtr name, Win16FarPtr record) +{ + initialize_text_record(name, record, true); +} + +/* 1020:04fc — initialize five exact fields of a generic file record. */ +void borland_initialize_file_record( + uint16_t field_04, + uint16_t field_0c, + uint16_t field_0e, + Win16FarPtr record) +{ + win16_write_u16(record, 4, field_04); + win16_write_u16(record, 12, field_0c); + win16_write_u16(record, 14, field_0e); + win16_write_u16(record, 8, 0); + win16_write_u16(record, 10, 0); +} + +/* 1020:0667 — initialize FileRec and copy one Pascal ShortString name. */ +void borland_assign_file_short(Win16FarPtr name, Win16FarPtr record) +{ + win16_write_u16(record, 0, 0); + win16_write_u16(record, 2, TEXTREC_CLOSED_SENTINEL); + for (uint16_t offset = 4; offset < TEXTREC_NAME_OFFSET; offset += 2) { + win16_write_u16(record, offset, 0); + } + uint16_t length = win16_read_u8(name); + if (length > TEXTREC_NAME_CAPACITY) { + length = TEXTREC_NAME_CAPACITY; + } + Win16FarPtr destination = win16_far_add_offset(record, TEXTREC_NAME_OFFSET); + uint16_t copied = 0; + while (copied < length) { + uint8_t byte = win16_read_u8( + win16_far_add_offset(name, (uint16_t)(copied + 1))); + if (byte == 0) { + break; + } + win16_write_u8(win16_far_add_offset(destination, copied), byte); + copied++; + } + win16_write_u8(win16_far_add_offset(destination, copied), 0); + (void)AnsiToOem16(destination, destination); +} diff --git a/original/reconstructed/tdkpin_borland_records.h b/original/reconstructed/tdkpin_borland_records.h new file mode 100644 index 0000000..3c2abfc --- /dev/null +++ b/original/reconstructed/tdkpin_borland_records.h @@ -0,0 +1,59 @@ +#ifndef TDKPIN_BORLAND_RECORDS_H +#define TDKPIN_BORLAND_RECORDS_H + +#include "tdkpin_borland_runtime.h" + +#pragma pack(push, 1) +typedef struct { + uint16_t handle; + uint16_t mode; + uint16_t buffer_size; + uint16_t buffer_position; + uint16_t buffer_end; + uint16_t reserved_word_0a; + Win16FarPtr buffer; + Win16FarPtr open_procedure; + Win16FarPtr in_out_procedure; + Win16FarPtr flush_procedure; + Win16FarPtr close_procedure; + uint8_t user_data[16]; + char name[80]; +} BorlandTextRecordHeader; +#pragma pack(pop) + +_Static_assert( + sizeof(BorlandTextRecordHeader) == 128, + "Borland TextRec header layout drift"); +_Static_assert( + offsetof(BorlandTextRecordHeader, buffer) == 0x0c, + "Borland TextRec buffer pointer offset drift"); +_Static_assert( + offsetof(BorlandTextRecordHeader, open_procedure) == 0x10, + "Borland TextRec OpenFunc offset drift"); +_Static_assert( + offsetof(BorlandTextRecordHeader, in_out_procedure) == 0x14, + "Borland TextRec InOutFunc offset drift"); +_Static_assert( + offsetof(BorlandTextRecordHeader, flush_procedure) == 0x18, + "Borland TextRec FlushFunc offset drift"); +_Static_assert( + offsetof(BorlandTextRecordHeader, close_procedure) == 0x1c, + "Borland TextRec CloseFunc offset drift"); +_Static_assert( + offsetof(BorlandTextRecordHeader, name) == 0x30, + "Borland TextRec name offset drift"); + +void borland_validate_vmt_descriptor(Win16FarPtr vmt); /* 1020:048f */ +void borland_assign_text_c( + Win16FarPtr name, Win16FarPtr record); /* 1020:049f */ +void borland_assign_text_short( + Win16FarPtr name, Win16FarPtr record); /* shared 1020:04a0 */ +void borland_initialize_file_record( + uint16_t field_04, + uint16_t field_0c, + uint16_t field_0e, + Win16FarPtr record); /* 1020:04fc */ +void borland_assign_file_short( + Win16FarPtr name, Win16FarPtr record); /* 1020:0667 */ + +#endif diff --git a/original/reconstructed/tdkpin_borland_runtime.c b/original/reconstructed/tdkpin_borland_runtime.c new file mode 100644 index 0000000..1ce0327 --- /dev/null +++ b/original/reconstructed/tdkpin_borland_runtime.c @@ -0,0 +1,298 @@ +/* + * Address-linked Borland Win16 runtime termination support from TDKPIN.EXE. + * Functions: 1020:0061, 1020:00d2, and 1020:00f0. + */ + +#include "tdkpin_borland_runtime.h" + +enum { + DGROUP_RUNTIME_ERROR_TEXT = 0x0728, + RUNTIME_ERROR_DECIMAL_END = 0x0739, + RUNTIME_ERROR_SEGMENT_END = 0x0741, + RUNTIME_ERROR_OFFSET_END = 0x0746, + RUNTIME_ERROR_MESSAGEBOX_FLAGS = 0x1010, +}; + +extern Win16FarPtr g_borland_exit_proc; /* 1028:0712/0714 */ +extern uint16_t g_borland_exit_code_word; /* 1028:0716/0717 */ +extern uint16_t g_borland_error_offset; /* 1028:0718 */ +extern uint16_t g_borland_error_segment; /* 1028:071a */ +extern uint16_t g_borland_windows_mode; /* 1028:071c */ +extern char g_borland_runtime_error_text[32]; /* 1028:0728..0747 */ + +/* 1020:012d — checked GetMem wrapper; allocation failure is Runtime Error 203. */ +Win16FarPtr borland_get_mem(uint16_t bytes) +{ + BorlandAllocationAttempt attempt = borland_try_get_mem(bytes); + if (attempt.failed) { + borland_runtime_error(203); + } + return attempt.block; +} + +/* 1020:0147 — checked FreeMem wrapper; invalid release is Runtime Error 204. */ +void borland_free_mem(Win16FarPtr block, uint16_t bytes) +{ + if (borland_try_free_mem(block, bytes)) { + borland_runtime_error(204); + } +} + +/* 1020:0222 — GlobalAlloc16 followed by GlobalLock16 on nonzero handle. */ +Win16FarPtr borland_global_allocate(uint16_t bytes) +{ + HGLOBAL16 allocation = GlobalAlloc16(g_borland_global_alloc_flags, bytes); + return allocation == 0 ? 0 : GlobalLock16(allocation); +} + +uint16_t borland_take_io_result(void) +{ + return atomic_exchange_explicit( + &g_borland_io_result, 0, memory_order_seq_cst); +} + +void borland_require_io_success(void) +{ + uint16_t result = atomic_load_explicit( + &g_borland_io_result, memory_order_seq_cst); + if (result != 0) { + borland_runtime_error(result); + } +} + +void borland_check_int32_range( + int32_t value, const BorlandInt32Range *range) +{ + if (value < range->minimum || value > range->maximum) { + borland_runtime_error(201); + } +} + +_Noreturn void borland_runtime_error_215(void) +{ + borland_runtime_error(215); +} + +/* 1008:2de0 — AL=1 exactly when the emergency reserve far pointer is null. */ +bool borland_heap_reserve_is_unallocated(void) +{ + return g_borland_heap_reserve == 0; +} + +/* 1008:2dff — allocate the configured reserve only when it is absent. */ +void borland_ensure_heap_reserve(void) +{ + if (borland_heap_reserve_is_unallocated()) { + g_borland_heap_reserve = borland_get_mem(g_borland_heap_reserve_bytes); + } +} + +/* + * 1008:2e22 — Borland heap-error callback. + * 0 means no reserve was available, 1 suppresses release, and 2 tells the + * allocator to retry after the reserve has been freed. The zero-size entry is + * not used by the allocator and returns the same indeterminate word as the + * binary's uninitialized local. + */ +uint16_t borland_release_heap_reserve_on_oom(uint16_t requested_bytes) +{ + if (requested_bytes == 0) { + return win16_indeterminate_u16(); + } + if (g_borland_heap_reserve_disabled) { + return 1; + } + if (borland_heap_reserve_is_unallocated()) { + return 0; + } + + borland_free_mem(g_borland_heap_reserve, g_borland_heap_reserve_bytes); + g_borland_heap_reserve = 0; + return 2; +} + +/* 1008:2e76 — provision the reserve and publish the retry callback. */ +void borland_initialize_heap_reserve(void) +{ + borland_ensure_heap_reserve(); + g_borland_heap_error_handler = win16_relocated_code_pointer(2, 0x2e22); +} + +/* 1020:16c9 — CLD plus REP STOSB over one far destination. */ +void borland_fill_bytes(Win16FarPtr destination, uint16_t count, uint8_t value) +{ + win16_fill_bytes(destination, count, value); +} + +/* + * 1020:16a5 — Borland System.Move over two far pointers. + * + * The original compares only SI and DI, not their selectors, before choosing + * CLD or STD. Copying backwards across distinct segments is harmless but is a + * real observable detail of the routine. All address arithmetic wraps at the + * 16-bit offset boundary exactly as the 8086 registers do. + */ +void borland_move_bytes( + Win16FarPtr destination, Win16FarPtr source, uint16_t count) +{ + uint16_t source_selector = win16_far_selector(source); + uint16_t destination_selector = win16_far_selector(destination); + uint16_t source_offset = win16_far_offset(source); + uint16_t destination_offset = win16_far_offset(destination); + + if (source_offset >= destination_offset) { + while (count != 0) { + uint8_t byte = win16_read_u8( + win16_make_far_pointer(source_selector, source_offset)); + win16_write_u8( + win16_make_far_pointer( + destination_selector, destination_offset), + byte); + source_offset++; + destination_offset++; + count--; + } + return; + } + + source_offset = (uint16_t)(source_offset + count - 1u); + destination_offset = (uint16_t)(destination_offset + count - 1u); + while (count != 0) { + uint8_t byte = win16_read_u8( + win16_make_far_pointer(source_selector, source_offset)); + win16_write_u8( + win16_make_far_pointer(destination_selector, destination_offset), + byte); + source_offset--; + destination_offset--; + count--; + } +} + +/* + * 1020:046c — copy one compiler-described record. + * + * A near descriptor pointer lives at destination + descriptor_field_offset; + * its first DGROUP word is the record byte length. The binary saves that near + * pointer, performs a forward far copy onto the start of the destination, and + * writes the descriptor pointer back because the copied bytes may overlap it. + */ +void borland_copy_typed_record( + uint16_t descriptor_field_offset, + Win16FarPtr destination, + Win16FarPtr source) +{ + uint16_t destination_selector = win16_far_selector(destination); + uint16_t destination_offset = win16_far_offset(destination); + uint16_t source_selector = win16_far_selector(source); + uint16_t source_offset = win16_far_offset(source); + uint16_t descriptor_address = + (uint16_t)(destination_offset + descriptor_field_offset); + Win16FarPtr descriptor_field = win16_make_far_pointer( + destination_selector, descriptor_address); + uint16_t descriptor_offset = win16_read_u16(descriptor_field); + uint16_t count = win16_read_u16(win16_dgroup_pointer(descriptor_offset)); + + while (count != 0) { + uint8_t byte = win16_read_u8( + win16_make_far_pointer(source_selector, source_offset)); + win16_write_u8( + win16_make_far_pointer( + destination_selector, destination_offset), + byte); + source_offset++; + destination_offset++; + count--; + } + win16_write_u16(descriptor_field, 0, descriptor_offset); +} + +/* 1020:00f0 — prepend AX as unsigned digits in base CX before BX. */ +char *borland_prepend_unsigned(char *end, uint16_t value, uint16_t base) +{ + do { + uint16_t quotient = value / base; + uint8_t digit = (uint8_t)(value % base); + digit = (uint8_t)(digit + (digit < 10 ? '0' : 'A' - 10)); + *--end = (char)digit; + value = quotient; + } while (value != 0); + return end; +} + +/* + * 1020:00d2 — execute the mutable Borland ExitProc chain. + * The binary clears ExitProc and IOResult before each far call and returns each + * callback to 00d2, so a callback may install the next procedure in the chain. + */ +void borland_run_exit_procedures(void) +{ + while (g_borland_exit_proc != 0) { + Win16FarPtr procedure = g_borland_exit_proc; + g_borland_exit_proc = 0; + atomic_store_explicit( + &g_borland_io_result, 0, memory_order_seq_cst); + win16_call_exit_proc(procedure); + } +} + +/* + * 1020:0061 — register-entry Borland Halt. + * The caller supplies the status in AX (only AL is eventually returned to DOS). + */ +static _Noreturn void borland_finish_runtime_exit( + uint16_t status, uint16_t error_offset, uint16_t error_segment) +{ + g_borland_exit_code_word = status; + g_borland_error_offset = error_offset; + g_borland_error_segment = error_segment; + + if (g_borland_windows_mode != 0) { + borland_run_exit_procedures(); + } + if (g_borland_error_offset != 0 || g_borland_error_segment != 0) { + (void)borland_prepend_unsigned( + &g_borland_runtime_error_text[ + RUNTIME_ERROR_DECIMAL_END - DGROUP_RUNTIME_ERROR_TEXT], + (uint8_t)g_borland_exit_code_word, + 10); + (void)borland_prepend_unsigned( + &g_borland_runtime_error_text[ + RUNTIME_ERROR_SEGMENT_END - DGROUP_RUNTIME_ERROR_TEXT], + g_borland_error_segment, + 16); + (void)borland_prepend_unsigned( + &g_borland_runtime_error_text[ + RUNTIME_ERROR_OFFSET_END - DGROUP_RUNTIME_ERROR_TEXT], + g_borland_error_offset, + 16); + (void)MessageBox16( + 0, + win16_dgroup_pointer(DGROUP_RUNTIME_ERROR_TEXT), + 0, + RUNTIME_ERROR_MESSAGEBOX_FLAGS); + } + win16_dos_terminate((uint8_t)g_borland_exit_code_word); +} + +_Noreturn void borland_runtime_exit(uint16_t status) +{ + borland_finish_runtime_exit(status, 0, 0); +} + +/* + * 1020:005d — RuntimeError entry shim. + * It consumes the caller's far return address. Except for selector ffff, the + * word at selector:0000 is the NE logical segment tag recorded in the message. + */ +_Noreturn void borland_runtime_error(uint16_t code) +{ + Win16FarPtr return_address = win16_current_return_address(); + uint16_t selector = win16_far_selector(return_address); + uint16_t segment = selector; + if (return_address != 0 && selector != 0xffff) { + segment = win16_read_u16(win16_make_far_pointer(selector, 0)); + } + borland_finish_runtime_exit( + code, win16_far_offset(return_address), segment); +} diff --git a/original/reconstructed/tdkpin_borland_runtime.h b/original/reconstructed/tdkpin_borland_runtime.h new file mode 100644 index 0000000..bc206fe --- /dev/null +++ b/original/reconstructed/tdkpin_borland_runtime.h @@ -0,0 +1,62 @@ +#ifndef TDKPIN_BORLAND_RUNTIME_H +#define TDKPIN_BORLAND_RUNTIME_H + +#include "tdkpin_segmented.h" + +#include + +Win16FarPtr borland_get_mem(uint16_t bytes); /* 1020:012d */ +Win16FarPtr borland_global_allocate(uint16_t bytes); /* 1020:0222 */ +void borland_free_mem(Win16FarPtr block, uint16_t bytes); /* 1020:0147 */ +void borland_fill_bytes( + Win16FarPtr destination, uint16_t count, uint8_t value); /* 1020:16c9 */ +void borland_move_bytes( + Win16FarPtr destination, + Win16FarPtr source, + uint16_t count); /* 1020:16a5 */ +void borland_copy_typed_record( + uint16_t descriptor_field_offset, + Win16FarPtr destination, + Win16FarPtr source); /* 1020:046c */ +_Noreturn void borland_runtime_exit(uint16_t status); /* 1020:0061 */ +_Noreturn void borland_runtime_error(uint16_t code); /* 1020:005d */ +void borland_run_exit_procedures(void); /* 1020:00d2 */ + +extern Win16FarPtr g_borland_exit_proc; /* 1028:0712/0714 */ +extern uint16_t g_borland_error_offset; /* 1028:0718 */ +extern uint16_t g_borland_error_segment; /* 1028:071a */ + +extern uint16_t g_borland_heap_reserve_bytes; /* 1028:06f4 */ +extern Win16FarPtr g_borland_heap_reserve; /* 1028:06f6/06f8 */ +extern uint8_t g_borland_heap_reserve_disabled; /* 1028:06fa */ +extern Win16FarPtr g_borland_heap_error_handler; /* 1028:070e/0710 */ +extern uint16_t g_borland_global_alloc_flags; /* 1028:070c */ + +bool borland_heap_reserve_is_unallocated(void); /* 1008:2de0 */ +void borland_ensure_heap_reserve(void); /* 1008:2dff */ +uint16_t borland_release_heap_reserve_on_oom(uint16_t requested_bytes); /* 1008:2e22 */ +void borland_initialize_heap_reserve(void); /* 1008:2e76 */ + +extern _Atomic uint16_t g_borland_io_result; /* 1028:071e */ +_Static_assert(sizeof(g_borland_io_result) == 2, "Borland IOResult width drift"); +uint16_t borland_take_io_result(void); /* 1020:0388 */ +void borland_require_io_success(void); /* 1020:038f */ + +typedef struct { + int32_t minimum; + int32_t maximum; +} BorlandInt32Range; + +void borland_check_int32_range( + int32_t value, const BorlandInt32Range *range); /* 1020:039d */ +_Noreturn void borland_runtime_error_215(void); /* 1020:03c5 */ + +typedef struct { + Win16FarPtr block; + bool failed; +} BorlandAllocationAttempt; + +BorlandAllocationAttempt borland_try_get_mem(uint16_t bytes); /* 1020:01ca */ +bool borland_try_free_mem(Win16FarPtr block, uint16_t bytes); /* 1020:02d7 */ + +#endif diff --git a/original/reconstructed/tdkpin_borland_startup.c b/original/reconstructed/tdkpin_borland_startup.c new file mode 100644 index 0000000..a31d35c --- /dev/null +++ b/original/reconstructed/tdkpin_borland_startup.c @@ -0,0 +1,51 @@ +/* Borland Pascal Win16 loader-register capture and runtime startup. */ + +#include "tdkpin_borland_startup.h" + +enum { + WIN_FLAG_CPU_086 = 0x40, + WIN_FLAG_CPU_186 = 0x80, + WIN_FLAG_CPU_286 = 0x02, + BORLAND_HUGE_POINTER_INCREMENT = 8, +}; + +/* + * 1020:0002 -- first Borland runtime call made by ne_program_entry. + * + * The NE loader supplies the process state in registers, so the readable C + * interface packages those registers rather than pretending they were stack + * arguments. The original accepts only nonzero AX and a successful InitApp; + * either failure executes INT 21h/AH=4ch with AL=ff and never returns. + */ +void borland_initialize_win16_runtime( + const BorlandWin16StartupRegisters *registers) +{ + if (registers->loader_ax == 0) { + win16_dos_terminate(0xff); + } + + g_borland_windows_mode = + win16_far_selector(registers->command_line); + g_win16_previous_instance = registers->previous_instance; + g_win16_instance = registers->instance; + g_win16_show_command = registers->show_command; + g_borland_command_line = registers->command_line; + + WaitEvent16(0); + if (InitApp16(g_win16_instance) == 0) { + win16_dos_terminate(0xff); + } + + uint8_t flags = (uint8_t)GetWinFlags16(); + uint16_t cpu_level = 0; + if ((flags & (WIN_FLAG_CPU_086 | WIN_FLAG_CPU_186)) == 0) { + cpu_level++; + if ((flags & WIN_FLAG_CPU_286) == 0) { + cpu_level++; + } + } + g_borland_cpu_level = (uint8_t)cpu_level; + + /* KERNEL ordinal 114 is the imported equate __AHINCR, not a call. */ + g_borland_huge_pointer_increment = BORLAND_HUGE_POINTER_INCREMENT; +} diff --git a/original/reconstructed/tdkpin_borland_startup.h b/original/reconstructed/tdkpin_borland_startup.h new file mode 100644 index 0000000..4945cc2 --- /dev/null +++ b/original/reconstructed/tdkpin_borland_startup.h @@ -0,0 +1,28 @@ +#ifndef TDKPIN_BORLAND_STARTUP_H +#define TDKPIN_BORLAND_STARTUP_H + +#include "tdkpin_segmented.h" + +/* Register contract at the Win16 NE entry before 1020:0002 is called. */ +typedef struct { + uint16_t loader_ax; + Win16FarPtr command_line; /* ES:BX */ + uint16_t show_command; /* DX */ + HINSTANCE16 previous_instance; /* SI */ + HINSTANCE16 instance; /* DI */ +} BorlandWin16StartupRegisters; + +BorlandWin16StartupRegisters InitTask16(void); + +void borland_initialize_win16_runtime( + const BorlandWin16StartupRegisters *registers); /* 1020:0002 */ + +extern HINSTANCE16 g_win16_previous_instance; /* 1028:06fc */ +extern HINSTANCE16 g_win16_instance; /* 1028:06fe */ +extern uint16_t g_win16_show_command; /* 1028:0700 */ +extern Win16FarPtr g_borland_command_line; /* 1028:0702/0704 */ +extern uint16_t g_borland_windows_mode; /* 1028:071c */ +extern uint16_t g_borland_huge_pointer_increment; /* 1028:0724 */ +extern uint8_t g_borland_cpu_level; /* 1028:0726 */ + +#endif diff --git a/original/reconstructed/tdkpin_claw_render.c b/original/reconstructed/tdkpin_claw_render.c new file mode 100644 index 0000000..82e2481 --- /dev/null +++ b/original/reconstructed/tdkpin_claw_render.c @@ -0,0 +1,78 @@ +/* DAT-900 claw animation rendering. */ + +#include "tdkpin_render.h" + +enum { + DGROUP_BACKGROUND_BITMAP = 0x085b, + DGROUP_CLAW_BITMAP = 0x0863, + CLAW_DESTINATION_X = 238, + CLAW_DESTINATION_Y = 47, + CLAW_WIDTH = 100, + CLAW_HEIGHT = 74, + WIN16_SRCCOPY = 0x00cc0020, +}; + +/* + * 1008:0e08 — frame zero restores the background. Frames 1..18 select one of + * two nine-frame horizontal sequences; the byte flag selects the lower/upper + * pair of 74-pixel atlas rows. Both background and destination receive the + * exact same SRCCOPY from DAT 900. + */ +void tdkpin_draw_claw_frame( + uint8_t alternate, uint16_t frame, HDC16 destination) +{ + if (frame == 0) { + tdkpin_restore_background_region_b( + CLAW_HEIGHT, + CLAW_WIDTH, + CLAW_DESTINATION_Y, + CLAW_DESTINATION_X, + destination); + tdkpin_present_background_region( + CLAW_HEIGHT, + CLAW_WIDTH, + CLAW_DESTINATION_Y, + CLAW_DESTINATION_X, + destination); + return; + } + + HDC16 background_dc = CreateCompatibleDC16(destination); + HDC16 claw_dc = CreateCompatibleDC16(destination); + HGDIOBJ16 old_background = SelectObject16( + background_dc, + win16_read_u16(win16_dgroup_pointer(DGROUP_BACKGROUND_BITMAP))); + HGDIOBJ16 old_claw = SelectObject16( + claw_dc, + win16_read_u16(win16_dgroup_pointer(DGROUP_CLAW_BITMAP))); + uint16_t source_y = alternate == 0 ? CLAW_HEIGHT * 2 : 0; + if (frame > 9) { + source_y = (uint16_t)(source_y + CLAW_HEIGHT); + frame = (uint16_t)(frame - 9); + } + uint16_t source_x = (uint16_t)((frame - 1) * CLAW_WIDTH); + (void)BitBlt16( + background_dc, + CLAW_DESTINATION_X, + CLAW_DESTINATION_Y, + CLAW_WIDTH, + CLAW_HEIGHT, + claw_dc, + (INT16)source_x, + (INT16)source_y, + WIN16_SRCCOPY); + (void)BitBlt16( + destination, + CLAW_DESTINATION_X, + CLAW_DESTINATION_Y, + CLAW_WIDTH, + CLAW_HEIGHT, + claw_dc, + (INT16)source_x, + (INT16)source_y, + WIN16_SRCCOPY); + (void)SelectObject16(background_dc, old_background); + (void)SelectObject16(claw_dc, old_claw); + (void)DeleteDC16(claw_dc); + (void)DeleteDC16(background_dc); +} diff --git a/original/reconstructed/tdkpin_collision_events.c b/original/reconstructed/tdkpin_collision_events.c new file mode 100644 index 0000000..b605c95 --- /dev/null +++ b/original/reconstructed/tdkpin_collision_events.c @@ -0,0 +1,285 @@ +/* Bitmask-driven collision event dispatcher from TDKPIN Code1. */ + +#include "tdkpin_collision_events.h" + +#include "tdkpin_arithmetic.h" +#include "tdkpin_random.h" +#include "tdkpin_sound.h" + +static Win16FarPtr caller_receiver(uint16_t caller_bp) +{ + uint16_t offset = win16_read_stack_u16((uint16_t)(caller_bp + 6)); + uint16_t selector = win16_read_stack_u16((uint16_t)(caller_bp + 8)); + return win16_make_far_pointer(selector, offset); +} + +static Win16FarPtr record(uint16_t id) +{ + return win16_dgroup_pointer((uint16_t)(0x095b + id * 0x53u)); +} + +static uint8_t record_active(uint16_t id) +{ + return win16_read_u8(win16_far_add_offset(record(id), 0x34)); +} + +static void set_record_active(uint16_t id, uint8_t active) +{ + win16_write_u8(win16_far_add_offset(record(id), 0x34), active); +} + +static uint16_t record_link(uint16_t id) +{ + return win16_read_u16(win16_far_add_offset(record(id), 0x43)); +} + +static uint16_t player_row_offset(uint16_t item) +{ + return (uint16_t)( + 0x0467 + (uint16_t)g_current_player * 0x14u + item); +} + +static void activate_record_groups( + uint16_t caller_bp, uint16_t first, uint16_t groups) +{ + for (uint16_t group = 0; group < groups; group++) { + uint16_t base = (uint16_t)(first + group * 3u); + set_record_active(base, 1); + set_record_active((uint16_t)(base + 1u), 1); + set_record_active((uint16_t)(base + 2u), 1); + tdkpin_refresh_collision_record(caller_bp, base); + } +} + +static bool group_heads_all_inactive(uint16_t first, uint16_t groups) +{ + for (uint16_t group = 0; group < groups; group++) { + if (record_active((uint16_t)(first + group * 3u)) != 0) { + return false; + } + } + return true; +} + +static void restore_record_bounds_on_dc( + uint16_t id, HDC16 dc) +{ + Win16FarPtr bounds = win16_far_add_offset(record(id), 0x4b); + INT16 left = (INT16)win16_read_u16(bounds); + INT16 top = (INT16)win16_read_u16(win16_far_add_offset(bounds, 2)); + INT16 right = (INT16)win16_read_u16(win16_far_add_offset(bounds, 4)); + INT16 bottom = (INT16)win16_read_u16(win16_far_add_offset(bounds, 6)); + INT16 width = (INT16)(uint16_t)( + (uint16_t)right - (uint16_t)left + 1u); + INT16 height = (INT16)(uint16_t)( + (uint16_t)bottom - (uint16_t)top + 1u); + tdkpin_restore_background_region_a(height, width, top, left, dc); + tdkpin_present_background_region(height, width, top, left, dc); +} + +static void publish_three_record_completion( + uint16_t caller_bp, Win16FarPtr receiver) +{ + win16_write_u8(win16_far_add_offset(receiver, 0x0bdc), 1); + static const uint16_t ids[3] = {153, 6, 154}; + for (uint16_t index = 0; index < 3; index++) { + set_record_active(ids[index], 1); + } + HWND16 window = win16_read_u16(win16_far_add_offset(receiver, 4)); + HDC16 dc = GetDC16(window); + for (uint16_t index = 0; index < 3; index++) { + restore_record_bounds_on_dc(ids[index], dc); + } + (void)ReleaseDC16(window, dc); + (void)caller_bp; +} + +static void handle_sprite_award( + uint16_t caller_bp, Win16FarPtr receiver) +{ + tdkpin_play_sound_if_not_tilted(12); + set_record_active(149, 1); + win16_write_u8(win16_far_add_offset(receiver, (uint16_t)( + 0x00f6 + (uint16_t)g_current_player * 0x00afu)), 1); + tdkpin_restore_record_or_item_a(caller_bp, 149); + Win16FarPtr sprite = win16_dgroup_pointer((uint16_t)( + 0x09a4 + (uint16_t)g_current_player * 2u)); + if (win16_read_u16(win16_dgroup_pointer(0x399a)) != 0) { + win16_write_u16(sprite, 0, 7); + } else { + uint16_t previous = win16_read_u16(sprite); + uint16_t selected; + do { + selected = (uint16_t)(borland_random_below(6) + 1u); + } while (selected == previous); + win16_write_u16(sprite, 0, selected); + } + HWND16 window = win16_read_u16(win16_far_add_offset(receiver, 4)); + HDC16 dc = GetDC16(window); + tdkpin_composite_player_sprite(win16_read_u16(sprite), dc); + tdkpin_present_background_region(123, 42, 79, 55, dc); + (void)ReleaseDC16(window, dc); +} + +static void handle_ready_upgrade(uint16_t caller_bp) +{ + tdkpin_play_sound_if_not_tilted(12); + if (!group_heads_all_inactive(90, 5)) { + return; + } + tdkpin_play_sound_if_not_tilted(17); + Win16FarPtr ready = win16_dgroup_pointer((uint16_t)( + 0x0816 + (uint16_t)g_current_player)); + uint8_t value = win16_read_u8(ready); + if (value == 6) { + tdkpin_add_score_from_caller_frame(caller_bp, 50000); + } else { + value = value == 1 ? 2 : (uint8_t)(value + 1u); + win16_write_u8(ready, value); + tdkpin_restore_record_or_item_a( + caller_bp, (uint16_t)(value + 999u)); + } + activate_record_groups(caller_bp, 90, 5); +} + +static void handle_item_bank( + uint16_t caller_bp, Win16FarPtr receiver) +{ + tdkpin_play_sound_if_not_tilted(12); + if (!group_heads_all_inactive(109, 4)) { + return; + } + uint16_t slot = 1; + for (uint16_t item = 1; item <= 9; item++) { + if (win16_read_u8(win16_far_add_offset( + receiver, player_row_offset((uint16_t)(item + 5u)))) != 0) { + slot++; + } + } + if (slot < 9) { + tdkpin_play_sound_if_not_tilted(17); + win16_write_u8( + win16_far_add_offset( + receiver, player_row_offset((uint16_t)(slot + 5u))), + 1); + tdkpin_restore_record_or_item_a( + caller_bp, (uint16_t)(slot + 1005u)); + tdkpin_add_score_from_caller_frame( + caller_bp, (int32_t)slot * 10000); + } else if (slot == 9) { + tdkpin_play_sound_if_not_tilted(17); + win16_write_u8( + win16_far_add_offset(receiver, player_row_offset(14)), 1); + tdkpin_restore_record_or_item_a(caller_bp, 1014); + tdkpin_add_score_from_caller_frame(caller_bp, 24464); + publish_three_record_completion(caller_bp, receiver); + } else { + tdkpin_play_sound_if_not_tilted(7); + if (win16_read_u8(win16_far_add_offset(receiver, 0x0bdc)) == 0) { + win16_write_u8(win16_far_add_offset(receiver, 0x0bdc), 1); + } else { + Win16FarPtr secondary = win16_dgroup_pointer((uint16_t)( + 0x098e + (uint16_t)g_current_player * 4u)); + win16_write_u32( + secondary, 0, win16_read_u32(secondary) + 100000u); + uint8_t multiplier = win16_read_u8(win16_dgroup_pointer((uint16_t)( + 0x09a1 + (uint16_t)g_current_player))); + int32_t shown = borland_multiply_i32( + (int32_t)win16_read_u32(secondary), multiplier); + tdkpin_draw_score_from_caller_frame( + caller_bp, + (uint16_t)shown, + (uint16_t)((uint32_t)shown >> 16)); + } + } + activate_record_groups(caller_bp, 109, 4); +} + +static void handle_three_record_switch( + uint16_t caller_bp, Win16FarPtr receiver, uint16_t record_id) +{ + if (record_id == 150) { + win16_write_u8(win16_far_add_offset(receiver, 0x00f7), 10); + tdkpin_restore_record_or_item_a(caller_bp, 150); + set_record_active(153, 1); + tdkpin_restore_record_or_item_a(caller_bp, 153); + } else if (record_id == 151) { + win16_write_u8(win16_far_add_offset(receiver, 0x00f8), 10); + tdkpin_restore_record_or_item_a(caller_bp, 151); + set_record_active(6, 1); + tdkpin_restore_record_or_item_a(caller_bp, 6); + } else if (record_id == 152) { + win16_write_u8(win16_far_add_offset(receiver, 0x00f9), 10); + tdkpin_restore_record_or_item_a(caller_bp, 152); + set_record_active(154, 1); + tdkpin_restore_record_or_item_a(caller_bp, 154); + } +} + +static void handle_timed_record( + uint16_t caller_bp, Win16FarPtr receiver, uint16_t record_id) +{ + if (record_id >= 51 && record_id <= 53) { + tdkpin_play_sound_if_not_tilted(6); + win16_write_u8( + win16_far_add_offset(receiver, (uint16_t)(record_id + 0x61u)), 5); + tdkpin_restore_record_or_item_a(caller_bp, record_id); + uint8_t ready = win16_read_u8(win16_dgroup_pointer((uint16_t)( + 0x0816 + (uint16_t)g_current_player))); + tdkpin_add_score_from_caller_frame( + caller_bp, (int32_t)((int16_t)ready - 1) * 1000); + } else if (record_id >= 140 && record_id <= 147) { + win16_write_u8( + win16_far_add_offset(receiver, (uint16_t)(record_id + 0x61u)), + 20); + tdkpin_restore_record_or_item_a(caller_bp, record_id); + } +} + +/* 1000:b476 -- dispatch all collision event bits in their binary order. */ +void tdkpin_handle_collision_events( + uint16_t caller_bp, uint16_t event_flags, uint16_t record_id) +{ + if (win16_read_u8(win16_dgroup_pointer(0x07c6)) != 0) { + return; + } + Win16FarPtr receiver = caller_receiver(caller_bp); + if ((event_flags & 0x0001u) != 0 && + record_id >= 129 && record_id <= 133) { + uint16_t item = (uint16_t)(record_id - 0x72u); + win16_write_u8(win16_far_add_offset( + receiver, player_row_offset(item)), 1); + tdkpin_restore_record_or_item_a( + caller_bp, (uint16_t)(item + 1000u)); + } + if ((event_flags & 0x0002u) != 0) { + uint16_t linked = record_link(record_id); + set_record_active(linked, 0); + tdkpin_refresh_collision_record(caller_bp, linked); + if ((event_flags & 0x2000u) != 0) { + set_record_active((uint16_t)(linked + 1u), 0); + set_record_active((uint16_t)(linked + 2u), 0); + } + } + if ((event_flags & 0x0400u) != 0 && + win16_read_u8(win16_dgroup_pointer(0x07c7)) == 0 && + win16_read_u8(win16_dgroup_pointer(0x07c8)) == 0) { + win16_write_u32(win16_dgroup_pointer(0x0855), 0, 0); + win16_write_u8(win16_dgroup_pointer(0x07c7), 1); + } + if ((event_flags & 0x0004u) != 0) { + handle_sprite_award(caller_bp, receiver); + } + if ((event_flags & 0x0008u) != 0) { + handle_ready_upgrade(caller_bp); + } + if ((event_flags & 0x0010u) != 0) { + handle_item_bank(caller_bp, receiver); + } + if ((event_flags & 0x1000u) != 0) { + handle_three_record_switch(caller_bp, receiver, record_id); + } + if ((event_flags & 0x0040u) != 0) { + handle_timed_record(caller_bp, receiver, record_id); + } +} diff --git a/original/reconstructed/tdkpin_collision_events.h b/original/reconstructed/tdkpin_collision_events.h new file mode 100644 index 0000000..0423a2e --- /dev/null +++ b/original/reconstructed/tdkpin_collision_events.h @@ -0,0 +1,11 @@ +#ifndef TDKPIN_COLLISION_EVENTS_H +#define TDKPIN_COLLISION_EVENTS_H + +#include "tdkpin_player_state.h" + +void tdkpin_handle_collision_events( + uint16_t caller_bp, + uint16_t event_flags, + uint16_t record_id); /* 1000:b476 */ + +#endif diff --git a/original/reconstructed/tdkpin_collision_records.c b/original/reconstructed/tdkpin_collision_records.c new file mode 100644 index 0000000..245dcd3 --- /dev/null +++ b/original/reconstructed/tdkpin_collision_records.c @@ -0,0 +1,210 @@ +/* Collision/rule-record construction from the 1615-byte Code2 initializer. */ + +#include "tdkpin_collision_records.h" + +enum { + DGROUP_COLLISION_RECORDS = 0x095b, + COLLISION_LAST_INDEX = 175, + COORDINATE_SCALE = 1000, + BOUNDS_PADDING_MILLI = 5000, +}; + +typedef struct { + int32_t minimum; + int32_t maximum; +} Bounds; + +static int32_t add_wrap(int32_t left, int32_t right) +{ + return (int32_t)((uint32_t)left + (uint32_t)right); +} + +static int32_t subtract_wrap(int32_t left, int32_t right) +{ + return (int32_t)((uint32_t)left - (uint32_t)right); +} + +static int32_t scale(int32_t value) +{ + return borland_multiply_i32(value, COORDINATE_SCALE); +} + +/* Exact signed-high/unsigned-low comparisons at 0208..03ee. */ +static Bounds choose_bounds( + int32_t first, int32_t second, int32_t radius) +{ + if (second > 0 && second > first) { + return (Bounds){first, second}; + } + if (second > 0 && second < first) { + return (Bounds){second, first}; + } + return (Bounds){ + subtract_wrap(first, radius), + add_wrap(first, radius), + }; +} + +static void write_real48( + Win16FarPtr destination, const BorlandReal48 *value) +{ + for (uint16_t index = 0; index < 6; index++) { + win16_write_u8( + win16_far_add_offset(destination, index), value->bytes[index]); + } +} + +static void write_record( + Win16FarPtr destination, const TdkpinCollisionRecord *record) +{ + win16_write_u8(destination, record->type); + win16_write_u8(win16_far_add_offset(destination, 1), record->subtype); + win16_write_u32(destination, 0x02, (uint32_t)record->bounds_min_x_milli); + win16_write_u32(destination, 0x06, (uint32_t)record->bounds_min_y_milli); + win16_write_u32(destination, 0x0a, (uint32_t)record->bounds_max_x_milli); + win16_write_u32(destination, 0x0e, (uint32_t)record->bounds_max_y_milli); + win16_write_u32(destination, 0x12, (uint32_t)record->point1_x_milli); + win16_write_u32(destination, 0x16, (uint32_t)record->point1_y_milli); + win16_write_u32(destination, 0x1a, (uint32_t)record->point2_x_milli); + win16_write_u32(destination, 0x1e, (uint32_t)record->point2_y_milli); + write_real48(win16_far_add_offset(destination, 0x22), &record->radius_milli); + write_real48( + win16_far_add_offset(destination, 0x28), &record->response_normal); + write_real48( + win16_far_add_offset(destination, 0x2e), &record->response_tangent); + win16_write_u8(win16_far_add_offset(destination, 0x34), record->active); + write_real48( + win16_far_add_offset(destination, 0x35), &record->response_auxiliary); + write_real48( + win16_far_add_offset(destination, 0x3b), &record->response_kick); + win16_write_u16(destination, 0x41, record->flags); + win16_write_u16(destination, 0x43, record->contact_state); + win16_write_u16(destination, 0x45, record->score_low); + win16_write_u16(destination, 0x47, record->score_high); + win16_write_u16(destination, 0x49, record->layer_mask); + win16_write_u16(destination, 0x4b, record->render_left); + win16_write_u16(destination, 0x4d, record->render_top); + win16_write_u16(destination, 0x4f, record->render_right); + win16_write_u16(destination, 0x51, record->render_bottom); +} + +/* + * 1008:0138 -- build one of slots 0..175 in the packed 83-byte table. + * + * Radius zero selects segment geometry; nonzero radius selects a circle. In + * relative mode, point1 is offset from the preceding path endpoint and point2 + * is a delta from point1. Absolute mode retains X and subtracts the historical + * 20-unit board Y origin from both points. All arithmetic wraps at 32 bits. + */ +void tdkpin_initialize_collision_record( + const TdkpinCollisionInitArgs *arguments) +{ + if (arguments->index > COLLISION_LAST_INDEX) { + return; + } + + int32_t point1_x = arguments->point1_x; + int32_t point1_y = arguments->point1_y; + int32_t point2_x; + int32_t point2_y; + if ((uint8_t)arguments->coordinate_mode == 1) { + point1_x = add_wrap(g_collision_path_x, point1_x); + point1_y = add_wrap(g_collision_path_y, point1_y); + point2_x = add_wrap(point1_x, arguments->point2_x); + point2_y = add_wrap(point1_y, arguments->point2_y); + } else { + point1_y = subtract_wrap(point1_y, 20); + point2_x = arguments->point2_x; + point2_y = subtract_wrap(arguments->point2_y, 20); + } + + Bounds x_bounds = + choose_bounds(point1_x, point2_x, arguments->radius); + Bounds y_bounds = + choose_bounds(point1_y, point2_y, arguments->radius); + + TdkpinCollisionRecord record = {0}; + record.type = (uint8_t)arguments->type; + record.subtype = (uint8_t)arguments->subtype; + record.active = (uint8_t)arguments->active; + record.bounds_min_x_milli = scale(x_bounds.minimum); + record.bounds_min_y_milli = scale(y_bounds.minimum); + record.bounds_max_x_milli = scale(x_bounds.maximum); + record.bounds_max_y_milli = scale(y_bounds.maximum); + + if (arguments->radius != 0) { + record.point1_x_milli = scale(point1_x); + record.point1_y_milli = scale(point1_y); + record.radius_milli = borland_i32_to_real48( + scale(arguments->radius)); + + if (record.bounds_min_x_milli < record.point1_x_milli) { + record.bounds_min_x_milli = subtract_wrap( + record.bounds_min_x_milli, BOUNDS_PADDING_MILLI); + } else { + record.bounds_min_x_milli = add_wrap( + record.bounds_min_x_milli, + scale(arguments->fallback_x_adjust)); + } + if (record.bounds_min_y_milli < record.point1_y_milli) { + record.bounds_min_y_milli = subtract_wrap( + record.bounds_min_y_milli, BOUNDS_PADDING_MILLI); + } else { + record.bounds_min_y_milli = add_wrap( + record.bounds_min_y_milli, + scale(arguments->fallback_y_adjust)); + } + if (record.point1_x_milli < record.bounds_max_x_milli) { + record.bounds_max_x_milli = add_wrap( + record.bounds_max_x_milli, BOUNDS_PADDING_MILLI); + } else { + record.bounds_max_x_milli = add_wrap( + record.bounds_max_x_milli, + scale(arguments->fallback_x_adjust)); + } + if (record.point1_y_milli < record.bounds_max_y_milli) { + record.bounds_max_y_milli = add_wrap( + record.bounds_max_y_milli, BOUNDS_PADDING_MILLI); + } else { + record.bounds_max_y_milli = add_wrap( + record.bounds_max_y_milli, + scale(arguments->fallback_y_adjust)); + } + g_collision_path_x = point1_x; + g_collision_path_y = point1_y; + } else { + record.bounds_min_x_milli = subtract_wrap( + record.bounds_min_x_milli, BOUNDS_PADDING_MILLI); + record.bounds_min_y_milli = subtract_wrap( + record.bounds_min_y_milli, BOUNDS_PADDING_MILLI); + record.bounds_max_x_milli = add_wrap( + record.bounds_max_x_milli, BOUNDS_PADDING_MILLI); + record.bounds_max_y_milli = add_wrap( + record.bounds_max_y_milli, BOUNDS_PADDING_MILLI); + record.point1_x_milli = scale(point1_x); + record.point1_y_milli = scale(point1_y); + record.point2_x_milli = scale(point2_x); + record.point2_y_milli = scale(point2_y); + g_collision_path_x = point2_x; + g_collision_path_y = point2_y; + } + + record.response_normal = arguments->response_normal; + record.response_tangent = arguments->response_tangent; + record.response_auxiliary = arguments->response_auxiliary; + record.response_kick = arguments->response_kick; + record.flags = arguments->flags; + record.contact_state = arguments->contact_state; + record.score_low = arguments->score_low; + record.score_high = arguments->score_high; + record.layer_mask = arguments->layer_mask; + record.render_left = arguments->render_left; + record.render_top = arguments->render_top; + record.render_right = arguments->render_right; + record.render_bottom = arguments->render_bottom; + + uint16_t offset = (uint16_t)( + DGROUP_COLLISION_RECORDS + + (uint16_t)(arguments->index * sizeof(TdkpinCollisionRecord))); + write_record(win16_dgroup_pointer(offset), &record); +} diff --git a/original/reconstructed/tdkpin_collision_records.h b/original/reconstructed/tdkpin_collision_records.h new file mode 100644 index 0000000..3ba8f04 --- /dev/null +++ b/original/reconstructed/tdkpin_collision_records.h @@ -0,0 +1,84 @@ +#ifndef TDKPIN_COLLISION_RECORDS_H +#define TDKPIN_COLLISION_RECORDS_H + +#include "tdkpin_arithmetic.h" +#include "tdkpin_real48.h" +#include "tdkpin_segmented.h" + +#pragma pack(push, 1) +typedef struct { + uint8_t type; + uint8_t subtype; + int32_t bounds_min_x_milli; + int32_t bounds_min_y_milli; + int32_t bounds_max_x_milli; + int32_t bounds_max_y_milli; + int32_t point1_x_milli; + int32_t point1_y_milli; + int32_t point2_x_milli; + int32_t point2_y_milli; + BorlandReal48 radius_milli; + BorlandReal48 response_normal; + BorlandReal48 response_tangent; + uint8_t active; + BorlandReal48 response_auxiliary; + BorlandReal48 response_kick; + uint16_t flags; + uint16_t contact_state; + uint16_t score_low; + uint16_t score_high; + uint16_t layer_mask; + uint16_t render_left; + uint16_t render_top; + uint16_t render_right; + uint16_t render_bottom; +} TdkpinCollisionRecord; + +/* Exact 40-word Pascal argument block in increasing stack-address order. */ +typedef struct { + uint16_t render_bottom; + uint16_t render_right; + uint16_t render_top; + uint16_t render_left; + int32_t fallback_y_adjust; + int32_t fallback_x_adjust; + uint16_t layer_mask; + uint16_t score_low; + uint16_t score_high; + uint16_t contact_state; + uint16_t flags; + BorlandReal48 response_kick; + BorlandReal48 response_auxiliary; + BorlandReal48 response_tangent; + BorlandReal48 response_normal; + int32_t radius; + int32_t point2_y; + int32_t point2_x; + int32_t point1_y; + int32_t point1_x; + uint16_t coordinate_mode; + uint16_t subtype; + uint16_t type; + uint16_t active; + uint16_t index; +} TdkpinCollisionInitArgs; +#pragma pack(pop) + +_Static_assert(sizeof(TdkpinCollisionRecord) == 0x53, + "collision record layout drift"); +_Static_assert(sizeof(TdkpinCollisionInitArgs) == 0x50, + "collision initializer ABI drift"); +_Static_assert(offsetof(TdkpinCollisionRecord, radius_milli) == 0x22, + "collision radius offset drift"); +_Static_assert(offsetof(TdkpinCollisionRecord, active) == 0x34, + "collision active offset drift"); +_Static_assert(offsetof(TdkpinCollisionRecord, flags) == 0x41, + "collision flags offset drift"); + +void tdkpin_initialize_collision_record( + const TdkpinCollisionInitArgs *arguments); /* 1008:0138 */ + +extern int32_t g_collision_path_x; /* 1028:0849..084c */ +extern int32_t g_collision_path_y; /* 1028:084d..0850 */ + +#endif diff --git a/original/reconstructed/tdkpin_command_line.c b/original/reconstructed/tdkpin_command_line.c new file mode 100644 index 0000000..b1442f3 --- /dev/null +++ b/original/reconstructed/tdkpin_command_line.c @@ -0,0 +1,66 @@ +#include "tdkpin_command_line.h" + +/* + * 1020:0871 — scan one DOS command-tail token. + * Bytes <= space are separators. A zero starting index intentionally wraps to + * ffff after the first token and counts until the zero-length terminal scan. + */ +BorlandCommandToken borland_scan_command_token(uint16_t index) +{ + Win16FarPtr cursor = g_borland_command_line; + while (true) { + uint8_t value; + do { + value = win16_read_u8(cursor); + cursor = win16_far_add_offset(cursor, 1); + } while (value != 0 && value <= 0x20); + + cursor = win16_far_add_offset(cursor, 0xffff); + Win16FarPtr token = cursor; + do { + value = win16_read_u8(cursor); + cursor = win16_far_add_offset(cursor, 1); + } while (value > 0x20); + cursor = win16_far_add_offset(cursor, 0xffff); + uint16_t length = + (uint16_t)(win16_far_offset(cursor) - win16_far_offset(token)); + if (length == 0) { + return (BorlandCommandToken){token, 0, index}; + } + index--; + if (index == 0) { + return (BorlandCommandToken){token, length, index}; + } + } +} + +/* 1020:0866 — CX=0 scan followed by XCHG/NEG returns the token count. */ +uint16_t borland_parameter_count(void) +{ + BorlandCommandToken terminal = borland_scan_command_token(0); + return (uint16_t)(0 - terminal.remaining_index); +} + +/* + * 1020:082e — ParamStr with a hidden far ShortString result. + * For command tokens, AL becomes the length byte while REP MOVSB retains the + * complete uint16 token length; this deliberately preserves >255 overflow. + */ +void borland_parameter_string(uint16_t index, Win16FarPtr destination) +{ + if (index == 0) { + uint16_t length = GetModuleFileNameFar16( + g_win16_instance, + win16_far_add_offset(destination, 1), + 0xff); + win16_write_u8(destination, (uint8_t)length); + return; + } + BorlandCommandToken token = borland_scan_command_token(index); + win16_write_u8(destination, (uint8_t)token.length); + for (uint16_t offset = 0; offset < token.length; offset++) { + win16_write_u8( + win16_far_add_offset(destination, (uint16_t)(offset + 1)), + win16_read_u8(win16_far_add_offset(token.token, offset))); + } +} diff --git a/original/reconstructed/tdkpin_command_line.h b/original/reconstructed/tdkpin_command_line.h new file mode 100644 index 0000000..917766d --- /dev/null +++ b/original/reconstructed/tdkpin_command_line.h @@ -0,0 +1,20 @@ +#ifndef TDKPIN_COMMAND_LINE_H +#define TDKPIN_COMMAND_LINE_H + +#include "tdkpin_segmented.h" + +extern Win16FarPtr g_borland_command_line; /* 1028:0702/0704 */ +extern HINSTANCE16 g_win16_instance; /* 1028:06fe */ + +typedef struct { + Win16FarPtr token; + uint16_t length; + uint16_t remaining_index; +} BorlandCommandToken; + +BorlandCommandToken borland_scan_command_token(uint16_t index); /* 1020:0871 */ +uint16_t borland_parameter_count(void); /* 1020:0866 */ +void borland_parameter_string( + uint16_t index, Win16FarPtr destination); /* 1020:082e */ + +#endif diff --git a/original/reconstructed/tdkpin_data.c b/original/reconstructed/tdkpin_data.c new file mode 100644 index 0000000..e0d626d --- /dev/null +++ b/original/reconstructed/tdkpin_data.c @@ -0,0 +1,49 @@ +/* Address-linked initialized DGROUP objects from TDKPIN.EXE. */ + +#include "tdkpin_dgroup.h" +#include "tdkpin_sound.h" + +enum { + WIN16_VK_PRIOR = 0x21, + WIN16_VK_NEXT = 0x22, + WIN16_VK_END = 0x23, + WIN16_VK_HOME = 0x24, + WIN16_VK_LEFT = 0x25, + WIN16_VK_UP = 0x26, + WIN16_VK_RIGHT = 0x27, + WIN16_VK_DOWN = 0x28, +}; + +/* + * DGROUP 1028:0590..05bf — twelve exact four-byte key bindings consumed by + * 1008:2147. Entry order is significant because the binary stops at the first + * virtual-key/control-state match. + */ +const TpWinCrtKeyBinding g_tpwincrt_key_bindings[12] = { + {WIN16_VK_LEFT, 0, 0, TPWINCRT_SB_LINEUP}, + {WIN16_VK_RIGHT, 0, 0, TPWINCRT_SB_LINEDOWN}, + {WIN16_VK_LEFT, 1, 0, TPWINCRT_SB_PAGEUP}, + {WIN16_VK_RIGHT, 1, 0, TPWINCRT_SB_PAGEDOWN}, + {WIN16_VK_HOME, 0, 0, TPWINCRT_SB_TOP}, + {WIN16_VK_END, 0, 0, TPWINCRT_SB_BOTTOM}, + {WIN16_VK_UP, 0, 1, TPWINCRT_SB_LINEUP}, + {WIN16_VK_DOWN, 0, 1, TPWINCRT_SB_LINEDOWN}, + {WIN16_VK_PRIOR, 0, 1, TPWINCRT_SB_PAGEUP}, + {WIN16_VK_NEXT, 0, 1, TPWINCRT_SB_PAGEDOWN}, + {WIN16_VK_HOME, 1, 1, TPWINCRT_SB_TOP}, + {WIN16_VK_END, 1, 1, TPWINCRT_SB_BOTTOM}, +}; + +/* + * DGROUP 1028:03ea..0441 — payload lengths copied from WAV resources + * 2001..2022. Zero entries are the six resource numbers absent from the NE + * resource table; nonzero values equal the RIFF length, excluding NE padding. + */ +const uint32_t g_sound_resource_byte_counts[22] = { + 6302, 4594, 0, 7554, 0, 2906, 30452, 39134, 0, 0, 6710, + 320, 46348, 0, 7946, 3518, 34842, 0, 5148, 30000, 3194, 22122, +}; + +_Static_assert( + sizeof(g_sound_resource_byte_counts) == 88, + "TDKPIN sound-resource length table drift"); diff --git a/original/reconstructed/tdkpin_dgroup.h b/original/reconstructed/tdkpin_dgroup.h new file mode 100644 index 0000000..56ec5d0 --- /dev/null +++ b/original/reconstructed/tdkpin_dgroup.h @@ -0,0 +1,59 @@ +#ifndef TDKPIN_DGROUP_H +#define TDKPIN_DGROUP_H + +#include "tdkpin_win16.h" + +/* DGROUP 1028:0586; assigned from HWND at TPWinCrt window-proc entry. */ +extern HWND16 g_tpwincrt_window; + +extern uint16_t g_tpwincrt_columns; /* 1028:0540 */ +extern uint16_t g_tpwincrt_rows; /* 1028:0542 */ +extern uint16_t g_tpwincrt_cursor_column; /* 1028:0544 */ +extern uint16_t g_tpwincrt_cursor_row; /* 1028:0546 */ +extern uint16_t g_tpwincrt_view_column; /* 1028:0548 */ +extern uint16_t g_tpwincrt_view_row; /* 1028:054a */ +extern uint8_t g_tpwincrt_break_check_enabled; /* 1028:0560 */ +extern uint8_t g_tpwincrt_auto_scroll; /* 1028:055e */ +extern uint8_t g_tpwincrt_ctrl_z_is_eof; /* 1028:055f */ +extern uint16_t g_tpwincrt_input_count; /* 1028:058a */ +extern uint16_t g_tpwincrt_ring_row_origin; /* 1028:0588 */ +extern uint8_t g_tpwincrt_window_created; /* 1028:058c */ +extern uint8_t g_tpwincrt_has_focus; /* 1028:058d */ +extern uint8_t g_tpwincrt_caret_enabled; /* 1028:058e */ +extern uint8_t g_tpwincrt_paint_message_active; /* 1028:058f */ +extern Win16FarPtr g_tpwincrt_screen_buffer; /* 1028:4ac2/4ac4 */ +extern uint16_t g_tpwincrt_character_width; /* 1028:4ace */ +extern uint16_t g_tpwincrt_character_height; /* 1028:4ad0 */ +extern uint16_t g_tpwincrt_caret_y_offset; /* 1028:4ad2 */ +extern HDC16 g_tpwincrt_paint_dc; /* 1028:4ad4 */ +extern PAINTSTRUCT16 g_tpwincrt_paint; /* 1028:4ad6..4af5 */ +extern HGDIOBJ16 g_tpwincrt_previous_font; /* 1028:4af6 */ +extern uint16_t g_tpwincrt_visible_columns; /* 1028:4ac6 */ +extern uint16_t g_tpwincrt_visible_rows; /* 1028:4ac8 */ +extern uint16_t g_tpwincrt_max_view_column; /* 1028:4aca */ +extern uint16_t g_tpwincrt_max_view_row; /* 1028:4acc */ +extern uint8_t g_tpwincrt_input_buffer[64]; /* 1028:4af8..4b37 */ + +enum TpWinCrtScrollCommand { + TPWINCRT_SB_LINEUP = 0, + TPWINCRT_SB_LINEDOWN = 1, + TPWINCRT_SB_PAGEUP = 2, + TPWINCRT_SB_PAGEDOWN = 3, + TPWINCRT_SB_THUMBPOSITION = 4, + TPWINCRT_SB_TOP = 6, + TPWINCRT_SB_BOTTOM = 7, +}; + +#pragma pack(push, 1) +typedef struct { + uint8_t virtual_key; + uint8_t control_required; + uint8_t vertical; + uint8_t scroll_command; +} TpWinCrtKeyBinding; +#pragma pack(pop) + +_Static_assert(sizeof(TpWinCrtKeyBinding) == 4, "TPWinCrt key binding layout drift"); +extern const TpWinCrtKeyBinding g_tpwincrt_key_bindings[12]; /* 1028:0590..05bf */ + +#endif diff --git a/original/reconstructed/tdkpin_dialog.c b/original/reconstructed/tdkpin_dialog.c new file mode 100644 index 0000000..cbc17c1 --- /dev/null +++ b/original/reconstructed/tdkpin_dialog.c @@ -0,0 +1,271 @@ +/* ObjectWindows modal-dialog methods from Code2. */ + +#include "tdkpin_dialog.h" + +enum { + OBJECT_WINDOW_HANDLE_OFFSET = 4, + DIALOG_MODAL_FLAG_OFFSET = 0x25, + DIALOG_CLOSE_SLOT = 0x50, + DIALOG_CAN_CLOSE_SLOT = 0x3c, + DIALOG_TRANSFER_SLOT = 0x44, + DIALOG_MARK_CHILD_CALLBACK_OFFSET = 0x2bb1, +}; + +static void write_far( + Win16FarPtr base, uint16_t offset, Win16FarPtr value) +{ + win16_write_u16(base, offset, win16_far_offset(value)); + win16_write_u16( + base, (uint16_t)(offset + 2), win16_far_selector(value)); +} + +/* + * 1008:2996 -- base ObjectWindows dialog constructor. The hidden VMT value + * is explicit in C. A selector-zero template is an integer resource and is + * retained verbatim; a real far C string is duplicated and owned by dialog. + */ +Win16FarPtr object_windows_dialog_construct( + Win16FarPtr dialog, + uint16_t vmt, + Win16FarPtr template_name, + Win16FarPtr parent) +{ + BorlandObjectCallFrame frame = {dialog, vmt}; + if (!borland_enter_object_constructor(&frame, 0)) { + return frame.object; + } + frame.object = object_windows_object_construct(frame.object, 0, parent); + object_windows_clear_flag_4(frame.object); + Win16FarPtr stored_template = win16_far_selector(template_name) == 0 + ? template_name + : borland_far_strdup(template_name); + write_far(frame.object, 0x1d, stored_template); + write_far(frame.object, 0x21, 0); + win16_write_u8(win16_far_add_offset(frame.object, 0x25), 0); + return frame.object; +} + +/* + * 1008:1607 -- derived text-entry dialog. Template 7f02 is normal and 7f05 + * is selected by the process flag at 066a. Four caller fields are then stored + * unaligned at +26, +2a, +2e, and +32. + */ +Win16FarPtr object_windows_text_dialog_construct( + Win16FarPtr dialog, + uint16_t vmt, + INT16 control_id, + Win16FarPtr text_buffer, + Win16FarPtr label, + Win16FarPtr caption, + Win16FarPtr parent) +{ + BorlandObjectCallFrame frame = {dialog, vmt}; + if (!borland_enter_object_constructor(&frame, 0)) { + return frame.object; + } + uint16_t resource = g_dialog_alternate_template != 0 ? 0x7f05 : 0x7f02; + frame.object = object_windows_dialog_construct( + frame.object, + 0, + win16_make_far_pointer(0, resource), + parent); + write_far(frame.object, 0x26, caption); + write_far(frame.object, 0x2a, label); + write_far(frame.object, 0x2e, text_buffer); + win16_write_u16(frame.object, 0x32, (uint16_t)control_id); + return frame.object; +} + +static HWND16 dialog_parent_window(Win16FarPtr dialog) +{ + Win16FarPtr parent = win16_read_far_pointer(dialog, 6); + return parent == 0 + ? 0 + : win16_read_u16(win16_far_add_offset(parent, 4)); +} + +/* + * 1008:2a45 -- create a modeless dialog once. AL is the Boolean result, but + * AH is intentionally retained from CreateDialogParam (or incoming AX when a + * preexisting status skips creation), matching MOV AL,0 / INC AX exactly. + */ +uint16_t object_windows_create_modeless_dialog(Win16FarPtr dialog) +{ + uint16_t status = win16_read_u16(win16_far_add_offset(dialog, 2)); + uint16_t high_byte; + if (status == 0) { + object_windows_clear_flag_4(dialog); + object_windows_set_flag_1(dialog); + win16_write_u8(win16_far_add_offset(dialog, 0x25), 0); + HWND16 created = win16_call_create_dialog_param( + g_win16_create_dialog_param, + g_win16_instance, + win16_read_far_pointer(dialog, 0x1d), + dialog_parent_window(dialog), + win16_read_far_pointer(dialog, 0x12), + (LPARAM16)win16_read_far_pointer(dialog, 0x21)); + high_byte = created & 0xff00u; + win16_write_u16(dialog, 4, created); + if (created == 0) { + win16_write_u16(dialog, 2, 0xffff); + } + } else { + high_byte = win16_indeterminate_u16() & 0xff00u; + } + return high_byte | + (win16_read_u16(win16_far_add_offset(dialog, 2)) == 0 ? 1u : 0u); +} + +/* + * 1008:2ae3 -- execute a modal dialog while temporarily publishing it as the + * application's active dialog. DialogBox failure -1 becomes status ffff; + * the object HWND is always cleared after an attempted modal call. + */ +INT16 object_windows_execute_modal_dialog(Win16FarPtr dialog) +{ + uint16_t status = win16_read_u16(win16_far_add_offset(dialog, 2)); + if (status != 0) { + return (INT16)status; + } + + object_windows_clear_flag_4(dialog); + object_windows_set_flag_1(dialog); + win16_write_u8(win16_far_add_offset(dialog, 0x25), 1); + + Win16FarPtr previous_active = + win16_read_far_pointer(g_object_windows_application, 0x0e); + INT16 result = win16_call_dialog_box_param( + g_win16_dialog_box_param, + g_win16_instance, + win16_read_far_pointer(dialog, 0x1d), + dialog_parent_window(dialog), + win16_read_far_pointer(dialog, 0x12), + (LPARAM16)win16_read_far_pointer(dialog, 0x21)); + write_far(g_object_windows_application, 0x0e, previous_active); + if (result == -1) { + win16_write_u16(dialog, 2, 0xffff); + } + win16_write_u16(dialog, 4, 0); + return result; +} + +/* + * 1008:2cf2 -- nonmodal windows use the ordinary close helper. An active + * modal dialog first asks VMT +3c; approval invokes +44(object,1) followed by + * +50(object,1). The incoming message record is intentionally ignored. + */ +void object_windows_dialog_validate_and_close( + Win16FarPtr dialog, ObjectWindowsMessage *message) +{ + (void)message; + if (win16_read_u8(win16_far_add_offset( + dialog, DIALOG_MODAL_FLAG_OFFSET)) == 0) { + object_windows_close_if_allowed(dialog); + return; + } + + uint16_t vmt = win16_read_u16(dialog); + Win16FarPtr vmt_pointer = win16_dgroup_pointer(vmt); + Win16FarPtr can_close = + win16_read_far_pointer(vmt_pointer, DIALOG_CAN_CLOSE_SLOT); + if (!win16_call_object_bool_method(can_close, dialog)) { + return; + } + win16_call_object_u16_method( + win16_read_far_pointer(vmt_pointer, DIALOG_TRANSFER_SLOT), + dialog, + 1); + win16_call_object_u16_method( + win16_read_far_pointer(vmt_pointer, DIALOG_CLOSE_SLOT), + dialog, + 1); +} + +/* 1008:2bb1 — ForEach callback: mark a child only after HWND publication. */ +void object_windows_dialog_mark_child( + uint16_t ignored, Win16FarPtr child) +{ + object_windows_set_flag_4_if_windowed(ignored, child); +} + +/* 1008:2bd1 — end an active modal dialog after marking all child windows. */ +void object_windows_end_modal_dialog( + Win16FarPtr dialog, INT16 result) +{ + if (win16_read_u8(win16_far_add_offset( + dialog, DIALOG_MODAL_FLAG_OFFSET)) == 0) { + return; + } + object_windows_for_each_child( + dialog, + win16_relocated_code_pointer( + 2, DIALOG_MARK_CHILD_CALLBACK_OFFSET)); + HWND16 window = win16_read_u16(win16_far_add_offset( + dialog, OBJECT_WINDOW_HANDLE_OFFSET)); + (void)EndDialog16(window, result); +} + +/* + * 1008:2d3a — modal dialogs use VMT +0x50(object,2); nonmodal windows use the + * ordinary close-if-allowed helper. The incoming event is ignored. + */ +void object_windows_dialog_close( + Win16FarPtr dialog, ObjectWindowsMessage *message) +{ + (void)message; + if (win16_read_u8(win16_far_add_offset( + dialog, DIALOG_MODAL_FLAG_OFFSET)) == 0) { + object_windows_close_if_allowed(dialog); + return; + } + uint16_t vmt = win16_read_u16(dialog); + Win16FarPtr procedure = + win16_read_far_pointer(win16_dgroup_pointer(vmt), DIALOG_CLOSE_SLOT); + win16_call_object_u16_method(procedure, dialog, 2); +} + +/* + * 1008:2a0e — derived dialog destructor. The binary tests only the selector + * word of the unaligned string pointer at +0x1d/+0x1f before disposing it. + */ +void object_windows_dialog_destruct(Win16FarPtr dialog, uint16_t vmt) +{ + Win16FarPtr string = win16_read_far_pointer(dialog, 0x1d); + if (win16_far_selector(string) != 0) { + borland_far_strdispose(string); + } + object_windows_object_destruct(dialog, 0); + BorlandObjectCallFrame frame = {dialog, vmt}; + borland_finish_object_destructor(&frame, 0); +} + +/* 1008:168e — fill the dialog's far text buffer and always return AL=1. */ +bool object_windows_dialog_read_text(Win16FarPtr dialog) +{ + HWND16 window = win16_read_u16(win16_far_add_offset(dialog, 4)); + Win16FarPtr buffer = win16_read_far_pointer(dialog, 0x2e); + INT16 control_id = (INT16)win16_read_u16( + win16_far_add_offset(dialog, 0x32)); + (void)GetDlgItemTextFar16(window, control_id, buffer, 0x65); + return true; +} + +/* + * 1008:16be -- finish ObjectWindows preparation, publish the caption and two + * control texts, then limit control +0x32 to length-1 with EM_LIMITTEXT 0415h. + * Every USER return value is deliberately ignored. + */ +void object_windows_dialog_setup_text_fields(Win16FarPtr dialog) +{ + object_windows_prepare_window(dialog); + HWND16 window = win16_read_u16(win16_far_add_offset(dialog, 4)); + (void)SetWindowTextFar16( + window, win16_read_far_pointer(dialog, 0x26)); + (void)SetDlgItemText16( + window, 100, win16_read_far_pointer(dialog, 0x2a)); + (void)SetDlgItemText16( + window, 101, win16_read_far_pointer(dialog, 0x2e)); + uint16_t capacity = win16_read_u16(win16_far_add_offset(dialog, 0x32)); + (void)SendDlgItemMessage16( + window, 101, 0x0415, (uint16_t)(capacity - 1), 0); +} diff --git a/original/reconstructed/tdkpin_dialog.h b/original/reconstructed/tdkpin_dialog.h new file mode 100644 index 0000000..e34225c --- /dev/null +++ b/original/reconstructed/tdkpin_dialog.h @@ -0,0 +1,47 @@ +#ifndef TDKPIN_DIALOG_H +#define TDKPIN_DIALOG_H + +#include "tdkpin_object_list.h" +#include "tdkpin_window_messages.h" +#include "tdkpin_object_lifecycle.h" +#include "tdkpin_strings.h" + +void object_windows_dialog_mark_child( + uint16_t ignored, Win16FarPtr child); /* 1008:2bb1 */ +void object_windows_end_modal_dialog( + Win16FarPtr dialog, INT16 result); /* 1008:2bd1 */ +void object_windows_dialog_close( + Win16FarPtr dialog, + ObjectWindowsMessage *message); /* 1008:2d3a */ +void object_windows_dialog_validate_and_close( + Win16FarPtr dialog, + ObjectWindowsMessage *message); /* 1008:2cf2 */ +void object_windows_dialog_destruct( + Win16FarPtr dialog, uint16_t vmt); /* 1008:2a0e */ +bool object_windows_dialog_read_text( + Win16FarPtr dialog); /* 1008:168e */ +void object_windows_dialog_setup_text_fields( + Win16FarPtr dialog); /* 1008:16be */ +Win16FarPtr object_windows_dialog_construct( + Win16FarPtr dialog, + uint16_t vmt, + Win16FarPtr template_name, + Win16FarPtr parent); /* 1008:2996 */ +Win16FarPtr object_windows_text_dialog_construct( + Win16FarPtr dialog, + uint16_t vmt, + INT16 control_id, + Win16FarPtr text_buffer, + Win16FarPtr label, + Win16FarPtr caption, + Win16FarPtr parent); /* 1008:1607 */ +uint16_t object_windows_create_modeless_dialog( + Win16FarPtr dialog); /* 1008:2a45 */ +INT16 object_windows_execute_modal_dialog( + Win16FarPtr dialog); /* 1008:2ae3 */ + +extern Win16FarPtr g_win16_create_dialog_param; /* 1028:0652/0654 */ +extern Win16FarPtr g_win16_dialog_box_param; /* 1028:0656/0658 */ +extern uint8_t g_dialog_alternate_template; /* 1028:066a */ + +#endif diff --git a/original/reconstructed/tdkpin_dispatch.c b/original/reconstructed/tdkpin_dispatch.c new file mode 100644 index 0000000..c12d4cb --- /dev/null +++ b/original/reconstructed/tdkpin_dispatch.c @@ -0,0 +1,97 @@ +/* Borland Pascal dynamic-method-table resolution and dispatch. */ + +#include "tdkpin_dispatch.h" + +enum { + VMT_DYNAMIC_TABLE_OFFSET = 4, + DYNAMIC_PARENT_OFFSET = 0, + DYNAMIC_CACHE_ID_OFFSET = 2, + DYNAMIC_CACHE_SLOT_OFFSET = 4, + DYNAMIC_COUNT_OFFSET = 6, + DYNAMIC_IDS_OFFSET = 8, +}; + +/* + * 1020:16e6 — resolve AX in the dynamic table referenced by DS:[DI+4]. + * + * Each near-DGROUP table node contains a parent pointer, a mutable one-entry + * cache, a count, `count` method ids, then `count` far procedure pointers. + * Search proceeds from the most-derived node through its parent chain. The + * returned far pointer addresses the selected four-byte slot, not its target. + */ +Win16FarPtr borland_resolve_dynamic_method_slot( + uint16_t vmt, uint16_t method_id) +{ + uint16_t table = win16_read_u16( + win16_dgroup_pointer((uint16_t)(vmt + VMT_DYNAMIC_TABLE_OFFSET))); + + while (true) { + Win16FarPtr node = win16_dgroup_pointer(table); + if (method_id == win16_read_u16(win16_far_add_offset( + node, DYNAMIC_CACHE_ID_OFFSET))) { + uint16_t cached_slot = win16_read_u16(win16_far_add_offset( + node, DYNAMIC_CACHE_SLOT_OFFSET)); + return win16_dgroup_pointer(cached_slot); + } + + uint16_t count = win16_read_u16(win16_far_add_offset( + node, DYNAMIC_COUNT_OFFSET)); + for (uint16_t index = 0; index < count; index++) { + uint16_t id = win16_read_u16(win16_far_add_offset( + node, + (uint16_t)(DYNAMIC_IDS_OFFSET + index * 2u))); + if (id != method_id) { + continue; + } + + uint16_t slot = (uint16_t)( + table + DYNAMIC_IDS_OFFSET + count * 2u + index * 4u); + win16_write_u16(node, DYNAMIC_CACHE_ID_OFFSET, method_id); + win16_write_u16(node, DYNAMIC_CACHE_SLOT_OFFSET, slot); + return win16_dgroup_pointer(slot); + } + + table = win16_read_u16(win16_far_add_offset( + node, DYNAMIC_PARENT_OFFSET)); + if (table == 0) { + borland_runtime_error(210); + } + } +} + +/* 1020:16dd — public lookup entry; DI receives the selected far slot. */ +Win16FarPtr borland_find_dynamic_method(uint16_t vmt, uint16_t method_id) +{ + return borland_resolve_dynamic_method_slot(vmt, method_id); +} + +/* 1020:16e1 — resolve the slot and indirect through its far procedure. */ +void borland_dispatch_dynamic_method(uint16_t vmt, uint16_t method_id) +{ + Win16FarPtr slot = borland_resolve_dynamic_method_slot(vmt, method_id); + win16_call_dynamic_method(win16_read_far_pointer(slot, 0)); +} + +static void dispatch_two_far_arguments( + Win16FarPtr receiver, Win16FarPtr argument, uint16_t method_id) +{ + uint16_t vmt = win16_read_u16(receiver); + Win16FarPtr slot = + borland_resolve_dynamic_method_slot(vmt, method_id); + win16_call_dynamic_method_two_far( + win16_read_far_pointer(slot, 0), receiver, argument); +} + +/* 1008:2d66 — generated two-far-argument dispatch for dynamic id 0x8002. */ +void borland_dispatch_method_8002( + Win16FarPtr receiver, Win16FarPtr argument) +{ + dispatch_two_far_arguments(receiver, argument, 0x8002); +} + +/* 1018:16eb — generated two-far-argument dispatch for dynamic id 0x0006. */ +void borland_dispatch_method_0006( + Win16FarPtr receiver, Win16FarPtr argument) +{ + dispatch_two_far_arguments(receiver, argument, 0x0006); +} diff --git a/original/reconstructed/tdkpin_dispatch.h b/original/reconstructed/tdkpin_dispatch.h new file mode 100644 index 0000000..ee96862 --- /dev/null +++ b/original/reconstructed/tdkpin_dispatch.h @@ -0,0 +1,17 @@ +#ifndef TDKPIN_DISPATCH_H +#define TDKPIN_DISPATCH_H + +#include "tdkpin_borland_runtime.h" + +Win16FarPtr borland_resolve_dynamic_method_slot( + uint16_t vmt, uint16_t method_id); /* 1020:16e6 */ +Win16FarPtr borland_find_dynamic_method( + uint16_t vmt, uint16_t method_id); /* 1020:16dd */ +void borland_dispatch_dynamic_method( + uint16_t vmt, uint16_t method_id); /* 1020:16e1 */ +void borland_dispatch_method_8002( + Win16FarPtr receiver, Win16FarPtr argument); /* 1008:2d66 */ +void borland_dispatch_method_0006( + Win16FarPtr receiver, Win16FarPtr argument); /* 1018:16eb */ + +#endif diff --git a/original/reconstructed/tdkpin_flipper_bitmap_geometry.c b/original/reconstructed/tdkpin_flipper_bitmap_geometry.c new file mode 100644 index 0000000..2f0cc02 --- /dev/null +++ b/original/reconstructed/tdkpin_flipper_bitmap_geometry.c @@ -0,0 +1,213 @@ +/* Collision-record geometry mover at 1000:8b0d. */ + +#include "tdkpin_flippers.h" + +#include "tdkpin_arithmetic.h" +#include "tdkpin_render.h" + +enum { + COLLISION_RECORDS_BASE = 0x095b, + COLLISION_RECORD_BYTES = 0x53, + COLLISION_BOUNDS_MIN_X = 0x02, + COLLISION_BOUNDS_MIN_Y = 0x06, + COLLISION_BOUNDS_MAX_X = 0x0a, + COLLISION_BOUNDS_MAX_Y = 0x0e, + COLLISION_POINT1_X = 0x12, + COLLISION_POINT1_Y = 0x16, + COLLISION_POINT2_X = 0x1a, + COLLISION_POINT2_Y = 0x1e, + COLLISION_BOUNDS_PADDING = 5000, +}; + +static Win16FarPtr caller_receiver(uint16_t caller_bp) +{ + uint16_t offset = win16_read_stack_u16((uint16_t)(caller_bp + 6)); + uint16_t selector = win16_read_stack_u16((uint16_t)(caller_bp + 8)); + return win16_make_far_pointer(selector, offset); +} + +static Win16FarPtr collision_record(uint16_t id) +{ + return win16_dgroup_pointer((uint16_t)( + COLLISION_RECORDS_BASE + id * COLLISION_RECORD_BYTES)); +} + +static int32_t read_record_i32(Win16FarPtr record, uint16_t offset) +{ + return (int32_t)win16_read_u32(win16_far_add_offset(record, offset)); +} + +static void write_record_i32( + Win16FarPtr record, uint16_t offset, int32_t value) +{ + win16_write_u32(record, offset, (uint32_t)value); +} + +static int32_t add_wrap_i32(int32_t left, int32_t right) +{ + return (int32_t)((uint32_t)left + (uint32_t)right); +} + +static int32_t subtract_wrap_i32(int32_t left, int32_t right) +{ + return (int32_t)((uint32_t)left - (uint32_t)right); +} + +/* The binary spells several of these as Mul32 -> I32ToReal48 -> Round. + * Every int32 is exact in Real48, so the observable result is the wrapped + * low dword from the first operation. */ +static int32_t scaled_delta(int32_t delta, int32_t scale) +{ + return borland_multiply_i32(delta, scale); +} + +static void add_scaled( + Win16FarPtr record, uint16_t offset, int32_t delta, int32_t scale) +{ + write_record_i32( + record, + offset, + add_wrap_i32( + read_record_i32(record, offset), scaled_delta(delta, scale))); +} + +static void subtract_scaled( + Win16FarPtr record, uint16_t offset, int32_t delta, int32_t scale) +{ + write_record_i32( + record, + offset, + subtract_wrap_i32( + read_record_i32(record, offset), scaled_delta(delta, scale))); +} + +static void recompute_segment_bounds(Win16FarPtr record) +{ + int32_t point1_x = read_record_i32(record, COLLISION_POINT1_X); + int32_t point1_y = read_record_i32(record, COLLISION_POINT1_Y); + int32_t point2_x = read_record_i32(record, COLLISION_POINT2_X); + int32_t point2_y = read_record_i32(record, COLLISION_POINT2_Y); + int32_t minimum_x = point1_x < point2_x ? point1_x : point2_x; + int32_t maximum_x = point1_x < point2_x ? point2_x : point1_x; + int32_t minimum_y = point1_y < point2_y ? point1_y : point2_y; + int32_t maximum_y = point1_y < point2_y ? point2_y : point1_y; + write_record_i32( + record, + COLLISION_BOUNDS_MIN_X, + subtract_wrap_i32(minimum_x, COLLISION_BOUNDS_PADDING)); + write_record_i32( + record, + COLLISION_BOUNDS_MIN_Y, + subtract_wrap_i32(minimum_y, COLLISION_BOUNDS_PADDING)); + write_record_i32( + record, + COLLISION_BOUNDS_MAX_X, + add_wrap_i32(maximum_x, COLLISION_BOUNDS_PADDING)); + write_record_i32( + record, + COLLISION_BOUNDS_MAX_Y, + add_wrap_i32(maximum_y, COLLISION_BOUNDS_PADDING)); +} + +static void update_left_flipper_records(int32_t delta) +{ + Win16FarPtr outer_segment = collision_record(66); + add_scaled(outer_segment, COLLISION_POINT1_X, delta, 14000); + add_scaled(outer_segment, COLLISION_POINT1_Y, delta, 4000); + add_scaled(outer_segment, COLLISION_POINT2_X, delta, 10000); + add_scaled(outer_segment, COLLISION_POINT2_Y, delta, 44000); + recompute_segment_bounds(outer_segment); + + Win16FarPtr swept_edge = collision_record(67); + add_scaled(swept_edge, COLLISION_POINT1_X, delta, 1000); + add_scaled(swept_edge, COLLISION_POINT1_Y, delta, 42000); + add_scaled(swept_edge, COLLISION_BOUNDS_MIN_X, delta, 2000); + add_scaled(swept_edge, COLLISION_BOUNDS_MIN_Y, delta, 43000); + subtract_scaled(swept_edge, COLLISION_BOUNDS_MAX_X, delta, 2000); + subtract_scaled(swept_edge, COLLISION_BOUNDS_MAX_Y, delta, 43000); + + Win16FarPtr inner_segment = collision_record(68); + subtract_scaled(inner_segment, COLLISION_POINT1_X, delta, 7000); + add_scaled(inner_segment, COLLISION_POINT1_Y, delta, 43000); + subtract_scaled(inner_segment, COLLISION_POINT2_X, delta, 19000); + add_scaled(inner_segment, COLLISION_POINT2_Y, delta, 6000); + recompute_segment_bounds(inner_segment); +} + +static void update_right_flipper_records(int32_t delta) +{ + Win16FarPtr outer_segment = collision_record(83); + subtract_scaled(outer_segment, COLLISION_POINT2_X, delta, 16000); + add_scaled(outer_segment, COLLISION_POINT2_Y, delta, 3000); + subtract_scaled(outer_segment, COLLISION_POINT1_X, delta, 11000); + add_scaled(outer_segment, COLLISION_POINT1_Y, delta, 45000); + recompute_segment_bounds(outer_segment); + + Win16FarPtr swept_edge = collision_record(82); + subtract_scaled(swept_edge, COLLISION_POINT1_X, delta, 2000); + add_scaled(swept_edge, COLLISION_POINT1_Y, delta, 43000); + subtract_scaled(swept_edge, COLLISION_BOUNDS_MIN_X, delta, 2000); + add_scaled(swept_edge, COLLISION_BOUNDS_MIN_Y, delta, 43000); + add_scaled(swept_edge, COLLISION_BOUNDS_MAX_X, delta, 2000); + subtract_scaled(swept_edge, COLLISION_BOUNDS_MAX_Y, delta, 43000); + + Win16FarPtr inner_segment = collision_record(81); + add_scaled(inner_segment, COLLISION_POINT2_X, delta, 6000); + add_scaled(inner_segment, COLLISION_POINT2_Y, delta, 49000); + add_scaled(inner_segment, COLLISION_POINT1_X, delta, 19000); + add_scaled(inner_segment, COLLISION_POINT1_Y, delta, 6000); + recompute_segment_bounds(inner_segment); +} + +static void move_flipper_bitmap_geometry_with_dc( + Win16FarPtr receiver, + int32_t delta, + uint16_t flipper, + HDC16 dc) +{ + if ((uint8_t)flipper == 1) { + update_left_flipper_records(delta); + if (win16_read_u16(win16_far_add_offset(receiver, 0x0bd4)) == 0) { + tdkpin_restore_background_region_b(52, 47, 373, 93, dc); + } else { + tdkpin_restore_background_region_a(52, 47, 373, 93, dc); + } + tdkpin_present_background_region(52, 47, 373, 93, dc); + } else if ((uint8_t)flipper == 2) { + update_right_flipper_records(delta); + if (win16_read_u16(win16_far_add_offset(receiver, 0x0bd6)) == 0) { + tdkpin_restore_background_region_b(53, 45, 372, 175, dc); + } else { + tdkpin_restore_background_region_a(53, 45, 372, 175, dc); + } + tdkpin_present_background_region(53, 45, 372, 175, dc); + } +} + +void tdkpin_move_flipper_bitmap_geometry_for_receiver( + Win16FarPtr receiver, int32_t delta, uint16_t flipper) +{ + HWND16 handle = win16_read_u16(win16_far_add_offset(receiver, 4)); + HDC16 dc = GetDC16(handle); + move_flipper_bitmap_geometry_with_dc(receiver, delta, flipper, dc); + (void)ReleaseDC16(handle, dc); +} + +/* 1000:8b0d. parent_bp is the hidden static link to 1000:99f0. */ +void tdkpin_move_flipper_bitmap_geometry( + uint16_t parent_bp, int32_t delta, uint8_t flipper) +{ + uint16_t caller_bp = win16_read_stack_u16((uint16_t)(parent_bp + 6)); + Win16FarPtr receiver = caller_receiver(caller_bp); + HWND16 handle = win16_read_u16(win16_far_add_offset(receiver, 4)); + HDC16 dc = GetDC16(handle); + win16_write_stack_u16((uint16_t)(parent_bp - 4), 0); + win16_write_stack_u16((uint16_t)(parent_bp - 2), 0); + uint32_t vertical_step = delta == 1 ? 43000u : (uint32_t)-43000; + win16_write_stack_u16( + (uint16_t)(parent_bp - 8), (uint16_t)vertical_step); + win16_write_stack_u16( + (uint16_t)(parent_bp - 6), (uint16_t)(vertical_step >> 16)); + move_flipper_bitmap_geometry_with_dc(receiver, delta, flipper, dc); + (void)ReleaseDC16(handle, dc); +} diff --git a/original/reconstructed/tdkpin_flipper_collision.c b/original/reconstructed/tdkpin_flipper_collision.c new file mode 100644 index 0000000..3ff1253 --- /dev/null +++ b/original/reconstructed/tdkpin_flipper_collision.c @@ -0,0 +1,494 @@ +/* Moving-flipper collision response at 1000:7ed9. */ + +#include "tdkpin_flippers.h" + +#include "tdkpin_arithmetic.h" +#include "tdkpin_collision_records.h" +#include "tdkpin_gameplay_helpers.h" +#include "tdkpin_real48.h" +#include "tdkpin_sound.h" + +enum { + COLLISION_RECORDS_BASE = 0x095b, + COLLISION_RECORD_BYTES = 0x53, + RECORD_RADIUS = 0x22, + RECORD_RESPONSE_NORMAL = 0x28, + COLLISION_SEARCH_RADIUS = 54000, + COLLISION_RESPONSE_RADIUS = 44000, +}; + +typedef struct { + int32_t radius; + int32_t pivot_x; + int32_t pivot_y; + int32_t unused_negative_point_x; + int32_t unused_positive_point_x; + int32_t negative_edge_x; + int32_t negative_edge_y; + int32_t positive_edge_x; + int32_t positive_edge_y; + uint16_t response_record; +} FlipperCollisionGeometry; + +static const BorlandReal48 g_real48_one_tenth = + {{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}; +static const BorlandReal48 g_real48_one_half = + {{0x80, 0, 0, 0, 0, 0}}; +static const BorlandReal48 g_real48_two = + {{0x82, 0, 0, 0, 0, 0}}; +static const BorlandReal48 g_real48_two_fifths = + {{0x7f, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}; +static const BorlandReal48 g_real48_one = + {{0x81, 0, 0, 0, 0, 0}}; +static const BorlandReal48 g_real48_thousand = + {{0x8a, 0, 0, 0, 0, 0x7a}}; + +static Win16FarPtr caller_receiver(uint16_t caller_bp) +{ + uint16_t offset = win16_read_stack_u16((uint16_t)(caller_bp + 6)); + uint16_t selector = win16_read_stack_u16((uint16_t)(caller_bp + 8)); + return win16_make_far_pointer(selector, offset); +} + +static Win16FarPtr collision_record(uint16_t id) +{ + return win16_dgroup_pointer((uint16_t)( + COLLISION_RECORDS_BASE + id * COLLISION_RECORD_BYTES)); +} + +static int32_t record_i32(uint16_t id, uint16_t offset) +{ + return (int32_t)win16_read_u32( + win16_far_add_offset(collision_record(id), offset)); +} + +static BorlandReal48 record_real48(uint16_t id, uint16_t offset) +{ + BorlandReal48 value; + Win16FarPtr source = win16_far_add_offset(collision_record(id), offset); + for (uint16_t index = 0; index < sizeof(value.bytes); index++) { + value.bytes[index] = win16_read_u8( + win16_far_add_offset(source, index)); + } + return value; +} + +static int32_t add_wrap_i32(int32_t left, int32_t right) +{ + return (int32_t)((uint32_t)left + (uint32_t)right); +} + +static int32_t subtract_wrap_i32(int32_t left, int32_t right) +{ + return (int32_t)((uint32_t)left - (uint32_t)right); +} + +static int32_t negate_wrap_i32(int32_t value) +{ + return (int32_t)(0u - (uint32_t)value); +} + +static int32_t absolute_wrap_i32(int32_t value) +{ + return value < 0 ? negate_wrap_i32(value) : value; +} + +static int32_t divide_by_thousand(int32_t value) +{ + return borland_divide_i32(value, 1000).quotient; +} + +static int32_t indeterminate_i32(void) +{ + uint32_t low = win16_indeterminate_u16(); + uint32_t high = win16_indeterminate_u16(); + return (int32_t)(low | (high << 16)); +} + +static BorlandReal48 negate_real48(BorlandReal48 value) +{ + if (value.bytes[0] != 0) { + value.bytes[5] ^= 0x80; + } + return value; +} + +static FlipperCollisionGeometry load_flipper_geometry( + int32_t delta, uint16_t flipper) +{ + FlipperCollisionGeometry geometry; + if (flipper == 1) { + geometry.radius = borland_real48_round_to_i32( + record_real48(65, RECORD_RADIUS)); + geometry.pivot_x = subtract_wrap_i32( + record_i32(65, offsetof(TdkpinCollisionRecord, point1_x_milli)), + 10000); + geometry.pivot_y = record_i32( + 65, offsetof(TdkpinCollisionRecord, point1_y_milli)); + geometry.unused_negative_point_x = record_i32( + 66, offsetof(TdkpinCollisionRecord, point1_x_milli)); + geometry.negative_edge_x = add_wrap_i32( + record_i32(66, offsetof(TdkpinCollisionRecord, point2_x_milli)), + 20000); + geometry.negative_edge_y = record_i32( + 66, offsetof(TdkpinCollisionRecord, point2_y_milli)); + geometry.unused_positive_point_x = record_i32( + 68, offsetof(TdkpinCollisionRecord, point2_x_milli)); + geometry.positive_edge_x = add_wrap_i32( + record_i32(68, offsetof(TdkpinCollisionRecord, point1_x_milli)), + 20000); + geometry.positive_edge_y = record_i32( + 68, offsetof(TdkpinCollisionRecord, point1_y_milli)); + geometry.response_record = delta == 1 ? 68 : 66; + } else if (flipper == 2) { + geometry.radius = borland_real48_round_to_i32( + record_real48(80, RECORD_RADIUS)); + geometry.pivot_x = add_wrap_i32( + record_i32(80, offsetof(TdkpinCollisionRecord, point1_x_milli)), + 10000); + geometry.pivot_y = record_i32( + 80, offsetof(TdkpinCollisionRecord, point1_y_milli)); + geometry.unused_negative_point_x = record_i32( + 83, offsetof(TdkpinCollisionRecord, point1_x_milli)); + geometry.negative_edge_x = subtract_wrap_i32( + record_i32(83, offsetof(TdkpinCollisionRecord, point1_x_milli)), + 20000); + geometry.negative_edge_y = record_i32( + 83, offsetof(TdkpinCollisionRecord, point1_y_milli)); + geometry.unused_positive_point_x = record_i32( + 81, offsetof(TdkpinCollisionRecord, point1_x_milli)); + geometry.positive_edge_x = subtract_wrap_i32( + record_i32(81, offsetof(TdkpinCollisionRecord, point1_x_milli)), + 20000); + geometry.positive_edge_y = record_i32( + 81, offsetof(TdkpinCollisionRecord, point1_y_milli)); + geometry.response_record = delta == 1 ? 81 : 83; + } else { + geometry = (FlipperCollisionGeometry){ + .radius = indeterminate_i32(), + .pivot_x = indeterminate_i32(), + .pivot_y = indeterminate_i32(), + .unused_negative_point_x = indeterminate_i32(), + .unused_positive_point_x = indeterminate_i32(), + .negative_edge_x = indeterminate_i32(), + .negative_edge_y = indeterminate_i32(), + .positive_edge_x = indeterminate_i32(), + .positive_edge_y = indeterminate_i32(), + .response_record = win16_indeterminate_u16(), + }; + } + geometry.pivot_y = add_wrap_i32( + geometry.pivot_y, + borland_multiply_i32(delta, geometry.radius)); + (void)geometry.unused_negative_point_x; + (void)geometry.unused_positive_point_x; + return geometry; +} + +static int32_t cross_product_for_edge( + int32_t edge_x, + int32_t edge_y, + int32_t pivot_x, + int32_t pivot_y, + int32_t ball_x, + int32_t ball_y) +{ + int32_t edge_from_ball_x = divide_by_thousand( + subtract_wrap_i32(edge_x, ball_x)); + int32_t edge_from_pivot_y = divide_by_thousand( + subtract_wrap_i32(edge_y, pivot_y)); + int32_t edge_from_ball_y = divide_by_thousand( + subtract_wrap_i32(edge_y, ball_y)); + int32_t edge_from_pivot_x = divide_by_thousand( + subtract_wrap_i32(edge_x, pivot_x)); + return subtract_wrap_i32( + borland_multiply_i32(edge_from_ball_y, edge_from_pivot_x), + borland_multiply_i32(edge_from_ball_x, edge_from_pivot_y)); +} + +static int32_t radial_distance_milli( + int32_t ball_x, int32_t ball_y, int32_t pivot_x, int32_t pivot_y) +{ + BorlandReal48 dx = borland_real48_divide( + borland_i32_to_real48(subtract_wrap_i32(ball_x, pivot_x)), + g_real48_thousand); + BorlandReal48 dy = borland_real48_divide( + borland_i32_to_real48(subtract_wrap_i32(ball_y, pivot_y)), + g_real48_thousand); + BorlandReal48 squared = borland_real48_add( + borland_real48_square(dx), borland_real48_square(dy)); + return borland_real48_round_to_i32( + borland_real48_multiply( + borland_real48_sqrt(squared), g_real48_thousand)); +} + +static bool point_in_moving_flipper( + const FlipperCollisionGeometry *geometry, + int32_t delta, + uint16_t flipper, + uint16_t mode, + int32_t ball_x, + int32_t ball_y, + int32_t *distance) +{ + int32_t first_cross; + int32_t second_cross; + if (delta == -1) { + first_cross = cross_product_for_edge( + geometry->negative_edge_x, + subtract_wrap_i32(geometry->negative_edge_y, 43000), + geometry->pivot_x, + geometry->pivot_y, + ball_x, + ball_y); + second_cross = cross_product_for_edge( + geometry->negative_edge_x, + add_wrap_i32(geometry->negative_edge_y, 12000), + geometry->pivot_x, + geometry->pivot_y, + ball_x, + ball_y); + } else { + first_cross = cross_product_for_edge( + geometry->positive_edge_x, + subtract_wrap_i32(geometry->positive_edge_y, 12000), + geometry->pivot_x, + geometry->pivot_y, + ball_x, + ball_y); + second_cross = cross_product_for_edge( + geometry->positive_edge_x, + add_wrap_i32(geometry->positive_edge_y, 43000), + geometry->pivot_x, + geometry->pivot_y, + ball_x, + ball_y); + } + + int32_t absolute_x = absolute_wrap_i32( + subtract_wrap_i32(ball_x, geometry->pivot_x)); + int32_t absolute_y = absolute_wrap_i32( + subtract_wrap_i32(ball_y, geometry->pivot_y)); + if (absolute_x >= COLLISION_SEARCH_RADIUS || + absolute_y >= COLLISION_SEARCH_RADIUS) { + return false; + } + *distance = radial_distance_milli( + ball_x, ball_y, geometry->pivot_x, geometry->pivot_y); + if (*distance > COLLISION_SEARCH_RADIUS || mode != 0) { + return false; + } + if (flipper == 1) { + return first_cross > -1000 && second_cross < 1000 && + ball_x > geometry->pivot_x; + } + if (flipper == 2) { + return first_cross < 1000 && second_cross > -1000 && + ball_x < geometry->pivot_x; + } + return false; +} + +static int32_t collision_penetration( + const FlipperCollisionGeometry *geometry, + int32_t delta, + int32_t ball_x, + int32_t ball_y) +{ + int32_t collision_y; + if (delta == -1) { + int32_t edge_dx = absolute_wrap_i32(subtract_wrap_i32( + geometry->negative_edge_x, geometry->pivot_x)); + if (borland_real48_compare( + borland_i32_to_real48(edge_dx), g_real48_one_tenth) > 0) { + collision_y = add_wrap_i32( + subtract_wrap_i32( + geometry->pivot_y, + absolute_wrap_i32(subtract_wrap_i32( + ball_x, geometry->pivot_x))), + 5000); + } else { + collision_y = subtract_wrap_i32( + geometry->negative_edge_y, 43000); + } + } else { + int32_t edge_dx = subtract_wrap_i32( + geometry->positive_edge_x, geometry->pivot_x); + if (borland_real48_compare( + borland_i32_to_real48(absolute_wrap_i32(edge_dx)), + g_real48_one_tenth) > 0) { + int32_t numerator = borland_multiply_i32( + subtract_wrap_i32(ball_x, geometry->pivot_x), + subtract_wrap_i32( + add_wrap_i32(geometry->positive_edge_y, 43000), + geometry->pivot_y)); + int32_t interpolation = borland_real48_round_to_i32( + borland_real48_divide( + borland_i32_to_real48(numerator), + borland_i32_to_real48(edge_dx))); + collision_y = subtract_wrap_i32( + geometry->pivot_y, interpolation); + } else { + collision_y = add_wrap_i32( + geometry->positive_edge_y, 43000); + } + } + + int32_t penetration = subtract_wrap_i32(collision_y, ball_y); + if (penetration < 0) { + return negate_wrap_i32( + borland_multiply_i32(penetration, delta)); + } + return 0; +} + +static void apply_flipper_response( + Win16FarPtr receiver, + const FlipperCollisionGeometry *geometry, + int32_t delta, + uint16_t flipper, + int32_t ball_x, + int32_t ball_y, + int32_t distance, + int32_t penetration, + uint16_t caller_bp) +{ + int32_t normal_x_integer = borland_multiply_i32( + subtract_wrap_i32(ball_x, geometry->pivot_x), delta); + int32_t normal_y_integer = borland_multiply_i32( + add_wrap_i32( + subtract_wrap_i32(ball_y, geometry->pivot_y), 4000), + delta); + BorlandReal48 normal_x = borland_i32_to_real48(normal_x_integer); + BorlandReal48 normal_y = borland_i32_to_real48(normal_y_integer); + if (flipper == 2) { + normal_x = negate_real48(normal_x); + normal_y = negate_real48(normal_y); + } + + int32_t velocity_x = (int32_t)win16_read_u32( + win16_far_add_offset(receiver, 0x0baa)); + int32_t velocity_y = (int32_t)win16_read_u32( + win16_far_add_offset(receiver, 0x0bae)); + BorlandReal48 response_radius = + borland_i32_to_real48(COLLISION_RESPONSE_RADIUS); + + /* 1000:94ce-9553 computes this projection and then deliberately clears it. */ + BorlandReal48 discarded_projection_real = borland_real48_divide( + borland_real48_multiply( + borland_real48_add( + borland_real48_multiply( + borland_i32_to_real48(velocity_y), normal_y), + borland_real48_multiply( + borland_i32_to_real48(velocity_x), normal_x)), + g_real48_one_half), + response_radius); + (void)borland_real48_round_to_i32(discarded_projection_real); + int32_t normal_projection = 0; + + int32_t tangent_projection = borland_real48_round_to_i32( + borland_real48_divide( + borland_real48_subtract( + borland_real48_multiply( + borland_i32_to_real48(velocity_x), normal_y), + borland_real48_multiply( + borland_i32_to_real48(velocity_y), normal_x)), + response_radius)); + + BorlandReal48 gain = borland_real48_add( + borland_real48_multiply( + borland_real48_sqrt(borland_real48_divide( + borland_i32_to_real48(distance), response_radius)), + g_real48_two), + g_real48_two_fifths); + BorlandReal48 record_response = record_real48( + geometry->response_record, RECORD_RESPONSE_NORMAL); + tangent_projection = add_wrap_i32( + borland_real48_round_to_i32( + borland_real48_multiply( + borland_i32_to_real48(tangent_projection), + borland_real48_add(g_real48_one, record_response))), + borland_real48_round_to_i32( + borland_real48_multiply( + borland_i32_to_real48((int32_t)win16_read_u32( + win16_far_add_offset(receiver, 0x56))), + gain))); + + int32_t delta_velocity_x = borland_real48_round_to_i32( + borland_real48_divide( + borland_real48_subtract( + borland_real48_multiply( + borland_i32_to_real48(normal_projection), normal_x), + borland_real48_multiply( + borland_i32_to_real48(tangent_projection), normal_y)), + response_radius)); + velocity_x = add_wrap_i32(velocity_x, delta_velocity_x); + win16_write_u32(receiver, 0x0baa, (uint32_t)velocity_x); + + int32_t delta_velocity_y = borland_real48_round_to_i32( + borland_real48_divide( + borland_real48_add( + borland_real48_multiply( + borland_i32_to_real48(tangent_projection), normal_x), + borland_real48_multiply( + borland_i32_to_real48(normal_projection), normal_y)), + response_radius)); + velocity_y = add_wrap_i32(velocity_y, delta_velocity_y); + win16_write_u32(receiver, 0x0bae, (uint32_t)velocity_y); + + int32_t movement_x = borland_real48_round_to_i32( + borland_real48_divide( + borland_i32_to_real48( + borland_multiply_i32(penetration, velocity_x)), + borland_i32_to_real48(velocity_y))); + tdkpin_move_ball_and_render( + caller_bp, movement_x, penetration); +} + +void tdkpin_move_flipper_collision_geometry( + uint16_t caller_bp, + int32_t delta, + uint16_t flipper, + uint16_t mode) +{ + tdkpin_play_sound_if_not_tilted(21); + Win16FarPtr receiver = caller_receiver(caller_bp); + FlipperCollisionGeometry geometry = + load_flipper_geometry(delta, flipper); + uint16_t ball_count = win16_read_u8( + win16_far_add_offset(receiver, 0x61)); + for (uint16_t ball = 1; ball <= ball_count; ball++) { + if (win16_read_u8(win16_far_add_offset(receiver, 0x61)) > 1) { + tdkpin_load_ball_slot(caller_bp, (uint16_t)(ball - 1u)); + } + int32_t ball_x = (int32_t)win16_read_u32( + win16_dgroup_pointer(0x07d3)); + int32_t ball_y = (int32_t)win16_read_u32( + win16_dgroup_pointer(0x07d7)); + int32_t distance = 0; + if (point_in_moving_flipper( + &geometry, + delta, + flipper, + mode, + ball_x, + ball_y, + &distance)) { + int32_t penetration = collision_penetration( + &geometry, delta, ball_x, ball_y); + apply_flipper_response( + receiver, + &geometry, + delta, + flipper, + ball_x, + ball_y, + distance, + penetration, + caller_bp); + } + if (win16_read_u8(win16_far_add_offset(receiver, 0x61)) > 1) { + tdkpin_save_ball_slot(caller_bp, (uint16_t)(ball - 1u)); + } + } +} diff --git a/original/reconstructed/tdkpin_flippers.c b/original/reconstructed/tdkpin_flippers.c new file mode 100644 index 0000000..374ace1 --- /dev/null +++ b/original/reconstructed/tdkpin_flippers.c @@ -0,0 +1,44 @@ +/* Edge-triggered left/right flipper dispatcher at 1000:99f0. */ + +#include "tdkpin_flippers.h" + +static Win16FarPtr caller_receiver(uint16_t caller_bp) +{ + uint16_t offset = win16_read_stack_u16((uint16_t)(caller_bp + 6)); + uint16_t selector = win16_read_stack_u16((uint16_t)(caller_bp + 8)); + return win16_make_far_pointer(selector, offset); +} + +static void update_one_flipper( + uint16_t caller_bp, + Win16FarPtr receiver, + uint16_t key_offset, + uint16_t position_offset, + uint16_t flipper) +{ + bool pressed = win16_read_u8( + win16_far_add_offset(receiver, key_offset)) != 0; + uint16_t position = win16_read_u16( + win16_far_add_offset(receiver, position_offset)); + int32_t delta; + if (pressed && position < 1) { + win16_write_u16(receiver, position_offset, (uint16_t)(position + 1u)); + delta = -1; + } else if (!pressed && position > 0) { + win16_write_u16(receiver, position_offset, (uint16_t)(position - 1u)); + delta = 1; + } else { + return; + } + tdkpin_move_flipper_collision_geometry( + caller_bp, delta, flipper, 0); + tdkpin_move_flipper_bitmap_geometry_for_receiver( + receiver, delta, flipper); +} + +void tdkpin_update_flippers(uint16_t caller_bp) +{ + Win16FarPtr receiver = caller_receiver(caller_bp); + update_one_flipper(caller_bp, receiver, 0x0bda, 0x0bd4, 1); + update_one_flipper(caller_bp, receiver, 0x0bdb, 0x0bd6, 2); +} diff --git a/original/reconstructed/tdkpin_flippers.h b/original/reconstructed/tdkpin_flippers.h new file mode 100644 index 0000000..cbc7793 --- /dev/null +++ b/original/reconstructed/tdkpin_flippers.h @@ -0,0 +1,24 @@ +#ifndef TDKPIN_FLIPPERS_H +#define TDKPIN_FLIPPERS_H + +#include "tdkpin_segmented.h" + +void tdkpin_update_flippers( + uint16_t caller_bp); /* 1000:99f0 */ + +/* Verified dependency seams whose ABI bodies are reconstructed separately. */ +void tdkpin_move_flipper_collision_geometry( + uint16_t caller_bp, + int32_t delta, + uint16_t flipper, + uint16_t mode); /* 1000:7ed9 */ +void tdkpin_move_flipper_bitmap_geometry_for_receiver( + Win16FarPtr receiver, + int32_t delta, + uint16_t flipper); /* semantic core of 1000:8b0d */ +void tdkpin_move_flipper_bitmap_geometry( + uint16_t parent_bp, + int32_t delta, + uint8_t flipper); /* 1000:8b0d */ + +#endif diff --git a/original/reconstructed/tdkpin_game_application.c b/original/reconstructed/tdkpin_game_application.c new file mode 100644 index 0000000..1d786bb --- /dev/null +++ b/original/reconstructed/tdkpin_game_application.c @@ -0,0 +1,91 @@ +/* TDKPIN-specific TApplication virtual methods. */ + +#include "tdkpin_game_application.h" +#include "tdkpin_window_messages.h" + +enum { + DGROUP_MODULE_NAME = 0x0222, + DGROUP_APPLICATION_TITLE = 0x022c, + DGROUP_ALREADY_RUNNING = 0x0245, + MAIN_WINDOW_VMT = 0x009e, + APPLICATION_MAIN_WINDOW_OFFSET = 8, + ALREADY_RUNNING_MESSAGE_FLAGS = 0x2010, +}; + +/* 1000:0100 — initialize ObjectWindows, then CTL3D with fixed flags 1/1/1. */ +void tdkpin_application_init_instance(Win16FarPtr application) +{ + object_windows_application_initialize(application); + Win16FarPtr module_name = win16_dgroup_pointer(DGROUP_MODULE_NAME); + (void)multimedia_initialize_export( + 1, + 1, + 1, + win16_far_offset(module_name), + win16_far_selector(module_name)); +} + +/* + * 1000:0121 — first-instance MainWindow construction or second-instance + * refusal dialog followed by Halt(0). + */ +void tdkpin_application_init_application(Win16FarPtr application) +{ + Win16FarPtr title = win16_dgroup_pointer(DGROUP_APPLICATION_TITLE); + if (g_win16_previous_instance == 0) { + Win16FarPtr main_window = tdkpin_main_window_construct( + 0, MAIN_WINDOW_VMT, title, 0); + win16_write_u16( + application, + APPLICATION_MAIN_WINDOW_OFFSET, + win16_far_offset(main_window)); + win16_write_u16( + application, + APPLICATION_MAIN_WINDOW_OFFSET + 2, + win16_far_selector(main_window)); + return; + } + (void)win16_call_message_box_far( + g_win16_message_box, + 0, + win16_dgroup_pointer(DGROUP_ALREADY_RUNNING), + title, + ALREADY_RUNNING_MESSAGE_FLAGS); + borland_runtime_exit(0); +} + +/* 1000:016c — TDKPIN main-window class overrides. */ +void tdkpin_build_main_window_class( + Win16FarPtr window, WNDCLASS16 *window_class) +{ + object_windows_build_window_class(window, window_class); + window_class->style = 0x3000; + window_class->icon = LoadIcon16( + g_win16_instance, win16_make_far_pointer(0, 0x03e4)); + window_class->cursor = + LoadCursor16(0, win16_make_far_pointer(0, 0x7f00)); + window_class->background_brush = GetStockObject16(0); + window_class->instance = g_win16_instance; + window_class->class_extra_bytes = 0; + window_class->window_extra_bytes = 0; +} + +static void build_stock_brush_class( + Win16FarPtr window, WNDCLASS16 *window_class) +{ + object_windows_build_window_class(window, window_class); + window_class->background_brush = GetStockObject16(5); + window_class->style |= 0x3800; +} + +void tdkpin_build_stock_brush_class_a( + Win16FarPtr window, WNDCLASS16 *window_class) +{ + build_stock_brush_class(window, window_class); +} + +void tdkpin_build_stock_brush_class_b( + Win16FarPtr window, WNDCLASS16 *window_class) +{ + build_stock_brush_class(window, window_class); +} diff --git a/original/reconstructed/tdkpin_game_application.h b/original/reconstructed/tdkpin_game_application.h new file mode 100644 index 0000000..d365369 --- /dev/null +++ b/original/reconstructed/tdkpin_game_application.h @@ -0,0 +1,19 @@ +#ifndef TDKPIN_GAME_APPLICATION_H +#define TDKPIN_GAME_APPLICATION_H + +#include "tdkpin_game_windows.h" +#include "tdkpin_multimedia.h" + +void tdkpin_application_init_instance( + Win16FarPtr application); /* 1000:0100 */ +void tdkpin_application_init_application( + Win16FarPtr application); /* 1000:0121 */ + +void tdkpin_build_main_window_class( + Win16FarPtr window, WNDCLASS16 *window_class); /* 1000:016c */ +void tdkpin_build_stock_brush_class_a( + Win16FarPtr window, WNDCLASS16 *window_class); /* 1000:5ab7 */ +void tdkpin_build_stock_brush_class_b( + Win16FarPtr window, WNDCLASS16 *window_class); /* 1000:6040 */ + +#endif diff --git a/original/reconstructed/tdkpin_game_assets.c b/original/reconstructed/tdkpin_game_assets.c new file mode 100644 index 0000000..6bd71a9 --- /dev/null +++ b/original/reconstructed/tdkpin_game_assets.c @@ -0,0 +1,278 @@ +/* TDKPIN asset-loading progress and bitmap ownership paths. */ + +#include "tdkpin_game_assets.h" + +#include "tdkpin_palette.h" +#include "tdkpin_window_placement.h" + +enum { + FRAME_MEMORY_DC = -0x0c, + FRAME_PREVIOUS_BITMAP = -0x04, + FRAME_LOADING_BITMAP = -0x02, + FRAME_DESTINATION_DC = 0x0e, + LOADING_DESTINATION_X = 13, + LOADING_WIDTH = 328, + LOADING_HEIGHT = 202, + WIN16_SRCCOPY = 0x00cc0020, + DGROUP_OVERLAY_BITMAP = 0x0867, + WINDOW_HANDLE_OFFSET = 4, + OVERLAY_DAT_RESOURCE = 993, + DGROUP_PALETTE_UPDATE_ACTIVE = 0x07c4, + MESSAGE_WPARAM_OFFSET = 4, + MESSAGE_RESULT_OFFSET = 10, + DGROUP_PALETTE_HANDLE = 0x444e, + DGROUP_BOARD_INDEX = 0x07cd, + BOARD_DAT_RESOURCE_BASE = 1000, + WIN16_IDC_WAIT = 0x7f02, + WIN16_IDC_ARROW = 0x7f00, + BOARD_WIDTH = 640, + BOARD_HEIGHT = 460, +}; + +static Win16FarPtr frame_field(Win16FarPtr caller_bp, int16_t offset) +{ + return win16_far_add_offset(caller_bp, (uint16_t)offset); +} + +/* + * 1000:531e — draw one numbered asset-loading stage. The target receives the + * caller's BP, mutates its scratch HDC/HGDIOBJ words, and deletes the compatible + * DC through DeleteObject16 (not DeleteDC16). This unusual API choice is kept. + */ +void tdkpin_draw_loading_stage(Win16FarPtr caller_bp, uint8_t stage) +{ + HDC16 destination = + win16_read_u16(frame_field(caller_bp, FRAME_DESTINATION_DC)); + HDC16 memory_dc = CreateCompatibleDC16(destination); + win16_write_u16( + frame_field(caller_bp, FRAME_MEMORY_DC), 0, memory_dc); + HBITMAP16 loading_bitmap = + win16_read_u16(frame_field(caller_bp, FRAME_LOADING_BITMAP)); + HGDIOBJ16 previous = SelectObject16(memory_dc, loading_bitmap); + win16_write_u16( + frame_field(caller_bp, FRAME_PREVIOUS_BITMAP), 0, previous); + uint16_t wrapped_y = (uint16_t)(((uint16_t)stage - 1) * 7); + (void)BitBlt16( + destination, + LOADING_DESTINATION_X, + (INT16)wrapped_y, + LOADING_WIDTH, + LOADING_HEIGHT, + memory_dc, + 0, + 0, + WIN16_SRCCOPY); + (void)SelectObject16(memory_dc, previous); + (void)DeleteObject16(memory_dc); +} + +/* 1000:5be5 — finish TWindow setup, load DAT 993, then focus the HWND. */ +void tdkpin_setup_overlay_window(Win16FarPtr window) +{ + object_windows_setup_window(window); + HBITMAP16 overlay = tdkpin_load_bitmap_resource( + win16_make_far_pointer(0, OVERLAY_DAT_RESOURCE), g_win16_instance); + win16_write_u16( + win16_dgroup_pointer(DGROUP_OVERLAY_BITMAP), 0, overlay); + (void)SetFocus16( + win16_read_u16(win16_far_add_offset(window, WINDOW_HANDLE_OFFSET))); +} + +static void invalidate_palette_window( + Win16FarPtr window, Win16FarPtr message) +{ + HWND16 handle = + win16_read_u16(win16_far_add_offset(window, WINDOW_HANDLE_OFFSET)); + win16_write_u8( + win16_dgroup_pointer(DGROUP_PALETTE_UPDATE_ACTIVE), 1); + (void)InvalidateRect16(handle, 0, 0); + (void)UpdateWindow16(handle); + win16_write_u32(message, MESSAGE_RESULT_OFFSET, 0); +} + +/* + * 1000:58e7 — reset on wParam zero; otherwise begin one non-iconic palette + * refresh only while the reentrancy byte is clear. Suppressed paths return the + * target's uninitialized local word. + */ +uint16_t tdkpin_palette_change_variant_a( + Win16FarPtr window, Win16FarPtr message) +{ + uint16_t wparam = + win16_read_u16(win16_far_add_offset(message, MESSAGE_WPARAM_OFFSET)); + if (wparam == 0) { + win16_write_u8( + win16_dgroup_pointer(DGROUP_PALETTE_UPDATE_ACTIVE), 0); + return 0; + } + if (win16_read_u8( + win16_dgroup_pointer(DGROUP_PALETTE_UPDATE_ACTIVE)) == 0) { + HWND16 handle = win16_read_u16( + win16_far_add_offset(window, WINDOW_HANDLE_OFFSET)); + if (IsIconic16(handle) == 0) { + invalidate_palette_window(window, message); + return 0; + } + } + return win16_indeterminate_u16(); +} + +/* 1000:5956 — zero-wParam refresh variant without the IsIconic test. */ +void tdkpin_palette_change_variant_b( + Win16FarPtr window, Win16FarPtr message) +{ + uint16_t wparam = + win16_read_u16(win16_far_add_offset(message, MESSAGE_WPARAM_OFFSET)); + if (wparam == 0 && + win16_read_u8( + win16_dgroup_pointer(DGROUP_PALETTE_UPDATE_ACTIVE)) == 0) { + invalidate_palette_window(window, message); + } +} + +/* + * 1000:59a0 — WM_PALETTECHANGED. Ignore notifications originating from this + * window or its child; otherwise realize the global palette as a background + * palette, update mapped colors, restore the previous palette, and consume it. + */ +static uint16_t wm_palette_changed_impl( + Win16FarPtr window, Win16FarPtr message) +{ + HWND16 window_handle = + win16_read_u16(win16_far_add_offset(window, WINDOW_HANDLE_OFFSET)); + HWND16 changed_window = + win16_read_u16(win16_far_add_offset(message, MESSAGE_WPARAM_OFFSET)); + if (changed_window == window_handle || + GetParent16(changed_window) == window_handle) { + return 1; + } + + HDC16 dc = GetDC16(window_handle); + HPALETTE16 palette = win16_read_u16( + win16_dgroup_pointer(DGROUP_PALETTE_HANDLE)); + HPALETTE16 previous = SelectPalette16(dc, palette, 1); + (void)RealizePalette16(dc); + (void)UpdateColors16(dc); + (void)SelectPalette16(dc, previous, 0); + (void)ReleaseDC16(window_handle, dc); + win16_write_u32(message, MESSAGE_RESULT_OFFSET, 0); + return 0; +} + +uint16_t tdkpin_wm_palette_changed( + Win16FarPtr window, Win16FarPtr message) +{ + return wm_palette_changed_impl(window, message); +} + +uint16_t tdkpin_wm_palette_changed_variant_b( + Win16FarPtr window, Win16FarPtr message) +{ + return wm_palette_changed_impl(window, message); +} + +uint16_t tdkpin_wm_palette_changed_variant_c( + Win16FarPtr window, Win16FarPtr message) +{ + return wm_palette_changed_impl(window, message); +} + +/* + * 1000:5a37 — WM_QUERYNEWPALETTE. Return/publish the signed number of palette + * entries remapped and invalidate the whole window only when that count > 0. + */ +static int16_t wm_query_new_palette_impl( + Win16FarPtr window, Win16FarPtr message) +{ + HWND16 window_handle = + win16_read_u16(win16_far_add_offset(window, WINDOW_HANDLE_OFFSET)); + HDC16 dc = GetDC16(window_handle); + HPALETTE16 palette = win16_read_u16( + win16_dgroup_pointer(DGROUP_PALETTE_HANDLE)); + HPALETTE16 previous = SelectPalette16(dc, palette, 0); + int16_t changed = (int16_t)RealizePalette16(dc); + (void)SelectPalette16(dc, previous, 0); + (void)ReleaseDC16(window_handle, dc); + if (changed > 0) { + (void)InvalidateRect16(window_handle, 0, 0); + } + win16_write_u32(message, MESSAGE_RESULT_OFFSET, (uint16_t)changed); + return changed; +} + +int16_t tdkpin_wm_query_new_palette( + Win16FarPtr window, Win16FarPtr message) +{ + return wm_query_new_palette_impl(window, message); +} + +int16_t tdkpin_wm_query_new_palette_variant_b( + Win16FarPtr window, Win16FarPtr message) +{ + return wm_query_new_palette_impl(window, message); +} + +int16_t tdkpin_wm_query_new_palette_variant_c( + Win16FarPtr window, Win16FarPtr message) +{ + return wm_query_new_palette_impl(window, message); +} + +/* 1000:6129 — setup one board window and load DAT 1000+board_index. */ +void tdkpin_setup_board_window(Win16FarPtr window) +{ + object_windows_setup_window(window); + HCURSOR16 wait_cursor = LoadCursor16( + 0, win16_make_far_pointer(0, WIN16_IDC_WAIT)); + (void)SetCursor16(wait_cursor); + uint16_t board_index = win16_read_u16( + win16_dgroup_pointer(DGROUP_BOARD_INDEX)); + uint16_t resource_id = + (uint16_t)(board_index + BOARD_DAT_RESOURCE_BASE); + HBITMAP16 bitmap = tdkpin_load_bitmap_resource( + win16_make_far_pointer(0, resource_id), g_win16_instance); + win16_write_u16( + win16_dgroup_pointer(DGROUP_OVERLAY_BITMAP), 0, bitmap); + (void)SetFocus16( + win16_read_u16(win16_far_add_offset(window, WINDOW_HANDLE_OFFSET))); +} + +/* + * 1000:616e — draw the current 640x460 board DAT through a compatible DC, + * preserving the caller's palette/object selections and restoring Arrow. + */ +void tdkpin_draw_board_overlay( + Win16FarPtr ignored_object, + uint16_t ignored_1, + uint16_t ignored_2, + HDC16 destination) +{ + (void)ignored_object; + (void)ignored_1; + (void)ignored_2; + HPALETTE16 palette = win16_read_u16( + win16_dgroup_pointer(DGROUP_PALETTE_HANDLE)); + HPALETTE16 previous_palette = SelectPalette16(destination, palette, 0); + (void)UnrealizeObject16(palette); + (void)RealizePalette16(destination); + HDC16 source = CreateCompatibleDC16(destination); + HBITMAP16 bitmap = win16_read_u16( + win16_dgroup_pointer(DGROUP_OVERLAY_BITMAP)); + HGDIOBJ16 previous_bitmap = SelectObject16(source, bitmap); + (void)BitBlt16( + destination, + 0, + 0, + BOARD_WIDTH, + BOARD_HEIGHT, + source, + 0, + 0, + WIN16_SRCCOPY); + (void)SelectObject16(source, previous_bitmap); + (void)DeleteDC16(source); + (void)SelectPalette16(destination, previous_palette, 0); + HCURSOR16 arrow = LoadCursor16( + 0, win16_make_far_pointer(0, WIN16_IDC_ARROW)); + (void)SetCursor16(arrow); +} diff --git a/original/reconstructed/tdkpin_game_assets.h b/original/reconstructed/tdkpin_game_assets.h new file mode 100644 index 0000000..20715c8 --- /dev/null +++ b/original/reconstructed/tdkpin_game_assets.h @@ -0,0 +1,49 @@ +#ifndef TDKPIN_GAME_ASSETS_H +#define TDKPIN_GAME_ASSETS_H + +#include "tdkpin_segmented.h" + +void tdkpin_draw_loading_stage( + Win16FarPtr caller_bp, + uint8_t stage); /* 1000:531e */ +void tdkpin_setup_overlay_window(Win16FarPtr window); /* 1000:5be5 */ +uint16_t tdkpin_palette_change_variant_a( + Win16FarPtr window, + Win16FarPtr message); /* 1000:58e7 */ +void tdkpin_palette_change_variant_b( + Win16FarPtr window, + Win16FarPtr message); /* 1000:5956 */ +uint16_t tdkpin_wm_palette_changed( + Win16FarPtr window, + Win16FarPtr message); /* 1000:59a0 */ +uint16_t tdkpin_wm_palette_changed_variant_b( + Win16FarPtr window, + Win16FarPtr message); /* 1000:5f29 */ +uint16_t tdkpin_wm_palette_changed_variant_c( + Win16FarPtr window, + Win16FarPtr message); /* 1000:6245 */ +int16_t tdkpin_wm_query_new_palette( + Win16FarPtr window, + Win16FarPtr message); /* 1000:5a37 */ +int16_t tdkpin_wm_query_new_palette_variant_b( + Win16FarPtr window, + Win16FarPtr message); /* 1000:5fc0 */ +int16_t tdkpin_wm_query_new_palette_variant_c( + Win16FarPtr window, + Win16FarPtr message); /* 1000:62dc */ +void tdkpin_setup_board_window(Win16FarPtr window); /* 1000:6129 */ +void tdkpin_draw_board_overlay( + Win16FarPtr ignored_object, + uint16_t ignored_1, + uint16_t ignored_2, + HDC16 destination); /* 1000:616e */ +void tdkpin_initialize_assets_and_redraw( + Win16FarPtr window, + uint16_t ignored_1, + uint16_t ignored_2, + HDC16 destination); /* 1000:5390 */ +void tdkpin_asset_window_destruct( + Win16FarPtr window, + uint16_t vmt); /* 1000:51f5 */ + +#endif diff --git a/original/reconstructed/tdkpin_game_setup.c b/original/reconstructed/tdkpin_game_setup.c new file mode 100644 index 0000000..383a71c --- /dev/null +++ b/original/reconstructed/tdkpin_game_setup.c @@ -0,0 +1,293 @@ +/* Complete game-window setup and collision/table construction at 1000:0270. */ + +#include "tdkpin_game_setup.h" + +#include "tdkpin_application.h" +#include "tdkpin_command_line.h" +#include "tdkpin_heap.h" +#include "tdkpin_palette.h" +#include "tdkpin_shortstrings.h" +#include "tdkpin_strings.h" +#include "tdkpin_system_timer.h" +#include "tdkpin_window_placement.h" + +#include + +#include "tdkpin_game_setup_collision_data.inc" + +typedef struct { + uint16_t word_0; + uint16_t word_2; + uint16_t word_4; + uint16_t word_6; +} SetupWordQuad; + +static const SetupWordQuad g_game_setup_word_quads[20] = { + {0x0067, 0x0130, 0x0079, 0x0143}, + {0x0077, 0x0118, 0x0089, 0x012b}, + {0x0094, 0x0110, 0x00a6, 0x0123}, + {0x00b1, 0x0118, 0x00c3, 0x012b}, + {0x00c1, 0x012f, 0x00d3, 0x0142}, + {0x0000, 0x0014, 0x0000, 0x0014}, + {0x0000, 0x0014, 0x0000, 0x0014}, + {0x0000, 0x0014, 0x0000, 0x0014}, + {0x0000, 0x0014, 0x0000, 0x0014}, + {0x0000, 0x0014, 0x0000, 0x0014}, + {0x0000, 0x0014, 0x0000, 0x0014}, + {0x0000, 0x0014, 0x0000, 0x0014}, + {0x0000, 0x0014, 0x0000, 0x0014}, + {0x0000, 0x0014, 0x0000, 0x0014}, + {0x0057, 0x0044, 0x0067, 0x0054}, + {0x0069, 0x0029, 0x007b, 0x0039}, + {0x008a, 0x0033, 0x009a, 0x0043}, + {0x008a, 0x0053, 0x009a, 0x0063}, + {0x006a, 0x005e, 0x007a, 0x006e}, + {0x0009, 0x000e, 0x0019, 0x001e}, +}; + +static void write_far(Win16FarPtr base, uint16_t offset, Win16FarPtr value) +{ + win16_write_u32(base, offset, value); +} + +static void fail_setup( + Win16FarPtr window, + Win16FarPtr text, + HWND16 owner, + bool close_window) +{ + Win16FarPtr message_box = win16_read_far_pointer( + win16_dgroup_pointer(0x0666), 0); + (void)win16_call_message_box_far( + message_box, + owner, + text, + win16_dgroup_pointer(0x02aa), + 0x2010); + if (close_window && window != 0) { + object_windows_close_if_allowed(window); + } + borland_runtime_exit(0); +} + +static void initialize_base_state(Win16FarPtr window) +{ + win16_write_u8(win16_dgroup_pointer(0x07cf), 0); + win16_write_u8(win16_dgroup_pointer(0x0874), 0); + win16_write_u8(win16_dgroup_pointer(0x0875), 0); + win16_write_u16(window, 0x41, 0); + win16_write_u16(window, 0x43, 0); + win16_write_u16(window, 0x45, 0); + win16_write_u16(window, 0x47, 0); + + if (borland_heap_free_space() < UINT32_C(0x00400000)) { + fail_setup(window, win16_dgroup_pointer(0x0260), 0, true); + } + object_windows_setup_window(window); + HCURSOR16 cursor = LoadCursor16(0, win16_make_far_pointer(0, 0x7f02)); + (void)SetCursor16(cursor); + HWND16 handle = win16_read_u16(win16_far_add_offset(window, 4)); + tdkpin_realize_nocollapse_palette(handle); + tdkpin_load_palette_resource( + win16_dgroup_pointer(0x4450), + win16_make_far_pointer(0, 999), + win16_read_u16(win16_dgroup_pointer(0x06fe))); + tdkpin_create_palette_from_rgb_table(); + win16_write_u8(win16_dgroup_pointer(0x07cc), 1); + win16_write_u16(window, 0x4d, 0); + win16_write_u16(window, 0x4f, 0); + win16_write_u8(win16_far_add_offset(window, 0x51), 0); + win16_write_u8(win16_far_add_offset(window, 0x0bd8), 0); + win16_write_u32(win16_dgroup_pointer(0x0720), 0, GetTickCount16()); + win16_write_u16(window, 0x0be3, 0); + win16_write_u8(win16_dgroup_pointer(0x07c7), 0); + win16_write_u8(win16_dgroup_pointer(0x07c8), 0); + win16_write_u16(win16_dgroup_pointer(0x086d), 0, 10); + win16_write_u16(win16_dgroup_pointer(0x086f), 0, 10); + win16_write_u8(win16_dgroup_pointer(0x0873), 0); + win16_write_u8(win16_dgroup_pointer(0x07ca), 0); + win16_write_u8(win16_dgroup_pointer(0x07cb), 0); + win16_write_u8(win16_dgroup_pointer(0x07c9), 1); + win16_write_u32(window, 0x0bca, 0); + win16_write_u8(win16_far_add_offset(window, 0x0bd9), 0); + win16_write_u32(window, 0x0bc2, 325000); + win16_write_u32(window, 0x0bc6, 413000); + win16_write_u32(win16_dgroup_pointer(0x07d3), 0, 325000); + win16_write_u32(win16_dgroup_pointer(0x07d7), 0, 413000); + win16_write_u8(win16_far_add_offset(window, 0x0bdd), 0); + win16_write_u8(win16_far_add_offset(window, 0x0bdf), 0); + win16_write_u8(win16_far_add_offset(window, 0x0bdc), 0); + win16_write_u8(win16_far_add_offset(window, 0x0be0), 0); + win16_write_u8(win16_far_add_offset(window, 0x0be1), 0); + win16_write_u8(win16_far_add_offset(window, 0x0be2), 0); + win16_write_u8(win16_dgroup_pointer(0x07c5), 0); + win16_write_u8(win16_far_add_offset(window, 0x0bde), 1); + win16_write_u8(win16_dgroup_pointer(0x07d0), 0); + win16_write_u8(win16_dgroup_pointer(0x07d1), 0); + win16_write_u8(win16_far_add_offset(window, 0x61), 1); + win16_write_u16(win16_dgroup_pointer(0x086b), 0, 99); + win16_write_u16(win16_dgroup_pointer(0x0869), 0, 0); + win16_write_u16(win16_dgroup_pointer(0x0876), 0, 0); + win16_write_u16(win16_dgroup_pointer(0x0878), 0, 0); + win16_write_u16(win16_dgroup_pointer(0x087a), 0, 0); + win16_write_u16(win16_dgroup_pointer(0x087c), 0, 0); +} + +static void initialize_player_defaults(Win16FarPtr window) +{ + for (uint16_t item = 1; item <= 20; item++) { + for (uint16_t player = 1; player <= 4; player++) { + win16_write_u8( + win16_far_add_offset(window, (uint16_t)( + 0x047b + (player - 1u) * 0x14u + item)), + 0); + } + } + for (uint16_t player = 1; player <= 4; player++) { + win16_write_u32( + win16_dgroup_pointer((uint16_t)(0x097e + player * 4u)), 0, 0); + win16_write_u32( + win16_dgroup_pointer((uint16_t)(0x098e + player * 4u)), 0, 0); + win16_write_u8( + win16_dgroup_pointer((uint16_t)(0x09a1 + player)), 1); + win16_write_u16( + win16_dgroup_pointer((uint16_t)(0x09a4 + player * 2u)), 0, 0); + win16_write_u16( + win16_dgroup_pointer((uint16_t)(0x081f + player * 2u)), 0, 0xffff); + win16_write_u8( + win16_dgroup_pointer((uint16_t)(0x0816 + player)), 1); + win16_write_u32( + win16_dgroup_pointer((uint16_t)(0x0835 + player * 4u)), 0, 1); + win16_write_u8( + win16_dgroup_pointer((uint16_t)(0x081a + player)), 1); + } + static const uint32_t thresholds[4] = { + 140000u, 650000u, 1300000u, 4000000u}; + for (uint16_t index = 0; index < 4; index++) { + win16_write_u32( + win16_dgroup_pointer((uint16_t)(0x0829 + index * 4u)), + 0, + thresholds[index]); + } +} + +static void initialize_ball_projection(Win16FarPtr window) +{ + win16_write_u32(window, 0x0baa, 0); + win16_write_u32(window, 0x0bae, 0); + win16_write_u16(window, 0x0bce, 0); + win16_write_u16(window, 0x0bd0, 0); + win16_write_u16(window, 0x0bd2, 0); + int32_t pixel_x = borland_divide_i32(325500, 1000).quotient; + int32_t pixel_y = borland_divide_i32(413500, 1000).quotient; + win16_write_u32(window, 0x0ba2, (uint32_t)pixel_x); + win16_write_u32(window, 0x0ba6, (uint32_t)pixel_y); + win16_write_u32(window, 0x0bb2, 0); + win16_write_u32(window, 0x0bb6, 0); + win16_write_u8(win16_far_add_offset(window, 0x0bda), 0); + win16_write_u8(win16_far_add_offset(window, 0x0bdb), 0); + win16_write_u32(window, 0x0bd4, 0); +} + +static void build_ini_file_name(Win16FarPtr result) +{ + uint8_t parameter_bytes[256]; + uint8_t module_name_bytes[103]; + Win16FarPtr parameter = win16_stack_pointer(parameter_bytes); + Win16FarPtr module_name = win16_stack_pointer(module_name_bytes); + borland_parameter_string(0, parameter); + (void)borland_short_to_c_string(module_name, parameter); + borland_parameter_string(0, parameter); + uint16_t dot = borland_short_position( + win16_relocated_code_pointer(1, 0x026e), parameter); + (void)borland_far_strncpy(result, module_name, dot); + (void)borland_far_strcat(result, win16_dgroup_pointer(0x02c3)); +} + +static void initialize_profile_and_timer(Win16FarPtr window) +{ + uint8_t ini_file_bytes[101]; + Win16FarPtr ini_file = win16_stack_pointer(ini_file_bytes); + build_ini_file_name(ini_file); + uint16_t language = GetPrivateProfileInt16( + win16_dgroup_pointer(0x02c7), + win16_dgroup_pointer(0x02d0), + 1, + ini_file); + if (language < 1 || language > 5) { + language = 1; + } + win16_write_u16(win16_dgroup_pointer(0x07cd), 0, language); + uint16_t speed_word = GetPrivateProfileInt16( + win16_dgroup_pointer(0x02c7), + win16_dgroup_pointer(0x02d9), + 3, + ini_file); + uint8_t speed = (uint8_t)speed_word; + if (speed < 1 || speed > 5) { + speed = 3; + } + win16_write_u8(win16_far_add_offset(window, 0x60), speed); + win16_write_u32(window, 0x5a, 15); + win16_write_u32(window, 0x56, 3800); + static const uint16_t delay_by_speed[5] = {50, 40, 30, 20, 10}; + static const uint16_t step_by_speed[5] = {5, 4, 3, 2, 1}; + uint16_t delay = delay_by_speed[speed - 1u]; + win16_write_u16( + win16_dgroup_pointer(0x0871), 0, step_by_speed[speed - 1u]); + Win16FarPtr timer = tdkpin_system_timer_construct( + 0, + 0x05c0, + 0, + 1, + delay, + win16_read_u16(win16_far_add_offset(window, 4))); + write_far(window, 0x49, timer); + if (timer == 0) { + fail_setup(window, win16_dgroup_pointer(0x02df), + win16_read_u16(win16_far_add_offset(window, 4)), false); + } +} + +static void initialize_collision_and_quad_tables(void) +{ + for (uint16_t index = 0; index < 177; index++) { + tdkpin_initialize_collision_record(&g_game_setup_collision_calls[index]); + } + for (uint16_t index = 0; index < 20; index++) { + const SetupWordQuad *quad = &g_game_setup_word_quads[index]; + tdkpin_set_word_quad( + quad->word_6, + quad->word_4, + quad->word_2, + quad->word_0, + (uint16_t)(index + 1u)); + } +} + +static void initialize_collision_mirrors(Win16FarPtr window) +{ + for (uint16_t id = 1; id <= 175; id++) { + Win16FarPtr record = win16_dgroup_pointer((uint16_t)( + 0x095b + id * 0x53u)); + win16_write_u8( + win16_far_add_offset(window, (uint16_t)(0x03cc + id)), + win16_read_u8(win16_far_add_offset(record, 0x34))); + win16_write_u16( + window, + (uint16_t)(0x0a42 + id * 2u), + win16_read_u16(win16_far_add_offset(record, 0x43))); + win16_write_u8(win16_far_add_offset(window, (uint16_t)(0x61 + id)), 0); + } +} + +/* 1000:0270 -- complete TDKPIN game-window setup. */ +void tdkpin_setup_game_window(Win16FarPtr window) +{ + initialize_base_state(window); + initialize_player_defaults(window); + initialize_ball_projection(window); + initialize_profile_and_timer(window); + initialize_collision_and_quad_tables(); + initialize_collision_mirrors(window); +} diff --git a/original/reconstructed/tdkpin_game_setup.h b/original/reconstructed/tdkpin_game_setup.h new file mode 100644 index 0000000..649ec7e --- /dev/null +++ b/original/reconstructed/tdkpin_game_setup.h @@ -0,0 +1,10 @@ +#ifndef TDKPIN_GAME_SETUP_H +#define TDKPIN_GAME_SETUP_H + +#include "tdkpin_collision_records.h" +#include "tdkpin_tables.h" + +void tdkpin_setup_game_window( + Win16FarPtr window); /* 1000:0270 */ + +#endif diff --git a/original/reconstructed/tdkpin_game_setup_collision_data.inc b/original/reconstructed/tdkpin_game_setup_collision_data.inc new file mode 100644 index 0000000..6263f17 --- /dev/null +++ b/original/reconstructed/tdkpin_game_setup_collision_data.inc @@ -0,0 +1,183 @@ +/* Generated by tools/generate_game_setup_collision_data.py. + * Source: TDKPIN_GHIDRA_COMPLETE_RAW.c, 1000:0270 call order. + * Do not hand-edit; run the generator and its --check mode. + */ +static const TdkpinCollisionInitArgs g_game_setup_collision_calls[177] = { + /* call 001, record 1 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000001c9), .point2_x=(int32_t)UINT32_C(0x0000007d), .point1_y=(int32_t)UINT32_C(0x000001a1), .point1_x=(int32_t)UINT32_C(0x00000007), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0001u}, + /* call 002, record 2 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000001db), .point2_x=(int32_t)UINT32_C(0x0000012c), .point1_y=(int32_t)UINT32_C(0x000001db), .point1_x=(int32_t)UINT32_C(0x0000000a), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0002u}, + /* call 003, record 169 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000001d8), .point2_x=(int32_t)UINT32_C(0x00000078), .point1_y=(int32_t)UINT32_C(0x000001c4), .point1_x=(int32_t)UINT32_C(0x00000078), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x00a9u}, + /* call 004, record 170 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000001c4), .point2_x=(int32_t)UINT32_C(0x000000c3), .point1_y=(int32_t)UINT32_C(0x000001d8), .point1_x=(int32_t)UINT32_C(0x000000c3), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x00aau}, + /* call 005, record 3 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000001bd), .point2_x=(int32_t)UINT32_C(0x00000086), .point1_y=(int32_t)UINT32_C(0x000001ce), .point1_x=(int32_t)UINT32_C(0x00000086), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0003u}, + /* call 006, record 4 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000008), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x000001be), .point1_x=(int32_t)UINT32_C(0x0000008d), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x0004u}, + /* call 007, record 5 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000001d3), .point2_x=(int32_t)UINT32_C(0x00000094), .point1_y=(int32_t)UINT32_C(0x000001bd), .point1_x=(int32_t)UINT32_C(0x00000094), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0005u}, + /* call 008, record 6 */ {.render_bottom=0x01b5u, .render_right=0x00a3u, .render_top=0x0185u, .render_left=0x0097u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0006u, .flags=0x0102u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000001d3), .point2_x=(int32_t)UINT32_C(0x000000a4), .point1_y=(int32_t)UINT32_C(0x000001be), .point1_x=(int32_t)UINT32_C(0x00000094), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0004u, .active=0x0000u, .index=0x0006u}, + /* call 009, record 7 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000001d2), .point2_x=(int32_t)UINT32_C(0x000000a4), .point1_y=(int32_t)UINT32_C(0x000001bd), .point1_x=(int32_t)UINT32_C(0x000000a5), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0007u}, + /* call 010, record 8 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000008), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x000001be), .point1_x=(int32_t)UINT32_C(0x000000ac), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x0008u}, + /* call 011, record 9 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000001d3), .point2_x=(int32_t)UINT32_C(0x000000b4), .point1_y=(int32_t)UINT32_C(0x000001bd), .point1_x=(int32_t)UINT32_C(0x000000b3), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0009u}, + /* call 012, record 10 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x0000019e), .point2_x=(int32_t)UINT32_C(0x00000130), .point1_y=(int32_t)UINT32_C(0x000001c9), .point1_x=(int32_t)UINT32_C(0x000000b7), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x000au}, + /* call 013, record 11 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x0000003d), .point2_x=(int32_t)UINT32_C(0x0000012a), .point1_y=(int32_t)UINT32_C(0x000000a5), .point1_x=(int32_t)UINT32_C(0x0000012a), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x000bu}, + /* call 014, record 12 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x1388u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x0000008e), .point2_x=(int32_t)UINT32_C(0x0000012a), .point1_y=(int32_t)UINT32_C(0x0000008e), .point1_x=(int32_t)UINT32_C(0x00000136), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x000cu}, + /* call 015, record 13 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000007), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x00000088), .point1_x=(int32_t)UINT32_C(0x0000012a), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x000du}, + /* call 016, record 14 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000068), .point2_x=(int32_t)UINT32_C(0x00000124), .point1_y=(int32_t)UINT32_C(0x00000088), .point1_x=(int32_t)UINT32_C(0x00000123), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x000eu}, + /* call 017, record 15 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x7f, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000064), .point2_x=(int32_t)UINT32_C(0x00000119), .point1_y=(int32_t)UINT32_C(0x0000006d), .point1_x=(int32_t)UINT32_C(0x0000012c), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x000fu}, + /* call 018, record 16 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x7f, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000087), .point2_x=(int32_t)UINT32_C(0x00000113), .point1_y=(int32_t)UINT32_C(0x00000060), .point1_x=(int32_t)UINT32_C(0x00000122), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0010u}, + /* call 019, record 17 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000007), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x00000086), .point1_x=(int32_t)UINT32_C(0x0000010d), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x0011u}, + /* call 020, record 26 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000007), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x00000073), .point1_x=(int32_t)UINT32_C(0x00000101), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x001au}, + /* call 021, record 18 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000072), .point2_x=(int32_t)UINT32_C(0x000000f8), .point1_y=(int32_t)UINT32_C(0x0000008b), .point1_x=(int32_t)UINT32_C(0x00000108), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0012u}, + /* call 022, record 19 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x0000005b), .point2_x=(int32_t)UINT32_C(0x00000101), .point1_y=(int32_t)UINT32_C(0x00000072), .point1_x=(int32_t)UINT32_C(0x000000f9), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0013u}, + /* call 023, record 20 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000031), .point2_x=(int32_t)UINT32_C(0x00000115), .point1_y=(int32_t)UINT32_C(0x0000005b), .point1_x=(int32_t)UINT32_C(0x00000101), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0014u}, + /* call 024, record 21 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000020), .point2_x=(int32_t)UINT32_C(0x0000011f), .point1_y=(int32_t)UINT32_C(0x00000033), .point1_x=(int32_t)UINT32_C(0x00000115), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0015u}, + /* call 025, record 22 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000030), .point2_x=(int32_t)UINT32_C(0x0000012f), .point1_y=(int32_t)UINT32_C(0x0000002a), .point1_x=(int32_t)UINT32_C(0x0000011b), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0016u}, + /* call 026, record 23 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000044), .point2_x=(int32_t)UINT32_C(0x00000140), .point1_y=(int32_t)UINT32_C(0x00000030), .point1_x=(int32_t)UINT32_C(0x0000012e), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0017u}, + /* call 027, record 24 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000001c9), .point2_x=(int32_t)UINT32_C(0x00000140), .point1_y=(int32_t)UINT32_C(0x00000044), .point1_x=(int32_t)UINT32_C(0x00000140), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0018u}, + /* call 028, record 25 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000001b1), .point2_x=(int32_t)UINT32_C(0x0000014c), .point1_y=(int32_t)UINT32_C(0x000001b1), .point1_x=(int32_t)UINT32_C(0x0000013b), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0019u}, + /* call 029, record 27 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7e, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000043), .point2_x=(int32_t)UINT32_C(0x00000146), .point1_y=(int32_t)UINT32_C(0x0000004e), .point1_x=(int32_t)UINT32_C(0x00000148), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x001bu}, + /* call 030, record 28 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7e, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000039), .point2_x=(int32_t)UINT32_C(0x00000142), .point1_y=(int32_t)UINT32_C(0x00000043), .point1_x=(int32_t)UINT32_C(0x00000146), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x001cu}, + /* call 031, record 29 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7e, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000030), .point2_x=(int32_t)UINT32_C(0x0000013c), .point1_y=(int32_t)UINT32_C(0x00000039), .point1_x=(int32_t)UINT32_C(0x00000142), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x001du}, + /* call 032, record 30 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7e, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000029), .point2_x=(int32_t)UINT32_C(0x00000133), .point1_y=(int32_t)UINT32_C(0x00000030), .point1_x=(int32_t)UINT32_C(0x0000013c), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x001eu}, + /* call 033, record 31 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7e, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000024), .point2_x=(int32_t)UINT32_C(0x00000128), .point1_y=(int32_t)UINT32_C(0x00000029), .point1_x=(int32_t)UINT32_C(0x00000133), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x001fu}, + /* call 034, record 32 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7e, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000023), .point2_x=(int32_t)UINT32_C(0x0000011d), .point1_y=(int32_t)UINT32_C(0x00000024), .point1_x=(int32_t)UINT32_C(0x00000128), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0020u}, + /* call 035, record 33 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000023), .point2_x=(int32_t)UINT32_C(0x00000070), .point1_y=(int32_t)UINT32_C(0x00000023), .point1_x=(int32_t)UINT32_C(0x0000011d), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0021u}, + /* call 036, record 34 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000028), .point2_x=(int32_t)UINT32_C(0x00000063), .point1_y=(int32_t)UINT32_C(0x00000022), .point1_x=(int32_t)UINT32_C(0x00000079), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0022u}, + /* call 037, record 35 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000033), .point2_x=(int32_t)UINT32_C(0x0000004e), .point1_y=(int32_t)UINT32_C(0x00000028), .point1_x=(int32_t)UINT32_C(0x00000064), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0023u}, + /* call 038, record 36 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000045), .point2_x=(int32_t)UINT32_C(0x00000042), .point1_y=(int32_t)UINT32_C(0x00000032), .point1_x=(int32_t)UINT32_C(0x0000004f), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0024u}, + /* call 039, record 37 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x0000005d), .point2_x=(int32_t)UINT32_C(0x00000039), .point1_y=(int32_t)UINT32_C(0x00000041), .point1_x=(int32_t)UINT32_C(0x00000044), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0025u}, + /* call 040, record 38 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000ae), .point2_x=(int32_t)UINT32_C(0x0000003b), .point1_y=(int32_t)UINT32_C(0x00000052), .point1_x=(int32_t)UINT32_C(0x0000003b), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0026u}, + /* call 041, record 39 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000be), .point2_x=(int32_t)UINT32_C(0x00000043), .point1_y=(int32_t)UINT32_C(0x000000a7), .point1_x=(int32_t)UINT32_C(0x0000003a), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0027u}, + /* call 042, record 40 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000008), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x000000c1), .point1_x=(int32_t)UINT32_C(0x0000003c), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x0028u}, + /* call 043, record 41 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000d2), .point2_x=(int32_t)UINT32_C(0x00000029), .point1_y=(int32_t)UINT32_C(0x000000c7), .point1_x=(int32_t)UINT32_C(0x00000040), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0029u}, + /* call 044, record 42 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000008), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x000000cb), .point1_x=(int32_t)UINT32_C(0x00000026), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x002au}, + /* call 045, record 43 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000b9), .point2_x=(int32_t)UINT32_C(0x00000016), .point1_y=(int32_t)UINT32_C(0x000000ce), .point1_x=(int32_t)UINT32_C(0x0000001f), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x002bu}, + /* call 046, record 44 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x0000001f), .point2_x=(int32_t)UINT32_C(0x00000016), .point1_y=(int32_t)UINT32_C(0x000000b9), .point1_x=(int32_t)UINT32_C(0x00000016), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x002cu}, + /* call 047, record 45 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x86a0u, .score_high=0x0001u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x7f, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000021), .point2_x=(int32_t)UINT32_C(0x0000000b), .point1_y=(int32_t)UINT32_C(0x00000021), .point1_x=(int32_t)UINT32_C(0x00000017), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x002du}, + /* call 048, record 46 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000be), .point2_x=(int32_t)UINT32_C(0x0000000d), .point1_y=(int32_t)UINT32_C(0x0000001e), .point1_x=(int32_t)UINT32_C(0x0000000d), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x002eu}, + /* call 049, record 47 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000fa), .point2_x=(int32_t)UINT32_C(0x00000020), .point1_y=(int32_t)UINT32_C(0x000000b9), .point1_x=(int32_t)UINT32_C(0x0000000c), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x002fu}, + /* call 050, record 48 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000008), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x000000fb), .point1_x=(int32_t)UINT32_C(0x00000019), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x0030u}, + /* call 051, record 49 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000140), .point2_x=(int32_t)UINT32_C(0x0000000a), .point1_y=(int32_t)UINT32_C(0x000000fb), .point1_x=(int32_t)UINT32_C(0x00000021), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0031u}, + /* call 052, record 50 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000001ab), .point2_x=(int32_t)UINT32_C(0x0000000c), .point1_y=(int32_t)UINT32_C(0x00000119), .point1_x=(int32_t)UINT32_C(0x0000000c), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0032u}, + /* call 053, record 51 */ {.render_bottom=0x00a3u, .render_right=0x00b4u, .render_top=0x0085u, .render_left=0x0096u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x03e8u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0040u, .response_kick={{0x7f, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_auxiliary={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0xcc}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .radius=(int32_t)UINT32_C(0x00000017), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x000000a8), .point1_x=(int32_t)UINT32_C(0x000000a5), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x0033u}, + /* call 054, record 52 */ {.render_bottom=0x007du, .render_right=0x00ddu, .render_top=0x005fu, .render_left=0x00bfu, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x03e8u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0040u, .response_kick={{0x7f, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_auxiliary={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0xcc}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .radius=(int32_t)UINT32_C(0x00000017), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x00000082), .point1_x=(int32_t)UINT32_C(0x000000ce), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x0034u}, + /* call 055, record 53 */ {.render_bottom=0x00b4u, .render_right=0x00eau, .render_top=0x0096u, .render_left=0x00ccu, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x03e8u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0040u, .response_kick={{0x7f, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_auxiliary={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0xcc}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .radius=(int32_t)UINT32_C(0x00000017), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x000000b9), .point1_x=(int32_t)UINT32_C(0x000000db), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x0035u}, + /* call 056, record 54 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x00000008), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x00000138), .point1_x=(int32_t)UINT32_C(0x00000035), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x0036u}, + /* call 057, record 55 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x7f, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_auxiliary={{0x7f, 0xcd, 0xcc, 0xcc, 0xcc, 0xcc}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000048), .point2_x=(int32_t)UINT32_C(0x00000030), .point1_y=(int32_t)UINT32_C(0xfffffffb), .point1_x=(int32_t)UINT32_C(0x00000006), .coordinate_mode=0x0001u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0037u}, + /* call 058, record 56 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x00000008), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x00000000), .point1_x=(int32_t)UINT32_C(0xfffffff7), .coordinate_mode=0x0001u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x0038u}, + /* call 059, record 57 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0xffffffe6), .point2_x=(int32_t)UINT32_C(0xffffffd1), .point1_y=(int32_t)UINT32_C(0x00000007), .point1_x=(int32_t)UINT32_C(0xffffffff), .coordinate_mode=0x0001u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0039u}, + /* call 060, record 58 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x00000008), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0xfffffff9), .point1_x=(int32_t)UINT32_C(0x00000003), .coordinate_mode=0x0001u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x003au}, + /* call 061, record 59 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0xffffffd3), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x00000000), .point1_x=(int32_t)UINT32_C(0xfffffff8), .coordinate_mode=0x0001u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x003bu}, + /* call 062, record 60 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x0000000a), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x0000013a), .point1_x=(int32_t)UINT32_C(0x0000001d), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x003cu}, + /* call 063, record 61 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x0000016f), .point2_x=(int32_t)UINT32_C(0x00000025), .point1_y=(int32_t)UINT32_C(0x00000138), .point1_x=(int32_t)UINT32_C(0x00000025), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x003du}, + /* call 064, record 62 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7c, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x7f, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000194), .point2_x=(int32_t)UINT32_C(0x0000006e), .point1_y=(int32_t)UINT32_C(0x0000016f), .point1_x=(int32_t)UINT32_C(0x00000025), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x003eu}, + /* call 065, record 63 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000195), .point2_x=(int32_t)UINT32_C(0x00000013), .point1_y=(int32_t)UINT32_C(0x000001ac), .point1_x=(int32_t)UINT32_C(0x0000005c), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x003fu}, + /* call 066, record 64 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000137), .point2_x=(int32_t)UINT32_C(0x00000013), .point1_y=(int32_t)UINT32_C(0x00000195), .point1_x=(int32_t)UINT32_C(0x00000013), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0040u}, + /* call 067, record 65 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x0000000f), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x000001a1), .point1_x=(int32_t)UINT32_C(0x00000067), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x0041u}, + /* call 068, record 66 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7e, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000001b1), .point2_x=(int32_t)UINT32_C(0x0000008d), .point1_y=(int32_t)UINT32_C(0x00000196), .point1_x=(int32_t)UINT32_C(0x00000070), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0042u}, + /* call 069, record 67 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7e, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x00000009), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x000001b7), .point1_x=(int32_t)UINT32_C(0x00000086), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x0043u}, + /* call 070, record 68 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7e, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000001af), .point2_x=(int32_t)UINT32_C(0x00000061), .point1_y=(int32_t)UINT32_C(0x000001bf), .point1_x=(int32_t)UINT32_C(0x00000082), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0044u}, + /* call 071, record 69 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x00000008), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x00000138), .point1_x=(int32_t)UINT32_C(0x00000104), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x0045u}, + /* call 072, record 70 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x0000002d), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x00000000), .point1_x=(int32_t)UINT32_C(0x00000007), .coordinate_mode=0x0001u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0046u}, + /* call 073, record 71 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x00000008), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0xffffffff), .point1_x=(int32_t)UINT32_C(0xfffffff9), .coordinate_mode=0x0001u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x0047u}, + /* call 074, record 72 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000016), .point2_x=(int32_t)UINT32_C(0xffffffd1), .point1_y=(int32_t)UINT32_C(0x00000008), .point1_x=(int32_t)UINT32_C(0x00000001), .coordinate_mode=0x0001u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0048u}, + /* call 075, record 73 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x00000008), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0xfffffff8), .point1_x=(int32_t)UINT32_C(0x00000000), .coordinate_mode=0x0001u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x0049u}, + /* call 076, record 74 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x7f, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_auxiliary={{0x7f, 0xcd, 0xcc, 0xcc, 0xcc, 0xcc}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0xffffffb9), .point2_x=(int32_t)UINT32_C(0x00000032), .point1_y=(int32_t)UINT32_C(0xfffffffe), .point1_x=(int32_t)UINT32_C(0xfffffff7), .coordinate_mode=0x0001u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x004au}, + /* call 077, record 75 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000009), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x00000138), .point1_x=(int32_t)UINT32_C(0x0000011c), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x004bu}, + /* call 078, record 76 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000195), .point2_x=(int32_t)UINT32_C(0x00000124), .point1_y=(int32_t)UINT32_C(0x00000137), .point1_x=(int32_t)UINT32_C(0x00000124), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x004cu}, + /* call 079, record 77 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000001ac), .point2_x=(int32_t)UINT32_C(0x000000dd), .point1_y=(int32_t)UINT32_C(0x00000195), .point1_x=(int32_t)UINT32_C(0x00000124), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x004du}, + /* call 080, record 78 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7c, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x0000016f), .point2_x=(int32_t)UINT32_C(0x00000113), .point1_y=(int32_t)UINT32_C(0x00000194), .point1_x=(int32_t)UINT32_C(0x000000cd), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x004eu}, + /* call 081, record 79 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000138), .point2_x=(int32_t)UINT32_C(0x00000113), .point1_y=(int32_t)UINT32_C(0x0000016f), .point1_x=(int32_t)UINT32_C(0x00000113), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x004fu}, + /* call 082, record 80 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7e, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x0000000f), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x000001a1), .point1_x=(int32_t)UINT32_C(0x000000d2), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x0050u}, + /* call 083, record 81 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7e, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000001bf), .point2_x=(int32_t)UINT32_C(0x000000b1), .point1_y=(int32_t)UINT32_C(0x000001af), .point1_x=(int32_t)UINT32_C(0x000000d8), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0051u}, + /* call 084, record 82 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7e, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x00000009), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x000001b7), .point1_x=(int32_t)UINT32_C(0x000000b3), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x0052u}, + /* call 085, record 83 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7e, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000196), .point2_x=(int32_t)UINT32_C(0x000000c9), .point1_y=(int32_t)UINT32_C(0x000001b1), .point1_x=(int32_t)UINT32_C(0x000000ac), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0053u}, + /* call 086, record 84 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x05dcu, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0004u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000dd), .point2_x=(int32_t)UINT32_C(0x00000028), .point1_y=(int32_t)UINT32_C(0x000000cd), .point1_x=(int32_t)UINT32_C(0x00000049), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0054u}, + /* call 087, record 85 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000cd), .point2_x=(int32_t)UINT32_C(0x00000049), .point1_y=(int32_t)UINT32_C(0x000000c1), .point1_x=(int32_t)UINT32_C(0x00000043), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0055u}, + /* call 088, record 86 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000d1), .point2_x=(int32_t)UINT32_C(0x00000022), .point1_y=(int32_t)UINT32_C(0x000000dd), .point1_x=(int32_t)UINT32_C(0x00000028), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0056u}, + /* call 089, record 87 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x05dcu, .score_high=0x0000u, .contact_state=0x0055u, .flags=0x0006u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000e7), .point2_x=(int32_t)UINT32_C(0x0000002a), .point1_y=(int32_t)UINT32_C(0x000000d5), .point1_x=(int32_t)UINT32_C(0x0000004c), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0000u, .index=0x0057u}, + /* call 090, record 88 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x05dcu, .score_high=0x0000u, .contact_state=0x0056u, .flags=0x0006u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000ef), .point2_x=(int32_t)UINT32_C(0x0000002d), .point1_y=(int32_t)UINT32_C(0x000000dd), .point1_x=(int32_t)UINT32_C(0x0000004f), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0000u, .index=0x0058u}, + /* call 091, record 89 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000013), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x00000072), .point1_x=(int32_t)UINT32_C(0x00000121), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0003u, .active=0x0001u, .index=0x0059u}, + /* call 092, record 90 */ {.render_bottom=0x00f6u, .render_right=0x0132u, .render_top=0x00e7u, .render_left=0x011au, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x05dcu, .score_high=0x0000u, .contact_state=0x005au, .flags=0x208au, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000f7), .point2_x=(int32_t)UINT32_C(0x00000124), .point1_y=(int32_t)UINT32_C(0x00000111), .point1_x=(int32_t)UINT32_C(0x00000124), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x005au}, + /* call 093, record 91 */ {.render_bottom=0x00f6u, .render_right=0x0132u, .render_top=0x00e7u, .render_left=0x011au, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x05dcu, .score_high=0x0000u, .contact_state=0x005au, .flags=0x208au, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x7f, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000111), .point2_x=(int32_t)UINT32_C(0x00000124), .point1_y=(int32_t)UINT32_C(0x00000111), .point1_x=(int32_t)UINT32_C(0x0000012e), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x005bu}, + /* call 094, record 92 */ {.render_bottom=0x00f6u, .render_right=0x0132u, .render_top=0x00e7u, .render_left=0x011au, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x05dcu, .score_high=0x0000u, .contact_state=0x005au, .flags=0x208au, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x7f, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000f7), .point2_x=(int32_t)UINT32_C(0x0000012e), .point1_y=(int32_t)UINT32_C(0x000000f7), .point1_x=(int32_t)UINT32_C(0x00000124), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x005cu}, + /* call 095, record 93 */ {.render_bottom=0x00e7u, .render_right=0x0132u, .render_top=0x00d9u, .render_left=0x011au, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x05dcu, .score_high=0x0000u, .contact_state=0x005du, .flags=0x208au, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000e7), .point2_x=(int32_t)UINT32_C(0x00000124), .point1_y=(int32_t)UINT32_C(0x00000100), .point1_x=(int32_t)UINT32_C(0x00000124), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x005du}, + /* call 096, record 94 */ {.render_bottom=0x00e7u, .render_right=0x0132u, .render_top=0x00d9u, .render_left=0x011au, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x05dcu, .score_high=0x0000u, .contact_state=0x005du, .flags=0x208au, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x7f, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000100), .point2_x=(int32_t)UINT32_C(0x00000124), .point1_y=(int32_t)UINT32_C(0x00000100), .point1_x=(int32_t)UINT32_C(0x0000012e), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x005eu}, + /* call 097, record 95 */ {.render_bottom=0x00e7u, .render_right=0x0132u, .render_top=0x00d9u, .render_left=0x011au, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x05dcu, .score_high=0x0000u, .contact_state=0x005du, .flags=0x208au, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x7f, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000e7), .point2_x=(int32_t)UINT32_C(0x0000012e), .point1_y=(int32_t)UINT32_C(0x000000e7), .point1_x=(int32_t)UINT32_C(0x00000124), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x005fu}, + /* call 098, record 96 */ {.render_bottom=0x00d8u, .render_right=0x0132u, .render_top=0x00cau, .render_left=0x011au, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x05dcu, .score_high=0x0000u, .contact_state=0x0060u, .flags=0x208au, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000d9), .point2_x=(int32_t)UINT32_C(0x00000124), .point1_y=(int32_t)UINT32_C(0x000000f1), .point1_x=(int32_t)UINT32_C(0x00000124), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0060u}, + /* call 099, record 97 */ {.render_bottom=0x00d8u, .render_right=0x0132u, .render_top=0x00cau, .render_left=0x011au, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x05dcu, .score_high=0x0000u, .contact_state=0x0060u, .flags=0x208au, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x7f, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000f1), .point2_x=(int32_t)UINT32_C(0x00000124), .point1_y=(int32_t)UINT32_C(0x000000f1), .point1_x=(int32_t)UINT32_C(0x0000012e), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0061u}, + /* call 100, record 98 */ {.render_bottom=0x00d8u, .render_right=0x0132u, .render_top=0x00cau, .render_left=0x011au, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x05dcu, .score_high=0x0000u, .contact_state=0x0060u, .flags=0x208au, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x7f, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000d9), .point2_x=(int32_t)UINT32_C(0x0000012e), .point1_y=(int32_t)UINT32_C(0x000000d9), .point1_x=(int32_t)UINT32_C(0x00000124), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0062u}, + /* call 101, record 99 */ {.render_bottom=0x00c9u, .render_right=0x0132u, .render_top=0x00bbu, .render_left=0x011au, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x05dcu, .score_high=0x0000u, .contact_state=0x0063u, .flags=0x208au, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000c9), .point2_x=(int32_t)UINT32_C(0x00000124), .point1_y=(int32_t)UINT32_C(0x000000e2), .point1_x=(int32_t)UINT32_C(0x00000124), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0063u}, + /* call 102, record 100 */ {.render_bottom=0x00c9u, .render_right=0x0132u, .render_top=0x00bbu, .render_left=0x011au, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0063u, .flags=0x208au, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x7f, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000e2), .point2_x=(int32_t)UINT32_C(0x00000124), .point1_y=(int32_t)UINT32_C(0x000000e2), .point1_x=(int32_t)UINT32_C(0x0000012e), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0064u}, + /* call 103, record 101 */ {.render_bottom=0x00c9u, .render_right=0x0132u, .render_top=0x00bbu, .render_left=0x011au, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0063u, .flags=0x208au, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x7f, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000ca), .point2_x=(int32_t)UINT32_C(0x0000012e), .point1_y=(int32_t)UINT32_C(0x000000ca), .point1_x=(int32_t)UINT32_C(0x00000124), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0065u}, + /* call 104, record 102 */ {.render_bottom=0x00bau, .render_right=0x0132u, .render_top=0x00aeu, .render_left=0x011au, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x05dcu, .score_high=0x0000u, .contact_state=0x0066u, .flags=0x208au, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000bb), .point2_x=(int32_t)UINT32_C(0x00000124), .point1_y=(int32_t)UINT32_C(0x000000d2), .point1_x=(int32_t)UINT32_C(0x00000124), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0066u}, + /* call 105, record 103 */ {.render_bottom=0x00bau, .render_right=0x0132u, .render_top=0x00aeu, .render_left=0x011au, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0066u, .flags=0x208au, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x7f, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000d1), .point2_x=(int32_t)UINT32_C(0x00000124), .point1_y=(int32_t)UINT32_C(0x000000d2), .point1_x=(int32_t)UINT32_C(0x0000012e), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0067u}, + /* call 106, record 104 */ {.render_bottom=0x00bau, .render_right=0x0132u, .render_top=0x00aeu, .render_left=0x011au, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0066u, .flags=0x208au, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x7f, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000b7), .point2_x=(int32_t)UINT32_C(0x0000012e), .point1_y=(int32_t)UINT32_C(0x000000bc), .point1_x=(int32_t)UINT32_C(0x00000124), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0068u}, + /* call 107, record 105 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7e, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000e0), .point2_x=(int32_t)UINT32_C(0x00000094), .point1_y=(int32_t)UINT32_C(0x000000f2), .point1_x=(int32_t)UINT32_C(0x000000cb), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0069u}, + /* call 108, record 106 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x0000000e), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x000000d4), .point1_x=(int32_t)UINT32_C(0x0000009c), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x006au}, + /* call 109, record 107 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x7f, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .response_auxiliary={{0x7f, 0xcd, 0xcc, 0xcc, 0xcc, 0xcc}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000d9), .point2_x=(int32_t)UINT32_C(0x000000d7), .point1_y=(int32_t)UINT32_C(0x000000c6), .point1_x=(int32_t)UINT32_C(0x0000009e), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x006bu}, + /* call 110, record 108 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x0000000e), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x000000e6), .point1_x=(int32_t)UINT32_C(0x000000d2), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x006cu}, + /* call 111, record 109 */ {.render_bottom=0x00ecu, .render_right=0x00ceu, .render_top=0x00d6u, .render_left=0x00c0u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x05dcu, .score_high=0x0000u, .contact_state=0x006du, .flags=0x2092u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000f6), .point2_x=(int32_t)UINT32_C(0x000000bb), .point1_y=(int32_t)UINT32_C(0x000000fd), .point1_x=(int32_t)UINT32_C(0x000000d1), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x006du}, + /* call 112, record 110 */ {.render_bottom=0x00dcu, .render_right=0x00cdu, .render_top=0x00d6u, .render_left=0x00c0u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000fd), .point2_x=(int32_t)UINT32_C(0x000000d1), .point1_y=(int32_t)UINT32_C(0x000000ee), .point1_x=(int32_t)UINT32_C(0x000000d6), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x006eu}, + /* call 113, record 111 */ {.render_bottom=0x00dcu, .render_right=0x00cdu, .render_top=0x00d6u, .render_left=0x00c0u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000ea), .point2_x=(int32_t)UINT32_C(0x000000bf), .point1_y=(int32_t)UINT32_C(0x000000f6), .point1_x=(int32_t)UINT32_C(0x000000bb), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x006fu}, + /* call 114, record 112 */ {.render_bottom=0x00e7u, .render_right=0x00bfu, .render_top=0x00d1u, .render_left=0x00b2u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x05dcu, .score_high=0x0000u, .contact_state=0x0070u, .flags=0x2092u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000ef), .point2_x=(int32_t)UINT32_C(0x000000a9), .point1_y=(int32_t)UINT32_C(0x000000f9), .point1_x=(int32_t)UINT32_C(0x000000c6), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0070u}, + /* call 115, record 113 */ {.render_bottom=0x00dcu, .render_right=0x00cdu, .render_top=0x00d6u, .render_left=0x00c0u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000f9), .point2_x=(int32_t)UINT32_C(0x000000c6), .point1_y=(int32_t)UINT32_C(0x000000ed), .point1_x=(int32_t)UINT32_C(0x000000ca), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0071u}, + /* call 116, record 114 */ {.render_bottom=0x00dcu, .render_right=0x00cdu, .render_top=0x00d6u, .render_left=0x00c0u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000e3), .point2_x=(int32_t)UINT32_C(0x000000ad), .point1_y=(int32_t)UINT32_C(0x000000ef), .point1_x=(int32_t)UINT32_C(0x000000a9), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0072u}, + /* call 117, record 115 */ {.render_bottom=0x00e2u, .render_right=0x00b1u, .render_top=0x00ccu, .render_left=0x00a3u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x05dcu, .score_high=0x0000u, .contact_state=0x0073u, .flags=0x2092u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000e9), .point2_x=(int32_t)UINT32_C(0x00000099), .point1_y=(int32_t)UINT32_C(0x000000f3), .point1_x=(int32_t)UINT32_C(0x000000b6), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0073u}, + /* call 118, record 116 */ {.render_bottom=0x00dcu, .render_right=0x00cdu, .render_top=0x00d6u, .render_left=0x00c0u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000f3), .point2_x=(int32_t)UINT32_C(0x000000b6), .point1_y=(int32_t)UINT32_C(0x000000e7), .point1_x=(int32_t)UINT32_C(0x000000ba), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0074u}, + /* call 119, record 117 */ {.render_bottom=0x00dcu, .render_right=0x00cdu, .render_top=0x00d6u, .render_left=0x00c0u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000dd), .point2_x=(int32_t)UINT32_C(0x0000009d), .point1_y=(int32_t)UINT32_C(0x000000e9), .point1_x=(int32_t)UINT32_C(0x00000099), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0075u}, + /* call 120, record 118 */ {.render_bottom=0x00ddu, .render_right=0x00a3u, .render_top=0x00c6u, .render_left=0x0095u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x05dcu, .score_high=0x0000u, .contact_state=0x0076u, .flags=0x2092u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000e2), .point2_x=(int32_t)UINT32_C(0x0000008b), .point1_y=(int32_t)UINT32_C(0x000000ed), .point1_x=(int32_t)UINT32_C(0x000000a3), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0076u}, + /* call 121, record 119 */ {.render_bottom=0x00dcu, .render_right=0x00cdu, .render_top=0x00d6u, .render_left=0x00c0u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000ed), .point2_x=(int32_t)UINT32_C(0x000000a3), .point1_y=(int32_t)UINT32_C(0x000000e1), .point1_x=(int32_t)UINT32_C(0x000000a7), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0077u}, + /* call 122, record 120 */ {.render_bottom=0x00dcu, .render_right=0x00cdu, .render_top=0x00d6u, .render_left=0x00c0u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000d3), .point2_x=(int32_t)UINT32_C(0x00000090), .point1_y=(int32_t)UINT32_C(0x000000e2), .point1_x=(int32_t)UINT32_C(0x0000008b), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0078u}, + /* call 123, record 121 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x07d0u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0400u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000a0), .point2_x=(int32_t)UINT32_C(0x00000054), .point1_y=(int32_t)UINT32_C(0x00000095), .point1_x=(int32_t)UINT32_C(0x00000069), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0079u}, + /* call 124, record 122 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000095), .point2_x=(int32_t)UINT32_C(0x00000069), .point1_y=(int32_t)UINT32_C(0x0000008b), .point1_x=(int32_t)UINT32_C(0x00000065), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x007au}, + /* call 125, record 123 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000096), .point2_x=(int32_t)UINT32_C(0x00000050), .point1_y=(int32_t)UINT32_C(0x000000a0), .point1_x=(int32_t)UINT32_C(0x00000054), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x007bu}, + /* call 126, record 124 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000097), .point2_x=(int32_t)UINT32_C(0x00000057), .point1_y=(int32_t)UINT32_C(0x0000008b), .point1_x=(int32_t)UINT32_C(0x0000006f), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x007cu}, + /* call 127, record 125 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000008), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x00000092), .point1_x=(int32_t)UINT32_C(0x00000054), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x007du}, + /* call 128, record 126 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x0000006c), .point2_x=(int32_t)UINT32_C(0x0000004d), .point1_y=(int32_t)UINT32_C(0x00000093), .point1_x=(int32_t)UINT32_C(0x0000004d), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x007eu}, + /* call 129, record 127 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x0000006a), .point2_x=(int32_t)UINT32_C(0x00000057), .point1_y=(int32_t)UINT32_C(0x0000006c), .point1_x=(int32_t)UINT32_C(0x0000004d), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x007fu}, + /* call 130, record 128 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x0000008d), .point2_x=(int32_t)UINT32_C(0x0000006e), .point1_y=(int32_t)UINT32_C(0x0000006a), .point1_x=(int32_t)UINT32_C(0x00000057), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x0080u}, + /* call 131, record 129 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0001u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000013), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x00000060), .point1_x=(int32_t)UINT32_C(0x00000060), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0003u, .active=0x0001u, .index=0x0081u}, + /* call 132, record 130 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0001u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000013), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x00000045), .point1_x=(int32_t)UINT32_C(0x00000073), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0003u, .active=0x0001u, .index=0x0082u}, + /* call 133, record 131 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0001u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000013), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x00000050), .point1_x=(int32_t)UINT32_C(0x00000093), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0003u, .active=0x0001u, .index=0x0083u}, + /* call 134, record 132 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0001u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000013), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x00000070), .point1_x=(int32_t)UINT32_C(0x00000093), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0003u, .active=0x0001u, .index=0x0084u}, + /* call 135, record 133 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0001u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000013), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x0000007b), .point1_x=(int32_t)UINT32_C(0x00000073), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0003u, .active=0x0001u, .index=0x0085u}, + /* call 136, record 134 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000014), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x00000060), .point1_x=(int32_t)UINT32_C(0x0000007c), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x0086u}, + /* call 137, record 135 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000011), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x0000004e), .point1_x=(int32_t)UINT32_C(0x00000064), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x0087u}, + /* call 138, record 136 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000011), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x00000044), .point1_x=(int32_t)UINT32_C(0x00000085), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x0088u}, + /* call 139, record 137 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000011), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x00000060), .point1_x=(int32_t)UINT32_C(0x0000009a), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x0089u}, + /* call 140, record 138 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000011), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x0000007d), .point1_x=(int32_t)UINT32_C(0x00000085), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x008au}, + /* call 141, record 139 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000011), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x00000072), .point1_x=(int32_t)UINT32_C(0x00000064), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x008bu}, + /* call 142, record 140 */ {.render_bottom=0x00bcu, .render_right=0x001fu, .render_top=0x00aeu, .render_left=0x0011u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x03e8u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x00c0u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x0000000c), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x000000ca), .point1_x=(int32_t)UINT32_C(0x00000018), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0004u, .active=0x0001u, .index=0x008cu}, + /* call 143, record 141 */ {.render_bottom=0x00a9u, .render_right=0x0019u, .render_top=0x009bu, .render_left=0x000bu, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x03e8u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x00c0u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x0000000c), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x000000b6), .point1_x=(int32_t)UINT32_C(0x00000012), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0004u, .active=0x0001u, .index=0x008du}, + /* call 144, record 142 */ {.render_bottom=0x0096u, .render_right=0x0018u, .render_top=0x0088u, .render_left=0x000au, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x05dcu, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x00c0u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x0000000c), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x000000a4), .point1_x=(int32_t)UINT32_C(0x00000011), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0004u, .active=0x0001u, .index=0x008eu}, + /* call 145, record 143 */ {.render_bottom=0x0083u, .render_right=0x0018u, .render_top=0x0075u, .render_left=0x000au, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x05dcu, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x00c0u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x0000000c), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x00000091), .point1_x=(int32_t)UINT32_C(0x00000011), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0004u, .active=0x0001u, .index=0x008fu}, + /* call 146, record 144 */ {.render_bottom=0x0070u, .render_right=0x0018u, .render_top=0x0062u, .render_left=0x000au, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x07d0u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x00c0u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x0000000c), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x0000007e), .point1_x=(int32_t)UINT32_C(0x00000011), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0004u, .active=0x0001u, .index=0x0090u}, + /* call 147, record 145 */ {.render_bottom=0x005du, .render_right=0x0018u, .render_top=0x004fu, .render_left=0x000au, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x07d0u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x00c0u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x0000000c), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x0000006b), .point1_x=(int32_t)UINT32_C(0x00000011), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0004u, .active=0x0001u, .index=0x0091u}, + /* call 148, record 146 */ {.render_bottom=0x004fu, .render_right=0x0018u, .render_top=0x003cu, .render_left=0x000au, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x09c4u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x00c0u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x0000000c), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x00000057), .point1_x=(int32_t)UINT32_C(0x00000011), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0004u, .active=0x0001u, .index=0x0092u}, + /* call 149, record 147 */ {.render_bottom=0x0037u, .render_right=0x0018u, .render_top=0x0029u, .render_left=0x000au, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0bb8u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x00c0u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x0000000c), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x00000044), .point1_x=(int32_t)UINT32_C(0x00000011), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0004u, .active=0x0001u, .index=0x0093u}, + /* call 150, record 148 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0001u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000013), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x0000002b), .point1_x=(int32_t)UINT32_C(0x00000011), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0003u, .active=0x0001u, .index=0x0094u}, + /* call 151, record 149 */ {.render_bottom=0x0049u, .render_right=0x004du, .render_top=0x0039u, .render_left=0x003cu, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x01f4u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0140u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x00000010), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x00000055), .point1_x=(int32_t)UINT32_C(0x00000044), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0004u, .active=0x0000u, .index=0x0095u}, + /* call 152, record 150 */ {.render_bottom=0x0032u, .render_right=0x00d3u, .render_top=0x0028u, .render_left=0x00c7u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x01f4u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x1000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x0000000b), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x00000043), .point1_x=(int32_t)UINT32_C(0x000000cd), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0004u, .active=0x0001u, .index=0x0096u}, + /* call 153, record 151 */ {.render_bottom=0x0033u, .render_right=0x00f0u, .render_top=0x0029u, .render_left=0x00e4u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x01f4u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x1000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x0000000b), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x00000042), .point1_x=(int32_t)UINT32_C(0x000000e9), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0004u, .active=0x0001u, .index=0x0097u}, + /* call 154, record 152 */ {.render_bottom=0x0034u, .render_right=0x010du, .render_top=0x002au, .render_left=0x0101u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x01f4u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x1000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x0000000b), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x00000042), .point1_x=(int32_t)UINT32_C(0x00000108), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0004u, .active=0x0001u, .index=0x0098u}, + /* call 155, record 153 */ {.render_bottom=0x0188u, .render_right=0x0017u, .render_top=0x0158u, .render_left=0x000bu, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0100u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000194), .point2_x=(int32_t)UINT32_C(0x0000001b), .point1_y=(int32_t)UINT32_C(0x00000154), .point1_x=(int32_t)UINT32_C(0x00000006), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0004u, .active=0x0000u, .index=0x0099u}, + /* call 156, record 154 */ {.render_bottom=0x018au, .render_right=0x012fu, .render_top=0x015au, .render_left=0x0123u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0002u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0100u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000192), .point2_x=(int32_t)UINT32_C(0x00000133), .point1_y=(int32_t)UINT32_C(0x00000154), .point1_x=(int32_t)UINT32_C(0x0000011b), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0004u, .active=0x0000u, .index=0x009au}, + /* call 157, record 155 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x0000000b), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x0000004f), .point1_x=(int32_t)UINT32_C(0x000000b7), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x009bu}, + /* call 158, record 156 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000034), .point2_x=(int32_t)UINT32_C(0x000000b8), .point1_y=(int32_t)UINT32_C(0x0000004b), .point1_x=(int32_t)UINT32_C(0x000000ac), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x009cu}, + /* call 159, record 157 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x0000000b), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x00000038), .point1_x=(int32_t)UINT32_C(0x000000c3), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x009du}, + /* call 160, record 158 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000052), .point2_x=(int32_t)UINT32_C(0x000000c1), .point1_y=(int32_t)UINT32_C(0x0000003d), .point1_x=(int32_t)UINT32_C(0x000000cd), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x009eu}, + /* call 161, record 159 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x0000000b), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x0000004f), .point1_x=(int32_t)UINT32_C(0x000000d4), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x009fu}, + /* call 162, record 160 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000034), .point2_x=(int32_t)UINT32_C(0x000000d5), .point1_y=(int32_t)UINT32_C(0x0000004b), .point1_x=(int32_t)UINT32_C(0x000000c9), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x00a0u}, + /* call 163, record 161 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x0000000b), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x00000038), .point1_x=(int32_t)UINT32_C(0x000000e0), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x00a1u}, + /* call 164, record 162 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000052), .point2_x=(int32_t)UINT32_C(0x000000de), .point1_y=(int32_t)UINT32_C(0x0000003d), .point1_x=(int32_t)UINT32_C(0x000000ea), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x00a2u}, + /* call 165, record 163 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x0000000b), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x0000004f), .point1_x=(int32_t)UINT32_C(0x000000f1), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x00a3u}, + /* call 166, record 164 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000034), .point2_x=(int32_t)UINT32_C(0x000000f2), .point1_y=(int32_t)UINT32_C(0x0000004b), .point1_x=(int32_t)UINT32_C(0x000000e6), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x00a4u}, + /* call 167, record 165 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x0000000b), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x00000038), .point1_x=(int32_t)UINT32_C(0x000000fd), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x00a5u}, + /* call 168, record 166 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0001u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000052), .point2_x=(int32_t)UINT32_C(0x000000fb), .point1_y=(int32_t)UINT32_C(0x0000003d), .point1_x=(int32_t)UINT32_C(0x00000107), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x00a6u}, + /* call 169, record 167 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000009), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x0000010c), .point1_x=(int32_t)UINT32_C(0x0000012b), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0001u, .active=0x0001u, .index=0x00a7u}, + /* call 170, record 168 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000111), .point2_x=(int32_t)UINT32_C(0x00000123), .point1_y=(int32_t)UINT32_C(0x00000123), .point1_x=(int32_t)UINT32_C(0x0000012a), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x00a8u}, + /* call 171, record 169 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x7d, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x0000004e), .point2_x=(int32_t)UINT32_C(0x00000148), .point1_y=(int32_t)UINT32_C(0x000001ba), .point1_x=(int32_t)UINT32_C(0x00000148), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x00a9u}, + /* call 172, record 170 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x00000064), .point2_x=(int32_t)UINT32_C(0x0000012a), .point1_y=(int32_t)UINT32_C(0x000001a4), .point1_x=(int32_t)UINT32_C(0x0000012a), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x00aau}, + /* call 173, record 171 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000be), .point2_x=(int32_t)UINT32_C(0x0000012a), .point1_y=(int32_t)UINT32_C(0x0000010b), .point1_x=(int32_t)UINT32_C(0x0000012a), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x00abu}, + /* call 174, record 172 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000009), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x000000bf), .point1_x=(int32_t)UINT32_C(0x0000012b), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0001u, .active=0x0001u, .index=0x00acu}, + /* call 175, record 173 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}, .radius=(int32_t)UINT32_C(0x00000000), .point2_y=(int32_t)UINT32_C(0x000000a5), .point2_x=(int32_t)UINT32_C(0x0000012a), .point1_y=(int32_t)UINT32_C(0x000000bc), .point1_x=(int32_t)UINT32_C(0x00000123), .coordinate_mode=0x0000u, .subtype=0x0000u, .type=0x0002u, .active=0x0001u, .index=0x00adu}, + /* call 176, record 174 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x66, 0x66, 0x66, 0x66, 0x66}}, .radius=(int32_t)UINT32_C(0x00000011), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x00000000), .point1_x=(int32_t)UINT32_C(0x00000000), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0001u, .index=0x00aeu}, + /* call 177, record 175 */ {.render_bottom=0x0000u, .render_right=0x0000u, .render_top=0x0000u, .render_left=0x0000u, .fallback_y_adjust=(int32_t)UINT32_C(0x00000000), .fallback_x_adjust=(int32_t)UINT32_C(0x00000000), .layer_mask=0x0003u, .score_low=0x0000u, .score_high=0x0000u, .contact_state=0x0000u, .flags=0x0000u, .response_kick={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_auxiliary={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_tangent={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, .response_normal={{0x80, 0x66, 0x66, 0x66, 0x66, 0x66}}, .radius=(int32_t)UINT32_C(0x00000011), .point2_y=(int32_t)UINT32_C(0x00000000), .point2_x=(int32_t)UINT32_C(0x00000000), .point1_y=(int32_t)UINT32_C(0x00000000), .point1_x=(int32_t)UINT32_C(0x00000000), .coordinate_mode=0x0000u, .subtype=0x0001u, .type=0x0001u, .active=0x0000u, .index=0x00afu}, +}; diff --git a/original/reconstructed/tdkpin_game_windows.c b/original/reconstructed/tdkpin_game_windows.c new file mode 100644 index 0000000..d80ba85 --- /dev/null +++ b/original/reconstructed/tdkpin_game_windows.c @@ -0,0 +1,81 @@ +/* TDKPIN-specific TWindow-derived constructors from Code1. */ + +#include "tdkpin_game_windows.h" + +static void write_far( + Win16FarPtr base, uint16_t offset, Win16FarPtr value) +{ + win16_write_u16(base, offset, win16_far_offset(value)); + win16_write_u16( + base, (uint16_t)(offset + 2), win16_far_selector(value)); +} + +/* 1000:01d3 -- fixed 640x480 main window centered on the Win16 screen. */ +Win16FarPtr tdkpin_main_window_construct( + Win16FarPtr window, + uint16_t vmt, + Win16FarPtr title, + Win16FarPtr parent) +{ + BorlandObjectCallFrame frame = {window, vmt}; + if (!borland_enter_object_constructor(&frame, 0)) { + return frame.object; + } + frame.object = object_windows_window_construct( + frame.object, 0, title, parent); + win16_write_u16(frame.object, 0x2d, 640); + win16_write_u16(frame.object, 0x2f, 480); + INT16 x = (INT16)(GetSystemMetrics16(0) / 2 - 640 / 2); + INT16 y = (INT16)(GetSystemMetrics16(1) / 2 - 480 / 2); + win16_write_u16(frame.object, 0x29, (uint16_t)x); + win16_write_u16(frame.object, 0x2b, (uint16_t)y); + win16_write_u32(frame.object, 0x21, 0x86ca0000u); + return frame.object; +} + +/* 1000:5aea -- centered 360x300 child/overlay window with additive styles. */ +Win16FarPtr tdkpin_centered_child_window_construct( + Win16FarPtr window, + uint16_t vmt, + Win16FarPtr title, + Win16FarPtr parent) +{ + BorlandObjectCallFrame frame = {window, vmt}; + if (!borland_enter_object_constructor(&frame, 0)) { + return frame.object; + } + frame.object = object_windows_window_construct( + frame.object, 0, title, parent); + write_far(frame.object, 0x41, parent); + win16_write_u16(frame.object, 0x2d, 360); + win16_write_u16(frame.object, 0x2f, 300); + win16_write_u16(frame.object, 0x29, 140); + win16_write_u16(frame.object, 0x2b, 80); + uint32_t style = win16_read_u32(win16_far_add_offset(frame.object, 0x21)); + win16_write_u32(frame.object, 0x21, style | 0x46800002u); + (void)SetFocus16(win16_read_u16(win16_far_add_offset(frame.object, 4))); + return frame.object; +} + +/* 1000:6073 -- fixed 640x460 origin window with replaced style dword. */ +Win16FarPtr tdkpin_full_child_window_construct( + Win16FarPtr window, + uint16_t vmt, + Win16FarPtr title, + Win16FarPtr parent) +{ + BorlandObjectCallFrame frame = {window, vmt}; + if (!borland_enter_object_constructor(&frame, 0)) { + return frame.object; + } + frame.object = object_windows_window_construct( + frame.object, 0, title, parent); + write_far(frame.object, 0x41, parent); + win16_write_u16(frame.object, 0x2d, 640); + win16_write_u16(frame.object, 0x2f, 460); + win16_write_u16(frame.object, 0x29, 0); + win16_write_u16(frame.object, 0x2b, 0); + win16_write_u32(frame.object, 0x21, 0x46000002u); + (void)SetFocus16(win16_read_u16(win16_far_add_offset(frame.object, 4))); + return frame.object; +} diff --git a/original/reconstructed/tdkpin_game_windows.h b/original/reconstructed/tdkpin_game_windows.h new file mode 100644 index 0000000..827c57a --- /dev/null +++ b/original/reconstructed/tdkpin_game_windows.h @@ -0,0 +1,22 @@ +#ifndef TDKPIN_GAME_WINDOWS_H +#define TDKPIN_GAME_WINDOWS_H + +#include "tdkpin_window_placement.h" + +Win16FarPtr tdkpin_main_window_construct( + Win16FarPtr window, + uint16_t vmt, + Win16FarPtr title, + Win16FarPtr parent); /* 1000:01d3 */ +Win16FarPtr tdkpin_centered_child_window_construct( + Win16FarPtr window, + uint16_t vmt, + Win16FarPtr title, + Win16FarPtr parent); /* 1000:5aea */ +Win16FarPtr tdkpin_full_child_window_construct( + Win16FarPtr window, + uint16_t vmt, + Win16FarPtr title, + Win16FarPtr parent); /* 1000:6073 */ + +#endif diff --git a/original/reconstructed/tdkpin_gameplay_helpers.c b/original/reconstructed/tdkpin_gameplay_helpers.c new file mode 100644 index 0000000..23dbc9e --- /dev/null +++ b/original/reconstructed/tdkpin_gameplay_helpers.c @@ -0,0 +1,858 @@ +/* Small address-linked gameplay rendering and transition helpers. */ + +#include "tdkpin_gameplay_helpers.h" + +#include "tdkpin_arithmetic.h" +#include "tdkpin_sound.h" + +static Win16FarPtr caller_receiver(uint16_t caller_bp) +{ + uint16_t offset = win16_read_stack_u16((uint16_t)(caller_bp + 6)); + uint16_t selector = win16_read_stack_u16((uint16_t)(caller_bp + 8)); + return win16_make_far_pointer(selector, offset); +} + +static uint16_t caller_stack_word(uint16_t caller_bp, int16_t displacement) +{ + return win16_read_stack_u16((uint16_t)(caller_bp + displacement)); +} + +static void write_caller_stack_word( + uint16_t caller_bp, int16_t displacement, uint16_t value) +{ + win16_write_stack_u16((uint16_t)(caller_bp + displacement), value); +} + +/* 1000:635c -- update the backing bitmap and immediately present it. */ +void tdkpin_blit_bitmap_and_present( + HBITMAP16 bitmap, + INT16 height, + INT16 width, + INT16 y, + INT16 x, + HDC16 dc) +{ + tdkpin_blit_bitmap_to_background(bitmap, height, width, y, x, dc); + tdkpin_present_background_region(height, width, y, x, dc); +} + +/* + * 1000:6b37 -- nested helper used by 6bf8 to composite one 21x18 board + * decoration row. Its first argument is the caller's BP, so the four GDI + * temporaries deliberately occupy SS:[BP-0e..BP-14] in the parent frame. + */ +void tdkpin_draw_board_decoration_row(uint16_t caller_bp, INT16 y) +{ + HDC16 target_dc = caller_stack_word(caller_bp, -0x0c); + HDC16 background_dc = CreateCompatibleDC16(target_dc); + write_caller_stack_word(caller_bp, -0x0e, background_dc); + HDC16 decoration_dc = CreateCompatibleDC16(target_dc); + write_caller_stack_word(caller_bp, -0x10, decoration_dc); + + HBITMAP16 background = win16_read_u16( + win16_dgroup_pointer(0x085b)); + HGDIOBJ16 old_background = SelectObject16(background_dc, background); + write_caller_stack_word(caller_bp, -0x12, old_background); + HBITMAP16 decoration = win16_read_u16( + win16_dgroup_pointer(0x0865)); + HGDIOBJ16 old_decoration = SelectObject16(decoration_dc, decoration); + write_caller_stack_word(caller_bp, -0x14, old_decoration); + + (void)BitBlt16( + background_dc, 0, y, 21, 18, + decoration_dc, 314, 426, 0x00cc0020u); + (void)SelectObject16( + decoration_dc, caller_stack_word(caller_bp, -0x14)); + (void)SelectObject16( + background_dc, caller_stack_word(caller_bp, -0x12)); + (void)DeleteDC16(decoration_dc); + (void)DeleteDC16(background_dc); + tdkpin_present_background_region(18, 21, y, 0, target_dc); +} + +/* Same binary operation when the enclosing 6bf8 frame already owns the DC. */ +void tdkpin_draw_board_decoration_row_on_dc(INT16 y, HDC16 dc) +{ + HDC16 background_dc = CreateCompatibleDC16(dc); + HDC16 decoration_dc = CreateCompatibleDC16(dc); + HGDIOBJ16 old_background = SelectObject16( + background_dc, win16_read_u16(win16_dgroup_pointer(0x085b))); + HGDIOBJ16 old_decoration = SelectObject16( + decoration_dc, win16_read_u16(win16_dgroup_pointer(0x0865))); + (void)BitBlt16( + background_dc, 0, y, 21, 18, + decoration_dc, 314, 426, 0x00cc0020u); + (void)SelectObject16(decoration_dc, old_decoration); + (void)SelectObject16(background_dc, old_background); + (void)DeleteDC16(decoration_dc); + (void)DeleteDC16(background_dc); + tdkpin_present_background_region(18, 21, y, 0, dc); +} + +/* + * 1000:9bca -- composite the 19x19 ball mask/image over the background and + * present the clipped result. All locals live in the enclosing caller frame. + */ +void tdkpin_render_ball_from_caller_frame(uint16_t caller_bp) +{ + Win16FarPtr receiver = caller_receiver(caller_bp); + HWND16 window = win16_read_u16(win16_far_add_offset(receiver, 4)); + (void)GetClientRect16( + window, + win16_current_stack_address((uint16_t)(caller_bp - 0x1a))); + HDC16 target_dc = GetDC16(window); + write_caller_stack_word(caller_bp, -0x0c, target_dc); + + HDC16 background_dc = CreateCompatibleDC16(target_dc); + write_caller_stack_word(caller_bp, -0x0e, background_dc); + HDC16 composite_dc = CreateCompatibleDC16(target_dc); + write_caller_stack_word(caller_bp, -0x10, composite_dc); + HDC16 unused_dc = CreateCompatibleDC16(target_dc); + write_caller_stack_word(caller_bp, -0x12, unused_dc); + HBITMAP16 composite_bitmap = + CreateCompatibleBitmap16(target_dc, 100, 100); + write_caller_stack_word(caller_bp, -0x08, composite_bitmap); + + int32_t pixel_x = borland_divide_i32( + (int32_t)((uint32_t)g_ball_x_milli + 500u), 1000).quotient - 8; + int32_t pixel_y = borland_divide_i32( + (int32_t)((uint32_t)g_ball_y_milli + 500u), 1000).quotient - 8; + win16_write_u32(receiver, 0x0ba2, (uint32_t)pixel_x); + win16_write_u32(receiver, 0x0ba6, (uint32_t)pixel_y); + + INT16 destination_x = (INT16)(pixel_x - 1); + INT16 destination_y = (INT16)(pixel_y - 1); + INT16 source_x = 1; + INT16 source_y = 1; + INT16 width = 19; + INT16 height = 19; + write_caller_stack_word(caller_bp, -0x20, (uint16_t)destination_x); + write_caller_stack_word(caller_bp, -0x1c, (uint16_t)source_x); + write_caller_stack_word(caller_bp, -0x22, (uint16_t)destination_y); + write_caller_stack_word(caller_bp, -0x1e, (uint16_t)source_y); + write_caller_stack_word(caller_bp, -0x28, (uint16_t)width); + write_caller_stack_word(caller_bp, -0x2a, (uint16_t)height); + + HBITMAP16 background = win16_read_u16( + win16_dgroup_pointer(0x085b)); + HGDIOBJ16 old_background = SelectObject16(background_dc, background); + write_caller_stack_word(caller_bp, -0x02, old_background); + HGDIOBJ16 old_composite = SelectObject16(composite_dc, composite_bitmap); + write_caller_stack_word(caller_bp, -0x04, old_composite); + (void)BitBlt16( + composite_dc, 0, 0, width, height, + background_dc, destination_x, destination_y, 0x00cc0020u); + + (void)SelectObject16( + background_dc, + win16_read_u16(win16_far_add_offset(receiver, 0x54))); + (void)BitBlt16( + composite_dc, source_x, source_y, width, height, + background_dc, 0, 0, 0x008800c6u); + (void)SelectObject16( + background_dc, + win16_read_u16(win16_far_add_offset(receiver, 0x52))); + (void)BitBlt16( + composite_dc, source_x, source_y, width, height, + background_dc, 0, 0, 0x00ee0086u); + + if ((int16_t)(destination_y + height) > 442) { + height = destination_y <= 442 + ? (INT16)(443 - destination_y) + : 0; + write_caller_stack_word(caller_bp, -0x2a, (uint16_t)height); + } + (void)BitBlt16( + target_dc, destination_x, destination_y, width, height, + composite_dc, 0, 0, 0x00cc0020u); + + (void)SelectObject16( + background_dc, caller_stack_word(caller_bp, -0x02)); + (void)SelectObject16( + composite_dc, caller_stack_word(caller_bp, -0x04)); + (void)SelectObject16( + unused_dc, caller_stack_word(caller_bp, -0x06)); + (void)DeleteObject16(composite_bitmap); + (void)DeleteDC16(background_dc); + (void)DeleteDC16(composite_dc); + (void)DeleteDC16(unused_dc); + (void)ReleaseDC16(window, target_dc); +} + +/* + * 1000:a38e -- restore the background under the receiver's previous ball + * position. The low byte of the second ABI word suppresses presentation. + */ +void tdkpin_restore_previous_ball_region( + uint16_t caller_bp, uint8_t suppress_present) +{ + Win16FarPtr receiver = caller_receiver(caller_bp); + HWND16 window = win16_read_u16(win16_far_add_offset(receiver, 4)); + (void)GetClientRect16( + window, + win16_current_stack_address((uint16_t)(caller_bp - 0x1a))); + HDC16 target_dc = GetDC16(window); + write_caller_stack_word(caller_bp, -0x0c, target_dc); + HDC16 background_dc = CreateCompatibleDC16(target_dc); + write_caller_stack_word(caller_bp, -0x0e, background_dc); + HDC16 saved_region_dc = CreateCompatibleDC16(target_dc); + write_caller_stack_word(caller_bp, -0x10, saved_region_dc); + HDC16 unused_dc = CreateCompatibleDC16(target_dc); + write_caller_stack_word(caller_bp, -0x12, unused_dc); + HBITMAP16 saved_region = CreateCompatibleBitmap16(target_dc, 100, 100); + write_caller_stack_word(caller_bp, -0x08, saved_region); + + int32_t milli_x = (int32_t)win16_read_u32( + win16_far_add_offset(receiver, 0x0bc2)); + int32_t milli_y = (int32_t)win16_read_u32( + win16_far_add_offset(receiver, 0x0bc6)); + int32_t pixel_x = borland_divide_i32( + (int32_t)((uint32_t)milli_x + 500u), 1000).quotient - 8; + int32_t pixel_y = borland_divide_i32( + (int32_t)((uint32_t)milli_y + 500u), 1000).quotient - 8; + win16_write_u32(receiver, 0x0ba2, (uint32_t)pixel_x); + win16_write_u32(receiver, 0x0ba6, (uint32_t)pixel_y); + INT16 destination_x = (INT16)(pixel_x - 1); + INT16 destination_y = (INT16)(pixel_y - 1); + INT16 width = 19; + INT16 height = 19; + write_caller_stack_word(caller_bp, -0x20, (uint16_t)destination_x); + write_caller_stack_word(caller_bp, -0x1c, 1); + write_caller_stack_word(caller_bp, -0x22, (uint16_t)destination_y); + write_caller_stack_word(caller_bp, -0x1e, 1); + write_caller_stack_word(caller_bp, -0x28, (uint16_t)width); + write_caller_stack_word(caller_bp, -0x2a, (uint16_t)height); + win16_write_u32(receiver, 0x0baa, 0); + win16_write_u32(receiver, 0x0bae, 0); + + HGDIOBJ16 old_background = SelectObject16( + background_dc, + win16_read_u16(win16_dgroup_pointer(0x085b))); + write_caller_stack_word(caller_bp, -0x02, old_background); + HGDIOBJ16 old_saved_region = SelectObject16(saved_region_dc, saved_region); + write_caller_stack_word(caller_bp, -0x04, old_saved_region); + (void)BitBlt16( + saved_region_dc, 0, 0, width, height, + background_dc, destination_x, destination_y, 0x00cc0020u); + if ((int16_t)(destination_y + height) > 442) { + height = destination_y <= 442 + ? (INT16)(443 - destination_y) + : 0; + write_caller_stack_word(caller_bp, -0x2a, (uint16_t)height); + } + if (suppress_present == 0) { + (void)BitBlt16( + target_dc, destination_x, destination_y, width, height, + saved_region_dc, 0, 0, 0x00cc0020u); + } + + (void)SelectObject16( + background_dc, caller_stack_word(caller_bp, -0x02)); + (void)SelectObject16( + saved_region_dc, caller_stack_word(caller_bp, -0x04)); + (void)SelectObject16( + unused_dc, caller_stack_word(caller_bp, -0x06)); + (void)DeleteObject16(saved_region); + (void)DeleteDC16(background_dc); + (void)DeleteDC16(saved_region_dc); + (void)DeleteDC16(unused_dc); + (void)ReleaseDC16(window, target_dc); +} + +static uint32_t wrapping_magnitude_i32(int32_t value) +{ + return value < 0 ? 0u - (uint32_t)value : (uint32_t)value; +} + +/* + * 1000:9f73 -- composite and present the swept rectangle between the previous + * and current ball positions, retaining signed delta and 16-bit clip rules. + */ +void tdkpin_render_ball_swept_region(uint16_t caller_bp) +{ + Win16FarPtr receiver = caller_receiver(caller_bp); + HWND16 window = win16_read_u16(win16_far_add_offset(receiver, 4)); + (void)GetClientRect16( + window, + win16_current_stack_address((uint16_t)(caller_bp - 0x1a))); + HDC16 target_dc = GetDC16(window); + write_caller_stack_word(caller_bp, -0x0c, target_dc); + HDC16 background_dc = CreateCompatibleDC16(target_dc); + write_caller_stack_word(caller_bp, -0x0e, background_dc); + HDC16 swept_dc = CreateCompatibleDC16(target_dc); + write_caller_stack_word(caller_bp, -0x10, swept_dc); + HDC16 unused_dc = CreateCompatibleDC16(target_dc); + write_caller_stack_word(caller_bp, -0x12, unused_dc); + HBITMAP16 swept_bitmap = CreateCompatibleBitmap16(target_dc, 100, 100); + write_caller_stack_word(caller_bp, -0x08, swept_bitmap); + + int32_t previous_x = (int32_t)win16_read_u32( + win16_far_add_offset(receiver, 0x0bc2)); + int32_t previous_y = (int32_t)win16_read_u32( + win16_far_add_offset(receiver, 0x0bc6)); + int32_t pixel_x = borland_divide_i32( + (int32_t)((uint32_t)g_ball_x_milli + 500u), 1000).quotient - 8; + int32_t pixel_y = borland_divide_i32( + (int32_t)((uint32_t)g_ball_y_milli + 500u), 1000).quotient - 8; + win16_write_u32(receiver, 0x0ba2, (uint32_t)pixel_x); + win16_write_u32(receiver, 0x0ba6, (uint32_t)pixel_y); + int32_t delta_x = borland_divide_i32( + (int32_t)((uint32_t)g_ball_x_milli - (uint32_t)previous_x), + 1000).quotient; + int32_t delta_y = borland_divide_i32( + (int32_t)((uint32_t)g_ball_y_milli - (uint32_t)previous_y), + 1000).quotient; + win16_write_u32(receiver, 0x0bb2, (uint32_t)delta_x); + win16_write_u32(receiver, 0x0bb6, (uint32_t)delta_y); + + INT16 destination_x; + INT16 source_x; + if (delta_x > 0) { + destination_x = (INT16)((uint32_t)pixel_x - (uint32_t)delta_x - 1u); + source_x = (INT16)((uint32_t)delta_x + 1u); + } else { + destination_x = (INT16)((uint32_t)pixel_x - 1u); + source_x = 1; + } + INT16 destination_y; + INT16 source_y; + if (delta_y > 0) { + destination_y = (INT16)((uint32_t)pixel_y - (uint32_t)delta_y - 1u); + source_y = (INT16)((uint32_t)delta_y + 1u); + } else { + destination_y = (INT16)((uint32_t)pixel_y - 1u); + source_y = 1; + } + INT16 width = (INT16)(uint16_t)(wrapping_magnitude_i32(delta_x) + 19u); + INT16 height = (INT16)(uint16_t)(wrapping_magnitude_i32(delta_y) + 19u); + write_caller_stack_word(caller_bp, -0x20, (uint16_t)destination_x); + write_caller_stack_word(caller_bp, -0x1c, (uint16_t)source_x); + write_caller_stack_word(caller_bp, -0x22, (uint16_t)destination_y); + write_caller_stack_word(caller_bp, -0x1e, (uint16_t)source_y); + write_caller_stack_word(caller_bp, -0x28, (uint16_t)width); + write_caller_stack_word(caller_bp, -0x2a, (uint16_t)height); + + HGDIOBJ16 old_background = SelectObject16( + background_dc, + win16_read_u16(win16_dgroup_pointer(0x085b))); + write_caller_stack_word(caller_bp, -0x02, old_background); + HGDIOBJ16 old_swept = SelectObject16(swept_dc, swept_bitmap); + write_caller_stack_word(caller_bp, -0x04, old_swept); + (void)BitBlt16( + swept_dc, 0, 0, width, height, + background_dc, destination_x, destination_y, 0x00cc0020u); + (void)SelectObject16( + background_dc, + win16_read_u16(win16_far_add_offset(receiver, 0x54))); + (void)BitBlt16( + swept_dc, source_x, source_y, 19, 19, + background_dc, 0, 0, 0x008800c6u); + (void)SelectObject16( + background_dc, + win16_read_u16(win16_far_add_offset(receiver, 0x52))); + (void)BitBlt16( + swept_dc, source_x, source_y, 19, 19, + background_dc, 0, 0, 0x00ee0086u); + if ((int16_t)(destination_y + height) > 442) { + height = destination_y <= 442 + ? (INT16)(443 - destination_y) + : 0; + write_caller_stack_word(caller_bp, -0x2a, (uint16_t)height); + } + (void)BitBlt16( + target_dc, destination_x, destination_y, width, height, + swept_dc, 0, 0, 0x00cc0020u); + + (void)SelectObject16( + background_dc, caller_stack_word(caller_bp, -0x02)); + (void)SelectObject16(swept_dc, caller_stack_word(caller_bp, -0x04)); + (void)SelectObject16(unused_dc, caller_stack_word(caller_bp, -0x06)); + (void)DeleteObject16(swept_bitmap); + (void)DeleteDC16(background_dc); + (void)DeleteDC16(swept_dc); + (void)DeleteDC16(unused_dc); + (void)ReleaseDC16(window, target_dc); +} + +/* + * 1000:beff -- retain the current position, apply wrapping milli-coordinate + * deltas (Y in the final four-byte ABI argument), then render the swept move. + */ +void tdkpin_move_ball_and_render( + uint16_t caller_bp, int32_t delta_x, int32_t delta_y) +{ + Win16FarPtr receiver = caller_receiver(caller_bp); + win16_write_u32(receiver, 0x0bc2, (uint32_t)g_ball_x_milli); + win16_write_u32(receiver, 0x0bc6, (uint32_t)g_ball_y_milli); + g_ball_y_milli = (int32_t)((uint32_t)g_ball_y_milli + (uint32_t)delta_y); + g_ball_x_milli = (int32_t)((uint32_t)g_ball_x_milli + (uint32_t)delta_x); + tdkpin_render_ball_swept_region(caller_bp); +} + +/* 1000:9e85 -- reset ball/game fields, then redraw through 1000:9bca. */ +void tdkpin_reset_ball_state(uint16_t caller_bp) +{ + Win16FarPtr receiver = caller_receiver(caller_bp); + static const uint16_t completion_words[5] = { + 0x3371, 0x33c4, 0x3417, 0x346a, 0x34bd}; + bool complete = true; + for (uint16_t index = 0; index < 5; index++) { + if (win16_read_u16( + win16_dgroup_pointer(completion_words[index])) == 0) { + complete = false; + break; + } + } + if (complete) { + win16_write_u16(win16_dgroup_pointer(0x0851), 0, 0); + win16_write_u16(win16_dgroup_pointer(0x0853), 0, 0); + win16_write_u8(win16_dgroup_pointer(0x07c8), 1); + win16_write_u8(win16_far_add_offset(receiver, 0x0bdd), 0); + } + + win16_write_u8(win16_dgroup_pointer(0x07c6), 0); + win16_write_u16(receiver, 0x5e, 0); + g_ball_x_milli = 325000; + g_ball_y_milli = 413000; + win16_write_u32(receiver, 0x0bba, (uint32_t)g_ball_x_milli); + win16_write_u32(receiver, 0x0bbe, (uint32_t)g_ball_y_milli); + win16_write_u32(receiver, 0x0bc2, (uint32_t)g_ball_x_milli); + win16_write_u32(receiver, 0x0bc6, (uint32_t)g_ball_y_milli); + win16_write_u32(receiver, 0x0bae, 0); + win16_write_u32(receiver, 0x0baa, 0); + win16_write_u16(receiver, 0x0bce, 0); + win16_write_u16(receiver, 0x0bd0, 0); + win16_write_u16(receiver, 0x0bd2, 0); + win16_write_u32(receiver, 0x0bca, 0); + win16_write_u8(win16_far_add_offset(receiver, 0x0bdd), 0); + tdkpin_render_ball_from_caller_frame(caller_bp); +} + +/* 1000:a604 -- redraw the active player's six five-pixel progress markers. */ +void tdkpin_refresh_player_progress_markers(uint16_t caller_bp) +{ + Win16FarPtr receiver = caller_receiver(caller_bp); + HWND16 window = win16_read_u16(win16_far_add_offset(receiver, 4)); + HDC16 dc = GetDC16(window); + INT16 threshold = (INT16)win16_read_u16( + win16_dgroup_pointer((uint16_t)( + 0x081f + (uint16_t)g_current_player * 2u))); + INT16 player_y = (INT16)( + (uint16_t)(g_current_player - 1u) * 44u + 298u); + for (int32_t marker = 1; marker <= 6; marker++) { + INT16 marker_x = (INT16)( + (uint16_t)borland_multiply_i32(marker - 1, 8) + 391u); + if (marker <= threshold) { + tdkpin_restore_background_region_a( + 5, 5, player_y, marker_x, dc); + } else { + tdkpin_restore_background_region_b( + 5, 5, player_y, marker_x, dc); + } + tdkpin_present_background_region( + 5, 5, player_y, marker_x, dc); + } + (void)ReleaseDC16(window, dc); +} + +/* 1000:0002 -- composite one indexed 400-series sprite into the background. */ +void tdkpin_composite_player_sprite( + uint16_t sprite_index, HDC16 reference_dc) +{ + HDC16 background_dc = CreateCompatibleDC16(reference_dc); + HDC16 sprite_dc = CreateCompatibleDC16(reference_dc); + HDC16 saved_region_dc = CreateCompatibleDC16(reference_dc); + HBITMAP16 saved_region = + CreateCompatibleBitmap16(reference_dc, 14, 14); + HGDIOBJ16 old_background = SelectObject16( + background_dc, + win16_read_u16(win16_dgroup_pointer(0x085b))); + HGDIOBJ16 old_sprite = SelectObject16( + sprite_dc, + win16_read_u16(win16_dgroup_pointer((uint16_t)( + 0x430b + sprite_index * 2u)))); + HGDIOBJ16 old_saved_region = + SelectObject16(saved_region_dc, saved_region); + + (void)BitBlt16( + saved_region_dc, 0, 0, 14, 14, + background_dc, 84, 77, 0x00cc0020u); + (void)BitBlt16( + background_dc, 55, 79, 42, 123, + sprite_dc, 0, 0, 0x00cc0020u); + (void)BitBlt16( + background_dc, 84, 77, 14, 14, + saved_region_dc, 0, 0, 0x00cc0020u); + + (void)SelectObject16(saved_region_dc, old_saved_region); + (void)SelectObject16(sprite_dc, old_sprite); + (void)SelectObject16(background_dc, old_background); + (void)DeleteObject16(saved_region); + (void)DeleteDC16(saved_region_dc); + (void)DeleteDC16(sprite_dc); + (void)DeleteDC16(background_dc); +} + +static Win16FarPtr active_player_dword(uint16_t index_zero_base) +{ + return win16_dgroup_pointer((uint16_t)( + index_zero_base + (uint16_t)g_current_player * 4u)); +} + +/* + * 1000:bc36 -- add a score delta, award crossed marker thresholds, and redraw. + * Delta -1 is the explicit redraw-only sentinel; tilt suppresses all mutation. + */ +void tdkpin_add_score_from_caller_frame( + uint16_t caller_bp, int32_t delta) +{ + Win16FarPtr receiver = caller_receiver(caller_bp); + HWND16 window = win16_read_u16(win16_far_add_offset(receiver, 4)); + HDC16 dc = GetDC16(window); + if (delta != -1 && + win16_read_u8(win16_dgroup_pointer(0x07c6)) == 0) { + if (win16_read_u8(win16_dgroup_pointer(0x0874)) != 0) { + delta = borland_multiply_i32(delta, 2); + } + if (win16_read_u8( + win16_far_add_offset(receiver, 0x0bdc)) != 0) { + delta = borland_multiply_i32(delta, 2); + } + + Win16FarPtr score = active_player_dword(0x097e); + uint32_t updated = win16_read_u32(score) + (uint32_t)delta; + win16_write_u32(score, 0, updated); + + Win16FarPtr marker_level = active_player_dword(0x0835); + int32_t level = (int32_t)win16_read_u32(marker_level); + if (level <= 4) { + uint32_t threshold = win16_read_u32( + win16_dgroup_pointer((uint16_t)(0x0825 + + (uint16_t)level * 4u))); + if ((int16_t)(updated >> 16) > (int16_t)(threshold >> 16) || + ((int16_t)(updated >> 16) == + (int16_t)(threshold >> 16) && + (uint16_t)updated >= (uint16_t)threshold)) { + tdkpin_play_sound_if_not_tilted(7); + win16_write_u32(marker_level, 0, (uint32_t)level + 1u); + Win16FarPtr markers = win16_dgroup_pointer((uint16_t)( + 0x081f + (uint16_t)g_current_player * 2u)); + win16_write_u16( + markers, 0, (uint16_t)(win16_read_u16(markers) + 1u)); + tdkpin_refresh_player_progress_markers(caller_bp); + } + } + tdkpin_update_status_display(g_current_player, dc); + } + tdkpin_draw_score(dc, (int32_t)g_current_player); + (void)ReleaseDC16(window, dc); +} + +static void restore_bounds( + bool overlay_a, + INT16 bottom, + INT16 right, + INT16 top, + INT16 left, + HDC16 dc) +{ + INT16 height = (INT16)(uint16_t)( + (uint16_t)bottom - (uint16_t)top + 1); + INT16 width = (INT16)(uint16_t)( + (uint16_t)right - (uint16_t)left + 1); + if (overlay_a) { + tdkpin_restore_background_region_a(height, width, top, left, dc); + } else { + tdkpin_restore_background_region_b(height, width, top, left, dc); + } + tdkpin_present_background_region(height, width, top, left, dc); +} + +/* 1000:b2c8 -- inclusive rectangle restore from overlay A. */ +void tdkpin_restore_bounds_overlay_a( + uint16_t ignored_static_link, + INT16 bottom, + INT16 right, + INT16 top, + INT16 left, + HDC16 dc) +{ + (void)ignored_static_link; + restore_bounds(true, bottom, right, top, left, dc); +} + +/* 1000:b3b0 -- inclusive rectangle restore from overlay B. */ +void tdkpin_restore_bounds_overlay_b( + uint16_t ignored_static_link, + INT16 bottom, + INT16 right, + INT16 top, + INT16 left, + HDC16 dc) +{ + (void)ignored_static_link; + restore_bounds(false, bottom, right, top, left, dc); +} + +/* + * 1000:bda2 -- caller-frame helper. SS:[caller BP+6] is the far receiver; + * its HWND at +4 owns the transient DC used for the 32-bit score value. + */ +void tdkpin_draw_score_from_caller_frame( + uint16_t caller_bp, uint16_t value_low, uint16_t value_high) +{ + Win16FarPtr receiver = caller_receiver(caller_bp); + HWND16 window = win16_read_u16(win16_far_add_offset(receiver, 4)); + HDC16 dc = GetDC16(window); + int32_t value = (int32_t)( + (uint32_t)value_low | ((uint32_t)value_high << 16)); + tdkpin_draw_score(dc, value); + (void)ReleaseDC16(window, dc); +} + +/* 1000:a70e -- clear the player counter and set object/global transition bytes. */ +void tdkpin_set_gameplay_transition_flags(uint16_t caller_bp) +{ + g_player_count = 0; + Win16FarPtr receiver = caller_receiver(caller_bp); + win16_write_u8(win16_far_add_offset(receiver, 0x0bde), 1); + g_gameplay_transition_pending = 1; +} + +static uint16_t point_in_bounds_with_residue( + int32_t x, + int32_t y, + int32_t maximum_y, + int32_t maximum_x, + int32_t minimum_y, + int32_t minimum_x) +{ + uint16_t ax_residue = (uint16_t)x; + bool inside = x >= minimum_x; + if (inside) { + ax_residue = (uint16_t)y; + inside = y >= minimum_y; + } + if (inside) { + ax_residue = (uint16_t)x; + inside = x <= maximum_x; + } + if (inside) { + ax_residue = (uint16_t)y; + inside = y <= maximum_y; + } + return (ax_residue & 0xff00u) | (inside ? 1u : 0u); +} + +/* 1000:9ae0 -- test the receiver's current milli-coordinate against bounds. */ +uint16_t tdkpin_receiver_point_in_bounds( + uint16_t caller_bp, + int32_t maximum_y, + int32_t maximum_x, + int32_t minimum_y, + int32_t minimum_x) +{ + Win16FarPtr receiver = caller_receiver(caller_bp); + int32_t x = (int32_t)win16_read_u32( + win16_far_add_offset(receiver, 0x0bba)); + int32_t y = (int32_t)win16_read_u32( + win16_far_add_offset(receiver, 0x0bbe)); + return point_in_bounds_with_residue( + x, y, maximum_y, maximum_x, minimum_y, minimum_x); +} + +/* 1000:9b69 -- same inclusive rectangle test for the global ball position. */ +uint16_t tdkpin_ball_in_bounds( + uint16_t ignored_static_link, + int32_t maximum_y, + int32_t maximum_x, + int32_t minimum_y, + int32_t minimum_x) +{ + (void)ignored_static_link; + return point_in_bounds_with_residue( + g_ball_x_milli, + g_ball_y_milli, + maximum_y, + maximum_x, + minimum_y, + minimum_x); +} + +/* 1000:bdde -- center dynamic record 173+displacement on the current ball. */ +void tdkpin_update_dynamic_ball_record( + uint16_t ignored_static_link, int32_t record_displacement) +{ + (void)ignored_static_link; + uint16_t index = (uint16_t)(record_displacement + 0x00ad); + uint16_t base = (uint16_t)(0x095b + (uint16_t)(index * 0x53u)); + Win16FarPtr record = win16_dgroup_pointer(base); + win16_write_u32(record, 0x12, (uint32_t)g_ball_x_milli); + win16_write_u32(record, 0x16, (uint32_t)g_ball_y_milli); + win16_write_u32( + record, 0x02, (uint32_t)((uint32_t)g_ball_x_milli - 21000u)); + win16_write_u32( + record, 0x06, (uint32_t)((uint32_t)g_ball_y_milli - 21000u)); + win16_write_u32( + record, 0x0a, (uint32_t)((uint32_t)g_ball_x_milli + 21000u)); + win16_write_u32( + record, 0x0e, (uint32_t)((uint32_t)g_ball_y_milli + 21000u)); +} + +static void restore_record_bounds( + bool overlay_a, uint16_t caller_bp, Win16FarPtr bounds) +{ + Win16FarPtr receiver = caller_receiver(caller_bp); + HWND16 window = win16_read_u16(win16_far_add_offset(receiver, 4)); + HDC16 dc = GetDC16(window); + uint16_t bottom = win16_read_u16(win16_far_add_offset(bounds, 6)); + uint16_t right = win16_read_u16(win16_far_add_offset(bounds, 4)); + uint16_t top = win16_read_u16(win16_far_add_offset(bounds, 2)); + uint16_t left = win16_read_u16(bounds); + if (overlay_a) { + tdkpin_restore_bounds_overlay_a( + caller_bp, bottom, right, top, left, dc); + } else { + tdkpin_restore_bounds_overlay_b( + caller_bp, bottom, right, top, left, dc); + } + (void)ReleaseDC16(window, dc); +} + +/* 1000:b30b -- restore collision/quad bounds from overlay A or draw item 1..9. */ +void tdkpin_restore_record_or_item_a(uint16_t caller_bp, uint16_t id) +{ + if (id <= 175) { + uint16_t offset = (uint16_t)(0x095b + (uint16_t)(id * 0x53u) + 0x4b); + restore_record_bounds(true, caller_bp, win16_dgroup_pointer(offset)); + } else if (id >= 1006 && id <= 1014) { + Win16FarPtr receiver = caller_receiver(caller_bp); + HWND16 window = win16_read_u16(win16_far_add_offset(receiver, 4)); + HDC16 dc = GetDC16(window); + tdkpin_draw_item_status((INT16)(id - 1005), dc); + (void)ReleaseDC16(window, dc); + } else { + uint16_t index = (uint16_t)(id - 1000); + uint16_t offset = (uint16_t)(0x4263 + (uint16_t)(index * 8u)); + restore_record_bounds(true, caller_bp, win16_dgroup_pointer(offset)); + } +} + +/* 1000:b3f3 -- restore collision or word-quad bounds from overlay B. */ +void tdkpin_restore_record_b(uint16_t caller_bp, uint16_t id) +{ + Win16FarPtr bounds; + if (id <= 175) { + bounds = win16_dgroup_pointer( + (uint16_t)(0x095b + (uint16_t)(id * 0x53u) + 0x4b)); + } else { + uint16_t index = (uint16_t)(id - 1000); + bounds = win16_dgroup_pointer( + (uint16_t)(0x4263 + (uint16_t)(index * 8u))); + } + restore_record_bounds(false, caller_bp, bounds); +} + +/* 1000:7e12 -- redraw records whose flag 80/100 encodes overlay polarity. */ +void tdkpin_refresh_collision_record(uint16_t caller_bp, uint16_t id) +{ + if (id == 0 || id >= 176) { + return; + } + Win16FarPtr record = win16_dgroup_pointer( + (uint16_t)(0x095b + (uint16_t)(id * 0x53u))); + uint16_t flags = win16_read_u16(win16_far_add_offset(record, 0x41)); + bool active = win16_read_u8(win16_far_add_offset(record, 0x34)) != 0; + if ((flags & 0x0080u) != 0) { + if (active) { + tdkpin_restore_record_b(caller_bp, id); + } else { + tdkpin_restore_record_or_item_a(caller_bp, id); + } + } else if ((flags & 0x0100u) != 0) { + if (active) { + tdkpin_restore_record_or_item_a(caller_bp, id); + } else { + tdkpin_restore_record_b(caller_bp, id); + } + } +} + +/* 1000:7e92 -- refresh one player item through its per-player 20-byte row. */ +void tdkpin_refresh_player_item(uint16_t caller_bp, uint16_t item) +{ + Win16FarPtr receiver = caller_receiver(caller_bp); + uint16_t offset = (uint16_t)( + (uint16_t)g_current_player * 0x14u + item + 0x0467u); + if (win16_read_u8(win16_far_add_offset(receiver, offset)) != 0) { + tdkpin_restore_record_or_item_a( + caller_bp, (uint16_t)(item + 1000)); + } else { + tdkpin_restore_record_b( + caller_bp, (uint16_t)(item + 1000)); + } +} + +/* 1000:c36b -- load one indexed ball state into active globals/object fields. */ +void tdkpin_load_ball_slot(uint16_t caller_bp, uint16_t slot) +{ + Win16FarPtr receiver = caller_receiver(caller_bp); + uint16_t word4 = (uint16_t)(slot * 4u); + uint16_t word6 = (uint16_t)(slot * 6u); + g_ball_x_milli = (int32_t)win16_read_u32( + win16_dgroup_pointer((uint16_t)(0x07e3 + word4))); + g_ball_y_milli = (int32_t)win16_read_u32( + win16_dgroup_pointer((uint16_t)(0x07eb + word4))); + win16_write_u32( + receiver, + 0x0baa, + win16_read_u32(win16_dgroup_pointer((uint16_t)(0x07f3 + word4)))); + win16_write_u32( + receiver, + 0x0bae, + win16_read_u32(win16_dgroup_pointer((uint16_t)(0x07fb + word4)))); + for (uint16_t index = 0; index < 6; index++) { + win16_write_u8( + win16_far_add_offset(receiver, (uint16_t)(0x0bce + index)), + win16_read_u8(win16_dgroup_pointer( + (uint16_t)(0x080b + word6 + index)))); + } + win16_write_u32( + receiver, + 0x0bca, + win16_read_u32(win16_dgroup_pointer((uint16_t)(0x0803 + word4)))); +} + +/* 1000:c426 -- save active globals/object fields back into one ball slot. */ +void tdkpin_save_ball_slot(uint16_t caller_bp, uint16_t slot) +{ + Win16FarPtr receiver = caller_receiver(caller_bp); + uint16_t word4 = (uint16_t)(slot * 4u); + uint16_t word6 = (uint16_t)(slot * 6u); + win16_write_u32( + win16_dgroup_pointer((uint16_t)(0x07e3 + word4)), + 0, + (uint32_t)g_ball_x_milli); + win16_write_u32( + win16_dgroup_pointer((uint16_t)(0x07eb + word4)), + 0, + (uint32_t)g_ball_y_milli); + win16_write_u32( + win16_dgroup_pointer((uint16_t)(0x07f3 + word4)), + 0, + win16_read_u32(win16_far_add_offset(receiver, 0x0baa))); + win16_write_u32( + win16_dgroup_pointer((uint16_t)(0x07fb + word4)), + 0, + win16_read_u32(win16_far_add_offset(receiver, 0x0bae))); + for (uint16_t index = 0; index < 6; index++) { + win16_write_u8( + win16_dgroup_pointer((uint16_t)(0x080b + word6 + index)), + win16_read_u8(win16_far_add_offset( + receiver, (uint16_t)(0x0bce + index)))); + } + win16_write_u32( + win16_dgroup_pointer((uint16_t)(0x0803 + word4)), + 0, + win16_read_u32(win16_far_add_offset(receiver, 0x0bca))); +} diff --git a/original/reconstructed/tdkpin_gameplay_helpers.h b/original/reconstructed/tdkpin_gameplay_helpers.h new file mode 100644 index 0000000..45a67e4 --- /dev/null +++ b/original/reconstructed/tdkpin_gameplay_helpers.h @@ -0,0 +1,89 @@ +#ifndef TDKPIN_GAMEPLAY_HELPERS_H +#define TDKPIN_GAMEPLAY_HELPERS_H + +#include "tdkpin_render.h" + +void tdkpin_blit_bitmap_and_present( + HBITMAP16 bitmap, + INT16 height, + INT16 width, + INT16 y, + INT16 x, + HDC16 dc); /* 1000:635c */ +void tdkpin_restore_bounds_overlay_a( + uint16_t ignored_static_link, + INT16 bottom, + INT16 right, + INT16 top, + INT16 left, + HDC16 dc); /* 1000:b2c8 */ +void tdkpin_restore_bounds_overlay_b( + uint16_t ignored_static_link, + INT16 bottom, + INT16 right, + INT16 top, + INT16 left, + HDC16 dc); /* 1000:b3b0 */ +void tdkpin_draw_score_from_caller_frame( + uint16_t caller_bp, + uint16_t value_low, + uint16_t value_high); /* 1000:bda2 */ +void tdkpin_set_gameplay_transition_flags( + uint16_t caller_bp); /* 1000:a70e */ +uint16_t tdkpin_receiver_point_in_bounds( + uint16_t caller_bp, + int32_t maximum_y, + int32_t maximum_x, + int32_t minimum_y, + int32_t minimum_x); /* 1000:9ae0 */ +uint16_t tdkpin_ball_in_bounds( + uint16_t ignored_static_link, + int32_t maximum_y, + int32_t maximum_x, + int32_t minimum_y, + int32_t minimum_x); /* 1000:9b69 */ +void tdkpin_update_dynamic_ball_record( + uint16_t ignored_static_link, + int32_t record_displacement); /* 1000:bdde */ +void tdkpin_restore_record_or_item_a( + uint16_t caller_bp, uint16_t id); /* 1000:b30b */ +void tdkpin_restore_record_b( + uint16_t caller_bp, uint16_t id); /* 1000:b3f3 */ +void tdkpin_refresh_collision_record( + uint16_t caller_bp, uint16_t id); /* 1000:7e12 */ +void tdkpin_refresh_player_item( + uint16_t caller_bp, uint16_t item); /* 1000:7e92 */ +void tdkpin_load_ball_slot( + uint16_t caller_bp, uint16_t slot); /* 1000:c36b */ +void tdkpin_save_ball_slot( + uint16_t caller_bp, uint16_t slot); /* 1000:c426 */ +void tdkpin_draw_board_decoration_row( + uint16_t caller_bp, INT16 y); /* 1000:6b37 */ +void tdkpin_draw_board_decoration_row_on_dc( + INT16 y, HDC16 dc); /* semantic core used by 1000:6bf8 */ +void tdkpin_render_ball_from_caller_frame( + uint16_t caller_bp); /* 1000:9bca */ +void tdkpin_reset_ball_state( + uint16_t caller_bp); /* 1000:9e85 */ +void tdkpin_refresh_player_progress_markers( + uint16_t caller_bp); /* 1000:a604 */ +void tdkpin_composite_player_sprite( + uint16_t sprite_index, HDC16 reference_dc); /* 1000:0002 */ +void tdkpin_add_score_from_caller_frame( + uint16_t caller_bp, int32_t delta); /* 1000:bc36 */ +void tdkpin_restore_previous_ball_region( + uint16_t caller_bp, uint8_t suppress_present); /* 1000:a38e */ +void tdkpin_render_ball_swept_region( + uint16_t caller_bp); /* 1000:9f73 */ +void tdkpin_move_ball_and_render( + uint16_t caller_bp, + int32_t delta_x, + int32_t delta_y); /* 1000:beff */ + +extern uint8_t g_player_count; /* 1028:07d0 */ +extern uint8_t g_gameplay_transition_pending; /* 1028:07c9 */ +extern int32_t g_ball_x_milli; /* 1028:07d3..07d6 */ +extern int32_t g_ball_y_milli; /* 1028:07d7..07da */ +extern uint8_t g_current_player; /* 1028:07d1 */ + +#endif diff --git a/original/reconstructed/tdkpin_global_memory.c b/original/reconstructed/tdkpin_global_memory.c new file mode 100644 index 0000000..351e63a --- /dev/null +++ b/original/reconstructed/tdkpin_global_memory.c @@ -0,0 +1,21 @@ +/* Application-side Win16 global-memory helpers from Code2. */ + +#include "tdkpin_global_memory.h" + +/* 1008:15c7 — allocate a movable/fixed block and return its locked far view. */ +Win16FarPtr tdkpin_global_allocate_locked(UINT16 flags, uint32_t bytes) +{ + HGLOBAL16 allocation = GlobalAlloc16(flags, bytes); + return GlobalLock16(allocation); +} + +/* + * 1008:15e7 — recover the allocation handle from the pointer selector, unlock + * it, then free it. The offset half of the supplied far pointer is ignored. + */ +void tdkpin_global_unlock_and_free(Win16FarPtr block) +{ + HGLOBAL16 allocation = GlobalHandle16(win16_far_selector(block)); + (void)GlobalUnlock16(allocation); + (void)GlobalFree16(allocation); +} diff --git a/original/reconstructed/tdkpin_global_memory.h b/original/reconstructed/tdkpin_global_memory.h new file mode 100644 index 0000000..1c2dd5e --- /dev/null +++ b/original/reconstructed/tdkpin_global_memory.h @@ -0,0 +1,10 @@ +#ifndef TDKPIN_GLOBAL_MEMORY_H +#define TDKPIN_GLOBAL_MEMORY_H + +#include "tdkpin_win16.h" + +Win16FarPtr tdkpin_global_allocate_locked( + UINT16 flags, uint32_t bytes); /* 1008:15c7 */ +void tdkpin_global_unlock_and_free(Win16FarPtr block); /* 1008:15e7 */ + +#endif diff --git a/original/reconstructed/tdkpin_heap.c b/original/reconstructed/tdkpin_heap.c new file mode 100644 index 0000000..66d124a --- /dev/null +++ b/original/reconstructed/tdkpin_heap.c @@ -0,0 +1,272 @@ +/* Borland local/global Win16 heap core reconstructed from Code5. */ + +#include "tdkpin_heap.h" + +static Win16FarPtr heap_address(uint16_t selector, uint16_t offset) +{ + return win16_make_far_pointer(selector, offset); +} + +static uint16_t heap_read(uint16_t selector, uint16_t offset) +{ + return win16_read_u16(heap_address(selector, offset)); +} + +static void heap_write(uint16_t selector, uint16_t offset, uint16_t value) +{ + win16_write_u16(heap_address(selector, 0), offset, value); +} + +static uint16_t align_heap_size(uint16_t bytes) +{ + return (uint16_t)((bytes + 3u) & 0xfffcu); +} + +uint32_t borland_heap_free_space(void) +{ + uint32_t total = GetFreeSpace16(0x1000); + uint16_t selector = g_borland_heap_segment_head; + if (selector != 0) { + do { + total += heap_read(selector, 8); + selector = heap_read(selector, 10); + } while (selector != g_borland_heap_segment_head); + } + return total; +} + +uint32_t borland_heap_largest_block(void) +{ + uint32_t largest = GlobalCompact16(0); + if ((largest >> 16) != 0) { + return largest; + } + uint16_t selector = g_borland_heap_segment_head; + if (selector != 0) { + do { + uint16_t local_free = heap_read(selector, 8); + if ((uint16_t)largest < local_free) { + largest = local_free; + } + selector = heap_read(selector, 10); + } while (selector != g_borland_heap_segment_head); + } + return largest; +} + +BorlandLocalAllocation borland_local_allocate_in_segment( + uint16_t selector, uint16_t aligned_bytes) +{ + uint16_t previous_link = 4; + while (true) { + uint16_t block = heap_read(selector, previous_link); + if (block == 0) { + return (BorlandLocalAllocation){0, true}; + } + uint16_t block_size = heap_read(selector, (uint16_t)(block + 2)); + if (block_size < aligned_bytes) { + previous_link = block; + continue; + } + + uint16_t remaining = (uint16_t)(block_size - aligned_bytes); + uint16_t replacement = heap_read(selector, block); + if (remaining != 0) { + replacement = (uint16_t)(block + aligned_bytes); + heap_write(selector, replacement, heap_read(selector, block)); + heap_write(selector, (uint16_t)(replacement + 2), remaining); + } + heap_write(selector, previous_link, replacement); + heap_write( + selector, + 8, + (uint16_t)(heap_read(selector, 8) - aligned_bytes)); + return (BorlandLocalAllocation){block, false}; + } +} + +void borland_local_merge_next(uint16_t selector, uint16_t block) +{ + uint16_t next = heap_read(selector, block); + uint16_t adjacent = + (uint16_t)(block + heap_read(selector, (uint16_t)(block + 2))); + if (adjacent == next) { + heap_write(selector, block, heap_read(selector, next)); + heap_write( + selector, + (uint16_t)(block + 2), + (uint16_t)(heap_read(selector, (uint16_t)(block + 2)) + + heap_read(selector, (uint16_t)(next + 2)))); + } +} + +uint16_t borland_create_local_heap_segment(void) +{ + Win16FarPtr allocation = + borland_global_allocate(g_borland_heap_segment_bytes); + if (allocation == 0) { + return 0; + } + uint16_t selector = win16_far_selector(allocation); + uint16_t free_bytes = + (uint16_t)(g_borland_heap_segment_bytes - BORLAND_LOCAL_HEAP_HEADER_BYTES); + heap_write(selector, 0, BORLAND_LOCAL_HEAP_MAGIC); + heap_write(selector, 2, 0); + heap_write(selector, 4, BORLAND_LOCAL_HEAP_HEADER_BYTES); + heap_write(selector, 6, 0); + heap_write(selector, 8, free_bytes); + + uint16_t next = selector; + if (g_borland_heap_segment_head != 0) { + next = heap_read(g_borland_heap_segment_head, 10); + heap_write(g_borland_heap_segment_head, 10, selector); + } + heap_write(selector, 10, next); + heap_write(selector, 12, 0); + heap_write(selector, 14, free_bytes); + return selector; +} + +static BorlandAllocationAttempt borland_try_local_allocation(uint16_t bytes) +{ + uint16_t aligned = align_heap_size(bytes); + uint16_t selector = g_borland_heap_segment_head; + if (selector != 0) { + do { + BorlandLocalAllocation local = + borland_local_allocate_in_segment(selector, aligned); + if (!local.failed) { + g_borland_heap_segment_head = selector; + return (BorlandAllocationAttempt){ + heap_address(selector, local.offset), false}; + } + selector = heap_read(selector, 10); + } while (selector != g_borland_heap_segment_head); + } + + selector = borland_create_local_heap_segment(); + if (selector == 0) { + return (BorlandAllocationAttempt){0, true}; + } + BorlandLocalAllocation local = + borland_local_allocate_in_segment(selector, aligned); + if (local.failed) { + return (BorlandAllocationAttempt){0, true}; + } + g_borland_heap_segment_head = selector; + return (BorlandAllocationAttempt){ + heap_address(selector, local.offset), false}; +} + +BorlandAllocationAttempt borland_try_get_mem(uint16_t bytes) +{ + if (bytes == 0) { + return (BorlandAllocationAttempt){0, false}; + } + while (true) { + BorlandAllocationAttempt result; + if (bytes < g_borland_local_heap_limit) { + result = borland_try_local_allocation(bytes); + if (!result.failed) { + return result; + } + Win16FarPtr global = borland_global_allocate(bytes); + if (global != 0) { + return (BorlandAllocationAttempt){global, false}; + } + } else { + Win16FarPtr global = borland_global_allocate(bytes); + if (global != 0) { + return (BorlandAllocationAttempt){global, false}; + } + if (g_borland_local_heap_limit != 0 && + bytes <= + (uint16_t)(g_borland_heap_segment_bytes - + BORLAND_LOCAL_HEAP_HEADER_BYTES)) { + result = borland_try_local_allocation(bytes); + if (!result.failed) { + return result; + } + } + } + + uint16_t action = g_borland_heap_error_handler == 0 + ? 0 + : win16_call_pascal_u16(g_borland_heap_error_handler, bytes); + if (action > 1) { + continue; + } + return (BorlandAllocationAttempt){0, action == 0}; + } +} + +static bool borland_global_free_selector(uint16_t selector) +{ + if (selector == win16_far_selector(win16_dgroup_pointer(0))) { + return true; + } + HGLOBAL16 handle = GlobalHandle16(selector); + if (handle == 0) { + return true; + } + (void)GlobalUnlock16(handle); + (void)GlobalFree16(handle); + return false; +} + +static bool borland_release_empty_local_segment(uint16_t selector) +{ + uint16_t next = heap_read(selector, 10); + uint16_t new_head = 0; + if (next != selector) { + uint16_t previous = g_borland_heap_segment_head; + while (heap_read(previous, 10) != selector) { + previous = heap_read(previous, 10); + } + heap_write(previous, 10, next); + new_head = previous; + } + g_borland_heap_segment_head = new_head; + return borland_global_free_selector(selector); +} + +bool borland_try_free_mem(Win16FarPtr block, uint16_t bytes) +{ + if (bytes == 0) { + return false; + } + uint16_t selector = win16_far_selector(block); + uint16_t offset = win16_far_offset(block); + if (offset == 0) { + return borland_global_free_selector(selector); + } + + uint16_t aligned = align_heap_size(bytes); + if (heap_read(selector, 0) != BORLAND_LOCAL_HEAP_MAGIC || + (offset & 3) != 0) { + return true; + } + uint16_t previous_link = 4; + uint16_t current = heap_read(selector, previous_link); + while (current != 0 && offset > current) { + previous_link = current; + current = heap_read(selector, current); + } + if (offset == current) { + return true; + } + + heap_write(selector, offset, current); + heap_write(selector, (uint16_t)(offset + 2), aligned); + uint16_t free_bytes = (uint16_t)(heap_read(selector, 8) + aligned); + heap_write(selector, 8, free_bytes); + if ((uint16_t)(free_bytes + BORLAND_LOCAL_HEAP_HEADER_BYTES) == + g_borland_heap_segment_bytes) { + return borland_release_empty_local_segment(selector); + } + + borland_local_merge_next(selector, offset); + heap_write(selector, previous_link, offset); + borland_local_merge_next(selector, previous_link); + return false; +} diff --git a/original/reconstructed/tdkpin_heap.h b/original/reconstructed/tdkpin_heap.h new file mode 100644 index 0000000..28630f5 --- /dev/null +++ b/original/reconstructed/tdkpin_heap.h @@ -0,0 +1,29 @@ +#ifndef TDKPIN_HEAP_H +#define TDKPIN_HEAP_H + +#include "tdkpin_borland_runtime.h" + +enum { + BORLAND_LOCAL_HEAP_MAGIC = 0x5054, + BORLAND_LOCAL_HEAP_HEADER_BYTES = 12, +}; + +extern uint16_t g_borland_heap_segment_head; /* 1028:0706 */ +extern uint16_t g_borland_local_heap_limit; /* 1028:0708 */ +extern uint16_t g_borland_heap_segment_bytes; /* 1028:070a */ + +typedef struct { + uint16_t offset; + bool failed; +} BorlandLocalAllocation; + +BorlandLocalAllocation borland_local_allocate_in_segment( + uint16_t selector, uint16_t aligned_bytes); /* 1020:02a6 */ +void borland_local_merge_next(uint16_t selector, uint16_t block); /* 1020:0327 */ +uint16_t borland_create_local_heap_segment(void); /* 1020:026a */ +BorlandAllocationAttempt borland_try_get_mem(uint16_t bytes); /* 1020:01ca */ +bool borland_try_free_mem(Win16FarPtr block, uint16_t bytes); /* 1020:02d7 */ +uint32_t borland_heap_free_space(void); /* 1020:0167 */ +uint32_t borland_heap_largest_block(void); /* 1020:0195 */ + +#endif diff --git a/original/reconstructed/tdkpin_highscores.c b/original/reconstructed/tdkpin_highscores.c new file mode 100644 index 0000000..db48e74 --- /dev/null +++ b/original/reconstructed/tdkpin_highscores.c @@ -0,0 +1,415 @@ +/* Address-linked high-score persistence from TDKPIN Code1. */ + +#include "tdkpin_highscores.h" + +#include "tdkpin_application.h" +#include "tdkpin_dialog.h" +#include "tdkpin_game_windows.h" + +enum { + HIGHSCORE_XOR_KEY = 0x0010, + HIGHSCORE_FILE_HEADER = 0x0014, + HIGHSCORE_FILE_HEADER_BYTES = 16, + HIGHSCORE_FILE_NAME = 0x0312, + HIGHSCORE_LOAD_FILE_NAME = 0x0320, + HIGHSCORE_DEFAULT_NAME = 0x032d, + HIGHSCORE_EDIT_INITIAL_NAME = 0x0336, + HIGHSCORE_EDIT_CAPTION = 0x0349, + HIGHSCORE_EDIT_LABEL = 0x0373, + HIGHSCORE_WINDOW_TITLE = 0x038b, + HIGHSCORE_HEADING = 0x02f4, + HIGHSCORE_SINGLE_DIGIT_PREFIX = 0x0300, + HIGHSCORE_RANK_SUFFIX = 0x0303, + OBJECT_WINDOWS_APPLICATION_POINTER = 0x064e, + CURRENT_PLAYER = 0x07d1, + HIGHSCORE_INSERT_INDEX = 0x07d2, + HIGHSCORE_SCORE_INDEX_ZERO = 0x087a, + HIGHSCORE_NAME_INDEX_ZERO = 0x0890, + PLAYER_SCORE_INDEX_ZERO = 0x097e, + HIGHSCORE_SCORES_BYTES = TDKPIN_HIGHSCORE_COUNT * 4, + HIGHSCORE_NAMES_BYTES = + TDKPIN_HIGHSCORE_COUNT * TDKPIN_HIGHSCORE_NAME_BYTES, +}; + +static Win16FarPtr highscore_name(uint16_t one_based_index) +{ + return win16_dgroup_pointer((uint16_t)( + HIGHSCORE_NAME_INDEX_ZERO + + one_based_index * TDKPIN_HIGHSCORE_NAME_BYTES)); +} + +static Win16FarPtr highscore_score(uint16_t one_based_index) +{ + return win16_dgroup_pointer((uint16_t)( + HIGHSCORE_SCORE_INDEX_ZERO + one_based_index * 4u)); +} + +static Win16FarPtr highscore_caller_receiver(uint16_t caller_bp) +{ + uint16_t offset = win16_read_stack_u16((uint16_t)(caller_bp + 6)); + uint16_t selector = win16_read_stack_u16((uint16_t)(caller_bp + 8)); + return win16_make_far_pointer(selector, offset); +} + +static Win16FarPtr application_virtual_method( + Win16FarPtr application, uint16_t slot) +{ + uint16_t vmt = win16_read_u16(application); + return win16_read_far_pointer(win16_dgroup_pointer(vmt), slot); +} + +static void fill_indeterminate_stack_bytes( + Win16FarPtr destination, uint16_t count) +{ + /* + * ENTER does not initialize SS. The portable model exposes one selected + * residue word instead of introducing undefined C reads; alternating its + * low/high bytes preserves the target's word-oriented stale-stack model. + */ + uint16_t residue = win16_indeterminate_u16(); + for (uint16_t index = 0; index < count; index++) { + win16_write_u8( + win16_far_add_offset(destination, index), + (uint8_t)(index & 1u ? residue >> 8 : residue)); + } +} + +/* + * 1000:a8ea -- persist the complete high-score table. + * + * The binary's 260-byte local payload has the 220-byte name table first and + * the 40-byte encrypted score table immediately after it. Each one-based + * global score is XORed with the same static dword key. The file order is + * header, encrypted scores, then names, despite the reverse local ordering. + */ +void tdkpin_save_highscores(uint16_t ignored_static_link) +{ + (void)ignored_static_link; + HFILE16 file = LCreate16(win16_dgroup_pointer(HIGHSCORE_FILE_NAME), 0); + if (file == (HFILE16)-1) { + return; + } + + uint8_t local_payload[HIGHSCORE_NAMES_BYTES + HIGHSCORE_SCORES_BYTES]; + Win16FarPtr names = win16_stack_pointer(local_payload); + Win16FarPtr encrypted_scores = + win16_far_add_offset(names, HIGHSCORE_NAMES_BYTES); + borland_fill_bytes(names, HIGHSCORE_NAMES_BYTES, 0); + + uint32_t key = win16_read_u32( + win16_dgroup_pointer(HIGHSCORE_XOR_KEY)); + for (uint16_t index = 1; index <= TDKPIN_HIGHSCORE_COUNT; index++) { + uint16_t score_offset = (uint16_t)( + HIGHSCORE_SCORE_INDEX_ZERO + index * 4u); + uint16_t name_offset = (uint16_t)( + HIGHSCORE_NAME_INDEX_ZERO + + index * TDKPIN_HIGHSCORE_NAME_BYTES); + win16_write_u32( + encrypted_scores, + (uint16_t)((index - 1u) * 4u), + win16_read_u32(win16_dgroup_pointer(score_offset)) ^ key); + (void)borland_far_strcpy( + win16_far_add_offset( + names, + (uint16_t)((index - 1u) * TDKPIN_HIGHSCORE_NAME_BYTES)), + win16_dgroup_pointer(name_offset)); + } + + (void)LWrite16( + file, + win16_dgroup_pointer(HIGHSCORE_FILE_HEADER), + HIGHSCORE_FILE_HEADER_BYTES); + (void)LWrite16(file, encrypted_scores, HIGHSCORE_SCORES_BYTES); + (void)LWrite16(file, names, HIGHSCORE_NAMES_BYTES); + (void)LClose16(file); +} + +/* + * 1000:a99c -- load and authenticate the complete high-score table. + * + * The same file is first opened with mode 0 and retried with mode 0x40. A + * 16-byte header is compared through the compiler's ShortString helpers. All + * _lread returns are ignored by the original: a short score read therefore + * leaves stale SS bytes to be decoded, while a short name read leaves the + * untouched tail of the global name table. Invalid or unavailable files + * install descending 1,000,000..100,000 scores and ten copies of "No Name". + */ +void tdkpin_load_highscores(uint16_t ignored_static_link) +{ + (void)ignored_static_link; + bool loaded = false; + HFILE16 file = LOpen16( + win16_dgroup_pointer(HIGHSCORE_LOAD_FILE_NAME), 0); + if (file == (HFILE16)-1) { + file = LOpen16( + win16_dgroup_pointer(HIGHSCORE_LOAD_FILE_NAME), 0x40); + } + + if (file != (HFILE16)-1) { + uint8_t raw_header[HIGHSCORE_FILE_HEADER_BYTES]; + uint8_t encrypted_score_bytes[HIGHSCORE_SCORES_BYTES]; + uint8_t file_header_short[256]; + uint8_t expected_header_short[256]; + Win16FarPtr raw_header_far = win16_stack_pointer(raw_header); + Win16FarPtr encrypted_scores = + win16_stack_pointer(encrypted_score_bytes); + Win16FarPtr file_header = win16_stack_pointer(file_header_short); + Win16FarPtr expected_header = + win16_stack_pointer(expected_header_short); + fill_indeterminate_stack_bytes( + raw_header_far, HIGHSCORE_FILE_HEADER_BYTES); + fill_indeterminate_stack_bytes( + encrypted_scores, HIGHSCORE_SCORES_BYTES); + + (void)LRead16( + file, raw_header_far, HIGHSCORE_FILE_HEADER_BYTES); + borland_bytes_to_short( + file_header, + raw_header_far, + HIGHSCORE_FILE_HEADER_BYTES); + borland_bytes_to_short( + expected_header, + win16_dgroup_pointer(HIGHSCORE_FILE_HEADER), + HIGHSCORE_FILE_HEADER_BYTES); + if (borland_short_compare(file_header, expected_header) == 0) { + loaded = true; + (void)LRead16(file, encrypted_scores, HIGHSCORE_SCORES_BYTES); + (void)LRead16( + file, + win16_dgroup_pointer( + HIGHSCORE_NAME_INDEX_ZERO + + TDKPIN_HIGHSCORE_NAME_BYTES), + HIGHSCORE_NAMES_BYTES); + uint32_t key = win16_read_u32( + win16_dgroup_pointer(HIGHSCORE_XOR_KEY)); + for (uint16_t index = 1; + index <= TDKPIN_HIGHSCORE_COUNT; + index++) { + uint32_t encrypted = win16_read_u32( + win16_far_add_offset( + encrypted_scores, + (uint16_t)((index - 1u) * 4u))); + win16_write_u32( + win16_dgroup_pointer((uint16_t)( + HIGHSCORE_SCORE_INDEX_ZERO + index * 4u)), + 0, + encrypted ^ key); + } + } + (void)LClose16(file); + } + + if (!loaded) { + for (uint16_t index = 1; + index <= TDKPIN_HIGHSCORE_COUNT; + index++) { + int32_t score = borland_multiply_i32( + (int32_t)(11u - index), 100000); + win16_write_u32( + win16_dgroup_pointer((uint16_t)( + HIGHSCORE_SCORE_INDEX_ZERO + index * 4u)), + 0, + (uint32_t)score); + (void)borland_far_strcpy( + win16_dgroup_pointer((uint16_t)( + HIGHSCORE_NAME_INDEX_ZERO + + index * TDKPIN_HIGHSCORE_NAME_BYTES)), + win16_dgroup_pointer(HIGHSCORE_DEFAULT_NAME)); + } + } +} + +/* + * 1000:ab3c -- run optional name editing, then create/show the score window. + * The argument is the caller's BP; SS:[BP+6] is the actual window receiver. + */ +void tdkpin_show_highscore_windows(uint16_t caller_bp) +{ + Win16FarPtr receiver = highscore_caller_receiver(caller_bp); + uint8_t insertion = win16_read_u8( + win16_dgroup_pointer(HIGHSCORE_INSERT_INDEX)); + Win16FarPtr application = win16_read_far_pointer( + win16_dgroup_pointer(OBJECT_WINDOWS_APPLICATION_POINTER), 0); + + if (insertion != 0) { + Win16FarPtr name = highscore_name(insertion); + (void)borland_far_strcpy( + name, + win16_dgroup_pointer(HIGHSCORE_EDIT_INITIAL_NAME)); + Win16FarPtr dialog = object_windows_text_dialog_construct( + 0, + 0x01ce, + 0x0016, + name, + win16_dgroup_pointer(HIGHSCORE_EDIT_LABEL), + win16_dgroup_pointer(HIGHSCORE_EDIT_CAPTION), + receiver); + (void)win16_call_application_dialog_method( + application_virtual_method(application, 0x38), + application, + dialog); + } + + Win16FarPtr child = tdkpin_centered_child_window_construct( + 0, + 0x010e, + win16_dgroup_pointer(HIGHSCORE_WINDOW_TITLE), + receiver); + child = win16_call_application_window_method( + application_virtual_method(application, 0x34), + application, + child); + win16_write_u32(receiver, 0x41, child); + object_windows_show( + win16_read_far_pointer(receiver, 0x41), 1); +} + +static bool score_is_greater(uint32_t left, uint32_t right) +{ + int16_t left_high = (int16_t)(left >> 16); + int16_t right_high = (int16_t)(right >> 16); + return left_high > right_high || + (left_high == right_high && + (uint16_t)left > (uint16_t)right); +} + +/* 1000:abe5 -- insert the active player's score into the descending top ten. */ +void tdkpin_insert_current_score(uint16_t caller_bp) +{ + uint8_t current_player = win16_read_u8( + win16_dgroup_pointer(CURRENT_PLAYER)); + uint32_t new_score = win16_read_u32( + win16_dgroup_pointer((uint16_t)( + PLAYER_SCORE_INDEX_ZERO + (uint16_t)current_player * 4u))); + + uint16_t insertion = 1; + while (!score_is_greater( + new_score, win16_read_u32(highscore_score(insertion)))) { + if (insertion == TDKPIN_HIGHSCORE_COUNT) { + return; + } + insertion++; + } + + if ((uint16_t)(insertion + 1u) <= TDKPIN_HIGHSCORE_COUNT) { + for (uint16_t destination = TDKPIN_HIGHSCORE_COUNT; + destination != insertion; + destination--) { + win16_write_u32( + highscore_score(destination), + 0, + win16_read_u32(highscore_score( + (uint16_t)(destination - 1u)))); + borland_far_copy( + highscore_name(destination), + highscore_name((uint16_t)(destination - 1u)), + TDKPIN_HIGHSCORE_NAME_BYTES); + } + } + + win16_write_u32(highscore_score(insertion), 0, new_score); + win16_write_u8( + win16_dgroup_pointer(HIGHSCORE_INSERT_INDEX), + (uint8_t)insertion); + tdkpin_show_highscore_windows(caller_bp); + tdkpin_save_highscores(caller_bp); +} + +static void text_out_c_string( + HDC16 dc, INT16 x, INT16 y, Win16FarPtr text) +{ + (void)TextOut16( + dc, x, y, text, (INT16)borland_far_strlen(text)); +} + +/* + * 1000:5c13 -- TWindow +4c paint override for the 360x300 high-score panel. + * The receiver and PAINTSTRUCT are ABI-visible but unused; all drawing uses + * the HDC supplied as the fifth word in the ten-byte Pascal argument frame. + */ +void tdkpin_paint_highscores( + Win16FarPtr ignored_window, + PAINTSTRUCT16 *ignored_paint, + HDC16 dc) +{ + (void)ignored_window; + (void)ignored_paint; + HPALETTE16 palette = win16_read_u16( + win16_dgroup_pointer(0x444e)); + HBITMAP16 background = win16_read_u16( + win16_dgroup_pointer(0x0867)); + + HPALETTE16 old_palette = SelectPalette16(dc, palette, 0); + (void)UnrealizeObject16(palette); + (void)RealizePalette16(dc); + + HDC16 background_dc = CreateCompatibleDC16(dc); + HGDIOBJ16 old_background_bitmap = + SelectObject16(background_dc, background); + HDC16 buffer_dc = CreateCompatibleDC16(dc); + HBITMAP16 buffer_bitmap = CreateCompatibleBitmap16(dc, 360, 300); + HGDIOBJ16 old_buffer_bitmap = + SelectObject16(buffer_dc, buffer_bitmap); + + COLORREF16 old_text_color = GetTextColor16(buffer_dc); + UINT16 old_text_alignment = SetTextAlign16(buffer_dc, 6); + INT16 old_background_mode = SetBkMode16(buffer_dc, 1); + (void)BitBlt16( + buffer_dc, 0, 0, 360, 300, + background_dc, 32, 204, 0x00cc0020u); + (void)SetTextColor16(buffer_dc, 0); + + uint8_t display_bytes[41]; + uint8_t conversion_bytes[41]; + uint8_t number_short_bytes[256]; + uint8_t name_short_bytes[256]; + Win16FarPtr display = win16_stack_pointer(display_bytes); + Win16FarPtr conversion = win16_stack_pointer(conversion_bytes); + Win16FarPtr number_short = win16_stack_pointer(number_short_bytes); + Win16FarPtr name_short = win16_stack_pointer(name_short_bytes); + + (void)borland_far_strcpy( + display, win16_dgroup_pointer(HIGHSCORE_HEADING)); + text_out_c_string(buffer_dc, 180, 27, display); + + for (uint16_t index = 1; index <= TDKPIN_HIGHSCORE_COUNT; index++) { + INT16 y = (INT16)(index * 20u + 40u); + (void)SetTextAlign16(buffer_dc, 0); + (void)borland_far_strcpy( + display, + win16_dgroup_pointer( + index < 10 ? HIGHSCORE_SINGLE_DIGIT_PREFIX : 0x02ff)); + borland_format_i32_short_string(255, number_short, 0, index); + (void)borland_short_to_c_string(conversion, number_short); + (void)borland_far_strcat(display, conversion); + (void)borland_far_strcat( + display, win16_dgroup_pointer(HIGHSCORE_RANK_SUFFIX)); + + borland_bytes_to_short( + name_short, highscore_name(index), TDKPIN_HIGHSCORE_NAME_BYTES); + (void)borland_short_to_c_string(conversion, name_short); + (void)borland_far_strcat(display, conversion); + text_out_c_string(buffer_dc, 30, y, display); + + (void)SetTextAlign16(buffer_dc, 2); + borland_format_i32_short_string( + 255, + number_short, + 0, + (int32_t)win16_read_u32(highscore_score(index))); + (void)borland_short_to_c_string(display, number_short); + text_out_c_string(buffer_dc, 320, y, display); + } + + (void)BitBlt16( + dc, 0, 0, 360, 300, buffer_dc, 0, 0, 0x00cc0020u); + (void)SetTextColor16(buffer_dc, old_text_color); + (void)SetTextAlign16(buffer_dc, old_text_alignment); + (void)SetBkMode16(buffer_dc, old_background_mode); + (void)SelectObject16(buffer_dc, old_buffer_bitmap); + (void)DeleteObject16(buffer_bitmap); + (void)DeleteDC16(buffer_dc); + (void)SelectObject16(background_dc, old_background_bitmap); + (void)DeleteDC16(background_dc); + (void)SelectPalette16(dc, old_palette, 0); +} diff --git a/original/reconstructed/tdkpin_highscores.h b/original/reconstructed/tdkpin_highscores.h new file mode 100644 index 0000000..b866503 --- /dev/null +++ b/original/reconstructed/tdkpin_highscores.h @@ -0,0 +1,55 @@ +#ifndef TDKPIN_HIGHSCORES_H +#define TDKPIN_HIGHSCORES_H + +#include "tdkpin_arithmetic.h" +#include "tdkpin_numeric.h" +#include "tdkpin_shortstrings.h" +#include "tdkpin_strings.h" + +enum { + TDKPIN_HIGHSCORE_COUNT = 10, + TDKPIN_HIGHSCORE_NAME_BYTES = 22, +}; + +typedef struct { + uint16_t object_size; + int16_t negative_size; + uint32_t reserved; + Win16FarPtr destruct; + Win16FarPtr call_original_window_proc; + Win16FarPtr route_command_target; + Win16FarPtr forward_default; + Win16FarPtr forward_event_to_parent; + Win16FarPtr register_class; + Win16FarPtr create_native_window; + Win16FarPtr destroy_native_window; + Win16FarPtr get_field_35; + Win16FarPtr class_name; + Win16FarPtr get_mdi_client; + Win16FarPtr all_children_can_close; + Win16FarPtr build_window_class; + Win16FarPtr setup_window; + Win16FarPtr zero_word_default; + Win16FarPtr transfer_child_data; + Win16FarPtr route_scroll_notification; + Win16FarPtr paint; +} TdkpinHighscoreWindowVmt; /* 1028:010e..015d */ + +_Static_assert( + sizeof(TdkpinHighscoreWindowVmt) == 80, + "high-score window VMT layout drift"); + +void tdkpin_save_highscores( + uint16_t ignored_static_link); /* 1000:a8ea */ +void tdkpin_load_highscores( + uint16_t ignored_static_link); /* 1000:a99c */ +void tdkpin_show_highscore_windows( + uint16_t caller_bp); /* 1000:ab3c */ +void tdkpin_insert_current_score( + uint16_t caller_bp); /* 1000:abe5 */ +void tdkpin_paint_highscores( + Win16FarPtr ignored_window, + PAINTSTRUCT16 *ignored_paint, + HDC16 dc); /* 1000:5c13 */ + +#endif diff --git a/original/reconstructed/tdkpin_initialization.c b/original/reconstructed/tdkpin_initialization.c new file mode 100644 index 0000000..7c507cc --- /dev/null +++ b/original/reconstructed/tdkpin_initialization.c @@ -0,0 +1,22 @@ +/* Binary-exact no-op unit initializers from the Code2 startup chain. */ + +#include "tdkpin_initialization.h" + +/* + * Each function is the same five-byte far routine in the image: + * PUSH BP; MOV BP,SP; LEAVE; RETF. The NE entry point invokes ordinals 91, + * 86, and 72 in that order before querying the Windows version. The original + * Pascal unit names are not encoded at these entry points, so the stable NE + * ordinals remain in the descriptive names rather than inventing unit names. + */ +void tdkpin_initialize_unit_ordinal_72(void) +{ +} + +void tdkpin_initialize_unit_ordinal_86(void) +{ +} + +void tdkpin_initialize_unit_ordinal_91(void) +{ +} diff --git a/original/reconstructed/tdkpin_initialization.h b/original/reconstructed/tdkpin_initialization.h new file mode 100644 index 0000000..d966df4 --- /dev/null +++ b/original/reconstructed/tdkpin_initialization.h @@ -0,0 +1,9 @@ +#ifndef TDKPIN_INITIALIZATION_H +#define TDKPIN_INITIALIZATION_H + +/* No-op unit initializers called directly by the NE program entry point. */ +void tdkpin_initialize_unit_ordinal_72(void); /* 1008:0f27 */ +void tdkpin_initialize_unit_ordinal_86(void); /* 1008:11b8 */ +void tdkpin_initialize_unit_ordinal_91(void); /* 1008:15c2 */ + +#endif diff --git a/original/reconstructed/tdkpin_key_input.c b/original/reconstructed/tdkpin_key_input.c new file mode 100644 index 0000000..08ca774 --- /dev/null +++ b/original/reconstructed/tdkpin_key_input.c @@ -0,0 +1,367 @@ +/* Address-linked keyboard handlers at 1000:638e and 1000:6bf8. */ + +#include "tdkpin_key_input.h" + +#include "tdkpin_application.h" +#include "tdkpin_arithmetic.h" +#include "tdkpin_random.h" +#include "tdkpin_real48.h" +#include "tdkpin_sound.h" + +static Win16FarPtr application_virtual_method( + Win16FarPtr application, uint16_t slot) +{ + uint16_t vmt = win16_read_u16(application); + return win16_read_far_pointer(win16_dgroup_pointer(vmt), slot); +} + +static bool no_auxiliary_windows(Win16FarPtr window) +{ + return win16_read_u16(win16_far_add_offset(window, 0x41)) == 0 && + win16_read_u16(win16_far_add_offset(window, 0x43)) == 0 && + win16_read_u16(win16_far_add_offset(window, 0x45)) == 0 && + win16_read_u16(win16_far_add_offset(window, 0x47)) == 0; +} + +static uint16_t open_help_window(Win16FarPtr window) +{ + Win16FarPtr child = tdkpin_full_child_window_construct( + 0, + 0x017e, + win16_dgroup_pointer(0x0306), + window); + Win16FarPtr application = win16_read_far_pointer( + win16_dgroup_pointer(0x064e), 0); + child = win16_call_application_window_method( + application_virtual_method(application, 0x34), + application, + child); + win16_write_u32(window, 0x45, child); + object_windows_show(win16_read_far_pointer(window, 0x45), 1); + return win16_indeterminate_u16(); +} + +static void apply_down_key(Win16FarPtr window) +{ + int32_t scalar = (int32_t)win16_read_u32( + win16_far_add_offset(window, 0x5a)); + int32_t step = borland_multiply_i32(scalar, 50); + uint32_t velocity = win16_read_u32( + win16_far_add_offset(window, 0x0bae)); + velocity -= (uint32_t)step; + win16_write_u32(window, 0x0bae, velocity); + win16_write_u32(window, 0x0baa, 0); + if (win16_read_u8(win16_dgroup_pointer(0x07d0)) == 0) { + return; + } + + HWND16 handle = win16_read_u16(win16_far_add_offset(window, 4)); + HDC16 dc = GetDC16(handle); + INT16 y = 231; + for (int32_t multiple = 1; multiple <= 10; multiple++) { + int32_t threshold = borland_multiply_i32(step, -multiple); + if (threshold < (int32_t)velocity) { + y = (INT16)(multiple * 21); + break; + } + } + tdkpin_draw_board_decoration_row_on_dc(y, dc); + (void)ReleaseDC16(handle, dc); +} + +uint16_t tdkpin_handle_key_press( + Win16FarPtr window, Win16FarPtr event) +{ + if (no_auxiliary_windows(window)) { + uint16_t scan_code = win16_read_u16( + win16_far_add_offset(event, 8)) & 0x00ffu; + if (scan_code == 0x3b) { + return open_help_window(window); + } + if (win16_read_u8(win16_far_add_offset(window, 0x0bdd)) == 0 && + win16_read_u8(win16_far_add_offset(window, 0x0bdf)) == 0 && + scan_code == 0x50) { + apply_down_key(window); + } else if (win16_read_u8(win16_dgroup_pointer(0x07c6)) == 0) { + if (scan_code == 0x1d) { + win16_write_u8(win16_far_add_offset(window, 0x0bda), 1); + } + if (scan_code == 0x1c) { + win16_write_u8(win16_far_add_offset(window, 0x0bdb), 1); + } + } + } + win16_write_u16(event, 0x0a, 0); + win16_write_u16(event, 0x0c, 0); + return 0; +} + +static int32_t random_horizontal_nudge(int32_t scalar) +{ + static const BorlandReal48 scale = + {{0x85, 0x00, 0x00, 0x00, 0x00, 0x20}}; + static const BorlandReal48 offset = + {{0x84, 0x00, 0x00, 0x00, 0x00, 0x20}}; + BorlandReal48 random = borland_random_real48_registers(); + BorlandReal48 factor = borland_real48_subtract( + borland_real48_multiply(random, scale), offset); + return borland_real48_round_to_i32( + borland_real48_multiply(borland_i32_to_real48(scalar), factor)); +} + +static void apply_release_down_impulse(Win16FarPtr window) +{ + int32_t scalar = (int32_t)win16_read_u32( + win16_far_add_offset(window, 0x5a)); + int32_t base = (int32_t)win16_read_u32( + win16_far_add_offset(window, 0x56)); + uint32_t velocity = win16_read_u32( + win16_far_add_offset(window, 0x0bae)); + velocity -= (uint32_t)borland_multiply_i32(scalar, 100); + + int32_t signed_velocity = (int32_t)velocity; + uint32_t negative_base_bits = 0u - (uint32_t)base; + int32_t negative_base = (int32_t)negative_base_bits; + if (signed_velocity < negative_base) { + velocity = negative_base_bits + + borland_random_below((uint16_t)base) / 40u; + } else { + /* 1000:71eb loads Real48 0.6 as CX:SI:DI = + * 9a80:9999:1999. Keep the exact target encoding here. */ + static const BorlandReal48 factor_three_fifths = + {{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}; + int32_t scaled_base = borland_real48_round_to_i32( + borland_real48_multiply( + borland_i32_to_real48(base), factor_three_fifths)); + int32_t upper = (int32_t)(0u - (uint32_t)scaled_base); + if (upper < signed_velocity) { + velocity -= borland_random_below((uint16_t)base) / 40u; + } + } + win16_write_u32(window, 0x0bae, velocity); + win16_write_u32(window, 0x0baa, 0); + win16_write_u32(win16_dgroup_pointer(0x07fb), 0, velocity); + win16_write_u8(win16_far_add_offset(window, 0x0bdd), 1); + win16_write_u8(win16_far_add_offset(window, 0x0bde), 0); + tdkpin_play_sound_if_not_tilted(2); + HWND16 handle = win16_read_u16(win16_far_add_offset(window, 4)); + HDC16 dc = GetDC16(handle); + tdkpin_blit_bitmap_and_present( + win16_read_u16(win16_dgroup_pointer(0x0865)), + 18, + 21, + 426, + 314, + dc); + (void)ReleaseDC16(handle, dc); +} + +static void add_wrap_to_dgroup(uint16_t address, int32_t amount) +{ + Win16FarPtr value = win16_dgroup_pointer(address); + win16_write_u32(value, 0, win16_read_u32(value) + (uint32_t)amount); +} + +static void apply_nudge(Win16FarPtr window, uint16_t scan_code) +{ + int32_t scalar = (int32_t)win16_read_u32( + win16_far_add_offset(window, 0x5a)); + tdkpin_play_sound_if_not_tilted(19); + int32_t horizontal = 0; + int32_t vertical = 0; + if (scan_code == 0x2a || scan_code == 0x51) { + int32_t amount = borland_multiply_i32( + (int32_t)(50u - borland_random_below(20)), scalar); + horizontal = scan_code == 0x2a ? -amount : amount; + } else { + horizontal = random_horizontal_nudge(scalar); + vertical = (int32_t)(0u - (uint32_t)borland_multiply_i32( + (int32_t)(60u - borland_random_below(20)), scalar)); + } + win16_write_u32( + window, + 0x0baa, + win16_read_u32(win16_far_add_offset(window, 0x0baa)) + + (uint32_t)horizontal); + win16_write_u32( + window, + 0x0bae, + win16_read_u32(win16_far_add_offset(window, 0x0bae)) + + (uint32_t)vertical); + + if (win16_read_u8(win16_far_add_offset(window, 0x61)) > 1) { + if (scan_code == 0x2a || scan_code == 0x51) { + int32_t slot_amount = borland_multiply_i32(scalar, 40); + if (scan_code == 0x2a) { + slot_amount = (int32_t)(0u - (uint32_t)slot_amount); + } + add_wrap_to_dgroup(0x07f3, slot_amount); + add_wrap_to_dgroup(0x07f7, slot_amount); + } else { + int32_t slot_x = borland_multiply_i32( + (int32_t)borland_random_below(21) - 10, scalar); + int32_t slot_y = (int32_t)(0u - (uint32_t)borland_multiply_i32( + (int32_t)borland_random_below(100) + 50, scalar)); + add_wrap_to_dgroup(0x07f3, slot_x); + add_wrap_to_dgroup(0x07f7, slot_x); + add_wrap_to_dgroup(0x07fb, slot_y); + add_wrap_to_dgroup(0x07ff, slot_y); + } + } + + uint16_t counter = (uint16_t)( + win16_read_u16(win16_far_add_offset(window, 0x5e)) + 25u); + win16_write_u16(window, 0x5e, counter); + uint16_t threshold = (uint16_t)(borland_random_below(10) + 30u); + if (threshold < counter) { + tdkpin_play_sound_if_not_tilted(20); + win16_write_u8(win16_dgroup_pointer(0x07c6), 1); + win16_write_u8(win16_far_add_offset(window, 0x0bda), 0); + win16_write_u8(win16_far_add_offset(window, 0x0bdb), 0); + HWND16 handle = win16_read_u16(win16_far_add_offset(window, 4)); + HDC16 dc = GetDC16(handle); + tdkpin_restore_background_region_a(20, 148, 243, 84, dc); + tdkpin_present_background_region(20, 148, 243, 84, dc); + (void)ReleaseDC16(handle, dc); + } +} + +static void toggle_sound(void) +{ + uint8_t enabled = win16_read_u8(win16_dgroup_pointer(0x43f2)); + if (enabled == 0) { + if (win16_read_u16(win16_dgroup_pointer(0x43ee)) != 0) { + win16_write_u8(win16_dgroup_pointer(0x43f2), 1); + } + } else { + win16_write_u8(win16_dgroup_pointer(0x43f2), 0); + } +} + +static void add_player(Win16FarPtr window) +{ + win16_write_u8(win16_dgroup_pointer(0x07c9), 0); + tdkpin_play_sound_if_not_tilted(1); + uint8_t player_count = (uint8_t)( + win16_read_u8(win16_dgroup_pointer(0x07d0)) + 1u); + win16_write_u8(win16_dgroup_pointer(0x07d0), player_count); + win16_write_u8(win16_far_add_offset(window, 0x0bdd), 0); + win16_write_u8(win16_far_add_offset(window, 0x0bdf), 0); + win16_write_u8(win16_dgroup_pointer(0x07c5), 1); + win16_write_u8(win16_far_add_offset(window, 0x61), 1); + win16_write_u8(win16_dgroup_pointer(0x0874), 0); + HWND16 handle = win16_read_u16(win16_far_add_offset(window, 4)); + + for (uint16_t player = 1; player <= 4; player++) { + win16_write_u16( + win16_dgroup_pointer((uint16_t)(0x081f + player * 2u)), + 0, + 0xffff); + for (uint16_t id = 1; id <= 175; id++) { + win16_write_u8( + win16_far_add_offset(window, (uint16_t)( + 0x0061 + player * 0x00afu + id)), + win16_read_u8(win16_far_add_offset( + window, (uint16_t)(0x03cc + id)))); + win16_write_u16( + window, + (uint16_t)(0x036c + player * 0x015eu + id * 2u), + win16_read_u16(win16_far_add_offset( + window, (uint16_t)(0x0a42 + id * 2u)))); + } + HDC16 dc = GetDC16(handle); + if (player_count < player) { + win16_write_u32( + win16_dgroup_pointer((uint16_t)(0x097e + player * 4u)), + 0, + 0); + tdkpin_restore_background_region_b( + 42, + 284, + (INT16)((player - 1u) * 45u + 270u), + 348, + dc); + tdkpin_present_background_region( + 42, + 284, + (INT16)((player - 1u) * 45u + 270u), + 348, + dc); + } + tdkpin_draw_item_status(0, dc); + (void)ReleaseDC16(handle, dc); + if (player == 1) { + dc = GetDC16(handle); + tdkpin_restore_background_region_a(30, 284, 232, 371, dc); + tdkpin_present_background_region(30, 284, 232, 371, dc); + tdkpin_draw_score(dc, 0); + tdkpin_update_status_display(1, dc); + (void)ReleaseDC16(handle, dc); + } + } + for (uint16_t id = 1; id <= 175; id++) { + Win16FarPtr record = win16_dgroup_pointer((uint16_t)( + 0x095b + id * 0x53u)); + win16_write_u8( + win16_far_add_offset(record, 0x34), + win16_read_u8(win16_far_add_offset( + window, (uint16_t)(0x03cc + id)))); + win16_write_u16( + record, + 0x43, + win16_read_u16(win16_far_add_offset( + window, (uint16_t)(0x0a42 + id * 2u)))); + } + win16_write_u8(win16_dgroup_pointer(0x07d1), 1); +} + +uint16_t tdkpin_handle_key_release( + Win16FarPtr window, Win16FarPtr event) +{ + if (no_auxiliary_windows(window)) { + uint16_t scan_code = win16_read_u16( + win16_far_add_offset(event, 8)) & 0x00ffu; + if (win16_read_u8(win16_dgroup_pointer(0x07cf)) != 0 && + scan_code == 0x3c) { + win16_write_u32(win16_dgroup_pointer(0x0855), 0, 0); + win16_write_u8(win16_dgroup_pointer(0x07c7), 1); + } + if (win16_read_u8(win16_dgroup_pointer(0x07cf)) != 0 && + scan_code == 0x41) { + win16_write_u32( + win16_dgroup_pointer(0x07d3), + 0, + win16_read_u32(win16_dgroup_pointer(0x3340))); + win16_write_u32( + win16_dgroup_pointer(0x07d7), + 0, + win16_read_u32(win16_dgroup_pointer(0x3344))); + win16_write_u32(window, 0x0baa, 0); + win16_write_u32(window, 0x0bae, 0); + } + if (win16_read_u8(win16_far_add_offset(window, 0x0bdd)) == 0 && + win16_read_u8(win16_far_add_offset(window, 0x0bdf)) == 0 && + scan_code == 0x50 && + win16_read_u8(win16_dgroup_pointer(0x07d0)) != 0) { + apply_release_down_impulse(window); + } else if (scan_code == 0x1d) { + win16_write_u8(win16_far_add_offset(window, 0x0bda), 0); + } else if (scan_code == 0x1c) { + win16_write_u8(win16_far_add_offset(window, 0x0bdb), 0); + } else if (win16_read_u8(win16_dgroup_pointer(0x07c6)) == 0 && + (scan_code == 0x2a || scan_code == 0x51 || + scan_code == 0x39)) { + apply_nudge(window, scan_code); + } else if (scan_code == 0x58) { + toggle_sound(); + } else if (win16_read_u8( + win16_far_add_offset(window, 0x0bde)) != 0 && + (scan_code == 0x4e || scan_code == 0x1b) && + win16_read_u8(win16_dgroup_pointer(0x07d0)) < 4) { + add_player(window); + } + } + win16_write_u16(event, 0x0a, 0); + win16_write_u16(event, 0x0c, 0); + return 0; +} diff --git a/original/reconstructed/tdkpin_key_input.h b/original/reconstructed/tdkpin_key_input.h new file mode 100644 index 0000000..9f2d4af --- /dev/null +++ b/original/reconstructed/tdkpin_key_input.h @@ -0,0 +1,14 @@ +#ifndef TDKPIN_KEY_INPUT_H +#define TDKPIN_KEY_INPUT_H + +#include "tdkpin_game_windows.h" +#include "tdkpin_gameplay_helpers.h" + +uint16_t tdkpin_handle_key_press( + Win16FarPtr window, + Win16FarPtr event); /* 1000:6bf8 */ +uint16_t tdkpin_handle_key_release( + Win16FarPtr window, + Win16FarPtr event); /* 1000:638e */ + +#endif diff --git a/original/reconstructed/tdkpin_mechanism_render.c b/original/reconstructed/tdkpin_mechanism_render.c new file mode 100644 index 0000000..67f9cc6 --- /dev/null +++ b/original/reconstructed/tdkpin_mechanism_render.c @@ -0,0 +1,132 @@ +/* Five-target rotation and 91x90 panel compositor from TDKPIN Code1. */ + +#include "tdkpin_mechanism_render.h" + +#include "tdkpin_sound.h" + +typedef struct { + INT16 x; + INT16 y; +} TargetPoint; + +static const TargetPoint g_target_positions[6][5] = { + {{9, 41}, {23, 11}, {56, 14}, {63, 47}, {35, 63}}, + {{11, 45}, {18, 13}, {52, 11}, {63, 42}, {39, 64}}, + {{13, 50}, {15, 17}, {46, 9}, {64, 37}, {44, 62}}, + {{17, 55}, {11, 23}, {39, 7}, {64, 30}, {50, 59}}, + {{21, 60}, {9, 28}, {35, 7}, {62, 25}, {54, 56}}, + {{8, 35}, {26, 8}, {59, 18}, {59, 50}, {27, 61}}, +}; + +static Win16FarPtr caller_receiver(uint16_t caller_bp) +{ + uint16_t offset = win16_read_stack_u16((uint16_t)(caller_bp + 6)); + uint16_t selector = win16_read_stack_u16((uint16_t)(caller_bp + 8)); + return win16_make_far_pointer(selector, offset); +} + +static void rotate_target_state(uint16_t caller_bp, Win16FarPtr receiver) +{ + static const uint16_t record_words[5] = { + 0x3371, 0x33c4, 0x3417, 0x346a, 0x34bd}; + uint16_t first_word = win16_read_u16( + win16_dgroup_pointer(record_words[0])); + for (uint16_t index = 0; index < 4; index++) { + win16_write_u16( + win16_dgroup_pointer(record_words[index]), + 0, + win16_read_u16(win16_dgroup_pointer(record_words[index + 1]))); + } + win16_write_u16( + win16_dgroup_pointer(record_words[4]), 0, first_word); + + uint16_t row = (uint16_t)( + 0x0476 + (uint16_t)g_current_player * 0x14u); + uint8_t first_byte = win16_read_u8( + win16_far_add_offset(receiver, row)); + for (uint16_t index = 0; index < 4; index++) { + win16_write_u8( + win16_far_add_offset(receiver, (uint16_t)(row + index)), + win16_read_u8(win16_far_add_offset( + receiver, (uint16_t)(row + index + 1)))); + } + win16_write_u8( + win16_far_add_offset(receiver, (uint16_t)(row + 4)), first_byte); + for (uint16_t item = 15; item <= 19; item++) { + tdkpin_refresh_player_item(caller_bp, item); + } +} + +/* 1000:6f27 -- render and optionally rotate the five-target panel. */ +void tdkpin_rotate_and_draw_targets(uint16_t caller_bp) +{ + Win16FarPtr receiver = caller_receiver(caller_bp); + HWND16 window = win16_read_u16(win16_far_add_offset(receiver, 4)); + HDC16 dc = GetDC16(window); + HDC16 source_dc = CreateCompatibleDC16(dc); + HDC16 panel_dc = CreateCompatibleDC16(dc); + HBITMAP16 panel_bitmap = CreateCompatibleBitmap16(dc, 91, 90); + HGDIOBJ16 old_source = SelectObject16( + source_dc, win16_read_u16(win16_dgroup_pointer(0x0859))); + HGDIOBJ16 old_panel = SelectObject16(panel_dc, panel_bitmap); + int32_t state = (int32_t)win16_read_u32(win16_dgroup_pointer(0x0855)); + + if (state < 6) { + INT16 source_x = (INT16)(uint16_t)( + ((uint32_t)state - 1u) * 91u); + (void)BitBlt16( + panel_dc, 0, 0, 91, 90, + source_dc, source_x, 0, 0x00cc0020u); + } else { + (void)SelectObject16( + source_dc, win16_read_u16(win16_dgroup_pointer(0x085d))); + (void)BitBlt16( + panel_dc, 0, 0, 91, 90, + source_dc, 79, 33, 0x00cc0020u); + (void)SelectObject16( + source_dc, win16_read_u16(win16_dgroup_pointer(0x0859))); + rotate_target_state(caller_bp, receiver); + } + + if (state == 1) { + tdkpin_play_sound_if_not_tilted(11); + } + if (state >= 1 && state <= 6) { + static const uint16_t target_words[5] = { + 0x3371, 0x33c4, 0x3417, 0x346a, 0x34bd}; + const TargetPoint *positions = g_target_positions[state - 1]; + for (uint16_t index = 0; index < 5; index++) { + if (win16_read_u16( + win16_dgroup_pointer(target_words[index])) != 0) { + (void)BitBlt16( + panel_dc, + positions[index].x, + positions[index].y, + 17, + 17, + source_dc, + 455, + 17, + 0x008800c6u); + (void)BitBlt16( + panel_dc, + positions[index].x, + positions[index].y, + 17, + 17, + source_dc, + 455, + 0, + 0x00ee0086u); + } + } + } + (void)BitBlt16( + dc, 79, 33, 91, 90, panel_dc, 0, 0, 0x00cc0020u); + (void)SelectObject16(source_dc, old_source); + (void)SelectObject16(panel_dc, old_panel); + (void)DeleteObject16(panel_bitmap); + (void)DeleteDC16(panel_dc); + (void)DeleteDC16(source_dc); + (void)ReleaseDC16(window, dc); +} diff --git a/original/reconstructed/tdkpin_mechanism_render.h b/original/reconstructed/tdkpin_mechanism_render.h new file mode 100644 index 0000000..ba4ccbc --- /dev/null +++ b/original/reconstructed/tdkpin_mechanism_render.h @@ -0,0 +1,9 @@ +#ifndef TDKPIN_MECHANISM_RENDER_H +#define TDKPIN_MECHANISM_RENDER_H + +#include "tdkpin_gameplay_helpers.h" + +void tdkpin_rotate_and_draw_targets( + uint16_t caller_bp); /* 1000:6f27 */ + +#endif diff --git a/original/reconstructed/tdkpin_message_pump.c b/original/reconstructed/tdkpin_message_pump.c new file mode 100644 index 0000000..91cd907 --- /dev/null +++ b/original/reconstructed/tdkpin_message_pump.c @@ -0,0 +1,76 @@ +/* TDKPIN's bounded Win16 queue drain and two close-method pairs. */ + +#include "tdkpin_message_pump.h" + +enum { + WIN16_PM_REMOVE = 1, + TDKPIN_MAX_DRAIN_MESSAGE = 0x0032, + TDKPIN_TIMER_MESSAGE = 0x0580, + WIN16_WM_KEYDOWN_LOCAL = 0x0100, + WIN16_WM_KEYUP_LOCAL = 0x0101, +}; + +/* 1008:00e2 — drain messages 0..0x32 until PeekMessage reports empty. */ +void tdkpin_drain_messages_except_input(void) +{ + MSG16 message; + while (PeekMessage16( + &message, + 0, + 0, + TDKPIN_MAX_DRAIN_MESSAGE, + WIN16_PM_REMOVE) != 0) { + if (message.message != TDKPIN_TIMER_MESSAGE && + message.message != WIN16_WM_KEYDOWN_LOCAL && + message.message != WIN16_WM_KEYUP_LOCAL) { + (void)TranslateMessage16(&message); + (void)DispatchMessage16(&message); + } + } +} + +static void drain_and_close(Win16FarPtr window) +{ + tdkpin_drain_messages_except_input(); + object_windows_close_if_allowed(window); +} + +/* 1000:5ee6 and 6202 — identical methods in two derived window VMTs. */ +void tdkpin_close_variant_a(Win16FarPtr window) +{ + drain_and_close(window); +} + +void tdkpin_close_variant_b(Win16FarPtr window) +{ + drain_and_close(window); +} + +static uint16_t conditional_drain_and_close( + Win16FarPtr window, + ObjectWindowsMessage *message, + uint8_t suppressed_notification) +{ + uint8_t notification = + (uint8_t)((uint32_t)message->lparam >> 16); + if (notification != suppressed_notification) { + drain_and_close(window); + } + return win16_indeterminate_u16(); +} + +/* + * 1000:5efc and 6218 — suppress close for notification 0x1c/0x3b. + * Both routines return an uninitialized local word on every path. + */ +uint16_t tdkpin_conditional_close_variant_a( + Win16FarPtr window, ObjectWindowsMessage *message) +{ + return conditional_drain_and_close(window, message, 0x1c); +} + +uint16_t tdkpin_conditional_close_variant_b( + Win16FarPtr window, ObjectWindowsMessage *message) +{ + return conditional_drain_and_close(window, message, 0x3b); +} diff --git a/original/reconstructed/tdkpin_message_pump.h b/original/reconstructed/tdkpin_message_pump.h new file mode 100644 index 0000000..e63d380 --- /dev/null +++ b/original/reconstructed/tdkpin_message_pump.h @@ -0,0 +1,16 @@ +#ifndef TDKPIN_MESSAGE_PUMP_H +#define TDKPIN_MESSAGE_PUMP_H + +#include "tdkpin_window_messages.h" + +void tdkpin_drain_messages_except_input(void); /* 1008:00e2 */ +void tdkpin_close_variant_a(Win16FarPtr window); /* 1000:5ee6 */ +uint16_t tdkpin_conditional_close_variant_a( + Win16FarPtr window, + ObjectWindowsMessage *message); /* 1000:5efc */ +void tdkpin_close_variant_b(Win16FarPtr window); /* 1000:6202 */ +uint16_t tdkpin_conditional_close_variant_b( + Win16FarPtr window, + ObjectWindowsMessage *message); /* 1000:6218 */ + +#endif diff --git a/original/reconstructed/tdkpin_multimedia.c b/original/reconstructed/tdkpin_multimedia.c new file mode 100644 index 0000000..74f164f --- /dev/null +++ b/original/reconstructed/tdkpin_multimedia.c @@ -0,0 +1,190 @@ +/* Dynamic Win16 multimedia helper DLL lifecycle from Code3. */ + +#include "tdkpin_multimedia.h" + +extern Win16FarPtr g_multimedia_procedures[11]; /* 1028:4750..477b */ +extern HINSTANCE16 g_multimedia_module; /* 1028:4781 unaligned */ +extern uint8_t g_multimedia_initialized; /* 1028:4784 */ + +static const char *const multimedia_procedure_names[11] = { + "CTL3DAUTOSUBCLASS", + "CTL3DCOLORCHANGE", + "CTL3DCTLCOLOREX", + "CTL3DENABLED", + "CTL3DDLGFRAMEPAINT", + "CTL3DGETVER", + "CTL3DREGISTER", + "CTL3DSUBCLASSDLG", + "CTL3DSUBCLASSDLGEX", + "CTL3DSUBCLASSCTL", + "CTL3DUNREGISTER", +}; + +/* + * 1010:00a2 — test whether the CTL3D file can be found in the exact original + * search order. The 80-byte result is only a success indicator; LoadLibrary + * later receives the unchanged global library name/path buffer. + */ +bool multimedia_locate_library( + Win16FarPtr module, Win16FarPtr library_path) +{ + uint8_t search_path_bytes[256]; + uint8_t result_bytes[80]; + uint8_t extension_bytes[5]; + uint8_t file_name_bytes[9]; + Win16FarPtr search_path = win16_stack_pointer(search_path_bytes); + Win16FarPtr result = win16_stack_pointer(result_bytes); + Win16FarPtr extension = win16_stack_pointer(extension_bytes); + Win16FarPtr file_name = win16_stack_pointer(file_name_bytes); + + win16_write_u8(search_path, 0); + (void)multimedia_search_file(search_path, library_path, result); + if (win16_read_u8(result) != 0) { + return true; + } + + (void)GetWindowsDirectoryFar16(search_path, 0xff); + (void)multimedia_search_file(search_path, library_path, result); + if (win16_read_u8(result) != 0) { + return true; + } + + (void)GetSystemDirectoryFar16(search_path, 0xff); + (void)multimedia_search_file(search_path, library_path, result); + if (win16_read_u8(result) != 0) { + return true; + } + + HINSTANCE16 module_handle = GetModuleHandle16(module); + (void)GetModuleFileNameFar16(module_handle, search_path, 0x100); + (void)multimedia_split_path( + extension, file_name, search_path, search_path); + (void)multimedia_search_file(search_path, library_path, result); + if (win16_read_u8(result) != 0) { + return true; + } + + Win16FarPtr environment_path = multimedia_environment_value( + win16_dgroup_pointer(0x046a)); + (void)multimedia_search_file(environment_path, library_path, result); + return win16_read_u8(result) != 0; +} + +/* 1010:0002 — unload the helper and clear every dynamically resolved slot. */ +void multimedia_unload(void) +{ + if (g_multimedia_module >= 0x20) { + (void)FreeLibrary16(g_multimedia_module); + } + g_multimedia_initialized = 0; + for (unsigned index = 0; index < 11; index++) { + g_multimedia_procedures[index] = 0; + } +} + +/* 1010:0079 — notify the helper for this task, then perform common unload. */ +void multimedia_finalize_current_task(void) +{ + Win16FarPtr terminate_task = g_multimedia_procedures[10]; + if (g_multimedia_initialized && terminate_task != 0) { + (void)win16_call_pascal_u16(terminate_task, GetCurrentTask16()); + multimedia_unload(); + } +} + +/* + * 1010:03e0 — multimedia-aware TApplication destructor. Finalize the current + * helper task before the application/root destructors and owned-allocation + * cleanup. The hidden VMT zero passed to TApplication prevents double free. + */ +void multimedia_application_destruct( + Win16FarPtr object, uint16_t vmt) +{ + multimedia_finalize_current_task(); + object_windows_application_destruct(object, 0); + BorlandObjectCallFrame frame = {object, vmt}; + borland_finish_object_destructor(&frame, 0); +} + +/* + * 1010:03af — exported loader wrapper. Each byte argument occupies a 16-bit + * Pascal stack slot; only AL is returned. The target always clears 1028:4783 + * after the underlying 1010:01c2 call, regardless of its result. + */ +uint8_t multimedia_initialize_export( + uint8_t argument_1, + uint8_t argument_2, + uint8_t argument_3, + uint16_t argument_4, + uint16_t argument_5) +{ + uint8_t result = multimedia_initialize( + argument_1, argument_2, argument_3, argument_4, argument_5); + g_multimedia_pending = 0; + return result; +} + +/* + * 1010:01c2 — load and validate CTL3D.DLL/CTL3DV2.DLL. + * Procedure slots retain their exact binary order at 1028:4750..477b. + */ +uint8_t multimedia_initialize( + uint8_t argument_1, + uint8_t argument_2, + uint8_t auto_subclass, + uint16_t module_offset, + uint16_t module_selector) +{ + if (g_multimedia_initialized) { + return 1; + } + + if (!g_multimedia_legacy_windows) { + (void)SetErrorMode16(0x8000); + g_multimedia_module = LoadLibrary16(g_multimedia_library_path); + (void)SetErrorMode16(0); + } else { + bool located = multimedia_locate_library( + win16_make_far_pointer(module_selector, module_offset), + win16_dgroup_pointer(0x478d)); + g_multimedia_module = located + ? LoadLibrary16(g_multimedia_library_path) + : 0; + } + + if (g_multimedia_module < 0x20) { + return 0; + } + for (unsigned index = 0; index < 11; index++) { + if (index == 8 && g_multimedia_legacy_windows) { + g_multimedia_procedures[index] = 0; + } else { + g_multimedia_procedures[index] = GetProcAddress16( + g_multimedia_module, multimedia_procedure_names[index]); + } + } + + g_multimedia_initialized = win16_call_pascal_u16( + g_multimedia_procedures[6], GetCurrentTask16()) != 0; + if (g_multimedia_initialized) { + g_multimedia_version = + win16_call_pascal_u16_no_args(g_multimedia_procedures[5]); + bool enabled = win16_call_pascal_u16_no_args( + g_multimedia_procedures[3]) != 0; + g_multimedia_initialized = enabled && g_multimedia_version >= 9; + } + if (!g_multimedia_initialized) { + multimedia_unload(); + return 0; + } + + g_multimedia_argument_2 = argument_2; + g_multimedia_argument_1 = argument_1; + if (!g_multimedia_legacy_windows && auto_subclass != 0) { + g_multimedia_auto_subclassed = win16_call_pascal_u16( + g_multimedia_procedures[0], g_win16_instance) != 0; + } else { + g_multimedia_auto_subclassed = 0; + } + return 1; +} diff --git a/original/reconstructed/tdkpin_multimedia.h b/original/reconstructed/tdkpin_multimedia.h new file mode 100644 index 0000000..16ec11e --- /dev/null +++ b/original/reconstructed/tdkpin_multimedia.h @@ -0,0 +1,52 @@ +#ifndef TDKPIN_MULTIMEDIA_H +#define TDKPIN_MULTIMEDIA_H + +#include "tdkpin_application.h" + +void multimedia_unload(void); /* 1010:0002 */ +void multimedia_finalize_current_task(void); /* 1010:0079 */ +void multimedia_application_destruct( + Win16FarPtr object, uint16_t vmt); /* 1010:03e0 */ +uint8_t multimedia_initialize_export( + uint8_t argument_1, + uint8_t argument_2, + uint8_t argument_3, + uint16_t argument_4, + uint16_t argument_5); /* 1010:03af */ +uint8_t multimedia_initialize( + uint8_t argument_1, + uint8_t argument_2, + uint8_t argument_3, + uint16_t argument_4, + uint16_t argument_5); /* 1010:01c2 */ + +extern uint8_t g_multimedia_pending; /* 1028:4783 */ +extern uint16_t g_multimedia_version; /* 1028:477c */ +extern uint8_t g_multimedia_auto_subclassed; /* 1028:477e */ +extern uint8_t g_multimedia_argument_2; /* 1028:477f */ +extern uint8_t g_multimedia_argument_1; /* 1028:4780 */ +extern uint8_t g_multimedia_legacy_windows; /* 1028:478c */ +extern char g_multimedia_library_path[21]; /* 1028:478d..47a1 */ + +bool multimedia_locate_library( + Win16FarPtr module, Win16FarPtr library_path); /* 1010:00a2 */ +Win16DosFileAttributesResult borland_dos_get_file_attributes_ansi( + Win16FarPtr name); /* 1008:2608 */ +Win16FarPtr multimedia_search_file( + Win16FarPtr search_path, + Win16FarPtr file_name, + Win16FarPtr result); /* 1008:2643 */ +uint16_t multimedia_split_path( + Win16FarPtr extension, + Win16FarPtr file_name, + Win16FarPtr directory, + Win16FarPtr input); /* 1008:26b0 */ +Win16FarPtr multimedia_environment_value( + Win16FarPtr name); /* 1008:2819 */ +bool multimedia_short_file_exists(Win16FarPtr short_name); /* 1010:0405 */ +void multimedia_initialize_runtime_unit(void); /* 1010:0472 */ + +extern uint16_t g_multimedia_system_directory_length; /* 1028:47a2 */ +extern uint16_t g_multimedia_windows_version; /* 1028:478a/478b */ + +#endif diff --git a/original/reconstructed/tdkpin_multimedia_paths.c b/original/reconstructed/tdkpin_multimedia_paths.c new file mode 100644 index 0000000..1d2695e --- /dev/null +++ b/original/reconstructed/tdkpin_multimedia_paths.c @@ -0,0 +1,187 @@ +/* DOS/Win16 path and environment helpers used by CTL3D discovery. */ + +#include "tdkpin_multimedia.h" + +#include "tdkpin_strings.h" + +/* + * 1008:2608 -- copy at most 79 ANSI bytes to a stack ASCIIZ buffer, translate + * it in-place to OEM, then issue DOS AX=4300h. The helper's original register + * interface preserves CX for the returned attributes; the typed bridge makes + * carry and that CX value explicit. + */ +Win16DosFileAttributesResult borland_dos_get_file_attributes_ansi( + Win16FarPtr name) +{ + uint8_t oem_name[80]; + uint16_t copied = 0; + while (copied < 79) { + uint8_t byte = win16_read_u8(win16_far_add_offset(name, copied)); + if (byte == 0) { + break; + } + oem_name[copied++] = byte; + } + oem_name[copied] = 0; + Win16FarPtr local = win16_stack_pointer(oem_name); + (void)AnsiToOem16(local, local); + return win16_dos_get_file_attributes(local); +} + +static uint16_t append_c_string( + Win16FarPtr output, + uint16_t cursor, + uint16_t *remaining, + Win16FarPtr source) +{ + uint16_t source_index = 0; + while (*remaining != 0) { + uint8_t byte = win16_read_u8( + win16_far_add_offset(source, source_index++)); + if (byte == 0) { + break; + } + win16_write_u8(win16_far_add_offset(output, cursor++), byte); + (*remaining)--; + } + win16_write_u8(win16_far_add_offset(output, cursor), 0); + return cursor; +} + +/* + * 1008:2643 -- search for file_name first as given, then under each semicolon- + * separated directory. Result capacity is exactly 79 characters plus NUL. + * DOS volume labels/directories (attribute bits 08/10) do not count as files. + */ +Win16FarPtr multimedia_search_file( + Win16FarPtr search_path, + Win16FarPtr file_name, + Win16FarPtr result) +{ + uint16_t search_index = 0; + uint16_t remaining = 79; + uint16_t cursor = append_c_string(result, 0, &remaining, file_name); + + for (;;) { + Win16DosFileAttributesResult attributes = + borland_dos_get_file_attributes_ansi(result); + if (!attributes.carry && (attributes.attributes & 0x18u) == 0) { + return result; + } + + remaining = 79; + cursor = 0; + uint8_t character = win16_read_u8( + win16_far_add_offset(search_path, search_index)); + uint8_t last_copied = 0; + if (character == 0) { + win16_write_u8(result, 0); + return result; + } + + for (;;) { + search_index++; + if (character == ';') { + break; + } + if (remaining != 0) { + last_copied = character; + win16_write_u8( + win16_far_add_offset(result, cursor++), character); + remaining--; + } + character = win16_read_u8( + win16_far_add_offset(search_path, search_index)); + if (character == 0) { + break; + } + } + + if (remaining != 0 && last_copied != ':' && last_copied != '\\') { + win16_write_u8(win16_far_add_offset(result, cursor++), '\\'); + remaining--; + } + cursor = append_c_string( + result, cursor, &remaining, file_name); + } +} + +/* + * 1008:26b0 -- Borland-style path splitter. Optional outputs receive the + * directory/drive prefix (max 67), basename (max 8), and extension (max 4). + * Return bits are 8 wildcard, 4 prefix, 2 basename, and 1 extension. + */ +uint16_t multimedia_split_path( + Win16FarPtr extension, + Win16FarPtr file_name, + Win16FarPtr directory, + Win16FarPtr input) +{ + Win16FarPtr base = borland_far_strrchr(input, '\\'); + if (base == 0) { + base = borland_far_strrchr(input, ':'); + } + if (base == 0) { + base = input; + } else { + base = win16_far_add_offset(base, 1); + } + + Win16FarPtr dot = borland_far_strchr(base, '.'); + if (dot == 0) { + dot = borland_far_strend(base); + } + + uint16_t prefix_length = (uint16_t)( + win16_far_offset(base) - win16_far_offset(input)); + if (prefix_length > 0x43) { + prefix_length = 0x43; + } + uint16_t name_length = (uint16_t)( + win16_far_offset(dot) - win16_far_offset(base)); + if (name_length > 8) { + name_length = 8; + } + + uint16_t flags = 0; + if (borland_far_strchr(base, '?') != 0 || + borland_far_strchr(base, '*') != 0) { + flags |= 8; + } + if (prefix_length != 0) { + flags |= 4; + } + if (name_length != 0) { + flags |= 2; + } + if (win16_read_u8(dot) != 0) { + flags |= 1; + } + + if (directory != 0) { + (void)borland_far_strncpy(directory, input, prefix_length); + } + if (file_name != 0) { + (void)borland_far_strncpy(file_name, base, name_length); + } + if (extension != 0) { + (void)borland_far_strncpy(extension, dot, 4); + } + return flags; +} + +/* 1008:2819 -- case-insensitive NAME= lookup in the DOS environment block. */ +Win16FarPtr multimedia_environment_value(Win16FarPtr name) +{ + uint16_t name_length = borland_far_strlen(name); + Win16FarPtr variable = GetDOSEnvironment16(); + while (win16_read_u8(variable) != 0) { + if (borland_far_strnicmp(name, variable, name_length) == 0 && + win16_read_u8(win16_far_add_offset(variable, name_length)) == '=') { + return win16_far_add_offset(variable, (uint16_t)(name_length + 1)); + } + variable = win16_far_add_offset( + variable, (uint16_t)(borland_far_strlen(variable) + 1)); + } + return 0; +} diff --git a/original/reconstructed/tdkpin_multimedia_startup.c b/original/reconstructed/tdkpin_multimedia_startup.c new file mode 100644 index 0000000..75a010d --- /dev/null +++ b/original/reconstructed/tdkpin_multimedia_startup.c @@ -0,0 +1,129 @@ +/* CTL3D file probing and Pascal unit initialization from Code3. */ + +#include "tdkpin_multimedia.h" + +#include "tdkpin_borland_files.h" +#include "tdkpin_borland_records.h" +#include "tdkpin_shortstrings.h" +#include "tdkpin_strings.h" + +extern Win16FarPtr g_multimedia_procedures[11]; /* 1028:4750..477b */ +extern HINSTANCE16 g_multimedia_module; /* 1028:4781 */ +extern uint8_t g_multimedia_initialized; /* 1028:4784 */ + +enum { + DGROUP_CTL3D_DLL = 0x0522, + DGROUP_CTL3DV2_DLL = 0x052c, + DGROUP_MULTIMEDIA_LIBRARY_PATH = 0x478d, + DGROUP_SYSTEM_DIRECTORY = 0x47a4, + DGROUP_CTL3D_FULL_SHORT = 0x486d, + DGROUP_CTL3DV2_FULL_SHORT = 0x496d, +}; + +/* + * 1010:0405 -- existence probe for one Pascal ShortString path. A failed + * open is consumed through IOResult and reported false. A successful open is + * closed, and any close failure follows the original RuntimeError path. + */ +bool multimedia_short_file_exists(Win16FarPtr short_name) +{ + uint8_t copied_name[256]; + uint8_t length = win16_read_u8(short_name); + copied_name[0] = length; + for (uint16_t index = 0; index < length; index++) { + copied_name[index + 1] = win16_read_u8( + win16_far_add_offset(short_name, (uint16_t)(index + 1))); + } + + uint8_t record_bytes[128]; + Win16FarPtr copied_name_far = win16_stack_pointer(copied_name); + Win16FarPtr record = win16_stack_pointer(record_bytes); + borland_assign_file_short(copied_name_far, record); + borland_open_generic_file(1, record); + if (borland_take_io_result() != 0) { + return false; + } + + borland_close_generic_file(record); + borland_require_io_success(); + return true; +} + +static void construct_system_path( + Win16FarPtr destination, + Win16FarPtr file_name, + Win16FarPtr temporary_directory, + Win16FarPtr temporary_file) +{ + borland_c_to_short_string( + temporary_directory, + win16_dgroup_pointer(DGROUP_SYSTEM_DIRECTORY)); + borland_short_concat( + temporary_directory, + win16_relocated_code_pointer(3, 0x0470)); + borland_c_to_short_string(temporary_file, file_name); + borland_short_concat(temporary_directory, temporary_file); + borland_short_assign_truncated( + destination, temporary_directory, 0xff); +} + +/* + * 1010:0472 -- initialize all CTL3D unit state and Windows-version policy. + * The two 256-byte temporaries are Pascal ShortStrings. The system-directory + * paths remain ShortStrings at 486d/496d; only the selected DLL basename at + * 478d is converted back to a NUL-terminated C string for LoadLibrary. + */ +void multimedia_initialize_runtime_unit(void) +{ + g_multimedia_system_directory_length = GetSystemDirectoryFar16( + win16_dgroup_pointer(DGROUP_SYSTEM_DIRECTORY), 200); + + uint8_t directory_short[256]; + uint8_t file_short[256]; + Win16FarPtr directory = win16_stack_pointer(directory_short); + Win16FarPtr file = win16_stack_pointer(file_short); + + construct_system_path( + win16_dgroup_pointer(DGROUP_CTL3D_FULL_SHORT), + win16_dgroup_pointer(DGROUP_CTL3D_DLL), + directory, + file); + construct_system_path( + win16_dgroup_pointer(DGROUP_CTL3DV2_FULL_SHORT), + win16_dgroup_pointer(DGROUP_CTL3DV2_DLL), + directory, + file); + + if (g_multimedia_system_directory_length != 0) { + borland_c_to_short_string( + file, win16_dgroup_pointer(DGROUP_CTL3DV2_DLL)); + (void)borland_short_to_c_string( + win16_dgroup_pointer(DGROUP_MULTIMEDIA_LIBRARY_PATH), file); + + if (!multimedia_short_file_exists( + win16_dgroup_pointer(DGROUP_CTL3DV2_FULL_SHORT)) && + multimedia_short_file_exists( + win16_dgroup_pointer(DGROUP_CTL3D_FULL_SHORT))) { + borland_c_to_short_string( + file, win16_dgroup_pointer(DGROUP_CTL3D_DLL)); + (void)borland_short_to_c_string( + win16_dgroup_pointer(DGROUP_MULTIMEDIA_LIBRARY_PATH), file); + } + } + + for (uint16_t index = 0; index < 11; index++) { + g_multimedia_procedures[index] = 0; + } + + g_multimedia_windows_version = (uint16_t)GetVersion16(); + uint8_t major = (uint8_t)g_multimedia_windows_version; + uint8_t minor = (uint8_t)(g_multimedia_windows_version >> 8); + g_multimedia_legacy_windows = major == 3 && minor < 10; + + g_multimedia_auto_subclassed = 0; + g_multimedia_argument_2 = 0; + g_multimedia_argument_1 = 1; + g_multimedia_module = 0; + g_multimedia_pending = 0; + g_multimedia_initialized = 0; +} diff --git a/original/reconstructed/tdkpin_numeric.c b/original/reconstructed/tdkpin_numeric.c new file mode 100644 index 0000000..1488dc0 --- /dev/null +++ b/original/reconstructed/tdkpin_numeric.c @@ -0,0 +1,182 @@ +#include "tdkpin_numeric.h" + +static uint8_t digit_character(uint8_t digit) +{ + return (uint8_t)(digit + (digit < 10 ? '0' : 'A' - 10)); +} + +BorlandFormattedSlice borland_format_u32_backward( + Win16FarPtr end, uint32_t value, uint16_t base) +{ + Win16FarPtr cursor = end; + do { + uint8_t digit = (uint8_t)(value % base); + value /= base; + cursor = win16_far_add_offset(cursor, 0xffff); + win16_write_u8(cursor, digit_character(digit)); + } while (value != 0); + return (BorlandFormattedSlice){ + cursor, + (uint16_t)(win16_far_offset(end) - win16_far_offset(cursor)), + }; +} + +BorlandFormattedSlice borland_format_i32_decimal_backward( + Win16FarPtr end, int32_t value) +{ + bool negative = value < 0; + uint32_t magnitude = negative + ? (uint32_t)(0u - (uint32_t)value) + : (uint32_t)value; + BorlandFormattedSlice result = + borland_format_u32_backward(end, magnitude, 10); + if (negative) { + result.start = win16_far_add_offset(result.start, 0xffff); + win16_write_u8(result.start, '-'); + result.length++; + } + return result; +} + +/* + * 1020:1629 — format an int32_t into a Pascal ShortString with a signed field + * width, left space padding, and a caller-supplied maximum length. If the + * decimal representation is truncated, the target copies its leading bytes. + */ +void borland_format_i32_short_string( + int16_t maximum_length, + Win16FarPtr destination, + int16_t field_width, + int32_t value) +{ + uint8_t workspace[32]; + Win16FarPtr end = win16_stack_pointer(workspace + sizeof(workspace)); + BorlandFormattedSlice formatted = + borland_format_i32_decimal_backward(end, value); + int16_t copy_length = (int16_t)formatted.length; + if (field_width > maximum_length) { + field_width = maximum_length; + } + if (copy_length > maximum_length) { + copy_length = maximum_length; + } + if (field_width < copy_length) { + field_width = copy_length; + } + + win16_write_u8(destination, (uint8_t)field_width); + Win16FarPtr output = win16_far_add_offset(destination, 1); + uint16_t padding = (uint16_t)(field_width - copy_length); + for (uint16_t index = 0; index < padding; index++) { + win16_write_u8(win16_far_add_offset(output, index), ' '); + } + output = win16_far_add_offset(output, padding); + for (uint16_t index = 0; index < (uint16_t)copy_length; index++) { + win16_write_u8( + win16_far_add_offset(output, index), + win16_read_u8(win16_far_add_offset(formatted.start, index))); + } +} + +static BorlandParseI32Result parse_finish( + uint32_t magnitude, + bool negative, + Win16FarPtr cursor, + uint16_t remaining, + bool validate_signed_range) +{ + uint32_t result = negative ? 0u - magnitude : magnitude; + if (validate_signed_range && magnitude != 0 && + negative != ((result & 0x80000000u) != 0)) { + return (BorlandParseI32Result){0, cursor, remaining, true}; + } + return (BorlandParseI32Result){(int32_t)result, cursor, remaining, false}; +} + +BorlandParseI32Result borland_parse_i32_span( + Win16FarPtr text, uint16_t length) +{ + Win16FarPtr cursor = text; + uint16_t remaining = length; + bool negative = false; + if (remaining == 0) { + return (BorlandParseI32Result){0, cursor, 0, true}; + } + + uint8_t current = win16_read_u8(cursor); + if (current == '+' || current == '-') { + negative = current == '-'; + cursor = win16_far_add_offset(cursor, 1); + remaining--; + if (remaining == 0) { + return (BorlandParseI32Result){0, cursor, 0, true}; + } + current = win16_read_u8(cursor); + } + + uint32_t magnitude = 0; + if (current == '$') { + cursor = win16_far_add_offset(cursor, 1); + remaining--; + if (remaining == 0) { + return (BorlandParseI32Result){0, cursor, 0, true}; + } + while (remaining != 0) { + uint8_t value = win16_read_u8(cursor); + if (value > 0x60) { + value = (uint8_t)(value - 0x20); + } + uint8_t digit; + if (value >= '0' && value <= '9') { + digit = (uint8_t)(value - '0'); + } else if (value >= 'A' && value <= 'F') { + digit = (uint8_t)(value - 'A' + 10); + } else { + return parse_finish( + magnitude, negative, cursor, remaining, true); + } + if ((magnitude & 0xf0000000u) != 0) { + return (BorlandParseI32Result){0, cursor, remaining, true}; + } + magnitude = (magnitude << 4) | digit; + cursor = win16_far_add_offset(cursor, 1); + remaining--; + } + return parse_finish(magnitude, negative, cursor, 0, false); + } + + while (remaining != 0) { + uint8_t value = win16_read_u8(cursor); + if (value < '0' || value > '9') { + break; + } + if ((magnitude & 0xf0000000u) != 0) { + return (BorlandParseI32Result){0, cursor, remaining, true}; + } + magnitude = magnitude * 10u + (uint8_t)(value - '0'); + cursor = win16_far_add_offset(cursor, 1); + remaining--; + } + return parse_finish(magnitude, negative, cursor, remaining, true); +} + +BorlandValI32Result borland_val_i32_short_string(Win16FarPtr string) +{ + uint16_t remaining = win16_read_u8(string); + Win16FarPtr cursor = win16_far_add_offset(string, 1); + while (remaining != 0 && win16_read_u8(cursor) == ' ') { + cursor = win16_far_add_offset(cursor, 1); + remaining--; + } + + BorlandParseI32Result parsed = + borland_parse_i32_span(cursor, remaining); + if (parsed.failed || parsed.remaining != 0) { + return (BorlandValI32Result){ + 0, + (uint16_t)( + win16_far_offset(parsed.cursor) - win16_far_offset(string)), + }; + } + return (BorlandValI32Result){parsed.value, 0}; +} diff --git a/original/reconstructed/tdkpin_numeric.h b/original/reconstructed/tdkpin_numeric.h new file mode 100644 index 0000000..63baa6d --- /dev/null +++ b/original/reconstructed/tdkpin_numeric.h @@ -0,0 +1,37 @@ +#ifndef TDKPIN_NUMERIC_H +#define TDKPIN_NUMERIC_H + +#include "tdkpin_segmented.h" + +typedef struct { + Win16FarPtr start; + uint16_t length; +} BorlandFormattedSlice; + +typedef struct { + int32_t value; + Win16FarPtr cursor; + uint16_t remaining; + bool failed; +} BorlandParseI32Result; + +typedef struct { + int32_t value; + uint16_t error_position; +} BorlandValI32Result; + +BorlandFormattedSlice borland_format_u32_backward( + Win16FarPtr end, uint32_t value, uint16_t base); /* 1020:1562 */ +BorlandFormattedSlice borland_format_i32_decimal_backward( + Win16FarPtr end, int32_t value); /* 1020:1546 */ +void borland_format_i32_short_string( + int16_t maximum_length, + Win16FarPtr destination, + int16_t field_width, + int32_t value); /* 1020:1629 */ +BorlandParseI32Result borland_parse_i32_span( + Win16FarPtr text, uint16_t length); /* 1020:1582 */ +BorlandValI32Result borland_val_i32_short_string( + Win16FarPtr string); /* 1020:1674 */ + +#endif diff --git a/original/reconstructed/tdkpin_object_lifecycle.c b/original/reconstructed/tdkpin_object_lifecycle.c new file mode 100644 index 0000000..4aabb7b --- /dev/null +++ b/original/reconstructed/tdkpin_object_lifecycle.c @@ -0,0 +1,79 @@ +/* ObjectWindows base object destruction protocol. */ + +#include "tdkpin_object_lifecycle.h" + +enum { + OBJECT_PARENT_OFFSET = 6, + OBJECT_BOUND_THUNK_OFFSET = 0x12, + OBJECT_TEARDOWN_SLOT = 0x24, + DISPOSE_CHILD_CALLBACK_OFFSET = 0x03e9, +}; + +static void write_far( + Win16FarPtr object, uint16_t offset, Win16FarPtr value) +{ + win16_write_u16(object, offset, win16_far_offset(value)); + win16_write_u16( + object, (uint16_t)(offset + 2), win16_far_selector(value)); +} + +/* + * 1018:0341 — construct the ObjectWindows base object and its bound thunk. + * The object joins its parent's circular child ring before publishing its own + * empty child tail and callback thunk. + */ +Win16FarPtr object_windows_object_construct( + Win16FarPtr object, uint16_t vmt, Win16FarPtr parent) +{ + BorlandObjectCallFrame frame = {object, vmt}; + if (!borland_enter_object_constructor(&frame, 0)) { + return frame.object; + } + frame.object = borland_default_object_constructor(frame.object, 0); + win16_write_u16(frame.object, 2, 0); + win16_write_u16(frame.object, 4, 0); + win16_write_u16(frame.object, 0x17, 0); + write_far(frame.object, OBJECT_PARENT_OFFSET, parent); + if (parent == 0) { + write_far(frame.object, 0x19, 0); + } else { + object_windows_append_child(parent, frame.object); + } + write_far(frame.object, 0x0a, 0); + write_far(frame.object, 0x0e, 0); + write_far( + frame.object, + OBJECT_BOUND_THUNK_OFFSET, + object_windows_allocate_bound_thunk(frame.object)); + win16_write_u8(win16_far_add_offset(frame.object, 0x16), 0); + object_windows_set_flag_4(frame.object); + return frame.object; +} + +/* + * 1018:03ff — destroy one ObjectWindows object. + * Ordering is binary-significant: virtual teardown, child disposal, parent + * unlink, bound-thunk release, root destruction, then owned-allocation free. + */ +void object_windows_object_destruct( + Win16FarPtr object, uint16_t vmt) +{ + uint16_t installed_vmt = win16_read_u16(object); + Win16FarPtr teardown = win16_read_far_pointer( + win16_dgroup_pointer(installed_vmt), OBJECT_TEARDOWN_SLOT); + win16_call_object_method(teardown, object); + + object_windows_for_each_child( + object, + win16_relocated_code_pointer(4, DISPOSE_CHILD_CALLBACK_OFFSET)); + Win16FarPtr parent = + win16_read_far_pointer(object, OBJECT_PARENT_OFFSET); + if (parent != 0) { + object_windows_remove_child(parent, object); + } + object_windows_release_bound_thunk( + win16_read_far_pointer(object, OBJECT_BOUND_THUNK_OFFSET)); + borland_default_object_destructor(object, 0); + BorlandObjectCallFrame frame = {object, vmt}; + borland_finish_object_destructor(&frame, 0); +} diff --git a/original/reconstructed/tdkpin_object_lifecycle.h b/original/reconstructed/tdkpin_object_lifecycle.h new file mode 100644 index 0000000..8562ea9 --- /dev/null +++ b/original/reconstructed/tdkpin_object_lifecycle.h @@ -0,0 +1,17 @@ +#ifndef TDKPIN_OBJECT_LIFECYCLE_H +#define TDKPIN_OBJECT_LIFECYCLE_H + +#include "tdkpin_borland_objects.h" +#include "tdkpin_object_list.h" +#include "tdkpin_object_windows.h" +#include "tdkpin_window_messages.h" + +Win16FarPtr object_windows_object_construct( + Win16FarPtr object, + uint16_t vmt, + Win16FarPtr parent); /* 1018:0341 */ + +void object_windows_object_destruct( + Win16FarPtr object, uint16_t vmt); /* 1018:03ff */ + +#endif diff --git a/original/reconstructed/tdkpin_object_list.c b/original/reconstructed/tdkpin_object_list.c new file mode 100644 index 0000000..e1e5fef --- /dev/null +++ b/original/reconstructed/tdkpin_object_list.c @@ -0,0 +1,315 @@ +/* ObjectWindows circular child-object list. */ + +#include "tdkpin_object_list.h" + +enum { + CONTAINER_CHILD_TAIL_OFFSET = 0x0a, + CHILD_NEXT_OFFSET = 0x19, + CHILD_WINDOW_HANDLE_OFFSET = 4, + CHILD_CAN_CLOSE_SLOT = 0x3c, + CHILD_BLOCKS_CLOSE_OFFSET = 0x0ec0, + CHILD_GROUP_OFFSET = 0x17, + CHILD_FLAGS_OFFSET = 0x16, + CHILD_ACTIVATE_SLOT = 0x20, + CHILD_TRANSFER_SLOT = 0x40, + CHILD_TRANSFER_FLAG = 0x10, + OBJECT_TRANSFER_POINTER_OFFSET = 0x0e, +}; + +static Win16FarPtr read_far(Win16FarPtr object, uint16_t offset) +{ + return win16_read_far_pointer(object, offset); +} + +static void write_far( + Win16FarPtr object, uint16_t offset, Win16FarPtr value) +{ + win16_write_u16(object, offset, win16_far_offset(value)); + win16_write_u16( + object, (uint16_t)(offset + 2), win16_far_selector(value)); +} + +/* + * 1018:069a — append one child to a circular singly linked ring. + * The container stores the tail; tail->next is the oldest/head child. + */ +void object_windows_append_child( + Win16FarPtr container, Win16FarPtr child) +{ + if (child == 0) { + return; + } + Win16FarPtr tail = read_far(container, CONTAINER_CHILD_TAIL_OFFSET); + if (tail == 0) { + write_far(child, CHILD_NEXT_OFFSET, child); + } else { + write_far(child, CHILD_NEXT_OFFSET, + read_far(tail, CHILD_NEXT_OFFSET)); + write_far(tail, CHILD_NEXT_OFFSET, child); + } + write_far(container, CONTAINER_CHILD_TAIL_OFFSET, child); +} + +/* 1018:071c — unlink one exact far child, maintaining the tail invariant. */ +void object_windows_remove_child( + Win16FarPtr container, Win16FarPtr child) +{ + Win16FarPtr tail = read_far(container, CONTAINER_CHILD_TAIL_OFFSET); + if (tail == 0) { + return; + } + + Win16FarPtr previous = tail; + while (true) { + Win16FarPtr candidate = read_far(previous, CHILD_NEXT_OFFSET); + if (candidate == child || candidate == tail) { + if (candidate != child) { + return; + } + if (candidate == previous) { + write_far(container, CONTAINER_CHILD_TAIL_OFFSET, 0); + return; + } + if (candidate == tail) { + write_far(container, CONTAINER_CHILD_TAIL_OFFSET, previous); + } + write_far(previous, CHILD_NEXT_OFFSET, + read_far(candidate, CHILD_NEXT_OFFSET)); + return; + } + previous = candidate; + } +} + +/* 1018:080d — visit head-to-tail and return the first matching child. */ +Win16FarPtr object_windows_find_child( + Win16FarPtr container, Win16FarPtr predicate) +{ + Win16FarPtr tail = read_far(container, CONTAINER_CHILD_TAIL_OFFSET); + if (tail == 0) { + return 0; + } + Win16FarPtr child = read_far(tail, CHILD_NEXT_OFFSET); + while (true) { + if (win16_call_object_predicate(predicate, child)) { + return child; + } + if (child == tail) { + return 0; + } + child = read_far(child, CHILD_NEXT_OFFSET); + } +} + +/* + * 1018:085a — visit every child head-to-tail. The next far pointer is read + * before each callback so the callback may unlink or destroy the current node. + */ +void object_windows_for_each_child( + Win16FarPtr container, Win16FarPtr action) +{ + Win16FarPtr tail = read_far(container, CONTAINER_CHILD_TAIL_OFFSET); + if (tail == 0) { + return; + } + Win16FarPtr child = read_far(tail, CHILD_NEXT_OFFSET); + while (child != tail) { + Win16FarPtr next = read_far(child, CHILD_NEXT_OFFSET); + win16_call_object_action(action, child); + child = next; + } + win16_call_object_action(action, tail); +} + +/* 1018:08ac — inherited virtual default returning AX=0xffff. */ +uint16_t object_windows_minus_one_default(Win16FarPtr object) +{ + (void)object; + return 0xffff; +} + +/* 1018:0ec0 — predicate: a windowed child whose CanClose returns false. */ +bool object_windows_child_blocks_close( + uint16_t ignored, Win16FarPtr child) +{ + (void)ignored; + if (win16_read_u16(win16_far_add_offset( + child, CHILD_WINDOW_HANDLE_OFFSET)) == 0) { + return false; + } + uint16_t vmt = win16_read_u16(child); + Win16FarPtr can_close = + win16_read_far_pointer(win16_dgroup_pointer(vmt), CHILD_CAN_CLOSE_SLOT); + return !win16_call_object_bool_method(can_close, child); +} + +/* 1018:0ef4 — true exactly when no child blocks container shutdown. */ +bool object_windows_all_children_can_close(Win16FarPtr container) +{ + Win16FarPtr blocker = object_windows_find_child( + container, + win16_relocated_code_pointer(4, CHILD_BLOCKS_CLOSE_OFFSET)); + return blocker == 0; +} + +/* 1018:03e9 — nested ForEach callback: dispose the supplied child object. */ +void object_windows_dispose_child_callback( + uint16_t ignored, Win16FarPtr child) +{ + (void)ignored; + borland_dispose_object(child); +} + +/* 1018:0466 — nested predicate for signed group field +0x17. */ +bool object_windows_child_group_matches( + int16_t group, Win16FarPtr child) +{ + return group >= 0 && + win16_read_u16(win16_far_add_offset(child, CHILD_GROUP_OFFSET)) == + (uint16_t)group; +} + +/* + * 1018:049e — evaluate one child and preserve the minimized-window text + * refresh side effect. The function returns true only for flag-4 children + * whose VMT +0x20 method returns false. + */ +bool object_windows_try_child_activation( + uint16_t ignored, Win16FarPtr child) +{ + (void)ignored; + bool continue_processing = true; + uint8_t flags = win16_read_u8( + win16_far_add_offset(child, CHILD_FLAGS_OFFSET)); + if ((flags & 4) != 0) { + uint16_t vmt = win16_read_u16(child); + Win16FarPtr procedure = win16_read_far_pointer( + win16_dgroup_pointer(vmt), CHILD_ACTIVATE_SLOT); + if (!win16_call_object_bool_method(procedure, child)) { + continue_processing = false; + } + } + if (continue_processing) { + HWND16 window = win16_read_u16(win16_far_add_offset( + child, CHILD_WINDOW_HANDLE_OFFSET)); + if (IsIconic16(window) != 0) { + char text[82]; + (void)GetWindowText16(window, text, 81); + (void)SetWindowText16(window, text); + } + } + return !continue_processing; +} + +/* 1018:0524 — group-zero predicate gated by 1018:049e. */ +bool object_windows_unindexed_child_matches( + uint16_t ignored, Win16FarPtr child) +{ + return win16_read_u16(win16_far_add_offset( + child, CHILD_GROUP_OFFSET)) == 0 && + object_windows_try_child_activation(ignored, child); +} + +static Win16FarPtr find_child_in_group( + Win16FarPtr container, int16_t group, bool require_activation) +{ + Win16FarPtr tail = read_far(container, CONTAINER_CHILD_TAIL_OFFSET); + if (tail == 0) { + return 0; + } + Win16FarPtr child = read_far(tail, CHILD_NEXT_OFFSET); + while (true) { + bool matches = object_windows_child_group_matches(group, child); + if (matches && + (!require_activation || + object_windows_try_child_activation(0, child))) { + return child; + } + if (child == tail) { + return 0; + } + child = read_far(child, CHILD_NEXT_OFFSET); + } +} + +/* + * 1018:055c — scan numbered groups starting at one. Each found child is passed + * through 049e; after the first missing group, group zero is searched for a + * child whose 049e result is true. The unusual final inversion is preserved. + */ +bool object_windows_validate_child_groups(Win16FarPtr container) +{ + int16_t group = 1; + bool result = false; + Win16FarPtr child; + do { + child = find_child_in_group(container, group, false); + if (child != 0) { + result = object_windows_try_child_activation(0, child); + } + group++; + } while (!result && child != 0); + if (!result) { + return find_child_in_group(container, 0, true) == 0; + } + return true; +} + +/* 1018:0d9b — validate child groups, store status -4, or call VMT +0x44(2). */ +void object_windows_prepare_window(Win16FarPtr window) +{ + if (!object_windows_validate_child_groups(window)) { + win16_write_u16(window, 2, 0xfffc); + return; + } + uint16_t vmt = win16_read_u16(window); + Win16FarPtr procedure = + win16_read_far_pointer(win16_dgroup_pointer(vmt), 0x44); + win16_call_object_u16_method(procedure, window, 2); +} + +/* + * 1018:0dcd — nested transfer callback. Flag 0x10 selects participants; + * VMT +0x40 receives child, direction, and the current far cursor. AX advances + * only the cursor offset with 16-bit wrap, preserving its selector. + */ +void object_windows_transfer_child_callback( + ObjectWindowsTransferContext *context, Win16FarPtr child) +{ + uint8_t flags = win16_read_u8( + win16_far_add_offset(child, CHILD_FLAGS_OFFSET)); + if ((flags & CHILD_TRANSFER_FLAG) == 0) { + return; + } + uint16_t vmt = win16_read_u16(child); + Win16FarPtr procedure = win16_read_far_pointer( + win16_dgroup_pointer(vmt), CHILD_TRANSFER_SLOT); + uint16_t consumed = win16_call_object_transfer_method( + procedure, child, context->direction, context->cursor); + context->cursor = win16_make_far_pointer( + win16_far_selector(context->cursor), + (uint16_t)(win16_far_offset(context->cursor) + consumed)); +} + +/* 1018:0e0a — transfer across the circular child list head-to-tail. */ +void object_windows_transfer_child_data( + Win16FarPtr object, uint16_t direction) +{ + Win16FarPtr cursor = + read_far(object, OBJECT_TRANSFER_POINTER_OFFSET); + if (cursor == 0) { + return; + } + ObjectWindowsTransferContext context = {cursor, direction}; + Win16FarPtr tail = read_far(object, CONTAINER_CHILD_TAIL_OFFSET); + if (tail == 0) { + return; + } + Win16FarPtr child = read_far(tail, CHILD_NEXT_OFFSET); + while (child != tail) { + Win16FarPtr next = read_far(child, CHILD_NEXT_OFFSET); + object_windows_transfer_child_callback(&context, child); + child = next; + } + object_windows_transfer_child_callback(&context, tail); +} diff --git a/original/reconstructed/tdkpin_object_list.h b/original/reconstructed/tdkpin_object_list.h new file mode 100644 index 0000000..e48fa6e --- /dev/null +++ b/original/reconstructed/tdkpin_object_list.h @@ -0,0 +1,62 @@ +#ifndef TDKPIN_OBJECT_LIST_H +#define TDKPIN_OBJECT_LIST_H + +#include "tdkpin_segmented.h" + +void object_windows_append_child( + Win16FarPtr container, Win16FarPtr child); /* 1018:069a */ +void object_windows_remove_child( + Win16FarPtr container, Win16FarPtr child); /* 1018:071c */ +Win16FarPtr object_windows_find_child( + Win16FarPtr container, Win16FarPtr predicate); /* 1018:080d */ +void object_windows_for_each_child( + Win16FarPtr container, Win16FarPtr action); /* 1018:085a */ +uint16_t object_windows_minus_one_default( + Win16FarPtr object); /* 1018:08ac */ +bool object_windows_child_blocks_close( + uint16_t ignored, Win16FarPtr child); /* 1018:0ec0 */ +bool object_windows_all_children_can_close( + Win16FarPtr container); /* 1018:0ef4 */ +void object_windows_dispose_child_callback( + uint16_t ignored, Win16FarPtr child); /* 1018:03e9 */ +bool object_windows_child_group_matches( + int16_t group, Win16FarPtr child); /* 1018:0466 */ +bool object_windows_try_child_activation( + uint16_t ignored, Win16FarPtr child); /* 1018:049e */ +bool object_windows_unindexed_child_matches( + uint16_t ignored, Win16FarPtr child); /* 1018:0524 */ +bool object_windows_validate_child_groups( + Win16FarPtr container); /* 1018:055c */ +void object_windows_prepare_window( + Win16FarPtr window); /* 1018:0d9b */ + +typedef struct { + Win16FarPtr cursor; + uint16_t direction; +} ObjectWindowsTransferContext; + +void object_windows_transfer_child_callback( + ObjectWindowsTransferContext *context, + Win16FarPtr child); /* 1018:0dcd */ +void object_windows_transfer_child_data( + Win16FarPtr object, + uint16_t direction); /* 1018:0e0a */ +void borland_dispose_object(Win16FarPtr object); + +bool win16_call_object_predicate( + Win16FarPtr procedure, Win16FarPtr child); +void win16_call_object_action( + Win16FarPtr procedure, Win16FarPtr child); +bool win16_call_object_bool_method( + Win16FarPtr procedure, Win16FarPtr object); +void win16_call_object_u16_method( + Win16FarPtr procedure, + Win16FarPtr object, + uint16_t argument); +uint16_t win16_call_object_transfer_method( + Win16FarPtr procedure, + Win16FarPtr object, + uint16_t direction, + Win16FarPtr cursor); + +#endif diff --git a/original/reconstructed/tdkpin_object_windows.c b/original/reconstructed/tdkpin_object_windows.c new file mode 100644 index 0000000..b76edbf --- /dev/null +++ b/original/reconstructed/tdkpin_object_windows.c @@ -0,0 +1,357 @@ +/* + * Borland ObjectWindows callback bootstrap reconstructed from TDKPIN.EXE. + * + * Target: a9022f1894e3e6e21fc42e8f6c932f7c549ca77f63aaa0c488bb9d55d9d0174c + * Functions: 1018:0045 and 1018:018b (NE export ordinals 208 and 211) + */ + +#include "tdkpin_object_windows.h" +#include "tdkpin_borland_runtime.h" + +enum { + OBJECT_WINDOW_VMT_OFFSET = 0, + OBJECT_WINDOW_HANDLE_OFFSET = 4, + OBJECT_WINDOW_BOUND_PROC_OFFSET = 0x12, + WIN16_GWL_WNDPROC = -4, + DGROUP_OBJECT_SELECTOR_PROPERTY = 0x067a, /* "OW1" */ + DGROUP_OBJECT_OFFSET_PROPERTY = 0x067e, /* "OW2" */ +}; + +enum { + VMT_MESSAGE_TABLE_OFFSET = 4, + VMT_DEFAULT_MESSAGE_SLOT = 0x0c, + MESSAGE_TABLE_PARENT_OFFSET = 0, + MESSAGE_TABLE_CACHE_ID_OFFSET = 2, + MESSAGE_TABLE_CACHE_SLOT_OFFSET = 4, + MESSAGE_TABLE_COUNT_OFFSET = 6, + MESSAGE_TABLE_IDS_OFFSET = 8, +}; + +/* DGROUP 1028:0676/0678; valid only while CreateWindow16 is in progress. */ +extern Win16FarPtr g_object_windows_creating_object; + +LRESULT16 SetWindowLong16(HWND16 window, INT16 index, int32_t value); +BOOL16 SetProp16(HWND16 window, Win16FarPtr name, Win16Handle value); +Win16Handle RemoveProp16(HWND16 window, Win16FarPtr name); +Win16Handle GetProp16(HWND16 window, Win16FarPtr name); +BOOL16 IsWindow16(HWND16 window); +int32_t GetWindowLong16(HWND16 window, INT16 index); + +/* + * 1018:0045 — associate a far ObjectWindows object with one HWND. + * + * Win16 SetProp stores only a 16-bit HANDLE, so ObjectWindows deliberately + * splits the far pointer into two properties. OW1 holds the selector and OW2 + * holds the offset; the inverse lookup routine recombines them. + */ +void object_windows_bind_window(HWND16 window, Win16FarPtr object) +{ + (void)SetProp16( + window, + win16_dgroup_pointer(DGROUP_OBJECT_SELECTOR_PROPERTY), + win16_far_selector(object)); + (void)SetProp16( + window, + win16_dgroup_pointer(DGROUP_OBJECT_OFFSET_PROPERTY), + win16_far_offset(object)); +} + +/* 1018:0071 — remove both halves of the HWND/object association. */ +void object_windows_unbind_window(HWND16 window) +{ + (void)RemoveProp16( + window, win16_dgroup_pointer(DGROUP_OBJECT_SELECTOR_PROPERTY)); + (void)RemoveProp16( + window, win16_dgroup_pointer(DGROUP_OBJECT_OFFSET_PROPERTY)); +} + +/* + * 1018:0097 — recover the bound ObjectWindows object for one HWND. + * Generated thunks carry the object at +3/+5; subclassed/native procedures use + * the OW1 selector and OW2 offset properties installed by 1018:0045. + */ +Win16FarPtr object_windows_object_from_window(HWND16 window) +{ + if (!IsWindow16(window)) { + return 0; + } + + Win16FarPtr procedure = + (Win16FarPtr)GetWindowLong16(window, WIN16_GWL_WNDPROC); + uint16_t procedure_offset = win16_far_offset(procedure); + bool generated_thunk = + win16_read_u8(procedure) == 0xe8 && + win16_read_u16(win16_far_add_offset(procedure, 1)) == + (uint16_t)(0xffff - procedure_offset) && + win16_read_u16(win16_make_far_pointer( + win16_far_selector(procedure), 2)) == 0x2e5b; + if (generated_thunk) { + return win16_read_far_pointer(procedure, 3); + } + + uint16_t selector = GetProp16( + window, win16_dgroup_pointer(DGROUP_OBJECT_SELECTOR_PROPERTY)); + uint16_t offset = GetProp16( + window, win16_dgroup_pointer(DGROUP_OBJECT_OFFSET_PROPERTY)); + return win16_make_far_pointer(selector, offset); +} + +/* + * 1018:018b — class bootstrap WNDPROC16. + * + * The initial class procedure is used for the first message only. It replaces + * itself with the object's generated 7-byte bound thunk, publishes the HWND to + * object association, then tail-dispatches the unchanged 10-byte WNDPROC frame. + * AX:DX from that direct far call is returned unchanged. + */ +LRESULT16 object_window_bootstrap_proc( + HWND16 window, UINT16 message, WPARAM16 wparam, LPARAM16 lparam) +{ + Win16FarPtr object = g_object_windows_creating_object; + Win16FarPtr bound_proc = + win16_read_far_pointer(object, OBJECT_WINDOW_BOUND_PROC_OFFSET); + + (void)SetWindowLong16(window, WIN16_GWL_WNDPROC, (int32_t)bound_proc); + object_windows_bind_window(window, object); + return win16_call_window_proc(bound_proc, window, message, wparam, lparam); +} + +/* + * 1018:0002 — resolve a nonnegative ObjectWindows message id. + * + * The most-derived VMT points at a linked dynamic-message table. Every node + * contains a parent pointer, ids, and far handler slots in the same compact + * layout as Borland dynamic methods. Unlike 1020:16e6, a miss selects a caller- + * supplied VMT fallback slot, and a parent hit is cached in the most-derived + * table rather than in the node where it was found. + */ +Win16FarPtr object_windows_resolve_message_handler( + uint16_t vmt, uint16_t message, uint16_t fallback_slot) +{ + uint16_t root_table = win16_read_u16(win16_dgroup_pointer( + (uint16_t)(vmt + VMT_MESSAGE_TABLE_OFFSET))); + if (root_table == 0) { + return win16_dgroup_pointer((uint16_t)(vmt + fallback_slot)); + } + + Win16FarPtr root = win16_dgroup_pointer(root_table); + if (message == win16_read_u16(win16_far_add_offset( + root, MESSAGE_TABLE_CACHE_ID_OFFSET))) { + uint16_t cached_slot = win16_read_u16(win16_far_add_offset( + root, MESSAGE_TABLE_CACHE_SLOT_OFFSET)); + return win16_dgroup_pointer(cached_slot); + } + + uint16_t table = root_table; + while (table != 0) { + Win16FarPtr node = win16_dgroup_pointer(table); + uint16_t count = win16_read_u16(win16_far_add_offset( + node, MESSAGE_TABLE_COUNT_OFFSET)); + for (uint16_t index = 0; index < count; index++) { + uint16_t id = win16_read_u16(win16_far_add_offset( + node, + (uint16_t)(MESSAGE_TABLE_IDS_OFFSET + index * 2u))); + if (id != message) { + continue; + } + + uint16_t slot = (uint16_t)( + table + MESSAGE_TABLE_IDS_OFFSET + count * 2u + + index * 4u); + win16_write_u16( + root, MESSAGE_TABLE_CACHE_ID_OFFSET, message); + win16_write_u16( + root, MESSAGE_TABLE_CACHE_SLOT_OFFSET, slot); + return win16_dgroup_pointer(slot); + } + table = win16_read_u16(win16_far_add_offset( + node, MESSAGE_TABLE_PARENT_OFFSET)); + } + return win16_dgroup_pointer((uint16_t)(vmt + fallback_slot)); +} + +/* 1018:0103 — invoke the optional process-wide message instrumentation hook. */ +void object_windows_call_message_hook( + Win16FarPtr object, + Win16FarPtr handler, + const ObjectWindowsMessage *message) +{ + win16_call_object_message_hook( + g_object_windows_message_hook, + object, + handler, + message->window, + message->message, + message->wparam, + message->lparam); +} + +/* + * 1018:0133 — shared WNDPROC16/DLGPROC16 reached by every generated thunk. + * The thunk supplies ES:BX = object. The Pascal Win16 argument order places + * HWND at BP+0e and LPARAM at BP+06/+08; the explicit C signature restores the + * logical API order while preserving all original field widths. + */ +LRESULT16 object_dispatch_window_or_dialog_proc( + Win16FarPtr object, + HWND16 window, + UINT16 message, + WPARAM16 wparam, + LPARAM16 lparam) +{ + win16_write_u16(object, OBJECT_WINDOW_HANDLE_OFFSET, window); + ObjectWindowsMessage record = { + .window = window, + .message = message, + .wparam = wparam, + .lparam = lparam, + .result = 1, + }; + + uint16_t vmt = win16_read_u16(win16_far_add_offset( + object, OBJECT_WINDOW_VMT_OFFSET)); + Win16FarPtr handler_slot; + if ((int16_t)message < 0) { + handler_slot = win16_dgroup_pointer( + (uint16_t)(vmt + VMT_DEFAULT_MESSAGE_SLOT)); + } else { + handler_slot = object_windows_resolve_message_handler( + vmt, message, VMT_DEFAULT_MESSAGE_SLOT); + } + Win16FarPtr handler = win16_read_far_pointer(handler_slot, 0); + + if (win16_far_selector(g_object_windows_message_hook) != 0) { + object_windows_call_message_hook(object, handler, &record); + } + win16_call_object_message_handler(handler, object, &record); + return record.result; +} + +/* + * 1018:08c3 — generic ObjectWindows event dispatch used by command/focus/menu + * paths. DX supplies the fallback VMT slot and AX the dynamic method id. The + * existing far event record is passed unchanged to the selected handler. + */ +void object_windows_dispatch_event( + uint16_t fallback_slot, + uint16_t method_id, + Win16FarPtr event, + Win16FarPtr object) +{ + uint16_t vmt = win16_read_u16(object); + Win16FarPtr handler_slot = object_windows_resolve_message_handler( + vmt, method_id, fallback_slot); + Win16FarPtr handler = win16_read_far_pointer(handler_slot, 0); + + if (win16_far_selector(g_object_windows_message_hook) != 0) { + ObjectWindowsMessage hook_record = { + .window = win16_read_u16(event), + .message = win16_read_u16(win16_far_add_offset(event, 2)), + .wparam = win16_read_u16(win16_far_add_offset(event, 4)), + .lparam = (LPARAM16)(uint32_t)( + win16_read_u16(win16_far_add_offset(event, 6)) | + ((uint32_t)win16_read_u16( + win16_far_add_offset(event, 8)) + << 16)), + .result = 0, + }; + object_windows_call_message_hook(object, handler, &hook_record); + } + win16_call_object_event_handler(handler, object, event); +} + +enum { + BOUND_THUNK_POOL_BYTES = 0x0100, + BOUND_THUNK_SHARED_CODE_OFFSET = 2, + BOUND_THUNK_SHARED_CODE_BYTES = 5, + BOUND_THUNK_DISPATCH_PROC_OFFSET = 7, + BOUND_THUNK_FIRST_OFFSET = 0x000b, + BOUND_THUNK_BYTES = 7, + BOUND_THUNK_OBJECT_OFFSET = 3, + DGROUP_BOUND_THUNK_TEMPLATE = 0x0686, +}; + +static void write_far_pointer( + Win16FarPtr destination, uint16_t byte_offset, Win16FarPtr value) +{ + win16_write_u16(destination, byte_offset, win16_far_offset(value)); + win16_write_u16( + destination, + (uint16_t)(byte_offset + 2), + win16_far_selector(value)); +} + +/* + * Build one 256-byte executable block. Offset 2 contains the shared sequence + * `POP BX; CS: LES BX,[BX]; JMP FAR dispatch_proc`. Each seven-byte thunk is + * `CALL block:0002` followed by a mutable far object/free-list pointer. The + * near displacement -1-offset makes every CALL land at block offset 2. + */ +static void allocate_bound_thunk_pool(void) +{ + HGLOBAL16 allocation = GlobalAlloc16(0, BOUND_THUNK_POOL_BYTES); + Win16FarPtr block = GlobalLock16(allocation); + uint16_t selector = win16_far_selector(block); + + win16_write_u16(block, 0, g_object_windows_thunk_code_selector); + borland_move_bytes( + win16_far_add_offset(block, BOUND_THUNK_SHARED_CODE_OFFSET), + win16_dgroup_pointer(DGROUP_BOUND_THUNK_TEMPLATE), + BOUND_THUNK_SHARED_CODE_BYTES); + write_far_pointer( + block, + BOUND_THUNK_DISPATCH_PROC_OFFSET, + g_object_windows_dispatch_proc); + + uint16_t offset = BOUND_THUNK_FIRST_OFFSET; + do { + Win16FarPtr thunk = win16_make_far_pointer(selector, offset); + win16_write_u8(thunk, 0xe8); + win16_write_u16( + thunk, 1, (uint16_t)(0xffffu - offset)); + write_far_pointer( + thunk, BOUND_THUNK_OBJECT_OFFSET, g_object_windows_free_thunk); + g_object_windows_free_thunk = thunk; + offset = (uint16_t)(offset + BOUND_THUNK_BYTES); + } while (offset != BOUND_THUNK_POOL_BYTES); + + g_object_windows_thunk_code_selector = selector; + (void)PrestoChangoSelector16(selector, selector); +} + +/* + * 1018:01dc — pop a generated WNDPROC thunk and bind its embedded far object. + * Executable selectors are modified only through a temporary CS-to-DS alias. + */ +Win16FarPtr object_windows_allocate_bound_thunk(Win16FarPtr object) +{ + if (g_object_windows_free_thunk == 0) { + allocate_bound_thunk_pool(); + } + + Win16FarPtr thunk = g_object_windows_free_thunk; + uint16_t alias = + AllocCStoDSAlias16(win16_far_selector(thunk)); + Win16FarPtr writable = win16_make_far_pointer( + alias, win16_far_offset(thunk)); + g_object_windows_free_thunk = + win16_read_far_pointer(writable, BOUND_THUNK_OBJECT_OFFSET); + write_far_pointer(writable, BOUND_THUNK_OBJECT_OFFSET, object); + (void)FreeSelector16(alias); + return thunk; +} + +/* 1018:02fa — push one bound WNDPROC thunk back onto the global free list. */ +void object_windows_release_bound_thunk(Win16FarPtr thunk) +{ + uint16_t alias = + AllocCStoDSAlias16(win16_far_selector(thunk)); + Win16FarPtr writable = win16_make_far_pointer( + alias, win16_far_offset(thunk)); + write_far_pointer( + writable, + BOUND_THUNK_OBJECT_OFFSET, + g_object_windows_free_thunk); + (void)FreeSelector16(alias); + g_object_windows_free_thunk = thunk; +} diff --git a/original/reconstructed/tdkpin_object_windows.h b/original/reconstructed/tdkpin_object_windows.h new file mode 100644 index 0000000..b742ecc --- /dev/null +++ b/original/reconstructed/tdkpin_object_windows.h @@ -0,0 +1,101 @@ +#ifndef TDKPIN_OBJECT_WINDOWS_H +#define TDKPIN_OBJECT_WINDOWS_H + +#include "tdkpin_segmented.h" + +#pragma pack(push, 1) +typedef struct { + HWND16 window; + UINT16 message; + WPARAM16 wparam; + LPARAM16 lparam; + LRESULT16 result; +} ObjectWindowsMessage; +#pragma pack(pop) + +_Static_assert( + sizeof(ObjectWindowsMessage) == 14, + "ObjectWindows message record layout drift"); + +#pragma pack(push, 1) +typedef struct { + uint16_t parent_table; + uint16_t cached_message; + uint16_t cached_handler_slot; + uint16_t count; + uint16_t message_ids[9]; + Win16FarPtr handlers[9]; +} ObjectWindowsMessageTable9; +#pragma pack(pop) + +_Static_assert( + sizeof(ObjectWindowsMessageTable9) == 62, + "ObjectWindows dynamic message table layout drift"); +extern ObjectWindowsMessageTable9 g_object_windows_base_message_table; +/* Binary overlay: 1028:05cc..0609; cache words are mutable. */ + +void object_windows_bind_window(HWND16 window, Win16FarPtr object); +void object_windows_unbind_window(HWND16 window); +Win16FarPtr object_windows_object_from_window(HWND16 window); +LRESULT16 object_window_bootstrap_proc( + HWND16 window, UINT16 message, WPARAM16 wparam, LPARAM16 lparam); +Win16FarPtr object_windows_allocate_bound_thunk( + Win16FarPtr object); /* 1018:01dc */ +void object_windows_release_bound_thunk( + Win16FarPtr thunk); /* 1018:02fa */ + +extern uint16_t g_object_windows_thunk_code_selector; /* 1028:066c */ +extern Win16FarPtr g_object_windows_free_thunk; /* 1028:066e/0670 */ +extern Win16FarPtr g_object_windows_dispatch_proc; /* 1028:0672/0674 */ +extern Win16FarPtr g_object_windows_message_hook; /* 1028:0682/0684 */ +extern Win16FarPtr g_object_windows_creating_object; /* 1028:0676/0678 */ + +Win16FarPtr object_windows_resolve_message_handler( + uint16_t vmt, + uint16_t message, + uint16_t fallback_slot); /* 1018:0002 */ +void object_windows_call_message_hook( + Win16FarPtr object, + Win16FarPtr handler, + const ObjectWindowsMessage *message); /* 1018:0103 */ +LRESULT16 object_dispatch_window_or_dialog_proc( + Win16FarPtr object, + HWND16 window, + UINT16 message, + WPARAM16 wparam, + LPARAM16 lparam); /* 1018:0133 */ +void object_windows_dispatch_event( + uint16_t fallback_slot, + uint16_t method_id, + Win16FarPtr event, + Win16FarPtr object); /* 1018:08c3 */ + +/* Platform bridge for the original indirect far calls. */ +void win16_call_object_message_handler( + Win16FarPtr procedure, + Win16FarPtr object, + ObjectWindowsMessage *message); +void win16_call_object_message_hook( + Win16FarPtr procedure, + Win16FarPtr object, + Win16FarPtr handler, + HWND16 window, + UINT16 message, + WPARAM16 wparam, + LPARAM16 lparam); +void win16_call_object_event_handler( + Win16FarPtr procedure, + Win16FarPtr object, + Win16FarPtr event); +void win16_call_object_scroll_method( + Win16FarPtr procedure, + Win16FarPtr object, + uint16_t position, + uint16_t command); +void win16_call_object_paint_method( + Win16FarPtr procedure, + Win16FarPtr object, + PAINTSTRUCT16 *paint, + HDC16 dc); + +#endif diff --git a/original/reconstructed/tdkpin_palette.c b/original/reconstructed/tdkpin_palette.c new file mode 100644 index 0000000..51e5339 --- /dev/null +++ b/original/reconstructed/tdkpin_palette.c @@ -0,0 +1,200 @@ +/* TDKPIN logical-palette creation and PAL resource loading. */ + +#include "tdkpin_palette.h" + +#include "tdkpin_strings.h" + +enum { + DGROUP_PALETTE_HANDLE = 0x444e, + DGROUP_PALETTE_RGB = 0x4450, + DGROUP_PAL_RESOURCE_TYPE = 0x045a, + DGROUP_DAT_RESOURCE_TYPE = 0x045e, + DGROUP_DISPLAY_DRIVER = 0x0462, + PALETTE_COLOR_COUNT = 256, + PALETTE_RGB_BYTES = 768, + LOGPALETTE_VERSION_0300 = 0x0300, + PALETTE_ENTRY_NOCOLLAPSE = 0x04, + CREATE_DIBITMAP_INITIALIZE = 0x00000004, +}; + +/* Code2 1008:11bd and 131e, represented with their exact signed bounds. */ +static const BorlandInt32Range g_uint16_range = {0, 0xffff}; +static const BorlandInt32Range g_palette_byte_range = {0, 0x02ff}; + +/* + * 1008:0023 — create and briefly realize a 256-entry PC_NOCOLLAPSE palette in + * the supplied window DC. Allocation failure is the sole guarded palette path; + * all GDI results are otherwise consumed exactly as returned. + */ +void tdkpin_realize_nocollapse_palette(HWND16 window) +{ + Win16FarPtr logical_palette = borland_get_mem(sizeof(LOGPALETTE256)); + if (logical_palette == 0) { + return; + } + win16_write_u16(logical_palette, 0, LOGPALETTE_VERSION_0300); + win16_write_u16(logical_palette, 2, PALETTE_COLOR_COUNT); + for (uint16_t index = 0; index < PALETTE_COLOR_COUNT; index++) { + Win16FarPtr entry = win16_far_add_offset( + logical_palette, + (uint16_t)(4 + index * sizeof(PALETTEENTRY16))); + win16_write_u8(entry, 0); + win16_write_u8(win16_far_add_offset(entry, 1), 0); + win16_write_u8(win16_far_add_offset(entry, 2), 0); + win16_write_u8( + win16_far_add_offset(entry, 3), PALETTE_ENTRY_NOCOLLAPSE); + } + + HDC16 dc = GetDC16(window); + HPALETTE16 palette = CreatePalette16(logical_palette); + HPALETTE16 previous = SelectPalette16(dc, palette, 0); + (void)RealizePalette16(dc); + (void)SelectPalette16(dc, previous, 1); + (void)DeleteObject16(palette); + (void)ReleaseDC16(window, dc); + borland_free_mem(logical_palette, sizeof(LOGPALETTE256)); +} + +/* + * 1008:11c5 — materialize a 256-entry LOGPALETTE from the packed DGROUP RGB + * table, create the GDI palette, then range-check and free the temporary block. + */ +void tdkpin_create_palette_from_rgb_table(void) +{ + const uint32_t allocation_bytes = sizeof(LOGPALETTE256); + Win16FarPtr logical_palette = borland_get_mem((uint16_t)allocation_bytes); + win16_write_u16(logical_palette, 0, LOGPALETTE_VERSION_0300); + win16_write_u16(logical_palette, 2, PALETTE_COLOR_COUNT); + for (uint16_t index = 0; index < PALETTE_COLOR_COUNT; index++) { + Win16FarPtr source = win16_far_add_offset( + win16_dgroup_pointer(DGROUP_PALETTE_RGB), + (uint16_t)(index * 3)); + Win16FarPtr entry = win16_far_add_offset( + logical_palette, + (uint16_t)(4 + index * sizeof(PALETTEENTRY16))); + win16_write_u8(entry, win16_read_u8(source)); + win16_write_u8( + win16_far_add_offset(entry, 1), + win16_read_u8(win16_far_add_offset(source, 1))); + win16_write_u8( + win16_far_add_offset(entry, 2), + win16_read_u8(win16_far_add_offset(source, 2))); + win16_write_u8(win16_far_add_offset(entry, 3), 0); + } + HPALETTE16 palette = CreatePalette16(logical_palette); + win16_write_u16( + win16_dgroup_pointer(DGROUP_PALETTE_HANDLE), 0, palette); + borland_check_int32_range((int32_t)allocation_bytes, &g_uint16_range); + borland_free_mem(logical_palette, (uint16_t)allocation_bytes); +} + +/* + * 1008:1326 — load a custom "pal" resource and copy exactly 768 bytes. Both + * source and destination index expressions pass through the compiler-emitted + * 0..767 range descriptor on every iteration. The loaded resource is unlocked + * but deliberately not FreeResource'd here, matching the binary. + */ +void tdkpin_load_palette_resource( + Win16FarPtr destination, + Win16FarPtr resource_name, + HINSTANCE16 instance) +{ + HRSRC16 found = FindResource16( + instance, + resource_name, + win16_dgroup_pointer(DGROUP_PAL_RESOURCE_TYPE)); + HGLOBAL16 resource = LoadResource16(instance, found); + Win16FarPtr source = LockResource16(resource); + for (uint16_t index = 0; index < PALETTE_RGB_BYTES; index++) { + borland_check_int32_range(index, &g_palette_byte_range); + uint8_t value = win16_read_u8(win16_far_add_offset(source, index)); + borland_check_int32_range(index, &g_palette_byte_range); + win16_write_u8(win16_far_add_offset(destination, index), value); + } + (void)GlobalUnlock16(resource); +} + +/* + * 1008:13a8 — project all 256 packed RGB triplets to BITMAPINFO RGBQUADs. + * The compiler's dead ((1< + +#pragma pack(push, 1) +typedef struct { + uint8_t red; + uint8_t green; + uint8_t blue; + uint8_t flags; +} PALETTEENTRY16; + +typedef struct { + uint16_t version; + uint16_t entry_count; + PALETTEENTRY16 entries[256]; +} LOGPALETTE256; + +typedef struct { + uint8_t blue; + uint8_t green; + uint8_t red; + uint8_t reserved; +} RGBQUAD16; + +typedef struct { + uint32_t size; + int32_t width; + int32_t height; + uint16_t planes; + uint16_t bit_count; + uint32_t compression; + uint32_t image_bytes; + int32_t x_pixels_per_meter; + int32_t y_pixels_per_meter; + uint32_t colors_used; + uint32_t important_colors; +} BITMAPINFOHEADER16; + +typedef struct { + BITMAPINFOHEADER16 header; + RGBQUAD16 colors[256]; +} BITMAPINFO256; +#pragma pack(pop) + +_Static_assert(sizeof(PALETTEENTRY16) == 4, "Win16 PALETTEENTRY drift"); +_Static_assert(sizeof(LOGPALETTE256) == 1028, "Win16 LOGPALETTE drift"); +_Static_assert(sizeof(RGBQUAD16) == 4, "Win16 RGBQUAD drift"); +_Static_assert(sizeof(BITMAPINFOHEADER16) == 40, "BITMAPINFOHEADER drift"); +_Static_assert( + offsetof(BITMAPINFOHEADER16, bit_count) == 14, + "BITMAPINFO bit-count drift"); +_Static_assert(offsetof(BITMAPINFO256, colors) == 40, "BITMAPINFO color offset drift"); +_Static_assert(sizeof(BITMAPINFO256) == 1064, "BITMAPINFO256 drift"); + +void tdkpin_create_palette_from_rgb_table(void); /* 1008:11c5 */ +void tdkpin_realize_nocollapse_palette(HWND16 window); /* 1008:0023 */ +void tdkpin_load_palette_resource( + Win16FarPtr destination, + Win16FarPtr resource_name, + HINSTANCE16 instance); /* 1008:1326 */ +void tdkpin_fill_bitmap_info_palette( + Win16FarPtr bitmap_info); /* 1008:13a8 */ +HBITMAP16 tdkpin_load_bitmap_resource( + Win16FarPtr resource_name, + HINSTANCE16 instance); /* 1008:149d */ + +#endif diff --git a/original/reconstructed/tdkpin_panel_animation.c b/original/reconstructed/tdkpin_panel_animation.c new file mode 100644 index 0000000..6fbe76b --- /dev/null +++ b/original/reconstructed/tdkpin_panel_animation.c @@ -0,0 +1,265 @@ +/* 281-frame, mask/image-composited panel animation from TDKPIN Code1. */ + +#include "tdkpin_panel_animation.h" + +#include "tdkpin_sound.h" + +static Win16FarPtr caller_receiver(uint16_t caller_bp) +{ + uint16_t offset = win16_read_stack_u16((uint16_t)(caller_bp + 6)); + uint16_t selector = win16_read_stack_u16((uint16_t)(caller_bp + 8)); + return win16_make_far_pointer(selector, offset); +} + +static INT16 twice(int32_t value) +{ + return (INT16)(uint16_t)((uint32_t)value * 2u); +} + +static void copy_region( + HDC16 destination, + INT16 destination_x, + INT16 destination_y, + INT16 width, + INT16 height, + HDC16 source, + INT16 source_x, + INT16 source_y) +{ + (void)BitBlt16( + destination, + destination_x, + destination_y, + width, + height, + source, + source_x, + source_y, + 0x00cc0020u); +} + +static void mask_image_pair( + HDC16 panel, + INT16 destination_x, + INT16 destination_y, + INT16 width, + INT16 height, + HDC16 atlas, + INT16 mask_x, + INT16 mask_y, + INT16 image_x, + INT16 image_y) +{ + (void)BitBlt16( + panel, + destination_x, + destination_y, + width, + height, + atlas, + mask_x, + mask_y, + 0x008800c6u); + (void)BitBlt16( + panel, + destination_x, + destination_y, + width, + height, + atlas, + image_x, + image_y, + 0x00ee0086u); +} + +static void phase_1_to_44( + int32_t frame, HDC16 panel, HDC16 atlas) +{ + mask_image_pair( + panel, + 20, + 0, + 45, + twice(frame), + atlas, + 45, + (INT16)(twice(45 - frame) + 89), + 0, + (INT16)(twice(45 - frame) + 89)); +} + +static void phase_66_to_128( + int32_t frame, HDC16 panel, HDC16 atlas) +{ + copy_region(panel, 0, 33, 91, 90, atlas, 180, 90); + if (frame < 83) { + mask_image_pair( + panel, + 0, + twice(82 - frame), + 91, + 90, + atlas, + 362, + 90, + 271, + 90); + } else { + INT16 height = twice(128 - frame); + INT16 source_y = (INT16)(twice(frame - 82) + 90); + mask_image_pair( + panel, 0, 0, 91, height, + atlas, 362, source_y, 271, source_y); + } + if (frame < 111) { + INT16 height = twice(110 - frame); + INT16 source_y = (INT16)(twice(frame - 66) + 90); + mask_image_pair( + panel, 20, 0, 45, height, + atlas, 135, source_y, 90, source_y); + } +} + +static void phase_159_to_221( + int32_t frame, HDC16 panel, HDC16 atlas) +{ + copy_region(panel, 0, 33, 91, 90, atlas, 180, 90); + if (frame < 204) { + INT16 height = twice(frame - 159); + INT16 source_y = (INT16)(twice(204 - frame) + 90); + mask_image_pair( + panel, 0, 0, 91, height, + atlas, 362, source_y, 453, source_y); + } else { + mask_image_pair( + panel, 0, twice(frame - 204), 91, 90, + atlas, 362, 90, 453, 90); + } + if (frame > 176) { + if (frame == 221) { + mask_image_pair( + panel, 20, 0, 45, 88, + atlas, 135, 90, 90, 90); + } else { + INT16 height = twice(frame - 177); + INT16 source_y = (INT16)(twice(222 - frame) + 89); + mask_image_pair( + panel, 20, 0, 45, height, + atlas, 135, source_y, 90, source_y); + } + } +} + +static void full_panel_mask_image(HDC16 panel, HDC16 atlas) +{ + mask_image_pair( + panel, 0, 33, 91, 90, + atlas, 362, 90, 453, 90); +} + +static void phase_238_to_281( + int32_t frame, HDC16 panel, HDC16 atlas) +{ + full_panel_mask_image(panel, atlas); + INT16 height = twice(281 - frame); + INT16 source_y = (INT16)(twice(frame - 238) + 90); + mask_image_pair( + panel, 20, 0, 45, height, + atlas, 45, source_y, 0, source_y); +} + +/* 1000:7440 -- render one frame of the 91x123 board-panel animation. */ +void tdkpin_draw_panel_animation(uint16_t caller_bp) +{ + Win16FarPtr receiver = caller_receiver(caller_bp); + HWND16 window = win16_read_u16(win16_far_add_offset(receiver, 4)); + HDC16 dc = GetDC16(window); + HDC16 atlas_dc = CreateCompatibleDC16(dc); + HGDIOBJ16 old_atlas = SelectObject16( + atlas_dc, win16_read_u16(win16_dgroup_pointer(0x085f))); + HDC16 panel_dc = CreateCompatibleDC16(dc); + HBITMAP16 panel_bitmap = CreateCompatibleBitmap16(dc, 91, 123); + HGDIOBJ16 old_panel = SelectObject16(panel_dc, panel_bitmap); + copy_region(panel_dc, 0, 0, 91, 123, atlas_dc, 79, 0); + (void)SelectObject16( + atlas_dc, win16_read_u16(win16_dgroup_pointer(0x0859))); + + int32_t frame = (int32_t)win16_read_u32(win16_dgroup_pointer(0x0851)); + int16_t phase_frame = (int16_t)frame; + if (phase_frame >= 1 && phase_frame <= 44) { + if (frame == 1) { + tdkpin_play_sound_if_not_tilted(13); + (void)SelectObject16( + panel_dc, win16_read_u16(win16_dgroup_pointer(0x085b))); + copy_region(panel_dc, 79, 0, 91, 90, atlas_dc, 271, 90); + (void)SelectObject16(panel_dc, panel_bitmap); + } + phase_1_to_44(frame, panel_dc, atlas_dc); + } else if (phase_frame >= 45 && phase_frame <= 57) { + if (frame == 45) { + (void)tdkpin_stop_sound_if_active(); + } + mask_image_pair( + panel_dc, 20, 0, 45, 88, + atlas_dc, 45, 90, 0, 90); + } else if (phase_frame >= 58 && phase_frame <= 65) { + if (frame == 58) { + tdkpin_play_sound_if_not_tilted(12); + } + mask_image_pair( + panel_dc, 20, 0, 45, 88, + atlas_dc, 135, 90, 90, 90); + } else if (phase_frame >= 66 && phase_frame <= 128) { + if (frame == 66) { + tdkpin_play_sound_if_not_tilted(13); + } + phase_66_to_128(frame, panel_dc, atlas_dc); + } else if (phase_frame >= 129 && phase_frame <= 158) { + if (frame == 129) { + (void)tdkpin_stop_sound_if_active(); + } + copy_region(panel_dc, 0, 33, 91, 90, atlas_dc, 180, 90); + } else if (phase_frame >= 159 && phase_frame <= 221) { + if (frame == 159) { + tdkpin_play_sound_if_not_tilted(13); + } + phase_159_to_221(frame, panel_dc, atlas_dc); + } else if (phase_frame >= 222 && phase_frame <= 229) { + if (frame == 222) { + (void)tdkpin_stop_sound_if_active(); + } + full_panel_mask_image(panel_dc, atlas_dc); + mask_image_pair( + panel_dc, 20, 0, 45, 88, + atlas_dc, 135, 90, 90, 90); + } else if (phase_frame >= 230 && phase_frame <= 237) { + if (frame == 230) { + tdkpin_play_sound_if_not_tilted(12); + } + full_panel_mask_image(panel_dc, atlas_dc); + mask_image_pair( + panel_dc, 20, 0, 45, 88, + atlas_dc, 45, 90, 0, 90); + } else if (phase_frame >= 238 && phase_frame <= 281) { + if (frame == 238) { + tdkpin_play_sound_if_not_tilted(13); + } + phase_238_to_281(frame, panel_dc, atlas_dc); + if (frame == 281) { + (void)SelectObject16( + panel_dc, win16_read_u16(win16_dgroup_pointer(0x085b))); + (void)SelectObject16( + atlas_dc, win16_read_u16(win16_dgroup_pointer(0x085d))); + copy_region(panel_dc, 79, 0, 91, 90, atlas_dc, 79, 0); + (void)SelectObject16(panel_dc, panel_bitmap); + } + } + + copy_region(dc, 79, 0, 91, 123, panel_dc, 0, 0); + (void)SelectObject16(panel_dc, old_panel); + (void)SelectObject16(atlas_dc, old_atlas); + (void)DeleteObject16(panel_bitmap); + (void)DeleteDC16(panel_dc); + (void)DeleteDC16(atlas_dc); + (void)ReleaseDC16(window, dc); +} diff --git a/original/reconstructed/tdkpin_panel_animation.h b/original/reconstructed/tdkpin_panel_animation.h new file mode 100644 index 0000000..b986a5e --- /dev/null +++ b/original/reconstructed/tdkpin_panel_animation.h @@ -0,0 +1,9 @@ +#ifndef TDKPIN_PANEL_ANIMATION_H +#define TDKPIN_PANEL_ANIMATION_H + +#include "tdkpin_segmented.h" + +void tdkpin_draw_panel_animation( + uint16_t caller_bp); /* 1000:7440 */ + +#endif diff --git a/original/reconstructed/tdkpin_physics.c b/original/reconstructed/tdkpin_physics.c new file mode 100644 index 0000000..9d2a9d6 --- /dev/null +++ b/original/reconstructed/tdkpin_physics.c @@ -0,0 +1,1137 @@ +/* Ball substep integrator and collision dispatcher at 1000:c79c. */ + +#include "tdkpin_physics.h" + +#include "tdkpin_arithmetic.h" +#include "tdkpin_collision_events.h" +#include "tdkpin_collision_records.h" +#include "tdkpin_gameplay_helpers.h" +#include "tdkpin_player_state.h" +#include "tdkpin_random.h" +#include "tdkpin_real48.h" +#include "tdkpin_render.h" +#include "tdkpin_sound.h" +#include "tdkpin_turn_state.h" + +enum { + RECORDS_BASE = 0x095b, + RECORD_BYTES = 0x53, + MAX_RECORDS = 175, +}; + +#pragma pack(push, 1) +typedef struct { + uint16_t record_id; + BorlandReal48 normal_x; + BorlandReal48 normal_y; + int32_t normal_velocity; + BorlandReal48 response_normal; + BorlandReal48 response_tangent; + BorlandReal48 response_auxiliary; + BorlandReal48 response_kick; + uint16_t flags; + int32_t score; + int32_t surface_distance; +} PhysicsCollisionCandidate; +#pragma pack(pop) + +_Static_assert(sizeof(PhysicsCollisionCandidate) == 0x34, + "1000:c79c candidate layout drift"); + +typedef struct { + int32_t velocity_x; + int32_t velocity_y; + BorlandReal48 spin; + int32_t speed; +} BallMotion; + +static const BorlandReal48 g_real48_thousand = + {{0x8a,0,0,0,0,0x7a}}; +static const BorlandReal48 g_real48_one = + {{0x81,0,0,0,0,0}}; +static const BorlandReal48 g_real48_point_nine = + {{0x80,0x66,0x66,0x66,0x66,0x66}}; +static const BorlandReal48 g_real48_point_six = + {{0x80,0x9a,0x99,0x99,0x99,0x19}}; +static const BorlandReal48 g_real48_point_four = + {{0x7f,0xcd,0xcc,0xcc,0xcc,0x4c}}; +static const BorlandReal48 g_real48_point_three = + {{0x7f,0x9a,0x99,0x99,0x99,0x19}}; +static const BorlandReal48 g_real48_point_zero_two = + {{0x7b,0x71,0x3d,0x0a,0xd7,0x23}}; +static const BorlandReal48 g_real48_twenty = + {{0x85,0,0,0,0,0x20}}; + +static Win16FarPtr caller_receiver(uint16_t caller_bp) +{ + uint16_t offset = win16_read_stack_u16((uint16_t)(caller_bp + 6)); + uint16_t selector = win16_read_stack_u16((uint16_t)(caller_bp + 8)); + return win16_make_far_pointer(selector, offset); +} + +static Win16FarPtr record_pointer(uint16_t id) +{ + return win16_dgroup_pointer((uint16_t)(RECORDS_BASE + id * RECORD_BYTES)); +} + +static int32_t read_i32(Win16FarPtr base, uint16_t offset) +{ + return (int32_t)win16_read_u32(win16_far_add_offset(base, offset)); +} + +static void write_i32(Win16FarPtr base, uint16_t offset, int32_t value) +{ + win16_write_u32(base, offset, (uint32_t)value); +} + +static BorlandReal48 read_real48(Win16FarPtr base, uint16_t offset) +{ + BorlandReal48 value; + for (uint16_t index = 0; index < sizeof(value.bytes); index++) { + value.bytes[index] = win16_read_u8(win16_far_add_offset( + base, (uint16_t)(offset + index))); + } + return value; +} + +static void write_real48( + Win16FarPtr base, uint16_t offset, BorlandReal48 value) +{ + for (uint16_t index = 0; index < sizeof(value.bytes); index++) { + win16_write_u8( + win16_far_add_offset(base, (uint16_t)(offset + index)), + value.bytes[index]); + } +} + +static int32_t dgroup_i32(uint16_t offset) +{ + return (int32_t)win16_read_u32(win16_dgroup_pointer(offset)); +} + +static void write_dgroup_i32(uint16_t offset, int32_t value) +{ + win16_write_u32(win16_dgroup_pointer(offset), 0, (uint32_t)value); +} + +static int32_t add_wrap(int32_t left, int32_t right) +{ + return (int32_t)((uint32_t)left + (uint32_t)right); +} + +static int32_t subtract_wrap(int32_t left, int32_t right) +{ + return (int32_t)((uint32_t)left - (uint32_t)right); +} + +static int32_t negate_wrap(int32_t value) +{ + return (int32_t)(0u - (uint32_t)value); +} + +static int32_t absolute_wrap(int32_t value) +{ + return value < 0 ? negate_wrap(value) : value; +} + +static BorlandReal48 negate_real48(BorlandReal48 value) +{ + if (value.bytes[0] != 0) { + value.bytes[5] ^= 0x80; + } + return value; +} + +static BorlandReal48 absolute_real48(BorlandReal48 value) +{ + value.bytes[5] &= 0x7f; + return value; +} + +static int32_t distance_milli(int32_t dx, int32_t dy) +{ + BorlandReal48 real_x = borland_real48_divide( + borland_i32_to_real48(dx), g_real48_thousand); + BorlandReal48 real_y = borland_real48_divide( + borland_i32_to_real48(dy), g_real48_thousand); + return borland_real48_round_to_i32(borland_real48_multiply( + borland_real48_sqrt(borland_real48_add( + borland_real48_square(real_x), + borland_real48_square(real_y))), + g_real48_thousand)); +} + +static int32_t normal_velocity_unchecked( + int32_t velocity_x, + int32_t velocity_y, + BorlandReal48 normal_x, + BorlandReal48 normal_y, + int32_t normal_length) +{ + return borland_real48_round_to_i32(borland_real48_divide( + borland_real48_subtract( + borland_real48_multiply( + borland_i32_to_real48(velocity_x), normal_y), + borland_real48_multiply( + borland_i32_to_real48(velocity_y), normal_x)), + borland_i32_to_real48(normal_length))); +} + +static int32_t normal_velocity_checked( + int32_t velocity_x, + int32_t velocity_y, + BorlandReal48 normal_x, + BorlandReal48 normal_y, + int32_t normal_length) +{ + if (normal_length <= 0) { + return 0; + } + return normal_velocity_unchecked( + velocity_x, velocity_y, normal_x, normal_y, normal_length); +} + +static int32_t speed_milli(int32_t velocity_x, int32_t velocity_y) +{ + return distance_milli(velocity_x, velocity_y); +} + +static int32_t scale_real48(int32_t value, BorlandReal48 factor) +{ + return borland_real48_round_to_i32(borland_real48_multiply( + borland_i32_to_real48(value), factor)); +} + +static int32_t clamp_motion_speed( + Win16FarPtr window, int32_t *velocity_x, int32_t *velocity_y) +{ + int32_t speed = speed_milli(*velocity_x, *velocity_y); + int32_t maximum = read_i32(window, 0x56); + if (speed > maximum) { + BorlandReal48 excess_fraction = borland_real48_divide( + borland_i32_to_real48(subtract_wrap(speed, maximum)), + borland_i32_to_real48(speed)); + *velocity_x = subtract_wrap( + *velocity_x, scale_real48(*velocity_x, excess_fraction)); + *velocity_y = subtract_wrap( + *velocity_y, scale_real48(*velocity_y, excess_fraction)); + speed = maximum; + } + return speed; +} + +static bool broadphase_contains_predicted_ball( + const TdkpinCollisionRecord *record, uint16_t caller_bp) +{ + return (uint8_t)tdkpin_ball_in_bounds( + caller_bp, + record->bounds_max_y_milli, + record->bounds_max_x_milli, + record->bounds_min_y_milli, + record->bounds_min_x_milli) != 0; +} + +static void load_record(uint16_t id, TdkpinCollisionRecord *record) +{ + Win16FarPtr source = record_pointer(id); + uint8_t *bytes = (uint8_t *)record; + for (uint16_t index = 0; index < sizeof(*record); index++) { + bytes[index] = win16_read_u8(win16_far_add_offset(source, index)); + } +} + +static void make_candidate( + PhysicsCollisionCandidate *candidate, + uint16_t id, + const TdkpinCollisionRecord *record, + BorlandReal48 normal_x, + BorlandReal48 normal_y, + int32_t collision_velocity, + int32_t surface_distance) +{ + *candidate = (PhysicsCollisionCandidate){ + .record_id = id, + .normal_x = normal_x, + .normal_y = normal_y, + .normal_velocity = collision_velocity, + .response_normal = record->response_normal, + .response_tangent = record->response_tangent, + .response_auxiliary = record->response_auxiliary, + .response_kick = record->response_kick, + .flags = record->flags, + .score = (int32_t)((uint32_t)record->score_low | + ((uint32_t)record->score_high << 16)), + .surface_distance = surface_distance, + }; +} + +static bool detect_circle_collision( + const TdkpinCollisionRecord *record, + uint16_t id, + uint16_t ball, + int32_t previous_x, + int32_t previous_y, + int32_t predicted_x, + int32_t predicted_y, + const BallMotion *motion, + PhysicsCollisionCandidate *candidate) +{ + if (id == (uint16_t)(175u - ball)) { + return false; + } + int32_t radius = borland_real48_round_to_i32(record->radius_milli); + int32_t surface_distance = subtract_wrap( + absolute_wrap(distance_milli( + subtract_wrap(record->point1_x_milli, previous_x), + subtract_wrap(record->point1_y_milli, previous_y))), + radius); + if ((record->subtype == 1 && surface_distance > motion->speed) || + (record->subtype == 2 && + negate_wrap(surface_distance) > motion->speed) || + (record->subtype != 1 && record->subtype != 2)) { + return false; + } + + int32_t middle_x = borland_divide_i32( + add_wrap(previous_x, predicted_x), 2).quotient; + int32_t middle_y = borland_divide_i32( + add_wrap(previous_y, predicted_y), 2).quotient; + BorlandReal48 normal_x = borland_i32_to_real48( + subtract_wrap(record->point1_y_milli, middle_y)); + BorlandReal48 normal_y = borland_i32_to_real48( + subtract_wrap(middle_x, record->point1_x_milli)); + if (record->subtype == 2) { + normal_x = negate_real48(normal_x); + normal_y = negate_real48(normal_y); + } + int32_t length = distance_milli( + borland_real48_round_to_i32(normal_x), + borland_real48_round_to_i32(normal_y)); + int32_t collision_velocity = normal_velocity_checked( + motion->velocity_x, + motion->velocity_y, + normal_x, + normal_y, + length); + if (collision_velocity >= 0 || + absolute_wrap(surface_distance) > absolute_wrap(collision_velocity)) { + return false; + } + surface_distance = add_wrap(surface_distance, 3000); + make_candidate( + candidate, + id, + record, + normal_x, + normal_y, + collision_velocity, + surface_distance); + return true; +} + +static int32_t cross_at_endpoint( + int32_t point_x, + int32_t point_y, + int32_t current_x, + int32_t current_y, + int32_t predicted_x, + int32_t predicted_y) +{ + return subtract_wrap( + borland_multiply_i32( + subtract_wrap(predicted_x, point_x), + subtract_wrap(point_y, current_y)), + borland_multiply_i32( + subtract_wrap(predicted_y, point_y), + subtract_wrap(point_x, current_x))); +} + +static bool detect_segment_collision( + const TdkpinCollisionRecord *record, + uint16_t id, + int32_t previous_x, + int32_t previous_y, + int32_t predicted_x, + int32_t predicted_y, + const BallMotion *motion, + PhysicsCollisionCandidate *candidate) +{ + int32_t segment_x = subtract_wrap( + record->point2_x_milli, record->point1_x_milli); + int32_t segment_y = subtract_wrap( + record->point2_y_milli, record->point1_y_milli); + BorlandReal48 normal_x = borland_i32_to_real48(segment_x); + BorlandReal48 normal_y = borland_i32_to_real48(segment_y); + int32_t length = distance_milli(segment_x, segment_y); + BorlandReal48 length_units = borland_real48_divide( + borland_i32_to_real48(length), g_real48_thousand); + BorlandReal48 segment_x_units = borland_real48_divide( + normal_x, g_real48_thousand); + BorlandReal48 segment_y_units = borland_real48_divide( + normal_y, g_real48_thousand); + int32_t distance = borland_real48_round_to_i32(absolute_real48( + borland_real48_divide( + borland_real48_subtract( + borland_real48_multiply( + borland_i32_to_real48(subtract_wrap( + previous_x, record->point1_x_milli)), + segment_y_units), + borland_real48_multiply( + borland_i32_to_real48(subtract_wrap( + previous_y, record->point1_y_milli)), + segment_x_units)), + length_units))); + int32_t collision_velocity = borland_real48_round_to_i32( + borland_real48_divide( + borland_real48_subtract( + borland_real48_multiply( + borland_i32_to_real48(motion->velocity_x), + segment_y_units), + borland_real48_multiply( + borland_i32_to_real48(motion->velocity_y), + segment_x_units)), + length_units)); + if (distance > motion->speed || collision_velocity > 10 || + subtract_wrap(distance, 10) > absolute_wrap(collision_velocity) || + cross_at_endpoint( + record->point1_x_milli, + record->point1_y_milli, + previous_x, + previous_y, + predicted_x, + predicted_y) < -10 || + cross_at_endpoint( + record->point2_x_milli, + record->point2_y_milli, + previous_x, + previous_y, + predicted_x, + predicted_y) > 10) { + return false; + } + make_candidate( + candidate, + id, + record, + normal_x, + normal_y, + collision_velocity, + distance); + return true; +} + +static void add_velocity_toward( + Win16FarPtr window, + int32_t target_x, + int32_t target_y, + int32_t ball_x, + int32_t ball_y, + BallMotion *motion) +{ + int32_t acceleration = borland_multiply_i32(read_i32(window, 0x5a), 10); + motion->velocity_x = scale_real48( + motion->velocity_x, g_real48_point_nine); + motion->velocity_y = scale_real48( + motion->velocity_y, g_real48_point_nine); + motion->velocity_x = target_x > ball_x + ? add_wrap(motion->velocity_x, acceleration) + : subtract_wrap(motion->velocity_x, acceleration); + motion->velocity_y = target_y > ball_y + ? add_wrap(motion->velocity_y, acceleration) + : subtract_wrap(motion->velocity_y, acceleration); +} + +static bool update_target_set_award( + uint16_t caller_bp, Win16FarPtr window) +{ + uint8_t player = win16_read_u8(win16_dgroup_pointer(0x07d1)); + int32_t award = 5000; + for (uint16_t id = 129; id <= 133; id++) { + if (win16_read_u16( + win16_far_add_offset(record_pointer(id), 0x43)) != 0) { + award = borland_multiply_i32(award, 2); + } + } + Win16FarPtr accumulated = win16_dgroup_pointer( + (uint16_t)(0x098e + player * 4u)); + win16_write_u32( + accumulated, + 0, + win16_read_u32(accumulated) + (uint32_t)award); + if (award == 160000) { + uint8_t multiplier = win16_read_u8(win16_dgroup_pointer( + (uint16_t)(0x09a1 + player))); + tdkpin_add_score_from_caller_frame( + caller_bp, + borland_multiply_i32( + (int32_t)win16_read_u32(accumulated), multiplier)); + win16_write_u32(accumulated, 0, 0); + win16_write_u8( + win16_dgroup_pointer((uint16_t)(0x09a1 + player)), + (uint8_t)(multiplier + 1u)); + Win16FarPtr markers = win16_dgroup_pointer( + (uint16_t)(0x081f + player * 2u)); + win16_write_u16(markers, 0, (uint16_t)(win16_read_u16(markers) + 1u)); + tdkpin_refresh_player_progress_markers(caller_bp); + HWND16 handle = win16_read_u16(win16_far_add_offset(window, 4)); + HDC16 dc = GetDC16(handle); + (void)ReleaseDC16(handle, dc); + if (win16_read_u8(win16_dgroup_pointer(0x07c7)) == 0 && + win16_read_u8(win16_dgroup_pointer(0x07c8)) == 0 && + win16_read_u8(win16_dgroup_pointer(0x0874)) == 0) { + write_dgroup_i32(0x0851, 0); + win16_write_u8(win16_dgroup_pointer(0x07c8), 1); + win16_write_u8(win16_far_add_offset(window, 0x0bdd), 0); + } + win16_write_u8(win16_dgroup_pointer(0x0874), 0); + return true; + } + return false; +} + +static void start_claw_capture(Win16FarPtr window, BallMotion *motion) +{ + win16_write_u8(win16_dgroup_pointer(0x07ca), 1); + static const uint16_t target_frames[4] = {1, 6, 7, 18}; + win16_write_u16( + win16_dgroup_pointer(0x086f), + 0, + target_frames[borland_random_below(4)]); + win16_write_u8(win16_dgroup_pointer(0x0873), 1); + win16_write_u8(win16_far_add_offset(window, 0x0bdf), 1); + motion->spin = (BorlandReal48){{0,0,0,0,0,0}}; + for (uint16_t id = 12; id <= 20; id++) { + win16_write_u8( + win16_far_add_offset(record_pointer(id), 0x34), 0); + } +} + +static bool handle_capture_record( + TdkpinCollisionRecord *record, + uint16_t id, + uint16_t ball, + uint16_t ball_count, + uint16_t caller_bp, + Win16FarPtr window, + int32_t previous_x, + int32_t previous_y, + int32_t ball_x, + int32_t ball_y, + BallMotion *motion, + PhysicsCollisionCandidate *candidate) +{ + int32_t radius = borland_real48_round_to_i32(record->radius_milli); + int32_t surface_distance = subtract_wrap( + absolute_wrap(distance_milli( + subtract_wrap(record->point1_x_milli, ball_x), + subtract_wrap( + subtract_wrap(record->point1_y_milli, ball_y), 2000))), + radius); + Win16FarPtr live = record_pointer(id); + uint16_t contact = win16_read_u16(win16_far_add_offset(live, 0x43)); + bool contact_allowed = contact == 0 || + (contact != 99 && ball_count == 1) || contact == ball; + if (surface_distance < -11000 && contact_allowed && + (id != 148 || win16_read_u8(win16_dgroup_pointer(0x0875)) == 0)) { + int32_t capture_age = read_i32(window, 0x0bca); + if (capture_age < 300) { + bool stationary = + absolute_wrap(subtract_wrap( + record->point1_x_milli, previous_x)) < 500 && + absolute_wrap(subtract_wrap( + record->point1_y_milli, previous_y)) < 500 && + absolute_wrap(motion->velocity_x) < 500 && + absolute_wrap(motion->velocity_y) < 500; + if (stationary) { + motion->velocity_x = 0; + motion->velocity_y = 0; + if (capture_age == 0) { + win16_write_u16(live, 0x43, ball); + tdkpin_play_sound_if_not_tilted(15); + } + write_i32(window, 0x0bca, id == 89 ? 300 + : add_wrap(capture_age, 5)); + } else { + add_velocity_toward( + window, + record->point1_x_milli, + record->point1_y_milli, + ball_x, + ball_y, + motion); + } + return false; + } + + if (id == 89 && win16_read_u8(win16_dgroup_pointer(0x0874)) == 0) { + start_claw_capture(window, motion); + return false; + } + if (id >= 129 && id <= 133) { + bool complete = update_target_set_award(caller_bp, window); + if (!complete) { + uint8_t player = win16_read_u8(win16_dgroup_pointer(0x07d1)); + win16_write_u8( + win16_far_add_offset( + window, + (uint16_t)(player * 0x14u + (id - 129u) + + 0x0476u)), + 1); + tdkpin_restore_record_or_item_a( + caller_bp, (uint16_t)(id - 129u + 1015u)); + } + uint8_t player = win16_read_u8(win16_dgroup_pointer(0x07d1)); + int32_t accumulated = dgroup_i32((uint16_t)(0x098e + player * 4u)); + uint8_t multiplier = win16_read_u8(win16_dgroup_pointer( + (uint16_t)(0x09a1 + player))); + tdkpin_draw_score_from_caller_frame( + caller_bp, + (uint16_t)borland_multiply_i32(accumulated, multiplier), + (uint16_t)((uint32_t)borland_multiply_i32( + accumulated, multiplier) >> 16)); + } else if (id == 148) { + uint8_t player = win16_read_u8(win16_dgroup_pointer(0x07d1)); + win16_write_u8( + win16_far_add_offset( + window, (uint16_t)(player * 0x14u + 0x047b)), 1); + tdkpin_restore_record_or_item_a(caller_bp, 1020); + } + write_i32(window, 0x0bca, 0); + if (ball_count == 1) { + win16_write_u16(live, 0x43, id == 148 ? 2 : 99); + if (win16_read_u8(win16_dgroup_pointer(0x07c6)) == 0) { + win16_write_u8(win16_far_add_offset(window, 0x0be2), 1); + } else { + tdkpin_finish_ball_or_advance_player(caller_bp); + } + } else { + win16_write_u8(win16_far_add_offset(window, 0x0be1), 1); + win16_write_u8( + win16_far_add_offset( + record_pointer((uint16_t)(ball + 173u)), 0x34), + 0); + win16_write_u16(live, 0x43, 2); + } + return false; + } + + if (surface_distance > -11000 && contact == ball) { + win16_write_u16(live, 0x43, 0); + write_i32(window, 0x0bca, 0); + return false; + } + if (surface_distance > motion->speed || surface_distance < -11000 || + contact == 0) { + return false; + } + BorlandReal48 normal_x = borland_i32_to_real48( + subtract_wrap(record->point1_y_milli, previous_y)); + BorlandReal48 normal_y = borland_i32_to_real48( + subtract_wrap(previous_x, record->point1_x_milli)); + int32_t length = distance_milli( + borland_real48_round_to_i32(normal_x), + borland_real48_round_to_i32(normal_y)); + int32_t collision_velocity = normal_velocity_checked( + motion->velocity_x, + motion->velocity_y, + normal_x, + normal_y, + length); + if (collision_velocity >= 0 || + absolute_wrap(collision_velocity) < absolute_wrap(surface_distance)) { + return false; + } + make_candidate( + candidate, + id, + record, + normal_x, + normal_y, + collision_velocity, + surface_distance); + return true; +} + +static void handle_trigger_record( + TdkpinCollisionRecord *record, + uint16_t id, + uint16_t ball, + uint16_t caller_bp, + Win16FarPtr window, + int32_t ball_x, + int32_t ball_y, + BallMotion *motion) +{ + if (win16_read_u8(win16_dgroup_pointer(0x07c6)) != 0) { + return; + } + win16_write_u8(win16_dgroup_pointer(0x0875), 0); + int32_t radius = borland_real48_round_to_i32(record->radius_milli); + if (radius <= 0) { + if ((uint8_t)tdkpin_receiver_point_in_bounds( + caller_bp, + record->point2_y_milli, + record->point2_x_milli, + record->point1_y_milli, + record->point1_x_milli) != 0 && + (id == 153 || id == 154 || id == 6)) { + motion->velocity_x = scale_real48( + motion->velocity_x, g_real48_point_nine); + BorlandReal48 random_component = borland_real48_multiply( + borland_random_real48_registers(), g_real48_point_three); + motion->velocity_y = negate_wrap(scale_real48( + read_i32(window, 0x56), + borland_real48_subtract(g_real48_one, random_component))); + write_dgroup_i32( + 0x07db, add_wrap(ball_x, motion->velocity_x)); + write_dgroup_i32( + 0x07df, add_wrap(ball_y, motion->velocity_y)); + if ((uint8_t)tdkpin_ball_in_bounds( + 0, + record->point2_y_milli, + record->point2_x_milli, + record->point1_y_milli, + record->point1_x_milli) == 0) { + win16_write_u8( + win16_far_add_offset(record_pointer(id), 0x34), 0); + } + tdkpin_restore_record_b(caller_bp, id); + } + return; + } + + int32_t current_distance = absolute_wrap(distance_milli( + subtract_wrap(record->point1_x_milli, ball_x), + subtract_wrap(record->point1_y_milli, ball_y))); + int32_t predicted_distance = absolute_wrap(distance_milli( + subtract_wrap(record->point1_x_milli, dgroup_i32(0x07db)), + subtract_wrap(record->point1_y_milli, dgroup_i32(0x07df)))); + Win16FarPtr live = record_pointer(id); + if (predicted_distance <= radius) { + uint16_t flags = win16_read_u16(win16_far_add_offset(live, 0x41)); + if ((flags & 0x4000u) == 0) { + flags = (uint16_t)(flags | 0x4000u); + win16_write_u16(live, 0x41, flags); + tdkpin_play_sound_if_not_tilted(4); + uint8_t player = win16_read_u8(win16_dgroup_pointer(0x07d1)); + uint8_t score_factor = win16_read_u8(win16_dgroup_pointer( + (uint16_t)(0x081a + player))); + int32_t score = (int32_t)((uint32_t)record->score_low | + ((uint32_t)record->score_high << 16)); + tdkpin_add_score_from_caller_frame( + caller_bp, borland_multiply_i32(score_factor, score)); + if (id == 149) { + win16_write_u8(win16_far_add_offset(live, 0x34), 0); + win16_write_u8( + win16_far_add_offset( + window, (uint16_t)(player * 0x00afu + id + 0x61u)), + 0); + tdkpin_restore_record_b(caller_bp, id); + tdkpin_apply_player_sprite_effect(caller_bp, ball); + HWND16 handle = win16_read_u16(win16_far_add_offset(window, 4)); + HDC16 dc = GetDC16(handle); + win16_write_u16( + win16_dgroup_pointer((uint16_t)(0x09a4 + player * 2u)), + 0, + 0); + tdkpin_composite_player_sprite(0, dc); + tdkpin_present_background_region(123, 42, 79, 55, dc); + (void)ReleaseDC16(handle, dc); + } + tdkpin_handle_collision_events(caller_bp, flags, id); + static const BorlandReal48 random_span = + {{0x7d,0x71,0x3d,0x0a,0xd7,0x23}}; + static const BorlandReal48 random_offset = + {{0x81,0x71,0x3d,0x0a,0xd7,0x03}}; + motion->velocity_x = scale_real48( + motion->velocity_x, + borland_real48_subtract( + random_offset, + borland_real48_multiply( + borland_random_real48_registers(), random_span))); + motion->velocity_y = scale_real48( + motion->velocity_y, + borland_real48_subtract( + random_offset, + borland_real48_multiply( + borland_random_real48_registers(), random_span))); + } + } else { + win16_write_u16( + live, + 0x41, + (uint16_t)(win16_read_u16(win16_far_add_offset(live, 0x41)) & + 0xbfffu)); + } + (void)current_distance; +} + +static bool scan_collision_records( + uint16_t caller_bp, + Win16FarPtr window, + uint16_t ball, + uint16_t ball_count, + int32_t previous_x, + int32_t previous_y, + int32_t predicted_x, + int32_t predicted_y, + uint16_t layer, + BallMotion *motion, + PhysicsCollisionCandidate candidates[MAX_RECORDS + 1], + uint16_t *candidate_count) +{ + int32_t closest = 999999; + (void)previous_x; + (void)previous_y; + (void)predicted_x; + (void)predicted_y; + for (uint16_t id = 1; id <= MAX_RECORDS; id++) { + TdkpinCollisionRecord record; + load_record(id, &record); + if ((record.layer_mask & layer) == 0 || record.active != 1 || + !broadphase_contains_predicted_ball(&record, caller_bp)) { + continue; + } + PhysicsCollisionCandidate candidate; + bool detected = false; + int32_t record_previous_x = read_i32(window, 0x0bba); + int32_t record_previous_y = read_i32(window, 0x0bbe); + int32_t record_predicted_x = dgroup_i32(0x07db); + int32_t record_predicted_y = dgroup_i32(0x07df); + if (record.type == 1) { + detected = detect_circle_collision( + &record, + id, + ball, + record_previous_x, + record_previous_y, + record_predicted_x, + record_predicted_y, + motion, + &candidate); + } else if (record.type == 2) { + detected = detect_segment_collision( + &record, + id, + record_previous_x, + record_previous_y, + record_predicted_x, + record_predicted_y, + motion, + &candidate); + } else if (record.type == 3) { + detected = handle_capture_record( + &record, + id, + ball, + ball_count, + caller_bp, + window, + record_previous_x, + record_previous_y, + dgroup_i32(0x07d3), + dgroup_i32(0x07d7), + motion, + &candidate); + } else if (record.type == 4) { + handle_trigger_record( + &record, + id, + ball, + caller_bp, + window, + dgroup_i32(0x07d3), + dgroup_i32(0x07d7), + motion); + } + if (detected && candidate.surface_distance <= closest) { + closest = candidate.surface_distance; + (*candidate_count)++; + candidates[*candidate_count] = candidate; + write_i32(window, 0x0bca, 0); + } + } + return *candidate_count != 0; +} + +static int32_t candidate_normal_length( + const PhysicsCollisionCandidate *candidate) +{ + return distance_milli( + borland_real48_round_to_i32(candidate->normal_x), + borland_real48_round_to_i32(candidate->normal_y)); +} + +static bool transfer_ball_collision_impulse( + const PhysicsCollisionCandidate *candidate, + int32_t normal_length) +{ + if (candidate->record_id != 174 && candidate->record_id != 175) { + return false; + } + uint16_t slot = (uint16_t)(candidate->record_id - 174u); + if (dgroup_i32((uint16_t)(0x0803 + slot * 4u)) > 0) { + return false; + } + int32_t delta_x = borland_real48_round_to_i32(borland_real48_divide( + borland_real48_multiply( + borland_i32_to_real48(candidate->normal_velocity), + candidate->normal_y), + borland_i32_to_real48(normal_length))); + int32_t delta_y = borland_real48_round_to_i32(borland_real48_divide( + borland_real48_multiply( + borland_i32_to_real48(candidate->normal_velocity), + candidate->normal_x), + borland_i32_to_real48(normal_length))); + write_dgroup_i32( + (uint16_t)(0x07f3 + slot * 4u), + add_wrap(dgroup_i32((uint16_t)(0x07f3 + slot * 4u)), delta_x)); + write_dgroup_i32( + (uint16_t)(0x07fb + slot * 4u), + subtract_wrap(dgroup_i32((uint16_t)(0x07fb + slot * 4u)), delta_y)); + return true; +} + +static void apply_collision_response( + uint16_t caller_bp, + Win16FarPtr window, + uint16_t ball, + uint16_t ball_count, + PhysicsCollisionCandidate *candidate, + BallMotion *motion) +{ + if (candidate->flags != 0) { + tdkpin_handle_collision_events( + caller_bp, candidate->flags, candidate->record_id); + } + if (candidate->score != 0 && + borland_real48_compare( + candidate->response_kick, + (BorlandReal48){{0,0,0,0,0,0}}) == 0) { + tdkpin_add_score_from_caller_frame(caller_bp, candidate->score); + } + int32_t length = candidate_normal_length(candidate); + int32_t projection = normal_velocity_unchecked( + motion->velocity_x, + motion->velocity_y, + candidate->normal_x, + candidate->normal_y, + length); + + BorlandReal48 spin_delta = borland_real48_multiply( + borland_real48_multiply( + borland_i32_to_real48(projection), g_real48_point_zero_two), + candidate->response_tangent); + spin_delta = borland_real48_multiply( + borland_i32_to_real48(absolute_wrap(candidate->normal_velocity)), + spin_delta); + if (projection < 0) { + spin_delta = negate_real48(spin_delta); + } + BorlandReal48 discarded = borland_real48_divide( + borland_real48_sqrt(borland_real48_multiply( + absolute_real48(spin_delta), g_real48_twenty)), + borland_i32_to_real48(motion->speed)); + (void)discarded; + discarded = (BorlandReal48){{0,0,0,0,0,0}}; + + projection = borland_real48_round_to_i32(borland_real48_subtract( + borland_real48_subtract( + borland_real48_multiply(motion->spin, g_real48_point_four), + borland_real48_divide( + borland_real48_multiply( + borland_i32_to_real48(absolute_wrap(projection)), + discarded), + borland_i32_to_real48(motion->speed))), + candidate->response_tangent)); + motion->spin = borland_real48_add( + borland_real48_multiply(motion->spin, g_real48_point_six), + spin_delta); + + if (transfer_ball_collision_impulse(candidate, length)) { + candidate->normal_velocity = subtract_wrap( + candidate->normal_velocity, 1000); + } + int32_t impulse = borland_real48_round_to_i32(borland_real48_multiply( + borland_i32_to_real48(candidate->normal_velocity), + borland_real48_add(g_real48_one, candidate->response_normal))); + if (win16_read_u8(win16_dgroup_pointer(0x07c6)) == 0 && + borland_real48_compare( + candidate->response_auxiliary, + (BorlandReal48){{0,0,0,0,0,0}}) < 0) { + int32_t threshold = scale_real48( + read_i32(window, 0x56), candidate->response_auxiliary); + if (threshold > candidate->normal_velocity) { + if (candidate->score != 0) { + tdkpin_add_score_from_caller_frame(caller_bp, candidate->score); + } else { + tdkpin_play_sound_if_not_tilted(19); + } + impulse = subtract_wrap( + impulse, + scale_real48(read_i32(window, 0x56), candidate->response_kick)); + } + } + + int32_t delta_velocity_x = borland_real48_round_to_i32( + borland_real48_divide( + borland_real48_subtract( + borland_real48_multiply( + borland_i32_to_real48(projection), candidate->normal_x), + borland_real48_multiply( + borland_i32_to_real48(impulse), candidate->normal_y)), + borland_i32_to_real48(length))); + int32_t delta_velocity_y = borland_real48_round_to_i32( + borland_real48_divide( + borland_real48_add( + borland_real48_multiply( + borland_i32_to_real48(impulse), candidate->normal_x), + borland_real48_multiply( + borland_i32_to_real48(projection), candidate->normal_y)), + borland_i32_to_real48(length))); + motion->velocity_x = add_wrap(motion->velocity_x, delta_velocity_x); + motion->velocity_y = add_wrap(motion->velocity_y, delta_velocity_y); + + if (candidate->record_id == 25) { + if (motion->speed < 1000) { + win16_write_u8(win16_far_add_offset(window, 0x0bdd), 0); + motion->velocity_y = 0; + } + motion->velocity_x = 0; + } else if (candidate->record_id == 2) { + if (ball_count < 2) { + tdkpin_finish_ball_or_advance_player(caller_bp); + } else { + win16_write_u8( + win16_far_add_offset( + record_pointer((uint16_t)(ball + 173u)), 0x34), + 0); + win16_write_u8(win16_dgroup_pointer(0x0874), 0); + } + } +} + +static bool predicted_outside_board(int32_t x, int32_t y) +{ + return x <= 0 || x > 340000 || y <= 0 || y > 460000; +} + +static void integrate_one_ball( + uint16_t caller_bp, + Win16FarPtr window, + uint16_t ball, + uint16_t ball_count, + uint16_t substeps) +{ + int32_t previous_x = dgroup_i32(0x07d3); + int32_t previous_y = dgroup_i32(0x07d7); + write_i32(window, 0x0bc2, previous_x); + write_i32(window, 0x0bc6, previous_y); + if (substeps == 0) { + return; + } + + for (uint16_t step = 1; step <= substeps; step++) { + BallMotion motion = { + .velocity_x = read_i32(window, 0x0baa), + .velocity_y = add_wrap( + read_i32(window, 0x0bae), read_i32(window, 0x5a)), + .spin = read_real48(window, 0x0bce), + .speed = 0, + }; + motion.speed = clamp_motion_speed( + window, &motion.velocity_x, &motion.velocity_y); + write_i32(window, 0x0baa, motion.velocity_x); + write_i32(window, 0x0bae, motion.velocity_y); + + previous_x = dgroup_i32(0x07d3); + previous_y = dgroup_i32(0x07d7); + write_i32(window, 0x0bba, previous_x); + write_i32(window, 0x0bbe, previous_y); + int32_t predicted_x = add_wrap(previous_x, motion.velocity_x); + int32_t predicted_y = add_wrap(previous_y, motion.velocity_y); + write_dgroup_i32(0x07db, predicted_x); + write_dgroup_i32(0x07df, predicted_y); + + if (predicted_outside_board(predicted_x, predicted_y)) { + if (ball_count < 2) { + tdkpin_finish_ball_or_advance_player(caller_bp); + } else { + win16_write_u8( + win16_far_add_offset( + record_pointer((uint16_t)(ball + 173u)), 0x34), + 0); + win16_write_u8(win16_dgroup_pointer(0x0874), 0); + } + } + uint16_t layer = dgroup_i32(0x07d7) < 250000 ? 1 : 2; + PhysicsCollisionCandidate candidates[MAX_RECORDS + 1]; + uint16_t candidate_count = 0; + bool collided = scan_collision_records( + caller_bp, + window, + ball, + ball_count, + previous_x, + previous_y, + predicted_x, + predicted_y, + layer, + &motion, + candidates, + &candidate_count); + if (collided) { + apply_collision_response( + caller_bp, + window, + ball, + ball_count, + &candidates[1], + &motion); + } + + if (win16_read_u8(win16_far_add_offset(window, 0x0bdd)) != 0) { + write_real48(window, 0x0bce, motion.spin); + write_i32(window, 0x0baa, motion.velocity_x); + write_i32(window, 0x0bae, motion.velocity_y); + motion.speed = clamp_motion_speed( + window, &motion.velocity_x, &motion.velocity_y); + write_i32(window, 0x0baa, motion.velocity_x); + write_i32(window, 0x0bae, motion.velocity_y); + write_dgroup_i32( + 0x07d3, add_wrap(dgroup_i32(0x07d3), motion.velocity_x)); + write_dgroup_i32( + 0x07d7, add_wrap(dgroup_i32(0x07d7), motion.velocity_y)); + tdkpin_update_dynamic_ball_record(caller_bp, ball); + } + if (collided || + win16_read_u8(win16_far_add_offset(window, 0x0be2)) == 1 || + win16_read_u8(win16_far_add_offset(window, 0x0be1)) == 1) { + break; + } + } +} + +void tdkpin_simulate_ball_and_dispatch_collision(uint16_t caller_bp) +{ + Win16FarPtr window = caller_receiver(caller_bp); + win16_write_u32( + window, + 0x4d, + win16_read_u32(win16_far_add_offset(window, 0x4d)) + 1u); + uint16_t substeps = win16_read_u16(win16_dgroup_pointer(0x0871)); + uint16_t ball_count = win16_read_u8(win16_far_add_offset(window, 0x61)); + for (uint16_t ball = 1; ball <= ball_count; ball++) { + if (win16_read_u8(win16_far_add_offset(window, 0x61)) > 1) { + tdkpin_load_ball_slot(caller_bp, (uint16_t)(ball - 1u)); + } + integrate_one_ball(caller_bp, window, ball, ball_count, substeps); + if (win16_read_u8(win16_far_add_offset(window, 0x0bdd)) != 0 && + win16_read_u8(win16_far_add_offset(window, 0x0be2)) == 0) { + tdkpin_render_ball_swept_region(caller_bp); + } + if (win16_read_u8(win16_far_add_offset(window, 0x61)) > 1) { + tdkpin_save_ball_slot(caller_bp, (uint16_t)(ball - 1u)); + } + } +} diff --git a/original/reconstructed/tdkpin_physics.h b/original/reconstructed/tdkpin_physics.h new file mode 100644 index 0000000..323644c --- /dev/null +++ b/original/reconstructed/tdkpin_physics.h @@ -0,0 +1,9 @@ +#ifndef TDKPIN_PHYSICS_H +#define TDKPIN_PHYSICS_H + +#include "tdkpin_segmented.h" + +void tdkpin_simulate_ball_and_dispatch_collision( + uint16_t caller_bp); /* 1000:c79c */ + +#endif diff --git a/original/reconstructed/tdkpin_player_state.c b/original/reconstructed/tdkpin_player_state.c new file mode 100644 index 0000000..671e166 --- /dev/null +++ b/original/reconstructed/tdkpin_player_state.c @@ -0,0 +1,178 @@ +/* Player initialization and multi-player redraw paths from TDKPIN Code1. */ + +#include "tdkpin_player_state.h" + +#include "tdkpin_arithmetic.h" + +static Win16FarPtr caller_receiver(uint16_t caller_bp) +{ + uint16_t offset = win16_read_stack_u16((uint16_t)(caller_bp + 6)); + uint16_t selector = win16_read_stack_u16((uint16_t)(caller_bp + 8)); + return win16_make_far_pointer(selector, offset); +} + +/* + * 1000:a72c -- initialize collision mirrors and all configured player state. + * The collision field at record +43 is copied into four receiver rows even + * when fewer than four players are configured, exactly as the binary does. + */ +void tdkpin_initialize_player_state(uint16_t caller_bp) +{ + Win16FarPtr receiver = caller_receiver(caller_bp); + for (uint16_t record_id = 1; record_id <= 175; record_id++) { + tdkpin_refresh_collision_record(caller_bp, record_id); + uint16_t mirrored = win16_read_u16(win16_dgroup_pointer((uint16_t)( + 0x095b + record_id * 0x53u + 0x43u))); + for (uint16_t player = 1; player <= 4; player++) { + win16_write_u16( + receiver, + (uint16_t)(0x036c + player * 0x015eu + record_id * 2u), + mirrored); + } + } + for (uint16_t item = 1; item <= 5; item++) { + tdkpin_restore_record_b(caller_bp, (uint16_t)(1000 + item)); + } + tdkpin_draw_score_from_caller_frame(caller_bp, 0, 0); + win16_write_u8(win16_dgroup_pointer(0x0874), 0); + + for (uint8_t player = 1; player <= 4; player++) { + if (player <= g_player_count) { + g_current_player = player; + win16_write_u32( + win16_dgroup_pointer((uint16_t)(0x097e + player * 4u)), + 0, + 0); + win16_write_u32( + win16_dgroup_pointer((uint16_t)(0x098e + player * 4u)), + 0, + 0); + win16_write_u8( + win16_dgroup_pointer((uint16_t)(0x09a1 + player)), 1); + win16_write_u16( + win16_dgroup_pointer((uint16_t)(0x09a4 + player * 2u)), + 0, + 0); + tdkpin_add_score_from_caller_frame(caller_bp, 0); + win16_write_u8( + win16_dgroup_pointer((uint16_t)(0x0816 + player)), 1); + win16_write_u16( + win16_dgroup_pointer((uint16_t)(0x081f + player * 2u)), + 0, + player < 2 ? 2 : 3); + tdkpin_refresh_player_progress_markers(caller_bp); + win16_write_u32( + win16_dgroup_pointer((uint16_t)(0x0835 + player * 4u)), + 0, + 1); + win16_write_u8( + win16_dgroup_pointer((uint16_t)(0x081a + player)), 1); + for (uint16_t item = 1; item <= 20; item++) { + win16_write_u8( + win16_far_add_offset(receiver, (uint16_t)( + 0x0467 + player * 0x14u + item)), + 0); + } + } + } + + g_current_player = 1; + win16_write_u8(win16_dgroup_pointer(0x07d2), 0); + for (uint16_t item = 1; item <= 20; item++) { + tdkpin_refresh_player_item(caller_bp, item); + } +} + +/* 1000:acc2 -- redraw each configured player and emphasize the active row. */ +void tdkpin_redraw_all_players(uint16_t caller_bp) +{ + Win16FarPtr receiver = caller_receiver(caller_bp); + HWND16 window = win16_read_u16(win16_far_add_offset(receiver, 4)); + HDC16 dc = GetDC16(window); + uint8_t saved_player = g_current_player; + uint8_t count = g_player_count; + for (uint8_t player = 1; player <= count; player++) { + INT16 row_y = (INT16)((uint16_t)(player - 1u) * 44u + 276u); + tdkpin_restore_background_region_a(31, 139, row_y, 472, dc); + tdkpin_present_background_region(31, 139, row_y, 472, dc); + g_current_player = player; + INT16 marker_y = (INT16)((uint16_t)(player - 1u) * 44u + 280u); + if (player == saved_player) { + tdkpin_add_score_from_caller_frame(caller_bp, 0); + uint32_t secondary = win16_read_u32( + win16_dgroup_pointer((uint16_t)(0x098e + player * 4u))); + uint8_t multiplier = win16_read_u8( + win16_dgroup_pointer((uint16_t)(0x09a1 + player))); + int32_t shown = borland_multiply_i32( + (int32_t)secondary, multiplier); + tdkpin_draw_score_from_caller_frame( + caller_bp, (uint16_t)shown, (uint16_t)((uint32_t)shown >> 16)); + uint16_t sprite = win16_read_u16( + win16_dgroup_pointer((uint16_t)(0x09a4 + player * 2u))); + tdkpin_composite_player_sprite(sprite, dc); + tdkpin_present_background_region(123, 42, 79, 55, dc); + tdkpin_restore_background_region_a(11, 11, marker_y, 372, dc); + } else { + tdkpin_add_score_from_caller_frame(caller_bp, -1); + tdkpin_restore_background_region_b(11, 11, marker_y, 372, dc); + } + tdkpin_present_background_region(11, 11, marker_y, 372, dc); + } + g_current_player = saved_player; + (void)ReleaseDC16(window, dc); +} + +static Win16FarPtr active_secondary_score(void) +{ + return win16_dgroup_pointer((uint16_t)( + 0x098e + (uint16_t)g_current_player * 4u)); +} + +static uint8_t active_score_multiplier(void) +{ + return win16_read_u8(win16_dgroup_pointer((uint16_t)( + 0x09a1 + (uint16_t)g_current_player))); +} + +static void draw_active_secondary_score(uint16_t caller_bp) +{ + int32_t shown = borland_multiply_i32( + (int32_t)win16_read_u32(active_secondary_score()), + active_score_multiplier()); + tdkpin_draw_score_from_caller_frame( + caller_bp, (uint16_t)shown, (uint16_t)((uint32_t)shown >> 16)); +} + +/* 1000:c4e1 -- apply the effect selected by the active player's sprite index. */ +void tdkpin_apply_player_sprite_effect( + uint16_t caller_bp, int16_t argument) +{ + uint16_t effect = win16_read_u16(win16_dgroup_pointer((uint16_t)( + 0x09a4 + (uint16_t)g_current_player * 2u))); + static const uint32_t additions[5] = { + 10000u, 20000u, 50000u, 100000u, 200000u}; + if (effect >= 1 && effect <= 5) { + Win16FarPtr secondary = active_secondary_score(); + win16_write_u32( + secondary, + 0, + win16_read_u32(secondary) + additions[effect - 1u]); + draw_active_secondary_score(caller_bp); + } else if (effect == 6) { + int32_t transfer = borland_multiply_i32( + (int32_t)win16_read_u32(active_secondary_score()), + active_score_multiplier()); + tdkpin_add_score_from_caller_frame(caller_bp, transfer); + win16_write_u32(active_secondary_score(), 0, 0); + tdkpin_draw_score_from_caller_frame(caller_bp, 0, 0); + } else if (effect == 7) { + uint16_t required = win16_read_u16( + win16_dgroup_pointer(0x399a)); + if (required != 0 && + (argument < 0 || required != (uint16_t)argument)) { + Win16FarPtr receiver = caller_receiver(caller_bp); + win16_write_u8(win16_far_add_offset(receiver, 0x0be0), 1); + win16_write_u8(win16_dgroup_pointer(0x0874), 1); + } + } +} diff --git a/original/reconstructed/tdkpin_player_state.h b/original/reconstructed/tdkpin_player_state.h new file mode 100644 index 0000000..b4696a0 --- /dev/null +++ b/original/reconstructed/tdkpin_player_state.h @@ -0,0 +1,13 @@ +#ifndef TDKPIN_PLAYER_STATE_H +#define TDKPIN_PLAYER_STATE_H + +#include "tdkpin_gameplay_helpers.h" + +void tdkpin_initialize_player_state( + uint16_t caller_bp); /* 1000:a72c */ +void tdkpin_redraw_all_players( + uint16_t caller_bp); /* 1000:acc2 */ +void tdkpin_apply_player_sprite_effect( + uint16_t caller_bp, int16_t argument); /* 1000:c4e1 */ + +#endif diff --git a/original/reconstructed/tdkpin_program_entry.c b/original/reconstructed/tdkpin_program_entry.c new file mode 100644 index 0000000..9b67773 --- /dev/null +++ b/original/reconstructed/tdkpin_program_entry.c @@ -0,0 +1,76 @@ +/* Complete NE program entry sequence for TDKPIN.EXE. */ + +#include "tdkpin_program_entry.h" + +#include "tdkpin_application.h" +#include "tdkpin_borland_runtime.h" +#include "tdkpin_initialization.h" +#include "tdkpin_multimedia.h" +#include "tdkpin_stack.h" +#include "tdkpin_tpwincrt_lifecycle.h" + +enum { + DGROUP_APPLICATION_VMT = 0x0024, + DGROUP_VERSION_ERROR_TEXT = 0x0396, + DGROUP_APPLICATION_TITLE = 0x03c8, + DGROUP_APPLICATION_NAME = 0x03e1, + DGROUP_APPLICATION_OBJECT = 0x0748, + APPLICATION_RUN_SLOT = 0x1c, + APPLICATION_DESTRUCTOR_SLOT = 0x08, + WIN16_MB_ICONHAND = 0x0010, +}; + +static bool windows_version_is_supported(uint32_t version) +{ + uint8_t major = (uint8_t)version; + uint8_t minor = (uint8_t)(version >> 8); + return major > 3 || (major == 3 && minor >= 10); +} + +/* + * 1000:fd85 -- process entry named by the NE header. InitTask supplies the + * register contract consumed by 1020:0002. Unit initializers run in the exact + * image order before the independent Windows 3.10 gate. The application Run + * and destructor calls remain indirect through VMT +1c and +08 respectively. + * Both the unsupported-version path and normal application return Halt(0). + */ +_Noreturn void tdkpin_ne_program_entry(void) +{ + BorlandWin16StartupRegisters registers = InitTask16(); + borland_initialize_win16_runtime(®isters); + tdkpin_initialize_stack_guard(); + tpwincrt_initialize_runtime_unit(); + multimedia_initialize_runtime_unit(); + tdkpin_initialize_unit_ordinal_91(); + tdkpin_initialize_unit_ordinal_86(); + tdkpin_initialize_unit_ordinal_72(); + + g_tdkpin_windows_version = GetVersion16(); + if (!windows_version_is_supported(g_tdkpin_windows_version)) { + (void)win16_call_message_box_far( + g_win16_message_box, + 0, + win16_dgroup_pointer(DGROUP_VERSION_ERROR_TEXT), + win16_dgroup_pointer(DGROUP_APPLICATION_TITLE), + WIN16_MB_ICONHAND); + } else { + Win16FarPtr application = + win16_dgroup_pointer(DGROUP_APPLICATION_OBJECT); + (void)object_windows_application_construct( + application, + DGROUP_APPLICATION_VMT, + win16_dgroup_pointer(DGROUP_APPLICATION_NAME)); + + uint16_t vmt_offset = win16_read_u16(application); + Win16FarPtr vmt = win16_dgroup_pointer(vmt_offset); + win16_call_object_method( + win16_read_far_pointer(vmt, APPLICATION_RUN_SLOT), + application); + win16_call_object_destructor( + win16_read_far_pointer(vmt, APPLICATION_DESTRUCTOR_SLOT), + application, + 0); + } + + borland_runtime_exit(0); +} diff --git a/original/reconstructed/tdkpin_program_entry.h b/original/reconstructed/tdkpin_program_entry.h new file mode 100644 index 0000000..72a644a --- /dev/null +++ b/original/reconstructed/tdkpin_program_entry.h @@ -0,0 +1,10 @@ +#ifndef TDKPIN_PROGRAM_ENTRY_H +#define TDKPIN_PROGRAM_ENTRY_H + +#include "tdkpin_borland_startup.h" + +_Noreturn void tdkpin_ne_program_entry(void); /* 1000:fd85 */ + +extern uint32_t g_tdkpin_windows_version; /* 1028:07bf..07c2 */ + +#endif diff --git a/original/reconstructed/tdkpin_random.c b/original/reconstructed/tdkpin_random.c new file mode 100644 index 0000000..d453653 --- /dev/null +++ b/original/reconstructed/tdkpin_random.c @@ -0,0 +1,61 @@ +/* Borland Win16 random-number support reconstructed from Code5. */ + +#include "tdkpin_random.h" + +enum { BORLAND_RANDOM_MULTIPLIER = 0x08088405u }; + +uint32_t borland_next_random(void) +{ + g_borland_random_seed = + g_borland_random_seed * BORLAND_RANDOM_MULTIPLIER + 1u; + return g_borland_random_seed; +} + +uint16_t borland_random_below(uint16_t upper_bound) +{ + uint32_t random = borland_next_random(); + return (uint16_t)(((uint64_t)random * upper_bound) >> 32); +} + +BorlandReal48 borland_random_real48_registers(void) +{ + uint32_t random = borland_next_random(); + if (random == 0) { + return (BorlandReal48){{0, 0, 0, 0, 0, 0}}; + } + uint8_t exponent = 0x80; + while ((random & 0x80000000u) == 0) { + random <<= 1; + exponent--; + } + random &= 0x7fffffffu; + return (BorlandReal48){{ + exponent, + 0, + (uint8_t)random, + (uint8_t)(random >> 8), + (uint8_t)(random >> 16), + (uint8_t)(random >> 24), + }}; +} + +int8_t borland_random_exponent(void) +{ + return (int8_t)borland_random_real48_registers().bytes[0]; +} + +/* + * 1020:14de — x87 Random: reinterpret the signed FILD of RandSeed as unsigned + * by adding exactly 2^31, then FSCALE by -32. Binary64 represents every + * uint32_t/2^32 result exactly, so this host spelling loses no target bits. + */ +double borland_random_unit_interval(void) +{ + uint32_t random = borland_next_random(); + return (double)random / 4294967296.0; +} + +void borland_seed_random_from_dos_time(void) +{ + g_borland_random_seed = win16_dos_time_words(); +} diff --git a/original/reconstructed/tdkpin_random.h b/original/reconstructed/tdkpin_random.h new file mode 100644 index 0000000..53c3055 --- /dev/null +++ b/original/reconstructed/tdkpin_random.h @@ -0,0 +1,16 @@ +#ifndef TDKPIN_RANDOM_H +#define TDKPIN_RANDOM_H + +#include "tdkpin_segmented.h" +#include "tdkpin_real48.h" + +extern uint32_t g_borland_random_seed; /* 1028:0720/0722 */ + +uint32_t borland_next_random(void); /* 1020:1501 */ +uint16_t borland_random_below(uint16_t upper_bound); /* 1020:14a4 */ +BorlandReal48 borland_random_real48_registers(void); /* 1020:14c1 */ +int8_t borland_random_exponent(void); /* 1020:14c1 */ +double borland_random_unit_interval(void); /* 1020:14de */ +void borland_seed_random_from_dos_time(void); /* 1020:1539 */ + +#endif diff --git a/original/reconstructed/tdkpin_real48.c b/original/reconstructed/tdkpin_real48.c new file mode 100644 index 0000000..138a6b6 --- /dev/null +++ b/original/reconstructed/tdkpin_real48.c @@ -0,0 +1,893 @@ +/* Bit-exact core conversions and comparisons for Borland's software Real48. */ + +#include "tdkpin_real48.h" + +#include "tdkpin_borland_runtime.h" + +#include + +enum { + REAL48_EXPONENT_BIAS = 129, + REAL48_EXPLICIT_FRACTION_BITS = 39, + REAL48_SIGN = 0x80, + BORLAND_RUNTIME_ERROR_DIVIDE_BY_ZERO = 200, + BORLAND_RUNTIME_ERROR_FLOAT_OVERFLOW = 205, + BORLAND_RUNTIME_ERROR_INVALID_FLOAT = 207, +}; + +/* Code5 1020:1418..1435 — ArcTan odd-series coefficients, highest first. */ +static const BorlandReal48 g_arctan_coefficients[5] = { + {{0x7d, 0xe8, 0xa2, 0x8b, 0x2e, 0xba}}, /* -1/11 */ + {{0x7d, 0x8e, 0xe3, 0x38, 0x8e, 0x63}}, /* +1/9 */ + {{0x7e, 0x49, 0x92, 0x24, 0x49, 0x92}}, /* -1/7 */ + {{0x7e, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, /* +1/5 */ + {{0x7f, 0xab, 0xaa, 0xaa, 0xaa, 0xaa}}, /* -1/3 */ +}; + +/* Code5 1020:13e8..1417 — ArcTan reduction thresholds and tan/angle pairs. */ +static const BorlandReal48 g_arctan_direct_limit = + {{0x7e, 0x4a, 0x8e, 0xe9, 0x6f, 0x0c}}; +static const BorlandReal48 g_arctan_tan_pi_over_8 = + {{0x7f, 0xe7, 0xcf, 0xcc, 0x13, 0x54}}; +static const BorlandReal48 g_arctan_tan_pi_over_12 = + {{0x7f, 0xf6, 0xf4, 0xa2, 0x30, 0x09}}; +static const BorlandReal48 g_pi_over_12 = + {{0x7f, 0x6a, 0xc1, 0x91, 0x0a, 0x06}}; +static const BorlandReal48 g_arctan_second_threshold = + {{0x80, 0xb5, 0x9e, 0x8a, 0x6f, 0x44}}; +static const BorlandReal48 g_arctan_tan_pi_over_6 = + {{0x80, 0x82, 0x2c, 0x3a, 0xcd, 0x13}}; +static const BorlandReal48 g_pi_over_6 = + {{0x80, 0x6a, 0xc1, 0x91, 0x0a, 0x06}}; +static const BorlandReal48 g_real48_one = + {{0x81, 0, 0, 0, 0, 0}}; +static const BorlandReal48 g_pi_over_4 = + {{0x80, 0x21, 0xa2, 0xda, 0x0f, 0x49}}; +static const BorlandReal48 g_pi_over_2 = + {{0x81, 0x21, 0xa2, 0xda, 0x0f, 0x49}}; + +/* Code5 1020:1240..1263 and constants used by Ln at 11bb. */ +static const BorlandReal48 g_ln_coefficients[6] = { + {{0x7d, 0x8a, 0x9d, 0xd8, 0x89, 0x1d}}, /* 1/13 */ + {{0x7d, 0xe9, 0xa2, 0x8b, 0x2e, 0x3a}}, /* 1/11 */ + {{0x7d, 0x8e, 0xe3, 0x38, 0x8e, 0x63}}, /* 1/9 */ + {{0x7e, 0x49, 0x92, 0x24, 0x49, 0x12}}, /* 1/7 */ + {{0x7e, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}, /* 1/5 */ + {{0x7f, 0xab, 0xaa, 0xaa, 0xaa, 0x2a}}, /* 1/3 */ +}; +static const BorlandReal48 g_sqrt_one_half = + {{0x80, 0xfb, 0x33, 0xf3, 0x04, 0x35}}; +static const BorlandReal48 g_half_ln_two = + {{0x7f, 0xd2, 0xf7, 0x17, 0x72, 0x31}}; +static const BorlandReal48 g_ln_two = + {{0x80, 0xd2, 0xf7, 0x17, 0x72, 0x31}}; + +/* Code5 1020:12d7..1306 — Exp polynomial, highest coefficient first. */ +static const BorlandReal48 g_exp_coefficients[8] = { + {{0x6d, 0x2e, 0x1d, 0x11, 0x60, 0x31}}, + {{0x70, 0x46, 0x2c, 0xfe, 0xe5, 0x7f}}, + {{0x74, 0x36, 0x7c, 0x89, 0x84, 0x21}}, + {{0x77, 0x53, 0x3c, 0xff, 0xc3, 0x2e}}, + {{0x7a, 0xd2, 0x7d, 0x5b, 0x95, 0x1d}}, + {{0x7c, 0x25, 0xb8, 0x46, 0x58, 0x63}}, + {{0x7e, 0x16, 0xfc, 0xef, 0xfd, 0x75}}, + {{0x80, 0xd2, 0xf7, 0x17, 0x72, 0x31}}, +}; +static const BorlandReal48 g_sqrt_two = + {{0x81, 0xfb, 0x33, 0xf3, 0x04, 0x35}}; + +/* Code5 1020:1191..11ba — Sin odd-series coefficients, highest first. */ +static const BorlandReal48 g_sin_coefficients[7] = { + {{0x58, 0x9d, 0x39, 0x9f, 0x3f, 0xd7}}, /* -1/15! */ + {{0x60, 0x43, 0x9d, 0x30, 0x92, 0x30}}, /* +1/13! */ + {{0x67, 0xaa, 0x3f, 0x28, 0x32, 0xd7}}, /* -1/11! */ + {{0x6e, 0xb6, 0x2a, 0x1d, 0xef, 0x38}}, /* +1/9! */ + {{0x74, 0x0d, 0xd0, 0x00, 0x0d, 0xd0}}, /* -1/7! */ + {{0x7a, 0x88, 0x88, 0x88, 0x88, 0x08}}, /* +1/5! */ + {{0x7e, 0xab, 0xaa, 0xaa, 0xaa, 0xaa}}, /* -1/3! */ +}; +static const BorlandReal48 g_two_pi = + {{0x83, 0x21, 0xa2, 0xda, 0x0f, 0x49}}; + +static uint8_t real48_exponent(BorlandReal48 value) +{ + return value.bytes[0]; +} + +static bool real48_negative(BorlandReal48 value) +{ + return (value.bytes[5] & REAL48_SIGN) != 0; +} + +static uint64_t real48_fraction(BorlandReal48 value) +{ + return (uint64_t)value.bytes[1] | + ((uint64_t)value.bytes[2] << 8) | + ((uint64_t)value.bytes[3] << 16) | + ((uint64_t)value.bytes[4] << 24) | + ((uint64_t)(value.bytes[5] & 0x7f) << 32); +} + +static uint64_t real48_significand(BorlandReal48 value) +{ + return (UINT64_C(1) << REAL48_EXPLICIT_FRACTION_BITS) | + real48_fraction(value); +} + +static BorlandReal48 make_real48( + uint8_t exponent, bool negative, uint64_t fraction) +{ + BorlandReal48 result = {{0, 0, 0, 0, 0, 0}}; + result.bytes[0] = exponent; + result.bytes[1] = (uint8_t)fraction; + result.bytes[2] = (uint8_t)(fraction >> 8); + result.bytes[3] = (uint8_t)(fraction >> 16); + result.bytes[4] = (uint8_t)(fraction >> 24); + result.bytes[5] = + (uint8_t)((fraction >> 32) | (negative ? REAL48_SIGN : 0)); + return result; +} + +static BorlandReal48Result real48_pack_internal( + uint64_t internal, int16_t exponent, bool negative) +{ + internal += UINT64_C(0x80); + if ((internal & (UINT64_C(1) << 48)) != 0) { + internal >>= 1; + exponent++; + } + if (exponent <= 0) { + return (BorlandReal48Result){ + borland_real48_zero_registers(), false, false}; + } + if (exponent > UINT8_MAX) { + return (BorlandReal48Result){ + borland_real48_zero_registers(), true, false}; + } + uint64_t significand = internal >> 8; + uint64_t fraction = significand - + (UINT64_C(1) << REAL48_EXPLICIT_FRACTION_BITS); + return (BorlandReal48Result){ + make_real48((uint8_t)exponent, negative, fraction), false, false}; +} + +static BorlandReal48Result real48_add_with_signs( + BorlandReal48 left, BorlandReal48 right, bool right_negative) +{ + uint8_t left_exponent = real48_exponent(left); + uint8_t right_exponent = real48_exponent(right); + if (right_exponent == 0) { + return (BorlandReal48Result){left, false, false}; + } + if (left_exponent == 0) { + right.bytes[5] = (uint8_t)( + (right.bytes[5] & 0x7f) | + (right_negative ? REAL48_SIGN : 0)); + return (BorlandReal48Result){right, false, false}; + } + + BorlandReal48 high = left; + BorlandReal48 low = right; + bool high_negative = real48_negative(left); + bool low_negative = right_negative; + if (right_exponent > left_exponent) { + high = right; + low = left; + uint8_t temporary_exponent = left_exponent; + left_exponent = right_exponent; + right_exponent = temporary_exponent; + high_negative = right_negative; + low_negative = real48_negative(left); + } + + uint8_t difference = (uint8_t)(left_exponent - right_exponent); + if (difference >= 41) { + high.bytes[5] = (uint8_t)( + (high.bytes[5] & 0x7f) | + (high_negative ? REAL48_SIGN : 0)); + return (BorlandReal48Result){high, false, false}; + } + + uint64_t high_internal = real48_significand(high) << 8; + uint64_t low_internal = + (real48_significand(low) << 8) >> difference; + uint64_t magnitude; + bool result_negative; + int16_t result_exponent = left_exponent; + if (high_negative == low_negative) { + magnitude = high_internal + low_internal; + result_negative = high_negative; + if ((magnitude & (UINT64_C(1) << 48)) != 0) { + magnitude >>= 1; + result_exponent++; + if (result_exponent > UINT8_MAX) { + return (BorlandReal48Result){ + borland_real48_zero_registers(), true, false}; + } + } + } else { + if (high_internal == low_internal) { + return (BorlandReal48Result){ + borland_real48_zero_registers(), false, false}; + } + if (high_internal > low_internal) { + magnitude = high_internal - low_internal; + result_negative = high_negative; + } else { + magnitude = low_internal - high_internal; + result_negative = low_negative; + } + while ((magnitude & (UINT64_C(1) << 47)) == 0) { + magnitude <<= 1; + result_exponent--; + if (result_exponent == 0) { + return (BorlandReal48Result){ + borland_real48_zero_registers(), false, false}; + } + } + } + return real48_pack_internal( + magnitude, result_exponent, result_negative); +} + +/* 1020:0cd4 — register-form software Real48 addition. */ +BorlandReal48Result borland_real48_add_registers( + BorlandReal48 left, BorlandReal48 right) +{ + return real48_add_with_signs(left, right, real48_negative(right)); +} + +/* 1020:0cd0 — toggle DI's sign bit, then enter the shared addition body. */ +BorlandReal48Result borland_real48_subtract_registers( + BorlandReal48 left, BorlandReal48 right) +{ + return real48_add_with_signs(left, right, !real48_negative(right)); +} + +typedef struct { + uint64_t low; + uint16_t high; +} Real48Product80; + +static Real48Product80 multiply_40_by_40(uint64_t left, uint64_t right) +{ + uint64_t low_product = + (uint64_t)(uint32_t)left * (uint32_t)right; + uint64_t cross = + (left >> 32) * (uint32_t)right + + (right >> 32) * (uint32_t)left; + uint64_t low = low_product + (cross << 32); + uint32_t high = (uint32_t)( + (left >> 32) * (right >> 32) + + (cross >> 32) + + (low < low_product)); + return (Real48Product80){low, (uint16_t)high}; +} + +/* 1020:0d97 — exact 40x40 product followed by Borland's eight guard bits. */ +BorlandReal48Result borland_real48_multiply_registers( + BorlandReal48 left, BorlandReal48 right) +{ + if (real48_exponent(left) == 0 || real48_exponent(right) == 0) { + return (BorlandReal48Result){ + borland_real48_zero_registers(), false, false}; + } + Real48Product80 product = multiply_40_by_40( + real48_significand(left), real48_significand(right)); + bool top_bit_79 = (product.high & 0x8000) != 0; + uint8_t shift = top_bit_79 ? 32 : 31; + uint64_t internal = + (product.low >> shift) | + ((uint64_t)product.high << (64 - shift)); + int16_t exponent = + (int16_t)real48_exponent(left) + real48_exponent(right) - + (top_bit_79 ? 128 : 129); + return real48_pack_internal( + internal, + exponent, + real48_negative(left) != real48_negative(right)); +} + +/* 1020:0e93 — shared underflow/zero result: AX=BX=DX=0. */ +BorlandReal48 borland_real48_zero_registers(void) +{ + return (BorlandReal48){{0, 0, 0, 0, 0, 0}}; +} + +/* 1020:0e9a — restoring division generating 40 result plus eight guard bits. */ +BorlandReal48Result borland_real48_divide_registers( + BorlandReal48 left, BorlandReal48 right) +{ + if (real48_exponent(right) == 0) { + return (BorlandReal48Result){ + borland_real48_zero_registers(), false, true}; + } + if (real48_exponent(left) == 0) { + return (BorlandReal48Result){ + borland_real48_zero_registers(), false, false}; + } + + uint64_t numerator = real48_significand(left); + uint64_t denominator = real48_significand(right); + int16_t exponent = + (int16_t)real48_exponent(left) - real48_exponent(right) + 129; + if (numerator < denominator) { + numerator <<= 1; + exponent--; + } + uint64_t internal = 0; + uint64_t remainder = numerator; + for (uint8_t bit = 0; bit < 48; bit++) { + bool quotient_bit = remainder >= denominator; + if (quotient_bit) { + remainder -= denominator; + } + internal = (internal << 1) | quotient_bit; + remainder <<= 1; + } + return real48_pack_internal( + internal, + exponent, + real48_negative(left) != real48_negative(right)); +} + +/* + * 1020:1031/103b/1045/104f — near arithmetic entries that save and restore + * CX:SI:DI around the corresponding core. C by-value operands express that + * register-preservation contract directly. + */ +BorlandReal48Result borland_real48_add_preserving_right( + BorlandReal48 left, BorlandReal48 right) +{ + return borland_real48_add_registers(left, right); +} + +BorlandReal48Result borland_real48_subtract_preserving_right( + BorlandReal48 left, BorlandReal48 right) +{ + return borland_real48_subtract_registers(left, right); +} + +BorlandReal48Result borland_real48_multiply_preserving_right( + BorlandReal48 left, BorlandReal48 right) +{ + return borland_real48_multiply_registers(left, right); +} + +BorlandReal48Result borland_real48_divide_preserving_right( + BorlandReal48 left, BorlandReal48 right) +{ + return borland_real48_divide_registers(left, right); +} + +/* 1020:1059 — Pascal Int: clear fractional significand bits toward zero. */ +BorlandReal48 borland_real48_integer_part(BorlandReal48 value) +{ + uint8_t exponent = real48_exponent(value); + if (exponent >= 168) { + return value; + } + if (exponent <= 128) { + return borland_real48_zero_registers(); + } + + uint8_t fractional_bits = (uint8_t)(168 - exponent); + uint64_t significand = real48_significand(value); + uint64_t mask = ~((UINT64_C(1) << fractional_bits) - 1); + uint64_t integer_significand = significand & mask; + uint64_t fraction = integer_significand - + (UINT64_C(1) << REAL48_EXPLICIT_FRACTION_BITS); + return make_real48(exponent, real48_negative(value), fraction); +} + +/* 1020:10aa — Pascal Frac: original minus Int(original). */ +BorlandReal48 borland_real48_fractional_part(BorlandReal48 value) +{ + return borland_real48_subtract_registers( + value, borland_real48_integer_part(value)) + .value; +} + +/* + * 1020:10be — Borland Sqrt Newton iteration. The initial exponent transform, + * retained input mantissa, divide/add/exponent-decrement step, and convergence + * test on the exponent of new-old follow the register routine exactly. + */ +BorlandReal48 borland_real48_sqrt(BorlandReal48 value) +{ + if (real48_exponent(value) == 0) { + return value; + } + if (real48_negative(value)) { + borland_runtime_error(BORLAND_RUNTIME_ERROR_INVALID_FLOAT); + } + + BorlandReal48 guess = value; + int8_t halved = (int8_t)(uint8_t)(real48_exponent(value) + 0x80); + halved >>= 1; + guess.bytes[0] = (uint8_t)((uint8_t)halved + 0x80); + uint8_t convergence_exponent = (uint8_t)(guess.bytes[0] - 0x14); + + while (true) { + BorlandReal48 quotient = + borland_real48_divide_preserving_right(value, guess).value; + BorlandReal48 next = + borland_real48_add_preserving_right(quotient, guess).value; + next.bytes[0]--; + BorlandReal48 difference = + borland_real48_subtract_registers(next, guess).value; + guess = next; + if (difference.bytes[0] < convergence_exponent) { + return guess; + } + } +} + +/* + * 1020:1455 — Horner evaluator used by the transcendental routines: + * result = 1 + x*(c[n-1] + x*(... + x*c[0])). The target multiplies once + * before advancing to each later coefficient, so table order is significant. + */ +BorlandReal48 borland_real48_polynomial_plus_one( + BorlandReal48 argument, + const BorlandReal48 *coefficients, + uint16_t count) +{ + BorlandReal48 result = coefficients[0]; + for (uint16_t index = 0; index < count; index++) { + if (index != 0) { + result = borland_real48_add_registers( + result, coefficients[index]) + .value; + } + result = borland_real48_multiply_registers(result, argument).value; + } + return borland_real48_add_registers( + result, make_real48(0x81, false, 0)) + .value; +} + +/* 1020:143c — x * polynomial_plus_one(x*x, table, count). */ +BorlandReal48 borland_real48_odd_polynomial( + BorlandReal48 argument, + const BorlandReal48 *coefficients, + uint16_t count) +{ + BorlandReal48 squared = + borland_real48_multiply_registers(argument, argument).value; + BorlandReal48 polynomial = borland_real48_polynomial_plus_one( + squared, coefficients, count); + return borland_real48_multiply_registers(polynomial, argument).value; +} + +/* 1020:1436 — fixed-table ArcTan series entry sharing the 143c tail. */ +BorlandReal48 borland_real48_arctan_series(BorlandReal48 argument) +{ + return borland_real48_odd_polynomial( + argument, + g_arctan_coefficients, + (uint16_t)(sizeof(g_arctan_coefficients) / + sizeof(g_arctan_coefficients[0]))); +} + +/* + * 1020:1307 — ArcTan with Borland's fixed argument reductions. Values above + * one are inverted; three tan-addition ranges reduce to the direct odd series; + * then the reciprocal and original-sign transforms are applied in that order. + */ +BorlandReal48 borland_real48_arctan(BorlandReal48 argument) +{ + if (real48_exponent(argument) == 0) { + return argument; + } + bool negative = real48_negative(argument); + argument.bytes[5] &= 0x7f; + + bool reciprocal = + borland_real48_compare_registers(argument, g_real48_one) >= 0; + if (reciprocal) { + argument = borland_real48_divide_registers( + g_real48_one, argument) + .value; + } + + BorlandReal48 result; + if (borland_real48_compare_registers( + argument, g_arctan_direct_limit) < 0) { + result = borland_real48_arctan_series(argument); + } else { + const BorlandReal48 *tangent; + const BorlandReal48 *angle; + if (borland_real48_compare_registers( + argument, g_arctan_tan_pi_over_8) < 0) { + tangent = &g_arctan_tan_pi_over_12; + angle = &g_pi_over_12; + } else if (borland_real48_compare_registers( + argument, g_arctan_second_threshold) < 0) { + tangent = &g_arctan_tan_pi_over_6; + angle = &g_pi_over_6; + } else { + tangent = &g_real48_one; + angle = &g_pi_over_4; + } + BorlandReal48 numerator = + borland_real48_subtract_preserving_right( + argument, *tangent) + .value; + BorlandReal48 denominator = + borland_real48_add_registers( + borland_real48_multiply_registers(argument, *tangent).value, + g_real48_one) + .value; + BorlandReal48 reduced = + borland_real48_divide_registers(numerator, denominator).value; + result = borland_real48_add_registers( + borland_real48_arctan_series(reduced), *angle) + .value; + } + if (reciprocal) { + result = borland_real48_subtract_registers(g_pi_over_2, result).value; + } + if (negative && real48_exponent(result) != 0) { + result.bytes[5] ^= REAL48_SIGN; + } + return result; +} + +/* + * 1020:11bb — natural logarithm. Normalize the input exponent, center its + * mantissa with sqrt(1/2), evaluate the atanh odd series, double it, and add + * the signed exponent displacement times ln(2). Results below exponent 67 are + * flushed to canonical zero exactly like the final CMP/JAE sequence. + */ +BorlandReal48 borland_real48_ln(BorlandReal48 argument) +{ + if (real48_exponent(argument) == 0 || real48_negative(argument)) { + borland_runtime_error(BORLAND_RUNTIME_ERROR_INVALID_FLOAT); + } + + int8_t exponent_displacement = + (int8_t)(uint8_t)(real48_exponent(argument) - 0x81); + argument.bytes[0] = 0x81; + BorlandReal48 centered = + borland_real48_multiply_registers(argument, g_sqrt_one_half).value; + BorlandReal48 numerator = + borland_real48_subtract_registers(centered, g_real48_one).value; + BorlandReal48 denominator = + borland_real48_add_registers(centered, g_real48_one).value; + BorlandReal48 ratio = + borland_real48_divide_registers(numerator, denominator).value; + BorlandReal48 mantissa_log = borland_real48_odd_polynomial( + ratio, + g_ln_coefficients, + (uint16_t)(sizeof(g_ln_coefficients) / sizeof(g_ln_coefficients[0]))); + mantissa_log.bytes[0]++; + mantissa_log = borland_real48_add_registers( + mantissa_log, g_half_ln_two) + .value; + + BorlandReal48 exponent_term = borland_real48_multiply_registers( + borland_i32_to_real48_registers(exponent_displacement), g_ln_two) + .value; + BorlandReal48 result = + borland_real48_add_registers(mantissa_log, exponent_term).value; + return real48_exponent(result) < 0x67 + ? borland_real48_zero_registers() + : result; +} + +/* + * 1020:1264 — exponential. Reduce |x| by ln(2), round twice the quotient, + * evaluate the fixed 2^r polynomial, apply sqrt(2) for an odd reduction, and + * scale through the Real48 exponent byte. A negative original input takes the + * reciprocal only after the positive path is complete. + */ +BorlandReal48 borland_real48_exp(BorlandReal48 argument) +{ + bool negative = real48_negative(argument); + argument.bytes[5] &= 0x7f; + BorlandReal48 quotient = + borland_real48_divide_registers(argument, g_ln_two).value; + if (real48_exponent(quotient) >= 0x88) { + borland_runtime_error(BORLAND_RUNTIME_ERROR_FLOAT_OVERFLOW); + } + + BorlandReal48 doubled_quotient = quotient; + doubled_quotient.bytes[0]++; + BorlandReal48IntegerResult rounded = + borland_real48_to_i32_registers(doubled_quotient, true); + if (rounded.overflow) { + borland_runtime_error(BORLAND_RUNTIME_ERROR_FLOAT_OVERFLOW); + } + uint16_t reduction = (uint16_t)rounded.value; + BorlandReal48 half_reduction = + borland_i32_to_real48_registers(rounded.value); + if (real48_exponent(half_reduction) != 0) { + half_reduction.bytes[0]--; + } + BorlandReal48 reduced = borland_real48_subtract_registers( + quotient, half_reduction) + .value; + BorlandReal48 result = borland_real48_polynomial_plus_one( + reduced, + g_exp_coefficients, + (uint16_t)(sizeof(g_exp_coefficients) / + sizeof(g_exp_coefficients[0]))); + if ((reduction & 1) != 0) { + result = borland_real48_multiply_registers(result, g_sqrt_two).value; + } + uint8_t exponent_increment = (uint8_t)(reduction >> 1); + uint16_t scaled_exponent = + (uint16_t)real48_exponent(result) + exponent_increment; + if (scaled_exponent > UINT8_MAX) { + borland_runtime_error(BORLAND_RUNTIME_ERROR_FLOAT_OVERFLOW); + } + result.bytes[0] = (uint8_t)scaled_exponent; + + if (negative) { + result = borland_real48_divide_registers(g_real48_one, result).value; + } + return result; +} + +/* + * 1020:1130 — Sin shared entry inside the containing Cos routine. Reduce by + * 2*pi through Frac, fold [0,2*pi) through pi and pi/2, evaluate the odd + * series only above exponent 6c, then restore the half-cycle sign. + */ +BorlandReal48 borland_real48_sin(BorlandReal48 argument) +{ + if (real48_exponent(argument) < 0x6c) { + return argument; + } + + BorlandReal48 reduced = argument; + BorlandReal48 absolute = argument; + absolute.bytes[5] &= 0x7f; + if (borland_real48_compare_registers(absolute, g_two_pi) >= 0) { + BorlandReal48 quotient = + borland_real48_divide_preserving_right(argument, g_two_pi).value; + reduced = borland_real48_multiply_preserving_right( + borland_real48_fractional_part(quotient), g_two_pi) + .value; + } + if (real48_negative(reduced)) { + reduced = borland_real48_add_preserving_right(reduced, g_two_pi).value; + } + + BorlandReal48 pi = g_two_pi; + pi.bytes[0]--; + bool positive_half_cycle = + borland_real48_compare_registers(reduced, pi) < 0; + if (!positive_half_cycle) { + reduced = borland_real48_subtract_preserving_right(reduced, pi).value; + } + + BorlandReal48 half_pi = pi; + half_pi.bytes[0]--; + if (borland_real48_compare_registers(reduced, half_pi) >= 0) { + reduced.bytes[5] |= REAL48_SIGN; + reduced = borland_real48_add_registers(reduced, pi).value; + } + if (real48_exponent(reduced) >= 0x6c) { + reduced = borland_real48_odd_polynomial( + reduced, + g_sin_coefficients, + (uint16_t)(sizeof(g_sin_coefficients) / + sizeof(g_sin_coefficients[0]))); + } + if (!positive_half_cycle && real48_exponent(reduced) != 0) { + reduced.bytes[5] ^= REAL48_SIGN; + } + return reduced; +} + +/* 1020:111d — Cos prelude computes pi/2-x, then enters Sin at 1130. */ +BorlandReal48 borland_real48_cos(BorlandReal48 argument) +{ + BorlandReal48 minus_half_pi = g_pi_over_2; + minus_half_pi.bytes[5] |= REAL48_SIGN; + BorlandReal48 shifted = + borland_real48_add_registers(argument, minus_half_pi).value; + if (real48_exponent(shifted) != 0) { + shifted.bytes[5] ^= REAL48_SIGN; + } + return borland_real48_sin(shifted); +} + +/* + * 1020:0f28 — unsigned Real48 magnitude ordering materialized from the flags. + * Equal zero exponents compare equal without inspecting the remaining bytes, + * exactly matching OR AL,AL followed by the early RET. + */ +int16_t borland_real48_compare_magnitude_registers( + BorlandReal48 left, BorlandReal48 right) +{ + uint8_t left_exponent = real48_exponent(left); + uint8_t right_exponent = real48_exponent(right); + if (left_exponent != right_exponent) { + return left_exponent < right_exponent ? -1 : 1; + } + if (left_exponent == 0) { + return 0; + } + uint64_t left_fraction = real48_fraction(left); + uint64_t right_fraction = real48_fraction(right); + if (left_fraction == right_fraction) { + return 0; + } + return left_fraction < right_fraction ? -1 : 1; +} + +/* 1020:0f11 — sign-aware comparison, reversing magnitude order if negative. */ +int16_t borland_real48_compare_registers( + BorlandReal48 left, BorlandReal48 right) +{ + bool left_negative = real48_negative(left); + bool right_negative = real48_negative(right); + if (left_negative != right_negative) { + return left_negative ? -1 : 1; + } + int16_t magnitude = + borland_real48_compare_magnitude_registers(left, right); + return left_negative ? (int16_t)-magnitude : magnitude; +} + +/* + * 1020:0f3b — signed DX:AX integer to register-form Real48. Every int32_t is + * exact because Real48 carries forty significand bits. + */ +BorlandReal48 borland_i32_to_real48_registers(int32_t value) +{ + if (value == 0) { + return borland_real48_zero_registers(); + } + + bool negative = value < 0; + uint32_t magnitude = negative + ? (uint32_t)(0U - (uint32_t)value) + : (uint32_t)value; + uint8_t highest_bit = 0; + for (uint32_t scan = magnitude; scan > 1; scan >>= 1) { + highest_bit++; + } + uint64_t significand = + (uint64_t)magnitude << + (REAL48_EXPLICIT_FRACTION_BITS - highest_bit); + uint64_t fraction = significand - + (UINT64_C(1) << REAL48_EXPLICIT_FRACTION_BITS); + return make_real48( + (uint8_t)(REAL48_EXPONENT_BIAS + highest_bit), + negative, + fraction); +} + +/* + * 1020:0f77 — Real48 to signed DX:AX. `round` is the entry's CH byte: zero + * truncates, nonzero adds the first discarded bit before the signed-range + * check. Thus exact halves round away from zero, as Borland Round requires. + */ +BorlandReal48IntegerResult borland_real48_to_i32_registers( + BorlandReal48 value, bool round) +{ + uint8_t exponent = real48_exponent(value); + if (exponent == 0) { + return (BorlandReal48IntegerResult){0, false}; + } + + int16_t highest_bit = (int16_t)exponent - REAL48_EXPONENT_BIAS; + if (highest_bit >= 32) { + return (BorlandReal48IntegerResult){0, true}; + } + + uint64_t significand = real48_significand(value); + int16_t shift = REAL48_EXPLICIT_FRACTION_BITS - highest_bit; + uint64_t magnitude = shift >= 64 ? 0 : significand >> shift; + if (round && shift > 0 && shift <= 40 && + ((significand >> (shift - 1)) & 1) != 0) { + magnitude++; + } + + bool negative = real48_negative(value); + uint64_t limit = negative + ? UINT64_C(0x80000000) + : (uint64_t)INT32_MAX; + bool overflow = magnitude > limit; + if (!negative) { + int32_t candidate = magnitude == UINT64_C(0x80000000) + ? INT32_MIN + : (int32_t)(uint32_t)magnitude; + return (BorlandReal48IntegerResult){candidate, overflow}; + } + uint32_t twos_complement = 0U - (uint32_t)magnitude; + int32_t candidate = twos_complement == UINT32_C(0x80000000) + ? INT32_MIN + : (int32_t)twos_complement; + return (BorlandReal48IntegerResult){candidate, overflow}; +} + +/* 1020:1007 — far comparison entry around the near flags-only core. */ +int16_t borland_real48_compare( + BorlandReal48 left, BorlandReal48 right) +{ + return borland_real48_compare_registers(left, right); +} + +static BorlandReal48 require_real48_arithmetic( + BorlandReal48Result result) +{ + if (result.divide_by_zero) { + borland_runtime_error(BORLAND_RUNTIME_ERROR_DIVIDE_BY_ZERO); + } + if (result.overflow) { + borland_runtime_error(BORLAND_RUNTIME_ERROR_FLOAT_OVERFLOW); + } + return result.value; +} + +/* 1020:0fe5 — far Add wrapper; carry maps to Runtime Error 205. */ +BorlandReal48 borland_real48_add( + BorlandReal48 left, BorlandReal48 right) +{ + return require_real48_arithmetic( + borland_real48_add_registers(left, right)); +} + +/* 1020:0feb — far Subtract wrapper around the sign-toggle entry. */ +BorlandReal48 borland_real48_subtract( + BorlandReal48 left, BorlandReal48 right) +{ + return require_real48_arithmetic( + borland_real48_subtract_registers(left, right)); +} + +/* 1020:0ff1 — copy AX:BX:DX to CX:SI:DI, then share Multiply. */ +BorlandReal48 borland_real48_square(BorlandReal48 value) +{ + return require_real48_arithmetic( + borland_real48_multiply_registers(value, value)); +} + +/* 1020:0ff7 — far Multiply wrapper; carry maps to Runtime Error 205. */ +BorlandReal48 borland_real48_multiply( + BorlandReal48 left, BorlandReal48 right) +{ + return require_real48_arithmetic( + borland_real48_multiply_registers(left, right)); +} + +/* 1020:0ffd — denominator zero is Error 200; overflow is Error 205. */ +BorlandReal48 borland_real48_divide( + BorlandReal48 left, BorlandReal48 right) +{ + return require_real48_arithmetic( + borland_real48_divide_registers(left, right)); +} + +/* 1020:100b — far integer-to-Real48 entry around 1020:0f3b. */ +BorlandReal48 borland_i32_to_real48(int32_t value) +{ + return borland_i32_to_real48_registers(value); +} + +/* 1020:100f — CH=0 Trunc entry sharing the error tail at 101f with Round. */ +int32_t borland_real48_truncate_to_i32(BorlandReal48 value) +{ + BorlandReal48IntegerResult converted = + borland_real48_to_i32_registers(value, false); + if (converted.overflow) { + borland_runtime_error(BORLAND_RUNTIME_ERROR_INVALID_FLOAT); + } + return converted.value; +} + +/* 1020:1017 — CH=1 Round entry; carry becomes Runtime Error 207. */ +int32_t borland_real48_round_to_i32(BorlandReal48 value) +{ + BorlandReal48IntegerResult converted = + borland_real48_to_i32_registers(value, true); + if (converted.overflow) { + borland_runtime_error(BORLAND_RUNTIME_ERROR_INVALID_FLOAT); + } + return converted.value; +} diff --git a/original/reconstructed/tdkpin_real48.h b/original/reconstructed/tdkpin_real48.h new file mode 100644 index 0000000..94941ff --- /dev/null +++ b/original/reconstructed/tdkpin_real48.h @@ -0,0 +1,91 @@ +#ifndef TDKPIN_REAL48_H +#define TDKPIN_REAL48_H + +#include +#include + +/* + * Turbo Pascal Real48 memory layout: biased exponent followed by 39 explicit + * fraction bits in little-endian order; byte 5 bit 7 is the sign. A nonzero + * value has an implicit leading significand bit. Exponent zero denotes zero. + */ +typedef struct { + uint8_t bytes[6]; +} BorlandReal48; + +typedef struct { + int32_t value; + bool overflow; +} BorlandReal48IntegerResult; + +typedef struct { + BorlandReal48 value; + bool overflow; + bool divide_by_zero; +} BorlandReal48Result; + +BorlandReal48Result borland_real48_add_registers( + BorlandReal48 left, BorlandReal48 right); /* 1020:0cd4 */ +BorlandReal48Result borland_real48_subtract_registers( + BorlandReal48 left, BorlandReal48 right); /* 1020:0cd0 */ +BorlandReal48Result borland_real48_multiply_registers( + BorlandReal48 left, BorlandReal48 right); /* 1020:0d97 */ +BorlandReal48 borland_real48_zero_registers(void); /* 1020:0e93 */ +BorlandReal48Result borland_real48_divide_registers( + BorlandReal48 left, BorlandReal48 right); /* 1020:0e9a */ +BorlandReal48Result borland_real48_add_preserving_right( + BorlandReal48 left, BorlandReal48 right); /* 1020:1031 */ +BorlandReal48Result borland_real48_subtract_preserving_right( + BorlandReal48 left, BorlandReal48 right); /* 1020:103b */ +BorlandReal48Result borland_real48_multiply_preserving_right( + BorlandReal48 left, BorlandReal48 right); /* 1020:1045 */ +BorlandReal48Result borland_real48_divide_preserving_right( + BorlandReal48 left, BorlandReal48 right); /* 1020:104f */ +BorlandReal48 borland_real48_integer_part( + BorlandReal48 value); /* 1020:1059 */ +BorlandReal48 borland_real48_fractional_part( + BorlandReal48 value); /* 1020:10aa */ +BorlandReal48 borland_real48_sqrt(BorlandReal48 value); /* 1020:10be */ +BorlandReal48 borland_real48_polynomial_plus_one( + BorlandReal48 argument, + const BorlandReal48 *coefficients, + uint16_t count); /* 1020:1455 */ +BorlandReal48 borland_real48_odd_polynomial( + BorlandReal48 argument, + const BorlandReal48 *coefficients, + uint16_t count); /* 1020:143c */ +BorlandReal48 borland_real48_arctan_series( + BorlandReal48 argument); /* 1020:1436 */ +BorlandReal48 borland_real48_arctan(BorlandReal48 argument); /* 1020:1307 */ +BorlandReal48 borland_real48_ln(BorlandReal48 argument); /* 1020:11bb */ +BorlandReal48 borland_real48_exp(BorlandReal48 argument); /* 1020:1264 */ +BorlandReal48 borland_real48_sin( + BorlandReal48 argument); /* 1020:1130 shared entry */ +BorlandReal48 borland_real48_cos(BorlandReal48 argument); /* 1020:111d */ +int16_t borland_real48_compare_magnitude_registers( + BorlandReal48 left, BorlandReal48 right); /* 1020:0f28 */ +int16_t borland_real48_compare_registers( + BorlandReal48 left, BorlandReal48 right); /* 1020:0f11 */ +BorlandReal48 borland_i32_to_real48_registers( + int32_t value); /* 1020:0f3b */ +BorlandReal48IntegerResult borland_real48_to_i32_registers( + BorlandReal48 value, bool round); /* 1020:0f77 */ + +int16_t borland_real48_compare( + BorlandReal48 left, BorlandReal48 right); /* 1020:1007 */ +BorlandReal48 borland_real48_add( + BorlandReal48 left, BorlandReal48 right); /* 1020:0fe5 */ +BorlandReal48 borland_real48_subtract( + BorlandReal48 left, BorlandReal48 right); /* 1020:0feb */ +BorlandReal48 borland_real48_square(BorlandReal48 value); /* 1020:0ff1 */ +BorlandReal48 borland_real48_multiply( + BorlandReal48 left, BorlandReal48 right); /* 1020:0ff7 */ +BorlandReal48 borland_real48_divide( + BorlandReal48 left, BorlandReal48 right); /* 1020:0ffd */ +BorlandReal48 borland_i32_to_real48(int32_t value); /* 1020:100b */ +int32_t borland_real48_truncate_to_i32( + BorlandReal48 value); /* 1020:100f shared entry */ +int32_t borland_real48_round_to_i32( + BorlandReal48 value); /* 1020:1017 */ + +#endif diff --git a/original/reconstructed/tdkpin_render.c b/original/reconstructed/tdkpin_render.c new file mode 100644 index 0000000..a325d01 --- /dev/null +++ b/original/reconstructed/tdkpin_render.c @@ -0,0 +1,186 @@ +/* Low-level TDKPIN background/overlay bitmap blits. */ + +#include "tdkpin_render.h" + +#include "tdkpin_arithmetic.h" + +enum { + DGROUP_BACKGROUND_BITMAP = 0x085b, + DGROUP_OVERLAY_BITMAP_B = 0x085d, + DGROUP_OVERLAY_BITMAP_A = 0x085f, + WIN16_SRCCOPY = 0x00cc0020, + WIN16_SRCAND = 0x008800c6, + DGROUP_DIGIT_BITMAP = 0x0861, + DGROUP_PLAYER_SCORE_INDEX_BASE = 0x097e, +}; + +static HBITMAP16 dgroup_bitmap(uint16_t offset) +{ + return win16_read_u16(win16_dgroup_pointer(offset)); +} + +/* 1008:07b6 — copy a supplied bitmap's origin into the background bitmap. */ +void tdkpin_blit_bitmap_to_background( + HBITMAP16 bitmap, + INT16 height, + INT16 width, + INT16 y, + INT16 x, + HDC16 reference_dc) +{ + HDC16 background_dc = CreateCompatibleDC16(reference_dc); + HDC16 bitmap_dc = CreateCompatibleDC16(reference_dc); + HGDIOBJ16 old_background = SelectObject16( + background_dc, dgroup_bitmap(DGROUP_BACKGROUND_BITMAP)); + HGDIOBJ16 old_bitmap = SelectObject16(bitmap_dc, bitmap); + (void)BitBlt16( + background_dc, x, y, width, height, + bitmap_dc, 0, 0, WIN16_SRCCOPY); + (void)SelectObject16(bitmap_dc, old_bitmap); + (void)SelectObject16(background_dc, old_background); + (void)DeleteDC16(bitmap_dc); + (void)DeleteDC16(background_dc); +} + +/* 1008:0837 — restore a rectangle from overlay bitmap 085f. */ +void tdkpin_restore_background_region_a( + INT16 height, + INT16 width, + INT16 y, + INT16 x, + HDC16 reference_dc) +{ + HDC16 background_dc = CreateCompatibleDC16(reference_dc); + HDC16 overlay_dc = CreateCompatibleDC16(reference_dc); + HGDIOBJ16 old_background = SelectObject16( + background_dc, dgroup_bitmap(DGROUP_BACKGROUND_BITMAP)); + HGDIOBJ16 old_overlay = SelectObject16( + overlay_dc, dgroup_bitmap(DGROUP_OVERLAY_BITMAP_A)); + (void)BitBlt16( + background_dc, x, y, width, height, + overlay_dc, x, y, WIN16_SRCCOPY); + (void)SelectObject16(overlay_dc, old_overlay); + (void)SelectObject16(background_dc, old_background); + (void)DeleteDC16(overlay_dc); + (void)DeleteDC16(background_dc); +} + +/* 1008:08bb — byte-identical restore using overlay bitmap 085d. */ +void tdkpin_restore_background_region_b( + INT16 height, + INT16 width, + INT16 y, + INT16 x, + HDC16 reference_dc) +{ + HDC16 background_dc = CreateCompatibleDC16(reference_dc); + HDC16 overlay_dc = CreateCompatibleDC16(reference_dc); + HGDIOBJ16 old_background = SelectObject16( + background_dc, dgroup_bitmap(DGROUP_BACKGROUND_BITMAP)); + HGDIOBJ16 old_overlay = SelectObject16( + overlay_dc, dgroup_bitmap(DGROUP_OVERLAY_BITMAP_B)); + (void)BitBlt16( + background_dc, x, y, width, height, + overlay_dc, x, y, WIN16_SRCCOPY); + (void)SelectObject16(overlay_dc, old_overlay); + (void)SelectObject16(background_dc, old_background); + (void)DeleteDC16(overlay_dc); + (void)DeleteDC16(background_dc); +} + +/* 1008:093f — copy one background rectangle to the destination DC. */ +void tdkpin_present_background_region( + INT16 height, + INT16 width, + INT16 y, + INT16 x, + HDC16 destination) +{ + HDC16 background_dc = CreateCompatibleDC16(destination); + HGDIOBJ16 old_background = SelectObject16( + background_dc, dgroup_bitmap(DGROUP_BACKGROUND_BITMAP)); + (void)BitBlt16( + destination, x, y, width, height, + background_dc, x, y, WIN16_SRCCOPY); + (void)SelectObject16(background_dc, old_background); + (void)DeleteDC16(background_dc); +} + +static int16_t score_destination_x(uint16_t player_or_value) +{ + switch (player_or_value) { + case 1: + return 0x129 - 20; + case 2: + return 0x155 - 20; + case 3: + return 0x181 - 20; + case 4: + return 0x1ad - 20; + default: + return 0x0fd - 20; + } +} + +static int32_t resolve_score_value(int32_t value_or_player) +{ + if (value_or_player < 1 || value_or_player > 4) { + return value_or_player; + } + uint16_t offset = (uint16_t)( + DGROUP_PLAYER_SCORE_INDEX_BASE + (uint16_t)value_or_player * 4); + return (int32_t)win16_read_u32(win16_dgroup_pointer(offset)); +} + +/* + * 1008:0996 — compose an eight-place decimal score into a 40x150 temporary + * bitmap. Values 1..4 select the corresponding one-based player score; all + * other int32 values render directly. Leading zeroes are suppressed except the + * least-significant position, and digit sprites are combined with SRCAND. + */ +void tdkpin_draw_score(HDC16 destination, int32_t value_or_player) +{ + HDC16 background_dc = CreateCompatibleDC16(destination); + HDC16 score_dc = CreateCompatibleDC16(destination); + HBITMAP16 score_bitmap = + CreateCompatibleBitmap16(destination, 40, 150); + int16_t destination_x = + score_destination_x((uint16_t)value_or_player); + int32_t value = resolve_score_value(value_or_player); + + HGDIOBJ16 old_background = SelectObject16( + background_dc, dgroup_bitmap(DGROUP_BACKGROUND_BITMAP)); + HGDIOBJ16 old_score = SelectObject16(score_dc, score_bitmap); + (void)BitBlt16( + score_dc, 0, 0, 40, 130, + background_dc, destination_x, 478, WIN16_SRCCOPY); + + for (uint8_t position = 0; position < 8; position++) { + BorlandDivI32Result digit_division = borland_divide_i32(value, 10); + uint8_t digit = (uint8_t)digit_division.remainder; + BorlandDivI32Result quotient_division = borland_divide_i32(value, 10); + value = quotient_division.quotient; + if (digit != 0 || value > 0 || position == 0) { + (void)SelectObject16( + background_dc, dgroup_bitmap(DGROUP_DIGIT_BITMAP)); + (void)BitBlt16( + score_dc, + 0, + (INT16)((7 - position) * 16), + 28, + 16, + background_dc, + (INT16)((uint16_t)digit << 4), + 0, + WIN16_SRCAND); + } + } + (void)BitBlt16( + destination, destination_x, 478, 40, 130, + score_dc, 0, 0, WIN16_SRCCOPY); + (void)SelectObject16(background_dc, old_background); + (void)SelectObject16(score_dc, old_score); + (void)DeleteObject16(score_bitmap); + (void)DeleteDC16(background_dc); + (void)DeleteDC16(score_dc); +} diff --git a/original/reconstructed/tdkpin_render.h b/original/reconstructed/tdkpin_render.h new file mode 100644 index 0000000..f24dd4a --- /dev/null +++ b/original/reconstructed/tdkpin_render.h @@ -0,0 +1,45 @@ +#ifndef TDKPIN_RENDER_H +#define TDKPIN_RENDER_H + +#include "tdkpin_segmented.h" + +void tdkpin_blit_bitmap_to_background( + HBITMAP16 bitmap, + INT16 height, + INT16 width, + INT16 y, + INT16 x, + HDC16 reference_dc); /* 1008:07b6 */ +void tdkpin_restore_background_region_a( + INT16 height, + INT16 width, + INT16 y, + INT16 x, + HDC16 reference_dc); /* 1008:0837 */ +void tdkpin_restore_background_region_b( + INT16 height, + INT16 width, + INT16 y, + INT16 x, + HDC16 reference_dc); /* 1008:08bb */ +void tdkpin_present_background_region( + INT16 height, + INT16 width, + INT16 y, + INT16 x, + HDC16 destination); /* 1008:093f */ +void tdkpin_draw_score( + HDC16 destination, + int32_t value_or_player); /* 1008:0996 */ +void tdkpin_update_status_display( + uint8_t player, + HDC16 destination); /* 1008:0b9e */ +void tdkpin_draw_item_status( + int16_t item, + HDC16 destination); /* 1008:0dbd */ +void tdkpin_draw_claw_frame( + uint8_t alternate, + uint16_t frame, + HDC16 destination); /* 1008:0e08 */ + +#endif diff --git a/original/reconstructed/tdkpin_resources.c b/original/reconstructed/tdkpin_resources.c new file mode 100644 index 0000000..933775f --- /dev/null +++ b/original/reconstructed/tdkpin_resources.c @@ -0,0 +1,138 @@ +/* Complete semantic catalog of the 63 resources in TDKPIN.EXE. */ + +#include "tdkpin_resources.h" + +#define IMAGE(type_, id_, off_, alloc_, used_, width_, height_, disp_, role_) \ + {type_, id_, off_, alloc_, used_, 0x0c00, width_, height_, 0, disp_, role_} +#define WAV(id_, off_, alloc_, used_, flags_, rate_, role_) \ + {TDKPIN_RESOURCE_WAV, id_, off_, alloc_, used_, flags_, 0, 0, rate_, \ + TDKPIN_RESOURCE_DIRECT, role_} +#define WINRES(type_, id_, off_, alloc_, used_, disp_, role_) \ + {type_, id_, off_, alloc_, used_, 0x1c30, 0, 0, 0, disp_, role_} + +const TdkpinResourceDescriptor +tdkpin_resource_catalog[TDKPIN_RESOURCE_COUNT] = { + IMAGE(TDKPIN_RESOURCE_DAT, 400, 118272, 5632, 5452, 42, 123, + TDKPIN_RESOURCE_DIRECT, "player emblem sprite 0"), + IMAGE(TDKPIN_RESOURCE_DAT, 401, 123904, 5632, 5452, 42, 123, + TDKPIN_RESOURCE_DIRECT, "player emblem sprite 1"), + IMAGE(TDKPIN_RESOURCE_DAT, 402, 129536, 5632, 5452, 42, 123, + TDKPIN_RESOURCE_DIRECT, "player emblem sprite 2"), + IMAGE(TDKPIN_RESOURCE_DAT, 403, 135168, 5632, 5452, 42, 123, + TDKPIN_RESOURCE_DIRECT, "player emblem sprite 3"), + IMAGE(TDKPIN_RESOURCE_DAT, 404, 140800, 5632, 5452, 42, 123, + TDKPIN_RESOURCE_DIRECT, "player emblem sprite 4"), + IMAGE(TDKPIN_RESOURCE_DAT, 405, 146432, 5632, 5452, 42, 123, + TDKPIN_RESOURCE_DIRECT, "player emblem sprite 5"), + IMAGE(TDKPIN_RESOURCE_DAT, 406, 152064, 5632, 5452, 42, 123, + TDKPIN_RESOURCE_DIRECT, "player emblem sprite 6"), + IMAGE(TDKPIN_RESOURCE_DAT, 407, 157696, 5632, 5452, 42, 123, + TDKPIN_RESOURCE_DIRECT, "player emblem sprite 7"), + IMAGE(TDKPIN_RESOURCE_DAT, 600, 163328, 98048, 97960, 544, 180, + TDKPIN_RESOURCE_DIRECT, "rotating-target and panel-animation atlas"), + IMAGE(TDKPIN_RESOURCE_DAT, 701, 261376, 21248, 21056, 146, 142, + TDKPIN_RESOURCE_DIRECT, "score status level 1"), + IMAGE(TDKPIN_RESOURCE_DAT, 702, 282624, 21248, 21056, 146, 142, + TDKPIN_RESOURCE_DIRECT, "score status level 2"), + IMAGE(TDKPIN_RESOURCE_DAT, 703, 303872, 21248, 21056, 146, 142, + TDKPIN_RESOURCE_DIRECT, "score status level 3"), + IMAGE(TDKPIN_RESOURCE_DAT, 704, 325120, 21248, 21056, 146, 142, + TDKPIN_RESOURCE_DIRECT, "score status level 4"), + IMAGE(TDKPIN_RESOURCE_DAT, 801, 346368, 4352, 4188, 68, 61, + TDKPIN_RESOURCE_DIRECT, "collected-item display count 1"), + IMAGE(TDKPIN_RESOURCE_DAT, 802, 350720, 4352, 4188, 68, 61, + TDKPIN_RESOURCE_DIRECT, "collected-item display count 2"), + IMAGE(TDKPIN_RESOURCE_DAT, 803, 355072, 4352, 4188, 68, 61, + TDKPIN_RESOURCE_DIRECT, "collected-item display count 3"), + IMAGE(TDKPIN_RESOURCE_DAT, 804, 359424, 4352, 4188, 68, 61, + TDKPIN_RESOURCE_DIRECT, "collected-item display count 4"), + IMAGE(TDKPIN_RESOURCE_DAT, 805, 363776, 4352, 4188, 68, 61, + TDKPIN_RESOURCE_DIRECT, "collected-item display count 5"), + IMAGE(TDKPIN_RESOURCE_DAT, 806, 368128, 4352, 4188, 68, 61, + TDKPIN_RESOURCE_DIRECT, "collected-item display count 6"), + IMAGE(TDKPIN_RESOURCE_DAT, 807, 372480, 4352, 4188, 68, 61, + TDKPIN_RESOURCE_DIRECT, "collected-item display count 7"), + IMAGE(TDKPIN_RESOURCE_DAT, 808, 376832, 4352, 4188, 68, 61, + TDKPIN_RESOURCE_DIRECT, "collected-item display count 8"), + IMAGE(TDKPIN_RESOURCE_DAT, 809, 381184, 4352, 4188, 68, 61, + TDKPIN_RESOURCE_DIRECT, "collected-item display count 9"), + IMAGE(TDKPIN_RESOURCE_DAT, 900, 385536, 266496, 266440, 900, 296, + TDKPIN_RESOURCE_DIRECT, "18-frame claw sprite atlas"), + IMAGE(TDKPIN_RESOURCE_DAT, 901, 652032, 4096, 3984, 230, 17, + TDKPIN_RESOURCE_DIRECT, "launcher and velocity-row decoration atlas"), + IMAGE(TDKPIN_RESOURCE_DAT, 993, 656128, 108288, 108040, 360, 300, + TDKPIN_RESOURCE_DIRECT, "high-score window background"), + IMAGE(TDKPIN_RESOURCE_DAT, 994, 764416, 3328, 3160, 237, 13, + TDKPIN_RESOURCE_DIRECT, "asset-loading progress strip"), + IMAGE(TDKPIN_RESOURCE_DAT, 995, 767744, 294656, 294440, 640, 460, + TDKPIN_RESOURCE_DIRECT, "one-shot board splash"), + IMAGE(TDKPIN_RESOURCE_DAT, 997, 1062400, 294656, 294440, 640, 460, + TDKPIN_RESOURCE_DIRECT, "immutable restore overlay A"), + IMAGE(TDKPIN_RESOURCE_DAT, 998, 1357056, 294656, 294440, 640, 460, + TDKPIN_RESOURCE_DIRECT, "restore overlay B and mutable background"), + IMAGE(TDKPIN_RESOURCE_DAT, 1001, 1651712, 294656, 294440, 640, 460, + TDKPIN_RESOURCE_DIRECT, "board background selected by index 1"), + IMAGE(TDKPIN_RESOURCE_DAT, 1002, 1946368, 294656, 294440, 640, 460, + TDKPIN_RESOURCE_DIRECT, "board background selected by index 2"), + IMAGE(TDKPIN_RESOURCE_DAT, 1003, 2241024, 294656, 294440, 640, 460, + TDKPIN_RESOURCE_DIRECT, "board background selected by index 3"), + IMAGE(TDKPIN_RESOURCE_DAT, 1004, 2535680, 294656, 294440, 640, 460, + TDKPIN_RESOURCE_DIRECT, "board background selected by index 4"), + IMAGE(TDKPIN_RESOURCE_DAT, 1005, 2830336, 294656, 294440, 640, 460, + TDKPIN_RESOURCE_DIRECT, "board background selected by index 5"), + + {TDKPIN_RESOURCE_PAL, 999, 3124992, 768, 768, 0x0c00, 0, 0, 0, + TDKPIN_RESOURCE_DIRECT, "256 RGB triples shared by all custom DAT DIBs"}, + + WAV(2001, 3125760, 6400, 6302, 0x1c70, 22222, "add-player cue"), + WAV(2002, 3132160, 4608, 4594, 0x1c70, 22222, "launcher release cue"), + WAV(2004, 3136768, 7680, 7554, 0x1c70, 22222, "trigger activation cue"), + WAV(2006, 3144448, 3072, 2906, 0x0c60, 22050, "timed target 51..53 hit cue"), + WAV(2007, 3147520, 30464, 30452, 0x1c70, 22222, "score-marker or full-item-bank award cue"), + WAV(2008, 3177984, 39168, 39134, 0x1c70, 22050, "normal ball-end cue"), + WAV(2011, 3217152, 6912, 6710, 0x0c60, 22050, "rotating-target mechanism start cue"), + WAV(2012, 3224064, 512, 320, 0x0c60, 22050, "target and panel transition cue"), + WAV(2013, 3224576, 46592, 46348, 0x0c60, 22050, "panel mechanism motion cue"), + WAV(2015, 3271168, 8192, 7946, 0x1c70, 22050, "ball capture cue"), + WAV(2016, 3279360, 3584, 3518, 0x1c70, 22222, "claw ball-release cue"), + WAV(2017, 3282944, 35072, 34842, 0x1c70, 22050, "completed target-bank/item award cue"), + WAV(2019, 3318016, 5376, 5148, 0x1c70, 22222, "table nudge or kick-response cue"), + WAV(2020, 3323392, 30208, 30000, 0x1c70, 22222, "tilt cue"), + WAV(2021, 3353600, 3328, 3194, 0x1c70, 22222, "flipper motion cue"), + WAV(2022, 3356928, 22272, 22122, 0x1c70, 22050, "reserved present sound slot with no direct literal call"), + + {TDKPIN_RESOURCE_BITMAP, 101, 3379200, 256, 232, 0x0c30, 16, 16, 0, + TDKPIN_RESOURCE_DIRECT, "16x16 SRCPAINT object-composition image"}, + {TDKPIN_RESOURCE_BITMAP, 102, 3379456, 256, 232, 0x0c30, 16, 16, 0, + TDKPIN_RESOURCE_DIRECT, "16x16 SRCAND object-composition mask"}, + {TDKPIN_RESOURCE_BITMAP, 500, 3379712, 13568, 13320, 0x0c30, 944, 28, 0, + TDKPIN_RESOURCE_DIRECT, "score-digit and timer indicator atlas"}, + + {TDKPIN_RESOURCE_ICON, 1, 3393280, 768, 744, 0x1c30, 32, 32, 0, + TDKPIN_RESOURCE_SYSTEM_RESOLVED, "image selected by GROUP_ICON 996"}, + WINRES(TDKPIN_RESOURCE_GROUP_ICON, 996, 3394048, 256, 20, + TDKPIN_RESOURCE_DIRECT, "main-window icon group loaded at 1000:016c"), + {TDKPIN_RESOURCE_VERSION, 1, 3394304, 512, 416, 0x0c30, 0, 0, 0, + TDKPIN_RESOURCE_SYSTEM_RESOLVED, "Windows version metadata; no image-code loader"}, + WINRES(TDKPIN_RESOURCE_DIALOG, 32512, 3394816, 256, 250, + TDKPIN_RESOURCE_LINKED_UNUSED, "Borland 2D File Open template"), + WINRES(TDKPIN_RESOURCE_DIALOG, 32513, 3395072, 256, 212, + TDKPIN_RESOURCE_LINKED_UNUSED, "Borland 2D File Save As template"), + WINRES(TDKPIN_RESOURCE_DIALOG, 32514, 3395328, 256, 99, + TDKPIN_RESOURCE_DIRECT, "2D text-entry template selected at 1008:1607"), + WINRES(TDKPIN_RESOURCE_DIALOG, 32515, 3395584, 512, 372, + TDKPIN_RESOURCE_LINKED_UNUSED, "Borland CTL3D File Open template"), + WINRES(TDKPIN_RESOURCE_DIALOG, 32516, 3396096, 512, 309, + TDKPIN_RESOURCE_LINKED_UNUSED, "Borland CTL3D File Save As template"), + WINRES(TDKPIN_RESOURCE_DIALOG, 32517, 3396608, 256, 146, + TDKPIN_RESOURCE_DIRECT, "CTL3D text-entry template selected at 1008:1607"), +}; + +_Static_assert( + sizeof(tdkpin_resource_catalog) / sizeof(tdkpin_resource_catalog[0]) == + TDKPIN_RESOURCE_COUNT, + "TDKPIN resource catalog must remain complete"); + +#undef WINRES +#undef WAV +#undef IMAGE diff --git a/original/reconstructed/tdkpin_resources.h b/original/reconstructed/tdkpin_resources.h new file mode 100644 index 0000000..7c1ed11 --- /dev/null +++ b/original/reconstructed/tdkpin_resources.h @@ -0,0 +1,51 @@ +#ifndef TDKPIN_RESOURCES_H +#define TDKPIN_RESOURCES_H + +#include +#include + +/* + * Semantic C view of TDKPIN.EXE's NE resource table. The immutable payload + * bytes live in assets/raw and are tied to these entries by type, id, file + * offset, allocation size, and assets/manifest.json's SHA-256 digests. + */ +typedef enum { + TDKPIN_RESOURCE_DAT, + TDKPIN_RESOURCE_PAL, + TDKPIN_RESOURCE_WAV, + TDKPIN_RESOURCE_BITMAP, + TDKPIN_RESOURCE_ICON, + TDKPIN_RESOURCE_GROUP_ICON, + TDKPIN_RESOURCE_VERSION, + TDKPIN_RESOURCE_DIALOG, +} TdkpinResourceType; + +typedef enum { + /* Loaded or selected by an instruction path reconstructed from the image. */ + TDKPIN_RESOURCE_DIRECT, + /* Resolved by Windows as a dependency or metadata, rather than image code. */ + TDKPIN_RESOURCE_SYSTEM_RESOLVED, + /* Linked Borland library resource with no reachable in-image selector. */ + TDKPIN_RESOURCE_LINKED_UNUSED, +} TdkpinResourceDisposition; + +typedef struct { + TdkpinResourceType type; + uint16_t id; + uint32_t file_offset; + uint32_t allocated_size; + uint32_t meaningful_size; + uint16_t flags; + uint16_t width; + uint16_t height; + uint32_t sample_rate; + TdkpinResourceDisposition disposition; + const char *role; +} TdkpinResourceDescriptor; + +enum { TDKPIN_RESOURCE_COUNT = 63 }; + +extern const TdkpinResourceDescriptor + tdkpin_resource_catalog[TDKPIN_RESOURCE_COUNT]; + +#endif diff --git a/original/reconstructed/tdkpin_runtime_ui.c b/original/reconstructed/tdkpin_runtime_ui.c new file mode 100644 index 0000000..3061686 --- /dev/null +++ b/original/reconstructed/tdkpin_runtime_ui.c @@ -0,0 +1,572 @@ +/* + * Borland TPWinCrt window runtime reconstructed from TDKPIN.EXE. + * + * Target: a9022f1894e3e6e21fc42e8f6c932f7c549ca77f63aaa0c488bb9d55d9d0174c + * Function: 1008:2219 (NE export ordinal 119) + * Registration: WNDCLASS16 at DGROUP 1028:0562, relocation source 1028:0564 + * + * The original callback is a 10-byte far-Pascal WNDPROC16. Therefore its + * source parameters are HWND16, UINT16, WPARAM16, and a 32-bit LPARAM—not the + * five guessed parameters shown by an untyped decompiler signature. + */ + +#include "tdkpin_runtime_ui.h" +#include "tdkpin_borland_runtime.h" + +/* Address-linked dependencies reconstructed in later rows of the same module. */ +void tpwincrt_on_create(void); /* 1008:1d77 */ +void tpwincrt_on_paint(void); /* 1008:1dcc */ +void tpwincrt_handle_scroll(uint16_t thumb_position, + uint16_t command, + uint16_t vertical); /* 1008:1f0c */ +void tpwincrt_on_size(int16_t client_width, int16_t client_height); /* 1008:1f68 */ +void tpwincrt_update_scrollbars(void); /* 1008:1865 */ +void tpwincrt_fill_minmax_info(Win16FarPtr minmax_info); /* 1008:1fe8 */ +void tpwincrt_queue_character(uint8_t character); /* 1008:211a */ +void tpwincrt_handle_keydown(uint8_t virtual_key); /* 1008:2147 */ +void tpwincrt_on_set_focus(void); /* 1008:21ba */ +void tpwincrt_on_kill_focus(void); /* 1008:21ce */ +void tpwincrt_on_destroy(void); /* 1008:21e2 */ + +void tpwincrt_abort_on_ctrl_c(void); /* 1008:18d0 */ +void tpwincrt_create_caret(void); /* 1008:1818 */ +void tpwincrt_destroy_caret(void); /* 1008:185b */ +/* 1008:172f and 1008:1754 — signed 16-bit bounds helpers. */ +int16_t tpwincrt_min_i16(int16_t left, int16_t right) +{ + return right < left ? right : left; +} + +int16_t tpwincrt_max_i16(int16_t left, int16_t right) +{ + return left < right ? right : left; +} + +/* + * 1008:1e8a — apply one Win16 scrollbar command. + * + * The binary receives a near SS pointer to 1008:1f0c's BP and reads the two + * incoming message words at +4/+6. This typed view preserves that intentional + * caller-frame aliasing while all additions/subtractions retain 16-bit wrap. + */ +int16_t tpwincrt_apply_scroll_command( + const TpWinCrtScrollMessage *message, + int16_t maximum, + int16_t page, + int16_t current) +{ + switch (message->command) { + case TPWINCRT_SB_LINEUP: + return (int16_t)((uint16_t)current - 1); + case TPWINCRT_SB_LINEDOWN: + return (int16_t)((uint16_t)current + 1); + case TPWINCRT_SB_PAGEUP: + return (int16_t)((uint16_t)current - (uint16_t)page); + case TPWINCRT_SB_PAGEDOWN: + return (int16_t)((uint16_t)current + (uint16_t)page); + case TPWINCRT_SB_TOP: + return 0; + case TPWINCRT_SB_BOTTOM: + return maximum; + case TPWINCRT_SB_THUMBPOSITION: + return message->thumb_position; + default: + return current; + } +} + +/* + * 1008:19f8 — address one character in the circular screen buffer. + * + * The row adjustment and all address arithmetic wrap at 16 bits. The original + * performs one signed wrap test only and deliberately leaves the selector + * unchanged when the computed offset wraps. + */ +Win16FarPtr tpwincrt_cell_pointer(int16_t logical_row, int16_t column) +{ + int16_t physical_row = + (int16_t)((uint16_t)logical_row + g_tpwincrt_ring_row_origin); + if (physical_row >= (int16_t)g_tpwincrt_rows) { + physical_row = (int16_t)(physical_row - (int16_t)g_tpwincrt_rows); + } + + uint16_t relative = (uint16_t)( + (uint16_t)((uint16_t)physical_row * g_tpwincrt_columns) + + (uint16_t)column); + uint16_t target_offset = + (uint16_t)(win16_far_offset(g_tpwincrt_screen_buffer) + relative); + return win16_make_far_pointer( + win16_far_selector(g_tpwincrt_screen_buffer), target_offset); +} + +/* + * 1008:18ee — clamp and apply the text viewport origin. + * + * The pixel deltas use unsigned MUL and retain AX only. Passing those bits as + * INT16 preserves Win16 ScrollWindow's signed interpretation after wrap. + */ +void tpwincrt_scroll_to(int16_t target_column, int16_t target_row) +{ + if (!g_tpwincrt_window_created) { + return; + } + + int16_t new_column = tpwincrt_max_i16( + tpwincrt_min_i16((int16_t)g_tpwincrt_max_view_column, target_column), 0); + int16_t new_row = tpwincrt_max_i16( + tpwincrt_min_i16((int16_t)g_tpwincrt_max_view_row, target_row), 0); + + if (new_column == (int16_t)g_tpwincrt_view_column && + new_row == (int16_t)g_tpwincrt_view_row) { + return; + } + if (new_column != (int16_t)g_tpwincrt_view_column) { + (void)SetScrollPos16(g_tpwincrt_window, 0, new_column, 1); + } + if (new_row != (int16_t)g_tpwincrt_view_row) { + (void)SetScrollPos16(g_tpwincrt_window, 1, new_row, 1); + } + + int16_t delta_x = (int16_t)(uint16_t)( + (uint16_t)(g_tpwincrt_view_column - (uint16_t)new_column) * + g_tpwincrt_character_width); + int16_t delta_y = (int16_t)(uint16_t)( + (uint16_t)(g_tpwincrt_view_row - (uint16_t)new_row) * + g_tpwincrt_character_height); + (void)ScrollWindow16(g_tpwincrt_window, delta_x, delta_y, 0, 0); + + g_tpwincrt_view_column = (uint16_t)new_column; + g_tpwincrt_view_row = (uint16_t)new_row; + (void)UpdateWindow16(g_tpwincrt_window); +} + +/* + * 1008:1f0c — decode WM_HSCROLL/WM_VSCROLL and move the matching axis. + * The non-moving axis is copied unchanged before the common scroll routine. + */ +void tpwincrt_handle_scroll( + uint16_t thumb_position, uint16_t command, uint16_t vertical) +{ + TpWinCrtScrollMessage message = { + .thumb_position = (int16_t)thumb_position, + .command = command, + }; + int16_t column = (int16_t)g_tpwincrt_view_column; + int16_t row = (int16_t)g_tpwincrt_view_row; + + if (vertical == 0) { + column = tpwincrt_apply_scroll_command( + &message, + (int16_t)g_tpwincrt_max_view_column, + (int16_t)((int16_t)g_tpwincrt_visible_columns / 2), + column); + } else if (vertical == 1) { + row = tpwincrt_apply_scroll_command( + &message, + (int16_t)g_tpwincrt_max_view_row, + (int16_t)g_tpwincrt_visible_rows, + row); + } + tpwincrt_scroll_to(column, row); +} + +/* + * 1008:1f68 — WM_SIZE handler. + * Signed IDIV derives visible character dimensions. Subsequent subtraction + * wraps at 16 bits before the signed max/min bounds are applied. + */ +void tpwincrt_on_size(int16_t client_width, int16_t client_height) +{ + if (g_tpwincrt_has_focus && g_tpwincrt_caret_enabled) { + tpwincrt_destroy_caret(); + } + + g_tpwincrt_visible_columns = + (uint16_t)(client_width / (int16_t)g_tpwincrt_character_width); + g_tpwincrt_visible_rows = + (uint16_t)(client_height / (int16_t)g_tpwincrt_character_height); + g_tpwincrt_max_view_column = (uint16_t)tpwincrt_max_i16( + (int16_t)(g_tpwincrt_columns - g_tpwincrt_visible_columns), 0); + g_tpwincrt_max_view_row = (uint16_t)tpwincrt_max_i16( + (int16_t)(g_tpwincrt_rows - g_tpwincrt_visible_rows), 0); + g_tpwincrt_view_column = (uint16_t)tpwincrt_min_i16( + (int16_t)g_tpwincrt_max_view_column, (int16_t)g_tpwincrt_view_column); + g_tpwincrt_view_row = (uint16_t)tpwincrt_min_i16( + (int16_t)g_tpwincrt_max_view_row, (int16_t)g_tpwincrt_view_row); + + tpwincrt_update_scrollbars(); + if (g_tpwincrt_has_focus && g_tpwincrt_caret_enabled) { + tpwincrt_create_caret(); + } +} + +/* + * 1008:1d77 — WM_CREATE handler. + * Both size calculations intentionally retain only the low word of unsigned + * MUL. When Ctrl-C checking is disabled, the system Close command is disabled. + */ +void tpwincrt_on_create(void) +{ + g_tpwincrt_window_created = 1; + uint16_t buffer_bytes = + (uint16_t)((uint32_t)g_tpwincrt_columns * g_tpwincrt_rows); + g_tpwincrt_screen_buffer = borland_get_mem(buffer_bytes); + borland_fill_bytes(g_tpwincrt_screen_buffer, buffer_bytes, ' '); + + if (!g_tpwincrt_break_check_enabled) { + HMENU16 system_menu = GetSystemMenu16(g_tpwincrt_window, 0); + (void)EnableMenuItem16(system_menu, 0xf060, 3); + } +} + +/* + * 1008:1779 — acquire and configure a TPWinCrt drawing context. + * WM_PAINT uses BeginPaint16 and the persistent PAINTSTRUCT16 at 1028:4ad6; + * non-paint drawing uses GetDC16. The selected stock font is restored later. + */ +void tpwincrt_begin_drawing(void) +{ + enum { + SYSTEM_FIXED_FONT = 0x10, + COLOR_WINDOW = 5, + COLOR_WINDOWTEXT = 8, + DGROUP_PAINT_STRUCT = 0x4ad6, + }; + + if (g_tpwincrt_paint_message_active) { + g_tpwincrt_paint_dc = BeginPaint16( + g_tpwincrt_window, win16_dgroup_pointer(DGROUP_PAINT_STRUCT)); + } else { + g_tpwincrt_paint_dc = GetDC16(g_tpwincrt_window); + } + HGDIOBJ16 font = GetStockObject16(SYSTEM_FIXED_FONT); + g_tpwincrt_previous_font = SelectObject16(g_tpwincrt_paint_dc, font); + (void)SetTextColor16( + g_tpwincrt_paint_dc, GetSysColor16(COLOR_WINDOWTEXT)); + (void)SetBkColor16(g_tpwincrt_paint_dc, GetSysColor16(COLOR_WINDOW)); +} + +/* 1008:17e2 — restore the font and release the matching DC acquisition path. */ +void tpwincrt_end_drawing(void) +{ + enum { DGROUP_PAINT_STRUCT = 0x4ad6 }; + + (void)SelectObject16(g_tpwincrt_paint_dc, g_tpwincrt_previous_font); + if (g_tpwincrt_paint_message_active) { + (void)EndPaint16( + g_tpwincrt_window, win16_dgroup_pointer(DGROUP_PAINT_STRUCT)); + } else { + (void)ReleaseDC16(g_tpwincrt_window, g_tpwincrt_paint_dc); + } +} + +/* + * 1008:1dcc — WM_PAINT handler for the circular character buffer. + * Paint bounds are converted with signed IDIV; right/bottom use the original + * add-(cell-1) rounding with 16-bit wrap before division. + */ +void tpwincrt_on_paint(void) +{ + g_tpwincrt_paint_message_active = 1; + tpwincrt_begin_drawing(); + + int16_t first_column = tpwincrt_max_i16( + (int16_t)((uint16_t)(g_tpwincrt_paint.paint.left / + (int16_t)g_tpwincrt_character_width) + + g_tpwincrt_view_column), + 0); + int16_t rounded_right = (int16_t)( + (uint16_t)g_tpwincrt_paint.paint.right + g_tpwincrt_character_width - 1); + int16_t past_last_column = tpwincrt_min_i16( + (int16_t)g_tpwincrt_columns, + (int16_t)((uint16_t)(rounded_right / + (int16_t)g_tpwincrt_character_width) + + g_tpwincrt_view_column)); + + int16_t first_row = tpwincrt_max_i16( + (int16_t)((uint16_t)(g_tpwincrt_paint.paint.top / + (int16_t)g_tpwincrt_character_height) + + g_tpwincrt_view_row), + 0); + int16_t rounded_bottom = (int16_t)( + (uint16_t)g_tpwincrt_paint.paint.bottom + g_tpwincrt_character_height - 1); + int16_t past_last_row = tpwincrt_min_i16( + (int16_t)g_tpwincrt_rows, + (int16_t)((uint16_t)(rounded_bottom / + (int16_t)g_tpwincrt_character_height) + + g_tpwincrt_view_row)); + + for (int16_t row = first_row; row < past_last_row; + row = (int16_t)((uint16_t)row + 1)) { + int16_t x = (int16_t)(uint16_t)( + (uint16_t)(first_column - (int16_t)g_tpwincrt_view_column) * + g_tpwincrt_character_width); + int16_t y = (int16_t)(uint16_t)( + (uint16_t)(row - (int16_t)g_tpwincrt_view_row) * + g_tpwincrt_character_height); + Win16FarPtr text = tpwincrt_cell_pointer(row, first_column); + int16_t count = (int16_t)(past_last_column - first_column); + (void)TextOut16(g_tpwincrt_paint_dc, x, y, text, count); + } + + tpwincrt_end_drawing(); + g_tpwincrt_paint_message_active = 0; +} + +/* + * 1008:1fe8 — WM_GETMINMAXINFO handler and font-metric initialization. + * Only six words of the caller's MINMAXINFO16 are written, matching the binary; + * ptReserved and ptMaxPosition are intentionally left untouched. + */ +void tpwincrt_fill_minmax_info(Win16FarPtr minmax_info) +{ + enum { + SM_CXSCREEN = 0, + SM_CYSCREEN = 1, + SM_CXVSCROLL = 2, + SM_CYHSCROLL = 3, + SM_CYCAPTION = 4, + SM_CXFRAME = 32, + SM_CYFRAME = 33, + }; + + tpwincrt_begin_drawing(); + TEXTMETRIC16 metrics; + (void)GetTextMetrics16( + g_tpwincrt_paint_dc, win16_stack_pointer(&metrics)); + g_tpwincrt_character_width = (uint16_t)metrics.maximum_character_width; + g_tpwincrt_character_height = + (uint16_t)(metrics.height + metrics.external_leading); + g_tpwincrt_caret_y_offset = (uint16_t)metrics.ascent; + + uint16_t frame_width_twice = + (uint16_t)((uint16_t)GetSystemMetrics16(SM_CXFRAME) << 1); + uint16_t maximum_client_width = (uint16_t)( + (uint16_t)(g_tpwincrt_columns * g_tpwincrt_character_width) + + (uint16_t)GetSystemMetrics16(SM_CXVSCROLL)); + uint16_t maximum_width = (uint16_t)( + (uint16_t)tpwincrt_min_i16( + (int16_t)maximum_client_width, + GetSystemMetrics16(SM_CXSCREEN)) + + frame_width_twice); + + uint16_t frame_height_twice = + (uint16_t)((uint16_t)GetSystemMetrics16(SM_CYFRAME) << 1); + uint16_t caption_height = (uint16_t)GetSystemMetrics16(SM_CYCAPTION); + uint16_t maximum_client_height = (uint16_t)( + (uint16_t)(g_tpwincrt_rows * g_tpwincrt_character_height) + + (uint16_t)GetSystemMetrics16(SM_CYHSCROLL) + caption_height); + uint16_t maximum_height = (uint16_t)( + (uint16_t)tpwincrt_min_i16( + (int16_t)maximum_client_height, + GetSystemMetrics16(SM_CYSCREEN)) + + frame_height_twice); + + uint16_t minimum_width = (uint16_t)( + (uint16_t)(g_tpwincrt_character_width << 4) + + (uint16_t)GetSystemMetrics16(SM_CXVSCROLL) + frame_width_twice); + uint16_t minimum_height = (uint16_t)( + (uint16_t)(g_tpwincrt_character_height << 2) + + (uint16_t)GetSystemMetrics16(SM_CYHSCROLL) + + (uint16_t)((uint16_t)GetSystemMetrics16(SM_CYFRAME) << 1) + + caption_height); + + win16_write_u16(minmax_info, 4, maximum_width); + win16_write_u16(minmax_info, 6, maximum_height); + win16_write_u16(minmax_info, 12, minimum_width); + win16_write_u16(minmax_info, 14, minimum_height); + win16_write_u16(minmax_info, 16, maximum_width); + win16_write_u16(minmax_info, 18, maximum_height); + tpwincrt_end_drawing(); +} + +/* 1008:2147 — translate one WM_KEYDOWN through the exact 12-entry table. */ +void tpwincrt_handle_keydown(uint8_t virtual_key) +{ + if (g_tpwincrt_break_check_enabled && virtual_key == 3) { + tpwincrt_abort_on_ctrl_c(); + } + + uint8_t control_down = GetKeyState16(0x11) < 0; + for (uint16_t index = 0; index < 12; index++) { + const TpWinCrtKeyBinding *binding = &g_tpwincrt_key_bindings[index]; + if (binding->virtual_key == virtual_key && + binding->control_required == control_down) { + tpwincrt_handle_scroll(0, binding->scroll_command, binding->vertical); + return; + } + } +} + +/* 1008:1865 — publish horizontal and vertical scrollbar ranges/positions. */ +void tpwincrt_update_scrollbars(void) +{ + int16_t horizontal_max = + tpwincrt_max_i16((int16_t)g_tpwincrt_max_view_column, 1); + (void)SetScrollRange16(g_tpwincrt_window, 0, 0, horizontal_max, 0); + (void)SetScrollPos16( + g_tpwincrt_window, 0, (int16_t)g_tpwincrt_view_column, 1); + + int16_t vertical_max = + tpwincrt_max_i16((int16_t)g_tpwincrt_max_view_row, 1); + (void)SetScrollRange16(g_tpwincrt_window, 1, 0, vertical_max, 0); + (void)SetScrollPos16( + g_tpwincrt_window, 1, (int16_t)g_tpwincrt_view_row, 1); +} + +/* 1008:19b7 — scroll only far enough to keep the cursor visible. */ +void tpwincrt_scroll_cursor_into_view(void) +{ + int16_t leftmost = (int16_t)( + (uint16_t)(g_tpwincrt_cursor_column - g_tpwincrt_visible_columns) + 1); + int16_t target_column = tpwincrt_max_i16( + tpwincrt_min_i16( + (int16_t)g_tpwincrt_cursor_column, (int16_t)g_tpwincrt_view_column), + leftmost); + + int16_t topmost = (int16_t)( + (uint16_t)(g_tpwincrt_cursor_row - g_tpwincrt_visible_rows) + 1); + int16_t target_row = tpwincrt_max_i16( + tpwincrt_min_i16( + (int16_t)g_tpwincrt_cursor_row, (int16_t)g_tpwincrt_view_row), + topmost); + + tpwincrt_scroll_to(target_column, target_row); +} + +/* + * 1008:2219 — process-wide TPWinCrt WNDPROC16. + * + * Every handled message returns zero, exactly as the zeroed DX:AX local in the + * binary. Only unhandled messages preserve DefWindowProc16's 32-bit result. + * WM_SIZE carries width in LOWORD(lParam) and height in HIWORD(lParam). + */ +LRESULT16 tpwincrt_window_proc( + HWND16 window, UINT16 message, WPARAM16 wparam, LPARAM16 lparam) +{ + g_tpwincrt_window = window; + + switch (message) { + case WIN16_WM_CREATE: + tpwincrt_on_create(); + break; + case WIN16_WM_PAINT: + tpwincrt_on_paint(); + break; + case WIN16_WM_VSCROLL: + tpwincrt_handle_scroll((uint16_t)lparam, wparam, 1); + break; + case WIN16_WM_HSCROLL: + tpwincrt_handle_scroll((uint16_t)lparam, wparam, 0); + break; + case WIN16_WM_SIZE: + tpwincrt_on_size((int16_t)lparam, (int16_t)((uint32_t)lparam >> 16)); + break; + case WIN16_WM_GETMINMAXINFO: + tpwincrt_fill_minmax_info((Win16FarPtr)lparam); + break; + case WIN16_WM_CHAR: + tpwincrt_queue_character((uint8_t)wparam); + break; + case WIN16_WM_KEYDOWN: + tpwincrt_handle_keydown((uint8_t)wparam); + break; + case WIN16_WM_SETFOCUS: + tpwincrt_on_set_focus(); + break; + case WIN16_WM_KILLFOCUS: + tpwincrt_on_kill_focus(); + break; + case WIN16_WM_DESTROY: + tpwincrt_on_destroy(); + break; + default: + return DefWindowProc16(window, message, wparam, lparam); + } + return 0; +} + +/* 1008:211a — append one WM_CHAR byte to the fixed 64-byte input queue. */ +void tpwincrt_queue_character(uint8_t character) +{ + if (g_tpwincrt_break_check_enabled && character == 3) { + tpwincrt_abort_on_ctrl_c(); + } + if ((int16_t)g_tpwincrt_input_count < 64) { + g_tpwincrt_input_buffer[g_tpwincrt_input_count] = character; + g_tpwincrt_input_count++; + } +} + +/* 1008:21ba — WM_SETFOCUS handler. */ +void tpwincrt_on_set_focus(void) +{ + g_tpwincrt_has_focus = 1; + if (g_tpwincrt_caret_enabled) { + tpwincrt_create_caret(); + } +} + +/* 1008:21ce — WM_KILLFOCUS handler. */ +void tpwincrt_on_kill_focus(void) +{ + if (g_tpwincrt_caret_enabled) { + tpwincrt_destroy_caret(); + } + g_tpwincrt_has_focus = 0; +} + +/* + * 1008:21e2 — WM_DESTROY handler. + * MUL leaves the low 16 bits in AX, so the buffer byte count intentionally + * wraps at 16 bits before it is passed to Borland's far-heap release routine. + */ +void tpwincrt_on_destroy(void) +{ + uint16_t buffer_bytes = + (uint16_t)((uint32_t)g_tpwincrt_columns * g_tpwincrt_rows); + + borland_free_mem(g_tpwincrt_screen_buffer, buffer_bytes); + g_tpwincrt_cursor_column = 0; + g_tpwincrt_cursor_row = 0; + g_tpwincrt_view_column = 0; + g_tpwincrt_view_row = 0; + PostQuitMessage16(0); + g_tpwincrt_window_created = 0; +} + +/* + * 1008:1818 — create, position, and show the text caret. + * Both coordinate multiplications intentionally retain only AX, matching the + * unsigned 16-bit MUL instructions at 1818:1836 and 1818:1842. + */ +void tpwincrt_create_caret(void) +{ + uint16_t x = (uint16_t)( + (uint16_t)(g_tpwincrt_cursor_column - g_tpwincrt_view_column) * + g_tpwincrt_character_width); + uint16_t y = (uint16_t)( + (uint16_t)(g_tpwincrt_cursor_row - g_tpwincrt_view_row) * + g_tpwincrt_character_height + + g_tpwincrt_caret_y_offset); + + (void)CreateCaret16( + g_tpwincrt_window, 0, (INT16)g_tpwincrt_character_width, 2); + (void)SetCaretPos16((INT16)x, (INT16)y); + (void)ShowCaret16(g_tpwincrt_window); +} + +/* 1008:185b — destroy the process caret; the BOOL16 result is ignored. */ +void tpwincrt_destroy_caret(void) +{ + (void)DestroyCaret16(); +} + +/* 1008:18d0 — Ctrl-C termination path. */ +_Noreturn void tpwincrt_abort_on_ctrl_c(void) +{ + if (g_tpwincrt_has_focus && g_tpwincrt_caret_enabled) { + tpwincrt_destroy_caret(); + } + borland_runtime_exit(0xff); +} diff --git a/original/reconstructed/tdkpin_runtime_ui.h b/original/reconstructed/tdkpin_runtime_ui.h new file mode 100644 index 0000000..184ef3e --- /dev/null +++ b/original/reconstructed/tdkpin_runtime_ui.h @@ -0,0 +1,40 @@ +#ifndef TDKPIN_RUNTIME_UI_H +#define TDKPIN_RUNTIME_UI_H + +#include "tdkpin_dgroup.h" + +#include + +typedef struct { + int16_t thumb_position; + uint16_t command; +} TpWinCrtScrollMessage; + +int16_t tpwincrt_min_i16(int16_t left, int16_t right); +int16_t tpwincrt_max_i16(int16_t left, int16_t right); +int16_t tpwincrt_apply_scroll_command( + const TpWinCrtScrollMessage *message, + int16_t maximum, + int16_t page, + int16_t current); +Win16FarPtr tpwincrt_cell_pointer(int16_t logical_row, int16_t column); +void tpwincrt_scroll_to(int16_t target_column, int16_t target_row); +void tpwincrt_update_scrollbars(void); +void tpwincrt_scroll_cursor_into_view(void); +void tpwincrt_begin_drawing(void); +void tpwincrt_end_drawing(void); +void tpwincrt_create_caret(void); +void tpwincrt_destroy_caret(void); +void tpwincrt_handle_scroll( + uint16_t thumb_position, uint16_t command, uint16_t vertical); +void tpwincrt_on_size(int16_t client_width, int16_t client_height); +void tpwincrt_handle_keydown(uint8_t virtual_key); +void tpwincrt_queue_character(uint8_t character); +_Noreturn void tpwincrt_abort_on_ctrl_c(void); +void tpwincrt_on_create(void); +void tpwincrt_on_destroy(void); +void tpwincrt_fill_minmax_info(Win16FarPtr minmax_info); +LRESULT16 tpwincrt_window_proc( + HWND16 window, UINT16 message, WPARAM16 wparam, LPARAM16 lparam); + +#endif diff --git a/original/reconstructed/tdkpin_segmented.c b/original/reconstructed/tdkpin_segmented.c new file mode 100644 index 0000000..0d24728 --- /dev/null +++ b/original/reconstructed/tdkpin_segmented.c @@ -0,0 +1,241 @@ +/* Portable selector-backed implementation of explicit Win16 memory access. */ + +#include "tdkpin_segmented.h" + +#include +#include + +enum { MAX_BOUND_SEGMENTS = 32 }; + +typedef struct { + uint16_t ne_segment; + uint16_t selector; + uint8_t *bytes; + size_t size; + bool writable; +} BoundSegment; + +static BoundSegment g_segments[MAX_BOUND_SEGMENTS]; +static size_t g_segment_count; +static uint16_t g_dgroup_selector; +static uint16_t g_stack_selector; +static uint16_t g_stack_pointer_offset; +static Win16FarPtr g_current_return_address; +static uint32_t g_dos_time_words; +static uint16_t g_indeterminate_u16; + +static BoundSegment *find_segment(uint16_t selector) +{ + for (size_t index = 0; index < g_segment_count; index++) { + if (g_segments[index].selector == selector) { + return &g_segments[index]; + } + } + abort(); /* Invalid selectors fault in the original Win16 environment. */ +} + +static uint8_t *resolve(Win16FarPtr address, size_t bytes, bool write) +{ + BoundSegment *segment = find_segment(win16_far_selector(address)); + size_t offset = win16_far_offset(address); + if (offset + bytes > segment->size || (write && !segment->writable)) { + abort(); + } + return segment->bytes + offset; +} + +void win16_reset_segment_bindings(void) +{ + g_segment_count = 0; + g_dgroup_selector = 0; + g_stack_selector = 0; + g_stack_pointer_offset = 0; + g_current_return_address = 0; + g_dos_time_words = 0; + g_indeterminate_u16 = 0; +} + +void win16_bind_segment( + uint16_t selector, void *bytes, size_t size, bool writable) +{ + win16_bind_ne_segment(0, selector, bytes, size, writable); +} + +void win16_bind_ne_segment( + uint16_t ne_segment, + uint16_t selector, + void *bytes, + size_t size, + bool writable) +{ + if (g_segment_count == MAX_BOUND_SEGMENTS || size > 0x10000) { + abort(); + } + g_segments[g_segment_count++] = + (BoundSegment){ne_segment, selector, bytes, size, writable}; +} + +void win16_set_dgroup_selector(uint16_t selector) +{ + (void)find_segment(selector); + g_dgroup_selector = selector; +} + +void win16_set_current_return_address(Win16FarPtr address) +{ + g_current_return_address = address; +} + +void win16_set_dos_time_words(uint32_t words) +{ + g_dos_time_words = words; +} + +void win16_set_indeterminate_u16(uint16_t value) +{ + g_indeterminate_u16 = value; +} + +void win16_set_stack_state(uint16_t selector, uint16_t stack_pointer) +{ + (void)find_segment(selector); + g_stack_selector = selector; + g_stack_pointer_offset = stack_pointer; +} + +Win16FarPtr win16_dgroup_pointer(uint16_t offset) +{ + if (g_dgroup_selector == 0) { + abort(); + } + return win16_make_far_pointer(g_dgroup_selector, offset); +} + +Win16FarPtr win16_relocated_code_pointer(uint16_t ne_segment, uint16_t offset) +{ + for (size_t index = 0; index < g_segment_count; index++) { + if (g_segments[index].ne_segment == ne_segment) { + return win16_make_far_pointer(g_segments[index].selector, offset); + } + } + abort(); +} + +Win16FarPtr win16_stack_pointer(void *pointer) +{ + uintptr_t value = (uintptr_t)pointer; + for (size_t index = 0; index < g_segment_count; index++) { + uintptr_t base = (uintptr_t)g_segments[index].bytes; + if (value >= base && value < base + g_segments[index].size) { + return win16_make_far_pointer( + g_segments[index].selector, (uint16_t)(value - base)); + } + } + abort(); +} + +Win16FarPtr win16_current_stack_address(uint16_t offset) +{ + if (g_stack_selector == 0) { + abort(); + } + return win16_make_far_pointer(g_stack_selector, offset); +} + +uint8_t win16_read_u8(Win16FarPtr address) +{ + return *resolve(address, 1, false); +} + +uint16_t win16_read_u16(Win16FarPtr address) +{ + return (uint16_t)( + win16_read_u8(address) | + ((uint16_t)win16_read_u8(win16_far_add_offset(address, 1)) << 8)); +} + +uint32_t win16_read_u32(Win16FarPtr address) +{ + return (uint32_t)win16_read_u16(address) | + ((uint32_t)win16_read_u16(win16_far_add_offset(address, 2)) << 16); +} + +void win16_write_u8(Win16FarPtr address, uint8_t value) +{ + *resolve(address, 1, true) = value; +} + +Win16FarPtr win16_read_far_pointer(Win16FarPtr base, uint16_t byte_offset) +{ + Win16FarPtr address = win16_far_add_offset(base, byte_offset); + uint16_t offset = win16_read_u16(address); + uint16_t selector = win16_read_u16(win16_far_add_offset(address, 2)); + return win16_make_far_pointer(selector, offset); +} + +void win16_write_u16(Win16FarPtr base, uint16_t byte_offset, uint16_t value) +{ + Win16FarPtr address = win16_far_add_offset(base, byte_offset); + win16_write_u8(address, (uint8_t)value); + win16_write_u8(win16_far_add_offset(address, 1), (uint8_t)(value >> 8)); +} + +void win16_write_u32(Win16FarPtr base, uint16_t byte_offset, uint32_t value) +{ + win16_write_u16(base, byte_offset, (uint16_t)value); + win16_write_u16(base, (uint16_t)(byte_offset + 2), (uint16_t)(value >> 16)); +} + +void win16_fill_bytes(Win16FarPtr destination, uint16_t count, uint8_t value) +{ + for (uint16_t index = 0; index != count; index++) { + win16_write_u8(win16_far_add_offset(destination, index), value); + } +} + +uint16_t win16_indeterminate_u16(void) +{ + return g_indeterminate_u16; +} + +uint32_t win16_dos_time_words(void) +{ + return g_dos_time_words; +} + +Win16FarPtr win16_current_return_address(void) +{ + return g_current_return_address; +} + +uint16_t win16_current_stack_pointer(void) +{ + if (g_stack_selector == 0) { + abort(); + } + return g_stack_pointer_offset; +} + +uint16_t win16_read_stack_u16(uint16_t offset) +{ + if (g_stack_selector == 0) { + abort(); + } + return win16_read_u16(win16_make_far_pointer(g_stack_selector, offset)); +} + +void win16_write_stack_u16(uint16_t offset, uint16_t value) +{ + if (g_stack_selector == 0) { + abort(); + } + win16_write_u16( + win16_make_far_pointer(g_stack_selector, offset), 0, value); +} + +uint16_t win16_exchange_u16(Win16FarPtr address, uint16_t value) +{ + uint16_t previous = win16_read_u16(address); + win16_write_u16(address, 0, value); + return previous; +} diff --git a/original/reconstructed/tdkpin_segmented.h b/original/reconstructed/tdkpin_segmented.h new file mode 100644 index 0000000..8a2aeb7 --- /dev/null +++ b/original/reconstructed/tdkpin_segmented.h @@ -0,0 +1,111 @@ +#ifndef TDKPIN_SEGMENTED_H +#define TDKPIN_SEGMENTED_H + +#include "tdkpin_win16.h" + +#include +#include + +/* + * Explicit operations whose semantics depend on a live Win16 selector table. + * Keeping them visible prevents a host pointer cast from silently replacing + * segmented 16:16 behavior in the reconstructed source. + */ +Win16FarPtr win16_dgroup_pointer(uint16_t offset); +Win16FarPtr win16_relocated_code_pointer(uint16_t ne_segment, uint16_t offset); +Win16FarPtr win16_stack_pointer(void *pointer); +Win16FarPtr win16_current_stack_address(uint16_t offset); +Win16FarPtr win16_read_far_pointer(Win16FarPtr base, uint16_t byte_offset); +uint8_t win16_read_u8(Win16FarPtr address); +uint16_t win16_read_u16(Win16FarPtr address); +uint32_t win16_read_u32(Win16FarPtr address); +void win16_write_u8(Win16FarPtr address, uint8_t value); +void win16_write_u16(Win16FarPtr base, uint16_t byte_offset, uint16_t value); +void win16_write_u32(Win16FarPtr base, uint16_t byte_offset, uint32_t value); +LRESULT16 win16_call_window_proc( + Win16FarPtr procedure, + HWND16 window, + UINT16 message, + WPARAM16 wparam, + LPARAM16 lparam); +uint16_t win16_call_pascal_u16( + Win16FarPtr procedure, uint16_t argument); +uint16_t win16_call_pascal_u16_no_args(Win16FarPtr procedure); +void win16_call_exit_proc(Win16FarPtr procedure); +void win16_call_object_destructor( + Win16FarPtr procedure, + Win16FarPtr object, + uint16_t dispose_mode); +void win16_call_dynamic_method(Win16FarPtr procedure); +void win16_call_dynamic_method_two_far( + Win16FarPtr procedure, + Win16FarPtr receiver, + Win16FarPtr argument); +void win16_call_object_method( + Win16FarPtr procedure, Win16FarPtr object); +void win16_call_object_u16_method( + Win16FarPtr procedure, + Win16FarPtr object, + uint16_t argument); +void win16_fill_bytes(Win16FarPtr destination, uint16_t count, uint8_t value); +_Noreturn void win16_dos_terminate(uint8_t status); +uint16_t win16_indeterminate_u16(void); +uint32_t win16_dos_time_words(void); +Win16FarPtr win16_current_return_address(void); +uint16_t win16_current_stack_pointer(void); +uint16_t win16_read_stack_u16(uint16_t offset); +void win16_write_stack_u16(uint16_t offset, uint16_t value); +uint16_t win16_exchange_u16(Win16FarPtr address, uint16_t value); +_Noreturn void win16_integer_divide_fault(void); + +typedef struct { + uint16_t ax; + bool carry; +} Win16DosResult; + +/* Register-complete result for DOS calls whose successful value is DX:AX. */ +typedef struct { + uint16_t ax; + uint16_t dx; + bool carry; +} Win16DosExtendedResult; + +typedef struct { + uint16_t attributes; + bool carry; +} Win16DosFileAttributesResult; + +Win16DosResult win16_dos_read( + uint16_t handle, Win16FarPtr buffer, uint16_t count); +Win16DosResult win16_dos_write( + uint16_t handle, Win16FarPtr buffer, uint16_t count); +Win16DosResult win16_dos_close(uint16_t handle); +Win16DosResult win16_dos_seek( + uint16_t handle, uint32_t offset, uint8_t origin); +Win16DosResult win16_dos_open( + Win16FarPtr name, uint8_t access_mode); +Win16DosResult win16_dos_create( + Win16FarPtr name, uint16_t attributes); +Win16DosExtendedResult win16_dos_seek_extended( + uint16_t handle, uint32_t offset, uint8_t origin); +Win16DosExtendedResult win16_dos_get_device_info(uint16_t handle); +Win16DosFileAttributesResult win16_dos_get_file_attributes( + Win16FarPtr oem_name); + +/* Portable verification/runtime binding for selector-backed host memory. */ +void win16_reset_segment_bindings(void); +void win16_bind_segment( + uint16_t selector, void *bytes, size_t size, bool writable); +void win16_bind_ne_segment( + uint16_t ne_segment, + uint16_t selector, + void *bytes, + size_t size, + bool writable); +void win16_set_dgroup_selector(uint16_t selector); +void win16_set_current_return_address(Win16FarPtr address); +void win16_set_dos_time_words(uint32_t words); +void win16_set_indeterminate_u16(uint16_t value); +void win16_set_stack_state(uint16_t selector, uint16_t stack_pointer); + +#endif diff --git a/original/reconstructed/tdkpin_shortstrings.c b/original/reconstructed/tdkpin_shortstrings.c new file mode 100644 index 0000000..42dd18d --- /dev/null +++ b/original/reconstructed/tdkpin_shortstrings.c @@ -0,0 +1,218 @@ +/* Borland 32-bit shift and Turbo Pascal ShortString helpers from Code5. */ + +#include "tdkpin_shortstrings.h" + +uint32_t borland_shift_right_u32(uint32_t value, uint16_t count) +{ + return value >> (count & 0x1f); +} + +uint32_t borland_shift_left_u32(uint32_t value, uint16_t count) +{ + return value << (count & 0x1f); +} + +void borland_short_assign(Win16FarPtr destination, Win16FarPtr source) +{ + uint8_t length = win16_read_u8(source); + win16_write_u8(destination, length); + for (uint16_t index = 1; index <= length; index++) { + win16_write_u8( + win16_far_add_offset(destination, index), + win16_read_u8(win16_far_add_offset(source, index))); + } +} + +void borland_short_assign_truncated( + Win16FarPtr destination, Win16FarPtr source, uint8_t maximum_length) +{ + uint8_t length = win16_read_u8(source); + if (length > maximum_length) { + length = maximum_length; + } + win16_write_u8(destination, length); + for (uint16_t index = 1; index <= length; index++) { + win16_write_u8( + win16_far_add_offset(destination, index), + win16_read_u8(win16_far_add_offset(source, index))); + } +} + +void borland_short_substring( + Win16FarPtr destination, + Win16FarPtr source, + int16_t index, + int16_t count) +{ + if (index < 1) { + index = 1; + } + uint16_t source_length = win16_read_u8(source); + uint16_t available = 0; + if ((uint16_t)index <= source_length) { + available = (uint16_t)(source_length - (uint16_t)index + 1); + } + uint16_t requested = count < 0 ? 0 : (uint16_t)count; + uint8_t copied = (uint8_t)(available < requested ? available : requested); + win16_write_u8(destination, copied); + for (uint16_t offset = 0; offset < copied; offset++) { + win16_write_u8( + win16_far_add_offset(destination, (uint16_t)(offset + 1)), + win16_read_u8(win16_far_add_offset( + source, (uint16_t)((uint16_t)index + offset)))); + } +} + +void borland_short_concat(Win16FarPtr destination, Win16FarPtr source) +{ + uint8_t destination_length = win16_read_u8(destination); + uint8_t source_length = win16_read_u8(source); + uint16_t sum = (uint16_t)destination_length + source_length; + uint8_t copied = source_length; + if (sum > 0xff) { + copied = (uint8_t)~destination_length; + win16_write_u8(destination, 0xff); + } else { + win16_write_u8(destination, (uint8_t)sum); + } + for (uint16_t index = 1; index <= copied; index++) { + win16_write_u8( + win16_far_add_offset( + destination, (uint16_t)(destination_length + index)), + win16_read_u8(win16_far_add_offset(source, index))); + } +} + +uint16_t borland_short_position(Win16FarPtr pattern, Win16FarPtr text) +{ + uint8_t pattern_length = win16_read_u8(pattern); + uint8_t text_length = win16_read_u8(text); + if (pattern_length == 0 || pattern_length > text_length) { + return 0; + } + uint16_t last = (uint16_t)(text_length - pattern_length + 1); + for (uint16_t position = 1; position <= last; position++) { + bool equal = true; + for (uint16_t index = 1; index <= pattern_length; index++) { + if (win16_read_u8(win16_far_add_offset(pattern, index)) != + win16_read_u8(win16_far_add_offset( + text, (uint16_t)(position + index - 1)))) { + equal = false; + break; + } + } + if (equal) { + return position; + } + } + return 0; +} + +/* Materialize the original FLAGS-only comparison as a signed C result. */ +int16_t borland_short_compare(Win16FarPtr left, Win16FarPtr right) +{ + uint8_t left_length = win16_read_u8(left); + uint8_t right_length = win16_read_u8(right); + uint8_t common = left_length < right_length ? left_length : right_length; + for (uint16_t index = 1; index <= common; index++) { + uint8_t left_byte = win16_read_u8(win16_far_add_offset(left, index)); + uint8_t right_byte = win16_read_u8(win16_far_add_offset(right, index)); + if (left_byte != right_byte) { + return (int16_t)left_byte - right_byte; + } + } + return (int16_t)left_length - right_length; +} + +void borland_character_to_short(Win16FarPtr destination, uint8_t character) +{ + win16_write_u8(destination, 1); + win16_write_u8(win16_far_add_offset(destination, 1), character); +} + +void borland_bytes_to_short( + Win16FarPtr destination, Win16FarPtr source, uint16_t count) +{ + win16_write_u8(destination, (uint8_t)count); + for (uint16_t index = 0; index < count; index++) { + win16_write_u8( + win16_far_add_offset(destination, (uint16_t)(index + 1)), + win16_read_u8(win16_far_add_offset(source, index))); + } +} + +static uint8_t copy_short_slice( + uint8_t *output, + uint8_t output_length, + Win16FarPtr source, + uint16_t first, + uint16_t count, + uint8_t maximum) +{ + uint8_t source_length = win16_read_u8(source); + if (first < 1) { + first = 1; + } + uint16_t available = first <= source_length + ? (uint16_t)(source_length - first + 1) + : 0; + uint16_t copied = available < count ? available : count; + if (copied > (uint16_t)(maximum - output_length)) { + copied = (uint16_t)(maximum - output_length); + } + for (uint16_t offset = 0; offset < copied; offset++) { + output[output_length++] = win16_read_u8(win16_far_add_offset( + source, (uint16_t)(first + offset))); + } + return output_length; +} + +/* 1020:0b1b — Insert(insertion,destination,index) with destination max length. */ +void borland_short_insert( + Win16FarPtr destination, + Win16FarPtr insertion, + int16_t index, + uint8_t maximum_length) +{ + if (index < 1) { + index = 1; + } + uint8_t result[255]; + uint8_t length = 0; + length = copy_short_slice( + result, length, destination, 1, (uint16_t)(index - 1), maximum_length); + length = copy_short_slice( + result, length, insertion, 1, 255, maximum_length); + length = copy_short_slice( + result, length, destination, (uint16_t)index, 255, maximum_length); + + win16_write_u8(destination, length); + for (uint16_t offset = 0; offset < length; offset++) { + win16_write_u8( + win16_far_add_offset(destination, (uint16_t)(offset + 1)), + result[offset]); + } +} + +/* 1020:0b7a — Delete(string,index,count); invalid ranges leave it unchanged. */ +void borland_short_delete(Win16FarPtr string, int16_t index, int16_t count) +{ + if (index <= 0 || count <= 0 || count >= 256) { + return; + } + if (index > 255) { + index = 255; + } + uint8_t result[255]; + uint8_t length = 0; + length = copy_short_slice( + result, length, string, 1, (uint16_t)(index - 1), 255); + length = copy_short_slice( + result, length, string, (uint16_t)(index + count), 255, 255); + + win16_write_u8(string, length); + for (uint16_t offset = 0; offset < length; offset++) { + win16_write_u8( + win16_far_add_offset(string, (uint16_t)(offset + 1)), result[offset]); + } +} diff --git a/original/reconstructed/tdkpin_shortstrings.h b/original/reconstructed/tdkpin_shortstrings.h new file mode 100644 index 0000000..a485e42 --- /dev/null +++ b/original/reconstructed/tdkpin_shortstrings.h @@ -0,0 +1,30 @@ +#ifndef TDKPIN_SHORTSTRINGS_H +#define TDKPIN_SHORTSTRINGS_H + +#include "tdkpin_segmented.h" + +uint32_t borland_shift_right_u32(uint32_t value, uint16_t count); +uint32_t borland_shift_left_u32(uint32_t value, uint16_t count); +void borland_short_assign(Win16FarPtr destination, Win16FarPtr source); +void borland_short_assign_truncated( + Win16FarPtr destination, Win16FarPtr source, uint8_t maximum_length); +void borland_short_substring( + Win16FarPtr destination, + Win16FarPtr source, + int16_t index, + int16_t count); +void borland_short_concat(Win16FarPtr destination, Win16FarPtr source); +uint16_t borland_short_position(Win16FarPtr pattern, Win16FarPtr text); +int16_t borland_short_compare(Win16FarPtr left, Win16FarPtr right); +void borland_character_to_short(Win16FarPtr destination, uint8_t character); +void borland_bytes_to_short( + Win16FarPtr destination, Win16FarPtr source, uint16_t count); +void borland_short_insert( + Win16FarPtr destination, + Win16FarPtr insertion, + int16_t index, + uint8_t maximum_length); +void borland_short_delete( + Win16FarPtr string, int16_t index, int16_t count); + +#endif diff --git a/original/reconstructed/tdkpin_sound.c b/original/reconstructed/tdkpin_sound.c new file mode 100644 index 0000000..69896ab --- /dev/null +++ b/original/reconstructed/tdkpin_sound.c @@ -0,0 +1,225 @@ +/* TDKPIN Win16 waveform resource lifecycle. */ + +#include "tdkpin_sound.h" + +#include "tdkpin_borland_runtime.h" +#include "tdkpin_command_line.h" +#include "tdkpin_global_memory.h" +#include "tdkpin_shortstrings.h" +#include "tdkpin_strings.h" + +#include + +enum { + DGROUP_SOUND_SIZE_INDEX_BASE = 0x03e6, + DGROUP_INI_SUFFIX = 0x0442, + DGROUP_INI_SECTION_SETTINGS = 0x0446, + DGROUP_INI_KEY_SOUND = 0x044f, + DGROUP_WAVE_RESOURCE_TYPE = 0x0455, + DGROUP_GAME_TILTED = 0x07c6, + DGROUP_WAVE_CAPABILITIES = 0x43be, + DGROUP_WAVE_DEVICE_COUNT = 0x43ee, + DGROUP_WAVE_DEVICE_ID = 0x43f0, + DGROUP_SOUND_INDEX_BASE = 0x43f2, + DGROUP_SOUND_ENABLED = 0x43f2, + DGROUP_SOUND_PLAYING = 0x43f3, + DGROUP_SOUND_VOLUME_STEP = 0x43f4, + CODE2_EXTENSION_DOT = 0x0f2c, + WAVE_RESOURCE_ID_BASE = 2000, + SOUND_FIRST = 1, + SOUND_LAST = 22, + GMEM_MOVEABLE_ZEROINIT = 0x0042, + WAVECAPS_VOLUME = 0x0004, + SND_ASYNC_NODEFAULT = 0x0005, +}; + +/* + * 1008:0002 — central gameplay sound dispatcher. Tilt suppresses every sound; + * the duplicated Enabled test is retained even though 1008:1131 tests it too. + */ +void tdkpin_play_sound_if_not_tilted(uint16_t sound_number) +{ + if (win16_read_u8(win16_dgroup_pointer(DGROUP_GAME_TILTED)) == 0 && + win16_read_u8(win16_dgroup_pointer(DGROUP_SOUND_ENABLED)) != 0) { + (void)tdkpin_play_sound(sound_number); + } +} + +/* Preserve the original 16-bit shift and DGROUP-offset wrapping. */ +static uint16_t sound_index_byte_offset(uint16_t sound_number) +{ + return (uint16_t)(sound_number << 2); +} + +static uint32_t sound_resource_byte_count(uint16_t sound_number) +{ + uint16_t offset = (uint16_t)( + DGROUP_SOUND_SIZE_INDEX_BASE + sound_index_byte_offset(sound_number)); + return win16_read_u32(win16_dgroup_pointer(offset)); +} + +static Win16FarPtr sound_buffer(uint16_t sound_number) +{ + return win16_read_far_pointer( + win16_dgroup_pointer(DGROUP_SOUND_INDEX_BASE), + sound_index_byte_offset(sound_number)); +} + +static void set_sound_buffer(uint16_t sound_number, Win16FarPtr buffer) +{ + Win16FarPtr base = win16_dgroup_pointer(DGROUP_SOUND_INDEX_BASE); + win16_write_u32(base, sound_index_byte_offset(sound_number), buffer); +} + +/* + * 1008:0f2e — initialize optional waveform playback. + * + * The two ParamStr(0) calls and Borland string operations deliberately mirror + * the binary: they replace the first dot in the module path with "INI". The + * routine then reads [Settings] Sound (default 1), probes wave device zero, + * records volume support, and copies each present WAV resource into its own + * GMEM_MOVEABLE|GMEM_ZEROINIT block. The original has no resource/allocation + * failure checks and this reconstruction intentionally does not add any. + */ +void tdkpin_initialize_sounds(void) +{ + uint8_t parameter_string[512]; + uint8_t ini_file_name[102]; + uint8_t module_file_name[102]; + + win16_write_u8(win16_dgroup_pointer(DGROUP_SOUND_ENABLED), 0); + win16_write_u8(win16_dgroup_pointer(DGROUP_SOUND_PLAYING), 0); + win16_write_u16( + win16_dgroup_pointer(DGROUP_WAVE_DEVICE_COUNT), 0, 0); + + Win16FarPtr parameter = win16_stack_pointer(parameter_string); + Win16FarPtr module_file = win16_stack_pointer(module_file_name); + Win16FarPtr ini_file = win16_stack_pointer(ini_file_name); + borland_parameter_string(0, parameter); + (void)borland_short_to_c_string(module_file, parameter); + + borland_parameter_string(0, parameter); + uint16_t extension_position = borland_short_position( + win16_relocated_code_pointer(2, CODE2_EXTENSION_DOT), parameter); + (void)borland_far_strncpy( + ini_file, module_file, extension_position); + (void)borland_far_strcat( + ini_file, win16_dgroup_pointer(DGROUP_INI_SUFFIX)); + + if (GetPrivateProfileInt16( + win16_dgroup_pointer(DGROUP_INI_SECTION_SETTINGS), + win16_dgroup_pointer(DGROUP_INI_KEY_SOUND), + 1, + ini_file) == 0) { + return; + } + + UINT16 device_count = WaveOutGetNumDevs16(); + win16_write_u16( + win16_dgroup_pointer(DGROUP_WAVE_DEVICE_COUNT), 0, device_count); + if (device_count == 0) { + return; + } + + UINT16 device_id = + win16_read_u16(win16_dgroup_pointer(DGROUP_WAVE_DEVICE_ID)); + if (WaveOutGetDevCaps16( + device_id, + win16_dgroup_pointer(DGROUP_WAVE_CAPABILITIES), + sizeof(WAVEOUTCAPS16)) != 0) { + win16_write_u16( + win16_dgroup_pointer(DGROUP_WAVE_DEVICE_COUNT), 0, 0); + return; + } + + uint32_t support = win16_read_u32( + win16_dgroup_pointer( + (uint16_t)(DGROUP_WAVE_CAPABILITIES + + offsetof(WAVEOUTCAPS16, support)))); + if ((support & WAVECAPS_VOLUME) == 0) { + win16_write_u8( + win16_dgroup_pointer(DGROUP_SOUND_VOLUME_STEP), 0xff); + } else { + uint32_t volume = 0; + (void)WaveOutGetVolume16(device_id, win16_stack_pointer(&volume)); + uint8_t high_byte = (uint8_t)(volume >> 8); + win16_write_u8( + win16_dgroup_pointer(DGROUP_SOUND_VOLUME_STEP), + (uint8_t)((high_byte / 10) * 10)); + } + + for (uint16_t sound_number = SOUND_FIRST; + sound_number <= SOUND_LAST; + sound_number++) { + uint32_t byte_count = sound_resource_byte_count(sound_number); + if (byte_count == 0) { + continue; + } + HRSRC16 found = FindResource16( + g_win16_instance, + win16_make_far_pointer( + 0, (uint16_t)(sound_number + WAVE_RESOURCE_ID_BASE)), + win16_dgroup_pointer(DGROUP_WAVE_RESOURCE_TYPE)); + HGLOBAL16 resource = LoadResource16(g_win16_instance, found); + Win16FarPtr allocation = + tdkpin_global_allocate_locked(GMEM_MOVEABLE_ZEROINIT, byte_count); + set_sound_buffer(sound_number, allocation); + Win16FarPtr resource_bytes = LockResource16(resource); + borland_move_bytes( + allocation, resource_bytes, (uint16_t)byte_count); + (void)GlobalUnlock16(resource); + (void)FreeResource16(resource); + } + win16_write_u8(win16_dgroup_pointer(DGROUP_SOUND_ENABLED), 1); +} + +/* + * 1008:10e3 — stop playback, release sound slots 1..22, clear Playing. + * Device count, enabled state, and the freed far pointers remain unchanged. + */ +void tdkpin_unload_sounds(void) +{ + if (win16_read_u16( + win16_dgroup_pointer(DGROUP_WAVE_DEVICE_COUNT)) == 0) { + return; + } + if (win16_read_u8(win16_dgroup_pointer(DGROUP_SOUND_PLAYING)) != 0) { + (void)SndPlaySound16(0, 0); + } + for (uint16_t sound_number = SOUND_FIRST; + sound_number <= SOUND_LAST; + sound_number++) { + tdkpin_global_unlock_and_free(sound_buffer(sound_number)); + } + win16_write_u8(win16_dgroup_pointer(DGROUP_SOUND_PLAYING), 0); +} + +/* 1008:1131 — play one loaded sound with SND_ASYNC|SND_NODEFAULT. */ +uint16_t tdkpin_play_sound(uint16_t sound_number) +{ + if (win16_read_u16(win16_dgroup_pointer(DGROUP_WAVE_DEVICE_COUNT)) != 0 && + win16_read_u8(win16_dgroup_pointer(DGROUP_SOUND_ENABLED)) != 0 && + sound_resource_byte_count(sound_number) != 0) { + if (win16_read_u8(win16_dgroup_pointer(DGROUP_SOUND_PLAYING)) != 0) { + (void)SndPlaySound16(0, 0); + } + BOOL16 played = SndPlaySound16( + sound_buffer(sound_number), SND_ASYNC_NODEFAULT); + win16_write_u8( + win16_dgroup_pointer(DGROUP_SOUND_PLAYING), played != 0); + } + return win16_indeterminate_u16(); +} + +/* + * 1008:118f — stop only while a wave device exists and a sound is marked + * playing. The target does not clear Playing and returns an uninitialized word. + */ +uint16_t tdkpin_stop_sound_if_active(void) +{ + if (win16_read_u16(win16_dgroup_pointer(DGROUP_WAVE_DEVICE_COUNT)) != 0 && + win16_read_u8(win16_dgroup_pointer(DGROUP_SOUND_PLAYING)) != 0) { + (void)SndPlaySound16(0, 0); + } + return win16_indeterminate_u16(); +} diff --git a/original/reconstructed/tdkpin_sound.h b/original/reconstructed/tdkpin_sound.h new file mode 100644 index 0000000..8ea05f8 --- /dev/null +++ b/original/reconstructed/tdkpin_sound.h @@ -0,0 +1,17 @@ +#ifndef TDKPIN_SOUND_H +#define TDKPIN_SOUND_H + +#include "tdkpin_segmented.h" + +/* Exact initialized lengths for WAV resource numbers 2001..2022. */ +extern const uint32_t g_sound_resource_byte_counts[22]; /* 1028:03ea..0441 */ + +void tdkpin_initialize_sounds(void); /* 1008:0f2e */ +void tdkpin_play_sound_if_not_tilted(uint16_t sound_number); /* 1008:0002 */ +uint16_t tdkpin_stop_sound_if_active(void); /* 1008:118f */ +void tdkpin_unload_sounds(void); /* 1008:10e3 */ +uint16_t tdkpin_play_sound(uint16_t sound_number); /* 1008:1131 */ +BOOL16 SndPlaySound16(Win16FarPtr sound, UINT16 flags); +void tdkpin_global_unlock_and_free(Win16FarPtr block); + +#endif diff --git a/original/reconstructed/tdkpin_stack.c b/original/reconstructed/tdkpin_stack.c new file mode 100644 index 0000000..ac2d434 --- /dev/null +++ b/original/reconstructed/tdkpin_stack.c @@ -0,0 +1,45 @@ +/* Borland 16-bit stack-overflow guard and TDKPIN startup entry. */ + +#include "tdkpin_stack.h" + +enum { + BORLAND_STACK_SAFETY_BYTES = 0x0400, + BORLAND_STACK_LOWER_LIMIT_OFFSET = 0x000a, + BORLAND_STACK_LOW_WATER_OFFSET = 0x000e, +}; + +/* + * 1020:03cb — check AX bytes plus the Borland 0x400-byte safety reserve. + * All comparisons are unsigned 16-bit operations against the live SS layout. + * Runtime Error 202 covers addition overflow, collision with SP, and crossing + * the absolute lower limit. A successful deeper use updates SS:000e. + */ +uint16_t borland_check_stack(uint16_t requested_bytes) +{ + uint16_t required = + (uint16_t)(requested_bytes + BORLAND_STACK_SAFETY_BYTES); + if (required < requested_bytes) { + borland_runtime_error(202); + } + + uint16_t stack_pointer = win16_current_stack_pointer(); + if (required >= stack_pointer) { + borland_runtime_error(202); + } + + uint16_t remaining = (uint16_t)(stack_pointer - required); + if (remaining < + win16_read_stack_u16(BORLAND_STACK_LOWER_LIMIT_OFFSET)) { + borland_runtime_error(202); + } + if (remaining < win16_read_stack_u16(BORLAND_STACK_LOW_WATER_OFFSET)) { + win16_write_stack_u16(BORLAND_STACK_LOW_WATER_OFFSET, remaining); + } + return remaining; +} + +/* 1008:298a — startup unit entry: execute the stack guard with AX=0. */ +void tdkpin_initialize_stack_guard(void) +{ + borland_check_stack(0); +} diff --git a/original/reconstructed/tdkpin_stack.h b/original/reconstructed/tdkpin_stack.h new file mode 100644 index 0000000..0052bd9 --- /dev/null +++ b/original/reconstructed/tdkpin_stack.h @@ -0,0 +1,9 @@ +#ifndef TDKPIN_STACK_H +#define TDKPIN_STACK_H + +#include "tdkpin_borland_runtime.h" + +uint16_t borland_check_stack(uint16_t requested_bytes); /* 1020:03cb */ +void tdkpin_initialize_stack_guard(void); /* 1008:298a */ + +#endif diff --git a/original/reconstructed/tdkpin_status_render.c b/original/reconstructed/tdkpin_status_render.c new file mode 100644 index 0000000..0e1e994 --- /dev/null +++ b/original/reconstructed/tdkpin_status_render.c @@ -0,0 +1,112 @@ +/* Player status threshold and indicator rendering. */ + +#include "tdkpin_render.h" + +enum { + DGROUP_CURRENT_PLAYER = 0x07d1, + DGROUP_DISPLAYED_STATUS_LEVEL = 0x086b, + DGROUP_PLAYER_SCORE_INDEX_BASE = 0x097e, + DGROUP_STATUS_BITMAP_INDEX_BASE = 0x4319, + DGROUP_ITEM_BITMAP_INDEX_BASE = 0x4321, +}; + +static int32_t player_score(uint8_t player) +{ + uint16_t offset = (uint16_t)( + DGROUP_PLAYER_SCORE_INDEX_BASE + (uint16_t)player * 4); + return (int32_t)win16_read_u32(win16_dgroup_pointer(offset)); +} + +static uint16_t status_level_for_score(int32_t score) +{ + if (score > 1300000) { + return 4; + } + if (score > 650000) { + return 3; + } + if (score > 140000) { + return 2; + } + if (score > 2000) { + return 1; + } + return 0; +} + +static void draw_status_indicators( + HDC16 destination, uint16_t active_level, bool all_inactive) +{ + for (uint16_t index = 0; index <= 4; index++) { + int16_t x = (int16_t)((4 - index) * 23 + 77); + if (!all_inactive && index == active_level) { + tdkpin_restore_background_region_a(11, 11, 544, x, destination); + } else { + tdkpin_restore_background_region_b(11, 11, 544, x, destination); + } + tdkpin_present_background_region(11, 11, 544, x, destination); + } +} + +/* + * 1008:0b9e — update the current player's four score-threshold status levels + * and five indicator cells. Player zero clears the display and restores the + * sentinel 99; unrelated/invalid players leave every pixel and state unchanged. + */ +void tdkpin_update_status_display(uint8_t player, HDC16 destination) +{ + uint8_t current_player = win16_read_u8( + win16_dgroup_pointer(DGROUP_CURRENT_PLAYER)); + uint16_t displayed = win16_read_u16( + win16_dgroup_pointer(DGROUP_DISPLAYED_STATUS_LEVEL)); + if ((player == current_player || displayed == 99) && + player != 0 && player < 5) { + uint16_t level = status_level_for_score(player_score(player)); + if (level != displayed) { + if (level == 0) { + tdkpin_restore_background_region_a( + 142, 146, 69, 380, destination); + } else { + uint16_t offset = (uint16_t)( + DGROUP_STATUS_BITMAP_INDEX_BASE + level * 2); + HBITMAP16 bitmap = + win16_read_u16(win16_dgroup_pointer(offset)); + tdkpin_blit_bitmap_to_background( + bitmap, 142, 146, 69, 380, destination); + } + tdkpin_present_background_region( + 142, 146, 69, 380, destination); + draw_status_indicators(destination, level, false); + } + win16_write_u16( + win16_dgroup_pointer(DGROUP_DISPLAYED_STATUS_LEVEL), 0, level); + return; + } + if (player == 0) { + tdkpin_restore_background_region_b( + 142, 146, 69, 380, destination); + tdkpin_present_background_region( + 142, 146, 69, 380, destination); + draw_status_indicators(destination, 0, true); + win16_write_u16( + win16_dgroup_pointer(DGROUP_DISPLAYED_STATUS_LEVEL), 0, 99); + } +} + +/* 1008:0dbd — draw one item state in the fixed 68x61 panel rectangle. */ +void tdkpin_draw_item_status(int16_t item, HDC16 destination) +{ + if (item == 0) { + tdkpin_restore_background_region_b( + 61, 68, 300, 123, destination); + } else { + uint16_t offset = (uint16_t)( + DGROUP_ITEM_BITMAP_INDEX_BASE + (uint16_t)item * 2); + HBITMAP16 bitmap = + win16_read_u16(win16_dgroup_pointer(offset)); + tdkpin_blit_bitmap_to_background( + bitmap, 61, 68, 300, 123, destination); + } + tdkpin_present_background_region( + 61, 68, 300, 123, destination); +} diff --git a/original/reconstructed/tdkpin_strings.c b/original/reconstructed/tdkpin_strings.c new file mode 100644 index 0000000..12f5e45 --- /dev/null +++ b/original/reconstructed/tdkpin_strings.c @@ -0,0 +1,228 @@ +/* Borland far-string and memory helpers reconstructed from Code2. */ + +#include "tdkpin_strings.h" + +#include + +typedef struct { + Win16FarPtr after; + uint16_t remaining; + bool found; +} FarNulScan; + +static FarNulScan scan_nul(Win16FarPtr string, uint16_t maximum) +{ + Win16FarPtr current = string; + uint16_t remaining = maximum; + bool found = false; + while (remaining != 0) { + uint8_t value = win16_read_u8(current); + current = win16_far_add_offset(current, 1); + remaining--; + if (value == 0) { + found = true; + break; + } + } + return (FarNulScan){current, remaining, found}; +} + +/* 1020:0891 — unconditional forward CLD/REP MOVSB far copy. */ +void borland_far_copy( + Win16FarPtr destination, Win16FarPtr source, uint16_t count) +{ + for (uint16_t index = 0; index != count; index++) { + win16_write_u8( + win16_far_add_offset(destination, index), + win16_read_u8(win16_far_add_offset(source, index))); + } +} + +/* 1008:2e92 — REPNE SCASB strlen with CX=ffff. */ +uint16_t borland_far_strlen(Win16FarPtr string) +{ + FarNulScan scan = scan_nul(string, 0xffff); + return (uint16_t)(0xfffe - scan.remaining); +} + +/* 1008:2ea9 — pointer to the NUL found by the same bounded scan. */ +Win16FarPtr borland_far_strend(Win16FarPtr string) +{ + FarNulScan scan = scan_nul(string, 0xffff); + return win16_far_add_offset(scan.after, 0xffff); +} + +/* + * 1008:2ec0 — far memmove. + * Direction is selected solely by the unsigned source/destination offsets; + * selectors are deliberately not compared, exactly like CMP SI,DI. + */ +Win16FarPtr borland_far_memmove( + Win16FarPtr destination, Win16FarPtr source, uint16_t count) +{ + if (win16_far_offset(source) < win16_far_offset(destination)) { + for (uint16_t remaining = count; remaining != 0; remaining--) { + uint16_t index = (uint16_t)(remaining - 1); + win16_write_u8( + win16_far_add_offset(destination, index), + win16_read_u8(win16_far_add_offset(source, index))); + } + } else { + for (uint16_t index = 0; index != count; index++) { + win16_write_u8( + win16_far_add_offset(destination, index), + win16_read_u8(win16_far_add_offset(source, index))); + } + } + return destination; +} + +/* 1008:2ee5 — copy through and including the bounded NUL. */ +Win16FarPtr borland_far_strcpy(Win16FarPtr destination, Win16FarPtr source) +{ + FarNulScan scan = scan_nul(source, 0xffff); + uint16_t count = (uint16_t)~scan.remaining; + for (uint16_t index = 0; index != count; index++) { + win16_write_u8( + win16_far_add_offset(destination, index), + win16_read_u8(win16_far_add_offset(source, index))); + } + return destination; +} + +/* + * 1008:2f07 — bounded copy followed by an unconditional extra NUL. + * If the source NUL lies within maximum, that NUL is copied and a second one is + * appended; if not, maximum bytes plus one NUL are written. + */ +Win16FarPtr borland_far_strncpy( + Win16FarPtr destination, Win16FarPtr source, uint16_t maximum) +{ + FarNulScan scan = scan_nul(source, maximum); + uint16_t count = (uint16_t)(maximum - scan.remaining); + for (uint16_t index = 0; index != count; index++) { + win16_write_u8( + win16_far_add_offset(destination, index), + win16_read_u8(win16_far_add_offset(source, index))); + } + win16_write_u8(win16_far_add_offset(destination, count), 0); + return destination; +} + +/* 1008:2f2f — Turbo Pascal short string to NUL-terminated far string. */ +Win16FarPtr borland_short_to_c_string( + Win16FarPtr destination, Win16FarPtr short_string) +{ + uint8_t length = win16_read_u8(short_string); + for (uint16_t index = 0; index < length; index++) { + win16_write_u8( + win16_far_add_offset(destination, index), + win16_read_u8(win16_far_add_offset(short_string, (uint16_t)(index + 1)))); + } + win16_write_u8(win16_far_add_offset(destination, length), 0); + return destination; +} + +/* 1008:2f4d — append source at destination's bounded NUL. */ +Win16FarPtr borland_far_strcat(Win16FarPtr destination, Win16FarPtr source) +{ + (void)borland_far_strcpy(borland_far_strend(destination), source); + return destination; +} + +static uint8_t ascii_upper(uint8_t value) +{ + return value >= 'a' && value <= 'z' ? (uint8_t)(value - 0x20) : value; +} + +/* + * 1008:2f70 — ASCII-only case-insensitive comparison of at most maximum bytes. + * Comparison length is min(maximum, strlen(second)+1), so the second string's + * NUL participates when it lies inside the bound. + */ +int16_t borland_far_strnicmp( + Win16FarPtr first, Win16FarPtr second, uint16_t maximum) +{ + if (maximum == 0) { + return 0; + } + FarNulScan scan = scan_nul(second, maximum); + uint16_t count = (uint16_t)(maximum - scan.remaining); + for (uint16_t index = 0; index < count; index++) { + uint8_t first_byte = win16_read_u8(win16_far_add_offset(first, index)); + uint8_t second_byte = win16_read_u8(win16_far_add_offset(second, index)); + if (first_byte != second_byte) { + int16_t difference = + (int16_t)ascii_upper(first_byte) - ascii_upper(second_byte); + if (difference != 0) { + return difference; + } + } + } + return 0; +} + +/* 1008:2fbb — forward character search including the terminating NUL. */ +Win16FarPtr borland_far_strchr(Win16FarPtr string, uint8_t character) +{ + FarNulScan scan = scan_nul(string, 0xffff); + uint16_t count = (uint16_t)~scan.remaining; + for (uint16_t index = 0; index < count; index++) { + Win16FarPtr current = win16_far_add_offset(string, index); + if (win16_read_u8(current) == character) { + return current; + } + } + return 0; +} + +/* 1008:2fe3 — reverse character search including the terminating NUL. */ +Win16FarPtr borland_far_strrchr(Win16FarPtr string, uint8_t character) +{ + FarNulScan scan = scan_nul(string, 0xffff); + uint16_t count = (uint16_t)~scan.remaining; + Win16FarPtr current = win16_far_add_offset(scan.after, 0xffff); + for (uint16_t remaining = count; remaining != 0; remaining--) { + if (win16_read_u8(current) == character) { + return current; + } + current = win16_far_add_offset(current, 0xffff); + } + return 0; +} + +/* + * 1008:300a — NUL-terminated far string to Turbo Pascal short string. + * CL alone becomes the length byte, but REP MOVSB still uses the full 16-bit + * length; this preserves the original overflow behavior for strings >255. + */ +void borland_c_to_short_string(Win16FarPtr destination, Win16FarPtr source) +{ + FarNulScan scan = scan_nul(source, 0xffff); + uint16_t length = (uint16_t)(~scan.remaining - 1); + win16_write_u8(destination, (uint8_t)length); + for (uint16_t index = 0; index < length; index++) { + win16_write_u8( + win16_far_add_offset(destination, (uint16_t)(index + 1)), + win16_read_u8(win16_far_add_offset(source, index))); + } +} + +/* 1008:302c — allocate and copy one nonempty far C string. */ +Win16FarPtr borland_far_strdup(Win16FarPtr source) +{ + if (source == 0 || win16_read_u8(source) == 0) { + return 0; + } + uint16_t bytes = (uint16_t)(borland_far_strlen(source) + 1); + Win16FarPtr copy = borland_get_mem(bytes); + return copy == 0 ? 0 : borland_far_memmove(copy, source, bytes); +} + +/* 1008:3099 — release one allocated far C string including its NUL. */ +void borland_far_strdispose(Win16FarPtr string) +{ + if (string != 0) { + borland_free_mem(string, (uint16_t)(borland_far_strlen(string) + 1)); + } +} diff --git a/original/reconstructed/tdkpin_strings.h b/original/reconstructed/tdkpin_strings.h new file mode 100644 index 0000000..1ff29db --- /dev/null +++ b/original/reconstructed/tdkpin_strings.h @@ -0,0 +1,26 @@ +#ifndef TDKPIN_STRINGS_H +#define TDKPIN_STRINGS_H + +#include "tdkpin_borland_runtime.h" + +uint16_t borland_far_strlen(Win16FarPtr string); +Win16FarPtr borland_far_strend(Win16FarPtr string); +Win16FarPtr borland_far_memmove( + Win16FarPtr destination, Win16FarPtr source, uint16_t count); +Win16FarPtr borland_far_strcpy(Win16FarPtr destination, Win16FarPtr source); +Win16FarPtr borland_far_strncpy( + Win16FarPtr destination, Win16FarPtr source, uint16_t maximum); +Win16FarPtr borland_short_to_c_string( + Win16FarPtr destination, Win16FarPtr short_string); +Win16FarPtr borland_far_strcat(Win16FarPtr destination, Win16FarPtr source); +int16_t borland_far_strnicmp( + Win16FarPtr first, Win16FarPtr second, uint16_t maximum); +Win16FarPtr borland_far_strchr(Win16FarPtr string, uint8_t character); +Win16FarPtr borland_far_strrchr(Win16FarPtr string, uint8_t character); +void borland_c_to_short_string(Win16FarPtr destination, Win16FarPtr source); +Win16FarPtr borland_far_strdup(Win16FarPtr source); +void borland_far_strdispose(Win16FarPtr string); +void borland_far_copy( + Win16FarPtr destination, Win16FarPtr source, uint16_t count); + +#endif diff --git a/original/reconstructed/tdkpin_system_timer.c b/original/reconstructed/tdkpin_system_timer.c new file mode 100644 index 0000000..2543faa --- /dev/null +++ b/original/reconstructed/tdkpin_system_timer.c @@ -0,0 +1,86 @@ +/* TDKPIN's small ObjectWindows/MMTIMER system-timer class. */ + +#include "tdkpin_system_timer.h" + +enum { + SYSTEM_TIMER_VMT_OFFSET = 0, + SYSTEM_TIMER_ID_OFFSET = 2, + SYSTEM_TIMER_RECIPIENT_OFFSET = 4, +}; + +/* + * 1008:295c — create the underlying MMTIMER timer. + * MOV AL,[BP+0a] deliberately preserves AH returned by the stack checker, so + * the imported word-valued one_shot argument is not merely zero or one. + */ +uint16_t tdkpin_system_timer_start( + Win16FarPtr object, + uint8_t one_shot, + uint16_t resolution_ms, + uint16_t delay_ms) +{ + uint16_t stack_result = borland_check_stack(2); + uint16_t one_shot_word = + (uint16_t)((stack_result & 0xff00u) | one_shot); + HWND16 recipient = + win16_read_u16(win16_far_add_offset( + object, SYSTEM_TIMER_RECIPIENT_OFFSET)); + return SystemTimerMake16( + recipient, delay_ms, resolution_ms, one_shot_word); +} + +/* 1008:2932 — cancel a live multimedia timer, then clear its id. */ +void tdkpin_system_timer_stop(Win16FarPtr object) +{ + (void)borland_check_stack(0); + uint16_t timer_id = + win16_read_u16(win16_far_add_offset(object, SYSTEM_TIMER_ID_OFFSET)); + if (timer_id != 0) { + (void)TimeKillEvent16(timer_id); + } + win16_write_u16(object, SYSTEM_TIMER_ID_OFFSET, 0); +} + +/* + * 1008:28a3 — construct the six-byte timer object and start its timer. + * A zero timer id invokes the Borland constructor-failure cleanup. That frees + * newly allocated instances but leaves caller-owned instances in place because + * 1020:03ef cleared their hidden VMT ownership argument. + */ +Win16FarPtr tdkpin_system_timer_construct( + Win16FarPtr object, + uint16_t vmt, + uint8_t one_shot, + uint16_t resolution_ms, + uint16_t delay_ms, + HWND16 recipient) +{ + (void)borland_check_stack(0); + BorlandObjectCallFrame frame = {object, vmt}; + if (!borland_enter_object_constructor( + &frame, SYSTEM_TIMER_VMT_OFFSET)) { + return frame.object; + } + + frame.object = borland_default_object_constructor(frame.object, 0); + win16_write_u16(frame.object, SYSTEM_TIMER_ID_OFFSET, 0); + win16_write_u16(frame.object, SYSTEM_TIMER_RECIPIENT_OFFSET, recipient); + uint16_t timer_id = tdkpin_system_timer_start( + frame.object, one_shot, resolution_ms, delay_ms); + win16_write_u16(frame.object, SYSTEM_TIMER_ID_OFFSET, timer_id); + if (timer_id == 0) { + borland_finish_object_destructor( + &frame, SYSTEM_TIMER_VMT_OFFSET); + } + return frame.object; +} + +/* 1008:2906 — stop the timer, run the root destructor, and release if owned. */ +void tdkpin_system_timer_destruct(Win16FarPtr object, uint16_t vmt) +{ + (void)borland_check_stack(0); + BorlandObjectCallFrame frame = {object, vmt}; + tdkpin_system_timer_stop(frame.object); + borland_default_object_destructor(frame.object, 0); + borland_finish_object_destructor(&frame, SYSTEM_TIMER_VMT_OFFSET); +} diff --git a/original/reconstructed/tdkpin_system_timer.h b/original/reconstructed/tdkpin_system_timer.h new file mode 100644 index 0000000..a5533c2 --- /dev/null +++ b/original/reconstructed/tdkpin_system_timer.h @@ -0,0 +1,23 @@ +#ifndef TDKPIN_SYSTEM_TIMER_H +#define TDKPIN_SYSTEM_TIMER_H + +#include "tdkpin_borland_objects.h" +#include "tdkpin_stack.h" + +Win16FarPtr tdkpin_system_timer_construct( + Win16FarPtr object, + uint16_t vmt, + uint8_t one_shot, + uint16_t resolution_ms, + uint16_t delay_ms, + HWND16 recipient); /* 1008:28a3 */ +void tdkpin_system_timer_destruct( + Win16FarPtr object, uint16_t vmt); /* 1008:2906 */ +void tdkpin_system_timer_stop(Win16FarPtr object); /* 1008:2932 */ +uint16_t tdkpin_system_timer_start( + Win16FarPtr object, + uint8_t one_shot, + uint16_t resolution_ms, + uint16_t delay_ms); /* 1008:295c */ + +#endif diff --git a/original/reconstructed/tdkpin_tables.c b/original/reconstructed/tdkpin_tables.c new file mode 100644 index 0000000..3a24a35 --- /dev/null +++ b/original/reconstructed/tdkpin_tables.c @@ -0,0 +1,25 @@ +/* Address-linked compact word tables used by TDKPIN game setup. */ + +#include "tdkpin_tables.h" + +enum { DGROUP_WORD_QUADS = 0x4263 }; + +/* + * 1008:0787 — write one eight-byte record. The Pascal argument order is the + * reverse of in-memory field order; index multiplication retains 16 bits. + */ +void tdkpin_set_word_quad( + uint16_t source_word_6, + uint16_t source_word_4, + uint16_t source_word_2, + uint16_t source_word_0, + uint16_t index) +{ + uint16_t offset = + (uint16_t)(DGROUP_WORD_QUADS + (uint16_t)(index * 8u)); + Win16FarPtr record = win16_dgroup_pointer(offset); + win16_write_u16(record, 0, source_word_0); + win16_write_u16(record, 2, source_word_2); + win16_write_u16(record, 4, source_word_4); + win16_write_u16(record, 6, source_word_6); +} diff --git a/original/reconstructed/tdkpin_tables.h b/original/reconstructed/tdkpin_tables.h new file mode 100644 index 0000000..4e332f4 --- /dev/null +++ b/original/reconstructed/tdkpin_tables.h @@ -0,0 +1,24 @@ +#ifndef TDKPIN_TABLES_H +#define TDKPIN_TABLES_H + +#include "tdkpin_segmented.h" + +#pragma pack(push, 1) +typedef struct { + uint16_t word_0; + uint16_t word_2; + uint16_t word_4; + uint16_t word_6; +} TdkpinWordQuad; +#pragma pack(pop) + +_Static_assert(sizeof(TdkpinWordQuad) == 8, "word-quad layout drift"); + +void tdkpin_set_word_quad( + uint16_t source_word_6, + uint16_t source_word_4, + uint16_t source_word_2, + uint16_t source_word_0, + uint16_t index); /* 1008:0787 */ + +#endif diff --git a/original/reconstructed/tdkpin_timer_tick.c b/original/reconstructed/tdkpin_timer_tick.c new file mode 100644 index 0000000..7e58266 --- /dev/null +++ b/original/reconstructed/tdkpin_timer_tick.c @@ -0,0 +1,660 @@ +/* Multimedia timer callback exported at 1000:eab1. */ + +#include "tdkpin_timer_tick.h" + +#include "tdkpin_arithmetic.h" +#include "tdkpin_collision_records.h" +#include "tdkpin_flippers.h" +#include "tdkpin_gameplay_helpers.h" +#include "tdkpin_mechanism_render.h" +#include "tdkpin_message_pump.h" +#include "tdkpin_panel_animation.h" +#include "tdkpin_physics.h" +#include "tdkpin_player_state.h" +#include "tdkpin_real48.h" +#include "tdkpin_render.h" +#include "tdkpin_sound.h" +#include "tdkpin_turn_state.h" + +enum { + RECORDS_BASE = 0x095b, + RECORD_BYTES = 0x53, + RECORD_ACTIVE = 0x34, +}; + +typedef struct { + uint16_t claw_position; + int32_t ball_x; + int32_t ball_y; + BorlandReal48 velocity_x_factor; + BorlandReal48 velocity_y_factor; + bool direct_velocity; +} ClawRelease; + +static const ClawRelease g_claw_releases[] = { + {1, 258000, 78000, + {{0x80,0x9a,0x99,0x99,0x99,0x99}}, {{0,0,0,0,0,0}}, false}, + {2, 259000, 81000, + {{0x7f,0x66,0x66,0x66,0x66,0xe6}}, + {{0x7c,0xcd,0xcc,0xcc,0xcc,0x4c}}, false}, + {3, 258000, 78000, + {{0x80,0x33,0x33,0x33,0x33,0xb3}}, + {{0x7f,0x9a,0x99,0x99,0x99,0x19}}, false}, + {4, 261000, 86000, + {{0x7f,0x9a,0x99,0x99,0x99,0x99}}, + {{0x7e,0xcd,0xcc,0xcc,0xcc,0x4c}}, false}, + {5, 266000, 90000, + {{0x7f,0x71,0x3d,0x0a,0xd7,0xa3}}, + {{0x7e,0x7b,0x14,0xae,0x47,0x61}}, false}, + {6, 270000, 94000, + {{0x7f,0xcd,0xcc,0xcc,0xcc,0xcc}}, + {{0x80,0x9a,0x99,0x99,0x99,0x19}}, false}, + {7, 275000, 97000, + {{0x7f,0x85,0xeb,0x51,0xb8,0x9e}}, + {{0x80,0x33,0x33,0x33,0x33,0x33}}, false}, + {8, 278000, 98000, + {{0x7e,0xcd,0xcc,0xcc,0xcc,0xcc}}, + {{0x80,0xcd,0xcc,0xcc,0xcc,0x4c}}, false}, + {9, 282000, 101000, + {{0x7d,0xcd,0xcc,0xcc,0xcc,0xcc}}, + {{0x80,0x66,0x66,0x66,0x66,0x66}}, false}, + {18, 325000, 92000, + {{0,0,0,0,0,0}}, {{0,0,0,0,0,0}}, true}, +}; + +static int32_t dgroup_i32(uint16_t offset) +{ + return (int32_t)win16_read_u32(win16_dgroup_pointer(offset)); +} + +static void write_dgroup_i32(uint16_t offset, int32_t value) +{ + win16_write_u32(win16_dgroup_pointer(offset), 0, (uint32_t)value); +} + +static uint32_t tick_count(void) +{ + return win16_read_u32(win16_dgroup_pointer(0x0876)); +} + +static int32_t quotient_i32(int32_t dividend, int32_t divisor) +{ + return borland_divide_i32(dividend, divisor).quotient; +} + +static int32_t remainder_i32(int32_t dividend, int32_t divisor) +{ + return borland_divide_i32(dividend, divisor).remainder; +} + +static Win16FarPtr collision_record(uint16_t id) +{ + return win16_dgroup_pointer((uint16_t)(RECORDS_BASE + id * RECORD_BYTES)); +} + +static void write_receiver_i32( + Win16FarPtr window, uint16_t offset, int32_t value) +{ + win16_write_u32(window, offset, (uint32_t)value); +} + +static void refresh_region( + Win16FarPtr window, + bool background_b, + INT16 height, + INT16 width, + INT16 y, + INT16 x) +{ + HWND16 handle = win16_read_u16(win16_far_add_offset(window, 4)); + HDC16 dc = GetDC16(handle); + if (background_b) { + tdkpin_restore_background_region_b(height, width, y, x, dc); + } else { + tdkpin_restore_background_region_a(height, width, y, x, dc); + } + tdkpin_present_background_region(height, width, y, x, dc); + (void)ReleaseDC16(handle, dc); +} + +static void draw_claw( + Win16FarPtr window, uint8_t alternate, uint16_t frame) +{ + HWND16 handle = win16_read_u16(win16_far_add_offset(window, 4)); + HDC16 dc = GetDC16(handle); + tdkpin_draw_claw_frame(alternate, frame, dc); + (void)ReleaseDC16(handle, dc); +} + +static const ClawRelease *find_claw_release(uint16_t claw_position) +{ + for (size_t index = 0; + index < sizeof(g_claw_releases) / sizeof(g_claw_releases[0]); + index++) { + if (g_claw_releases[index].claw_position == claw_position) { + return &g_claw_releases[index]; + } + } + return NULL; +} + +static void release_ball_from_claw( + uint16_t frame_bp, Win16FarPtr window, uint16_t claw_position) +{ + draw_claw(window, 0, claw_position); + win16_write_u16(win16_dgroup_pointer(0x086f), 0, 10); + win16_write_u8(win16_dgroup_pointer(0x0873), 0); + win16_write_u16(win16_dgroup_pointer(0x2679), 0, 0); + write_receiver_i32(window, 0x0bca, 0); + for (uint16_t index = 0; index < 6; index++) { + win16_write_u8( + win16_far_add_offset(window, (uint16_t)(0x0bce + index)), 0); + } + + const ClawRelease *release = find_claw_release(claw_position); + if (release != NULL) { + write_dgroup_i32(0x07d3, release->ball_x); + write_dgroup_i32(0x07d7, release->ball_y); + if (release->direct_velocity) { + write_receiver_i32(window, 0x0baa, 0); + write_receiver_i32(window, 0x0bae, 1000); + } else { + BorlandReal48 scalar = borland_i32_to_real48( + (int32_t)win16_read_u32(win16_far_add_offset(window, 0x56))); + write_receiver_i32( + window, + 0x0baa, + borland_real48_round_to_i32(borland_real48_multiply( + scalar, release->velocity_x_factor))); + write_receiver_i32( + window, + 0x0bae, + borland_real48_round_to_i32(borland_real48_multiply( + scalar, release->velocity_y_factor))); + } + } + tdkpin_save_ball_slot(frame_bp, 1); + tdkpin_render_ball_from_caller_frame(frame_bp); + tdkpin_play_sound_if_not_tilted(16); + win16_write_u8(win16_far_add_offset(window, 0x0bdf), 0); +} + +static void update_claw_state(uint16_t frame_bp, Win16FarPtr window) +{ + if (win16_read_u8(win16_dgroup_pointer(0x07ca)) == 0 || + win16_read_u8(win16_dgroup_pointer(0x0874)) != 0) { + return; + } + uint16_t current = win16_read_u16(win16_dgroup_pointer(0x086d)); + uint16_t target = win16_read_u16(win16_dgroup_pointer(0x086f)); + if (current != target) { + current = target > current ? (uint16_t)(current + 1u) + : (uint16_t)(current - 1u); + win16_write_u16(win16_dgroup_pointer(0x086d), 0, current); + draw_claw( + window, + win16_read_u8(win16_dgroup_pointer(0x0873)), + current); + return; + } + if (current != 10) { + release_ball_from_claw(frame_bp, window, current); + return; + } + + draw_claw(window, 0, 0); + if (win16_read_u8(win16_dgroup_pointer(0x0873)) == 0) { + win16_write_u8(win16_dgroup_pointer(0x07ca), 0); + for (uint16_t id = 12; id <= 20; id++) { + win16_write_u8( + win16_far_add_offset(collision_record(id), RECORD_ACTIVE), 1); + } + } +} + +static void update_record_countdowns( + uint16_t frame_bp, Win16FarPtr window) +{ + for (uint16_t id = 1; id <= 175; id++) { + Win16FarPtr counter = win16_far_add_offset( + window, (uint16_t)(0x61 + id)); + uint8_t value = win16_read_u8(counter); + if (value != 0) { + value--; + win16_write_u8(counter, value); + if (value == 0) { + tdkpin_restore_record_b(frame_bp, id); + } + } + } +} + +static void update_target_rotation(uint16_t frame_bp) +{ + if (win16_read_u8(win16_dgroup_pointer(0x07c7)) == 0) { + return; + } + int32_t state = dgroup_i32(0x0855); + if (state < 6) { + write_dgroup_i32(0x0855, (int32_t)((uint32_t)state + 1u)); + tdkpin_rotate_and_draw_targets(frame_bp); + } else { + win16_write_u8(win16_dgroup_pointer(0x07c7), 0); + } +} + +static void publish_previous_position_from_slot( + Win16FarPtr window, uint16_t slot) +{ + uint16_t stride = (uint16_t)(slot * 4u); + write_receiver_i32(window, 0x0bc2, dgroup_i32((uint16_t)(0x07e3 + stride))); + write_receiver_i32(window, 0x0bc6, dgroup_i32((uint16_t)(0x07eb + stride))); +} + +static void restore_slot_region_or_clear_suppression( + uint16_t frame_bp, Win16FarPtr window, uint16_t slot) +{ + if (win16_read_u8(win16_far_add_offset(window, 0x0be1)) == 0) { + publish_previous_position_from_slot(window, slot); + tdkpin_restore_previous_ball_region(frame_bp, 0); + } else { + win16_write_u8(win16_far_add_offset(window, 0x0be1), 0); + } +} + +static void copy_ball_slot_one_to_zero(void) +{ + write_dgroup_i32(0x07e3, dgroup_i32(0x07e7)); + write_dgroup_i32(0x07eb, dgroup_i32(0x07ef)); + write_dgroup_i32(0x07f3, dgroup_i32(0x07f7)); + write_dgroup_i32(0x07fb, dgroup_i32(0x07ff)); + write_dgroup_i32(0x0803, dgroup_i32(0x0807)); + for (uint16_t index = 0; index < 6; index++) { + win16_write_u8( + win16_dgroup_pointer((uint16_t)(0x080b + index)), + win16_read_u8(win16_dgroup_pointer( + (uint16_t)(0x0811 + index)))); + } +} + +static void collapse_finished_multiball( + uint16_t frame_bp, Win16FarPtr window) +{ + if (win16_read_u8(win16_far_add_offset(window, 0x61)) <= 1) { + return; + } + if (win16_read_u8(win16_dgroup_pointer(0x41f9)) == 0) { + restore_slot_region_or_clear_suppression(frame_bp, window, 0); + win16_write_u8(win16_far_add_offset(window, 0x61), 1); + win16_write_u8(win16_dgroup_pointer(0x0874), 0); + win16_write_u8(win16_dgroup_pointer(0x41f9), 1); + if (win16_read_u8(win16_dgroup_pointer(0x424c)) == 0) { + publish_previous_position_from_slot(window, 1); + tdkpin_finish_ball_or_advance_player(frame_bp); + } else { + copy_ball_slot_one_to_zero(); + tdkpin_load_ball_slot(frame_bp, 0); + win16_write_u8(win16_dgroup_pointer(0x424c), 0); + } + } else if (win16_read_u8(win16_dgroup_pointer(0x424c)) == 0) { + restore_slot_region_or_clear_suppression(frame_bp, window, 1); + win16_write_u8(win16_far_add_offset(window, 0x61), 1); + win16_write_u8(win16_dgroup_pointer(0x0874), 0); + tdkpin_load_ball_slot(frame_bp, 0); + } +} + +static void handle_ball_reset_request( + uint16_t frame_bp, Win16FarPtr window) +{ + if (win16_read_u8(win16_far_add_offset(window, 0x0be2)) != 1) { + return; + } + win16_write_u8(win16_far_add_offset(window, 0x0be2), 0); + tdkpin_save_ball_slot(frame_bp, 1); + tdkpin_update_dynamic_ball_record(frame_bp, 2); + tdkpin_reset_ball_state(frame_bp); + refresh_region(window, true, 20, 148, 243, 84); + tdkpin_save_ball_slot(frame_bp, 0); + tdkpin_update_dynamic_ball_record(frame_bp, 1); +} + +static void handle_multiball_spawn_request( + uint16_t frame_bp, Win16FarPtr window) +{ + if (win16_read_u8(win16_far_add_offset(window, 0x0be0)) != 1) { + return; + } + tdkpin_save_ball_slot(frame_bp, 0); + tdkpin_update_dynamic_ball_record(frame_bp, 1); + write_dgroup_i32(0x07d3, dgroup_i32(0x3969)); + write_dgroup_i32(0x07d7, dgroup_i32(0x396d)); + write_receiver_i32(window, 0x0bc2, dgroup_i32(0x07d3)); + write_receiver_i32(window, 0x0bc6, dgroup_i32(0x07d7)); + tdkpin_restore_previous_ball_region(frame_bp, 0); + uint8_t player = win16_read_u8(win16_dgroup_pointer(0x07d1)); + win16_write_u8( + win16_far_add_offset(window, (uint16_t)(player * 0x14u + 0x047b)), 0); + tdkpin_restore_record_b(frame_bp, 1020); + write_receiver_i32(window, 0x0baa, 0); + static const BorlandReal48 four_fifths = + {{0x80,0xcd,0xcc,0xcc,0xcc,0x4c}}; + write_receiver_i32( + window, + 0x0bae, + borland_real48_round_to_i32(borland_real48_multiply( + borland_i32_to_real48((int32_t)win16_read_u32( + win16_far_add_offset(window, 0x56))), + four_fifths))); + write_receiver_i32(window, 0x0bca, 0); + for (uint16_t index = 0; index < 6; index++) { + win16_write_u8( + win16_far_add_offset(window, (uint16_t)(0x0bce + index)), 0); + } + win16_write_u16(win16_dgroup_pointer(0x399a), 0, 2); + tdkpin_save_ball_slot(frame_bp, 1); + tdkpin_update_dynamic_ball_record(frame_bp, 2); + win16_write_u8(win16_dgroup_pointer(0x41f9), 1); + win16_write_u8(win16_dgroup_pointer(0x424c), 1); + win16_write_u8(win16_far_add_offset(window, 0x61), 2); + win16_write_u8(win16_dgroup_pointer(0x0874), 1); + win16_write_u8(win16_far_add_offset(window, 0x0be0), 0); +} + +static void active_ball_tick(uint16_t frame_bp, Win16FarPtr window) +{ + update_claw_state(frame_bp, window); + update_record_countdowns(frame_bp, window); + update_target_rotation(frame_bp); + collapse_finished_multiball(frame_bp, window); + if (win16_read_u8(win16_far_add_offset(window, 0x0bd8)) == 0 && + win16_read_u8(win16_far_add_offset(window, 0x0bdf)) == 0) { + tdkpin_simulate_ball_and_dispatch_collision(frame_bp); + } + handle_ball_reset_request(frame_bp, window); + handle_multiball_spawn_request(frame_bp, window); +} + +static void update_intro_collision_visibility(uint16_t frame_bp, int32_t tick) +{ + if (remainder_i32(tick, 2) == 0) { + int32_t phase = quotient_i32(quotient_i32(tick, 32), 2); + if (phase >= 0 && phase <= 7) { + tdkpin_restore_record_or_item_a( + frame_bp, (uint16_t)(phase + 140)); + } else if (phase >= 8 && phase <= 15) { + tdkpin_restore_record_b( + frame_bp, (uint16_t)(phase + 132)); + } + } + if (remainder_i32(tick, 4) == 0) { + int32_t phase = quotient_i32(quotient_i32(tick, 32), 4); + if (phase == 0) { + tdkpin_restore_record_or_item_a(frame_bp, 1001); + tdkpin_restore_record_b(frame_bp, 1002); + } else if (phase >= 1 && phase <= 4) { + tdkpin_restore_record_or_item_a( + frame_bp, (uint16_t)(phase + 1001)); + tdkpin_restore_record_b( + frame_bp, (uint16_t)(phase + 1000)); + } else if (phase >= 5 && phase <= 8) { + tdkpin_restore_record_or_item_a( + frame_bp, (uint16_t)(1009 - phase)); + tdkpin_restore_record_b( + frame_bp, (uint16_t)(1010 - phase)); + } + } + int32_t phase32 = remainder_i32(tick, 32); + if (phase32 == 0 || phase32 == 16) { + bool background_b = phase32 == 16; + uint16_t ids[] = {153, 154, 6}; + for (size_t index = 0; index < sizeof(ids) / sizeof(ids[0]); index++) { + if (background_b) { + tdkpin_restore_record_b(frame_bp, ids[index]); + } else { + tdkpin_restore_record_or_item_a(frame_bp, ids[index]); + } + } + } +} + +static void update_intro_record_strip( + Win16FarPtr window, int32_t tick) +{ + if (remainder_i32(tick, 4) != 0) { + return; + } + int32_t phase = quotient_i32(quotient_i32(tick, 40), 4); + bool background_b = phase >= 5; + int32_t normalized = background_b ? phase - 5 : phase; + uint16_t id = (uint16_t)(normalized * 3 + 90); + Win16FarPtr record = collision_record(id); + INT16 left = (INT16)win16_read_u16( + win16_far_add_offset(record, 0x4b)); + INT16 top = (INT16)win16_read_u16( + win16_far_add_offset(record, 0x4d)); + INT16 width = (INT16)( + win16_read_u16(win16_far_add_offset(record, 0x4f)) - + (uint16_t)left - 10u); + INT16 height = (INT16)( + win16_read_u16(win16_far_add_offset(record, 0x51)) - + (uint16_t)top + 1u); + refresh_region(window, background_b, height, width, top, left); +} + +static void update_intro_four_point_chase( + Win16FarPtr window, int32_t tick) +{ + if (remainder_i32(tick, 4) != 0) { + return; + } + static const INT16 y[4] = {209, 214, 219, 224}; + static const INT16 x[4] = {150, 164, 178, 192}; + int32_t phase = quotient_i32(quotient_i32(tick, 16), 4); + if (phase < 0 || phase > 3) { + return; + } + HWND16 handle = win16_read_u16(win16_far_add_offset(window, 4)); + HDC16 dc = GetDC16(handle); + tdkpin_restore_background_region_a(9, 9, y[phase], x[phase], dc); + tdkpin_present_background_region(9, 9, y[phase], x[phase], dc); + uint16_t previous = phase == 0 ? 3u : (uint16_t)(phase - 1); + tdkpin_restore_background_region_b(9, 9, y[previous], x[previous], dc); + tdkpin_present_background_region(9, 9, y[previous], x[previous], dc); + (void)ReleaseDC16(handle, dc); +} + +static void update_intro_item_status(Win16FarPtr window, int32_t tick) +{ + if (remainder_i32(tick, 8) != 0) { + return; + } + int32_t phase = quotient_i32(quotient_i32(tick, 144), 8); + int16_t item = (int16_t)(phase < 10 ? phase : 18 - phase); + HWND16 handle = win16_read_u16(win16_far_add_offset(window, 4)); + HDC16 dc = GetDC16(handle); + tdkpin_draw_item_status(item, dc); + (void)ReleaseDC16(handle, dc); +} + +static void draw_intro_score_marquee(Win16FarPtr window) +{ + uint32_t counter = win16_read_u32(win16_dgroup_pointer(0x087a)) + 1u; + win16_write_u32(win16_dgroup_pointer(0x087a), 0, counter); + HWND16 handle = win16_read_u16(win16_far_add_offset(window, 4)); + HDC16 dc = GetDC16(handle); + HDC16 source = CreateCompatibleDC16(dc); + HDC16 temporary = CreateCompatibleDC16(dc); + HBITMAP16 bitmap = CreateCompatibleBitmap16(dc, 30, 284); + HGDIOBJ16 old_source = SelectObject16( + source, win16_read_u16(win16_dgroup_pointer(0x085f))); + HGDIOBJ16 old_temporary = SelectObject16(temporary, bitmap); + (void)BitBlt16( + temporary, 0, 0, 30, 100, source, 473, 277, 0x00cc0020u); + (void)BitBlt16( + temporary, 0, 100, 30, 137, source, 472, 233, 0x00cc0020u); + (void)SelectObject16( + source, win16_read_u16(win16_dgroup_pointer(0x0861))); + + int32_t phase = remainder_i32((int32_t)counter, 49); + if (phase > 0 && phase < 22) { + (void)BitBlt16( + temporary, + 0, + 0, + 30, + 237, + source, + (INT16)(400 + (phase - 1) * 16), + 0, + 0x008800c6u); + } else { + INT16 split = (INT16)((phase - 22) * 16); + INT16 upper_height = (INT16)(237 - split); + (void)BitBlt16( + temporary, + 0, + 0, + 30, + upper_height, + source, + (INT16)(400 + (phase - 1) * 16), + 0, + 0x008800c6u); + (void)BitBlt16( + temporary, + 0, + upper_height, + 30, + split, + source, + 160, + 0, + 0x008800c6u); + } + (void)BitBlt16( + dc, 233, 372, 30, 237, temporary, 0, 0, 0x00cc0020u); + (void)SelectObject16(source, old_source); + (void)SelectObject16(temporary, old_temporary); + (void)DeleteObject16(bitmap); + (void)DeleteDC16(source); + (void)DeleteDC16(temporary); + (void)ReleaseDC16(handle, dc); +} + +static void idle_transition_tick(uint16_t frame_bp, Win16FarPtr window) +{ + if (win16_read_u8(win16_dgroup_pointer(0x07c9)) == 0) { + return; + } + int32_t tick = (int32_t)tick_count(); + update_intro_collision_visibility(frame_bp, tick); + update_intro_record_strip(window, tick); + update_intro_four_point_chase(window, tick); + update_intro_item_status(window, tick); + if (remainder_i32(tick, 6) == 0) { + draw_intro_score_marquee(window); + } +} + +static void update_panel_completion( + uint16_t frame_bp, Win16FarPtr window) +{ + if (win16_read_u8(win16_dgroup_pointer(0x07c8)) == 0 || + win16_read_u8(win16_far_add_offset(window, 0x0bdd)) != 0) { + return; + } + win16_write_u8(win16_far_add_offset(window, 0x0bdf), 1); + int32_t frame = dgroup_i32(0x0851); + if (frame < 281) { + if (frame == 1) { + for (uint16_t id = 129; id <= 133; id++) { + win16_write_u16( + win16_far_add_offset(collision_record(id), 0x43), 0, 0); + } + } + write_dgroup_i32(0x0851, (int32_t)((uint32_t)frame + 1u)); + tdkpin_draw_panel_animation(frame_bp); + return; + } + win16_write_u8(win16_dgroup_pointer(0x07c8), 0); + win16_write_u8(win16_far_add_offset(window, 0x0bdf), 0); + write_dgroup_i32(0x0851, 0); + refresh_region(window, true, 70, 68, 41, 87); + uint8_t player = win16_read_u8(win16_dgroup_pointer(0x07d1)); + for (uint16_t item = 15; item <= 19; item++) { + win16_write_u8( + win16_far_add_offset( + window, + (uint16_t)(player * 0x14u + item + 0x0467u)), + 0); + } +} + +static void initialize_game_if_requested( + uint16_t frame_bp, Win16FarPtr window) +{ + uint8_t player_count = win16_read_u8(win16_dgroup_pointer(0x07d0)); + int16_t marker = (int16_t)win16_read_u16(win16_dgroup_pointer( + (uint16_t)(0x081f + player_count * 2u))); + if (marker != -1) { + return; + } + tdkpin_initialize_player_state(frame_bp); + tdkpin_redraw_all_players(frame_bp); + tdkpin_refresh_player_progress_markers(frame_bp); + tdkpin_reset_ball_state(frame_bp); + refresh_region(window, true, 20, 148, 243, 84); + win16_write_u32(win16_dgroup_pointer(0x0876), 0, 0); +} + +void tdkpin_timer_tick_with_frame( + uint16_t frame_bp, Win16FarPtr window) +{ + if (win16_read_u16(win16_far_add_offset(window, 0x41)) != 0 || + win16_read_u16(win16_far_add_offset(window, 0x43)) != 0 || + win16_read_u16(win16_far_add_offset(window, 0x45)) != 0 || + win16_read_u16(win16_far_add_offset(window, 0x47)) != 0 || + win16_read_u8(win16_far_add_offset(window, 0x0bd8)) != 0 || + win16_read_u8(win16_far_add_offset(window, 0x0bd9)) != 0 || + win16_read_u8(win16_dgroup_pointer(0x07cc)) != 0 || + win16_read_u8(win16_far_add_offset(window, 0x51)) != 0 || + win16_read_u8(win16_dgroup_pointer(0x07c4)) == 0) { + return; + } + win16_write_u8(win16_far_add_offset(window, 0x51), 1); + if (win16_read_u8(win16_dgroup_pointer(0x07c5)) != 0) { + for (uint16_t id = 1; id <= 175; id++) { + tdkpin_refresh_collision_record(frame_bp, id); + } + win16_write_u8(win16_dgroup_pointer(0x07c5), 0); + } + win16_write_u32( + win16_dgroup_pointer(0x0876), 0, tick_count() + 1u); + + if (win16_read_u8(win16_far_add_offset(window, 0x0bdd)) != 0) { + active_ball_tick(frame_bp, window); + } else { + idle_transition_tick(frame_bp, window); + update_panel_completion(frame_bp, window); + initialize_game_if_requested(frame_bp, window); + } + + tdkpin_update_flippers(frame_bp); + tdkpin_drain_messages_except_input(); + win16_write_u8(win16_far_add_offset(window, 0x51), 0); + uint16_t tilt_counter = win16_read_u16( + win16_far_add_offset(window, 0x5e)); + if (tilt_counter != 0) { + /* 1000:fd73 reads game_tilted but both branches converge here. */ + (void)win16_read_u8(win16_dgroup_pointer(0x07c6)); + win16_write_u16(window, 0x5e, (uint16_t)(tilt_counter - 1u)); + } +} + +void tdkpin_timer_tick( + Win16FarPtr window, uint32_t ignored_callback_argument) +{ + (void)ignored_callback_argument; + tdkpin_timer_tick_with_frame(win16_current_stack_pointer(), window); +} diff --git a/original/reconstructed/tdkpin_timer_tick.h b/original/reconstructed/tdkpin_timer_tick.h new file mode 100644 index 0000000..af763a7 --- /dev/null +++ b/original/reconstructed/tdkpin_timer_tick.h @@ -0,0 +1,12 @@ +#ifndef TDKPIN_TIMER_TICK_H +#define TDKPIN_TIMER_TICK_H + +#include "tdkpin_segmented.h" + +void tdkpin_timer_tick_with_frame( + uint16_t frame_bp, Win16FarPtr window); +void tdkpin_timer_tick( + Win16FarPtr window, + uint32_t ignored_callback_argument); /* 1000:eab1, RETF 8 */ + +#endif diff --git a/original/reconstructed/tdkpin_tpwincrt_lifecycle.c b/original/reconstructed/tdkpin_tpwincrt_lifecycle.c new file mode 100644 index 0000000..8b1791e --- /dev/null +++ b/original/reconstructed/tdkpin_tpwincrt_lifecycle.c @@ -0,0 +1,107 @@ +/* TPWinCrt window creation, shutdown callback, and Pascal unit startup. */ + +#include "tdkpin_tpwincrt_lifecycle.h" + +#include "tdkpin_borland_files.h" + +enum { + DGROUP_TPWINCRT_TITLE = 0x4a6e, + DGROUP_TPWINCRT_INPUT_RECORD = 0x4b38, + DGROUP_TPWINCRT_OUTPUT_RECORD = 0x4c38, + TPWINCRT_APPLICATION_ICON = 0x7f00, + TPWINCRT_WINDOW_STYLE = 0x00ff0000, + TPWINCRT_SC_CLOSE = 0xf060, +}; + +/* 1008:2442 -- lazily create, show, and update the process TPWinCrt window. */ +void tpwincrt_create_window(void) +{ + if (g_tpwincrt_window_created != 0) { + return; + } + + g_tpwincrt_window = CreateWindow16( + g_tpwincrt_window_class.class_name, + win16_dgroup_pointer(DGROUP_TPWINCRT_TITLE), + TPWINCRT_WINDOW_STYLE, + g_tpwincrt_initial_x, + g_tpwincrt_initial_y, + g_tpwincrt_initial_width, + g_tpwincrt_initial_height, + 0, + 0, + g_win16_instance, + 0); + (void)ShowWindow16(g_tpwincrt_window, (INT16)g_win16_show_command); + (void)UpdateWindow16(g_tpwincrt_window); +} + +/* + * 1008:24a5 -- TPWinCrt ExitProc. Restore the predecessor before doing any + * work so Borland's mutable ExitProc walker can continue the chain. A clean + * exit with a live window changes the caption to "(Inactive %s)", re-enables + * Close, disables Ctrl-C checking, and runs a final blocking message loop. + */ +void tpwincrt_shutdown_exit_proc(void) +{ + g_borland_exit_proc = g_tpwincrt_saved_exit_proc; + if (g_tpwincrt_window_created == 0 || + g_borland_error_offset != 0 || + g_borland_error_segment != 0) { + return; + } + + uint16_t arguments[2] = { + win16_far_offset(win16_dgroup_pointer(DGROUP_TPWINCRT_TITLE)), + win16_far_selector(win16_dgroup_pointer(DGROUP_TPWINCRT_TITLE)), + }; + char inactive_title[128]; + (void)wvsprintf16( + inactive_title, g_tpwincrt_inactive_format, arguments); + (void)SetWindowText16(g_tpwincrt_window, inactive_title); + HMENU16 system_menu = GetSystemMenu16(g_tpwincrt_window, 0); + (void)EnableMenuItem16(system_menu, TPWINCRT_SC_CLOSE, 0); + g_tpwincrt_break_check_enabled = 0; + + MSG16 message; + while (GetMessage16(&message, 0, 0, 0) != 0) { + (void)TranslateMessage16(&message); + (void)DispatchMessage16(&message); + } +} + +/* + * 1008:2554 -- initialize TPWinCrt's class, standard TextRec pair, title, and + * ExitProc link. Class registration occurs only for the first Win16 instance. + */ +void tpwincrt_initialize_runtime_unit(void) +{ + if (g_win16_previous_instance == 0) { + g_tpwincrt_window_class.instance = g_win16_instance; + g_tpwincrt_window_class.icon = LoadIcon16( + 0, win16_make_far_pointer(0, TPWINCRT_APPLICATION_ICON)); + g_tpwincrt_window_class.cursor = LoadCursor16( + 0, win16_make_far_pointer(0, TPWINCRT_APPLICATION_ICON)); + g_tpwincrt_window_class.background_brush = 6; + (void)RegisterClass16(&g_tpwincrt_window_class); + } + + Win16FarPtr input_record = + win16_dgroup_pointer(DGROUP_TPWINCRT_INPUT_RECORD); + tpwincrt_initialize_text_record(input_record); + borland_reset_file(input_record); + borland_require_io_success(); + + Win16FarPtr output_record = + win16_dgroup_pointer(DGROUP_TPWINCRT_OUTPUT_RECORD); + tpwincrt_initialize_text_record(output_record); + borland_rewrite_file(output_record); + borland_require_io_success(); + + Win16FarPtr title = win16_dgroup_pointer(DGROUP_TPWINCRT_TITLE); + (void)GetModuleFileNameFar16(g_win16_instance, title, 0x50); + (void)OemToAnsi16(title, title); + + g_tpwincrt_saved_exit_proc = g_borland_exit_proc; + g_borland_exit_proc = win16_relocated_code_pointer(2, 0x24a5); +} diff --git a/original/reconstructed/tdkpin_tpwincrt_lifecycle.h b/original/reconstructed/tdkpin_tpwincrt_lifecycle.h new file mode 100644 index 0000000..6fa1093 --- /dev/null +++ b/original/reconstructed/tdkpin_tpwincrt_lifecycle.h @@ -0,0 +1,20 @@ +#ifndef TDKPIN_TPWINCRT_LIFECYCLE_H +#define TDKPIN_TPWINCRT_LIFECYCLE_H + +#include "tdkpin_borland_startup.h" +#include "tdkpin_tpwincrt_text.h" + +void tpwincrt_create_window(void); /* 1008:2442 */ +void tpwincrt_shutdown_exit_proc(void); /* 1008:24a5 */ +void tpwincrt_initialize_runtime_unit(void); /* 1008:2554 */ + +extern WNDCLASS16 g_tpwincrt_window_class; /* 1028:0562..057b */ +extern int16_t g_tpwincrt_initial_x; /* 1028:0538 */ +extern int16_t g_tpwincrt_initial_y; /* 1028:053a */ +extern int16_t g_tpwincrt_initial_width; /* 1028:053c */ +extern int16_t g_tpwincrt_initial_height; /* 1028:053e */ +extern const char g_tpwincrt_inactive_format[14]; /* 1028:0550..055d */ +extern char g_tpwincrt_window_title[80]; /* 1028:4a6e..4abd */ +extern Win16FarPtr g_tpwincrt_saved_exit_proc; /* 1028:4abe..4ac1 */ + +#endif diff --git a/original/reconstructed/tdkpin_tpwincrt_text.c b/original/reconstructed/tdkpin_tpwincrt_text.c new file mode 100644 index 0000000..4f0a04e --- /dev/null +++ b/original/reconstructed/tdkpin_tpwincrt_text.c @@ -0,0 +1,268 @@ +/* TPWinCrt character output, input queue, and TextRec callbacks. */ + +#include "tdkpin_tpwincrt_text.h" + +#include "tdkpin_borland_files.h" + +/* 1008:1a39 -- draw [start_column,end_column) on the cursor row. */ +void tpwincrt_draw_row_range(int16_t end_column, int16_t start_column) +{ + if (start_column >= end_column) { + return; + } + + tpwincrt_begin_drawing(); + int16_t x = (int16_t)(uint16_t)( + (uint16_t)(start_column - (int16_t)g_tpwincrt_view_column) * + g_tpwincrt_character_width); + int16_t y = (int16_t)(uint16_t)( + (uint16_t)((int16_t)g_tpwincrt_cursor_row - + (int16_t)g_tpwincrt_view_row) * + g_tpwincrt_character_height); + (void)TextOut16( + g_tpwincrt_paint_dc, + x, + y, + tpwincrt_cell_pointer(g_tpwincrt_cursor_row, start_column), + (int16_t)(end_column - start_column)); + tpwincrt_end_drawing(); +} + +/* + * 1008:1a82 -- carriage return/line advance. The binary aliases two locals + * in 1b11 through SS:BP; explicit pointers preserve the same updates without + * pretending those caller-frame addresses are ordinary Pascal arguments. + */ +void tpwincrt_advance_line(int16_t *changed_start, int16_t *changed_end) +{ + tpwincrt_draw_row_range(*changed_end, *changed_start); + *changed_start = 0; + *changed_end = 0; + g_tpwincrt_cursor_column = 0; + + uint16_t next_row = (uint16_t)(g_tpwincrt_cursor_row + 1); + if (next_row == g_tpwincrt_rows) { + next_row--; + g_tpwincrt_ring_row_origin++; + if (g_tpwincrt_ring_row_origin == g_tpwincrt_rows) { + g_tpwincrt_ring_row_origin = 0; + } + Win16FarPtr row = tpwincrt_cell_pointer(g_tpwincrt_cursor_row, 0); + borland_fill_bytes(row, g_tpwincrt_columns, ' '); + (void)ScrollWindow16( + g_tpwincrt_window, + 0, + (INT16)(uint16_t)(0u - g_tpwincrt_character_height), + 0, + 0); + (void)UpdateWindow16(g_tpwincrt_window); + } + g_tpwincrt_cursor_row = next_row; +} + +/* 1008:1b11 -- write control/printable bytes into the circular text screen. */ +void tpwincrt_write_bytes(uint16_t count, Win16FarPtr bytes) +{ + tpwincrt_create_window(); + int16_t changed_start = (int16_t)g_tpwincrt_cursor_column; + int16_t changed_end = changed_start; + + while (count != 0) { + uint8_t character = win16_read_u8(bytes); + if (character >= 0x20) { + win16_write_u8( + tpwincrt_cell_pointer( + g_tpwincrt_cursor_row, + (int16_t)g_tpwincrt_cursor_column), + character); + g_tpwincrt_cursor_column++; + if (changed_end < (int16_t)g_tpwincrt_cursor_column) { + changed_end = (int16_t)g_tpwincrt_cursor_column; + } + if (g_tpwincrt_cursor_column == g_tpwincrt_columns) { + tpwincrt_advance_line(&changed_start, &changed_end); + } + } else if (character == '\r') { + tpwincrt_advance_line(&changed_start, &changed_end); + } else if (character == '\b') { + if ((int16_t)g_tpwincrt_cursor_column > 0) { + g_tpwincrt_cursor_column--; + win16_write_u8( + tpwincrt_cell_pointer( + g_tpwincrt_cursor_row, + (int16_t)g_tpwincrt_cursor_column), + ' '); + if ((int16_t)g_tpwincrt_cursor_column < changed_start) { + changed_start = (int16_t)g_tpwincrt_cursor_column; + } + } + } else if (character == '\a') { + (void)MessageBeep16(0); + } + + bytes = win16_far_add_offset(bytes, 1); + count--; + } + + tpwincrt_draw_row_range(changed_end, changed_start); + if (g_tpwincrt_auto_scroll != 0) { + tpwincrt_scroll_cursor_into_view(); + } +} + +/* 1008:1be9 -- one-byte stack wrapper around the bulk writer. */ +void tpwincrt_write_character(uint8_t character) +{ + uint8_t byte = character; + tpwincrt_write_bytes(1, win16_stack_pointer(&byte)); +} + +/* 1008:1c03 -- drain all queued Win16 messages and report input availability. */ +bool tpwincrt_poll_input(void) +{ + tpwincrt_create_window(); + MSG16 message; + while (PeekMessage16(&message, 0, 0, 0, 1)) { + if (message.message == 0x0012) { /* WM_QUIT */ + tpwincrt_abort_on_ctrl_c(); + } + (void)TranslateMessage16(&message); + (void)DispatchMessage16(&message); + } + return (int16_t)g_tpwincrt_input_count > 0; +} + +/* 1008:1c5f -- block until one queued character is available, then dequeue it. */ +uint8_t tpwincrt_read_character(void) +{ + tpwincrt_scroll_cursor_into_view(); + if (!tpwincrt_poll_input()) { + g_tpwincrt_caret_enabled = 1; + if (g_tpwincrt_has_focus != 0) { + tpwincrt_create_caret(); + } + do { + (void)WaitMessage16(); + } while (!tpwincrt_poll_input()); + if (g_tpwincrt_has_focus != 0) { + tpwincrt_destroy_caret(); + } + g_tpwincrt_caret_enabled = 0; + } + + g_tpwincrt_input_count--; + uint8_t character = g_tpwincrt_input_buffer[0]; + borland_move_bytes( + win16_dgroup_pointer(0x4af8), + win16_dgroup_pointer(0x4af9), + g_tpwincrt_input_count); + return character; +} + +/* 1008:1cc6 -- edited line input with CR/LF and optional Ctrl-Z termination. */ +uint16_t tpwincrt_read_line(uint16_t capacity, Win16FarPtr destination) +{ + uint16_t length = 0; + uint8_t character; + do { + character = tpwincrt_read_character(); + if (character == '\b') { + if (length != 0) { + length--; + tpwincrt_write_character('\b'); + } + } else if ( + character >= 0x20 && + (uint16_t)(capacity - 2) > length) { + win16_write_u8( + win16_far_add_offset(destination, length), character); + length++; + tpwincrt_write_character(character); + } + } while ( + character != '\r' && + (g_tpwincrt_ctrl_z_is_eof == 0 || character != 0x1a)); + + win16_write_u8(win16_far_add_offset(destination, length), character); + length++; + if (character == '\r') { + win16_write_u8(win16_far_add_offset(destination, length), '\n'); + length++; + tpwincrt_write_character('\r'); + } + tpwincrt_scroll_cursor_into_view(); + return length; +} + +/* 1008:22fc -- TextRec output InOutFunc/FlushFunc. */ +uint16_t tpwincrt_text_write_buffer(Win16FarPtr record) +{ + uint16_t count = win16_read_u16(win16_far_add_offset(record, 8)); + if (count != 0) { + tpwincrt_write_bytes(count, win16_read_far_pointer(record, 0x0c)); + win16_write_u16(record, 8, 0); + (void)tpwincrt_poll_input(); + } + return 0; +} + +/* 1008:233c -- TextRec input InOutFunc. */ +uint16_t tpwincrt_text_read_buffer(Win16FarPtr record) +{ + uint16_t count = tpwincrt_read_line( + win16_read_u16(win16_far_add_offset(record, 4)), + win16_read_far_pointer(record, 0x0c)); + win16_write_u16(record, 0x0a, count); + win16_write_u16(record, 8, 0); + return 0; +} + +static void write_text_procedure( + Win16FarPtr record, uint16_t offset, Win16FarPtr procedure) +{ + win16_write_u16(record, offset, win16_far_offset(procedure)); + win16_write_u16( + record, (uint16_t)(offset + 2), win16_far_selector(procedure)); +} + +/* 1008:238b -- attach TPWinCrt callbacks to an input or output TextRec. */ +uint16_t tpwincrt_open_text_record(Win16FarPtr record) +{ + if (win16_read_u16(win16_far_add_offset(record, 2)) == + BORLAND_FILE_INPUT) { + write_text_procedure( + record, + 0x14, + win16_relocated_code_pointer(2, 0x233c)); + write_text_procedure(record, 0x18, 0); + } else { + win16_write_u16(record, 2, BORLAND_FILE_OUTPUT); + Win16FarPtr write = win16_relocated_code_pointer(2, 0x22fc); + write_text_procedure(record, 0x14, write); + write_text_procedure(record, 0x18, write); + } + write_text_procedure( + record, + 0x1c, + win16_relocated_code_pointer(2, 0x2374)); + return 0; +} + +/* + * 1008:23fd -- initialize only the fields written by the binary. BufPos, + * BufEnd, callbacks other than OpenFunc, and UserData deliberately retain + * their prior bytes until Reset/Rewrite invokes 238b. + */ +void tpwincrt_initialize_text_record(Win16FarPtr record) +{ + win16_write_u16(record, 0, 0xffff); + win16_write_u16(record, 2, BORLAND_FILE_CLOSED); + win16_write_u16(record, 4, 0x80); + Win16FarPtr buffer = win16_far_add_offset(record, 0x80); + write_text_procedure(record, 0x0c, buffer); + write_text_procedure( + record, + 0x10, + win16_relocated_code_pointer(2, 0x238b)); + win16_write_u8(win16_far_add_offset(record, 0x30), 0); +} diff --git a/original/reconstructed/tdkpin_tpwincrt_text.h b/original/reconstructed/tdkpin_tpwincrt_text.h new file mode 100644 index 0000000..45c6cbf --- /dev/null +++ b/original/reconstructed/tdkpin_tpwincrt_text.h @@ -0,0 +1,25 @@ +#ifndef TDKPIN_TPWINCRT_TEXT_H +#define TDKPIN_TPWINCRT_TEXT_H + +#include "tdkpin_runtime_ui.h" + +void tpwincrt_draw_row_range( + int16_t end_column, int16_t start_column); /* 1008:1a39 */ +void tpwincrt_advance_line( + int16_t *changed_start, int16_t *changed_end); /* 1008:1a82 */ +void tpwincrt_write_bytes( + uint16_t count, Win16FarPtr bytes); /* 1008:1b11 */ +void tpwincrt_write_character(uint8_t character); /* 1008:1be9 */ +bool tpwincrt_poll_input(void); /* 1008:1c03 */ +uint8_t tpwincrt_read_character(void); /* 1008:1c5f */ +uint16_t tpwincrt_read_line( + uint16_t capacity, Win16FarPtr destination); /* 1008:1cc6 */ + +uint16_t tpwincrt_text_write_buffer(Win16FarPtr record); /* 1008:22fc */ +uint16_t tpwincrt_text_read_buffer(Win16FarPtr record); /* 1008:233c */ +uint16_t tpwincrt_open_text_record(Win16FarPtr record); /* 1008:238b */ +void tpwincrt_initialize_text_record(Win16FarPtr record); /* 1008:23fd */ + +void tpwincrt_create_window(void); /* 1008:2442 */ + +#endif diff --git a/original/reconstructed/tdkpin_turn_state.c b/original/reconstructed/tdkpin_turn_state.c new file mode 100644 index 0000000..6e3a81b --- /dev/null +++ b/original/reconstructed/tdkpin_turn_state.c @@ -0,0 +1,198 @@ +/* Ball-end, special-respawn, player-switch, and game-over state machine. */ + +#include "tdkpin_turn_state.h" + +#include "tdkpin_sound.h" + +static Win16FarPtr caller_receiver(uint16_t caller_bp) +{ + uint16_t offset = win16_read_stack_u16((uint16_t)(caller_bp + 6)); + uint16_t selector = win16_read_stack_u16((uint16_t)(caller_bp + 8)); + return win16_make_far_pointer(selector, offset); +} + +static Win16FarPtr collision_record(uint16_t id) +{ + return win16_dgroup_pointer((uint16_t)(0x095b + id * 0x53u)); +} + +static Win16FarPtr player_marker_count(uint8_t player) +{ + return win16_dgroup_pointer((uint16_t)(0x081f + player * 2u)); +} + +static void special_respawn(uint16_t caller_bp, Win16FarPtr receiver) +{ + win16_write_u8(win16_dgroup_pointer(0x0874), 0); + tdkpin_restore_previous_ball_region(caller_bp, 0); + g_ball_x_milli = (int32_t)win16_read_u32(win16_dgroup_pointer(0x3969)); + g_ball_y_milli = (int32_t)win16_read_u32(win16_dgroup_pointer(0x396d)); + win16_write_u32(receiver, 0x0bc2, (uint32_t)g_ball_x_milli); + win16_write_u32(receiver, 0x0bc6, (uint32_t)g_ball_y_milli); + win16_write_u8( + win16_far_add_offset(receiver, (uint16_t)( + 0x047b + (uint16_t)g_current_player * 0x14u)), + 0); + tdkpin_restore_record_b(caller_bp, 1020); + tdkpin_update_dynamic_ball_record(caller_bp, 1); + win16_write_u32(receiver, 0x0baa, 0); + + static const BorlandReal48 factor_point_eight = + {{0x80, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}}; + int32_t source = (int32_t)win16_read_u32( + win16_far_add_offset(receiver, 0x56)); + int32_t scaled = borland_real48_round_to_i32( + borland_real48_multiply( + borland_i32_to_real48(source), factor_point_eight)); + win16_write_u32(receiver, 0x0bae, (uint32_t)scaled); + win16_write_u32(receiver, 0x0bca, 0); + win16_write_u16(receiver, 0x0bce, 0); + win16_write_u16(receiver, 0x0bd0, 0); + win16_write_u16(receiver, 0x0bd2, 0); + win16_write_u16(win16_dgroup_pointer(0x399a), 0, 0); + win16_write_u8(win16_dgroup_pointer(0x0875), 1); + win16_write_u8(win16_dgroup_pointer(0x41f9), 1); + win16_write_u8(win16_far_add_offset(receiver, 0x61), 1); +} + +static void save_current_collision_mirrors(Win16FarPtr receiver) +{ + for (uint16_t id = 1; id <= 175; id++) { + Win16FarPtr record = collision_record(id); + win16_write_u8( + win16_far_add_offset(receiver, (uint16_t)( + 0x0061 + (uint16_t)g_current_player * 0x00afu + id)), + win16_read_u8(win16_far_add_offset(record, 0x34))); + win16_write_u16( + receiver, + (uint16_t)(0x036c + + (uint16_t)g_current_player * 0x015eu + id * 2u), + win16_read_u16(win16_far_add_offset(record, 0x43))); + } +} + +static void load_next_collision_mirrors( + uint16_t caller_bp, Win16FarPtr receiver, uint8_t previous_player) +{ + for (uint16_t id = 1; id <= 175; id++) { + Win16FarPtr record = collision_record(id); + win16_write_u8( + win16_far_add_offset(record, 0x34), + win16_read_u8(win16_far_add_offset(receiver, (uint16_t)( + 0x0061 + (uint16_t)g_current_player * 0x00afu + id)))); + win16_write_u16( + record, + 0x43, + win16_read_u16(win16_far_add_offset(receiver, (uint16_t)( + 0x036c + (uint16_t)g_current_player * 0x015eu + id * 2u)))); + if (g_current_player != previous_player) { + tdkpin_refresh_collision_record(caller_bp, id); + } + } +} + +static void refresh_changed_player_ui( + Win16FarPtr receiver, uint8_t previous_player) +{ + if (g_current_player == previous_player) { + return; + } + uint16_t active_items = 0; + for (uint16_t item = 1; item <= 9; item++) { + if (win16_read_u8(win16_far_add_offset(receiver, (uint16_t)( + 0x046c + (uint16_t)g_current_player * 0x14u + item))) != 0) { + active_items++; + } + } + HWND16 window = win16_read_u16(win16_far_add_offset(receiver, 4)); + HDC16 dc = GetDC16(window); + tdkpin_draw_item_status((int16_t)active_items, dc); + tdkpin_update_status_display(g_current_player, dc); + (void)ReleaseDC16(window, dc); +} + +static void normal_ball_end(uint16_t caller_bp, Win16FarPtr receiver) +{ + win16_write_u8(win16_dgroup_pointer(0x0875), 0); + tdkpin_play_sound_if_not_tilted(8); + tdkpin_restore_previous_ball_region(caller_bp, 0); + if (win16_read_u8(win16_dgroup_pointer(0x0874)) == 0) { + win16_write_u8(win16_far_add_offset(receiver, 0x0bdd), 0); + } + win16_write_u8(win16_far_add_offset(receiver, 0x0bdc), 0); + if ((int16_t)win16_read_u16(player_marker_count(g_current_player)) == 0) { + win16_write_u8(win16_far_add_offset(receiver, 0x0bda), 0); + win16_write_u8(win16_far_add_offset(receiver, 0x0bdb), 0); + tdkpin_load_highscores(caller_bp); + tdkpin_insert_current_score(caller_bp); + } + win16_write_u16(receiver, 0x0bce, 0); + win16_write_u16(receiver, 0x0bd0, 0); + win16_write_u16(receiver, 0x0bd2, 0); + save_current_collision_mirrors(receiver); + + uint8_t previous_player = g_current_player; + if (g_player_count == 0) { + win16_integer_divide_fault(); + } + do { + g_current_player = (uint8_t)( + (uint16_t)g_current_player % g_player_count + 1u); + if ((int16_t)win16_read_u16( + player_marker_count(g_current_player)) > 0) { + break; + } + } while (g_current_player != previous_player); + + if ((int16_t)win16_read_u16( + player_marker_count(g_current_player)) < 1) { + g_current_player = 0; + tdkpin_set_gameplay_transition_flags(caller_bp); + if (win16_read_u8(win16_dgroup_pointer(0x07d2)) == 0) { + win16_write_u8(win16_far_add_offset(receiver, 0x0bda), 0); + win16_write_u8(win16_far_add_offset(receiver, 0x0bdb), 0); + tdkpin_show_highscore_windows(caller_bp); + } + return; + } + + load_next_collision_mirrors(caller_bp, receiver, previous_player); + for (uint16_t item = 1; item <= 20; item++) { + if (g_current_player != previous_player) { + tdkpin_refresh_player_item(caller_bp, item); + } + } + uint8_t ready = win16_read_u8(win16_dgroup_pointer((uint16_t)( + 0x0816 + (uint16_t)g_current_player))); + for (uint16_t item = 2; item <= 6; item++) { + if (item <= ready) { + tdkpin_restore_record_or_item_a( + caller_bp, (uint16_t)(item + 999u)); + } + } + refresh_changed_player_ui(receiver, previous_player); + tdkpin_redraw_all_players(caller_bp); + Win16FarPtr markers = player_marker_count(g_current_player); + win16_write_u16( + markers, 0, (uint16_t)(win16_read_u16(markers) - 1u)); + tdkpin_reset_ball_state(caller_bp); + + HWND16 window = win16_read_u16(win16_far_add_offset(receiver, 4)); + HDC16 dc = GetDC16(window); + tdkpin_restore_background_region_b(20, 148, 243, 84, dc); + tdkpin_present_background_region(20, 148, 243, 84, dc); + (void)ReleaseDC16(window, dc); + tdkpin_refresh_player_progress_markers(caller_bp); +} + +/* 1000:ae6e -- complete ball-end and player-advance state machine. */ +void tdkpin_finish_ball_or_advance_player(uint16_t caller_bp) +{ + Win16FarPtr receiver = caller_receiver(caller_bp); + if (win16_read_u8(win16_dgroup_pointer(0x0874)) == 0 && + win16_read_u16(win16_dgroup_pointer(0x399a)) != 0) { + special_respawn(caller_bp, receiver); + } else { + normal_ball_end(caller_bp, receiver); + } +} diff --git a/original/reconstructed/tdkpin_turn_state.h b/original/reconstructed/tdkpin_turn_state.h new file mode 100644 index 0000000..a513638 --- /dev/null +++ b/original/reconstructed/tdkpin_turn_state.h @@ -0,0 +1,11 @@ +#ifndef TDKPIN_TURN_STATE_H +#define TDKPIN_TURN_STATE_H + +#include "tdkpin_highscores.h" +#include "tdkpin_player_state.h" +#include "tdkpin_real48.h" + +void tdkpin_finish_ball_or_advance_player( + uint16_t caller_bp); /* 1000:ae6e */ + +#endif diff --git a/original/reconstructed/tdkpin_win16.h b/original/reconstructed/tdkpin_win16.h new file mode 100644 index 0000000..224c776 --- /dev/null +++ b/original/reconstructed/tdkpin_win16.h @@ -0,0 +1,446 @@ +#ifndef TDKPIN_WIN16_H +#define TDKPIN_WIN16_H + +#include + +/* + * Source-level Win16 model used by the readable reconstruction. + * Handles and scalar API arguments are 16-bit. A segmented far pointer is + * stored as offset:selector in one 32-bit value, matching the NE image and + * Borland stack representation rather than a host pointer. + */ +typedef uint16_t Win16Handle; +typedef uint16_t HBRUSH16; +typedef uint16_t HBITMAP16; +typedef uint16_t HDC16; +typedef uint16_t HGDIOBJ16; +typedef uint16_t HGLOBAL16; +typedef uint16_t HCURSOR16; +typedef uint16_t HICON16; +typedef uint16_t HINSTANCE16; +typedef uint16_t HPALETTE16; +typedef uint16_t HRSRC16; +typedef uint16_t HACCEL16; +typedef uint16_t HMENU16; +typedef uint16_t HWND16; +typedef uint16_t WPARAM16; +typedef uint16_t UINT16; +typedef int16_t BOOL16; +typedef int16_t INT16; +typedef int16_t HFILE16; +typedef int32_t LPARAM16; +typedef int32_t LRESULT16; +typedef uint32_t Win16FarPtr; +typedef uint32_t COLORREF16; + +#pragma pack(push, 1) +typedef struct { + INT16 left; + INT16 top; + INT16 right; + INT16 bottom; +} RECT16; + +typedef struct { + HDC16 dc; + BOOL16 erase; + RECT16 paint; + BOOL16 restore; + BOOL16 incremental_update; + uint8_t reserved[16]; +} PAINTSTRUCT16; + +typedef struct { + INT16 x; + INT16 y; +} POINT16; + +typedef struct { + HWND16 window; + UINT16 message; + WPARAM16 wparam; + LPARAM16 lparam; + uint32_t time; + POINT16 point; +} MSG16; + +typedef struct { + POINT16 reserved; + POINT16 maximum_size; + POINT16 maximum_position; + POINT16 minimum_track_size; + POINT16 maximum_track_size; +} MINMAXINFO16; + +typedef struct { + Win16FarPtr class_name; + Win16FarPtr title; + HINSTANCE16 owner; + INT16 x; + INT16 y; + INT16 width; + INT16 height; + uint32_t style; + LPARAM16 parameter; +} MDICREATESTRUCT16; + +typedef struct { + INT16 height; + INT16 ascent; + INT16 descent; + INT16 internal_leading; + INT16 external_leading; + INT16 average_character_width; + INT16 maximum_character_width; + INT16 weight; + uint8_t italic; + uint8_t underlined; + uint8_t struck_out; + uint8_t first_character; + uint8_t last_character; + uint8_t default_character; + uint8_t break_character; + uint8_t pitch_and_family; + uint8_t character_set; + INT16 overhang; + INT16 digitized_aspect_x; + INT16 digitized_aspect_y; +} TEXTMETRIC16; + +/* Windows 3.1 packed layout passed by TDKPIN to waveOutGetDevCaps. */ +typedef struct { + UINT16 manufacturer_id; + UINT16 product_id; + UINT16 driver_version; + char product_name[32]; + uint32_t formats; + UINT16 channels; + uint32_t support; +} WAVEOUTCAPS16; +#pragma pack(pop) + +_Static_assert(sizeof(RECT16) == 8, "Win16 RECT layout drift"); +_Static_assert(sizeof(PAINTSTRUCT16) == 32, "Win16 PAINTSTRUCT layout drift"); +_Static_assert(sizeof(POINT16) == 4, "Win16 POINT layout drift"); +_Static_assert(sizeof(MSG16) == 18, "Win16 MSG layout drift"); +_Static_assert(sizeof(MINMAXINFO16) == 20, "Win16 MINMAXINFO layout drift"); +_Static_assert(sizeof(MDICREATESTRUCT16) == 26, + "Win16 MDICREATESTRUCT layout drift"); +_Static_assert(sizeof(TEXTMETRIC16) == 31, "Win16 TEXTMETRIC layout drift"); +_Static_assert(sizeof(WAVEOUTCAPS16) == 48, "Win16 WAVEOUTCAPS layout drift"); + +static inline uint16_t win16_far_offset(Win16FarPtr pointer) +{ + return (uint16_t)pointer; +} + +static inline uint16_t win16_far_selector(Win16FarPtr pointer) +{ + return (uint16_t)(pointer >> 16); +} + +static inline Win16FarPtr win16_make_far_pointer(uint16_t selector, uint16_t offset) +{ + return ((uint32_t)selector << 16) | offset; +} + +static inline Win16FarPtr win16_far_add_offset(Win16FarPtr pointer, uint16_t delta) +{ + return win16_make_far_pointer( + win16_far_selector(pointer), (uint16_t)(win16_far_offset(pointer) + delta)); +} + +#pragma pack(push, 1) +typedef struct { + UINT16 style; + Win16FarPtr window_proc; + INT16 class_extra_bytes; + INT16 window_extra_bytes; + HINSTANCE16 instance; + HICON16 icon; + HCURSOR16 cursor; + HBRUSH16 background_brush; + Win16FarPtr menu_name; + Win16FarPtr class_name; +} WNDCLASS16; +#pragma pack(pop) + +_Static_assert(sizeof(WNDCLASS16) == 26, "Win16 WNDCLASS layout drift"); + +enum Win16WindowMessage { + WIN16_WM_CREATE = 0x0001, + WIN16_WM_DESTROY = 0x0002, + WIN16_WM_SIZE = 0x0005, + WIN16_WM_SETFOCUS = 0x0007, + WIN16_WM_KILLFOCUS = 0x0008, + WIN16_WM_PAINT = 0x000f, + WIN16_WM_GETMINMAXINFO = 0x0024, + WIN16_WM_KEYDOWN = 0x0100, + WIN16_WM_CHAR = 0x0102, + WIN16_WM_HSCROLL = 0x0114, + WIN16_WM_VSCROLL = 0x0115, +}; + +/* USER ordinal 107, Wine 11.15 user.exe16.spec. */ +LRESULT16 DefWindowProc16(HWND16 window, UINT16 message, WPARAM16 wparam, LPARAM16 lparam); +INT16 MessageBox16( + HWND16 owner, Win16FarPtr text, Win16FarPtr caption, UINT16 type); +void PostQuitMessage16(INT16 exit_code); +BOOL16 CreateCaret16(HWND16 window, HBITMAP16 bitmap, INT16 width, INT16 height); +BOOL16 DestroyCaret16(void); +BOOL16 SetCaretPos16(INT16 x, INT16 y); +BOOL16 ShowCaret16(HWND16 window); +INT16 SetScrollPos16(HWND16 window, INT16 bar, INT16 position, BOOL16 redraw); +BOOL16 SetScrollRange16( + HWND16 window, INT16 bar, INT16 minimum, INT16 maximum, BOOL16 redraw); +BOOL16 ScrollWindow16( + HWND16 window, + INT16 delta_x, + INT16 delta_y, + Win16FarPtr scroll_rect, + Win16FarPtr clip_rect); +BOOL16 UpdateWindow16(HWND16 window); +BOOL16 GetClientRect16(HWND16 window, Win16FarPtr rectangle); +BOOL16 InvalidateRect16( + HWND16 window, Win16FarPtr rectangle, BOOL16 erase); +INT16 GetKeyState16(INT16 virtual_key); +HMENU16 GetSystemMenu16(HWND16 window, BOOL16 revert); +BOOL16 EnableMenuItem16(HMENU16 menu, UINT16 item, UINT16 flags); +HDC16 GetDC16(HWND16 window); +INT16 ReleaseDC16(HWND16 window, HDC16 dc); +HDC16 BeginPaint16(HWND16 window, Win16FarPtr paint); +BOOL16 EndPaint16(HWND16 window, Win16FarPtr paint); +HGDIOBJ16 GetStockObject16(INT16 object); +HPALETTE16 CreatePalette16(Win16FarPtr logical_palette); +HPALETTE16 SelectPalette16( + HDC16 dc, HPALETTE16 palette, BOOL16 force_background); +UINT16 RealizePalette16(HDC16 dc); +BOOL16 UpdateColors16(HDC16 dc); +BOOL16 UnrealizeObject16(HGDIOBJ16 object); +BOOL16 DeleteObject16(HGDIOBJ16 object); +BOOL16 DeleteDC16(HDC16 dc); +HDC16 CreateDC16( + Win16FarPtr driver, + Win16FarPtr device, + Win16FarPtr output, + Win16FarPtr initialization_data); +HBITMAP16 CreateDIBitmap16( + HDC16 dc, + Win16FarPtr header, + uint32_t initialization, + Win16FarPtr bits, + Win16FarPtr bitmap_info, + UINT16 color_usage); +HGDIOBJ16 SelectObject16(HDC16 dc, HGDIOBJ16 object); +HDC16 CreateCompatibleDC16(HDC16 dc); +HBITMAP16 CreateCompatibleBitmap16( + HDC16 dc, INT16 width, INT16 height); +BOOL16 BitBlt16( + HDC16 destination, + INT16 destination_x, + INT16 destination_y, + INT16 width, + INT16 height, + HDC16 source, + INT16 source_x, + INT16 source_y, + uint32_t raster_operation); +COLORREF16 GetSysColor16(INT16 index); +COLORREF16 SetTextColor16(HDC16 dc, COLORREF16 color); +COLORREF16 GetTextColor16(HDC16 dc); +UINT16 SetTextAlign16(HDC16 dc, UINT16 alignment); +INT16 SetBkMode16(HDC16 dc, INT16 mode); +COLORREF16 SetBkColor16(HDC16 dc, COLORREF16 color); +BOOL16 TextOut16( + HDC16 dc, INT16 x, INT16 y, Win16FarPtr text, INT16 character_count); +BOOL16 GetTextMetrics16(HDC16 dc, Win16FarPtr metrics); +INT16 GetSystemMetrics16(INT16 index); +uint32_t GetTickCount16(void); +HFILE16 LCreate16(Win16FarPtr file_name, INT16 attributes); +HFILE16 LOpen16(Win16FarPtr file_name, INT16 mode); +UINT16 LRead16(HFILE16 file, Win16FarPtr bytes, UINT16 byte_count); +UINT16 LWrite16(HFILE16 file, Win16FarPtr bytes, UINT16 byte_count); +HFILE16 LClose16(HFILE16 file); +HGLOBAL16 GlobalAlloc16(UINT16 flags, uint32_t bytes); +Win16FarPtr GlobalLock16(HGLOBAL16 allocation); +HGLOBAL16 GlobalHandle16(uint16_t selector); +BOOL16 GlobalUnlock16(HGLOBAL16 allocation); +HGLOBAL16 GlobalFree16(HGLOBAL16 allocation); +HRSRC16 FindResource16( + HINSTANCE16 instance, Win16FarPtr name, Win16FarPtr type); +HGLOBAL16 LoadResource16(HINSTANCE16 instance, HRSRC16 resource); +Win16FarPtr LockResource16(HGLOBAL16 resource); +BOOL16 FreeResource16(HGLOBAL16 resource); +UINT16 GetPrivateProfileInt16( + Win16FarPtr section, + Win16FarPtr key, + INT16 default_value, + Win16FarPtr file_name); +UINT16 WaveOutGetNumDevs16(void); +UINT16 WaveOutGetDevCaps16( + UINT16 device_id, Win16FarPtr capabilities, UINT16 byte_count); +UINT16 WaveOutGetVolume16(UINT16 device_id, Win16FarPtr volume); +uint16_t TimeKillEvent16(uint16_t timer_id); +uint16_t SystemTimerMake16( + HWND16 recipient, + uint16_t delay_ms, + uint16_t resolution_ms, + uint16_t one_shot); +uint16_t AllocCStoDSAlias16(uint16_t code_selector); +uint16_t FreeSelector16(uint16_t selector); +uint16_t PrestoChangoSelector16( + uint16_t source_selector, uint16_t destination_selector); +Win16FarPtr MakeProcInstance16( + Win16FarPtr procedure, HINSTANCE16 instance); +void FreeProcInstance16(Win16FarPtr procedure); +BOOL16 PeekMessage16( + MSG16 *message, + HWND16 window, + UINT16 minimum_message, + UINT16 maximum_message, + UINT16 remove_message); +BOOL16 WaitMessage16(void); +BOOL16 GetMessage16( + MSG16 *message, + HWND16 window, + UINT16 minimum_message, + UINT16 maximum_message); +BOOL16 TranslateMessage16(const MSG16 *message); +LRESULT16 DispatchMessage16(const MSG16 *message); +BOOL16 IsDialogMessage16(HWND16 dialog, MSG16 *message); +INT16 TranslateAccelerator16( + HWND16 window, HACCEL16 accelerator, MSG16 *message); +BOOL16 TranslateMDISysAccel16(HWND16 client, MSG16 *message); +BOOL16 ShowWindow16(HWND16 window, INT16 command); +int32_t GetWindowLong16(HWND16 window, INT16 index); +HWND16 GetDlgItem16(HWND16 dialog, INT16 control_id); +LRESULT16 SendMessage16( + HWND16 window, UINT16 message, WPARAM16 wparam, LPARAM16 lparam); +HWND16 GetFocus16(void); +HWND16 GetParent16(HWND16 window); +uint16_t GetWindowWord16(HWND16 window, INT16 index); +BOOL16 DestroyWindow16(HWND16 window); +BOOL16 IsChild16(HWND16 parent, HWND16 child); +BOOL16 IsIconic16(HWND16 window); +BOOL16 IsZoomed16(HWND16 window); +BOOL16 IsWindow16(HWND16 window); +HWND16 SetFocus16(HWND16 window); +HWND16 SetCapture16(HWND16 window); +BOOL16 ReleaseCapture16(void); +BOOL16 GetWindowRect16(HWND16 window, Win16FarPtr rectangle); +BOOL16 ScreenToClient16(HWND16 window, Win16FarPtr point); +INT16 GetWindowText16(HWND16 window, char *text, INT16 maximum); +BOOL16 SetWindowText16(HWND16 window, const char *text); +BOOL16 SetWindowTextFar16(HWND16 window, Win16FarPtr text); +BOOL16 SetDlgItemText16( + HWND16 dialog, INT16 control_id, Win16FarPtr text); +LRESULT16 SendDlgItemMessage16( + HWND16 dialog, + INT16 control_id, + UINT16 message, + WPARAM16 wparam, + LPARAM16 lparam); +HWND16 CreateWindow16( + Win16FarPtr class_name, + Win16FarPtr window_name, + uint32_t style, + INT16 x, + INT16 y, + INT16 width, + INT16 height, + HWND16 parent, + HMENU16 menu, + HINSTANCE16 instance, + Win16FarPtr parameter); +HWND16 CreateWindowEx16( + uint32_t extended_style, + Win16FarPtr class_name, + Win16FarPtr window_name, + uint32_t style, + INT16 x, + INT16 y, + INT16 width, + INT16 height, + HWND16 parent, + HMENU16 menu, + HINSTANCE16 instance, + Win16FarPtr parameter); +int32_t SetWindowLong16(HWND16 window, INT16 index, int32_t value); +Win16FarPtr win16_def_window_proc_pointer(void); +Win16FarPtr win16_def_mdi_child_proc_pointer(void); +LRESULT16 CallWindowProc16( + Win16FarPtr procedure, + HWND16 window, + UINT16 message, + WPARAM16 wparam, + LPARAM16 lparam); +BOOL16 GetClassInfo16( + HINSTANCE16 instance, + Win16FarPtr class_name, + WNDCLASS16 *window_class); +uint16_t RegisterClass16(const WNDCLASS16 *window_class); +BOOL16 EndDialog16(HWND16 dialog, INT16 result); +HICON16 LoadIcon16(HINSTANCE16 instance, Win16FarPtr resource); +HCURSOR16 LoadCursor16(HINSTANCE16 instance, Win16FarPtr resource); +HBITMAP16 LoadBitmap16(HINSTANCE16 instance, Win16FarPtr resource); +HCURSOR16 SetCursor16(HCURSOR16 cursor); +UINT16 GetDlgItemTextFar16( + HWND16 dialog, + INT16 control_id, + Win16FarPtr buffer, + INT16 maximum); +INT16 AnsiToOem16(Win16FarPtr source, Win16FarPtr destination); +INT16 OemToAnsi16(Win16FarPtr source, Win16FarPtr destination); +BOOL16 MessageBeep16(UINT16 type); +INT16 wvsprintf16( + char *output, const char *format, const uint16_t *arguments); +INT16 win16_call_message_box( + Win16FarPtr procedure, + HWND16 owner, + const char *text, + const char *caption, + UINT16 type); +INT16 win16_call_message_box_far( + Win16FarPtr procedure, + HWND16 owner, + Win16FarPtr text, + Win16FarPtr caption, + UINT16 type); +HWND16 win16_call_create_dialog_param( + Win16FarPtr procedure, + HINSTANCE16 instance, + Win16FarPtr template_name, + HWND16 parent, + Win16FarPtr dialog_proc, + LPARAM16 init_parameter); +INT16 win16_call_dialog_box_param( + Win16FarPtr procedure, + HINSTANCE16 instance, + Win16FarPtr template_name, + HWND16 parent, + Win16FarPtr dialog_proc, + LPARAM16 init_parameter); +UINT16 SetErrorMode16(UINT16 mode); +HINSTANCE16 LoadLibrary16(const char *library_name); +Win16FarPtr GetProcAddress16( + HINSTANCE16 module, const char *procedure_name); +UINT16 GetWindowsDirectory16(char *buffer, UINT16 size); +UINT16 GetWindowsDirectoryFar16(Win16FarPtr buffer, UINT16 size); +UINT16 GetSystemDirectory16(char *buffer, UINT16 size); +UINT16 GetSystemDirectoryFar16(Win16FarPtr buffer, UINT16 size); +HINSTANCE16 GetModuleHandle16(Win16FarPtr module_name); +UINT16 GetModuleFileName16( + HINSTANCE16 module, char *buffer, UINT16 size); +UINT16 GetModuleFileNameFar16( + HINSTANCE16 module, Win16FarPtr buffer, UINT16 size); +uint32_t GetFreeSpace16(UINT16 flags); +uint32_t GlobalCompact16(uint32_t requested_bytes); +BOOL16 FreeLibrary16(HINSTANCE16 module); +Win16Handle GetCurrentTask16(void); +uint32_t GetVersion16(void); +Win16FarPtr GetDOSEnvironment16(void); +void WaitEvent16(uint16_t event); +uint16_t InitApp16(HINSTANCE16 instance); +uint32_t GetWinFlags16(void); + +#endif diff --git a/original/reconstructed/tdkpin_window_lifecycle.c b/original/reconstructed/tdkpin_window_lifecycle.c new file mode 100644 index 0000000..ba431ba --- /dev/null +++ b/original/reconstructed/tdkpin_window_lifecycle.c @@ -0,0 +1,71 @@ +/* Derived ObjectWindows window destruction chains used by TDKPIN. */ + +#include "tdkpin_window_lifecycle.h" + +#include "tdkpin_strings.h" + +enum { + WINDOW_TITLE_OFFSET = 0x1d, + WINDOW_ATTACHED_OBJECT_OFFSET = 0x3b, + OVERLAY_PEER_OFFSET = 0x41, + DGROUP_OVERLAY_BITMAP = 0x0867, +}; + +static void write_far( + Win16FarPtr object, uint16_t offset, Win16FarPtr value) +{ + win16_write_u32(object, offset, value); +} + +/* + * 1018:121b — destroy TWindow-owned title and attached object before chaining + * into TObjectWindow and the caller's hidden ownership cleanup. + */ +void object_windows_window_destruct( + Win16FarPtr window, uint16_t vmt) +{ + borland_far_strdispose( + win16_read_far_pointer(window, WINDOW_TITLE_OFFSET)); + Win16FarPtr attached = + win16_read_far_pointer(window, WINDOW_ATTACHED_OBJECT_OFFSET); + if (attached != 0) { + borland_dispose_object(attached); + write_far(window, WINDOW_ATTACHED_OBJECT_OFFSET, 0); + } + object_windows_object_destruct(window, 0); + BorlandObjectCallFrame frame = {window, vmt}; + borland_finish_object_destructor(&frame, 0); +} + +/* + * 1000:5ba6 — delete DAT-993 overlay bitmap, break the reciprocal +41 peer + * links, then run the ordinary TWindow and derived Borland destructor exits. + */ +void tdkpin_overlay_window_destruct( + Win16FarPtr window, uint16_t vmt) +{ + HBITMAP16 bitmap = win16_read_u16( + win16_dgroup_pointer(DGROUP_OVERLAY_BITMAP)); + (void)DeleteObject16(bitmap); + Win16FarPtr peer = win16_read_far_pointer(window, OVERLAY_PEER_OFFSET); + write_far(peer, OVERLAY_PEER_OFFSET, 0); + write_far(window, OVERLAY_PEER_OFFSET, 0); + object_windows_window_destruct(window, 0); + BorlandObjectCallFrame frame = {window, vmt}; + borland_finish_object_destructor(&frame, 0); +} + +/* 1000:60e7 — reciprocal board peer uses its +45 field for this window. */ +void tdkpin_board_window_destruct( + Win16FarPtr window, uint16_t vmt) +{ + Win16FarPtr peer = win16_read_far_pointer(window, OVERLAY_PEER_OFFSET); + write_far(peer, 0x45, 0); + write_far(window, OVERLAY_PEER_OFFSET, 0); + HBITMAP16 bitmap = win16_read_u16( + win16_dgroup_pointer(DGROUP_OVERLAY_BITMAP)); + (void)DeleteObject16(bitmap); + object_windows_window_destruct(window, 0); + BorlandObjectCallFrame frame = {window, vmt}; + borland_finish_object_destructor(&frame, 0); +} diff --git a/original/reconstructed/tdkpin_window_lifecycle.h b/original/reconstructed/tdkpin_window_lifecycle.h new file mode 100644 index 0000000..870bf6a --- /dev/null +++ b/original/reconstructed/tdkpin_window_lifecycle.h @@ -0,0 +1,16 @@ +#ifndef TDKPIN_WINDOW_LIFECYCLE_H +#define TDKPIN_WINDOW_LIFECYCLE_H + +#include "tdkpin_object_lifecycle.h" + +void object_windows_window_destruct( + Win16FarPtr window, + uint16_t vmt); /* 1018:121b */ +void tdkpin_overlay_window_destruct( + Win16FarPtr window, + uint16_t vmt); /* 1000:5ba6 */ +void tdkpin_board_window_destruct( + Win16FarPtr window, + uint16_t vmt); /* 1000:60e7 */ + +#endif diff --git a/original/reconstructed/tdkpin_window_messages.c b/original/reconstructed/tdkpin_window_messages.c new file mode 100644 index 0000000..1139bdf --- /dev/null +++ b/original/reconstructed/tdkpin_window_messages.c @@ -0,0 +1,797 @@ +/* ObjectWindows dynamic handlers from message table 1028:05cc. */ + +#include "tdkpin_window_messages.h" +#include "tdkpin_object_list.h" + +enum { + OBJECT_VMT_OFFSET = 0, + OBJECT_STATUS_OFFSET = 2, + OBJECT_WINDOW_HANDLE_OFFSET = 4, + OBJECT_FLAGS_OFFSET = 0x16, + OBJECT_PARENT_OFFSET = 6, + WINDOW_DEFAULT_HANDLER_SLOT = 0x0c, + WINDOW_MESSAGE_0014_SLOT = 0x10, + WINDOW_CAN_CLOSE_SLOT = 0x3c, + WINDOW_SCROLL_HANDLER_SLOT = 0x48, + APPLICATION_MAIN_WINDOW_OFFSET = 8, + APPLICATION_CAN_CLOSE_SLOT = 0x44, + WIN16_GWL_STYLE = -16, + WIN16_WS_HSCROLL_HIGH = 0x0010, + WIN16_WS_VSCROLL_HIGH = 0x0020, + WIN16_WM_GETDLGCODE = 0x0087, + WIN16_WM_COMMAND = 0x0111, + WIN16_DLGC_BUTTON_MASK = 0x0030, + WIN16_GWW_ID = -12, + DGROUP_TURBO_WINDOW_CLASS_NAME = 0x068c, + CHILD_WINDOWED_CALLBACK_OFFSET = 0x0cc7, + WINDOW_MDI_CLIENT_SLOT = 0x30, + WIN16_WM_MDIDESTROY = 0x0221, + WINDOW_SAVED_FOCUS_OFFSET = 0x3f, + WINDOW_ATTACHED_OBJECT_OFFSET = 0x3b, + WINDOW_WIDTH_OFFSET = 0x2d, + WINDOW_HEIGHT_OFFSET = 0x2f, + WIN16_WM_LBUTTONUP = 0x0202, +}; + +static Win16FarPtr object_vmt_procedure( + Win16FarPtr object, uint16_t slot) +{ + uint16_t vmt = win16_read_u16( + win16_far_add_offset(object, OBJECT_VMT_OFFSET)); + return win16_read_far_pointer(win16_dgroup_pointer(vmt), slot); +} + +static Win16FarPtr application_main_window(void) +{ + return win16_read_far_pointer( + g_object_windows_application, APPLICATION_MAIN_WINDOW_OFFSET); +} + +static void call_default_handler( + Win16FarPtr window, ObjectWindowsMessage *message) +{ + win16_call_object_message_handler( + object_vmt_procedure(window, WINDOW_DEFAULT_HANDLER_SLOT), + window, + message); +} + +static Win16FarPtr attached_object(Win16FarPtr window) +{ + return win16_read_far_pointer(window, WINDOW_ATTACHED_OBJECT_OFFSET); +} + +static void dispatch_attached_scroll( + Win16FarPtr window, + ObjectWindowsMessage *message, + uint32_t required_style, + uint16_t attached_slot) +{ + HWND16 handle = win16_read_u16(win16_far_add_offset( + window, OBJECT_WINDOW_HANDLE_OFFSET)); + uint32_t style = (uint32_t)GetWindowLong16(handle, WIN16_GWL_STYLE); + if ((style & required_style) == 0) { + win16_call_object_message_handler( + object_vmt_procedure(window, WINDOW_SCROLL_HANDLER_SLOT), + window, + message); + return; + } + + Win16FarPtr attached = attached_object(window); + if (attached == 0) { + call_default_handler(window, message); + return; + } + win16_call_object_scroll_method( + object_vmt_procedure(attached, attached_slot), + attached, + (uint16_t)message->lparam, + message->wparam); +} + +/* 1018:1788 -- horizontal scrolling with optional attached controller. */ +void object_windows_wm_hscroll_attached( + Win16FarPtr window, ObjectWindowsMessage *message) +{ + dispatch_attached_scroll( + window, message, 0x00100000u, 0x20); +} + +/* 1018:17f8 -- vertical scrolling with optional attached controller. */ +void object_windows_wm_vscroll_attached( + Win16FarPtr window, ObjectWindowsMessage *message) +{ + dispatch_attached_scroll( + window, message, 0x00200000u, 0x1c); +} + +/* + * 1018:1868 -- BeginPaint/EndPaint lifetime around attached +14/+18 and window + * +4c virtuals. All three receive the same 32-byte PAINTSTRUCT16 stack object. + */ +void object_windows_wm_paint_attached( + Win16FarPtr window, ObjectWindowsMessage *message) +{ + (void)message; + PAINTSTRUCT16 paint; + HWND16 handle = win16_read_u16(win16_far_add_offset( + window, OBJECT_WINDOW_HANDLE_OFFSET)); + (void)BeginPaint16(handle, win16_stack_pointer(&paint)); + Win16FarPtr attached = attached_object(window); + if (attached != 0) { + win16_call_object_paint_method( + object_vmt_procedure(attached, 0x14), + attached, + &paint, + paint.dc); + } + win16_call_object_paint_method( + object_vmt_procedure(window, 0x4c), + window, + &paint, + paint.dc); + if (attached != 0) { + win16_call_object_method( + object_vmt_procedure(attached, 0x18), attached); + } + (void)EndPaint16(handle, win16_stack_pointer(&paint)); +} + +/* 1018:18e9 -- attached resize notification and cached outer dimensions. */ +void object_windows_wm_size_attached( + Win16FarPtr window, ObjectWindowsMessage *message) +{ + Win16FarPtr attached = attached_object(window); + if (attached != 0 && message->wparam != 1) { + win16_call_object_method( + object_vmt_procedure(attached, 0x0c), attached); + } + if (message->wparam == 0) { + RECT16 rectangle; + HWND16 handle = win16_read_u16(win16_far_add_offset( + window, OBJECT_WINDOW_HANDLE_OFFSET)); + (void)GetWindowRect16(handle, win16_stack_pointer(&rectangle)); + win16_write_u16( + window, + WINDOW_WIDTH_OFFSET, + (uint16_t)(rectangle.right - rectangle.left)); + win16_write_u16( + window, + WINDOW_HEIGHT_OFFSET, + (uint16_t)(rectangle.bottom - rectangle.top)); + } + call_default_handler(window, message); +} + +/* + * 1018:1986 -- attached mouse tracking. The original keeps the last/unfilled + * MSG contents when PeekMessage is false, so the initial message id is made an + * explicit indeterminate word instead of invoking undefined host-C behavior. + */ +void object_windows_track_mouse_until_button_up( + Win16FarPtr window, ObjectWindowsMessage *message) +{ + Win16FarPtr attached = attached_object(window); + if (attached != 0 && + win16_read_u8(win16_far_add_offset(attached, 0x22)) != 0) { + HWND16 handle = win16_read_u16(win16_far_add_offset( + window, OBJECT_WINDOW_HANDLE_OFFSET)); + (void)SetCapture16(handle); + MSG16 queued = {.message = win16_indeterminate_u16()}; + do { + if (PeekMessage16(&queued, 0, 0, 0, 1) != 0) { + (void)TranslateMessage16(&queued); + (void)DispatchMessage16(&queued); + } + win16_call_object_u16_method( + object_vmt_procedure(attached, 0x24), + attached, + handle); + } while (queued.message != WIN16_WM_LBUTTONUP); + (void)ReleaseCapture16(); + } + call_default_handler(window, message); +} + +/* 1018:0673 — AL=1 exactly when every requested bit is set at object +0x16. */ +bool object_windows_has_flags(Win16FarPtr object, uint8_t mask) +{ + uint8_t flags = win16_read_u8( + win16_far_add_offset(object, OBJECT_FLAGS_OFFSET)); + return (flags & mask) == mask; +} + +/* 1018:05dc — inherited virtual default returning AX=0. */ +uint16_t object_windows_zero_word_default(Win16FarPtr object) +{ + (void)object; + return 0; +} + +/* 1018:0641 — set or clear a mask in the packed object flag byte at +0x16. */ +void object_windows_update_flags( + Win16FarPtr object, bool set, uint8_t mask) +{ + Win16FarPtr address = + win16_far_add_offset(object, OBJECT_FLAGS_OFFSET); + uint8_t flags = win16_read_u8(address); + win16_write_u8(address, set ? (uint8_t)(flags | mask) + : (uint8_t)(flags & (uint8_t)~mask)); +} + +/* 1018:05f3, 060d, 0627 — fixed-mask compiler wrappers. */ +void object_windows_set_flag_1(Win16FarPtr object) +{ + object_windows_update_flags(object, true, 1); +} + +void object_windows_set_flag_4(Win16FarPtr object) +{ + object_windows_update_flags(object, true, 4); +} + +void object_windows_clear_flag_4(Win16FarPtr object) +{ + object_windows_update_flags(object, false, 4); +} + +/* 1018:0f38 — ask the appropriate CanClose virtual and dispose on approval. */ +void object_windows_close_if_allowed(Win16FarPtr window) +{ + bool allowed; + if (window == application_main_window()) { + allowed = win16_call_object_bool_method( + object_vmt_procedure( + g_object_windows_application, APPLICATION_CAN_CLOSE_SLOT), + g_object_windows_application); + } else { + allowed = win16_call_object_bool_method( + object_vmt_procedure(window, WINDOW_CAN_CLOSE_SLOT), window); + } + if (allowed) { + borland_dispose_object(window); + } +} + +/* 1018:0f22 — dynamic id 0x0010 (WM_CLOSE). */ +void object_windows_wm_close( + Win16FarPtr window, ObjectWindowsMessage *message) +{ + (void)message; + object_windows_close_if_allowed(window); +} + +/* 1018:0f8d — dynamic id 0x0002 (WM_DESTROY). */ +void object_windows_wm_destroy( + Win16FarPtr window, ObjectWindowsMessage *message) +{ + if (window == application_main_window()) { + PostQuitMessage16(win16_read_u16(win16_far_add_offset( + window, OBJECT_WINDOW_HANDLE_OFFSET))); + } + call_default_handler(window, message); +} + +/* 1018:0fcc — dynamic id 0x0082 (WM_NCDESTROY). */ +void object_windows_wm_nc_destroy( + Win16FarPtr window, ObjectWindowsMessage *message) +{ + HWND16 handle = win16_read_u16(win16_far_add_offset( + window, OBJECT_WINDOW_HANDLE_OFFSET)); + object_windows_unbind_window(handle); + call_default_handler(window, message); + win16_write_u16(window, OBJECT_WINDOW_HANDLE_OFFSET, 0); +} + +/* 1018:0ffd — dynamic id 0x0006 (WM_ACTIVATE). */ +void object_windows_wm_activate( + Win16FarPtr window, ObjectWindowsMessage *message) +{ + call_default_handler(window, message); + if (message->wparam == 0) { + return; + } + Win16FarPtr active = + object_windows_has_flags(window, 1) ? window : 0; + object_windows_application_set_active_dialog( + g_object_windows_application, active); +} + +/* 1018:1054 — dynamic id 0x0011 (WM_QUERYENDSESSION). */ +void object_windows_wm_query_end_session( + Win16FarPtr window, ObjectWindowsMessage *message) +{ + bool allowed; + if (window == application_main_window()) { + allowed = win16_call_object_bool_method( + object_vmt_procedure( + g_object_windows_application, APPLICATION_CAN_CLOSE_SLOT), + g_object_windows_application); + } else { + allowed = win16_call_object_bool_method( + object_vmt_procedure(window, WINDOW_CAN_CLOSE_SLOT), window); + } + message->result = allowed ? 1 : 0; +} + +/* + * 1018:10aa — dynamic id 0x0014. The numeric id and exact behavior are kept + * explicit because a stronger source-level OWL method name is not encoded. + */ +void object_windows_message_0014( + Win16FarPtr window, ObjectWindowsMessage *message) +{ + if (window == application_main_window()) { + object_windows_close_if_allowed(window); + return; + } + win16_call_object_message_handler( + object_vmt_procedure(window, WINDOW_MESSAGE_0014_SLOT), + window, + message); +} + +static void dispatch_scroll_message( + Win16FarPtr window, + ObjectWindowsMessage *message, + uint16_t style_high_mask) +{ + uint32_t style = (uint32_t)GetWindowLong16( + win16_read_u16(win16_far_add_offset( + window, OBJECT_WINDOW_HANDLE_OFFSET)), + WIN16_GWL_STYLE); + uint16_t style_high = (uint16_t)(style >> 16); + uint16_t slot = (style_high & style_high_mask) == 0 + ? WINDOW_SCROLL_HANDLER_SLOT + : WINDOW_DEFAULT_HANDLER_SLOT; + win16_call_object_message_handler( + object_vmt_procedure(window, slot), window, message); +} + +/* 1018:0b6c — dynamic id 0x0114 (WM_HSCROLL). */ +void object_windows_wm_hscroll( + Win16FarPtr window, ObjectWindowsMessage *message) +{ + dispatch_scroll_message( + window, message, WIN16_WS_HSCROLL_HIGH); +} + +/* 1018:0b25 — dynamic id 0x0115 (WM_VSCROLL). */ +void object_windows_wm_vscroll( + Win16FarPtr window, ObjectWindowsMessage *message) +{ + dispatch_scroll_message( + window, message, WIN16_WS_VSCROLL_HIGH); +} + +/* + * 1018:08f0 — dynamic id 0x0111 (WM_COMMAND). + * + * Win16 encodes the command id in WPARAM, a control HWND in LOWORD(LPARAM), + * and the notification in HIWORD(LPARAM). ObjectWindows maps three numeric + * bands into dynamic ids by 16-bit subtraction: command-0x6000, + * control-0x8000, and notification-0x7000. + */ +void object_windows_wm_command( + Win16FarPtr window, ObjectWindowsMessage *message) +{ + uint16_t control_window = (uint16_t)message->lparam; + uint16_t notification = (uint16_t)((uint32_t)message->lparam >> 16); + + if (object_windows_has_flags(window, 1) && + control_window == 0 && notification == 0) { + HWND16 dialog = win16_read_u16(win16_far_add_offset( + window, OBJECT_WINDOW_HANDLE_OFFSET)); + HWND16 control = GetDlgItem16(dialog, (INT16)message->wparam); + if (control != 0 && + (((uint16_t)SendMessage16( + control, WIN16_WM_GETDLGCODE, 0, 0) & + WIN16_DLGC_BUTTON_MASK) != 0)) { + control_window = control; + message->lparam = (LPARAM16)control; + } + } + + if (control_window == 0) { + if (message->wparam < 0x6000) { + HWND16 focus = GetFocus16(); + Win16FarPtr target = object_windows_object_from_window(focus); + HWND16 owner = win16_read_u16(win16_far_add_offset( + window, OBJECT_WINDOW_HANDLE_OFFSET)); + while (target == 0 && focus != 0 && focus != owner) { + focus = GetParent16(focus); + target = object_windows_object_from_window(focus); + } + if (target == 0) { + target = window; + } + object_windows_dispatch_event( + 0x10, + (uint16_t)(message->wparam - 0x6000u), + win16_stack_pointer(message), + target); + return; + } + call_default_handler(window, message); + return; + } + + HWND16 owner = win16_read_u16(win16_far_add_offset( + window, OBJECT_WINDOW_HANDLE_OFFSET)); + HWND16 child_window = GetDlgItem16(owner, (INT16)message->wparam); + Win16FarPtr child = object_windows_object_from_window(child_window); + if (child != 0 && notification < 0x1000) { + object_windows_dispatch_event( + 0x18, + (uint16_t)(notification - 0x7000u), + win16_stack_pointer(message), + child); + return; + } + + if (message->wparam < 0x1000) { + object_windows_dispatch_event( + 0x14, + (uint16_t)(message->wparam - 0x8000u), + win16_stack_pointer(message), + window); + return; + } + win16_call_object_message_handler( + object_vmt_procedure(window, 0x14), window, message); +} + +/* 1018:0d6a — shared TWindow VMT +0x2c class-name provider. */ +Win16FarPtr object_windows_turbo_window_class_name(Win16FarPtr window) +{ + (void)window; + return win16_dgroup_pointer(DGROUP_TURBO_WINDOW_CLASS_NAME); +} + +/* + * 1018:0a85 — VMT +0x48 shared by WM_HSCROLL/WM_VSCROLL. + * HIWORD(LPARAM) identifies the control window. Bound controls dispatch their + * notification as id-0x7000; native controls use GWW_ID and id-0x8000. + */ +void object_windows_route_scroll_notification( + Win16FarPtr window, ObjectWindowsMessage *message) +{ + HWND16 control = (HWND16)((uint32_t)message->lparam >> 16); + if (control == 0) { + call_default_handler(window, message); + return; + } + + Win16FarPtr child = object_windows_object_from_window(control); + if (child != 0) { + object_windows_dispatch_event( + 0x18, + (uint16_t)(message->wparam - 0x7000u), + win16_stack_pointer(message), + child); + return; + } + + uint16_t control_id = GetWindowWord16(control, WIN16_GWW_ID); + if (control_id < 0x1000) { + object_windows_dispatch_event( + 0x14, + (uint16_t)(control_id - 0x8000u), + win16_stack_pointer(message), + window); + return; + } + win16_call_object_message_handler( + object_vmt_procedure(window, 0x14), window, message); +} + +/* + * 1018:0bb3 — select a command target from the event HWND, explicit parent + * object (+6/+8), or HWND property lookup. A missing/self target falls back to + * the current window's VMT +0x0c; otherwise id WPARAM-0x6000 is dispatched. + */ +void object_windows_route_command_target( + Win16FarPtr window, ObjectWindowsMessage *message) +{ + Win16FarPtr target = 0; + HWND16 own_window = win16_read_u16(win16_far_add_offset( + window, OBJECT_WINDOW_HANDLE_OFFSET)); + if (message->window != own_window) { + target = win16_read_far_pointer(window, OBJECT_PARENT_OFFSET); + if (target == 0) { + target = object_windows_object_from_window(message->window); + } + } + if (target == 0) { + call_default_handler(window, message); + return; + } + object_windows_dispatch_event( + 0x10, + (uint16_t)(message->wparam - 0x6000u), + win16_stack_pointer(message), + target); +} + +/* + * 1018:0c59 — forward to the explicit parent object. WM_COMMAND uses WPARAM; + * every other message derives the dynamic id from this window's GWW_ID. + */ +void object_windows_forward_event_to_parent( + Win16FarPtr window, ObjectWindowsMessage *message) +{ + Win16FarPtr parent = + win16_read_far_pointer(window, OBJECT_PARENT_OFFSET); + if (parent == 0) { + return; + } + uint16_t id = message->message == WIN16_WM_COMMAND + ? message->wparam + : GetWindowWord16( + win16_read_u16(win16_far_add_offset( + window, OBJECT_WINDOW_HANDLE_OFFSET)), + WIN16_GWW_ID); + object_windows_dispatch_event( + 0x14, + (uint16_t)(id - 0x8000u), + win16_stack_pointer(message), + parent); +} + +/* + * 1018:0ce7 — mark all windowed children, then destroy the native HWND. + * Flag 8 selects MDI destruction: the parent VMT +0x30 getter is deliberately + * called twice, and the second returned client HWND receives WM_MDIDESTROY. + */ +void object_windows_destroy_native_window(Win16FarPtr window) +{ + HWND16 handle = win16_read_u16(win16_far_add_offset( + window, OBJECT_WINDOW_HANDLE_OFFSET)); + if (handle == 0) { + return; + } + object_windows_for_each_child( + window, + win16_relocated_code_pointer(4, CHILD_WINDOWED_CALLBACK_OFFSET)); + if (object_windows_has_flags(window, 8)) { + Win16FarPtr parent = + win16_read_far_pointer(window, OBJECT_PARENT_OFFSET); + uint16_t parent_vmt = win16_read_u16(parent); + Win16FarPtr getter = win16_read_far_pointer( + win16_dgroup_pointer(parent_vmt), WINDOW_MDI_CLIENT_SLOT); + if (win16_call_object_far_method(getter, parent) != 0) { + Win16FarPtr client = + win16_call_object_far_method(getter, parent); + HWND16 client_window = win16_read_u16(win16_far_add_offset( + client, OBJECT_WINDOW_HANDLE_OFFSET)); + (void)SendMessage16( + client_window, WIN16_WM_MDIDESTROY, handle, 0); + return; + } + } + (void)DestroyWindow16(handle); +} + +/* + * 1018:0e46 — register an ObjectWindows class only when GetClassInfo cannot + * find it. VMT +0x2c returns the far class name and +0x34 fills WNDCLASS16. + */ +bool object_windows_register_class(Win16FarPtr window) +{ + uint16_t vmt = win16_read_u16(window); + Win16FarPtr class_name_proc = + win16_read_far_pointer(win16_dgroup_pointer(vmt), 0x2c); + Win16FarPtr class_name = + win16_call_object_far_method(class_name_proc, window); + WNDCLASS16 window_class; + if (GetClassInfo16( + g_win16_instance, class_name, &window_class) != 0) { + return true; + } + Win16FarPtr builder = + win16_read_far_pointer(win16_dgroup_pointer(vmt), 0x34); + win16_call_object_wndclass_method(builder, window, &window_class); + return RegisterClass16(&window_class) != 0; +} + +/* 1018:1274 — construct the shared ObjectWindows WNDCLASS16 descriptor. */ +void object_windows_build_window_class( + Win16FarPtr window, WNDCLASS16 *window_class) +{ + window_class->style = 3; + window_class->window_proc = win16_relocated_code_pointer(4, 0x018b); + window_class->class_extra_bytes = 0; + window_class->window_extra_bytes = 0; + window_class->instance = g_win16_instance; + window_class->icon = + LoadIcon16(0, win16_make_far_pointer(0, 0x7f00)); + window_class->cursor = + LoadCursor16(0, win16_make_far_pointer(0, 0x7f00)); + window_class->background_brush = 6; + window_class->menu_name = 0; + uint16_t vmt = win16_read_u16(window); + Win16FarPtr class_name_proc = + win16_read_far_pointer(win16_dgroup_pointer(vmt), 0x2c); + window_class->class_name = + win16_call_object_far_method(class_name_proc, window); +} + +/* 1018:12f5 — unaligned uint16 virtual field getter at object +0x35. */ +uint16_t object_windows_get_field_35(Win16FarPtr window) +{ + return win16_read_u16(win16_far_add_offset(window, 0x35)); +} + +/* 1018:1586 — remember focus only when it is a child of this native HWND. */ +void object_windows_remember_child_focus(Win16FarPtr window) +{ + HWND16 focus = GetFocus16(); + if (focus == 0) { + return; + } + HWND16 parent = win16_read_u16(win16_far_add_offset( + window, OBJECT_WINDOW_HANDLE_OFFSET)); + if (IsChild16(parent, focus) != 0) { + win16_write_u16(window, WINDOW_SAVED_FOCUS_OFFSET, focus); + } +} + +/* 1018:1547 — restore a saved child focus when both HWNDs remain suitable. */ +void object_windows_restore_child_focus(Win16FarPtr window) +{ + HWND16 saved = win16_read_u16(win16_far_add_offset( + window, WINDOW_SAVED_FOCUS_OFFSET)); + if (saved == 0 || IsWindow16(saved) == 0) { + return; + } + HWND16 owner = win16_read_u16(win16_far_add_offset( + window, OBJECT_WINDOW_HANDLE_OFFSET)); + if (IsIconic16(owner) == 0) { + (void)SetFocus16(saved); + } +} + +/* 1018:169d — base WM_ACTIVATE behavior plus dialog focus save/restore. */ +void object_windows_wm_activate_with_focus( + Win16FarPtr window, ObjectWindowsMessage *message) +{ + object_windows_wm_activate(window, message); + if (!object_windows_has_flags(window, 1)) { + return; + } + if (message->wparam == 0) { + object_windows_remember_child_focus(window); + } else { + object_windows_restore_child_focus(window); + } +} + +/* 1018:1a0e — SC_MINIMIZE/SC_RESTORE focus handling before default dispatch. */ +void object_windows_wm_syscommand_focus( + Win16FarPtr window, ObjectWindowsMessage *message) +{ + if (object_windows_has_flags(window, 1)) { + if (message->wparam == 0xf020) { + object_windows_remember_child_focus(window); + } else if (message->wparam == 0xf120) { + object_windows_restore_child_focus(window); + } + } + call_default_handler(window, message); +} + +/* 1018:1761 — receiver-only VMT +0x38 hook, then default event handler. */ +void object_windows_call_slot_38_then_default( + Win16FarPtr window, ObjectWindowsMessage *message) +{ + win16_call_object_method( + object_vmt_procedure(window, 0x38), window); + call_default_handler(window, message); +} + +/* 1018:1960 — save child focus before forwarding the unchanged event. */ +void object_windows_remember_focus_then_default( + Win16FarPtr window, ObjectWindowsMessage *message) +{ + object_windows_remember_child_focus(window); + call_default_handler(window, message); +} + +/* + * 1018:1311 — forward through the original far WNDPROC stored unaligned at + * object +0x37/+0x39, then publish DX:AX into message result +0x0a/+0x0c. + */ +void object_windows_call_original_window_proc( + Win16FarPtr window, ObjectWindowsMessage *message) +{ + Win16FarPtr procedure = win16_read_far_pointer(window, 0x37); + HWND16 handle = win16_read_u16(win16_far_add_offset( + window, OBJECT_WINDOW_HANDLE_OFFSET)); + message->result = CallWindowProc16( + procedure, + handle, + message->message, + message->wparam, + message->lparam); +} + +/* 1008:2c08 — receiver-only VMT +0x38 call; event argument is ignored. */ +void object_windows_call_slot_38( + Win16FarPtr window, ObjectWindowsMessage *message) +{ + (void)message; + win16_call_object_method( + object_vmt_procedure(window, 0x38), window); +} + +/* 1008:2cd9 — dialog default handler: set the 32-bit result to zero. */ +void object_windows_zero_message_result( + Win16FarPtr window, ObjectWindowsMessage *message) +{ + (void)window; + message->result = 0; +} + +/* + * 1008:2c1f -- query whether session termination must be rejected. The main + * window delegates to TApplication.CanClose at VMT +44; other windows use + * their own CanClose at +3c. The message result is the exact logical inverse. + */ +void object_windows_query_end_session_result( + Win16FarPtr window, ObjectWindowsMessage *message) +{ + Win16FarPtr receiver = window; + uint16_t slot = 0x3c; + if (window == win16_read_far_pointer( + g_object_windows_application, 8)) { + receiver = g_object_windows_application; + slot = 0x44; + } + uint16_t vmt = win16_read_u16(receiver); + Win16FarPtr procedure = + win16_read_far_pointer(win16_dgroup_pointer(vmt), slot); + bool can_close = win16_call_object_bool_method(procedure, receiver); + message->result = can_close ? 0 : 1; +} + +/* + * 1008:2c83 -- focus the HWND in message.wParam, recover its ObjectWindows + * object, and invoke VMT +0c on the optional unaligned far child at +0x43. + * The process marker is set on every path and has no reader in this image. + */ +void object_windows_focus_message( + Win16FarPtr ignored, ObjectWindowsMessage *message) +{ + (void)ignored; + (void)SetFocus16(message->wparam); + Win16FarPtr window = object_windows_object_from_window(message->wparam); + if (window != 0) { + Win16FarPtr attached = win16_read_far_pointer(window, 0x43); + if (attached != 0) { + uint16_t vmt = win16_read_u16(attached); + Win16FarPtr procedure = + win16_read_far_pointer(win16_dgroup_pointer(vmt), 0x0c); + win16_call_object_method(procedure, attached); + } + } + g_object_windows_focus_event_marker = 1; +} + +/* 1018:0c3d — generated receiver/event forwarding call to VMT +0x0c. */ +void object_windows_forward_default( + Win16FarPtr window, ObjectWindowsMessage *message) +{ + call_default_handler(window, message); +} + +/* 1018:0cc7 — set object flag 4 only after field +4 becomes nonzero. */ +void object_windows_set_flag_4_if_windowed( + uint16_t ignored, Win16FarPtr object) +{ + (void)ignored; + if (win16_read_u16(win16_far_add_offset( + object, OBJECT_WINDOW_HANDLE_OFFSET)) != 0) { + object_windows_set_flag_4(object); + } +} diff --git a/original/reconstructed/tdkpin_window_messages.h b/original/reconstructed/tdkpin_window_messages.h new file mode 100644 index 0000000..bfb9caa --- /dev/null +++ b/original/reconstructed/tdkpin_window_messages.h @@ -0,0 +1,104 @@ +#ifndef TDKPIN_WINDOW_MESSAGES_H +#define TDKPIN_WINDOW_MESSAGES_H + +#include "tdkpin_application.h" + +bool object_windows_has_flags( + Win16FarPtr object, uint8_t mask); /* 1018:0673 */ +uint16_t object_windows_zero_word_default( + Win16FarPtr object); /* 1018:05dc */ +void object_windows_update_flags( + Win16FarPtr object, + bool set, + uint8_t mask); /* 1018:0641 */ +void object_windows_set_flag_1(Win16FarPtr object); /* 1018:05f3 */ +void object_windows_set_flag_4(Win16FarPtr object); /* 1018:060d */ +void object_windows_clear_flag_4(Win16FarPtr object); /* 1018:0627 */ +void object_windows_close_if_allowed( + Win16FarPtr window); /* 1018:0f38 */ +void object_windows_wm_close( + Win16FarPtr window, ObjectWindowsMessage *message); /* 1018:0f22 */ +void object_windows_wm_destroy( + Win16FarPtr window, ObjectWindowsMessage *message); /* 1018:0f8d */ +void object_windows_wm_nc_destroy( + Win16FarPtr window, ObjectWindowsMessage *message); /* 1018:0fcc */ +void object_windows_wm_activate( + Win16FarPtr window, ObjectWindowsMessage *message); /* 1018:0ffd */ +void object_windows_wm_query_end_session( + Win16FarPtr window, ObjectWindowsMessage *message); /* 1018:1054 */ +void object_windows_message_0014( + Win16FarPtr window, ObjectWindowsMessage *message); /* 1018:10aa */ +void object_windows_wm_hscroll( + Win16FarPtr window, ObjectWindowsMessage *message); /* 1018:0b6c */ +void object_windows_wm_vscroll( + Win16FarPtr window, ObjectWindowsMessage *message); /* 1018:0b25 */ +void object_windows_wm_command( + Win16FarPtr window, ObjectWindowsMessage *message); /* 1018:08f0 */ +void object_windows_route_scroll_notification( + Win16FarPtr window, ObjectWindowsMessage *message); /* 1018:0a85 */ +void object_windows_route_command_target( + Win16FarPtr window, ObjectWindowsMessage *message); /* 1018:0bb3 */ +void object_windows_forward_event_to_parent( + Win16FarPtr window, ObjectWindowsMessage *message); /* 1018:0c59 */ +void object_windows_destroy_native_window( + Win16FarPtr window); /* 1018:0ce7 */ +bool object_windows_register_class( + Win16FarPtr window); /* 1018:0e46 */ +void object_windows_build_window_class( + Win16FarPtr window, + WNDCLASS16 *window_class); /* 1018:1274 */ +uint16_t object_windows_get_field_35( + Win16FarPtr window); /* 1018:12f5 */ +void object_windows_remember_child_focus( + Win16FarPtr window); /* 1018:1586 */ +void object_windows_restore_child_focus( + Win16FarPtr window); /* 1018:1547 */ +void object_windows_wm_activate_with_focus( + Win16FarPtr window, ObjectWindowsMessage *message); /* 1018:169d */ +void object_windows_wm_syscommand_focus( + Win16FarPtr window, ObjectWindowsMessage *message); /* 1018:1a0e */ +void object_windows_call_slot_38_then_default( + Win16FarPtr window, ObjectWindowsMessage *message); /* 1018:1761 */ +void object_windows_remember_focus_then_default( + Win16FarPtr window, ObjectWindowsMessage *message); /* 1018:1960 */ +void object_windows_call_original_window_proc( + Win16FarPtr window, ObjectWindowsMessage *message); /* 1018:1311 */ +void object_windows_call_slot_38( + Win16FarPtr window, ObjectWindowsMessage *message); /* 1008:2c08 */ +void object_windows_zero_message_result( + Win16FarPtr window, ObjectWindowsMessage *message); /* 1008:2cd9 */ +void object_windows_query_end_session_result( + Win16FarPtr window, ObjectWindowsMessage *message); /* 1008:2c1f */ +void object_windows_focus_message( + Win16FarPtr ignored, + ObjectWindowsMessage *message); /* 1008:2c83 */ +void object_windows_wm_hscroll_attached( + Win16FarPtr window, + ObjectWindowsMessage *message); /* 1018:1788 */ +void object_windows_wm_vscroll_attached( + Win16FarPtr window, + ObjectWindowsMessage *message); /* 1018:17f8 */ +void object_windows_wm_paint_attached( + Win16FarPtr window, + ObjectWindowsMessage *message); /* 1018:1868 */ +void object_windows_wm_size_attached( + Win16FarPtr window, + ObjectWindowsMessage *message); /* 1018:18e9 */ +void object_windows_track_mouse_until_button_up( + Win16FarPtr window, + ObjectWindowsMessage *message); /* 1018:1986 */ + +extern uint8_t g_object_windows_focus_event_marker; /* 1028:06f2 */ + +void win16_call_object_wndclass_method( + Win16FarPtr procedure, + Win16FarPtr object, + WNDCLASS16 *window_class); +Win16FarPtr object_windows_turbo_window_class_name( + Win16FarPtr window); /* 1018:0d6a */ +void object_windows_forward_default( + Win16FarPtr window, ObjectWindowsMessage *message); /* 1018:0c3d */ +void object_windows_set_flag_4_if_windowed( + uint16_t ignored, Win16FarPtr object); /* 1018:0cc7 */ + +#endif diff --git a/original/reconstructed/tdkpin_window_placement.c b/original/reconstructed/tdkpin_window_placement.c new file mode 100644 index 0000000..b6bdd22 --- /dev/null +++ b/original/reconstructed/tdkpin_window_placement.c @@ -0,0 +1,271 @@ +/* ObjectWindows native-window setup and normal-placement bookkeeping. */ + +#include "tdkpin_window_placement.h" + +#include "tdkpin_strings.h" + +#include "tdkpin_object_list.h" +#include "tdkpin_object_lifecycle.h" + +enum { + WINDOW_VMT_OFFSET = 0, + WINDOW_HANDLE_OFFSET = 4, + WINDOW_PARENT_OFFSET = 6, + WINDOW_FLAGS_OFFSET = 0x16, + WINDOW_ATTRIBUTES_OFFSET = 0x21, + WINDOW_NORMAL_X_OFFSET = 0x29, + WINDOW_NORMAL_Y_OFFSET = 0x2b, + WINDOW_NORMAL_WIDTH_OFFSET = 0x2d, + WINDOW_NORMAL_HEIGHT_OFFSET = 0x2f, + WINDOW_ATTACHED_OBJECT_OFFSET = 0x3b, + VMT_SETUP_SLOT = 0x10, + VMT_MDI_CLIENT_SLOT = 0x30, + WINDOW_FLAG_AUTO_FOCUS = 0x08, + WINDOW_FLAG_DIALOG_ITEM = 0x02, + WINDOW_TITLE_OFFSET = 0x1d, + WINDOW_STYLE_OFFSET = 0x21, + WINDOW_EXTENDED_STYLE_OFFSET = 0x25, + WINDOW_X_OFFSET = 0x29, + WINDOW_Y_OFFSET = 0x2b, + WINDOW_WIDTH_OFFSET = 0x2d, + WINDOW_HEIGHT_OFFSET = 0x2f, + WINDOW_PARAMETER_OFFSET = 0x31, + WINDOW_MENU_OFFSET = 0x35, + WINDOW_ORIGINAL_PROC_OFFSET = 0x37, + WINDOW_ATTACHED_OFFSET = 0x3b, + WINDOW_SAVED_FOCUS_OFFSET = 0x3f, + WINDOW_REGISTER_CLASS_SLOT = 0x1c, + WINDOW_CLASS_NAME_SLOT = 0x2c, + WINDOW_CREATED_SLOT = 0x38, + PARENT_MDI_CLIENT_SLOT = 0x30, +}; + +static void write_far( + Win16FarPtr base, uint16_t offset, Win16FarPtr value) +{ + win16_write_u16(base, offset, win16_far_offset(value)); + win16_write_u16( + base, (uint16_t)(offset + 2), win16_far_selector(value)); +} + +static Win16FarPtr vmt_procedure(Win16FarPtr object, uint16_t slot) +{ + return win16_read_far_pointer( + win16_dgroup_pointer(win16_read_u16(object)), slot); +} + +/* 1018:1106 -- construct the complete ObjectWindows TWindow state. */ +Win16FarPtr object_windows_window_construct( + Win16FarPtr window, + uint16_t vmt, + Win16FarPtr title, + Win16FarPtr parent) +{ + BorlandObjectCallFrame frame = {window, vmt}; + if (!borland_enter_object_constructor(&frame, 0)) { + return frame.object; + } + frame.object = object_windows_object_construct(frame.object, 0, parent); + write_far(frame.object, WINDOW_TITLE_OFFSET, borland_far_strdup(title)); + write_far( + frame.object, + WINDOW_ORIGINAL_PROC_OFFSET, + win16_def_window_proc_pointer()); + + uint32_t style; + if (parent == 0) { + style = 0x00cf0000u; + } else { + Win16FarPtr mdi_client = win16_call_object_far_method( + vmt_procedure(parent, PARENT_MDI_CLIENT_SLOT), parent); + if (mdi_client == 0) { + style = 0x10000000u; + } else { + object_windows_update_flags(frame.object, true, 8); + write_far( + frame.object, + WINDOW_ORIGINAL_PROC_OFFSET, + win16_def_mdi_child_proc_pointer()); + style = 0x04000000u; + } + } + win16_write_u32(frame.object, WINDOW_STYLE_OFFSET, style); + win16_write_u32(frame.object, WINDOW_EXTENDED_STYLE_OFFSET, 0); + win16_write_u16(frame.object, WINDOW_X_OFFSET, 0x8000); + win16_write_u16(frame.object, WINDOW_Y_OFFSET, 0); + win16_write_u16(frame.object, WINDOW_WIDTH_OFFSET, 0x8000); + win16_write_u16(frame.object, WINDOW_HEIGHT_OFFSET, 0); + write_far(frame.object, WINDOW_PARAMETER_OFFSET, 0); + win16_write_u16(frame.object, WINDOW_MENU_OFFSET, 0); + write_far(frame.object, WINDOW_ATTACHED_OFFSET, 0); + win16_write_u16(frame.object, WINDOW_SAVED_FOCUS_OFFSET, 0); + return frame.object; +} + +/* 1018:134f -- create or attach the native HWND represented by one TWindow. */ +uint16_t object_windows_create_native_window(Win16FarPtr window) +{ + if (win16_read_u16(win16_far_add_offset(window, 2)) != 0) { + return (win16_indeterminate_u16() & 0xff00u); + } + object_windows_clear_flag_4(window); + Win16FarPtr parent = win16_read_far_pointer(window, 6); + HWND16 parent_window = parent == 0 + ? 0 + : win16_read_u16(win16_far_add_offset(parent, 4)); + + HWND16 created = 0; + if (object_windows_has_flags(window, WINDOW_FLAG_DIALOG_ITEM)) { + created = GetDlgItem16( + parent_window, + (INT16)win16_read_u16(win16_far_add_offset( + window, WINDOW_MENU_OFFSET))); + } else { + bool registered = win16_call_object_bool_method( + vmt_procedure(window, WINDOW_REGISTER_CLASS_SLOT), window); + if (!registered) { + created = win16_indeterminate_u16() & 0xff00u; + } else { + g_object_windows_creating_object = window; + Win16FarPtr class_name = win16_call_object_far_method( + vmt_procedure(window, WINDOW_CLASS_NAME_SLOT), window); + if (!object_windows_has_flags(window, WINDOW_FLAG_AUTO_FOCUS)) { + created = CreateWindowEx16( + win16_read_u32(win16_far_add_offset( + window, WINDOW_EXTENDED_STYLE_OFFSET)), + class_name, + win16_read_far_pointer(window, WINDOW_TITLE_OFFSET), + win16_read_u32(win16_far_add_offset(window, WINDOW_STYLE_OFFSET)), + (INT16)win16_read_u16(win16_far_add_offset(window, WINDOW_X_OFFSET)), + (INT16)win16_read_u16(win16_far_add_offset(window, WINDOW_Y_OFFSET)), + (INT16)win16_read_u16(win16_far_add_offset(window, WINDOW_WIDTH_OFFSET)), + (INT16)win16_read_u16(win16_far_add_offset(window, WINDOW_HEIGHT_OFFSET)), + parent_window, + win16_read_u16(win16_far_add_offset(window, WINDOW_MENU_OFFSET)), + g_win16_instance, + win16_read_far_pointer(window, WINDOW_PARAMETER_OFFSET)); + } else { + Win16FarPtr mdi_client = win16_call_object_far_method( + vmt_procedure(parent, PARENT_MDI_CLIENT_SLOT), parent); + if (mdi_client != 0) { + MDICREATESTRUCT16 create = { + .class_name = class_name, + .title = win16_read_far_pointer(window, WINDOW_TITLE_OFFSET), + .owner = g_win16_instance, + .x = (INT16)win16_read_u16(win16_far_add_offset(window, WINDOW_X_OFFSET)), + .y = (INT16)win16_read_u16(win16_far_add_offset(window, WINDOW_Y_OFFSET)), + .width = (INT16)win16_read_u16(win16_far_add_offset(window, WINDOW_WIDTH_OFFSET)), + .height = (INT16)win16_read_u16(win16_far_add_offset(window, WINDOW_HEIGHT_OFFSET)), + .style = win16_read_u32(win16_far_add_offset(window, WINDOW_STYLE_OFFSET)), + .parameter = (LPARAM16)win16_read_far_pointer(window, WINDOW_PARAMETER_OFFSET), + }; + HWND16 client_window = win16_read_u16( + win16_far_add_offset(mdi_client, 4)); + created = (HWND16)SendMessage16( + client_window, + 0x0220, + 0, + (LPARAM16)win16_stack_pointer(&create)); + } + } + } + } + win16_write_u16(window, 4, created); + if (created == 0) { + win16_write_u16(window, 2, 0xffff); + } else if (object_windows_object_from_window(created) == 0) { + object_windows_bind_window(created, window); + int32_t previous = SetWindowLong16( + created, + -4, + (int32_t)win16_read_far_pointer(window, 0x12)); + write_far(window, WINDOW_ORIGINAL_PROC_OFFSET, (Win16FarPtr)previous); + win16_call_object_method( + vmt_procedure(window, WINDOW_CREATED_SLOT), window); + } + return (win16_indeterminate_u16() & 0xff00u) | + (win16_read_u16(win16_far_add_offset(window, 2)) == 0 ? 1u : 0u); +} + +static Win16FarPtr virtual_method( + Win16FarPtr object, uint16_t slot) +{ + uint16_t vmt = win16_read_u16(object); + return win16_read_far_pointer(win16_dgroup_pointer(vmt), slot); +} + +/* + * 1018:15c0 — capture the native window's normal screen rectangle. + * Minimized or maximized windows leave all four saved words untouched. For a + * child window, the top-left point is translated to the MDI client when the + * client exists and flag 08 is set; otherwise attribute bit 40000000 selects + * translation to the parent window. GetWindowRect/ScreenToClient BOOL results + * are deliberately ignored, matching the target. + */ +void object_windows_capture_normal_placement(Win16FarPtr window) +{ + HWND16 handle = + win16_read_u16(win16_far_add_offset(window, WINDOW_HANDLE_OFFSET)); + if (IsIconic16(handle) != 0 || IsZoomed16(handle) != 0) { + return; + } + + RECT16 rectangle; + (void)GetWindowRect16(handle, win16_stack_pointer(&rectangle)); + win16_write_u16( + window, + WINDOW_NORMAL_WIDTH_OFFSET, + (uint16_t)(rectangle.right - rectangle.left)); + win16_write_u16( + window, + WINDOW_NORMAL_HEIGHT_OFFSET, + (uint16_t)(rectangle.bottom - rectangle.top)); + + Win16FarPtr parent = + win16_read_far_pointer(window, WINDOW_PARENT_OFFSET); + if (parent != 0) { + Win16FarPtr client = win16_call_object_far_method( + virtual_method(parent, VMT_MDI_CLIENT_SLOT), parent); + if (client != 0 && + object_windows_has_flags(window, WINDOW_FLAG_AUTO_FOCUS)) { + HWND16 client_handle = win16_read_u16( + win16_far_add_offset(client, WINDOW_HANDLE_OFFSET)); + (void)ScreenToClient16( + client_handle, win16_stack_pointer(&rectangle)); + } else if ((win16_read_u32( + win16_far_add_offset( + window, WINDOW_ATTRIBUTES_OFFSET)) & + 0x40000000U) != 0) { + HWND16 parent_handle = win16_read_u16( + win16_far_add_offset(parent, WINDOW_HANDLE_OFFSET)); + (void)ScreenToClient16( + parent_handle, win16_stack_pointer(&rectangle)); + } + } + + win16_write_u16(window, WINDOW_NORMAL_X_OFFSET, (uint16_t)rectangle.left); + win16_write_u16(window, WINDOW_NORMAL_Y_OFFSET, (uint16_t)rectangle.top); +} + +/* + * 1018:170c — ObjectWindows SetupWindow sequence: validate/prepare the native + * window, optionally focus it, set up the attached object at +3b through VMT + * slot 10, then capture the normal placement. + */ +void object_windows_setup_window(Win16FarPtr window) +{ + object_windows_prepare_window(window); + if (object_windows_has_flags(window, WINDOW_FLAG_AUTO_FOCUS)) { + (void)SetFocus16( + win16_read_u16( + win16_far_add_offset(window, WINDOW_HANDLE_OFFSET))); + } + + Win16FarPtr attached = + win16_read_far_pointer(window, WINDOW_ATTACHED_OBJECT_OFFSET); + if (attached != 0) { + win16_call_object_method( + virtual_method(attached, VMT_SETUP_SLOT), attached); + } + object_windows_capture_normal_placement(window); +} diff --git a/original/reconstructed/tdkpin_window_placement.h b/original/reconstructed/tdkpin_window_placement.h new file mode 100644 index 0000000..374f423 --- /dev/null +++ b/original/reconstructed/tdkpin_window_placement.h @@ -0,0 +1,17 @@ +#ifndef TDKPIN_WINDOW_PLACEMENT_H +#define TDKPIN_WINDOW_PLACEMENT_H + +#include "tdkpin_window_messages.h" + +void object_windows_capture_normal_placement( + Win16FarPtr window); /* 1018:15c0 */ +void object_windows_setup_window(Win16FarPtr window); /* 1018:170c */ +Win16FarPtr object_windows_window_construct( + Win16FarPtr window, + uint16_t vmt, + Win16FarPtr title, + Win16FarPtr parent); /* 1018:1106 */ +uint16_t object_windows_create_native_window( + Win16FarPtr window); /* 1018:134f */ + +#endif diff --git a/original/reconstructed/tests/test_application.c b/original/reconstructed/tests/test_application.c new file mode 100644 index 0000000..12a57c2 --- /dev/null +++ b/original/reconstructed/tests/test_application.c @@ -0,0 +1,200 @@ +#include "../tdkpin_application.h" + +#include + +Win16FarPtr g_object_windows_application; +HINSTANCE16 g_win16_previous_instance; +HINSTANCE16 g_win16_instance; +uint16_t g_win16_show_command; +Win16FarPtr g_object_windows_dispatch_proc; +uint16_t g_object_windows_thunk_code_selector; +Win16FarPtr g_object_windows_free_thunk; + +static Win16FarPtr g_make_source; +static HINSTANCE16 g_make_instance; +static Win16FarPtr g_freed_proc; +static Win16FarPtr g_first_method; +static Win16FarPtr g_second_method; +static unsigned g_method_calls; +static bool g_first_sets_error; +static unsigned g_heap_reserve_initializations; +static Win16FarPtr g_freed_object; +static uint16_t g_freed_size; +static Win16FarPtr g_setup_method; +static Win16FarPtr g_create_main_method; +static Win16FarPtr g_created_main_window; +static HWND16 g_shown_window; +static INT16 g_show_command; + +BorlandAllocationAttempt borland_try_get_mem(uint16_t bytes) +{ + (void)bytes; + return (BorlandAllocationAttempt){0, true}; +} + +bool borland_try_free_mem(Win16FarPtr object, uint16_t bytes) +{ + g_freed_object = object; + g_freed_size = bytes; + return false; +} + +_Noreturn void borland_runtime_error(uint16_t code) +{ + (void)code; + assert(false); + __builtin_unreachable(); +} + +Win16FarPtr MakeProcInstance16( + Win16FarPtr procedure, HINSTANCE16 instance) +{ + g_make_source = procedure; + g_make_instance = instance; + return win16_make_far_pointer(0x6200, 0x2222); +} + +void FreeProcInstance16(Win16FarPtr procedure) +{ + g_freed_proc = procedure; +} + +void borland_initialize_heap_reserve(void) +{ + g_heap_reserve_initializations++; +} + +void win16_call_object_method( + Win16FarPtr procedure, Win16FarPtr object) +{ + g_method_calls++; + if (procedure == g_setup_method) { + return; + } + if (procedure == g_first_method) { + if (g_first_sets_error) { + win16_write_u16(object, 2, 5); + } + return; + } + assert(procedure == g_second_method); +} + +Win16FarPtr win16_call_object_far_method( + Win16FarPtr procedure, Win16FarPtr object) +{ + (void)object; + assert(procedure == g_create_main_method); + return g_created_main_window; +} + +BOOL16 ShowWindow16(HWND16 window, INT16 command) +{ + g_shown_window = window; + g_show_command = command; + return 1; +} + +static void reset_calls(void) +{ + g_method_calls = 0; + g_first_sets_error = false; + g_heap_reserve_initializations = 0; + g_freed_proc = 0; + g_freed_object = 0; +} + +int main(void) +{ + static uint8_t dgroup[0x1000]; + static uint8_t code[0x200]; + static uint8_t object_bytes[64]; + static uint8_t main_window_bytes[32]; + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, dgroup, sizeof(dgroup), true); + win16_set_dgroup_selector(0x5000); + win16_bind_ne_segment(4, 0x6000, code, sizeof(code), false); + win16_bind_segment( + 0x7000, object_bytes, sizeof(object_bytes), true); + win16_bind_segment( + 0x7100, main_window_bytes, sizeof(main_window_bytes), true); + + uint16_t vmt = 0x0200; + win16_write_u16(win16_dgroup_pointer(vmt), 0, 18); + g_first_method = win16_make_far_pointer(0x6100, 0x1000); + g_second_method = win16_make_far_pointer(0x6100, 0x2000); + g_setup_method = win16_make_far_pointer(0x6100, 0x3000); + g_create_main_method = win16_make_far_pointer(0x6100, 0x4000); + win16_write_u16(win16_dgroup_pointer((uint16_t)(vmt + 0x10)), 0, + win16_far_offset(g_first_method)); + win16_write_u16(win16_dgroup_pointer((uint16_t)(vmt + 0x12)), 0, + win16_far_selector(g_first_method)); + win16_write_u16(win16_dgroup_pointer((uint16_t)(vmt + 0x14)), 0, + win16_far_offset(g_second_method)); + win16_write_u16(win16_dgroup_pointer((uint16_t)(vmt + 0x16)), 0, + win16_far_selector(g_second_method)); + win16_write_u16(win16_dgroup_pointer((uint16_t)(vmt + 0x18)), 0, + win16_far_offset(g_setup_method)); + win16_write_u16(win16_dgroup_pointer((uint16_t)(vmt + 0x1a)), 0, + win16_far_selector(g_setup_method)); + win16_write_u16(win16_dgroup_pointer((uint16_t)(vmt + 0x34)), 0, + win16_far_offset(g_create_main_method)); + win16_write_u16(win16_dgroup_pointer((uint16_t)(vmt + 0x36)), 0, + win16_far_selector(g_create_main_method)); + + Win16FarPtr object = win16_make_far_pointer(0x7000, 4); + Win16FarPtr name = win16_make_far_pointer(0x5000, 0x0300); + g_win16_instance = 0x1111; + g_win16_previous_instance = 0; + reset_calls(); + assert(object_windows_application_construct(object, vmt, name) == object); + assert(win16_read_u16(object) == vmt); + assert(win16_read_far_pointer(object, 4) == name); + assert(g_object_windows_application == object); + assert(g_make_source == win16_make_far_pointer(0x6000, 0x0133)); + assert(g_make_instance == 0x1111); + assert(g_object_windows_dispatch_proc == + win16_make_far_pointer(0x6200, 0x2222)); + assert(g_heap_reserve_initializations == 1 && g_method_calls == 2); + assert(!object_windows_application_idle_default(object)); + object_windows_application_init_application_default(object); + Win16FarPtr dialog = win16_make_far_pointer(0x7200, 0x3456); + object_windows_application_set_active_dialog(object, dialog); + assert(win16_read_far_pointer(object, 0x0e) == dialog); + + g_created_main_window = win16_make_far_pointer(0x7100, 2); + win16_write_u16(g_created_main_window, 4, 0x0088); + g_win16_show_command = 7; + g_shown_window = 0; + object_windows_application_initialize(object); + assert(win16_read_far_pointer(object, 8) == g_created_main_window); + assert(g_shown_window == 0x0088 && g_show_command == 7); + g_created_main_window = 0; + win16_write_u16(object, 2, 0); + object_windows_application_initialize(object); + assert(win16_read_far_pointer(object, 8) == 0); + assert(win16_read_u16(win16_far_add_offset(object, 2)) == 0xfffb); + g_shown_window = 0; + object_windows_show(win16_make_far_pointer(0x7100, 10), 3); + assert(g_shown_window == 0); + + reset_calls(); + g_win16_previous_instance = 9; + assert(object_windows_application_construct(object, vmt, name) == object); + assert(g_method_calls == 1); + /* With InitApplication skipped, the first observed call is InitInstance. */ + assert(g_second_method != g_first_method); + + reset_calls(); + g_win16_previous_instance = 0; + g_first_sets_error = true; + (void)object_windows_application_construct(object, vmt, name); + assert(g_method_calls == 1); + assert(win16_read_u16(win16_far_add_offset(object, 2)) == 5); + + win16_write_u16(object, 0, vmt); + object_windows_application_destruct(object, 1); + assert(g_freed_proc == g_object_windows_dispatch_proc); + assert(g_freed_object == object && g_freed_size == 18); + return 0; +} diff --git a/original/reconstructed/tests/test_application_loop.c b/original/reconstructed/tests/test_application_loop.c new file mode 100644 index 0000000..689d1fb --- /dev/null +++ b/original/reconstructed/tests/test_application_loop.c @@ -0,0 +1,274 @@ +#include "../tdkpin_application.h" + +#include +#include + +Win16FarPtr g_object_windows_application; +HINSTANCE16 g_win16_previous_instance; +HINSTANCE16 g_win16_instance; +Win16FarPtr g_object_windows_dispatch_proc; +uint16_t g_object_windows_thunk_code_selector; +Win16FarPtr g_object_windows_free_thunk; +Win16FarPtr g_object_windows_message_hook; + +static MSG16 g_messages[4]; +static unsigned g_message_index; +static unsigned g_message_count; +static unsigned g_empty_before_messages; +static unsigned g_wait_calls; +static unsigned g_translate_calls; +static unsigned g_dispatch_calls; +static bool g_idle_result; +static bool g_main_filter_result; +static Win16FarPtr g_filter_order[4]; +static unsigned g_filter_calls; +static Win16FarPtr g_true_filter; +static BOOL16 g_dialog_result; +static HWND16 g_dialog_window; +static INT16 g_accelerator_result; +static HWND16 g_accelerator_window; +static HACCEL16 g_accelerator; +static BOOL16 g_mdi_result; +static HWND16 g_mdi_window; +static Win16FarPtr g_client_object; +static Win16FarPtr g_client_getter; +static Win16FarPtr g_bool_procedure; +static Win16FarPtr g_void_method; +static Win16FarPtr g_error_method; +static uint16_t g_error_argument; + +BOOL16 PeekMessage16( + MSG16 *message, + HWND16 window, + UINT16 minimum_message, + UINT16 maximum_message, + UINT16 remove_message) +{ + assert(window == 0 && minimum_message == 0 && maximum_message == 0); + assert(remove_message == 1); + if (g_empty_before_messages != 0) { + g_empty_before_messages--; + return 0; + } + assert(g_message_index < g_message_count); + *message = g_messages[g_message_index++]; + return 1; +} + +BOOL16 WaitMessage16(void) +{ + g_wait_calls++; + return 1; +} + +BOOL16 TranslateMessage16(const MSG16 *message) +{ + assert(message->message != 0x12); + g_translate_calls++; + return 1; +} + +LRESULT16 DispatchMessage16(const MSG16 *message) +{ + assert(message->message != 0x12); + g_dispatch_calls++; + return 0; +} + +BOOL16 IsDialogMessage16(HWND16 dialog, MSG16 *message) +{ + (void)message; + g_dialog_window = dialog; + return g_dialog_result; +} + +INT16 TranslateAccelerator16( + HWND16 window, HACCEL16 accelerator, MSG16 *message) +{ + (void)message; + g_accelerator_window = window; + g_accelerator = accelerator; + return g_accelerator_result; +} + +BOOL16 TranslateMDISysAccel16(HWND16 client, MSG16 *message) +{ + (void)message; + g_mdi_window = client; + return g_mdi_result; +} + +bool win16_call_object_bool_method( + Win16FarPtr procedure, Win16FarPtr object) +{ + (void)procedure; + (void)object; + g_bool_procedure = procedure; + return g_idle_result; +} + +bool win16_call_application_message_filter( + Win16FarPtr procedure, Win16FarPtr application, MSG16 *message) +{ + (void)application; + (void)message; + g_filter_order[g_filter_calls++] = procedure; + if (g_filter_calls == 1 && g_main_filter_result) { + return true; + } + return procedure == g_true_filter; +} + +Win16FarPtr win16_call_object_far_method( + Win16FarPtr procedure, Win16FarPtr object) +{ + assert(procedure == g_client_getter); + (void)object; + return g_client_object; +} + +void win16_call_object_method( + Win16FarPtr procedure, Win16FarPtr object) +{ + (void)object; + g_void_method = procedure; +} + +void win16_call_object_u16_method( + Win16FarPtr procedure, Win16FarPtr object, uint16_t argument) +{ + (void)object; + g_error_method = procedure; + g_error_argument = argument; +} + +static void write_far(uint16_t selector, uint16_t offset, Win16FarPtr value) +{ + Win16FarPtr base = win16_make_far_pointer(selector, offset); + win16_write_u16(base, 0, win16_far_offset(value)); + win16_write_u16(base, 2, win16_far_selector(value)); +} + +int main(void) +{ + static uint8_t dgroup[0x1000]; + static uint8_t application_bytes[64]; + static uint8_t window_bytes[64]; + static uint8_t dialog_bytes[32]; + static uint8_t client_bytes[32]; + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, dgroup, sizeof(dgroup), true); + win16_set_dgroup_selector(0x5000); + win16_bind_segment( + 0x7000, application_bytes, sizeof(application_bytes), true); + win16_bind_segment(0x7100, window_bytes, sizeof(window_bytes), true); + win16_bind_segment(0x7200, dialog_bytes, sizeof(dialog_bytes), true); + win16_bind_segment(0x7300, client_bytes, sizeof(client_bytes), true); + + Win16FarPtr application = win16_make_far_pointer(0x7000, 2); + Win16FarPtr main_window = win16_make_far_pointer(0x7100, 2); + Win16FarPtr dialog = win16_make_far_pointer(0x7200, 2); + g_client_object = win16_make_far_pointer(0x7300, 2); + const uint16_t app_vmt = 0x0100; + const uint16_t window_vmt = 0x0200; + win16_write_u16(application, 0, app_vmt); + win16_write_u16(main_window, 0, window_vmt); + write_far(0x7000, 10, main_window); + write_far(0x7000, 16, dialog); + win16_write_u16(main_window, 4, 0x1111); + win16_write_u16(dialog, 4, 0x2222); + win16_write_u16(g_client_object, 4, 0x3333); + + Win16FarPtr idle_proc = win16_make_far_pointer(0x6000, 0x1000); + Win16FarPtr main_filter = win16_make_far_pointer(0x6000, 0x2000); + Win16FarPtr run_proc = win16_make_far_pointer(0x6000, 0x2100); + Win16FarPtr error_proc = win16_make_far_pointer(0x6000, 0x2200); + Win16FarPtr filters[3] = { + win16_make_far_pointer(0x6000, 0x3000), + win16_make_far_pointer(0x6000, 0x4000), + win16_make_far_pointer(0x6000, 0x5000), + }; + write_far(0x5000, app_vmt + 0x0c, idle_proc); + write_far(0x5000, app_vmt + 0x24, main_filter); + write_far(0x5000, app_vmt + 0x20, run_proc); + write_far(0x5000, app_vmt + 0x40, error_proc); + write_far(0x5000, app_vmt + 0x28, filters[0]); + write_far(0x5000, app_vmt + 0x30, filters[1]); + write_far(0x5000, app_vmt + 0x2c, filters[2]); + g_client_getter = win16_make_far_pointer(0x6100, 0x6000); + Win16FarPtr can_close = win16_make_far_pointer(0x6100, 0x7000); + write_far(0x5000, window_vmt + 0x30, g_client_getter); + write_far(0x5000, window_vmt + 0x3c, can_close); + + memset(g_messages, 0, sizeof(g_messages)); + g_messages[0].message = 0x0100; + g_messages[1].message = 0x0012; + g_messages[1].wparam = 0x55aa; + g_message_count = 2; + g_message_index = 0; + g_empty_before_messages = 1; + g_wait_calls = 0; + g_translate_calls = 0; + g_dispatch_calls = 0; + g_filter_calls = 0; + g_idle_result = false; + g_main_filter_result = false; + g_true_filter = 0; + object_windows_application_message_loop(application); + assert(g_wait_calls == 1); + assert(g_translate_calls == 1 && g_dispatch_calls == 1); + assert(g_filter_calls == 1 && g_filter_order[0] == main_filter); + assert(win16_read_u16(win16_far_add_offset(application, 2)) == 0x55aa); + + MSG16 message = {0}; + g_filter_calls = 0; + g_true_filter = filters[1]; + assert(object_windows_application_preprocess_message( + application, &message)); + assert(g_filter_calls == 2); + assert(g_filter_order[0] == filters[0] && + g_filter_order[1] == filters[1]); + g_filter_calls = 0; + g_true_filter = 0; + assert(!object_windows_application_preprocess_message( + application, &message)); + assert(g_filter_calls == 3); + + g_dialog_result = 1; + assert(object_windows_application_process_dialog_message( + application, &message) == 0xff01); + assert(g_dialog_window == 0x2222); + g_dialog_result = 0; + assert(object_windows_application_process_dialog_message( + application, &message) == 0); + + win16_write_u16(application, 0x0c, 0x4444); + g_accelerator_result = 1; + assert(object_windows_application_process_accelerator( + application, &message)); + assert(g_accelerator_window == 0x1111 && g_accelerator == 0x4444); + + g_mdi_result = 1; + assert(object_windows_application_process_mdi_accelerator( + application, &message)); + assert(g_mdi_window == 0x3333); + g_client_object = 0; + assert(!object_windows_application_process_mdi_accelerator( + application, &message)); + assert(object_windows_window_get_mdi_client_default(main_window) == 0); + + win16_write_u16(application, 2, 0); + g_void_method = 0; + object_windows_application_run(application); + assert(g_void_method == run_proc); + win16_write_u16(application, 2, 0xfffb); + g_error_method = 0; + object_windows_application_run(application); + assert(g_error_method == error_proc && g_error_argument == 0xfffb); + g_idle_result = true; + assert(object_windows_application_can_close(application)); + assert(g_bool_procedure == can_close); + g_idle_result = false; + assert(!object_windows_application_can_close(application)); + return 0; +} diff --git a/original/reconstructed/tests/test_application_windows.c b/original/reconstructed/tests/test_application_windows.c new file mode 100644 index 0000000..4420ce3 --- /dev/null +++ b/original/reconstructed/tests/test_application_windows.c @@ -0,0 +1,215 @@ +#include "../tdkpin_application.h" + +#include +#include +#include +#include + +Win16FarPtr g_object_windows_application; +HINSTANCE16 g_win16_previous_instance; +HINSTANCE16 g_win16_instance; +uint16_t g_win16_show_command; +Win16FarPtr g_object_windows_dispatch_proc; +uint16_t g_object_windows_thunk_code_selector; +Win16FarPtr g_object_windows_free_thunk; +Win16FarPtr g_object_windows_message_hook; +Win16FarPtr g_win16_message_box; + +static bool g_reserve_unallocated; +static unsigned g_ensure_calls; +static Win16FarPtr g_disposed; +static uint16_t g_error; +static Win16FarPtr g_validator_result; +static bool g_create_result; +static int16_t g_execute_result; +static Win16FarPtr g_validate_proc; +static Win16FarPtr g_error_proc; +static Win16FarPtr g_create_proc; +static Win16FarPtr g_execute_proc; +static INT16 g_message_box_response; +static char g_message_text[32]; +static uint16_t g_exit_status; +static jmp_buf g_exit_jump; + +bool borland_heap_reserve_is_unallocated(void) +{ + return g_reserve_unallocated; +} + +void borland_ensure_heap_reserve(void) +{ + g_ensure_calls++; +} + +void borland_dispose_object(Win16FarPtr object) +{ + g_disposed = object; +} + +void win16_call_object_u16_method( + Win16FarPtr procedure, Win16FarPtr object, uint16_t argument) +{ + (void)object; + assert(procedure == g_error_proc); + g_error = argument; +} + +Win16FarPtr win16_call_application_window_method( + Win16FarPtr procedure, Win16FarPtr application, Win16FarPtr window) +{ + (void)application; + (void)window; + assert(procedure == g_validate_proc); + return g_validator_result; +} + +bool win16_call_object_bool_method( + Win16FarPtr procedure, Win16FarPtr object) +{ + (void)object; + assert(procedure == g_create_proc); + return g_create_result; +} + +int16_t win16_call_object_int_method( + Win16FarPtr procedure, Win16FarPtr object) +{ + (void)object; + assert(procedure == g_execute_proc); + return g_execute_result; +} + +INT16 wvsprintf16( + char *output, const char *format, const uint16_t *arguments) +{ + assert(strcmp(format, "Error code = %d. Continue?") == 0); + return (INT16)snprintf( + output, 32, format, (int16_t)arguments[0]); +} + +INT16 win16_call_message_box( + Win16FarPtr procedure, + HWND16 owner, + const char *text, + const char *caption, + UINT16 type) +{ + assert(procedure == g_win16_message_box); + assert(owner == 0 && type == 0x14); + assert(strcmp(caption, "Application Error") == 0); + strcpy(g_message_text, text); + return g_message_box_response; +} + +_Noreturn void borland_runtime_exit(uint16_t status) +{ + g_exit_status = status; + longjmp(g_exit_jump, 1); +} + +static void write_far(uint16_t offset, Win16FarPtr pointer) +{ + win16_write_u16( + win16_dgroup_pointer(offset), 0, win16_far_offset(pointer)); + win16_write_u16( + win16_dgroup_pointer((uint16_t)(offset + 2)), + 0, + win16_far_selector(pointer)); +} + +static void reset_state(void) +{ + g_reserve_unallocated = false; + g_ensure_calls = 0; + g_disposed = 0; + g_error = 0; +} + +int main(void) +{ + static uint8_t dgroup[0x1000]; + static uint8_t application_bytes[64]; + static uint8_t window_bytes[64]; + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, dgroup, sizeof(dgroup), true); + win16_set_dgroup_selector(0x5000); + win16_bind_segment( + 0x7000, application_bytes, sizeof(application_bytes), true); + win16_bind_segment(0x7100, window_bytes, sizeof(window_bytes), true); + + Win16FarPtr application = win16_make_far_pointer(0x7000, 2); + Win16FarPtr window = win16_make_far_pointer(0x7100, 2); + uint16_t app_vmt = 0x0100; + uint16_t window_vmt = 0x0200; + win16_write_u16(application, 0, app_vmt); + win16_write_u16(window, 0, window_vmt); + g_validate_proc = win16_make_far_pointer(0x6000, 0x1000); + g_error_proc = win16_make_far_pointer(0x6000, 0x2000); + g_create_proc = win16_make_far_pointer(0x6100, 0x3000); + g_execute_proc = win16_make_far_pointer(0x6100, 0x4000); + g_win16_message_box = win16_make_far_pointer(0x6200, 0x5000); + write_far(app_vmt + 0x3c, g_validate_proc); + write_far(app_vmt + 0x40, g_error_proc); + write_far(window_vmt + 0x20, g_create_proc); + write_far(window_vmt + 0x4c, g_execute_proc); + + reset_state(); + assert(object_windows_application_validate_window(application, 0) == 0); + win16_write_u16(window, 2, 0); + assert(object_windows_application_validate_window(application, window) == + window); + + reset_state(); + win16_write_u16(window, 2, 5); + assert(object_windows_application_validate_window(application, window) == 0); + assert(g_error == 5 && g_disposed == window && g_ensure_calls == 0); + + reset_state(); + g_reserve_unallocated = true; + win16_write_u16(window, 2, 0); + assert(object_windows_application_validate_window(application, window) == 0); + assert(g_error == 0xfffe && g_disposed == window && g_ensure_calls == 1); + + reset_state(); + g_validator_result = window; + g_create_result = true; + assert(object_windows_application_make_window(application, window) == window); + assert(g_disposed == 0); + reset_state(); + g_validator_result = window; + g_create_result = false; + win16_write_u16(window, 2, 7); + assert(object_windows_application_make_window(application, window) == 0); + assert(g_error == 7 && g_disposed == window); + reset_state(); + g_validator_result = 0; + assert(object_windows_application_make_window(application, window) == 0); + assert(g_disposed == 0); + + reset_state(); + g_validator_result = window; + g_execute_result = 4; + assert(object_windows_application_exec_dialog(application, window) == 4); + assert(g_disposed == window && g_error == 0); + reset_state(); + g_validator_result = window; + g_execute_result = -1; + assert(object_windows_application_exec_dialog(application, window) == 2); + assert(g_error == 0xffff && g_disposed == window); + reset_state(); + g_validator_result = 0; + assert(object_windows_application_exec_dialog(application, window) == 2); + assert(g_disposed == 0); + + g_message_box_response = 6; + object_windows_application_error(application, 123); + assert(strcmp(g_message_text, "Error code = 123. Continue?") == 0); + g_message_box_response = 7; + if (setjmp(g_exit_jump) == 0) { + object_windows_application_error(application, 0x8123); + assert(false); + } + assert(g_exit_status == 0x8123); + assert(strcmp(g_message_text, "Error code = -32477. Continue?") == 0); + return 0; +} diff --git a/original/reconstructed/tests/test_arithmetic.c b/original/reconstructed/tests/test_arithmetic.c new file mode 100644 index 0000000..171faf7 --- /dev/null +++ b/original/reconstructed/tests/test_arithmetic.c @@ -0,0 +1,54 @@ +#include "../tdkpin_arithmetic.h" + +#include +#include +#include +#include + +uint8_t g_borland_cpu_level; +static jmp_buf g_fault_jump; +static uint16_t g_runtime_code; +static bool g_divide_fault; + +_Noreturn void borland_runtime_error(uint16_t code) +{ + g_runtime_code = code; + longjmp(g_fault_jump, 1); +} + +_Noreturn void win16_integer_divide_fault(void) +{ + g_divide_fault = true; + longjmp(g_fault_jump, 1); +} + +int main(void) +{ + assert(borland_multiply_i32(123456, -789) == -97406784); + assert((uint32_t)borland_multiply_i32(INT32_MAX, INT32_MAX) == 1); + assert((uint32_t)borland_multiply_i32(INT32_MIN, 2) == 0); + + BorlandDivI32Result result = borland_divide_i32(-100, 7); + assert(result.quotient == -14 && result.remainder == -2); + result = borland_divide_i32(100, -7); + assert(result.quotient == -14 && result.remainder == 2); + result = borland_divide_i32(-100, -7); + assert(result.quotient == 14 && result.remainder == -2); + g_borland_cpu_level = 1; + result = borland_divide_i32(INT32_MIN, -1); + assert(result.quotient == INT32_MIN && result.remainder == 0); + g_runtime_code = 0; + if (setjmp(g_fault_jump) == 0) { + (void)borland_divide_i32(1, 0); + assert(false); + } + assert(g_runtime_code == 200); + g_borland_cpu_level = 2; + g_divide_fault = false; + if (setjmp(g_fault_jump) == 0) { + (void)borland_divide_i32(INT32_MIN, -1); + assert(false); + } + assert(g_divide_fault); + return 0; +} diff --git a/original/reconstructed/tests/test_asset_cleanup.c b/original/reconstructed/tests/test_asset_cleanup.c new file mode 100644 index 0000000..b0b8ec9 --- /dev/null +++ b/original/reconstructed/tests/test_asset_cleanup.c @@ -0,0 +1,128 @@ +#include "../tdkpin_game_assets.h" + +#include "../tdkpin_borland_objects.h" + +#include + +static uint8_t g_dgroup[0x5000]; +static uint8_t g_window_bytes[0x0c00]; +static Win16FarPtr g_window; +static Win16FarPtr g_owned; +static HGDIOBJ16 g_deleted[32]; +static unsigned g_delete_count; +static unsigned g_step; + +static Win16FarPtr dgroup_at(uint16_t offset) +{ + return win16_make_far_pointer(0x5000, offset); +} + +HCURSOR16 LoadCursor16(HINSTANCE16 instance, Win16FarPtr resource) +{ + assert(++g_step == 1 && instance == 0); + assert(resource == win16_make_far_pointer(0, 0x7f02)); + return 0x1111; +} + +HCURSOR16 SetCursor16(HCURSOR16 cursor) +{ + if (++g_step == 2) { + assert(cursor == 0x1111); + return 0x2222; + } + assert(cursor == 0x2222); + return 0; +} + +void tdkpin_unload_sounds(void) +{ + assert(++g_step == 3); +} + +void borland_dispose_object(Win16FarPtr object) +{ + assert(++g_step == 4 && object == g_owned); +} + +void tdkpin_drain_messages_except_input(void) +{ + assert(++g_step == 5); +} + +BOOL16 DeleteObject16(HGDIOBJ16 object) +{ + assert(object != 0 && g_delete_count < 32); + g_deleted[g_delete_count++] = object; + return 1; +} + +void PostQuitMessage16(INT16 exit_code) +{ + assert(exit_code == 0x12); +} + +void object_windows_window_destruct( + Win16FarPtr window, uint16_t vmt) +{ + assert(window == g_window && vmt == 0); +} + +BOOL16 InvalidateRect16( + HWND16 window, Win16FarPtr rectangle, BOOL16 erase) +{ + assert(window == 0x3333 && rectangle == 0 && erase == 1); + return 1; +} + +void borland_finish_object_destructor( + BorlandObjectCallFrame *frame, uint16_t vmt_field_offset) +{ + assert(frame->object == g_window && frame->vmt_argument == 0x9999); + assert(vmt_field_offset == 0); +} + +int main(void) +{ + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, g_dgroup, sizeof(g_dgroup), true); + win16_bind_segment(0x6000, g_window_bytes, sizeof(g_window_bytes), true); + win16_set_dgroup_selector(0x5000); + g_window = win16_make_far_pointer(0x6000, 0); + g_owned = win16_make_far_pointer(0x6000, 0x0800); + win16_write_u16(g_window, 4, 0x3333); + win16_write_u16(g_window, 0x52, 1); + win16_write_u32(g_window, 0x49, g_owned); + static const uint16_t global_offsets[] = { + 0x0859, 0x0863, 0x0865, 0x085f, 0x085b, 0x0861, 0x085d, + }; + for (uint16_t index = 0; index < 7; index++) { + win16_write_u16(dgroup_at(global_offsets[index]), 0, (uint16_t)(index + 2)); + } + for (uint16_t index = 0; index < 8; index++) { + win16_write_u16(dgroup_at(0x430b), (uint16_t)(index * 2), (uint16_t)(10 + index)); + } + for (uint16_t index = 1; index <= 4; index++) { + win16_write_u16(dgroup_at(0x4319), (uint16_t)(index * 2), (uint16_t)(19 + index)); + } + for (uint16_t index = 1; index <= 9; index++) { + win16_write_u16(dgroup_at(0x4321), (uint16_t)(index * 2), (uint16_t)(29 + index)); + } + + tdkpin_asset_window_destruct(g_window, 0x9999); + assert(g_delete_count == 29); + for (uint16_t index = 0; index < 8; index++) { + assert(g_deleted[index] == index + 1); + } + for (uint16_t index = 0; index < 8; index++) { + assert(g_deleted[8 + index] == 10 + index); + } + for (uint16_t index = 0; index < 4; index++) { + assert(g_deleted[16 + index] == 20 + index); + } + for (uint16_t index = 0; index < 9; index++) { + assert(g_deleted[20 + index] == 30 + index); + } + assert(win16_read_u8(win16_far_add_offset(g_window, 0x0bd8)) == 1); + assert(win16_read_u8(win16_far_add_offset(g_window, 0x0bd9)) == 1); + return 0; +} diff --git a/original/reconstructed/tests/test_asset_initializer.c b/original/reconstructed/tests/test_asset_initializer.c new file mode 100644 index 0000000..13da1a6 --- /dev/null +++ b/original/reconstructed/tests/test_asset_initializer.c @@ -0,0 +1,343 @@ +#include "../tdkpin_game_assets.h" + +#include +#include + +static uint8_t g_dgroup[0x5000]; +static uint8_t g_window_bytes[0x0c00]; +HINSTANCE16 g_win16_instance; +static Win16FarPtr g_window; +static uint16_t g_dat_ids[40]; +static unsigned g_dat_count; +static uint16_t g_bitmap_ids[8]; +static unsigned g_bitmap_count; +static uint8_t g_stages[40]; +static unsigned g_stage_count; +static int32_t g_drawn_scores[8]; +static unsigned g_draw_score_count; +static unsigned g_select_palette_calls; +static unsigned g_unrealize_calls; +static unsigned g_realize_calls; +static unsigned g_drain_calls; +static unsigned g_sound_calls; +static unsigned g_create_dc_calls; +static unsigned g_create_bitmap_calls; +static unsigned g_select_object_calls; +static unsigned g_blit_calls; +static unsigned g_delete_object_calls; +static unsigned g_delete_dc_calls; +static unsigned g_client_rect_calls; +static unsigned g_get_dc_calls; +static unsigned g_release_dc_calls; +static unsigned g_cursor_calls; +static unsigned g_status_calls; +static uint8_t g_status_player; + +static Win16FarPtr dgroup_at(uint16_t offset) +{ + return win16_make_far_pointer(0x5000, offset); +} + +static void reset_calls(void) +{ + g_dat_count = 0; + g_bitmap_count = 0; + g_stage_count = 0; + g_draw_score_count = 0; + g_select_palette_calls = 0; + g_unrealize_calls = 0; + g_realize_calls = 0; + g_drain_calls = 0; + g_sound_calls = 0; + g_create_dc_calls = 0; + g_create_bitmap_calls = 0; + g_select_object_calls = 0; + g_blit_calls = 0; + g_delete_object_calls = 0; + g_delete_dc_calls = 0; + g_client_rect_calls = 0; + g_get_dc_calls = 0; + g_release_dc_calls = 0; + g_cursor_calls = 0; + g_status_calls = 0; + g_status_player = 0; +} + +HPALETTE16 SelectPalette16( + HDC16 dc, HPALETTE16 palette, BOOL16 force_background) +{ + assert(dc == 0x1111 && force_background == 0); + g_select_palette_calls++; + if (g_select_palette_calls == 1) { + assert(palette == 0x2222); + return 0x3333; + } + assert(palette == 0x3333); + return 0x2222; +} + +BOOL16 UnrealizeObject16(HGDIOBJ16 object) +{ + assert(object == 0x2222); + g_unrealize_calls++; + return 1; +} + +UINT16 RealizePalette16(HDC16 dc) +{ + assert(dc == 0x1111); + g_realize_calls++; + return 256; +} + +void tdkpin_drain_messages_except_input(void) +{ + g_drain_calls++; +} + +HBITMAP16 tdkpin_load_bitmap_resource( + Win16FarPtr resource_name, HINSTANCE16 instance) +{ + assert(instance == g_win16_instance); + assert(win16_far_selector(resource_name) == 0); + uint16_t id = win16_far_offset(resource_name); + g_dat_ids[g_dat_count++] = id; + return (HBITMAP16)(0x1000 + g_dat_count); +} + +HDC16 CreateCompatibleDC16(HDC16 dc) +{ + assert(dc == 0x1111); + g_create_dc_calls++; + return (HDC16)(0x4000 + g_create_dc_calls); +} + +HGDIOBJ16 SelectObject16(HDC16 dc, HGDIOBJ16 object) +{ + (void)dc; + assert(object != 0); + g_select_object_calls++; + return (HGDIOBJ16)(0x5000 + g_select_object_calls); +} + +BOOL16 BitBlt16( + HDC16 destination, + INT16 destination_x, + INT16 destination_y, + INT16 width, + INT16 height, + HDC16 source, + INT16 source_x, + INT16 source_y, + uint32_t raster_operation) +{ + assert(destination != 0 && source != 0); + (void)destination_x; + (void)destination_y; + (void)width; + (void)height; + assert(source_x == 0 && source_y == 0); + assert(raster_operation == 0x00cc0020 || + raster_operation == 0x00c60088 || + raster_operation == 0x00ee0086); + if (raster_operation != 0x00cc0020) { + assert(destination == 0x1111); + assert(destination_x == 10 && destination_y == 20); + assert(width == 29 && height == 39); + } + g_blit_calls++; + return 1; +} + +BOOL16 DeleteObject16(HGDIOBJ16 object) +{ + assert(object != 0); + g_delete_object_calls++; + return 1; +} + +void tdkpin_draw_loading_stage(Win16FarPtr caller_bp, uint8_t stage) +{ + assert(win16_read_u16(win16_far_add_offset(caller_bp, 0x0e)) == 0x1111); + if (stage >= 2) { + assert(win16_read_u16(win16_far_add_offset(caller_bp, 0xfffe)) != 0); + } + g_stages[g_stage_count++] = stage; +} + +void tdkpin_initialize_sounds(void) +{ + g_sound_calls++; +} + +HBITMAP16 LoadBitmap16(HINSTANCE16 instance, Win16FarPtr resource) +{ + assert(instance == g_win16_instance && win16_far_selector(resource) == 0); + uint16_t id = win16_far_offset(resource); + g_bitmap_ids[g_bitmap_count++] = id; + return (HBITMAP16)(0x2000 + id); +} + +HCURSOR16 LoadCursor16(HINSTANCE16 instance, Win16FarPtr resource) +{ + assert(instance == 0 && resource == win16_make_far_pointer(0, 0x7f00)); + g_cursor_calls++; + return 0x7777; +} + +HCURSOR16 SetCursor16(HCURSOR16 cursor) +{ + assert(cursor == 0x7777); + return 0; +} + +BOOL16 GetClientRect16(HWND16 window, Win16FarPtr rectangle) +{ + assert(window == 0x8888); + win16_write_u16(rectangle, 0, 0); + win16_write_u16(rectangle, 2, 0); + win16_write_u16(rectangle, 4, 640); + win16_write_u16(rectangle, 6, 460); + g_client_rect_calls++; + return 1; +} + +HBITMAP16 CreateCompatibleBitmap16(HDC16 dc, INT16 width, INT16 height) +{ + assert(dc == 0x1111 && width == 641 && height == 461); + g_create_bitmap_calls++; + return 0x6666; +} + +BOOL16 DeleteDC16(HDC16 dc) +{ + assert(dc != 0); + g_delete_dc_calls++; + return 1; +} + +HDC16 GetDC16(HWND16 window) +{ + assert(window == 0x8888); + g_get_dc_calls++; + return 0x9999; +} + +INT16 ReleaseDC16(HWND16 window, HDC16 dc) +{ + assert(window == 0x8888 && dc == 0x9999); + g_release_dc_calls++; + return 1; +} + +int32_t borland_multiply_i32(int32_t left, int32_t right) +{ + return left * right; +} + +void tdkpin_draw_score(HDC16 destination, int32_t value_or_player) +{ + assert(destination == 0x9999); + g_drawn_scores[g_draw_score_count++] = value_or_player; +} + +void tdkpin_update_status_display(uint8_t player, HDC16 destination) +{ + assert(destination == 0x9999); + g_status_player = player; + g_status_calls++; +} + +static void assert_dat_ids(void) +{ + static const uint16_t expected[] = { + 995, 994, 998, 998, + 400, 401, 402, 403, 404, 405, 406, 407, + 701, 702, 703, 704, + 801, 802, 803, 804, 805, 806, 807, 808, 809, + 900, 997, 901, 600, + }; + assert(g_dat_count == sizeof(expected) / sizeof(expected[0])); + assert(memcmp(g_dat_ids, expected, sizeof(expected)) == 0); +} + +static void test_asset_loading(void) +{ + reset_calls(); + win16_write_u8(dgroup_at(0x07cc), 1); + win16_write_u8(win16_far_add_offset(g_window, 0x0bd8), 1); + tdkpin_initialize_assets_and_redraw(g_window, 0xbeef, 0xcafe, 0x1111); + assert_dat_ids(); + assert(g_bitmap_count == 3); + assert(g_bitmap_ids[0] == 500 && g_bitmap_ids[1] == 102 && g_bitmap_ids[2] == 101); + assert(g_stage_count == 34); + for (unsigned index = 0; index < 34; index++) { + assert(g_stages[index] == index + 2); + } + assert(g_sound_calls == 1 && g_drain_calls == 1); + assert(g_select_palette_calls == 2 && g_cursor_calls == 1); + assert(win16_read_u8(dgroup_at(0x07cc)) == 0); + assert(win16_read_u16(win16_far_add_offset(g_window, 0x54)) == 0x2066); + assert(win16_read_u16(win16_far_add_offset(g_window, 0x52)) == 0x2065); + assert(g_get_dc_calls == 0); +} + +static void test_redraw(void) +{ + reset_calls(); + win16_write_u8(dgroup_at(0x07cc), 0); + win16_write_u8(win16_far_add_offset(g_window, 0x0bd8), 0); + win16_write_u8(win16_far_add_offset(g_window, 0x0bde), 0); + win16_write_u32(g_window, 0x0ba2, 10); + win16_write_u32(g_window, 0x0ba6, 20); + win16_write_u16(g_window, 0x54, 0xaaaa); + win16_write_u16(g_window, 0x52, 0xbbbb); + win16_write_u8(dgroup_at(0x07d1), 2); + win16_write_u8(dgroup_at(0x09a3), 3); + win16_write_u32(dgroup_at(0x098e), 8, 10); + win16_write_u32(dgroup_at(0x097e), 4, 0); + win16_write_u32(dgroup_at(0x097e), 8, 42); + win16_write_u32(dgroup_at(0x097e), 12, (uint32_t)-1); + win16_write_u32(dgroup_at(0x097e), 16, 5); + tdkpin_initialize_assets_and_redraw(g_window, 1, 2, 0x1111); + assert(g_dat_count == 0 && g_bitmap_count == 0 && g_stage_count == 0); + assert(g_client_rect_calls == 2 && g_get_dc_calls == 1 && g_release_dc_calls == 1); + assert(g_draw_score_count == 3); + assert(g_drawn_scores[0] == 30 && g_drawn_scores[1] == 2 && g_drawn_scores[2] == 4); + assert(g_status_calls == 1 && g_status_player == 2); + assert(g_blit_calls == 5 && g_select_object_calls == 7); + assert(win16_read_u8(dgroup_at(0x07cb)) == 1); + assert(win16_read_u8(win16_far_add_offset(g_window, 0x0bd9)) == 0); + assert(g_select_palette_calls == 2 && g_cursor_calls == 1); +} + +static void test_already_redrawn_palette_behavior(void) +{ + reset_calls(); + win16_write_u8(dgroup_at(0x07cc), 0); + win16_write_u8(win16_far_add_offset(g_window, 0x0bd8), 1); + tdkpin_initialize_assets_and_redraw(g_window, 0, 0, 0x1111); + assert(g_select_palette_calls == 1); + assert(g_unrealize_calls == 1 && g_realize_calls == 1 && g_drain_calls == 1); + assert(g_cursor_calls == 0 && g_get_dc_calls == 0); +} + +int main(void) +{ + uint8_t stack_marker; + uintptr_t stack_base = (uintptr_t)&stack_marker - 0x8000; + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, g_dgroup, sizeof(g_dgroup), true); + win16_bind_segment(0x6000, g_window_bytes, sizeof(g_window_bytes), true); + win16_bind_segment(0x7000, (void *)stack_base, 0x10000, true); + win16_set_dgroup_selector(0x5000); + g_window = win16_make_far_pointer(0x6000, 0); + g_win16_instance = 0x4444; + win16_write_u16(dgroup_at(0x444e), 0, 0x2222); + win16_write_u16(dgroup_at(0x085b), 0, 0xaaaa); + win16_write_u16(g_window, 4, 0x8888); + test_asset_loading(); + test_redraw(); + test_already_redrawn_palette_behavior(); + return 0; +} diff --git a/original/reconstructed/tests/test_ball_render.c b/original/reconstructed/tests/test_ball_render.c new file mode 100644 index 0000000..8487e57 --- /dev/null +++ b/original/reconstructed/tests/test_ball_render.c @@ -0,0 +1,301 @@ +#include "../tdkpin_gameplay_helpers.h" + +#include +#include +#include + +int32_t g_ball_x_milli; +int32_t g_ball_y_milli; +uint8_t g_borland_cpu_level = 2; + +_Noreturn void borland_runtime_error(uint16_t code) +{ + (void)code; + __builtin_trap(); +} + +_Noreturn void win16_integer_divide_fault(void) +{ + __builtin_trap(); +} + +static uint8_t g_stack[0x400]; +static uint8_t g_object[0x0c00]; +static uint8_t g_dgroup[0x5000]; +static Win16FarPtr g_receiver; +static unsigned g_client_rect_calls; +static unsigned g_get_dc_calls; +static unsigned g_create_dc_calls; +static unsigned g_create_bitmap_calls; +static unsigned g_select_calls; +static unsigned g_blit_calls; +static unsigned g_delete_object_calls; +static unsigned g_delete_dc_calls; +static unsigned g_release_dc_calls; +static INT16 g_expected_x; +static INT16 g_expected_y; +static INT16 g_expected_height; + +BOOL16 GetClientRect16(HWND16 window, Win16FarPtr rectangle) +{ + assert(window == 0x2222); + assert(rectangle == win16_make_far_pointer(0x7000, 0x00e6)); + win16_write_u16(rectangle, 0, 0); + win16_write_u16(rectangle, 2, 0); + win16_write_u16(rectangle, 4, 640); + win16_write_u16(rectangle, 6, 460); + g_client_rect_calls++; + return 1; +} + +HDC16 GetDC16(HWND16 window) +{ + assert(window == 0x2222); + g_get_dc_calls++; + return 0x3333; +} + +HDC16 CreateCompatibleDC16(HDC16 dc) +{ + assert(dc == 0x3333 && g_create_dc_calls < 3); + return (HDC16)(0x4001 + g_create_dc_calls++); +} + +HBITMAP16 CreateCompatibleBitmap16(HDC16 dc, INT16 width, INT16 height) +{ + assert(dc == 0x3333 && width == 100 && height == 100); + g_create_bitmap_calls++; + return 0x5000; +} + +HGDIOBJ16 SelectObject16(HDC16 dc, HGDIOBJ16 object) +{ + switch (g_select_calls++) { + case 0: + assert(dc == 0x4001 && object == 0x6000); + return 0x7001; + case 1: + assert(dc == 0x4002 && object == 0x5000); + return 0x7002; + case 2: + assert(dc == 0x4001 && object == 0x6100); + return 0x6000; + case 3: + assert(dc == 0x4001 && object == 0x6200); + return 0x6100; + case 4: + assert(dc == 0x4001 && object == 0x7001); + return 0x6200; + case 5: + assert(dc == 0x4002 && object == 0x7002); + return 0x5000; + default: + assert(g_select_calls == 7); + assert(dc == 0x4003 && object == 0x7003); + return 0; + } +} + +BOOL16 BitBlt16( + HDC16 destination, + INT16 destination_x, + INT16 destination_y, + INT16 width, + INT16 height, + HDC16 source, + INT16 source_x, + INT16 source_y, + uint32_t raster_operation) +{ + switch (g_blit_calls++) { + case 0: + assert(destination == 0x4002); + assert(destination_x == 0 && destination_y == 0); + assert(width == 19 && height == 19 && source == 0x4001); + assert(source_x == g_expected_x && source_y == g_expected_y); + assert(raster_operation == 0x00cc0020u); + break; + case 1: + assert(destination == 0x4002 && destination_x == 1); + assert(destination_y == 1 && width == 19 && height == 19); + assert(source == 0x4001 && source_x == 0 && source_y == 0); + assert(raster_operation == 0x008800c6u); + break; + case 2: + assert(destination == 0x4002 && destination_x == 1); + assert(destination_y == 1 && width == 19 && height == 19); + assert(source == 0x4001 && source_x == 0 && source_y == 0); + assert(raster_operation == 0x00ee0086u); + break; + default: + assert(g_blit_calls == 4); + assert(destination == 0x3333); + assert(destination_x == g_expected_x && destination_y == g_expected_y); + assert(width == 19 && height == g_expected_height); + assert(source == 0x4002 && source_x == 0 && source_y == 0); + assert(raster_operation == 0x00cc0020u); + break; + } + return 1; +} + +BOOL16 DeleteObject16(HGDIOBJ16 object) +{ + assert(object == 0x5000); + g_delete_object_calls++; + return 1; +} + +BOOL16 DeleteDC16(HDC16 dc) +{ + assert(dc == (HDC16)(0x4001 + g_delete_dc_calls)); + g_delete_dc_calls++; + return 1; +} + +INT16 ReleaseDC16(HWND16 window, HDC16 dc) +{ + assert(window == 0x2222 && dc == 0x3333); + g_release_dc_calls++; + return 1; +} + +static void reset_counters(void) +{ + g_client_rect_calls = 0; + g_get_dc_calls = 0; + g_create_dc_calls = 0; + g_create_bitmap_calls = 0; + g_select_calls = 0; + g_blit_calls = 0; + g_delete_object_calls = 0; + g_delete_dc_calls = 0; + g_release_dc_calls = 0; +} + +static void prepare_fixture(void) +{ + memset(g_stack, 0, sizeof(g_stack)); + memset(g_object, 0, sizeof(g_object)); + memset(g_dgroup, 0, sizeof(g_dgroup)); + win16_reset_segment_bindings(); + win16_bind_segment(0x7000, g_stack, sizeof(g_stack), true); + win16_bind_segment(0x7100, g_object, sizeof(g_object), true); + win16_bind_segment(0x7200, g_dgroup, sizeof(g_dgroup), true); + win16_set_dgroup_selector(0x7200); + win16_set_stack_state(0x7000, 0); + g_receiver = win16_make_far_pointer(0x7100, 0); + win16_write_stack_u16(0x0106, win16_far_offset(g_receiver)); + win16_write_stack_u16(0x0108, win16_far_selector(g_receiver)); + win16_write_stack_u16(0x00fa, 0x7003); + win16_write_u16(g_receiver, 4, 0x2222); + win16_write_u16(g_receiver, 0x52, 0x6200); + win16_write_u16(g_receiver, 0x54, 0x6100); + win16_write_u16(win16_dgroup_pointer(0x085b), 0, 0x6000); + reset_counters(); +} + +static void assert_complete_gdi_lifecycle(void) +{ + assert(g_client_rect_calls == 1 && g_get_dc_calls == 1); + assert(g_create_dc_calls == 3 && g_create_bitmap_calls == 1); + assert(g_select_calls == 7 && g_blit_calls == 4); + assert(g_delete_object_calls == 1 && g_delete_dc_calls == 3); + assert(g_release_dc_calls == 1); + assert(win16_read_stack_u16(0x00f4) == 0x3333); + assert(win16_read_stack_u16(0x00f2) == 0x4001); + assert(win16_read_stack_u16(0x00f0) == 0x4002); + assert(win16_read_stack_u16(0x00ee) == 0x4003); + assert(win16_read_stack_u16(0x00f8) == 0x5000); + assert(win16_read_stack_u16(0x00fe) == 0x7001); + assert(win16_read_stack_u16(0x00fc) == 0x7002); +} + +static void test_render_and_bottom_clipping(void) +{ + prepare_fixture(); + g_ball_x_milli = 100000; + g_ball_y_milli = 440000; + g_expected_x = 91; + g_expected_y = 431; + g_expected_height = 12; + tdkpin_render_ball_from_caller_frame(0x0100); + assert((int32_t)win16_read_u32( + win16_far_add_offset(g_receiver, 0x0ba2)) == 92); + assert((int32_t)win16_read_u32( + win16_far_add_offset(g_receiver, 0x0ba6)) == 432); + assert(win16_read_stack_u16(0x00d6) == 12); + assert_complete_gdi_lifecycle(); + + prepare_fixture(); + g_ball_x_milli = 100000; + g_ball_y_milli = 500000; + g_expected_x = 91; + g_expected_y = 491; + g_expected_height = 0; + tdkpin_render_ball_from_caller_frame(0x0100); + assert(win16_read_stack_u16(0x00d6) == 0); + assert_complete_gdi_lifecycle(); +} + +static void test_reset_branches_and_state(void) +{ + prepare_fixture(); + static const uint16_t completion_words[5] = { + 0x3371, 0x33c4, 0x3417, 0x346a, 0x34bd}; + for (unsigned index = 0; index < 5; index++) { + win16_write_u16( + win16_dgroup_pointer(completion_words[index]), 0, 1); + } + win16_write_u16(win16_dgroup_pointer(0x0851), 0, 0xaaaa); + win16_write_u16(win16_dgroup_pointer(0x0853), 0, 0xbbbb); + win16_write_u8(win16_dgroup_pointer(0x07c8), 0); + win16_write_u8(win16_dgroup_pointer(0x07c6), 1); + win16_write_u8(win16_far_add_offset(g_receiver, 0x0bdd), 1); + g_expected_x = 316; + g_expected_y = 404; + g_expected_height = 19; + tdkpin_reset_ball_state(0x0100); + assert(win16_read_u16(win16_dgroup_pointer(0x0851)) == 0); + assert(win16_read_u16(win16_dgroup_pointer(0x0853)) == 0); + assert(win16_read_u8(win16_dgroup_pointer(0x07c8)) == 1); + assert(win16_read_u8(win16_dgroup_pointer(0x07c6)) == 0); + assert(g_ball_x_milli == 325000 && g_ball_y_milli == 413000); + assert(win16_read_u32(win16_far_add_offset(g_receiver, 0x0bba)) == + 325000u); + assert(win16_read_u32(win16_far_add_offset(g_receiver, 0x0bbe)) == + 413000u); + assert(win16_read_u32(win16_far_add_offset(g_receiver, 0x0bc2)) == + 325000u); + assert(win16_read_u32(win16_far_add_offset(g_receiver, 0x0bc6)) == + 413000u); + assert(win16_read_u32(win16_far_add_offset(g_receiver, 0x0baa)) == 0); + assert(win16_read_u32(win16_far_add_offset(g_receiver, 0x0bae)) == 0); + assert(win16_read_u32(win16_far_add_offset(g_receiver, 0x0bca)) == 0); + assert(win16_read_u16(win16_far_add_offset(g_receiver, 0x0bce)) == 0); + assert(win16_read_u16(win16_far_add_offset(g_receiver, 0x0bd0)) == 0); + assert(win16_read_u16(win16_far_add_offset(g_receiver, 0x0bd2)) == 0); + assert(win16_read_u8(win16_far_add_offset(g_receiver, 0x0bdd)) == 0); + assert_complete_gdi_lifecycle(); + + prepare_fixture(); + win16_write_u16(win16_dgroup_pointer(0x3371), 0, 0); + win16_write_u16(win16_dgroup_pointer(0x0851), 0, 0xaaaa); + win16_write_u16(win16_dgroup_pointer(0x0853), 0, 0xbbbb); + win16_write_u8(win16_dgroup_pointer(0x07c8), 7); + g_expected_x = 316; + g_expected_y = 404; + g_expected_height = 19; + tdkpin_reset_ball_state(0x0100); + assert(win16_read_u16(win16_dgroup_pointer(0x0851)) == 0xaaaa); + assert(win16_read_u16(win16_dgroup_pointer(0x0853)) == 0xbbbb); + assert(win16_read_u8(win16_dgroup_pointer(0x07c8)) == 7); + assert_complete_gdi_lifecycle(); +} + +int main(void) +{ + test_render_and_bottom_clipping(); + test_reset_branches_and_state(); + return 0; +} diff --git a/original/reconstructed/tests/test_ball_restore.c b/original/reconstructed/tests/test_ball_restore.c new file mode 100644 index 0000000..68a273f --- /dev/null +++ b/original/reconstructed/tests/test_ball_restore.c @@ -0,0 +1,173 @@ +#include "../tdkpin_gameplay_helpers.h" + +#include +#include + +uint8_t g_borland_cpu_level = 2; + +_Noreturn void borland_runtime_error(uint16_t code) +{ + (void)code; + __builtin_trap(); +} + +_Noreturn void win16_integer_divide_fault(void) +{ + __builtin_trap(); +} + +static uint8_t g_stack[0x400]; +static uint8_t g_object[0x0c00]; +static uint8_t g_dgroup[0x5000]; +static Win16FarPtr g_receiver; +static unsigned g_create_dc_calls; +static unsigned g_select_calls; +static unsigned g_blit_calls; +static unsigned g_delete_dc_calls; +static unsigned g_release_calls; +static bool g_expect_present; + +BOOL16 GetClientRect16(HWND16 window, Win16FarPtr rectangle) +{ + assert(window == 0x2222); + assert(rectangle == win16_make_far_pointer(0x7000, 0x00e6)); + return 1; +} + +HDC16 GetDC16(HWND16 window) +{ + assert(window == 0x2222); + return 0x3333; +} + +HDC16 CreateCompatibleDC16(HDC16 dc) +{ + assert(dc == 0x3333 && g_create_dc_calls < 3); + return (HDC16)(0x4001 + g_create_dc_calls++); +} + +HBITMAP16 CreateCompatibleBitmap16(HDC16 dc, INT16 width, INT16 height) +{ + assert(dc == 0x3333 && width == 100 && height == 100); + return 0x5000; +} + +HGDIOBJ16 SelectObject16(HDC16 dc, HGDIOBJ16 object) +{ + switch (g_select_calls++) { + case 0: + assert(dc == 0x4001 && object == 0x6000); + return 0x7001; + case 1: + assert(dc == 0x4002 && object == 0x5000); + return 0x7002; + case 2: + assert(dc == 0x4001 && object == 0x7001); + return 0x6000; + case 3: + assert(dc == 0x4002 && object == 0x7002); + return 0x5000; + default: + assert(g_select_calls == 5); + assert(dc == 0x4003 && object == 0x7003); + return 0; + } +} + +BOOL16 BitBlt16( + HDC16 destination, + INT16 destination_x, + INT16 destination_y, + INT16 width, + INT16 height, + HDC16 source, + INT16 source_x, + INT16 source_y, + uint32_t raster_operation) +{ + assert(raster_operation == 0x00cc0020u); + if (g_blit_calls == 0) { + assert(destination == 0x4002 && destination_x == 0); + assert(destination_y == 0 && width == 19 && height == 19); + assert(source == 0x4001 && source_x == 91 && source_y == 431); + } else { + assert(g_expect_present && g_blit_calls == 1); + assert(destination == 0x3333 && destination_x == 91); + assert(destination_y == 431 && width == 19 && height == 12); + assert(source == 0x4002 && source_x == 0 && source_y == 0); + } + g_blit_calls++; + return 1; +} + +BOOL16 DeleteObject16(HGDIOBJ16 object) +{ + assert(object == 0x5000); + return 1; +} + +BOOL16 DeleteDC16(HDC16 dc) +{ + assert(dc == (HDC16)(0x4001 + g_delete_dc_calls)); + g_delete_dc_calls++; + return 1; +} + +INT16 ReleaseDC16(HWND16 window, HDC16 dc) +{ + assert(window == 0x2222 && dc == 0x3333); + g_release_calls++; + return 1; +} + +static void prepare_fixture(void) +{ + memset(g_stack, 0, sizeof(g_stack)); + memset(g_object, 0, sizeof(g_object)); + memset(g_dgroup, 0, sizeof(g_dgroup)); + win16_reset_segment_bindings(); + win16_bind_segment(0x7000, g_stack, sizeof(g_stack), true); + win16_bind_segment(0x7100, g_object, sizeof(g_object), true); + win16_bind_segment(0x7200, g_dgroup, sizeof(g_dgroup), true); + win16_set_dgroup_selector(0x7200); + win16_set_stack_state(0x7000, 0); + g_receiver = win16_make_far_pointer(0x7100, 0); + win16_write_stack_u16(0x0106, win16_far_offset(g_receiver)); + win16_write_stack_u16(0x0108, win16_far_selector(g_receiver)); + win16_write_stack_u16(0x00fa, 0x7003); + win16_write_u16(g_receiver, 4, 0x2222); + win16_write_u32(g_receiver, 0x0bc2, 100000); + win16_write_u32(g_receiver, 0x0bc6, 440000); + win16_write_u32(g_receiver, 0x0baa, 0xaaaaaaaau); + win16_write_u32(g_receiver, 0x0bae, 0xbbbbbbbbu); + win16_write_u16(win16_dgroup_pointer(0x085b), 0, 0x6000); + g_create_dc_calls = 0; + g_select_calls = 0; + g_blit_calls = 0; + g_delete_dc_calls = 0; + g_release_calls = 0; +} + +static void run_case(uint8_t suppress) +{ + prepare_fixture(); + g_expect_present = suppress == 0; + tdkpin_restore_previous_ball_region(0x0100, suppress); + assert(g_create_dc_calls == 3 && g_select_calls == 5); + assert(g_blit_calls == (g_expect_present ? 2u : 1u)); + assert(g_delete_dc_calls == 3 && g_release_calls == 1); + assert((int32_t)win16_read_u32( + win16_far_add_offset(g_receiver, 0x0ba2)) == 92); + assert((int32_t)win16_read_u32( + win16_far_add_offset(g_receiver, 0x0ba6)) == 432); + assert(win16_read_u32(win16_far_add_offset(g_receiver, 0x0baa)) == 0); + assert(win16_read_u32(win16_far_add_offset(g_receiver, 0x0bae)) == 0); + assert(win16_read_stack_u16(0x00d6) == 12); +} + +int main(void) +{ + run_case(0); + run_case(1); + return 0; +} diff --git a/original/reconstructed/tests/test_ball_sweep.c b/original/reconstructed/tests/test_ball_sweep.c new file mode 100644 index 0000000..7eec993 --- /dev/null +++ b/original/reconstructed/tests/test_ball_sweep.c @@ -0,0 +1,243 @@ +#include "../tdkpin_gameplay_helpers.h" + +#include +#include + +int32_t g_ball_x_milli; +int32_t g_ball_y_milli; +uint8_t g_borland_cpu_level = 2; + +_Noreturn void borland_runtime_error(uint16_t code) +{ + (void)code; + __builtin_trap(); +} + +_Noreturn void win16_integer_divide_fault(void) +{ + __builtin_trap(); +} + +static uint8_t g_stack[0x400]; +static uint8_t g_object[0x0c00]; +static uint8_t g_dgroup[0x5000]; +static Win16FarPtr g_receiver; +static unsigned g_create_dc_calls; +static unsigned g_select_calls; +static unsigned g_blit_calls; +static unsigned g_delete_dc_calls; +static INT16 g_dest_x; +static INT16 g_dest_y; +static INT16 g_source_x; +static INT16 g_source_y; +static INT16 g_width; +static INT16 g_capture_height; +static INT16 g_present_height; + +BOOL16 GetClientRect16(HWND16 window, Win16FarPtr rectangle) +{ + assert(window == 0x2222); + assert(rectangle == win16_make_far_pointer(0x7000, 0x00e6)); + return 1; +} + +HDC16 GetDC16(HWND16 window) +{ + assert(window == 0x2222); + return 0x3333; +} + +HDC16 CreateCompatibleDC16(HDC16 dc) +{ + assert(dc == 0x3333 && g_create_dc_calls < 3); + return (HDC16)(0x4001 + g_create_dc_calls++); +} + +HBITMAP16 CreateCompatibleBitmap16(HDC16 dc, INT16 width, INT16 height) +{ + assert(dc == 0x3333 && width == 100 && height == 100); + return 0x5000; +} + +HGDIOBJ16 SelectObject16(HDC16 dc, HGDIOBJ16 object) +{ + switch (g_select_calls++) { + case 0: + assert(dc == 0x4001 && object == 0x6000); + return 0x7001; + case 1: + assert(dc == 0x4002 && object == 0x5000); + return 0x7002; + case 2: + assert(dc == 0x4001 && object == 0x6100); + return 0x6000; + case 3: + assert(dc == 0x4001 && object == 0x6200); + return 0x6100; + case 4: + assert(dc == 0x4001 && object == 0x7001); + return 0x6200; + case 5: + assert(dc == 0x4002 && object == 0x7002); + return 0x5000; + default: + assert(g_select_calls == 7); + assert(dc == 0x4003 && object == 0x7003); + return 0; + } +} + +BOOL16 BitBlt16( + HDC16 destination, + INT16 destination_x, + INT16 destination_y, + INT16 width, + INT16 height, + HDC16 source, + INT16 source_x, + INT16 source_y, + uint32_t raster_operation) +{ + switch (g_blit_calls++) { + case 0: + assert(destination == 0x4002 && destination_x == 0); + assert(destination_y == 0 && width == g_width); + assert(height == g_capture_height && source == 0x4001); + assert(source_x == g_dest_x && source_y == g_dest_y); + assert(raster_operation == 0x00cc0020u); + break; + case 1: + assert(destination == 0x4002 && destination_x == g_source_x); + assert(destination_y == g_source_y && width == 19 && height == 19); + assert(source == 0x4001 && source_x == 0 && source_y == 0); + assert(raster_operation == 0x008800c6u); + break; + case 2: + assert(destination == 0x4002 && destination_x == g_source_x); + assert(destination_y == g_source_y && width == 19 && height == 19); + assert(source == 0x4001 && source_x == 0 && source_y == 0); + assert(raster_operation == 0x00ee0086u); + break; + default: + assert(g_blit_calls == 4); + assert(destination == 0x3333 && destination_x == g_dest_x); + assert(destination_y == g_dest_y && width == g_width); + assert(height == g_present_height && source == 0x4002); + assert(source_x == 0 && source_y == 0); + assert(raster_operation == 0x00cc0020u); + break; + } + return 1; +} + +BOOL16 DeleteObject16(HGDIOBJ16 object) +{ + assert(object == 0x5000); + return 1; +} + +BOOL16 DeleteDC16(HDC16 dc) +{ + assert(dc == (HDC16)(0x4001 + g_delete_dc_calls)); + g_delete_dc_calls++; + return 1; +} + +INT16 ReleaseDC16(HWND16 window, HDC16 dc) +{ + assert(window == 0x2222 && dc == 0x3333); + return 1; +} + +static void prepare_fixture(void) +{ + memset(g_stack, 0, sizeof(g_stack)); + memset(g_object, 0, sizeof(g_object)); + memset(g_dgroup, 0, sizeof(g_dgroup)); + win16_reset_segment_bindings(); + win16_bind_segment(0x7000, g_stack, sizeof(g_stack), true); + win16_bind_segment(0x7100, g_object, sizeof(g_object), true); + win16_bind_segment(0x7200, g_dgroup, sizeof(g_dgroup), true); + win16_set_dgroup_selector(0x7200); + win16_set_stack_state(0x7000, 0); + g_receiver = win16_make_far_pointer(0x7100, 0); + win16_write_stack_u16(0x0106, win16_far_offset(g_receiver)); + win16_write_stack_u16(0x0108, win16_far_selector(g_receiver)); + win16_write_stack_u16(0x00fa, 0x7003); + win16_write_u16(g_receiver, 4, 0x2222); + win16_write_u16(g_receiver, 0x52, 0x6200); + win16_write_u16(g_receiver, 0x54, 0x6100); + win16_write_u16(win16_dgroup_pointer(0x085b), 0, 0x6000); + g_create_dc_calls = 0; + g_select_calls = 0; + g_blit_calls = 0; + g_delete_dc_calls = 0; +} + +static void run_case( + int32_t current_x, + int32_t current_y, + int32_t previous_x, + int32_t previous_y, + INT16 expected_dest_x, + INT16 expected_dest_y, + INT16 expected_source_x, + INT16 expected_source_y, + INT16 expected_width, + INT16 expected_capture_height, + INT16 expected_present_height, + int32_t expected_delta_x, + int32_t expected_delta_y) +{ + prepare_fixture(); + g_ball_x_milli = current_x; + g_ball_y_milli = current_y; + win16_write_u32(g_receiver, 0x0bc2, (uint32_t)previous_x); + win16_write_u32(g_receiver, 0x0bc6, (uint32_t)previous_y); + g_dest_x = expected_dest_x; + g_dest_y = expected_dest_y; + g_source_x = expected_source_x; + g_source_y = expected_source_y; + g_width = expected_width; + g_capture_height = expected_capture_height; + g_present_height = expected_present_height; + tdkpin_render_ball_swept_region(0x0100); + assert((int32_t)win16_read_u32( + win16_far_add_offset(g_receiver, 0x0bb2)) == expected_delta_x); + assert((int32_t)win16_read_u32( + win16_far_add_offset(g_receiver, 0x0bb6)) == expected_delta_y); + assert(g_create_dc_calls == 3 && g_select_calls == 7); + assert(g_blit_calls == 4 && g_delete_dc_calls == 3); +} + +int main(void) +{ + run_case( + 120000, 430000, 100000, 440000, + 91, 421, 21, 1, 39, 29, 22, 20, -10); + run_case( + 80000, 400000, 100000, 380000, + 71, 371, 1, 21, 39, 39, 39, -20, 20); + + prepare_fixture(); + g_ball_x_milli = 100000; + g_ball_y_milli = 400000; + g_dest_x = 91; + g_dest_y = 381; + g_source_x = 21; + g_source_y = 1; + g_width = 39; + g_capture_height = 29; + g_present_height = 29; + tdkpin_move_ball_and_render(0x0100, 20000, -10000); + assert(g_ball_x_milli == 120000 && g_ball_y_milli == 390000); + assert(win16_read_u32(win16_far_add_offset(g_receiver, 0x0bc2)) == + 100000u); + assert(win16_read_u32(win16_far_add_offset(g_receiver, 0x0bc6)) == + 400000u); + assert((int32_t)win16_read_u32( + win16_far_add_offset(g_receiver, 0x0bb2)) == 20); + assert((int32_t)win16_read_u32( + win16_far_add_offset(g_receiver, 0x0bb6)) == -10); + return 0; +} diff --git a/original/reconstructed/tests/test_bitmap_loader.c b/original/reconstructed/tests/test_bitmap_loader.c new file mode 100644 index 0000000..594875e --- /dev/null +++ b/original/reconstructed/tests/test_bitmap_loader.c @@ -0,0 +1,174 @@ +#include "../tdkpin_palette.h" + +#include +#include +#include + +static uint8_t g_dgroup[0x5000]; +static uint8_t g_resource[2048]; +static uint8_t g_bitmap_info[sizeof(BITMAPINFO256)]; +static unsigned g_copy_calls; +static unsigned g_step; +static unsigned g_allocations; +static Win16FarPtr g_stack_header; + +static Win16FarPtr dgroup_at(uint16_t offset) +{ + return win16_make_far_pointer(0x5000, offset); +} + +void borland_far_copy( + Win16FarPtr destination, Win16FarPtr source, uint16_t count) +{ + assert(count == sizeof(BITMAPINFOHEADER16)); + for (uint16_t index = 0; index < count; index++) { + win16_write_u8( + win16_far_add_offset(destination, index), + win16_read_u8(win16_far_add_offset(source, index))); + } + g_copy_calls++; +} + +Win16FarPtr borland_get_mem(uint16_t bytes) +{ + assert(bytes == sizeof(BITMAPINFO256)); + g_allocations++; + return win16_make_far_pointer(0x7000, 0); +} + +HRSRC16 FindResource16( + HINSTANCE16 instance, Win16FarPtr name, Win16FarPtr type) +{ + assert(++g_step == 1 && instance == 0x4444); + assert(name == win16_make_far_pointer(0, 900)); + assert(type == dgroup_at(0x045e)); + return 0x1111; +} + +HGLOBAL16 LoadResource16(HINSTANCE16 instance, HRSRC16 resource) +{ + assert(++g_step == 2 && instance == 0x4444 && resource == 0x1111); + return 0x2222; +} + +Win16FarPtr LockResource16(HGLOBAL16 resource) +{ + assert(++g_step == 3 && resource == 0x2222); + return win16_make_far_pointer(0x6000, 0); +} + +HDC16 CreateDC16( + Win16FarPtr driver, + Win16FarPtr device, + Win16FarPtr output, + Win16FarPtr initialization_data) +{ + assert(++g_step == 4); + assert(driver == dgroup_at(0x0462)); + assert(device == 0 && output == 0 && initialization_data == 0); + return 0x3333; +} + +HPALETTE16 SelectPalette16( + HDC16 dc, HPALETTE16 palette, BOOL16 force_background) +{ + assert(dc == 0x3333 && force_background == 0); + if (++g_step == 5) { + assert(palette == 0x4444); + return 0x5555; + } + assert(g_step == 9 && palette == 0x5555); + return 0x4444; +} + +BOOL16 UnrealizeObject16(HGDIOBJ16 object) +{ + assert(++g_step == 6 && object == 0x4444); + return 1; +} + +UINT16 RealizePalette16(HDC16 dc) +{ + assert(++g_step == 7 && dc == 0x3333); + return 256; +} + +HBITMAP16 CreateDIBitmap16( + HDC16 dc, + Win16FarPtr header, + uint32_t initialization, + Win16FarPtr bits, + Win16FarPtr bitmap_info, + UINT16 color_usage) +{ + assert(++g_step == 8 && dc == 0x3333); + assert(initialization == 4 && color_usage == 0); + assert(bits == win16_make_far_pointer(0x6000, 40)); + assert(bitmap_info == win16_make_far_pointer(0x7000, 0)); + assert(win16_read_u16( + win16_far_add_offset(header, offsetof(BITMAPINFOHEADER16, bit_count))) == 8); + g_stack_header = header; + for (uint16_t index = 0; index < 40; index++) { + assert(win16_read_u8(win16_far_add_offset(bitmap_info, index)) == + g_resource[index]); + } + for (uint16_t index = 0; index < 256; index++) { + uint16_t color = (uint16_t)(40 + index * 4); + assert(win16_read_u8(win16_far_add_offset(bitmap_info, color)) == + g_dgroup[0x4452 + index * 3]); + assert(win16_read_u8(win16_far_add_offset(bitmap_info, (uint16_t)(color + 1))) == + g_dgroup[0x4451 + index * 3]); + assert(win16_read_u8(win16_far_add_offset(bitmap_info, (uint16_t)(color + 2))) == + g_dgroup[0x4450 + index * 3]); + assert(win16_read_u8(win16_far_add_offset(bitmap_info, (uint16_t)(color + 3))) == 0); + } + return 0x6666; +} + +BOOL16 DeleteDC16(HDC16 dc) +{ + assert(++g_step == 10 && dc == 0x3333); + return 1; +} + +BOOL16 GlobalUnlock16(HGLOBAL16 resource) +{ + assert(++g_step == 11 && resource == 0x2222); + return 1; +} + +BOOL16 FreeResource16(HGLOBAL16 resource) +{ + assert(++g_step == 12 && resource == 0x2222); + return 1; +} + +int main(void) +{ + uint8_t stack_marker; + uintptr_t stack_base = (uintptr_t)&stack_marker - 0x8000; + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, g_dgroup, sizeof(g_dgroup), true); + win16_bind_segment(0x6000, g_resource, sizeof(g_resource), true); + win16_bind_segment(0x7000, g_bitmap_info, sizeof(g_bitmap_info), true); + win16_bind_segment(0x8000, (void *)stack_base, 0x10000, true); + win16_set_dgroup_selector(0x5000); + memcpy(&g_dgroup[0x045e], "DAT", 4); + memcpy(&g_dgroup[0x0462], "Display", 8); + win16_write_u16(dgroup_at(0x444e), 0, 0x4444); + for (uint16_t index = 0; index < 768; index++) { + g_dgroup[0x4450 + index] = (uint8_t)(index * 13 + 9); + } + memset(g_resource, 0, sizeof(g_resource)); + g_resource[0] = 40; + g_resource[14] = 8; + for (uint16_t index = 40; index < sizeof(g_resource); index++) { + g_resource[index] = (uint8_t)(index * 7 + 3); + } + + HBITMAP16 bitmap = tdkpin_load_bitmap_resource( + win16_make_far_pointer(0, 900), 0x4444); + assert(bitmap == 0x6666 && g_step == 12); + assert(g_copy_calls == 2 && g_allocations == 1 && g_stack_header != 0); + return 0; +} diff --git a/original/reconstructed/tests/test_board_overlay.c b/original/reconstructed/tests/test_board_overlay.c new file mode 100644 index 0000000..9aba0b7 --- /dev/null +++ b/original/reconstructed/tests/test_board_overlay.c @@ -0,0 +1,140 @@ +#include "../tdkpin_game_assets.h" + +#include + +static uint8_t g_dgroup[0x5000]; +static uint8_t g_window_bytes[32]; +HINSTANCE16 g_win16_instance; +static Win16FarPtr g_window; +static unsigned g_setup_step; +static unsigned g_draw_step; + +void object_windows_setup_window(Win16FarPtr window) +{ + assert(++g_setup_step == 1 && window == g_window); +} + +HCURSOR16 LoadCursor16(HINSTANCE16 instance, Win16FarPtr resource) +{ + assert(instance == 0); + if (win16_far_offset(resource) == 0x7f02) { + assert(++g_setup_step == 2); + return 0x1111; + } + assert(++g_draw_step == 10); + assert(resource == win16_make_far_pointer(0, 0x7f00)); + return 0x2222; +} + +HCURSOR16 SetCursor16(HCURSOR16 cursor) +{ + if (cursor == 0x1111) { + assert(++g_setup_step == 3); + } else { + assert(++g_draw_step == 11 && cursor == 0x2222); + } + return 0; +} + +HBITMAP16 tdkpin_load_bitmap_resource( + Win16FarPtr resource_name, HINSTANCE16 instance) +{ + assert(++g_setup_step == 4); + assert(resource_name == win16_make_far_pointer(0, 1005)); + assert(instance == g_win16_instance); + return 0x3333; +} + +HWND16 SetFocus16(HWND16 window) +{ + assert(++g_setup_step == 5 && window == 0x7777); + return 0; +} + +HPALETTE16 SelectPalette16( + HDC16 dc, HPALETTE16 palette, BOOL16 force_background) +{ + assert(dc == 0x8888 && force_background == 0); + if (++g_draw_step == 1) { + assert(palette == 0x4444); + return 0x5555; + } + assert(g_draw_step == 9 && palette == 0x5555); + return 0x4444; +} + +BOOL16 UnrealizeObject16(HGDIOBJ16 object) +{ + assert(++g_draw_step == 2 && object == 0x4444); + return 1; +} + +UINT16 RealizePalette16(HDC16 dc) +{ + assert(++g_draw_step == 3 && dc == 0x8888); + return 256; +} + +HDC16 CreateCompatibleDC16(HDC16 dc) +{ + assert(++g_draw_step == 4 && dc == 0x8888); + return 0x9999; +} + +HGDIOBJ16 SelectObject16(HDC16 dc, HGDIOBJ16 object) +{ + assert(dc == 0x9999); + if (++g_draw_step == 5) { + assert(object == 0x3333); + return 0xaaaa; + } + assert(g_draw_step == 7 && object == 0xaaaa); + return 0x3333; +} + +BOOL16 BitBlt16( + HDC16 destination, + INT16 destination_x, + INT16 destination_y, + INT16 width, + INT16 height, + HDC16 source, + INT16 source_x, + INT16 source_y, + uint32_t raster_operation) +{ + assert(++g_draw_step == 6); + assert(destination == 0x8888 && source == 0x9999); + assert(destination_x == 0 && destination_y == 0); + assert(width == 640 && height == 460); + assert(source_x == 0 && source_y == 0); + assert(raster_operation == 0x00cc0020); + return 1; +} + +BOOL16 DeleteDC16(HDC16 dc) +{ + assert(++g_draw_step == 8 && dc == 0x9999); + return 1; +} + +int main(void) +{ + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, g_dgroup, sizeof(g_dgroup), true); + win16_bind_segment(0x6000, g_window_bytes, sizeof(g_window_bytes), true); + win16_set_dgroup_selector(0x5000); + g_window = win16_make_far_pointer(0x6000, 0); + g_win16_instance = 0x6666; + win16_write_u16(g_window, 4, 0x7777); + win16_write_u16(win16_make_far_pointer(0x5000, 0x07cd), 0, 5); + win16_write_u16(win16_make_far_pointer(0x5000, 0x444e), 0, 0x4444); + + tdkpin_setup_board_window(g_window); + assert(g_setup_step == 5); + assert(win16_read_u16(win16_make_far_pointer(0x5000, 0x0867)) == 0x3333); + + tdkpin_draw_board_overlay(g_window, 0xbeef, 0xcafe, 0x8888); + assert(g_draw_step == 11); + return 0; +} diff --git a/original/reconstructed/tests/test_borland_files.c b/original/reconstructed/tests/test_borland_files.c new file mode 100644 index 0000000..ff094a5 --- /dev/null +++ b/original/reconstructed/tests/test_borland_files.c @@ -0,0 +1,539 @@ +#include "../tdkpin_borland_files.h" + +#include +#include + +_Atomic uint16_t g_borland_io_result; +uint8_t g_borland_file_mode = 2; + +static Win16FarPtr g_open_proc; +static Win16FarPtr g_flush_proc; +static Win16FarPtr g_close_proc; +static uint16_t g_open_result; +static uint16_t g_flush_result; +static uint16_t g_close_result; +static Win16FarPtr g_call_order[8]; +static unsigned g_call_count; +static Win16DosResult g_dos_read_result; +static Win16DosResult g_dos_write_result; +static Win16DosResult g_dos_close_result; +static uint16_t g_dos_handle; +static Win16FarPtr g_dos_buffer; +static uint16_t g_dos_count; +static unsigned g_dos_calls; +static Win16DosResult g_dos_seek_result; +static uint32_t g_seek_offset; +static uint8_t g_seek_origin; +static Win16DosResult g_dos_open_result; +static Win16DosResult g_dos_create_result; +static Win16DosExtendedResult g_dos_extended_seek_results[4]; +static unsigned g_dos_extended_seek_count; +static unsigned g_dos_extended_seek_index; +static Win16DosExtendedResult g_dos_device_info_result; +static Win16FarPtr g_dos_name; +static uint16_t g_dos_open_argument; +static uint32_t g_extended_seek_offsets[4]; +static uint8_t g_extended_seek_origins[4]; +static Win16FarPtr g_last_write_buffer; + +enum DosOperation { + DOS_OPERATION_READ, + DOS_OPERATION_WRITE, + DOS_OPERATION_CLOSE, + DOS_OPERATION_SEEK, + DOS_OPERATION_OPEN, + DOS_OPERATION_CREATE, + DOS_OPERATION_SEEK_EXTENDED, + DOS_OPERATION_DEVICE_INFO, +}; + +static enum DosOperation g_dos_operations[16]; + +static void record_dos_operation(enum DosOperation operation) +{ + assert(g_dos_calls < sizeof(g_dos_operations) / sizeof(*g_dos_operations)); + g_dos_operations[g_dos_calls++] = operation; +} + +uint16_t win16_call_file_procedure( + Win16FarPtr procedure, Win16FarPtr record) +{ + assert(record == win16_make_far_pointer(0x7000, 2)); + g_call_order[g_call_count++] = procedure; + if (procedure == g_open_proc) return g_open_result; + if (procedure == g_flush_proc) return g_flush_result; + assert(procedure == g_close_proc); + return g_close_result; +} + +static void write_far( + Win16FarPtr record, uint16_t offset, Win16FarPtr procedure) +{ + win16_write_u16(record, offset, win16_far_offset(procedure)); + win16_write_u16(record, (uint16_t)(offset + 2), + win16_far_selector(procedure)); +} + +static void reset_calls(void) +{ + g_call_count = 0; + g_open_result = 0; + g_flush_result = 0; + g_close_result = 0; + atomic_store(&g_borland_io_result, 0); + g_dos_calls = 0; + g_dos_extended_seek_count = 0; + g_dos_extended_seek_index = 0; +} + +Win16DosResult win16_dos_read( + uint16_t handle, Win16FarPtr buffer, uint16_t count) +{ + g_dos_handle = handle; + g_dos_buffer = buffer; + g_dos_count = count; + record_dos_operation(DOS_OPERATION_READ); + return g_dos_read_result; +} + +Win16DosResult win16_dos_write( + uint16_t handle, Win16FarPtr buffer, uint16_t count) +{ + g_dos_handle = handle; + g_dos_buffer = buffer; + g_last_write_buffer = buffer; + g_dos_count = count; + record_dos_operation(DOS_OPERATION_WRITE); + return g_dos_write_result; +} + +Win16DosResult win16_dos_close(uint16_t handle) +{ + g_dos_handle = handle; + record_dos_operation(DOS_OPERATION_CLOSE); + return g_dos_close_result; +} + +Win16DosResult win16_dos_seek( + uint16_t handle, uint32_t offset, uint8_t origin) +{ + g_dos_handle = handle; + g_seek_offset = offset; + g_seek_origin = origin; + record_dos_operation(DOS_OPERATION_SEEK); + return g_dos_seek_result; +} + +_Noreturn void win16_integer_divide_fault(void) +{ + assert(false); + __builtin_unreachable(); +} + +Win16DosResult win16_dos_open(Win16FarPtr name, uint8_t access_mode) +{ + g_dos_name = name; + g_dos_open_argument = access_mode; + record_dos_operation(DOS_OPERATION_OPEN); + return g_dos_open_result; +} + +Win16DosResult win16_dos_create(Win16FarPtr name, uint16_t attributes) +{ + g_dos_name = name; + g_dos_open_argument = attributes; + record_dos_operation(DOS_OPERATION_CREATE); + return g_dos_create_result; +} + +Win16DosExtendedResult win16_dos_seek_extended( + uint16_t handle, uint32_t offset, uint8_t origin) +{ + assert(g_dos_extended_seek_index < g_dos_extended_seek_count); + unsigned index = g_dos_extended_seek_index++; + g_dos_handle = handle; + g_extended_seek_offsets[index] = offset; + g_extended_seek_origins[index] = origin; + record_dos_operation(DOS_OPERATION_SEEK_EXTENDED); + return g_dos_extended_seek_results[index]; +} + +Win16DosExtendedResult win16_dos_get_device_info(uint16_t handle) +{ + g_dos_handle = handle; + record_dos_operation(DOS_OPERATION_DEVICE_INFO); + return g_dos_device_info_result; +} + +int main(void) +{ + static uint8_t record_bytes[512]; + static uint8_t code_bytes[0x700]; + win16_reset_segment_bindings(); + win16_bind_segment(0x7000, record_bytes, sizeof(record_bytes), true); + win16_bind_ne_segment( + 5, 0x6000, code_bytes, sizeof(code_bytes), false); + Win16FarPtr record = win16_make_far_pointer(0x7000, 2); + g_open_proc = win16_make_far_pointer(0x6000, 0x1000); + g_flush_proc = win16_make_far_pointer(0x6000, 0x2000); + g_close_proc = win16_make_far_pointer(0x6000, 0x3000); + write_far(record, 0x10, g_open_proc); + write_far(record, 0x14, g_flush_proc); + write_far(record, 0x1c, g_close_proc); + + reset_calls(); + win16_write_u16(record, 2, BORLAND_FILE_CLOSED); + win16_write_u16(record, 8, 9); + win16_write_u16(record, 10, 10); + borland_reset_file(record); + assert(win16_read_u16(win16_far_add_offset(record, 2)) == + BORLAND_FILE_INPUT); + assert(win16_read_u16(win16_far_add_offset(record, 8)) == 0); + assert(win16_read_u16(win16_far_add_offset(record, 10)) == 0); + assert(g_call_count == 1 && g_call_order[0] == g_open_proc); + + reset_calls(); + g_open_result = 5; + win16_write_u16(record, 2, BORLAND_FILE_CLOSED); + borland_rewrite_file(record); + assert(win16_read_u16(win16_far_add_offset(record, 2)) == + BORLAND_FILE_CLOSED); + assert(atomic_load(&g_borland_io_result) == 5); + + reset_calls(); + win16_write_u16(record, 2, BORLAND_FILE_OUTPUT); + g_flush_result = 6; + borland_close_file(record); + assert(g_call_count == 2); + assert(g_call_order[0] == g_flush_proc && g_call_order[1] == g_close_proc); + assert(atomic_load(&g_borland_io_result) == 6); + assert(win16_read_u16(win16_far_add_offset(record, 2)) == + BORLAND_FILE_CLOSED); + + reset_calls(); + win16_write_u16(record, 2, BORLAND_FILE_INPUT); + borland_close_file(record); + assert(g_call_count == 1 && g_call_order[0] == g_close_proc); + + reset_calls(); + win16_write_u16(record, 2, 0x1111); + borland_close_file(record); + assert(g_call_count == 0 && atomic_load(&g_borland_io_result) == 0x67); + atomic_store(&g_borland_io_result, 0); + borland_reset_file(record); + assert(g_call_count == 0 && atomic_load(&g_borland_io_result) == 0x66); + + reset_calls(); + win16_write_u16(record, 2, BORLAND_FILE_OUTPUT); + borland_reset_file(record); + assert(g_call_count == 3); + assert(g_call_order[0] == g_flush_proc); + assert(g_call_order[1] == g_close_proc); + assert(g_call_order[2] == g_open_proc); + assert(win16_read_u16(win16_far_add_offset(record, 2)) == + BORLAND_FILE_INPUT); + + Win16FarPtr buffer = win16_make_far_pointer(0x7100, 0x0200); + win16_write_u16(record, 0, 9); + win16_write_u16(record, 4, 100); + write_far(record, 12, buffer); + win16_write_u16(record, 8, 7); + g_dos_read_result = (Win16DosResult){60, false}; + reset_calls(); + assert(borland_file_read_buffer(record) == 0); + assert(g_dos_handle == 9 && g_dos_buffer == buffer && g_dos_count == 100); + assert(win16_read_u16(win16_far_add_offset(record, 8)) == 0); + assert(win16_read_u16(win16_far_add_offset(record, 10)) == 60); + g_dos_read_result = (Win16DosResult){5, true}; + assert(borland_file_read_buffer(record) == 5); + assert(win16_read_u16(win16_far_add_offset(record, 10)) == 0); + + win16_write_u16(record, 8, 20); + g_dos_write_result = (Win16DosResult){20, false}; + reset_calls(); + assert(borland_file_flush_buffer(record) == 0); + assert(g_dos_count == 20); + assert(win16_read_u16(win16_far_add_offset(record, 8)) == 0); + win16_write_u16(record, 8, 20); + g_dos_write_result = (Win16DosResult){19, false}; + assert(borland_file_flush_buffer(record) == 0x65); + win16_write_u16(record, 8, 20); + g_dos_write_result = (Win16DosResult){6, true}; + assert(borland_file_flush_buffer(record) == 6); + + win16_write_u16(record, 8, 20); + g_dos_write_result = (Win16DosResult){19, false}; + assert(borland_file_write_buffer(record) == 0); + win16_write_u16(record, 8, 20); + g_dos_write_result = (Win16DosResult){7, true}; + assert(borland_file_write_buffer(record) == 7); + + win16_write_u16(record, 0, 4); + reset_calls(); + assert(borland_file_close_handle(record) == 0 && g_dos_calls == 0); + win16_write_u16(record, 0, 9); + g_dos_close_result = (Win16DosResult){0, false}; + assert(borland_file_close_handle(record) == 0 && g_dos_calls == 1); + g_dos_close_result = (Win16DosResult){8, true}; + assert(borland_file_close_handle(record) == 8); + + atomic_store(&g_borland_io_result, 0); + win16_write_u16(record, 2, BORLAND_FILE_CLOSED); + assert(!borland_validate_open_file(record)); + assert(atomic_load(&g_borland_io_result) == 0x67); + unsigned dos_calls = g_dos_calls; + borland_truncate_file(record); + assert(g_dos_calls == dos_calls); + + atomic_store(&g_borland_io_result, 0); + win16_set_indeterminate_u16(0xbeef); + win16_write_u16(record, 0, 9); + win16_write_u16(record, 2, 0xd7b3); + g_dos_write_result = (Win16DosResult){0, false}; + borland_truncate_file(record); + assert(g_dos_count == 0); + assert(g_dos_buffer == win16_make_far_pointer(0xbeef, 0xbeef)); + g_dos_write_result = (Win16DosResult){9, true}; + borland_truncate_file(record); + assert(atomic_load(&g_borland_io_result) == 9); + + atomic_store(&g_borland_io_result, 0); + g_dos_close_result = (Win16DosResult){10, true}; + borland_close_generic_file(record); + assert(atomic_load(&g_borland_io_result) == 10); + assert(win16_read_u16(win16_far_add_offset(record, 2)) == + BORLAND_FILE_CLOSED); + win16_write_u16(record, 0, 4); + win16_write_u16(record, 2, 0xd7b3); + dos_calls = g_dos_calls; + borland_close_generic_file(record); + assert(g_dos_calls == dos_calls); + assert(win16_read_u16(win16_far_add_offset(record, 2)) == + BORLAND_FILE_CLOSED); + + Win16FarPtr transfer = win16_make_far_pointer(0x7100, 0x0200); + static uint8_t transfer_bytes[0x400]; + win16_bind_segment( + 0x7100, transfer_bytes, sizeof(transfer_bytes), true); + win16_write_u16(record, 0, 9); + win16_write_u16(record, 2, 0xd7b3); + win16_write_u16(record, 4, 4); + atomic_store(&g_borland_io_result, 0); + g_dos_read_result = (Win16DosResult){4, false}; + borland_file_read_record(transfer, record); + assert(atomic_load(&g_borland_io_result) == 0); + g_dos_read_result = (Win16DosResult){3, false}; + borland_file_read_record(transfer, record); + assert(atomic_load(&g_borland_io_result) == 0x64); + atomic_store(&g_borland_io_result, 0); + g_dos_write_result = (Win16DosResult){3, false}; + borland_file_write_record(transfer, record); + assert(atomic_load(&g_borland_io_result) == 0x65); + atomic_store(&g_borland_io_result, 0); + g_dos_write_result = (Win16DosResult){11, true}; + borland_file_write_record(transfer, record); + assert(atomic_load(&g_borland_io_result) == 11); + + Win16FarPtr result_count = win16_make_far_pointer(0x7100, 0); + atomic_store(&g_borland_io_result, 0); + g_dos_read_result = (Win16DosResult){8, false}; + borland_file_block_read(result_count, 3, transfer, record); + assert(win16_read_u16(result_count) == 2); + assert(atomic_load(&g_borland_io_result) == 0); + borland_file_block_read(0, 3, transfer, record); + assert(atomic_load(&g_borland_io_result) == 0x64); + atomic_store(&g_borland_io_result, 0); + g_dos_write_result = (Win16DosResult){8, false}; + borland_file_block_write(0, 3, transfer, record); + assert(atomic_load(&g_borland_io_result) == 0x65); + borland_file_block_write(result_count, 3, transfer, record); + assert(win16_read_u16(result_count) == 2); + + g_dos_seek_result = (Win16DosResult){0, false}; + borland_file_seek_record(0x00010002u, record); + assert(g_seek_offset == 0x00040008u && g_seek_origin == 0); + g_dos_seek_result = (Win16DosResult){12, true}; + borland_file_seek_record(3, record); + assert(atomic_load(&g_borland_io_result) == 12); + + Win16FarPtr name = win16_far_add_offset(record, 48); + win16_write_u8(name, 'F'); + win16_write_u8(win16_far_add_offset(name, 1), 0); + atomic_store(&g_borland_io_result, 0); + win16_write_u16(record, 2, BORLAND_FILE_CLOSED); + g_dos_open_result = (Win16DosResult){15, false}; + reset_calls(); + borland_open_generic_file(4, record); + assert(g_dos_name == name && g_dos_open_argument == 2); + assert(win16_read_u16(record) == 15); + assert(win16_read_u16(win16_far_add_offset(record, 2)) == 0xd7b3); + assert(win16_read_u16(win16_far_add_offset(record, 4)) == 4); + + win16_write_u16(record, 2, BORLAND_FILE_CLOSED); + g_dos_create_result = (Win16DosResult){16, false}; + borland_create_generic_file(8, record); + assert(g_dos_open_argument == 0 && win16_read_u16(record) == 16); + + win16_write_u8(name, 0); + win16_write_u16(record, 2, BORLAND_FILE_CLOSED); + reset_calls(); + borland_open_generic_file(4, record); + assert(g_dos_calls == 0 && win16_read_u16(record) == 0); + win16_write_u16(record, 2, BORLAND_FILE_CLOSED); + borland_create_generic_file(4, record); + assert(g_dos_calls == 0 && win16_read_u16(record) == 1); + + win16_write_u8(name, 'F'); + win16_write_u16(record, 2, BORLAND_FILE_CLOSED); + atomic_store(&g_borland_io_result, 0); + g_dos_open_result = (Win16DosResult){13, true}; + borland_open_generic_file(4, record); + assert(atomic_load(&g_borland_io_result) == 13); + assert(win16_read_u16(win16_far_add_offset(record, 2)) == + BORLAND_FILE_CLOSED); + + atomic_store(&g_borland_io_result, 0); + win16_write_u16(record, 2, 0x1111); + borland_open_generic_file(4, record); + assert(atomic_load(&g_borland_io_result) == 0x66); + + win16_write_u16(record, 2, 0xd7b3); + win16_write_u16(record, 0, 9); + g_dos_close_result = (Win16DosResult){0, false}; + g_dos_open_result = (Win16DosResult){17, false}; + reset_calls(); + borland_open_generic_file(4, record); + assert(g_dos_calls == 2 && win16_read_u16(record) == 17); + assert(tdkpin_file_close_noop(record) == 0); + + Win16FarPtr text_name = win16_far_add_offset(record, 0x30); + Win16FarPtr read_buffer_proc = + win16_make_far_pointer(0x6000, 0x05d8); + Win16FarPtr flush_buffer_proc = + win16_make_far_pointer(0x6000, 0x0608); + Win16FarPtr write_buffer_proc = + win16_make_far_pointer(0x6000, 0x062d); + Win16FarPtr close_handle_proc = + win16_make_far_pointer(0x6000, 0x064d); + + reset_calls(); + win16_write_u8(text_name, 'I'); + win16_write_u8(win16_far_add_offset(text_name, 1), 0); + win16_write_u16(record, 2, BORLAND_FILE_INPUT); + g_dos_open_result = (Win16DosResult){7, false}; + assert(borland_open_text_record(record) == 0); + assert(g_dos_calls == 1 && g_dos_operations[0] == DOS_OPERATION_OPEN); + assert(g_dos_open_argument == 0 && win16_read_u16(record) == 7); + assert(win16_read_u16(win16_far_add_offset(record, 2)) == + BORLAND_FILE_INPUT); + assert(win16_read_far_pointer(record, 0x14) == read_buffer_proc); + assert(win16_read_far_pointer(record, 0x18) == 0); + assert(win16_read_far_pointer(record, 0x1c) == close_handle_proc); + + reset_calls(); + win16_write_u8(text_name, 'O'); + win16_write_u16(record, 2, BORLAND_FILE_OUTPUT); + g_dos_create_result = (Win16DosResult){8, false}; + g_dos_device_info_result = + (Win16DosExtendedResult){0, 0, false}; + assert(borland_open_text_record(record) == 0); + assert(g_dos_calls == 2); + assert(g_dos_operations[0] == DOS_OPERATION_CREATE); + assert(g_dos_operations[1] == DOS_OPERATION_DEVICE_INFO); + assert(g_dos_open_argument == 0 && win16_read_u16(record) == 8); + assert(win16_read_far_pointer(record, 0x14) == flush_buffer_proc); + assert(win16_read_far_pointer(record, 0x18) == 0); + assert(win16_read_far_pointer(record, 0x1c) == close_handle_proc); + + reset_calls(); + win16_write_u8(text_name, 'A'); + win16_write_u16(record, 2, BORLAND_TEXT_APPEND); + g_dos_open_result = (Win16DosResult){9, false}; + g_dos_device_info_result = + (Win16DosExtendedResult){5, 0x0080, true}; + assert(borland_open_text_record(record) == 0); + assert(g_dos_calls == 2); + assert(g_dos_operations[0] == DOS_OPERATION_OPEN); + assert(g_dos_operations[1] == DOS_OPERATION_DEVICE_INFO); + assert(g_dos_open_argument == 2 && win16_read_u16(record) == 9); + assert(win16_read_u16(win16_far_add_offset(record, 2)) == + BORLAND_FILE_OUTPUT); + assert(win16_read_far_pointer(record, 0x14) == write_buffer_proc); + assert(win16_read_far_pointer(record, 0x18) == write_buffer_proc); + + reset_calls(); + win16_write_u8(text_name, 'A'); + win16_write_u16(record, 2, BORLAND_TEXT_APPEND); + g_dos_open_result = (Win16DosResult){10, false}; + g_dos_device_info_result = + (Win16DosExtendedResult){0, 0, false}; + g_dos_extended_seek_count = 3; + g_dos_extended_seek_results[0] = + (Win16DosExtendedResult){0x0090, 0x0001, false}; + g_dos_extended_seek_results[1] = + (Win16DosExtendedResult){0, 0, false}; + g_dos_extended_seek_results[2] = + (Win16DosExtendedResult){0x000c, 0x1234, false}; + g_dos_read_result = (Win16DosResult){6, false}; + Win16FarPtr text_buffer = win16_far_add_offset(record, 0x80); + for (uint16_t index = 0; index < 6; index++) { + win16_write_u8(win16_far_add_offset(text_buffer, index), 'x'); + } + win16_write_u8(win16_far_add_offset(text_buffer, 2), 0x1a); + g_dos_write_result = (Win16DosResult){0, false}; + assert(borland_open_text_record(record) == 0); + assert(g_dos_calls == 7 && g_dos_extended_seek_index == 3); + assert(g_dos_operations[0] == DOS_OPERATION_OPEN); + assert(g_dos_operations[1] == DOS_OPERATION_DEVICE_INFO); + assert(g_dos_operations[2] == DOS_OPERATION_SEEK_EXTENDED); + assert(g_dos_operations[3] == DOS_OPERATION_SEEK_EXTENDED); + assert(g_dos_operations[4] == DOS_OPERATION_READ); + assert(g_dos_operations[5] == DOS_OPERATION_SEEK_EXTENDED); + assert(g_dos_operations[6] == DOS_OPERATION_WRITE); + assert(g_extended_seek_offsets[0] == 0 && + g_extended_seek_origins[0] == 2); + assert(g_extended_seek_offsets[1] == 0x00010010u && + g_extended_seek_origins[1] == 0); + assert(g_extended_seek_offsets[2] == 0xfffffffcu && + g_extended_seek_origins[2] == 2); + assert(g_dos_count == 0); + assert(g_last_write_buffer == + win16_make_far_pointer(0x7000, 0x1234)); + assert(win16_read_far_pointer(record, 0x14) == flush_buffer_proc); + assert(win16_read_far_pointer(record, 0x18) == 0); + + reset_calls(); + win16_write_u8(text_name, 0); + win16_write_u16(record, 2, BORLAND_FILE_INPUT); + assert(borland_open_text_record(record) == 0); + assert(g_dos_calls == 0 && win16_read_u16(record) == 0); + win16_write_u16(record, 2, BORLAND_FILE_OUTPUT); + g_dos_device_info_result = + (Win16DosExtendedResult){0, 0x0080, false}; + assert(borland_open_text_record(record) == 0); + assert(g_dos_calls == 1 && win16_read_u16(record) == 1); + + reset_calls(); + win16_write_u8(text_name, 'E'); + win16_write_u16(record, 2, BORLAND_FILE_INPUT); + write_far(record, 0x14, win16_make_far_pointer(0x1111, 0x2222)); + g_dos_open_result = (Win16DosResult){13, true}; + assert(borland_open_text_record(record) == 13); + assert(g_dos_calls == 1 && win16_read_u16(record) == 0); + assert(win16_read_far_pointer(record, 0x14) == + win16_make_far_pointer(0x1111, 0x2222)); + + reset_calls(); + win16_write_u16(record, 0, 11); + g_dos_extended_seek_count = 2; + g_dos_extended_seek_results[0] = + (Win16DosExtendedResult){4, 0, true}; + g_dos_extended_seek_results[1] = + (Win16DosExtendedResult){0, 0, true}; + g_dos_read_result = (Win16DosResult){5, true}; + borland_text_truncate_at_ctrl_z(record); + assert(g_dos_calls == 3 && g_dos_extended_seek_index == 2); + assert(g_extended_seek_offsets[1] == 0); + assert(g_dos_operations[2] == DOS_OPERATION_READ); + return 0; +} diff --git a/original/reconstructed/tests/test_borland_objects.c b/original/reconstructed/tests/test_borland_objects.c new file mode 100644 index 0000000..f688037 --- /dev/null +++ b/original/reconstructed/tests/test_borland_objects.c @@ -0,0 +1,147 @@ +#include "../tdkpin_borland_objects.h" + +#include +#include +#include + +static BorlandAllocationAttempt g_allocation; +static Win16FarPtr g_freed_object; +static uint16_t g_freed_size; +static bool g_free_failed; +static jmp_buf g_runtime_error_jump; +static uint16_t g_runtime_error_code; +static Win16FarPtr g_called_destructor; +static Win16FarPtr g_destructor_object; +static uint16_t g_dispose_mode; + +BorlandAllocationAttempt borland_try_get_mem(uint16_t bytes) +{ + assert(bytes == 16); + return g_allocation; +} + +bool borland_try_free_mem(Win16FarPtr object, uint16_t bytes) +{ + g_freed_object = object; + g_freed_size = bytes; + return g_free_failed; +} + +_Noreturn void borland_runtime_error(uint16_t code) +{ + g_runtime_error_code = code; + longjmp(g_runtime_error_jump, 1); +} + +void win16_call_object_destructor( + Win16FarPtr procedure, Win16FarPtr object, uint16_t dispose_mode) +{ + g_called_destructor = procedure; + g_destructor_object = object; + g_dispose_mode = dispose_mode; +} + +int main(void) +{ + static uint8_t dgroup[0x1000]; + static uint8_t existing_bytes[64]; + static uint8_t allocated_bytes[64]; + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, dgroup, sizeof(dgroup), true); + win16_set_dgroup_selector(0x5000); + win16_bind_segment( + 0x7000, existing_bytes, sizeof(existing_bytes), true); + win16_bind_segment( + 0x7100, allocated_bytes, sizeof(allocated_bytes), true); + win16_write_u16(win16_make_far_pointer(0x5000, 0x0200), 0, 16); + + BorlandObjectCallFrame existing = { + win16_make_far_pointer(0x7000, 4), 0x0200}; + borland_enter_object_constructor(&existing, 2); + assert(existing.object == win16_make_far_pointer(0x7000, 4)); + assert(existing.vmt_argument == 0); + assert(win16_read_u16(win16_make_far_pointer(0x7000, 6)) == 0x0200); + + g_allocation = (BorlandAllocationAttempt){ + win16_make_far_pointer(0x7100, 8), false}; + BorlandObjectCallFrame allocated = {0, 0x0200}; + borland_enter_object_constructor(&allocated, 2); + assert(allocated.object == win16_make_far_pointer(0x7100, 8)); + assert(allocated.vmt_argument == 0x0200); + assert(win16_read_u16(win16_make_far_pointer(0x7100, 10)) == 0x0200); + + BorlandObjectCallFrame inactive = { + win16_make_far_pointer(0x7000, 20), 0}; + borland_enter_object_constructor(&inactive, 0); + assert(inactive.object == win16_make_far_pointer(0x7000, 20)); + + g_allocation = (BorlandAllocationAttempt){0, false}; + BorlandObjectCallFrame suppressed = {0, 0x0200}; + borland_enter_object_constructor(&suppressed, 0); + assert(suppressed.object == 0 && suppressed.vmt_argument == 0x0200); + + g_allocation = (BorlandAllocationAttempt){0, true}; + if (setjmp(g_runtime_error_jump) == 0) { + borland_enter_object_constructor(&suppressed, 0); + assert(false); + } + assert(g_runtime_error_code == 203); + + win16_write_u16(win16_make_far_pointer(0x7000, 4), 0, 0x0200); + BorlandObjectCallFrame destroyed = { + win16_make_far_pointer(0x7000, 4), 1}; + g_free_failed = false; + borland_finish_object_destructor(&destroyed, 0); + assert(destroyed.object == 0); + assert(g_freed_object == win16_make_far_pointer(0x7000, 4)); + assert(g_freed_size == 16); + + BorlandObjectCallFrame borrowed = { + win16_make_far_pointer(0x7000, 4), 0}; + g_freed_object = 0; + borland_finish_object_destructor(&borrowed, 0); + assert(borrowed.object == win16_make_far_pointer(0x7000, 4)); + assert(g_freed_object == 0); + + g_free_failed = true; + destroyed.object = win16_make_far_pointer(0x7000, 4); + if (setjmp(g_runtime_error_jump) == 0) { + borland_finish_object_destructor(&destroyed, 0); + assert(false); + } + assert(g_runtime_error_code == 204); + + g_allocation = (BorlandAllocationAttempt){ + win16_make_far_pointer(0x7100, 8), false}; + assert(borland_default_object_constructor(0, 0x0200) == + win16_make_far_pointer(0x7100, 8)); + + g_free_failed = false; + g_freed_object = 0; + borland_default_object_destructor( + win16_make_far_pointer(0x7000, 4), 1); + assert(g_freed_object == win16_make_far_pointer(0x7000, 4)); + assert(g_freed_size == 16); + + Win16FarPtr destructor = win16_make_far_pointer(0x6000, 0x1234); + win16_write_u16(win16_make_far_pointer(0x5000, 0x0208), 0, + win16_far_offset(destructor)); + win16_write_u16(win16_make_far_pointer(0x5000, 0x020a), 0, + win16_far_selector(destructor)); + borland_dispose_object(win16_make_far_pointer(0x7000, 4)); + assert(g_called_destructor == destructor); + assert(g_destructor_object == win16_make_far_pointer(0x7000, 4)); + assert(g_dispose_mode == 1); + + if (setjmp(g_runtime_error_jump) == 0) { + borland_abstract_method_error(); + assert(false); + } + assert(g_runtime_error_code == 211); + if (setjmp(g_runtime_error_jump) == 0) { + object_windows_abstract_method(); + assert(false); + } + assert(g_runtime_error_code == 211); + return 0; +} diff --git a/original/reconstructed/tests/test_borland_records.c b/original/reconstructed/tests/test_borland_records.c new file mode 100644 index 0000000..3795018 --- /dev/null +++ b/original/reconstructed/tests/test_borland_records.c @@ -0,0 +1,103 @@ +#include "../tdkpin_borland_records.h" + +#include +#include +#include + +static jmp_buf g_error_jump; +static uint16_t g_error_code; +static unsigned g_ansi_calls; + +_Noreturn void borland_runtime_error(uint16_t code) +{ + g_error_code = code; + longjmp(g_error_jump, 1); +} + +INT16 AnsiToOem16(Win16FarPtr source, Win16FarPtr destination) +{ + assert(source == destination); + assert(win16_far_offset(source) == 0x230); + g_ansi_calls++; + return 1; +} + +static void expect_vmt_error(Win16FarPtr vmt) +{ + g_error_code = 0; + if (setjmp(g_error_jump) == 0) { + borland_validate_vmt_descriptor(vmt); + assert(false); + } + assert(g_error_code == 210); +} + +int main(void) +{ + static uint8_t data[0x400]; + static uint8_t code[0x1000]; + win16_reset_segment_bindings(); + win16_bind_segment(0x7000, data, sizeof(data), true); + win16_bind_ne_segment(5, 0x6000, code, sizeof(code), false); + Win16FarPtr vmt = win16_make_far_pointer(0x7000, 0); + win16_write_u16(vmt, 0, 18); + win16_write_u16(vmt, 2, (uint16_t)-18); + borland_validate_vmt_descriptor(vmt); + win16_write_u16(vmt, 0, 0); + expect_vmt_error(vmt); + win16_write_u16(vmt, 0, 18); + win16_write_u16(vmt, 2, (uint16_t)-17); + expect_vmt_error(vmt); + + Win16FarPtr source = win16_make_far_pointer(0x7000, 0x100); + Win16FarPtr record = win16_make_far_pointer(0x7000, 0x200); + memcpy(&data[0x100], "name.txt", 9); + g_ansi_calls = 0; + borland_assign_text_c(source, record); + assert(win16_read_u16(record) == 0); + assert(win16_read_u16(win16_far_add_offset(record, 2)) == 0xd7b0); + assert(win16_read_u16(win16_far_add_offset(record, 4)) == 128); + assert(win16_read_far_pointer(record, 12) == + win16_make_far_pointer(0x7000, 0x280)); + assert(win16_read_far_pointer(record, 16) == + win16_make_far_pointer(0x6000, 0x0be9)); + assert(memcmp(&data[0x230], "name.txt", 9) == 0); + assert(g_ansi_calls == 1); + + memset(&data[0x200], 0xcc, 128); + data[0x100] = 3; + memcpy(&data[0x101], "abc", 3); + borland_assign_text_short(source, record); + assert(memcmp(&data[0x230], "abc", 4) == 0); + for (uint16_t offset = 20; offset < 48; offset++) { + assert(data[0x200 + offset] == 0); + } + + memset(&data[0x200], 0xcc, 32); + borland_initialize_file_record(1, 2, 3, record); + assert(win16_read_u16(win16_far_add_offset(record, 4)) == 1); + assert(win16_read_u16(win16_far_add_offset(record, 8)) == 0); + assert(win16_read_u16(win16_far_add_offset(record, 10)) == 0); + assert(win16_read_u16(win16_far_add_offset(record, 12)) == 2); + assert(win16_read_u16(win16_far_add_offset(record, 14)) == 3); + + memset(&data[0x200], 0xcc, 128); + data[0x100] = 4; + memcpy(&data[0x101], "file", 4); + borland_assign_file_short(source, record); + assert(win16_read_u16(record) == 0); + assert(win16_read_u16(win16_far_add_offset(record, 2)) == 0xd7b0); + for (uint16_t offset = 4; offset < 48; offset++) { + assert(data[0x200 + offset] == 0); + } + assert(memcmp(&data[0x230], "file", 5) == 0); + + memset(&data[0x101], 'x', 100); + data[0x100] = 100; + borland_assign_file_short(source, record); + for (uint16_t index = 0; index < 79; index++) { + assert(data[0x230 + index] == 'x'); + } + assert(data[0x230 + 79] == 0); + return 0; +} diff --git a/original/reconstructed/tests/test_borland_startup.c b/original/reconstructed/tests/test_borland_startup.c new file mode 100644 index 0000000..ad908f6 --- /dev/null +++ b/original/reconstructed/tests/test_borland_startup.c @@ -0,0 +1,102 @@ +#include "../tdkpin_borland_startup.h" + +#include +#include + +HINSTANCE16 g_win16_previous_instance; +HINSTANCE16 g_win16_instance; +uint16_t g_win16_show_command; +Win16FarPtr g_borland_command_line; +uint16_t g_borland_windows_mode; +uint16_t g_borland_huge_pointer_increment; +uint8_t g_borland_cpu_level; + +static jmp_buf g_termination_jump; +static uint8_t g_termination_status; +static unsigned g_call_count; +static uint16_t g_init_app_result; +static uint32_t g_win_flags; +static BorlandWin16StartupRegisters g_expected; + +void WaitEvent16(uint16_t event) +{ + assert(g_call_count++ == 0); + assert(event == 0); + assert(g_win16_previous_instance == g_expected.previous_instance); + assert(g_win16_instance == g_expected.instance); + assert(g_win16_show_command == g_expected.show_command); + assert(g_borland_command_line == g_expected.command_line); + assert(g_borland_windows_mode == + win16_far_selector(g_expected.command_line)); +} + +uint16_t InitApp16(HINSTANCE16 instance) +{ + assert(g_call_count++ == 1); + assert(instance == g_expected.instance); + return g_init_app_result; +} + +uint32_t GetWinFlags16(void) +{ + assert(g_call_count++ == 2); + return g_win_flags; +} + +_Noreturn void win16_dos_terminate(uint8_t status) +{ + g_termination_status = status; + longjmp(g_termination_jump, 1); +} + +static void run_success(uint32_t flags, uint8_t expected_cpu_level) +{ + g_call_count = 0; + g_init_app_result = 1; + g_win_flags = flags; + g_borland_huge_pointer_increment = 0; + borland_initialize_win16_runtime(&g_expected); + assert(g_call_count == 3); + assert(g_borland_cpu_level == expected_cpu_level); + assert(g_borland_huge_pointer_increment == 8); +} + +int main(void) +{ + g_expected = (BorlandWin16StartupRegisters){ + .loader_ax = 1, + .command_line = win16_make_far_pointer(0x3456, 0x789a), + .show_command = 7, + .previous_instance = 0x1111, + .instance = 0x2222, + }; + + run_success(0x40, 0); /* WF_CPU086 */ + run_success(0x02, 1); /* WF_CPU286 */ + run_success(0x04, 2); /* WF_CPU386 */ + run_success(0x0104, 2); /* only AL participates */ + + g_expected.loader_ax = 0; + g_call_count = 0; + g_win16_instance = 0xaaaa; + if (setjmp(g_termination_jump) == 0) { + borland_initialize_win16_runtime(&g_expected); + assert(false); + } + assert(g_termination_status == 0xff); + assert(g_call_count == 0 && g_win16_instance == 0xaaaa); + + g_expected.loader_ax = 1; + g_call_count = 0; + g_init_app_result = 0; + g_borland_huge_pointer_increment = 0xaaaa; + if (setjmp(g_termination_jump) == 0) { + borland_initialize_win16_runtime(&g_expected); + assert(false); + } + assert(g_termination_status == 0xff); + assert(g_call_count == 2); + assert(g_win16_instance == g_expected.instance); + assert(g_borland_huge_pointer_increment == 0xaaaa); + return 0; +} diff --git a/original/reconstructed/tests/test_bound_thunks.c b/original/reconstructed/tests/test_bound_thunks.c new file mode 100644 index 0000000..3d60950 --- /dev/null +++ b/original/reconstructed/tests/test_bound_thunks.c @@ -0,0 +1,97 @@ +#include "../tdkpin_object_windows.h" + +#include +#include + +uint16_t g_object_windows_thunk_code_selector; +Win16FarPtr g_object_windows_free_thunk; +Win16FarPtr g_object_windows_dispatch_proc; + +static uint8_t g_pool[0x100]; +static HGLOBAL16 g_allocation = 0x1234; +static unsigned g_allocations; +static unsigned g_alias_allocations; +static unsigned g_alias_frees; +static unsigned g_presto_calls; + +HGLOBAL16 GlobalAlloc16(UINT16 flags, uint32_t bytes) +{ + assert(flags == 0 && bytes == sizeof(g_pool)); + g_allocations++; + return g_allocation; +} + +Win16FarPtr GlobalLock16(HGLOBAL16 allocation) +{ + assert(allocation == g_allocation); + return win16_make_far_pointer(0x8000, 0); +} + +uint16_t AllocCStoDSAlias16(uint16_t code_selector) +{ + assert(code_selector == 0x8000); + g_alias_allocations++; + return 0x8100; +} + +uint16_t FreeSelector16(uint16_t selector) +{ + assert(selector == 0x8100); + g_alias_frees++; + return 0; +} + +uint16_t PrestoChangoSelector16( + uint16_t source_selector, uint16_t destination_selector) +{ + assert(source_selector == 0x8000 && destination_selector == 0x8000); + g_presto_calls++; + return 0x8000; +} + +int main(void) +{ + static uint8_t dgroup[0x1000]; + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, dgroup, sizeof(dgroup), true); + win16_set_dgroup_selector(0x5000); + win16_bind_segment(0x8000, g_pool, sizeof(g_pool), true); + win16_bind_segment(0x8100, g_pool, sizeof(g_pool), true); + const uint8_t template_bytes[5] = {0x5b, 0x2e, 0xc4, 0x1f, 0xea}; + memcpy(&dgroup[0x0686], template_bytes, sizeof(template_bytes)); + g_object_windows_dispatch_proc = + win16_make_far_pointer(0x6000, 0x1234); + + Win16FarPtr first_object = win16_make_far_pointer(0x7000, 0x0020); + Win16FarPtr first = object_windows_allocate_bound_thunk(first_object); + assert(first == win16_make_far_pointer(0x8000, 0x00f9)); + assert(g_allocations == 1 && g_presto_calls == 1); + assert(win16_read_u16(win16_make_far_pointer(0x8000, 0)) == 0); + for (uint16_t index = 0; index < sizeof(template_bytes); index++) { + assert(win16_read_u8( + win16_make_far_pointer(0x8000, (uint16_t)(2 + index))) == + template_bytes[index]); + } + assert(win16_read_far_pointer( + win16_make_far_pointer(0x8000, 7), 0) == + g_object_windows_dispatch_proc); + assert(win16_read_u8(first) == 0xe8); + assert(win16_read_u16(win16_far_add_offset(first, 1)) == 0xff06); + assert(win16_read_far_pointer(first, 3) == first_object); + assert(g_object_windows_free_thunk == + win16_make_far_pointer(0x8000, 0x00f2)); + + Win16FarPtr second_object = win16_make_far_pointer(0x7000, 0x0040); + Win16FarPtr second = object_windows_allocate_bound_thunk(second_object); + assert(second == win16_make_far_pointer(0x8000, 0x00f2)); + assert(win16_read_far_pointer(second, 3) == second_object); + assert(g_allocations == 1); + + object_windows_release_bound_thunk(first); + assert(g_object_windows_free_thunk == first); + assert(win16_read_far_pointer(first, 3) == + win16_make_far_pointer(0x8000, 0x00eb)); + assert(object_windows_allocate_bound_thunk(first_object) == first); + assert(g_alias_allocations == 4 && g_alias_frees == 4); + return 0; +} diff --git a/original/reconstructed/tests/test_child_validation.c b/original/reconstructed/tests/test_child_validation.c new file mode 100644 index 0000000..3cd76d0 --- /dev/null +++ b/original/reconstructed/tests/test_child_validation.c @@ -0,0 +1,182 @@ +#include "../tdkpin_object_list.h" + +#include +#include + +static Win16FarPtr g_false_child; +static HWND16 g_iconic_window; +static unsigned g_get_text_calls; +static unsigned g_set_text_calls; +static Win16FarPtr g_prepare_proc; +static uint16_t g_prepare_argument; +static Win16FarPtr g_transfer_children[4]; +static Win16FarPtr g_transfer_cursors[4]; +static unsigned g_transfer_calls; + +bool win16_call_object_bool_method( + Win16FarPtr procedure, Win16FarPtr object) +{ + assert(procedure == win16_make_far_pointer(0x6100, 0x0200)); + return object != g_false_child; +} + +BOOL16 IsIconic16(HWND16 window) +{ + return window == g_iconic_window; +} + +INT16 GetWindowText16(HWND16 window, char *text, INT16 maximum) +{ + assert(window == g_iconic_window && maximum == 81); + strcpy(text, "title"); + g_get_text_calls++; + return 5; +} + +BOOL16 SetWindowText16(HWND16 window, const char *text) +{ + assert(window == g_iconic_window && strcmp(text, "title") == 0); + g_set_text_calls++; + return 1; +} + +void borland_dispose_object(Win16FarPtr object) +{ + (void)object; +} + +bool win16_call_object_predicate( + Win16FarPtr procedure, Win16FarPtr child) +{ + (void)procedure; + (void)child; + return false; +} + +void win16_call_object_action( + Win16FarPtr procedure, Win16FarPtr child) +{ + (void)procedure; + (void)child; +} + +void win16_call_object_u16_method( + Win16FarPtr procedure, Win16FarPtr object, uint16_t argument) +{ + (void)object; + g_prepare_proc = procedure; + g_prepare_argument = argument; +} + +uint16_t win16_call_object_transfer_method( + Win16FarPtr procedure, + Win16FarPtr object, + uint16_t direction, + Win16FarPtr cursor) +{ + assert(procedure == win16_make_far_pointer(0x6100, 0x0400)); + assert(direction == 2); + g_transfer_children[g_transfer_calls] = object; + g_transfer_cursors[g_transfer_calls] = cursor; + return g_transfer_calls++ == 0 ? 3 : 5; +} + +static void configure_child( + Win16FarPtr child, uint16_t group, uint8_t flags, HWND16 window) +{ + win16_write_u16(child, 0, 0x0100); + win16_write_u16(child, 4, window); + win16_write_u8(win16_far_add_offset(child, 0x16), flags); + win16_write_u16(child, 0x17, group); +} + +int main(void) +{ + static uint8_t dgroup[0x1000]; + static uint8_t container_bytes[64]; + static uint8_t a_bytes[64]; + static uint8_t b_bytes[64]; + static uint8_t c_bytes[64]; + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, dgroup, sizeof(dgroup), true); + win16_set_dgroup_selector(0x5000); + win16_bind_segment(0x7000, container_bytes, sizeof(container_bytes), true); + win16_bind_segment(0x7100, a_bytes, sizeof(a_bytes), true); + win16_bind_segment(0x7200, b_bytes, sizeof(b_bytes), true); + win16_bind_segment(0x7300, c_bytes, sizeof(c_bytes), true); + win16_write_u16(win16_dgroup_pointer(0x0120), 0, 0x0200); + win16_write_u16(win16_dgroup_pointer(0x0122), 0, 0x6100); + Win16FarPtr prepare_proc = win16_make_far_pointer(0x6100, 0x0300); + win16_write_u16(win16_dgroup_pointer(0x0144), 0, + win16_far_offset(prepare_proc)); + win16_write_u16(win16_dgroup_pointer(0x0146), 0, + win16_far_selector(prepare_proc)); + win16_write_u16(win16_dgroup_pointer(0x0140), 0, 0x0400); + win16_write_u16(win16_dgroup_pointer(0x0142), 0, 0x6100); + + Win16FarPtr container = win16_make_far_pointer(0x7000, 2); + Win16FarPtr a = win16_make_far_pointer(0x7100, 2); + Win16FarPtr b = win16_make_far_pointer(0x7200, 2); + Win16FarPtr c = win16_make_far_pointer(0x7300, 2); + configure_child(a, 1, 4, 0x11); + configure_child(b, 2, 4, 0x22); + configure_child(c, 0, 4, 0x33); + object_windows_append_child(container, a); + object_windows_append_child(container, b); + object_windows_append_child(container, c); + + assert(object_windows_child_group_matches(1, a)); + assert(!object_windows_child_group_matches(-1, a)); + assert(!object_windows_child_group_matches(2, a)); + + g_false_child = a; + assert(object_windows_try_child_activation(0, a)); + g_false_child = 0; + g_iconic_window = 0x22; + g_get_text_calls = 0; + g_set_text_calls = 0; + assert(!object_windows_try_child_activation(0, b)); + assert(g_get_text_calls == 1 && g_set_text_calls == 1); + assert(!object_windows_unindexed_child_matches(0, b)); + + g_false_child = a; + assert(object_windows_validate_child_groups(container)); + g_false_child = c; + assert(!object_windows_validate_child_groups(container)); + g_false_child = 0; + assert(object_windows_validate_child_groups(container)); + + static uint8_t empty_bytes[64]; + win16_bind_segment(0x7400, empty_bytes, sizeof(empty_bytes), true); + assert(object_windows_validate_child_groups( + win16_make_far_pointer(0x7400, 2))); + Win16FarPtr empty = win16_make_far_pointer(0x7400, 2); + win16_write_u16(empty, 0, 0x0100); + g_prepare_proc = 0; + object_windows_prepare_window(empty); + assert(g_prepare_proc == prepare_proc && g_prepare_argument == 2); + g_false_child = c; + win16_write_u16(container, 2, 0); + g_prepare_proc = 0; + object_windows_prepare_window(container); + assert(win16_read_u16(win16_far_add_offset(container, 2)) == 0xfffc); + assert(g_prepare_proc == 0); + + win16_write_u8(win16_far_add_offset(a, 0x16), 0x10); + win16_write_u8(win16_far_add_offset(b, 0x16), 0); + win16_write_u8(win16_far_add_offset(c, 0x16), 0x10); + win16_write_u16(container, 0x0e, 0x0100); + win16_write_u16(container, 0x10, 0x8000); + g_transfer_calls = 0; + object_windows_transfer_child_data(container, 2); + assert(g_transfer_calls == 2); + assert(g_transfer_children[0] == a && g_transfer_children[1] == c); + assert(g_transfer_cursors[0] == win16_make_far_pointer(0x8000, 0x0100)); + assert(g_transfer_cursors[1] == win16_make_far_pointer(0x8000, 0x0103)); + ObjectWindowsTransferContext context = { + win16_make_far_pointer(0x8000, 0xfffe), 2}; + g_transfer_calls = 0; + object_windows_transfer_child_callback(&context, a); + assert(context.cursor == win16_make_far_pointer(0x8000, 1)); + return 0; +} diff --git a/original/reconstructed/tests/test_class_registration.c b/original/reconstructed/tests/test_class_registration.c new file mode 100644 index 0000000..ef41b2e --- /dev/null +++ b/original/reconstructed/tests/test_class_registration.c @@ -0,0 +1,136 @@ +#include "../tdkpin_window_messages.h" + +#include +#include + +Win16FarPtr g_object_windows_application; +HINSTANCE16 g_win16_previous_instance; +HINSTANCE16 g_win16_instance; +uint16_t g_win16_show_command; +Win16FarPtr g_win16_message_box; +Win16FarPtr g_object_windows_dispatch_proc; +uint16_t g_object_windows_thunk_code_selector; +Win16FarPtr g_object_windows_free_thunk; +Win16FarPtr g_object_windows_message_hook; +Win16FarPtr g_object_windows_creating_object; + +static Win16FarPtr g_class_name_proc; +static Win16FarPtr g_builder_proc; +static Win16FarPtr g_class_name; +static BOOL16 g_class_exists; +static uint16_t g_register_result; +static unsigned g_builder_calls; +static unsigned g_register_calls; +static unsigned g_load_icon_calls; +static unsigned g_load_cursor_calls; + +Win16FarPtr win16_call_object_far_method( + Win16FarPtr procedure, Win16FarPtr object) +{ + (void)object; + assert(procedure == g_class_name_proc); + return g_class_name; +} + +void win16_call_object_wndclass_method( + Win16FarPtr procedure, Win16FarPtr object, WNDCLASS16 *window_class) +{ + (void)object; + assert(procedure == g_builder_proc); + memset(window_class, 0, sizeof(*window_class)); + window_class->style = 3; + window_class->class_name = g_class_name; + g_builder_calls++; +} + +BOOL16 GetClassInfo16( + HINSTANCE16 instance, + Win16FarPtr class_name, + WNDCLASS16 *window_class) +{ + assert(instance == g_win16_instance && class_name == g_class_name); + (void)window_class; + return g_class_exists; +} + +uint16_t RegisterClass16(const WNDCLASS16 *window_class) +{ + assert(window_class->style == 3); + assert(window_class->class_name == g_class_name); + g_register_calls++; + return g_register_result; +} + +HICON16 LoadIcon16(HINSTANCE16 instance, Win16FarPtr resource) +{ + assert(instance == 0 && resource == win16_make_far_pointer(0, 0x7f00)); + g_load_icon_calls++; + return 0x1111; +} + +HCURSOR16 LoadCursor16(HINSTANCE16 instance, Win16FarPtr resource) +{ + assert(instance == 0 && resource == win16_make_far_pointer(0, 0x7f00)); + g_load_cursor_calls++; + return 0x2222; +} + +static void write_far(uint16_t offset, Win16FarPtr pointer) +{ + win16_write_u16( + win16_dgroup_pointer(offset), 0, win16_far_offset(pointer)); + win16_write_u16( + win16_dgroup_pointer((uint16_t)(offset + 2)), + 0, + win16_far_selector(pointer)); +} + +int main(void) +{ + static uint8_t dgroup[0x1000]; + static uint8_t window_bytes[64]; + static uint8_t code[0x200]; + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, dgroup, sizeof(dgroup), true); + win16_set_dgroup_selector(0x5000); + win16_bind_segment(0x7000, window_bytes, sizeof(window_bytes), true); + win16_bind_ne_segment(4, 0x6000, code, sizeof(code), false); + + Win16FarPtr window = win16_make_far_pointer(0x7000, 2); + uint16_t vmt = 0x0100; + win16_write_u16(window, 0, vmt); + g_class_name_proc = win16_make_far_pointer(0x6000, 0x1000); + g_builder_proc = win16_make_far_pointer(0x6000, 0x2000); + g_class_name = win16_make_far_pointer(0x5000, 0x068c); + g_win16_instance = 0x1234; + write_far(vmt + 0x2c, g_class_name_proc); + write_far(vmt + 0x34, g_builder_proc); + + g_class_exists = 1; + g_builder_calls = 0; + g_register_calls = 0; + assert(object_windows_register_class(window)); + assert(g_builder_calls == 0 && g_register_calls == 0); + + g_class_exists = 0; + g_register_result = 7; + assert(object_windows_register_class(window)); + assert(g_builder_calls == 1 && g_register_calls == 1); + g_register_result = 0; + assert(!object_windows_register_class(window)); + assert(g_builder_calls == 2 && g_register_calls == 2); + + WNDCLASS16 descriptor; + g_load_icon_calls = 0; + g_load_cursor_calls = 0; + object_windows_build_window_class(window, &descriptor); + assert(descriptor.style == 3); + assert(descriptor.window_proc == win16_make_far_pointer(0x6000, 0x018b)); + assert(descriptor.class_extra_bytes == 0 && descriptor.window_extra_bytes == 0); + assert(descriptor.instance == g_win16_instance); + assert(descriptor.icon == 0x1111 && descriptor.cursor == 0x2222); + assert(descriptor.background_brush == 6); + assert(descriptor.menu_name == 0 && descriptor.class_name == g_class_name); + assert(g_load_icon_calls == 1 && g_load_cursor_calls == 1); + return 0; +} diff --git a/original/reconstructed/tests/test_claw_render.c b/original/reconstructed/tests/test_claw_render.c new file mode 100644 index 0000000..064784e --- /dev/null +++ b/original/reconstructed/tests/test_claw_render.c @@ -0,0 +1,111 @@ +#include "../tdkpin_render.h" + +#include + +static uint8_t g_dgroup[0x1000]; +static unsigned g_restore_calls; +static unsigned g_present_calls; +static unsigned g_create_calls; +static unsigned g_select_calls; +static unsigned g_blit_calls; +static unsigned g_delete_calls; +static INT16 g_expected_source_x; +static INT16 g_expected_source_y; + +void tdkpin_restore_background_region_b( + INT16 height, INT16 width, INT16 y, INT16 x, HDC16 dc) +{ + assert(height == 74 && width == 100 && y == 47 && x == 238 && dc == 0x1111); + g_restore_calls++; +} + +void tdkpin_present_background_region( + INT16 height, INT16 width, INT16 y, INT16 x, HDC16 dc) +{ + assert(height == 74 && width == 100 && y == 47 && x == 238 && dc == 0x1111); + g_present_calls++; +} + +HDC16 CreateCompatibleDC16(HDC16 dc) +{ + assert(dc == 0x1111); + return (HDC16)(0x2001 + g_create_calls++); +} + +HGDIOBJ16 SelectObject16(HDC16 dc, HGDIOBJ16 object) +{ + g_select_calls++; + if (g_select_calls == 1) { + assert(dc == 0x2001 && object == 0x3001); + return 0x4001; + } + if (g_select_calls == 2) { + assert(dc == 0x2002 && object == 0x3002); + return 0x4002; + } + if (g_select_calls == 3) { + assert(dc == 0x2001 && object == 0x4001); + } else { + assert(g_select_calls == 4 && dc == 0x2002 && object == 0x4002); + } + return 0; +} + +BOOL16 BitBlt16( + HDC16 destination, + INT16 x, + INT16 y, + INT16 width, + INT16 height, + HDC16 source, + INT16 source_x, + INT16 source_y, + uint32_t raster_operation) +{ + g_blit_calls++; + assert(destination == (g_blit_calls == 1 ? 0x2001 : 0x1111)); + assert(x == 238 && y == 47 && width == 100 && height == 74); + assert(source == 0x2002); + assert(source_x == g_expected_source_x && source_y == g_expected_source_y); + assert(raster_operation == 0x00cc0020); + return 1; +} + +BOOL16 DeleteDC16(HDC16 dc) +{ + g_delete_calls++; + assert(dc == (g_delete_calls == 1 ? 0x2002 : 0x2001)); + return 1; +} + +static void reset_active(INT16 source_x, INT16 source_y) +{ + g_create_calls = 0; + g_select_calls = 0; + g_blit_calls = 0; + g_delete_calls = 0; + g_expected_source_x = source_x; + g_expected_source_y = source_y; +} + +int main(void) +{ + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, g_dgroup, sizeof(g_dgroup), true); + win16_set_dgroup_selector(0x5000); + win16_write_u16(win16_make_far_pointer(0x5000, 0x085b), 0, 0x3001); + win16_write_u16(win16_make_far_pointer(0x5000, 0x0863), 0, 0x3002); + + tdkpin_draw_claw_frame(0, 0, 0x1111); + assert(g_restore_calls == 1 && g_present_calls == 1); + reset_active(0, 148); + tdkpin_draw_claw_frame(0, 1, 0x1111); + assert(g_blit_calls == 2 && g_select_calls == 4 && g_delete_calls == 2); + reset_active(0, 74); + tdkpin_draw_claw_frame(1, 10, 0x1111); + assert(g_blit_calls == 2 && g_select_calls == 4 && g_delete_calls == 2); + reset_active(800, 222); + tdkpin_draw_claw_frame(0, 18, 0x1111); + assert(g_blit_calls == 2); + return 0; +} diff --git a/original/reconstructed/tests/test_collision_events.c b/original/reconstructed/tests/test_collision_events.c new file mode 100644 index 0000000..549b081 --- /dev/null +++ b/original/reconstructed/tests/test_collision_events.c @@ -0,0 +1,319 @@ +#include "../tdkpin_collision_events.h" + +#include +#include + +uint8_t g_current_player; + +static uint8_t g_stack[0x400]; +static uint8_t g_object[0x0c00]; +static uint8_t g_dgroup[0x5000]; +static Win16FarPtr g_receiver; +static uint16_t g_restore_ids[64]; +static uint16_t g_refresh_ids[64]; +static uint16_t g_sounds[32]; +static int32_t g_scores[32]; +static unsigned g_restore_calls; +static unsigned g_refresh_calls; +static unsigned g_sound_calls; +static unsigned g_score_calls; +static unsigned g_draw_score_calls; +static unsigned g_composite_calls; +static unsigned g_present_calls; +static unsigned g_restore_background_calls; +static unsigned g_get_dc_calls; +static unsigned g_release_dc_calls; +static unsigned g_random_calls; +static uint16_t g_random_values[4]; +static uint16_t g_last_sprite; +static int32_t g_last_drawn_score; + +static Win16FarPtr record(uint16_t id) +{ + return win16_dgroup_pointer((uint16_t)(0x095b + id * 0x53u)); +} + +void tdkpin_restore_record_or_item_a(uint16_t caller_bp, uint16_t id) +{ + assert(caller_bp == 0x0100 && g_restore_calls < 64); + g_restore_ids[g_restore_calls++] = id; +} + +void tdkpin_refresh_collision_record(uint16_t caller_bp, uint16_t id) +{ + assert(caller_bp == 0x0100 && g_refresh_calls < 64); + g_refresh_ids[g_refresh_calls++] = id; +} + +void tdkpin_play_sound_if_not_tilted(uint16_t sound_number) +{ + assert(g_sound_calls < 32); + g_sounds[g_sound_calls++] = sound_number; +} + +void tdkpin_add_score_from_caller_frame(uint16_t caller_bp, int32_t delta) +{ + assert(caller_bp == 0x0100 && g_score_calls < 32); + g_scores[g_score_calls++] = delta; +} + +void tdkpin_draw_score_from_caller_frame( + uint16_t caller_bp, uint16_t low, uint16_t high) +{ + assert(caller_bp == 0x0100); + g_last_drawn_score = + (int32_t)((uint32_t)low | ((uint32_t)high << 16)); + g_draw_score_calls++; +} + +uint16_t borland_random_below(uint16_t upper_bound) +{ + assert(upper_bound == 6 && g_random_calls < 4); + return g_random_values[g_random_calls++]; +} + +int32_t borland_multiply_i32(int32_t left, int32_t right) +{ + return (int32_t)((uint32_t)left * (uint32_t)right); +} + +HDC16 GetDC16(HWND16 window) +{ + assert(window == 0x2222); + g_get_dc_calls++; + return 0x3333; +} + +INT16 ReleaseDC16(HWND16 window, HDC16 dc) +{ + assert(window == 0x2222 && dc == 0x3333); + g_release_dc_calls++; + return 1; +} + +void tdkpin_composite_player_sprite(uint16_t sprite_index, HDC16 dc) +{ + assert(dc == 0x3333); + g_last_sprite = sprite_index; + g_composite_calls++; +} + +void tdkpin_restore_background_region_a( + INT16 height, INT16 width, INT16 y, INT16 x, HDC16 dc) +{ + assert(height > 0 && width > 0 && dc == 0x3333); + (void)y; + (void)x; + g_restore_background_calls++; +} + +void tdkpin_present_background_region( + INT16 height, INT16 width, INT16 y, INT16 x, HDC16 dc) +{ + assert(height > 0 && width > 0 && dc == 0x3333); + (void)y; + (void)x; + g_present_calls++; +} + +static void reset_counters(void) +{ + memset(g_restore_ids, 0, sizeof(g_restore_ids)); + memset(g_refresh_ids, 0, sizeof(g_refresh_ids)); + memset(g_sounds, 0, sizeof(g_sounds)); + memset(g_scores, 0, sizeof(g_scores)); + g_restore_calls = 0; + g_refresh_calls = 0; + g_sound_calls = 0; + g_score_calls = 0; + g_draw_score_calls = 0; + g_composite_calls = 0; + g_present_calls = 0; + g_restore_background_calls = 0; + g_get_dc_calls = 0; + g_release_dc_calls = 0; + g_random_calls = 0; + memset(g_random_values, 0, sizeof(g_random_values)); + g_last_sprite = 0; + g_last_drawn_score = 0; +} + +static void prepare_fixture(void) +{ + memset(g_stack, 0, sizeof(g_stack)); + memset(g_object, 0, sizeof(g_object)); + memset(g_dgroup, 0, sizeof(g_dgroup)); + win16_reset_segment_bindings(); + win16_bind_segment(0x7000, g_stack, sizeof(g_stack), true); + win16_bind_segment(0x7100, g_object, sizeof(g_object), true); + win16_bind_segment(0x7200, g_dgroup, sizeof(g_dgroup), true); + win16_set_dgroup_selector(0x7200); + win16_set_stack_state(0x7000, 0); + g_receiver = win16_make_far_pointer(0x7100, 0); + win16_write_stack_u16(0x0106, win16_far_offset(g_receiver)); + win16_write_stack_u16(0x0108, win16_far_selector(g_receiver)); + win16_write_u16(g_receiver, 4, 0x2222); + g_current_player = 2; + reset_counters(); +} + +static void seed_bounds(uint16_t id, INT16 left, INT16 top) +{ + win16_write_u16(record(id), 0x4b, (uint16_t)left); + win16_write_u16(record(id), 0x4d, (uint16_t)top); + win16_write_u16(record(id), 0x4f, (uint16_t)(left + 2)); + win16_write_u16(record(id), 0x51, (uint16_t)(top + 3)); +} + +static void test_tilt_and_combined_low_events(void) +{ + prepare_fixture(); + win16_write_u8(win16_dgroup_pointer(0x07c6), 1); + tdkpin_handle_collision_events(0x0100, 0xffff, 129); + assert(g_restore_calls == 0 && g_sound_calls == 0); + + prepare_fixture(); + win16_write_u16(record(129), 0x43, 20); + win16_write_u8(win16_far_add_offset(record(20), 0x34), 1); + win16_write_u8(win16_far_add_offset(record(21), 0x34), 1); + win16_write_u8(win16_far_add_offset(record(22), 0x34), 1); + tdkpin_handle_collision_events( + 0x0100, 0x0001u | 0x0002u | 0x2000u | 0x0400u, 129); + assert(win16_read_u8(win16_far_add_offset( + g_receiver, (uint16_t)(0x0467 + 2u * 20u + 15u))) == 1); + assert(g_restore_calls == 1 && g_restore_ids[0] == 1015); + assert(g_refresh_calls == 1 && g_refresh_ids[0] == 20); + assert(win16_read_u8(win16_far_add_offset(record(20), 0x34)) == 0); + assert(win16_read_u8(win16_far_add_offset(record(21), 0x34)) == 0); + assert(win16_read_u8(win16_far_add_offset(record(22), 0x34)) == 0); + assert(win16_read_u32(win16_dgroup_pointer(0x0855)) == 0); + assert(win16_read_u8(win16_dgroup_pointer(0x07c7)) == 1); +} + +static void test_sprite_award(void) +{ + prepare_fixture(); + win16_write_u16(win16_dgroup_pointer(0x09a8), 0, 2); + g_random_values[0] = 1; + g_random_values[1] = 2; + tdkpin_handle_collision_events(0x0100, 0x0004, 0); + assert(g_sound_calls == 1 && g_sounds[0] == 12); + assert(win16_read_u8(win16_far_add_offset(record(149), 0x34)) == 1); + assert(g_restore_ids[0] == 149 && g_random_calls == 2); + assert(win16_read_u16(win16_dgroup_pointer(0x09a8)) == 3); + assert(g_composite_calls == 1 && g_last_sprite == 3); + assert(g_present_calls == 1 && g_get_dc_calls == 1); + + prepare_fixture(); + win16_write_u16(win16_dgroup_pointer(0x399a), 0, 1); + tdkpin_handle_collision_events(0x0100, 0x0004, 0); + assert(win16_read_u16(win16_dgroup_pointer(0x09a8)) == 7); + assert(g_random_calls == 0 && g_last_sprite == 7); +} + +static void set_group_heads(uint16_t first, uint16_t groups, uint8_t active) +{ + for (uint16_t group = 0; group < groups; group++) { + win16_write_u8( + win16_far_add_offset(record((uint16_t)(first + group * 3u)), 0x34), + active); + } +} + +static void test_ready_bank(void) +{ + prepare_fixture(); + set_group_heads(90, 5, 0); + win16_write_u8(win16_dgroup_pointer(0x0818), 6); + tdkpin_handle_collision_events(0x0100, 0x0008, 0); + assert(g_sound_calls == 2 && g_sounds[0] == 12 && g_sounds[1] == 17); + assert(g_score_calls == 1 && g_scores[0] == 50000); + assert(g_refresh_calls == 5); + + prepare_fixture(); + set_group_heads(90, 5, 0); + win16_write_u8(win16_dgroup_pointer(0x0818), 2); + tdkpin_handle_collision_events(0x0100, 0x0008, 0); + assert(win16_read_u8(win16_dgroup_pointer(0x0818)) == 3); + assert(g_restore_calls == 1 && g_restore_ids[0] == 1002); + assert(g_score_calls == 0 && g_refresh_calls == 5); +} + +static void set_item_bank_count(uint16_t count) +{ + for (uint16_t item = 1; item <= count; item++) { + win16_write_u8(win16_far_add_offset( + g_receiver, (uint16_t)(0x046c + 2u * 20u + item)), 1); + } +} + +static void test_item_bank_branches(void) +{ + prepare_fixture(); + set_group_heads(109, 4, 0); + tdkpin_handle_collision_events(0x0100, 0x0010, 0); + assert(g_restore_ids[0] == 1006 && g_scores[0] == 10000); + assert(g_refresh_calls == 4); + + prepare_fixture(); + set_group_heads(109, 4, 0); + set_item_bank_count(8); + seed_bounds(153, 1, 2); + seed_bounds(6, 3, 4); + seed_bounds(154, 5, 6); + tdkpin_handle_collision_events(0x0100, 0x0010, 0); + assert(g_restore_ids[0] == 1014 && g_scores[0] == 24464); + assert(win16_read_u8(win16_far_add_offset(g_receiver, 0x0bdc)) == 1); + assert(g_restore_background_calls == 3 && g_present_calls == 3); + assert(g_get_dc_calls == 1 && g_release_dc_calls == 1); + + prepare_fixture(); + set_group_heads(109, 4, 0); + set_item_bank_count(9); + win16_write_u8(win16_far_add_offset(g_receiver, 0x0bdc), 1); + win16_write_u32(win16_dgroup_pointer(0x0996), 0, 10); + win16_write_u8(win16_dgroup_pointer(0x09a3), 3); + tdkpin_handle_collision_events(0x0100, 0x0010, 0); + assert(win16_read_u32(win16_dgroup_pointer(0x0996)) == 100010u); + assert(g_draw_score_calls == 1 && g_last_drawn_score == 300030); + assert(g_sounds[1] == 7); +} + +static void test_switch_and_timed_records(void) +{ + static const uint16_t event_ids[3] = {150, 151, 152}; + static const uint16_t related[3] = {153, 6, 154}; + for (uint16_t index = 0; index < 3; index++) { + prepare_fixture(); + tdkpin_handle_collision_events(0x0100, 0x1000, event_ids[index]); + assert(win16_read_u8(win16_far_add_offset( + g_receiver, (uint16_t)(0x00f7 + index))) == 10); + assert(g_restore_calls == 2); + assert(g_restore_ids[0] == event_ids[index]); + assert(g_restore_ids[1] == related[index]); + assert(win16_read_u8(win16_far_add_offset( + record(related[index]), 0x34)) == 1); + } + + prepare_fixture(); + win16_write_u8(win16_dgroup_pointer(0x0818), 3); + tdkpin_handle_collision_events(0x0100, 0x0040, 51); + assert(g_sounds[0] == 6 && g_restore_ids[0] == 51); + assert(g_scores[0] == 2000); + assert(win16_read_u8(win16_far_add_offset(g_receiver, 0x94)) == 5); + + prepare_fixture(); + tdkpin_handle_collision_events(0x0100, 0x0040, 140); + assert(win16_read_u8(win16_far_add_offset(g_receiver, 0x00ed)) == 20); + assert(g_restore_ids[0] == 140 && g_sound_calls == 0); +} + +int main(void) +{ + test_tilt_and_combined_low_events(); + test_sprite_award(); + test_ready_bank(); + test_item_bank_branches(); + test_switch_and_timed_records(); + return 0; +} diff --git a/original/reconstructed/tests/test_collision_records.c b/original/reconstructed/tests/test_collision_records.c new file mode 100644 index 0000000..7fdfd1a --- /dev/null +++ b/original/reconstructed/tests/test_collision_records.c @@ -0,0 +1,204 @@ +#include "../tdkpin_collision_records.h" + +#include +#include +#include + +int32_t g_collision_path_x; +int32_t g_collision_path_y; +uint8_t g_borland_cpu_level = 2; + +_Noreturn void borland_runtime_error(uint16_t code) +{ + (void)code; + assert(false); + __builtin_unreachable(); +} + +_Noreturn void win16_integer_divide_fault(void) +{ + assert(false); + __builtin_unreachable(); +} + +static TdkpinCollisionRecord read_record( + const uint8_t *dgroup, uint16_t index) +{ + TdkpinCollisionRecord record; + memcpy( + &record, + dgroup + 0x095b + index * sizeof(record), + sizeof(record)); + return record; +} + +static BorlandReal48 tagged_real48(uint8_t tag) +{ + return (BorlandReal48){{tag, 1, 2, 3, 4, 5}}; +} + +static TdkpinCollisionInitArgs base_arguments(uint16_t index) +{ + return (TdkpinCollisionInitArgs){ + .render_bottom = 44, + .render_right = 33, + .render_top = 22, + .render_left = 11, + .layer_mask = 2, + .score_low = 0x5678, + .score_high = 0x1234, + .contact_state = 9, + .flags = 0x0040, + .response_kick = tagged_real48(0x81), + .response_auxiliary = tagged_real48(0x82), + .response_tangent = tagged_real48(0x83), + .response_normal = tagged_real48(0x84), + .subtype = 7, + .type = 4, + .active = 1, + .index = index, + }; +} + +static void assert_common_fields( + const TdkpinCollisionRecord *record, + const TdkpinCollisionInitArgs *arguments) +{ + assert(record->type == (uint8_t)arguments->type); + assert(record->subtype == (uint8_t)arguments->subtype); + assert(record->active == (uint8_t)arguments->active); + assert(memcmp( + &record->response_normal, + &arguments->response_normal, + 6) == 0); + assert(memcmp( + &record->response_tangent, + &arguments->response_tangent, + 6) == 0); + assert(memcmp( + &record->response_auxiliary, + &arguments->response_auxiliary, + 6) == 0); + assert(memcmp( + &record->response_kick, + &arguments->response_kick, + 6) == 0); + assert(record->flags == arguments->flags); + assert(record->contact_state == arguments->contact_state); + assert(record->score_low == arguments->score_low); + assert(record->score_high == arguments->score_high); + assert(record->layer_mask == arguments->layer_mask); + assert(record->render_left == arguments->render_left); + assert(record->render_top == arguments->render_top); + assert(record->render_right == arguments->render_right); + assert(record->render_bottom == arguments->render_bottom); +} + +int main(void) +{ + static uint8_t dgroup[0x4d3a]; + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, dgroup, sizeof(dgroup), true); + win16_set_dgroup_selector(0x5000); + + /* OBJECTS.tsv row 1 geometry: absolute line with the historical Y-20. */ + TdkpinCollisionInitArgs line = base_arguments(1); + line.type = 2; + line.subtype = 0; + line.point1_x = 7; + line.point1_y = 417; + line.point2_x = 125; + line.point2_y = 457; + line.radius = 0; + line.coordinate_mode = 0; + tdkpin_initialize_collision_record(&line); + TdkpinCollisionRecord record = read_record(dgroup, 1); + assert(record.bounds_min_x_milli == 2000); + assert(record.bounds_min_y_milli == 392000); + assert(record.bounds_max_x_milli == 130000); + assert(record.bounds_max_y_milli == 442000); + assert(record.point1_x_milli == 7000); + assert(record.point1_y_milli == 397000); + assert(record.point2_x_milli == 125000); + assert(record.point2_y_milli == 437000); + assert(record.radius_milli.bytes[0] == 0); + assert(g_collision_path_x == 125 && g_collision_path_y == 437); + assert_common_fields(&record, &line); + + /* OBJECTS.tsv row 4 geometry: circle center (141,426), radius 8. */ + TdkpinCollisionInitArgs circle = base_arguments(4); + circle.type = 1; + circle.subtype = 1; + circle.point1_x = 141; + circle.point1_y = 446; + circle.point2_x = 0; + circle.point2_y = 20; + circle.radius = 8; + circle.coordinate_mode = 0; + tdkpin_initialize_collision_record(&circle); + record = read_record(dgroup, 4); + assert(record.bounds_min_x_milli == 128000); + assert(record.bounds_min_y_milli == 413000); + assert(record.bounds_max_x_milli == 154000); + assert(record.bounds_max_y_milli == 439000); + assert(record.point1_x_milli == 141000); + assert(record.point1_y_milli == 426000); + assert(record.point2_x_milli == 0 && record.point2_y_milli == 0); + BorlandReal48 expected_radius = borland_i32_to_real48(8000); + assert(memcmp(&record.radius_milli, &expected_radius, 6) == 0); + assert(g_collision_path_x == 141 && g_collision_path_y == 426); + assert_common_fields(&record, &circle); + + /* Relative segment: point1 continues from globals, point2 is a delta. */ + TdkpinCollisionInitArgs relative = base_arguments(10); + g_collision_path_x = 100; + g_collision_path_y = 200; + relative.coordinate_mode = 1; + relative.point1_x = 5; + relative.point1_y = 7; + relative.point2_x = 10; + relative.point2_y = -20; + relative.radius = 0; + tdkpin_initialize_collision_record(&relative); + record = read_record(dgroup, 10); + assert(record.bounds_min_x_milli == 100000); + assert(record.bounds_max_x_milli == 120000); + assert(record.bounds_min_y_milli == 182000); + assert(record.bounds_max_y_milli == 212000); + assert(record.point1_x_milli == 105000); + assert(record.point1_y_milli == 207000); + assert(record.point2_x_milli == 115000); + assert(record.point2_y_milli == 187000); + assert(g_collision_path_x == 115 && g_collision_path_y == 187); + + /* Negative radius reaches all four fallback-adjust branches exactly. */ + TdkpinCollisionInitArgs fallback = base_arguments(11); + fallback.point1_x = 10; + fallback.point1_y = 30; + fallback.point2_x = 0; + fallback.point2_y = 0; + fallback.radius = -1; + fallback.fallback_x_adjust = 2; + fallback.fallback_y_adjust = 3; + tdkpin_initialize_collision_record(&fallback); + record = read_record(dgroup, 11); + assert(record.bounds_min_x_milli == 13000); + assert(record.bounds_max_x_milli == 11000); + assert(record.bounds_min_y_milli == 14000); + assert(record.bounds_max_y_milli == 12000); + expected_radius = borland_i32_to_real48(-1000); + assert(memcmp(&record.radius_milli, &expected_radius, 6) == 0); + + /* Index 176 is rejected before either table or continuation state changes. */ + memset(dgroup + 0x095b, 0xa5, 0x53); + TdkpinCollisionInitArgs rejected = base_arguments(176); + rejected.point1_x = INT32_MAX; + g_collision_path_x = 123; + g_collision_path_y = 456; + tdkpin_initialize_collision_record(&rejected); + for (uint16_t index = 0; index < 0x53; index++) { + assert(dgroup[0x095b + index] == 0xa5); + } + assert(g_collision_path_x == 123 && g_collision_path_y == 456); + return 0; +} diff --git a/original/reconstructed/tests/test_command_line.c b/original/reconstructed/tests/test_command_line.c new file mode 100644 index 0000000..b290c0f --- /dev/null +++ b/original/reconstructed/tests/test_command_line.c @@ -0,0 +1,61 @@ +#include "../tdkpin_command_line.h" + +#include +#include + +static uint8_t g_command_segment[0x10000]; +Win16FarPtr g_borland_command_line; +HINSTANCE16 g_win16_instance; + +UINT16 GetModuleFileNameFar16( + HINSTANCE16 module, Win16FarPtr buffer, UINT16 size) +{ + assert(module == g_win16_instance && size == 0xff); + static const char path[] = "C:\\TDKPIN.EXE"; + for (uint16_t index = 0; index < sizeof(path); index++) { + win16_write_u8(win16_far_add_offset(buffer, index), path[index]); + } + return (UINT16)(sizeof(path) - 1); +} + +int main(void) +{ + static const char command[] = " one two\tthree"; + memcpy(&g_command_segment[0x100], command, sizeof(command)); + win16_reset_segment_bindings(); + win16_bind_segment( + 0x5555, g_command_segment, sizeof(g_command_segment), true); + static uint8_t result_segment[0x10000]; + win16_bind_segment( + 0x6666, result_segment, sizeof(result_segment), true); + g_borland_command_line = win16_make_far_pointer(0x5555, 0x100); + + assert(borland_parameter_count() == 3); + BorlandCommandToken first = borland_scan_command_token(1); + assert(first.token == win16_make_far_pointer(0x5555, 0x102)); + assert(first.length == 3); + BorlandCommandToken second = borland_scan_command_token(2); + assert(second.token == win16_make_far_pointer(0x5555, 0x106)); + assert(second.length == 3); + BorlandCommandToken missing = borland_scan_command_token(4); + assert(missing.length == 0); + + Win16FarPtr result = win16_make_far_pointer(0x6666, 0x100); + borland_parameter_string(1, result); + assert(result_segment[0x100] == 3); + assert(memcmp(&result_segment[0x101], "one", 3) == 0); + borland_parameter_string(4, result); + assert(result_segment[0x100] == 0); + g_win16_instance = 0x1234; + borland_parameter_string(0, result); + assert(result_segment[0x100] == 13); + assert(memcmp(&result_segment[0x101], "C:\\TDKPIN.EXE", 13) == 0); + + memset(&g_command_segment[0x200], 'x', 260); + g_command_segment[0x304] = 0; + g_borland_command_line = win16_make_far_pointer(0x5555, 0x200); + borland_parameter_string(1, result); + assert(result_segment[0x100] == 4); + assert(memcmp(&result_segment[0x101], &g_command_segment[0x200], 260) == 0); + return 0; +} diff --git a/original/reconstructed/tests/test_dialog.c b/original/reconstructed/tests/test_dialog.c new file mode 100644 index 0000000..4bb88f2 --- /dev/null +++ b/original/reconstructed/tests/test_dialog.c @@ -0,0 +1,413 @@ +#include "../tdkpin_dialog.h" + +#include + +static Win16FarPtr g_dialog; +static Win16FarPtr g_child; +static Win16FarPtr g_close_proc; +static Win16FarPtr g_closed_window; +static HWND16 g_end_window; +static INT16 g_end_result; +static unsigned g_for_each_calls; +static Win16FarPtr g_virtual_proc; +static uint16_t g_virtual_argument; +static Win16FarPtr g_disposed_string; +static unsigned g_destruct_sequence; +static HWND16 g_text_window; +static INT16 g_text_control; +static Win16FarPtr g_text_buffer; +static INT16 g_text_maximum; +static unsigned g_prepare_calls; +static Win16FarPtr g_caption; +static INT16 g_set_ids[2]; +static Win16FarPtr g_set_texts[2]; +static unsigned g_set_text_calls; +static INT16 g_send_id; +static UINT16 g_send_message; +static WPARAM16 g_send_wparam; +static LPARAM16 g_send_lparam; +Win16FarPtr g_win16_create_dialog_param; +Win16FarPtr g_win16_dialog_box_param; +uint8_t g_dialog_alternate_template; +Win16FarPtr g_object_windows_application; +HINSTANCE16 g_win16_instance; + +static bool g_constructor_enters = true; +static unsigned g_constructor_entry_calls; +static Win16FarPtr g_construct_parent; +static unsigned g_clear_flag_calls; +static unsigned g_set_flag_calls; +static Win16FarPtr g_duplicate_result; +static Win16FarPtr g_duplicate_source; +static HWND16 g_create_result; +static INT16 g_modal_result; +static unsigned g_create_calls; +static unsigned g_modal_calls; +static Win16FarPtr g_expected_template; +static HWND16 g_expected_parent_window; +static Win16FarPtr g_expected_dialog_proc; +static LPARAM16 g_expected_init_parameter; + +void object_windows_for_each_child( + Win16FarPtr container, Win16FarPtr action) +{ + assert(container == g_dialog); + assert(action == win16_make_far_pointer(0x6000, 0x2bb1)); + g_for_each_calls++; + object_windows_dialog_mark_child(0xffff, g_child); +} + +void object_windows_set_flag_4_if_windowed( + uint16_t ignored, Win16FarPtr object) +{ + (void)ignored; + if (win16_read_u16(win16_far_add_offset(object, 4)) != 0) { + Win16FarPtr flags = win16_far_add_offset(object, 0x16); + win16_write_u8(flags, (uint8_t)(win16_read_u8(flags) | 4)); + } +} + +BOOL16 EndDialog16(HWND16 dialog, INT16 result) +{ + g_end_window = dialog; + g_end_result = result; + return 1; +} + +void object_windows_close_if_allowed(Win16FarPtr window) +{ + g_closed_window = window; +} + +void win16_call_object_u16_method( + Win16FarPtr procedure, Win16FarPtr object, uint16_t argument) +{ + assert(object == g_dialog); + g_virtual_proc = procedure; + g_virtual_argument = argument; +} + +void borland_far_strdispose(Win16FarPtr string) +{ + assert(++g_destruct_sequence == 1); + g_disposed_string = string; +} + +void object_windows_object_destruct(Win16FarPtr object, uint16_t vmt) +{ + unsigned expected = g_disposed_string == 0 ? 1u : 2u; + assert(++g_destruct_sequence == expected); + assert(object == g_dialog && vmt == 0); +} + +void borland_finish_object_destructor( + BorlandObjectCallFrame *frame, uint16_t vmt_field_offset) +{ + unsigned expected = g_disposed_string == 0 ? 2u : 3u; + assert(++g_destruct_sequence == expected); + assert(frame->object == g_dialog && frame->vmt_argument == 0x0200); + assert(vmt_field_offset == 0); +} + +UINT16 GetDlgItemTextFar16( + HWND16 dialog, + INT16 control_id, + Win16FarPtr buffer, + INT16 maximum) +{ + g_text_window = dialog; + g_text_control = control_id; + g_text_buffer = buffer; + g_text_maximum = maximum; + return 7; +} + +void object_windows_prepare_window(Win16FarPtr window) +{ + assert(window == g_dialog); + g_prepare_calls++; +} + +BOOL16 SetWindowTextFar16(HWND16 window, Win16FarPtr text) +{ + assert(window == 0x77); + g_caption = text; + return 0; +} + +BOOL16 SetDlgItemText16( + HWND16 dialog, INT16 control_id, Win16FarPtr text) +{ + assert(dialog == 0x77 && g_set_text_calls < 2); + g_set_ids[g_set_text_calls] = control_id; + g_set_texts[g_set_text_calls] = text; + g_set_text_calls++; + return 0; +} + +LRESULT16 SendDlgItemMessage16( + HWND16 dialog, + INT16 control_id, + UINT16 message, + WPARAM16 wparam, + LPARAM16 lparam) +{ + assert(dialog == 0x77); + g_send_id = control_id; + g_send_message = message; + g_send_wparam = wparam; + g_send_lparam = lparam; + return -1; +} + +bool borland_enter_object_constructor( + BorlandObjectCallFrame *frame, uint16_t vmt_field_offset) +{ + assert(vmt_field_offset == 0); + g_constructor_entry_calls++; + if (g_constructor_enters && frame->vmt_argument != 0) { + win16_write_u16(frame->object, 0, frame->vmt_argument); + } + return g_constructor_enters; +} + +Win16FarPtr object_windows_object_construct( + Win16FarPtr object, uint16_t vmt, Win16FarPtr parent) +{ + assert(object == g_dialog && vmt == 0); + g_construct_parent = parent; + return object; +} + +void object_windows_clear_flag_4(Win16FarPtr object) +{ + assert(object == g_dialog); + g_clear_flag_calls++; +} + +void object_windows_set_flag_1(Win16FarPtr object) +{ + assert(object == g_dialog); + g_set_flag_calls++; +} + +Win16FarPtr borland_far_strdup(Win16FarPtr source) +{ + g_duplicate_source = source; + return g_duplicate_result; +} + +HWND16 win16_call_create_dialog_param( + Win16FarPtr procedure, + HINSTANCE16 instance, + Win16FarPtr template_name, + HWND16 parent, + Win16FarPtr dialog_proc, + LPARAM16 init_parameter) +{ + assert(procedure == g_win16_create_dialog_param); + assert(instance == g_win16_instance); + assert(template_name == g_expected_template); + assert(parent == g_expected_parent_window); + assert(dialog_proc == g_expected_dialog_proc); + assert(init_parameter == g_expected_init_parameter); + g_create_calls++; + return g_create_result; +} + +INT16 win16_call_dialog_box_param( + Win16FarPtr procedure, + HINSTANCE16 instance, + Win16FarPtr template_name, + HWND16 parent, + Win16FarPtr dialog_proc, + LPARAM16 init_parameter) +{ + assert(procedure == g_win16_dialog_box_param); + assert(instance == g_win16_instance); + assert(template_name == g_expected_template); + assert(parent == g_expected_parent_window); + assert(dialog_proc == g_expected_dialog_proc); + assert(init_parameter == g_expected_init_parameter); + g_modal_calls++; + win16_write_u16(g_object_windows_application, 0x0e, 0xdead); + win16_write_u16(g_object_windows_application, 0x10, 0xbeef); + return g_modal_result; +} + +int main(void) +{ + static uint8_t dgroup[0x1000]; + static uint8_t code[0x3000]; + static uint8_t dialog_bytes[80]; + static uint8_t child_bytes[80]; + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, dgroup, sizeof(dgroup), true); + win16_set_dgroup_selector(0x5000); + win16_bind_ne_segment(2, 0x6000, code, sizeof(code), false); + win16_bind_segment(0x7000, dialog_bytes, sizeof(dialog_bytes), true); + win16_bind_segment(0x7100, child_bytes, sizeof(child_bytes), true); + + g_dialog = win16_make_far_pointer(0x7000, 2); + g_child = win16_make_far_pointer(0x7100, 2); + win16_write_u16(g_dialog, 0, 0x0100); + win16_write_u16(g_dialog, 4, 0x77); + win16_write_u16(g_child, 4, 0x88); + g_close_proc = win16_make_far_pointer(0x6200, 0x1234); + win16_write_u16(win16_dgroup_pointer(0x0150), 0, + win16_far_offset(g_close_proc)); + win16_write_u16(win16_dgroup_pointer(0x0152), 0, + win16_far_selector(g_close_proc)); + + object_windows_end_modal_dialog(g_dialog, 5); + assert(g_for_each_calls == 0 && g_end_window == 0); + win16_write_u8(win16_far_add_offset(g_dialog, 0x25), 1); + object_windows_end_modal_dialog(g_dialog, 5); + assert(g_for_each_calls == 1); + assert(g_end_window == 0x77 && g_end_result == 5); + assert((win16_read_u8(win16_far_add_offset(g_child, 0x16)) & 4) != 0); + + ObjectWindowsMessage message = {0}; + win16_write_u8(win16_far_add_offset(g_dialog, 0x25), 0); + object_windows_dialog_close(g_dialog, &message); + assert(g_closed_window == g_dialog); + win16_write_u8(win16_far_add_offset(g_dialog, 0x25), 1); + object_windows_dialog_close(g_dialog, &message); + assert(g_virtual_proc == g_close_proc && g_virtual_argument == 2); + + Win16FarPtr string = win16_make_far_pointer(0x7300, 0x1111); + win16_write_u16(g_dialog, 0x1d, win16_far_offset(string)); + win16_write_u16(g_dialog, 0x1f, win16_far_selector(string)); + g_destruct_sequence = 0; + g_disposed_string = 0; + object_windows_dialog_destruct(g_dialog, 0x0200); + assert(g_destruct_sequence == 3 && g_disposed_string == string); + win16_write_u16(g_dialog, 0x1f, 0); + g_destruct_sequence = 0; + g_disposed_string = 0; + object_windows_dialog_destruct(g_dialog, 0x0200); + assert(g_destruct_sequence == 2 && g_disposed_string == 0); + Win16FarPtr text_buffer = win16_make_far_pointer(0x7400, 0x2222); + win16_write_u16(g_dialog, 0x2e, win16_far_offset(text_buffer)); + win16_write_u16(g_dialog, 0x30, win16_far_selector(text_buffer)); + win16_write_u16(g_dialog, 0x32, 0x1234); + assert(object_windows_dialog_read_text(g_dialog)); + assert(g_text_window == 0x77 && g_text_control == 0x1234); + assert(g_text_buffer == text_buffer && g_text_maximum == 0x65); + + Win16FarPtr caption = win16_make_far_pointer(0x7500, 0x0100); + Win16FarPtr label = win16_make_far_pointer(0x7500, 0x0200); + win16_write_u16(g_dialog, 0x26, win16_far_offset(caption)); + win16_write_u16(g_dialog, 0x28, win16_far_selector(caption)); + win16_write_u16(g_dialog, 0x2a, win16_far_offset(label)); + win16_write_u16(g_dialog, 0x2c, win16_far_selector(label)); + win16_write_u16(g_dialog, 0x32, 0); + g_prepare_calls = 0; + g_set_text_calls = 0; + object_windows_dialog_setup_text_fields(g_dialog); + assert(g_prepare_calls == 1 && g_caption == caption); + assert(g_set_text_calls == 2); + assert(g_set_ids[0] == 100 && g_set_texts[0] == label); + assert(g_set_ids[1] == 101 && g_set_texts[1] == text_buffer); + assert(g_send_id == 101 && g_send_message == 0x0415); + assert(g_send_wparam == 0xffff && g_send_lparam == 0); + + Win16FarPtr parent = g_child; + Win16FarPtr template_name = win16_make_far_pointer(0x7500, 0x0300); + g_duplicate_result = win16_make_far_pointer(0x7600, 0x0400); + g_constructor_entry_calls = 0; + g_clear_flag_calls = 0; + g_duplicate_source = 0; + assert(object_windows_dialog_construct( + g_dialog, 0x0120, template_name, parent) == g_dialog); + assert(g_constructor_entry_calls == 1 && g_construct_parent == parent); + assert(g_duplicate_source == template_name); + assert(win16_read_far_pointer(g_dialog, 0x1d) == g_duplicate_result); + assert(win16_read_far_pointer(g_dialog, 0x21) == 0); + assert(win16_read_u8(win16_far_add_offset(g_dialog, 0x25)) == 0); + assert(g_clear_flag_calls == 1); + + Win16FarPtr integer_template = win16_make_far_pointer(0, 0x7f02); + g_duplicate_source = 0; + (void)object_windows_dialog_construct( + g_dialog, 0, integer_template, 0); + assert(g_duplicate_source == 0); + assert(win16_read_far_pointer(g_dialog, 0x1d) == integer_template); + + g_constructor_enters = false; + assert(object_windows_dialog_construct( + g_dialog, 0x0120, template_name, parent) == g_dialog); + g_constructor_enters = true; + + g_dialog_alternate_template = 1; + g_constructor_entry_calls = 0; + Win16FarPtr input_text = win16_make_far_pointer(0x7500, 0x0500); + (void)object_windows_text_dialog_construct( + g_dialog, 0x0130, 0x1234, input_text, label, caption, parent); + assert(g_constructor_entry_calls == 2); + assert(win16_read_far_pointer(g_dialog, 0x1d) == + win16_make_far_pointer(0, 0x7f05)); + assert(win16_read_far_pointer(g_dialog, 0x26) == caption); + assert(win16_read_far_pointer(g_dialog, 0x2a) == label); + assert(win16_read_far_pointer(g_dialog, 0x2e) == input_text); + assert(win16_read_u16(win16_far_add_offset(g_dialog, 0x32)) == 0x1234); + + g_win16_instance = 0x4444; + g_win16_create_dialog_param = + win16_make_far_pointer(0x6000, 0x1000); + g_win16_dialog_box_param = + win16_make_far_pointer(0x6000, 0x2000); + g_expected_template = win16_make_far_pointer(0, 0x7f05); + g_expected_dialog_proc = win16_make_far_pointer(0x6000, 0x3000); + g_expected_init_parameter = (LPARAM16)win16_make_far_pointer( + 0x7000, 0x0040); + win16_write_u16(g_dialog, 0x12, win16_far_offset(g_expected_dialog_proc)); + win16_write_u16(g_dialog, 0x14, win16_far_selector(g_expected_dialog_proc)); + win16_write_u16(g_dialog, 0x21, (uint16_t)g_expected_init_parameter); + win16_write_u16( + g_dialog, 0x23, (uint16_t)((uint32_t)g_expected_init_parameter >> 16)); + win16_write_u16(g_dialog, 6, win16_far_offset(parent)); + win16_write_u16(g_dialog, 8, win16_far_selector(parent)); + g_expected_parent_window = 0x88; + + win16_write_u16(g_dialog, 2, 0); + g_create_result = 0x12fe; + g_create_calls = 0; + assert(object_windows_create_modeless_dialog(g_dialog) == 0x1201); + assert(g_create_calls == 1); + assert(win16_read_u16(win16_far_add_offset(g_dialog, 4)) == 0x12fe); + assert(win16_read_u8(win16_far_add_offset(g_dialog, 0x25)) == 0); + + win16_write_u16(g_dialog, 2, 0); + g_create_result = 0; + assert(object_windows_create_modeless_dialog(g_dialog) == 0); + assert(win16_read_u16(win16_far_add_offset(g_dialog, 2)) == 0xffff); + win16_set_indeterminate_u16(0xabcd); + assert(object_windows_create_modeless_dialog(g_dialog) == 0xab00); + + static uint8_t application_bytes[32]; + win16_bind_segment( + 0x7700, application_bytes, sizeof(application_bytes), true); + g_object_windows_application = win16_make_far_pointer(0x7700, 0); + Win16FarPtr previous_active = win16_make_far_pointer(0x7800, 0x1111); + win16_write_u16( + g_object_windows_application, 0x0e, win16_far_offset(previous_active)); + win16_write_u16( + g_object_windows_application, 0x10, win16_far_selector(previous_active)); + win16_write_u16(g_dialog, 2, 0); + g_modal_result = 5; + g_modal_calls = 0; + assert(object_windows_execute_modal_dialog(g_dialog) == 5); + assert(g_modal_calls == 1); + assert(win16_read_far_pointer(g_object_windows_application, 0x0e) == + previous_active); + assert(win16_read_u16(win16_far_add_offset(g_dialog, 4)) == 0); + assert(win16_read_u8(win16_far_add_offset(g_dialog, 0x25)) == 1); + + win16_write_u16(g_dialog, 2, 0); + g_modal_result = -1; + assert(object_windows_execute_modal_dialog(g_dialog) == -1); + assert(win16_read_u16(win16_far_add_offset(g_dialog, 2)) == 0xffff); + assert(object_windows_execute_modal_dialog(g_dialog) == -1); + return 0; +} diff --git a/original/reconstructed/tests/test_dispatch.c b/original/reconstructed/tests/test_dispatch.c new file mode 100644 index 0000000..64476ed --- /dev/null +++ b/original/reconstructed/tests/test_dispatch.c @@ -0,0 +1,117 @@ +#include "../tdkpin_dispatch.h" + +#include +#include + +static jmp_buf g_error_jump; +static uint16_t g_error_code; +static Win16FarPtr g_dispatched_procedure; +static Win16FarPtr g_receiver; +static Win16FarPtr g_argument; + +_Noreturn void borland_runtime_error(uint16_t code) +{ + g_error_code = code; + longjmp(g_error_jump, 1); +} + +void win16_call_dynamic_method(Win16FarPtr procedure) +{ + g_dispatched_procedure = procedure; +} + +void win16_call_dynamic_method_two_far( + Win16FarPtr procedure, Win16FarPtr receiver, Win16FarPtr argument) +{ + g_dispatched_procedure = procedure; + g_receiver = receiver; + g_argument = argument; +} + +static void write_far(uint16_t offset, Win16FarPtr pointer) +{ + win16_write_u16( + win16_dgroup_pointer(offset), 0, win16_far_offset(pointer)); + win16_write_u16( + win16_dgroup_pointer((uint16_t)(offset + 2)), + 0, + win16_far_selector(pointer)); +} + +int main(void) +{ + static uint8_t dgroup[0x1000]; + static uint8_t object[32]; + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, dgroup, sizeof(dgroup), true); + win16_set_dgroup_selector(0x5000); + win16_bind_segment(0x6000, object, sizeof(object), true); + + /* VMT 0x0100 -> derived dynamic table 0x0200. */ + win16_write_u16(win16_dgroup_pointer(0x0104), 0, 0x0200); + win16_write_u16(win16_dgroup_pointer(0x0200), 0, 0x0300); + win16_write_u16(win16_dgroup_pointer(0x0202), 0, 0xffff); + win16_write_u16(win16_dgroup_pointer(0x0204), 0, 0xffff); + win16_write_u16(win16_dgroup_pointer(0x0206), 0, 2); + win16_write_u16(win16_dgroup_pointer(0x0208), 0, 10); + win16_write_u16(win16_dgroup_pointer(0x020a), 0, 20); + write_far(0x020c, win16_make_far_pointer(0x7000, 0x1111)); + write_far(0x0210, win16_make_far_pointer(0x7000, 0x2222)); + + win16_write_u16(win16_dgroup_pointer(0x0300), 0, 0); + win16_write_u16(win16_dgroup_pointer(0x0302), 0, 0xffff); + win16_write_u16(win16_dgroup_pointer(0x0304), 0, 0xffff); + win16_write_u16(win16_dgroup_pointer(0x0306), 0, 1); + win16_write_u16(win16_dgroup_pointer(0x0308), 0, 30); + write_far(0x030a, win16_make_far_pointer(0x7100, 0x3333)); + + Win16FarPtr slot = borland_resolve_dynamic_method_slot(0x0100, 20); + assert(slot == win16_dgroup_pointer(0x0210)); + assert(win16_read_u16(win16_dgroup_pointer(0x0202)) == 20); + assert(win16_read_u16(win16_dgroup_pointer(0x0204)) == 0x0210); + + /* The cache bypasses the now-corrupted method-count word. */ + win16_write_u16(win16_dgroup_pointer(0x0206), 0, 0xffff); + assert(borland_find_dynamic_method(0x0100, 20) == slot); + win16_write_u16(win16_dgroup_pointer(0x0206), 0, 2); + + slot = borland_resolve_dynamic_method_slot(0x0100, 30); + assert(slot == win16_dgroup_pointer(0x030a)); + assert(win16_read_u16(win16_dgroup_pointer(0x0302)) == 30); + assert(win16_read_u16(win16_dgroup_pointer(0x0304)) == 0x030a); + + g_dispatched_procedure = 0; + borland_dispatch_dynamic_method(0x0100, 10); + assert(g_dispatched_procedure == + win16_make_far_pointer(0x7000, 0x1111)); + + /* Generated callers use the receiver VMT and preserve both far args. */ + win16_write_u16(win16_dgroup_pointer(0x0404), 0, 0x0500); + win16_write_u16(win16_dgroup_pointer(0x0500), 0, 0); + win16_write_u16(win16_dgroup_pointer(0x0502), 0, 0xffff); + win16_write_u16(win16_dgroup_pointer(0x0504), 0, 0xffff); + win16_write_u16(win16_dgroup_pointer(0x0506), 0, 2); + win16_write_u16(win16_dgroup_pointer(0x0508), 0, 0x8002); + win16_write_u16(win16_dgroup_pointer(0x050a), 0, 0x0006); + write_far(0x050c, win16_make_far_pointer(0x7200, 0x4444)); + write_far(0x0510, win16_make_far_pointer(0x7300, 0x5555)); + Win16FarPtr receiver = win16_make_far_pointer(0x6000, 4); + Win16FarPtr argument = win16_make_far_pointer(0x6100, 0x1234); + win16_write_u16(receiver, 0, 0x0400); + + borland_dispatch_method_8002(receiver, argument); + assert(g_dispatched_procedure == + win16_make_far_pointer(0x7200, 0x4444)); + assert(g_receiver == receiver && g_argument == argument); + borland_dispatch_method_0006(receiver, argument); + assert(g_dispatched_procedure == + win16_make_far_pointer(0x7300, 0x5555)); + assert(g_receiver == receiver && g_argument == argument); + + if (setjmp(g_error_jump) == 0) { + (void)borland_resolve_dynamic_method_slot(0x0100, 99); + assert(false); + } + assert(g_error_code == 210); + return 0; +} diff --git a/original/reconstructed/tests/test_flipper_bitmap_geometry.c b/original/reconstructed/tests/test_flipper_bitmap_geometry.c new file mode 100644 index 0000000..98f5a66 --- /dev/null +++ b/original/reconstructed/tests/test_flipper_bitmap_geometry.c @@ -0,0 +1,280 @@ +#include "../tdkpin_flippers.h" + +#include "../tdkpin_collision_records.h" + +#include +#include +#include + +enum { + RECORDS_BASE = 0x095b, + LEFT_OUTER = 66, + LEFT_EDGE = 67, + LEFT_INNER = 68, + RIGHT_INNER = 81, + RIGHT_EDGE = 82, + RIGHT_OUTER = 83, +}; + +static uint8_t g_dgroup[0x5000]; +static uint8_t g_objects[0x1000]; +static uint8_t g_stack[0x1000]; +static Win16FarPtr g_receiver; +static unsigned g_get_dc_calls; +static unsigned g_release_dc_calls; +static unsigned g_restore_a_calls; +static unsigned g_restore_b_calls; +static unsigned g_present_calls; +static bool g_expect_parent_stack_untouched; +static uint16_t g_expected_parent_bp; + +int32_t borland_multiply_i32(int32_t left, int32_t right) +{ + return (int32_t)((uint32_t)left * (uint32_t)right); +} + +HDC16 GetDC16(HWND16 window) +{ + assert(window == 0x2222); + if (g_expect_parent_stack_untouched) { + assert(win16_read_stack_u16( + (uint16_t)(g_expected_parent_bp - 8)) == 0xaaaa); + assert(win16_read_stack_u16( + (uint16_t)(g_expected_parent_bp - 6)) == 0xbbbb); + assert(win16_read_stack_u16( + (uint16_t)(g_expected_parent_bp - 4)) == 0xcccc); + assert(win16_read_stack_u16( + (uint16_t)(g_expected_parent_bp - 2)) == 0xdddd); + g_expect_parent_stack_untouched = false; + } + g_get_dc_calls++; + return 0x3333; +} + +INT16 ReleaseDC16(HWND16 window, HDC16 dc) +{ + assert(window == 0x2222 && dc == 0x3333); + g_release_dc_calls++; + return 1; +} + +static void assert_region( + INT16 height, INT16 width, INT16 y, INT16 x, HDC16 dc) +{ + assert(dc == 0x3333); + if (height == 52) { + assert(width == 47 && y == 373 && x == 93); + } else { + assert(height == 53 && width == 45 && y == 372 && x == 175); + } +} + +void tdkpin_restore_background_region_a( + INT16 height, INT16 width, INT16 y, INT16 x, HDC16 dc) +{ + assert_region(height, width, y, x, dc); + g_restore_a_calls++; +} + +void tdkpin_restore_background_region_b( + INT16 height, INT16 width, INT16 y, INT16 x, HDC16 dc) +{ + assert_region(height, width, y, x, dc); + g_restore_b_calls++; +} + +void tdkpin_present_background_region( + INT16 height, INT16 width, INT16 y, INT16 x, HDC16 dc) +{ + assert_region(height, width, y, x, dc); + g_present_calls++; +} + +static Win16FarPtr record(uint16_t id) +{ + return win16_dgroup_pointer((uint16_t)( + RECORDS_BASE + id * sizeof(TdkpinCollisionRecord))); +} + +static void put(uint16_t id, size_t offset, int32_t value) +{ + win16_write_u32(record(id), (uint16_t)offset, (uint32_t)value); +} + +static int32_t get(uint16_t id, size_t offset) +{ + return (int32_t)win16_read_u32( + win16_far_add_offset(record(id), (uint16_t)offset)); +} + +static void put_points( + uint16_t id, + int32_t point1_x, + int32_t point1_y, + int32_t point2_x, + int32_t point2_y) +{ + put(id, offsetof(TdkpinCollisionRecord, point1_x_milli), point1_x); + put(id, offsetof(TdkpinCollisionRecord, point1_y_milli), point1_y); + put(id, offsetof(TdkpinCollisionRecord, point2_x_milli), point2_x); + put(id, offsetof(TdkpinCollisionRecord, point2_y_milli), point2_y); +} + +static void assert_points( + uint16_t id, + int32_t point1_x, + int32_t point1_y, + int32_t point2_x, + int32_t point2_y) +{ + assert(get(id, offsetof(TdkpinCollisionRecord, point1_x_milli)) == + point1_x); + assert(get(id, offsetof(TdkpinCollisionRecord, point1_y_milli)) == + point1_y); + assert(get(id, offsetof(TdkpinCollisionRecord, point2_x_milli)) == + point2_x); + assert(get(id, offsetof(TdkpinCollisionRecord, point2_y_milli)) == + point2_y); +} + +static void put_bounds( + uint16_t id, + int32_t minimum_x, + int32_t minimum_y, + int32_t maximum_x, + int32_t maximum_y) +{ + put(id, offsetof(TdkpinCollisionRecord, bounds_min_x_milli), minimum_x); + put(id, offsetof(TdkpinCollisionRecord, bounds_min_y_milli), minimum_y); + put(id, offsetof(TdkpinCollisionRecord, bounds_max_x_milli), maximum_x); + put(id, offsetof(TdkpinCollisionRecord, bounds_max_y_milli), maximum_y); +} + +static void assert_bounds( + uint16_t id, + int32_t minimum_x, + int32_t minimum_y, + int32_t maximum_x, + int32_t maximum_y) +{ + assert(get(id, offsetof(TdkpinCollisionRecord, bounds_min_x_milli)) == + minimum_x); + assert(get(id, offsetof(TdkpinCollisionRecord, bounds_min_y_milli)) == + minimum_y); + assert(get(id, offsetof(TdkpinCollisionRecord, bounds_max_x_milli)) == + maximum_x); + assert(get(id, offsetof(TdkpinCollisionRecord, bounds_max_y_milli)) == + maximum_y); +} + +static void prepare_fixture(void) +{ + memset(g_dgroup, 0, sizeof(g_dgroup)); + memset(g_objects, 0, sizeof(g_objects)); + memset(g_stack, 0, sizeof(g_stack)); + win16_reset_segment_bindings(); + win16_bind_segment(0x7000, g_objects, sizeof(g_objects), true); + win16_bind_segment(0x7200, g_dgroup, sizeof(g_dgroup), true); + win16_bind_segment(0x7300, g_stack, sizeof(g_stack), true); + win16_set_dgroup_selector(0x7200); + win16_set_stack_state(0x7300, 0); + g_receiver = win16_make_far_pointer(0x7000, 0); + win16_write_u16(g_receiver, 4, 0x2222); + g_get_dc_calls = 0; + g_release_dc_calls = 0; + g_restore_a_calls = 0; + g_restore_b_calls = 0; + g_present_calls = 0; + g_expect_parent_stack_untouched = false; + g_expected_parent_bp = 0; +} + +static void prepare_static_link(uint16_t parent_bp, uint16_t caller_bp) +{ + win16_write_stack_u16((uint16_t)(parent_bp + 6), caller_bp); + win16_write_stack_u16( + (uint16_t)(caller_bp + 6), win16_far_offset(g_receiver)); + win16_write_stack_u16( + (uint16_t)(caller_bp + 8), win16_far_selector(g_receiver)); + win16_write_stack_u16((uint16_t)(parent_bp - 8), 0xaaaa); + win16_write_stack_u16((uint16_t)(parent_bp - 6), 0xbbbb); + win16_write_stack_u16((uint16_t)(parent_bp - 4), 0xcccc); + win16_write_stack_u16((uint16_t)(parent_bp - 2), 0xdddd); + g_expect_parent_stack_untouched = true; + g_expected_parent_bp = parent_bp; +} + +static void test_left_flipper_raise(void) +{ + const uint16_t parent_bp = 0x0200; + const uint16_t caller_bp = 0x0300; + prepare_fixture(); + prepare_static_link(parent_bp, caller_bp); + put_points(LEFT_OUTER, 100000, 200000, 300000, 400000); + put_bounds(LEFT_EDGE, 10000, 20000, 100000, 200000); + put_points(LEFT_EDGE, 30000, 40000, 0, 0); + put_points(LEFT_INNER, 300000, 100000, 100000, 400000); + win16_write_u16(g_receiver, 0x0bd4, 0); + + tdkpin_move_flipper_bitmap_geometry(parent_bp, 1, 1); + + assert_points(LEFT_OUTER, 114000, 204000, 310000, 444000); + assert_bounds(LEFT_OUTER, 109000, 199000, 315000, 449000); + assert_points(LEFT_EDGE, 31000, 82000, 0, 0); + assert_bounds(LEFT_EDGE, 12000, 63000, 98000, 157000); + assert_points(LEFT_INNER, 293000, 143000, 81000, 406000); + assert_bounds(LEFT_INNER, 76000, 138000, 298000, 411000); + assert(win16_read_stack_u16((uint16_t)(parent_bp - 4)) == 0); + assert(win16_read_stack_u16((uint16_t)(parent_bp - 2)) == 0); + assert(win16_read_stack_u16((uint16_t)(parent_bp - 8)) == 0xa7f8); + assert(win16_read_stack_u16((uint16_t)(parent_bp - 6)) == 0); + assert(g_restore_b_calls == 1 && g_restore_a_calls == 0); + assert(g_present_calls == 1); + assert(g_get_dc_calls == 1 && g_release_dc_calls == 1); +} + +static void test_right_flipper_lower(void) +{ + const uint16_t parent_bp = 0x0200; + const uint16_t caller_bp = 0x0300; + prepare_fixture(); + prepare_static_link(parent_bp, caller_bp); + put_points(RIGHT_OUTER, 100000, 200000, 300000, 400000); + put_bounds(RIGHT_EDGE, 10000, 200000, 100000, 400000); + put_points(RIGHT_EDGE, 30000, 200000, 0, 0); + put_points(RIGHT_INNER, 300000, 400000, 100000, 200000); + win16_write_u16(g_receiver, 0x0bd6, 1); + + tdkpin_move_flipper_bitmap_geometry(parent_bp, -1, 2); + + assert_points(RIGHT_OUTER, 111000, 155000, 316000, 397000); + assert_bounds(RIGHT_OUTER, 106000, 150000, 321000, 402000); + assert_points(RIGHT_EDGE, 32000, 157000, 0, 0); + assert_bounds(RIGHT_EDGE, 12000, 157000, 98000, 443000); + assert_points(RIGHT_INNER, 281000, 394000, 94000, 151000); + assert_bounds(RIGHT_INNER, 89000, 146000, 286000, 399000); + assert(win16_read_stack_u16((uint16_t)(parent_bp - 8)) == 0x5808); + assert(win16_read_stack_u16((uint16_t)(parent_bp - 6)) == 0xffff); + assert(g_restore_a_calls == 1 && g_restore_b_calls == 0); + assert(g_present_calls == 1); + assert(g_get_dc_calls == 1 && g_release_dc_calls == 1); +} + +static void test_unknown_flipper_only_balances_dc(void) +{ + prepare_fixture(); + win16_write_u32(record(66), 0, 0x12345678); + tdkpin_move_flipper_bitmap_geometry_for_receiver(g_receiver, 7, 3); + assert(win16_read_u32(record(66)) == 0x12345678); + assert(g_restore_a_calls == 0 && g_restore_b_calls == 0); + assert(g_present_calls == 0); + assert(g_get_dc_calls == 1 && g_release_dc_calls == 1); +} + +int main(void) +{ + test_left_flipper_raise(); + test_right_flipper_lower(); + test_unknown_flipper_only_balances_dc(); + return 0; +} diff --git a/original/reconstructed/tests/test_flipper_collision.c b/original/reconstructed/tests/test_flipper_collision.c new file mode 100644 index 0000000..55f4929 --- /dev/null +++ b/original/reconstructed/tests/test_flipper_collision.c @@ -0,0 +1,279 @@ +#include "../tdkpin_flippers.h" + +#include "../tdkpin_borland_runtime.h" +#include "../tdkpin_collision_records.h" +#include "../tdkpin_real48.h" + +#include +#include +#include + +static uint8_t g_dgroup[0x5000]; +static uint8_t g_objects[0x1000]; +static uint8_t g_stack[0x1000]; +static Win16FarPtr g_receiver; +static uint16_t g_sounds[4]; +static unsigned g_sound_count; +static unsigned g_move_calls; +static int32_t g_move_x; +static int32_t g_move_y; +static unsigned g_load_calls; +static unsigned g_save_calls; + +uint8_t g_borland_cpu_level = 2; + +_Noreturn void borland_runtime_error(uint16_t code) +{ + (void)code; + abort(); +} + +_Noreturn void win16_integer_divide_fault(void) +{ + abort(); +} + +void tdkpin_play_sound_if_not_tilted(uint16_t sound_number) +{ + assert(g_sound_count < sizeof(g_sounds) / sizeof(g_sounds[0])); + g_sounds[g_sound_count++] = sound_number; +} + +void tdkpin_move_ball_and_render( + uint16_t caller_bp, int32_t delta_x, int32_t delta_y) +{ + assert(caller_bp == 0x0300); + g_move_calls++; + g_move_x = delta_x; + g_move_y = delta_y; +} + +void tdkpin_load_ball_slot(uint16_t caller_bp, uint16_t slot) +{ + assert(caller_bp == 0x0300); + assert(slot == g_load_calls); + g_load_calls++; +} + +void tdkpin_save_ball_slot(uint16_t caller_bp, uint16_t slot) +{ + assert(caller_bp == 0x0300); + assert(slot == g_save_calls); + g_save_calls++; +} + +static Win16FarPtr record(uint16_t id) +{ + return win16_dgroup_pointer((uint16_t)( + 0x095b + id * sizeof(TdkpinCollisionRecord))); +} + +static void write_i32(uint16_t id, size_t offset, int32_t value) +{ + win16_write_u32(record(id), (uint16_t)offset, (uint32_t)value); +} + +static void write_real48( + uint16_t id, size_t offset, BorlandReal48 value) +{ + Win16FarPtr destination = win16_far_add_offset( + record(id), (uint16_t)offset); + for (uint16_t index = 0; index < sizeof(value.bytes); index++) { + win16_write_u8( + win16_far_add_offset(destination, index), value.bytes[index]); + } +} + +static void write_points( + uint16_t id, + int32_t point1_x, + int32_t point1_y, + int32_t point2_x, + int32_t point2_y) +{ + write_i32(id, offsetof(TdkpinCollisionRecord, point1_x_milli), point1_x); + write_i32(id, offsetof(TdkpinCollisionRecord, point1_y_milli), point1_y); + write_i32(id, offsetof(TdkpinCollisionRecord, point2_x_milli), point2_x); + write_i32(id, offsetof(TdkpinCollisionRecord, point2_y_milli), point2_y); +} + +static void prepare_fixture(void) +{ + static const BorlandReal48 one_half = + {{0x80, 0, 0, 0, 0, 0}}; + static const BorlandReal48 one_quarter = + {{0x7f, 0, 0, 0, 0, 0}}; + static const BorlandReal48 three_quarters = + {{0x80, 0, 0, 0, 0, 0x40}}; + static const BorlandReal48 zero = + {{0, 0, 0, 0, 0, 0}}; + memset(g_dgroup, 0, sizeof(g_dgroup)); + memset(g_objects, 0, sizeof(g_objects)); + memset(g_stack, 0, sizeof(g_stack)); + win16_reset_segment_bindings(); + win16_bind_segment(0x7000, g_objects, sizeof(g_objects), true); + win16_bind_segment(0x7200, g_dgroup, sizeof(g_dgroup), true); + win16_bind_segment(0x7300, g_stack, sizeof(g_stack), true); + win16_set_dgroup_selector(0x7200); + win16_set_stack_state(0x7300, 0); + g_receiver = win16_make_far_pointer(0x7000, 0); + win16_write_stack_u16(0x0306, win16_far_offset(g_receiver)); + win16_write_stack_u16(0x0308, win16_far_selector(g_receiver)); + win16_write_u8(win16_far_add_offset(g_receiver, 0x61), 1); + win16_write_u32(g_receiver, 0x56, 1000); + + write_points(65, 103000, 397000, 0, 0); + write_real48( + 65, + offsetof(TdkpinCollisionRecord, radius_milli), + borland_i32_to_real48(15000)); + write_points(66, 112000, 386000, 141000, 413000); + write_real48( + 66, offsetof(TdkpinCollisionRecord, response_normal), one_half); + write_points(68, 130000, 427000, 97000, 411000); + write_real48( + 68, offsetof(TdkpinCollisionRecord, response_normal), one_quarter); + + write_points(80, 210000, 397000, 0, 0); + write_real48( + 80, + offsetof(TdkpinCollisionRecord, radius_milli), + borland_i32_to_real48(15000)); + write_points(81, 216000, 411000, 177000, 427000); + write_real48( + 81, offsetof(TdkpinCollisionRecord, response_normal), three_quarters); + write_points(83, 172000, 413000, 201000, 386000); + write_real48( + 83, offsetof(TdkpinCollisionRecord, response_normal), zero); + + g_sound_count = 0; + g_move_calls = 0; + g_move_x = 0; + g_move_y = 0; + g_load_calls = 0; + g_save_calls = 0; +} + +static void set_ball(int32_t x, int32_t y, int32_t vx, int32_t vy) +{ + win16_write_u32(win16_dgroup_pointer(0x07d3), 0, (uint32_t)x); + win16_write_u32(win16_dgroup_pointer(0x07d7), 0, (uint32_t)y); + win16_write_u32(g_receiver, 0x0baa, (uint32_t)vx); + win16_write_u32(g_receiver, 0x0bae, (uint32_t)vy); +} + +static void test_left_negative_contact(void) +{ + prepare_fixture(); + set_ball(104000, 384000, 1000, 2000); + tdkpin_move_flipper_collision_geometry(0x0300, -1, 1, 0); + assert((int32_t)win16_read_u32( + win16_far_add_offset(g_receiver, 0x0baa)) == 1266); + assert((int32_t)win16_read_u32( + win16_far_add_offset(g_receiver, 0x0bae)) == 1511); + assert(g_move_x == -6703 && g_move_y == -8000); + assert(g_sound_count == 1 && g_sounds[0] == 21); + assert(g_move_calls == 1); +} + +static void test_right_positive_contact(void) +{ + prepare_fixture(); + set_ball(209000, 419000, -1000, 2000); + tdkpin_move_flipper_collision_geometry(0x0300, 1, 2, 0); + assert((int32_t)win16_read_u32( + win16_far_add_offset(g_receiver, 0x0baa)) == -737); + assert((int32_t)win16_read_u32( + win16_far_add_offset(g_receiver, 0x0bae)) == 2263); + assert(g_move_x == -8549 && g_move_y == 26250); + assert(g_sound_count == 1 && g_sounds[0] == 21); + assert(g_move_calls == 1); +} + +static void test_left_positive_contact(void) +{ + prepare_fixture(); + set_ball(104000, 421000, 1000, 2000); + tdkpin_move_flipper_collision_geometry(0x0300, 1, 1, 0); + assert((int32_t)win16_read_u32( + win16_far_add_offset(g_receiver, 0x0baa)) == 622); + assert((int32_t)win16_read_u32( + win16_far_add_offset(g_receiver, 0x0bae)) == 2320); + assert(g_move_x == 5414 && g_move_y == 20193); + assert(g_move_calls == 1); +} + +static void test_right_negative_contact(void) +{ + prepare_fixture(); + set_ball(209000, 385000, -1000, 2000); + tdkpin_move_flipper_collision_geometry(0x0300, -1, 2, 0); + assert((int32_t)win16_read_u32( + win16_far_add_offset(g_receiver, 0x0baa)) == -1280); + assert((int32_t)win16_read_u32( + win16_far_add_offset(g_receiver, 0x0bae)) == 1560); + assert(g_move_x == 7385 && g_move_y == -9000); + assert(g_move_calls == 1); +} + +static void test_vertical_edge_fallbacks(void) +{ + prepare_fixture(); + write_i32( + 66, + offsetof(TdkpinCollisionRecord, point2_x_milli), + 73000); + set_ball(94000, 371000, 1000, 2000); + tdkpin_move_flipper_collision_geometry(0x0300, -1, 1, 0); + assert(g_move_calls == 1 && g_move_y == -1000); + + prepare_fixture(); + write_i32( + 81, + offsetof(TdkpinCollisionRecord, point1_x_milli), + 240000); + set_ball(197000, 455000, -1000, 2000); + tdkpin_move_flipper_collision_geometry(0x0300, 1, 2, 0); + assert(g_move_calls == 1 && g_move_y == 1000); +} + +static void test_multiball_slot_loop_and_invalid_flipper(void) +{ + prepare_fixture(); + win16_write_u8(win16_far_add_offset(g_receiver, 0x61), 2); + set_ball(300000, 300000, 1000, 2000); + tdkpin_move_flipper_collision_geometry(0x0300, -1, 1, 0); + assert(g_load_calls == 2 && g_save_calls == 2); + assert(g_move_calls == 0); + + prepare_fixture(); + win16_write_u8(win16_far_add_offset(g_receiver, 0x61), 0); + tdkpin_move_flipper_collision_geometry(0x0300, 7, 3, 0); + assert(g_sound_count == 1 && g_sounds[0] == 21); + assert(g_move_calls == 0 && g_load_calls == 0 && g_save_calls == 0); +} + +static void test_gates(void) +{ + prepare_fixture(); + set_ball(300000, 300000, 1000, 2000); + tdkpin_move_flipper_collision_geometry(0x0300, -1, 1, 0); + assert(g_move_calls == 0); + + prepare_fixture(); + set_ball(104000, 384000, 1000, 2000); + tdkpin_move_flipper_collision_geometry(0x0300, -1, 1, 1); + assert(g_move_calls == 0); +} + +int main(void) +{ + test_left_negative_contact(); + test_right_positive_contact(); + test_left_positive_contact(); + test_right_negative_contact(); + test_vertical_edge_fallbacks(); + test_multiball_slot_loop_and_invalid_flipper(); + test_gates(); + return 0; +} diff --git a/original/reconstructed/tests/test_flippers.c b/original/reconstructed/tests/test_flippers.c new file mode 100644 index 0000000..f946900 --- /dev/null +++ b/original/reconstructed/tests/test_flippers.c @@ -0,0 +1,81 @@ +#include "../tdkpin_flippers.h" + +#include +#include + +static uint8_t g_stack[0x400]; +static uint8_t g_object[0x0c00]; +static Win16FarPtr g_receiver; +static unsigned g_collision_calls; +static unsigned g_bitmap_calls; +static int32_t g_deltas[4]; +static uint16_t g_flippers[4]; + +void tdkpin_move_flipper_collision_geometry( + uint16_t caller_bp, int32_t delta, uint16_t flipper, uint16_t mode) +{ + assert(caller_bp == 0x0100 && mode == 0); + g_deltas[g_collision_calls] = delta; + g_flippers[g_collision_calls] = flipper; + g_collision_calls++; +} + +void tdkpin_move_flipper_bitmap_geometry_for_receiver( + Win16FarPtr receiver, int32_t delta, uint16_t flipper) +{ + assert(receiver == g_receiver); + assert(g_bitmap_calls < g_collision_calls); + assert(delta == g_deltas[g_bitmap_calls]); + assert(flipper == g_flippers[g_bitmap_calls]); + g_bitmap_calls++; +} + +static void prepare_fixture(void) +{ + memset(g_stack, 0, sizeof(g_stack)); + memset(g_object, 0, sizeof(g_object)); + win16_reset_segment_bindings(); + win16_bind_segment(0x7000, g_stack, sizeof(g_stack), true); + win16_bind_segment(0x7100, g_object, sizeof(g_object), true); + win16_set_stack_state(0x7000, 0); + g_receiver = win16_make_far_pointer(0x7100, 0); + win16_write_stack_u16(0x0106, win16_far_offset(g_receiver)); + win16_write_stack_u16(0x0108, win16_far_selector(g_receiver)); + g_collision_calls = 0; + g_bitmap_calls = 0; + memset(g_deltas, 0, sizeof(g_deltas)); + memset(g_flippers, 0, sizeof(g_flippers)); +} + +int main(void) +{ + prepare_fixture(); + win16_write_u8(win16_far_add_offset(g_receiver, 0x0bda), 1); + win16_write_u8(win16_far_add_offset(g_receiver, 0x0bdb), 1); + tdkpin_update_flippers(0x0100); + assert(win16_read_u16(win16_far_add_offset(g_receiver, 0x0bd4)) == 1); + assert(win16_read_u16(win16_far_add_offset(g_receiver, 0x0bd6)) == 1); + assert(g_collision_calls == 2 && g_bitmap_calls == 2); + assert(g_deltas[0] == -1 && g_flippers[0] == 1); + assert(g_deltas[1] == -1 && g_flippers[1] == 2); + + g_collision_calls = 0; + g_bitmap_calls = 0; + tdkpin_update_flippers(0x0100); + assert(g_collision_calls == 0 && g_bitmap_calls == 0); + + win16_write_u8(win16_far_add_offset(g_receiver, 0x0bda), 0); + win16_write_u8(win16_far_add_offset(g_receiver, 0x0bdb), 0); + tdkpin_update_flippers(0x0100); + assert(win16_read_u16(win16_far_add_offset(g_receiver, 0x0bd4)) == 0); + assert(win16_read_u16(win16_far_add_offset(g_receiver, 0x0bd6)) == 0); + assert(g_collision_calls == 2 && g_bitmap_calls == 2); + assert(g_deltas[0] == 1 && g_flippers[0] == 1); + assert(g_deltas[1] == 1 && g_flippers[1] == 2); + + g_collision_calls = 0; + g_bitmap_calls = 0; + tdkpin_update_flippers(0x0100); + assert(g_collision_calls == 0 && g_bitmap_calls == 0); + return 0; +} diff --git a/original/reconstructed/tests/test_game_application.c b/original/reconstructed/tests/test_game_application.c new file mode 100644 index 0000000..ee9cd8e --- /dev/null +++ b/original/reconstructed/tests/test_game_application.c @@ -0,0 +1,150 @@ +#include "../tdkpin_game_application.h" + +#include +#include + +static unsigned g_sequence; +static Win16FarPtr g_application; +static uint8_t g_multimedia_args[3]; +static uint16_t g_module_offset; +static uint16_t g_module_selector; +HINSTANCE16 g_win16_previous_instance; +HINSTANCE16 g_win16_instance; +Win16FarPtr g_win16_message_box; +static Win16FarPtr g_constructed_main; +static Win16FarPtr g_constructor_title; +static INT16 g_message_box_result; +static uint16_t g_exit_status; +static jmp_buf g_exit_jump; +static unsigned g_base_builder_calls; + +void object_windows_application_initialize(Win16FarPtr application) +{ + assert(++g_sequence == 1); + assert(application == g_application); +} + +uint8_t multimedia_initialize_export( + uint8_t argument_1, + uint8_t argument_2, + uint8_t argument_3, + uint16_t argument_4, + uint16_t argument_5) +{ + assert(++g_sequence == 2); + g_multimedia_args[0] = argument_1; + g_multimedia_args[1] = argument_2; + g_multimedia_args[2] = argument_3; + g_module_offset = argument_4; + g_module_selector = argument_5; + return 0; +} + +Win16FarPtr tdkpin_main_window_construct( + Win16FarPtr object, + uint16_t vmt, + Win16FarPtr title, + Win16FarPtr parent) +{ + assert(object == 0 && vmt == 0x009e && parent == 0); + g_constructor_title = title; + return g_constructed_main; +} + +INT16 win16_call_message_box_far( + Win16FarPtr procedure, + HWND16 owner, + Win16FarPtr text, + Win16FarPtr caption, + UINT16 type) +{ + assert(procedure == g_win16_message_box && owner == 0); + assert(text == win16_make_far_pointer(0x5000, 0x0245)); + assert(caption == win16_make_far_pointer(0x5000, 0x022c)); + assert(type == 0x2010); + return g_message_box_result; +} + +_Noreturn void borland_runtime_exit(uint16_t status) +{ + g_exit_status = status; + longjmp(g_exit_jump, 1); +} + +void object_windows_build_window_class( + Win16FarPtr window, WNDCLASS16 *window_class) +{ + assert(window == g_application); + *window_class = (WNDCLASS16){.style = 3, .background_brush = 6}; + g_base_builder_calls++; +} + +HICON16 LoadIcon16(HINSTANCE16 instance, Win16FarPtr resource) +{ + assert(instance == g_win16_instance); + assert(resource == win16_make_far_pointer(0, 0x03e4)); + return 0x1111; +} + +HCURSOR16 LoadCursor16(HINSTANCE16 instance, Win16FarPtr resource) +{ + assert(instance == 0 && resource == win16_make_far_pointer(0, 0x7f00)); + return 0x2222; +} + +HGDIOBJ16 GetStockObject16(INT16 object) +{ + assert(object == 0 || object == 5); + return (HGDIOBJ16)(0x3000 + object); +} + +int main(void) +{ + static uint8_t dgroup[0x1000]; + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, dgroup, sizeof(dgroup), true); + win16_set_dgroup_selector(0x5000); + g_application = win16_make_far_pointer(0x7000, 2); + g_sequence = 0; + tdkpin_application_init_instance(g_application); + assert(g_sequence == 2); + assert(g_multimedia_args[0] == 1 && g_multimedia_args[1] == 1); + assert(g_multimedia_args[2] == 1); + assert(g_module_offset == 0x0222 && g_module_selector == 0x5000); + + static uint8_t application_bytes[32]; + win16_bind_segment( + 0x7000, application_bytes, sizeof(application_bytes), true); + g_application = win16_make_far_pointer(0x7000, 2); + g_win16_previous_instance = 0; + g_constructed_main = win16_make_far_pointer(0x7100, 0x1234); + tdkpin_application_init_application(g_application); + assert(g_constructor_title == win16_make_far_pointer(0x5000, 0x022c)); + assert(win16_read_far_pointer(g_application, 8) == g_constructed_main); + + g_win16_previous_instance = 1; + g_win16_message_box = win16_make_far_pointer(0x6000, 0x1111); + g_message_box_result = 1; + g_exit_status = 0xffff; + if (setjmp(g_exit_jump) == 0) { + tdkpin_application_init_application(g_application); + assert(false); + } + assert(g_exit_status == 0); + + WNDCLASS16 descriptor; + g_win16_instance = 0x4444; + g_base_builder_calls = 0; + tdkpin_build_main_window_class(g_application, &descriptor); + assert(descriptor.style == 0x3000); + assert(descriptor.icon == 0x1111 && descriptor.cursor == 0x2222); + assert(descriptor.background_brush == 0x3000); + assert(descriptor.instance == 0x4444); + assert(descriptor.class_extra_bytes == 0 && descriptor.window_extra_bytes == 0); + tdkpin_build_stock_brush_class_a(g_application, &descriptor); + assert(descriptor.style == 0x3803 && descriptor.background_brush == 0x3005); + tdkpin_build_stock_brush_class_b(g_application, &descriptor); + assert(descriptor.style == 0x3803 && descriptor.background_brush == 0x3005); + assert(g_base_builder_calls == 3); + return 0; +} diff --git a/original/reconstructed/tests/test_game_assets.c b/original/reconstructed/tests/test_game_assets.c new file mode 100644 index 0000000..1e82acf --- /dev/null +++ b/original/reconstructed/tests/test_game_assets.c @@ -0,0 +1,75 @@ +#include "../tdkpin_game_assets.h" + +#include +#include + +static uint8_t g_stack[0x400]; +static unsigned g_step; +static INT16 g_expected_y; + +HDC16 CreateCompatibleDC16(HDC16 dc) +{ + assert(++g_step == 1 && dc == 0x1111); + return 0x2222; +} + +HGDIOBJ16 SelectObject16(HDC16 dc, HGDIOBJ16 object) +{ + assert(dc == 0x2222); + if (++g_step == 2) { + assert(object == 0x3333); + return 0x4444; + } + assert(g_step == 4 && object == 0x4444); + return 0x3333; +} + +BOOL16 BitBlt16( + HDC16 destination, + INT16 destination_x, + INT16 destination_y, + INT16 width, + INT16 height, + HDC16 source, + INT16 source_x, + INT16 source_y, + uint32_t raster_operation) +{ + assert(++g_step == 3); + assert(destination == 0x1111 && source == 0x2222); + assert(destination_x == 13 && destination_y == g_expected_y); + assert(width == 328 && height == 202); + assert(source_x == 0 && source_y == 0); + assert(raster_operation == 0x00cc0020); + return 1; +} + +BOOL16 DeleteObject16(HGDIOBJ16 object) +{ + assert(++g_step == 5 && object == 0x2222); + return 1; +} + +static void run_stage(uint8_t stage, INT16 expected_y) +{ + memset(g_stack, 0, sizeof(g_stack)); + Win16FarPtr frame = win16_make_far_pointer(0x6000, 0x100); + win16_write_u16(frame, 0x0e, 0x1111); + win16_write_u16(frame, 0xfffe, 0x3333); + g_step = 0; + g_expected_y = expected_y; + tdkpin_draw_loading_stage(frame, stage); + assert(g_step == 5); + assert(win16_read_u16(win16_far_add_offset(frame, 0xfff4)) == 0x2222); + assert(win16_read_u16(win16_far_add_offset(frame, 0xfffc)) == 0x4444); +} + +int main(void) +{ + win16_reset_segment_bindings(); + win16_bind_segment(0x6000, g_stack, sizeof(g_stack), true); + run_stage(1, 0); + run_stage(35, 238); + run_stage(0, -7); + return 0; +} diff --git a/original/reconstructed/tests/test_game_setup.c b/original/reconstructed/tests/test_game_setup.c new file mode 100644 index 0000000..2611076 --- /dev/null +++ b/original/reconstructed/tests/test_game_setup.c @@ -0,0 +1,370 @@ +#include "../tdkpin_game_setup.h" + +#include +#include +#include + +static uint8_t g_dgroup[0x5000]; +static uint8_t g_window_bytes[0x0c00]; +static uint8_t g_code[0x300]; +static Win16FarPtr g_window; +static uint32_t g_heap_free; +static uint16_t g_language; +static uint16_t g_speed; +static Win16FarPtr g_timer_result; +static unsigned g_setup_window_calls; +static unsigned g_palette_realize_calls; +static unsigned g_palette_load_calls; +static unsigned g_palette_create_calls; +static unsigned g_timer_calls; +static unsigned g_collision_calls; +static unsigned g_quad_calls; +static unsigned g_message_calls; +static unsigned g_close_calls; +static uint16_t g_collision_ids[177]; +static uint8_t g_final_active[176]; +static uint16_t g_final_contact[176]; +static TdkpinWordQuad g_quads[21]; +static Win16FarPtr g_last_message_text; +static HWND16 g_last_message_owner; +static jmp_buf g_exit_jump; +static bool g_expect_exit; + +uint32_t borland_heap_free_space(void) +{ + return g_heap_free; +} + +void object_windows_setup_window(Win16FarPtr window) +{ + assert(window == g_window); + g_setup_window_calls++; +} + +void object_windows_close_if_allowed(Win16FarPtr window) +{ + assert(window == g_window); + g_close_calls++; +} + +_Noreturn void borland_runtime_exit(uint16_t status) +{ + assert(g_expect_exit && status == 0); + longjmp(g_exit_jump, 1); +} + +INT16 win16_call_message_box_far( + Win16FarPtr procedure, + HWND16 owner, + Win16FarPtr text, + Win16FarPtr caption, + UINT16 type) +{ + assert(procedure == win16_make_far_pointer(0x8000, 0x1111)); + assert(caption == win16_dgroup_pointer(0x02aa)); + assert(type == 0x2010); + g_last_message_owner = owner; + g_last_message_text = text; + g_message_calls++; + return 1; +} + +HCURSOR16 LoadCursor16(HINSTANCE16 instance, Win16FarPtr resource) +{ + assert(instance == 0 && resource == win16_make_far_pointer(0, 0x7f02)); + return 0x4444; +} + +HCURSOR16 SetCursor16(HCURSOR16 cursor) +{ + assert(cursor == 0x4444); + return 0x5555; +} + +void tdkpin_realize_nocollapse_palette(HWND16 window) +{ + assert(window == 0x2222); + g_palette_realize_calls++; +} + +void tdkpin_load_palette_resource( + Win16FarPtr destination, + Win16FarPtr resource_name, + HINSTANCE16 instance) +{ + assert(destination == win16_dgroup_pointer(0x4450)); + assert(resource_name == win16_make_far_pointer(0, 999)); + assert(instance == 0x1234); + g_palette_load_calls++; +} + +void tdkpin_create_palette_from_rgb_table(void) +{ + g_palette_create_calls++; +} + +uint32_t GetTickCount16(void) +{ + return 0x11223344u; +} + +BorlandDivI32Result borland_divide_i32(int32_t dividend, int32_t divisor) +{ + assert(divisor == 1000); + return (BorlandDivI32Result){dividend / divisor, dividend % divisor}; +} + +void borland_parameter_string(uint16_t index, Win16FarPtr destination) +{ + static const char module[] = "C:\\TDKPIN.EXE"; + assert(index == 0); + win16_write_u8(destination, (uint8_t)(sizeof(module) - 1)); + for (uint16_t byte = 0; byte < sizeof(module) - 1; byte++) { + win16_write_u8( + win16_far_add_offset(destination, (uint16_t)(byte + 1)), + (uint8_t)module[byte]); + } +} + +Win16FarPtr borland_short_to_c_string( + Win16FarPtr destination, Win16FarPtr source) +{ + uint8_t length = win16_read_u8(source); + for (uint16_t byte = 0; byte < length; byte++) { + win16_write_u8( + win16_far_add_offset(destination, byte), + win16_read_u8(win16_far_add_offset(source, (uint16_t)(byte + 1)))); + } + win16_write_u8(win16_far_add_offset(destination, length), 0); + return destination; +} + +uint16_t borland_short_position(Win16FarPtr pattern, Win16FarPtr text) +{ + assert(pattern == win16_make_far_pointer(0x7300, 0x026e)); + assert(win16_read_u8(text) == 13); + return 10; +} + +Win16FarPtr borland_far_strncpy( + Win16FarPtr destination, Win16FarPtr source, uint16_t maximum) +{ + assert(maximum == 10); + for (uint16_t byte = 0; byte < maximum; byte++) { + win16_write_u8( + win16_far_add_offset(destination, byte), + win16_read_u8(win16_far_add_offset(source, byte))); + } + win16_write_u8(win16_far_add_offset(destination, maximum), 0); + return destination; +} + +Win16FarPtr borland_far_strcat(Win16FarPtr destination, Win16FarPtr source) +{ + uint16_t end = 0; + while (win16_read_u8(win16_far_add_offset(destination, end)) != 0) { + end++; + } + uint16_t byte = 0; + do { + uint8_t value = win16_read_u8(win16_far_add_offset(source, byte)); + win16_write_u8( + win16_far_add_offset(destination, (uint16_t)(end + byte)), value); + byte++; + if (value == 0) { + break; + } + } while (true); + return destination; +} + +static void assert_far_c_string(Win16FarPtr string, const char *expected) +{ + for (uint16_t index = 0;; index++) { + uint8_t actual = win16_read_u8(win16_far_add_offset(string, index)); + assert(actual == (uint8_t)expected[index]); + if (actual == 0) { + break; + } + } +} + +UINT16 GetPrivateProfileInt16( + Win16FarPtr section, + Win16FarPtr key, + INT16 default_value, + Win16FarPtr file_name) +{ + assert(section == win16_dgroup_pointer(0x02c7)); + assert_far_c_string(file_name, "C:\\TDKPIN.INI"); + if (key == win16_dgroup_pointer(0x02d0)) { + assert(default_value == 1); + return g_language; + } + assert(key == win16_dgroup_pointer(0x02d9) && default_value == 3); + return g_speed; +} + +Win16FarPtr tdkpin_system_timer_construct( + Win16FarPtr object, + uint16_t vmt, + uint8_t one_shot, + uint16_t resolution_ms, + uint16_t delay_ms, + HWND16 recipient) +{ + assert(object == 0 && vmt == 0x05c0 && one_shot == 0); + assert(resolution_ms == 1 && delay_ms == 20 && recipient == 0x2222); + g_timer_calls++; + return g_timer_result; +} + +void tdkpin_initialize_collision_record( + const TdkpinCollisionInitArgs *arguments) +{ + assert(g_collision_calls < 177 && arguments->index <= 175); + g_collision_ids[g_collision_calls++] = arguments->index; + g_final_active[arguments->index] = (uint8_t)arguments->active; + g_final_contact[arguments->index] = arguments->contact_state; + Win16FarPtr target = win16_dgroup_pointer((uint16_t)( + 0x095b + arguments->index * 0x53u)); + win16_write_u8(win16_far_add_offset(target, 0x34), + (uint8_t)arguments->active); + win16_write_u16(target, 0x43, arguments->contact_state); +} + +void tdkpin_set_word_quad( + uint16_t source_word_6, + uint16_t source_word_4, + uint16_t source_word_2, + uint16_t source_word_0, + uint16_t index) +{ + assert(index == g_quad_calls + 1 && index <= 20); + g_quads[index] = (TdkpinWordQuad){ + source_word_0, source_word_2, source_word_4, source_word_6}; + g_quad_calls++; +} + +static void prepare_fixture(void) +{ + memset(g_dgroup, 0, sizeof(g_dgroup)); + memset(g_window_bytes, 0xa5, sizeof(g_window_bytes)); + memset(g_code, 0, sizeof(g_code)); + memset(g_collision_ids, 0, sizeof(g_collision_ids)); + memset(g_final_active, 0, sizeof(g_final_active)); + memset(g_final_contact, 0, sizeof(g_final_contact)); + memset(g_quads, 0, sizeof(g_quads)); + win16_reset_segment_bindings(); + win16_bind_segment(0x7100, g_window_bytes, sizeof(g_window_bytes), true); + win16_bind_segment(0x7200, g_dgroup, sizeof(g_dgroup), true); + win16_bind_ne_segment(1, 0x7300, g_code, sizeof(g_code), false); + win16_set_dgroup_selector(0x7200); + uint8_t stack_anchor = 0; + uintptr_t stack_base = (uintptr_t)&stack_anchor - 0x8000u; + win16_bind_segment(0x7000, (void *)stack_base, 0x10000, true); + g_window = win16_make_far_pointer(0x7100, 0); + win16_write_u16(g_window, 4, 0x2222); + win16_write_u16(win16_dgroup_pointer(0x06fe), 0, 0x1234); + win16_write_u32( + win16_dgroup_pointer(0x0666), 0, + win16_make_far_pointer(0x8000, 0x1111)); + memcpy(&g_dgroup[0x02aa], "TDK Pinball Machine 1.00", 25); + memcpy(&g_dgroup[0x02c3], "INI", 4); + memcpy(&g_dgroup[0x02c7], "Settings", 9); + memcpy(&g_dgroup[0x02d0], "Language", 9); + memcpy(&g_dgroup[0x02d9], "Speed", 6); + memcpy(&g_dgroup[0x02df], "No timer available!", 20); + g_heap_free = UINT32_C(0x00400000); + g_language = 7; + g_speed = 4; + g_timer_result = win16_make_far_pointer(0x7400, 0x0100); + g_setup_window_calls = 0; + g_palette_realize_calls = 0; + g_palette_load_calls = 0; + g_palette_create_calls = 0; + g_timer_calls = 0; + g_collision_calls = 0; + g_quad_calls = 0; + g_message_calls = 0; + g_close_calls = 0; + g_last_message_text = 0; + g_last_message_owner = 0; + g_expect_exit = false; +} + +static void test_successful_setup(void) +{ + prepare_fixture(); + tdkpin_setup_game_window(g_window); + assert(g_setup_window_calls == 1); + assert(g_palette_realize_calls == 1 && g_palette_load_calls == 1); + assert(g_palette_create_calls == 1 && g_timer_calls == 1); + assert(g_collision_calls == 177 && g_quad_calls == 20); + assert(g_collision_ids[0] == 1 && g_collision_ids[1] == 2); + assert(g_collision_ids[2] == 169 && g_collision_ids[3] == 170); + assert(g_collision_ids[4] == 3); + assert(g_collision_ids[170] == 169 && g_collision_ids[171] == 170); + assert(g_collision_ids[176] == 175); + assert(win16_read_u16(win16_dgroup_pointer(0x07cd)) == 1); + assert(win16_read_u8(win16_far_add_offset(g_window, 0x60)) == 4); + assert(win16_read_u16(win16_dgroup_pointer(0x0871)) == 2); + assert(win16_read_far_pointer(g_window, 0x49) == g_timer_result); + assert(win16_read_u32(win16_dgroup_pointer(0x0720)) == 0x11223344u); + assert(win16_read_u32(win16_dgroup_pointer(0x0829)) == 140000u); + assert(win16_read_u32(win16_dgroup_pointer(0x082d)) == 650000u); + assert(win16_read_u32(win16_dgroup_pointer(0x0831)) == 1300000u); + assert(win16_read_u32(win16_dgroup_pointer(0x0835)) == 4000000u); + assert(win16_read_u32(win16_far_add_offset(g_window, 0x0ba2)) == 325u); + assert(win16_read_u32(win16_far_add_offset(g_window, 0x0ba6)) == 413u); + assert(g_quads[1].word_0 == 0x0067 && g_quads[1].word_6 == 0x0143); + assert(g_quads[20].word_0 == 0x0009 && g_quads[20].word_6 == 0x001e); + for (uint16_t id = 1; id <= 175; id++) { + assert(win16_read_u8(win16_far_add_offset( + g_window, (uint16_t)(0x03cc + id))) == + g_final_active[id]); + assert(win16_read_u16(win16_far_add_offset( + g_window, (uint16_t)(0x0a42 + id * 2u))) == + g_final_contact[id]); + assert(win16_read_u8(win16_far_add_offset( + g_window, (uint16_t)(0x61 + id))) == 0); + } + assert(g_message_calls == 0 && g_close_calls == 0); +} + +static void test_low_memory_failure(void) +{ + prepare_fixture(); + g_heap_free = UINT32_C(0x003fffff); + g_expect_exit = true; + if (setjmp(g_exit_jump) == 0) { + tdkpin_setup_game_window(g_window); + assert(false); + } + assert(g_message_calls == 1 && g_last_message_owner == 0); + assert(g_last_message_text == win16_dgroup_pointer(0x0260)); + assert(g_close_calls == 1 && g_setup_window_calls == 0); + assert(g_collision_calls == 0); +} + +static void test_timer_failure(void) +{ + prepare_fixture(); + g_timer_result = 0; + g_expect_exit = true; + if (setjmp(g_exit_jump) == 0) { + tdkpin_setup_game_window(g_window); + assert(false); + } + assert(g_message_calls == 1 && g_last_message_owner == 0x2222); + assert(g_last_message_text == win16_dgroup_pointer(0x02df)); + assert(g_close_calls == 0 && g_collision_calls == 0); +} + +int main(void) +{ + test_successful_setup(); + test_low_memory_failure(); + test_timer_failure(); + return 0; +} diff --git a/original/reconstructed/tests/test_game_windows.c b/original/reconstructed/tests/test_game_windows.c new file mode 100644 index 0000000..8c8dfb4 --- /dev/null +++ b/original/reconstructed/tests/test_game_windows.c @@ -0,0 +1,181 @@ +#include "../tdkpin_game_windows.h" + +#include +#include +#include +#include + +enum { + WINDOW_HANDLE = 4, + WINDOW_ATTRIBUTES = 0x21, + WINDOW_X = 0x29, + WINDOW_Y = 0x2b, + WINDOW_WIDTH = 0x2d, + WINDOW_HEIGHT = 0x2f, + WINDOW_OWNER = 0x41, +}; + +static uint8_t g_objects[0x1000]; +static bool g_enter; +static uint32_t g_base_style; +static INT16 g_screen_width; +static INT16 g_screen_height; +static unsigned g_base_calls; +static Win16FarPtr g_expected_title; +static Win16FarPtr g_expected_parent; +static unsigned g_focus_calls; +static HWND16 g_focused_window; + +static Win16FarPtr object_at(uint16_t offset) +{ + return win16_make_far_pointer(0x6000, offset); +} + +static void reset_fixture(void) +{ + memset(g_objects, 0, sizeof(g_objects)); + win16_reset_segment_bindings(); + win16_bind_segment(0x6000, g_objects, sizeof(g_objects), true); + g_enter = true; + g_base_style = 0; + g_screen_width = 1024; + g_screen_height = 768; + g_base_calls = 0; + g_expected_title = object_at(0x700); + g_expected_parent = object_at(0x800); + g_focus_calls = 0; + g_focused_window = 0; +} + +bool borland_enter_object_constructor( + BorlandObjectCallFrame *frame, uint16_t offset) +{ + assert(offset == 0); + if (g_enter && frame->vmt_argument != 0) { + win16_write_u16(frame->object, 0, frame->vmt_argument); + } + return g_enter; +} + +Win16FarPtr object_windows_window_construct( + Win16FarPtr window, + uint16_t vmt, + Win16FarPtr title, + Win16FarPtr parent) +{ + assert(vmt == 0); + assert(title == g_expected_title); + assert(parent == g_expected_parent); + g_base_calls++; + win16_write_u32(window, WINDOW_ATTRIBUTES, g_base_style); + win16_write_u16(window, WINDOW_HANDLE, 0x4444); + return window; +} + +INT16 GetSystemMetrics16(INT16 index) +{ + assert(index == 0 || index == 1); + return index == 0 ? g_screen_width : g_screen_height; +} + +HWND16 SetFocus16(HWND16 window) +{ + g_focus_calls++; + g_focused_window = window; + return 0x9999; +} + +static void assert_geometry( + Win16FarPtr window, + INT16 x, + INT16 y, + uint16_t width, + uint16_t height) +{ + assert((INT16)win16_read_u16( + win16_far_add_offset(window, WINDOW_X)) == x); + assert((INT16)win16_read_u16( + win16_far_add_offset(window, WINDOW_Y)) == y); + assert(win16_read_u16( + win16_far_add_offset(window, WINDOW_WIDTH)) == width); + assert(win16_read_u16( + win16_far_add_offset(window, WINDOW_HEIGHT)) == height); +} + +static void test_main_window(void) +{ + reset_fixture(); + Win16FarPtr window = object_at(0x100); + assert(tdkpin_main_window_construct( + window, 0x1234, g_expected_title, g_expected_parent) == window); + assert(g_base_calls == 1); + assert(win16_read_u16(window) == 0x1234); + assert_geometry(window, 192, 144, 640, 480); + assert(win16_read_u32( + win16_far_add_offset(window, WINDOW_ATTRIBUTES)) == + 0x86ca0000u); + assert(g_focus_calls == 0); + + reset_fixture(); + window = object_at(0x100); + g_screen_width = 801; + g_screen_height = 601; + (void)tdkpin_main_window_construct( + window, 0, g_expected_title, g_expected_parent); + assert_geometry(window, 80, 60, 640, 480); +} + +static void test_centered_child_window(void) +{ + reset_fixture(); + Win16FarPtr window = object_at(0x200); + g_base_style = 0x00010000u; + assert(tdkpin_centered_child_window_construct( + window, 0x2345, g_expected_title, g_expected_parent) == window); + assert(g_base_calls == 1); + assert(win16_read_far_pointer(window, WINDOW_OWNER) == g_expected_parent); + assert_geometry(window, 140, 80, 360, 300); + assert(win16_read_u32( + win16_far_add_offset(window, WINDOW_ATTRIBUTES)) == + 0x46810002u); + assert(g_focus_calls == 1 && g_focused_window == 0x4444); +} + +static void test_full_child_window(void) +{ + reset_fixture(); + Win16FarPtr window = object_at(0x300); + g_base_style = 0xffffffffu; + assert(tdkpin_full_child_window_construct( + window, 0x3456, g_expected_title, g_expected_parent) == window); + assert(g_base_calls == 1); + assert(win16_read_far_pointer(window, WINDOW_OWNER) == g_expected_parent); + assert_geometry(window, 0, 0, 640, 460); + assert(win16_read_u32( + win16_far_add_offset(window, WINDOW_ATTRIBUTES)) == + 0x46000002u); + assert(g_focus_calls == 1 && g_focused_window == 0x4444); +} + +static void test_constructor_entry_failure(void) +{ + reset_fixture(); + Win16FarPtr window = object_at(0x400); + win16_write_u32(window, WINDOW_ATTRIBUTES, 0x11223344u); + g_enter = false; + assert(tdkpin_centered_child_window_construct( + window, 0x4567, g_expected_title, g_expected_parent) == window); + assert(g_base_calls == 0 && g_focus_calls == 0); + assert(win16_read_u32( + win16_far_add_offset(window, WINDOW_ATTRIBUTES)) == + 0x11223344u); +} + +int main(void) +{ + test_main_window(); + test_centered_child_window(); + test_full_child_window(); + test_constructor_entry_failure(); + return 0; +} diff --git a/original/reconstructed/tests/test_gameplay_helpers.c b/original/reconstructed/tests/test_gameplay_helpers.c new file mode 100644 index 0000000..d74ccc2 --- /dev/null +++ b/original/reconstructed/tests/test_gameplay_helpers.c @@ -0,0 +1,358 @@ +#include "../tdkpin_gameplay_helpers.h" + +#include + +uint8_t g_player_count; +uint8_t g_gameplay_transition_pending; +int32_t g_ball_x_milli; +int32_t g_ball_y_milli; +uint8_t g_current_player; +static INT16 g_item_status; + +static unsigned g_calls; +static unsigned g_kind[32]; +static INT16 g_record_y[32]; +static INT16 g_record_x[32]; +static HBITMAP16 g_bitmap; +static INT16 g_height; +static INT16 g_width; +static INT16 g_y; +static INT16 g_x; +static HDC16 g_dc; +static HWND16 g_window; +static int32_t g_score; +static unsigned g_create_dc_calls; +static unsigned g_select_object_calls; +static unsigned g_bitblt_calls; +static unsigned g_delete_dc_calls; + +static void record( + unsigned kind, + INT16 height, + INT16 width, + INT16 y, + INT16 x, + HDC16 dc) +{ + g_kind[g_calls] = kind; + g_record_y[g_calls] = y; + g_record_x[g_calls] = x; + g_calls++; + g_height = height; + g_width = width; + g_y = y; + g_x = x; + g_dc = dc; +} + +void tdkpin_blit_bitmap_to_background( + HBITMAP16 bitmap, + INT16 height, + INT16 width, + INT16 y, + INT16 x, + HDC16 dc) +{ + g_bitmap = bitmap; + record(1, height, width, y, x, dc); +} + +void tdkpin_restore_background_region_a( + INT16 height, INT16 width, INT16 y, INT16 x, HDC16 dc) +{ + record(2, height, width, y, x, dc); +} + +void tdkpin_restore_background_region_b( + INT16 height, INT16 width, INT16 y, INT16 x, HDC16 dc) +{ + record(3, height, width, y, x, dc); +} + +void tdkpin_present_background_region( + INT16 height, INT16 width, INT16 y, INT16 x, HDC16 dc) +{ + record(4, height, width, y, x, dc); +} + +HDC16 GetDC16(HWND16 window) +{ + g_window = window; + return 0x3333; +} + +INT16 ReleaseDC16(HWND16 window, HDC16 dc) +{ + assert(window == g_window && dc == 0x3333); + return 1; +} + +void tdkpin_draw_score(HDC16 destination, int32_t value) +{ + assert(destination == 0x3333); + g_score = value; +} + +void tdkpin_draw_item_status(INT16 item, HDC16 destination) +{ + assert(destination == 0x3333); + g_item_status = item; +} + +HDC16 CreateCompatibleDC16(HDC16 dc) +{ + assert(dc == 0x4444 && g_create_dc_calls < 2); + return (HDC16)(0x5001 + g_create_dc_calls++); +} + +HGDIOBJ16 SelectObject16(HDC16 dc, HGDIOBJ16 object) +{ + switch (g_select_object_calls++) { + case 0: + assert(dc == 0x5001 && object == 0x6001); + return 0x7001; + case 1: + assert(dc == 0x5002 && object == 0x6002); + return 0x7002; + case 2: + assert(dc == 0x5002 && object == 0x7002); + return 0x6002; + default: + assert(g_select_object_calls == 4); + assert(dc == 0x5001 && object == 0x7001); + return 0x6001; + } +} + +BOOL16 BitBlt16( + HDC16 destination, + INT16 destination_x, + INT16 destination_y, + INT16 width, + INT16 height, + HDC16 source, + INT16 source_x, + INT16 source_y, + uint32_t raster_operation) +{ + assert(destination == 0x5001 && destination_x == 0); + assert(destination_y == 21 && width == 21 && height == 18); + assert(source == 0x5002 && source_x == 314 && source_y == 426); + assert(raster_operation == 0x00cc0020u); + g_bitblt_calls++; + return 1; +} + +BOOL16 DeleteDC16(HDC16 dc) +{ + assert(dc == (g_delete_dc_calls == 0 ? 0x5002 : 0x5001)); + g_delete_dc_calls++; + return 1; +} + +int main(void) +{ + static uint8_t stack[0x400]; + static uint8_t object[0x0c00]; + static uint8_t dgroup[0x4d3a]; + win16_reset_segment_bindings(); + win16_bind_segment(0x7000, stack, sizeof(stack), true); + win16_bind_segment(0x7100, object, sizeof(object), true); + win16_bind_segment(0x7200, dgroup, sizeof(dgroup), true); + win16_set_dgroup_selector(0x7200); + win16_set_stack_state(0x7000, 0); + Win16FarPtr receiver = win16_make_far_pointer(0x7100, 0); + win16_write_u16(win16_make_far_pointer(0x7000, 0x0106), 0, + win16_far_offset(receiver)); + win16_write_u16(win16_make_far_pointer(0x7000, 0x0108), 0, + win16_far_selector(receiver)); + win16_write_u16(receiver, 4, 0x2222); + + win16_write_stack_u16(0x00f4, 0x4444); + win16_write_u16(win16_dgroup_pointer(0x085b), 0, 0x6001); + win16_write_u16(win16_dgroup_pointer(0x0865), 0, 0x6002); + g_create_dc_calls = 0; + g_select_object_calls = 0; + g_bitblt_calls = 0; + g_delete_dc_calls = 0; + g_calls = 0; + tdkpin_draw_board_decoration_row(0x0100, 21); + assert(g_create_dc_calls == 2 && g_select_object_calls == 4); + assert(g_bitblt_calls == 1 && g_delete_dc_calls == 2); + assert(win16_read_stack_u16(0x00f2) == 0x5001); + assert(win16_read_stack_u16(0x00f0) == 0x5002); + assert(win16_read_stack_u16(0x00ee) == 0x7001); + assert(win16_read_stack_u16(0x00ec) == 0x7002); + assert(g_calls == 1 && g_kind[0] == 4); + assert(g_height == 18 && g_width == 21 && g_y == 21 && g_x == 0); + assert(g_dc == 0x4444); + + g_current_player = 2; + win16_write_u16(win16_dgroup_pointer(0x0823), 0, 3); + g_calls = 0; + tdkpin_refresh_player_progress_markers(0x0100); + assert(g_calls == 12); + for (unsigned marker = 0; marker < 6; marker++) { + unsigned restore = marker * 2; + assert(g_kind[restore] == (marker < 3 ? 2u : 3u)); + assert(g_kind[restore + 1] == 4); + assert(g_record_y[restore] == 342); + assert(g_record_x[restore] == (INT16)(391 + marker * 8)); + assert(g_record_y[restore + 1] == 342); + assert(g_record_x[restore + 1] == (INT16)(391 + marker * 8)); + } + + g_calls = 0; + tdkpin_blit_bitmap_and_present(0x1111, 10, 20, 30, 40, 0x5555); + assert(g_calls == 2 && g_kind[0] == 1 && g_kind[1] == 4); + assert(g_bitmap == 0x1111 && g_height == 10 && g_width == 20); + assert(g_y == 30 && g_x == 40 && g_dc == 0x5555); + + g_calls = 0; + tdkpin_restore_bounds_overlay_a(0xbeef, 10, 20, 5, 7, 0x5555); + assert(g_calls == 2 && g_kind[0] == 2 && g_kind[1] == 4); + assert(g_height == 6 && g_width == 14 && g_y == 5 && g_x == 7); + + g_calls = 0; + tdkpin_restore_bounds_overlay_b(0xbeef, 10, 20, 5, 7, 0x5555); + assert(g_calls == 2 && g_kind[0] == 3 && g_kind[1] == 4); + + tdkpin_draw_score_from_caller_frame(0x0100, 0x5678, 0x89ab); + assert(g_window == 0x2222 && g_score == (int32_t)0x89ab5678u); + + g_player_count = 9; + g_gameplay_transition_pending = 0; + win16_write_u8(win16_far_add_offset(receiver, 0x0bde), 0); + tdkpin_set_gameplay_transition_flags(0x0100); + assert(g_player_count == 0); + assert(g_gameplay_transition_pending == 1); + assert(win16_read_u8(win16_far_add_offset(receiver, 0x0bde)) == 1); + + win16_write_u32(receiver, 0x0bba, 0x00001234u); + win16_write_u32(receiver, 0x0bbe, 0x000056abu); + assert(tdkpin_receiver_point_in_bounds( + 0x0100, 0x6000, 0x2000, 0x5000, 0x1000) == 0x5601); + assert(tdkpin_receiver_point_in_bounds( + 0x0100, 0x6000, 0x2000, 0x5000, 0x1300) == 0x1200); + + g_ball_x_milli = 0x1234; + g_ball_y_milli = 0x56ab; + assert(tdkpin_ball_in_bounds( + 0, 0x6000, 0x2000, 0x5000, 0x1000) == 0x5601); + + g_ball_x_milli = 100000; + g_ball_y_milli = 200000; + tdkpin_update_dynamic_ball_record(0, 0); + Win16FarPtr dynamic = win16_dgroup_pointer( + (uint16_t)(0x095b + 173u * 0x53u)); + assert((int32_t)win16_read_u32(win16_far_add_offset(dynamic, 0x12)) == + 100000); + assert((int32_t)win16_read_u32(win16_far_add_offset(dynamic, 0x16)) == + 200000); + assert((int32_t)win16_read_u32(win16_far_add_offset(dynamic, 0x02)) == + 79000); + assert((int32_t)win16_read_u32(win16_far_add_offset(dynamic, 0x06)) == + 179000); + assert((int32_t)win16_read_u32(win16_far_add_offset(dynamic, 0x0a)) == + 121000); + assert((int32_t)win16_read_u32(win16_far_add_offset(dynamic, 0x0e)) == + 221000); + + Win16FarPtr record_one = win16_dgroup_pointer( + (uint16_t)(0x095b + 0x53u)); + win16_write_u16(record_one, 0x4b, 7); + win16_write_u16(record_one, 0x4d, 5); + win16_write_u16(record_one, 0x4f, 20); + win16_write_u16(record_one, 0x51, 10); + g_calls = 0; + tdkpin_restore_record_or_item_a(0x0100, 1); + assert(g_calls == 2 && g_kind[0] == 2 && g_kind[1] == 4); + assert(g_height == 6 && g_width == 14 && g_y == 5 && g_x == 7); + g_calls = 0; + tdkpin_restore_record_b(0x0100, 1); + assert(g_kind[0] == 3 && g_kind[1] == 4); + + Win16FarPtr quad_two = win16_dgroup_pointer(0x4273); + win16_write_u16(quad_two, 0, 7); + win16_write_u16(quad_two, 2, 5); + win16_write_u16(quad_two, 4, 20); + win16_write_u16(quad_two, 6, 10); + g_calls = 0; + tdkpin_restore_record_or_item_a(0x0100, 1002); + assert(g_kind[0] == 2 && g_height == 6 && g_width == 14); + g_item_status = 0; + tdkpin_restore_record_or_item_a(0x0100, 1006); + assert(g_item_status == 1); + + win16_write_u16(record_one, 0x41, 0x0080); + win16_write_u8(win16_far_add_offset(record_one, 0x34), 1); + g_calls = 0; + tdkpin_refresh_collision_record(0x0100, 1); + assert(g_kind[0] == 3); + win16_write_u8(win16_far_add_offset(record_one, 0x34), 0); + g_calls = 0; + tdkpin_refresh_collision_record(0x0100, 1); + assert(g_kind[0] == 2); + win16_write_u16(record_one, 0x41, 0x0100); + g_calls = 0; + tdkpin_refresh_collision_record(0x0100, 1); + assert(g_kind[0] == 3); + + g_current_player = 1; + win16_write_u8(win16_far_add_offset(receiver, 0x047d), 1); + g_calls = 0; + tdkpin_refresh_player_item(0x0100, 2); + assert(g_kind[0] == 2); + win16_write_u8(win16_far_add_offset(receiver, 0x047d), 0); + g_calls = 0; + tdkpin_refresh_player_item(0x0100, 2); + assert(g_kind[0] == 3); + + win16_write_u32(win16_dgroup_pointer(0x07e7), 0, 0x11112222u); + win16_write_u32(win16_dgroup_pointer(0x07ef), 0, 0x33334444u); + win16_write_u32(win16_dgroup_pointer(0x07f7), 0, 0x55556666u); + win16_write_u32(win16_dgroup_pointer(0x07ff), 0, 0x77778888u); + win16_write_u32(win16_dgroup_pointer(0x0807), 0, 0x9999aaaau); + for (uint16_t index = 0; index < 6; index++) { + win16_write_u8( + win16_dgroup_pointer((uint16_t)(0x0811 + index)), + (uint8_t)(0xb0 + index)); + } + tdkpin_load_ball_slot(0x0100, 1); + assert((uint32_t)g_ball_x_milli == 0x11112222u); + assert((uint32_t)g_ball_y_milli == 0x33334444u); + assert(win16_read_u32(win16_far_add_offset(receiver, 0x0baa)) == + 0x55556666u); + assert(win16_read_u32(win16_far_add_offset(receiver, 0x0bae)) == + 0x77778888u); + assert(win16_read_u32(win16_far_add_offset(receiver, 0x0bca)) == + 0x9999aaaau); + for (uint16_t index = 0; index < 6; index++) { + assert(win16_read_u8(win16_far_add_offset( + receiver, (uint16_t)(0x0bce + index))) == + (uint8_t)(0xb0 + index)); + } + + g_ball_x_milli = (int32_t)0xabcdef01u; + g_ball_y_milli = (int32_t)0x12345678u; + win16_write_u32(receiver, 0x0baa, 0x01020304u); + win16_write_u32(receiver, 0x0bae, 0x05060708u); + win16_write_u32(receiver, 0x0bca, 0x090a0b0cu); + for (uint16_t index = 0; index < 6; index++) { + win16_write_u8( + win16_far_add_offset(receiver, (uint16_t)(0x0bce + index)), + (uint8_t)(0xc0 + index)); + } + tdkpin_save_ball_slot(0x0100, 2); + assert(win16_read_u32(win16_dgroup_pointer(0x07eb)) == 0xabcdef01u); + assert(win16_read_u32(win16_dgroup_pointer(0x07f3)) == 0x12345678u); + assert(win16_read_u32(win16_dgroup_pointer(0x07fb)) == 0x01020304u); + assert(win16_read_u32(win16_dgroup_pointer(0x0803)) == 0x05060708u); + assert(win16_read_u32(win16_dgroup_pointer(0x080b)) == 0x090a0b0cu); + for (uint16_t index = 0; index < 6; index++) { + assert(win16_read_u8(win16_dgroup_pointer( + (uint16_t)(0x0817 + index))) == + (uint8_t)(0xc0 + index)); + } + return 0; +} diff --git a/original/reconstructed/tests/test_global_memory.c b/original/reconstructed/tests/test_global_memory.c new file mode 100644 index 0000000..2d2b015 --- /dev/null +++ b/original/reconstructed/tests/test_global_memory.c @@ -0,0 +1,59 @@ +#include "../tdkpin_global_memory.h" + +#include + +static UINT16 g_alloc_flags; +static uint32_t g_alloc_bytes; +static HGLOBAL16 g_handle; +static Win16FarPtr g_locked_pointer; +static uint16_t g_handle_selector; +static unsigned g_unlock_sequence; +static unsigned g_free_sequence; + +HGLOBAL16 GlobalAlloc16(UINT16 flags, uint32_t bytes) +{ + g_alloc_flags = flags; + g_alloc_bytes = bytes; + return g_handle; +} + +Win16FarPtr GlobalLock16(HGLOBAL16 allocation) +{ + assert(allocation == g_handle); + return g_locked_pointer; +} + +HGLOBAL16 GlobalHandle16(uint16_t selector) +{ + g_handle_selector = selector; + return g_handle; +} + +BOOL16 GlobalUnlock16(HGLOBAL16 allocation) +{ + assert(allocation == g_handle); + g_unlock_sequence = 1; + return 0; +} + +HGLOBAL16 GlobalFree16(HGLOBAL16 allocation) +{ + assert(allocation == g_handle && g_unlock_sequence == 1); + g_free_sequence = 2; + return 0; +} + +int main(void) +{ + g_handle = 0x1234; + g_locked_pointer = win16_make_far_pointer(0xa100, 0x0040); + Win16FarPtr block = tdkpin_global_allocate_locked(0x0042, 0x12345678u); + assert(block == g_locked_pointer); + assert(g_alloc_flags == 0x0042 && g_alloc_bytes == 0x12345678u); + + tdkpin_global_unlock_and_free( + win16_make_far_pointer(0xa100, 0xbeef)); + assert(g_handle_selector == 0xa100); + assert(g_unlock_sequence == 1 && g_free_sequence == 2); + return 0; +} diff --git a/original/reconstructed/tests/test_heap_core.c b/original/reconstructed/tests/test_heap_core.c new file mode 100644 index 0000000..9cae043 --- /dev/null +++ b/original/reconstructed/tests/test_heap_core.c @@ -0,0 +1,101 @@ +#include "../tdkpin_heap.h" + +#include +#include + +uint16_t g_borland_heap_segment_head; +uint16_t g_borland_local_heap_limit = 0x0400; +uint16_t g_borland_heap_segment_bytes = 0x2000; +Win16FarPtr g_borland_heap_error_handler; + +static uint8_t g_dgroup[0x10000]; +static uint8_t g_heap[0x2000]; +static bool g_heap_bound; +static HGLOBAL16 g_freed_handle; +static uint32_t g_free_space; +static uint32_t g_compact_result; + +uint32_t GetFreeSpace16(UINT16 flags) +{ + assert(flags == 0x1000); + return g_free_space; +} + +uint32_t GlobalCompact16(uint32_t requested_bytes) +{ + assert(requested_bytes == 0); + return g_compact_result; +} + +Win16FarPtr borland_global_allocate(uint16_t bytes) +{ + assert(bytes == 0x2000); + if (!g_heap_bound) { + memset(g_heap, 0, sizeof(g_heap)); + win16_bind_ne_segment(0, 0x9000, g_heap, sizeof(g_heap), true); + g_heap_bound = true; + } + return win16_make_far_pointer(0x9000, 0); +} + +HGLOBAL16 GlobalHandle16(uint16_t selector) +{ + return selector == 0x9000 ? 0x77 : 0; +} + +BOOL16 GlobalUnlock16(HGLOBAL16 allocation) +{ + assert(allocation == 0x77); + return 1; +} + +HGLOBAL16 GlobalFree16(HGLOBAL16 allocation) +{ + assert(allocation == 0x77); + g_freed_handle = allocation; + return 0; +} + +uint16_t win16_call_pascal_u16(Win16FarPtr procedure, uint16_t argument) +{ + (void)procedure; + (void)argument; + return 0; +} + +int main(void) +{ + win16_reset_segment_bindings(); + win16_bind_ne_segment(6, 0x5000, g_dgroup, sizeof(g_dgroup), true); + win16_set_dgroup_selector(0x5000); + g_borland_heap_segment_head = 0; + g_borland_heap_error_handler = 0; + g_heap_bound = false; + g_freed_handle = 0; + + BorlandAllocationAttempt zero = borland_try_get_mem(0); + assert(!zero.failed && zero.block == 0); + + BorlandAllocationAttempt first = borland_try_get_mem(100); + assert(!first.failed && first.block == win16_make_far_pointer(0x9000, 12)); + assert(g_borland_heap_segment_head == 0x9000); + assert(win16_read_u16(win16_make_far_pointer(0x9000, 0)) == 0x5054); + assert(win16_read_u16(win16_make_far_pointer(0x9000, 8)) == 0x1f90); + g_free_space = 0x10000; + assert(borland_heap_free_space() == 0x11f90); + g_compact_result = 100; + assert(borland_heap_largest_block() == 0x1f90); + g_compact_result = 0x10000; + assert(borland_heap_largest_block() == 0x10000); + + BorlandAllocationAttempt second = borland_try_get_mem(20); + assert(!second.failed && second.block == win16_make_far_pointer(0x9000, 112)); + assert(win16_read_u16(win16_make_far_pointer(0x9000, 8)) == 0x1f7c); + + assert(!borland_try_free_mem(first.block, 100)); + assert(borland_try_free_mem(first.block, 100)); + assert(!borland_try_free_mem(second.block, 20)); + assert(g_borland_heap_segment_head == 0); + assert(g_freed_handle == 0x77); + return 0; +} diff --git a/original/reconstructed/tests/test_heap_paths.c b/original/reconstructed/tests/test_heap_paths.c new file mode 100644 index 0000000..f9be4bc --- /dev/null +++ b/original/reconstructed/tests/test_heap_paths.c @@ -0,0 +1,152 @@ +#include "../tdkpin_heap.h" + +#include +#include + +uint16_t g_borland_heap_segment_head; +uint16_t g_borland_local_heap_limit; +uint16_t g_borland_heap_segment_bytes; +Win16FarPtr g_borland_heap_error_handler; + +static uint8_t g_dgroup[0x10000]; +static uint8_t g_segments[4][0x100]; +static unsigned g_segment_count; +static bool g_fail_segment; +static bool g_fail_direct; +static Win16FarPtr g_direct_pointer; +static uint16_t g_handler_action; +static unsigned g_handler_calls; +static unsigned g_global_frees; + +Win16FarPtr borland_global_allocate(uint16_t bytes) +{ + if (bytes == g_borland_heap_segment_bytes) { + if (g_fail_segment) { + return 0; + } + assert(g_segment_count < 4 && bytes <= sizeof(g_segments[0])); + uint16_t selector = (uint16_t)(0x9000 + g_segment_count); + memset(g_segments[g_segment_count], 0, sizeof(g_segments[0])); + win16_bind_segment( + selector, g_segments[g_segment_count], bytes, true); + g_segment_count++; + return win16_make_far_pointer(selector, 0); + } + return g_fail_direct ? 0 : g_direct_pointer; +} + +HGLOBAL16 GlobalHandle16(uint16_t selector) +{ + return selector >= 0x9000 && selector < 0x9004 + ? (HGLOBAL16)(selector - 0x8f00) + : 0; +} + +BOOL16 GlobalUnlock16(HGLOBAL16 allocation) +{ + assert(allocation >= 0x100 && allocation < 0x104); + return 1; +} + +HGLOBAL16 GlobalFree16(HGLOBAL16 allocation) +{ + assert(allocation >= 0x100 && allocation < 0x104); + g_global_frees++; + return 0; +} + +uint16_t win16_call_pascal_u16(Win16FarPtr procedure, uint16_t argument) +{ + assert(procedure == g_borland_heap_error_handler && argument != 0); + g_handler_calls++; + if (g_handler_action == 2) { + g_fail_segment = false; + g_fail_direct = false; + } + return g_handler_action; +} + +static void reset_environment(void) +{ + win16_reset_segment_bindings(); + memset(g_dgroup, 0, sizeof(g_dgroup)); + win16_bind_segment(0x5000, g_dgroup, sizeof(g_dgroup), true); + win16_set_dgroup_selector(0x5000); + g_borland_heap_segment_head = 0; + g_borland_local_heap_limit = 64; + g_borland_heap_segment_bytes = 64; + g_borland_heap_error_handler = 0; + g_segment_count = 0; + g_fail_segment = false; + g_fail_direct = false; + g_direct_pointer = win16_make_far_pointer(0xa000, 0); + g_handler_action = 0; + g_handler_calls = 0; + g_global_frees = 0; +} + +static void test_global_and_fallback_paths(void) +{ + reset_environment(); + BorlandAllocationAttempt direct = borland_try_get_mem(100); + assert(!direct.failed && direct.block == g_direct_pointer); + + reset_environment(); + g_borland_local_heap_limit = 32; + g_fail_direct = true; + BorlandAllocationAttempt fallback = borland_try_get_mem(40); + assert(!fallback.failed); + assert(fallback.block == win16_make_far_pointer(0x9000, 12)); +} + +static void test_heap_error_actions(void) +{ + reset_environment(); + g_fail_segment = true; + g_fail_direct = true; + g_borland_heap_error_handler = win16_make_far_pointer(0x7000, 0x0100); + + g_handler_action = 1; + BorlandAllocationAttempt result = borland_try_get_mem(20); + assert(!result.failed && result.block == 0 && g_handler_calls == 1); + + g_handler_calls = 0; + g_handler_action = 0; + result = borland_try_get_mem(20); + assert(result.failed && result.block == 0 && g_handler_calls == 1); + + g_handler_calls = 0; + g_handler_action = 2; + result = borland_try_get_mem(20); + assert(!result.failed && result.block == win16_make_far_pointer(0x9000, 12)); + assert(g_handler_calls == 1); +} + +static void test_multi_segment_ring_and_release(void) +{ + reset_environment(); + BorlandAllocationAttempt first = borland_try_get_mem(20); + BorlandAllocationAttempt second = borland_try_get_mem(20); + BorlandAllocationAttempt third = borland_try_get_mem(20); + assert(first.block == win16_make_far_pointer(0x9000, 12)); + assert(second.block == win16_make_far_pointer(0x9000, 32)); + assert(third.block == win16_make_far_pointer(0x9001, 12)); + assert(g_borland_heap_segment_head == 0x9001); + assert(win16_read_u16(win16_make_far_pointer(0x9000, 10)) == 0x9001); + assert(win16_read_u16(win16_make_far_pointer(0x9001, 10)) == 0x9000); + + assert(!borland_try_free_mem(first.block, 20)); + assert(!borland_try_free_mem(second.block, 20)); + assert(g_borland_heap_segment_head == 0x9001 && g_global_frees == 1); + assert(win16_read_u16(win16_make_far_pointer(0x9001, 10)) == 0x9001); + assert(!borland_try_free_mem(third.block, 20)); + assert(g_borland_heap_segment_head == 0 && g_global_frees == 2); +} + +int main(void) +{ + test_global_and_fallback_paths(); + test_heap_error_actions(); + test_multi_segment_ring_and_release(); + return 0; +} diff --git a/original/reconstructed/tests/test_heap_reserve.c b/original/reconstructed/tests/test_heap_reserve.c new file mode 100644 index 0000000..02bd858 --- /dev/null +++ b/original/reconstructed/tests/test_heap_reserve.c @@ -0,0 +1,306 @@ +#include "../tdkpin_borland_runtime.h" + +#include +#include +#include +#include +#include + +uint16_t g_borland_heap_reserve_bytes = 0x2000; +Win16FarPtr g_borland_heap_reserve; +uint8_t g_borland_heap_reserve_disabled; +Win16FarPtr g_borland_heap_error_handler; +Win16FarPtr g_borland_exit_proc; +uint16_t g_borland_exit_code_word; +uint16_t g_borland_error_offset; +uint16_t g_borland_error_segment; +uint16_t g_borland_windows_mode; +_Atomic uint16_t g_borland_io_result; +char g_borland_runtime_error_text[32]; + +static Win16FarPtr g_next_allocation; +static Win16FarPtr g_freed_block; +static uint16_t g_freed_bytes; +uint16_t g_borland_global_alloc_flags = 2; +static HGLOBAL16 g_global_handle; +static Win16FarPtr g_global_pointer; +static bool g_try_get_failed; +static bool g_try_free_failed; +static jmp_buf g_terminate_jump; +static bool g_expect_terminate; +static uint8_t g_terminated_status; +static Win16FarPtr g_exit_calls[4]; +static unsigned g_exit_call_count; +static Win16FarPtr g_exit_successor; +static unsigned g_message_box_calls; +static UINT16 g_message_box_type; + +HGLOBAL16 GlobalAlloc16(UINT16 flags, uint32_t bytes) +{ + assert(flags == 2 && bytes == 1234); + return g_global_handle; +} + +Win16FarPtr GlobalLock16(HGLOBAL16 allocation) +{ + assert(allocation == g_global_handle); + return g_global_pointer; +} + +INT16 MessageBox16( + HWND16 owner, Win16FarPtr text, Win16FarPtr caption, UINT16 type) +{ + (void)owner; + (void)text; + (void)caption; + g_message_box_calls++; + g_message_box_type = type; + return 0; +} + +void win16_call_exit_proc(Win16FarPtr procedure) +{ + assert(g_borland_exit_proc == 0); + assert(atomic_load(&g_borland_io_result) == 0); + g_exit_calls[g_exit_call_count++] = procedure; + if (g_exit_successor != 0) { + g_borland_exit_proc = g_exit_successor; + g_exit_successor = 0; + } +} + +_Noreturn void win16_dos_terminate(uint8_t status) +{ + g_terminated_status = status; + if (g_expect_terminate) { + longjmp(g_terminate_jump, 1); + } + abort(); +} + +BorlandAllocationAttempt borland_try_get_mem(uint16_t bytes) +{ + assert(bytes == g_borland_heap_reserve_bytes); + return (BorlandAllocationAttempt){g_next_allocation, g_try_get_failed}; +} + +bool borland_try_free_mem(Win16FarPtr block, uint16_t bytes) +{ + g_freed_block = block; + g_freed_bytes = bytes; + return g_try_free_failed; +} + +int main(void) +{ + static uint8_t code[0x4000]; + static uint8_t dgroup[0x1000]; + win16_reset_segment_bindings(); + win16_bind_ne_segment(2, 0x6000, code, sizeof(code), false); + win16_bind_segment(0x5000, dgroup, sizeof(dgroup), true); + win16_set_dgroup_selector(0x5000); + win16_set_indeterminate_u16(0xbeef); + code[0] = 2; + + g_global_handle = 0; + assert(borland_global_allocate(1234) == 0); + g_global_handle = 9; + g_global_pointer = win16_make_far_pointer(0x8123, 0x0040); + assert(borland_global_allocate(1234) == g_global_pointer); + + static uint8_t move_source[32]; + static uint8_t move_destination[32]; + for (uint8_t index = 0; index < sizeof(move_source); index++) { + move_source[index] = index; + } + memset(move_destination, 0, sizeof(move_destination)); + win16_bind_segment(0x7100, move_source, sizeof(move_source), true); + win16_bind_segment( + 0x7200, move_destination, sizeof(move_destination), true); + + borland_move_bytes( + win16_make_far_pointer(0x7200, 2), + win16_make_far_pointer(0x7100, 8), + 6); + assert(memcmp(&move_destination[2], &move_source[8], 6) == 0); + + /* Source offset below destination selects STD even across selectors. */ + borland_move_bytes( + win16_make_far_pointer(0x7200, 12), + win16_make_far_pointer(0x7100, 2), + 6); + assert(memcmp(&move_destination[12], &move_source[2], 6) == 0); + + memcpy(move_destination, move_source, sizeof(move_destination)); + borland_move_bytes( + win16_make_far_pointer(0x7200, 6), + win16_make_far_pointer(0x7200, 2), + 12); + assert(memcmp(&move_destination[6], &move_source[2], 12) == 0); + uint8_t before_zero_move[sizeof(move_destination)]; + memcpy(before_zero_move, move_destination, sizeof(move_destination)); + borland_move_bytes( + win16_make_far_pointer(0x7200, 30), + win16_make_far_pointer(0x7100, 31), + 0); + assert(memcmp( + move_destination, + before_zero_move, + sizeof(move_destination)) == 0); + + static uint8_t record_source[24]; + static uint8_t record_destination[24]; + for (uint8_t index = 0; index < sizeof(record_source); index++) { + record_source[index] = (uint8_t)(0xa0u + index); + } + memset(record_destination, 0x55, sizeof(record_destination)); + win16_bind_segment( + 0x7300, record_source, sizeof(record_source), true); + win16_bind_segment( + 0x7400, record_destination, sizeof(record_destination), true); + win16_write_u16(win16_make_far_pointer(0x5000, 0x0300), 0, 10); + win16_write_u16(win16_make_far_pointer(0x7400, 10), 0, 0x0300); + + borland_copy_typed_record( + 6, + win16_make_far_pointer(0x7400, 4), + win16_make_far_pointer(0x7300, 2)); + assert(memcmp(&record_destination[4], &record_source[2], 6) == 0); + assert(record_destination[12] == record_source[10]); + assert(record_destination[13] == record_source[11]); + assert(win16_read_u16(win16_make_far_pointer(0x7400, 10)) == 0x0300); + + win16_write_u16(win16_make_far_pointer(0x5000, 0x0302), 0, 0); + win16_write_u16(win16_make_far_pointer(0x7400, 16), 0, 0x0302); + borland_copy_typed_record( + 1, + win16_make_far_pointer(0x7400, 15), + win16_make_far_pointer(0x7500, 0xffff)); + assert(win16_read_u16(win16_make_far_pointer(0x7400, 16)) == 0x0302); + + g_borland_heap_reserve = 0; + g_next_allocation = win16_make_far_pointer(0x7000, 0x0100); + assert(borland_heap_reserve_is_unallocated()); + borland_ensure_heap_reserve(); + assert(g_borland_heap_reserve == g_next_allocation); + borland_ensure_heap_reserve(); + assert(g_borland_heap_reserve == g_next_allocation); + + g_borland_heap_reserve_disabled = 1; + assert(borland_release_heap_reserve_on_oom(64) == 1); + assert(g_borland_heap_reserve == g_next_allocation); + + g_borland_heap_reserve_disabled = 0; + g_freed_block = 0; + assert(borland_release_heap_reserve_on_oom(64) == 2); + assert(g_freed_block == g_next_allocation && g_freed_bytes == 0x2000); + assert(g_borland_heap_reserve == 0); + assert(borland_release_heap_reserve_on_oom(64) == 0); + assert(borland_release_heap_reserve_on_oom(0) == 0xbeef); + + borland_initialize_heap_reserve(); + assert(g_borland_heap_reserve == g_next_allocation); + assert(g_borland_heap_error_handler == + win16_make_far_pointer(0x6000, 0x2e22)); + + g_try_get_failed = false; + g_next_allocation = win16_make_far_pointer(0x7000, 0x0200); + assert(borland_get_mem(g_borland_heap_reserve_bytes) == g_next_allocation); + g_try_free_failed = false; + borland_free_mem(g_next_allocation, g_borland_heap_reserve_bytes); + + g_borland_windows_mode = 0; + g_expect_terminate = true; + g_try_get_failed = true; + win16_set_current_return_address( + win16_make_far_pointer(0xffff, 0x2222)); + if (setjmp(g_terminate_jump) == 0) { + (void)borland_get_mem(g_borland_heap_reserve_bytes); + assert(false); + } + assert(g_terminated_status == 203); + assert(g_borland_error_offset == 0x2222); + assert(g_borland_error_segment == 0xffff); + + g_try_get_failed = false; + g_try_free_failed = true; + win16_set_current_return_address( + win16_make_far_pointer(0x6000, 0x3333)); + if (setjmp(g_terminate_jump) == 0) { + borland_free_mem(g_next_allocation, g_borland_heap_reserve_bytes); + assert(false); + } + assert(g_terminated_status == 204); + assert(g_borland_error_offset == 0x3333); + assert(g_borland_error_segment == 2); + + atomic_store(&g_borland_io_result, 0); + borland_require_io_success(); + BorlandInt32Range range = {-10, 20}; + borland_check_int32_range(-10, &range); + borland_check_int32_range(20, &range); + + atomic_store(&g_borland_io_result, 5); + win16_set_current_return_address( + win16_make_far_pointer(0xffff, 0x4444)); + if (setjmp(g_terminate_jump) == 0) { + borland_require_io_success(); + assert(false); + } + assert(g_terminated_status == 5); + + win16_set_current_return_address( + win16_make_far_pointer(0xffff, 0x5555)); + if (setjmp(g_terminate_jump) == 0) { + borland_check_int32_range(-11, &range); + assert(false); + } + assert(g_terminated_status == 201); + if (setjmp(g_terminate_jump) == 0) { + borland_check_int32_range(21, &range); + assert(false); + } + assert(g_terminated_status == 201); + if (setjmp(g_terminate_jump) == 0) { + borland_runtime_error_215(); + assert(false); + } + assert(g_terminated_status == 215); + + g_exit_call_count = 0; + g_borland_exit_proc = win16_make_far_pointer(0x7000, 0x0100); + g_exit_successor = win16_make_far_pointer(0x7000, 0x0200); + atomic_store(&g_borland_io_result, 99); + borland_run_exit_procedures(); + assert(g_exit_call_count == 2); + assert(g_exit_calls[0] == win16_make_far_pointer(0x7000, 0x0100)); + assert(g_exit_calls[1] == win16_make_far_pointer(0x7000, 0x0200)); + assert(g_borland_exit_proc == 0); + assert(atomic_load(&g_borland_io_result) == 0); + + g_borland_windows_mode = 0; + if (setjmp(g_terminate_jump) == 0) { + borland_runtime_exit(0x1234); + assert(false); + } + assert(g_borland_exit_code_word == 0x1234); + assert(g_terminated_status == 0x34); + assert(g_borland_error_offset == 0 && g_borland_error_segment == 0); + + strcpy(g_borland_runtime_error_text, + "Runtime error 000 at 0000:0000."); + g_borland_windows_mode = 1; + g_message_box_calls = 0; + win16_set_current_return_address( + win16_make_far_pointer(0x6000, 0x3333)); + if (setjmp(g_terminate_jump) == 0) { + borland_runtime_error(201); + assert(false); + } + assert(g_terminated_status == 201); + assert(g_message_box_calls == 1 && g_message_box_type == 0x1010); + assert(strcmp(g_borland_runtime_error_text, + "Runtime error 201 at 0002:3333.") == 0); + g_expect_terminate = false; + return 0; +} diff --git a/original/reconstructed/tests/test_highscores.c b/original/reconstructed/tests/test_highscores.c new file mode 100644 index 0000000..fd4af0c --- /dev/null +++ b/original/reconstructed/tests/test_highscores.c @@ -0,0 +1,688 @@ +#include "../tdkpin_highscores.h" + +#include +#include +#include +#include + +enum { + FILE_HEADER_BYTES = 16, + SCORE_BYTES = TDKPIN_HIGHSCORE_COUNT * 4, + NAME_BYTES = TDKPIN_HIGHSCORE_COUNT * TDKPIN_HIGHSCORE_NAME_BYTES, + FILE_BYTES = FILE_HEADER_BYTES + SCORE_BYTES + NAME_BYTES, +}; + +static uint8_t g_dgroup[0x5000]; +static uint8_t g_objects[0x1000]; +static uint8_t g_call_stack[0x1000]; +static uint8_t g_file_bytes[FILE_BYTES]; +static uint8_t g_input_bytes[FILE_BYTES]; +static bool g_create_fails; +static unsigned g_create_calls; +static HFILE16 g_open_results[2]; +static unsigned g_open_calls; +static uint16_t g_input_position; +static uint16_t g_input_size; +static uint16_t g_read_limits[3]; +static unsigned g_read_calls; +static unsigned g_write_calls; +static unsigned g_close_calls; +static uint16_t g_file_position; +static unsigned g_dialog_construct_calls; +static unsigned g_dialog_exec_calls; +static unsigned g_child_construct_calls; +static unsigned g_make_window_calls; +static unsigned g_show_calls; +static Win16FarPtr g_dialog; +static Win16FarPtr g_child; +static Win16FarPtr g_made_child; +static Win16FarPtr g_application; +static Win16FarPtr g_receiver; +static Win16FarPtr g_exec_dialog_procedure; +static Win16FarPtr g_make_window_procedure; +static unsigned g_select_palette_calls; +static unsigned g_unrealize_calls; +static unsigned g_realize_calls; +static unsigned g_compatible_dc_calls; +static unsigned g_compatible_bitmap_calls; +static unsigned g_select_object_calls; +static unsigned g_bitblt_calls; +static unsigned g_text_color_calls; +static unsigned g_text_align_calls; +static unsigned g_bk_mode_calls; +static unsigned g_text_out_calls; +static unsigned g_delete_object_calls; +static unsigned g_delete_dc_calls; +static char g_drawn_text[21][64]; +static INT16 g_drawn_x[21]; +static INT16 g_drawn_y[21]; + +static Win16FarPtr dgroup_at(uint16_t offset) +{ + return win16_make_far_pointer(0x5000, offset); +} + +static Win16FarPtr object_at(uint16_t offset) +{ + return win16_make_far_pointer(0x6000, offset); +} + +Win16FarPtr object_windows_text_dialog_construct( + Win16FarPtr dialog, + uint16_t vmt, + INT16 control_id, + Win16FarPtr text_buffer, + Win16FarPtr label, + Win16FarPtr caption, + Win16FarPtr parent) +{ + assert(dialog == 0 && vmt == 0x01ce && control_id == 0x0016); + uint8_t insertion = g_dgroup[0x07d2]; + assert(text_buffer == dgroup_at((uint16_t)(0x0890 + insertion * 22u))); + assert(label == dgroup_at(0x0373)); + assert(caption == dgroup_at(0x0349)); + assert(parent == g_receiver); + g_dialog_construct_calls++; + return g_dialog; +} + +Win16FarPtr tdkpin_centered_child_window_construct( + Win16FarPtr window, + uint16_t vmt, + Win16FarPtr title, + Win16FarPtr parent) +{ + assert(window == 0 && vmt == 0x010e); + assert(title == dgroup_at(0x038b) && parent == g_receiver); + g_child_construct_calls++; + return g_child; +} + +int16_t win16_call_application_dialog_method( + Win16FarPtr procedure, + Win16FarPtr application, + Win16FarPtr dialog) +{ + assert(procedure == g_exec_dialog_procedure); + assert(application == g_application && dialog == g_dialog); + g_dialog_exec_calls++; + return 17; +} + +Win16FarPtr win16_call_application_window_method( + Win16FarPtr procedure, + Win16FarPtr application, + Win16FarPtr window) +{ + assert(procedure == g_make_window_procedure); + assert(application == g_application && window == g_child); + g_make_window_calls++; + return g_made_child; +} + +void object_windows_show(Win16FarPtr object, INT16 command) +{ + assert(object == g_made_child && command == 1); + g_show_calls++; +} + +HPALETTE16 SelectPalette16( + HDC16 dc, HPALETTE16 palette, BOOL16 force_background) +{ + assert(dc == 0x1111 && force_background == 0); + if (g_select_palette_calls == 0) { + assert(palette == 0x2222); + g_select_palette_calls++; + return 0x3333; + } + assert(g_select_palette_calls == 1 && palette == 0x3333); + g_select_palette_calls++; + return 0x2222; +} + +BOOL16 UnrealizeObject16(HGDIOBJ16 object) +{ + assert(object == 0x2222); + g_unrealize_calls++; + return 1; +} + +UINT16 RealizePalette16(HDC16 dc) +{ + assert(dc == 0x1111); + g_realize_calls++; + return 5; +} + +HDC16 CreateCompatibleDC16(HDC16 dc) +{ + assert(dc == 0x1111 && g_compatible_dc_calls < 2); + return (HDC16)(0x4001 + g_compatible_dc_calls++); +} + +HBITMAP16 CreateCompatibleBitmap16(HDC16 dc, INT16 width, INT16 height) +{ + assert(dc == 0x1111 && width == 360 && height == 300); + g_compatible_bitmap_calls++; + return 0x5002; +} + +HGDIOBJ16 SelectObject16(HDC16 dc, HGDIOBJ16 object) +{ + switch (g_select_object_calls++) { + case 0: + assert(dc == 0x4001 && object == 0x5001); + return 0x6001; + case 1: + assert(dc == 0x4002 && object == 0x5002); + return 0x6002; + case 2: + assert(dc == 0x4002 && object == 0x6002); + return 0x5002; + default: + assert(g_select_object_calls == 4); + assert(dc == 0x4001 && object == 0x6001); + return 0x5001; + } +} + +COLORREF16 GetTextColor16(HDC16 dc) +{ + assert(dc == 0x4002); + return 0x00112233u; +} + +COLORREF16 SetTextColor16(HDC16 dc, COLORREF16 color) +{ + assert(dc == 0x4002 && g_text_color_calls < 2); + assert(color == (g_text_color_calls == 0 ? 0 : 0x00112233u)); + g_text_color_calls++; + return color == 0 ? 0x00112233u : 0; +} + +UINT16 SetTextAlign16(HDC16 dc, UINT16 alignment) +{ + assert(dc == 0x4002 && g_text_align_calls < 22); + if (g_text_align_calls == 0) { + assert(alignment == 6); + } else if (g_text_align_calls == 21) { + assert(alignment == 7); + } else { + assert(alignment == (g_text_align_calls & 1u ? 0 : 2)); + } + g_text_align_calls++; + return g_text_align_calls == 1 ? 7 : 0; +} + +INT16 SetBkMode16(HDC16 dc, INT16 mode) +{ + assert(dc == 0x4002 && g_bk_mode_calls < 2); + assert(mode == (g_bk_mode_calls == 0 ? 1 : 2)); + g_bk_mode_calls++; + return mode == 1 ? 2 : 1; +} + +BOOL16 BitBlt16( + HDC16 destination, + INT16 destination_x, + INT16 destination_y, + INT16 width, + INT16 height, + HDC16 source, + INT16 source_x, + INT16 source_y, + uint32_t raster_operation) +{ + assert(destination_x == 0 && destination_y == 0); + assert(width == 360 && height == 300); + assert(raster_operation == 0x00cc0020u); + if (g_bitblt_calls == 0) { + assert(destination == 0x4002 && source == 0x4001); + assert(source_x == 32 && source_y == 204); + } else { + assert(g_bitblt_calls == 1); + assert(destination == 0x1111 && source == 0x4002); + assert(source_x == 0 && source_y == 0); + } + g_bitblt_calls++; + return 1; +} + +BOOL16 TextOut16( + HDC16 dc, + INT16 x, + INT16 y, + Win16FarPtr text, + INT16 character_count) +{ + assert(dc == 0x4002 && g_text_out_calls < 21); + assert(character_count >= 0 && character_count < 64); + for (INT16 index = 0; index < character_count; index++) { + g_drawn_text[g_text_out_calls][index] = (char)win16_read_u8( + win16_far_add_offset(text, (uint16_t)index)); + } + g_drawn_text[g_text_out_calls][character_count] = '\0'; + g_drawn_x[g_text_out_calls] = x; + g_drawn_y[g_text_out_calls] = y; + g_text_out_calls++; + return 1; +} + +BOOL16 DeleteObject16(HGDIOBJ16 object) +{ + assert(object == 0x5002); + g_delete_object_calls++; + return 1; +} + +BOOL16 DeleteDC16(HDC16 dc) +{ + assert(dc == (g_delete_dc_calls == 0 ? 0x4002 : 0x4001)); + g_delete_dc_calls++; + return 1; +} + +HFILE16 LCreate16(Win16FarPtr file_name, INT16 attributes) +{ + static const char expected_name[] = "HiScores.Dat"; + assert(file_name == dgroup_at(0x0312)); + assert(attributes == 0); + for (size_t index = 0; index < sizeof(expected_name); index++) { + assert(win16_read_u8(win16_far_add_offset(file_name, index)) == + (uint8_t)expected_name[index]); + } + g_create_calls++; + return g_create_fails ? (HFILE16)-1 : (HFILE16)7; +} + +HFILE16 LOpen16(Win16FarPtr file_name, INT16 mode) +{ + assert(file_name == dgroup_at(0x0320)); + assert(g_open_calls < 2); + assert(mode == (g_open_calls == 0 ? 0 : 0x40)); + return g_open_results[g_open_calls++]; +} + +UINT16 LRead16(HFILE16 file, Win16FarPtr bytes, UINT16 byte_count) +{ + assert(file == 9 && g_read_calls < 3); + static const uint16_t expected_counts[3] = { + FILE_HEADER_BYTES, SCORE_BYTES, NAME_BYTES}; + assert(byte_count == expected_counts[g_read_calls]); + uint16_t copied = byte_count; + if (copied > g_read_limits[g_read_calls]) { + copied = g_read_limits[g_read_calls]; + } + uint16_t available = (uint16_t)(g_input_size - g_input_position); + if (copied > available) { + copied = available; + } + for (uint16_t index = 0; index < copied; index++) { + win16_write_u8( + win16_far_add_offset(bytes, index), + g_input_bytes[g_input_position + index]); + } + g_input_position = (uint16_t)(g_input_position + copied); + g_read_calls++; + return copied; +} + +UINT16 LWrite16(HFILE16 file, Win16FarPtr bytes, UINT16 byte_count) +{ + assert(file == 7); + if (g_write_calls == 0) { + assert(bytes == dgroup_at(0x0014)); + assert(byte_count == FILE_HEADER_BYTES); + } else if (g_write_calls == 1) { + assert(byte_count == SCORE_BYTES); + } else { + assert(g_write_calls == 2 && byte_count == NAME_BYTES); + } + for (uint16_t index = 0; index < byte_count; index++) { + g_file_bytes[g_file_position + index] = + win16_read_u8(win16_far_add_offset(bytes, index)); + } + g_file_position = (uint16_t)(g_file_position + byte_count); + g_write_calls++; + return byte_count; +} + +HFILE16 LClose16(HFILE16 file) +{ + assert(file == 7 || file == 9); + g_close_calls++; + return 0; +} + +static void prepare_fixture(void) +{ + memset(g_dgroup, 0, sizeof(g_dgroup)); + memset(g_objects, 0, sizeof(g_objects)); + memset(g_call_stack, 0, sizeof(g_call_stack)); + memset(g_file_bytes, 0xcc, sizeof(g_file_bytes)); + memset(g_input_bytes, 0, sizeof(g_input_bytes)); + memcpy(&g_dgroup[0x0010], "IWIKTDK Highscores\0\0", 20); + memcpy(&g_dgroup[0x0312], "HiScores.Dat", 13); + memcpy(&g_dgroup[0x0320], "HiScores.Dat", 13); + memcpy(&g_dgroup[0x032d], "No Name", 8); + memcpy(&g_dgroup[0x0336], "TDK Pinball Player", 19); + memcpy( + &g_dgroup[0x0349], + "Congratulations! This is a Top Ten Score!", + 42); + memcpy(&g_dgroup[0x0373], "Please input your name:", 24); + memcpy(&g_dgroup[0x038b], "HighScore", 10); + memcpy(&g_dgroup[0x02f4], "HIGH SCORES", 12); + memcpy(&g_dgroup[0x0300], " ", 3); + memcpy(&g_dgroup[0x0303], ". ", 3); + for (uint16_t index = 1; index <= TDKPIN_HIGHSCORE_COUNT; index++) { + uint32_t score = 0x10203040u + (uint32_t)index * 0x01010101u; + g_dgroup[0x087a + index * 4u] = (uint8_t)score; + g_dgroup[0x087b + index * 4u] = (uint8_t)(score >> 8); + g_dgroup[0x087c + index * 4u] = (uint8_t)(score >> 16); + g_dgroup[0x087d + index * 4u] = (uint8_t)(score >> 24); + char name[TDKPIN_HIGHSCORE_NAME_BYTES]; + memset(name, 0, sizeof(name)); + name[0] = 'P'; + name[1] = (char)('0' + index / 10u); + name[2] = (char)('0' + index % 10u); + memcpy( + &g_dgroup[0x0890 + index * TDKPIN_HIGHSCORE_NAME_BYTES], + name, + sizeof(name)); + } + g_create_fails = false; + g_create_calls = 0; + g_open_results[0] = (HFILE16)-1; + g_open_results[1] = (HFILE16)-1; + g_open_calls = 0; + g_input_position = 0; + g_input_size = FILE_BYTES; + for (unsigned index = 0; index < 3; index++) { + g_read_limits[index] = UINT16_MAX; + } + g_read_calls = 0; + g_write_calls = 0; + g_close_calls = 0; + g_file_position = 0; + g_dialog_construct_calls = 0; + g_dialog_exec_calls = 0; + g_child_construct_calls = 0; + g_make_window_calls = 0; + g_show_calls = 0; + g_dialog = object_at(0x200); + g_child = object_at(0x300); + g_made_child = object_at(0x350); + g_application = object_at(0x400); + g_receiver = object_at(0x100); + g_exec_dialog_procedure = win16_make_far_pointer(0x8000, 0x0038); + g_make_window_procedure = win16_make_far_pointer(0x8000, 0x0034); + g_select_palette_calls = 0; + g_unrealize_calls = 0; + g_realize_calls = 0; + g_compatible_dc_calls = 0; + g_compatible_bitmap_calls = 0; + g_select_object_calls = 0; + g_bitblt_calls = 0; + g_text_color_calls = 0; + g_text_align_calls = 0; + g_bk_mode_calls = 0; + g_text_out_calls = 0; + g_delete_object_calls = 0; + g_delete_dc_calls = 0; + memset(g_drawn_text, 0, sizeof(g_drawn_text)); + + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, g_dgroup, sizeof(g_dgroup), true); + win16_bind_segment(0x6000, g_objects, sizeof(g_objects), true); + win16_bind_segment(0x7100, g_call_stack, sizeof(g_call_stack), true); + win16_set_dgroup_selector(0x5000); + uint8_t stack_anchor = 0; + uintptr_t stack_base = (uintptr_t)&stack_anchor - 0x8000u; + win16_bind_segment(0x7000, (void *)stack_base, 0x10000, true); + win16_set_stack_state(0x7100, 0); + win16_write_stack_u16(0x0106, win16_far_offset(g_receiver)); + win16_write_stack_u16(0x0108, win16_far_selector(g_receiver)); + win16_write_u16(g_application, 0, 0x0200); + win16_write_u32(dgroup_at(0x0234), 0, g_make_window_procedure); + win16_write_u32(dgroup_at(0x0238), 0, g_exec_dialog_procedure); + win16_write_u32( + dgroup_at(0x064e), 0, g_application); + win16_write_u16(dgroup_at(0x444e), 0, 0x2222); + win16_write_u16(dgroup_at(0x0867), 0, 0x5001); +} + +static uint32_t read_dgroup_u32(uint16_t offset) +{ + return (uint32_t)g_dgroup[offset] | + ((uint32_t)g_dgroup[offset + 1] << 8) | + ((uint32_t)g_dgroup[offset + 2] << 16) | + ((uint32_t)g_dgroup[offset + 3] << 24); +} + +static void prepare_valid_input_file(void) +{ + memcpy(g_input_bytes, &g_dgroup[0x0014], FILE_HEADER_BYTES); + const uint32_t key = 0x4b495749u; + for (uint16_t index = 1; index <= TDKPIN_HIGHSCORE_COUNT; index++) { + uint32_t score = 0x01020304u * index; + uint32_t encrypted = score ^ key; + uint16_t score_offset = (uint16_t)( + FILE_HEADER_BYTES + (index - 1u) * 4u); + g_input_bytes[score_offset] = (uint8_t)encrypted; + g_input_bytes[score_offset + 1] = (uint8_t)(encrypted >> 8); + g_input_bytes[score_offset + 2] = (uint8_t)(encrypted >> 16); + g_input_bytes[score_offset + 3] = (uint8_t)(encrypted >> 24); + uint16_t name_offset = (uint16_t)( + FILE_HEADER_BYTES + SCORE_BYTES + + (index - 1u) * TDKPIN_HIGHSCORE_NAME_BYTES); + g_input_bytes[name_offset] = 'L'; + g_input_bytes[name_offset + 1] = (uint8_t)('0' + index / 10u); + g_input_bytes[name_offset + 2] = (uint8_t)('0' + index % 10u); + } +} + +static uint32_t file_u32(uint16_t offset) +{ + return (uint32_t)g_file_bytes[offset] | + ((uint32_t)g_file_bytes[offset + 1] << 8) | + ((uint32_t)g_file_bytes[offset + 2] << 16) | + ((uint32_t)g_file_bytes[offset + 3] << 24); +} + +static void test_complete_file_layout(void) +{ + prepare_fixture(); + tdkpin_save_highscores(0xbeef); + assert(g_create_calls == 1 && g_write_calls == 3 && g_close_calls == 1); + assert(g_file_position == FILE_BYTES); + assert(memcmp(g_file_bytes, "TDK Highscores\0\0", FILE_HEADER_BYTES) == 0); + + const uint32_t key = 0x4b495749u; + for (uint16_t index = 1; index <= TDKPIN_HIGHSCORE_COUNT; index++) { + uint32_t score = 0x10203040u + (uint32_t)index * 0x01010101u; + assert(file_u32((uint16_t)( + FILE_HEADER_BYTES + (index - 1u) * 4u)) == + (score ^ key)); + const uint8_t *name = &g_file_bytes[ + FILE_HEADER_BYTES + SCORE_BYTES + + (index - 1u) * TDKPIN_HIGHSCORE_NAME_BYTES]; + assert(name[0] == 'P'); + assert(name[1] == (uint8_t)('0' + index / 10u)); + assert(name[2] == (uint8_t)('0' + index % 10u)); + for (uint16_t byte = 3; byte < TDKPIN_HIGHSCORE_NAME_BYTES; byte++) { + assert(name[byte] == 0); + } + } +} + +static void test_create_failure_is_silent(void) +{ + prepare_fixture(); + g_create_fails = true; + tdkpin_save_highscores(0x1234); + assert(g_create_calls == 1); + assert(g_write_calls == 0 && g_close_calls == 0 && g_file_position == 0); +} + +static void assert_default_table(void) +{ + for (uint16_t index = 1; index <= TDKPIN_HIGHSCORE_COUNT; index++) { + assert(read_dgroup_u32((uint16_t)(0x087a + index * 4u)) == + (uint32_t)(11u - index) * 100000u); + const uint8_t *name = + &g_dgroup[0x0890 + index * TDKPIN_HIGHSCORE_NAME_BYTES]; + assert(memcmp(name, "No Name", 8) == 0); + } +} + +static void test_valid_load_and_open_retry(void) +{ + prepare_fixture(); + prepare_valid_input_file(); + g_open_results[0] = (HFILE16)-1; + g_open_results[1] = 9; + tdkpin_load_highscores(0xaaaa); + assert(g_open_calls == 2 && g_read_calls == 3 && g_close_calls == 1); + for (uint16_t index = 1; index <= TDKPIN_HIGHSCORE_COUNT; index++) { + assert(read_dgroup_u32((uint16_t)(0x087a + index * 4u)) == + 0x01020304u * index); + const uint8_t *name = + &g_dgroup[0x0890 + index * TDKPIN_HIGHSCORE_NAME_BYTES]; + assert(name[0] == 'L'); + assert(name[1] == (uint8_t)('0' + index / 10u)); + assert(name[2] == (uint8_t)('0' + index % 10u)); + } +} + +static void test_missing_and_invalid_files_install_defaults(void) +{ + prepare_fixture(); + tdkpin_load_highscores(0); + assert(g_open_calls == 2 && g_read_calls == 0 && g_close_calls == 0); + assert_default_table(); + + prepare_fixture(); + prepare_valid_input_file(); + g_input_bytes[0] ^= 0xffu; + g_open_results[0] = 9; + tdkpin_load_highscores(0); + assert(g_open_calls == 1 && g_read_calls == 1 && g_close_calls == 1); + assert_default_table(); +} + +static void test_short_score_read_retains_stack_residue(void) +{ + prepare_fixture(); + prepare_valid_input_file(); + g_open_results[0] = 9; + g_read_limits[1] = 4; + win16_set_indeterminate_u16(0x5a5a); + tdkpin_load_highscores(0); + assert(g_read_calls == 3 && g_close_calls == 1); + assert(read_dgroup_u32(0x087e) == 0x01020304u); + for (uint16_t index = 2; index <= TDKPIN_HIGHSCORE_COUNT; index++) { + assert(read_dgroup_u32((uint16_t)(0x087a + index * 4u)) == + (0x5a5a5a5au ^ 0x4b495749u)); + } +} + +static void test_highscore_windows(void) +{ + prepare_fixture(); + g_dgroup[0x07d2] = 0; + tdkpin_show_highscore_windows(0x0100); + assert(g_dialog_construct_calls == 0 && g_dialog_exec_calls == 0); + assert(g_child_construct_calls == 1 && g_make_window_calls == 1); + assert(g_show_calls == 1); + assert(win16_read_far_pointer(g_receiver, 0x41) == g_made_child); + + prepare_fixture(); + g_dgroup[0x07d2] = 3; + memcpy(&g_dgroup[0x0890 + 3 * 22], "old", 4); + tdkpin_show_highscore_windows(0x0100); + assert(memcmp(&g_dgroup[0x0890 + 3 * 22], + "TDK Pinball Player", 19) == 0); + assert(g_dialog_construct_calls == 1 && g_dialog_exec_calls == 1); + assert(g_child_construct_calls == 1 && g_make_window_calls == 1); + assert(g_show_calls == 1); +} + +static void prepare_descending_scores(void) +{ + for (uint16_t index = 1; index <= TDKPIN_HIGHSCORE_COUNT; index++) { + uint32_t score = (uint32_t)(11u - index) * 100u; + win16_write_u32(dgroup_at((uint16_t)(0x087a + index * 4u)), 0, score); + uint8_t *name = &g_dgroup[0x0890 + index * 22u]; + memset(name, 0, 22); + name[0] = 'P'; + name[1] = (uint8_t)('0' + index / 10u); + name[2] = (uint8_t)('0' + index % 10u); + } + g_dgroup[0x07d1] = 1; +} + +static void test_score_insertion_and_no_qualification(void) +{ + prepare_fixture(); + prepare_descending_scores(); + win16_write_u32(dgroup_at(0x0982), 0, 750); + tdkpin_insert_current_score(0x0100); + assert(g_dgroup[0x07d2] == 4); + assert(read_dgroup_u32(0x088a) == 750); + assert(read_dgroup_u32(0x088e) == 700); + assert(memcmp(&g_dgroup[0x0890 + 5 * 22], "P04", 4) == 0); + assert(memcmp(&g_dgroup[0x0890 + 4 * 22], + "TDK Pinball Player", 19) == 0); + assert(g_dialog_exec_calls == 1 && g_show_calls == 1); + assert(g_create_calls == 1 && g_write_calls == 3 && g_close_calls == 1); + + prepare_fixture(); + prepare_descending_scores(); + win16_write_u32(dgroup_at(0x0982), 0, 100); + tdkpin_insert_current_score(0x0100); + assert(g_dgroup[0x07d2] == 0); + assert(g_dialog_exec_calls == 0 && g_show_calls == 0); + assert(g_create_calls == 0 && g_write_calls == 0 && g_close_calls == 0); +} + +static void test_highscore_paint(void) +{ + prepare_fixture(); + prepare_descending_scores(); + PAINTSTRUCT16 ignored_paint; + memset(&ignored_paint, 0xa5, sizeof(ignored_paint)); + tdkpin_paint_highscores(object_at(0x777), &ignored_paint, 0x1111); + + assert(g_select_palette_calls == 2); + assert(g_unrealize_calls == 1 && g_realize_calls == 1); + assert(g_compatible_dc_calls == 2 && g_compatible_bitmap_calls == 1); + assert(g_select_object_calls == 4 && g_bitblt_calls == 2); + assert(g_text_color_calls == 2 && g_text_align_calls == 22); + assert(g_bk_mode_calls == 2 && g_text_out_calls == 21); + assert(g_delete_object_calls == 1 && g_delete_dc_calls == 2); + + assert(strcmp(g_drawn_text[0], "HIGH SCORES") == 0); + assert(g_drawn_x[0] == 180 && g_drawn_y[0] == 27); + assert(strcmp(g_drawn_text[1], " 1. P01") == 0); + assert(g_drawn_x[1] == 30 && g_drawn_y[1] == 60); + assert(strcmp(g_drawn_text[2], "1000") == 0); + assert(g_drawn_x[2] == 320 && g_drawn_y[2] == 60); + assert(strcmp(g_drawn_text[19], "10. P10") == 0); + assert(g_drawn_x[19] == 30 && g_drawn_y[19] == 240); + assert(strcmp(g_drawn_text[20], "100") == 0); + assert(g_drawn_x[20] == 320 && g_drawn_y[20] == 240); +} + +int main(void) +{ + test_complete_file_layout(); + test_create_failure_is_silent(); + test_valid_load_and_open_retry(); + test_missing_and_invalid_files_install_defaults(); + test_short_score_read_retains_stack_residue(); + test_highscore_windows(); + test_score_insertion_and_no_qualification(); + test_highscore_paint(); + return 0; +} diff --git a/original/reconstructed/tests/test_initialization.c b/original/reconstructed/tests/test_initialization.c new file mode 100644 index 0000000..401e31c --- /dev/null +++ b/original/reconstructed/tests/test_initialization.c @@ -0,0 +1,9 @@ +#include "../tdkpin_initialization.h" + +int main(void) +{ + tdkpin_initialize_unit_ordinal_91(); + tdkpin_initialize_unit_ordinal_86(); + tdkpin_initialize_unit_ordinal_72(); + return 0; +} diff --git a/original/reconstructed/tests/test_key_input.c b/original/reconstructed/tests/test_key_input.c new file mode 100644 index 0000000..373e945 --- /dev/null +++ b/original/reconstructed/tests/test_key_input.c @@ -0,0 +1,167 @@ +#include "../tdkpin_key_input.h" + +#include +#include + +static uint8_t g_dgroup[0x5000]; +static uint8_t g_objects[0x1000]; +static Win16FarPtr g_window; +static Win16FarPtr g_event; +static Win16FarPtr g_application; +static Win16FarPtr g_child; +static unsigned g_construct_calls; +static unsigned g_make_calls; +static unsigned g_show_calls; +static unsigned g_get_dc_calls; +static unsigned g_release_dc_calls; +static unsigned g_row_calls; +static INT16 g_last_row; + +Win16FarPtr tdkpin_full_child_window_construct( + Win16FarPtr window, + uint16_t vmt, + Win16FarPtr title, + Win16FarPtr parent) +{ + assert(window == 0 && vmt == 0x017e); + assert(title == win16_dgroup_pointer(0x0306) && parent == g_window); + g_construct_calls++; + return g_child; +} + +Win16FarPtr win16_call_application_window_method( + Win16FarPtr procedure, + Win16FarPtr application, + Win16FarPtr window) +{ + assert(procedure == win16_make_far_pointer(0x8000, 0x0034)); + assert(application == g_application && window == g_child); + g_make_calls++; + return g_child; +} + +void object_windows_show(Win16FarPtr object, INT16 command) +{ + assert(object == g_child && command == 1); + g_show_calls++; +} + +int32_t borland_multiply_i32(int32_t left, int32_t right) +{ + return (int32_t)((uint32_t)left * (uint32_t)right); +} + +HDC16 GetDC16(HWND16 window) +{ + assert(window == 0x2222); + g_get_dc_calls++; + return 0x3333; +} + +INT16 ReleaseDC16(HWND16 window, HDC16 dc) +{ + assert(window == 0x2222 && dc == 0x3333); + g_release_dc_calls++; + return 1; +} + +void tdkpin_draw_board_decoration_row_on_dc(INT16 y, HDC16 dc) +{ + assert(dc == 0x3333); + g_last_row = y; + g_row_calls++; +} + +static void prepare_fixture(uint16_t scan_code) +{ + memset(g_dgroup, 0, sizeof(g_dgroup)); + memset(g_objects, 0, sizeof(g_objects)); + win16_reset_segment_bindings(); + win16_bind_segment(0x7000, g_objects, sizeof(g_objects), true); + win16_bind_segment(0x7200, g_dgroup, sizeof(g_dgroup), true); + win16_set_dgroup_selector(0x7200); + g_window = win16_make_far_pointer(0x7000, 0x0000); + g_event = win16_make_far_pointer(0x7000, 0x0c00); + g_application = win16_make_far_pointer(0x7000, 0x0800); + g_child = win16_make_far_pointer(0x7000, 0x0900); + win16_write_u16(g_window, 4, 0x2222); + win16_write_u16(g_event, 8, scan_code); + win16_write_u16(g_event, 0x0a, 0xaaaa); + win16_write_u16(g_event, 0x0c, 0xbbbb); + win16_write_u16(g_application, 0, 0x0200); + win16_write_u32( + win16_dgroup_pointer(0x0234), 0, + win16_make_far_pointer(0x8000, 0x0034)); + win16_write_u32(win16_dgroup_pointer(0x064e), 0, g_application); + g_construct_calls = 0; + g_make_calls = 0; + g_show_calls = 0; + g_get_dc_calls = 0; + g_release_dc_calls = 0; + g_row_calls = 0; + g_last_row = 0; +} + +static void test_help_and_auxiliary_gate(void) +{ + prepare_fixture(0x3b); + win16_set_indeterminate_u16(0xabcd); + assert(tdkpin_handle_key_press(g_window, g_event) == 0xabcd); + assert(g_construct_calls == 1 && g_make_calls == 1 && g_show_calls == 1); + assert(win16_read_far_pointer(g_window, 0x45) == g_child); + assert(win16_read_u16(win16_far_add_offset(g_event, 0x0a)) == 0xaaaa); + + prepare_fixture(0x1d); + win16_write_u16(g_window, 0x41, 1); + assert(tdkpin_handle_key_press(g_window, g_event) == 0); + assert(win16_read_u8(win16_far_add_offset(g_window, 0x0bda)) == 0); + assert(win16_read_u16(win16_far_add_offset(g_event, 0x0a)) == 0); + assert(win16_read_u16(win16_far_add_offset(g_event, 0x0c)) == 0); +} + +static void test_down_key_threshold_and_player_gate(void) +{ + prepare_fixture(0x50); + win16_write_u32(g_window, 0x5a, 100); + win16_write_u32(g_window, 0x0bae, (uint32_t)-12000); + win16_write_u32(g_window, 0x0baa, 0x12345678u); + win16_write_u8(win16_dgroup_pointer(0x07d0), 1); + tdkpin_handle_key_press(g_window, g_event); + assert((int32_t)win16_read_u32( + win16_far_add_offset(g_window, 0x0bae)) == -17000); + assert(win16_read_u32(win16_far_add_offset(g_window, 0x0baa)) == 0); + assert(g_row_calls == 1 && g_last_row == 84); + assert(g_get_dc_calls == 1 && g_release_dc_calls == 1); + + prepare_fixture(0x50); + win16_write_u32(g_window, 0x5a, 100); + win16_write_u32(g_window, 0x0bae, 1000); + tdkpin_handle_key_press(g_window, g_event); + assert((int32_t)win16_read_u32( + win16_far_add_offset(g_window, 0x0bae)) == -4000); + assert(g_row_calls == 0 && g_get_dc_calls == 0); +} + +static void test_flipper_keys_and_tilt(void) +{ + prepare_fixture(0x1d); + tdkpin_handle_key_press(g_window, g_event); + assert(win16_read_u8(win16_far_add_offset(g_window, 0x0bda)) == 1); + + prepare_fixture(0x1c); + tdkpin_handle_key_press(g_window, g_event); + assert(win16_read_u8(win16_far_add_offset(g_window, 0x0bdb)) == 1); + + prepare_fixture(0x1d); + win16_write_u8(win16_dgroup_pointer(0x07c6), 1); + tdkpin_handle_key_press(g_window, g_event); + assert(win16_read_u8(win16_far_add_offset(g_window, 0x0bda)) == 0); +} + +int main(void) +{ + test_help_and_auxiliary_gate(); + test_down_key_threshold_and_player_gate(); + test_flipper_keys_and_tilt(); + return 0; +} diff --git a/original/reconstructed/tests/test_key_release.c b/original/reconstructed/tests/test_key_release.c new file mode 100644 index 0000000..8915e5e --- /dev/null +++ b/original/reconstructed/tests/test_key_release.c @@ -0,0 +1,499 @@ +#include "../tdkpin_key_input.h" + +#include "../tdkpin_random.h" +#include "../tdkpin_real48.h" + +#include +#include + +static uint8_t g_dgroup[0x5000]; +static uint8_t g_objects[0x2000]; +static Win16FarPtr g_window; +static Win16FarPtr g_event; + +static uint16_t g_random_values[16]; +static uint16_t g_random_bounds[16]; +static size_t g_random_count; +static size_t g_random_index; +static uint16_t g_sounds[8]; +static size_t g_sound_count; +static unsigned g_get_dc_calls; +static unsigned g_release_dc_calls; +static unsigned g_blit_calls; +static unsigned g_restore_a_calls; +static unsigned g_restore_b_calls; +static unsigned g_present_calls; +static unsigned g_draw_item_calls; +static unsigned g_draw_score_calls; +static unsigned g_status_calls; + +typedef enum { + REAL_MODE_NONE, + REAL_MODE_UPPER_CLAMP, + REAL_MODE_HORIZONTAL_NUDGE, +} RealMode; + +static RealMode g_real_mode; +static unsigned g_real_multiply_calls; + +static const BorlandReal48 g_real_random = + {{0x80, 1, 2, 3, 4, 5}}; +static const BorlandReal48 g_real_product = + {{0x81, 6, 7, 8, 9, 10}}; +static const BorlandReal48 g_real_factor = + {{0x82, 11, 12, 13, 14, 15}}; +static const BorlandReal48 g_real_integer = + {{0x83, 16, 17, 18, 19, 20}}; +static const BorlandReal48 g_real_result = + {{0x84, 21, 22, 23, 24, 25}}; + +static void assert_real48(BorlandReal48 actual, BorlandReal48 expected) +{ + assert(memcmp(actual.bytes, expected.bytes, sizeof(actual.bytes)) == 0); +} + +int32_t borland_multiply_i32(int32_t left, int32_t right) +{ + return (int32_t)((uint32_t)left * (uint32_t)right); +} + +uint16_t borland_random_below(uint16_t upper_bound) +{ + assert(g_random_index < g_random_count); + assert(upper_bound == g_random_bounds[g_random_index]); + return g_random_values[g_random_index++]; +} + +BorlandReal48 borland_random_real48_registers(void) +{ + assert(g_real_mode == REAL_MODE_HORIZONTAL_NUDGE); + return g_real_random; +} + +BorlandReal48 borland_i32_to_real48(int32_t value) +{ + if (g_real_mode == REAL_MODE_UPPER_CLAMP) { + assert(value == 1000); + } else { + assert(g_real_mode == REAL_MODE_HORIZONTAL_NUDGE); + assert(value == 3); + } + return g_real_integer; +} + +BorlandReal48 borland_real48_multiply( + BorlandReal48 left, BorlandReal48 right) +{ + static const BorlandReal48 three_fifths = + {{0x80, 0x9a, 0x99, 0x99, 0x99, 0x19}}; + static const BorlandReal48 nudge_scale = + {{0x85, 0, 0, 0, 0, 0x20}}; + if (g_real_mode == REAL_MODE_UPPER_CLAMP) { + assert(g_real_multiply_calls++ == 0); + assert_real48(left, g_real_integer); + assert_real48(right, three_fifths); + return g_real_result; + } + + assert(g_real_mode == REAL_MODE_HORIZONTAL_NUDGE); + if (g_real_multiply_calls++ == 0) { + assert_real48(left, g_real_random); + assert_real48(right, nudge_scale); + return g_real_product; + } + assert_real48(left, g_real_integer); + assert_real48(right, g_real_factor); + return g_real_result; +} + +BorlandReal48 borland_real48_subtract( + BorlandReal48 left, BorlandReal48 right) +{ + static const BorlandReal48 nudge_offset = + {{0x84, 0, 0, 0, 0, 0x20}}; + assert(g_real_mode == REAL_MODE_HORIZONTAL_NUDGE); + assert_real48(left, g_real_product); + assert_real48(right, nudge_offset); + return g_real_factor; +} + +int32_t borland_real48_round_to_i32(BorlandReal48 value) +{ + assert_real48(value, g_real_result); + return g_real_mode == REAL_MODE_UPPER_CLAMP ? 600 : 7; +} + +void tdkpin_play_sound_if_not_tilted(uint16_t sound_number) +{ + assert(g_sound_count < sizeof(g_sounds) / sizeof(g_sounds[0])); + g_sounds[g_sound_count++] = sound_number; +} + +HDC16 GetDC16(HWND16 window) +{ + assert(window == 0x2222); + g_get_dc_calls++; + return 0x3333; +} + +INT16 ReleaseDC16(HWND16 window, HDC16 dc) +{ + assert(window == 0x2222 && dc == 0x3333); + g_release_dc_calls++; + return 1; +} + +void tdkpin_blit_bitmap_and_present( + HBITMAP16 bitmap, + INT16 height, + INT16 width, + INT16 y, + INT16 x, + HDC16 dc) +{ + assert(bitmap == 0x4444); + assert(height == 18 && width == 21); + assert(y == 426 && x == 314 && dc == 0x3333); + g_blit_calls++; +} + +void tdkpin_restore_background_region_a( + INT16 height, INT16 width, INT16 y, INT16 x, HDC16 dc) +{ + assert(dc == 0x3333); + if (height == 20) { + assert(width == 148 && y == 243 && x == 84); + } else { + assert(height == 30 && width == 284 && y == 232 && x == 371); + } + g_restore_a_calls++; +} + +void tdkpin_restore_background_region_b( + INT16 height, INT16 width, INT16 y, INT16 x, HDC16 dc) +{ + assert(height == 42 && width == 284 && x == 348 && dc == 0x3333); + assert(y == 360 || y == 405); + g_restore_b_calls++; +} + +void tdkpin_present_background_region( + INT16 height, INT16 width, INT16 y, INT16 x, HDC16 dc) +{ + assert(dc == 0x3333); + if (height == 20) { + assert(width == 148 && y == 243 && x == 84); + } else if (height == 30) { + assert(width == 284 && y == 232 && x == 371); + } else { + assert(height == 42 && width == 284 && x == 348); + assert(y == 360 || y == 405); + } + g_present_calls++; +} + +void tdkpin_draw_item_status(int16_t item, HDC16 dc) +{ + assert(item == 0 && dc == 0x3333); + g_draw_item_calls++; +} + +void tdkpin_draw_score(HDC16 dc, int32_t value_or_player) +{ + assert(dc == 0x3333 && value_or_player == 0); + g_draw_score_calls++; +} + +void tdkpin_update_status_display(uint8_t player, HDC16 dc) +{ + assert(player == 1 && dc == 0x3333); + g_status_calls++; +} + +static void set_random_script( + const uint16_t *bounds, const uint16_t *values, size_t count) +{ + assert(count <= sizeof(g_random_values) / sizeof(g_random_values[0])); + memcpy(g_random_bounds, bounds, count * sizeof(bounds[0])); + memcpy(g_random_values, values, count * sizeof(values[0])); + g_random_count = count; + g_random_index = 0; +} + +static void prepare_fixture(uint16_t scan_code) +{ + memset(g_dgroup, 0, sizeof(g_dgroup)); + memset(g_objects, 0, sizeof(g_objects)); + win16_reset_segment_bindings(); + win16_bind_segment(0x7000, g_objects, sizeof(g_objects), true); + win16_bind_segment(0x7200, g_dgroup, sizeof(g_dgroup), true); + win16_set_dgroup_selector(0x7200); + g_window = win16_make_far_pointer(0x7000, 0); + g_event = win16_make_far_pointer(0x7000, 0x1000); + win16_write_u16(g_window, 4, 0x2222); + win16_write_u16(g_event, 8, scan_code); + win16_write_u16(g_event, 0x0a, 0xaaaa); + win16_write_u16(g_event, 0x0c, 0xbbbb); + win16_write_u16(win16_dgroup_pointer(0x0865), 0, 0x4444); + g_random_count = 0; + g_random_index = 0; + g_sound_count = 0; + g_get_dc_calls = 0; + g_release_dc_calls = 0; + g_blit_calls = 0; + g_restore_a_calls = 0; + g_restore_b_calls = 0; + g_present_calls = 0; + g_draw_item_calls = 0; + g_draw_score_calls = 0; + g_status_calls = 0; + g_real_mode = REAL_MODE_NONE; + g_real_multiply_calls = 0; +} + +static void assert_event_consumed(void) +{ + assert(win16_read_u16(win16_far_add_offset(g_event, 0x0a)) == 0); + assert(win16_read_u16(win16_far_add_offset(g_event, 0x0c)) == 0); +} + +static void test_debug_keys_and_auxiliary_gate(void) +{ + prepare_fixture(0x3c); + win16_write_u8(win16_dgroup_pointer(0x07cf), 1); + win16_write_u32(win16_dgroup_pointer(0x0855), 0, 0x12345678); + assert(tdkpin_handle_key_release(g_window, g_event) == 0); + assert(win16_read_u32(win16_dgroup_pointer(0x0855)) == 0); + assert(win16_read_u8(win16_dgroup_pointer(0x07c7)) == 1); + assert_event_consumed(); + + prepare_fixture(0x41); + win16_write_u8(win16_dgroup_pointer(0x07cf), 1); + win16_write_u32(win16_dgroup_pointer(0x3340), 0, 0x12345678); + win16_write_u32(win16_dgroup_pointer(0x3344), 0, 0x90abcdef); + win16_write_u32(g_window, 0x0baa, 1); + win16_write_u32(g_window, 0x0bae, 2); + tdkpin_handle_key_release(g_window, g_event); + assert(win16_read_u32(win16_dgroup_pointer(0x07d3)) == 0x12345678); + assert(win16_read_u32(win16_dgroup_pointer(0x07d7)) == 0x90abcdef); + assert(win16_read_u32(win16_far_add_offset(g_window, 0x0baa)) == 0); + assert(win16_read_u32(win16_far_add_offset(g_window, 0x0bae)) == 0); + + prepare_fixture(0x3c); + win16_write_u8(win16_dgroup_pointer(0x07cf), 1); + win16_write_u16(g_window, 0x41, 1); + tdkpin_handle_key_release(g_window, g_event); + assert(win16_read_u8(win16_dgroup_pointer(0x07c7)) == 0); + assert_event_consumed(); +} + +static void test_release_down_impulse_clamps(void) +{ + static const uint16_t lower_bounds[] = {1000}; + static const uint16_t lower_values[] = {80}; + prepare_fixture(0x50); + win16_write_u8(win16_dgroup_pointer(0x07d0), 1); + win16_write_u32(g_window, 0x56, 1000); + win16_write_u32(g_window, 0x5a, 2); + win16_write_u32(g_window, 0x0baa, 0x12345678); + win16_write_u32(g_window, 0x0bae, (uint32_t)-2000); + set_random_script(lower_bounds, lower_values, 1); + tdkpin_handle_key_release(g_window, g_event); + assert((int32_t)win16_read_u32( + win16_far_add_offset(g_window, 0x0bae)) == -998); + assert(win16_read_u32(win16_far_add_offset(g_window, 0x0baa)) == 0); + assert(win16_read_u32(win16_dgroup_pointer(0x07fb)) == (uint32_t)-998); + assert(win16_read_u8(win16_far_add_offset(g_window, 0x0bdd)) == 1); + assert(win16_read_u8(win16_far_add_offset(g_window, 0x0bde)) == 0); + assert(g_random_index == 1); + assert(g_sound_count == 1 && g_sounds[0] == 2); + assert(g_blit_calls == 1 && g_get_dc_calls == 1 && g_release_dc_calls == 1); + + static const uint16_t upper_bounds[] = {1000}; + static const uint16_t upper_values[] = {80}; + prepare_fixture(0x50); + win16_write_u8(win16_dgroup_pointer(0x07d0), 1); + win16_write_u32(g_window, 0x56, 1000); + win16_write_u32(g_window, 0x5a, 2); + win16_write_u32(g_window, 0x0bae, (uint32_t)-399); + g_real_mode = REAL_MODE_UPPER_CLAMP; + set_random_script(upper_bounds, upper_values, 1); + tdkpin_handle_key_release(g_window, g_event); + assert((int32_t)win16_read_u32( + win16_far_add_offset(g_window, 0x0bae)) == -601); + assert(g_real_multiply_calls == 1 && g_random_index == 1); +} + +static void test_flipper_key_release(void) +{ + prepare_fixture(0x1d); + win16_write_u8(win16_far_add_offset(g_window, 0x0bda), 1); + tdkpin_handle_key_release(g_window, g_event); + assert(win16_read_u8(win16_far_add_offset(g_window, 0x0bda)) == 0); + + prepare_fixture(0x1c); + win16_write_u8(win16_far_add_offset(g_window, 0x0bdb), 1); + tdkpin_handle_key_release(g_window, g_event); + assert(win16_read_u8(win16_far_add_offset(g_window, 0x0bdb)) == 0); +} + +static void test_directional_and_multiball_nudges(void) +{ + static const uint16_t left_bounds[] = {20, 10}; + static const uint16_t left_values[] = {10, 9}; + prepare_fixture(0x2a); + win16_write_u32(g_window, 0x5a, 3); + win16_write_u32(g_window, 0x0baa, 1000); + set_random_script(left_bounds, left_values, 2); + tdkpin_handle_key_release(g_window, g_event); + assert(win16_read_u32(win16_far_add_offset(g_window, 0x0baa)) == 880); + assert(win16_read_u16(win16_far_add_offset(g_window, 0x5e)) == 25); + assert(g_sound_count == 1 && g_sounds[0] == 19); + + static const uint16_t right_bounds[] = {20, 10}; + static const uint16_t right_values[] = {10, 9}; + prepare_fixture(0x51); + win16_write_u32(g_window, 0x5a, 3); + win16_write_u8(win16_far_add_offset(g_window, 0x61), 2); + win16_write_u32(win16_dgroup_pointer(0x07f3), 0, 1000); + win16_write_u32(win16_dgroup_pointer(0x07f7), 0, 2000); + set_random_script(right_bounds, right_values, 2); + tdkpin_handle_key_release(g_window, g_event); + assert(win16_read_u32(win16_far_add_offset(g_window, 0x0baa)) == 120); + assert(win16_read_u32(win16_dgroup_pointer(0x07f3)) == 1120); + assert(win16_read_u32(win16_dgroup_pointer(0x07f7)) == 2120); + + static const uint16_t space_bounds[] = {20, 21, 100, 10}; + static const uint16_t space_values[] = {10, 12, 20, 9}; + prepare_fixture(0x39); + win16_write_u32(g_window, 0x5a, 3); + win16_write_u8(win16_far_add_offset(g_window, 0x61), 2); + win16_write_u32(g_window, 0x0baa, 100); + win16_write_u32(g_window, 0x0bae, 200); + win16_write_u32(win16_dgroup_pointer(0x07f3), 0, 1000); + win16_write_u32(win16_dgroup_pointer(0x07f7), 0, 2000); + win16_write_u32(win16_dgroup_pointer(0x07fb), 0, 3000); + win16_write_u32(win16_dgroup_pointer(0x07ff), 0, 4000); + g_real_mode = REAL_MODE_HORIZONTAL_NUDGE; + set_random_script(space_bounds, space_values, 4); + tdkpin_handle_key_release(g_window, g_event); + assert(win16_read_u32(win16_far_add_offset(g_window, 0x0baa)) == 107); + assert((int32_t)win16_read_u32( + win16_far_add_offset(g_window, 0x0bae)) == 50); + assert(win16_read_u32(win16_dgroup_pointer(0x07f3)) == 1006); + assert(win16_read_u32(win16_dgroup_pointer(0x07f7)) == 2006); + assert(win16_read_u32(win16_dgroup_pointer(0x07fb)) == 2790); + assert(win16_read_u32(win16_dgroup_pointer(0x07ff)) == 3790); + assert(g_real_multiply_calls == 2 && g_random_index == 4); +} + +static void test_tilt_threshold(void) +{ + static const uint16_t bounds[] = {20, 10}; + static const uint16_t values[] = {10, 0}; + prepare_fixture(0x2a); + win16_write_u32(g_window, 0x5a, 1); + win16_write_u16(g_window, 0x5e, 14); + win16_write_u8(win16_far_add_offset(g_window, 0x0bda), 1); + win16_write_u8(win16_far_add_offset(g_window, 0x0bdb), 1); + set_random_script(bounds, values, 2); + tdkpin_handle_key_release(g_window, g_event); + assert(win16_read_u16(win16_far_add_offset(g_window, 0x5e)) == 39); + assert(win16_read_u8(win16_dgroup_pointer(0x07c6)) == 1); + assert(win16_read_u8(win16_far_add_offset(g_window, 0x0bda)) == 0); + assert(win16_read_u8(win16_far_add_offset(g_window, 0x0bdb)) == 0); + assert(g_sound_count == 2 && g_sounds[0] == 19 && g_sounds[1] == 20); + assert(g_restore_a_calls == 1 && g_present_calls == 1); + assert(g_get_dc_calls == 1 && g_release_dc_calls == 1); +} + +static void test_sound_toggle(void) +{ + prepare_fixture(0x58); + win16_write_u16(win16_dgroup_pointer(0x43ee), 0, 1); + tdkpin_handle_key_release(g_window, g_event); + assert(win16_read_u8(win16_dgroup_pointer(0x43f2)) == 1); + + prepare_fixture(0x58); + win16_write_u8(win16_dgroup_pointer(0x43f2), 1); + tdkpin_handle_key_release(g_window, g_event); + assert(win16_read_u8(win16_dgroup_pointer(0x43f2)) == 0); + + prepare_fixture(0x58); + tdkpin_handle_key_release(g_window, g_event); + assert(win16_read_u8(win16_dgroup_pointer(0x43f2)) == 0); +} + +static void test_add_player_copies_all_state(void) +{ + prepare_fixture(0x4e); + win16_write_u8(win16_far_add_offset(g_window, 0x0bde), 1); + win16_write_u8(win16_dgroup_pointer(0x07d0), 1); + win16_write_u32(win16_dgroup_pointer(0x0982), 0, 0x11111111); + win16_write_u32(win16_dgroup_pointer(0x0986), 0, 0x22222222); + win16_write_u32(win16_dgroup_pointer(0x098a), 0, 0x33333333); + win16_write_u32(win16_dgroup_pointer(0x098e), 0, 0x44444444); + for (uint16_t id = 1; id <= 175; id++) { + win16_write_u8( + win16_far_add_offset(g_window, (uint16_t)(0x03cc + id)), + (uint8_t)(id ^ 0x5a)); + win16_write_u16( + g_window, + (uint16_t)(0x0a42 + id * 2u), + (uint16_t)(id * 257u)); + } + + tdkpin_handle_key_release(g_window, g_event); + assert(win16_read_u8(win16_dgroup_pointer(0x07d0)) == 2); + assert(win16_read_u8(win16_dgroup_pointer(0x07c9)) == 0); + assert(win16_read_u8(win16_dgroup_pointer(0x07c5)) == 1); + assert(win16_read_u8(win16_dgroup_pointer(0x0874)) == 0); + assert(win16_read_u8(win16_dgroup_pointer(0x07d1)) == 1); + assert(win16_read_u8(win16_far_add_offset(g_window, 0x61)) == 1); + assert(g_sound_count == 1 && g_sounds[0] == 1); + + for (uint16_t player = 1; player <= 4; player++) { + assert(win16_read_u16(win16_dgroup_pointer( + (uint16_t)(0x081f + player * 2u))) == 0xffff); + for (uint16_t id = 1; id <= 175; id++) { + uint8_t expected_byte = (uint8_t)(id ^ 0x5a); + uint16_t expected_word = (uint16_t)(id * 257u); + assert(win16_read_u8(win16_far_add_offset( + g_window, + (uint16_t)(0x0061 + player * 0x00afu + id))) == + expected_byte); + assert(win16_read_u16(win16_far_add_offset( + g_window, + (uint16_t)(0x036c + player * 0x015eu + id * 2u))) == + expected_word); + } + } + for (uint16_t id = 1; id <= 175; id++) { + Win16FarPtr record = win16_dgroup_pointer( + (uint16_t)(0x095b + id * 0x53u)); + assert(win16_read_u8(win16_far_add_offset(record, 0x34)) == + (uint8_t)(id ^ 0x5a)); + assert(win16_read_u16(win16_far_add_offset(record, 0x43)) == + (uint16_t)(id * 257u)); + } + assert(win16_read_u32(win16_dgroup_pointer(0x0982)) == 0x11111111); + assert(win16_read_u32(win16_dgroup_pointer(0x0986)) == 0x22222222); + assert(win16_read_u32(win16_dgroup_pointer(0x098a)) == 0); + assert(win16_read_u32(win16_dgroup_pointer(0x098e)) == 0); + assert(g_restore_b_calls == 2 && g_restore_a_calls == 1); + assert(g_present_calls == 3 && g_draw_item_calls == 4); + assert(g_draw_score_calls == 1 && g_status_calls == 1); + assert(g_get_dc_calls == 5 && g_release_dc_calls == 5); +} + +int main(void) +{ + test_debug_keys_and_auxiliary_gate(); + test_release_down_impulse_clamps(); + test_flipper_key_release(); + test_directional_and_multiball_nudges(); + test_tilt_threshold(); + test_sound_toggle(); + test_add_player_copies_all_state(); + return 0; +} diff --git a/original/reconstructed/tests/test_mechanism_render.c b/original/reconstructed/tests/test_mechanism_render.c new file mode 100644 index 0000000..6b6632a --- /dev/null +++ b/original/reconstructed/tests/test_mechanism_render.c @@ -0,0 +1,221 @@ +#include "../tdkpin_mechanism_render.h" + +#include +#include + +uint8_t g_current_player; + +static uint8_t g_stack[0x400]; +static uint8_t g_object[0x0c00]; +static uint8_t g_dgroup[0x5000]; +static Win16FarPtr g_receiver; +static unsigned g_select_calls; +static unsigned g_blit_calls; +static unsigned g_refresh_calls; +static unsigned g_sound_calls; +static unsigned g_delete_dc_calls; +static int32_t g_state; + +HDC16 GetDC16(HWND16 window) +{ + assert(window == 0x2222); + return 0x3333; +} + +HDC16 CreateCompatibleDC16(HDC16 dc) +{ + static unsigned calls; + assert(dc == 0x3333); + HDC16 result = (HDC16)(0x4001 + calls); + calls = (calls + 1u) % 2u; + return result; +} + +HBITMAP16 CreateCompatibleBitmap16(HDC16 dc, INT16 width, INT16 height) +{ + assert(dc == 0x3333 && width == 91 && height == 90); + return 0x5000; +} + +HGDIOBJ16 SelectObject16(HDC16 dc, HGDIOBJ16 object) +{ + unsigned call = g_select_calls++; + if (call == 0) { + assert(dc == 0x4001 && object == 0x6000); + return 0x7001; + } + if (call == 1) { + assert(dc == 0x4002 && object == 0x5000); + return 0x7002; + } + if (g_state >= 6 && call == 2) { + assert(dc == 0x4001 && object == 0x6001); + return 0x6000; + } + if (g_state >= 6 && call == 3) { + assert(dc == 0x4001 && object == 0x6000); + return 0x6001; + } + unsigned cleanup_base = g_state >= 6 ? 4u : 2u; + if (call == cleanup_base) { + assert(dc == 0x4001 && object == 0x7001); + return 0x6000; + } + assert(call == cleanup_base + 1u); + assert(dc == 0x4002 && object == 0x7002); + return 0x5000; +} + +static const INT16 state_one_positions[5][2] = { + {9, 41}, {23, 11}, {56, 14}, {63, 47}, {35, 63}}; +static const INT16 state_six_positions[5][2] = { + {8, 35}, {26, 8}, {59, 18}, {59, 50}, {27, 61}}; + +BOOL16 BitBlt16( + HDC16 destination, + INT16 destination_x, + INT16 destination_y, + INT16 width, + INT16 height, + HDC16 source, + INT16 source_x, + INT16 source_y, + uint32_t raster_operation) +{ + unsigned call = g_blit_calls++; + if (call == 0) { + assert(destination == 0x4002 && destination_x == 0); + assert(destination_y == 0 && width == 91 && height == 90); + assert(source == 0x4001); + assert(source_x == (g_state < 6 ? 0 : 79)); + assert(source_y == (g_state < 6 ? 0 : 33)); + assert(raster_operation == 0x00cc0020u); + return 1; + } + if (call <= 10) { + unsigned target = (call - 1u) / 2u; + const INT16 (*positions)[2] = + g_state == 1 ? state_one_positions : state_six_positions; + assert(destination == 0x4002); + assert(destination_x == positions[target][0]); + assert(destination_y == positions[target][1]); + assert(width == 17 && height == 17 && source == 0x4001); + assert(source_x == 455); + if ((call & 1u) != 0) { + assert(source_y == 17 && raster_operation == 0x008800c6u); + } else { + assert(source_y == 0 && raster_operation == 0x00ee0086u); + } + return 1; + } + assert(call == 11); + assert(destination == 0x3333 && destination_x == 79); + assert(destination_y == 33 && width == 91 && height == 90); + assert(source == 0x4002 && source_x == 0 && source_y == 0); + assert(raster_operation == 0x00cc0020u); + return 1; +} + +BOOL16 DeleteObject16(HGDIOBJ16 object) +{ + assert(object == 0x5000); + return 1; +} + +BOOL16 DeleteDC16(HDC16 dc) +{ + assert(dc == (g_delete_dc_calls == 0 ? 0x4002 : 0x4001)); + g_delete_dc_calls++; + return 1; +} + +INT16 ReleaseDC16(HWND16 window, HDC16 dc) +{ + assert(window == 0x2222 && dc == 0x3333); + return 1; +} + +void tdkpin_refresh_player_item(uint16_t caller_bp, uint16_t item) +{ + assert(caller_bp == 0x0100 && item == 15 + g_refresh_calls); + g_refresh_calls++; +} + +void tdkpin_play_sound_if_not_tilted(uint16_t sound_number) +{ + assert(sound_number == 11); + g_sound_calls++; +} + +static void prepare_fixture(int32_t state) +{ + memset(g_stack, 0, sizeof(g_stack)); + memset(g_object, 0, sizeof(g_object)); + memset(g_dgroup, 0, sizeof(g_dgroup)); + win16_reset_segment_bindings(); + win16_bind_segment(0x7000, g_stack, sizeof(g_stack), true); + win16_bind_segment(0x7100, g_object, sizeof(g_object), true); + win16_bind_segment(0x7200, g_dgroup, sizeof(g_dgroup), true); + win16_set_dgroup_selector(0x7200); + win16_set_stack_state(0x7000, 0); + g_receiver = win16_make_far_pointer(0x7100, 0); + win16_write_stack_u16(0x0106, win16_far_offset(g_receiver)); + win16_write_stack_u16(0x0108, win16_far_selector(g_receiver)); + win16_write_u16(g_receiver, 4, 0x2222); + win16_write_u16(win16_dgroup_pointer(0x0859), 0, 0x6000); + win16_write_u16(win16_dgroup_pointer(0x085d), 0, 0x6001); + win16_write_u32(win16_dgroup_pointer(0x0855), 0, (uint32_t)state); + static const uint16_t words[5] = { + 0x3371, 0x33c4, 0x3417, 0x346a, 0x34bd}; + for (uint16_t index = 0; index < 5; index++) { + win16_write_u16( + win16_dgroup_pointer(words[index]), 0, (uint16_t)(index + 1)); + } + g_current_player = 2; + for (uint16_t index = 0; index < 5; index++) { + win16_write_u8( + win16_far_add_offset( + g_receiver, (uint16_t)(0x0476 + 2u * 0x14u + index)), + (uint8_t)(0xa0 + index)); + } + g_state = state; + g_select_calls = 0; + g_blit_calls = 0; + g_refresh_calls = 0; + g_sound_calls = 0; + g_delete_dc_calls = 0; +} + +static void test_state_one(void) +{ + prepare_fixture(1); + tdkpin_rotate_and_draw_targets(0x0100); + assert(g_blit_calls == 12 && g_select_calls == 4); + assert(g_sound_calls == 1 && g_refresh_calls == 0); +} + +static void test_state_six_rotation(void) +{ + prepare_fixture(6); + tdkpin_rotate_and_draw_targets(0x0100); + assert(g_blit_calls == 12 && g_select_calls == 6); + assert(g_sound_calls == 0 && g_refresh_calls == 5); + static const uint16_t words[5] = { + 0x3371, 0x33c4, 0x3417, 0x346a, 0x34bd}; + static const uint16_t expected_words[5] = {2, 3, 4, 5, 1}; + for (uint16_t index = 0; index < 5; index++) { + assert(win16_read_u16(win16_dgroup_pointer(words[index])) == + expected_words[index]); + assert(win16_read_u8(win16_far_add_offset( + g_receiver, + (uint16_t)(0x0476 + 2u * 0x14u + index))) == + (uint8_t)(0xa0 + (index + 1u) % 5u)); + } +} + +int main(void) +{ + test_state_one(); + test_state_six_rotation(); + return 0; +} diff --git a/original/reconstructed/tests/test_message_dispatch.c b/original/reconstructed/tests/test_message_dispatch.c new file mode 100644 index 0000000..4d7f101 --- /dev/null +++ b/original/reconstructed/tests/test_message_dispatch.c @@ -0,0 +1,169 @@ +#include "../tdkpin_object_windows.h" + +#include + +Win16FarPtr g_object_windows_creating_object; +uint16_t g_object_windows_thunk_code_selector; +Win16FarPtr g_object_windows_free_thunk; +Win16FarPtr g_object_windows_dispatch_proc; +Win16FarPtr g_object_windows_message_hook; + +static Win16FarPtr g_expected_handler; +static Win16FarPtr g_expected_object; +static unsigned g_handler_calls; +static unsigned g_hook_calls; +static ObjectWindowsMessage g_hook_message; +static Win16FarPtr g_event_pointer; + +void win16_call_object_message_handler( + Win16FarPtr procedure, + Win16FarPtr object, + ObjectWindowsMessage *message) +{ + assert(procedure == g_expected_handler); + assert(object == g_expected_object); + assert(message->window == 0x77); + assert(message->wparam == 0x3344); + assert(message->lparam == (LPARAM16)0x89abcdefu); + message->result = (LRESULT16)0x12345678u; + g_handler_calls++; +} + +void win16_call_object_message_hook( + Win16FarPtr procedure, + Win16FarPtr object, + Win16FarPtr handler, + HWND16 window, + UINT16 message, + WPARAM16 wparam, + LPARAM16 lparam) +{ + assert(procedure == g_object_windows_message_hook); + assert(object == g_expected_object && handler == g_expected_handler); + g_hook_message = (ObjectWindowsMessage){ + window, message, wparam, lparam, 0}; + g_hook_calls++; +} + +void win16_call_object_event_handler( + Win16FarPtr procedure, Win16FarPtr object, Win16FarPtr event) +{ + assert(procedure == g_expected_handler); + assert(object == g_expected_object); + g_event_pointer = event; +} + +static void write_far(uint16_t offset, Win16FarPtr pointer) +{ + win16_write_u16( + win16_dgroup_pointer(offset), 0, win16_far_offset(pointer)); + win16_write_u16( + win16_dgroup_pointer((uint16_t)(offset + 2)), + 0, + win16_far_selector(pointer)); +} + +int main(void) +{ + static uint8_t dgroup[0x1000]; + static uint8_t object_bytes[64]; + static uint8_t event_bytes[32]; + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, dgroup, sizeof(dgroup), true); + win16_set_dgroup_selector(0x5000); + win16_bind_segment( + 0x7000, object_bytes, sizeof(object_bytes), true); + win16_bind_segment( + 0x7100, event_bytes, sizeof(event_bytes), true); + + const uint16_t vmt = 0x0100; + const uint16_t derived_table = 0x0200; + const uint16_t parent_table = 0x0300; + Win16FarPtr fallback = win16_make_far_pointer(0x6100, 0x1111); + Win16FarPtr derived = win16_make_far_pointer(0x6200, 0x2222); + Win16FarPtr parent = win16_make_far_pointer(0x6300, 0x3333); + write_far((uint16_t)(vmt + 0x0c), fallback); + win16_write_u16( + win16_dgroup_pointer((uint16_t)(vmt + 4)), 0, derived_table); + + win16_write_u16(win16_dgroup_pointer(derived_table), 0, parent_table); + win16_write_u16(win16_dgroup_pointer(derived_table + 2), 0, 0xffff); + win16_write_u16(win16_dgroup_pointer(derived_table + 4), 0, 0xffff); + win16_write_u16(win16_dgroup_pointer(derived_table + 6), 0, 1); + win16_write_u16(win16_dgroup_pointer(derived_table + 8), 0, 0x0100); + write_far((uint16_t)(derived_table + 10), derived); + + win16_write_u16(win16_dgroup_pointer(parent_table), 0, 0); + win16_write_u16(win16_dgroup_pointer(parent_table + 2), 0, 0xffff); + win16_write_u16(win16_dgroup_pointer(parent_table + 4), 0, 0xffff); + win16_write_u16(win16_dgroup_pointer(parent_table + 6), 0, 1); + win16_write_u16(win16_dgroup_pointer(parent_table + 8), 0, 0x0200); + write_far((uint16_t)(parent_table + 10), parent); + + assert(object_windows_resolve_message_handler(vmt, 0x0100, 0x0c) == + win16_dgroup_pointer(derived_table + 10)); + assert(object_windows_resolve_message_handler(vmt, 0x0200, 0x0c) == + win16_dgroup_pointer(parent_table + 10)); + assert(win16_read_u16(win16_dgroup_pointer(derived_table + 2)) == + 0x0200); + assert(win16_read_u16(win16_dgroup_pointer(derived_table + 4)) == + parent_table + 10); + /* Cache lookup still works after the table contents become unusable. */ + win16_write_u16(win16_dgroup_pointer(derived_table + 6), 0, 0xffff); + assert(object_windows_resolve_message_handler(vmt, 0x0200, 0x0c) == + win16_dgroup_pointer(parent_table + 10)); + win16_write_u16(win16_dgroup_pointer(derived_table + 6), 0, 1); + assert(object_windows_resolve_message_handler(vmt, 0x0999, 0x0c) == + win16_dgroup_pointer(vmt + 0x0c)); + + Win16FarPtr object = win16_make_far_pointer(0x7000, 4); + win16_write_u16(object, 0, vmt); + g_expected_object = object; + g_object_windows_message_hook = + win16_make_far_pointer(0x6400, 0x4444); + g_expected_handler = parent; + g_handler_calls = 0; + g_hook_calls = 0; + LRESULT16 result = object_dispatch_window_or_dialog_proc( + object, + 0x77, + 0x0200, + 0x3344, + (LPARAM16)0x89abcdefu); + assert(result == (LRESULT16)0x12345678u); + assert(win16_read_u16(win16_far_add_offset(object, 4)) == 0x77); + assert(g_handler_calls == 1 && g_hook_calls == 1); + assert(g_hook_message.message == 0x0200); + assert(g_hook_message.lparam == (LPARAM16)0x89abcdefu); + + g_object_windows_message_hook = win16_make_far_pointer(0, 0x9999); + g_expected_handler = fallback; + g_hook_calls = 0; + (void)object_dispatch_window_or_dialog_proc( + object, + 0x77, + 0xffff, + 0x3344, + (LPARAM16)0x89abcdefu); + assert(g_hook_calls == 0); + + Win16FarPtr event = win16_make_far_pointer(0x7100, 2); + win16_write_u16(event, 0, 0x77); + win16_write_u16(event, 2, 0x0100); + win16_write_u16(event, 4, 0x3344); + win16_write_u16(event, 6, 0xcdef); + win16_write_u16(event, 8, 0x89ab); + g_object_windows_message_hook = + win16_make_far_pointer(0x6400, 0x4444); + g_expected_handler = derived; + g_hook_calls = 0; + g_event_pointer = 0; + object_windows_dispatch_event(0x0c, 0x0100, event, object); + assert(g_event_pointer == event); + assert(g_hook_calls == 1); + assert(g_hook_message.window == 0x77); + assert(g_hook_message.message == 0x0100); + assert(g_hook_message.wparam == 0x3344); + assert(g_hook_message.lparam == (LPARAM16)0x89abcdefu); + return 0; +} diff --git a/original/reconstructed/tests/test_message_pump.c b/original/reconstructed/tests/test_message_pump.c new file mode 100644 index 0000000..fd948fa --- /dev/null +++ b/original/reconstructed/tests/test_message_pump.c @@ -0,0 +1,94 @@ +#include "../tdkpin_message_pump.h" + +#include + +static MSG16 g_queue[8]; +static unsigned g_queue_count; +static unsigned g_queue_index; +static UINT16 g_peek_maximum; +static unsigned g_translate_calls; +static unsigned g_dispatch_calls; +static Win16FarPtr g_closed_window; + +BOOL16 PeekMessage16( + MSG16 *message, + HWND16 window, + UINT16 minimum_message, + UINT16 maximum_message, + UINT16 remove_message) +{ + assert(window == 0 && minimum_message == 0 && remove_message == 1); + g_peek_maximum = maximum_message; + if (g_queue_index == g_queue_count) { + return 0; + } + *message = g_queue[g_queue_index++]; + return 1; +} + +BOOL16 TranslateMessage16(const MSG16 *message) +{ + assert(message->message == 0x0020); + g_translate_calls++; + return 1; +} + +LRESULT16 DispatchMessage16(const MSG16 *message) +{ + assert(message->message == 0x0020); + g_dispatch_calls++; + return 0; +} + +void object_windows_close_if_allowed(Win16FarPtr window) +{ + g_closed_window = window; +} + +static void reset_queue(void) +{ + g_queue_count = 4; + g_queue_index = 0; + g_queue[0].message = 0x0580; + g_queue[1].message = 0x0100; + g_queue[2].message = 0x0101; + g_queue[3].message = 0x0020; + g_translate_calls = 0; + g_dispatch_calls = 0; + g_closed_window = 0; +} + +int main(void) +{ + win16_set_indeterminate_u16(0xbeef); + Win16FarPtr window = win16_make_far_pointer(0x7000, 2); + reset_queue(); + tdkpin_drain_messages_except_input(); + assert(g_queue_index == 4 && g_peek_maximum == 0x32); + assert(g_translate_calls == 1 && g_dispatch_calls == 1); + + reset_queue(); + tdkpin_close_variant_a(window); + assert(g_closed_window == window); + reset_queue(); + tdkpin_close_variant_b(window); + assert(g_closed_window == window); + + ObjectWindowsMessage message = {0}; + reset_queue(); + message.lparam = (LPARAM16)0x001c0000u; + assert(tdkpin_conditional_close_variant_a(window, &message) == 0xbeef); + assert(g_closed_window == 0 && g_queue_index == 0); + message.lparam = (LPARAM16)0x001d0000u; + assert(tdkpin_conditional_close_variant_a(window, &message) == 0xbeef); + assert(g_closed_window == window); + + reset_queue(); + message.lparam = (LPARAM16)0x003b0000u; + assert(tdkpin_conditional_close_variant_b(window, &message) == 0xbeef); + assert(g_closed_window == 0 && g_queue_index == 0); + message.lparam = (LPARAM16)0x003a0000u; + assert(tdkpin_conditional_close_variant_b(window, &message) == 0xbeef); + assert(g_closed_window == window); + return 0; +} diff --git a/original/reconstructed/tests/test_multimedia.c b/original/reconstructed/tests/test_multimedia.c new file mode 100644 index 0000000..263317c --- /dev/null +++ b/original/reconstructed/tests/test_multimedia.c @@ -0,0 +1,373 @@ +#include "../tdkpin_multimedia.h" + +#include +#include +#include + +Win16FarPtr g_multimedia_procedures[11]; +HINSTANCE16 g_multimedia_module; +uint8_t g_multimedia_initialized; +uint8_t g_multimedia_pending; +uint16_t g_multimedia_version; +uint8_t g_multimedia_auto_subclassed; +uint8_t g_multimedia_argument_2; +uint8_t g_multimedia_argument_1; +uint8_t g_multimedia_legacy_windows; +char g_multimedia_library_path[21] = "CTL3D.DLL"; +Win16FarPtr g_object_windows_application; +HINSTANCE16 g_win16_previous_instance; +HINSTANCE16 g_win16_instance; +uint16_t g_win16_show_command; +Win16FarPtr g_win16_message_box; +Win16FarPtr g_object_windows_dispatch_proc; +uint16_t g_object_windows_thunk_code_selector; +Win16FarPtr g_object_windows_free_thunk; +Win16FarPtr g_object_windows_message_hook; + +static HINSTANCE16 g_freed_module; +static Win16FarPtr g_called_procedure; +static uint16_t g_called_argument; +static unsigned g_sequence; +static bool g_check_sequence; +static Win16FarPtr g_destroyed_application; +static HINSTANCE16 g_load_result; +static uint16_t g_register_result; +static uint16_t g_version_result; +static uint16_t g_enabled_result; +static uint16_t g_auto_result; +static int g_search_success_attempt; +static unsigned g_search_calls; +static char g_search_paths[5][256]; +static unsigned g_load_calls; +static unsigned g_proc_calls; +static UINT16 g_error_modes[4]; +static unsigned g_error_mode_calls; +static uint8_t g_dgroup[0x5000]; + +static void write_far_string(Win16FarPtr destination, const char *source) +{ + size_t length = strlen(source); + for (size_t index = 0; index <= length; index++) { + win16_write_u8( + win16_far_add_offset(destination, (uint16_t)index), + (uint8_t)source[index]); + } +} + +static void read_far_string( + Win16FarPtr source, char *destination, size_t capacity) +{ + size_t index = 0; + while (index + 1 < capacity) { + uint8_t byte = win16_read_u8( + win16_far_add_offset(source, (uint16_t)index)); + destination[index++] = (char)byte; + if (byte == 0) { + return; + } + } + destination[capacity - 1] = 0; +} + +BOOL16 FreeLibrary16(HINSTANCE16 module) +{ + if (g_check_sequence) { + assert(++g_sequence == 2); + } + g_freed_module = module; + return 1; +} + +Win16Handle GetCurrentTask16(void) +{ + return 0x1234; +} + +uint16_t win16_call_pascal_u16(Win16FarPtr procedure, uint16_t argument) +{ + if (g_check_sequence) { + assert(++g_sequence == 1); + } + g_called_procedure = procedure; + g_called_argument = argument; + if (procedure == g_multimedia_procedures[6]) { + return g_register_result; + } + if (procedure == g_multimedia_procedures[0]) { + assert(argument == g_win16_instance); + return g_auto_result; + } + return 0xabcd; +} + +uint16_t win16_call_pascal_u16_no_args(Win16FarPtr procedure) +{ + if (procedure == g_multimedia_procedures[5]) { + return g_version_result; + } + assert(procedure == g_multimedia_procedures[3]); + return g_enabled_result; +} + +void object_windows_application_destruct( + Win16FarPtr object, uint16_t vmt) +{ + assert(++g_sequence == 3); + assert(vmt == 0); + g_destroyed_application = object; +} + +void borland_finish_object_destructor( + BorlandObjectCallFrame *frame, uint16_t vmt_field_offset) +{ + assert(++g_sequence == 4); + assert(frame->object == g_destroyed_application); + assert(frame->vmt_argument == 0x0200 && vmt_field_offset == 0); +} + +UINT16 SetErrorMode16(UINT16 mode) +{ + g_error_modes[g_error_mode_calls++] = mode; + return 0; +} + +HINSTANCE16 LoadLibrary16(const char *library_name) +{ + assert(strcmp(library_name, g_multimedia_library_path) == 0); + g_load_calls++; + return g_load_result; +} + +Win16FarPtr GetProcAddress16( + HINSTANCE16 module, const char *procedure_name) +{ + static const char *const names[11] = { + "CTL3DAUTOSUBCLASS", "CTL3DCOLORCHANGE", "CTL3DCTLCOLOREX", + "CTL3DENABLED", "CTL3DDLGFRAMEPAINT", "CTL3DGETVER", + "CTL3DREGISTER", "CTL3DSUBCLASSDLG", "CTL3DSUBCLASSDLGEX", + "CTL3DSUBCLASSCTL", "CTL3DUNREGISTER", + }; + assert(module == g_load_result && g_proc_calls < 11); + unsigned index = 0; + while (index < 11 && strcmp(procedure_name, names[index]) != 0) { + index++; + } + assert(index < 11); + g_proc_calls++; + return win16_make_far_pointer( + 0x9000, (uint16_t)(0x100 + index)); +} + +Win16FarPtr multimedia_search_file( + Win16FarPtr search_path, Win16FarPtr file_name, Win16FarPtr result) +{ + char file_name_text[32]; + read_far_string(file_name, file_name_text, sizeof(file_name_text)); + assert(strcmp(file_name_text, g_multimedia_library_path) == 0); + assert(g_search_calls < 5); + read_far_string( + search_path, g_search_paths[g_search_calls], + sizeof(g_search_paths[g_search_calls])); + bool found = (int)g_search_calls == g_search_success_attempt; + g_search_calls++; + win16_write_u8(result, found ? 'X' : 0); + win16_write_u8(win16_far_add_offset(result, 1), 0); + return result; +} + +UINT16 GetWindowsDirectoryFar16(Win16FarPtr buffer, UINT16 size) +{ + assert(size == 0xff); + write_far_string(buffer, "WIN"); + return 3; +} + +UINT16 GetSystemDirectoryFar16(Win16FarPtr buffer, UINT16 size) +{ + assert(size == 0xff); + write_far_string(buffer, "SYS"); + return 3; +} + +HINSTANCE16 GetModuleHandle16(Win16FarPtr module_name) +{ + assert(module_name == win16_make_far_pointer(0x7000, 0x1234)); + return 0x5555; +} + +UINT16 GetModuleFileNameFar16( + HINSTANCE16 module, Win16FarPtr buffer, UINT16 size) +{ + assert(module == 0x5555 && size == 0x100); + write_far_string(buffer, "C:\\APP\\GAME.EXE"); + return 15; +} + +uint16_t multimedia_split_path( + Win16FarPtr extension, + Win16FarPtr file_name, + Win16FarPtr directory, + Win16FarPtr input) +{ + char input_text[32]; + read_far_string(input, input_text, sizeof(input_text)); + assert(strcmp(input_text, "C:\\APP\\GAME.EXE") == 0); + assert(extension != 0 && file_name != 0 && directory == input); + write_far_string(directory, "MOD"); + return 7; +} + +Win16FarPtr multimedia_environment_value(Win16FarPtr name) +{ + char name_text[8]; + read_far_string(name, name_text, sizeof(name_text)); + assert(strcmp(name_text, "PATH") == 0); + return win16_make_far_pointer(0x7000, 0x4700); +} + +static void fill_procedures(void) +{ + for (unsigned index = 0; index < 11; index++) { + g_multimedia_procedures[index] = + win16_make_far_pointer(0x8000, (uint16_t)(0x100 + index)); + } +} + +static void reset_loader(void) +{ + for (unsigned index = 0; index < 11; index++) { + g_multimedia_procedures[index] = 0; + } + g_multimedia_initialized = 0; + g_multimedia_module = 0; + g_multimedia_version = 0; + g_multimedia_auto_subclassed = 0; + g_multimedia_argument_1 = 0; + g_multimedia_argument_2 = 0; + g_multimedia_legacy_windows = 0; + g_load_result = 64; + g_register_result = 1; + g_version_result = 9; + g_enabled_result = 1; + g_auto_result = 1; + g_search_success_attempt = 0; + g_search_calls = 0; + g_load_calls = 0; + g_proc_calls = 0; + g_error_mode_calls = 0; + g_freed_module = 0; + write_far_string( + win16_make_far_pointer(0x7000, 0x478d), + g_multimedia_library_path); +} + +int main(void) +{ + uint8_t stack_anchor = 0; + uintptr_t stack_base = (uintptr_t)&stack_anchor - 0x8000; + win16_reset_segment_bindings(); + win16_bind_segment(0x7000, g_dgroup, sizeof(g_dgroup), true); + win16_set_dgroup_selector(0x7000); + win16_bind_segment(0x7200, (void *)stack_base, 0x10000, true); + write_far_string(win16_make_far_pointer(0x7000, 0x046a), "PATH"); + write_far_string(win16_make_far_pointer(0x7000, 0x4700), "ENV"); + write_far_string( + win16_make_far_pointer(0x7000, 0x478d), + g_multimedia_library_path); + fill_procedures(); + g_multimedia_module = 31; + g_multimedia_initialized = 1; + g_freed_module = 0; + multimedia_unload(); + assert(g_freed_module == 0 && g_multimedia_module == 31); + assert(!g_multimedia_initialized); + for (unsigned index = 0; index < 11; index++) { + assert(g_multimedia_procedures[index] == 0); + } + + fill_procedures(); + g_multimedia_module = 64; + g_multimedia_initialized = 1; + Win16FarPtr terminator = g_multimedia_procedures[10]; + g_called_procedure = 0; + multimedia_finalize_current_task(); + assert(g_called_procedure == terminator && g_called_argument == 0x1234); + assert(g_freed_module == 64 && !g_multimedia_initialized); + + fill_procedures(); + g_multimedia_initialized = 0; + g_called_procedure = 0; + multimedia_finalize_current_task(); + assert(g_called_procedure == 0 && g_multimedia_procedures[0] != 0); + + fill_procedures(); + g_multimedia_module = 64; + g_multimedia_initialized = 1; + g_sequence = 0; + g_check_sequence = true; + Win16FarPtr application = win16_make_far_pointer(0x7000, 2); + multimedia_application_destruct(application, 0x0200); + g_check_sequence = false; + assert(g_sequence == 4 && g_destroyed_application == application); + reset_loader(); + g_win16_instance = 0x4444; + g_multimedia_pending = 0x7f; + assert(multimedia_initialize_export(1, 2, 1, 0x1234, 0x7000) == 1); + assert(g_multimedia_pending == 0); + assert(g_multimedia_argument_1 == 1 && g_multimedia_argument_2 == 2); + assert(g_multimedia_auto_subclassed == 1); + assert(g_proc_calls == 11 && g_error_mode_calls == 2); + assert(g_error_modes[0] == 0x8000 && g_error_modes[1] == 0); + + assert(multimedia_initialize(9, 8, 0, 0x1234, 0x7000) == 1); + assert(g_load_calls == 1); /* Already initialized: no second load. */ + + reset_loader(); + g_load_result = 31; + assert(multimedia_initialize(1, 2, 1, 0x1234, 0x7000) == 0); + assert(g_proc_calls == 0 && g_multimedia_module == 31); + + reset_loader(); + g_register_result = 0; + assert(multimedia_initialize(1, 2, 1, 0x1234, 0x7000) == 0); + assert(g_freed_module == 64 && g_multimedia_procedures[0] == 0); + + reset_loader(); + g_version_result = 8; + assert(multimedia_initialize(1, 2, 1, 0x1234, 0x7000) == 0); + assert(g_freed_module == 64); + + reset_loader(); + g_multimedia_legacy_windows = 1; + g_search_success_attempt = -1; + assert(multimedia_initialize(1, 2, 1, 0x1234, 0x7000) == 0); + assert(g_load_calls == 0 && g_multimedia_module == 0); + + reset_loader(); + g_multimedia_legacy_windows = 1; + assert(multimedia_initialize(3, 4, 1, 0x1234, 0x7000) == 1); + assert(g_proc_calls == 10 && g_multimedia_procedures[8] == 0); + assert(g_multimedia_auto_subclassed == 0); + assert(g_error_mode_calls == 0); + + for (int attempt = 0; attempt < 5; attempt++) { + g_search_success_attempt = attempt; + g_search_calls = 0; + assert(multimedia_locate_library( + win16_make_far_pointer(0x7000, 0x1234), + win16_make_far_pointer(0x7000, 0x478d))); + assert(g_search_calls == (unsigned)attempt + 1); + } + assert(strcmp(g_search_paths[0], "") == 0); + assert(strcmp(g_search_paths[1], "WIN") == 0); + assert(strcmp(g_search_paths[2], "SYS") == 0); + assert(strcmp(g_search_paths[3], "MOD") == 0); + assert(strcmp(g_search_paths[4], "ENV") == 0); + g_search_success_attempt = -1; + g_search_calls = 0; + assert(!multimedia_locate_library( + win16_make_far_pointer(0x7000, 0x1234), + win16_make_far_pointer(0x7000, 0x478d))); + assert(g_search_calls == 5); + return 0; +} diff --git a/original/reconstructed/tests/test_multimedia_paths.c b/original/reconstructed/tests/test_multimedia_paths.c new file mode 100644 index 0000000..d2bd1bf --- /dev/null +++ b/original/reconstructed/tests/test_multimedia_paths.c @@ -0,0 +1,178 @@ +#include "../tdkpin_multimedia.h" + +#include +#include +#include + +static Win16DosFileAttributesResult g_attribute_results[16]; +static unsigned g_attribute_result_count; +static unsigned g_attribute_result_index; +static char g_attribute_names[16][80]; +static unsigned g_oem_calls; +static Win16FarPtr g_environment; + +static void write_far_string(Win16FarPtr destination, const char *source) +{ + size_t length = strlen(source); + for (size_t index = 0; index <= length; index++) { + win16_write_u8( + win16_far_add_offset(destination, (uint16_t)index), + (uint8_t)source[index]); + } +} + +static void read_far_string( + Win16FarPtr source, char *destination, size_t capacity) +{ + size_t index = 0; + while (index + 1 < capacity) { + uint8_t byte = win16_read_u8( + win16_far_add_offset(source, (uint16_t)index)); + destination[index++] = (char)byte; + if (byte == 0) { + return; + } + } + destination[capacity - 1] = 0; +} + +INT16 AnsiToOem16(Win16FarPtr source, Win16FarPtr destination) +{ + assert(source == destination); + g_oem_calls++; + return 1; +} + +Win16DosFileAttributesResult win16_dos_get_file_attributes( + Win16FarPtr oem_name) +{ + assert(g_attribute_result_index < g_attribute_result_count); + read_far_string( + oem_name, + g_attribute_names[g_attribute_result_index], + sizeof(g_attribute_names[g_attribute_result_index])); + return g_attribute_results[g_attribute_result_index++]; +} + +Win16FarPtr GetDOSEnvironment16(void) +{ + return g_environment; +} + +static void reset_attributes(void) +{ + g_attribute_result_count = 0; + g_attribute_result_index = 0; + g_oem_calls = 0; +} + +static void assert_far_string(Win16FarPtr string, const char *expected) +{ + char actual[256]; + read_far_string(string, actual, sizeof(actual)); + assert(strcmp(actual, expected) == 0); +} + +int main(void) +{ + static uint8_t data[0x1000]; + uint8_t stack_anchor = 0; + uintptr_t stack_base = (uintptr_t)&stack_anchor - 0x8000; + win16_reset_segment_bindings(); + win16_bind_segment(0x7000, data, sizeof(data), true); + win16_bind_segment(0x7200, (void *)stack_base, 0x10000, true); + + Win16FarPtr name = win16_make_far_pointer(0x7000, 0x0100); + Win16FarPtr search = win16_make_far_pointer(0x7000, 0x0200); + Win16FarPtr result = win16_make_far_pointer(0x7000, 0x0300); + + char long_name[96]; + memset(long_name, 'A', sizeof(long_name) - 1); + long_name[sizeof(long_name) - 1] = 0; + write_far_string(name, long_name); + reset_attributes(); + g_attribute_result_count = 1; + g_attribute_results[0] = + (Win16DosFileAttributesResult){0x20, false}; + Win16DosFileAttributesResult attributes = + borland_dos_get_file_attributes_ansi(name); + assert(!attributes.carry && attributes.attributes == 0x20); + assert(strlen(g_attribute_names[0]) == 79 && g_oem_calls == 1); + + write_far_string(name, "FILE.DLL"); + write_far_string(search, "C:\\ONE;D:;E:\\TWO"); + reset_attributes(); + g_attribute_result_count = 4; + g_attribute_results[0] = + (Win16DosFileAttributesResult){0, true}; + g_attribute_results[1] = + (Win16DosFileAttributesResult){0x10, false}; /* directory */ + g_attribute_results[2] = + (Win16DosFileAttributesResult){0, true}; + g_attribute_results[3] = + (Win16DosFileAttributesResult){0x20, false}; + assert(multimedia_search_file(search, name, result) == result); + assert(strcmp(g_attribute_names[0], "FILE.DLL") == 0); + assert(strcmp(g_attribute_names[1], "C:\\ONE\\FILE.DLL") == 0); + assert(strcmp(g_attribute_names[2], "D:FILE.DLL") == 0); + assert(strcmp(g_attribute_names[3], "E:\\TWO\\FILE.DLL") == 0); + assert_far_string(result, "E:\\TWO\\FILE.DLL"); + + write_far_string(search, ""); + reset_attributes(); + g_attribute_result_count = 1; + g_attribute_results[0] = + (Win16DosFileAttributesResult){0, true}; + (void)multimedia_search_file(search, name, result); + assert_far_string(result, ""); + + write_far_string(search, ";X"); + reset_attributes(); + g_attribute_result_count = 2; + g_attribute_results[0] = + (Win16DosFileAttributesResult){0, true}; + g_attribute_results[1] = + (Win16DosFileAttributesResult){0, false}; + (void)multimedia_search_file(search, name, result); + assert(strcmp(g_attribute_names[1], "\\FILE.DLL") == 0); + + Win16FarPtr input = win16_make_far_pointer(0x7000, 0x0400); + Win16FarPtr directory = win16_make_far_pointer(0x7000, 0x0500); + Win16FarPtr file = win16_make_far_pointer(0x7000, 0x0600); + Win16FarPtr extension = win16_make_far_pointer(0x7000, 0x0700); + write_far_string(input, "C:\\LONGDIR\\NAME.EXTMORE"); + assert(multimedia_split_path(extension, file, directory, input) == 7); + assert_far_string(directory, "C:\\LONGDIR\\"); + assert_far_string(file, "NAME"); + assert_far_string(extension, ".EXT"); + + write_far_string(input, "DIR\\A?.*"); + assert(multimedia_split_path(extension, file, directory, input) == 15); + assert_far_string(directory, "DIR\\"); + assert_far_string(file, "A?"); + assert_far_string(extension, ".*"); + + write_far_string(input, "GAME"); + assert(multimedia_split_path(extension, file, directory, input) == 2); + assert_far_string(directory, ""); + assert_far_string(file, "GAME"); + assert_far_string(extension, ""); + + g_environment = win16_make_far_pointer(0x7000, 0x0800); + const char environment[] = + "FOO=one\0Path=two;three\0EMPTY=\0\0"; + for (size_t index = 0; index < sizeof(environment); index++) { + win16_write_u8( + win16_far_add_offset(g_environment, (uint16_t)index), + (uint8_t)environment[index]); + } + write_far_string(name, "PATH"); + Win16FarPtr value = multimedia_environment_value(name); + assert_far_string(value, "two;three"); + write_far_string(name, "empty"); + value = multimedia_environment_value(name); + assert(value != 0 && win16_read_u8(value) == 0); + write_far_string(name, "missing"); + assert(multimedia_environment_value(name) == 0); + return 0; +} diff --git a/original/reconstructed/tests/test_multimedia_startup.c b/original/reconstructed/tests/test_multimedia_startup.c new file mode 100644 index 0000000..0a4e2f0 --- /dev/null +++ b/original/reconstructed/tests/test_multimedia_startup.c @@ -0,0 +1,242 @@ +#include "../tdkpin_multimedia.h" + +#include "../tdkpin_borland_files.h" +#include "../tdkpin_borland_records.h" + +#include +#include +#include +#include + +Win16FarPtr g_multimedia_procedures[11]; +HINSTANCE16 g_multimedia_module; +uint8_t g_multimedia_initialized; +uint8_t g_multimedia_pending; +uint16_t g_multimedia_version; +uint8_t g_multimedia_auto_subclassed; +uint8_t g_multimedia_argument_2; +uint8_t g_multimedia_argument_1; +uint8_t g_multimedia_legacy_windows; +char g_multimedia_library_path[21]; +uint16_t g_multimedia_system_directory_length; +uint16_t g_multimedia_windows_version; + +HINSTANCE16 g_win16_previous_instance; +HINSTANCE16 g_win16_instance; +uint16_t g_win16_show_command; + +_Atomic uint16_t g_borland_io_result; +uint8_t g_borland_file_mode; + +static const char *g_system_directory = "SYS"; +static uint16_t g_get_version_result; +static uint16_t g_open_results[4]; +static unsigned g_open_result_count; +static unsigned g_open_result_index; +static unsigned g_assign_calls; +static unsigned g_close_calls; +static unsigned g_require_calls; +static uint8_t g_assigned_length; +static uint8_t g_assigned_last; + +UINT16 GetSystemDirectoryFar16(Win16FarPtr buffer, UINT16 size) +{ + assert(size == 200); + size_t length = strlen(g_system_directory); + for (size_t index = 0; index <= length; index++) { + win16_write_u8( + win16_far_add_offset(buffer, (uint16_t)index), + (uint8_t)g_system_directory[index]); + } + return (UINT16)length; +} + +uint32_t GetVersion16(void) +{ + return 0xbeef0000u | g_get_version_result; +} + +void borland_assign_file_short(Win16FarPtr name, Win16FarPtr record) +{ + (void)record; + g_assign_calls++; + g_assigned_length = win16_read_u8(name); + g_assigned_last = win16_read_u8( + win16_far_add_offset(name, g_assigned_length)); +} + +void borland_open_generic_file(uint16_t record_size, Win16FarPtr record) +{ + (void)record; + assert(record_size == 1); + assert(g_open_result_index < g_open_result_count); + atomic_store( + &g_borland_io_result, + g_open_results[g_open_result_index++]); +} + +uint16_t borland_take_io_result(void) +{ + return atomic_exchange(&g_borland_io_result, 0); +} + +void borland_close_generic_file(Win16FarPtr record) +{ + (void)record; + g_close_calls++; +} + +void borland_require_io_success(void) +{ + assert(atomic_load(&g_borland_io_result) == 0); + g_require_calls++; +} + +static void reset_probe_results(void) +{ + g_open_result_count = 0; + g_open_result_index = 0; + g_assign_calls = 0; + g_close_calls = 0; + g_require_calls = 0; + atomic_store(&g_borland_io_result, 0); +} + +static void expect_short( + Win16FarPtr string, const char *expected) +{ + size_t length = strlen(expected); + assert(win16_read_u8(string) == length); + for (size_t index = 0; index < length; index++) { + assert(win16_read_u8(win16_far_add_offset( + string, (uint16_t)(index + 1))) == + (uint8_t)expected[index]); + } +} + +static void expect_c_string( + Win16FarPtr string, const char *expected) +{ + size_t length = strlen(expected); + for (size_t index = 0; index <= length; index++) { + assert(win16_read_u8(win16_far_add_offset( + string, (uint16_t)index)) == + (uint8_t)expected[index]); + } +} + +static void reset_unit_state(uint8_t *dgroup) +{ + memset(dgroup + 0x4750, 0xcc, 0x3d); + memcpy(dgroup + 0x0522, "CTL3D.DLL", 10); + memcpy(dgroup + 0x052c, "CTL3DV2.DLL", 12); + for (unsigned index = 0; index < 11; index++) { + g_multimedia_procedures[index] = + win16_make_far_pointer(0x8888, (uint16_t)index); + } + g_multimedia_module = 0x7777; + g_multimedia_initialized = 1; + g_multimedia_pending = 1; + g_multimedia_auto_subclassed = 1; + g_multimedia_argument_1 = 9; + g_multimedia_argument_2 = 8; +} + +int main(void) +{ + static uint8_t dgroup[0x6000]; + static uint8_t code[0x600]; + uint8_t stack_anchor = 0; + uintptr_t stack_base = (uintptr_t)&stack_anchor - 0x8000; + win16_reset_segment_bindings(); + win16_bind_segment(0x7000, dgroup, sizeof(dgroup), true); + win16_set_dgroup_selector(0x7000); + win16_bind_ne_segment(3, 0x6000, code, sizeof(code), false); + win16_bind_segment(0x7200, (void *)stack_base, 0x10000, true); + code[0x0470] = 1; + code[0x0471] = '\\'; + + Win16FarPtr short_name = win16_make_far_pointer(0x7000, 0x600); + win16_write_u8(short_name, 3); + win16_write_u8(win16_far_add_offset(short_name, 1), 'A'); + win16_write_u8(win16_far_add_offset(short_name, 2), 'B'); + win16_write_u8(win16_far_add_offset(short_name, 3), 'C'); + + reset_probe_results(); + g_open_result_count = 1; + g_open_results[0] = 2; + assert(!multimedia_short_file_exists(short_name)); + assert(g_assign_calls == 1 && g_assigned_length == 3 && + g_assigned_last == 'C'); + assert(g_close_calls == 0 && g_require_calls == 0); + + reset_probe_results(); + g_open_result_count = 1; + g_open_results[0] = 0; + assert(multimedia_short_file_exists(short_name)); + assert(g_close_calls == 1 && g_require_calls == 1); + + reset_probe_results(); + reset_unit_state(dgroup); + g_system_directory = "SYS"; + g_open_result_count = 1; + g_open_results[0] = 0; /* CTL3DV2 exists. */ + g_get_version_result = 0x0003; + multimedia_initialize_runtime_unit(); + assert(g_open_result_index == 1); + expect_short( + win16_make_far_pointer(0x7000, 0x486d), + "SYS\\CTL3D.DLL"); + expect_short( + win16_make_far_pointer(0x7000, 0x496d), + "SYS\\CTL3DV2.DLL"); + expect_c_string( + win16_make_far_pointer(0x7000, 0x478d), + "CTL3DV2.DLL"); + assert(g_multimedia_system_directory_length == 3); + assert(g_multimedia_windows_version == 0x0003); + assert(g_multimedia_legacy_windows == 1); + for (unsigned index = 0; index < 11; index++) { + assert(g_multimedia_procedures[index] == 0); + } + assert(g_multimedia_auto_subclassed == 0); + assert(g_multimedia_argument_2 == 0 && g_multimedia_argument_1 == 1); + assert(g_multimedia_module == 0 && g_multimedia_pending == 0 && + g_multimedia_initialized == 0); + + reset_probe_results(); + reset_unit_state(dgroup); + g_open_result_count = 2; + g_open_results[0] = 2; /* V2 absent. */ + g_open_results[1] = 0; /* Classic present. */ + g_get_version_result = 0x0a03; + multimedia_initialize_runtime_unit(); + assert(g_open_result_index == 2); + expect_c_string( + win16_make_far_pointer(0x7000, 0x478d), + "CTL3D.DLL"); + assert(g_multimedia_legacy_windows == 0); + + reset_probe_results(); + reset_unit_state(dgroup); + g_open_result_count = 2; + g_open_results[0] = 2; + g_open_results[1] = 3; + g_get_version_result = 0x0004; + multimedia_initialize_runtime_unit(); + expect_c_string( + win16_make_far_pointer(0x7000, 0x478d), + "CTL3DV2.DLL"); + assert(g_multimedia_legacy_windows == 0); + + reset_probe_results(); + reset_unit_state(dgroup); + memcpy(dgroup + 0x478d, "KEEP", 5); + g_system_directory = ""; + g_get_version_result = 0x0004; + multimedia_initialize_runtime_unit(); + assert(g_open_result_index == 0); + expect_c_string( + win16_make_far_pointer(0x7000, 0x478d), "KEEP"); + return 0; +} diff --git a/original/reconstructed/tests/test_numeric.c b/original/reconstructed/tests/test_numeric.c new file mode 100644 index 0000000..cf2e03d --- /dev/null +++ b/original/reconstructed/tests/test_numeric.c @@ -0,0 +1,77 @@ +#include "../tdkpin_numeric.h" + +#include +#include + +static uint8_t g_memory[0x10000]; +static uintptr_t g_stack_base; + +static Win16FarPtr at(uint16_t offset) +{ + return win16_make_far_pointer(0x7777, offset); +} + +static void bind_memory(void) +{ + memset(g_memory, 0, sizeof(g_memory)); + win16_reset_segment_bindings(); + win16_bind_segment(0x7777, g_memory, sizeof(g_memory), true); + win16_bind_segment(0x8888, (void *)g_stack_base, 0x10000, true); +} + +static void set_span(uint16_t offset, const char *text) +{ + memcpy(&g_memory[offset], text, strlen(text)); +} + +static void set_short(uint16_t offset, const char *text) +{ + size_t length = strlen(text); + g_memory[offset] = (uint8_t)length; + memcpy(&g_memory[offset + 1], text, length); +} + +int main(void) +{ + uint8_t stack_marker; + g_stack_base = (uintptr_t)&stack_marker - 0x8000; + bind_memory(); + BorlandFormattedSlice formatted = + borland_format_i32_decimal_backward(at(100), -12345); + assert(formatted.start == at(94) && formatted.length == 6); + assert(memcmp(&g_memory[94], "-12345", 6) == 0); + formatted = borland_format_u32_backward(at(120), 0x2af, 16); + assert(formatted.start == at(117) && formatted.length == 3); + assert(memcmp(&g_memory[117], "2AF", 3) == 0); + + borland_format_i32_short_string(255, at(140), 0, -12345); + assert(g_memory[140] == 6); + assert(memcmp(&g_memory[141], "-12345", 6) == 0); + borland_format_i32_short_string(255, at(150), 9, 42); + assert(g_memory[150] == 9); + assert(memcmp(&g_memory[151], " 42", 9) == 0); + borland_format_i32_short_string(5, at(170), 9, -12345); + assert(g_memory[170] == 5); + assert(memcmp(&g_memory[171], "-1234", 5) == 0); + + set_span(200, "-2147483648"); + BorlandParseI32Result parsed = borland_parse_i32_span(at(200), 11); + assert(!parsed.failed && parsed.remaining == 0 && parsed.value == INT32_MIN); + set_span(220, "$FFFFFFFF"); + parsed = borland_parse_i32_span(at(220), 9); + assert(!parsed.failed && parsed.value == -1); + set_span(240, "2147483648"); + parsed = borland_parse_i32_span(at(240), 10); + assert(parsed.failed); + set_span(260, "12x"); + parsed = borland_parse_i32_span(at(260), 3); + assert(!parsed.failed && parsed.value == 12 && parsed.remaining == 1); + + set_short(300, " -42"); + BorlandValI32Result value = borland_val_i32_short_string(at(300)); + assert(value.value == -42 && value.error_position == 0); + set_short(320, "12x"); + value = borland_val_i32_short_string(at(320)); + assert(value.value == 0 && value.error_position == 3); + return 0; +} diff --git a/original/reconstructed/tests/test_object_lifecycle.c b/original/reconstructed/tests/test_object_lifecycle.c new file mode 100644 index 0000000..c5e9bf5 --- /dev/null +++ b/original/reconstructed/tests/test_object_lifecycle.c @@ -0,0 +1,161 @@ +#include "../tdkpin_object_lifecycle.h" + +#include + +static unsigned g_sequence; +static Win16FarPtr g_object; +static Win16FarPtr g_parent; +static Win16FarPtr g_thunk; +static Win16FarPtr g_teardown; +static bool g_enter_result; +static unsigned g_construct_sequence; + +void win16_call_object_method( + Win16FarPtr procedure, Win16FarPtr object) +{ + assert(++g_sequence == 1); + assert(procedure == g_teardown && object == g_object); +} + +void object_windows_for_each_child( + Win16FarPtr container, Win16FarPtr action) +{ + assert(++g_sequence == 2); + assert(container == g_object); + assert(action == win16_make_far_pointer(0x6000, 0x03e9)); +} + +void object_windows_remove_child( + Win16FarPtr container, Win16FarPtr child) +{ + assert(++g_sequence == 3); + assert(container == g_parent && child == g_object); +} + +void object_windows_release_bound_thunk(Win16FarPtr thunk) +{ + assert(++g_sequence == (g_parent == 0 ? 3u : 4u)); + assert(thunk == g_thunk); +} + +void borland_default_object_destructor( + Win16FarPtr object, uint16_t vmt) +{ + assert(++g_sequence == (g_parent == 0 ? 4u : 5u)); + assert(object == g_object && vmt == 0); +} + +void borland_finish_object_destructor( + BorlandObjectCallFrame *frame, uint16_t vmt_field_offset) +{ + assert(++g_sequence == (g_parent == 0 ? 5u : 6u)); + assert(frame->object == g_object && frame->vmt_argument == 0x0200); + assert(vmt_field_offset == 0); +} + +bool borland_enter_object_constructor( + BorlandObjectCallFrame *frame, uint16_t vmt_field_offset) +{ + assert(++g_construct_sequence == 1); + assert(frame->object == g_object && frame->vmt_argument == 0x0200); + assert(vmt_field_offset == 0); + return g_enter_result; +} + +Win16FarPtr borland_default_object_constructor( + Win16FarPtr object, uint16_t vmt) +{ + assert(++g_construct_sequence == 2); + assert(object == g_object && vmt == 0); + return object; +} + +void object_windows_append_child( + Win16FarPtr container, Win16FarPtr child) +{ + assert(++g_construct_sequence == 3); + assert(container == g_parent && child == g_object); +} + +Win16FarPtr object_windows_allocate_bound_thunk(Win16FarPtr object) +{ + unsigned expected = g_parent == 0 ? 3u : 4u; + assert(++g_construct_sequence == expected); + assert(object == g_object); + return g_thunk; +} + +void object_windows_set_flag_4(Win16FarPtr object) +{ + unsigned expected = g_parent == 0 ? 4u : 5u; + assert(++g_construct_sequence == expected); + assert(object == g_object); + Win16FarPtr address = win16_far_add_offset(object, 0x16); + win16_write_u8(address, (uint8_t)(win16_read_u8(address) | 4)); +} + +static void write_far(Win16FarPtr object, uint16_t offset, Win16FarPtr value) +{ + win16_write_u16(object, offset, win16_far_offset(value)); + win16_write_u16( + object, (uint16_t)(offset + 2), win16_far_selector(value)); +} + +static void run_case(bool with_parent) +{ + g_sequence = 0; + g_parent = with_parent ? win16_make_far_pointer(0x7100, 2) : 0; + write_far(g_object, 6, g_parent); + object_windows_object_destruct(g_object, 0x0200); + assert(g_sequence == (with_parent ? 6u : 5u)); +} + +static void run_construct_case(bool with_parent) +{ + g_construct_sequence = 0; + g_enter_result = true; + g_parent = with_parent ? win16_make_far_pointer(0x7100, 2) : 0; + assert(object_windows_object_construct(g_object, 0x0200, g_parent) == + g_object); + assert(g_construct_sequence == (with_parent ? 5u : 4u)); + assert(win16_read_u16(win16_far_add_offset(g_object, 2)) == 0); + assert(win16_read_u16(win16_far_add_offset(g_object, 4)) == 0); + assert(win16_read_far_pointer(g_object, 6) == g_parent); + assert(win16_read_far_pointer(g_object, 0x0a) == 0); + assert(win16_read_far_pointer(g_object, 0x0e) == 0); + assert(win16_read_far_pointer(g_object, 0x12) == g_thunk); + assert(win16_read_u8(win16_far_add_offset(g_object, 0x16)) == 4); + if (!with_parent) { + assert(win16_read_far_pointer(g_object, 0x19) == 0); + } +} + +int main(void) +{ + static uint8_t dgroup[0x1000]; + static uint8_t code[0x1000]; + static uint8_t object_bytes[64]; + static uint8_t parent_bytes[64]; + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, dgroup, sizeof(dgroup), true); + win16_set_dgroup_selector(0x5000); + win16_bind_ne_segment(4, 0x6000, code, sizeof(code), false); + win16_bind_segment(0x7000, object_bytes, sizeof(object_bytes), true); + win16_bind_segment(0x7100, parent_bytes, sizeof(parent_bytes), true); + + g_object = win16_make_far_pointer(0x7000, 2); + g_thunk = win16_make_far_pointer(0x6200, 0x1234); + g_teardown = win16_make_far_pointer(0x6100, 0x4321); + win16_write_u16(g_object, 0, 0x0100); + write_far(win16_dgroup_pointer(0x0124), 0, g_teardown); + write_far(g_object, 0x12, g_thunk); + run_case(true); + run_case(false); + run_construct_case(true); + run_construct_case(false); + g_construct_sequence = 0; + g_enter_result = false; + assert(object_windows_object_construct(g_object, 0x0200, 0) == g_object); + assert(g_construct_sequence == 1); + return 0; +} diff --git a/original/reconstructed/tests/test_object_list.c b/original/reconstructed/tests/test_object_list.c new file mode 100644 index 0000000..b3c813b --- /dev/null +++ b/original/reconstructed/tests/test_object_list.c @@ -0,0 +1,169 @@ +#include "../tdkpin_object_list.h" + +#include + +static Win16FarPtr g_match; +static Win16FarPtr g_order[8]; +static unsigned g_order_count; +static Win16FarPtr g_blocking_child; +static Win16FarPtr g_disposed_child; + +bool win16_call_object_predicate( + Win16FarPtr procedure, Win16FarPtr child) +{ + if (procedure == win16_make_far_pointer(0x6000, 0x0ec0)) { + return object_windows_child_blocks_close(0, child); + } + assert(procedure == win16_make_far_pointer(0x6000, 0x0100)); + g_order[g_order_count++] = child; + return child == g_match; +} + +bool win16_call_object_bool_method( + Win16FarPtr procedure, Win16FarPtr object) +{ + assert(procedure == win16_make_far_pointer(0x6100, 0x0300)); + return object != g_blocking_child; +} + +void borland_dispose_object(Win16FarPtr object) +{ + g_disposed_child = object; +} + +BOOL16 IsIconic16(HWND16 window) +{ + (void)window; + return 0; +} + +INT16 GetWindowText16(HWND16 window, char *text, INT16 maximum) +{ + (void)window; + (void)text; + (void)maximum; + return 0; +} + +BOOL16 SetWindowText16(HWND16 window, const char *text) +{ + (void)window; + (void)text; + return 0; +} + +void win16_call_object_u16_method( + Win16FarPtr procedure, Win16FarPtr object, uint16_t argument) +{ + (void)procedure; + (void)object; + (void)argument; +} + +uint16_t win16_call_object_transfer_method( + Win16FarPtr procedure, + Win16FarPtr object, + uint16_t direction, + Win16FarPtr cursor) +{ + (void)procedure; + (void)object; + (void)direction; + (void)cursor; + return 0; +} + +void win16_call_object_action( + Win16FarPtr procedure, Win16FarPtr child) +{ + assert(procedure == win16_make_far_pointer(0x6000, 0x0200)); + g_order[g_order_count++] = child; +} + +static Win16FarPtr next_of(Win16FarPtr child) +{ + return win16_read_far_pointer(child, 0x19); +} + +int main(void) +{ + static uint8_t container_bytes[64]; + static uint8_t a_bytes[64]; + static uint8_t b_bytes[64]; + static uint8_t c_bytes[64]; + static uint8_t dgroup[0x1000]; + static uint8_t code[0x1000]; + win16_reset_segment_bindings(); + win16_bind_segment( + 0x7000, container_bytes, sizeof(container_bytes), true); + win16_bind_segment(0x7100, a_bytes, sizeof(a_bytes), true); + win16_bind_segment(0x7200, b_bytes, sizeof(b_bytes), true); + win16_bind_segment(0x7300, c_bytes, sizeof(c_bytes), true); + win16_bind_segment(0x5000, dgroup, sizeof(dgroup), true); + win16_set_dgroup_selector(0x5000); + win16_bind_ne_segment(4, 0x6000, code, sizeof(code), false); + + Win16FarPtr container = win16_make_far_pointer(0x7000, 2); + Win16FarPtr a = win16_make_far_pointer(0x7100, 2); + Win16FarPtr b = win16_make_far_pointer(0x7200, 2); + Win16FarPtr c = win16_make_far_pointer(0x7300, 2); + object_windows_append_child(container, 0); + assert(win16_read_far_pointer(container, 0x0a) == 0); + object_windows_append_child(container, a); + object_windows_append_child(container, b); + object_windows_append_child(container, c); + assert(win16_read_far_pointer(container, 0x0a) == c); + assert(next_of(a) == b && next_of(b) == c && next_of(c) == a); + win16_write_u16(a, 0, 0x0100); + win16_write_u16(b, 0, 0x0100); + win16_write_u16(c, 0, 0x0100); + win16_write_u16(a, 4, 1); + win16_write_u16(b, 4, 1); + win16_write_u16(c, 4, 1); + win16_write_u16(win16_dgroup_pointer(0x013c), 0, 0x0300); + win16_write_u16(win16_dgroup_pointer(0x013e), 0, 0x6100); + + Win16FarPtr predicate = win16_make_far_pointer(0x6000, 0x0100); + g_match = b; + g_order_count = 0; + assert(object_windows_find_child(container, predicate) == b); + assert(g_order_count == 2 && g_order[0] == a && g_order[1] == b); + g_match = 0; + g_order_count = 0; + assert(object_windows_find_child(container, predicate) == 0); + assert(g_order_count == 3 && g_order[2] == c); + + g_blocking_child = b; + assert(!object_windows_all_children_can_close(container)); + g_blocking_child = 0; + assert(object_windows_all_children_can_close(container)); + win16_write_u16(a, 4, 0); + g_blocking_child = a; + assert(object_windows_all_children_can_close(container)); + win16_write_u16(a, 4, 1); + + g_order_count = 0; + object_windows_for_each_child( + container, win16_make_far_pointer(0x6000, 0x0200)); + assert(g_order_count == 3); + assert(g_order[0] == a && g_order[1] == b && g_order[2] == c); + + object_windows_remove_child(container, b); + assert(next_of(a) == c && next_of(c) == a); + assert(win16_read_far_pointer(container, 0x0a) == c); + object_windows_remove_child(container, c); + assert(win16_read_far_pointer(container, 0x0a) == a); + assert(next_of(a) == a); + object_windows_remove_child(container, c); + assert(win16_read_far_pointer(container, 0x0a) == a); + object_windows_remove_child(container, a); + assert(win16_read_far_pointer(container, 0x0a) == 0); + assert(object_windows_find_child(container, predicate) == 0); + object_windows_for_each_child( + container, win16_make_far_pointer(0x6000, 0x0200)); + assert(object_windows_minus_one_default(container) == 0xffff); + g_disposed_child = 0; + object_windows_dispose_child_callback(0xbeef, b); + assert(g_disposed_child == b); + return 0; +} diff --git a/original/reconstructed/tests/test_object_windows.c b/original/reconstructed/tests/test_object_windows.c new file mode 100644 index 0000000..6816076 --- /dev/null +++ b/original/reconstructed/tests/test_object_windows.c @@ -0,0 +1,174 @@ +#include "../tdkpin_object_windows.h" + +#include +#include + +static uint8_t g_dgroup[0x10000]; +static uint8_t g_code[0x10000]; +static uint8_t g_object[0x100]; +static BOOL16 g_is_window; +static Win16FarPtr g_window_proc; +static Win16FarPtr g_property_object; +static unsigned g_set_count; +static unsigned g_remove_count; +static uint16_t g_property_offsets[2]; +static uint16_t g_property_values[2]; +static unsigned g_set_window_long_calls; +static Win16FarPtr g_installed_proc; +static Win16FarPtr g_called_proc; +static HWND16 g_called_window; +static UINT16 g_called_message; +static WPARAM16 g_called_wparam; +static LPARAM16 g_called_lparam; + +Win16FarPtr g_object_windows_creating_object; + +LRESULT16 SetWindowLong16(HWND16 window, INT16 index, int32_t value) +{ + assert(window == 0x77 && index == -4); + g_set_window_long_calls++; + g_installed_proc = (Win16FarPtr)(uint32_t)value; + return 0; +} + +LRESULT16 win16_call_window_proc( + Win16FarPtr procedure, + HWND16 window, + UINT16 message, + WPARAM16 wparam, + LPARAM16 lparam) +{ + g_called_proc = procedure; + g_called_window = window; + g_called_message = message; + g_called_wparam = wparam; + g_called_lparam = lparam; + return (LRESULT16)0x12345678u; +} + +BOOL16 SetProp16(HWND16 window, Win16FarPtr name, Win16Handle value) +{ + assert(window == 0x77); + assert(g_set_count < 2); + g_property_offsets[g_set_count] = win16_far_offset(name); + g_property_values[g_set_count] = value; + g_set_count++; + return 1; +} + +Win16Handle RemoveProp16(HWND16 window, Win16FarPtr name) +{ + assert(window == 0x77); + assert(g_remove_count < 2); + g_property_offsets[g_remove_count++] = win16_far_offset(name); + return 0; +} + +Win16Handle GetProp16(HWND16 window, Win16FarPtr name) +{ + assert(window == 0x77); + return win16_far_offset(name) == 0x067a + ? win16_far_selector(g_property_object) + : win16_far_offset(g_property_object); +} + +BOOL16 IsWindow16(HWND16 window) +{ + assert(window == 0x77); + return g_is_window; +} + +int32_t GetWindowLong16(HWND16 window, INT16 index) +{ + assert(window == 0x77 && index == -4); + return (int32_t)g_window_proc; +} + +static void reset_state(void) +{ + memset(g_dgroup, 0, sizeof(g_dgroup)); + memset(g_code, 0, sizeof(g_code)); + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, g_dgroup, sizeof(g_dgroup), true); + win16_bind_segment(0x6000, g_code, sizeof(g_code), true); + win16_bind_segment(0x7000, g_object, sizeof(g_object), true); + win16_set_dgroup_selector(0x5000); + g_is_window = 1; + g_set_count = 0; + g_remove_count = 0; + g_set_window_long_calls = 0; +} + +static void test_bootstrap_transition(void) +{ + reset_state(); + Win16FarPtr object = win16_make_far_pointer(0x7000, 0x0010); + Win16FarPtr bound_proc = win16_make_far_pointer(0x6000, 0x0300); + g_object_windows_creating_object = object; + win16_write_u16(object, 0x12, win16_far_offset(bound_proc)); + win16_write_u16(object, 0x14, win16_far_selector(bound_proc)); + + LRESULT16 result = object_window_bootstrap_proc( + 0x77, + 0x0123, + 0x4567, + (LPARAM16)0x89abcdefu); + assert(result == (LRESULT16)0x12345678u); + assert(g_set_window_long_calls == 1 && g_installed_proc == bound_proc); + assert(g_set_count == 2); + assert(g_property_values[0] == win16_far_selector(object)); + assert(g_property_values[1] == win16_far_offset(object)); + assert(g_called_proc == bound_proc && g_called_window == 0x77); + assert(g_called_message == 0x0123 && g_called_wparam == 0x4567); + assert(g_called_lparam == (LPARAM16)0x89abcdefu); +} + +static void test_property_binding(void) +{ + reset_state(); + Win16FarPtr object = win16_make_far_pointer(0x3456, 0x789a); + object_windows_bind_window(0x77, object); + assert(g_set_count == 2); + assert(g_property_offsets[0] == 0x067a && g_property_values[0] == 0x3456); + assert(g_property_offsets[1] == 0x067e && g_property_values[1] == 0x789a); + + object_windows_unbind_window(0x77); + assert(g_remove_count == 2); + assert(g_property_offsets[0] == 0x067a && g_property_offsets[1] == 0x067e); +} + +static void test_generated_thunk_lookup(void) +{ + reset_state(); + g_window_proc = win16_make_far_pointer(0x6000, 0x0100); + Win16FarPtr object = win16_make_far_pointer(0x3456, 0x789a); + g_code[2] = 0x5b; + g_code[3] = 0x2e; + g_code[0x0100] = 0xe8; + g_code[0x0101] = 0xff; + g_code[0x0102] = 0xfe; + g_code[0x0103] = (uint8_t)object; + g_code[0x0104] = (uint8_t)(object >> 8); + g_code[0x0105] = (uint8_t)(object >> 16); + g_code[0x0106] = (uint8_t)(object >> 24); + assert(object_windows_object_from_window(0x77) == object); +} + +static void test_property_fallback_and_invalid_window(void) +{ + reset_state(); + g_window_proc = win16_make_far_pointer(0x6000, 0x0200); + g_property_object = win16_make_far_pointer(0x1111, 0x2222); + assert(object_windows_object_from_window(0x77) == g_property_object); + g_is_window = 0; + assert(object_windows_object_from_window(0x77) == 0); +} + +int main(void) +{ + test_property_binding(); + test_generated_thunk_lookup(); + test_property_fallback_and_invalid_window(); + test_bootstrap_transition(); + return 0; +} diff --git a/original/reconstructed/tests/test_object_windows_handlers.c b/original/reconstructed/tests/test_object_windows_handlers.c new file mode 100644 index 0000000..9f66220 --- /dev/null +++ b/original/reconstructed/tests/test_object_windows_handlers.c @@ -0,0 +1,169 @@ +#include "../tdkpin_dialog.h" + +#include + +Win16FarPtr g_object_windows_application; +uint8_t g_object_windows_focus_event_marker; + +static bool g_bool_result; +static Win16FarPtr g_expected_bool_procedure; +static Win16FarPtr g_expected_bool_receiver; +static unsigned g_bool_calls; +static HWND16 g_set_focus_window; +static Win16FarPtr g_window_from_handle; +static Win16FarPtr g_called_method; +static Win16FarPtr g_called_receiver; +static unsigned g_method_calls; +static unsigned g_dispose_calls; +static Win16FarPtr g_u16_procedures[2]; +static uint16_t g_u16_arguments[2]; +static unsigned g_u16_calls; + +bool win16_call_object_bool_method( + Win16FarPtr procedure, Win16FarPtr object) +{ + assert(procedure == g_expected_bool_procedure); + assert(object == g_expected_bool_receiver); + g_bool_calls++; + return g_bool_result; +} + +HWND16 SetFocus16(HWND16 window) +{ + g_set_focus_window = window; + return 0x9999; +} + +Win16FarPtr object_windows_object_from_window(HWND16 window) +{ + assert(window == g_set_focus_window); + return g_window_from_handle; +} + +void win16_call_object_method( + Win16FarPtr procedure, Win16FarPtr object) +{ + g_called_method = procedure; + g_called_receiver = object; + g_method_calls++; +} + +void borland_dispose_object(Win16FarPtr object) +{ + g_called_receiver = object; + g_dispose_calls++; +} + +void win16_call_object_u16_method( + Win16FarPtr procedure, Win16FarPtr object, uint16_t argument) +{ + assert(g_u16_calls < 2); + g_u16_procedures[g_u16_calls] = procedure; + g_u16_arguments[g_u16_calls] = argument; + g_called_receiver = object; + g_u16_calls++; +} + +static void write_far( + Win16FarPtr base, uint16_t offset, Win16FarPtr value) +{ + win16_write_u16(base, offset, win16_far_offset(value)); + win16_write_u16( + base, (uint16_t)(offset + 2), win16_far_selector(value)); +} + +int main(void) +{ + static uint8_t dgroup[0x1000]; + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, dgroup, sizeof(dgroup), true); + win16_set_dgroup_selector(0x5000); + + Win16FarPtr application = win16_make_far_pointer(0x5000, 0x0200); + Win16FarPtr main_window = win16_make_far_pointer(0x5000, 0x0300); + Win16FarPtr other_window = win16_make_far_pointer(0x5000, 0x0400); + Win16FarPtr attached = win16_make_far_pointer(0x5000, 0x0600); + g_object_windows_application = application; + win16_write_u16(application, 0, 0x0700); + write_far(application, 8, main_window); + win16_write_u16(main_window, 0, 0x0780); + win16_write_u16(other_window, 0, 0x0800); + win16_write_u16(attached, 0, 0x0880); + + Win16FarPtr app_can_close = + win16_make_far_pointer(0x6000, 0x1111); + Win16FarPtr window_can_close = + win16_make_far_pointer(0x6000, 0x2222); + write_far(win16_dgroup_pointer(0x0700), 0x44, app_can_close); + write_far(win16_dgroup_pointer(0x0800), 0x3c, window_can_close); + + ObjectWindowsMessage message = {0}; + g_expected_bool_procedure = app_can_close; + g_expected_bool_receiver = application; + g_bool_result = true; + g_bool_calls = 0; + object_windows_query_end_session_result(main_window, &message); + assert(g_bool_calls == 1 && message.result == 0); + + g_expected_bool_procedure = window_can_close; + g_expected_bool_receiver = other_window; + g_bool_result = false; + object_windows_query_end_session_result(other_window, &message); + assert(message.result == 1); + + message.wparam = 0x1234; + g_window_from_handle = other_window; + write_far(other_window, 0x43, attached); + Win16FarPtr attached_method = + win16_make_far_pointer(0x6000, 0x3333); + write_far(win16_dgroup_pointer(0x0880), 0x0c, attached_method); + g_method_calls = 0; + g_object_windows_focus_event_marker = 0; + object_windows_focus_message(main_window, &message); + assert(g_set_focus_window == 0x1234); + assert(g_method_calls == 1 && g_called_method == attached_method && + g_called_receiver == attached); + assert(g_object_windows_focus_event_marker == 1); + + g_window_from_handle = 0; + g_method_calls = 0; + g_object_windows_focus_event_marker = 0; + object_windows_focus_message(0, &message); + assert(g_method_calls == 0 && g_object_windows_focus_event_marker == 1); + + Win16FarPtr dialog = win16_make_far_pointer(0x5000, 0x0500); + win16_write_u16(dialog, 0, 0x0900); + Win16FarPtr dialog_can_close = + win16_make_far_pointer(0x6000, 0x4444); + Win16FarPtr dialog_transfer = + win16_make_far_pointer(0x6000, 0x5555); + Win16FarPtr dialog_close = + win16_make_far_pointer(0x6000, 0x6666); + write_far(win16_dgroup_pointer(0x0900), 0x3c, dialog_can_close); + write_far(win16_dgroup_pointer(0x0900), 0x44, dialog_transfer); + write_far(win16_dgroup_pointer(0x0900), 0x50, dialog_close); + win16_write_u8(win16_far_add_offset(dialog, 0x25), 0); + g_expected_bool_procedure = dialog_can_close; + g_expected_bool_receiver = dialog; + g_bool_result = true; + g_dispose_calls = 0; + object_windows_dialog_validate_and_close(dialog, &message); + assert(g_dispose_calls == 1 && g_called_receiver == dialog); + + win16_write_u8(win16_far_add_offset(dialog, 0x25), 1); + g_expected_bool_procedure = dialog_can_close; + g_expected_bool_receiver = dialog; + g_bool_result = false; + g_u16_calls = 0; + object_windows_dialog_validate_and_close(dialog, &message); + assert(g_u16_calls == 0); + + g_bool_result = true; + object_windows_dialog_validate_and_close(dialog, &message); + assert(g_u16_calls == 2 && g_called_receiver == dialog); + assert(g_u16_procedures[0] == dialog_transfer && + g_u16_arguments[0] == 1); + assert(g_u16_procedures[1] == dialog_close && + g_u16_arguments[1] == 1); + return 0; +} diff --git a/original/reconstructed/tests/test_overlay_setup.c b/original/reconstructed/tests/test_overlay_setup.c new file mode 100644 index 0000000..68536fc --- /dev/null +++ b/original/reconstructed/tests/test_overlay_setup.c @@ -0,0 +1,44 @@ +#include "../tdkpin_game_assets.h" + +#include + +static uint8_t g_dgroup[0x1000]; +static uint8_t g_window_bytes[32]; +HINSTANCE16 g_win16_instance; +static Win16FarPtr g_window; +static unsigned g_step; + +void object_windows_setup_window(Win16FarPtr window) +{ + assert(++g_step == 1 && window == g_window); +} + +HBITMAP16 tdkpin_load_bitmap_resource( + Win16FarPtr resource_name, HINSTANCE16 instance) +{ + assert(++g_step == 2); + assert(resource_name == win16_make_far_pointer(0, 993)); + assert(instance == g_win16_instance); + return 0x7777; +} + +HWND16 SetFocus16(HWND16 window) +{ + assert(++g_step == 3 && window == 0x2222); + return 0x1111; +} + +int main(void) +{ + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, g_dgroup, sizeof(g_dgroup), true); + win16_bind_segment(0x6000, g_window_bytes, sizeof(g_window_bytes), true); + win16_set_dgroup_selector(0x5000); + g_win16_instance = 0x4444; + g_window = win16_make_far_pointer(0x6000, 0); + win16_write_u16(g_window, 4, 0x2222); + tdkpin_setup_overlay_window(g_window); + assert(g_step == 3); + assert(win16_read_u16(win16_make_far_pointer(0x5000, 0x0867)) == 0x7777); + return 0; +} diff --git a/original/reconstructed/tests/test_palette.c b/original/reconstructed/tests/test_palette.c new file mode 100644 index 0000000..fe3320f --- /dev/null +++ b/original/reconstructed/tests/test_palette.c @@ -0,0 +1,140 @@ +#include "../tdkpin_palette.h" + +#include +#include +#include +#include + +static uint8_t g_dgroup[0x5000]; +static uint8_t g_allocation[sizeof(LOGPALETTE256)]; +static uint8_t g_resource_bytes[768]; +static uint8_t g_bitmap_info[sizeof(BITMAPINFO256)]; +static unsigned g_range_checks; +static unsigned g_get_mem_calls; +static unsigned g_free_mem_calls; +static unsigned g_create_palette_calls; +static unsigned g_find_calls; +static unsigned g_load_calls; +static unsigned g_lock_calls; +static unsigned g_unlock_calls; + +static Win16FarPtr dgroup_at(uint16_t offset) +{ + return win16_make_far_pointer(0x5000, offset); +} + +Win16FarPtr borland_get_mem(uint16_t bytes) +{ + assert(bytes == sizeof(LOGPALETTE256)); + g_get_mem_calls++; + return win16_make_far_pointer(0x6000, 0); +} + +void borland_free_mem(Win16FarPtr block, uint16_t bytes) +{ + assert(block == win16_make_far_pointer(0x6000, 0)); + assert(bytes == sizeof(LOGPALETTE256)); + g_free_mem_calls++; +} + +void borland_check_int32_range( + int32_t value, const BorlandInt32Range *range) +{ + assert(value >= range->minimum && value <= range->maximum); + if (range->maximum == 0xffff) { + assert(value == sizeof(LOGPALETTE256)); + } else { + assert(range->minimum == 0 && range->maximum == 0x02ff); + } + g_range_checks++; +} + +HPALETTE16 CreatePalette16(Win16FarPtr logical_palette) +{ + assert(logical_palette == win16_make_far_pointer(0x6000, 0)); + assert(win16_read_u16(logical_palette) == 0x0300); + assert(win16_read_u16(win16_far_add_offset(logical_palette, 2)) == 256); + for (uint16_t index = 0; index < 256; index++) { + Win16FarPtr entry = win16_far_add_offset( + logical_palette, (uint16_t)(4 + index * 4)); + assert(win16_read_u8(entry) == g_dgroup[0x4450 + index * 3]); + assert(win16_read_u8(win16_far_add_offset(entry, 1)) == + g_dgroup[0x4451 + index * 3]); + assert(win16_read_u8(win16_far_add_offset(entry, 2)) == + g_dgroup[0x4452 + index * 3]); + assert(win16_read_u8(win16_far_add_offset(entry, 3)) == 0); + } + g_create_palette_calls++; + return 0x2468; +} + +HRSRC16 FindResource16( + HINSTANCE16 instance, Win16FarPtr name, Win16FarPtr type) +{ + assert(instance == 0x4444); + assert(name == win16_make_far_pointer(0, 999)); + assert(type == dgroup_at(0x045a)); + g_find_calls++; + return 0x1111; +} + +HGLOBAL16 LoadResource16(HINSTANCE16 instance, HRSRC16 resource) +{ + assert(instance == 0x4444 && resource == 0x1111); + g_load_calls++; + return 0x2222; +} + +Win16FarPtr LockResource16(HGLOBAL16 resource) +{ + assert(resource == 0x2222); + g_lock_calls++; + return win16_make_far_pointer(0x7000, 0); +} + +BOOL16 GlobalUnlock16(HGLOBAL16 resource) +{ + assert(resource == 0x2222); + g_unlock_calls++; + return 1; +} + +int main(void) +{ + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, g_dgroup, sizeof(g_dgroup), true); + win16_bind_segment(0x6000, g_allocation, sizeof(g_allocation), true); + win16_bind_segment(0x7000, g_resource_bytes, sizeof(g_resource_bytes), false); + win16_bind_segment(0x8000, g_bitmap_info, sizeof(g_bitmap_info), true); + win16_set_dgroup_selector(0x5000); + memcpy(&g_dgroup[0x045a], "pal", 4); + for (uint16_t index = 0; index < 768; index++) { + g_dgroup[0x4450 + index] = (uint8_t)(index * 37 + 11); + g_resource_bytes[index] = (uint8_t)(index * 19 + 7); + } + + tdkpin_create_palette_from_rgb_table(); + assert(g_get_mem_calls == 1 && g_create_palette_calls == 1); + assert(g_range_checks == 1 && g_free_mem_calls == 1); + assert(win16_read_u16(dgroup_at(0x444e)) == 0x2468); + + g_range_checks = 0; + tdkpin_load_palette_resource( + dgroup_at(0x4450), win16_make_far_pointer(0, 999), 0x4444); + assert(g_find_calls == 1 && g_load_calls == 1 && g_lock_calls == 1); + assert(g_unlock_calls == 1 && g_range_checks == 1536); + assert(memcmp(&g_dgroup[0x4450], g_resource_bytes, 768) == 0); + + Win16FarPtr bitmap_info = win16_make_far_pointer(0x8000, 0); + win16_write_u16( + bitmap_info, offsetof(BITMAPINFOHEADER16, bit_count), 8); + tdkpin_fill_bitmap_info_palette(bitmap_info); + for (uint16_t index = 0; index < 256; index++) { + size_t output = offsetof(BITMAPINFO256, colors) + index * 4; + assert(g_bitmap_info[output] == g_dgroup[0x4452 + index * 3]); + assert(g_bitmap_info[output + 1] == g_dgroup[0x4451 + index * 3]); + assert(g_bitmap_info[output + 2] == g_dgroup[0x4450 + index * 3]); + assert(g_bitmap_info[output + 3] == 0); + } + return 0; +} diff --git a/original/reconstructed/tests/test_palette_gdi.c b/original/reconstructed/tests/test_palette_gdi.c new file mode 100644 index 0000000..509d150 --- /dev/null +++ b/original/reconstructed/tests/test_palette_gdi.c @@ -0,0 +1,95 @@ +#include "../tdkpin_palette.h" + +#include +#include +#include + +static uint8_t g_palette_bytes[sizeof(LOGPALETTE256)]; +static bool g_fail_allocation; +static unsigned g_step; +static unsigned g_get_mem_calls; +static unsigned g_free_mem_calls; + +Win16FarPtr borland_get_mem(uint16_t bytes) +{ + assert(bytes == sizeof(LOGPALETTE256)); + g_get_mem_calls++; + return g_fail_allocation ? 0 : win16_make_far_pointer(0x6000, 0); +} + +void borland_free_mem(Win16FarPtr block, uint16_t bytes) +{ + assert(++g_step == 8); + assert(block == win16_make_far_pointer(0x6000, 0)); + assert(bytes == sizeof(LOGPALETTE256)); + g_free_mem_calls++; +} + +HDC16 GetDC16(HWND16 window) +{ + assert(++g_step == 1 && window == 0x1234); + return 0x2222; +} + +HPALETTE16 CreatePalette16(Win16FarPtr logical_palette) +{ + assert(++g_step == 2); + assert(win16_read_u16(logical_palette) == 0x0300); + assert(win16_read_u16(win16_far_add_offset(logical_palette, 2)) == 256); + for (uint16_t index = 0; index < 256; index++) { + Win16FarPtr entry = win16_far_add_offset( + logical_palette, (uint16_t)(4 + index * 4)); + assert(win16_read_u8(entry) == 0); + assert(win16_read_u8(win16_far_add_offset(entry, 1)) == 0); + assert(win16_read_u8(win16_far_add_offset(entry, 2)) == 0); + assert(win16_read_u8(win16_far_add_offset(entry, 3)) == 4); + } + return 0x3333; +} + +HPALETTE16 SelectPalette16( + HDC16 dc, HPALETTE16 palette, BOOL16 force_background) +{ + assert(dc == 0x2222); + if (++g_step == 3) { + assert(palette == 0x3333 && force_background == 0); + return 0x4444; + } + assert(g_step == 5); + assert(palette == 0x4444 && force_background == 1); + return 0x3333; +} + +UINT16 RealizePalette16(HDC16 dc) +{ + assert(++g_step == 4 && dc == 0x2222); + return 256; +} + +BOOL16 DeleteObject16(HGDIOBJ16 object) +{ + assert(++g_step == 6 && object == 0x3333); + return 1; +} + +INT16 ReleaseDC16(HWND16 window, HDC16 dc) +{ + assert(++g_step == 7 && window == 0x1234 && dc == 0x2222); + return 1; +} + +int main(void) +{ + win16_reset_segment_bindings(); + win16_bind_segment( + 0x6000, g_palette_bytes, sizeof(g_palette_bytes), true); + g_fail_allocation = true; + tdkpin_realize_nocollapse_palette(0x1234); + assert(g_get_mem_calls == 1 && g_step == 0 && g_free_mem_calls == 0); + + g_fail_allocation = false; + memset(g_palette_bytes, 0xff, sizeof(g_palette_bytes)); + tdkpin_realize_nocollapse_palette(0x1234); + assert(g_get_mem_calls == 2 && g_step == 8 && g_free_mem_calls == 1); + return 0; +} diff --git a/original/reconstructed/tests/test_palette_messages.c b/original/reconstructed/tests/test_palette_messages.c new file mode 100644 index 0000000..a3cdbad --- /dev/null +++ b/original/reconstructed/tests/test_palette_messages.c @@ -0,0 +1,89 @@ +#include "../tdkpin_game_assets.h" + +#include +#include + +static uint8_t g_dgroup[0x1000]; +static uint8_t g_objects[0x100]; +static Win16FarPtr g_window; +static Win16FarPtr g_message; +static BOOL16 g_iconic; +static unsigned g_iconic_calls; +static unsigned g_invalidate_calls; +static unsigned g_update_calls; + +BOOL16 IsIconic16(HWND16 window) +{ + assert(window == 0x2222); + g_iconic_calls++; + return g_iconic; +} + +BOOL16 InvalidateRect16( + HWND16 window, Win16FarPtr rectangle, BOOL16 erase) +{ + assert(window == 0x2222 && rectangle == 0 && erase == 0); + g_invalidate_calls++; + return 1; +} + +BOOL16 UpdateWindow16(HWND16 window) +{ + assert(window == 0x2222); + g_update_calls++; + return 1; +} + +static void reset_fixture(void) +{ + memset(g_dgroup, 0, sizeof(g_dgroup)); + memset(g_objects, 0, sizeof(g_objects)); + win16_write_u16(g_window, 4, 0x2222); + win16_write_u32(g_message, 10, 0x12345678); + g_iconic = 0; + g_iconic_calls = 0; + g_invalidate_calls = 0; + g_update_calls = 0; +} + +int main(void) +{ + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, g_dgroup, sizeof(g_dgroup), true); + win16_bind_segment(0x6000, g_objects, sizeof(g_objects), true); + win16_set_dgroup_selector(0x5000); + g_window = win16_make_far_pointer(0x6000, 0); + g_message = win16_make_far_pointer(0x6000, 0x40); + win16_set_indeterminate_u16(0xbeef); + + reset_fixture(); + win16_write_u16(g_message, 4, 0); + win16_write_u8(win16_make_far_pointer(0x5000, 0x07c4), 1); + assert(tdkpin_palette_change_variant_a(g_window, g_message) == 0); + assert(win16_read_u8(win16_make_far_pointer(0x5000, 0x07c4)) == 0); + assert(g_iconic_calls == 0 && g_invalidate_calls == 0); + + reset_fixture(); + win16_write_u16(g_message, 4, 1); + g_iconic = 1; + assert(tdkpin_palette_change_variant_a(g_window, g_message) == 0xbeef); + assert(g_iconic_calls == 1 && g_invalidate_calls == 0); + + reset_fixture(); + win16_write_u16(g_message, 4, 1); + assert(tdkpin_palette_change_variant_a(g_window, g_message) == 0); + assert(g_iconic_calls == 1 && g_invalidate_calls == 1 && g_update_calls == 1); + assert(win16_read_u32(win16_far_add_offset(g_message, 10)) == 0); + assert(win16_read_u8(win16_make_far_pointer(0x5000, 0x07c4)) == 1); + assert(tdkpin_palette_change_variant_a(g_window, g_message) == 0xbeef); + + reset_fixture(); + win16_write_u16(g_message, 4, 1); + tdkpin_palette_change_variant_b(g_window, g_message); + assert(g_invalidate_calls == 0); + win16_write_u16(g_message, 4, 0); + tdkpin_palette_change_variant_b(g_window, g_message); + assert(g_invalidate_calls == 1 && g_update_calls == 1); + assert(win16_read_u32(win16_far_add_offset(g_message, 10)) == 0); + return 0; +} diff --git a/original/reconstructed/tests/test_palette_window_messages.c b/original/reconstructed/tests/test_palette_window_messages.c new file mode 100644 index 0000000..143d17e --- /dev/null +++ b/original/reconstructed/tests/test_palette_window_messages.c @@ -0,0 +1,141 @@ +#include "../tdkpin_game_assets.h" + +#include +#include + +static uint8_t g_dgroup[0x5000]; +static uint8_t g_objects[0x100]; +static Win16FarPtr g_window; +static Win16FarPtr g_message; +static HWND16 g_parent_result; +static int16_t g_realize_result; +static unsigned g_step; +static unsigned g_invalidate_calls; + +HWND16 GetParent16(HWND16 window) +{ + assert(++g_step == 1 && window == 0x3333); + return g_parent_result; +} + +HDC16 GetDC16(HWND16 window) +{ + assert(window == 0x2222); + g_step++; + return 0x4444; +} + +HPALETTE16 SelectPalette16( + HDC16 dc, HPALETTE16 palette, BOOL16 force_background) +{ + assert(dc == 0x4444); + g_step++; + if (palette == 0x5555) { + assert(force_background == 0 || force_background == 1); + return 0x6666; + } + assert(palette == 0x6666 && force_background == 0); + return 0x5555; +} + +UINT16 RealizePalette16(HDC16 dc) +{ + assert(dc == 0x4444); + g_step++; + return (uint16_t)g_realize_result; +} + +BOOL16 UpdateColors16(HDC16 dc) +{ + assert(dc == 0x4444); + g_step++; + return 1; +} + +INT16 ReleaseDC16(HWND16 window, HDC16 dc) +{ + assert(window == 0x2222 && dc == 0x4444); + g_step++; + return 1; +} + +BOOL16 InvalidateRect16( + HWND16 window, Win16FarPtr rectangle, BOOL16 erase) +{ + assert(window == 0x2222 && rectangle == 0 && erase == 0); + g_invalidate_calls++; + return 1; +} + +static void reset_message(HWND16 changed_window) +{ + memset(g_objects, 0, sizeof(g_objects)); + win16_write_u16(g_window, 4, 0x2222); + win16_write_u16(g_message, 4, changed_window); + win16_write_u32(g_message, 10, 0x12345678); + g_step = 0; + g_invalidate_calls = 0; + g_parent_result = 0; + g_realize_result = 0; +} + +int main(void) +{ + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, g_dgroup, sizeof(g_dgroup), true); + win16_bind_segment(0x6000, g_objects, sizeof(g_objects), true); + win16_set_dgroup_selector(0x5000); + g_window = win16_make_far_pointer(0x6000, 0); + g_message = win16_make_far_pointer(0x6000, 0x40); + win16_write_u16(win16_make_far_pointer(0x5000, 0x444e), 0, 0x5555); + + reset_message(0x2222); + assert(tdkpin_wm_palette_changed(g_window, g_message) == 1); + assert(g_step == 0); + + reset_message(0x3333); + g_parent_result = 0x2222; + assert(tdkpin_wm_palette_changed(g_window, g_message) == 1); + assert(g_step == 1); + + reset_message(0x3333); + assert(tdkpin_wm_palette_changed(g_window, g_message) == 0); + assert(g_step == 7); + assert(win16_read_u32(win16_far_add_offset(g_message, 10)) == 0); + + reset_message(0); + g_realize_result = 0; + assert(tdkpin_wm_query_new_palette(g_window, g_message) == 0); + assert(g_step == 5 && g_invalidate_calls == 0); + assert(win16_read_u32(win16_far_add_offset(g_message, 10)) == 0); + + reset_message(0); + g_realize_result = 3; + assert(tdkpin_wm_query_new_palette(g_window, g_message) == 3); + assert(g_step == 5 && g_invalidate_calls == 1); + assert(win16_read_u32(win16_far_add_offset(g_message, 10)) == 3); + + uint16_t (*changed_variants[])(Win16FarPtr, Win16FarPtr) = { + tdkpin_wm_palette_changed_variant_b, + tdkpin_wm_palette_changed_variant_c, + }; + for (unsigned index = 0; index < 2; index++) { + reset_message(0x3333); + assert(changed_variants[index](g_window, g_message) == 0); + assert(g_step == 7); + assert(win16_read_u32(win16_far_add_offset(g_message, 10)) == 0); + } + + int16_t (*query_variants[])(Win16FarPtr, Win16FarPtr) = { + tdkpin_wm_query_new_palette_variant_b, + tdkpin_wm_query_new_palette_variant_c, + }; + for (unsigned index = 0; index < 2; index++) { + reset_message(0); + g_realize_result = 2; + assert(query_variants[index](g_window, g_message) == 2); + assert(g_step == 5 && g_invalidate_calls == 1); + assert(win16_read_u32(win16_far_add_offset(g_message, 10)) == 2); + } + return 0; +} diff --git a/original/reconstructed/tests/test_panel_animation.c b/original/reconstructed/tests/test_panel_animation.c new file mode 100644 index 0000000..6476beb --- /dev/null +++ b/original/reconstructed/tests/test_panel_animation.c @@ -0,0 +1,248 @@ +#include "../tdkpin_panel_animation.h" + +#include +#include + +typedef struct { + HDC16 destination; + HGDIOBJ16 destination_object; + INT16 destination_x; + INT16 destination_y; + INT16 width; + INT16 height; + HDC16 source; + HGDIOBJ16 source_object; + INT16 source_x; + INT16 source_y; + uint32_t rop; +} RecordedBlit; + +static uint8_t g_stack[0x400]; +static uint8_t g_object[0x0c00]; +static uint8_t g_dgroup[0x5000]; +static Win16FarPtr g_receiver; +static unsigned g_create_dc_calls; +static unsigned g_select_calls; +static unsigned g_blit_calls; +static unsigned g_delete_dc_calls; +static unsigned g_play_calls; +static unsigned g_stop_calls; +static uint16_t g_played_sound; +static HGDIOBJ16 g_source_selected; +static HGDIOBJ16 g_panel_selected; +static RecordedBlit g_blits[16]; + +HDC16 GetDC16(HWND16 window) +{ + assert(window == 0x2222); + return 0x3333; +} + +HDC16 CreateCompatibleDC16(HDC16 dc) +{ + assert(dc == 0x3333 && g_create_dc_calls < 2); + return (HDC16)(0x4001 + g_create_dc_calls++); +} + +HBITMAP16 CreateCompatibleBitmap16(HDC16 dc, INT16 width, INT16 height) +{ + assert(dc == 0x3333 && width == 91 && height == 123); + return 0x5000; +} + +HGDIOBJ16 SelectObject16(HDC16 dc, HGDIOBJ16 object) +{ + g_select_calls++; + if (dc == 0x4001) { + HGDIOBJ16 old = g_source_selected; + g_source_selected = object; + return old; + } + assert(dc == 0x4002); + HGDIOBJ16 old = g_panel_selected; + g_panel_selected = object; + return old; +} + +BOOL16 BitBlt16( + HDC16 destination, + INT16 destination_x, + INT16 destination_y, + INT16 width, + INT16 height, + HDC16 source, + INT16 source_x, + INT16 source_y, + uint32_t raster_operation) +{ + assert(g_blit_calls < 16); + RecordedBlit *blit = &g_blits[g_blit_calls++]; + *blit = (RecordedBlit){ + destination, + destination == 0x4001 ? g_source_selected + : destination == 0x4002 ? g_panel_selected : 0, + destination_x, + destination_y, + width, + height, + source, + source == 0x4001 ? g_source_selected + : source == 0x4002 ? g_panel_selected : 0, + source_x, + source_y, + raster_operation}; + return 1; +} + +BOOL16 DeleteObject16(HGDIOBJ16 object) +{ + assert(object == 0x5000); + return 1; +} + +BOOL16 DeleteDC16(HDC16 dc) +{ + assert(dc == (g_delete_dc_calls == 0 ? 0x4002 : 0x4001)); + g_delete_dc_calls++; + return 1; +} + +INT16 ReleaseDC16(HWND16 window, HDC16 dc) +{ + assert(window == 0x2222 && dc == 0x3333); + return 1; +} + +void tdkpin_play_sound_if_not_tilted(uint16_t sound_number) +{ + g_played_sound = sound_number; + g_play_calls++; +} + +uint16_t tdkpin_stop_sound_if_active(void) +{ + g_stop_calls++; + return 0xabcd; +} + +static void prepare_fixture(int32_t frame) +{ + memset(g_stack, 0, sizeof(g_stack)); + memset(g_object, 0, sizeof(g_object)); + memset(g_dgroup, 0, sizeof(g_dgroup)); + memset(g_blits, 0, sizeof(g_blits)); + win16_reset_segment_bindings(); + win16_bind_segment(0x7000, g_stack, sizeof(g_stack), true); + win16_bind_segment(0x7100, g_object, sizeof(g_object), true); + win16_bind_segment(0x7200, g_dgroup, sizeof(g_dgroup), true); + win16_set_dgroup_selector(0x7200); + win16_set_stack_state(0x7000, 0); + g_receiver = win16_make_far_pointer(0x7100, 0); + win16_write_stack_u16(0x0106, win16_far_offset(g_receiver)); + win16_write_stack_u16(0x0108, win16_far_selector(g_receiver)); + win16_write_u16(g_receiver, 4, 0x2222); + win16_write_u16(win16_dgroup_pointer(0x085f), 0, 0x6000); + win16_write_u16(win16_dgroup_pointer(0x0859), 0, 0x6001); + win16_write_u16(win16_dgroup_pointer(0x085b), 0, 0x6002); + win16_write_u16(win16_dgroup_pointer(0x085d), 0, 0x6003); + win16_write_u32(win16_dgroup_pointer(0x0851), 0, (uint32_t)frame); + g_create_dc_calls = 0; + g_select_calls = 0; + g_blit_calls = 0; + g_delete_dc_calls = 0; + g_play_calls = 0; + g_stop_calls = 0; + g_played_sound = 0; + g_source_selected = 0x7001; + g_panel_selected = 0x7002; +} + +static void assert_common_edges(void) +{ + assert(g_create_dc_calls == 2 && g_delete_dc_calls == 2); + assert(g_blits[0].destination == 0x4002); + assert(g_blits[0].width == 91 && g_blits[0].height == 123); + assert(g_blits[0].source_object == 0x6000); + assert(g_blits[0].source_x == 79 && g_blits[0].source_y == 0); + RecordedBlit *last = &g_blits[g_blit_calls - 1]; + assert(last->destination == 0x3333); + assert(last->destination_x == 79 && last->destination_y == 0); + assert(last->width == 91 && last->height == 123); + assert(last->source == 0x4002 && last->source_x == 0); + assert(last->source_y == 0 && last->rop == 0x00cc0020u); +} + +static void run_count_case( + int32_t frame, + unsigned expected_blits, + uint16_t expected_sound, + unsigned expected_stops) +{ + prepare_fixture(frame); + tdkpin_draw_panel_animation(0x0100); + assert(g_blit_calls == expected_blits); + assert(g_stop_calls == expected_stops); + assert(g_play_calls == (expected_sound != 0 ? 1u : 0u)); + assert(g_played_sound == expected_sound); + assert_common_edges(); +} + +static void test_phase_boundaries(void) +{ + run_count_case(45, 4, 0, 1); + run_count_case(58, 4, 12, 0); + run_count_case(66, 7, 13, 0); + run_count_case(111, 5, 0, 0); + run_count_case(129, 3, 0, 1); + run_count_case(159, 5, 13, 0); + run_count_case(177, 7, 0, 0); + run_count_case(204, 7, 0, 0); + run_count_case(221, 7, 0, 0); + run_count_case(222, 6, 0, 1); + run_count_case(230, 6, 12, 0); + run_count_case(238, 6, 13, 0); +} + +static void test_first_frame_and_formulas(void) +{ + prepare_fixture(1); + tdkpin_draw_panel_animation(0x0100); + assert(g_blit_calls == 5 && g_played_sound == 13); + assert(g_blits[1].destination_object == 0x6002); + assert(g_blits[1].destination_x == 79 && g_blits[1].width == 91); + assert(g_blits[1].height == 90 && g_blits[1].source_x == 271); + assert(g_blits[2].destination_x == 20 && g_blits[2].height == 2); + assert(g_blits[2].source_x == 45 && g_blits[2].source_y == 177); + assert(g_blits[2].rop == 0x008800c6u); + assert(g_blits[3].source_x == 0 && g_blits[3].source_y == 177); + assert_common_edges(); + + prepare_fixture(83); + tdkpin_draw_panel_animation(0x0100); + assert(g_blits[2].destination_y == 0 && g_blits[2].height == 90); + assert(g_blits[2].source_y == 92); + assert(g_blits[4].height == 54 && g_blits[4].source_y == 124); +} + +static void test_final_frame_background_commit(void) +{ + prepare_fixture(281); + tdkpin_draw_panel_animation(0x0100); + assert(g_blit_calls == 7); + RecordedBlit *commit = &g_blits[5]; + assert(commit->destination == 0x4002); + assert(commit->destination_object == 0x6002); + assert(commit->destination_x == 79 && commit->destination_y == 0); + assert(commit->width == 91 && commit->height == 90); + assert(commit->source_object == 0x6003); + assert(commit->source_x == 79 && commit->source_y == 0); + assert_common_edges(); +} + +int main(void) +{ + test_phase_boundaries(); + test_first_frame_and_formulas(); + test_final_frame_background_commit(); + return 0; +} diff --git a/original/reconstructed/tests/test_physics.c b/original/reconstructed/tests/test_physics.c new file mode 100644 index 0000000..983f006 --- /dev/null +++ b/original/reconstructed/tests/test_physics.c @@ -0,0 +1,453 @@ +#include "../tdkpin_physics.h" + +#include "../tdkpin_borland_runtime.h" +#include "../tdkpin_collision_records.h" +#include "../tdkpin_real48.h" + +#include +#include +#include + +static uint8_t g_dgroup[0x5000]; +static uint8_t g_objects[0x1000]; +static uint8_t g_stack[0x1000]; +static Win16FarPtr g_window; +static unsigned g_finish_calls; +static unsigned g_render_calls; +static unsigned g_update_calls; +static int32_t g_last_update; +static unsigned g_restore_b_calls; +static uint16_t g_last_restore_b; +static unsigned g_event_calls; +static uint16_t g_last_event_id; +static uint16_t g_last_event_flags; +static unsigned g_sound_calls; +static uint16_t g_last_sound; +static int32_t g_score_total; +static unsigned g_load_calls; +static unsigned g_save_calls; + +uint8_t g_borland_cpu_level = 2; + +_Noreturn void borland_runtime_error(uint16_t code) +{ + (void)code; + abort(); +} + +_Noreturn void win16_integer_divide_fault(void) +{ + abort(); +} + +void tdkpin_finish_ball_or_advance_player(uint16_t caller_bp) +{ + assert(caller_bp == 0x0300); + g_finish_calls++; +} + +void tdkpin_render_ball_swept_region(uint16_t caller_bp) +{ + assert(caller_bp == 0x0300); + g_render_calls++; +} + +void tdkpin_update_dynamic_ball_record( + uint16_t caller_bp, int32_t displacement) +{ + assert(caller_bp == 0x0300); + g_update_calls++; + g_last_update = displacement; +} + +void tdkpin_restore_record_b(uint16_t caller_bp, uint16_t id) +{ + assert(caller_bp == 0x0300); + g_restore_b_calls++; + g_last_restore_b = id; +} + +void tdkpin_restore_record_or_item_a(uint16_t caller_bp, uint16_t id) +{ + (void)caller_bp; + (void)id; +} + +void tdkpin_handle_collision_events( + uint16_t caller_bp, uint16_t event_flags, uint16_t record_id) +{ + assert(caller_bp == 0x0300); + g_event_calls++; + g_last_event_flags = event_flags; + g_last_event_id = record_id; +} + +void tdkpin_play_sound_if_not_tilted(uint16_t sound_number) +{ + g_sound_calls++; + g_last_sound = sound_number; +} + +void tdkpin_add_score_from_caller_frame(uint16_t caller_bp, int32_t delta) +{ + assert(caller_bp == 0x0300); + g_score_total += delta; +} + +void tdkpin_draw_score_from_caller_frame( + uint16_t caller_bp, uint16_t value_low, uint16_t value_high) +{ + (void)caller_bp; + (void)value_low; + (void)value_high; +} + +void tdkpin_refresh_player_progress_markers(uint16_t caller_bp) +{ + (void)caller_bp; +} + +void tdkpin_apply_player_sprite_effect( + uint16_t caller_bp, int16_t argument) +{ + (void)caller_bp; + (void)argument; +} + +void tdkpin_composite_player_sprite(uint16_t sprite_index, HDC16 reference_dc) +{ + (void)sprite_index; + (void)reference_dc; +} + +void tdkpin_present_background_region( + INT16 height, INT16 width, INT16 y, INT16 x, HDC16 dc) +{ + (void)height; + (void)width; + (void)y; + (void)x; + (void)dc; +} + +HDC16 GetDC16(HWND16 window) +{ + (void)window; + return 0x3333; +} + +INT16 ReleaseDC16(HWND16 window, HDC16 dc) +{ + (void)window; + (void)dc; + return 1; +} + +void tdkpin_load_ball_slot(uint16_t caller_bp, uint16_t slot) +{ + (void)caller_bp; + (void)slot; + g_load_calls++; +} + +void tdkpin_save_ball_slot(uint16_t caller_bp, uint16_t slot) +{ + (void)caller_bp; + (void)slot; + g_save_calls++; +} + +uint16_t borland_random_below(uint16_t upper_bound) +{ + assert(upper_bound == 4); + return 0; +} + +BorlandReal48 borland_random_real48_registers(void) +{ + return (BorlandReal48){{0x80,0,0,0,0,0}}; +} + +static bool in_bounds( + int32_t x, + int32_t y, + int32_t maximum_y, + int32_t maximum_x, + int32_t minimum_y, + int32_t minimum_x) +{ + return x >= minimum_x && x <= maximum_x && + y >= minimum_y && y <= maximum_y; +} + +uint16_t tdkpin_ball_in_bounds( + uint16_t ignored_static_link, + int32_t maximum_y, + int32_t maximum_x, + int32_t minimum_y, + int32_t minimum_x) +{ + (void)ignored_static_link; + return in_bounds( + (int32_t)win16_read_u32(win16_dgroup_pointer(0x07db)), + (int32_t)win16_read_u32(win16_dgroup_pointer(0x07df)), + maximum_y, maximum_x, minimum_y, minimum_x); +} + +uint16_t tdkpin_receiver_point_in_bounds( + uint16_t caller_bp, + int32_t maximum_y, + int32_t maximum_x, + int32_t minimum_y, + int32_t minimum_x) +{ + assert(caller_bp == 0x0300); + return in_bounds( + (int32_t)win16_read_u32(win16_far_add_offset(g_window, 0x0bba)), + (int32_t)win16_read_u32(win16_far_add_offset(g_window, 0x0bbe)), + maximum_y, maximum_x, minimum_y, minimum_x); +} + +static Win16FarPtr record_pointer(uint16_t id) +{ + return win16_dgroup_pointer((uint16_t)( + 0x095b + id * sizeof(TdkpinCollisionRecord))); +} + +static void write_record( + uint16_t id, const TdkpinCollisionRecord *record) +{ + const uint8_t *bytes = (const uint8_t *)record; + for (uint16_t index = 0; index < sizeof(*record); index++) { + win16_write_u8( + win16_far_add_offset(record_pointer(id), index), bytes[index]); + } +} + +static TdkpinCollisionRecord base_record(uint8_t type) +{ + TdkpinCollisionRecord record = {0}; + record.type = type; + record.subtype = 1; + record.active = 1; + record.bounds_min_x_milli = 0; + record.bounds_min_y_milli = 0; + record.bounds_max_x_milli = 200000; + record.bounds_max_y_milli = 200000; + record.layer_mask = 1; + return record; +} + +static void prepare_fixture(void) +{ + memset(g_dgroup, 0, sizeof(g_dgroup)); + memset(g_objects, 0, sizeof(g_objects)); + memset(g_stack, 0, sizeof(g_stack)); + win16_reset_segment_bindings(); + win16_bind_segment(0x7000, g_objects, sizeof(g_objects), true); + win16_bind_segment(0x7200, g_dgroup, sizeof(g_dgroup), true); + win16_bind_segment(0x7300, g_stack, sizeof(g_stack), true); + win16_set_dgroup_selector(0x7200); + win16_set_stack_state(0x7300, 0); + g_window = win16_make_far_pointer(0x7000, 0); + win16_write_stack_u16(0x0306, win16_far_offset(g_window)); + win16_write_stack_u16(0x0308, win16_far_selector(g_window)); + win16_write_u16(g_window, 4, 0x2222); + win16_write_u8(win16_far_add_offset(g_window, 0x61), 1); + win16_write_u8(win16_far_add_offset(g_window, 0x0bdd), 1); + win16_write_u16(win16_dgroup_pointer(0x0871), 0, 1); + win16_write_u32(g_window, 0x56, 10000); + g_finish_calls = g_render_calls = g_update_calls = 0; + g_restore_b_calls = g_event_calls = g_sound_calls = 0; + g_score_total = 0; + g_load_calls = g_save_calls = 0; +} + +static void set_ball( + int32_t x, int32_t y, int32_t velocity_x, int32_t velocity_y) +{ + win16_write_u32(win16_dgroup_pointer(0x07d3), 0, (uint32_t)x); + win16_write_u32(win16_dgroup_pointer(0x07d7), 0, (uint32_t)y); + win16_write_u32(g_window, 0x0baa, (uint32_t)velocity_x); + win16_write_u32(g_window, 0x0bae, (uint32_t)velocity_y); +} + +static void test_free_integration_and_speed_clamp(void) +{ + prepare_fixture(); + set_ball(100000, 100000, 1000, 2000); + win16_write_u32(g_window, 0x5a, 100); + tdkpin_simulate_ball_and_dispatch_collision(0x0300); + assert((int32_t)win16_read_u32(win16_dgroup_pointer(0x07d3)) == 101000); + assert((int32_t)win16_read_u32(win16_dgroup_pointer(0x07d7)) == 102100); + assert(g_update_calls == 1 && g_last_update == 1); + assert(g_render_calls == 1); + assert(win16_read_u32(win16_far_add_offset(g_window, 0x4d)) == 1); + + prepare_fixture(); + set_ball(100000, 100000, 3000, 4000); + win16_write_u32(g_window, 0x56, 1000); + tdkpin_simulate_ball_and_dispatch_collision(0x0300); + assert((int32_t)win16_read_u32( + win16_far_add_offset(g_window, 0x0baa)) == 600); + assert((int32_t)win16_read_u32( + win16_far_add_offset(g_window, 0x0bae)) == 800); +} + +static void test_circle_and_segment_collisions(void) +{ + prepare_fixture(); + set_ball(100000, 100000, 1000, 0); + TdkpinCollisionRecord circle = base_record(1); + circle.point1_x_milli = 103000; + circle.point1_y_milli = 100000; + circle.radius_milli = borland_i32_to_real48(4000); + write_record(1, &circle); + tdkpin_simulate_ball_and_dispatch_collision(0x0300); + assert((int32_t)win16_read_u32( + win16_far_add_offset(g_window, 0x0baa)) == 0); + assert((int32_t)win16_read_u32(win16_dgroup_pointer(0x07d3)) == 100000); + + prepare_fixture(); + set_ball(100000, 100000, 0, 1000); + TdkpinCollisionRecord segment = base_record(2); + segment.point1_x_milli = 50000; + segment.point1_y_milli = 101000; + segment.point2_x_milli = 150000; + segment.point2_y_milli = 101000; + write_record(1, &segment); + tdkpin_simulate_ball_and_dispatch_collision(0x0300); + assert((int32_t)win16_read_u32( + win16_far_add_offset(g_window, 0x0bae)) == 0); + assert((int32_t)win16_read_u32(win16_dgroup_pointer(0x07d7)) == 100000); + + prepare_fixture(); + set_ball(100000, 100000, 1000, 0); + circle = base_record(1); + circle.point1_x_milli = 103000; + circle.point1_y_milli = 100000; + circle.radius_milli = borland_i32_to_real48(4000); + circle.response_normal = borland_i32_to_real48(1); + circle.flags = 0x0020; + circle.score_low = 100; + write_record(1, &circle); + tdkpin_simulate_ball_and_dispatch_collision(0x0300); + assert((int32_t)win16_read_u32( + win16_far_add_offset(g_window, 0x0baa)) == -1000); + assert(g_event_calls == 1 && g_last_event_flags == 0x0020); + assert(g_score_total == 100); +} + +static void test_capture_and_trigger_records(void) +{ + prepare_fixture(); + set_ball(100000, 100000, 0, 0); + TdkpinCollisionRecord capture = base_record(3); + capture.point1_x_milli = 100000; + capture.point1_y_milli = 100000; + capture.radius_milli = borland_i32_to_real48(20000); + write_record(50, &capture); + tdkpin_simulate_ball_and_dispatch_collision(0x0300); + assert(win16_read_u16(win16_far_add_offset(record_pointer(50), 0x43)) == 1); + assert(win16_read_u32(win16_far_add_offset(g_window, 0x0bca)) == 5); + assert(g_sound_calls == 1 && g_last_sound == 15); + + prepare_fixture(); + set_ball(100000, 100000, 1000, 0); + TdkpinCollisionRecord trigger = base_record(4); + trigger.point1_x_milli = 0; + trigger.point1_y_milli = 0; + trigger.point2_x_milli = 200000; + trigger.point2_y_milli = 200000; + write_record(6, &trigger); + tdkpin_simulate_ball_and_dispatch_collision(0x0300); + assert((int32_t)win16_read_u32( + win16_far_add_offset(g_window, 0x0baa)) == 900); + assert((int32_t)win16_read_u32( + win16_far_add_offset(g_window, 0x0bae)) == -8500); + assert(g_restore_b_calls == 1 && g_last_restore_b == 6); + + prepare_fixture(); + set_ball(100000, 100000, 1000, 0); + win16_write_u8(win16_dgroup_pointer(0x07d1), 1); + win16_write_u8(win16_dgroup_pointer(0x081b), 2); + trigger = base_record(4); + trigger.point1_x_milli = 101000; + trigger.point1_y_milli = 100000; + trigger.radius_milli = borland_i32_to_real48(5000); + trigger.flags = 0x0040; + trigger.score_low = 100; + write_record(10, &trigger); + tdkpin_simulate_ball_and_dispatch_collision(0x0300); + assert((win16_read_u16( + win16_far_add_offset(record_pointer(10), 0x41)) & 0x4000) != 0); + assert(g_sound_calls == 1 && g_last_sound == 4); + assert(g_event_calls == 1 && g_last_event_id == 10 && + g_last_event_flags == 0x4040); + assert(g_score_total == 200); +} + +static void test_capture_boundary_and_claw(void) +{ + prepare_fixture(); + set_ball(100000, 100000, 1000, 0); + TdkpinCollisionRecord capture = base_record(3); + capture.point1_x_milli = 103000; + capture.point1_y_milli = 102000; + capture.radius_milli = borland_i32_to_real48(3800); + capture.contact_state = 99; + capture.flags = 0x0010; + write_record(50, &capture); + tdkpin_simulate_ball_and_dispatch_collision(0x0300); + assert(g_event_calls == 1 && g_last_event_id == 50); + assert((int32_t)win16_read_u32( + win16_far_add_offset(g_window, 0x0baa)) != 1000); + + prepare_fixture(); + set_ball(100000, 100000, 0, 0); + capture = base_record(3); + capture.point1_x_milli = 100000; + capture.point1_y_milli = 100000; + capture.radius_milli = borland_i32_to_real48(20000); + capture.contact_state = 1; + write_record(89, &capture); + win16_write_u32(g_window, 0x0bca, 300); + for (uint16_t id = 12; id <= 20; id++) { + TdkpinCollisionRecord gate = base_record(4); + write_record(id, &gate); + } + tdkpin_simulate_ball_and_dispatch_collision(0x0300); + assert(win16_read_u8(win16_dgroup_pointer(0x07ca)) == 1); + assert(win16_read_u16(win16_dgroup_pointer(0x086f)) == 1); + assert(win16_read_u8(win16_dgroup_pointer(0x0873)) == 1); + assert(win16_read_u8(win16_far_add_offset(g_window, 0x0bdf)) == 1); + for (uint16_t id = 12; id <= 20; id++) { + assert(win16_read_u8( + win16_far_add_offset(record_pointer(id), 0x34)) == 0); + } +} + +static void test_out_of_bounds_and_zero_substeps_multiball(void) +{ + prepare_fixture(); + set_ball(340000, 100000, 1001, 0); + tdkpin_simulate_ball_and_dispatch_collision(0x0300); + assert(g_finish_calls == 1); + + prepare_fixture(); + win16_write_u8(win16_far_add_offset(g_window, 0x61), 2); + win16_write_u16(win16_dgroup_pointer(0x0871), 0, 0); + tdkpin_simulate_ball_and_dispatch_collision(0x0300); + assert(g_load_calls == 2 && g_save_calls == 2); + assert(g_render_calls == 2 && g_update_calls == 0); +} + +int main(void) +{ + test_free_integration_and_speed_clamp(); + test_circle_and_segment_collisions(); + test_capture_and_trigger_records(); + test_capture_boundary_and_claw(); + test_out_of_bounds_and_zero_substeps_multiball(); + return 0; +} diff --git a/original/reconstructed/tests/test_player_sprite.c b/original/reconstructed/tests/test_player_sprite.c new file mode 100644 index 0000000..58facc2 --- /dev/null +++ b/original/reconstructed/tests/test_player_sprite.c @@ -0,0 +1,112 @@ +#include "../tdkpin_gameplay_helpers.h" + +#include +#include + +static uint8_t g_dgroup[0x5000]; +static unsigned g_create_dc_calls; +static unsigned g_create_bitmap_calls; +static unsigned g_select_calls; +static unsigned g_blit_calls; +static unsigned g_delete_object_calls; +static unsigned g_delete_dc_calls; + +HDC16 CreateCompatibleDC16(HDC16 dc) +{ + assert(dc == 0x3333 && g_create_dc_calls < 3); + return (HDC16)(0x4001 + g_create_dc_calls++); +} + +HBITMAP16 CreateCompatibleBitmap16(HDC16 dc, INT16 width, INT16 height) +{ + assert(dc == 0x3333 && width == 14 && height == 14); + g_create_bitmap_calls++; + return 0x5000; +} + +HGDIOBJ16 SelectObject16(HDC16 dc, HGDIOBJ16 object) +{ + switch (g_select_calls++) { + case 0: + assert(dc == 0x4001 && object == 0x6000); + return 0x7001; + case 1: + assert(dc == 0x4002 && object == 0x6003); + return 0x7002; + case 2: + assert(dc == 0x4003 && object == 0x5000); + return 0x7003; + case 3: + assert(dc == 0x4003 && object == 0x7003); + return 0x5000; + case 4: + assert(dc == 0x4002 && object == 0x7002); + return 0x6003; + default: + assert(g_select_calls == 6); + assert(dc == 0x4001 && object == 0x7001); + return 0x6000; + } +} + +BOOL16 BitBlt16( + HDC16 destination, + INT16 destination_x, + INT16 destination_y, + INT16 width, + INT16 height, + HDC16 source, + INT16 source_x, + INT16 source_y, + uint32_t raster_operation) +{ + assert(raster_operation == 0x00cc0020u); + switch (g_blit_calls++) { + case 0: + assert(destination == 0x4003 && destination_x == 0); + assert(destination_y == 0 && width == 14 && height == 14); + assert(source == 0x4001 && source_x == 84 && source_y == 77); + break; + case 1: + assert(destination == 0x4001 && destination_x == 55); + assert(destination_y == 79 && width == 42 && height == 123); + assert(source == 0x4002 && source_x == 0 && source_y == 0); + break; + default: + assert(g_blit_calls == 3); + assert(destination == 0x4001 && destination_x == 84); + assert(destination_y == 77 && width == 14 && height == 14); + assert(source == 0x4003 && source_x == 0 && source_y == 0); + break; + } + return 1; +} + +BOOL16 DeleteObject16(HGDIOBJ16 object) +{ + assert(object == 0x5000); + g_delete_object_calls++; + return 1; +} + +BOOL16 DeleteDC16(HDC16 dc) +{ + assert(dc == (HDC16)(0x4003 - g_delete_dc_calls)); + g_delete_dc_calls++; + return 1; +} + +int main(void) +{ + memset(g_dgroup, 0, sizeof(g_dgroup)); + win16_reset_segment_bindings(); + win16_bind_segment(0x7200, g_dgroup, sizeof(g_dgroup), true); + win16_set_dgroup_selector(0x7200); + win16_write_u16(win16_dgroup_pointer(0x085b), 0, 0x6000); + win16_write_u16(win16_dgroup_pointer(0x4311), 0, 0x6003); + tdkpin_composite_player_sprite(3, 0x3333); + assert(g_create_dc_calls == 3 && g_create_bitmap_calls == 1); + assert(g_select_calls == 6 && g_blit_calls == 3); + assert(g_delete_object_calls == 1 && g_delete_dc_calls == 3); + return 0; +} diff --git a/original/reconstructed/tests/test_player_state.c b/original/reconstructed/tests/test_player_state.c new file mode 100644 index 0000000..3b12675 --- /dev/null +++ b/original/reconstructed/tests/test_player_state.c @@ -0,0 +1,305 @@ +#include "../tdkpin_player_state.h" + +#include +#include + +uint8_t g_player_count; +uint8_t g_current_player; + +static uint8_t g_stack[0x400]; +static uint8_t g_object[0x0c00]; +static uint8_t g_dgroup[0x5000]; +static Win16FarPtr g_receiver; +static unsigned g_collision_calls; +static unsigned g_restore_record_calls; +static unsigned g_zero_score_calls; +static unsigned g_add_score_calls; +static unsigned g_marker_calls; +static unsigned g_item_calls; +static unsigned g_restore_a_calls; +static unsigned g_restore_b_calls; +static unsigned g_present_calls; +static unsigned g_sprite_calls; +static unsigned g_get_dc_calls; +static unsigned g_release_dc_calls; +static uint16_t g_last_sprite; +static int32_t g_last_shown_score; +static int32_t g_added_delta[4]; +static uint8_t g_add_player[4]; + +void tdkpin_refresh_collision_record(uint16_t caller_bp, uint16_t id) +{ + assert(caller_bp == 0x0100); + assert(id == g_collision_calls + 1); + g_collision_calls++; +} + +void tdkpin_restore_record_b(uint16_t caller_bp, uint16_t id) +{ + assert(caller_bp == 0x0100); + assert(id == 1001 + g_restore_record_calls); + g_restore_record_calls++; +} + +void tdkpin_draw_score_from_caller_frame( + uint16_t caller_bp, uint16_t low, uint16_t high) +{ + assert(caller_bp == 0x0100); + int32_t value = (int32_t)((uint32_t)low | ((uint32_t)high << 16)); + if (value == 0 && g_zero_score_calls == 0) { + g_zero_score_calls++; + } else { + g_last_shown_score = value; + } +} + +void tdkpin_add_score_from_caller_frame(uint16_t caller_bp, int32_t delta) +{ + assert(caller_bp == 0x0100 && g_add_score_calls < 4); + g_added_delta[g_add_score_calls] = delta; + g_add_player[g_add_score_calls] = g_current_player; + g_add_score_calls++; +} + +void tdkpin_refresh_player_progress_markers(uint16_t caller_bp) +{ + assert(caller_bp == 0x0100); + assert(g_current_player == g_marker_calls + 1); + g_marker_calls++; +} + +void tdkpin_refresh_player_item(uint16_t caller_bp, uint16_t item) +{ + assert(caller_bp == 0x0100 && g_current_player == 1); + assert(item == g_item_calls + 1); + g_item_calls++; +} + +HDC16 GetDC16(HWND16 window) +{ + assert(window == 0x2222); + g_get_dc_calls++; + return 0x3333; +} + +INT16 ReleaseDC16(HWND16 window, HDC16 dc) +{ + assert(window == 0x2222 && dc == 0x3333); + g_release_dc_calls++; + return 1; +} + +static void check_geometry( + INT16 height, INT16 width, INT16 y, INT16 x, HDC16 dc) +{ + assert(dc == 0x3333); + bool panel = height == 31 && width == 139 && x == 472; + bool marker = height == 11 && width == 11 && x == 372; + bool score_area = height == 123 && width == 42 && y == 79 && x == 55; + assert(panel || marker || score_area); + if (panel || marker) { + uint16_t base = panel ? 276 : 280; + assert(y >= (INT16)base && ((uint16_t)(y - base) % 44u) == 0); + } +} + +void tdkpin_restore_background_region_a( + INT16 height, INT16 width, INT16 y, INT16 x, HDC16 dc) +{ + check_geometry(height, width, y, x, dc); + assert(height != 123); + g_restore_a_calls++; +} + +void tdkpin_restore_background_region_b( + INT16 height, INT16 width, INT16 y, INT16 x, HDC16 dc) +{ + check_geometry(height, width, y, x, dc); + assert(height == 11); + g_restore_b_calls++; +} + +void tdkpin_present_background_region( + INT16 height, INT16 width, INT16 y, INT16 x, HDC16 dc) +{ + check_geometry(height, width, y, x, dc); + g_present_calls++; +} + +void tdkpin_composite_player_sprite(uint16_t sprite_index, HDC16 dc) +{ + assert(dc == 0x3333); + g_last_sprite = sprite_index; + g_sprite_calls++; +} + +int32_t borland_multiply_i32(int32_t left, int32_t right) +{ + return (int32_t)((uint32_t)left * (uint32_t)right); +} + +static void prepare_fixture(void) +{ + memset(g_stack, 0, sizeof(g_stack)); + memset(g_object, 0xa5, sizeof(g_object)); + memset(g_dgroup, 0xcc, sizeof(g_dgroup)); + win16_reset_segment_bindings(); + win16_bind_segment(0x7000, g_stack, sizeof(g_stack), true); + win16_bind_segment(0x7100, g_object, sizeof(g_object), true); + win16_bind_segment(0x7200, g_dgroup, sizeof(g_dgroup), true); + win16_set_dgroup_selector(0x7200); + win16_set_stack_state(0x7000, 0); + g_receiver = win16_make_far_pointer(0x7100, 0); + win16_write_stack_u16(0x0106, win16_far_offset(g_receiver)); + win16_write_stack_u16(0x0108, win16_far_selector(g_receiver)); + win16_write_u16(g_receiver, 4, 0x2222); + g_collision_calls = 0; + g_restore_record_calls = 0; + g_zero_score_calls = 0; + g_add_score_calls = 0; + g_marker_calls = 0; + g_item_calls = 0; + g_restore_a_calls = 0; + g_restore_b_calls = 0; + g_present_calls = 0; + g_sprite_calls = 0; + g_get_dc_calls = 0; + g_release_dc_calls = 0; + g_last_sprite = 0; + g_last_shown_score = 0; + memset(g_added_delta, 0, sizeof(g_added_delta)); + memset(g_add_player, 0, sizeof(g_add_player)); +} + +static void test_initialize_player_state(void) +{ + prepare_fixture(); + g_player_count = 2; + g_current_player = 4; + for (uint16_t id = 1; id <= 175; id++) { + win16_write_u16( + win16_dgroup_pointer((uint16_t)( + 0x095b + id * 0x53u + 0x43u)), + 0, + (uint16_t)(0x1000 + id)); + } + tdkpin_initialize_player_state(0x0100); + assert(g_collision_calls == 175 && g_restore_record_calls == 5); + assert(g_zero_score_calls == 1); + for (uint16_t player = 1; player <= 4; player++) { + for (uint16_t id = 1; id <= 175; id++) { + assert(win16_read_u16(win16_far_add_offset( + g_receiver, + (uint16_t)(0x036c + player * 0x015eu + id * 2u))) == + (uint16_t)(0x1000 + id)); + } + } + assert(g_add_score_calls == 2 && g_marker_calls == 2); + assert(g_add_player[0] == 1 && g_add_player[1] == 2); + assert(g_added_delta[0] == 0 && g_added_delta[1] == 0); + for (uint16_t player = 1; player <= 2; player++) { + assert(win16_read_u32(win16_dgroup_pointer( + (uint16_t)(0x097e + player * 4u))) == 0); + assert(win16_read_u32(win16_dgroup_pointer( + (uint16_t)(0x098e + player * 4u))) == 0); + assert(win16_read_u8(win16_dgroup_pointer( + (uint16_t)(0x09a1 + player))) == 1); + assert(win16_read_u16(win16_dgroup_pointer( + (uint16_t)(0x09a4 + player * 2u))) == 0); + assert(win16_read_u8(win16_dgroup_pointer( + (uint16_t)(0x0816 + player))) == 1); + assert(win16_read_u16(win16_dgroup_pointer( + (uint16_t)(0x081f + player * 2u))) == + (player == 1 ? 2 : 3)); + assert(win16_read_u32(win16_dgroup_pointer( + (uint16_t)(0x0835 + player * 4u))) == 1); + assert(win16_read_u8(win16_dgroup_pointer( + (uint16_t)(0x081a + player))) == 1); + for (uint16_t item = 1; item <= 20; item++) { + assert(win16_read_u8(win16_far_add_offset( + g_receiver, + (uint16_t)(0x0467 + player * 0x14u + item))) == 0); + } + } + assert(g_current_player == 1 && g_item_calls == 20); + assert(win16_read_u8(win16_dgroup_pointer(0x07d2)) == 0); + assert(win16_read_u8(win16_dgroup_pointer(0x0874)) == 0); +} + +static void test_redraw_all_players(void) +{ + prepare_fixture(); + g_player_count = 3; + g_current_player = 2; + win16_write_u32(win16_dgroup_pointer(0x0996), 0, 10); + win16_write_u8(win16_dgroup_pointer(0x09a3), 3); + win16_write_u16(win16_dgroup_pointer(0x09a8), 0, 5); + tdkpin_redraw_all_players(0x0100); + assert(g_add_score_calls == 3); + assert(g_add_player[0] == 1 && g_added_delta[0] == -1); + assert(g_add_player[1] == 2 && g_added_delta[1] == 0); + assert(g_add_player[2] == 3 && g_added_delta[2] == -1); + assert(g_last_shown_score == 30); + assert(g_sprite_calls == 1 && g_last_sprite == 5); + assert(g_restore_a_calls == 4 && g_restore_b_calls == 2); + assert(g_present_calls == 7); + assert(g_current_player == 2); + assert(g_get_dc_calls == 1 && g_release_dc_calls == 1); +} + +static void set_effect(uint16_t effect) +{ + win16_write_u16( + win16_dgroup_pointer((uint16_t)(0x09a4 + g_current_player * 2u)), + 0, + effect); +} + +static void test_player_sprite_effects(void) +{ + static const uint32_t additions[5] = { + 10000u, 20000u, 50000u, 100000u, 200000u}; + for (uint16_t effect = 1; effect <= 5; effect++) { + prepare_fixture(); + g_current_player = 2; + set_effect(effect); + win16_write_u32(win16_dgroup_pointer(0x0996), 0, 0xfffffff0u); + win16_write_u8(win16_dgroup_pointer(0x09a3), 3); + tdkpin_apply_player_sprite_effect(0x0100, 0); + uint32_t expected = 0xfffffff0u + additions[effect - 1u]; + assert(win16_read_u32(win16_dgroup_pointer(0x0996)) == expected); + assert((uint32_t)g_last_shown_score == expected * 3u); + assert(g_add_score_calls == 0); + } + + prepare_fixture(); + g_current_player = 2; + set_effect(6); + win16_write_u32(win16_dgroup_pointer(0x0996), 0, 12345); + win16_write_u8(win16_dgroup_pointer(0x09a3), 4); + tdkpin_apply_player_sprite_effect(0x0100, 0); + assert(g_add_score_calls == 1 && g_added_delta[0] == 49380); + assert(win16_read_u32(win16_dgroup_pointer(0x0996)) == 0); + assert(g_last_shown_score == 0); + + prepare_fixture(); + g_current_player = 2; + set_effect(7); + win16_write_u16(win16_dgroup_pointer(0x399a), 0, 55); + win16_write_u8(win16_dgroup_pointer(0x0874), 0); + win16_write_u8(win16_far_add_offset(g_receiver, 0x0be0), 0); + tdkpin_apply_player_sprite_effect(0x0100, 55); + assert(win16_read_u8(win16_dgroup_pointer(0x0874)) == 0); + assert(win16_read_u8(win16_far_add_offset(g_receiver, 0x0be0)) == 0); + tdkpin_apply_player_sprite_effect(0x0100, -1); + assert(win16_read_u8(win16_dgroup_pointer(0x0874)) == 1); + assert(win16_read_u8(win16_far_add_offset(g_receiver, 0x0be0)) == 1); +} + +int main(void) +{ + test_initialize_player_state(); + test_redraw_all_players(); + test_player_sprite_effects(); + return 0; +} diff --git a/original/reconstructed/tests/test_program_entry.c b/original/reconstructed/tests/test_program_entry.c new file mode 100644 index 0000000..b19fbfa --- /dev/null +++ b/original/reconstructed/tests/test_program_entry.c @@ -0,0 +1,217 @@ +#include "../tdkpin_program_entry.h" + +#include "../tdkpin_application.h" + +#include +#include + +uint32_t g_tdkpin_windows_version; +Win16FarPtr g_win16_message_box; + +static jmp_buf g_exit_jump; +static uint16_t g_exit_status; +static uint32_t g_version_result; +static unsigned g_order[16]; +static unsigned g_order_count; +static unsigned g_message_calls; +static unsigned g_construct_calls; +static unsigned g_run_calls; +static unsigned g_destruct_calls; + +enum CallOrder { + CALL_INIT_TASK = 1, + CALL_BORLAND_STARTUP, + CALL_STACK, + CALL_TPWINCRT, + CALL_MULTIMEDIA, + CALL_UNIT_91, + CALL_UNIT_86, + CALL_UNIT_72, + CALL_GET_VERSION, + CALL_MESSAGE_BOX, + CALL_CONSTRUCT, + CALL_RUN, + CALL_DESTRUCT, + CALL_EXIT, +}; + +static void record_call(unsigned call) +{ + assert(g_order_count < sizeof(g_order) / sizeof(*g_order)); + g_order[g_order_count++] = call; +} + +BorlandWin16StartupRegisters InitTask16(void) +{ + record_call(CALL_INIT_TASK); + return (BorlandWin16StartupRegisters){ + .loader_ax = 1, + .command_line = win16_make_far_pointer(0x4444, 0x0100), + .show_command = 7, + .previous_instance = 0, + .instance = 0x2222, + }; +} + +void borland_initialize_win16_runtime( + const BorlandWin16StartupRegisters *registers) +{ + assert(registers->loader_ax == 1 && registers->instance == 0x2222); + assert(registers->command_line == + win16_make_far_pointer(0x4444, 0x0100)); + record_call(CALL_BORLAND_STARTUP); +} + +void tdkpin_initialize_stack_guard(void) +{ + record_call(CALL_STACK); +} + +void tpwincrt_initialize_runtime_unit(void) +{ + record_call(CALL_TPWINCRT); +} + +void multimedia_initialize_runtime_unit(void) +{ + record_call(CALL_MULTIMEDIA); +} + +void tdkpin_initialize_unit_ordinal_91(void) +{ + record_call(CALL_UNIT_91); +} + +void tdkpin_initialize_unit_ordinal_86(void) +{ + record_call(CALL_UNIT_86); +} + +void tdkpin_initialize_unit_ordinal_72(void) +{ + record_call(CALL_UNIT_72); +} + +uint32_t GetVersion16(void) +{ + record_call(CALL_GET_VERSION); + return g_version_result; +} + +INT16 win16_call_message_box_far( + Win16FarPtr procedure, + HWND16 owner, + Win16FarPtr text, + Win16FarPtr caption, + UINT16 type) +{ + assert(procedure == g_win16_message_box); + assert(owner == 0); + assert(text == win16_dgroup_pointer(0x0396)); + assert(caption == win16_dgroup_pointer(0x03c8)); + assert(type == 0x10); + g_message_calls++; + record_call(CALL_MESSAGE_BOX); + return 1; +} + +Win16FarPtr object_windows_application_construct( + Win16FarPtr object, uint16_t vmt, Win16FarPtr name) +{ + assert(object == win16_dgroup_pointer(0x0748)); + assert(vmt == 0x0024); + assert(name == win16_dgroup_pointer(0x03e1)); + win16_write_u16(object, 0, vmt); + g_construct_calls++; + record_call(CALL_CONSTRUCT); + return object; +} + +void win16_call_object_method( + Win16FarPtr procedure, Win16FarPtr object) +{ + assert(procedure == win16_make_far_pointer(0x6000, 0x1111)); + assert(object == win16_dgroup_pointer(0x0748)); + g_run_calls++; + record_call(CALL_RUN); +} + +void win16_call_object_destructor( + Win16FarPtr procedure, Win16FarPtr object, uint16_t dispose_mode) +{ + assert(procedure == win16_make_far_pointer(0x6000, 0x2222)); + assert(object == win16_dgroup_pointer(0x0748)); + assert(dispose_mode == 0); + g_destruct_calls++; + record_call(CALL_DESTRUCT); +} + +_Noreturn void borland_runtime_exit(uint16_t status) +{ + g_exit_status = status; + record_call(CALL_EXIT); + longjmp(g_exit_jump, 1); +} + +static void write_far( + Win16FarPtr base, uint16_t offset, Win16FarPtr value) +{ + win16_write_u16(base, offset, win16_far_offset(value)); + win16_write_u16( + base, (uint16_t)(offset + 2), win16_far_selector(value)); +} + +static void run_case(uint32_t version, bool supported) +{ + g_version_result = version; + g_order_count = 0; + g_message_calls = 0; + g_construct_calls = 0; + g_run_calls = 0; + g_destruct_calls = 0; + if (setjmp(g_exit_jump) == 0) { + tdkpin_ne_program_entry(); + assert(false); + } + assert(g_exit_status == 0); + assert(g_tdkpin_windows_version == version); + for (unsigned index = 0; index < 9; index++) { + assert(g_order[index] == index + 1); + } + if (supported) { + assert(g_message_calls == 0); + assert(g_construct_calls == 1 && g_run_calls == 1 && + g_destruct_calls == 1); + assert(g_order_count == 13); + assert(g_order[9] == CALL_CONSTRUCT); + assert(g_order[10] == CALL_RUN); + assert(g_order[11] == CALL_DESTRUCT); + assert(g_order[12] == CALL_EXIT); + } else { + assert(g_message_calls == 1); + assert(g_construct_calls == 0 && g_run_calls == 0 && + g_destruct_calls == 0); + assert(g_order_count == 11); + assert(g_order[9] == CALL_MESSAGE_BOX); + assert(g_order[10] == CALL_EXIT); + } +} + +int main(void) +{ + static uint8_t dgroup[0x800]; + win16_reset_segment_bindings(); + win16_bind_segment(0x7000, dgroup, sizeof(dgroup), true); + win16_set_dgroup_selector(0x7000); + g_win16_message_box = win16_make_far_pointer(0x5000, 0x0100); + + Win16FarPtr vmt = win16_dgroup_pointer(0x0024); + write_far(vmt, 0x1c, win16_make_far_pointer(0x6000, 0x1111)); + write_far(vmt, 0x08, win16_make_far_pointer(0x6000, 0x2222)); + + run_case(0xabcd6302u, false); /* major 2 */ + run_case(0xabcd0903u, false); /* Windows 3.9 */ + run_case(0xabcd0a03u, true); /* Windows 3.10 */ + run_case(0xabcd0004u, true); /* Windows 4.x */ + return 0; +} diff --git a/original/reconstructed/tests/test_random.c b/original/reconstructed/tests/test_random.c new file mode 100644 index 0000000..bd5bc1b --- /dev/null +++ b/original/reconstructed/tests/test_random.c @@ -0,0 +1,49 @@ +#include "../tdkpin_random.h" + +#include + +uint32_t g_borland_random_seed; + +static uint32_t expected_next(uint32_t seed) +{ + return seed * 0x08088405u + 1u; +} + +int main(void) +{ + g_borland_random_seed = 0x12345678; + uint32_t first = expected_next(g_borland_random_seed); + assert(borland_next_random() == first); + + uint32_t second = expected_next(first); + uint16_t expected_below = (uint16_t)(((uint64_t)second * 3800) >> 32); + assert(borland_random_below(3800) == expected_below); + + uint32_t third = expected_next(second); + int8_t expected_exponent = 0; + if (third != 0) { + expected_exponent = -128; + while ((third & 0x80000000u) == 0) { + third <<= 1; + expected_exponent--; + } + } + assert(borland_random_exponent() == expected_exponent); + + g_borland_random_seed = 7; + (void)borland_random_below(0); + assert(g_borland_random_seed == expected_next(7)); + + g_borland_random_seed = 0xfedcba98; + uint32_t unit_seed = expected_next(g_borland_random_seed); + assert(borland_random_unit_interval() == + (double)unit_seed / 4294967296.0); + assert(borland_random_unit_interval() >= 0.0 && + borland_random_unit_interval() < 1.0); + + win16_reset_segment_bindings(); + win16_set_dos_time_words(0x33441122); + borland_seed_random_from_dos_time(); + assert(g_borland_random_seed == 0x33441122); + return 0; +} diff --git a/original/reconstructed/tests/test_real48.c b/original/reconstructed/tests/test_real48.c new file mode 100644 index 0000000..4bda1d3 --- /dev/null +++ b/original/reconstructed/tests/test_real48.c @@ -0,0 +1,387 @@ +#include "../tdkpin_real48.h" + +#include +#include +#include +#include +#include +#include + +static jmp_buf g_runtime_error_jump; +static uint16_t g_runtime_error_code; + +_Noreturn void borland_runtime_error(uint16_t code) +{ + g_runtime_error_code = code; + longjmp(g_runtime_error_jump, 1); +} + +static BorlandReal48 real48( + uint8_t exponent, + uint8_t byte_1, + uint8_t byte_2, + uint8_t byte_3, + uint8_t byte_4, + uint8_t byte_5) +{ + return (BorlandReal48){{ + exponent, byte_1, byte_2, byte_3, byte_4, byte_5}}; +} + +static void assert_encoding( + BorlandReal48 actual, BorlandReal48 expected) +{ + assert(memcmp(actual.bytes, expected.bytes, sizeof(actual.bytes)) == 0); +} + +static void test_integer_encoding(void) +{ + assert_encoding( + borland_i32_to_real48_registers(0), + real48(0, 0, 0, 0, 0, 0)); + assert_encoding( + borland_i32_to_real48_registers(1), + real48(0x81, 0, 0, 0, 0, 0)); + assert_encoding( + borland_i32_to_real48_registers(-1), + real48(0x81, 0, 0, 0, 0, 0x80)); + assert_encoding( + borland_i32_to_real48_registers(2), + real48(0x82, 0, 0, 0, 0, 0)); + assert_encoding( + borland_i32_to_real48_registers(INT32_MAX), + real48(0x9f, 0x00, 0xfe, 0xff, 0xff, 0x7f)); + assert_encoding( + borland_i32_to_real48_registers(INT32_MIN), + real48(0xa0, 0, 0, 0, 0, 0x80)); + assert_encoding( + borland_i32_to_real48_registers(123456789), + real48(0x9b, 0x00, 0xa0, 0xa2, 0x79, 0x6b)); + assert_encoding( + borland_i32_to_real48_registers(-123456789), + real48(0x9b, 0x00, 0xa0, 0xa2, 0x79, 0xeb)); + + static const int32_t values[] = { + INT32_MIN, -123456789, -65536, -32768, -1, + 0, 1, 32767, 65535, 123456789, INT32_MAX, + }; + for (size_t index = 0; index < sizeof(values) / sizeof(values[0]); index++) { + BorlandReal48 encoded = borland_i32_to_real48(values[index]); + BorlandReal48IntegerResult decoded = + borland_real48_to_i32_registers(encoded, false); + assert(!decoded.overflow && decoded.value == values[index]); + } +} + +static void test_round_and_truncate(void) +{ + BorlandReal48 positive_half = real48(0x80, 0, 0, 0, 0, 0); + BorlandReal48 negative_half = real48(0x80, 0, 0, 0, 0, 0x80); + BorlandReal48 below_half = + real48(0x7f, 0xff, 0xff, 0xff, 0xff, 0x7f); + BorlandReal48 positive_one_and_half = + real48(0x81, 0, 0, 0, 0, 0x40); + BorlandReal48 below_one_and_half = + real48(0x81, 0xff, 0xff, 0xff, 0xff, 0x3f); + BorlandReal48 positive_one_and_three_quarters = + real48(0x81, 0, 0, 0, 0, 0x60); + BorlandReal48 negative_one_and_three_quarters = + real48(0x81, 0, 0, 0, 0, 0xe0); + + BorlandReal48IntegerResult converted = + borland_real48_to_i32_registers(positive_half, false); + assert(!converted.overflow && converted.value == 0); + converted = borland_real48_to_i32_registers(positive_half, true); + assert(!converted.overflow && converted.value == 1); + converted = borland_real48_to_i32_registers(negative_half, true); + assert(!converted.overflow && converted.value == -1); + converted = borland_real48_to_i32_registers(below_half, true); + assert(!converted.overflow && converted.value == 0); + converted = + borland_real48_to_i32_registers(positive_one_and_half, true); + assert(!converted.overflow && converted.value == 2); + converted = borland_real48_to_i32_registers(below_one_and_half, true); + assert(!converted.overflow && converted.value == 1); + converted = borland_real48_to_i32_registers( + positive_one_and_three_quarters, false); + assert(!converted.overflow && converted.value == 1); + converted = borland_real48_to_i32_registers( + negative_one_and_three_quarters, false); + assert(!converted.overflow && converted.value == -1); + assert(borland_real48_truncate_to_i32( + positive_one_and_three_quarters) == 1); + assert(borland_real48_truncate_to_i32( + negative_one_and_three_quarters) == -1); + assert(borland_real48_round_to_i32( + positive_one_and_three_quarters) == 2); +} + +static void test_integer_overflow(void) +{ + BorlandReal48 positive_two_to_31 = + real48(0xa0, 0, 0, 0, 0, 0); + BorlandReal48 negative_two_to_31 = + real48(0xa0, 0, 0, 0, 0, 0x80); + BorlandReal48 below_negative_two_to_31 = + real48(0xa0, 0, 1, 0, 0, 0x80); + BorlandReal48 huge = real48(0xff, 0, 0, 0, 0, 0); + + BorlandReal48IntegerResult converted = + borland_real48_to_i32_registers(positive_two_to_31, false); + assert(converted.overflow && converted.value == INT32_MIN); + converted = + borland_real48_to_i32_registers(negative_two_to_31, false); + assert(!converted.overflow && converted.value == INT32_MIN); + converted = borland_real48_to_i32_registers( + below_negative_two_to_31, false); + assert(converted.overflow && converted.value == INT32_MAX); + converted = borland_real48_to_i32_registers(huge, true); + assert(converted.overflow); + + g_runtime_error_code = 0; + if (setjmp(g_runtime_error_jump) == 0) { + (void)borland_real48_round_to_i32(positive_two_to_31); + assert(false); + } + assert(g_runtime_error_code == 207); + if (setjmp(g_runtime_error_jump) == 0) { + (void)borland_real48_truncate_to_i32(positive_two_to_31); + assert(false); + } + assert(g_runtime_error_code == 207); +} + +static void test_comparison(void) +{ + BorlandReal48 zero = real48(0, 0, 0, 0, 0, 0); + BorlandReal48 noncanonical_zero = real48(0, 1, 2, 3, 4, 5); + BorlandReal48 one = real48(0x81, 0, 0, 0, 0, 0); + BorlandReal48 one_and_half = real48(0x81, 0, 0, 0, 0, 0x40); + BorlandReal48 two = real48(0x82, 0, 0, 0, 0, 0); + BorlandReal48 minus_one = real48(0x81, 0, 0, 0, 0, 0x80); + BorlandReal48 minus_two = real48(0x82, 0, 0, 0, 0, 0x80); + + assert(borland_real48_compare_magnitude_registers( + zero, noncanonical_zero) == 0); + assert(borland_real48_compare_magnitude_registers(one, one) == 0); + assert(borland_real48_compare_magnitude_registers(one, one_and_half) < 0); + assert(borland_real48_compare_magnitude_registers(two, one_and_half) > 0); + assert(borland_real48_compare(zero, one) < 0); + assert(borland_real48_compare(one_and_half, one) > 0); + assert(borland_real48_compare(minus_one, one) < 0); + assert(borland_real48_compare(minus_two, minus_one) < 0); + assert(borland_real48_compare(minus_one, minus_two) > 0); +} + +static void test_arithmetic(void) +{ + BorlandReal48 zero = real48(0, 0, 0, 0, 0, 0); + BorlandReal48 half = real48(0x80, 0, 0, 0, 0, 0); + BorlandReal48 one = real48(0x81, 0, 0, 0, 0, 0); + BorlandReal48 minus_one = real48(0x81, 0, 0, 0, 0, 0x80); + BorlandReal48 one_and_half = real48(0x81, 0, 0, 0, 0, 0x40); + BorlandReal48 one_and_three_quarters = + real48(0x81, 0, 0, 0, 0, 0x60); + BorlandReal48 three_quarters = real48(0x80, 0, 0, 0, 0, 0x40); + BorlandReal48 minus_half = real48(0x80, 0, 0, 0, 0, 0x80); + BorlandReal48 two = real48(0x82, 0, 0, 0, 0, 0); + BorlandReal48 two_and_quarter = real48(0x82, 0, 0, 0, 0, 0x10); + BorlandReal48 three = real48(0x82, 0, 0, 0, 0, 0x40); + BorlandReal48 smallest = real48(1, 0, 0, 0, 0, 0); + BorlandReal48 largest = + real48(0xff, 0xff, 0xff, 0xff, 0xff, 0x7f); + + assert_encoding(borland_real48_add(one, one), two); + assert_encoding(borland_real48_add(one, minus_one), zero); + assert_encoding(borland_real48_add(one_and_half, half), two); + assert_encoding(borland_real48_subtract(one_and_half, half), one); + assert_encoding( + borland_real48_multiply(one_and_half, half), three_quarters); + assert_encoding(borland_real48_multiply(one_and_half, two), three); + assert_encoding(borland_real48_square(one_and_half), two_and_quarter); + assert_encoding(borland_real48_divide(one_and_half, half), three); + assert_encoding( + borland_real48_add_preserving_right(one_and_half, half).value, two); + assert_encoding( + borland_real48_subtract_preserving_right(one_and_half, half).value, + one); + assert_encoding( + borland_real48_multiply_preserving_right(one_and_half, half).value, + three_quarters); + assert_encoding( + borland_real48_divide_preserving_right(one_and_half, half).value, + three); + assert_encoding(borland_real48_multiply(smallest, half), zero); + assert_encoding(borland_real48_add(smallest, half), half); + assert_encoding(borland_real48_subtract(smallest, half), minus_half); + assert_encoding( + borland_real48_divide(smallest, half), + real48(2, 0, 0, 0, 0, 0)); + assert_encoding(borland_real48_integer_part(half), zero); + assert_encoding(borland_real48_fractional_part(half), half); + assert_encoding(borland_real48_integer_part(one_and_three_quarters), one); + assert_encoding( + borland_real48_fractional_part(one_and_three_quarters), + three_quarters); + assert_encoding(borland_real48_sqrt(zero), zero); + assert_encoding(borland_real48_sqrt(one), one); + assert_encoding(borland_real48_sqrt(two), + real48(0x81, 0xfa, 0x33, 0xf3, 0x04, 0x35)); + assert_encoding( + borland_real48_sqrt(real48(0x83, 0, 0, 0, 0, 0)), two); + assert_encoding( + borland_real48_sqrt(one_and_half), + real48(0x81, 0x49, 0xa0, 0x70, 0xc4, 0x1c)); + assert_encoding( + borland_real48_arctan_series(zero), zero); + assert_encoding( + borland_real48_arctan_series( + real48(0x7f, 0, 0, 0, 0, 0)), + real48(0x7e, 0xb6, 0xb6, 0xaf, 0xdb, 0x7a)); + assert_encoding( + borland_real48_arctan_series(half), + real48(0x7f, 0x0b, 0x0c, 0x35, 0x62, 0x6d)); + assert_encoding( + borland_real48_arctan_series( + real48(0x7f, 0xe7, 0xcf, 0xcc, 0x13, 0x54)), + real48(0x7f, 0x49, 0xe2, 0xc2, 0x0f, 0x49)); + assert_encoding(borland_real48_arctan(zero), zero); + assert_encoding( + borland_real48_arctan(real48(0x7e, 0, 0, 0, 0, 0)), + real48(0x7d, 0x60, 0xd5, 0xd4, 0xad, 0x7e)); + assert_encoding( + borland_real48_arctan(half), + real48(0x7f, 0x0a, 0x2b, 0x38, 0x63, 0x6d)); + assert_encoding( + borland_real48_arctan(one), + real48(0x80, 0x21, 0xa2, 0xda, 0x0f, 0x49)); + assert_encoding( + borland_real48_arctan(two), + real48(0x81, 0x5f, 0x97, 0x0c, 0xb7, 0x0d)); + assert_encoding( + borland_real48_arctan(minus_one), + real48(0x80, 0x21, 0xa2, 0xda, 0x0f, 0xc9)); + assert_encoding( + borland_real48_ln(half), + real48(0x80, 0xd0, 0xf7, 0x17, 0x72, 0xb1)); + assert_encoding(borland_real48_ln(one), zero); + assert_encoding( + borland_real48_ln(two), + real48(0x80, 0xd5, 0xf7, 0x17, 0x72, 0x31)); + assert_encoding( + borland_real48_ln(one_and_half), + real48(0x7f, 0xff, 0x65, 0x1f, 0x99, 0x4f)); + assert_encoding( + borland_real48_ln(real48(0x84, 0, 0, 0, 0, 0x20)), + real48(0x82, 0xac, 0xdd, 0x8d, 0x5d, 0x13)); + assert_encoding( + borland_real48_exp(real48(0x82, 0, 0, 0, 0, 0x80)), + real48(0x7e, 0xfc, 0x1d, 0x55, 0x95, 0x0a)); + assert_encoding( + borland_real48_exp(minus_one), + real48(0x7f, 0x67, 0xb1, 0xb1, 0x5a, 0x3c)); + assert_encoding( + borland_real48_exp(real48(0x80, 0, 0, 0, 0, 0x80)), + real48(0x80, 0x7b, 0xe3, 0x97, 0x45, 0x1b)); + assert_encoding(borland_real48_exp(zero), one); + assert_encoding( + borland_real48_exp(half), + real48(0x81, 0xf2, 0x70, 0x4c, 0x09, 0x53)); + assert_encoding( + borland_real48_exp(one), + real48(0x82, 0xa3, 0x58, 0x54, 0xf8, 0x2d)); + assert_encoding( + borland_real48_exp(two), + real48(0x83, 0xa7, 0xc6, 0x25, 0x73, 0x6c)); + assert_encoding( + borland_real48_exp(real48(0x84, 0, 0, 0, 0, 0x20)), + real48(0x8f, 0xa8, 0x7c, 0xee, 0x14, 0x2c)); + BorlandReal48 pi_over_6 = real48(0x80, 0x6a, 0xc1, 0x91, 0x0a, 0x06); + BorlandReal48 pi_over_2 = real48(0x81, 0x21, 0xa2, 0xda, 0x0f, 0x49); + BorlandReal48 pi = real48(0x82, 0x21, 0xa2, 0xda, 0x0f, 0x49); + BorlandReal48 two_pi = real48(0x83, 0x21, 0xa2, 0xda, 0x0f, 0x49); + assert_encoding(borland_real48_sin(zero), zero); + assert_encoding( + borland_real48_sin(pi_over_6), + real48(0x7f, 0xfe, 0xff, 0xff, 0xff, 0x7f)); + assert_encoding( + borland_real48_sin(pi_over_2), + real48(0x80, 0xfa, 0xff, 0xff, 0xff, 0x7f)); + assert_encoding(borland_real48_sin(pi), zero); + assert_encoding(borland_real48_sin(two_pi), zero); + pi_over_2.bytes[5] |= 0x80; + assert_encoding( + borland_real48_sin(pi_over_2), + real48(0x80, 0xf9, 0xff, 0xff, 0xff, 0xff)); + assert_encoding( + borland_real48_sin(one), + real48(0x80, 0x48, 0x78, 0xa4, 0x6a, 0x57)); + + assert_encoding( + borland_real48_cos(zero), + real48(0x80, 0xfa, 0xff, 0xff, 0xff, 0x7f)); + assert_encoding( + borland_real48_cos(pi_over_6), + real48(0x80, 0xc2, 0x42, 0xd7, 0xb3, 0x5d)); + pi_over_2.bytes[5] &= 0x7f; + assert_encoding(borland_real48_cos(pi_over_2), zero); + assert_encoding( + borland_real48_cos(pi), + real48(0x80, 0xf9, 0xff, 0xff, 0xff, 0xff)); + assert_encoding( + borland_real48_cos(two_pi), + real48(0x80, 0xf9, 0xff, 0xff, 0xff, 0x7f)); + pi_over_2.bytes[5] |= 0x80; + assert_encoding(borland_real48_cos(pi_over_2), zero); + assert_encoding( + borland_real48_cos(one), + real48(0x80, 0xa8, 0x7d, 0x40, 0x51, 0x0a)); + one_and_three_quarters.bytes[5] |= 0x80; + assert_encoding( + borland_real48_integer_part(one_and_three_quarters), minus_one); + three_quarters.bytes[5] |= 0x80; + assert_encoding( + borland_real48_fractional_part(one_and_three_quarters), + three_quarters); + + BorlandReal48Result overflow = + borland_real48_add_registers(largest, largest); + assert(overflow.overflow && !overflow.divide_by_zero); + overflow = borland_real48_multiply_registers(largest, largest); + assert(overflow.overflow && !overflow.divide_by_zero); + BorlandReal48Result division = + borland_real48_divide_registers(one, zero); + assert(division.divide_by_zero && !division.overflow); + + g_runtime_error_code = 0; + if (setjmp(g_runtime_error_jump) == 0) { + (void)borland_real48_add(largest, largest); + assert(false); + } + assert(g_runtime_error_code == 205); + if (setjmp(g_runtime_error_jump) == 0) { + (void)borland_real48_divide(one, zero); + assert(false); + } + assert(g_runtime_error_code == 200); + if (setjmp(g_runtime_error_jump) == 0) { + (void)borland_real48_sqrt(minus_one); + assert(false); + } + assert(g_runtime_error_code == 207); + if (setjmp(g_runtime_error_jump) == 0) { + (void)borland_real48_ln(minus_one); + assert(false); + } + assert(g_runtime_error_code == 207); +} + +int main(void) +{ + test_integer_encoding(); + test_round_and_truncate(); + test_integer_overflow(); + test_comparison(); + test_arithmetic(); + return 0; +} diff --git a/original/reconstructed/tests/test_render.c b/original/reconstructed/tests/test_render.c new file mode 100644 index 0000000..922412a --- /dev/null +++ b/original/reconstructed/tests/test_render.c @@ -0,0 +1,119 @@ +#include "../tdkpin_render.h" + +#include + +static uint8_t g_dgroup[0x1000]; +static unsigned g_step; +static unsigned g_mode; + +HDC16 CreateCompatibleDC16(HDC16 dc) +{ + assert(dc == 0x1111); + g_step++; + return (HDC16)(0x2000 + g_step); +} + +HGDIOBJ16 SelectObject16(HDC16 dc, HGDIOBJ16 object) +{ + g_step++; + if (g_mode == 4) { + if (g_step == 2) { + assert(dc == 0x2001 && object == 0x3000); + return 0x4000; + } + assert(g_step == 4 && dc == 0x2001 && object == 0x4000); + return 0x3000; + } + if (g_step == 3) { + assert(dc == 0x2001 && object == 0x3000); + return 0x4000; + } + if (g_step == 4) { + HGDIOBJ16 expected = g_mode == 1 ? 0x3333 : (g_mode == 2 ? 0x3002 : 0x3001); + assert(dc == 0x2002 && object == expected); + return 0x4001; + } + if (g_step == 6) { + assert(dc == 0x2002 && object == 0x4001); + return 0; + } + assert(g_step == 7 && dc == 0x2001 && object == 0x4000); + return 0; +} + +BOOL16 BitBlt16( + HDC16 destination, + INT16 destination_x, + INT16 destination_y, + INT16 width, + INT16 height, + HDC16 source, + INT16 source_x, + INT16 source_y, + uint32_t raster_operation) +{ + g_step++; + assert(raster_operation == 0x00cc0020); + assert(width == 30 && height == 40); + if (g_mode == 4) { + assert(g_step == 3 && destination == 0x1111 && source == 0x2001); + assert(destination_x == 10 && destination_y == 20); + assert(source_x == 10 && source_y == 20); + } else { + assert(g_step == 5 && destination == 0x2001 && source == 0x2002); + assert(destination_x == 10 && destination_y == 20); + if (g_mode == 1) { + assert(source_x == 0 && source_y == 0); + } else { + assert(source_x == 10 && source_y == 20); + } + } + return 1; +} + +BOOL16 DeleteDC16(HDC16 dc) +{ + g_step++; + if (g_mode == 4) { + assert(g_step == 5 && dc == 0x2001); + } else if (g_step == 8) { + assert(dc == 0x2002); + } else { + assert(g_step == 9 && dc == 0x2001); + } + return 1; +} + +static void run_mode(unsigned mode) +{ + g_mode = mode; + g_step = 0; + if (mode == 1) { + tdkpin_blit_bitmap_to_background(0x3333, 40, 30, 20, 10, 0x1111); + assert(g_step == 9); + } else if (mode == 2) { + tdkpin_restore_background_region_a(40, 30, 20, 10, 0x1111); + assert(g_step == 9); + } else if (mode == 3) { + tdkpin_restore_background_region_b(40, 30, 20, 10, 0x1111); + assert(g_step == 9); + } else { + tdkpin_present_background_region(40, 30, 20, 10, 0x1111); + assert(g_step == 5); + } +} + +int main(void) +{ + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, g_dgroup, sizeof(g_dgroup), true); + win16_set_dgroup_selector(0x5000); + win16_write_u16(win16_make_far_pointer(0x5000, 0x085b), 0, 0x3000); + win16_write_u16(win16_make_far_pointer(0x5000, 0x085d), 0, 0x3001); + win16_write_u16(win16_make_far_pointer(0x5000, 0x085f), 0, 0x3002); + run_mode(1); + run_mode(2); + run_mode(3); + run_mode(4); + return 0; +} diff --git a/original/reconstructed/tests/test_resources.c b/original/reconstructed/tests/test_resources.c new file mode 100644 index 0000000..603c841 --- /dev/null +++ b/original/reconstructed/tests/test_resources.c @@ -0,0 +1,66 @@ +#include "../tdkpin_resources.h" + +#include +#include + +static void hash_u16(uint64_t *hash, uint16_t value) +{ + for (unsigned byte = 0; byte < 2; byte++) { + *hash ^= (uint8_t)(value >> (byte * 8)); + *hash *= UINT64_C(1099511628211); + } +} + +static void hash_u32(uint64_t *hash, uint32_t value) +{ + for (unsigned byte = 0; byte < 4; byte++) { + *hash ^= (uint8_t)(value >> (byte * 8)); + *hash *= UINT64_C(1099511628211); + } +} + +int main(void) +{ + size_t direct = 0; + size_t system_resolved = 0; + size_t linked_unused = 0; + uint64_t manifest_fields_hash = UINT64_C(14695981039346656037); + for (size_t index = 0; index < TDKPIN_RESOURCE_COUNT; index++) { + const TdkpinResourceDescriptor *entry = &tdkpin_resource_catalog[index]; + assert(entry->meaningful_size > 0); + assert(entry->meaningful_size <= entry->allocated_size); + assert(entry->role != NULL && entry->role[0] != '\0'); + for (size_t earlier = 0; earlier < index; earlier++) { + assert(entry->type != tdkpin_resource_catalog[earlier].type || + entry->id != tdkpin_resource_catalog[earlier].id); + } + if (entry->disposition == TDKPIN_RESOURCE_DIRECT) { + direct++; + } else if (entry->disposition == TDKPIN_RESOURCE_SYSTEM_RESOLVED) { + system_resolved++; + } else { + assert(entry->disposition == TDKPIN_RESOURCE_LINKED_UNUSED); + linked_unused++; + } + hash_u16(&manifest_fields_hash, (uint16_t)entry->type); + hash_u16(&manifest_fields_hash, entry->id); + hash_u32(&manifest_fields_hash, entry->file_offset); + hash_u32(&manifest_fields_hash, entry->allocated_size); + hash_u32(&manifest_fields_hash, entry->meaningful_size); + hash_u16(&manifest_fields_hash, entry->flags); + hash_u16(&manifest_fields_hash, entry->width); + hash_u16(&manifest_fields_hash, entry->height); + hash_u32(&manifest_fields_hash, entry->sample_rate); + } + assert(direct == 57); + assert(system_resolved == 2); + assert(linked_unused == 4); + assert(manifest_fields_hash == UINT64_C(0x29d77e86100b5e75)); + assert(tdkpin_resource_catalog[0].type == TDKPIN_RESOURCE_DAT); + assert(tdkpin_resource_catalog[0].id == 400); + assert(tdkpin_resource_catalog[62].type == TDKPIN_RESOURCE_DIALOG); + assert(tdkpin_resource_catalog[62].id == 32517); + assert(strcmp(tdkpin_resource_catalog[54].role, + "image selected by GROUP_ICON 996") == 0); + return 0; +} diff --git a/original/reconstructed/tests/test_runtime_input.c b/original/reconstructed/tests/test_runtime_input.c new file mode 100644 index 0000000..73feee5 --- /dev/null +++ b/original/reconstructed/tests/test_runtime_input.c @@ -0,0 +1,155 @@ +#include "../tdkpin_runtime_ui.h" + +#include +#include +#include +#include + +uint8_t g_tpwincrt_has_focus; +uint8_t g_tpwincrt_caret_enabled; +uint8_t g_tpwincrt_break_check_enabled; +uint16_t g_tpwincrt_input_count; +uint8_t g_tpwincrt_input_buffer[64]; +uint16_t g_tpwincrt_view_column; +uint16_t g_tpwincrt_view_row; +uint16_t g_tpwincrt_max_view_column; +uint16_t g_tpwincrt_max_view_row; +uint16_t g_tpwincrt_visible_columns; +uint16_t g_tpwincrt_visible_rows; +uint16_t g_tpwincrt_character_width; +uint16_t g_tpwincrt_character_height; +uint8_t g_tpwincrt_window_created; +HWND16 g_tpwincrt_window; + +static unsigned g_destroy_caret_calls; +static uint16_t g_exit_status; +static jmp_buf g_exit_jump; +static INT16 g_key_state; +static unsigned g_scroll_window_calls; + +BOOL16 DestroyCaret16(void) +{ + g_destroy_caret_calls++; + return 1; +} + +_Noreturn void borland_runtime_exit(uint16_t status) +{ + g_exit_status = status; + longjmp(g_exit_jump, 1); +} + +INT16 GetKeyState16(INT16 virtual_key) +{ + assert(virtual_key == 0x11); + return g_key_state; +} + +INT16 SetScrollPos16( + HWND16 window, INT16 bar, INT16 position, BOOL16 redraw) +{ + assert(window == g_tpwincrt_window && redraw == 1); + assert(bar == 0 || bar == 1); + return position; +} + +BOOL16 ScrollWindow16( + HWND16 window, + INT16 delta_x, + INT16 delta_y, + Win16FarPtr scroll, + Win16FarPtr clip) +{ + assert(window == g_tpwincrt_window && scroll == 0 && clip == 0); + (void)delta_x; + (void)delta_y; + g_scroll_window_calls++; + return 1; +} + +BOOL16 UpdateWindow16(HWND16 window) +{ + assert(window == g_tpwincrt_window); + return 1; +} + +static void expect_abort(bool focused, bool caret) +{ + g_tpwincrt_has_focus = focused; + g_tpwincrt_caret_enabled = caret; + g_destroy_caret_calls = 0; + g_exit_status = 0; + if (setjmp(g_exit_jump) == 0) { + tpwincrt_abort_on_ctrl_c(); + assert(false); + } + assert(g_exit_status == 0xff); + assert(g_destroy_caret_calls == (focused && caret ? 1u : 0u)); +} + +int main(void) +{ + expect_abort(true, true); + expect_abort(true, false); + expect_abort(false, true); + + memset(g_tpwincrt_input_buffer, 0, sizeof(g_tpwincrt_input_buffer)); + g_tpwincrt_break_check_enabled = 0; + g_tpwincrt_input_count = 0; + tpwincrt_queue_character('A'); + assert(g_tpwincrt_input_count == 1 && g_tpwincrt_input_buffer[0] == 'A'); + tpwincrt_queue_character(3); + assert(g_tpwincrt_input_count == 2 && g_tpwincrt_input_buffer[1] == 3); + + g_tpwincrt_input_count = 64; + tpwincrt_queue_character('B'); + assert(g_tpwincrt_input_count == 64); + + g_tpwincrt_break_check_enabled = 1; + g_tpwincrt_input_count = 0; + g_tpwincrt_has_focus = 1; + g_tpwincrt_caret_enabled = 1; + g_destroy_caret_calls = 0; + if (setjmp(g_exit_jump) == 0) { + tpwincrt_queue_character(3); + assert(false); + } + assert(g_exit_status == 0xff && g_destroy_caret_calls == 1); + assert(g_tpwincrt_input_count == 0); + + g_tpwincrt_break_check_enabled = 0; + g_tpwincrt_window_created = 1; + g_tpwincrt_window = 0x77; + g_tpwincrt_max_view_column = 10; + g_tpwincrt_max_view_row = 10; + g_tpwincrt_visible_columns = 4; + g_tpwincrt_visible_rows = 4; + g_tpwincrt_character_width = 8; + g_tpwincrt_character_height = 16; + g_tpwincrt_view_column = 5; + g_tpwincrt_view_row = 5; + g_key_state = 0; + g_scroll_window_calls = 0; + tpwincrt_handle_keydown(0x25); + assert(g_tpwincrt_view_column == 4 && g_tpwincrt_view_row == 5); + g_tpwincrt_view_column = 5; + g_key_state = -1; + tpwincrt_handle_keydown(0x25); + assert(g_tpwincrt_view_column == 3); + g_key_state = 0; + tpwincrt_handle_keydown(0x26); + assert(g_tpwincrt_view_row == 4); + uint16_t column = g_tpwincrt_view_column; + uint16_t row = g_tpwincrt_view_row; + tpwincrt_handle_keydown(0x30); + assert(g_tpwincrt_view_column == column && g_tpwincrt_view_row == row); + assert(g_scroll_window_calls == 3); + + g_tpwincrt_break_check_enabled = 1; + if (setjmp(g_exit_jump) == 0) { + tpwincrt_handle_keydown(3); + assert(false); + } + assert(g_exit_status == 0xff); + return 0; +} diff --git a/original/reconstructed/tests/test_runtime_lifecycle.c b/original/reconstructed/tests/test_runtime_lifecycle.c new file mode 100644 index 0000000..e6dbd48 --- /dev/null +++ b/original/reconstructed/tests/test_runtime_lifecycle.c @@ -0,0 +1,113 @@ +#include "../tdkpin_runtime_ui.h" + +#include + +uint16_t g_tpwincrt_columns; +uint16_t g_tpwincrt_rows; +uint8_t g_tpwincrt_window_created; +Win16FarPtr g_tpwincrt_screen_buffer; +uint8_t g_tpwincrt_break_check_enabled; +HWND16 g_tpwincrt_window; +uint16_t g_tpwincrt_cursor_column; +uint16_t g_tpwincrt_cursor_row; +uint16_t g_tpwincrt_view_column; +uint16_t g_tpwincrt_view_row; + +static uint16_t g_allocated_bytes; +static Win16FarPtr g_allocation; +static Win16FarPtr g_filled_block; +static uint16_t g_filled_bytes; +static uint8_t g_fill_value; +static unsigned g_menu_calls; +static HMENU16 g_enabled_menu; +static Win16FarPtr g_freed_block; +static uint16_t g_freed_bytes; +static INT16 g_quit_code; + +Win16FarPtr borland_get_mem(uint16_t bytes) +{ + g_allocated_bytes = bytes; + return g_allocation; +} + +void borland_fill_bytes( + Win16FarPtr destination, uint16_t count, uint8_t value) +{ + g_filled_block = destination; + g_filled_bytes = count; + g_fill_value = value; +} + +HMENU16 GetSystemMenu16(HWND16 window, BOOL16 revert) +{ + assert(window == g_tpwincrt_window && revert == 0); + g_menu_calls++; + return 0x1234; +} + +BOOL16 EnableMenuItem16(HMENU16 menu, UINT16 item, UINT16 flags) +{ + assert(item == 0xf060 && flags == 3); + g_enabled_menu = menu; + return 1; +} + +void borland_free_mem(Win16FarPtr block, uint16_t bytes) +{ + g_freed_block = block; + g_freed_bytes = bytes; +} + +void PostQuitMessage16(INT16 exit_code) +{ + g_quit_code = exit_code; +} + +static void reset_create(void) +{ + g_tpwincrt_window_created = 0; + g_tpwincrt_screen_buffer = 0; + g_allocated_bytes = 0; + g_filled_block = 0; + g_filled_bytes = 0; + g_fill_value = 0; + g_menu_calls = 0; + g_enabled_menu = 0; +} + +int main(void) +{ + g_tpwincrt_columns = 400; + g_tpwincrt_rows = 200; + uint16_t wrapped_bytes = (uint16_t)(400u * 200u); + g_allocation = win16_make_far_pointer(0x7000, 0x0100); + g_tpwincrt_window = 0x77; + + reset_create(); + g_tpwincrt_break_check_enabled = 1; + tpwincrt_on_create(); + assert(g_tpwincrt_window_created == 1); + assert(g_allocated_bytes == wrapped_bytes); + assert(g_tpwincrt_screen_buffer == g_allocation); + assert(g_filled_block == g_allocation && g_filled_bytes == wrapped_bytes); + assert(g_fill_value == ' ' && g_menu_calls == 0); + + reset_create(); + g_tpwincrt_break_check_enabled = 0; + tpwincrt_on_create(); + assert(g_menu_calls == 1 && g_enabled_menu == 0x1234); + + g_tpwincrt_cursor_column = 4; + g_tpwincrt_cursor_row = 5; + g_tpwincrt_view_column = 6; + g_tpwincrt_view_row = 7; + g_tpwincrt_window_created = 1; + g_freed_block = 0; + g_quit_code = -1; + tpwincrt_on_destroy(); + assert(g_freed_block == g_allocation && g_freed_bytes == wrapped_bytes); + assert(g_tpwincrt_cursor_column == 0 && g_tpwincrt_cursor_row == 0); + assert(g_tpwincrt_view_column == 0 && g_tpwincrt_view_row == 0); + assert(g_quit_code == 0 && g_tpwincrt_window_created == 0); + return 0; +} diff --git a/original/reconstructed/tests/test_runtime_minmax.c b/original/reconstructed/tests/test_runtime_minmax.c new file mode 100644 index 0000000..765d878 --- /dev/null +++ b/original/reconstructed/tests/test_runtime_minmax.c @@ -0,0 +1,145 @@ +#include "../tdkpin_runtime_ui.h" +#include "../tdkpin_segmented.h" + +#include +#include +#include +#include + +HWND16 g_tpwincrt_window; +uint8_t g_tpwincrt_paint_message_active; +HDC16 g_tpwincrt_paint_dc; +PAINTSTRUCT16 g_tpwincrt_paint; +HGDIOBJ16 g_tpwincrt_previous_font; +uint16_t g_tpwincrt_character_width; +uint16_t g_tpwincrt_character_height; +uint16_t g_tpwincrt_caret_y_offset; +uint16_t g_tpwincrt_columns; +uint16_t g_tpwincrt_rows; + +static unsigned g_release_calls; +static unsigned g_select_calls; + +HDC16 GetDC16(HWND16 window) +{ + assert(window == 0x77); + return 0x100; +} + +HDC16 BeginPaint16(HWND16 window, Win16FarPtr paint) +{ + (void)window; + (void)paint; + assert(false); + return 0; +} + +BOOL16 EndPaint16(HWND16 window, Win16FarPtr paint) +{ + (void)window; + (void)paint; + assert(false); + return 0; +} + +INT16 ReleaseDC16(HWND16 window, HDC16 dc) +{ + assert(window == 0x77 && dc == 0x100); + g_release_calls++; + return 1; +} + +HGDIOBJ16 GetStockObject16(INT16 object) +{ + assert(object == 0x10); + return 0x200; +} + +HGDIOBJ16 SelectObject16(HDC16 dc, HGDIOBJ16 object) +{ + assert(dc == 0x100); + g_select_calls++; + if (g_select_calls == 1) { + assert(object == 0x200); + return 0x300; + } + assert(object == 0x300); + return 0x200; +} + +COLORREF16 GetSysColor16(INT16 index) +{ + return (COLORREF16)(0x1000 + index); +} + +COLORREF16 SetTextColor16(HDC16 dc, COLORREF16 color) +{ + assert(dc == 0x100 && color == 0x1008); + return 0; +} + +COLORREF16 SetBkColor16(HDC16 dc, COLORREF16 color) +{ + assert(dc == 0x100 && color == 0x1005); + return 0; +} + +BOOL16 GetTextMetrics16(HDC16 dc, Win16FarPtr metrics) +{ + assert(dc == 0x100); + TEXTMETRIC16 value; + memset(&value, 0, sizeof(value)); + value.height = 12; + value.external_leading = 2; + value.ascent = 9; + value.maximum_character_width = 8; + const uint8_t *bytes = (const uint8_t *)&value; + for (uint16_t index = 0; index < sizeof(value); index++) { + win16_write_u8(win16_far_add_offset(metrics, index), bytes[index]); + } + return 1; +} + +INT16 GetSystemMetrics16(INT16 index) +{ + switch (index) { + case 0: return 640; + case 1: return 480; + case 2: return 16; + case 3: return 16; + case 4: return 20; + case 32: return 4; + case 33: return 5; + default: assert(false); return 0; + } +} + +int main(void) +{ + uint8_t stack_marker; + uintptr_t stack_base = (uintptr_t)&stack_marker - 0x8000; + static uint8_t output[32]; + win16_reset_segment_bindings(); + win16_bind_segment(0x9000, (void *)stack_base, 0x10000, true); + win16_bind_segment(0x8000, output, sizeof(output), true); + g_tpwincrt_window = 0x77; + g_tpwincrt_paint_message_active = 0; + g_tpwincrt_columns = 80; + g_tpwincrt_rows = 25; + g_release_calls = 0; + g_select_calls = 0; + + Win16FarPtr target = win16_make_far_pointer(0x8000, 0); + tpwincrt_fill_minmax_info(target); + assert(g_tpwincrt_character_width == 8); + assert(g_tpwincrt_character_height == 14); + assert(g_tpwincrt_caret_y_offset == 9); + assert(win16_read_u16(win16_far_add_offset(target, 4)) == 648); + assert(win16_read_u16(win16_far_add_offset(target, 6)) == 396); + assert(win16_read_u16(win16_far_add_offset(target, 12)) == 152); + assert(win16_read_u16(win16_far_add_offset(target, 14)) == 102); + assert(win16_read_u16(win16_far_add_offset(target, 16)) == 648); + assert(win16_read_u16(win16_far_add_offset(target, 18)) == 396); + assert(g_select_calls == 2 && g_release_calls == 1); + return 0; +} diff --git a/original/reconstructed/tests/test_runtime_ui.c b/original/reconstructed/tests/test_runtime_ui.c new file mode 100644 index 0000000..4b4c816 --- /dev/null +++ b/original/reconstructed/tests/test_runtime_ui.c @@ -0,0 +1,76 @@ +#include "../tdkpin_runtime_ui.h" + +#include +#include + +uint16_t g_tpwincrt_columns; +uint16_t g_tpwincrt_rows; +uint16_t g_tpwincrt_ring_row_origin; +Win16FarPtr g_tpwincrt_screen_buffer; + +static void test_signed_bounds(void) +{ + assert(tpwincrt_min_i16(-7, 3) == -7); + assert(tpwincrt_min_i16(INT16_MAX, INT16_MIN) == INT16_MIN); + assert(tpwincrt_max_i16(-7, 3) == 3); + assert(tpwincrt_max_i16(INT16_MIN, INT16_MAX) == INT16_MAX); +} + +static void test_scroll_commands(void) +{ + TpWinCrtScrollMessage message = {.thumb_position = 7}; + + message.command = TPWINCRT_SB_LINEUP; + assert(tpwincrt_apply_scroll_command(&message, 20, 4, 10) == 9); + message.command = TPWINCRT_SB_LINEDOWN; + assert(tpwincrt_apply_scroll_command(&message, 20, 4, 10) == 11); + message.command = TPWINCRT_SB_PAGEUP; + assert(tpwincrt_apply_scroll_command(&message, 20, 4, 10) == 6); + message.command = TPWINCRT_SB_PAGEDOWN; + assert(tpwincrt_apply_scroll_command(&message, 20, 4, 10) == 14); + message.command = TPWINCRT_SB_THUMBPOSITION; + assert(tpwincrt_apply_scroll_command(&message, 20, 4, 10) == 7); + message.command = TPWINCRT_SB_TOP; + assert(tpwincrt_apply_scroll_command(&message, 20, 4, 10) == 0); + message.command = TPWINCRT_SB_BOTTOM; + assert(tpwincrt_apply_scroll_command(&message, 20, 4, 10) == 20); + message.command = 5; + assert(tpwincrt_apply_scroll_command(&message, 20, 4, 10) == 10); + + message.command = TPWINCRT_SB_LINEDOWN; + assert(tpwincrt_apply_scroll_command(&message, 0, 0, INT16_MAX) == INT16_MIN); +} + +static void test_circular_cell_pointer(void) +{ + g_tpwincrt_columns = 80; + g_tpwincrt_rows = 25; + g_tpwincrt_ring_row_origin = 24; + g_tpwincrt_screen_buffer = win16_make_far_pointer(0x1234, 0xfff0); + + Win16FarPtr result = tpwincrt_cell_pointer(2, 5); + assert(win16_far_selector(result) == 0x1234); + assert(win16_far_offset(result) == 0x0045); +} + +static void test_key_table_bytes(void) +{ + static const uint8_t expected[48] = { + 0x25, 0, 0, 0, 0x27, 0, 0, 1, 0x25, 1, 0, 2, 0x27, 1, 0, 3, + 0x24, 0, 0, 6, 0x23, 0, 0, 7, 0x26, 0, 1, 0, 0x28, 0, 1, 1, + 0x21, 0, 1, 2, 0x22, 0, 1, 3, 0x24, 1, 1, 6, 0x23, 1, 1, 7, + }; + const uint8_t *actual = (const uint8_t *)g_tpwincrt_key_bindings; + for (unsigned index = 0; index < sizeof(expected); index++) { + assert(actual[index] == expected[index]); + } +} + +int main(void) +{ + test_signed_bounds(); + test_scroll_commands(); + test_circular_cell_pointer(); + test_key_table_bytes(); + return 0; +} diff --git a/original/reconstructed/tests/test_score_render.c b/original/reconstructed/tests/test_score_render.c new file mode 100644 index 0000000..d230fb4 --- /dev/null +++ b/original/reconstructed/tests/test_score_render.c @@ -0,0 +1,121 @@ +#include "../tdkpin_render.h" + +#include "../tdkpin_arithmetic.h" + +#include + +static uint8_t g_dgroup[0x1000]; +static unsigned g_create_dc_calls; +static unsigned g_select_calls; +static unsigned g_blit_calls; +static unsigned g_delete_dc_calls; +static unsigned g_divide_calls; + +BorlandDivI32Result borland_divide_i32(int32_t dividend, int32_t divisor) +{ + assert(divisor == 10); + g_divide_calls++; + return (BorlandDivI32Result){dividend / divisor, dividend % divisor}; +} + +HDC16 CreateCompatibleDC16(HDC16 dc) +{ + assert(dc == 0x1111); + g_create_dc_calls++; + return (HDC16)(0x2000 + g_create_dc_calls); +} + +HBITMAP16 CreateCompatibleBitmap16(HDC16 dc, INT16 width, INT16 height) +{ + assert(dc == 0x1111 && width == 40 && height == 150); + return 0x3333; +} + +HGDIOBJ16 SelectObject16(HDC16 dc, HGDIOBJ16 object) +{ + g_select_calls++; + switch (g_select_calls) { + case 1: + assert(dc == 0x2001 && object == 0x3000); + return 0x4000; + case 2: + assert(dc == 0x2002 && object == 0x3333); + return 0x4001; + case 3: + case 4: + assert(dc == 0x2001 && object == 0x3001); + return 0; + case 5: + assert(dc == 0x2001 && object == 0x4000); + return 0; + default: + assert(g_select_calls == 6 && dc == 0x2002 && object == 0x4001); + return 0; + } +} + +BOOL16 BitBlt16( + HDC16 destination, + INT16 destination_x, + INT16 destination_y, + INT16 width, + INT16 height, + HDC16 source, + INT16 source_x, + INT16 source_y, + uint32_t raster_operation) +{ + g_blit_calls++; + if (g_blit_calls == 1) { + assert(destination == 0x2002 && source == 0x2001); + assert(destination_x == 0 && destination_y == 0); + assert(width == 40 && height == 130); + assert(source_x == 321 && source_y == 478); + assert(raster_operation == 0x00cc0020); + } else if (g_blit_calls == 2 || g_blit_calls == 3) { + assert(destination == 0x2002 && source == 0x2001); + assert(destination_x == 0 && width == 28 && height == 16); + if (g_blit_calls == 2) { + assert(destination_y == 112 && source_x == 32); + } else { + assert(destination_y == 96 && source_x == 64); + } + assert(source_y == 0 && raster_operation == 0x008800c6); + } else { + assert(g_blit_calls == 4); + assert(destination == 0x1111 && source == 0x2002); + assert(destination_x == 321 && destination_y == 478); + assert(width == 40 && height == 130); + assert(source_x == 0 && source_y == 0); + assert(raster_operation == 0x00cc0020); + } + return 1; +} + +BOOL16 DeleteObject16(HGDIOBJ16 object) +{ + assert(object == 0x3333); + return 1; +} + +BOOL16 DeleteDC16(HDC16 dc) +{ + g_delete_dc_calls++; + assert(dc == (g_delete_dc_calls == 1 ? 0x2001 : 0x2002)); + return 1; +} + +int main(void) +{ + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, g_dgroup, sizeof(g_dgroup), true); + win16_set_dgroup_selector(0x5000); + win16_write_u16(win16_make_far_pointer(0x5000, 0x085b), 0, 0x3000); + win16_write_u16(win16_make_far_pointer(0x5000, 0x0861), 0, 0x3001); + win16_write_u32(win16_make_far_pointer(0x5000, 0x0982), 4, 42); + tdkpin_draw_score(0x1111, 2); + assert(g_create_dc_calls == 2 && g_select_calls == 6); + assert(g_blit_calls == 4 && g_delete_dc_calls == 2); + assert(g_divide_calls == 16); + return 0; +} diff --git a/original/reconstructed/tests/test_scoring.c b/original/reconstructed/tests/test_scoring.c new file mode 100644 index 0000000..cfbd03e --- /dev/null +++ b/original/reconstructed/tests/test_scoring.c @@ -0,0 +1,165 @@ +#include "../tdkpin_gameplay_helpers.h" + +#include +#include + +uint8_t g_current_player; + +static uint8_t g_stack[0x400]; +static uint8_t g_object[0x0c00]; +static uint8_t g_dgroup[0x5000]; +static Win16FarPtr g_receiver; +static unsigned g_get_dc_calls; +static unsigned g_release_dc_calls; +static unsigned g_sound_calls; +static unsigned g_status_calls; +static unsigned g_score_calls; +static unsigned g_restore_a_calls; +static unsigned g_restore_b_calls; +static unsigned g_present_calls; +static uint8_t g_status_player; +static int32_t g_draw_score_argument; + +HDC16 GetDC16(HWND16 window) +{ + assert(window == 0x2222); + g_get_dc_calls++; + return 0x3333; +} + +INT16 ReleaseDC16(HWND16 window, HDC16 dc) +{ + assert(window == 0x2222 && dc == 0x3333); + g_release_dc_calls++; + return 1; +} + +void tdkpin_play_sound_if_not_tilted(uint16_t sound_number) +{ + assert(sound_number == 7); + g_sound_calls++; +} + +void tdkpin_update_status_display(uint8_t player, HDC16 dc) +{ + assert(dc == 0x3333); + g_status_player = player; + g_status_calls++; +} + +void tdkpin_draw_score(HDC16 dc, int32_t value_or_player) +{ + assert(dc == 0x3333); + g_draw_score_argument = value_or_player; + g_score_calls++; +} + +void tdkpin_restore_background_region_a( + INT16 height, INT16 width, INT16 y, INT16 x, HDC16 dc) +{ + assert(height == 5 && width == 5 && dc == 0x3333); + assert(y == 342 && x >= 391 && x <= 431); + g_restore_a_calls++; +} + +void tdkpin_restore_background_region_b( + INT16 height, INT16 width, INT16 y, INT16 x, HDC16 dc) +{ + assert(height == 5 && width == 5 && dc == 0x3333); + assert(y == 342 && x >= 391 && x <= 431); + g_restore_b_calls++; +} + +void tdkpin_present_background_region( + INT16 height, INT16 width, INT16 y, INT16 x, HDC16 dc) +{ + assert(height == 5 && width == 5 && dc == 0x3333); + assert(y == 342 && x >= 391 && x <= 431); + g_present_calls++; +} + +static void prepare_fixture(void) +{ + memset(g_stack, 0, sizeof(g_stack)); + memset(g_object, 0, sizeof(g_object)); + memset(g_dgroup, 0, sizeof(g_dgroup)); + win16_reset_segment_bindings(); + win16_bind_segment(0x7000, g_stack, sizeof(g_stack), true); + win16_bind_segment(0x7100, g_object, sizeof(g_object), true); + win16_bind_segment(0x7200, g_dgroup, sizeof(g_dgroup), true); + win16_set_dgroup_selector(0x7200); + win16_set_stack_state(0x7000, 0); + g_receiver = win16_make_far_pointer(0x7100, 0); + win16_write_stack_u16(0x0106, win16_far_offset(g_receiver)); + win16_write_stack_u16(0x0108, win16_far_selector(g_receiver)); + win16_write_u16(g_receiver, 4, 0x2222); + g_current_player = 2; + g_get_dc_calls = 0; + g_release_dc_calls = 0; + g_sound_calls = 0; + g_status_calls = 0; + g_score_calls = 0; + g_restore_a_calls = 0; + g_restore_b_calls = 0; + g_present_calls = 0; + g_status_player = 0; + g_draw_score_argument = 0; +} + +static uint32_t player_score(void) +{ + return win16_read_u32(win16_dgroup_pointer(0x0986)); +} + +static void test_multipliers_and_redraw_only_gates(void) +{ + prepare_fixture(); + win16_write_u32(win16_dgroup_pointer(0x0986), 0, 100); + win16_write_u32(win16_dgroup_pointer(0x083d), 0, 5); + win16_write_u8(win16_dgroup_pointer(0x0874), 1); + win16_write_u8(win16_far_add_offset(g_receiver, 0x0bdc), 1); + tdkpin_add_score_from_caller_frame(0x0100, 10); + assert(player_score() == 140); + assert(g_status_calls == 1 && g_status_player == 2); + assert(g_score_calls == 1 && g_draw_score_argument == 2); + assert(g_sound_calls == 0 && g_get_dc_calls == 1); + assert(g_release_dc_calls == 1); + + prepare_fixture(); + win16_write_u32(win16_dgroup_pointer(0x0986), 0, 100); + tdkpin_add_score_from_caller_frame(0x0100, -1); + assert(player_score() == 100 && g_status_calls == 0); + assert(g_score_calls == 1 && g_release_dc_calls == 1); + + prepare_fixture(); + win16_write_u32(win16_dgroup_pointer(0x0986), 0, 100); + win16_write_u8(win16_dgroup_pointer(0x07c6), 1); + tdkpin_add_score_from_caller_frame(0x0100, 10); + assert(player_score() == 100 && g_status_calls == 0); + assert(g_score_calls == 1 && g_release_dc_calls == 1); +} + +static void test_threshold_award_and_marker_refresh(void) +{ + prepare_fixture(); + win16_write_u32(win16_dgroup_pointer(0x0986), 0, 90); + win16_write_u32(win16_dgroup_pointer(0x083d), 0, 0); + win16_write_u32(win16_dgroup_pointer(0x0825), 0, 100); + win16_write_u16(win16_dgroup_pointer(0x0823), 0, 3); + tdkpin_add_score_from_caller_frame(0x0100, 10); + assert(player_score() == 100); + assert(win16_read_u32(win16_dgroup_pointer(0x083d)) == 1); + assert(win16_read_u16(win16_dgroup_pointer(0x0823)) == 4); + assert(g_sound_calls == 1 && g_status_calls == 1); + assert(g_restore_a_calls == 4 && g_restore_b_calls == 2); + assert(g_present_calls == 6); + assert(g_get_dc_calls == 2 && g_release_dc_calls == 2); + assert(g_score_calls == 1 && g_draw_score_argument == 2); +} + +int main(void) +{ + test_multipliers_and_redraw_only_gates(); + test_threshold_award_and_marker_refresh(); + return 0; +} diff --git a/original/reconstructed/tests/test_shortstrings.c b/original/reconstructed/tests/test_shortstrings.c new file mode 100644 index 0000000..c00a0ec --- /dev/null +++ b/original/reconstructed/tests/test_shortstrings.c @@ -0,0 +1,118 @@ +#include "../tdkpin_shortstrings.h" + +#include +#include + +static uint8_t g_left[0x10000]; +static uint8_t g_right[0x10000]; + +static Win16FarPtr left_at(uint16_t offset) +{ + return win16_make_far_pointer(0x3333, offset); +} + +static Win16FarPtr right_at(uint16_t offset) +{ + return win16_make_far_pointer(0x4444, offset); +} + +static void reset_memory(void) +{ + memset(g_left, 0, sizeof(g_left)); + memset(g_right, 0, sizeof(g_right)); + win16_reset_segment_bindings(); + win16_bind_segment(0x3333, g_left, sizeof(g_left), true); + win16_bind_segment(0x4444, g_right, sizeof(g_right), true); +} + +static void set_short(uint8_t *bytes, uint16_t offset, const char *text) +{ + size_t length = strlen(text); + assert(length <= 255); + bytes[offset] = (uint8_t)length; + memcpy(&bytes[offset + 1], text, length); +} + +static void test_shifts(void) +{ + assert(borland_shift_right_u32(0x87654321, 4) == 0x08765432); + assert(borland_shift_left_u32(0x87654321, 4) == 0x76543210); + assert(borland_shift_right_u32(0x87654321, 36) == 0x08765432); + assert(borland_shift_left_u32(0x87654321, 32) == 0x87654321); +} + +static void test_assignment_copy_and_concat(void) +{ + reset_memory(); + set_short(g_left, 10, "abcdef"); + borland_short_assign(right_at(10), left_at(10)); + assert(memcmp(&g_right[10], &g_left[10], 7) == 0); + borland_short_assign_truncated(right_at(30), left_at(10), 3); + assert(g_right[30] == 3 && memcmp(&g_right[31], "abc", 3) == 0); + borland_short_substring(right_at(50), left_at(10), 2, 3); + assert(g_right[50] == 3 && memcmp(&g_right[51], "bcd", 3) == 0); + borland_short_substring(right_at(60), left_at(10), -2, -1); + assert(g_right[60] == 0); + + set_short(g_right, 100, "one"); + set_short(g_left, 100, "two"); + borland_short_concat(right_at(100), left_at(100)); + assert(g_right[100] == 6 && memcmp(&g_right[101], "onetwo", 6) == 0); + + g_right[200] = 250; + memset(&g_right[201], 'x', 250); + g_left[200] = 10; + memset(&g_left[201], 'y', 10); + borland_short_concat(right_at(200), left_at(200)); + assert(g_right[200] == 255); + assert(memcmp(&g_right[451], "yyyyy", 5) == 0); +} + +static void test_search_compare_and_conversion(void) +{ + reset_memory(); + set_short(g_left, 10, "cab"); + set_short(g_right, 10, "abcabc"); + assert(borland_short_position(left_at(10), right_at(10)) == 3); + g_left[10] = 0; + assert(borland_short_position(left_at(10), right_at(10)) == 0); + + set_short(g_left, 30, "abc"); + set_short(g_right, 30, "abd"); + assert(borland_short_compare(left_at(30), right_at(30)) < 0); + set_short(g_right, 30, "abcx"); + assert(borland_short_compare(left_at(30), right_at(30)) < 0); + + borland_character_to_short(right_at(60), 'Q'); + assert(g_right[60] == 1 && g_right[61] == 'Q'); + memcpy(&g_left[80], "bytes", 5); + borland_bytes_to_short(right_at(80), left_at(80), 5); + assert(g_right[80] == 5 && memcmp(&g_right[81], "bytes", 5) == 0); +} + +static void test_insert_and_delete(void) +{ + reset_memory(); + set_short(g_right, 100, "abcd"); + set_short(g_left, 100, "XY"); + borland_short_insert(right_at(100), left_at(100), 3, 255); + assert(g_right[100] == 6 && memcmp(&g_right[101], "abXYcd", 6) == 0); + + set_short(g_right, 120, "abcd"); + borland_short_insert(right_at(120), left_at(100), 99, 5); + assert(g_right[120] == 5 && memcmp(&g_right[121], "abcdX", 5) == 0); + + borland_short_delete(right_at(100), 2, 3); + assert(g_right[100] == 3 && memcmp(&g_right[101], "acd", 3) == 0); + borland_short_delete(right_at(100), 0, 2); + assert(g_right[100] == 3 && memcmp(&g_right[101], "acd", 3) == 0); +} + +int main(void) +{ + test_shifts(); + test_assignment_copy_and_concat(); + test_search_compare_and_conversion(); + test_insert_and_delete(); + return 0; +} diff --git a/original/reconstructed/tests/test_sound.c b/original/reconstructed/tests/test_sound.c new file mode 100644 index 0000000..5cdd50f --- /dev/null +++ b/original/reconstructed/tests/test_sound.c @@ -0,0 +1,451 @@ +#include "../tdkpin_sound.h" + +#include +#include +#include +#include + +enum { + DGROUP_SOUND_LENGTHS = 0x03ea, + DGROUP_INI_SUFFIX = 0x0442, + DGROUP_INI_SECTION = 0x0446, + DGROUP_INI_KEY = 0x044f, + DGROUP_WAVE_TYPE = 0x0455, + DGROUP_GAME_TILTED = 0x07c6, + DGROUP_WAVE_CAPS = 0x43be, + DGROUP_DEVICE_COUNT = 0x43ee, + DGROUP_DEVICE_ID = 0x43f0, + DGROUP_SOUND_BASE = 0x43f2, + DGROUP_SOUND_ENABLED = 0x43f2, + DGROUP_SOUND_PLAYING = 0x43f3, + DGROUP_VOLUME_STEP = 0x43f4, + CODE2_DOT = 0x0f2c, + SOUND_COUNT = 22, +}; + +static uint8_t g_dgroup[0x5000]; +static uint8_t g_code2[0x1000]; +HINSTANCE16 g_win16_instance; +Win16FarPtr g_borland_command_line; + +static UINT16 g_profile_value; +static unsigned g_profile_calls; +static UINT16 g_wave_device_count; +static UINT16 g_wave_caps_result; +static uint32_t g_wave_support; +static uint32_t g_wave_volume; +static unsigned g_wave_count_calls; +static unsigned g_wave_caps_calls; +static unsigned g_wave_volume_calls; +static uint16_t g_current_sound; +static unsigned g_resource_stage; +static uint16_t g_loaded_sounds[SOUND_COUNT]; +static unsigned g_loaded_count; +static unsigned g_stop_calls; +static Win16FarPtr g_played_sound; +static UINT16 g_play_flags; +static BOOL16 g_play_result; +static Win16FarPtr g_freed_sounds[SOUND_COUNT]; +static unsigned g_free_count; + +static Win16FarPtr dgroup_at(uint16_t offset) +{ + return win16_make_far_pointer(0x5000, offset); +} + +static bool far_string_equals(Win16FarPtr string, const char *expected) +{ + size_t index = 0; + do { + if (win16_read_u8(win16_far_add_offset(string, (uint16_t)index)) != + (uint8_t)expected[index]) { + return false; + } + } while (expected[index++] != '\0'); + return true; +} + +static uint16_t sound_index_offset(uint16_t sound_number) +{ + return (uint16_t)(sound_number << 2); +} + +static Win16FarPtr sound_buffer(uint16_t sound_number) +{ + return win16_read_far_pointer( + dgroup_at(DGROUP_SOUND_BASE), sound_index_offset(sound_number)); +} + +static void set_sound_buffer(uint16_t sound_number, Win16FarPtr value) +{ + win16_write_u32( + dgroup_at(DGROUP_SOUND_BASE), sound_index_offset(sound_number), value); +} + +static void initialize_image_data(void) +{ + memset(g_dgroup, 0, sizeof(g_dgroup)); + memset(g_code2, 0, sizeof(g_code2)); + memcpy(&g_dgroup[DGROUP_INI_SUFFIX], "INI", 4); + memcpy(&g_dgroup[DGROUP_INI_SECTION], "Settings", 9); + memcpy(&g_dgroup[DGROUP_INI_KEY], "Sound", 6); + memcpy(&g_dgroup[DGROUP_WAVE_TYPE], "WAV", 4); + g_code2[CODE2_DOT] = 1; + g_code2[CODE2_DOT + 1] = '.'; + + /* 03e6 belongs to the preceding object but is read for sound number zero. */ + win16_write_u32(dgroup_at(0x03e6), 0, 0x00007070); + for (uint16_t index = 0; index < SOUND_COUNT; index++) { + win16_write_u32( + dgroup_at(DGROUP_SOUND_LENGTHS), + (uint16_t)(index * 4), + g_sound_resource_byte_counts[index]); + } +} + +static void reset_calls(void) +{ + g_profile_calls = 0; + g_wave_count_calls = 0; + g_wave_caps_calls = 0; + g_wave_volume_calls = 0; + g_current_sound = 0; + g_resource_stage = 0; + g_loaded_count = 0; + g_stop_calls = 0; + g_played_sound = 0; + g_play_flags = 0; + g_free_count = 0; +} + +static void reset_sound_state(void) +{ + memset(&g_dgroup[DGROUP_WAVE_CAPS], 0, 0x90); + reset_calls(); +} + +UINT16 GetModuleFileNameFar16( + HINSTANCE16 module, Win16FarPtr buffer, UINT16 size) +{ + static const char module_name[] = "C:\\GAMES\\TDKPIN.EXE"; + assert(module == g_win16_instance && size == 0xff); + size_t length = strlen(module_name); + for (size_t index = 0; index < length; index++) { + win16_write_u8( + win16_far_add_offset(buffer, (uint16_t)index), + (uint8_t)module_name[index]); + } + win16_write_u8(win16_far_add_offset(buffer, (uint16_t)length), 0); + return (UINT16)length; +} + +UINT16 GetPrivateProfileInt16( + Win16FarPtr section, + Win16FarPtr key, + INT16 default_value, + Win16FarPtr file_name) +{ + assert(section == dgroup_at(DGROUP_INI_SECTION)); + assert(key == dgroup_at(DGROUP_INI_KEY)); + assert(default_value == 1); + assert(far_string_equals(file_name, "C:\\GAMES\\TDKPIN.INI")); + g_profile_calls++; + return g_profile_value; +} + +UINT16 WaveOutGetNumDevs16(void) +{ + g_wave_count_calls++; + return g_wave_device_count; +} + +UINT16 WaveOutGetDevCaps16( + UINT16 device_id, Win16FarPtr capabilities, UINT16 byte_count) +{ + assert(device_id == win16_read_u16(dgroup_at(DGROUP_DEVICE_ID))); + assert(capabilities == dgroup_at(DGROUP_WAVE_CAPS)); + assert(byte_count == 48); + win16_write_u32(capabilities, 44, g_wave_support); + g_wave_caps_calls++; + return g_wave_caps_result; +} + +UINT16 WaveOutGetVolume16(UINT16 device_id, Win16FarPtr volume) +{ + assert(device_id == win16_read_u16(dgroup_at(DGROUP_DEVICE_ID))); + win16_write_u32(volume, 0, g_wave_volume); + g_wave_volume_calls++; + return 0; +} + +HRSRC16 FindResource16( + HINSTANCE16 instance, Win16FarPtr name, Win16FarPtr type) +{ + assert(g_resource_stage == 0 && instance == g_win16_instance); + assert(win16_far_selector(name) == 0); + assert(type == dgroup_at(DGROUP_WAVE_TYPE)); + g_current_sound = (uint16_t)(win16_far_offset(name) - 2000); + assert(g_current_sound >= 1 && g_current_sound <= SOUND_COUNT); + assert(g_sound_resource_byte_counts[g_current_sound - 1] != 0); + g_resource_stage = 1; + return (HRSRC16)(0x1000 + g_current_sound); +} + +HGLOBAL16 LoadResource16(HINSTANCE16 instance, HRSRC16 resource) +{ + assert(g_resource_stage == 1 && instance == g_win16_instance); + assert(resource == (HRSRC16)(0x1000 + g_current_sound)); + g_resource_stage = 2; + return (HGLOBAL16)(0x2000 + g_current_sound); +} + +Win16FarPtr tdkpin_global_allocate_locked(UINT16 flags, uint32_t bytes) +{ + assert(g_resource_stage == 2 && flags == 0x42); + assert(bytes == g_sound_resource_byte_counts[g_current_sound - 1]); + g_resource_stage = 3; + return win16_make_far_pointer( + (uint16_t)(0x7000 + g_current_sound), 0x0100); +} + +Win16FarPtr LockResource16(HGLOBAL16 resource) +{ + assert(g_resource_stage == 3); + assert(resource == (HGLOBAL16)(0x2000 + g_current_sound)); + g_resource_stage = 4; + return win16_make_far_pointer( + (uint16_t)(0x6000 + g_current_sound), 0x0200); +} + +void borland_move_bytes( + Win16FarPtr destination, Win16FarPtr source, uint16_t count) +{ + assert(g_resource_stage == 4); + assert(destination == sound_buffer(g_current_sound)); + assert(destination == win16_make_far_pointer( + (uint16_t)(0x7000 + g_current_sound), 0x0100)); + assert(source == win16_make_far_pointer( + (uint16_t)(0x6000 + g_current_sound), 0x0200)); + assert(count == g_sound_resource_byte_counts[g_current_sound - 1]); + g_resource_stage = 5; +} + +BOOL16 GlobalUnlock16(HGLOBAL16 resource) +{ + assert(g_resource_stage == 5); + assert(resource == (HGLOBAL16)(0x2000 + g_current_sound)); + g_resource_stage = 6; + return 1; +} + +BOOL16 FreeResource16(HGLOBAL16 resource) +{ + assert(g_resource_stage == 6); + assert(resource == (HGLOBAL16)(0x2000 + g_current_sound)); + g_loaded_sounds[g_loaded_count++] = g_current_sound; + g_resource_stage = 0; + return 1; +} + +BOOL16 SndPlaySound16(Win16FarPtr sound, UINT16 flags) +{ + if (sound == 0) { + assert(flags == 0); + g_stop_calls++; + return 1; + } + g_played_sound = sound; + g_play_flags = flags; + return g_play_result; +} + +void tdkpin_global_unlock_and_free(Win16FarPtr block) +{ + assert(g_free_count < SOUND_COUNT); + g_freed_sounds[g_free_count++] = block; +} + +static void test_initializer_disabled_and_probe_failures(void) +{ + reset_sound_state(); + win16_write_u8(dgroup_at(DGROUP_SOUND_ENABLED), 0xaa); + win16_write_u8(dgroup_at(DGROUP_SOUND_PLAYING), 0xbb); + win16_write_u8(dgroup_at(DGROUP_VOLUME_STEP), 0x55); + win16_write_u16(dgroup_at(DGROUP_DEVICE_COUNT), 0, 0xcccc); + g_profile_value = 0; + tdkpin_initialize_sounds(); + assert(g_profile_calls == 1 && g_wave_count_calls == 0); + assert(win16_read_u8(dgroup_at(DGROUP_SOUND_ENABLED)) == 0); + assert(win16_read_u8(dgroup_at(DGROUP_SOUND_PLAYING)) == 0); + assert(win16_read_u16(dgroup_at(DGROUP_DEVICE_COUNT)) == 0); + assert(win16_read_u8(dgroup_at(DGROUP_VOLUME_STEP)) == 0x55); + + reset_sound_state(); + g_profile_value = 1; + g_wave_device_count = 0; + tdkpin_initialize_sounds(); + assert(g_wave_count_calls == 1 && g_wave_caps_calls == 0); + assert(win16_read_u16(dgroup_at(DGROUP_DEVICE_COUNT)) == 0); + + reset_sound_state(); + g_wave_device_count = 2; + g_wave_caps_result = 1; + tdkpin_initialize_sounds(); + assert(g_wave_caps_calls == 1 && g_loaded_count == 0); + assert(win16_read_u16(dgroup_at(DGROUP_DEVICE_COUNT)) == 0); +} + +static void prime_sound_buffers(void) +{ + for (uint16_t sound = 1; sound <= SOUND_COUNT; sound++) { + set_sound_buffer( + sound, win16_make_far_pointer(0x5555, sound)); + } +} + +static void assert_loaded_resource_set(void) +{ + unsigned loaded = 0; + for (uint16_t sound = 1; sound <= SOUND_COUNT; sound++) { + uint32_t bytes = g_sound_resource_byte_counts[sound - 1]; + if (bytes == 0) { + assert(sound_buffer(sound) == + win16_make_far_pointer(0x5555, sound)); + continue; + } + assert(g_loaded_sounds[loaded++] == sound); + assert(sound_buffer(sound) == win16_make_far_pointer( + (uint16_t)(0x7000 + sound), 0x0100)); + } + assert(loaded == 16 && g_loaded_count == loaded && g_resource_stage == 0); +} + +static void test_initializer_success(void) +{ + reset_sound_state(); + prime_sound_buffers(); + g_profile_value = 1; + g_wave_device_count = 2; + g_wave_caps_result = 0; + g_wave_support = 0; + tdkpin_initialize_sounds(); + assert(win16_read_u16(dgroup_at(DGROUP_DEVICE_COUNT)) == 2); + assert(win16_read_u8(dgroup_at(DGROUP_SOUND_ENABLED)) == 1); + assert(win16_read_u8(dgroup_at(DGROUP_SOUND_PLAYING)) == 0); + assert(win16_read_u8(dgroup_at(DGROUP_VOLUME_STEP)) == 0xff); + assert(g_wave_volume_calls == 0); + assert_loaded_resource_set(); + + reset_sound_state(); + prime_sound_buffers(); + g_wave_support = 4; + g_wave_volume = 0x1234abcd; + tdkpin_initialize_sounds(); + assert(g_wave_volume_calls == 1); + assert(win16_read_u8(dgroup_at(DGROUP_VOLUME_STEP)) == 170); + assert_loaded_resource_set(); +} + +static void test_stop_unload_and_play(void) +{ + win16_set_indeterminate_u16(0xbeef); + reset_calls(); + win16_write_u16(dgroup_at(DGROUP_DEVICE_COUNT), 0, 0); + win16_write_u8(dgroup_at(DGROUP_SOUND_PLAYING), 1); + assert(tdkpin_stop_sound_if_active() == 0xbeef); + assert(g_stop_calls == 0); + win16_write_u16(dgroup_at(DGROUP_DEVICE_COUNT), 0, 1); + win16_write_u8(dgroup_at(DGROUP_SOUND_PLAYING), 0); + assert(tdkpin_stop_sound_if_active() == 0xbeef); + assert(g_stop_calls == 0); + win16_write_u8(dgroup_at(DGROUP_SOUND_PLAYING), 1); + assert(tdkpin_stop_sound_if_active() == 0xbeef); + assert(g_stop_calls == 1); + assert(win16_read_u8(dgroup_at(DGROUP_SOUND_PLAYING)) == 1); + + reset_calls(); + for (uint16_t sound = 1; sound <= SOUND_COUNT; sound++) { + set_sound_buffer(sound, win16_make_far_pointer(0x7100, sound)); + } + tdkpin_unload_sounds(); + assert(g_stop_calls == 1 && g_free_count == SOUND_COUNT); + for (uint16_t index = 0; index < SOUND_COUNT; index++) { + assert(g_freed_sounds[index] == + win16_make_far_pointer(0x7100, (uint16_t)(index + 1))); + } + assert(win16_read_u8(dgroup_at(DGROUP_SOUND_PLAYING)) == 0); + + reset_calls(); + win16_write_u16(dgroup_at(DGROUP_DEVICE_COUNT), 0, 0); + tdkpin_unload_sounds(); + assert(g_free_count == 0); + + reset_calls(); + win16_write_u16(dgroup_at(DGROUP_DEVICE_COUNT), 0, 1); + win16_write_u8(dgroup_at(DGROUP_SOUND_ENABLED), 1); + win16_write_u8(dgroup_at(DGROUP_SOUND_PLAYING), 1); + set_sound_buffer(4, win16_make_far_pointer(0x7200, 0x4444)); + g_play_result = 1; + assert(tdkpin_play_sound(4) == 0xbeef); + assert(g_stop_calls == 1); + assert(g_played_sound == win16_make_far_pointer(0x7200, 0x4444)); + assert(g_play_flags == 5); + assert(win16_read_u8(dgroup_at(DGROUP_SOUND_PLAYING)) == 1); + + g_play_result = 0; + assert(tdkpin_play_sound(4) == 0xbeef); + assert(win16_read_u8(dgroup_at(DGROUP_SOUND_PLAYING)) == 0); + g_played_sound = 0; + (void)tdkpin_play_sound(3); /* Absent resource: exact size-table gate. */ + assert(g_played_sound == 0); + + /* The binary does not range-check: number zero reads the preceding dword. */ + win16_write_u8(dgroup_at(DGROUP_SOUND_ENABLED), 1); + win16_write_u8(dgroup_at(DGROUP_SOUND_PLAYING), 0); + win16_write_u8(dgroup_at(DGROUP_VOLUME_STEP), 0xaa); + g_play_result = 1; + (void)tdkpin_play_sound(0); + assert(g_played_sound == win16_make_far_pointer(0x00aa, 0x0001)); +} + +static void test_gameplay_sound_dispatcher(void) +{ + reset_calls(); + win16_write_u16(dgroup_at(DGROUP_DEVICE_COUNT), 0, 1); + win16_write_u8(dgroup_at(DGROUP_SOUND_ENABLED), 1); + win16_write_u8(dgroup_at(DGROUP_SOUND_PLAYING), 0); + win16_write_u8(dgroup_at(DGROUP_GAME_TILTED), 1); + set_sound_buffer(4, win16_make_far_pointer(0x7300, 0x4444)); + g_play_result = 1; + tdkpin_play_sound_if_not_tilted(4); + assert(g_played_sound == 0); + + win16_write_u8(dgroup_at(DGROUP_GAME_TILTED), 0); + win16_write_u8(dgroup_at(DGROUP_SOUND_ENABLED), 0); + tdkpin_play_sound_if_not_tilted(4); + assert(g_played_sound == 0); + + win16_write_u8(dgroup_at(DGROUP_SOUND_ENABLED), 1); + tdkpin_play_sound_if_not_tilted(4); + assert(g_played_sound == win16_make_far_pointer(0x7300, 0x4444)); + assert(g_play_flags == 5); +} + +int main(void) +{ + uint8_t stack_marker; + uintptr_t stack_base = (uintptr_t)&stack_marker - 0x8000; + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, g_dgroup, sizeof(g_dgroup), true); + win16_bind_ne_segment(2, 0x5100, g_code2, sizeof(g_code2), false); + win16_bind_segment(0x9000, (void *)stack_base, 0x10000, true); + win16_set_dgroup_selector(0x5000); + g_win16_instance = 0x4444; + initialize_image_data(); + + test_initializer_disabled_and_probe_failures(); + test_initializer_success(); + test_stop_unload_and_play(); + test_gameplay_sound_dispatcher(); + return 0; +} diff --git a/original/reconstructed/tests/test_stack.c b/original/reconstructed/tests/test_stack.c new file mode 100644 index 0000000..946c1f0 --- /dev/null +++ b/original/reconstructed/tests/test_stack.c @@ -0,0 +1,48 @@ +#include "../tdkpin_stack.h" + +#include +#include + +static jmp_buf g_error_jump; +static uint16_t g_error_code; + +_Noreturn void borland_runtime_error(uint16_t code) +{ + g_error_code = code; + longjmp(g_error_jump, 1); +} + +static void expect_stack_error(uint16_t requested_bytes) +{ + g_error_code = 0; + if (setjmp(g_error_jump) == 0) { + borland_check_stack(requested_bytes); + assert(false); + } + assert(g_error_code == 202); +} + +int main(void) +{ + static uint8_t stack[0x10000]; + win16_reset_segment_bindings(); + win16_bind_segment(0x7000, stack, sizeof(stack), true); + win16_set_stack_state(0x7000, 0x8000); + win16_write_stack_u16(0x000a, 0x1000); + win16_write_stack_u16(0x000e, 0x7000); + + tdkpin_initialize_stack_guard(); + assert(win16_read_stack_u16(0x000e) == 0x7000); + + borland_check_stack(0x2000); + assert(win16_read_stack_u16(0x000e) == 0x5c00); + + win16_write_stack_u16(0x000e, 0x7000); + borland_check_stack(0x6c00); + assert(win16_read_stack_u16(0x000e) == 0x1000); + + expect_stack_error(0xfc00); /* AX + 0x400 carry. */ + expect_stack_error(0x7c00); /* Required bytes collide with SP. */ + expect_stack_error(0x6c01); /* Remaining byte falls below SS:000a. */ + return 0; +} diff --git a/original/reconstructed/tests/test_status_render.c b/original/reconstructed/tests/test_status_render.c new file mode 100644 index 0000000..f43fe65 --- /dev/null +++ b/original/reconstructed/tests/test_status_render.c @@ -0,0 +1,139 @@ +#include "../tdkpin_render.h" + +#include + +static uint8_t g_dgroup[0x5000]; +static unsigned g_blit_calls; +static unsigned g_restore_a_calls; +static unsigned g_restore_b_calls; +static unsigned g_present_calls; + +static void assert_region( + INT16 height, INT16 width, INT16 y, INT16 x, + INT16 expected_height, INT16 expected_width, + INT16 expected_y, INT16 expected_x) +{ + assert(height == expected_height && width == expected_width); + assert(y == expected_y && x == expected_x); +} + +void tdkpin_blit_bitmap_to_background( + HBITMAP16 bitmap, + INT16 height, + INT16 width, + INT16 y, + INT16 x, + HDC16 reference_dc) +{ + assert(reference_dc == 0x1111); + if (height == 61) { + assert(bitmap == 0x4003); + assert_region(height, width, y, x, 61, 68, 300, 123); + } else { + assert(bitmap == 0x3002); + assert_region(height, width, y, x, 142, 146, 69, 380); + } + g_blit_calls++; +} + +void tdkpin_restore_background_region_a( + INT16 height, + INT16 width, + INT16 y, + INT16 x, + HDC16 reference_dc) +{ + assert(reference_dc == 0x1111); + if (height == 11) { + assert_region(height, width, y, x, 11, 11, 544, 123); + } else { + assert_region(height, width, y, x, 142, 146, 69, 380); + } + g_restore_a_calls++; +} + +void tdkpin_restore_background_region_b( + INT16 height, + INT16 width, + INT16 y, + INT16 x, + HDC16 reference_dc) +{ + assert(reference_dc == 0x1111); + if (height == 11) { + assert(width == 11 && y == 544); + assert(x == 169 || x == 146 || x == 100 || x == 77 || x == 123); + } else if (height == 61) { + assert_region(height, width, y, x, 61, 68, 300, 123); + } else { + assert_region(height, width, y, x, 142, 146, 69, 380); + } + g_restore_b_calls++; +} + +void tdkpin_present_background_region( + INT16 height, + INT16 width, + INT16 y, + INT16 x, + HDC16 destination) +{ + assert(destination == 0x1111); + if (height == 11) { + assert(width == 11 && y == 544); + assert(x == 169 || x == 146 || x == 123 || x == 100 || x == 77); + } else if (height == 61) { + assert_region(height, width, y, x, 61, 68, 300, 123); + } else { + assert_region(height, width, y, x, 142, 146, 69, 380); + } + g_present_calls++; +} + +static void reset_calls(void) +{ + g_blit_calls = 0; + g_restore_a_calls = 0; + g_restore_b_calls = 0; + g_present_calls = 0; +} + +int main(void) +{ + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, g_dgroup, sizeof(g_dgroup), true); + win16_set_dgroup_selector(0x5000); + win16_write_u8(win16_make_far_pointer(0x5000, 0x07d1), 2); + win16_write_u16(win16_make_far_pointer(0x5000, 0x086b), 0, 99); + win16_write_u32(win16_make_far_pointer(0x5000, 0x0982), 4, 140001); + win16_write_u16(win16_make_far_pointer(0x5000, 0x4319), 4, 0x3002); + + tdkpin_update_status_display(2, 0x1111); + assert(g_blit_calls == 1 && g_restore_a_calls == 1); + assert(g_restore_b_calls == 4 && g_present_calls == 6); + assert(win16_read_u16(win16_make_far_pointer(0x5000, 0x086b)) == 2); + + reset_calls(); + tdkpin_update_status_display(2, 0x1111); + assert(g_blit_calls == 0 && g_restore_a_calls == 0); + assert(g_restore_b_calls == 0 && g_present_calls == 0); + + reset_calls(); + tdkpin_update_status_display(0, 0x1111); + assert(g_blit_calls == 0 && g_restore_a_calls == 0); + assert(g_restore_b_calls == 6 && g_present_calls == 6); + assert(win16_read_u16(win16_make_far_pointer(0x5000, 0x086b)) == 99); + + reset_calls(); + tdkpin_update_status_display(5, 0x1111); + assert(g_restore_b_calls == 0 && g_present_calls == 0); + + win16_write_u16(win16_make_far_pointer(0x5000, 0x4321), 6, 0x4003); + reset_calls(); + tdkpin_draw_item_status(0, 0x1111); + assert(g_restore_b_calls == 1 && g_present_calls == 1); + reset_calls(); + tdkpin_draw_item_status(3, 0x1111); + assert(g_blit_calls == 1 && g_present_calls == 1); + return 0; +} diff --git a/original/reconstructed/tests/test_strings.c b/original/reconstructed/tests/test_strings.c new file mode 100644 index 0000000..0d2d2ac --- /dev/null +++ b/original/reconstructed/tests/test_strings.c @@ -0,0 +1,164 @@ +#include "../tdkpin_strings.h" + +#include +#include + +static uint8_t g_source[0x10000]; +static uint8_t g_destination[0x10000]; +static Win16FarPtr g_disposed_string; +static uint16_t g_disposed_bytes; +static Win16FarPtr g_allocated_string; +static uint16_t g_allocated_bytes; + +void borland_free_mem(Win16FarPtr block, uint16_t bytes) +{ + g_disposed_string = block; + g_disposed_bytes = bytes; +} + +Win16FarPtr borland_get_mem(uint16_t bytes) +{ + g_allocated_bytes = bytes; + return g_allocated_string; +} + +static Win16FarPtr source_at(uint16_t offset) +{ + return win16_make_far_pointer(0x1111, offset); +} + +static Win16FarPtr destination_at(uint16_t offset) +{ + return win16_make_far_pointer(0x2222, offset); +} + +static void reset_memory(void) +{ + memset(g_source, 0xcc, sizeof(g_source)); + memset(g_destination, 0xdd, sizeof(g_destination)); + win16_reset_segment_bindings(); + win16_bind_segment(0x1111, g_source, sizeof(g_source), true); + win16_bind_segment(0x2222, g_destination, sizeof(g_destination), true); +} + +static void test_length_end_and_copy(void) +{ + reset_memory(); + memcpy(&g_source[10], "Abc", 4); + assert(borland_far_strlen(source_at(10)) == 3); + assert(borland_far_strend(source_at(10)) == source_at(13)); + assert(borland_far_strcpy(destination_at(20), source_at(10)) == destination_at(20)); + assert(memcmp(&g_destination[20], "Abc", 4) == 0); + + g_destination[30] = 0xaa; + (void)borland_far_strncpy(destination_at(30), source_at(10), 2); + assert(g_destination[30] == 'A' && g_destination[31] == 'b'); + assert(g_destination[32] == 0); + + memset(&g_destination[40], 0xaa, 8); + (void)borland_far_strncpy(destination_at(40), source_at(10), 4); + assert(memcmp(&g_destination[40], "Abc\0\0", 5) == 0); + + reset_memory(); + assert(borland_far_strlen(source_at(0)) == 0xfffe); + assert(borland_far_strend(source_at(0)) == source_at(0xfffe)); +} + +static void test_memmove_and_concat(void) +{ + reset_memory(); + win16_fill_bytes(destination_at(20), 5, 0x5a); + assert(memcmp(&g_destination[20], "ZZZZZ", 5) == 0); + memcpy(&g_source[40], "copy", 4); + borland_far_copy(destination_at(40), source_at(40), 4); + assert(memcmp(&g_destination[40], "copy", 4) == 0); + + memcpy(&g_source[100], "abcdef", 6); + (void)borland_far_memmove(source_at(102), source_at(100), 4); + assert(memcmp(&g_source[100], "ababcd", 6) == 0); + + memcpy(&g_source[300], "cross", 5); + (void)borland_far_memmove(destination_at(500), source_at(300), 5); + assert(memcmp(&g_destination[500], "cross", 5) == 0); + + memcpy(&g_destination[100], "one", 4); + memcpy(&g_source[200], "two", 4); + assert(borland_far_strcat(destination_at(100), source_at(200)) == destination_at(100)); + assert(memcmp(&g_destination[100], "onetwo", 7) == 0); +} + +static void test_short_strings(void) +{ + reset_memory(); + g_source[20] = 3; + memcpy(&g_source[21], "xyz", 3); + (void)borland_short_to_c_string(destination_at(20), source_at(20)); + assert(memcmp(&g_destination[20], "xyz", 4) == 0); + + memcpy(&g_source[40], "hello", 6); + borland_c_to_short_string(destination_at(40), source_at(40)); + assert(g_destination[40] == 5); + assert(memcmp(&g_destination[41], "hello", 5) == 0); + + memset(&g_source[100], 'q', 260); + g_source[360] = 0; + borland_c_to_short_string(destination_at(100), source_at(100)); + assert(g_destination[100] == 4); + assert(memcmp(&g_destination[101], &g_source[100], 260) == 0); +} + +static void test_compare_and_search(void) +{ + reset_memory(); + memcpy(&g_source[100], "aBcD", 5); + memcpy(&g_destination[100], "Abce", 5); + assert(borland_far_strnicmp(source_at(100), destination_at(100), 3) == 0); + assert(borland_far_strnicmp(source_at(100), destination_at(100), 4) == -1); + assert(borland_far_strchr(source_at(100), 'B') == source_at(101)); + assert(borland_far_strchr(source_at(100), 0) == source_at(104)); + + memcpy(&g_source[200], "abca", 5); + assert(borland_far_strrchr(source_at(200), 'a') == source_at(203)); + assert(borland_far_strrchr(source_at(200), 0) == source_at(204)); + assert(borland_far_strrchr(source_at(200), 'z') == 0); +} + +static void test_dispose(void) +{ + reset_memory(); + g_disposed_string = 0; + g_disposed_bytes = 0; + borland_far_strdispose(0); + assert(g_disposed_string == 0 && g_disposed_bytes == 0); + memcpy(&g_source[100], "abc", 4); + borland_far_strdispose(source_at(100)); + assert(g_disposed_string == source_at(100)); + assert(g_disposed_bytes == 4); +} + +static void test_duplicate(void) +{ + reset_memory(); + g_allocated_string = destination_at(1000); + g_allocated_bytes = 0; + assert(borland_far_strdup(0) == 0); + g_source[50] = 0; + assert(borland_far_strdup(source_at(50)) == 0); + memcpy(&g_source[100], "copy", 5); + assert(borland_far_strdup(source_at(100)) == g_allocated_string); + assert(g_allocated_bytes == 5); + assert(memcmp(&g_destination[1000], "copy", 5) == 0); + g_allocated_string = 0; + assert(borland_far_strdup(source_at(100)) == 0); +} + +int main(void) +{ + test_length_end_and_copy(); + test_memmove_and_concat(); + test_short_strings(); + test_compare_and_search(); + test_dispose(); + test_duplicate(); + return 0; +} diff --git a/original/reconstructed/tests/test_system_timer.c b/original/reconstructed/tests/test_system_timer.c new file mode 100644 index 0000000..3c0b097 --- /dev/null +++ b/original/reconstructed/tests/test_system_timer.c @@ -0,0 +1,114 @@ +#include "../tdkpin_system_timer.h" + +#include + +static BorlandAllocationAttempt g_allocation; +static Win16FarPtr g_freed_object; +static uint16_t g_freed_size; +static uint16_t g_make_result; +static HWND16 g_make_recipient; +static uint16_t g_make_delay; +static uint16_t g_make_resolution; +static uint16_t g_make_one_shot; +static uint16_t g_killed_timer; + +BorlandAllocationAttempt borland_try_get_mem(uint16_t bytes) +{ + assert(bytes == 6); + return g_allocation; +} + +bool borland_try_free_mem(Win16FarPtr object, uint16_t bytes) +{ + g_freed_object = object; + g_freed_size = bytes; + return false; +} + +_Noreturn void borland_runtime_error(uint16_t code) +{ + (void)code; + assert(false); + __builtin_unreachable(); +} + +uint16_t SystemTimerMake16( + HWND16 recipient, + uint16_t delay_ms, + uint16_t resolution_ms, + uint16_t one_shot) +{ + g_make_recipient = recipient; + g_make_delay = delay_ms; + g_make_resolution = resolution_ms; + g_make_one_shot = one_shot; + return g_make_result; +} + +uint16_t TimeKillEvent16(uint16_t timer_id) +{ + g_killed_timer = timer_id; + return 0; +} + +int main(void) +{ + static uint8_t dgroup[0x1000]; + static uint8_t stack[0x10000]; + static uint8_t caller_object[32]; + static uint8_t allocated_object[32]; + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, dgroup, sizeof(dgroup), true); + win16_set_dgroup_selector(0x5000); + win16_bind_segment(0x6000, stack, sizeof(stack), true); + win16_set_stack_state(0x6000, 0x8000); + win16_write_stack_u16(0x000a, 0x1000); + win16_write_stack_u16(0x000e, 0x7fff); + win16_bind_segment( + 0x7000, caller_object, sizeof(caller_object), true); + win16_bind_segment( + 0x7100, allocated_object, sizeof(allocated_object), true); + win16_write_u16(win16_make_far_pointer(0x5000, 0x0200), 0, 6); + + Win16FarPtr caller = win16_make_far_pointer(0x7000, 4); + g_make_result = 0x4321; + Win16FarPtr result = tdkpin_system_timer_construct( + caller, 0x0200, 1, 7, 250, 0x1234); + assert(result == caller); + assert(win16_read_u16(caller) == 0x0200); + assert(win16_read_u16(win16_far_add_offset(caller, 2)) == 0x4321); + assert(win16_read_u16(win16_far_add_offset(caller, 4)) == 0x1234); + assert(g_make_recipient == 0x1234); + assert(g_make_delay == 250 && g_make_resolution == 7); + assert(g_make_one_shot == 0x7b01); + + g_killed_timer = 0; + tdkpin_system_timer_stop(caller); + assert(g_killed_timer == 0x4321); + assert(win16_read_u16(win16_far_add_offset(caller, 2)) == 0); + tdkpin_system_timer_stop(caller); + assert(g_killed_timer == 0x4321); + + Win16FarPtr allocated = win16_make_far_pointer(0x7100, 8); + g_allocation = (BorlandAllocationAttempt){allocated, false}; + g_make_result = 0; + g_freed_object = 0; + result = tdkpin_system_timer_construct( + 0, 0x0200, 0, 1, 20, 0x2222); + assert(result == 0); + assert(g_freed_object == allocated && g_freed_size == 6); + + g_make_result = 0; + g_freed_object = 0; + result = tdkpin_system_timer_construct( + caller, 0x0200, 0, 1, 20, 0x3333); + assert(result == caller && g_freed_object == 0); + + win16_write_u16(caller, 0, 0x0200); + win16_write_u16(caller, 2, 0x1111); + g_freed_object = 0; + tdkpin_system_timer_destruct(caller, 1); + assert(g_killed_timer == 0x1111); + assert(g_freed_object == caller && g_freed_size == 6); + return 0; +} diff --git a/original/reconstructed/tests/test_tables.c b/original/reconstructed/tests/test_tables.c new file mode 100644 index 0000000..9d13ff1 --- /dev/null +++ b/original/reconstructed/tests/test_tables.c @@ -0,0 +1,24 @@ +#include "../tdkpin_tables.h" + +#include + +int main(void) +{ + static uint8_t dgroup[0x10000]; + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, dgroup, sizeof(dgroup), true); + win16_set_dgroup_selector(0x5000); + + tdkpin_set_word_quad(0x1111, 0x2222, 0x3333, 0x4444, 1); + Win16FarPtr first = win16_make_far_pointer(0x5000, 0x426b); + assert(win16_read_u16(first) == 0x4444); + assert(win16_read_u16(win16_far_add_offset(first, 2)) == 0x3333); + assert(win16_read_u16(win16_far_add_offset(first, 4)) == 0x2222); + assert(win16_read_u16(win16_far_add_offset(first, 6)) == 0x1111); + + tdkpin_set_word_quad(0xaaaa, 0xbbbb, 0xcccc, 0xdddd, 20); + Win16FarPtr last = win16_make_far_pointer(0x5000, 0x4303); + assert(win16_read_u16(last) == 0xdddd); + assert(win16_read_u16(win16_far_add_offset(last, 6)) == 0xaaaa); + return 0; +} diff --git a/original/reconstructed/tests/test_timer_tick.c b/original/reconstructed/tests/test_timer_tick.c new file mode 100644 index 0000000..cd9e78b --- /dev/null +++ b/original/reconstructed/tests/test_timer_tick.c @@ -0,0 +1,538 @@ +#include "../tdkpin_timer_tick.h" + +#include "../tdkpin_borland_runtime.h" +#include "../tdkpin_collision_records.h" + +#include +#include +#include + +typedef struct { + HDC16 destination; + INT16 x; + INT16 y; + INT16 width; + INT16 height; + HDC16 source; + INT16 source_x; + INT16 source_y; + uint32_t raster_operation; +} BlitCall; + +static uint8_t g_dgroup[0x5000]; +static uint8_t g_objects[0x1000]; +static uint8_t g_stack[0x1000]; +static Win16FarPtr g_window; +static uint16_t g_refresh_ids[200]; +static size_t g_refresh_count; +static uint16_t g_restore_a_ids[32]; +static size_t g_restore_a_id_count; +static uint16_t g_restore_b_ids[32]; +static size_t g_restore_b_id_count; +static uint16_t g_save_slots[8]; +static size_t g_save_count; +static uint16_t g_load_slots[8]; +static size_t g_load_count; +static int32_t g_dynamic_records[8]; +static size_t g_dynamic_count; +static uint16_t g_sounds[8]; +static size_t g_sound_count; +static uint8_t g_claw_alternate; +static uint16_t g_claw_frame; +static unsigned g_claw_calls; +static unsigned g_render_ball_calls; +static unsigned g_rotate_calls; +static unsigned g_restore_previous_calls; +static unsigned g_finish_calls; +static unsigned g_simulate_calls; +static unsigned g_reset_calls; +static unsigned g_flipper_calls; +static unsigned g_drain_calls; +static unsigned g_initialize_calls; +static unsigned g_redraw_calls; +static unsigned g_progress_calls; +static unsigned g_panel_calls; +static int16_t g_last_item; +static unsigned g_item_calls; +static unsigned g_region_a_calls; +static unsigned g_region_b_calls; +static unsigned g_present_calls; +static BlitCall g_blits[16]; +static size_t g_blit_count; +static unsigned g_get_dc_calls; +static unsigned g_release_dc_calls; +static unsigned g_create_dc_calls; +static unsigned g_create_bitmap_calls; +static unsigned g_select_calls; +static unsigned g_delete_object_calls; +static unsigned g_delete_dc_calls; + +uint8_t g_borland_cpu_level = 2; + +_Noreturn void borland_runtime_error(uint16_t code) +{ + (void)code; + abort(); +} + +_Noreturn void win16_integer_divide_fault(void) +{ + abort(); +} + +void tdkpin_refresh_collision_record(uint16_t caller_bp, uint16_t id) +{ + assert(caller_bp == 0x0300); + g_refresh_ids[g_refresh_count++] = id; +} + +void tdkpin_restore_record_or_item_a(uint16_t caller_bp, uint16_t id) +{ + assert(caller_bp == 0x0300); + g_restore_a_ids[g_restore_a_id_count++] = id; +} + +void tdkpin_restore_record_b(uint16_t caller_bp, uint16_t id) +{ + assert(caller_bp == 0x0300); + g_restore_b_ids[g_restore_b_id_count++] = id; +} + +void tdkpin_save_ball_slot(uint16_t caller_bp, uint16_t slot) +{ + assert(caller_bp == 0x0300); + g_save_slots[g_save_count++] = slot; +} + +void tdkpin_load_ball_slot(uint16_t caller_bp, uint16_t slot) +{ + assert(caller_bp == 0x0300); + g_load_slots[g_load_count++] = slot; +} + +void tdkpin_update_dynamic_ball_record( + uint16_t caller_bp, int32_t displacement) +{ + assert(caller_bp == 0x0300); + g_dynamic_records[g_dynamic_count++] = displacement; +} + +void tdkpin_play_sound_if_not_tilted(uint16_t sound_number) +{ + g_sounds[g_sound_count++] = sound_number; +} + +void tdkpin_draw_claw_frame( + uint8_t alternate, uint16_t frame, HDC16 destination) +{ + assert(destination == 0x3333); + g_claw_alternate = alternate; + g_claw_frame = frame; + g_claw_calls++; +} + +void tdkpin_render_ball_from_caller_frame(uint16_t caller_bp) +{ + assert(caller_bp == 0x0300); + g_render_ball_calls++; +} + +void tdkpin_rotate_and_draw_targets(uint16_t caller_bp) +{ + assert(caller_bp == 0x0300); + g_rotate_calls++; +} + +void tdkpin_restore_previous_ball_region( + uint16_t caller_bp, uint8_t suppress_present) +{ + assert(caller_bp == 0x0300 && suppress_present == 0); + g_restore_previous_calls++; +} + +void tdkpin_finish_ball_or_advance_player(uint16_t caller_bp) +{ + assert(caller_bp == 0x0300); + g_finish_calls++; +} + +void tdkpin_simulate_ball_and_dispatch_collision(uint16_t caller_bp) +{ + assert(caller_bp == 0x0300); + g_simulate_calls++; +} + +void tdkpin_reset_ball_state(uint16_t caller_bp) +{ + assert(caller_bp == 0x0300); + g_reset_calls++; +} + +void tdkpin_update_flippers(uint16_t caller_bp) +{ + assert(caller_bp == 0x0300); + g_flipper_calls++; +} + +void tdkpin_drain_messages_except_input(void) +{ + g_drain_calls++; +} + +void tdkpin_initialize_player_state(uint16_t caller_bp) +{ + assert(caller_bp == 0x0300); + g_initialize_calls++; +} + +void tdkpin_redraw_all_players(uint16_t caller_bp) +{ + assert(caller_bp == 0x0300); + g_redraw_calls++; +} + +void tdkpin_refresh_player_progress_markers(uint16_t caller_bp) +{ + assert(caller_bp == 0x0300); + g_progress_calls++; +} + +void tdkpin_draw_panel_animation(uint16_t caller_bp) +{ + assert(caller_bp == 0x0300); + g_panel_calls++; +} + +void tdkpin_draw_item_status(int16_t item, HDC16 destination) +{ + assert(destination == 0x3333); + g_last_item = item; + g_item_calls++; +} + +void tdkpin_restore_background_region_a( + INT16 height, INT16 width, INT16 y, INT16 x, HDC16 dc) +{ + (void)height; + (void)width; + (void)y; + (void)x; + assert(dc == 0x3333); + g_region_a_calls++; +} + +void tdkpin_restore_background_region_b( + INT16 height, INT16 width, INT16 y, INT16 x, HDC16 dc) +{ + (void)height; + (void)width; + (void)y; + (void)x; + assert(dc == 0x3333); + g_region_b_calls++; +} + +void tdkpin_present_background_region( + INT16 height, INT16 width, INT16 y, INT16 x, HDC16 dc) +{ + (void)height; + (void)width; + (void)y; + (void)x; + assert(dc == 0x3333); + g_present_calls++; +} + +HDC16 GetDC16(HWND16 window) +{ + assert(window == 0x2222); + g_get_dc_calls++; + return 0x3333; +} + +INT16 ReleaseDC16(HWND16 window, HDC16 dc) +{ + assert(window == 0x2222 && dc == 0x3333); + g_release_dc_calls++; + return 1; +} + +HDC16 CreateCompatibleDC16(HDC16 dc) +{ + assert(dc == 0x3333); + g_create_dc_calls++; + return g_create_dc_calls == 1 ? 0x4444 : 0x5555; +} + +HBITMAP16 CreateCompatibleBitmap16(HDC16 dc, INT16 width, INT16 height) +{ + assert(dc == 0x3333 && width == 30 && height == 284); + g_create_bitmap_calls++; + return 0x6666; +} + +HGDIOBJ16 SelectObject16(HDC16 dc, HGDIOBJ16 object) +{ + assert(dc == 0x4444 || dc == 0x5555); + (void)object; + g_select_calls++; + return (HGDIOBJ16)(0x7000 + g_select_calls); +} + +BOOL16 BitBlt16( + HDC16 destination, + INT16 x, + INT16 y, + INT16 width, + INT16 height, + HDC16 source, + INT16 source_x, + INT16 source_y, + uint32_t raster_operation) +{ + g_blits[g_blit_count++] = (BlitCall){ + destination, x, y, width, height, + source, source_x, source_y, raster_operation, + }; + return 1; +} + +BOOL16 DeleteObject16(HGDIOBJ16 object) +{ + assert(object == 0x6666); + g_delete_object_calls++; + return 1; +} + +BOOL16 DeleteDC16(HDC16 dc) +{ + assert(dc == 0x4444 || dc == 0x5555); + g_delete_dc_calls++; + return 1; +} + +static Win16FarPtr record(uint16_t id) +{ + return win16_dgroup_pointer((uint16_t)( + 0x095b + id * sizeof(TdkpinCollisionRecord))); +} + +static void prepare_fixture(void) +{ + memset(g_dgroup, 0, sizeof(g_dgroup)); + memset(g_objects, 0, sizeof(g_objects)); + memset(g_stack, 0, sizeof(g_stack)); + win16_reset_segment_bindings(); + win16_bind_segment(0x7000, g_objects, sizeof(g_objects), true); + win16_bind_segment(0x7200, g_dgroup, sizeof(g_dgroup), true); + win16_bind_segment(0x7300, g_stack, sizeof(g_stack), true); + win16_set_dgroup_selector(0x7200); + win16_set_stack_state(0x7300, 0x0300); + g_window = win16_make_far_pointer(0x7000, 0); + win16_write_u16(g_window, 4, 0x2222); + win16_write_u8(win16_dgroup_pointer(0x07c4), 1); + memset(g_refresh_ids, 0, sizeof(g_refresh_ids)); + memset(g_restore_a_ids, 0, sizeof(g_restore_a_ids)); + memset(g_restore_b_ids, 0, sizeof(g_restore_b_ids)); + g_refresh_count = g_restore_a_id_count = g_restore_b_id_count = 0; + g_save_count = g_load_count = g_dynamic_count = g_sound_count = 0; + g_claw_calls = g_render_ball_calls = g_rotate_calls = 0; + g_restore_previous_calls = g_finish_calls = g_simulate_calls = 0; + g_reset_calls = g_flipper_calls = g_drain_calls = 0; + g_initialize_calls = g_redraw_calls = g_progress_calls = 0; + g_panel_calls = g_item_calls = 0; + g_region_a_calls = g_region_b_calls = g_present_calls = 0; + g_blit_count = g_get_dc_calls = g_release_dc_calls = 0; + g_create_dc_calls = g_create_bitmap_calls = g_select_calls = 0; + g_delete_object_calls = g_delete_dc_calls = 0; +} + +static void test_guard_and_refresh_epilogue(void) +{ + prepare_fixture(); + win16_write_u8(win16_dgroup_pointer(0x07c4), 0); + tdkpin_timer_tick_with_frame(0x0300, g_window); + assert(g_flipper_calls == 0 && g_drain_calls == 0); + + prepare_fixture(); + win16_write_u8(win16_dgroup_pointer(0x07c5), 1); + win16_write_u16(g_window, 0x5e, 2); + tdkpin_timer_tick_with_frame(0x0300, g_window); + assert(g_refresh_count == 175); + assert(g_refresh_ids[0] == 1 && g_refresh_ids[174] == 175); + assert(win16_read_u8(win16_dgroup_pointer(0x07c5)) == 0); + assert(win16_read_u32(win16_dgroup_pointer(0x0876)) == 1); + assert(g_flipper_calls == 1 && g_drain_calls == 1); + assert(win16_read_u8(win16_far_add_offset(g_window, 0x51)) == 0); + assert(win16_read_u16(win16_far_add_offset(g_window, 0x5e)) == 1); +} + +static void test_claw_release(void) +{ + prepare_fixture(); + win16_write_u8(win16_far_add_offset(g_window, 0x0bdd), 1); + win16_write_u8(win16_far_add_offset(g_window, 0x0bdf), 1); + win16_write_u8(win16_dgroup_pointer(0x07ca), 1); + win16_write_u16(win16_dgroup_pointer(0x086d), 0, 2); + win16_write_u16(win16_dgroup_pointer(0x086f), 0, 2); + win16_write_u32(g_window, 0x56, 1000); + tdkpin_timer_tick_with_frame(0x0300, g_window); + assert(g_claw_calls == 1 && g_claw_alternate == 0 && g_claw_frame == 2); + assert(win16_read_u16(win16_dgroup_pointer(0x086f)) == 10); + assert((int32_t)win16_read_u32(win16_dgroup_pointer(0x07d3)) == 259000); + assert((int32_t)win16_read_u32(win16_dgroup_pointer(0x07d7)) == 81000); + assert((int32_t)win16_read_u32( + win16_far_add_offset(g_window, 0x0baa)) == -450); + assert((int32_t)win16_read_u32( + win16_far_add_offset(g_window, 0x0bae)) == 50); + assert(g_save_count == 1 && g_save_slots[0] == 1); + assert(g_render_ball_calls == 1); + assert(g_sound_count == 1 && g_sounds[0] == 16); + assert(win16_read_u8(win16_far_add_offset(g_window, 0x0bdf)) == 0); + assert(g_simulate_calls == 1); +} + +static void test_multiball_promotion(void) +{ + prepare_fixture(); + win16_write_u8(win16_far_add_offset(g_window, 0x0bdd), 1); + win16_write_u8(win16_far_add_offset(g_window, 0x0bdf), 1); + win16_write_u8(win16_far_add_offset(g_window, 0x61), 2); + win16_write_u8(win16_far_add_offset(g_window, 0x0be1), 1); + win16_write_u8(win16_dgroup_pointer(0x424c), 1); + win16_write_u32(win16_dgroup_pointer(0x07e7), 0, 0x11111111); + win16_write_u32(win16_dgroup_pointer(0x07ef), 0, 0x22222222); + win16_write_u32(win16_dgroup_pointer(0x07f7), 0, 0x33333333); + win16_write_u32(win16_dgroup_pointer(0x07ff), 0, 0x44444444); + win16_write_u32(win16_dgroup_pointer(0x0807), 0, 0x55555555); + for (uint16_t index = 0; index < 6; index++) { + win16_write_u8( + win16_dgroup_pointer((uint16_t)(0x0811 + index)), + (uint8_t)(0xa0 + index)); + } + tdkpin_timer_tick_with_frame(0x0300, g_window); + assert(win16_read_u8(win16_far_add_offset(g_window, 0x61)) == 1); + assert(win16_read_u8(win16_dgroup_pointer(0x41f9)) == 1); + assert(win16_read_u8(win16_dgroup_pointer(0x424c)) == 0); + assert(win16_read_u32(win16_dgroup_pointer(0x07e3)) == 0x11111111); + assert(win16_read_u32(win16_dgroup_pointer(0x07eb)) == 0x22222222); + assert(win16_read_u32(win16_dgroup_pointer(0x07f3)) == 0x33333333); + assert(win16_read_u32(win16_dgroup_pointer(0x07fb)) == 0x44444444); + assert(win16_read_u32(win16_dgroup_pointer(0x0803)) == 0x55555555); + assert(g_load_count == 1 && g_load_slots[0] == 0); + assert(g_finish_calls == 0); +} + +static void test_multiball_spawn(void) +{ + prepare_fixture(); + win16_write_u8(win16_far_add_offset(g_window, 0x0bdd), 1); + win16_write_u8(win16_far_add_offset(g_window, 0x0bdf), 1); + win16_write_u8(win16_far_add_offset(g_window, 0x0be0), 1); + win16_write_u8(win16_dgroup_pointer(0x07d1), 1); + win16_write_u32(win16_dgroup_pointer(0x3969), 0, 123000); + win16_write_u32(win16_dgroup_pointer(0x396d), 0, 456000); + win16_write_u32(g_window, 0x56, 1000); + tdkpin_timer_tick_with_frame(0x0300, g_window); + assert(g_save_count == 2 && g_save_slots[0] == 0 && g_save_slots[1] == 1); + assert(g_dynamic_count == 2 && + g_dynamic_records[0] == 1 && g_dynamic_records[1] == 2); + assert(g_restore_previous_calls == 1); + assert(g_restore_b_id_count == 1 && g_restore_b_ids[0] == 1020); + assert((int32_t)win16_read_u32(win16_dgroup_pointer(0x07d3)) == 123000); + assert((int32_t)win16_read_u32(win16_dgroup_pointer(0x07d7)) == 456000); + assert((int32_t)win16_read_u32( + win16_far_add_offset(g_window, 0x0bae)) == 800); + assert(win16_read_u8(win16_far_add_offset(g_window, 0x61)) == 2); + assert(win16_read_u8(win16_dgroup_pointer(0x0874)) == 1); + assert(win16_read_u8(win16_far_add_offset(g_window, 0x0be0)) == 0); +} + +static void test_intro_tick_32_and_marquee(void) +{ + prepare_fixture(); + win16_write_u8(win16_dgroup_pointer(0x07c9), 1); + win16_write_u32(win16_dgroup_pointer(0x0876), 0, 31); + win16_write_u16(record(90), 0x4b, 10); + win16_write_u16(record(90), 0x4d, 20); + win16_write_u16(record(90), 0x4f, 50); + win16_write_u16(record(90), 0x51, 60); + tdkpin_timer_tick_with_frame(0x0300, g_window); + assert(g_restore_a_id_count == 5); + assert(g_restore_a_ids[0] == 140); + assert(g_restore_a_ids[1] == 1001); + assert(g_restore_a_ids[2] == 153 && + g_restore_a_ids[3] == 154 && g_restore_a_ids[4] == 6); + assert(g_restore_b_id_count == 1 && g_restore_b_ids[0] == 1002); + assert(g_region_a_calls == 2 && g_region_b_calls == 1); + assert(g_present_calls == 3); + assert(g_item_calls == 1 && g_last_item == 0); + + prepare_fixture(); + win16_write_u8(win16_dgroup_pointer(0x07c9), 1); + win16_write_u32(win16_dgroup_pointer(0x0876), 0, 5); + win16_write_u16(win16_dgroup_pointer(0x085f), 0, 0x7777); + win16_write_u16(win16_dgroup_pointer(0x0861), 0, 0x8888); + tdkpin_timer_tick_with_frame(0x0300, g_window); + assert(win16_read_u32(win16_dgroup_pointer(0x087a)) == 1); + assert(g_create_dc_calls == 2 && g_create_bitmap_calls == 1); + assert(g_blit_count == 4); + assert(g_blits[0].destination == 0x5555 && + g_blits[0].width == 30 && g_blits[0].height == 100 && + g_blits[0].source_x == 473 && g_blits[0].source_y == 277); + assert(g_blits[2].height == 237 && g_blits[2].source_x == 400); + assert(g_blits[3].destination == 0x3333 && + g_blits[3].x == 233 && g_blits[3].y == 372); + assert(g_select_calls == 5 && g_delete_object_calls == 1); + assert(g_delete_dc_calls == 2); +} + +static void test_panel_and_game_initialization(void) +{ + prepare_fixture(); + win16_write_u8(win16_dgroup_pointer(0x07c8), 1); + win16_write_u32(win16_dgroup_pointer(0x0851), 0, 1); + for (uint16_t id = 129; id <= 133; id++) { + win16_write_u16(record(id), 0x43, 0xffff); + } + tdkpin_timer_tick_with_frame(0x0300, g_window); + assert(win16_read_u8(win16_far_add_offset(g_window, 0x0bdf)) == 1); + assert(win16_read_u32(win16_dgroup_pointer(0x0851)) == 2); + assert(g_panel_calls == 1); + for (uint16_t id = 129; id <= 133; id++) { + assert(win16_read_u16(win16_far_add_offset(record(id), 0x43)) == 0); + } + + prepare_fixture(); + win16_write_u8(win16_dgroup_pointer(0x07c8), 1); + win16_write_u32(win16_dgroup_pointer(0x0851), 0, 281); + win16_write_u8(win16_dgroup_pointer(0x07d1), 1); + for (uint16_t item = 15; item <= 19; item++) { + win16_write_u8( + win16_far_add_offset(g_window, (uint16_t)(0x47b + 20 + item)), 1); + } + tdkpin_timer_tick_with_frame(0x0300, g_window); + assert(win16_read_u8(win16_dgroup_pointer(0x07c8)) == 0); + assert(win16_read_u8(win16_far_add_offset(g_window, 0x0bdf)) == 0); + assert(win16_read_u32(win16_dgroup_pointer(0x0851)) == 0); + assert(g_region_b_calls == 1 && g_present_calls == 1); + + prepare_fixture(); + win16_write_u16(win16_dgroup_pointer(0x081f), 0, 0xffff); + tdkpin_timer_tick_with_frame(0x0300, g_window); + assert(g_initialize_calls == 1 && g_redraw_calls == 1); + assert(g_progress_calls == 1 && g_reset_calls == 1); + assert(g_region_b_calls == 1 && g_present_calls == 1); + assert(win16_read_u32(win16_dgroup_pointer(0x0876)) == 0); +} + +int main(void) +{ + test_guard_and_refresh_epilogue(); + test_claw_release(); + test_multiball_promotion(); + test_multiball_spawn(); + test_intro_tick_32_and_marquee(); + test_panel_and_game_initialization(); + return 0; +} diff --git a/original/reconstructed/tests/test_tpwincrt_lifecycle.c b/original/reconstructed/tests/test_tpwincrt_lifecycle.c new file mode 100644 index 0000000..19fb5ff --- /dev/null +++ b/original/reconstructed/tests/test_tpwincrt_lifecycle.c @@ -0,0 +1,327 @@ +#include "../tdkpin_tpwincrt_lifecycle.h" + +#include "../tdkpin_borland_files.h" + +#include +#include +#include + +HINSTANCE16 g_win16_previous_instance; +HINSTANCE16 g_win16_instance; +uint16_t g_win16_show_command; +Win16FarPtr g_borland_command_line; +uint16_t g_borland_windows_mode; +uint16_t g_borland_huge_pointer_increment; +uint8_t g_borland_cpu_level; + +HWND16 g_tpwincrt_window; +uint8_t g_tpwincrt_window_created; +uint8_t g_tpwincrt_break_check_enabled; +WNDCLASS16 g_tpwincrt_window_class; +int16_t g_tpwincrt_initial_x; +int16_t g_tpwincrt_initial_y; +int16_t g_tpwincrt_initial_width; +int16_t g_tpwincrt_initial_height; +const char g_tpwincrt_inactive_format[14] = "(Inactive %s)"; +char g_tpwincrt_window_title[80]; +Win16FarPtr g_tpwincrt_saved_exit_proc; + +Win16FarPtr g_borland_exit_proc; +uint16_t g_borland_error_offset; +uint16_t g_borland_error_segment; +_Atomic uint16_t g_borland_io_result; +uint8_t g_borland_file_mode; + +static unsigned g_create_calls; +static Win16FarPtr g_create_class; +static Win16FarPtr g_create_title; +static uint32_t g_create_style; +static INT16 g_create_x; +static INT16 g_create_y; +static INT16 g_create_width; +static INT16 g_create_height; +static HINSTANCE16 g_create_instance; +static unsigned g_show_calls; +static unsigned g_update_calls; +static unsigned g_icon_calls; +static unsigned g_cursor_calls; +static unsigned g_register_calls; +static unsigned g_text_init_calls; +static Win16FarPtr g_text_records[2]; +static unsigned g_reset_calls; +static unsigned g_rewrite_calls; +static unsigned g_require_calls; +static unsigned g_module_name_calls; +static unsigned g_oem_calls; +static unsigned g_set_title_calls; +static unsigned g_get_menu_calls; +static unsigned g_enable_calls; +static unsigned g_get_message_calls; +static unsigned g_translate_calls; +static unsigned g_dispatch_calls; + +HWND16 CreateWindow16( + Win16FarPtr class_name, + Win16FarPtr window_name, + uint32_t style, + INT16 x, + INT16 y, + INT16 width, + INT16 height, + HWND16 parent, + HMENU16 menu, + HINSTANCE16 instance, + Win16FarPtr parameter) +{ + assert(parent == 0 && menu == 0 && parameter == 0); + g_create_calls++; + g_create_class = class_name; + g_create_title = window_name; + g_create_style = style; + g_create_x = x; + g_create_y = y; + g_create_width = width; + g_create_height = height; + g_create_instance = instance; + return 0x4321; +} + +BOOL16 ShowWindow16(HWND16 window, INT16 command) +{ + assert(window == 0x4321 && command == (INT16)g_win16_show_command); + g_show_calls++; + return 1; +} + +BOOL16 UpdateWindow16(HWND16 window) +{ + assert(window == g_tpwincrt_window); + g_update_calls++; + return 1; +} + +HICON16 LoadIcon16(HINSTANCE16 instance, Win16FarPtr resource) +{ + assert(instance == 0 && resource == win16_make_far_pointer(0, 0x7f00)); + g_icon_calls++; + return 0x1111; +} + +HCURSOR16 LoadCursor16(HINSTANCE16 instance, Win16FarPtr resource) +{ + assert(instance == 0 && resource == win16_make_far_pointer(0, 0x7f00)); + g_cursor_calls++; + return 0x2222; +} + +uint16_t RegisterClass16(const WNDCLASS16 *window_class) +{ + assert(window_class == &g_tpwincrt_window_class); + assert(window_class->instance == g_win16_instance); + assert(window_class->icon == 0x1111 && window_class->cursor == 0x2222); + assert(window_class->background_brush == 6); + g_register_calls++; + return 1; +} + +void tpwincrt_initialize_text_record(Win16FarPtr record) +{ + assert(g_text_init_calls < 2); + g_text_records[g_text_init_calls++] = record; +} + +void borland_reset_file(Win16FarPtr record) +{ + assert(record == win16_dgroup_pointer(0x4b38)); + g_reset_calls++; +} + +void borland_rewrite_file(Win16FarPtr record) +{ + assert(record == win16_dgroup_pointer(0x4c38)); + g_rewrite_calls++; +} + +void borland_require_io_success(void) +{ + g_require_calls++; +} + +UINT16 GetModuleFileNameFar16( + HINSTANCE16 module, Win16FarPtr buffer, UINT16 size) +{ + assert(module == g_win16_instance); + assert(buffer == win16_dgroup_pointer(0x4a6e) && size == 0x50); + g_module_name_calls++; + return 7; +} + +INT16 OemToAnsi16(Win16FarPtr source, Win16FarPtr destination) +{ + assert(source == win16_dgroup_pointer(0x4a6e)); + assert(destination == source); + g_oem_calls++; + return 1; +} + +INT16 wvsprintf16( + char *output, const char *format, const uint16_t *arguments) +{ + assert(format == g_tpwincrt_inactive_format); + Win16FarPtr title = win16_dgroup_pointer(0x4a6e); + assert(arguments[0] == win16_far_offset(title)); + assert(arguments[1] == win16_far_selector(title)); + memcpy(output, "inactive", 9); + return 8; +} + +BOOL16 SetWindowText16(HWND16 window, const char *text) +{ + assert(window == g_tpwincrt_window && strcmp(text, "inactive") == 0); + g_set_title_calls++; + return 1; +} + +HMENU16 GetSystemMenu16(HWND16 window, BOOL16 revert) +{ + assert(window == g_tpwincrt_window && revert == 0); + g_get_menu_calls++; + return 0x7777; +} + +BOOL16 EnableMenuItem16(HMENU16 menu, UINT16 item, UINT16 flags) +{ + assert(menu == 0x7777 && item == 0xf060 && flags == 0); + g_enable_calls++; + return 1; +} + +BOOL16 GetMessage16( + MSG16 *message, + HWND16 window, + UINT16 minimum_message, + UINT16 maximum_message) +{ + assert(window == 0 && minimum_message == 0 && maximum_message == 0); + g_get_message_calls++; + message->message = WIN16_WM_PAINT; + return g_get_message_calls < 3; +} + +BOOL16 TranslateMessage16(const MSG16 *message) +{ + assert(message->message == WIN16_WM_PAINT); + g_translate_calls++; + return 1; +} + +LRESULT16 DispatchMessage16(const MSG16 *message) +{ + assert(message->message == WIN16_WM_PAINT); + g_dispatch_calls++; + return 0; +} + +static void reset_counts(void) +{ + g_create_calls = 0; + g_show_calls = 0; + g_update_calls = 0; + g_icon_calls = 0; + g_cursor_calls = 0; + g_register_calls = 0; + g_text_init_calls = 0; + g_reset_calls = 0; + g_rewrite_calls = 0; + g_require_calls = 0; + g_module_name_calls = 0; + g_oem_calls = 0; + g_set_title_calls = 0; + g_get_menu_calls = 0; + g_enable_calls = 0; + g_get_message_calls = 0; + g_translate_calls = 0; + g_dispatch_calls = 0; +} + +int main(void) +{ + static uint8_t dgroup[0x6000]; + static uint8_t code[0x3000]; + win16_reset_segment_bindings(); + win16_bind_segment(0x7000, dgroup, sizeof(dgroup), true); + win16_set_dgroup_selector(0x7000); + win16_bind_ne_segment(2, 0x6000, code, sizeof(code), false); + + g_tpwincrt_window_class.class_name = + win16_make_far_pointer(0x7000, 0x057c); + g_tpwincrt_initial_x = (int16_t)0x8000; + g_tpwincrt_initial_y = (int16_t)0x8000; + g_tpwincrt_initial_width = (int16_t)0x8000; + g_tpwincrt_initial_height = (int16_t)0x8000; + g_win16_instance = 0x1234; + g_win16_show_command = 7; + + reset_counts(); + g_tpwincrt_window_created = 0; + tpwincrt_create_window(); + assert(g_create_calls == 1 && g_show_calls == 1 && g_update_calls == 1); + assert(g_tpwincrt_window == 0x4321); + assert(g_create_class == g_tpwincrt_window_class.class_name); + assert(g_create_title == win16_dgroup_pointer(0x4a6e)); + assert(g_create_style == 0x00ff0000u); + assert(g_create_x == (int16_t)0x8000 && + g_create_y == (int16_t)0x8000); + assert(g_create_width == (int16_t)0x8000 && + g_create_height == (int16_t)0x8000); + assert(g_create_instance == g_win16_instance); + g_tpwincrt_window_created = 1; + tpwincrt_create_window(); + assert(g_create_calls == 1); + + reset_counts(); + g_win16_previous_instance = 0; + g_borland_exit_proc = win16_make_far_pointer(0x5555, 0x4444); + tpwincrt_initialize_runtime_unit(); + assert(g_icon_calls == 1 && g_cursor_calls == 1 && g_register_calls == 1); + assert(g_text_init_calls == 2); + assert(g_text_records[0] == win16_dgroup_pointer(0x4b38)); + assert(g_text_records[1] == win16_dgroup_pointer(0x4c38)); + assert(g_reset_calls == 1 && g_rewrite_calls == 1 && g_require_calls == 2); + assert(g_module_name_calls == 1 && g_oem_calls == 1); + assert(g_tpwincrt_saved_exit_proc == + win16_make_far_pointer(0x5555, 0x4444)); + assert(g_borland_exit_proc == + win16_make_far_pointer(0x6000, 0x24a5)); + + reset_counts(); + g_win16_previous_instance = 1; + g_borland_exit_proc = 0; + tpwincrt_initialize_runtime_unit(); + assert(g_icon_calls == 0 && g_cursor_calls == 0 && g_register_calls == 0); + assert(g_text_init_calls == 2 && g_reset_calls == 1 && g_rewrite_calls == 1); + + reset_counts(); + g_tpwincrt_saved_exit_proc = win16_make_far_pointer(0xaaaa, 0xbbbb); + g_borland_exit_proc = 0; + g_tpwincrt_window_created = 1; + g_tpwincrt_window = 0x4321; + g_borland_error_offset = 0; + g_borland_error_segment = 0; + g_tpwincrt_break_check_enabled = 1; + tpwincrt_shutdown_exit_proc(); + assert(g_borland_exit_proc == g_tpwincrt_saved_exit_proc); + assert(g_set_title_calls == 1 && g_get_menu_calls == 1 && + g_enable_calls == 1); + assert(g_tpwincrt_break_check_enabled == 0); + assert(g_get_message_calls == 3); + assert(g_translate_calls == 2 && g_dispatch_calls == 2); + + reset_counts(); + g_borland_exit_proc = 0; + g_borland_error_offset = 1; + tpwincrt_shutdown_exit_proc(); + assert(g_borland_exit_proc == g_tpwincrt_saved_exit_proc); + assert(g_set_title_calls == 0 && g_get_message_calls == 0); + return 0; +} diff --git a/original/reconstructed/tests/test_tpwincrt_text.c b/original/reconstructed/tests/test_tpwincrt_text.c new file mode 100644 index 0000000..46ba213 --- /dev/null +++ b/original/reconstructed/tests/test_tpwincrt_text.c @@ -0,0 +1,356 @@ +#include "../tdkpin_tpwincrt_text.h" +#include "../tdkpin_borland_files.h" + +#include +#include +#include + +HWND16 g_tpwincrt_window; +uint16_t g_tpwincrt_columns; +uint16_t g_tpwincrt_rows; +uint16_t g_tpwincrt_cursor_column; +uint16_t g_tpwincrt_cursor_row; +uint16_t g_tpwincrt_view_column; +uint16_t g_tpwincrt_view_row; +uint8_t g_tpwincrt_break_check_enabled; +uint8_t g_tpwincrt_auto_scroll; +uint8_t g_tpwincrt_ctrl_z_is_eof; +uint16_t g_tpwincrt_input_count; +uint16_t g_tpwincrt_ring_row_origin; +uint8_t g_tpwincrt_window_created; +uint8_t g_tpwincrt_has_focus; +uint8_t g_tpwincrt_caret_enabled; +uint8_t g_tpwincrt_paint_message_active; +Win16FarPtr g_tpwincrt_screen_buffer; +uint16_t g_tpwincrt_character_width; +uint16_t g_tpwincrt_character_height; +uint16_t g_tpwincrt_caret_y_offset; +HDC16 g_tpwincrt_paint_dc; +PAINTSTRUCT16 g_tpwincrt_paint; +HGDIOBJ16 g_tpwincrt_previous_font; +uint16_t g_tpwincrt_visible_columns; +uint16_t g_tpwincrt_visible_rows; +uint16_t g_tpwincrt_max_view_column; +uint16_t g_tpwincrt_max_view_row; +uint8_t g_tpwincrt_input_buffer[64]; +_Atomic uint16_t g_borland_io_result; +uint8_t g_borland_file_mode; + +static unsigned g_begin_calls; +static unsigned g_end_calls; +static unsigned g_draw_calls; +static INT16 g_last_x; +static INT16 g_last_y; +static INT16 g_last_draw_count; +static unsigned g_scroll_cursor_calls; +static unsigned g_create_window_calls; +static unsigned g_beep_calls; +static unsigned g_scroll_window_calls; +static INT16 g_scroll_delta_y; +static unsigned g_update_calls; +static unsigned g_create_caret_calls; +static unsigned g_destroy_caret_calls; +static unsigned g_wait_calls; +static MSG16 g_messages[4]; +static unsigned g_message_count; +static unsigned g_message_index; +static unsigned g_translate_calls; +static unsigned g_dispatch_calls; + +Win16FarPtr tpwincrt_cell_pointer(int16_t row, int16_t column) +{ + uint16_t physical = (uint16_t)(row + g_tpwincrt_ring_row_origin); + if ((int16_t)physical >= (int16_t)g_tpwincrt_rows) { + physical = (uint16_t)(physical - g_tpwincrt_rows); + } + uint16_t offset = (uint16_t)( + win16_far_offset(g_tpwincrt_screen_buffer) + + physical * g_tpwincrt_columns + (uint16_t)column); + return win16_make_far_pointer( + win16_far_selector(g_tpwincrt_screen_buffer), offset); +} + +void tpwincrt_begin_drawing(void) +{ + g_begin_calls++; + g_tpwincrt_paint_dc = 0x3333; +} + +void tpwincrt_end_drawing(void) +{ + g_end_calls++; +} + +void tpwincrt_scroll_cursor_into_view(void) +{ + g_scroll_cursor_calls++; +} + +void tpwincrt_create_window(void) +{ + g_create_window_calls++; +} + +void tpwincrt_create_caret(void) +{ + g_create_caret_calls++; +} + +void tpwincrt_destroy_caret(void) +{ + g_destroy_caret_calls++; +} + +_Noreturn void tpwincrt_abort_on_ctrl_c(void) +{ + assert(false); + __builtin_unreachable(); +} + +BOOL16 TextOut16( + HDC16 dc, INT16 x, INT16 y, Win16FarPtr text, INT16 count) +{ + assert(dc == 0x3333); + (void)text; + g_draw_calls++; + g_last_x = x; + g_last_y = y; + g_last_draw_count = count; + return 1; +} + +BOOL16 ScrollWindow16( + HWND16 window, + INT16 delta_x, + INT16 delta_y, + Win16FarPtr scroll_rect, + Win16FarPtr clip_rect) +{ + assert(window == g_tpwincrt_window && delta_x == 0); + assert(scroll_rect == 0 && clip_rect == 0); + g_scroll_window_calls++; + g_scroll_delta_y = delta_y; + return 1; +} + +BOOL16 UpdateWindow16(HWND16 window) +{ + assert(window == g_tpwincrt_window); + g_update_calls++; + return 1; +} + +BOOL16 MessageBeep16(UINT16 type) +{ + assert(type == 0); + g_beep_calls++; + return 1; +} + +BOOL16 PeekMessage16( + MSG16 *message, + HWND16 window, + UINT16 minimum_message, + UINT16 maximum_message, + UINT16 remove_message) +{ + assert(window == 0 && minimum_message == 0 && maximum_message == 0); + assert(remove_message == 1); + if (g_message_index == g_message_count) { + return 0; + } + *message = g_messages[g_message_index++]; + return 1; +} + +BOOL16 TranslateMessage16(const MSG16 *message) +{ + assert(message->message == g_messages[g_translate_calls].message); + g_translate_calls++; + return 1; +} + +LRESULT16 DispatchMessage16(const MSG16 *message) +{ + assert(message->message == g_messages[g_dispatch_calls].message); + g_dispatch_calls++; + return 0; +} + +BOOL16 WaitMessage16(void) +{ + g_wait_calls++; + g_tpwincrt_input_buffer[0] = 'Z'; + g_tpwincrt_input_count = 1; + return 1; +} + +void borland_fill_bytes( + Win16FarPtr destination, uint16_t count, uint8_t value) +{ + for (uint16_t index = 0; index != count; index++) { + win16_write_u8(win16_far_add_offset(destination, index), value); + } +} + +void borland_move_bytes( + Win16FarPtr destination, Win16FarPtr source, uint16_t count) +{ + assert(win16_far_offset(destination) == 0x4af8); + assert(win16_far_offset(source) == 0x4af9); + memmove(g_tpwincrt_input_buffer, g_tpwincrt_input_buffer + 1, count); +} + +static void reset_observations(void) +{ + g_begin_calls = 0; + g_end_calls = 0; + g_draw_calls = 0; + g_scroll_cursor_calls = 0; + g_create_window_calls = 0; + g_beep_calls = 0; + g_scroll_window_calls = 0; + g_update_calls = 0; + g_create_caret_calls = 0; + g_destroy_caret_calls = 0; + g_wait_calls = 0; + g_message_count = 0; + g_message_index = 0; + g_translate_calls = 0; + g_dispatch_calls = 0; +} + +int main(void) +{ + static uint8_t dgroup[0x6000]; + static uint8_t screen[0x100]; + static uint8_t code[0x3000]; + uint8_t stack_anchor = 0; + uintptr_t stack_base = (uintptr_t)&stack_anchor - 0x8000; + + win16_reset_segment_bindings(); + win16_bind_segment(0x7000, dgroup, sizeof(dgroup), true); + win16_set_dgroup_selector(0x7000); + win16_bind_segment(0x7100, screen, sizeof(screen), true); + win16_bind_ne_segment(2, 0x6000, code, sizeof(code), false); + win16_bind_segment(0x7200, (void *)stack_base, 0x10000, true); + + g_tpwincrt_window = 0x2222; + g_tpwincrt_columns = 5; + g_tpwincrt_rows = 3; + g_tpwincrt_character_width = 8; + g_tpwincrt_character_height = 12; + g_tpwincrt_screen_buffer = win16_make_far_pointer(0x7100, 0); + memset(screen, ' ', sizeof(screen)); + + Win16FarPtr record = win16_make_far_pointer(0x7000, 0x100); + memset(dgroup + 0x100, 0xa5, 0x100); + tpwincrt_initialize_text_record(record); + assert(win16_read_u16(record) == 0xffff); + assert(win16_read_u16(win16_far_add_offset(record, 2)) == + BORLAND_FILE_CLOSED); + assert(win16_read_u16(win16_far_add_offset(record, 4)) == 0x80); + assert(win16_read_u16(win16_far_add_offset(record, 6)) == 0xa5a5); + assert(win16_read_far_pointer(record, 0x0c) == + win16_far_add_offset(record, 0x80)); + assert(win16_read_far_pointer(record, 0x10) == + win16_make_far_pointer(0x6000, 0x238b)); + assert(win16_read_u8(win16_far_add_offset(record, 0x30)) == 0); + + win16_write_u16(record, 2, BORLAND_FILE_INPUT); + assert(tpwincrt_open_text_record(record) == 0); + assert(win16_read_far_pointer(record, 0x14) == + win16_make_far_pointer(0x6000, 0x233c)); + assert(win16_read_far_pointer(record, 0x18) == 0); + assert(win16_read_far_pointer(record, 0x1c) == + win16_make_far_pointer(0x6000, 0x2374)); + + win16_write_u16(record, 2, BORLAND_TEXT_APPEND); + assert(tpwincrt_open_text_record(record) == 0); + assert(win16_read_u16(win16_far_add_offset(record, 2)) == + BORLAND_FILE_OUTPUT); + assert(win16_read_far_pointer(record, 0x14) == + win16_make_far_pointer(0x6000, 0x22fc)); + assert(win16_read_far_pointer(record, 0x18) == + win16_make_far_pointer(0x6000, 0x22fc)); + + reset_observations(); + g_tpwincrt_auto_scroll = 1; + uint8_t output[] = {'A', 'B', '\b', 'C', '\r', 'D', '\a'}; + Win16FarPtr output_far = win16_make_far_pointer(0x7000, 0x300); + memcpy(dgroup + 0x300, output, sizeof(output)); + tpwincrt_write_bytes(sizeof(output), output_far); + assert(memcmp(screen, "AC D", 6) == 0); + assert(g_tpwincrt_cursor_column == 1 && g_tpwincrt_cursor_row == 1); + assert(g_beep_calls == 1 && g_create_window_calls == 1); + assert(g_scroll_cursor_calls == 1 && g_draw_calls >= 2); + + reset_observations(); + g_tpwincrt_cursor_column = 0; + g_tpwincrt_cursor_row = 2; + g_tpwincrt_ring_row_origin = 2; + int16_t changed_start = 0; + int16_t changed_end = 0; + memset(screen, 'Q', 15); + tpwincrt_advance_line(&changed_start, &changed_end); + assert(g_tpwincrt_cursor_row == 2 && g_tpwincrt_ring_row_origin == 0); + assert(memcmp(screen + 10, " ", 5) == 0); + assert(g_scroll_window_calls == 1 && g_scroll_delta_y == -12); + assert(g_update_calls == 1); + + reset_observations(); + g_messages[0].message = WIN16_WM_PAINT; + g_messages[1].message = WIN16_WM_SIZE; + g_message_count = 2; + g_tpwincrt_input_count = 1; + assert(tpwincrt_poll_input()); + assert(g_translate_calls == 2 && g_dispatch_calls == 2); + + reset_observations(); + memcpy(g_tpwincrt_input_buffer, "XY", 2); + g_tpwincrt_input_count = 2; + assert(tpwincrt_read_character() == 'X'); + assert(g_tpwincrt_input_count == 1 && + g_tpwincrt_input_buffer[0] == 'Y'); + assert(g_wait_calls == 0); + + reset_observations(); + g_tpwincrt_input_count = 0; + g_tpwincrt_has_focus = 1; + assert(tpwincrt_read_character() == 'Z'); + assert(g_wait_calls == 1); + assert(g_create_caret_calls == 1 && g_destroy_caret_calls == 1); + assert(g_tpwincrt_caret_enabled == 0); + + reset_observations(); + g_tpwincrt_cursor_column = 0; + g_tpwincrt_cursor_row = 0; + g_tpwincrt_ring_row_origin = 0; + g_tpwincrt_has_focus = 0; + g_tpwincrt_ctrl_z_is_eof = 0; + const uint8_t line_input[] = {'A', 'B', '\b', 'C', '\r'}; + memcpy(g_tpwincrt_input_buffer, line_input, sizeof(line_input)); + g_tpwincrt_input_count = sizeof(line_input); + Win16FarPtr line = win16_make_far_pointer(0x7000, 0x400); + assert(tpwincrt_read_line(10, line) == 4); + assert(memcmp(dgroup + 0x400, "AC\r\n", 4) == 0); + + reset_observations(); + const uint8_t eof_input[] = {'X', 0x1a}; + memcpy(g_tpwincrt_input_buffer, eof_input, sizeof(eof_input)); + g_tpwincrt_input_count = sizeof(eof_input); + g_tpwincrt_ctrl_z_is_eof = 1; + assert(tpwincrt_read_line(10, line) == 2); + assert(dgroup[0x400] == 'X' && dgroup[0x401] == 0x1a); + + reset_observations(); + Win16FarPtr record_buffer = win16_make_far_pointer(0x7000, 0x500); + memcpy(dgroup + 0x500, "OK", 2); + win16_write_u16(record, 8, 2); + win16_write_u16(record, 0x0c, win16_far_offset(record_buffer)); + win16_write_u16(record, 0x0e, win16_far_selector(record_buffer)); + assert(tpwincrt_text_write_buffer(record) == 0); + assert(win16_read_u16(win16_far_add_offset(record, 8)) == 0); + + return 0; +} diff --git a/original/reconstructed/tests/test_turn_state.c b/original/reconstructed/tests/test_turn_state.c new file mode 100644 index 0000000..50492df --- /dev/null +++ b/original/reconstructed/tests/test_turn_state.c @@ -0,0 +1,363 @@ +#include "../tdkpin_turn_state.h" + +#include +#include + +uint8_t g_player_count; +uint8_t g_current_player; +uint8_t g_gameplay_transition_pending; +int32_t g_ball_x_milli; +int32_t g_ball_y_milli; + +static uint8_t g_stack[0x400]; +static uint8_t g_object[0x0c00]; +static uint8_t g_dgroup[0x5000]; +static Win16FarPtr g_receiver; +static unsigned g_restore_previous_calls; +static unsigned g_restore_record_b_calls; +static unsigned g_dynamic_record_calls; +static unsigned g_sound_calls; +static unsigned g_load_highscores_calls; +static unsigned g_insert_score_calls; +static unsigned g_transition_calls; +static unsigned g_show_highscore_calls; +static unsigned g_collision_refresh_calls; +static unsigned g_item_refresh_calls; +static unsigned g_restore_item_calls; +static unsigned g_draw_item_calls; +static unsigned g_status_calls; +static unsigned g_redraw_calls; +static unsigned g_reset_ball_calls; +static unsigned g_restore_b_calls; +static unsigned g_present_calls; +static unsigned g_marker_refresh_calls; +static unsigned g_get_dc_calls; +static unsigned g_release_dc_calls; +static uint16_t g_last_item_count; +static uint8_t g_last_status_player; + +void tdkpin_restore_previous_ball_region( + uint16_t caller_bp, uint8_t suppress_present) +{ + assert(caller_bp == 0x0100 && suppress_present == 0); + g_restore_previous_calls++; +} + +void tdkpin_restore_record_b(uint16_t caller_bp, uint16_t id) +{ + assert(caller_bp == 0x0100 && id == 1020); + g_restore_record_b_calls++; +} + +void tdkpin_update_dynamic_ball_record( + uint16_t ignored_static_link, int32_t displacement) +{ + assert(ignored_static_link == 0x0100 && displacement == 1); + g_dynamic_record_calls++; +} + +BorlandReal48 borland_i32_to_real48(int32_t value) +{ + assert(value == 1000); + return (BorlandReal48){{0x81, 1, 2, 3, 4, 5}}; +} + +BorlandReal48 borland_real48_multiply( + BorlandReal48 left, BorlandReal48 right) +{ + static const uint8_t expected_left[6] = {0x81, 1, 2, 3, 4, 5}; + static const uint8_t expected_right[6] = { + 0x80, 0xcd, 0xcc, 0xcc, 0xcc, 0x4c}; + assert(memcmp(left.bytes, expected_left, 6) == 0); + assert(memcmp(right.bytes, expected_right, 6) == 0); + return (BorlandReal48){{0x82, 6, 7, 8, 9, 10}}; +} + +int32_t borland_real48_round_to_i32(BorlandReal48 value) +{ + static const uint8_t expected[6] = {0x82, 6, 7, 8, 9, 10}; + assert(memcmp(value.bytes, expected, 6) == 0); + return 800; +} + +void tdkpin_play_sound_if_not_tilted(uint16_t sound_number) +{ + assert(sound_number == 8); + g_sound_calls++; +} + +void tdkpin_load_highscores(uint16_t ignored_static_link) +{ + assert(ignored_static_link == 0x0100); + g_load_highscores_calls++; +} + +void tdkpin_insert_current_score(uint16_t caller_bp) +{ + assert(caller_bp == 0x0100); + g_insert_score_calls++; +} + +void tdkpin_set_gameplay_transition_flags(uint16_t caller_bp) +{ + assert(caller_bp == 0x0100); + g_transition_calls++; +} + +void tdkpin_show_highscore_windows(uint16_t caller_bp) +{ + assert(caller_bp == 0x0100); + g_show_highscore_calls++; +} + +void tdkpin_refresh_collision_record(uint16_t caller_bp, uint16_t id) +{ + assert(caller_bp == 0x0100); + assert(id == g_collision_refresh_calls + 1); + g_collision_refresh_calls++; +} + +void tdkpin_refresh_player_item(uint16_t caller_bp, uint16_t item) +{ + assert(caller_bp == 0x0100); + assert(item == g_item_refresh_calls + 1); + g_item_refresh_calls++; +} + +void tdkpin_restore_record_or_item_a(uint16_t caller_bp, uint16_t id) +{ + assert(caller_bp == 0x0100); + assert(id == 1001 + g_restore_item_calls); + g_restore_item_calls++; +} + +HDC16 GetDC16(HWND16 window) +{ + assert(window == 0x2222); + g_get_dc_calls++; + return 0x3333; +} + +INT16 ReleaseDC16(HWND16 window, HDC16 dc) +{ + assert(window == 0x2222 && dc == 0x3333); + g_release_dc_calls++; + return 1; +} + +void tdkpin_draw_item_status(int16_t item, HDC16 dc) +{ + assert(dc == 0x3333); + g_last_item_count = (uint16_t)item; + g_draw_item_calls++; +} + +void tdkpin_update_status_display(uint8_t player, HDC16 dc) +{ + assert(dc == 0x3333); + g_last_status_player = player; + g_status_calls++; +} + +void tdkpin_redraw_all_players(uint16_t caller_bp) +{ + assert(caller_bp == 0x0100); + g_redraw_calls++; +} + +void tdkpin_reset_ball_state(uint16_t caller_bp) +{ + assert(caller_bp == 0x0100); + g_reset_ball_calls++; +} + +void tdkpin_restore_background_region_b( + INT16 height, INT16 width, INT16 y, INT16 x, HDC16 dc) +{ + assert(height == 20 && width == 148 && y == 243 && x == 84); + assert(dc == 0x3333); + g_restore_b_calls++; +} + +void tdkpin_present_background_region( + INT16 height, INT16 width, INT16 y, INT16 x, HDC16 dc) +{ + assert(height == 20 && width == 148 && y == 243 && x == 84); + assert(dc == 0x3333); + g_present_calls++; +} + +void tdkpin_refresh_player_progress_markers(uint16_t caller_bp) +{ + assert(caller_bp == 0x0100); + g_marker_refresh_calls++; +} + +_Noreturn void win16_integer_divide_fault(void) +{ + __builtin_trap(); +} + +static void reset_counters(void) +{ + g_restore_previous_calls = 0; + g_restore_record_b_calls = 0; + g_dynamic_record_calls = 0; + g_sound_calls = 0; + g_load_highscores_calls = 0; + g_insert_score_calls = 0; + g_transition_calls = 0; + g_show_highscore_calls = 0; + g_collision_refresh_calls = 0; + g_item_refresh_calls = 0; + g_restore_item_calls = 0; + g_draw_item_calls = 0; + g_status_calls = 0; + g_redraw_calls = 0; + g_reset_ball_calls = 0; + g_restore_b_calls = 0; + g_present_calls = 0; + g_marker_refresh_calls = 0; + g_get_dc_calls = 0; + g_release_dc_calls = 0; + g_last_item_count = 0; + g_last_status_player = 0; +} + +static void prepare_fixture(void) +{ + memset(g_stack, 0, sizeof(g_stack)); + memset(g_object, 0, sizeof(g_object)); + memset(g_dgroup, 0, sizeof(g_dgroup)); + win16_reset_segment_bindings(); + win16_bind_segment(0x7000, g_stack, sizeof(g_stack), true); + win16_bind_segment(0x7100, g_object, sizeof(g_object), true); + win16_bind_segment(0x7200, g_dgroup, sizeof(g_dgroup), true); + win16_set_dgroup_selector(0x7200); + win16_set_stack_state(0x7000, 0); + g_receiver = win16_make_far_pointer(0x7100, 0); + win16_write_stack_u16(0x0106, win16_far_offset(g_receiver)); + win16_write_stack_u16(0x0108, win16_far_selector(g_receiver)); + win16_write_u16(g_receiver, 4, 0x2222); + g_player_count = 3; + g_current_player = 1; + g_ball_x_milli = 0; + g_ball_y_milli = 0; + reset_counters(); +} + +static Win16FarPtr record(uint16_t id) +{ + return win16_dgroup_pointer((uint16_t)(0x095b + id * 0x53u)); +} + +static void test_special_respawn(void) +{ + prepare_fixture(); + g_current_player = 2; + win16_write_u16(win16_dgroup_pointer(0x399a), 0, 7); + win16_write_u32(win16_dgroup_pointer(0x3969), 0, 0x11112222u); + win16_write_u32(win16_dgroup_pointer(0x396d), 0, 0x33334444u); + win16_write_u8(win16_far_add_offset(g_receiver, 0x04a3), 1); + win16_write_u32(g_receiver, 0x56, 1000); + win16_write_u32(g_receiver, 0x0bca, 0xaaaaaaaau); + tdkpin_finish_ball_or_advance_player(0x0100); + assert(g_restore_previous_calls == 1); + assert(g_restore_record_b_calls == 1 && g_dynamic_record_calls == 1); + assert((uint32_t)g_ball_x_milli == 0x11112222u); + assert((uint32_t)g_ball_y_milli == 0x33334444u); + assert(win16_read_u32(win16_far_add_offset(g_receiver, 0x0bc2)) == + 0x11112222u); + assert(win16_read_u32(win16_far_add_offset(g_receiver, 0x0bc6)) == + 0x33334444u); + assert(win16_read_u8(win16_far_add_offset(g_receiver, 0x04a3)) == 0); + assert(win16_read_u32(win16_far_add_offset(g_receiver, 0x0baa)) == 0); + assert(win16_read_u32(win16_far_add_offset(g_receiver, 0x0bae)) == 800); + assert(win16_read_u32(win16_far_add_offset(g_receiver, 0x0bca)) == 0); + assert(win16_read_u16(win16_dgroup_pointer(0x399a)) == 0); + assert(win16_read_u8(win16_dgroup_pointer(0x0875)) == 1); + assert(win16_read_u8(win16_dgroup_pointer(0x41f9)) == 1); + assert(win16_read_u8(win16_far_add_offset(g_receiver, 0x61)) == 1); + assert(g_sound_calls == 0 && g_redraw_calls == 0); +} + +static void seed_collision_and_player_three_mirrors(void) +{ + for (uint16_t id = 1; id <= 175; id++) { + win16_write_u8( + win16_far_add_offset(record(id), 0x34), (uint8_t)(id & 1u)); + win16_write_u16(record(id), 0x43, (uint16_t)(0x1000 + id)); + win16_write_u8( + win16_far_add_offset(g_receiver, (uint16_t)( + 0x0061 + 3u * 0x00afu + id)), + (uint8_t)(0x80u | (id & 1u))); + win16_write_u16( + g_receiver, + (uint16_t)(0x036c + 3u * 0x015eu + id * 2u), + (uint16_t)(0x2000 + id)); + } +} + +static void test_advance_to_live_player(void) +{ + prepare_fixture(); + win16_write_u8(win16_dgroup_pointer(0x0874), 1); + win16_write_u16(win16_dgroup_pointer(0x0821), 0, 2); + win16_write_u16(win16_dgroup_pointer(0x0823), 0, 0); + win16_write_u16(win16_dgroup_pointer(0x0825), 0, 3); + win16_write_u8(win16_dgroup_pointer(0x0819), 4); + seed_collision_and_player_three_mirrors(); + for (uint16_t item = 1; item <= 3; item++) { + win16_write_u8(win16_far_add_offset( + g_receiver, (uint16_t)(0x046c + 3u * 0x14u + item)), 1); + } + tdkpin_finish_ball_or_advance_player(0x0100); + assert(g_sound_calls == 1 && g_restore_previous_calls == 1); + assert(g_current_player == 3); + for (uint16_t id = 1; id <= 175; id++) { + assert(win16_read_u8(win16_far_add_offset( + g_receiver, (uint16_t)(0x0061 + 0x00afu + id))) == + (uint8_t)(id & 1u)); + assert(win16_read_u16(win16_far_add_offset( + g_receiver, + (uint16_t)(0x036c + 0x015eu + id * 2u))) == + (uint16_t)(0x1000 + id)); + assert(win16_read_u8(win16_far_add_offset(record(id), 0x34)) == + (uint8_t)(0x80u | (id & 1u))); + assert(win16_read_u16(win16_far_add_offset(record(id), 0x43)) == + (uint16_t)(0x2000 + id)); + } + assert(g_collision_refresh_calls == 175 && g_item_refresh_calls == 20); + assert(g_restore_item_calls == 3); + assert(g_draw_item_calls == 1 && g_last_item_count == 3); + assert(g_status_calls == 1 && g_last_status_player == 3); + assert(g_redraw_calls == 1 && g_reset_ball_calls == 1); + assert(win16_read_u16(win16_dgroup_pointer(0x0825)) == 2); + assert(g_restore_b_calls == 1 && g_present_calls == 1); + assert(g_marker_refresh_calls == 1); + assert(g_get_dc_calls == 2 && g_release_dc_calls == 2); +} + +static void test_game_over_path(void) +{ + prepare_fixture(); + win16_write_u8(win16_dgroup_pointer(0x0874), 1); + win16_write_u16(win16_dgroup_pointer(0x0821), 0, 0); + win16_write_u16(win16_dgroup_pointer(0x0823), 0, 0); + g_player_count = 2; + tdkpin_finish_ball_or_advance_player(0x0100); + assert(g_load_highscores_calls == 1 && g_insert_score_calls == 1); + assert(g_current_player == 0 && g_transition_calls == 1); + assert(g_show_highscore_calls == 1); + assert(g_collision_refresh_calls == 0 && g_redraw_calls == 0); + assert(win16_read_u8(win16_far_add_offset(g_receiver, 0x0bda)) == 0); + assert(win16_read_u8(win16_far_add_offset(g_receiver, 0x0bdb)) == 0); +} + +int main(void) +{ + test_special_respawn(); + test_advance_to_live_player(); + test_game_over_path(); + return 0; +} diff --git a/original/reconstructed/tests/test_window_advanced_handlers.c b/original/reconstructed/tests/test_window_advanced_handlers.c new file mode 100644 index 0000000..1f5915e --- /dev/null +++ b/original/reconstructed/tests/test_window_advanced_handlers.c @@ -0,0 +1,315 @@ +#include "../tdkpin_window_messages.h" + +#include +#include + +Win16FarPtr g_object_windows_application; +uint8_t g_object_windows_focus_event_marker; + +static int32_t g_window_style; +static unsigned g_sequence[32]; +static unsigned g_sequence_count; +static Win16FarPtr g_last_procedure; +static Win16FarPtr g_last_receiver; +static ObjectWindowsMessage *g_last_message; +static uint16_t g_scroll_position; +static uint16_t g_scroll_command; +static HDC16 g_paint_dc; +static RECT16 g_window_rectangle; +static MSG16 g_queued_messages[4]; +static unsigned g_queued_count; +static unsigned g_queued_index; +static HWND16 g_capture_window; +static unsigned g_release_calls; +static unsigned g_translate_calls; +static unsigned g_dispatch_calls; +static unsigned g_mouse_calls; + +enum Sequence { + SEQ_MESSAGE = 1, + SEQ_SCROLL, + SEQ_BEGIN_PAINT, + SEQ_PAINT, + SEQ_METHOD, + SEQ_END_PAINT, + SEQ_GET_RECT, + SEQ_CAPTURE, + SEQ_TRANSLATE, + SEQ_DISPATCH, + SEQ_MOUSE, + SEQ_RELEASE, +}; + +static void record(unsigned value) +{ + assert(g_sequence_count < sizeof(g_sequence) / sizeof(*g_sequence)); + g_sequence[g_sequence_count++] = value; +} + +int32_t GetWindowLong16(HWND16 window, INT16 index) +{ + assert(window == 0x1234 && index == -16); + return g_window_style; +} + +void win16_call_object_message_handler( + Win16FarPtr procedure, + Win16FarPtr object, + ObjectWindowsMessage *message) +{ + g_last_procedure = procedure; + g_last_receiver = object; + g_last_message = message; + record(SEQ_MESSAGE); +} + +void win16_call_object_scroll_method( + Win16FarPtr procedure, + Win16FarPtr object, + uint16_t position, + uint16_t command) +{ + g_last_procedure = procedure; + g_last_receiver = object; + g_scroll_position = position; + g_scroll_command = command; + record(SEQ_SCROLL); +} + +HDC16 BeginPaint16(HWND16 window, Win16FarPtr paint) +{ + assert(window == 0x1234); + win16_write_u16(paint, 0, g_paint_dc); + record(SEQ_BEGIN_PAINT); + return g_paint_dc; +} + +BOOL16 EndPaint16(HWND16 window, Win16FarPtr paint) +{ + assert(window == 0x1234 && win16_read_u16(paint) == g_paint_dc); + record(SEQ_END_PAINT); + return 1; +} + +void win16_call_object_paint_method( + Win16FarPtr procedure, + Win16FarPtr object, + PAINTSTRUCT16 *paint, + HDC16 dc) +{ + assert(paint->dc == g_paint_dc && dc == g_paint_dc); + g_last_procedure = procedure; + g_last_receiver = object; + record(SEQ_PAINT); +} + +void win16_call_object_method( + Win16FarPtr procedure, Win16FarPtr object) +{ + g_last_procedure = procedure; + g_last_receiver = object; + record(SEQ_METHOD); +} + +BOOL16 GetWindowRect16(HWND16 window, Win16FarPtr rectangle) +{ + assert(window == 0x1234); + win16_write_u16(rectangle, 0, (uint16_t)g_window_rectangle.left); + win16_write_u16(rectangle, 2, (uint16_t)g_window_rectangle.top); + win16_write_u16(rectangle, 4, (uint16_t)g_window_rectangle.right); + win16_write_u16(rectangle, 6, (uint16_t)g_window_rectangle.bottom); + record(SEQ_GET_RECT); + return 1; +} + +HWND16 SetCapture16(HWND16 window) +{ + g_capture_window = window; + record(SEQ_CAPTURE); + return 0xaaaa; +} + +BOOL16 ReleaseCapture16(void) +{ + g_release_calls++; + record(SEQ_RELEASE); + return 1; +} + +BOOL16 PeekMessage16( + MSG16 *message, + HWND16 window, + UINT16 minimum_message, + UINT16 maximum_message, + UINT16 remove_message) +{ + assert(window == 0 && minimum_message == 0 && maximum_message == 0); + assert(remove_message == 1); + if (g_queued_index == g_queued_count) { + return 0; + } + *message = g_queued_messages[g_queued_index++]; + return 1; +} + +BOOL16 TranslateMessage16(const MSG16 *message) +{ + (void)message; + g_translate_calls++; + record(SEQ_TRANSLATE); + return 1; +} + +LRESULT16 DispatchMessage16(const MSG16 *message) +{ + (void)message; + g_dispatch_calls++; + record(SEQ_DISPATCH); + return 0; +} + +void win16_call_object_u16_method( + Win16FarPtr procedure, Win16FarPtr object, uint16_t argument) +{ + assert(argument == 0x1234); + g_last_procedure = procedure; + g_last_receiver = object; + g_mouse_calls++; + record(SEQ_MOUSE); +} + +static void write_far( + Win16FarPtr base, uint16_t offset, Win16FarPtr value) +{ + win16_write_u16(base, offset, win16_far_offset(value)); + win16_write_u16( + base, (uint16_t)(offset + 2), win16_far_selector(value)); +} + +static void reset_observations(void) +{ + g_sequence_count = 0; + g_last_procedure = 0; + g_last_receiver = 0; + g_last_message = 0; + g_queued_count = 0; + g_queued_index = 0; + g_release_calls = 0; + g_translate_calls = 0; + g_dispatch_calls = 0; + g_mouse_calls = 0; +} + +int main(void) +{ + static uint8_t dgroup[0x1000]; + uint8_t stack_anchor = 0; + uintptr_t stack_base = (uintptr_t)&stack_anchor - 0x8000; + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, dgroup, sizeof(dgroup), true); + win16_set_dgroup_selector(0x5000); + win16_bind_segment(0x7000, (void *)stack_base, 0x10000, true); + + Win16FarPtr window = win16_make_far_pointer(0x5000, 0x0200); + Win16FarPtr attached = win16_make_far_pointer(0x5000, 0x0300); + win16_write_u16(window, 0, 0x0400); + win16_write_u16(window, 4, 0x1234); + win16_write_u16(attached, 0, 0x0500); + write_far(window, 0x3b, attached); + + Win16FarPtr default_proc = win16_make_far_pointer(0x6000, 0x1000); + Win16FarPtr fallback_scroll = win16_make_far_pointer(0x6000, 0x1001); + Win16FarPtr window_paint = win16_make_far_pointer(0x6000, 0x1002); + Win16FarPtr horizontal = win16_make_far_pointer(0x6000, 0x2000); + Win16FarPtr vertical = win16_make_far_pointer(0x6000, 0x2001); + Win16FarPtr before_paint = win16_make_far_pointer(0x6000, 0x2002); + Win16FarPtr after_paint = win16_make_far_pointer(0x6000, 0x2003); + Win16FarPtr resize = win16_make_far_pointer(0x6000, 0x2004); + Win16FarPtr mouse = win16_make_far_pointer(0x6000, 0x2005); + write_far(win16_dgroup_pointer(0x0400), 0x0c, default_proc); + write_far(win16_dgroup_pointer(0x0400), 0x48, fallback_scroll); + write_far(win16_dgroup_pointer(0x0400), 0x4c, window_paint); + write_far(win16_dgroup_pointer(0x0500), 0x20, horizontal); + write_far(win16_dgroup_pointer(0x0500), 0x1c, vertical); + write_far(win16_dgroup_pointer(0x0500), 0x14, before_paint); + write_far(win16_dgroup_pointer(0x0500), 0x18, after_paint); + write_far(win16_dgroup_pointer(0x0500), 0x0c, resize); + write_far(win16_dgroup_pointer(0x0500), 0x24, mouse); + + ObjectWindowsMessage message = { + .wparam = 7, + .lparam = 0x12345678, + }; + reset_observations(); + g_window_style = 0; + object_windows_wm_hscroll_attached(window, &message); + assert(g_last_procedure == fallback_scroll && + g_last_receiver == window && g_last_message == &message); + + reset_observations(); + g_window_style = 0x00100000; + object_windows_wm_hscroll_attached(window, &message); + assert(g_last_procedure == horizontal && g_last_receiver == attached); + assert(g_scroll_position == 0x5678 && g_scroll_command == 7); + + reset_observations(); + write_far(window, 0x3b, 0); + object_windows_wm_hscroll_attached(window, &message); + assert(g_last_procedure == default_proc && g_last_receiver == window); + write_far(window, 0x3b, attached); + + reset_observations(); + g_window_style = 0x00200000; + object_windows_wm_vscroll_attached(window, &message); + assert(g_last_procedure == vertical && g_last_receiver == attached); + + reset_observations(); + g_paint_dc = 0x4444; + object_windows_wm_paint_attached(window, &message); + assert(g_sequence_count == 5); + assert(g_sequence[0] == SEQ_BEGIN_PAINT); + assert(g_sequence[1] == SEQ_PAINT); + assert(g_sequence[2] == SEQ_PAINT); + assert(g_sequence[3] == SEQ_METHOD); + assert(g_sequence[4] == SEQ_END_PAINT); + assert(g_last_procedure == after_paint && g_last_receiver == attached); + + reset_observations(); + g_window_rectangle = (RECT16){10, 20, 70, 100}; + message.wparam = 0; + object_windows_wm_size_attached(window, &message); + assert(g_sequence[0] == SEQ_METHOD); + assert(g_sequence[1] == SEQ_GET_RECT); + assert(g_sequence[2] == SEQ_MESSAGE); + assert(win16_read_u16(win16_far_add_offset(window, 0x2d)) == 60); + assert(win16_read_u16(win16_far_add_offset(window, 0x2f)) == 80); + + reset_observations(); + message.wparam = 1; + object_windows_wm_size_attached(window, &message); + assert(g_sequence_count == 1 && g_sequence[0] == SEQ_MESSAGE); + + reset_observations(); + win16_write_u8(win16_far_add_offset(attached, 0x22), 1); + g_queued_messages[0].message = 0x0200; + g_queued_messages[1].message = 0x0202; + g_queued_count = 2; + object_windows_track_mouse_until_button_up(window, &message); + assert(g_capture_window == 0x1234 && g_release_calls == 1); + assert(g_translate_calls == 2 && g_dispatch_calls == 2); + assert(g_mouse_calls == 2); + assert(g_sequence[g_sequence_count - 1] == SEQ_MESSAGE); + + reset_observations(); + win16_set_indeterminate_u16(0x0202); + object_windows_track_mouse_until_button_up(window, &message); + assert(g_mouse_calls == 1 && g_release_calls == 1); + + reset_observations(); + win16_write_u8(win16_far_add_offset(attached, 0x22), 0); + object_windows_track_mouse_until_button_up(window, &message); + assert(g_capture_window == 0x1234); + assert(g_mouse_calls == 0 && g_release_calls == 0); + assert(g_sequence_count == 1 && g_sequence[0] == SEQ_MESSAGE); + return 0; +} diff --git a/original/reconstructed/tests/test_window_command.c b/original/reconstructed/tests/test_window_command.c new file mode 100644 index 0000000..63cd920 --- /dev/null +++ b/original/reconstructed/tests/test_window_command.c @@ -0,0 +1,316 @@ +#include "../tdkpin_window_messages.h" + +#include + +Win16FarPtr g_object_windows_application; +HINSTANCE16 g_win16_previous_instance; +HINSTANCE16 g_win16_instance; +uint16_t g_win16_show_command; +Win16FarPtr g_win16_message_box; +Win16FarPtr g_object_windows_dispatch_proc; +uint16_t g_object_windows_thunk_code_selector; +Win16FarPtr g_object_windows_free_thunk; +Win16FarPtr g_object_windows_message_hook; +Win16FarPtr g_object_windows_creating_object; + +static HWND16 g_dialog_item; +static uint16_t g_dlg_code; +static HWND16 g_focus; +static HWND16 g_parent; +static unsigned g_parent_calls; +static HWND16 g_lookup_window; +static Win16FarPtr g_window_object; +static Win16FarPtr g_child_object; +static Win16FarPtr g_called_proc; +static Win16FarPtr g_called_object; +static ObjectWindowsMessage *g_called_message; +static uint16_t g_window_word; + +HWND16 GetDlgItem16(HWND16 dialog, INT16 control_id) +{ + assert(dialog == 0x77); + (void)control_id; + return g_dialog_item; +} + +LRESULT16 SendMessage16( + HWND16 window, UINT16 message, WPARAM16 wparam, LPARAM16 lparam) +{ + assert(window == g_dialog_item && message == 0x87); + assert(wparam == 0 && lparam == 0); + return g_dlg_code; +} + +HWND16 GetFocus16(void) +{ + return g_focus; +} + +HWND16 GetParent16(HWND16 window) +{ + assert(window == g_focus); + g_parent_calls++; + return g_parent; +} + +BOOL16 IsWindow16(HWND16 window) +{ + g_lookup_window = window; + return window != 0; +} + +int32_t GetWindowLong16(HWND16 window, INT16 index) +{ + assert(window != 0 && index == -4); + return (int32_t)win16_make_far_pointer(0x6000, 0x0100); +} + +Win16Handle GetProp16(HWND16 window, Win16FarPtr name) +{ + Win16FarPtr object = window == 0x55 ? g_child_object : 0; + return win16_far_offset(name) == 0x067a + ? win16_far_selector(object) + : win16_far_offset(object); +} + +uint16_t GetWindowWord16(HWND16 window, INT16 index) +{ + assert(window != 0 && index == -12); + return g_window_word; +} + +void win16_call_object_event_handler( + Win16FarPtr procedure, Win16FarPtr object, Win16FarPtr event) +{ + g_called_proc = procedure; + g_called_object = object; + g_called_message = (ObjectWindowsMessage *)(uintptr_t)event; +} + +void win16_call_object_message_handler( + Win16FarPtr procedure, + Win16FarPtr object, + ObjectWindowsMessage *message) +{ + g_called_proc = procedure; + g_called_object = object; + g_called_message = message; +} + +void win16_call_object_message_hook( + Win16FarPtr procedure, + Win16FarPtr object, + Win16FarPtr handler, + HWND16 window, + UINT16 message, + WPARAM16 wparam, + LPARAM16 lparam) +{ + (void)procedure; + (void)object; + (void)handler; + (void)window; + (void)message; + (void)wparam; + (void)lparam; + assert(false); +} + +static void write_far(uint16_t offset, Win16FarPtr pointer) +{ + win16_write_u16( + win16_dgroup_pointer(offset), 0, win16_far_offset(pointer)); + win16_write_u16( + win16_dgroup_pointer((uint16_t)(offset + 2)), + 0, + win16_far_selector(pointer)); +} + +static void write_dispatch_table( + uint16_t vmt, + uint16_t table, + uint16_t id, + Win16FarPtr handler) +{ + win16_write_u16(win16_dgroup_pointer((uint16_t)(vmt + 4)), 0, table); + win16_write_u16(win16_dgroup_pointer(table), 0, 0); + win16_write_u16(win16_dgroup_pointer((uint16_t)(table + 2)), 0, 0xffff); + win16_write_u16(win16_dgroup_pointer((uint16_t)(table + 4)), 0, 0xffff); + win16_write_u16(win16_dgroup_pointer((uint16_t)(table + 6)), 0, 1); + win16_write_u16(win16_dgroup_pointer((uint16_t)(table + 8)), 0, id); + write_far((uint16_t)(table + 10), handler); +} + +static void reset_call(void) +{ + g_called_proc = 0; + g_called_object = 0; + g_called_message = 0; + g_dialog_item = 0; + g_dlg_code = 0; + g_focus = 0; + g_parent = 0; + g_parent_calls = 0; +} + +int main(void) +{ + static uint8_t dgroup[0x1000]; + static uint8_t code[0x200]; + static uint8_t stack[0x100]; + static uint8_t window_bytes[64]; + static uint8_t child_bytes[64]; + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, dgroup, sizeof(dgroup), true); + win16_set_dgroup_selector(0x5000); + win16_bind_segment(0x6000, code, sizeof(code), false); + win16_bind_segment(0x7000, window_bytes, sizeof(window_bytes), true); + win16_bind_segment(0x7100, child_bytes, sizeof(child_bytes), true); + win16_bind_segment(0x7200, stack, sizeof(stack), true); + + g_window_object = win16_make_far_pointer(0x7000, 2); + g_child_object = win16_make_far_pointer(0x7100, 2); + uint16_t window_vmt = 0x0100; + uint16_t child_vmt = 0x0200; + win16_write_u16(g_window_object, 0, window_vmt); + win16_write_u16(g_child_object, 0, child_vmt); + win16_write_u16(g_window_object, 4, 0x77); + Win16FarPtr menu_handler = win16_make_far_pointer(0x6100, 0x1000); + Win16FarPtr control_handler = win16_make_far_pointer(0x6100, 0x2000); + Win16FarPtr notify_handler = win16_make_far_pointer(0x6100, 0x3000); + Win16FarPtr default_handler = win16_make_far_pointer(0x6100, 0x4000); + Win16FarPtr default_control = win16_make_far_pointer(0x6100, 0x5000); + write_dispatch_table(window_vmt, 0x0300, 0x8005, control_handler); + write_dispatch_table(child_vmt, 0x0340, 0xa010, menu_handler); + /* Parent table supplies the notification id as a second node. */ + win16_write_u16(win16_dgroup_pointer(0x0340), 0, 0x0380); + win16_write_u16(win16_dgroup_pointer(0x0380), 0, 0); + win16_write_u16(win16_dgroup_pointer(0x0382), 0, 0xffff); + win16_write_u16(win16_dgroup_pointer(0x0384), 0, 0xffff); + win16_write_u16(win16_dgroup_pointer(0x0386), 0, 1); + win16_write_u16(win16_dgroup_pointer(0x0388), 0, 0x9002); + write_far(0x038a, notify_handler); + write_far((uint16_t)(window_vmt + 0x0c), default_handler); + write_far((uint16_t)(window_vmt + 0x14), default_control); + write_far((uint16_t)(window_vmt + 0x10), default_handler); + write_far((uint16_t)(child_vmt + 0x10), default_handler); + write_far((uint16_t)(child_vmt + 0x18), default_handler); + write_far((uint16_t)(child_vmt + 0x14), default_control); + + ObjectWindowsMessage *message = (ObjectWindowsMessage *)&stack[16]; + Win16FarPtr message_far = win16_make_far_pointer(0x7200, 16); + (void)message_far; + + reset_call(); + *message = (ObjectWindowsMessage){.wparam = 0x0010, .lparam = 0}; + g_focus = 0x66; + g_parent = 0x55; + object_windows_wm_command(g_window_object, message); + assert(g_parent_calls == 1 && g_lookup_window == 0x55); + assert(g_called_proc == menu_handler && g_called_object == g_child_object); + + reset_call(); + *message = (ObjectWindowsMessage){.wparam = 0x6000, .lparam = 0}; + object_windows_wm_command(g_window_object, message); + assert(g_called_proc == default_handler && + g_called_object == g_window_object); + + reset_call(); + *message = (ObjectWindowsMessage){ + .wparam = 0x0100, + .lparam = (LPARAM16)0x00020055u, + }; + g_dialog_item = 0x55; + object_windows_wm_command(g_window_object, message); + assert(g_called_proc == notify_handler && g_called_object == g_child_object); + + reset_call(); + *message = (ObjectWindowsMessage){.wparam = 5, .lparam = 0x66}; + object_windows_wm_command(g_window_object, message); + assert(g_called_proc == control_handler && + g_called_object == g_window_object); + + reset_call(); + *message = (ObjectWindowsMessage){.wparam = 0x1000, .lparam = 0x66}; + object_windows_wm_command(g_window_object, message); + assert(g_called_proc == default_control && + g_called_object == g_window_object); + + reset_call(); + win16_write_u8(win16_far_add_offset(g_window_object, 0x16), 1); + *message = (ObjectWindowsMessage){.wparam = 0x0100, .lparam = 0}; + g_dialog_item = 0x55; + g_dlg_code = 0x30; + object_windows_wm_command(g_window_object, message); + assert((uint16_t)message->lparam == 0x55); + assert(g_called_proc == default_handler); + assert(g_called_object == g_child_object); + + reset_call(); + *message = (ObjectWindowsMessage){.wparam = 2, .lparam = 0}; + object_windows_route_scroll_notification(g_window_object, message); + assert(g_called_proc == default_handler); + + reset_call(); + *message = (ObjectWindowsMessage){ + .wparam = 2, + .lparam = (LPARAM16)0x00550000u, + }; + object_windows_route_scroll_notification(g_window_object, message); + assert(g_called_proc == notify_handler && g_called_object == g_child_object); + + reset_call(); + *message = (ObjectWindowsMessage){ + .wparam = 2, + .lparam = (LPARAM16)0x00660000u, + }; + g_window_word = 5; + object_windows_route_scroll_notification(g_window_object, message); + assert(g_called_proc == control_handler && + g_called_object == g_window_object); + reset_call(); + *message = (ObjectWindowsMessage){ + .wparam = 2, + .lparam = (LPARAM16)0x00660000u, + }; + g_window_word = 0x1000; + object_windows_route_scroll_notification(g_window_object, message); + assert(g_called_proc == default_control && + g_called_object == g_window_object); + + reset_call(); + *message = (ObjectWindowsMessage){ + .window = 0x77, + .wparam = 0x0010, + }; + object_windows_route_command_target(g_window_object, message); + assert(g_called_proc == default_handler && + g_called_object == g_window_object); + win16_write_u16(g_window_object, 6, win16_far_offset(g_child_object)); + win16_write_u16(g_window_object, 8, win16_far_selector(g_child_object)); + message->window = 0x66; + object_windows_route_command_target(g_window_object, message); + assert(g_called_proc == menu_handler && g_called_object == g_child_object); + win16_write_u16(g_window_object, 6, 0); + win16_write_u16(g_window_object, 8, 0); + message->window = 0x55; + object_windows_route_command_target(g_window_object, message); + assert(g_called_proc == menu_handler && g_called_object == g_child_object); + + reset_call(); + *message = (ObjectWindowsMessage){.message = 0x0111, .wparam = 5}; + object_windows_forward_event_to_parent(g_window_object, message); + assert(g_called_proc == 0); + win16_write_u16(g_window_object, 6, win16_far_offset(g_child_object)); + win16_write_u16(g_window_object, 8, win16_far_selector(g_child_object)); + object_windows_forward_event_to_parent(g_window_object, message); + assert(g_called_proc == default_control && + g_called_object == g_child_object); + reset_call(); + *message = (ObjectWindowsMessage){.message = 2}; + g_window_word = 5; + object_windows_forward_event_to_parent(g_window_object, message); + assert(g_called_proc == default_control && + g_called_object == g_child_object); + return 0; +} diff --git a/original/reconstructed/tests/test_window_creation.c b/original/reconstructed/tests/test_window_creation.c new file mode 100644 index 0000000..cfef65f --- /dev/null +++ b/original/reconstructed/tests/test_window_creation.c @@ -0,0 +1,289 @@ +#include "../tdkpin_window_placement.h" + +#include +#include + +HINSTANCE16 g_win16_instance; +Win16FarPtr g_object_windows_creating_object; + +static bool g_enter = true; +static Win16FarPtr g_parent_mdi_client; +static Win16FarPtr g_duplicate_result; +static uint8_t g_flags; +static bool g_register_result; +static Win16FarPtr g_class_name; +static HWND16 g_create_result; +static HWND16 g_dialog_item_result; +static Win16FarPtr g_existing_object; +static int32_t g_previous_wndproc; +static unsigned g_bind_calls; +static unsigned g_created_calls; +static unsigned g_create_ex_calls; +static unsigned g_mdi_calls; + +bool borland_enter_object_constructor( + BorlandObjectCallFrame *frame, uint16_t offset) +{ + assert(offset == 0); + if (g_enter && frame->vmt_argument != 0) { + win16_write_u16(frame->object, 0, frame->vmt_argument); + } + return g_enter; +} + +Win16FarPtr object_windows_object_construct( + Win16FarPtr object, uint16_t vmt, Win16FarPtr parent) +{ + assert(vmt == 0); + win16_write_u16(object, 6, win16_far_offset(parent)); + win16_write_u16(object, 8, win16_far_selector(parent)); + return object; +} + +Win16FarPtr borland_far_strdup(Win16FarPtr source) +{ + assert(source != 0); + return g_duplicate_result; +} + +Win16FarPtr win16_def_window_proc_pointer(void) +{ + return win16_make_far_pointer(0x6000, 0x0100); +} + +Win16FarPtr win16_def_mdi_child_proc_pointer(void) +{ + return win16_make_far_pointer(0x6000, 0x0200); +} + +void object_windows_update_flags( + Win16FarPtr object, bool set, uint8_t mask) +{ + assert(set && mask == 8); + g_flags |= mask; + win16_write_u8(win16_far_add_offset(object, 0x16), g_flags); +} + +Win16FarPtr win16_call_object_far_method( + Win16FarPtr procedure, Win16FarPtr object) +{ + (void)procedure; + if (win16_far_offset(object) == 0x0300) { + return g_parent_mdi_client; + } + return g_class_name; +} + +void object_windows_clear_flag_4(Win16FarPtr object) +{ + g_flags &= (uint8_t)~4u; + win16_write_u8(win16_far_add_offset(object, 0x16), g_flags); +} + +bool object_windows_has_flags(Win16FarPtr object, uint8_t mask) +{ + (void)object; + return (g_flags & mask) == mask; +} + +bool win16_call_object_bool_method( + Win16FarPtr procedure, Win16FarPtr object) +{ + (void)procedure; + (void)object; + return g_register_result; +} + +HWND16 GetDlgItem16(HWND16 dialog, INT16 control_id) +{ + assert(dialog == 0x3333 && control_id == 77); + return g_dialog_item_result; +} + +HWND16 CreateWindowEx16( + uint32_t extended_style, + Win16FarPtr class_name, + Win16FarPtr window_name, + uint32_t style, + INT16 x, + INT16 y, + INT16 width, + INT16 height, + HWND16 parent, + HMENU16 menu, + HINSTANCE16 instance, + Win16FarPtr parameter) +{ + assert(extended_style == 0x11223344u); + assert(class_name == g_class_name); + assert(window_name == g_duplicate_result); + assert(style == 0x55667788u); + assert(x == 10 && y == 20 && width == 30 && height == 40); + assert(parent == 0x3333 && menu == 77 && instance == g_win16_instance); + assert(parameter == win16_make_far_pointer(0x5000, 0x0550)); + g_create_ex_calls++; + return g_create_result; +} + +LRESULT16 SendMessage16( + HWND16 window, UINT16 message, WPARAM16 wparam, LPARAM16 lparam) +{ + assert(window == 0x4444 && message == 0x0220 && wparam == 0); + Win16FarPtr pointer = (Win16FarPtr)lparam; + assert(win16_read_far_pointer(pointer, 0) == g_class_name); + assert(win16_read_far_pointer(pointer, 4) == g_duplicate_result); + assert(win16_read_u16(win16_far_add_offset(pointer, 8)) == g_win16_instance); + assert((INT16)win16_read_u16(win16_far_add_offset(pointer, 10)) == 10); + assert(win16_read_u32(win16_far_add_offset(pointer, 18)) == 0x55667788u); + assert(win16_read_u32(win16_far_add_offset(pointer, 22)) == + win16_make_far_pointer(0x5000, 0x0550)); + g_mdi_calls++; + return g_create_result; +} + +Win16FarPtr object_windows_object_from_window(HWND16 window) +{ + assert(window != 0); + return g_existing_object; +} + +void object_windows_bind_window(HWND16 window, Win16FarPtr object) +{ + assert(window != 0 && object != 0); + g_bind_calls++; +} + +int32_t SetWindowLong16(HWND16 window, INT16 index, int32_t value) +{ + assert(window != 0 && index == -4); + assert((Win16FarPtr)value == win16_make_far_pointer(0x6000, 0x0300)); + return g_previous_wndproc; +} + +void win16_call_object_method(Win16FarPtr procedure, Win16FarPtr object) +{ + assert(procedure == win16_make_far_pointer(0x6000, 0x0600)); + assert(object != 0); + g_created_calls++; +} + +static void write_far_value( + Win16FarPtr base, uint16_t offset, Win16FarPtr value) +{ + win16_write_u16(base, offset, win16_far_offset(value)); + win16_write_u16( + base, (uint16_t)(offset + 2), win16_far_selector(value)); +} + +static void prepare_window( + Win16FarPtr window, Win16FarPtr parent) +{ + win16_write_u16(window, 0, 0x0100); + win16_write_u16(window, 2, 0); + win16_write_u16(window, 4, 0); + write_far_value(window, 6, parent); + write_far_value(window, 0x1d, g_duplicate_result); + win16_write_u32(window, 0x21, 0x55667788u); + win16_write_u32(window, 0x25, 0x11223344u); + win16_write_u16(window, 0x29, 10); + win16_write_u16(window, 0x2b, 20); + win16_write_u16(window, 0x2d, 30); + win16_write_u16(window, 0x2f, 40); + write_far_value(window, 0x31, win16_make_far_pointer(0x5000, 0x0550)); + win16_write_u16(window, 0x35, 77); + write_far_value(window, 0x12, win16_make_far_pointer(0x6000, 0x0300)); + g_flags = 0; +} + +int main(void) +{ + static uint8_t dgroup[0x1000]; + uint8_t stack_anchor = 0; + uintptr_t stack_base = (uintptr_t)&stack_anchor - 0x8000; + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, dgroup, sizeof(dgroup), true); + win16_set_dgroup_selector(0x5000); + win16_bind_segment(0x7000, (void *)stack_base, 0x10000, true); + + Win16FarPtr window = win16_make_far_pointer(0x5000, 0x0200); + Win16FarPtr parent = win16_make_far_pointer(0x5000, 0x0300); + Win16FarPtr mdi_client = win16_make_far_pointer(0x5000, 0x0400); + g_duplicate_result = win16_make_far_pointer(0x5000, 0x0500); + g_class_name = win16_make_far_pointer(0x5000, 0x0520); + win16_write_u16(parent, 0, 0x0700); + win16_write_u16(parent, 4, 0x3333); + win16_write_u16(mdi_client, 4, 0x4444); + write_far_value(win16_dgroup_pointer(0x0700), 0x30, + win16_make_far_pointer(0x6000, 0x0700)); + write_far_value(win16_dgroup_pointer(0x0100), 0x1c, + win16_make_far_pointer(0x6000, 0x0400)); + write_far_value(win16_dgroup_pointer(0x0100), 0x2c, + win16_make_far_pointer(0x6000, 0x0500)); + write_far_value(win16_dgroup_pointer(0x0100), 0x38, + win16_make_far_pointer(0x6000, 0x0600)); + + g_parent_mdi_client = 0; + (void)object_windows_window_construct( + window, 0x0100, win16_make_far_pointer(0x5000, 0x0540), 0); + assert(win16_read_u32(win16_far_add_offset(window, 0x21)) == 0x00cf0000u); + assert(win16_read_far_pointer(window, 0x37) == + win16_make_far_pointer(0x6000, 0x0100)); + assert(win16_read_u16(win16_far_add_offset(window, 0x29)) == 0x8000); + + g_parent_mdi_client = 0; + (void)object_windows_window_construct( + window, 0, win16_make_far_pointer(0x5000, 0x0540), parent); + assert(win16_read_u32(win16_far_add_offset(window, 0x21)) == 0x10000000u); + g_parent_mdi_client = mdi_client; + (void)object_windows_window_construct( + window, 0, win16_make_far_pointer(0x5000, 0x0540), parent); + assert(win16_read_u32(win16_far_add_offset(window, 0x21)) == 0x04000000u); + assert(win16_read_far_pointer(window, 0x37) == + win16_make_far_pointer(0x6000, 0x0200)); + assert((g_flags & 8) != 0); + + g_win16_instance = 0x7777; + g_register_result = true; + g_existing_object = 0; + g_previous_wndproc = (int32_t)win16_make_far_pointer(0x6000, 0x0800); + prepare_window(window, parent); + g_create_result = 0x8888; + g_create_ex_calls = 0; + g_bind_calls = 0; + g_created_calls = 0; + win16_set_indeterminate_u16(0); + assert(object_windows_create_native_window(window) == 1); + assert(g_create_ex_calls == 1 && g_bind_calls == 1 && g_created_calls == 1); + assert(g_object_windows_creating_object == window); + assert(win16_read_far_pointer(window, 0x37) == + (Win16FarPtr)g_previous_wndproc); + + prepare_window(window, parent); + g_flags = 2; + g_dialog_item_result = 0x9999; + g_existing_object = window; + assert(object_windows_create_native_window(window) == 1); + assert(win16_read_u16(win16_far_add_offset(window, 4)) == 0x9999); + + prepare_window(window, parent); + g_flags = 8; + g_parent_mdi_client = mdi_client; + g_create_result = 0xaaaa; + g_existing_object = window; + g_mdi_calls = 0; + assert(object_windows_create_native_window(window) == 1); + assert(g_mdi_calls == 1); + + prepare_window(window, parent); + g_create_result = 0; + g_existing_object = 0; + assert(object_windows_create_native_window(window) == 0); + assert(win16_read_u16(win16_far_add_offset(window, 2)) == 0xffff); + + prepare_window(window, parent); + g_register_result = false; + g_existing_object = window; + win16_set_indeterminate_u16(0xabcd); + assert(object_windows_create_native_window(window) == 0xab01); + return 0; +} diff --git a/original/reconstructed/tests/test_window_destroy.c b/original/reconstructed/tests/test_window_destroy.c new file mode 100644 index 0000000..a4352d4 --- /dev/null +++ b/original/reconstructed/tests/test_window_destroy.c @@ -0,0 +1,132 @@ +#include "../tdkpin_window_messages.h" +#include "../tdkpin_object_list.h" + +#include + +Win16FarPtr g_object_windows_application; +HINSTANCE16 g_win16_previous_instance; +HINSTANCE16 g_win16_instance; +uint16_t g_win16_show_command; +Win16FarPtr g_win16_message_box; +Win16FarPtr g_object_windows_dispatch_proc; +uint16_t g_object_windows_thunk_code_selector; +Win16FarPtr g_object_windows_free_thunk; +Win16FarPtr g_object_windows_message_hook; +Win16FarPtr g_object_windows_creating_object; + +static Win16FarPtr g_client_result; +static Win16FarPtr g_client_getter; +static unsigned g_getter_calls; +static HWND16 g_destroyed_window; +static HWND16 g_sent_window; +static UINT16 g_sent_message; +static WPARAM16 g_sent_wparam; +static LPARAM16 g_sent_lparam; + +void win16_call_object_action( + Win16FarPtr procedure, Win16FarPtr child) +{ + assert(procedure == win16_make_far_pointer(0x6000, 0x0cc7)); + object_windows_set_flag_4_if_windowed(0xffff, child); +} + +Win16FarPtr win16_call_object_far_method( + Win16FarPtr procedure, Win16FarPtr object) +{ + (void)object; + assert(procedure == g_client_getter); + g_getter_calls++; + return g_client_result; +} + +BOOL16 DestroyWindow16(HWND16 window) +{ + g_destroyed_window = window; + return 1; +} + +LRESULT16 SendMessage16( + HWND16 window, UINT16 message, WPARAM16 wparam, LPARAM16 lparam) +{ + g_sent_window = window; + g_sent_message = message; + g_sent_wparam = wparam; + g_sent_lparam = lparam; + return 0; +} + +static void write_far(uint16_t offset, Win16FarPtr pointer) +{ + win16_write_u16( + win16_dgroup_pointer(offset), 0, win16_far_offset(pointer)); + win16_write_u16( + win16_dgroup_pointer((uint16_t)(offset + 2)), + 0, + win16_far_selector(pointer)); +} + +static void reset_calls(void) +{ + g_getter_calls = 0; + g_destroyed_window = 0; + g_sent_window = 0; + g_sent_message = 0; + g_sent_wparam = 0; + g_sent_lparam = 0; +} + +int main(void) +{ + static uint8_t dgroup[0x1000]; + static uint8_t code[0x1000]; + static uint8_t window_bytes[64]; + static uint8_t child_bytes[64]; + static uint8_t parent_bytes[64]; + static uint8_t client_bytes[64]; + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, dgroup, sizeof(dgroup), true); + win16_set_dgroup_selector(0x5000); + win16_bind_ne_segment(4, 0x6000, code, sizeof(code), false); + win16_bind_segment(0x7000, window_bytes, sizeof(window_bytes), true); + win16_bind_segment(0x7100, child_bytes, sizeof(child_bytes), true); + win16_bind_segment(0x7200, parent_bytes, sizeof(parent_bytes), true); + win16_bind_segment(0x7300, client_bytes, sizeof(client_bytes), true); + + Win16FarPtr window = win16_make_far_pointer(0x7000, 2); + Win16FarPtr child = win16_make_far_pointer(0x7100, 2); + Win16FarPtr parent = win16_make_far_pointer(0x7200, 2); + Win16FarPtr client = win16_make_far_pointer(0x7300, 2); + win16_write_u16(window, 4, 0x77); + win16_write_u16(child, 4, 0x88); + win16_write_u16(client, 4, 0x99); + win16_write_u16(window, 6, win16_far_offset(parent)); + win16_write_u16(window, 8, win16_far_selector(parent)); + object_windows_append_child(window, child); + win16_write_u16(parent, 0, 0x0100); + g_client_getter = win16_make_far_pointer(0x6100, 0x0200); + write_far(0x0130, g_client_getter); + + reset_calls(); + object_windows_destroy_native_window(window); + assert(g_destroyed_window == 0x77); + assert(object_windows_has_flags(child, 4)); + + object_windows_update_flags(window, true, 8); + reset_calls(); + g_client_result = 0; + object_windows_destroy_native_window(window); + assert(g_getter_calls == 1 && g_destroyed_window == 0x77); + + reset_calls(); + g_client_result = client; + object_windows_destroy_native_window(window); + assert(g_getter_calls == 2 && g_destroyed_window == 0); + assert(g_sent_window == 0x99 && g_sent_message == 0x221); + assert(g_sent_wparam == 0x77 && g_sent_lparam == 0); + + win16_write_u16(window, 4, 0); + reset_calls(); + object_windows_destroy_native_window(window); + assert(g_getter_calls == 0 && g_destroyed_window == 0); + return 0; +} diff --git a/original/reconstructed/tests/test_window_lifecycle.c b/original/reconstructed/tests/test_window_lifecycle.c new file mode 100644 index 0000000..a1ec553 --- /dev/null +++ b/original/reconstructed/tests/test_window_lifecycle.c @@ -0,0 +1,89 @@ +#include "../tdkpin_window_lifecycle.h" + +#include + +static uint8_t g_dgroup[0x1000]; +static uint8_t g_objects[0x400]; +static Win16FarPtr g_window; +static Win16FarPtr g_peer; +static Win16FarPtr g_attached; +static Win16FarPtr g_title; +static unsigned g_step; +static bool g_board_mode; + +BOOL16 DeleteObject16(HGDIOBJ16 object) +{ + assert(++g_step == 1 && object == 0x7777); + if (g_board_mode) { + assert(win16_read_far_pointer(g_window, 0x41) == 0); + assert(win16_read_far_pointer(g_peer, 0x45) == 0); + } else { + assert(win16_read_far_pointer(g_window, 0x41) == g_peer); + assert(win16_read_far_pointer(g_peer, 0x41) == g_window); + } + return 1; +} + +void borland_far_strdispose(Win16FarPtr string) +{ + assert(++g_step == 2 && string == g_title); +} + +void borland_dispose_object(Win16FarPtr object) +{ + assert(++g_step == 3 && object == g_attached); +} + +void object_windows_object_destruct( + Win16FarPtr object, uint16_t vmt) +{ + assert(++g_step == 4 && object == g_window && vmt == 0); +} + +void borland_finish_object_destructor( + BorlandObjectCallFrame *frame, uint16_t vmt_field_offset) +{ + assert(frame->object == g_window && vmt_field_offset == 0); + if (++g_step == 5) { + assert(frame->vmt_argument == 0); + } else { + assert(g_step == 6 && frame->vmt_argument == 0x9999); + } +} + +int main(void) +{ + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, g_dgroup, sizeof(g_dgroup), true); + win16_bind_segment(0x6000, g_objects, sizeof(g_objects), true); + win16_set_dgroup_selector(0x5000); + g_window = win16_make_far_pointer(0x6000, 0); + g_peer = win16_make_far_pointer(0x6000, 0x100); + g_attached = win16_make_far_pointer(0x6000, 0x200); + g_title = win16_make_far_pointer(0x6000, 0x300); + win16_write_u16(win16_make_far_pointer(0x5000, 0x0867), 0, 0x7777); + win16_write_u32(g_window, 0x1d, g_title); + win16_write_u32(g_window, 0x3b, g_attached); + win16_write_u32(g_window, 0x41, g_peer); + win16_write_u32(g_peer, 0x41, g_window); + + g_board_mode = false; + tdkpin_overlay_window_destruct(g_window, 0x9999); + assert(g_step == 6); + assert(win16_read_far_pointer(g_window, 0x3b) == 0); + assert(win16_read_far_pointer(g_window, 0x41) == 0); + assert(win16_read_far_pointer(g_peer, 0x41) == 0); + + g_step = 0; + g_board_mode = true; + win16_write_u32(g_window, 0x1d, g_title); + win16_write_u32(g_window, 0x3b, g_attached); + win16_write_u32(g_window, 0x41, g_peer); + win16_write_u32(g_peer, 0x45, g_window); + tdkpin_board_window_destruct(g_window, 0x9999); + assert(g_step == 6); + assert(win16_read_far_pointer(g_window, 0x3b) == 0); + assert(win16_read_far_pointer(g_window, 0x41) == 0); + assert(win16_read_far_pointer(g_peer, 0x45) == 0); + return 0; +} diff --git a/original/reconstructed/tests/test_window_messages.c b/original/reconstructed/tests/test_window_messages.c new file mode 100644 index 0000000..2681c02 --- /dev/null +++ b/original/reconstructed/tests/test_window_messages.c @@ -0,0 +1,365 @@ +#include "../tdkpin_window_messages.h" + +#include + +Win16FarPtr g_object_windows_application; +HINSTANCE16 g_win16_previous_instance; +HINSTANCE16 g_win16_instance; +uint16_t g_win16_show_command; +Win16FarPtr g_win16_message_box; +Win16FarPtr g_object_windows_dispatch_proc; +uint16_t g_object_windows_thunk_code_selector; +Win16FarPtr g_object_windows_free_thunk; +Win16FarPtr g_object_windows_message_hook; +Win16FarPtr g_object_windows_creating_object; + +static bool g_bool_result; +static Win16FarPtr g_bool_proc; +static Win16FarPtr g_disposed; +static Win16FarPtr g_event_proc; +static Win16FarPtr g_event_object; +static unsigned g_event_calls; +static uint16_t g_quit_code; +static uint16_t g_removed_property_offsets[2]; +static unsigned g_remove_calls; +static int32_t g_window_style; +static HWND16 g_focus_window; +static HWND16 g_is_child_parent; +static HWND16 g_is_child_child; +static BOOL16 g_is_child_result; +static Win16FarPtr g_void_proc; +static Win16FarPtr g_original_proc; +static HWND16 g_original_window; +static UINT16 g_original_message; +static WPARAM16 g_original_wparam; +static LPARAM16 g_original_lparam; +static BOOL16 g_is_window_result; +static BOOL16 g_is_iconic_result; +static HWND16 g_set_focus_window; + +bool win16_call_object_bool_method( + Win16FarPtr procedure, Win16FarPtr object) +{ + (void)object; + g_bool_proc = procedure; + return g_bool_result; +} + +void borland_dispose_object(Win16FarPtr object) +{ + g_disposed = object; +} + +void win16_call_object_message_handler( + Win16FarPtr procedure, + Win16FarPtr object, + ObjectWindowsMessage *message) +{ + (void)message; + g_event_proc = procedure; + g_event_object = object; + g_event_calls++; +} + +void PostQuitMessage16(INT16 exit_code) +{ + g_quit_code = (uint16_t)exit_code; +} + +Win16Handle RemoveProp16(HWND16 window, Win16FarPtr name) +{ + assert(window == 0x77 && g_remove_calls < 2); + g_removed_property_offsets[g_remove_calls++] = win16_far_offset(name); + return 0; +} + +int32_t GetWindowLong16(HWND16 window, INT16 index) +{ + assert(window == 0x77 && index == -16); + return g_window_style; +} + +HWND16 GetFocus16(void) +{ + return g_focus_window; +} + +BOOL16 IsChild16(HWND16 parent, HWND16 child) +{ + g_is_child_parent = parent; + g_is_child_child = child; + return g_is_child_result; +} + +BOOL16 IsWindow16(HWND16 window) +{ + assert(window != 0); + return g_is_window_result; +} + +BOOL16 IsIconic16(HWND16 window) +{ + assert(window == 0x77); + return g_is_iconic_result; +} + +HWND16 SetFocus16(HWND16 window) +{ + g_set_focus_window = window; + return 0; +} + +void win16_call_object_method( + Win16FarPtr procedure, Win16FarPtr object) +{ + assert(object != 0); + g_void_proc = procedure; +} + +LRESULT16 CallWindowProc16( + Win16FarPtr procedure, + HWND16 window, + UINT16 message, + WPARAM16 wparam, + LPARAM16 lparam) +{ + g_original_proc = procedure; + g_original_window = window; + g_original_message = message; + g_original_wparam = wparam; + g_original_lparam = lparam; + return (LRESULT16)0x12345678u; +} + +static void write_far(uint16_t offset, Win16FarPtr pointer) +{ + win16_write_u16( + win16_dgroup_pointer(offset), 0, win16_far_offset(pointer)); + win16_write_u16( + win16_dgroup_pointer((uint16_t)(offset + 2)), + 0, + win16_far_selector(pointer)); +} + +int main(void) +{ + static uint8_t dgroup[0x1000]; + static uint8_t application_bytes[64]; + static uint8_t main_bytes[80]; + static uint8_t other_bytes[80]; + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, dgroup, sizeof(dgroup), true); + win16_set_dgroup_selector(0x5000); + win16_bind_segment( + 0x7000, application_bytes, sizeof(application_bytes), true); + win16_bind_segment(0x7100, main_bytes, sizeof(main_bytes), true); + win16_bind_segment(0x7200, other_bytes, sizeof(other_bytes), true); + + g_object_windows_application = win16_make_far_pointer(0x7000, 2); + Win16FarPtr main_window = win16_make_far_pointer(0x7100, 2); + Win16FarPtr other_window = win16_make_far_pointer(0x7200, 2); + uint16_t app_vmt = 0x0100; + uint16_t window_vmt = 0x0200; + win16_write_u16(g_object_windows_application, 0, app_vmt); + win16_write_u16(main_window, 0, window_vmt); + win16_write_u16(other_window, 0, window_vmt); + win16_write_u16(main_window, 4, 0x77); + win16_write_u16(other_window, 4, 0x77); + win16_write_u16(other_window, 2, 9); + win16_write_u8(win16_far_add_offset(other_window, 0x16), 1); + win16_write_u16( + g_object_windows_application, 8, win16_far_offset(main_window)); + win16_write_u16( + g_object_windows_application, 10, win16_far_selector(main_window)); + + Win16FarPtr app_can_close = win16_make_far_pointer(0x6000, 0x1000); + Win16FarPtr window_can_close = win16_make_far_pointer(0x6000, 0x2000); + Win16FarPtr default_handler = win16_make_far_pointer(0x6100, 0x3000); + Win16FarPtr message_0014 = win16_make_far_pointer(0x6100, 0x4000); + Win16FarPtr scroll_handler = win16_make_far_pointer(0x6100, 0x5000); + Win16FarPtr slot_38 = win16_make_far_pointer(0x6100, 0x6000); + write_far(app_vmt + 0x44, app_can_close); + write_far(window_vmt + 0x3c, window_can_close); + write_far(window_vmt + 0x0c, default_handler); + write_far(window_vmt + 0x10, message_0014); + write_far(window_vmt + 0x48, scroll_handler); + write_far(window_vmt + 0x38, slot_38); + + assert(object_windows_has_flags(other_window, 1)); + assert(!object_windows_has_flags(other_window, 3)); + assert(object_windows_zero_word_default(other_window) == 0); + object_windows_set_flag_4(other_window); + assert(object_windows_has_flags(other_window, 5)); + object_windows_clear_flag_4(other_window); + assert(object_windows_has_flags(other_window, 1)); + object_windows_set_flag_1(other_window); + assert(object_windows_has_flags(other_window, 1)); + object_windows_update_flags(other_window, false, 1); + assert(!object_windows_has_flags(other_window, 1)); + object_windows_set_flag_1(other_window); + ObjectWindowsMessage message = { + .window = 0x77, + .message = 0, + .wparam = 1, + .lparam = 0, + .result = 0, + }; + + g_bool_result = false; + g_disposed = 0; + object_windows_wm_close(main_window, &message); + assert(g_bool_proc == app_can_close && g_disposed == 0); + g_bool_result = true; + object_windows_wm_close(other_window, &message); + assert(g_bool_proc == window_can_close && g_disposed == other_window); + + g_event_calls = 0; + g_quit_code = 0; + object_windows_wm_destroy(main_window, &message); + assert(g_quit_code == 0x77); + assert(g_event_calls == 1 && g_event_proc == default_handler); + g_quit_code = 0; + object_windows_wm_destroy(other_window, &message); + assert(g_quit_code == 0); + + g_remove_calls = 0; + object_windows_wm_nc_destroy(other_window, &message); + assert(g_remove_calls == 2); + assert(g_removed_property_offsets[0] == 0x067a); + assert(g_removed_property_offsets[1] == 0x067e); + assert(win16_read_u16(win16_far_add_offset(other_window, 4)) == 0); + + win16_write_u16(other_window, 4, 0x77); + message.wparam = 1; + object_windows_wm_activate(other_window, &message); + assert(win16_read_far_pointer(g_object_windows_application, 0x0e) == + other_window); + message.wparam = 0; + object_windows_wm_activate(other_window, &message); + assert(win16_read_far_pointer(g_object_windows_application, 0x0e) == + other_window); + win16_write_u8(win16_far_add_offset(other_window, 0x16), 0); + message.wparam = 1; + object_windows_wm_activate(other_window, &message); + assert(win16_read_far_pointer(g_object_windows_application, 0x0e) == 0); + + g_bool_result = true; + object_windows_wm_query_end_session(main_window, &message); + assert(message.result == 1 && g_bool_proc == app_can_close); + g_bool_result = false; + object_windows_wm_query_end_session(other_window, &message); + assert(message.result == 0 && g_bool_proc == window_can_close); + + g_bool_result = false; + g_event_calls = 0; + object_windows_message_0014(main_window, &message); + assert(g_bool_proc == app_can_close && g_event_calls == 0); + object_windows_message_0014(other_window, &message); + assert(g_event_calls == 1 && g_event_proc == message_0014); + assert(g_event_object == other_window); + + g_window_style = 0; + object_windows_wm_hscroll(other_window, &message); + assert(g_event_proc == scroll_handler); + object_windows_wm_vscroll(other_window, &message); + assert(g_event_proc == scroll_handler); + g_window_style = (int32_t)0x00100000u; + object_windows_wm_hscroll(other_window, &message); + assert(g_event_proc == default_handler); + g_window_style = (int32_t)0x00200000u; + object_windows_wm_vscroll(other_window, &message); + assert(g_event_proc == default_handler); + assert(object_windows_turbo_window_class_name(other_window) == + win16_dgroup_pointer(0x068c)); + g_event_calls = 0; + object_windows_forward_default(other_window, &message); + assert(g_event_calls == 1 && g_event_proc == default_handler); + win16_write_u8(win16_far_add_offset(other_window, 0x16), 0); + win16_write_u16(other_window, 4, 0); + object_windows_set_flag_4_if_windowed(0xbeef, other_window); + assert(!object_windows_has_flags(other_window, 4)); + win16_write_u16(other_window, 4, 0x77); + object_windows_set_flag_4_if_windowed(0xbeef, other_window); + assert(object_windows_has_flags(other_window, 4)); + win16_write_u16(other_window, 0x35, 0xbeef); + assert(object_windows_get_field_35(other_window) == 0xbeef); + + g_focus_window = 0; + win16_write_u16(other_window, 0x3f, 0); + object_windows_remember_child_focus(other_window); + assert(win16_read_u16(win16_far_add_offset(other_window, 0x3f)) == 0); + g_focus_window = 0x99; + g_is_child_result = 0; + object_windows_remember_child_focus(other_window); + assert(g_is_child_parent == 0x77 && g_is_child_child == 0x99); + assert(win16_read_u16(win16_far_add_offset(other_window, 0x3f)) == 0); + g_is_child_result = 1; + object_windows_remember_child_focus(other_window); + assert(win16_read_u16(win16_far_add_offset(other_window, 0x3f)) == 0x99); + + g_void_proc = 0; + g_event_calls = 0; + object_windows_call_slot_38_then_default(other_window, &message); + assert(g_void_proc == slot_38 && g_event_calls == 1); + g_focus_window = 0x88; + g_is_child_result = 1; + g_event_calls = 0; + object_windows_remember_focus_then_default(other_window, &message); + assert(win16_read_u16(win16_far_add_offset(other_window, 0x3f)) == 0x88); + assert(g_event_calls == 1 && g_event_proc == default_handler); + Win16FarPtr original_proc = win16_make_far_pointer(0x6200, 0x7000); + win16_write_u16(other_window, 0x37, win16_far_offset(original_proc)); + win16_write_u16(other_window, 0x39, win16_far_selector(original_proc)); + message.message = 0x123; + message.wparam = 0x4567; + message.lparam = (LPARAM16)0x89abcdefu; + object_windows_call_original_window_proc(other_window, &message); + assert(g_original_proc == original_proc && g_original_window == 0x77); + assert(g_original_message == 0x123 && g_original_wparam == 0x4567); + assert(g_original_lparam == (LPARAM16)0x89abcdefu); + assert(message.result == (LRESULT16)0x12345678u); + g_void_proc = 0; + object_windows_call_slot_38(other_window, &message); + assert(g_void_proc == slot_38); + message.result = (LRESULT16)0x76543210u; + object_windows_zero_message_result(other_window, &message); + assert(message.result == 0); + + win16_write_u16(other_window, 0x3f, 0x99); + g_is_window_result = 0; + g_set_focus_window = 0; + object_windows_restore_child_focus(other_window); + assert(g_set_focus_window == 0); + g_is_window_result = 1; + g_is_iconic_result = 1; + object_windows_restore_child_focus(other_window); + assert(g_set_focus_window == 0); + g_is_iconic_result = 0; + object_windows_restore_child_focus(other_window); + assert(g_set_focus_window == 0x99); + + win16_write_u8(win16_far_add_offset(other_window, 0x16), 1); + message.wparam = 0; + g_focus_window = 0x88; + g_is_child_result = 1; + object_windows_wm_activate_with_focus(other_window, &message); + assert(win16_read_u16(win16_far_add_offset(other_window, 0x3f)) == 0x88); + message.wparam = 1; + g_set_focus_window = 0; + object_windows_wm_activate_with_focus(other_window, &message); + assert(g_set_focus_window == 0x88); + + message.wparam = 0xf020; + g_focus_window = 0x66; + object_windows_wm_syscommand_focus(other_window, &message); + assert(win16_read_u16(win16_far_add_offset(other_window, 0x3f)) == 0x66); + message.wparam = 0xf120; + g_set_focus_window = 0; + object_windows_wm_syscommand_focus(other_window, &message); + assert(g_set_focus_window == 0x66); + message.wparam = 0x1234; + g_set_focus_window = 0; + object_windows_wm_syscommand_focus(other_window, &message); + assert(g_set_focus_window == 0); + return 0; +} diff --git a/original/reconstructed/tests/test_window_placement.c b/original/reconstructed/tests/test_window_placement.c new file mode 100644 index 0000000..459a0c1 --- /dev/null +++ b/original/reconstructed/tests/test_window_placement.c @@ -0,0 +1,267 @@ +#include "../tdkpin_window_placement.h" + +#include +#include +#include +#include + +enum { + WINDOW_HANDLE = 4, + WINDOW_PARENT = 6, + WINDOW_FLAGS = 0x16, + WINDOW_ATTRIBUTES = 0x21, + WINDOW_X = 0x29, + WINDOW_Y = 0x2b, + WINDOW_WIDTH = 0x2d, + WINDOW_HEIGHT = 0x2f, + WINDOW_ATTACHED = 0x3b, +}; + +static uint8_t g_dgroup[0x1000]; +static uint8_t g_objects[0x1000]; +static Win16FarPtr g_window; +static Win16FarPtr g_parent; +static Win16FarPtr g_client; +static Win16FarPtr g_attached; +static Win16FarPtr g_parent_getter; +static Win16FarPtr g_attached_setup; +static Win16FarPtr g_client_result; +static bool g_iconic; +static bool g_zoomed; +static RECT16 g_native_rectangle; +static unsigned g_is_iconic_calls; +static unsigned g_is_zoomed_calls; +static unsigned g_get_rect_calls; +static unsigned g_screen_to_client_calls; +static HWND16 g_screen_to_client_window; +static POINT16 g_client_delta; +static unsigned g_prepare_calls; +static unsigned g_flag_calls; +static unsigned g_focus_calls; +static HWND16 g_focused_window; +static unsigned g_parent_getter_calls; +static unsigned g_attached_setup_calls; + +static Win16FarPtr object_at(uint16_t offset) +{ + return win16_make_far_pointer(0x6000, offset); +} + +static Win16FarPtr dgroup_at(uint16_t offset) +{ + return win16_make_far_pointer(0x5000, offset); +} + +static void write_far(Win16FarPtr base, uint16_t offset, Win16FarPtr value) +{ + win16_write_u32(base, offset, value); +} + +static void reset_fixture(void) +{ + memset(g_objects, 0, sizeof(g_objects)); + memset(g_dgroup, 0, sizeof(g_dgroup)); + g_window = object_at(0x100); + g_parent = object_at(0x200); + g_client = object_at(0x300); + g_attached = object_at(0x400); + g_parent_getter = win16_make_far_pointer(0x7000, 0x1234); + g_attached_setup = win16_make_far_pointer(0x7000, 0x5678); + win16_write_u16(g_parent, 0, 0x0100); + win16_write_u16(g_attached, 0, 0x0200); + write_far(dgroup_at(0x0100), 0x30, g_parent_getter); + write_far(dgroup_at(0x0200), 0x10, g_attached_setup); + win16_write_u16(g_window, WINDOW_HANDLE, 0x1111); + win16_write_u16(g_parent, WINDOW_HANDLE, 0x2222); + win16_write_u16(g_client, WINDOW_HANDLE, 0x3333); + g_native_rectangle = (RECT16){10, 20, 110, 220}; + g_client_delta = (POINT16){3, 5}; + g_client_result = 0; + g_iconic = false; + g_zoomed = false; + g_is_iconic_calls = 0; + g_is_zoomed_calls = 0; + g_get_rect_calls = 0; + g_screen_to_client_calls = 0; + g_screen_to_client_window = 0; + g_prepare_calls = 0; + g_flag_calls = 0; + g_focus_calls = 0; + g_focused_window = 0; + g_parent_getter_calls = 0; + g_attached_setup_calls = 0; +} + +BOOL16 IsIconic16(HWND16 window) +{ + assert(window == 0x1111); + g_is_iconic_calls++; + return g_iconic; +} + +BOOL16 IsZoomed16(HWND16 window) +{ + assert(window == 0x1111); + g_is_zoomed_calls++; + return g_zoomed; +} + +BOOL16 GetWindowRect16(HWND16 window, Win16FarPtr rectangle) +{ + assert(window == 0x1111); + win16_write_u16(rectangle, 0, (uint16_t)g_native_rectangle.left); + win16_write_u16(rectangle, 2, (uint16_t)g_native_rectangle.top); + win16_write_u16(rectangle, 4, (uint16_t)g_native_rectangle.right); + win16_write_u16(rectangle, 6, (uint16_t)g_native_rectangle.bottom); + g_get_rect_calls++; + return 1; +} + +BOOL16 ScreenToClient16(HWND16 window, Win16FarPtr point) +{ + int16_t x = (int16_t)win16_read_u16(point); + int16_t y = (int16_t)win16_read_u16(win16_far_add_offset(point, 2)); + win16_write_u16(point, 0, (uint16_t)(x - g_client_delta.x)); + win16_write_u16(point, 2, (uint16_t)(y - g_client_delta.y)); + g_screen_to_client_window = window; + g_screen_to_client_calls++; + return 1; +} + +bool object_windows_has_flags(Win16FarPtr object, uint8_t mask) +{ + assert(object == g_window && mask == 8); + g_flag_calls++; + return (win16_read_u8( + win16_far_add_offset(object, WINDOW_FLAGS)) & mask) == mask; +} + +Win16FarPtr win16_call_object_far_method( + Win16FarPtr procedure, Win16FarPtr object) +{ + assert(procedure == g_parent_getter && object == g_parent); + g_parent_getter_calls++; + return g_client_result; +} + +void object_windows_prepare_window(Win16FarPtr window) +{ + assert(window == g_window); + g_prepare_calls++; +} + +HWND16 SetFocus16(HWND16 window) +{ + g_focused_window = window; + g_focus_calls++; + return 0x9999; +} + +void win16_call_object_method( + Win16FarPtr procedure, Win16FarPtr object) +{ + assert(procedure == g_attached_setup && object == g_attached); + g_attached_setup_calls++; +} + +static void assert_placement( + int16_t x, int16_t y, uint16_t width, uint16_t height) +{ + assert((int16_t)win16_read_u16( + win16_far_add_offset(g_window, WINDOW_X)) == x); + assert((int16_t)win16_read_u16( + win16_far_add_offset(g_window, WINDOW_Y)) == y); + assert(win16_read_u16( + win16_far_add_offset(g_window, WINDOW_WIDTH)) == width); + assert(win16_read_u16( + win16_far_add_offset(g_window, WINDOW_HEIGHT)) == height); +} + +static void test_minimized_and_maximized_skip(void) +{ + reset_fixture(); + win16_write_u16(g_window, WINDOW_X, 0xaaaa); + win16_write_u16(g_window, WINDOW_Y, 0xbbbb); + win16_write_u16(g_window, WINDOW_WIDTH, 0xcccc); + win16_write_u16(g_window, WINDOW_HEIGHT, 0xdddd); + g_iconic = true; + object_windows_capture_normal_placement(g_window); + assert(g_is_iconic_calls == 1 && g_is_zoomed_calls == 0); + assert(g_get_rect_calls == 0); + assert_placement( + (int16_t)0xaaaa, (int16_t)0xbbbb, 0xcccc, 0xdddd); + + g_iconic = false; + g_zoomed = true; + object_windows_capture_normal_placement(g_window); + assert(g_is_iconic_calls == 2 && g_is_zoomed_calls == 1); + assert(g_get_rect_calls == 0); +} + +static void test_screen_and_parent_coordinates(void) +{ + reset_fixture(); + object_windows_capture_normal_placement(g_window); + assert(g_get_rect_calls == 1 && g_screen_to_client_calls == 0); + assert_placement(10, 20, 100, 200); + + reset_fixture(); + write_far(g_window, WINDOW_PARENT, g_parent); + g_client_result = g_client; + win16_write_u8(win16_far_add_offset(g_window, WINDOW_FLAGS), 8); + object_windows_capture_normal_placement(g_window); + assert(g_parent_getter_calls == 1 && g_flag_calls == 1); + assert(g_screen_to_client_calls == 1); + assert(g_screen_to_client_window == 0x3333); + assert_placement(7, 15, 100, 200); + + reset_fixture(); + write_far(g_window, WINDOW_PARENT, g_parent); + g_client_result = 0; + win16_write_u32(g_window, WINDOW_ATTRIBUTES, 0x40000000U); + object_windows_capture_normal_placement(g_window); + assert(g_parent_getter_calls == 1 && g_flag_calls == 0); + assert(g_screen_to_client_window == 0x2222); + assert_placement(7, 15, 100, 200); + + reset_fixture(); + write_far(g_window, WINDOW_PARENT, g_parent); + g_client_result = g_client; + object_windows_capture_normal_placement(g_window); + assert(g_flag_calls == 1 && g_screen_to_client_calls == 0); + assert_placement(10, 20, 100, 200); +} + +static void test_setup_sequence(void) +{ + reset_fixture(); + win16_write_u8(win16_far_add_offset(g_window, WINDOW_FLAGS), 8); + write_far(g_window, WINDOW_ATTACHED, g_attached); + object_windows_setup_window(g_window); + assert(g_prepare_calls == 1 && g_flag_calls == 1); + assert(g_focus_calls == 1 && g_focused_window == 0x1111); + assert(g_attached_setup_calls == 1); + assert(g_get_rect_calls == 1); + assert_placement(10, 20, 100, 200); + + reset_fixture(); + object_windows_setup_window(g_window); + assert(g_prepare_calls == 1 && g_flag_calls == 1); + assert(g_focus_calls == 0 && g_attached_setup_calls == 0); + assert(g_get_rect_calls == 1); +} + +int main(void) +{ + uint8_t stack_marker; + uintptr_t stack_base = (uintptr_t)&stack_marker - 0x8000; + win16_reset_segment_bindings(); + win16_bind_segment(0x5000, g_dgroup, sizeof(g_dgroup), true); + win16_bind_segment(0x6000, g_objects, sizeof(g_objects), true); + win16_bind_segment(0x9000, (void *)stack_base, 0x10000, true); + win16_set_dgroup_selector(0x5000); + test_minimized_and_maximized_skip(); + test_screen_and_parent_coordinates(); + test_setup_sequence(); + return 0; +} diff --git a/original/tools/ApplyWin16ImportSignatures.java b/original/tools/ApplyWin16ImportSignatures.java new file mode 100644 index 0000000..e575e71 --- /dev/null +++ b/original/tools/ApplyWin16ImportSignatures.java @@ -0,0 +1,139 @@ +// Apply Wine-11.15-backed Win16 import prototypes before decompilation. +// @category TDKPIN + +import java.io.BufferedReader; +import java.io.FileReader; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import ghidra.app.script.GhidraScript; +import ghidra.program.model.data.ByteDataType; +import ghidra.program.model.data.CharDataType; +import ghidra.program.model.data.DataType; +import ghidra.program.model.data.IntegerDataType; +import ghidra.program.model.data.PointerDataType; +import ghidra.program.model.data.ShortDataType; +import ghidra.program.model.data.UnsignedIntegerDataType; +import ghidra.program.model.data.UnsignedShortDataType; +import ghidra.program.model.data.VoidDataType; +import ghidra.program.model.listing.Function; +import ghidra.program.model.listing.Function.FunctionUpdateType; +import ghidra.program.model.listing.Parameter; +import ghidra.program.model.listing.ParameterImpl; +import ghidra.program.model.listing.ReturnParameterImpl; +import ghidra.program.model.symbol.SourceType; + +public class ApplyWin16ImportSignatures extends GhidraScript { + private static final Pattern PROTOTYPE = Pattern.compile( + "^pascal16(?(?: -\\S+)*) [A-Za-z0-9_@]+\\((?.*)\\)$"); + + @Override + public void run() throws Exception { + String[] args = getScriptArgs(); + if (args.length != 1) { + throw new IllegalArgumentException( + "usage: ApplyWin16ImportSignatures.java IMPORT_RECONSTRUCTION.tsv"); + } + + int applied = 0; + int dataExports = 0; + int registerExports = 0; + try (BufferedReader reader = new BufferedReader(new FileReader(args[0]))) { + String header = reader.readLine(); + if (header == null) { + throw new IllegalArgumentException("empty import ledger"); + } + Map columns = columns(header); + String line; + while ((line = reader.readLine()) != null && !monitor.isCancelled()) { + String[] fields = line.split("\\t", -1); + String status = field(fields, columns, "status"); + if ("runtime-data".equals(status)) { + dataExports++; + continue; + } + String address = field(fields, columns, "address"); + String prototype = field(fields, columns, "prototype"); + Function function = getFunctionAt(toAddr(address)); + if (function == null) { + throw new IllegalStateException("missing imported function at " + address); + } + if (prototype.startsWith("pascal16 -register ")) { + registerExports++; + continue; + } + apply(function, prototype); + applied++; + } + } + analyzeAll(currentProgram); + println("Applied " + applied + " Win16 import signatures; skipped " + dataExports + + " runtime-data and " + registerExports + " register-entry slots"); + } + + private void apply(Function function, String prototype) throws Exception { + Matcher matcher = PROTOTYPE.matcher(prototype); + if (!matcher.matches()) { + throw new IllegalArgumentException( + "unsupported prototype for " + function.getEntryPoint() + ": " + prototype); + } + + List parameters = new ArrayList<>(); + String arguments = matcher.group("arguments").trim(); + if (!arguments.isEmpty()) { + String[] tokens = arguments.contains(",") ? arguments.split(",") : arguments.split("\\s+"); + for (int index = 0; index < tokens.length; index++) { + String token = tokens[index].trim(); + String[] words = token.split("\\s+"); + DataType type = type(words[0]); + String name = words.length > 1 ? words[words.length - 1] : "arg" + (index + 1); + parameters.add(new ParameterImpl(name, type, currentProgram)); + } + } + + boolean ret16 = matcher.group("flags").contains("-ret16"); + DataType returnType = ret16 ? UnsignedShortDataType.dataType + : UnsignedIntegerDataType.dataType; + ReturnParameterImpl returnParameter = new ReturnParameterImpl(returnType, currentProgram); + function.updateFunction("__stdcall16far", returnParameter, + FunctionUpdateType.DYNAMIC_STORAGE_ALL_PARAMS, true, SourceType.USER_DEFINED, + parameters.toArray(Parameter[]::new)); + } + + private DataType type(String name) { + return switch (name) { + case "byte" -> ByteDataType.dataType; + case "s_byte" -> ByteDataType.dataType; + case "word", "HWND16" -> UnsignedShortDataType.dataType; + case "s_word" -> ShortDataType.dataType; + case "long" -> UnsignedIntegerDataType.dataType; + case "s_long" -> IntegerDataType.dataType; + case "ptr", "segptr" -> + new PointerDataType(VoidDataType.dataType, 4, currentProgram.getDataTypeManager()); + case "str", "segstr" -> + new PointerDataType(CharDataType.dataType, 4, currentProgram.getDataTypeManager()); + default -> throw new IllegalArgumentException("unsupported Win16 argument type: " + name); + }; + } + + private Map columns(String header) { + Map result = new HashMap<>(); + String[] names = header.split("\\t", -1); + for (int index = 0; index < names.length; index++) { + result.put(names[index], index); + } + return result; + } + + private String field(String[] fields, Map columns, String name) { + Integer index = columns.get(name); + if (index == null || index >= fields.length) { + throw new IllegalArgumentException("missing import-ledger column: " + name); + } + return fields[index]; + } +} diff --git a/original/tools/AuditCoverage.java b/original/tools/AuditCoverage.java index 7a19847..ed16a71 100644 --- a/original/tools/AuditCoverage.java +++ b/original/tools/AuditCoverage.java @@ -64,7 +64,7 @@ public class AuditCoverage extends GhidraScript { AddressSet explained = instructions.union(definedData); AddressSet undefined = executable.subtract(explained); - out.printf("summary\texecutable-bytes\t\t%d\t%n", executable.getNumAddresses()); + out.printf("summary\texecutable-bytes\t\t%d\tn/a%n", executable.getNumAddresses()); out.printf("summary\tdisassembled-bytes\t\t%d\t%.2f%% of executable%n", instructions.getNumAddresses(), percent(instructions, executable)); out.printf("summary\tdefined-data-bytes\t\t%d\t%.2f%% of executable%n", @@ -73,10 +73,10 @@ public class AuditCoverage extends GhidraScript { explained.getNumAddresses(), percent(explained, executable)); out.printf("summary\tfunction-body-bytes\t\t%d\t%.2f%% of executable%n", functionBodies.intersect(executable).getNumAddresses(), percent(functionBodies, executable)); - out.printf("summary\tinternal-functions\t\t%d\t%n", internalFunctions); - out.printf("summary\tundefined-executable-bytes\t\t%d\t%n", undefined.getNumAddresses()); + out.printf("summary\tinternal-functions\t\t%d\tn/a%n", internalFunctions); + out.printf("summary\tundefined-executable-bytes\t\t%d\tn/a%n", undefined.getNumAddresses()); for (var range : undefined) { - out.printf("undefined-range\t%s\t%s\t%d\t%n", range.getMinAddress(), + out.printf("undefined-range\t%s\t%s\t%d\tnot-in-listing%n", range.getMinAddress(), range.getMaxAddress(), range.getLength()); } } diff --git a/original/tools/ExportDecompilation.java b/original/tools/ExportDecompilation.java index cf27bdb..b01f0cf 100644 --- a/original/tools/ExportDecompilation.java +++ b/original/tools/ExportDecompilation.java @@ -59,9 +59,11 @@ public class ExportDecompilation extends GhidraScript { DecompileResults result = decompiler.decompileFunction(function, 120, monitor); c.printf("/* ===== %s %s ===== */%n", address, name); if (result.decompileCompleted() && result.getDecompiledFunction() != null) { - c.println(result.getDecompiledFunction().getC()); + for (String line : result.getDecompiledFunction().getC().split("\\R", -1)) { + c.println(line.stripTrailing()); + } succeeded++; - ledger.printf("%s\t%s\tinternal\tok\t%n", address, name); + ledger.printf("%s\t%s\tinternal\tok\tdecompiled%n", address, name); } else { String message = result.getErrorMessage(); c.printf("/* DECOMPILATION FAILED: %s */%n%n", message); diff --git a/original/tools/ExportProgramEvidence.java b/original/tools/ExportProgramEvidence.java new file mode 100644 index 0000000..4732367 --- /dev/null +++ b/original/tools/ExportProgramEvidence.java @@ -0,0 +1,210 @@ +// Export function metadata, references, defined data, symbols, and unexplained +// executable bytes for an auditable TDKPIN reconstruction ledger. +// @category TDKPIN + +import java.io.BufferedWriter; +import java.io.FileWriter; +import java.io.PrintWriter; + +import ghidra.app.script.GhidraScript; +import ghidra.program.model.address.Address; +import ghidra.program.model.address.AddressRange; +import ghidra.program.model.address.AddressSet; +import ghidra.program.model.data.DataType; +import ghidra.program.model.listing.Data; +import ghidra.program.model.listing.Function; +import ghidra.program.model.listing.FunctionIterator; +import ghidra.program.model.listing.Instruction; +import ghidra.program.model.listing.InstructionIterator; +import ghidra.program.model.mem.MemoryBlock; +import ghidra.program.model.symbol.Reference; +import ghidra.program.model.symbol.ReferenceIterator; +import ghidra.program.model.symbol.Symbol; +import ghidra.program.model.symbol.SymbolIterator; + +public class ExportProgramEvidence extends GhidraScript { + @Override + public void run() throws Exception { + String[] args = getScriptArgs(); + if (args.length != 5) { + throw new IllegalArgumentException( + "usage: ExportProgramEvidence.java FUNCTIONS REFERENCES DATA SYMBOLS UNEXPLAINED"); + } + + exportFunctions(args[0]); + exportReferences(args[1]); + exportDefinedData(args[2]); + exportSymbols(args[3]); + exportUnexplainedExecutableBytes(args[4]); + } + + private void exportFunctions(String path) throws Exception { + try (PrintWriter out = writer(path)) { + out.println("address\tname\tnamespace\tblock\tbody_bytes\tentry_kind\tcalling_convention" + + "\tstack_purge_bytes\treturn_type\tparameter_count\tvarargs\tthunk"); + FunctionIterator functions = currentProgram.getFunctionManager().getFunctions(true); + while (functions.hasNext() && !monitor.isCancelled()) { + Function function = functions.next(); + Address address = function.getEntryPoint(); + MemoryBlock block = currentProgram.getMemory().getBlock(address); + boolean imported = function.isExternal() || block == null || + !block.isInitialized() || "EXTERNAL".equals(block.getName()); + String kind = imported ? "external" : "internal"; + DataType returnType = function.getReturnType(); + out.printf("%s\t%s\t%s\t%s\t%d\t%s\t%s\t%d\t%s\t%d\t%s\t%s%n", + address, + clean(function.getName()), + clean(function.getParentNamespace().getName()), + block == null ? "" : clean(block.getName()), + function.getBody().getNumAddresses(), + kind, + clean(function.getCallingConventionName()), + function.getStackPurgeSize(), + returnType == null ? "" : clean(returnType.getDisplayName()), + function.getParameterCount(), + function.hasVarArgs(), + function.isThunk()); + } + } + } + + private void exportReferences(String path) throws Exception { + try (PrintWriter out = writer(path)) { + out.println("from_address\tfrom_function\treference_type\toperand_index\tprimary" + + "\tto_address\tto_block\tto_function\tto_symbol"); + ReferenceIterator references = currentProgram.getReferenceManager() + .getReferenceIterator(currentProgram.getMinAddress()); + while (references.hasNext() && !monitor.isCancelled()) { + Reference reference = references.next(); + Address from = reference.getFromAddress(); + Address to = reference.getToAddress(); + Function fromFunction = currentProgram.getFunctionManager().getFunctionContaining(from); + Function toFunction = currentProgram.getFunctionManager().getFunctionAt(to); + MemoryBlock toBlock = currentProgram.getMemory().getBlock(to); + Symbol toSymbol = currentProgram.getSymbolTable().getPrimarySymbol(to); + out.printf("%s\t%s\t%s\t%d\t%s\t%s\t%s\t%s\t%s%n", + from, + fromFunction == null ? "" : clean(fromFunction.getName()), + clean(reference.getReferenceType().toString()), + reference.getOperandIndex(), + reference.isPrimary(), + to, + toBlock == null ? "" : clean(toBlock.getName()), + toFunction == null ? "" : clean(toFunction.getName()), + toSymbol == null ? "-" : clean(toSymbol.getName())); + } + } + } + + private void exportDefinedData(String path) throws Exception { + try (PrintWriter out = writer(path)) { + out.println("address\tblock\tlength\tdata_type\tlabel\tvalue"); + var dataIterator = currentProgram.getListing().getDefinedData(true); + while (dataIterator.hasNext() && !monitor.isCancelled()) { + Data data = dataIterator.next(); + MemoryBlock block = currentProgram.getMemory().getBlock(data.getAddress()); + Symbol symbol = currentProgram.getSymbolTable().getPrimarySymbol(data.getAddress()); + out.printf("%s\t%s\t%d\t%s\t%s\t%s%n", + data.getAddress(), + block == null ? "" : clean(block.getName()), + data.getLength(), + clean(data.getDataType().getDisplayName()), + symbol == null ? "" : clean(symbol.getName()), + data.getDefaultValueRepresentation().isEmpty() + ? "-" : clean(data.getDefaultValueRepresentation())); + } + } + } + + private void exportSymbols(String path) throws Exception { + try (PrintWriter out = writer(path)) { + out.println("address\tblock\tname\tsymbol_type\tsource\tprimary\tdynamic"); + SymbolIterator symbols = currentProgram.getSymbolTable().getAllSymbols(true); + while (symbols.hasNext() && !monitor.isCancelled()) { + Symbol symbol = symbols.next(); + Address address = symbol.getAddress(); + MemoryBlock block = currentProgram.getMemory().getBlock(address); + out.printf("%s\t%s\t%s\t%s\t%s\t%s\t%s%n", + address, + block == null ? "" : clean(block.getName()), + clean(symbol.getName()), + clean(symbol.getSymbolType().toString()), + clean(symbol.getSource().toString()), + symbol.isPrimary(), + symbol.isDynamic()); + } + } + } + + private void exportUnexplainedExecutableBytes(String path) throws Exception { + AddressSet executable = new AddressSet(); + AddressSet explained = new AddressSet(); + + for (MemoryBlock block : currentProgram.getMemory().getBlocks()) { + if (block.isExecute()) { + executable.add(block.getStart(), block.getEnd()); + } + } + InstructionIterator instructions = currentProgram.getListing().getInstructions(executable, true); + while (instructions.hasNext()) { + Instruction instruction = instructions.next(); + explained.add(instruction.getMinAddress(), instruction.getMaxAddress()); + } + var dataIterator = currentProgram.getListing().getDefinedData(executable, true); + while (dataIterator.hasNext()) { + Data data = dataIterator.next(); + explained.add(data.getMinAddress(), data.getMaxAddress()); + } + + AddressSet unexplained = executable.subtract(explained); + try (PrintWriter out = writer(path)) { + out.println("start\tend\tbytes\thex\tclassification\tevidence"); + for (AddressRange range : unexplained) { + int length = Math.toIntExact(range.getLength()); + byte[] bytes = new byte[length]; + currentProgram.getMemory().getBytes(range.getMinAddress(), bytes); + String[] classification = classifyUnexplained(range); + out.printf("%s\t%s\t%d\t%s\t%s\t%s%n", + range.getMinAddress(), range.getMaxAddress(), length, hex(bytes), + classification[0], classification[1]); + } + } + } + + private String[] classifyUnexplained(AddressRange range) { + String start = range.getMinAddress().toString(); + String end = range.getMaxAddress().toString(); + if ("1020:0666".equals(start) && start.equals(end)) { + return new String[] { + "overlapping-entry-opcode", + "BA 33 D2 is mov dx,0xd233 at 0666; entry 0667 intentionally decodes 33 D2 as xor dx,dx" + }; + } + if ("1020:0dea".equals(start) && start.equals(end)) { + return new String[] { + "alignment", + "single NOP between the 0d97 and 0e93 Borland runtime routines" + }; + } + return new String[] {"unclassified", ""}; + } + + private PrintWriter writer(String path) throws Exception { + return new PrintWriter(new BufferedWriter(new FileWriter(path))); + } + + private String clean(String value) { + if (value == null) { + return ""; + } + return value.replace('\t', ' ').replace('\r', ' ').replace('\n', ' '); + } + + private String hex(byte[] bytes) { + StringBuilder result = new StringBuilder(bytes.length * 2); + for (byte value : bytes) { + result.append(String.format("%02x", value & 0xff)); + } + return result.toString(); + } +} diff --git a/original/tools/SeedMissingEntrypoints.java b/original/tools/SeedMissingEntrypoints.java index b2cae13..c8365d4 100644 --- a/original/tools/SeedMissingEntrypoints.java +++ b/original/tools/SeedMissingEntrypoints.java @@ -3,17 +3,107 @@ import ghidra.app.script.GhidraScript; import ghidra.program.model.address.Address; +import ghidra.program.model.data.ArrayDataType; +import ghidra.program.model.data.ByteDataType; +import ghidra.program.model.data.WordDataType; import ghidra.program.model.listing.Function; import ghidra.program.model.symbol.SourceType; public class SeedMissingEntrypoints extends GhidraScript { @Override public void run() throws Exception { + // Segment tags, compiler tables, and embedded Real48 constants must be + // defined before missed code is disassembled so linear sweep cannot + // consume them as instructions. + defineWords("1000:0000", 1, "code_segment_1_tag"); + defineWords("1000:026e", 1, "code1_embedded_word_026e"); + defineWords("1008:0000", 1, "code_segment_2_tag"); + defineWords("1008:0f2c", 1, "code2_embedded_word_0f2c"); + defineWords("1008:11bd", 4, "code2_embedded_words_11bd"); + defineWords("1008:131e", 4, "code2_embedded_words_131e"); + defineWords("1010:0000", 1, "code_segment_3_tag"); + defineWords("1010:0470", 1, "code3_embedded_word_0470"); + defineWords("1018:0000", 1, "code_segment_4_tag"); + defineWords("1020:0000", 1, "code_segment_5_tag"); + defineBytes("1020:0107", 38, "borland_runtime_copyright"); + defineBytes("1020:1191", 42, "real48_table_1191"); + defineBytes("1020:1240", 36, "real48_table_1240"); + defineBytes("1020:12d7", 48, "real48_table_12d7"); + defineBytes("1020:13e8", 78, "real48_table_13e8"); + seed("1000:eaB1", "exported_ordinal_10"); seed("1000:fd85", "ne_program_entry"); + + // Ghidra's NE entry analysis misses a set of unreferenced Borland + // runtime routines in Code5. These starts are backed by complete x86 + // prologue/control-flow/return sequences in the target bytes. + seed("1020:0195", "runtime_1020_0195"); + seed("1020:03c5", "runtime_1020_03c5"); + seed("1020:046c", "runtime_1020_046c"); + seed("1020:048f", "runtime_1020_048f"); + seed("1020:049f", "runtime_1020_049f"); + seed("1020:04fc", "runtime_1020_04fc"); + seed("1020:0710", "runtime_1020_0710"); + seed("1020:0760", "runtime_1020_0760"); + seed("1020:0796", "runtime_1020_0796"); + seed("1020:0866", "runtime_1020_0866"); + seed("1020:098c", "runtime_1020_098c"); + seed("1020:09af", "runtime_1020_09af"); + seed("1020:09d2", "runtime_1020_09d2"); + seed("1020:0aee", "runtime_1020_0aee"); + seed("1020:103b", "runtime_1020_103b"); + seed("1020:1045", "runtime_1020_1045"); + seed("1020:1059", "runtime_1020_1059"); + seed("1020:10aa", "runtime_1020_10aa"); + seed("1020:111d", "runtime_1020_111d"); + seed("1020:11bb", "runtime_1020_11bb"); + seed("1020:1264", "runtime_1020_1264"); + seed("1020:1307", "runtime_1020_1307"); + seed("1020:1436", "runtime_1020_1436"); + seed("1020:14de", "runtime_1020_14de"); + seed("1020:1539", "runtime_1020_1539"); + seed("1020:16dd", "runtime_1020_16dd"); + + // These are proven code bytes that either complete an existing + // function or form an alternate entry sharing a tail with one. Ghidra + // does not permit all such Borland entry variants to be separate, + // overlapping function bodies, but the instruction bytes still belong + // in executable coverage and the reconstruction ledger. + disassembleOnly("1018:012f"); + disassembleOnly("1020:0531"); + disassembleOnly("1020:0582"); + disassembleOnly("1020:0666"); + disassembleOnly("1020:06b4"); + disassembleOnly("1020:0767"); + disassembleOnly("1020:079d"); + disassembleOnly("1020:100f"); analyzeAll(currentProgram); } + private void defineWords(String text, int count, String name) throws Exception { + Address address = toAddr(text); + if (getDataAt(address) == null) { + createData(address, new ArrayDataType(WordDataType.dataType, count, 2)); + } + createLabel(address, name, true); + println("Defined " + count + " word(s) at " + address + " as " + name); + } + + private void defineBytes(String text, int count, String name) throws Exception { + Address address = toAddr(text); + if (getDataAt(address) == null) { + createData(address, new ArrayDataType(ByteDataType.dataType, count, 1)); + } + createLabel(address, name, true); + println("Defined " + count + " byte(s) at " + address + " as " + name); + } + + private void disassembleOnly(String text) { + Address address = toAddr(text); + disassemble(address); + println("Disassembled shared/tail entry at " + address); + } + private void seed(String text, String name) throws Exception { Address address = toAddr(text); disassemble(address); diff --git a/original/tools/audit_reconstruction.py b/original/tools/audit_reconstruction.py new file mode 100755 index 0000000..40fbe96 --- /dev/null +++ b/original/tools/audit_reconstruction.py @@ -0,0 +1,836 @@ +#!/usr/bin/env python3 +"""Audit the exact binary-to-readable-C reconstruction boundary for TDKPIN.""" + +from __future__ import annotations + +import argparse +import csv +import hashlib +import json +import re +from collections import Counter +from pathlib import Path + +ROOT = Path(__file__).resolve().parent.parent +TARGET_SHA256 = "a9022f1894e3e6e21fc42e8f6c932f7c549ca77f63aaa0c488bb9d55d9d0174c" +PRESERVED_RAW_SHA256 = ( + "987a47580ba5c92fa071c989bdaeddf138e285d2b07106c5909a4acbc3e27088" +) +LEDGER_COLUMNS = ( + "address", + "raw_name", + "segment", + "body_bytes", + "status", + "reconstructed_name", + "module", + "evidence", + "notes", +) +STATUS_ORDER = ("raw", "partial", "restored", "verified", "unknown", "blocked") +ALLOWED_STATUSES = set(STATUS_ORDER) +RAW_MARKER = re.compile(r"^/\* ===== ([0-9a-f]{4}:[0-9a-f]{4}) (\S+) ===== \*/$") +IMPORT_COLUMNS = ( + "address", + "library", + "import_name", + "stack_purge_bytes", + "call_sites", + "status", + "stage", + "prototype", + "evidence", + "notes", +) +SHARED_ENTRY_COLUMNS = ( + "address", + "containing_function", + "status", + "reconstructed_name", + "evidence", + "notes", +) +CODE_DATA_COLUMNS = ( + "start", + "end", + "bytes", + "status", + "object_id", + "object_name", + "c_type", + "initialization", + "readers", + "evidence", + "notes", +) + +# These routines have readable companion fragments, but none yet has a complete, +# standalone, binary-faithful implementation. Keep them partial until the whole +# raw function has been reviewed and all callees/types are resolved. +PARTIAL_FUNCTIONS = {} + +CALLBACK_APIS = { + "REGISTERCLASS", + "SYSTEMTIMERMAKE", + "DIALOGBOXPARAM", + "CREATEDIALOGPARAM", + "MAKEPROCINSTANCE", +} + + +def read_tsv(path: Path) -> list[dict[str, str]]: + with path.open(newline="", encoding="utf-8") as handle: + return list(csv.DictReader(handle, delimiter="\t")) + + +def internal_functions() -> list[dict[str, str]]: + rows = read_tsv(ROOT / "BINARY_FUNCTIONS.tsv") + return [row for row in rows if row["entry_kind"] == "internal"] + + +def initialize_ledger(path: Path) -> None: + if path.exists(): + raise SystemExit(f"refusing to overwrite existing ledger: {path}") + rows = [] + for function in internal_functions(): + partial = PARTIAL_FUNCTIONS.get(function["address"]) + rows.append( + { + "address": function["address"], + "raw_name": function["name"], + "segment": function["block"], + "body_bytes": function["body_bytes"], + "status": "partial" if partial else "raw", + "reconstructed_name": partial[0] if partial else "", + "module": partial[1] if partial else "", + "evidence": partial[2] if partial else "decompiler-only", + "notes": ( + "Readable fragment exists; full function and dependencies remain pending." + if partial + else "No reviewed readable-C implementation yet." + ), + } + ) + with path.open("w", newline="", encoding="utf-8") as handle: + writer = csv.DictWriter( + handle, fieldnames=LEDGER_COLUMNS, delimiter="\t", lineterminator="\n" + ) + writer.writeheader() + writer.writerows(rows) + + +def sync_ledger(path: Path) -> None: + """Add newly recovered functions while preserving manual semantic work.""" + if not path.exists(): + raise SystemExit(f"cannot sync missing ledger: {path}") + existing = {row["address"]: row for row in read_tsv(path)} + functions = internal_functions() + current_addresses = {function["address"] for function in functions} + removed = set(existing) - current_addresses + if removed: + raise SystemExit( + "refusing to discard ledger rows: " + ", ".join(sorted(removed)) + ) + + rows = [] + for function in functions: + row = existing.get(function["address"]) + if row is None: + row = { + "address": function["address"], + "status": "raw", + "reconstructed_name": "", + "module": "", + "evidence": "decompiler-only", + "notes": "Newly recovered function; no reviewed readable-C implementation yet.", + } + row["raw_name"] = function["name"] + row["segment"] = function["block"] + row["body_bytes"] = function["body_bytes"] + rows.append(row) + + temporary = path.with_suffix(path.suffix + ".tmp") + with temporary.open("w", newline="", encoding="utf-8") as handle: + writer = csv.DictWriter( + handle, fieldnames=LEDGER_COLUMNS, delimiter="\t", lineterminator="\n" + ) + writer.writeheader() + writer.writerows(rows) + temporary.replace(path) + + +def write_tsv( + path: Path, columns: tuple[str, ...], rows: list[dict[str, object]] +) -> None: + if path.exists(): + raise SystemExit(f"refusing to overwrite existing ledger: {path}") + with path.open("w", newline="", encoding="utf-8") as handle: + writer = csv.DictWriter( + handle, fieldnames=columns, delimiter="\t", lineterminator="\n" + ) + writer.writeheader() + writer.writerows(rows) + + +def initialize_support_ledgers() -> None: + functions = read_tsv(ROOT / "BINARY_FUNCTIONS.tsv") + references = read_tsv(ROOT / "REFERENCES.tsv") + calls_by_target = Counter( + row["to_address"] for row in references if "CALL" in row["reference_type"] + ) + imports = [row for row in functions if row["entry_kind"] == "external"] + write_tsv( + ROOT / "IMPORT_RECONSTRUCTION.tsv", + IMPORT_COLUMNS, + [ + { + "address": row["address"], + "library": row["namespace"], + "import_name": row["name"], + "stack_purge_bytes": row["stack_purge_bytes"], + "call_sites": calls_by_target[row["address"]], + "status": "unknown", + "stage": "untyped-import", + "prototype": "", + "evidence": "NE import+Ghidra reference export", + "notes": "Win16 prototype and every call site remain to be reviewed.", + } + for row in imports + ], + ) + + data_references: dict[str, list[dict[str, str]]] = {} + for row in references: + if row["to_block"] == "Data6": + data_references.setdefault(row["to_address"], []).append(row) + write_tsv( + ROOT / "DATA_RECONSTRUCTION.tsv", + ( + "address", + "status", + "object_name", + "type", + "extent_start", + "extent_end", + "reads", + "writes", + "referring_functions", + "initialization", + "evidence", + "notes", + ), + [ + { + "address": address, + "status": "unknown", + "stage": "candidate-address", + "object_name": next( + (row["to_symbol"] for row in rows if row["to_symbol"]), "" + ), + "type": "", + "extent_start": address, + "extent_end": address, + "reads": sum("READ" in row["reference_type"] for row in rows), + "writes": sum("WRITE" in row["reference_type"] for row in rows), + "referring_functions": ",".join( + sorted( + {row["from_function"] for row in rows if row["from_function"]} + ) + ), + "initialization": "", + "evidence": "Ghidra DGROUP references", + "notes": "Candidate address; semantic object boundary and type remain unresolved.", + } + for address, rows in sorted(data_references.items()) + ], + ) + + manifest = json.loads((ROOT / "assets/manifest.json").read_text(encoding="utf-8")) + write_tsv( + ROOT / "RESOURCE_RECONSTRUCTION.tsv", + ( + "type", + "id", + "file_offset", + "allocated_size", + "raw_sha256", + "raw_path", + "decoded_paths", + "status", + "users", + "behavior", + "notes", + ), + [ + { + "type": resource["type"], + "id": resource["id"], + "file_offset": resource["file_offset"], + "allocated_size": resource["allocated_size"], + "raw_sha256": resource["raw_sha256"], + "raw_path": resource["raw_path"], + "decoded_paths": ",".join(resource.get("decoded_paths", [])), + "status": "partial", + "stage": "extracted-unmapped", + "users": "", + "behavior": "", + "notes": "Lossless extraction is verified; code users and behavior remain to be mapped.", + } + for resource in manifest["resources"] + ], + ) + + callback_rows = [] + for row in references: + if row["to_symbol"] in CALLBACK_APIS and "CALL" in row["reference_type"]: + callback_rows.append( + { + "registration_site": row["from_address"], + "registering_function": row["from_function"], + "api": row["to_symbol"], + "status": "unknown", + "stage": "registration-site", + "callback_address": "", + "callback_name": "", + "lifetime": "", + "evidence": "Ghidra call reference", + "notes": "Recover callback argument through Win16 ABI and stored state.", + } + ) + write_tsv( + ROOT / "CALLBACK_RECONSTRUCTION.tsv", + ( + "registration_site", + "registering_function", + "api", + "status", + "stage", + "callback_address", + "callback_name", + "lifetime", + "evidence", + "notes", + ), + callback_rows, + ) + + +def sync_support_ledgers() -> None: + path = ROOT / "IMPORT_RECONSTRUCTION.tsv" + if not path.exists(): + raise SystemExit(f"cannot sync missing ledger: {path}") + existing = {row["address"]: row for row in read_tsv(path)} + import_statuses = { + "unreviewed": ("unknown", "untyped-import"), + "prototype-sourced": ("partial", "prototype-sourced"), + "binary-reviewed": ("verified", "binary-reviewed"), + "runtime-data": ("verified", "runtime-data"), + } + for row in existing.values(): + if not row.get("stage"): + row["status"], row["stage"] = import_statuses.get( + row["status"], (row["status"], row["status"]) + ) + functions = read_tsv(ROOT / "BINARY_FUNCTIONS.tsv") + imports = [row for row in functions if row["entry_kind"] == "external"] + references = read_tsv(ROOT / "REFERENCES.tsv") + calls_by_target = Counter( + row["to_address"] for row in references if "CALL" in row["reference_type"] + ) + current_addresses = {row["address"] for row in imports} + removed = set(existing) - current_addresses + if removed: + raise SystemExit( + "refusing to discard import-ledger rows: " + ", ".join(sorted(removed)) + ) + rows = [] + for function in imports: + row = existing.get(function["address"]) + if row is None: + row = { + "address": function["address"], + "status": "unknown", + "stage": "untyped-import", + "prototype": "", + "evidence": "NE import+Ghidra reference export", + "notes": "Win16 prototype and every call site remain to be reviewed.", + } + row["library"] = function["namespace"] + row["import_name"] = function["name"] + row["stack_purge_bytes"] = function["stack_purge_bytes"] + row["call_sites"] = calls_by_target[function["address"]] + rows.append(row) + temporary = path.with_suffix(path.suffix + ".tmp") + with temporary.open("w", newline="", encoding="utf-8") as handle: + writer = csv.DictWriter( + handle, fieldnames=IMPORT_COLUMNS, delimiter="\t", lineterminator="\n" + ) + writer.writeheader() + writer.writerows(rows) + temporary.replace(path) + + normalize_support_statuses( + ROOT / "DATA_RECONSTRUCTION.tsv", + {"unresolved": ("unknown", "candidate-address")}, + ) + normalize_support_statuses( + ROOT / "RESOURCE_RECONSTRUCTION.tsv", + {"extracted-unmapped": ("partial", "extracted-unmapped")}, + ) + normalize_support_statuses( + ROOT / "CALLBACK_RECONSTRUCTION.tsv", + {"unresolved": ("unknown", "registration-site")}, + ) + + +def normalize_support_statuses(path: Path, mapping: dict[str, tuple[str, str]]) -> None: + with path.open(newline="", encoding="utf-8") as handle: + reader = csv.DictReader(handle, delimiter="\t") + columns = list(reader.fieldnames or ()) + rows = list(reader) + if "stage" not in columns: + columns.insert(columns.index("status") + 1, "stage") + for row in rows: + if not row.get("stage"): + row["status"], row["stage"] = mapping.get( + row["status"], (row["status"], row["status"]) + ) + temporary = path.with_suffix(path.suffix + ".tmp") + with temporary.open("w", newline="", encoding="utf-8") as handle: + writer = csv.DictWriter( + handle, fieldnames=columns, delimiter="\t", lineterminator="\n" + ) + writer.writeheader() + writer.writerows(rows) + temporary.replace(path) + + +def require(condition: bool, message: str, failures: list[str]) -> None: + if not condition: + failures.append(message) + + +def status_summary(rows: list[dict[str, str]]) -> str: + counts = Counter(row["status"] for row in rows) + return ",".join(f"{status}:{counts[status]}" for status in STATUS_ORDER) + + +def dgroup_offset(address: str) -> int: + selector, value = address.split(":", 1) + if selector != "1028": + raise ValueError(f"not a DGROUP address: {address}") + return int(value, 16) + + +def audit(require_complete: bool = False) -> int: + failures: list[str] = [] + digest = hashlib.sha256((ROOT / "TDKPIN.EXE").read_bytes()).hexdigest() + require(digest == TARGET_SHA256, f"target SHA-256 changed: {digest}", failures) + preserved_raw_digest = hashlib.sha256( + (ROOT / "TDKPIN_GHIDRA_RAW.c").read_bytes() + ).hexdigest() + require( + preserved_raw_digest == PRESERVED_RAW_SHA256, + f"preserved raw decompiler evidence changed: {preserved_raw_digest}", + failures, + ) + + functions = internal_functions() + function_by_address = {row["address"]: row for row in functions} + require( + len(function_by_address) == len(functions), + "duplicate binary function addresses", + failures, + ) + + raw_markers: dict[str, str] = {} + for line in ( + (ROOT / "TDKPIN_GHIDRA_COMPLETE_RAW.c").read_text(encoding="utf-8").splitlines() + ): + match = RAW_MARKER.match(line) + if match: + raw_markers[match.group(1)] = match.group(2) + require( + set(raw_markers) == set(function_by_address), + "raw decompilation/function inventory mismatch", + failures, + ) + + ledger_path = ROOT / "FUNCTION_RECONSTRUCTION.tsv" + require(ledger_path.exists(), "FUNCTION_RECONSTRUCTION.tsv is missing", failures) + ledger = read_tsv(ledger_path) if ledger_path.exists() else [] + ledger_by_address = {row["address"]: row for row in ledger} + require( + len(ledger_by_address) == len(ledger), + "duplicate reconstruction-ledger addresses", + failures, + ) + require( + set(ledger_by_address) == set(function_by_address), + "reconstruction ledger/function inventory mismatch", + failures, + ) + + for address, row in ledger_by_address.items(): + function = function_by_address[address] + require( + row["status"] in ALLOWED_STATUSES, + f"{address}: invalid status {row['status']!r}", + failures, + ) + require( + row["raw_name"] == function["name"], f"{address}: raw name drift", failures + ) + require( + row["segment"] == function["block"], f"{address}: segment drift", failures + ) + require( + row["body_bytes"] == function["body_bytes"], + f"{address}: body-size drift", + failures, + ) + if row["status"] in {"restored", "verified"}: + require( + bool(row["reconstructed_name"]), + f"{address}: restored row lacks a name", + failures, + ) + require( + bool(row["module"]), f"{address}: restored row lacks a module", failures + ) + require( + (ROOT / row["module"]).is_file(), + f"{address}: module does not exist", + failures, + ) + + coverage = read_tsv(ROOT / "COMPLETE_COVERAGE.tsv") + summaries = { + row["name_or_start"]: row["bytes"] + for row in coverage + if row["record"] == "summary" + } + executable_exceptions = read_tsv(ROOT / "UNEXPLAINED.tsv") + executable_exception_bytes = sum( + int(row["bytes"]) for row in executable_exceptions + ) + unclassified = [ + row + for row in executable_exceptions + if row["classification"] == "unclassified" + ] + require( + executable_exception_bytes == + int(summaries["undefined-executable-bytes"]), + "exception-byte evidence does not match coverage summary", + failures, + ) + + references = read_tsv(ROOT / "REFERENCES.tsv") + data_targets = { + row["to_address"] for row in references if row["to_block"] == "Data6" + } + objects = read_tsv(ROOT / "OBJECTS.tsv") + require( + len(objects) == 175, + f"expected 175 collision records, found {len(objects)}", + failures, + ) + + support_ledgers = ( + "IMPORT_RECONSTRUCTION.tsv", + "DATA_RECONSTRUCTION.tsv", + "DATA_COVERAGE.tsv", + "DATA_OBJECTS.tsv", + "CODE_DATA_OBJECTS.tsv", + "RESOURCE_RECONSTRUCTION.tsv", + "CALLBACK_RECONSTRUCTION.tsv", + "NE_SEGMENTS.tsv", + "ENTRY_POINTS.tsv", + "MODULE_REFERENCES.tsv", + "RELOCATIONS.tsv", + "SHARED_ENTRY_POINTS.tsv", + ) + for name in support_ledgers: + require((ROOT / name).exists(), f"{name} is missing", failures) + shared_entries = read_tsv(ROOT / "SHARED_ENTRY_POINTS.tsv") + for row in shared_entries: + require( + tuple(row) == SHARED_ENTRY_COLUMNS, + f"shared entry {row.get('address', '?')}: schema drift", + failures, + ) + require( + row["status"] in ALLOWED_STATUSES, + f"shared entry {row['address']}: invalid status {row['status']!r}", + failures, + ) + require( + row["containing_function"] in function_by_address, + f"shared entry {row['address']}: unknown containing function", + failures, + ) + require( + bool(row["reconstructed_name"]), + f"shared entry {row['address']}: missing readable name", + failures, + ) + import_ledger: list[dict[str, str]] = [] + data_ledger: list[dict[str, str]] = [] + data_coverage: list[dict[str, str]] = [] + data_objects: list[dict[str, str]] = [] + code_data_objects: list[dict[str, str]] = [] + resource_ledger: list[dict[str, str]] = [] + if ROOT.joinpath("IMPORT_RECONSTRUCTION.tsv").exists(): + import_ledger = read_tsv(ROOT / "IMPORT_RECONSTRUCTION.tsv") + external_addresses = { + row["address"] + for row in read_tsv(ROOT / "BINARY_FUNCTIONS.tsv") + if row["entry_kind"] == "external" + } + require( + {row["address"] for row in import_ledger} == external_addresses, + "import ledger/inventory mismatch", + failures, + ) + for row in import_ledger: + require( + row["status"] in ALLOWED_STATUSES, + f"import {row['address']}: invalid status {row['status']!r}", + failures, + ) + if ROOT.joinpath("DATA_RECONSTRUCTION.tsv").exists(): + data_ledger = read_tsv(ROOT / "DATA_RECONSTRUCTION.tsv") + require( + {row["address"] for row in data_ledger} == data_targets, + "data ledger/reference-target mismatch", + failures, + ) + for row in data_ledger: + require( + row["status"] in ALLOWED_STATUSES, + f"data {row['address']}: invalid status {row['status']!r}", + failures, + ) + if ROOT.joinpath("DATA_COVERAGE.tsv").exists(): + data_coverage = read_tsv(ROOT / "DATA_COVERAGE.tsv") + next_offset = 0 + for row in data_coverage: + start = dgroup_offset(row["start"]) + end = dgroup_offset(row["end"]) + require( + start == next_offset, + f"DGROUP coverage gap/overlap at {row['start']}", + failures, + ) + require( + end >= start, + f"invalid DGROUP coverage range at {row['start']}", + failures, + ) + require( + int(row["bytes"]) == end - start + 1, + f"DGROUP range length mismatch at {row['start']}", + failures, + ) + require( + row["status"] in ALLOWED_STATUSES, + f"DGROUP range {row['start']}: invalid status {row['status']!r}", + failures, + ) + next_offset = end + 1 + require( + next_offset == 0x4D3A, + f"DGROUP coverage ends at {next_offset:04x}", + failures, + ) + if ROOT.joinpath("DATA_OBJECTS.tsv").exists(): + data_objects = read_tsv(ROOT / "DATA_OBJECTS.tsv") + previous_end = -1 + for row in sorted(data_objects, key=lambda item: dgroup_offset(item["start"])): + start = dgroup_offset(row["start"]) + end = dgroup_offset(row["end"]) + require( + start > previous_end, + f"overlapping data object at {row['start']}", + failures, + ) + require( + row["status"] in ALLOWED_STATUSES, + f"data object {row['object_id']}: invalid status {row['status']!r}", + failures, + ) + previous_end = end + if ROOT.joinpath("CODE_DATA_OBJECTS.tsv").exists(): + code_data_objects = read_tsv(ROOT / "CODE_DATA_OBJECTS.tsv") + code_data_inventory = { + row["address"]: int(row["length"]) + for row in read_tsv(ROOT / "DEFINED_DATA.tsv") + if row["block"].startswith("Code") + } + require( + {row["start"]: int(row["bytes"]) for row in code_data_objects} + == code_data_inventory, + "code-data ledger/defined-data inventory mismatch", + failures, + ) + for row in code_data_objects: + require( + tuple(row) == CODE_DATA_COLUMNS, + f"code-data object {row.get('start', '?')}: schema drift", + failures, + ) + start_selector, start_text = row["start"].split(":", 1) + end_selector, end_text = row["end"].split(":", 1) + require( + start_selector == end_selector, + f"code-data object {row['start']}: crosses segments", + failures, + ) + require( + int(row["bytes"]) == int(end_text, 16) - int(start_text, 16) + 1, + f"code-data object {row['start']}: extent mismatch", + failures, + ) + require( + row["status"] in ALLOWED_STATUSES, + f"code-data object {row['object_id']}: invalid status {row['status']!r}", + failures, + ) + if ROOT.joinpath("RESOURCE_RECONSTRUCTION.tsv").exists(): + resource_ledger = read_tsv(ROOT / "RESOURCE_RECONSTRUCTION.tsv") + manifest = json.loads( + (ROOT / "assets/manifest.json").read_text(encoding="utf-8") + ) + resource_keys = { + (str(row["type"]), str(row["id"])) for row in manifest["resources"] + } + require( + {(row["type"], row["id"]) for row in resource_ledger} == resource_keys, + "resource ledger/manifest mismatch", + failures, + ) + for row in resource_ledger: + require( + row["status"] in ALLOWED_STATUSES, + f"resource {row['type']}:{row['id']}: invalid status {row['status']!r}", + failures, + ) + + callback_ledger = ( + read_tsv(ROOT / "CALLBACK_RECONSTRUCTION.tsv") + if ROOT.joinpath("CALLBACK_RECONSTRUCTION.tsv").exists() + else [] + ) + entry_points = ( + read_tsv(ROOT / "ENTRY_POINTS.tsv") + if ROOT.joinpath("ENTRY_POINTS.tsv").exists() + else [] + ) + relocations = ( + read_tsv(ROOT / "RELOCATIONS.tsv") + if ROOT.joinpath("RELOCATIONS.tsv").exists() + else [] + ) + require( + len(entry_points) == 301, + f"expected 301 NE entries, found {len(entry_points)}", + failures, + ) + for row in callback_ledger: + require( + row["status"] in ALLOWED_STATUSES, + f"callback {row['registration_site']}: invalid status {row['status']!r}", + failures, + ) + + if require_complete: + require( + not unclassified, "completion requires zero unclassified ranges", failures + ) + for label, rows in ( + ("function", ledger), + ("import", import_ledger), + ("data", data_ledger), + ("DGROUP coverage", data_coverage), + ("data object", data_objects), + ("code-data object", code_data_objects), + ("resource", resource_ledger), + ("callback", callback_ledger), + ("shared entry", shared_entries), + ): + incomplete = [row for row in rows if row["status"] != "verified"] + require( + not incomplete, + f"completion requires every {label} row verified; {len(incomplete)} remain", + failures, + ) + + print(f"target_sha256={digest}") + print(f"preserved_raw_sha256={preserved_raw_digest}") + print(f"internal_functions={len(functions)}") + print(f"function_statuses={status_summary(ledger)}") + print(f"import_statuses={status_summary(import_ledger)}") + print(f"data_statuses={status_summary(data_ledger)}") + print(f"data_range_statuses={status_summary(data_coverage)}") + print(f"data_object_statuses={status_summary(data_objects)}") + print(f"code_data_object_statuses={status_summary(code_data_objects)}") + print(f"resource_statuses={status_summary(resource_ledger)}") + print(f"callback_statuses={status_summary(callback_ledger)}") + print(f"shared_entry_statuses={status_summary(shared_entries)}") + print(f"executable_bytes={summaries['executable-bytes']}") + print(f"classified_executable_exception_ranges={len(executable_exceptions)}") + print(f"classified_executable_exception_bytes={executable_exception_bytes}") + print(f"unclassified_executable_ranges={len(unclassified)}") + print(f"defined_data_units={len(read_tsv(ROOT / 'DEFINED_DATA.tsv'))}") + print(f"referenced_data_addresses={len(data_targets)}") + print(f"collision_records={len(objects)}") + print(f"ne_entry_points={len(entry_points)}") + print(f"relocation_sites={len(relocations)}") + if failures: + for failure in failures: + print(f"FAIL: {failure}") + return 1 + print("ledger_consistency=pass") + return 0 + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument( + "--initialize", action="store_true", help="create the initial function ledger" + ) + parser.add_argument( + "--sync", + action="store_true", + help="add newly recovered functions to the ledger", + ) + parser.add_argument( + "--initialize-support-ledgers", + action="store_true", + help="create import, data, resource, and callback ledgers", + ) + parser.add_argument( + "--sync-support-ledgers", + action="store_true", + help="refresh mechanically derived support-ledger fields", + ) + parser.add_argument( + "--require-complete", + action="store_true", + help="fail unless every required ledger row is verified", + ) + args = parser.parse_args() + if args.initialize: + initialize_ledger(ROOT / "FUNCTION_RECONSTRUCTION.tsv") + if args.sync: + sync_ledger(ROOT / "FUNCTION_RECONSTRUCTION.tsv") + if args.initialize_support_ledgers: + initialize_support_ledgers() + if args.sync_support_ledgers: + sync_support_ledgers() + return audit(args.require_complete) + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/original/tools/build_data_coverage.py b/original/tools/build_data_coverage.py new file mode 100755 index 0000000..edcc8d7 --- /dev/null +++ b/original/tools/build_data_coverage.py @@ -0,0 +1,314 @@ +#!/usr/bin/env python3 +"""Build a byte-complete, non-overlapping DGROUP reconstruction ledger.""" + +from __future__ import annotations + +import csv +import hashlib +from itertools import pairwise +from pathlib import Path + +ROOT = Path(__file__).resolve().parent.parent +OUTPUT = ROOT / "DATA_COVERAGE.tsv" +COLUMNS = ( + "start", + "end", + "bytes", + "storage", + "status", + "stage", + "object_id", + "object_name", + "c_type", + "initial_value", + "readers", + "writers", + "relocations", + "evidence", + "notes", +) +RELOCATION_WIDTHS = { + "low-byte": 1, + "selector-16": 2, + "far-pointer-32": 4, + "offset-16": 2, + "offset-32": 4, + "pointer-48": 6, +} + + +def read_tsv(path: Path) -> list[dict[str, str]]: + with path.open(newline="", encoding="utf-8") as handle: + return list(csv.DictReader(handle, delimiter="\t")) + + +def offset(address: str) -> int: + selector, value = address.split(":", 1) + if selector != "1028": + raise ValueError(f"not a DGROUP address: {address}") + return int(value, 16) + + +def address(value: int) -> str: + return f"1028:{value:04x}" + + +def initial_value(payload: bytes, start: int, end: int, file_length: int) -> str: + if start >= file_length: + return "zero-fill" + value = payload[start : min(end + 1, file_length)] + if end + 1 > file_length: + value += bytes(end + 1 - file_length) + if len(value) <= 32: + return value.hex() + return f"sha256:{hashlib.sha256(value).hexdigest()}" + + +def project_semantic_objects( + objects: list[dict[str, str]], +) -> None: + path = ROOT / "DATA_RECONSTRUCTION.tsv" + rows = read_tsv(path) + with path.open(newline="", encoding="utf-8") as handle: + columns = tuple(csv.DictReader(handle, delimiter="\t").fieldnames or ()) + for row in rows: + anchor = offset(row["address"]) + matches = [ + item + for item in objects + if offset(item["start"]) <= anchor <= offset(item["end"]) + ] + if len(matches) > 1: + raise ValueError(f"overlapping semantic objects at {row['address']}") + if not matches: + continue + item = matches[0] + row["status"] = item["status"] + row["stage"] = "semantic-object-field" + row["object_name"] = item["object_name"] + row["type"] = item["c_type"] + row["extent_start"] = item["start"] + row["extent_end"] = item["end"] + row["initialization"] = item["initialization"] + row["evidence"] = item["evidence"] + row["notes"] = item["notes"] + temporary = path.with_suffix(path.suffix + ".tmp") + with temporary.open("w", newline="", encoding="utf-8") as handle: + writer = csv.DictWriter( + handle, fieldnames=columns, delimiter="\t", lineterminator="\n" + ) + writer.writeheader() + writer.writerows(rows) + temporary.replace(path) + + +def main() -> int: + segments = read_tsv(ROOT / "NE_SEGMENTS.tsv") + data_segment = next(row for row in segments if row["segment"] == "6") + file_offset = int(data_segment["file_offset"]) + file_length = int(data_segment["file_length"]) + allocation_size = int(data_segment["allocation_size"]) + binary = (ROOT / "TDKPIN.EXE").read_bytes() + payload = binary[file_offset : file_offset + file_length] + + references = [ + row for row in read_tsv(ROOT / "REFERENCES.tsv") if row["to_block"] == "Data6" + ] + defined_data = [ + row for row in read_tsv(ROOT / "DEFINED_DATA.tsv") if row["block"] == "Data6" + ] + relocations = [ + row for row in read_tsv(ROOT / "RELOCATIONS.tsv") if row["segment"] == "6" + ] + objects = ( + read_tsv(ROOT / "DATA_OBJECTS.tsv") + if (ROOT / "DATA_OBJECTS.tsv").exists() + else [] + ) + project_semantic_objects(objects) + + boundaries = {0, file_length, allocation_size} + for row in references: + boundaries.add(offset(row["to_address"])) + for row in defined_data: + start = offset(row["address"]) + boundaries.add(start) + boundaries.add(min(start + int(row["length"]), allocation_size)) + for row in relocations: + start = offset(row["source_address"]) + width = RELOCATION_WIDTHS.get(row["source_type"]) + if width is None: + raise ValueError(f"unknown relocation width: {row['source_type']}") + boundaries.add(start) + boundaries.add(min(start + width, allocation_size)) + for row in objects: + start = offset(row["start"]) + end = offset(row["end"]) + boundaries.add(start) + boundaries.add(min(end + 1, allocation_size)) + ordered = sorted( + boundary for boundary in boundaries if 0 <= boundary <= allocation_size + ) + + old = {} + if OUTPUT.exists(): + old = {(row["start"], row["end"]): row for row in read_tsv(OUTPUT)} + + rows = [] + current_keys = set() + for start, next_start in pairwise(ordered): + if start == next_start: + continue + end = next_start - 1 + key = (address(start), address(end)) + current_keys.add(key) + row = old.get(key, {}) + range_refs = [ + reference + for reference in references + if start <= offset(reference["to_address"]) <= end + ] + range_data = [ + data for data in defined_data if start <= offset(data["address"]) <= end + ] + range_relocations = [ + relocation + for relocation in relocations + if start <= offset(relocation["source_address"]) <= end + ] + range_objects = [ + item + for item in objects + if offset(item["start"]) <= start and end <= offset(item["end"]) + ] + if len(range_objects) > 1: + raise ValueError(f"overlapping semantic data objects at {key[0]}-{key[1]}") + semantic_object = range_objects[0] if range_objects else None + row.update( + { + "start": key[0], + "end": key[1], + "bytes": end - start + 1, + "storage": "initialized" if end < file_length else "zero-fill", + "status": ( + semantic_object["status"] + if semantic_object + else row.get("status", "unknown") + ), + "stage": ( + "semantic-object" + if semantic_object + else row.get("stage", "candidate-range") + ), + "object_id": ( + semantic_object["object_id"] + if semantic_object + else row.get("object_id", "") + ), + "object_name": ( + semantic_object["object_name"] + if semantic_object + else row.get("object_name", "") + ), + "c_type": ( + semantic_object["c_type"] + if semantic_object + else row.get("c_type", "") + ), + "initial_value": initial_value(payload, start, end, file_length), + "readers": ",".join( + sorted( + { + reference["from_function"] + for reference in range_refs + if "READ" in reference["reference_type"] + and reference["from_function"] + } + ) + ), + "writers": ",".join( + sorted( + { + reference["from_function"] + for reference in range_refs + if "WRITE" in reference["reference_type"] + and reference["from_function"] + } + ) + ), + "relocations": ",".join( + f"{item['source_address']}->{item['target']}" + for item in range_relocations + ), + "evidence": ";".join( + [ + *([semantic_object["evidence"]] if semantic_object else []), + *[ + f"{item['address']}:{item['data_type']}[{item['length']}]" + for item in range_data + ], + ] + ), + "notes": ( + semantic_object["notes"] + if semantic_object + else row.get( + "notes", + "Candidate byte range; semantic object grouping and type remain unresolved.", + ) + ), + } + ) + rows.append(row) + + lost_review = [ + row + for key, row in old.items() + if key not in current_keys and row["status"] != "unknown" + ] + unsafe_lost_review = [] + for reviewed in lost_review: + reviewed_start = offset(reviewed["start"]) + reviewed_end = offset(reviewed["end"]) + replacements = [ + row + for row in rows + if offset(row["end"]) >= reviewed_start + and offset(row["start"]) <= reviewed_end + ] + cursor = reviewed_start + safe = True + for replacement in replacements: + replacement_start = max(offset(replacement["start"]), reviewed_start) + replacement_end = min(offset(replacement["end"]), reviewed_end) + if replacement_start != cursor or replacement["status"] != "verified" or ( + replacement["stage"] != "semantic-object" + ): + safe = False + break + cursor = replacement_end + 1 + if not safe or cursor != reviewed_end + 1: + unsafe_lost_review.append(reviewed) + if unsafe_lost_review: + raise RuntimeError( + "refusing to discard " + f"{len(unsafe_lost_review)} reviewed data ranges after boundary drift" + ) + + temporary = OUTPUT.with_suffix(OUTPUT.suffix + ".tmp") + with temporary.open("w", newline="", encoding="utf-8") as handle: + writer = csv.DictWriter( + handle, fieldnames=COLUMNS, delimiter="\t", lineterminator="\n" + ) + writer.writeheader() + writer.writerows(rows) + temporary.replace(OUTPUT) + print(f"data_ranges={len(rows)}") + print(f"covered_bytes={sum(int(row['bytes']) for row in rows)}") + print(f"initialized_bytes={file_length}") + print(f"zero_fill_bytes={allocation_size - file_length}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/original/tools/decompile.sh b/original/tools/decompile.sh index f2dc279..b104296 100755 --- a/original/tools/decompile.sh +++ b/original/tools/decompile.sh @@ -22,10 +22,22 @@ fi -noanalysis \ -scriptPath "$script_dir" \ -preScript SeedMissingEntrypoints.java \ + -preScript ApplyWin16ImportSignatures.java \ + "$workspace_dir/IMPORT_RECONSTRUCTION.tsv" \ -postScript ExportDecompilation.java \ - "$workspace_dir/TDKPIN_GHIDRA_RAW.c" \ - "$workspace_dir/FUNCTIONS.tsv" \ + "$workspace_dir/TDKPIN_GHIDRA_COMPLETE_RAW.c" \ + "$workspace_dir/COMPLETE_FUNCTIONS.tsv" \ -postScript AuditCoverage.java \ - "$workspace_dir/COVERAGE.tsv" + "$workspace_dir/COMPLETE_COVERAGE.tsv" \ + -postScript ExportProgramEvidence.java \ + "$workspace_dir/BINARY_FUNCTIONS.tsv" \ + "$workspace_dir/REFERENCES.tsv" \ + "$workspace_dir/DEFINED_DATA.tsv" \ + "$workspace_dir/SYMBOLS.tsv" \ + "$workspace_dir/UNEXPLAINED.tsv" + +python3 "$script_dir/extract_ne_metadata.py" "$workspace_dir/TDKPIN.EXE" \ + --output-dir "$workspace_dir" +python3 "$script_dir/build_data_coverage.py" echo "Ghidra project retained at: $project_dir" diff --git a/original/tools/extract_ne_metadata.py b/original/tools/extract_ne_metadata.py new file mode 100755 index 0000000..9c8af22 --- /dev/null +++ b/original/tools/extract_ne_metadata.py @@ -0,0 +1,319 @@ +#!/usr/bin/env python3 +"""Extract exact NE segments, entry points, modules, and relocation sites.""" + +from __future__ import annotations + +import argparse +import csv +import struct +from dataclasses import dataclass +from pathlib import Path + +ROOT = Path(__file__).resolve().parent.parent +SOURCE_TYPE_NAMES = { + 0: "low-byte", + 2: "selector-16", + 3: "far-pointer-32", + 5: "offset-16", + 11: "offset-32", + 13: "pointer-48", +} +TARGET_TYPE_NAMES = { + 0: "internal", + 1: "import-ordinal", + 2: "import-name", + 3: "os-fixup", +} + + +@dataclass(frozen=True) +class Segment: + number: int + file_offset: int + file_length: int + flags: int + allocation_size: int + + @property + def selector(self) -> int: + return 0x1000 + (self.number - 1) * 8 + + def address(self, offset: int) -> str: + return f"{self.selector:04x}:{offset:04x}" + + +def u16(data: bytes, offset: int) -> int: + return struct.unpack_from(" str: + length = data[offset] + return data[offset + 1 : offset + 1 + length].decode("latin-1") + + +def parse_segments(data: bytes, ne_offset: int) -> list[Segment]: + count = u16(data, ne_offset + 0x1C) + table = ne_offset + u16(data, ne_offset + 0x22) + shift = u16(data, ne_offset + 0x32) + segments = [] + for index in range(count): + sector, length, flags, allocation = struct.unpack_from( + " dict[int, tuple[int, int, int, str]]: + table = ne_offset + u16(data, ne_offset + 0x04) + end = table + u16(data, ne_offset + 0x06) + ordinal = 1 + entries = {} + cursor = table + while cursor < end: + count = data[cursor] + segment_indicator = data[cursor + 1] + cursor += 2 + if count == 0: + break + if segment_indicator == 0: + ordinal += count + continue + for _ in range(count): + flags = data[cursor] + if segment_indicator == 0xFF: + int3f = u16(data, cursor + 1) + segment = data[cursor + 3] + offset = u16(data, cursor + 4) + kind = f"movable-int3f-{int3f:04x}" + cursor += 6 + else: + segment = segment_indicator + offset = u16(data, cursor + 1) + kind = "fixed" + cursor += 3 + entries[ordinal] = (segment, offset, flags, kind) + ordinal += 1 + return entries + + +def parse_modules(data: bytes, ne_offset: int) -> list[str]: + count = u16(data, ne_offset + 0x1E) + module_table = ne_offset + u16(data, ne_offset + 0x28) + import_table = ne_offset + u16(data, ne_offset + 0x2A) + return [ + pascal_string(data, import_table + u16(data, module_table + index * 2)) + for index in range(count) + ] + + +def relocation_sites( + data: bytes, segment: Segment, first: int, additive: bool +) -> list[int]: + if additive: + return [first] + sites = [] + current = first + seen = set() + while current != 0xFFFF: + if current in seen: + raise ValueError( + f"segment {segment.number}: cyclic relocation chain at {current:04x}" + ) + if current + 2 > segment.file_length: + raise ValueError( + f"segment {segment.number}: relocation source outside file image: {current:04x}" + ) + seen.add(current) + sites.append(current) + current = u16(data, segment.file_offset + current) + return sites + + +def write_tsv( + path: Path, columns: tuple[str, ...], rows: list[dict[str, object]] +) -> None: + with path.open("w", newline="", encoding="utf-8") as handle: + writer = csv.DictWriter( + handle, fieldnames=columns, delimiter="\t", lineterminator="\n" + ) + writer.writeheader() + writer.writerows(rows) + + +def extract(source: Path, output_dir: Path) -> None: + data = source.read_bytes() + ne_offset = struct.unpack_from(" int: + parser = argparse.ArgumentParser() + parser.add_argument("source", nargs="?", type=Path, default=ROOT / "TDKPIN.EXE") + parser.add_argument("--output-dir", type=Path, default=ROOT) + args = parser.parse_args() + extract(args.source.resolve(), args.output_dir.resolve()) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/original/tools/generate_game_setup_collision_data.py b/original/tools/generate_game_setup_collision_data.py new file mode 100644 index 0000000..125c1c7 --- /dev/null +++ b/original/tools/generate_game_setup_collision_data.py @@ -0,0 +1,128 @@ +#!/usr/bin/env python3 +"""Generate typed 1000:0270 collision-call data from preserved raw evidence.""" + +from __future__ import annotations + +import argparse +from pathlib import Path + +ROOT = Path(__file__).resolve().parent.parent +RAW = ROOT / "TDKPIN_GHIDRA_COMPLETE_RAW.c" +OUTPUT = ROOT / "reconstructed" / "tdkpin_game_setup_collision_data.inc" + + +def calls_from_raw() -> list[list[int]]: + text = RAW.read_text(encoding="utf-8") + start = text.index("/* ===== 1000:0270 ") + end = text.index("/* ===== 1000:51f5 ", start) + text = text[start:end] + needle = "FUN_1008_0138(" + calls: list[list[int]] = [] + position = 0 + while True: + begin = text.find(needle, position) + if begin < 0: + break + cursor = begin + len(needle) + depth = 1 + while depth: + character = text[cursor] + if character == "(": + depth += 1 + elif character == ")": + depth -= 1 + cursor += 1 + arguments = text[begin + len(needle) : cursor - 1] + words = [ + int(item.strip(), 0) & 0xFFFF + for item in arguments.replace("\n", "").split(",") + ] + if len(words) != 40: + raise RuntimeError(f"expected 40 words, found {len(words)}") + calls.append(words) + position = cursor + if len(calls) != 177: + raise RuntimeError(f"expected 177 calls, found {len(calls)}") + return calls + + +def u16(value: int) -> str: + return f"0x{value:04x}u" + + +def i32(low: int, high: int) -> str: + value = low | high << 16 + return f"(int32_t)UINT32_C(0x{value:08x})" + + +def real48(words: list[int]) -> str: + bytes_ = [] + for word in words: + bytes_.extend((word & 0xFF, word >> 8)) + return "{{" + ", ".join(f"0x{byte:02x}" for byte in bytes_) + "}}" + + +def initializer(words: list[int], ordinal: int) -> str: + fields = [ + f".render_bottom={u16(words[0])}", + f".render_right={u16(words[1])}", + f".render_top={u16(words[2])}", + f".render_left={u16(words[3])}", + f".fallback_y_adjust={i32(words[4], words[5])}", + f".fallback_x_adjust={i32(words[6], words[7])}", + f".layer_mask={u16(words[8])}", + f".score_low={u16(words[9])}", + f".score_high={u16(words[10])}", + f".contact_state={u16(words[11])}", + f".flags={u16(words[12])}", + f".response_kick={real48(words[13:16])}", + f".response_auxiliary={real48(words[16:19])}", + f".response_tangent={real48(words[19:22])}", + f".response_normal={real48(words[22:25])}", + f".radius={i32(words[25], words[26])}", + f".point2_y={i32(words[27], words[28])}", + f".point2_x={i32(words[29], words[30])}", + f".point1_y={i32(words[31], words[32])}", + f".point1_x={i32(words[33], words[34])}", + f".coordinate_mode={u16(words[35])}", + f".subtype={u16(words[36])}", + f".type={u16(words[37])}", + f".active={u16(words[38])}", + f".index={u16(words[39])}", + ] + return ( + f" /* call {ordinal:03d}, record {words[39]:3d} */ " + "{" + ", ".join(fields) + "}," + ) + + +def generated_text() -> str: + calls = calls_from_raw() + lines = [ + "/* Generated by tools/generate_game_setup_collision_data.py.", + " * Source: TDKPIN_GHIDRA_COMPLETE_RAW.c, 1000:0270 call order.", + " * Do not hand-edit; run the generator and its --check mode.", + " */", + "static const TdkpinCollisionInitArgs g_game_setup_collision_calls[177] = {", + ] + lines.extend(initializer(words, index + 1) for index, words in enumerate(calls)) + lines.append("};") + lines.append("") + return "\n".join(lines) + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--check", action="store_true") + arguments = parser.parse_args() + generated = generated_text() + if arguments.check: + if not OUTPUT.exists() or OUTPUT.read_text(encoding="utf-8") != generated: + raise SystemExit(f"generated collision data is stale: {OUTPUT}") + return 0 + OUTPUT.write_text(generated, encoding="utf-8") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/original/tools/probe_real48_reference.sh b/original/tools/probe_real48_reference.sh new file mode 100755 index 0000000..24ea356 --- /dev/null +++ b/original/tools/probe_real48_reference.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash +set -euo pipefail + +workspace_dir=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd -P) +probe_dir=$(mktemp -d /tmp/tdkpin-real48-probe.XXXXXX) +trap 'rm -f -- "$probe_dir/R48.COM" "$probe_dir/R48.OUT"; rmdir -- "$probe_dir"' EXIT + +cd -- "$workspace_dir" +nasm -f bin tools/probes/real48_reference.asm -o "$probe_dir/R48.COM" + +SDL_VIDEODRIVER=dummy SDL_AUDIODRIVER=dummy dosbox \ + -c "mount c $probe_dir" \ + -c 'c:' \ + -c 'R48.COM' \ + -c 'exit' >/dev/null 2>&1 + +test -f "$probe_dir/R48.OUT" +actual=$(od -An -v -tx1 "$probe_dir/R48.OUT" | tr -d ' \n') +expected=0000000000008100000000008100000000808200000000009f00feffff7fa000000000809b00a0a2796b9b00a0a279eb0100000000ffffffff0000000000000200000000010000000000000080010000008000ffffff7f01820000000000000000000000000081000000000000810000000000008200000000000081000000000000800000000040008200000000400081000000000000820000000000008000000000c0008200000000c0008000000000000080000000008000000000000000000200000000000000ffffffffff01000000000000007efeffffff7e0181000000000000820000000060008000000000800082000000004000800000000040000000000000008000000000008100000000008000000000408100000000808000000000c0000000000000010000000000a855aa55aa5500000000000000000000000081000000000081fa33f304358200000000008149a070c41c0000000000007eb6b6afdb7a7f0b0c35626d7f49e2c20f490000000000007d60d5d4ad7e7f0a2b38636d8021a2da0f49815f970cb70d8021a2da0fc980d0f71772b100000000000080d5f71772317fff651f994f82acdd8d5d137efc1d55950a7f67b1b15a3c807be397451b81000000000081f2704c095382a35854f82d83a7c625736c8fa87cee142c0000000000007ffeffffff7f80faffffff7f00000000000000000000000080f9ffffffff804878a46a5780faffffff7f80c242d7b35d00000000000080f9ffffffff80f9ffffff7f00000000000080a87d40510a +printf '%s' "$actual" +printf '\n' +test "$actual" = "$expected" diff --git a/original/tools/probes/real48_reference.asm b/original/tools/probes/real48_reference.asm new file mode 100644 index 0000000..ca3dfc7 --- /dev/null +++ b/original/tools/probes/real48_reference.asm @@ -0,0 +1,399 @@ +; Differential probe for the unmodified Borland Real48 core in TDKPIN.EXE. +; Assemble from original/ so INCBIN addresses the authoritative target bytes. + +bits 16 +org 0x100 + +jmp main + +integer_inputs: + dd 0, 1, -1, 2, 0x7fffffff, 0x80000000, 123456789, -123456789 +integer_input_count equ ($ - integer_inputs) / 4 + +round_inputs: + db 0x80,0,0,0,0,0 ; +0.5 + db 0x80,0,0,0,0,0x80 ; -0.5 + db 0x7f,0xff,0xff,0xff,0xff,0x7f ; largest value below +0.5 + db 0x81,0,0,0,0,0x40 ; +1.5 + db 0x81,0xff,0xff,0xff,0xff,0x3f ; largest value below +1.5 + db 0xa0,0,0,0,0,0 ; +2^31, overflow + db 0xa0,0,0,0,0,0x80 ; -2^31 + db 0xa0,0,1,0,0,0x80 ; below -2^31, overflow +round_input_count equ ($ - round_inputs) / 6 + +arithmetic_pairs: + db 0x81,0,0,0,0,0, 0x81,0,0,0,0,0 ; 1, 1 + db 0x81,0,0,0,0,0x40, 0x80,0,0,0,0,0 ; 1.5, 0.5 + db 0x81,0,0,0,0,0x40, 0x80,0,0,0,0,0x80 ; 1.5, -0.5 + db 0x01,0,0,0,0,0, 0x80,0,0,0,0,0 ; minimum, 0.5 + db 0xff,0xff,0xff,0xff,0xff,0x7f, 0xff,0xff,0xff,0xff,0xff,0x7f + db 0x81,0,0,0,0,0x40, 0x82,0,0,0,0,0 ; 1.5, 2 +arithmetic_pair_count equ ($ - arithmetic_pairs) / 12 + +part_inputs: + db 0x80,0,0,0,0,0 ; +0.5 + db 0x81,0,0,0,0,0x60 ; +1.75 + db 0x81,0,0,0,0,0xe0 ; -1.75 + db 0x01,0,0,0,0,0 ; minimum positive + db 0xa8,0x55,0xaa,0x55,0xaa,0x55 ; already wholly integral +part_input_count equ ($ - part_inputs) / 6 + +sqrt_inputs: + db 0,0,0,0,0,0 + db 0x81,0,0,0,0,0 ; 1 + db 0x82,0,0,0,0,0 ; 2 + db 0x83,0,0,0,0,0 ; 4 + db 0x81,0,0,0,0,0x40 ; 1.5 +sqrt_input_count equ ($ - sqrt_inputs) / 6 + +atan_series_inputs: + db 0,0,0,0,0,0 + db 0x7f,0,0,0,0,0 ; 0.25 + db 0x80,0,0,0,0,0 ; 0.5 + db 0x7f,0xe7,0xcf,0xcc,0x13,0x54 ; sqrt(2)-1 +atan_series_input_count equ ($ - atan_series_inputs) / 6 + +arctan_inputs: + db 0,0,0,0,0,0 + db 0x7e,0,0,0,0,0 ; 0.125 + db 0x80,0,0,0,0,0 ; 0.5 + db 0x81,0,0,0,0,0 ; 1 + db 0x82,0,0,0,0,0 ; 2 + db 0x81,0,0,0,0,0x80 ; -1 +arctan_input_count equ ($ - arctan_inputs) / 6 + +ln_inputs: + db 0x80,0,0,0,0,0 ; 0.5 + db 0x81,0,0,0,0,0 ; 1 + db 0x82,0,0,0,0,0 ; 2 + db 0x81,0,0,0,0,0x40 ; 1.5 + db 0x84,0,0,0,0,0x20 ; 10 +ln_input_count equ ($ - ln_inputs) / 6 + +exp_inputs: + db 0x82,0,0,0,0,0x80 ; -2 + db 0x81,0,0,0,0,0x80 ; -1 + db 0x80,0,0,0,0,0x80 ; -0.5 + db 0,0,0,0,0,0 + db 0x80,0,0,0,0,0 ; 0.5 + db 0x81,0,0,0,0,0 ; 1 + db 0x82,0,0,0,0,0 ; 2 + db 0x84,0,0,0,0,0x20 ; 10 +exp_input_count equ ($ - exp_inputs) / 6 + +trig_inputs: + db 0,0,0,0,0,0 + db 0x80,0x6a,0xc1,0x91,0x0a,0x06 ; pi/6 + db 0x81,0x21,0xa2,0xda,0x0f,0x49 ; pi/2 + db 0x82,0x21,0xa2,0xda,0x0f,0x49 ; pi + db 0x83,0x21,0xa2,0xda,0x0f,0x49 ; 2*pi + db 0x81,0x21,0xa2,0xda,0x0f,0xc9 ; -pi/2 + db 0x81,0,0,0,0,0 ; 1 +trig_input_count equ ($ - trig_inputs) / 6 + +probe_output: + times integer_input_count * 6 db 0 +round_output equ $ + times round_input_count * 5 db 0 +arithmetic_output equ $ + times arithmetic_pair_count * 28 db 0 +part_output equ $ + times part_input_count * 12 db 0 +sqrt_output equ $ + times sqrt_input_count * 6 db 0 +atan_series_output equ $ + times atan_series_input_count * 6 db 0 +arctan_output equ $ + times arctan_input_count * 6 db 0 +ln_output equ $ + times ln_input_count * 6 db 0 +exp_output equ $ + times exp_input_count * 6 db 0 +sin_output equ $ + times trig_input_count * 6 db 0 +cos_output equ $ + times trig_input_count * 6 db 0 +probe_output_end: + +output_name db 'R48.OUT',0 +arithmetic_input_cursor dw arithmetic_pairs +arithmetic_output_cursor dw arithmetic_output +arithmetic_remaining db arithmetic_pair_count +part_input_cursor dw part_inputs +part_output_cursor dw part_output +part_remaining db part_input_count +sqrt_input_cursor dw sqrt_inputs +sqrt_output_cursor dw sqrt_output +sqrt_remaining db sqrt_input_count +atan_series_input_cursor dw atan_series_inputs +atan_series_output_cursor dw atan_series_output +atan_series_remaining db atan_series_input_count +arctan_input_cursor dw arctan_inputs +arctan_output_cursor dw arctan_output +arctan_remaining db arctan_input_count +ln_input_cursor dw ln_inputs +ln_output_cursor dw ln_output +ln_remaining db ln_input_count +exp_input_cursor dw exp_inputs +exp_output_cursor dw exp_output +exp_remaining db exp_input_count +trig_input_cursor dw trig_inputs +sin_output_cursor dw sin_output +cos_output_cursor dw cos_output +trig_remaining db trig_input_count + +; Code5 file offset 108800 + 0x0cd0. Keeping the slice contiguous preserves +; every near displacement among the conversion/compare core routines. It is +; also placed at its original CS offset so absolute table references 1191.. +; 1435 used by the transcendental helpers continue to address original bytes. +times (0x0bd0 - ($ - $$)) db 0 +real48_core: + incbin "TDKPIN.EXE", 112080, 0x7d4 + +real48_i32_to_registers equ real48_core + (0x0f3b - 0x0cd0) +real48_registers_to_i32 equ real48_core + (0x0f77 - 0x0cd0) +real48_add_registers equ real48_core + (0x0cd4 - 0x0cd0) +real48_subtract_registers equ real48_core +real48_multiply_registers equ real48_core + (0x0d97 - 0x0cd0) +real48_divide_registers equ real48_core + (0x0e9a - 0x0cd0) +real48_integer_part equ real48_core + (0x1059 - 0x0cd0) +real48_fractional_part equ real48_core + (0x10aa - 0x0cd0) +real48_sqrt equ real48_core + (0x10be - 0x0cd0) +real48_arctan_series equ real48_core + (0x1436 - 0x0cd0) +real48_arctan equ real48_core + (0x1307 - 0x0cd0) +real48_ln equ real48_core + (0x11bb - 0x0cd0) +real48_exp equ real48_core + (0x1264 - 0x0cd0) +real48_sin equ real48_core + (0x1130 - 0x0cd0) +real48_cos equ real48_core + (0x111d - 0x0cd0) + +%macro probe_arithmetic 1 + mov bp, [arithmetic_input_cursor] + mov ax, [bp] + mov bx, [bp + 2] + mov dx, [bp + 4] + mov cx, [bp + 6] + mov si, [bp + 8] + mov di, [bp + 10] + call %1 + pushf + mov di, [arithmetic_output_cursor] + mov [di], ax + mov [di + 2], bx + mov [di + 4], dx + pop ax + and al, 1 + mov [di + 6], al + add word [arithmetic_output_cursor], 7 +%endmacro + +%macro probe_trig 2 + mov bp, [trig_input_cursor] + mov ax, [bp] + mov bx, [bp + 2] + mov dx, [bp + 4] + push cs + call %1 + mov di, [%2] + mov [di], ax + mov [di + 2], bx + mov [di + 4], dx + add word [%2], 6 +%endmacro + +%macro probe_exp 0 + mov bp, [exp_input_cursor] + mov ax, [bp] + mov bx, [bp + 2] + mov dx, [bp + 4] + push cs + call real48_exp + mov di, [exp_output_cursor] + mov [di], ax + mov [di + 2], bx + mov [di + 4], dx + add word [exp_output_cursor], 6 +%endmacro + +%macro probe_ln 0 + mov bp, [ln_input_cursor] + mov ax, [bp] + mov bx, [bp + 2] + mov dx, [bp + 4] + push cs + call real48_ln + mov di, [ln_output_cursor] + mov [di], ax + mov [di + 2], bx + mov [di + 4], dx + add word [ln_output_cursor], 6 +%endmacro + +%macro probe_arctan 0 + mov bp, [arctan_input_cursor] + mov ax, [bp] + mov bx, [bp + 2] + mov dx, [bp + 4] + push cs + call real48_arctan + mov di, [arctan_output_cursor] + mov [di], ax + mov [di + 2], bx + mov [di + 4], dx + add word [arctan_output_cursor], 6 +%endmacro + +%macro probe_atan_series 0 + mov bp, [atan_series_input_cursor] + mov ax, [bp] + mov bx, [bp + 2] + mov dx, [bp + 4] + call real48_arctan_series + mov di, [atan_series_output_cursor] + mov [di], ax + mov [di + 2], bx + mov [di + 4], dx + add word [atan_series_output_cursor], 6 +%endmacro + +%macro probe_sqrt 0 + mov bp, [sqrt_input_cursor] + mov ax, [bp] + mov bx, [bp + 2] + mov dx, [bp + 4] + push cs + call real48_sqrt + mov di, [sqrt_output_cursor] + mov [di], ax + mov [di + 2], bx + mov [di + 4], dx + add word [sqrt_output_cursor], 6 +%endmacro + +%macro probe_part 1 + mov bp, [part_input_cursor] + mov ax, [bp] + mov bx, [bp + 2] + mov dx, [bp + 4] + push cs + call %1 + mov di, [part_output_cursor] + mov [di], ax + mov [di + 2], bx + mov [di + 4], dx + add word [part_output_cursor], 6 +%endmacro + +main: + push cs + pop ds + push cs + pop es + + mov si, integer_inputs + mov di, probe_output + mov cx, integer_input_count +.integer_loop: + mov ax, [si] + mov dx, [si + 2] + push cx + call real48_i32_to_registers + pop cx + stosw ; exponent/low fraction + mov ax, bx + stosw ; middle fraction + mov ax, dx + stosw ; high fraction/sign + add si, 4 + loop .integer_loop + + mov si, round_inputs + mov di, round_output + mov bp, round_input_count +.round_loop: + mov ax, [si] + mov bx, [si + 2] + mov dx, [si + 4] + mov ch, 1 ; Borland Round entry mode + call real48_registers_to_i32 + stosw + mov ax, dx + stosw + mov byte [di], 0 + jnc .round_no_overflow + inc byte [di] +.round_no_overflow: + inc di + add si, 6 + dec bp + jnz .round_loop + +.arithmetic_loop: + probe_arithmetic real48_add_registers + probe_arithmetic real48_subtract_registers + probe_arithmetic real48_multiply_registers + probe_arithmetic real48_divide_registers + add word [arithmetic_input_cursor], 12 + dec byte [arithmetic_remaining] + jnz .arithmetic_loop + +.part_loop: + probe_part real48_integer_part + probe_part real48_fractional_part + add word [part_input_cursor], 6 + dec byte [part_remaining] + jnz .part_loop + +.sqrt_loop: + probe_sqrt + add word [sqrt_input_cursor], 6 + dec byte [sqrt_remaining] + jnz .sqrt_loop + +.atan_series_loop: + probe_atan_series + add word [atan_series_input_cursor], 6 + dec byte [atan_series_remaining] + jnz .atan_series_loop + +.arctan_loop: + probe_arctan + add word [arctan_input_cursor], 6 + dec byte [arctan_remaining] + jnz .arctan_loop + +.ln_loop: + probe_ln + add word [ln_input_cursor], 6 + dec byte [ln_remaining] + jnz .ln_loop + +.exp_loop: + probe_exp + add word [exp_input_cursor], 6 + dec byte [exp_remaining] + jnz .exp_loop + +.trig_loop: + probe_trig real48_sin, sin_output_cursor + probe_trig real48_cos, cos_output_cursor + add word [trig_input_cursor], 6 + dec byte [trig_remaining] + jnz .trig_loop + + mov dx, output_name + xor cx, cx + mov ah, 0x3c ; create/truncate + int 0x21 + jc .failure + mov bx, ax + mov dx, probe_output + mov cx, probe_output_end - probe_output + mov ah, 0x40 + int 0x21 + mov ah, 0x3e + int 0x21 + mov ax, 0x4c00 + int 0x21 +.failure: + mov ax, 0x4c01 + int 0x21 diff --git a/original/tools/promote_verified_data.py b/original/tools/promote_verified_data.py new file mode 100644 index 0000000..9d4933e --- /dev/null +++ b/original/tools/promote_verified_data.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python3 +"""Promote semantic DGROUP rows after every referring function is verified.""" + +from __future__ import annotations + +import argparse +import csv +import re +from io import StringIO +from pathlib import Path + +ROOT = Path(__file__).resolve().parent.parent + + +def closed_evidence(text: str) -> str: + """Remove obsolete pre-closure clauses without discarding useful evidence.""" + stale = re.compile( + r"\b(pending|remain(?:s|ing)? raw|raw/partial|remain(?:s|ing)? partial|" + r"unresolved)\b", + re.IGNORECASE, + ) + clauses = [ + clause.strip() + for clause in text.split(";") + if clause.strip() and not stale.search(clause) + ] + closure = "complete verified referring-function closure" + if not any(closure in clause for clause in clauses): + clauses.append(closure) + return "; ".join(clauses) + + +def read_tsv(name: str) -> list[dict[str, str]]: + with (ROOT / name).open(newline="", encoding="utf-8") as handle: + return list(csv.DictReader(handle, delimiter="\t")) + + +def serialize(columns: list[str], rows: list[dict[str, str]]) -> str: + output = StringIO() + writer = csv.DictWriter( + output, fieldnames=columns, delimiter="\t", lineterminator="\n" + ) + writer.writeheader() + writer.writerows(rows) + return output.getvalue() + + +def promote() -> dict[str, str]: + functions = read_tsv("FUNCTION_RECONSTRUCTION.tsv") + verified_names = { + row["raw_name"] for row in functions if row["status"] == "verified" + } + if len(verified_names) != len(functions): + raise SystemExit("refusing data promotion before all functions are verified") + + reconstruction = read_tsv("DATA_RECONSTRUCTION.tsv") + if any(row["status"] == "unknown" for row in reconstruction): + raise SystemExit("refusing data promotion while referenced addresses are unknown") + for row in reconstruction: + referring = { + name for name in row["referring_functions"].split(",") if name + } + unresolved = referring - verified_names + if unresolved: + raise SystemExit( + f"unverified data callers at {row['address']}: " + + ", ".join(sorted(unresolved)) + ) + row["evidence"] = closed_evidence(row["evidence"]) + if row["status"] == "restored": + row["status"] = "verified" + row["notes"] = ( + "Exact semantic object field, extent, and complete read/write " + "inventory are closed through verified address-linked functions." + ) + + objects = read_tsv("DATA_OBJECTS.tsv") + for row in objects: + row["evidence"] = closed_evidence(row["evidence"]) + if row["status"] == "restored": + row["status"] = "verified" + row["notes"] = ( + "Exact object boundary, type, initialization, and full in-image " + "reader/writer lifecycle are verified." + ) + + coverage = read_tsv("DATA_COVERAGE.tsv") + for row in coverage: + row["evidence"] = closed_evidence(row["evidence"]) + if row["status"] == "restored": + row["status"] = "verified" + row["notes"] = ( + "Range is fully covered by a verified semantic DGROUP object." + ) + + return { + "DATA_RECONSTRUCTION.tsv": serialize( + list(reconstruction[0]), reconstruction + ), + "DATA_OBJECTS.tsv": serialize(list(objects[0]), objects), + "DATA_COVERAGE.tsv": serialize(list(coverage[0]), coverage), + } + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("--check", action="store_true") + arguments = parser.parse_args() + expected = promote() + for name, text in expected.items(): + path = ROOT / name + if arguments.check: + if path.read_text(encoding="utf-8") != text: + raise SystemExit(f"{name} needs deterministic semantic promotion") + else: + path.write_text(text, encoding="utf-8") + + +if __name__ == "__main__": + main() diff --git a/original/tools/promote_verified_imports.py b/original/tools/promote_verified_imports.py new file mode 100644 index 0000000..4dd5a22 --- /dev/null +++ b/original/tools/promote_verified_imports.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python3 +"""Promote Win16 imports only after the complete caller ledger is verified.""" + +from __future__ import annotations + +import argparse +import csv +from collections import Counter, defaultdict +from pathlib import Path + +ROOT = Path(__file__).resolve().parent.parent +IMPORT_COLUMNS = ( + "address", + "library", + "import_name", + "stack_purge_bytes", + "call_sites", + "status", + "stage", + "prototype", + "evidence", + "notes", +) + + +def read_tsv(name: str) -> list[dict[str, str]]: + with (ROOT / name).open(newline="", encoding="utf-8") as handle: + return list(csv.DictReader(handle, delimiter="\t")) + + +def expected_rows() -> list[dict[str, str]]: + rows = read_tsv("IMPORT_RECONSTRUCTION.tsv") + functions = read_tsv("FUNCTION_RECONSTRUCTION.tsv") + verified_names = { + row["raw_name"] for row in functions if row["status"] == "verified" + } + if len(verified_names) != len(functions): + raise SystemExit("refusing import promotion before every function is verified") + + calls: Counter[str] = Counter() + callers: dict[str, set[str]] = defaultdict(set) + for reference in read_tsv("REFERENCES.tsv"): + if "CALL" not in reference["reference_type"]: + continue + target = reference["to_address"] + if not target.startswith("1228:"): + continue + calls[target] += 1 + callers[target].add(reference["from_function"]) + + for row in rows: + if not row["prototype"]: + raise SystemExit(f"missing prototype for {row['address']}") + expected_count = int(row["call_sites"]) + if calls[row["address"]] != expected_count: + raise SystemExit( + f"call-count drift for {row['address']}: " + f"ledger={expected_count}, references={calls[row['address']]}" + ) + unresolved = callers[row["address"]] - verified_names + if unresolved: + raise SystemExit( + f"unverified callers for {row['address']}: " + + ", ".join(sorted(unresolved)) + ) + if row["status"] == "verified": + continue + row["status"] = "verified" + if expected_count == 0: + row["stage"] = "unused-slot-verified" + row["evidence"] += ( + "; complete Ghidra CALL inventory and NE relocation inventory: " + "zero call sites" + ) + row["notes"] = ( + "Explicit imported NE slot with no CALL reference anywhere in the " + "complete image; no TDKPIN call-site behavior exists to reconstruct." + ) + else: + row["stage"] = "call-sites-verified" + row["evidence"] += ( + f"; all {expected_count} direct call sites map to verified " + "address-linked function rows and readable C" + ) + row["notes"] = ( + f"All {expected_count} relocation-backed direct call sites are in " + "verified functions whose evidence records argument order, segmented " + "pointer or handle use, return handling, side effects, and branches." + ) + return rows + + +def serialize(rows: list[dict[str, str]]) -> str: + from io import StringIO + + output = StringIO() + writer = csv.DictWriter( + output, fieldnames=IMPORT_COLUMNS, delimiter="\t", lineterminator="\n" + ) + writer.writeheader() + writer.writerows(rows) + return output.getvalue() + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("--check", action="store_true") + arguments = parser.parse_args() + path = ROOT / "IMPORT_RECONSTRUCTION.tsv" + expected = serialize(expected_rows()) + current = path.read_text(encoding="utf-8") + if arguments.check: + if current != expected: + raise SystemExit("IMPORT_RECONSTRUCTION.tsv needs deterministic promotion") + return + path.write_text(expected, encoding="utf-8") + + +if __name__ == "__main__": + main() diff --git a/original/tools/promote_verified_resources.py b/original/tools/promote_verified_resources.py new file mode 100644 index 0000000..2fecb39 --- /dev/null +++ b/original/tools/promote_verified_resources.py @@ -0,0 +1,242 @@ +#!/usr/bin/env python3 +"""Build the verified resource ledger from immutable extraction evidence.""" + +from __future__ import annotations + +import argparse +import csv +import hashlib +import io +import json +from pathlib import Path + + +ROOT = Path(__file__).resolve().parent.parent +TARGET_SHA256 = "a9022f1894e3e6e21fc42e8f6c932f7c549ca77f63aaa0c488bb9d55d9d0174c" +FIELDS = ( + "type", "id", "file_offset", "allocated_size", "raw_sha256", + "raw_path", "decoded_paths", "status", "stage", "users", + "behavior", "notes", +) + + +def read_tsv(path: Path) -> list[dict[str, str]]: + with path.open(newline="", encoding="utf-8") as stream: + return list(csv.DictReader(stream, delimiter="\t")) + + +def verified_function_addresses() -> set[str]: + rows = read_tsv(ROOT / "FUNCTION_RECONSTRUCTION.tsv") + assert len(rows) == 391 + assert all(row["status"] == "verified" for row in rows) + return {row["address"] for row in rows} + + +def require_closed_ledger(name: str) -> None: + rows = read_tsv(ROOT / name) + assert rows + assert all(row["status"] == "verified" for row in rows), name + + +def role(resource_type: str, resource_id: int) -> str: + if resource_type == "DAT": + if 400 <= resource_id <= 407: + return f"42x123 player-emblem sprite {resource_id - 400}" + if resource_id == 600: + return "544x180 rotating-target and panel-animation atlas" + if 701 <= resource_id <= 704: + return f"146x142 score-status level {resource_id - 700}" + if 801 <= resource_id <= 809: + return f"68x61 collected-item display count {resource_id - 800}" + return { + 900: "900x296 18-frame claw atlas", + 901: "230x17 launcher and velocity-row decoration atlas", + 993: "360x300 high-score background", + 994: "237x13 asset-loading progress strip", + 995: "640x460 one-shot board splash", + 997: "640x460 immutable restore overlay A", + 998: "640x460 restore overlay B and mutable background", + 1001: "640x460 board background selected by index 1", + 1002: "640x460 board background selected by index 2", + 1003: "640x460 board background selected by index 3", + 1004: "640x460 board background selected by index 4", + 1005: "640x460 board background selected by index 5", + }[resource_id] + if resource_type == "PAL": + return "256 RGB triples shared by all custom DAT DIBs" + if resource_type == "WAV": + return { + 2001: "add-player cue", + 2002: "launcher-release cue", + 2004: "trigger-activation cue", + 2006: "timed target 51..53 hit cue", + 2007: "score-marker or full-item-bank award cue", + 2008: "normal ball-end cue", + 2011: "rotating-target mechanism cue", + 2012: "target and panel transition cue", + 2013: "panel-mechanism motion cue", + 2015: "ball-capture cue", + 2016: "claw ball-release cue", + 2017: "completed target-bank/item award cue", + 2019: "table-nudge or kick-response cue", + 2020: "tilt cue", + 2021: "flipper-motion cue", + 2022: "loaded and freed sound slot 22 with no in-image playback selector", + }[resource_id] + if resource_type == "BITMAP": + return { + 101: "16x16 SRCPAINT object-composition image", + 102: "16x16 SRCAND object-composition mask", + 500: "944x28 score-digit and timer-indicator atlas", + }[resource_id] + return { + ("ICON", 1): "32x32 image selected by GROUP_ICON 996", + ("GROUP_ICON", 996): "main-window icon group loaded at 1000:016c", + ("VERSION", 1): "Windows version metadata with no image-code loader", + ("DIALOG", 32512): "Borland 2D File Open template", + ("DIALOG", 32513): "Borland 2D File Save As template", + ("DIALOG", 32514): "2D text-entry template selected at 1008:1607", + ("DIALOG", 32515): "Borland CTL3D File Open template", + ("DIALOG", 32516): "Borland CTL3D File Save As template", + ("DIALOG", 32517): "CTL3D text-entry template selected at 1008:1607", + }[(resource_type, resource_id)] + + +def mapping(resource_type: str, resource_id: int) -> tuple[str, str]: + if resource_type == "DAT": + if 400 <= resource_id <= 407: + return "fully-mapped", "1000:5390,1008:149d,1000:0002,1000:51f5" + if resource_id == 600: + return "fully-mapped", "1000:5390,1008:149d,1000:6f27,1000:7440,1000:51f5" + if 701 <= resource_id <= 704: + return "fully-mapped", "1000:5390,1008:149d,1008:0b9e,1000:51f5" + if 801 <= resource_id <= 809: + return "fully-mapped", "1000:5390,1008:149d,1008:0dbd,1000:51f5" + return "fully-mapped", { + 900: "1000:5390,1008:149d,1008:0e08,1000:51f5", + 901: "1000:5390,1008:149d,1000:638e,1000:6b37,1000:51f5", + 993: "1000:5be5,1008:149d,1000:5c13,1000:5ba6", + 994: "1000:5390,1000:531e,1008:149d", + 995: "1000:5390,1008:149d", + 997: "1000:5390,1008:149d,1008:0837,1000:7440,1000:eab1,1000:51f5", + 998: "1000:5390,1008:149d,1008:07b6,1008:08bb,1008:093f,1008:0996,1008:0e08,1000:51f5", + 1001: "1000:6129,1008:149d,1000:616e,1000:60e7", + 1002: "1000:6129,1008:149d,1000:616e,1000:60e7", + 1003: "1000:6129,1008:149d,1000:616e,1000:60e7", + 1004: "1000:6129,1008:149d,1000:616e,1000:60e7", + 1005: "1000:6129,1008:149d,1000:616e,1000:60e7", + }[resource_id] + if resource_type == "PAL": + return "fully-mapped", "1008:1326,1008:11c5,1008:13a8,1008:149d" + if resource_type == "WAV": + events = { + 2001: "1000:638e", 2002: "1000:638e", 2004: "1000:c79c", + 2006: "1000:b476", 2007: "1000:b476,1000:bc36", + 2008: "1000:ae6e", 2011: "1000:6f27", 2012: "1000:b476,1000:7440", + 2013: "1000:7440", 2015: "1000:c79c", 2016: "1000:eab1", + 2017: "1000:b476", 2019: "1000:638e,1000:c79c", + 2020: "1000:638e", 2021: "1000:7ed9", 2022: "", + }[resource_id] + users = "1008:0f2e,1008:1131,1008:10e3" + if events: + users += "," + events + return "fully-mapped", users + if resource_type == "BITMAP": + return "fully-mapped", { + 101: "1000:5390,1000:9bca,1000:9f73,1000:a38e,1000:51f5", + 102: "1000:5390,1000:9bca,1000:9f73,1000:a38e", + 500: "1000:5390,1008:0996,1000:eab1,1000:51f5", + }[resource_id] + if (resource_type, resource_id) == ("GROUP_ICON", 996): + return "system-resolved", "1000:016c" + if (resource_type, resource_id) == ("ICON", 1): + return "system-resolved", "GROUP_ICON:996 -> USER:LoadIcon" + if resource_type == "VERSION": + return "system-resolved", "Windows resource/version consumers; no in-image call" + if resource_id in {32514, 32517}: + return "fully-mapped", "1008:1607,1008:2996,1008:2a45,1008:2ae3" + return "linked-unused", "none (complete verified template-selector inventory)" + + +def build_rows() -> list[dict[str, str]]: + target = (ROOT / "TDKPIN.EXE").read_bytes() + assert hashlib.sha256(target).hexdigest() == TARGET_SHA256 + manifest = json.loads((ROOT / "assets/manifest.json").read_text(encoding="utf-8")) + assert manifest["source_sha256"] == TARGET_SHA256 + assert manifest["resource_count"] == len(manifest["resources"]) == 63 + functions = verified_function_addresses() + require_closed_ledger("IMPORT_RECONSTRUCTION.tsv") + require_closed_ledger("DATA_RECONSTRUCTION.tsv") + require_closed_ledger("DATA_COVERAGE.tsv") + + rows = [] + for entry in manifest["resources"]: + resource_type = entry["type"] + resource_id = int(entry["id"]) + raw = (ROOT / entry["raw_path"]).read_bytes() + start = entry["file_offset"] + end = start + entry["allocated_size"] + assert raw == target[start:end] + assert hashlib.sha256(raw).hexdigest() == entry["raw_sha256"] + stage, users = mapping(resource_type, resource_id) + for token in users.split(","): + token = token.strip() + if len(token) == 9 and token[4] == ":": + assert token in functions, (resource_type, resource_id, token) + if stage == "linked-unused": + notes = ( + "Lossless extraction and decoded template structure are verified; " + "the complete selector inventory across 391 verified functions has no user, " + "so this Borland library template is explicitly retained as unused." + ) + elif stage == "system-resolved": + notes = ( + "Lossless extraction is verified; the Windows resource-system relationship " + "and the absence of any additional in-image loader are fully accounted." + ) + else: + notes = ( + "Lossless extraction, decoded derivative, exact load/use/release lifecycle, " + "and complete verified function closure are represented in reconstructed/" + "tdkpin_resources.c and the cited reconstruction units." + ) + rows.append({ + "type": resource_type, + "id": str(resource_id), + "file_offset": str(entry["file_offset"]), + "allocated_size": str(entry["allocated_size"]), + "raw_sha256": entry["raw_sha256"], + "raw_path": entry["raw_path"], + "decoded_paths": ",".join(entry.get("decoded_paths", [])), + "status": "verified", + "stage": stage, + "users": users, + "behavior": role(resource_type, resource_id) + ".", + "notes": notes, + }) + assert len({(row["type"], row["id"]) for row in rows}) == 63 + return rows + + +def render(rows: list[dict[str, str]]) -> str: + stream = io.StringIO(newline="") + writer = csv.DictWriter(stream, fieldnames=FIELDS, delimiter="\t", lineterminator="\n") + writer.writeheader() + writer.writerows(rows) + return stream.getvalue() + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("--check", action="store_true") + args = parser.parse_args() + output = render(build_rows()) + destination = ROOT / "RESOURCE_RECONSTRUCTION.tsv" + if args.check: + assert destination.read_text(encoding="utf-8") == output + else: + destination.write_text(output, encoding="utf-8") + + +if __name__ == "__main__": + main() diff --git a/original/tools/recover_win16_imports.py b/original/tools/recover_win16_imports.py new file mode 100755 index 0000000..8118274 --- /dev/null +++ b/original/tools/recover_win16_imports.py @@ -0,0 +1,196 @@ +#!/usr/bin/env python3 +"""Populate the import ledger from Wine 11.15 Win16 specs and target evidence.""" + +from __future__ import annotations + +import csv +import hashlib +import re +import urllib.request +from pathlib import Path + +ROOT = Path(__file__).resolve().parent.parent +LEDGER = ROOT / "IMPORT_RECONSTRUCTION.tsv" +WINE_TAG = "wine-11.15" +WINE_BASE = f"https://gitlab.winehq.org/wine/wine/-/raw/{WINE_TAG}" +SPEC_SOURCES = { + "USER": ( + "dlls/user.exe16/user.exe16.spec", + "d873fa88079c4f922cbba2fb3a75f40e2ff23b4d56434b0f4326169397539e32", + ), + "GDI": ( + "dlls/gdi.exe16/gdi.exe16.spec", + "3bd84b26a9d4b7aa91a9114d0a46dc13e4d6fcd71290120afdd9b7cfaffe76ab", + ), + "KERNEL": ( + "dlls/krnl386.exe16/krnl386.exe16.spec", + "8d799b701d1cf16d4e882b5e354dc6e357056d4adcd83e629571dc4b33b02075", + ), + "MMSYSTEM": ( + "dlls/mmsystem.dll16/mmsystem.dll16.spec", + "31e54179db61fa95a1d90a9a230d2ae5afb6013ba37ae54e78990d1795694a73", + ), + "KEYBOARD": ( + "dlls/keyboard.drv16/keyboard.drv16.spec", + "ca9a9e697e9afe0baf5cff7099ebb442169f36fa05293e78a0bb50fbefaa096d", + ), +} +SPEC_FUNCTION = re.compile( + r"^\s*(?P\d+)\s+" + r"(?Ppascal|cdecl|varargs|stub|register)" + r"(?P(?:\s+-\S+)*)\s+" + r"(?P[A-Za-z0-9_@]+)\((?P[^)]*)\)" +) +SPEC_EQUATE = re.compile( + r"^\s*(?P\d+)\s+equate\s+(?P[A-Za-z0-9_@]+)\s+(?P\S+)" +) + + +def fetch_specs() -> dict[str, tuple[str, list[str]]]: + specs = {} + for library, (path, expected_digest) in SPEC_SOURCES.items(): + url = f"{WINE_BASE}/{path}" + with urllib.request.urlopen(url, timeout=30) as response: + payload = response.read() + digest = hashlib.sha256(payload).hexdigest() + if digest != expected_digest: + raise RuntimeError( + f"Wine source drift for {path}: expected {expected_digest}, got {digest}" + ) + specs[library] = (url, payload.decode("utf-8").splitlines()) + return specs + + +def parse_specs( + specs: dict[str, tuple[str, list[str]]], +) -> dict[tuple[str, str], dict[str, str]]: + declarations = {} + for library, (url, lines) in specs.items(): + for line_number, line in enumerate(lines, 1): + match = SPEC_FUNCTION.match(line) + if match: + name = match.group("name") + flags = match.group("flags").strip() + kind = match.group("kind") + prefix = f"{kind}16" + if flags: + prefix += f" {flags}" + declaration = f"{prefix} {name}({match.group('arguments').strip()})" + declarations[(library, name.upper())] = { + "prototype": declaration, + "evidence": f"Wine {WINE_TAG} {url}#L{line_number}", + "notes": ( + f"Wine Win16 ordinal {match.group('ordinal')}; " + "every TDKPIN call site still requires argument-level review." + ), + "status": "partial", + "stage": "prototype-sourced", + } + continue + match = SPEC_EQUATE.match(line) + if match: + name = match.group("name") + declarations[(library, name.upper())] = { + "prototype": f"equate16 {name} = {match.group('value')}", + "evidence": f"Wine {WINE_TAG} {url}#L{line_number}", + "notes": ( + f"Wine Win16 ordinal {match.group('ordinal')}; this is runtime data, " + "not a callable function." + ), + "status": "verified", + "stage": "runtime-data", + } + return declarations + + +def recover_special_declarations( + declarations: dict[tuple[str, str], dict[str, str]], +) -> None: + keyboard_url = f"{WINE_BASE}/{SPEC_SOURCES['KEYBOARD'][0]}" + declarations[("KEYBOARD", "ORDINAL_5")] = { + "prototype": "pascal16 -ret16 AnsiToOem(str ptr)", + "evidence": f"Wine {WINE_TAG} {keyboard_url}#L5", + "notes": "Imported by ordinal; Wine identifies ordinal 5 as AnsiToOem.", + "status": "partial", + "stage": "prototype-sourced", + } + declarations[("KEYBOARD", "ORDINAL_6")] = { + "prototype": "pascal16 -ret16 OemToAnsi(str ptr)", + "evidence": f"Wine {WINE_TAG} {keyboard_url}#L6", + "notes": "Imported by ordinal; Wine identifies ordinal 6 as OemToAnsi.", + "status": "partial", + "stage": "prototype-sourced", + } + declarations[("MMTIMER", "SYSTEMTIMERMAKE")] = { + "prototype": ( + "pascal16 -ret16 SystemTimerMake(" + "HWND16 recipient, word delay_ms, word resolution_ms, word one_shot)" + ), + "evidence": ( + "MMTIMER.DLL 1000:0039 disassembly; export ordinal 1; " + "f1d9ac980c7bfba5dc53eaa9e7cb2c3cd9b82f879ee8962ad40bf863d641bb49" + ), + "notes": ( + "Binary-reviewed wrapper around timeSetEvent16: it installs MMTIMER 1000:0002, " + "posts message 0x0580 to recipient, and returns the multimedia timer id." + ), + "status": "verified", + "stage": "binary-reviewed", + } + + +def main() -> int: + with LEDGER.open(newline="", encoding="utf-8") as handle: + reader = csv.DictReader(handle, delimiter="\t") + columns = list(reader.fieldnames or ()) + rows = list(reader) + if "stage" not in columns: + columns.insert(columns.index("status") + 1, "stage") + + declarations = parse_specs(fetch_specs()) + recover_special_declarations(declarations) + import_keys = {(row["library"], row["import_name"].upper()) for row in rows} + missing = sorted(import_keys - set(declarations)) + if missing: + raise RuntimeError(f"no Win16 declaration for: {missing}") + + for row in rows: + recovered = declarations[(row["library"], row["import_name"].upper())] + preserve_review = row.get("stage") not in { + "", + "untyped-import", + "prototype-sourced", + "runtime-data", + "binary-reviewed", + } + preserved = ( + {key: row.get(key, "") for key in ("status", "stage", "evidence", "notes")} + if preserve_review + else None + ) + row.update(recovered) + if preserved: + row.update(preserved) + + temporary = LEDGER.with_suffix(LEDGER.suffix + ".tmp") + with temporary.open("w", newline="", encoding="utf-8") as handle: + writer = csv.DictWriter( + handle, fieldnames=columns, delimiter="\t", lineterminator="\n" + ) + writer.writeheader() + writer.writerows(rows) + temporary.replace(LEDGER) + + statuses = {} + for row in rows: + statuses[row["status"]] = statuses.get(row["status"], 0) + 1 + print(f"updated_import_slots={len(rows)}") + print( + f"unique_declarations={len({(row['library'], row['import_name']) for row in rows})}" + ) + print("statuses=" + ",".join(f"{key}:{statuses[key]}" for key in sorted(statuses))) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/original/tools/test_reconstructed_c.sh b/original/tools/test_reconstructed_c.sh new file mode 100755 index 0000000..8819c05 --- /dev/null +++ b/original/tools/test_reconstructed_c.sh @@ -0,0 +1,901 @@ +#!/usr/bin/env bash +set -euo pipefail + +workspace_dir=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd -P) +test_build_dir=$(mktemp -d /tmp/tdkpin-c-tests.XXXXXX) +trap 'rm -f -- "$test_build_dir/resource-test" "$test_build_dir/runtime-ui-test" "$test_build_dir/string-test" "$test_build_dir/shortstring-test" "$test_build_dir/random-test" "$test_build_dir/object-windows-test" "$test_build_dir/object-windows-handlers-test" "$test_build_dir/window-advanced-test" "$test_build_dir/window-creation-test" "$test_build_dir/game-windows-test" "$test_build_dir/highscores-test" "$test_build_dir/gameplay-helpers-test" "$test_build_dir/ball-render-test" "$test_build_dir/ball-restore-test" "$test_build_dir/ball-sweep-test" "$test_build_dir/player-sprite-test" "$test_build_dir/scoring-test" "$test_build_dir/player-state-test" "$test_build_dir/turn-state-test" "$test_build_dir/mechanism-render-test" "$test_build_dir/collision-events-test" "$test_build_dir/panel-animation-test" "$test_build_dir/game-setup-test" "$test_build_dir/flippers-test" "$test_build_dir/flipper-bitmap-geometry-test" "$test_build_dir/flipper-collision-test" "$test_build_dir/physics-test" "$test_build_dir/timer-tick-test" "$test_build_dir/key-input-test" "$test_build_dir/key-release-test" "$test_build_dir/arithmetic-test" "$test_build_dir/command-line-test" "$test_build_dir/heap-reserve-test" "$test_build_dir/numeric-test" "$test_build_dir/multimedia-test" "$test_build_dir/multimedia-startup-test" "$test_build_dir/multimedia-paths-test" "$test_build_dir/program-entry-test" "$test_build_dir/collision-records-test" "$test_build_dir/heap-core-test" "$test_build_dir/heap-paths-test" "$test_build_dir/global-memory-test" "$test_build_dir/borland-objects-test" "$test_build_dir/stack-test" "$test_build_dir/system-timer-test" "$test_build_dir/dispatch-test" "$test_build_dir/bound-thunks-test" "$test_build_dir/application-test" "$test_build_dir/message-dispatch-test" "$test_build_dir/application-loop-test" "$test_build_dir/application-windows-test" "$test_build_dir/window-messages-test" "$test_build_dir/window-command-test" "$test_build_dir/object-list-test" "$test_build_dir/window-destroy-test" "$test_build_dir/class-registration-test" "$test_build_dir/object-lifecycle-test" "$test_build_dir/child-validation-test" "$test_build_dir/message-pump-test" "$test_build_dir/dialog-test" "$test_build_dir/runtime-input-test" "$test_build_dir/runtime-lifecycle-test" "$test_build_dir/runtime-minmax-test" "$test_build_dir/borland-records-test" "$test_build_dir/borland-files-test" "$test_build_dir/borland-startup-test" "$test_build_dir/tpwincrt-text-test" "$test_build_dir/tpwincrt-lifecycle-test" "$test_build_dir/tables-test" "$test_build_dir/sound-test" "$test_build_dir/real48-test" "$test_build_dir/palette-test" "$test_build_dir/palette-gdi-test" "$test_build_dir/bitmap-loader-test" "$test_build_dir/game-assets-test" "$test_build_dir/overlay-setup-test" "$test_build_dir/board-overlay-test" "$test_build_dir/asset-initializer-test" "$test_build_dir/asset-cleanup-test" "$test_build_dir/render-test" "$test_build_dir/score-render-test" "$test_build_dir/status-render-test" "$test_build_dir/claw-render-test" "$test_build_dir/palette-messages-test" "$test_build_dir/palette-window-messages-test" "$test_build_dir/window-lifecycle-test" "$test_build_dir/window-placement-test" "$test_build_dir/game-application-test"; rmdir -- "$test_build_dir"' EXIT + +python3 "$workspace_dir/tools/generate_game_setup_collision_data.py" --check +python3 "$workspace_dir/tools/promote_verified_imports.py" --check +python3 "$workspace_dir/tools/promote_verified_data.py" --check +python3 "$workspace_dir/tools/promote_verified_resources.py" --check +python3 "$workspace_dir/tools/verify_extracted_assets.py" + +while IFS= read -r source_unit; do + source_name=$(basename -- "$source_unit") + rg -Fq -- "$source_name" "$workspace_dir/tools/test_reconstructed_c.sh" +done < <(find "$workspace_dir/reconstructed" -maxdepth 1 -name '*.c' -print) + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + "$workspace_dir/reconstructed/tdkpin_initialization.c" \ + "$workspace_dir/reconstructed/tests/test_initialization.c" \ + -o "$test_build_dir/resource-test" + +"$test_build_dir/resource-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + "$workspace_dir/reconstructed/tdkpin_resources.c" \ + "$workspace_dir/reconstructed/tests/test_resources.c" \ + -o "$test_build_dir/resource-test" + +"$test_build_dir/resource-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_runtime_ui.c" \ + "$workspace_dir/reconstructed/tdkpin_data.c" \ + "$workspace_dir/reconstructed/tests/test_runtime_ui.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/runtime-ui-test" + +"$test_build_dir/runtime-ui-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_strings.c" \ + "$workspace_dir/reconstructed/tests/test_strings.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/string-test" + +"$test_build_dir/string-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_shortstrings.c" \ + "$workspace_dir/reconstructed/tests/test_shortstrings.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/shortstring-test" + +"$test_build_dir/shortstring-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_random.c" \ + "$workspace_dir/reconstructed/tests/test_random.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/random-test" + +"$test_build_dir/random-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_object_windows.c" \ + "$workspace_dir/reconstructed/tests/test_object_windows.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/object-windows-test" + +"$test_build_dir/object-windows-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_window_messages.c" \ + "$workspace_dir/reconstructed/tdkpin_dialog.c" \ + "$workspace_dir/reconstructed/tests/test_object_windows_handlers.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/object-windows-handlers-test" + +"$test_build_dir/object-windows-handlers-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_window_messages.c" \ + "$workspace_dir/reconstructed/tests/test_window_advanced_handlers.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/window-advanced-test" + +"$test_build_dir/window-advanced-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_window_placement.c" \ + "$workspace_dir/reconstructed/tests/test_window_creation.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/window-creation-test" + +"$test_build_dir/window-creation-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_game_windows.c" \ + "$workspace_dir/reconstructed/tests/test_game_windows.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/game-windows-test" + +"$test_build_dir/game-windows-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_arithmetic.c" \ + "$workspace_dir/reconstructed/tdkpin_borland_runtime.c" \ + "$workspace_dir/reconstructed/tdkpin_shortstrings.c" \ + "$workspace_dir/reconstructed/tdkpin_strings.c" \ + "$workspace_dir/reconstructed/tdkpin_numeric.c" \ + "$workspace_dir/reconstructed/tdkpin_highscores.c" \ + "$workspace_dir/reconstructed/tests/test_highscores.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/highscores-test" + +"$test_build_dir/highscores-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_arithmetic.c" \ + "$workspace_dir/reconstructed/tdkpin_gameplay_helpers.c" \ + "$workspace_dir/reconstructed/tests/test_gameplay_helpers.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/gameplay-helpers-test" + +"$test_build_dir/gameplay-helpers-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_arithmetic.c" \ + "$workspace_dir/reconstructed/tdkpin_gameplay_helpers.c" \ + "$workspace_dir/reconstructed/tests/test_ball_render.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/ball-render-test" + +"$test_build_dir/ball-render-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_arithmetic.c" \ + "$workspace_dir/reconstructed/tdkpin_gameplay_helpers.c" \ + "$workspace_dir/reconstructed/tests/test_ball_restore.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/ball-restore-test" + +"$test_build_dir/ball-restore-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_arithmetic.c" \ + "$workspace_dir/reconstructed/tdkpin_gameplay_helpers.c" \ + "$workspace_dir/reconstructed/tests/test_ball_sweep.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/ball-sweep-test" + +"$test_build_dir/ball-sweep-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_gameplay_helpers.c" \ + "$workspace_dir/reconstructed/tests/test_player_sprite.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/player-sprite-test" + +"$test_build_dir/player-sprite-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_arithmetic.c" \ + "$workspace_dir/reconstructed/tdkpin_gameplay_helpers.c" \ + "$workspace_dir/reconstructed/tests/test_scoring.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/scoring-test" + +"$test_build_dir/scoring-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_player_state.c" \ + "$workspace_dir/reconstructed/tests/test_player_state.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/player-state-test" + +"$test_build_dir/player-state-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_turn_state.c" \ + "$workspace_dir/reconstructed/tests/test_turn_state.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/turn-state-test" + +"$test_build_dir/turn-state-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_mechanism_render.c" \ + "$workspace_dir/reconstructed/tests/test_mechanism_render.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/mechanism-render-test" + +"$test_build_dir/mechanism-render-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_collision_events.c" \ + "$workspace_dir/reconstructed/tests/test_collision_events.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/collision-events-test" + +"$test_build_dir/collision-events-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_panel_animation.c" \ + "$workspace_dir/reconstructed/tests/test_panel_animation.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/panel-animation-test" + +"$test_build_dir/panel-animation-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_game_setup.c" \ + "$workspace_dir/reconstructed/tests/test_game_setup.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/game-setup-test" + +"$test_build_dir/game-setup-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_flippers.c" \ + "$workspace_dir/reconstructed/tests/test_flippers.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/flippers-test" + +"$test_build_dir/flippers-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_flipper_bitmap_geometry.c" \ + "$workspace_dir/reconstructed/tests/test_flipper_bitmap_geometry.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/flipper-bitmap-geometry-test" + +"$test_build_dir/flipper-bitmap-geometry-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_arithmetic.c" \ + "$workspace_dir/reconstructed/tdkpin_real48.c" \ + "$workspace_dir/reconstructed/tdkpin_flipper_collision.c" \ + "$workspace_dir/reconstructed/tests/test_flipper_collision.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/flipper-collision-test" + +"$test_build_dir/flipper-collision-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_arithmetic.c" \ + "$workspace_dir/reconstructed/tdkpin_real48.c" \ + "$workspace_dir/reconstructed/tdkpin_physics.c" \ + "$workspace_dir/reconstructed/tests/test_physics.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/physics-test" + +"$test_build_dir/physics-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_arithmetic.c" \ + "$workspace_dir/reconstructed/tdkpin_real48.c" \ + "$workspace_dir/reconstructed/tdkpin_timer_tick.c" \ + "$workspace_dir/reconstructed/tests/test_timer_tick.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/timer-tick-test" + +"$test_build_dir/timer-tick-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_key_input.c" \ + "$workspace_dir/reconstructed/tests/test_key_input.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/key-input-test" + +"$test_build_dir/key-input-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_key_input.c" \ + "$workspace_dir/reconstructed/tests/test_key_release.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/key-release-test" + +"$test_build_dir/key-release-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + "$workspace_dir/reconstructed/tdkpin_arithmetic.c" \ + "$workspace_dir/reconstructed/tests/test_arithmetic.c" \ + -o "$test_build_dir/arithmetic-test" + +"$test_build_dir/arithmetic-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_arithmetic.c" \ + "$workspace_dir/reconstructed/tdkpin_real48.c" \ + "$workspace_dir/reconstructed/tdkpin_collision_records.c" \ + "$workspace_dir/reconstructed/tests/test_collision_records.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/collision-records-test" + +"$test_build_dir/collision-records-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_command_line.c" \ + "$workspace_dir/reconstructed/tests/test_command_line.c" \ + -o "$test_build_dir/command-line-test" + +"$test_build_dir/command-line-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_borland_runtime.c" \ + "$workspace_dir/reconstructed/tests/test_heap_reserve.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/heap-reserve-test" + +"$test_build_dir/heap-reserve-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_numeric.c" \ + "$workspace_dir/reconstructed/tests/test_numeric.c" \ + -o "$test_build_dir/numeric-test" + +"$test_build_dir/numeric-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_multimedia.c" \ + "$workspace_dir/reconstructed/tests/test_multimedia.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/multimedia-test" + +"$test_build_dir/multimedia-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_strings.c" \ + "$workspace_dir/reconstructed/tdkpin_shortstrings.c" \ + "$workspace_dir/reconstructed/tdkpin_multimedia_startup.c" \ + "$workspace_dir/reconstructed/tests/test_multimedia_startup.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/multimedia-startup-test" + +"$test_build_dir/multimedia-startup-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_strings.c" \ + "$workspace_dir/reconstructed/tdkpin_multimedia_paths.c" \ + "$workspace_dir/reconstructed/tests/test_multimedia_paths.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/multimedia-paths-test" + +"$test_build_dir/multimedia-paths-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_program_entry.c" \ + "$workspace_dir/reconstructed/tests/test_program_entry.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/program-entry-test" + +"$test_build_dir/program-entry-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_heap.c" \ + "$workspace_dir/reconstructed/tests/test_heap_core.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/heap-core-test" + +"$test_build_dir/heap-core-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_heap.c" \ + "$workspace_dir/reconstructed/tests/test_heap_paths.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/heap-paths-test" + +"$test_build_dir/heap-paths-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + "$workspace_dir/reconstructed/tdkpin_global_memory.c" \ + "$workspace_dir/reconstructed/tests/test_global_memory.c" \ + -o "$test_build_dir/global-memory-test" + +"$test_build_dir/global-memory-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_borland_objects.c" \ + "$workspace_dir/reconstructed/tests/test_borland_objects.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/borland-objects-test" + +"$test_build_dir/borland-objects-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_stack.c" \ + "$workspace_dir/reconstructed/tests/test_stack.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/stack-test" + +"$test_build_dir/stack-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_stack.c" \ + "$workspace_dir/reconstructed/tdkpin_borland_objects.c" \ + "$workspace_dir/reconstructed/tdkpin_system_timer.c" \ + "$workspace_dir/reconstructed/tests/test_system_timer.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/system-timer-test" + +"$test_build_dir/system-timer-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_dispatch.c" \ + "$workspace_dir/reconstructed/tests/test_dispatch.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/dispatch-test" + +"$test_build_dir/dispatch-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_borland_runtime.c" \ + "$workspace_dir/reconstructed/tdkpin_object_windows.c" \ + "$workspace_dir/reconstructed/tests/test_bound_thunks.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/bound-thunks-test" + +"$test_build_dir/bound-thunks-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_borland_objects.c" \ + "$workspace_dir/reconstructed/tdkpin_application.c" \ + "$workspace_dir/reconstructed/tests/test_application.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/application-test" + +"$test_build_dir/application-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_object_windows.c" \ + "$workspace_dir/reconstructed/tests/test_message_dispatch.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/message-dispatch-test" + +"$test_build_dir/message-dispatch-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_application.c" \ + "$workspace_dir/reconstructed/tests/test_application_loop.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/application-loop-test" + +"$test_build_dir/application-loop-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_application.c" \ + "$workspace_dir/reconstructed/tests/test_application_windows.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/application-windows-test" + +"$test_build_dir/application-windows-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_object_windows.c" \ + "$workspace_dir/reconstructed/tdkpin_application.c" \ + "$workspace_dir/reconstructed/tdkpin_window_messages.c" \ + "$workspace_dir/reconstructed/tests/test_window_messages.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/window-messages-test" + +"$test_build_dir/window-messages-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_object_windows.c" \ + "$workspace_dir/reconstructed/tdkpin_window_messages.c" \ + "$workspace_dir/reconstructed/tests/test_window_command.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/window-command-test" + +"$test_build_dir/window-command-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_object_list.c" \ + "$workspace_dir/reconstructed/tests/test_object_list.c" \ + -o "$test_build_dir/object-list-test" + +"$test_build_dir/object-list-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_object_list.c" \ + "$workspace_dir/reconstructed/tdkpin_window_messages.c" \ + "$workspace_dir/reconstructed/tests/test_window_destroy.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/window-destroy-test" + +"$test_build_dir/window-destroy-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_window_messages.c" \ + "$workspace_dir/reconstructed/tests/test_class_registration.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/class-registration-test" + +"$test_build_dir/class-registration-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_object_lifecycle.c" \ + "$workspace_dir/reconstructed/tests/test_object_lifecycle.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/object-lifecycle-test" + +"$test_build_dir/object-lifecycle-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_object_list.c" \ + "$workspace_dir/reconstructed/tests/test_child_validation.c" \ + -o "$test_build_dir/child-validation-test" + +"$test_build_dir/child-validation-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_message_pump.c" \ + "$workspace_dir/reconstructed/tests/test_message_pump.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/message-pump-test" + +"$test_build_dir/message-pump-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_dialog.c" \ + "$workspace_dir/reconstructed/tests/test_dialog.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/dialog-test" + +"$test_build_dir/dialog-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_runtime_ui.c" \ + "$workspace_dir/reconstructed/tdkpin_data.c" \ + "$workspace_dir/reconstructed/tests/test_runtime_input.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/runtime-input-test" + +"$test_build_dir/runtime-input-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_runtime_ui.c" \ + "$workspace_dir/reconstructed/tests/test_runtime_lifecycle.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/runtime-lifecycle-test" + +"$test_build_dir/runtime-lifecycle-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_runtime_ui.c" \ + "$workspace_dir/reconstructed/tests/test_runtime_minmax.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/runtime-minmax-test" + +"$test_build_dir/runtime-minmax-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_borland_records.c" \ + "$workspace_dir/reconstructed/tests/test_borland_records.c" \ + -o "$test_build_dir/borland-records-test" + +"$test_build_dir/borland-records-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_borland_files.c" \ + "$workspace_dir/reconstructed/tests/test_borland_files.c" \ + -o "$test_build_dir/borland-files-test" + +"$test_build_dir/borland-files-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + "$workspace_dir/reconstructed/tdkpin_borland_startup.c" \ + "$workspace_dir/reconstructed/tests/test_borland_startup.c" \ + -o "$test_build_dir/borland-startup-test" + +"$test_build_dir/borland-startup-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_tpwincrt_text.c" \ + "$workspace_dir/reconstructed/tests/test_tpwincrt_text.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/tpwincrt-text-test" + +"$test_build_dir/tpwincrt-text-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_tpwincrt_lifecycle.c" \ + "$workspace_dir/reconstructed/tests/test_tpwincrt_lifecycle.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/tpwincrt-lifecycle-test" + +"$test_build_dir/tpwincrt-lifecycle-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_tables.c" \ + "$workspace_dir/reconstructed/tests/test_tables.c" \ + -o "$test_build_dir/tables-test" + +"$test_build_dir/tables-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_data.c" \ + "$workspace_dir/reconstructed/tdkpin_command_line.c" \ + "$workspace_dir/reconstructed/tdkpin_strings.c" \ + "$workspace_dir/reconstructed/tdkpin_shortstrings.c" \ + "$workspace_dir/reconstructed/tdkpin_sound.c" \ + "$workspace_dir/reconstructed/tests/test_sound.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/sound-test" + +"$test_build_dir/sound-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -fsanitize=address,undefined \ + "$workspace_dir/reconstructed/tdkpin_real48.c" \ + "$workspace_dir/reconstructed/tests/test_real48.c" \ + -o "$test_build_dir/real48-test" + +"$test_build_dir/real48-test" +"$workspace_dir/tools/probe_real48_reference.sh" >/dev/null + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_palette.c" \ + "$workspace_dir/reconstructed/tests/test_palette.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/palette-test" + +"$test_build_dir/palette-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_palette.c" \ + "$workspace_dir/reconstructed/tests/test_palette_gdi.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/palette-gdi-test" + +"$test_build_dir/palette-gdi-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_palette.c" \ + "$workspace_dir/reconstructed/tests/test_bitmap_loader.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/bitmap-loader-test" + +"$test_build_dir/bitmap-loader-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_game_assets.c" \ + "$workspace_dir/reconstructed/tests/test_game_assets.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/game-assets-test" + +"$test_build_dir/game-assets-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_game_assets.c" \ + "$workspace_dir/reconstructed/tests/test_overlay_setup.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/overlay-setup-test" + +"$test_build_dir/overlay-setup-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_game_assets.c" \ + "$workspace_dir/reconstructed/tests/test_board_overlay.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/board-overlay-test" + +"$test_build_dir/board-overlay-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_asset_initializer.c" \ + "$workspace_dir/reconstructed/tests/test_asset_initializer.c" \ + -o "$test_build_dir/asset-initializer-test" + +"$test_build_dir/asset-initializer-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_asset_cleanup.c" \ + "$workspace_dir/reconstructed/tests/test_asset_cleanup.c" \ + -o "$test_build_dir/asset-cleanup-test" + +"$test_build_dir/asset-cleanup-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_render.c" \ + "$workspace_dir/reconstructed/tests/test_render.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/render-test" + +"$test_build_dir/render-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_render.c" \ + "$workspace_dir/reconstructed/tests/test_score_render.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/score-render-test" + +"$test_build_dir/score-render-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_status_render.c" \ + "$workspace_dir/reconstructed/tests/test_status_render.c" \ + -o "$test_build_dir/status-render-test" + +"$test_build_dir/status-render-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_claw_render.c" \ + "$workspace_dir/reconstructed/tests/test_claw_render.c" \ + -o "$test_build_dir/claw-render-test" + +"$test_build_dir/claw-render-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_game_assets.c" \ + "$workspace_dir/reconstructed/tests/test_palette_messages.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/palette-messages-test" + +"$test_build_dir/palette-messages-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_game_assets.c" \ + "$workspace_dir/reconstructed/tests/test_palette_window_messages.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/palette-window-messages-test" + +"$test_build_dir/palette-window-messages-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_window_lifecycle.c" \ + "$workspace_dir/reconstructed/tests/test_window_lifecycle.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/window-lifecycle-test" + +"$test_build_dir/window-lifecycle-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + -ffunction-sections -fdata-sections \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_window_placement.c" \ + "$workspace_dir/reconstructed/tests/test_window_placement.c" \ + -Wl,--gc-sections \ + -o "$test_build_dir/window-placement-test" + +"$test_build_dir/window-placement-test" + +clang -std=c11 -Wall -Wextra -Werror -pedantic \ + "$workspace_dir/reconstructed/tdkpin_segmented.c" \ + "$workspace_dir/reconstructed/tdkpin_game_application.c" \ + "$workspace_dir/reconstructed/tests/test_game_application.c" \ + -o "$test_build_dir/game-application-test" + +"$test_build_dir/game-application-test" +echo "Reconstructed C tests passed"