From f98fba3c9d3ad4943b193844722248391601860d Mon Sep 17 00:00:00 2001 From: nmlgc Date: Fri, 16 Mar 2018 07:43:20 +0100 Subject: [PATCH] [Reverse-engineering] [th02/th04/th05] .map file loading Funded by -Tom-. --- th02/th02.asm | 2 + th02_main.asm | 825 ++----------------------------------------- th04/formats/map.inc | 6 + th04/th04.asm | 2 + th04_main.asm | 44 +-- th05/th05.asm | 2 + th05_main.asm | 41 +-- 7 files changed, 77 insertions(+), 845 deletions(-) create mode 100644 th04/formats/map.inc diff --git a/th02/th02.asm b/th02/th02.asm index ed830b78..d177daf0 100644 --- a/th02/th02.asm +++ b/th02/th02.asm @@ -36,3 +36,5 @@ mikoconfig_t struc mikoconfig_t ends END_LINE_LEN = 46 + +MAP_SIZE = 0C00h diff --git a/th02_main.asm b/th02_main.asm index 632819fa..e40a3a01 100644 --- a/th02_main.asm +++ b/th02_main.asm @@ -986,28 +986,27 @@ sub_42F8 endp ; Attributes: bp-based frame -sub_4314 proc near +MAP_SIG_SIZE = 10 -arg_2 = word ptr 6 -arg_4 = word ptr 8 +map_load proc pascal + arg @@fn:dword + local @@ms:byte:MAP_SIG_SIZE - enter 0Ah, 0 - push [bp+arg_4] - push [bp+arg_2] - nopcall file_ropen - push ss - lea ax, [bp-0Ah] - push ax - push 0Ah - nopcall file_read - push ds - push offset unk_21A56 - push 0C00h - nopcall file_read - nopcall file_close - leave - retf 4 -sub_4314 endp + push word ptr @@fn+2 + push word ptr @@fn + nopcall file_ropen + push ss + lea ax, @@ms + push ax + push MAP_SIG_SIZE + nopcall file_read + push ds + push offset map + push MAP_SIZE + nopcall file_read + nopcall file_close + ret +map_load endp ; =============== S U B R O U T I N E ======================================= @@ -1259,7 +1258,7 @@ loc_449C: loc_44BF: mov bx, di add bx, cx - mov al, [bx+3FE6h] + mov al, map[bx] mov [si+4DF6h], al mov bx, [bp+var_2] mov [bx+si+4E0Fh], al @@ -1359,7 +1358,7 @@ loc_455C: and ax, 7 imul ax, 18h add bx, ax - mov al, [bx+si+3FE6h] + mov al, map[bx+si] mov ah, 0 mov [bp-2], ax mov ax, si @@ -1425,7 +1424,7 @@ loc_45CB: and ax, 7 imul ax, 18h add bx, ax - mov al, [bx+si+3FE6h] + mov al, map[bx+si] mov bx, 17h sub bx, di imul bx, 18h @@ -2331,7 +2330,7 @@ loc_B4D7: push ss lea ax, [bp+var_C] push ax - call far ptr sub_4314 + call map_load call sub_42F8 push ss lea ax, [bp+var_C] @@ -38737,19 +38736,13 @@ byte_21A52 db ? byte_21A53 db ? byte_21A54 db ? byte_21A55 db ? -unk_21A56 db ? ; +map db MAP_SIZE dup (?) dd ? ; dd ? ; dd ? ; dd ? ; dd ? ; dd ? ; - db ? ; -word_21A70 dw ? -word_21A72 dw ? -dword_21A74 dd ? -word_21A78 dw ? -word_21A7A dw ? dd ? ; dd ? ; dd ? ; @@ -38814,12 +38807,6 @@ word_21A7A dw ? dd ? ; dd ? ; dd ? ; -byte_21B7C db ? - db ? -word_21B7E dw ? -word_21B80 dw ? -byte_21B82 db ? -byte_21B83 db ? dd ? ; dd ? ; dd ? ; @@ -38830,770 +38817,6 @@ byte_21B83 db ? dd ? ; dd ? ; dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - db ? ; - db ? ; word_22796 dw ? byte_22798 db ? dd ? ; diff --git a/th04/formats/map.inc b/th04/formats/map.inc new file mode 100644 index 00000000..69413eae --- /dev/null +++ b/th04/formats/map.inc @@ -0,0 +1,6 @@ +; .map file header. + +map_header_t struc + map_size dw ? + map_unk dw 3 dup (?) +map_header_t ends diff --git a/th04/th04.asm b/th04/th04.asm index 1c62d9c6..9c71a7c2 100644 --- a/th04/th04.asm +++ b/th04/th04.asm @@ -1,2 +1,4 @@ GAME = 4 include defconv_pascal.inc + +include th04/formats/map.inc diff --git a/th04_main.asm b/th04_main.asm index 0ecd6769..63efcdfa 100644 --- a/th04_main.asm +++ b/th04_main.asm @@ -978,7 +978,7 @@ loc_B141: call sub_B8FC loc_B144: - call sub_B971 + call map_load call sub_B6D1 call sub_CED4 call sub_BAA2 @@ -1091,7 +1091,7 @@ sub_B29E proc near call sub_1DFD4 call sub_CF1E call sub_B79E - call sub_B9BB + call map_free push 800100h call super_clean mov si, 8 @@ -1765,7 +1765,7 @@ loc_B89D: pop es assume es:_DATA push ds - mov ax, word_25A3E + mov ax, map_seg mov ds, ax mov cx, 18h rep movsw @@ -1865,11 +1865,11 @@ sub_B8FC endp ; Attributes: bp-based frame -sub_B971 proc near +map_load proc near -var_8 = word ptr -8 +@@mh = map_header_t ptr -(size map_header_t) - enter 8, 0 + enter size map_header_t, 0 les bx, dword_2CDC6 assume es:nothing mov al, es:[bx+13h] @@ -1879,41 +1879,41 @@ var_8 = word ptr -8 push bx call file_ropen push ss - lea ax, [bp+var_8] + lea ax, [bp+@@mh] push ax - push 8 + push size map_header_t call file_read - call sub_B9BB - push [bp+var_8] + call map_free + push [bp+@@mh.map_size] call hmem_allocbyte - mov word_25A3E, ax + mov map_seg, ax push ax push 0 - push [bp+var_8] + push [bp+@@mh.map_size] call file_read call file_close leave retn -sub_B971 endp +map_load endp ; =============== S U B R O U T I N E ======================================= ; Attributes: bp-based frame -sub_B9BB proc near +map_free proc near push bp mov bp, sp - cmp word_25A3E, 0 + cmp map_seg, 0 jz short loc_B9D4 - push word_25A3E + push map_seg call hmem_free - mov word_25A3E, 0 + mov map_seg, 0 loc_B9D4: pop bp retn -sub_B9BB endp +map_free endp ; =============== S U B R O U T I N E ======================================= @@ -2041,7 +2041,7 @@ sub_BAA2 proc near mov es, ax mov ax, word_21C58 mov fs, ax - mov ax, word_25A3E + mov ax, map_seg mov ds, ax mov al, 5 @@ -5297,7 +5297,7 @@ loc_CF63: push 1Fh call sub_13A58 call sub_B79E - call sub_B9BB + call map_free loc_CF70: nopcall sub_D6EB @@ -8547,7 +8547,7 @@ loc_E813: call sub_CF1E call sub_FF89 call sub_B79E - call sub_B9BB + call map_free call super_free call graph_hide call text_clear @@ -47704,7 +47704,7 @@ byte_25A38 db ? word_25A3A dw ? byte_25A3C db ? byte_25A3D db ? -word_25A3E dw ? +map_seg dw ? dd ? ; dd ? ; dd ? ; diff --git a/th05/th05.asm b/th05/th05.asm index fa97a8d8..97a748e2 100644 --- a/th05/th05.asm +++ b/th05/th05.asm @@ -1,2 +1,4 @@ GAME = 5 include defconv_pascal.inc + +include th04/formats/map.inc diff --git a/th05_main.asm b/th05_main.asm index 5b03ab96..fdbf9744 100644 --- a/th05_main.asm +++ b/th05_main.asm @@ -1097,7 +1097,7 @@ loc_B4A6: call sub_BAF8 loc_B4A9: - call sub_BB3E + call map_load call sub_BDEC call sub_EE17 call sub_BB9A @@ -1224,7 +1224,7 @@ sub_B609 proc near call sub_14529 call sub_EE32 call sub_BEA4 - call sub_BB82 + call map_free push 0B40100h call super_clean mov si, 1 @@ -1825,9 +1825,9 @@ sub_BAF8 endp ; =============== S U B R O U T I N E ======================================= -sub_BB3E proc near +map_load proc near push si - call sub_BB82 + call map_free mov al, stage_id add al, 30h ; '0' mov aSt00_map+3, al @@ -1840,17 +1840,17 @@ sub_BB3E proc near mov bx, ax mov si, ax mov ah, 3Fh ; '?' - mov dx, 3514h + mov dx, offset map_header mov cx, 8 int 21h ; DOS - 2+ - READ FROM FILE WITH HANDLE ; BX = file handle, CX = number of bytes to read ; DS:DX -> buffer - push word_23EF4 + push map_header.map_size call hmem_allocbyte - mov word_25354, ax + mov map_seg, ax push ds mov bx, si - mov cx, word_23EF4 + mov cx, map_header.map_size mov ds, ax xor dx, dx mov ah, 3Fh @@ -1863,22 +1863,22 @@ sub_BB3E proc near ; BX = file handle pop si retn -sub_BB3E endp +map_load endp ; =============== S U B R O U T I N E ======================================= -sub_BB82 proc near - cmp word_25354, 0 +map_free proc near + cmp map_seg, 0 jz short locret_BB98 - push word_25354 + push map_seg call hmem_free - mov word_25354, 0 + mov map_seg, 0 locret_BB98: retn -sub_BB82 endp +map_free endp ; --------------------------------------------------------------------------- nop @@ -1900,7 +1900,7 @@ sub_BB9A proc near assume es:_DATA mov ax, word_21290 mov fs, ax - mov ax, word_25354 + mov ax, map_seg mov ds, ax mov al, 5 @@ -2165,7 +2165,7 @@ loc_BD88: pop es assume es:_DATA push ds - mov ax, word_25354 + mov ax, map_seg mov ds, ax mov cx, 18h rep movsw @@ -10398,7 +10398,7 @@ loc_F71C: call sub_EE32 call sub_CE68 call sub_BEA4 - call sub_BB82 + call map_free call super_free call graph_hide call text_clear @@ -45501,10 +45501,7 @@ include libs/master.lib/pfint21[bss].asm word_23EEC dw ? dw ? dword_23EF0 dd ? -word_23EF4 dw ? - dd ? ; - db ? ; - db ? ; +map_header map_header_t ? byte_23EFC db ? word_23EFD dw ? word_23EFF dw ? @@ -46852,7 +46849,7 @@ byte_25350 db ? byte_25351 db ? byte_25352 db ? byte_25353 db ? -word_25354 dw ? +map_seg dw ? dd ? ; dd ? ; dd ? ;