;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
|
|