Source file: /~heha/hs/dos/dosmisc.zip/SRC/VB.ASM

;Programm VB.COM, superkurz im Speicher!
;(VB= Visual Bell!)

		.MODEL	tiny
REQfunc		equ	345h		;in AX
REQcode		equ	9876h		;in DX
ANScode		equ	8765h		;in AX; DX=Segmentadresse
print	macro	str
	mov	dx,offset str
	mov	ah,9
	int	21h
	endm
		.CODE
		IDEAL
PSPOrg:
		org	38h
ISRBase:
Ctrl0		db	?
oldborder	db	?
count		db	?
		org	100h
start:		mov	dx,offset Text0
		mov	ah,9
		int	21h			;Meldung
		mov	si,81h
		cld
scancl:		lodsb
		cmp	al,'?'
		je	help
		and	al,0dfh		;Upcase
		cmp	al,'U'
		je	UnInst
		cmp	al,'D'
		je	DisActiv
		cmp	al,'H'
		je	help
		cmp	al,0dh
		jne	scancl
		jmp	short Install
help:	;Hilfe Option "H" oder "?"
		mov	dx,offset TextH
		jmp	short TXTO1

UnInst:	;Deinstallation(sversuch) Option "U"
		call	InstChk		;Überhaupt installiert?
		mov	dx,offset Text5
		jnz	TXTO1		;Wenn nicht nötig!
		or	ch,ch
		jz	Raus
		PRINT	Text4
		mov	dx,offset Text4a
disab:		xor	al,al
		jmp	short setab
DisActiv:;Deaktivieren Option "D"
		call	InstChk
		mov	dx,offset Text5
		jnz	TXTOut
		mov	dx,offset Text4
		jmp	short disab
	;Deinstallation
Raus:		lds	dx,[es:offset OldInt10-ISRA+ISRBASE]
		mov	ax,2510h
		int	21h
		lds	dx,[es:offset OldInt8-ISRA+ISRBASE]
		mov	al,8
		int	21h
		mov	ah,49h
		int	21h		;den Speicher ab es freigeben
		push	cs
		pop	ds
		mov	dx,offset Text3	;removed...
TXTO1:		jmp	short TXTOut

Install:	call	InstChk		;Installationscheck
		mov	dx,offset Text2	;Schon mal laden
		jz	enab
	;ISR nach vorn schaufeln
		cld
		push	cs
		pop	es
		mov	si,offset ISRA
		mov	di,offset ISRBase
		mov	cx,ISRE-ISRA
		rep	movsb
	;Zeiger verbiegen
		mov	dx,offset NewInt10-ISRA+ISRBASE
		mov	ax,2510h
		int	21h			;Set Int10
		mov	dx,offset NewInt8-ISRA+ISRBASE
		mov	al,8
		int	21h			;Set Int8
	;Environment freigeben
		mov	es,[2ch]	;Segment Environment
		mov	ah,49h
		int	21h		;ENV-Speicher ab es freigeben
	;Test des Hochladens
		mov	ax,cs
		mov	es,ax
		cmp	ax,0a000h
		jc	NoHi		;unten
		PRINT	Text1a
NoHi:		mov	dx,offset Text1
	;VB enabeln
enab:		;DX ist schon OK!
		mov	al,80h
setab:		mov	[es:Ctrl0],al	;Bit setzen
	;dx-adressierten Text ausgeben
TXTOut:		mov	ah,9
		int	21h		;TextX
	;Programm beenden
		push	dx
		PRINT	NL
		pop	dx
		cmp	dx,offset Text1	;Installierung?
		mov	ax,4C00h
		jnz	exi
		mov	ah,31h		;Resident
		mov	dx,(ISRBase-PSPOrg+ISRE-ISRA+0fh)/16
exi:		int	21h

InstChk:;Installationscheck, ES=Zeiger auf installierte Routine oder n.a.!,
	;Z=1: Installationscheck erfolgreich
	;ch=0: Zeiger nicht von anderen verbogen
		mov	ax,REQfunc	;eigentlich Cursorform ermitteln
		mov	dx,REQcode
		int	10h
		cmp	ax,ANScode	;gleich?
		pushf			;Z-Flag retten
		push	dx		;Segment der TSR
	;Zeiger retten
		xor	ch,ch
		mov	ax,3510h
		int	21h			;Get Int10
		mov	[word ptr OldInt10],bx
		mov	[word ptr OldInt10+2],es
		cmp	bx,offset NewInt10-ISRA+ISRBASE
		je	T10OK
		mov	bx,es
		cmp	bx,dx
		je	T10OK
		inc	ch
T10OK:		mov	ax,3508h
		int	21h			;Get Int8
		mov	[word ptr OldInt8],bx
		mov	[word ptr OldInt8+2],es
		cmp	bx,offset NewInt8-ISRA+ISRBASE
		je	T8OK
		mov	bx,es
		cmp	bx,dx
		je	T8OK
		inc	ch
T8OK:		pop	es
		popf
		ret

ISRA:

;CTRL0
		db	0
;OldBorder, Counter
		db	0,0

NewInt10:	pushf
		cmp	ax,REQfunc
		jne	I10cont
		cmp	dx,REQcode
		jne	I10cont
		mov	ax,ANScode
		mov	dx,cs
		popf
		iret
I10cont:	cmp	ax,0e07h
		jne	NVBeep		;TTY CHR 7
		cmp	[cs:Ctrl0],80h
		jne	NVBeep
		inc	[cs:Ctrl0]
NVBeep:		popf
		db	0eah		;jmp far
OldInt10	dd	0

NewInt8:	;Nach einiger Zeit Globalreset ausführen
		pushf
		push	ax
		push	bx
		push	ds
		 push	cs
		 pop	ds
		mov	al,[Ctrl0]
		sub	al,81h
		je	InitRoll
		dec	al		;82h?
		je	ContRoll
		dec	al		;83h?
		je	DoneRoll
ExitRoll:	pop	ds
		pop	bx
		pop	ax
		popf
		db	0eah		;jmp far
OldInt8		dd	0

InitRoll:
		inc	[Ctrl0]		;"laufend" anzeigen
		mov	[Count],10h
		mov	ax,1008h
		int	10h		;GetBorder
		mov	[OldBorder],bh
ContRoll:
		dec	[Count]
		pushf			;Z-Flag retten
		mov	bh,[Count]
		mov	ax,1001h
		int	10h		;SetBorder
		popf
		jnz	ExitRoll
		inc	[Ctrl0]
		jmp	short ExitRoll
DoneRoll:
		mov	bh,[OldBorder]
		mov	ax,1001h
		int	10h		;SetBorder
		mov	[Ctrl0],80h
		jmp	short ExitRoll
ISRE:
;Ende residenter Teil!


Text0	db	'VisualBell 1.0 (haftmann#software): $'
Text1a	db	'hoch$'
Text1	db	'geladen, Speicherbedarf 208 Bytes.$'
Text2	db	'reaktiviert.$'
Text3	db	'vom Speicher entfernt.$'
Text4	db	'deaktiviert.$'
Text4a	db	' (Andere TSR stahl Int8 oder Int10)$'
Text5	db	'Noch nicht installiert!$'
TextH	db	'			++ FREEWARE ++',13,10,10
	db	'TSR zur Ausgabe des Piepses auch optisch als Flackern der Randfarbe.',13,10
	db	'Nur auf EGA/VGA! Bitte NACH Speaker-Pieps-Umleitungsprogrammen laden!',13,10,10
	db	'Parameter:	- (keiner)	TSR laden oder aktivieren',13,10
	db	'		- h oder ?	diese Hilfe',13,10
	db	'		- d		VB deaktivieren',13,10
	db	'		- u		TSR entfernen$'
NL	db	13,10,'$'
		end	start
Detected encoding: OEM (CP437)1
Wrong umlauts? - Assume file is ANSI (CP1252) encoded