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"