mirror of
https://github.com/nmlgc/ReC98.git
synced 2025-02-26 20:55:09 +00:00

Whoops, turns out that the build has been broken on TASM32 version 5.3 (the one in the DevKit) ever since 7897bf1. In contrast to version 5.0 (which I use for my development), 5.3 actually defines 32-bit segments if you specify a .386 CPU before using .MODEL. That might have been the reason for the .286 workaround all along? Turns out there's the USE16 modifier, which makes this much more explicit than switching CPUs.
364 lines
8.2 KiB
NASM
364 lines
8.2 KiB
NASM
;
|
||
; +-------------------------------------------------------------------------+
|
||
; | This file has been generated by The Interactive Disassembler (IDA) |
|
||
; | Copyright (c) 2009 by Hex-Rays, <support@hex-rays.com> |
|
||
; +-------------------------------------------------------------------------+
|
||
;
|
||
; Input MD5 : E22366913B7288F2EC82E280B386C86D
|
||
|
||
; File Name : th04/ZUN.COM:ZUNINIT (-I)
|
||
; Format : MS-DOS COM-file
|
||
; Base Address: 0h Range: 100h-4F1h Loaded length: 3F1h
|
||
; OS type : MS DOS
|
||
; Application type: Executable 16bit
|
||
|
||
.386
|
||
.model use16 tiny
|
||
.code
|
||
org 100h
|
||
|
||
; =============== S U B R O U T I N E =======================================
|
||
|
||
; Attributes: noreturn thunk
|
||
|
||
public start
|
||
start proc near
|
||
jmp start_0
|
||
start endp
|
||
even
|
||
|
||
|
||
; =============== S U B R O U T I N E =======================================
|
||
|
||
|
||
sub_104 proc far
|
||
cmp cs:byte_2EB, 0
|
||
jnz short locret_115
|
||
mov cs:byte_2EB, 1
|
||
call sub_128
|
||
|
||
locret_115:
|
||
iret
|
||
sub_104 endp
|
||
|
||
|
||
; =============== S U B R O U T I N E =======================================
|
||
|
||
|
||
sub_116 proc far
|
||
cmp cs:byte_2EB, 0
|
||
jnz short locret_127
|
||
mov cs:byte_2EB, 2
|
||
call sub_128
|
||
|
||
locret_127:
|
||
iret
|
||
sub_116 endp
|
||
|
||
|
||
; =============== S U B R O U T I N E =======================================
|
||
|
||
|
||
sub_128 proc near
|
||
pushf
|
||
pusha
|
||
push ds
|
||
push es
|
||
mov ah, 41h
|
||
int 18h
|
||
mov di, offset aVVtvVVrvsvnvog ; "むやみにSTOPキー押したりしない$"
|
||
cmp cs:byte_2EB, 1
|
||
jz short loc_13E
|
||
mov di, offset aVV ; "なんでCOPYキー押したりしてるの$"
|
||
|
||
loc_13E:
|
||
mov ax, 650h
|
||
call sub_1AE
|
||
add di, offset asc_219 - offset aVVtvVVrvsvnvog ; "方がいいと思うの。(ゲーム中はね)$"
|
||
mov ax, 6F0h
|
||
call sub_1AE
|
||
add di, offset aBivrvsvnvoglbV - offset asc_219 ; "(STOPキーで戻れるよ、ねっ) $"
|
||
mov ax, 790h
|
||
call sub_1AE
|
||
mov bl, cs:byte_2EB
|
||
|
||
loc_15B:
|
||
call sub_192
|
||
jnz short loc_15B
|
||
|
||
loc_160:
|
||
call sub_192
|
||
jz short loc_160
|
||
|
||
loc_165:
|
||
call sub_192
|
||
jnz short loc_165
|
||
mov ah, 40h
|
||
int 18h
|
||
mov di, offset aB@b@b@b@b@b@b@ ; " $"
|
||
mov ax, 650h
|
||
call sub_1AE
|
||
mov ax, 6F0h
|
||
call sub_1AE
|
||
mov ax, 790h
|
||
call sub_1AE
|
||
mov ah, 6
|
||
int 18h
|
||
pop es
|
||
pop ds
|
||
popa
|
||
popf
|
||
mov cs:byte_2EB, 0
|
||
retn
|
||
sub_128 endp
|
||
|
||
|
||
; =============== S U B R O U T I N E =======================================
|
||
|
||
|
||
sub_192 proc near
|
||
mov ah, 4
|
||
mov al, 0Ch
|
||
int 18h
|
||
test ah, bl
|
||
retn
|
||
sub_192 endp
|
||
even
|
||
|
||
; =============== S U B R O U T I N E =======================================
|
||
|
||
|
||
sub_19C proc near
|
||
shl ah, 1
|
||
cmp al, 9Fh
|
||
jnb short loc_1A7
|
||
cmp al, 80h
|
||
adc ax, 0FEDFh
|
||
|
||
loc_1A7:
|
||
sbb ax, 0DFFEh
|
||
and ax, 7F7Fh
|
||
retn
|
||
sub_19C endp
|
||
|
||
|
||
; =============== S U B R O U T I N E =======================================
|
||
|
||
|
||
sub_1AE proc near
|
||
push di
|
||
mov bx, di
|
||
mov dx, 0A000h
|
||
mov es, dx
|
||
assume es:nothing
|
||
mov di, ax
|
||
mov dx, ax
|
||
xor ax, ax
|
||
xor cx, cx
|
||
|
||
loc_1BE:
|
||
mov ax, cs:[bx]
|
||
cmp al, 24h
|
||
jz short loc_1DB
|
||
xchg ah, al
|
||
call sub_19C
|
||
xchg ah, al
|
||
sub al, 20h
|
||
stosw
|
||
or ah, 80h
|
||
stosw
|
||
add bx, 2
|
||
add cl, 2
|
||
jmp short loc_1BE
|
||
; ---------------------------------------------------------------------------
|
||
|
||
loc_1DB:
|
||
mov ax, 0A200h
|
||
mov es, ax
|
||
assume es:nothing
|
||
mov di, dx
|
||
mov ax, 41h
|
||
|
||
loc_1E5:
|
||
stosw
|
||
loop loc_1E5
|
||
pop di
|
||
retn
|
||
sub_1AE endp
|
||
|
||
; ---------------------------------------------------------------------------
|
||
ZUNP dw 'ZU', 'NP'
|
||
dword_1EE dd 0
|
||
dword_1F2 dd 0
|
||
aVVtvVVrvsvnvog db 'むやみにSTOPキー押したりしない$'
|
||
asc_219 db '方がいいと思うの。(ゲーム中はね)$'
|
||
aBivrvsvnvoglbV db '(STOPキーで戻れるよ、ねっ) $'
|
||
aVV db 'なんでCOPYキー押したりしてるの$'
|
||
aVivBBbvVVmbBbb db 'かな~。ふしぎ~。 (もう一度、$'
|
||
aVbvnvovxglbIqv db 'COPYキー押せば戻れるよ、ねっ)$'
|
||
aB@b@b@b@b@b@b@ db ' $'
|
||
byte_2EB db 0
|
||
|
||
; =============== S U B R O U T I N E =======================================
|
||
|
||
|
||
sub_2EC proc near
|
||
mov dx, offset aIntvectorSetPr ; "\r\nINTvector set program zuninit.com "...
|
||
mov ah, 9
|
||
int 21h ; DOS - PRINT STRING
|
||
; DS:DX -> string terminated by "$"
|
||
mov ax, 3506h
|
||
int 21h ; DOS - 2+ - GET INTERRUPT VECTOR
|
||
; AL = interrupt number
|
||
; Return: ES:BX = value of interrupt vector
|
||
xor ax, ax
|
||
cmp es:ZUNP+0, 'ZU'
|
||
jnz short locret_30D
|
||
cmp es:ZUNP+2, 'NP'
|
||
jnz short locret_30D
|
||
inc ax
|
||
|
||
locret_30D:
|
||
retn
|
||
sub_2EC endp
|
||
|
||
|
||
; =============== S U B R O U T I N E =======================================
|
||
|
||
start_0 proc near
|
||
mov si, 81h
|
||
|
||
loc_311:
|
||
lodsb
|
||
cmp al, 0Dh
|
||
jz short loc_322
|
||
cmp al, '/'
|
||
jz short loc_32C
|
||
cmp al, '-'
|
||
jz short loc_32C
|
||
cmp al, ' '
|
||
jbe short loc_311
|
||
|
||
loc_322:
|
||
call sub_2EC
|
||
test ax, ax
|
||
jz short loc_344
|
||
jmp loc_3B0
|
||
; ---------------------------------------------------------------------------
|
||
|
||
loc_32C:
|
||
lodsb
|
||
cmp al, ' '
|
||
jbe loc_3BA
|
||
and al, 0DFh
|
||
cmp al, 'R'
|
||
jnz loc_3BA
|
||
call sub_2EC
|
||
test ax, ax
|
||
jnz short loc_381
|
||
jmp short loc_3B5
|
||
; ---------------------------------------------------------------------------
|
||
|
||
loc_344:
|
||
mov ax, 3506h
|
||
int 21h ; DOS - 2+ - GET INTERRUPT VECTOR
|
||
; AL = interrupt number
|
||
; Return: ES:BX = value of interrupt vector
|
||
mov word ptr dword_1F2, bx
|
||
mov word ptr dword_1F2+2, es
|
||
mov dx, offset sub_104
|
||
mov ax, 2506h
|
||
int 21h ; DOS - SET INTERRUPT VECTOR
|
||
; AL = interrupt number
|
||
; DS:DX = new vector to be used for specified interrupt
|
||
mov ax, 3505h
|
||
int 21h ; DOS - 2+ - GET INTERRUPT VECTOR
|
||
; AL = interrupt number
|
||
; Return: ES:BX = value of interrupt vector
|
||
mov word ptr dword_1EE, bx
|
||
mov word ptr dword_1EE+2, es
|
||
mov dx, offset sub_116
|
||
mov ax, 2505h
|
||
int 21h ; DOS - SET INTERRUPT VECTOR
|
||
; AL = interrupt number
|
||
; DS:DX = new vector to be used for specified interrupt
|
||
mov dx, offset aVVxvVVVixfiovi ; "ちょこっとお部屋かりるね☆\r\n\r\n$"
|
||
mov ah, 9
|
||
int 21h ; DOS - PRINT STRING
|
||
; DS:DX -> string terminated by "$"
|
||
mov dx, offset sub_2EC
|
||
shr dx, 4
|
||
inc dx
|
||
mov ax, 3100h
|
||
int 21h ; DOS - DOS 2+ - TERMINATE BUT STAY RESIDENT
|
||
; AL = exit code, DX = program size, in paragraphs
|
||
; ---------------------------------------------------------------------------
|
||
|
||
loc_381:
|
||
push ds
|
||
lds dx, es:dword_1F2
|
||
mov ax, 2506h
|
||
int 21h ; DOS - SET INTERRUPT VECTOR
|
||
; AL = interrupt number
|
||
; DS:DX = new vector to be used for specified interrupt
|
||
lds dx, es:dword_1EE
|
||
mov ax, 2505h
|
||
int 21h ; DOS - SET INTERRUPT VECTOR
|
||
; AL = interrupt number
|
||
; DS:DX = new vector to be used for specified interrupt
|
||
pop ds
|
||
push es
|
||
mov es, word ptr es:2Ch
|
||
assume es:nothing
|
||
mov ah, 49h
|
||
int 21h ; DOS - 2+ - FREE MEMORY
|
||
; ES = segment address of area to be freed
|
||
pop es
|
||
mov ah, 49h
|
||
int 21h ; DOS - 2+ - FREE MEMORY
|
||
; ES = segment address of area to be freed
|
||
mov dx, offset aOVsvVVixfiov ; "借りてたお部屋をお返ししますね。それで?"...
|
||
jnb short loc_3BD
|
||
mov dx, offset aGbgvgki ; "メモリ解放エラーです\r\n$"
|
||
jmp short loc_3BD
|
||
; ---------------------------------------------------------------------------
|
||
|
||
loc_3B0:
|
||
mov dx, offset aVVVPatuvVVVB ; "すでに常駐してます~\r\n\r\n$"
|
||
jmp short loc_3BD
|
||
; ---------------------------------------------------------------------------
|
||
|
||
loc_3B5:
|
||
mov dx, offset aVVBapatuvVVVvv ; "まだ、常駐してないです\r\n\r\n$"
|
||
jmp short loc_3BD
|
||
; ---------------------------------------------------------------------------
|
||
|
||
loc_3BA:
|
||
mov dx, offset aICbxscVGigvgvg ; "意味不明なオプションよぉ(オプションは "...
|
||
|
||
loc_3BD:
|
||
mov ah, 9
|
||
int 21h ; DOS - PRINT STRING
|
||
; DS:DX -> string terminated by "$"
|
||
mov ax, 4C00h
|
||
int 21h ; DOS - 2+ - QUIT WITH EXIT CODE (EXIT)
|
||
start_0 endp ; AL = exit code
|
||
|
||
; ---------------------------------------------------------------------------
|
||
aIntvectorSetPr db 0Dh,0Ah
|
||
db 'INTvector set program zuninit.com Version1.02 (c)zun 1998',0Dh,0Ah,'$'
|
||
aVVxvVVVixfiovi db 'ちょこっとお部屋かりるね☆',0Dh,0Ah
|
||
db 0Dh,0Ah,'$'
|
||
aVVVPatuvVVVB db 'すでに常駐してます~',0Dh,0Ah
|
||
db 0Dh,0Ah,'$'
|
||
aOVsvVVixfiov db '借りてたお部屋をお返ししますね。それではまた☆',0Dh,0Ah
|
||
|
||
db 0Dh,0Ah,'$'
|
||
aVVBapatuvVVVvv db 'まだ、常駐してないです',0Dh,0Ah
|
||
db 0Dh,0Ah,'$'
|
||
aICbxscVGigvgvg db '意味不明なオプションよぉ(オプションは -R : 解放 のみ)',0Dh,0Ah,'$'
|
||
|
||
aGbgvgki db 'メモリ解放エラーです',0Dh,0Ah,'$'
|
||
|
||
end start
|