[Decompilation] [th01] mdrv2_resident

I thought this would be a good target for my first attempt at
decompilation. Should have known something was up, because it's the only
undecompiled proc in the translation unit.

Oh well, SCOPY stands for "structure copy" anyway. /s
This commit is contained in:
Egor 2019-11-04 05:11:06 +02:00 committed by nmlgc
parent 61252e83f5
commit 0460072f25
5 changed files with 33 additions and 221 deletions

View File

@ -28,6 +28,26 @@ typedef enum {
} mdrv2_func_t; } mdrv2_func_t;
extern char mdrv2_have_board; extern char mdrv2_have_board;
struct hack { char x[12]; }; // XXX
extern const struct hack mdrv2_magic;
int far mdrv2_resident(void)
{
char s1[sizeof(mdrv2_magic)];
const struct hack s2 = mdrv2_magic;
char far *magicp = (char far *)(
((long)peek(0, MDRV2 * 4 + 2) << 16) + 0x102
);
int i;
for(i = 0; i < sizeof(s1); i++) {
s1[i] = magicp[i];
}
if(strcmp(s1, s2.x) != 0) {
return 0;
}
return 1;
}
static void near pascal mdrv2_load(const char *fn, char func) static void near pascal mdrv2_load(const char *fn, char func)
{ {

5
th01/mdrv2[data].asm Normal file
View File

@ -0,0 +1,5 @@
public _mdrv2_have_board
_mdrv2_have_board db 0
db 0
public _mdrv2_magic
_mdrv2_magic db 'Mdrv2System',0

View File

@ -316,7 +316,7 @@ _envp = dword ptr 0Ch
push bp push bp
mov bp, sp mov bp, sp
call sub_EF80 call _mdrv2_resident
or ax, ax or ax, ax
jnz short loc_A105 jnz short loc_A105
pop bp pop bp
@ -9909,74 +9909,7 @@ fuuin_12_TEXT ends
; Segment type: Pure code ; Segment type: Pure code
fuuin_13_TEXT segment byte public 'CODE' use16 fuuin_13_TEXT segment byte public 'CODE' use16
assume cs:fuuin_13_TEXT extern _mdrv2_resident:proc
assume es:nothing, ss:nothing, ds:_DATA, fs:nothing, gs:nothing
; =============== S U B R O U T I N E =======================================
; Attributes: bp-based frame
sub_EF80 proc far
s2 = byte ptr -1Ch
s1 = byte ptr -10h
var_4 = dword ptr -4
enter 1Ch, 0
push si
lea ax, [bp+s2]
push ss
push ax
push ds
push offset aMdrv2system ; "Mdrv2System"
mov cx, 0Ch
call SCOPY@
xor ax, ax
mov es, ax
movsx eax, word ptr es:[03CAh]
shl eax, 10h
add eax, 102h
shld edx, eax, 10h
mov word ptr [bp+var_4+2], dx
mov word ptr [bp+var_4], ax
xor si, si
jmp short loc_EFC6
; ---------------------------------------------------------------------------
loc_EFBA:
les bx, [bp+var_4]
assume es:nothing
add bx, si
mov al, es:[bx]
mov [bp+si+s1], al
inc si
loc_EFC6:
cmp si, 0Ch
jl short loc_EFBA
push ss
lea ax, [bp+s2]
push ax ; s2
push ss
lea ax, [bp+s1]
push ax ; s1
call _strcmp
add sp, 8
or ax, ax
jz short loc_EFE5
xor ax, ax
jmp short loc_EFE8
; ---------------------------------------------------------------------------
loc_EFE5:
mov ax, 1
loc_EFE8:
pop si
leave
retf
sub_EF80 endp
extern _mdrv2_bgm_load:proc extern _mdrv2_bgm_load:proc
extern _mdrv2_se_load:proc extern _mdrv2_se_load:proc
extern _mdrv2_bgm_play:proc extern _mdrv2_bgm_play:proc
@ -10338,10 +10271,7 @@ word_134FA dw 1
db 0 db 0
word_13507 dw 64h word_13507 dw 64h
byte_13509 db 0 byte_13509 db 0
public _mdrv2_have_board include th01/mdrv2[data].asm
_mdrv2_have_board db 0
db 0
aMdrv2system db 'Mdrv2System',0
include libs/master.lib/version[data].asm include libs/master.lib/version[data].asm
include libs/master.lib/grp[data].asm include libs/master.lib/grp[data].asm
include libs/master.lib/pal[data].asm include libs/master.lib/pal[data].asm

View File

@ -7578,75 +7578,7 @@ op_10_TEXT ends
; Segment type: Pure code ; Segment type: Pure code
op_11_TEXT segment byte public 'CODE' use16 op_11_TEXT segment byte public 'CODE' use16
assume cs:op_11_TEXT extern _mdrv2_resident:proc
;org 5
assume es:nothing, ss:nothing, ds:_DATA, fs:nothing, gs:nothing
; =============== S U B R O U T I N E =======================================
; Attributes: bp-based frame
_mdrv2_resident proc far
s2 = byte ptr -1Ch
s1 = byte ptr -10h
var_4 = dword ptr -4
enter 1Ch, 0
push si
lea ax, [bp+s2]
push ss
push ax
push ds
push offset aMdrv2system ; "Mdrv2System"
mov cx, 0Ch
call SCOPY@
xor ax, ax
mov es, ax
movsx eax, word ptr es:[03CAh]
shl eax, 10h
add eax, 102h
shld edx, eax, 10h
mov word ptr [bp+var_4+2], dx
mov word ptr [bp+var_4], ax
xor si, si
jmp short loc_E42B
; ---------------------------------------------------------------------------
loc_E41F:
les bx, [bp+var_4]
assume es:nothing
add bx, si
mov al, es:[bx]
mov [bp+si+s1], al
inc si
loc_E42B:
cmp si, 0Ch
jl short loc_E41F
push ss
lea ax, [bp+s2]
push ax ; s2
push ss
lea ax, [bp+s1]
push ax ; s1
call _strcmp
add sp, 8
or ax, ax
jz short loc_E44A
xor ax, ax
jmp short loc_E44D
; ---------------------------------------------------------------------------
loc_E44A:
mov ax, 1
loc_E44D:
pop si
leave
retf
_mdrv2_resident endp
extern _mdrv2_bgm_load:proc extern _mdrv2_bgm_load:proc
extern _mdrv2_bgm_play:proc extern _mdrv2_bgm_play:proc
extern _mdrv2_bgm_stop:proc extern _mdrv2_bgm_stop:proc
@ -7654,7 +7586,6 @@ _mdrv2_resident endp
extern _mdrv2_check_board:proc extern _mdrv2_check_board:proc
op_11_TEXT ends op_11_TEXT ends
; ---------------------------------------------------------------------------
; =========================================================================== ; ===========================================================================
op_12_TEXT segment byte public 'CODE' use16 op_12_TEXT segment byte public 'CODE' use16
@ -8025,10 +7956,7 @@ include libs/master.lib/clip[data].asm
include libs/master.lib/rand[data].asm include libs/master.lib/rand[data].asm
public _res_id public _res_id
_res_id db 'ReiidenConfig',0 _res_id db 'ReiidenConfig',0
public _mdrv2_have_board include th01/mdrv2[data].asm
_mdrv2_have_board db 0
db 0
aMdrv2system db 'Mdrv2System',0
.data? .data?
; TODO: Missing clip[bss].asm (16 bytes) somewhere in there... ; TODO: Missing clip[bss].asm (16 bytes) somewhere in there...

View File

@ -4012,7 +4012,7 @@ _envp = dword ptr 0Ch
mov [bp+var_2], 0 mov [bp+var_2], 0
xor si, si xor si, si
mov [bp+var_4], 0 mov [bp+var_4], 0
call sub_12455 call _mdrv2_resident
or ax, ax or ax, ax
jnz short loc_D54F jnz short loc_D54F
jmp short loc_D579 jmp short loc_D579
@ -12723,75 +12723,7 @@ main_15_TEXT ends
; Segment type: Pure code ; Segment type: Pure code
main_16_TEXT segment byte public 'CODE' use16 main_16_TEXT segment byte public 'CODE' use16
assume cs:main_16_TEXT extern _mdrv2_resident:proc
;org 5
assume es:nothing, ss:nothing, ds:_DATA, fs:nothing, gs:nothing
; =============== S U B R O U T I N E =======================================
; Attributes: bp-based frame
sub_12455 proc far
_s2 = byte ptr -1Ch
s1 = byte ptr -10h
var_4 = dword ptr -4
enter 1Ch, 0
push si
lea ax, [bp+_s2]
push ss
push ax
push ds
push offset aMdrv2system ; "Mdrv2System"
mov cx, 0Ch
call SCOPY@
xor ax, ax
mov es, ax
movsx eax, word ptr es:[03CAh]
shl eax, 10h
add eax, 102h
shld edx, eax, 10h
mov word ptr [bp+var_4+2], dx
mov word ptr [bp+var_4], ax
xor si, si
jmp short loc_1249B
; ---------------------------------------------------------------------------
loc_1248F:
les bx, [bp+var_4]
assume es:nothing
add bx, si
mov al, es:[bx]
mov [bp+si+s1], al
inc si
loc_1249B:
cmp si, 0Ch
jl short loc_1248F
push ss
lea ax, [bp+_s2]
push ax ; s2
push ss
lea ax, [bp+s1]
push ax ; s1
call _strcmp
add sp, 8
or ax, ax
jz short loc_124BA
xor ax, ax
jmp short loc_124BD
; ---------------------------------------------------------------------------
loc_124BA:
mov ax, 1
loc_124BD:
pop si
leave
retf
sub_12455 endp
extern _mdrv2_bgm_load:proc extern _mdrv2_bgm_load:proc
extern _mdrv2_se_load:proc extern _mdrv2_se_load:proc
extern _mdrv2_bgm_play:proc extern _mdrv2_bgm_play:proc
@ -29839,10 +29771,7 @@ unk_355EC db 0
db 0FCh db 0FCh
db 1 db 1
db 0FEh db 0FEh
public _mdrv2_have_board include th01/mdrv2[data].asm
_mdrv2_have_board db 0
db 0
aMdrv2system db 'Mdrv2System',0
aVqvnvtvmvcb@vp db '  ',0 aVqvnvtvmvcb@vp db '  ',0
aVbvpvovzvtvbvf db '',0 aVbvpvovzvtvbvf db '',0
aVrvevmvevgvfb@ db '  ',0 aVrvevmvevgvfb@ db '  ',0