home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
dtx9203
/
asmtrick
/
int10.asm
next >
Wrap
Assembly Source File
|
1991-12-05
|
5KB
|
127 lines
;*------------------------------------------------- *
;* INT10.ASM *
;* (C) 1991 Wolfgang Kraus & DMV-Verlag *
;* speicherresidentes Utility zur farbigen Ausgabe *
;* von Zeichen bei Programmen, die die Ausgabe über *
;* das BIOS (INT 10h) vornehmen. *
;* Sprache: TASM ab 1.0 *
;* Erstellung: TASM int10 *
;* TLINK /t int10 *
;* Farben: 0h...Schwarz 4h...Rot *
;* 8h...Grau Ch...Hellrot *
;* 1h...Blau 5h...Magenta *
;* 9h...Hellblau Dh...H-Mag. *
;* 2h...Gruen 6h...Braun *
;* Ah...Hellgruen Eh...Gelb *
;* 3h...Cyan 7h...Weiss *
;* Bh...Hell-Cyan Fh...H-Weiß *
;* ------------------------------------------------ *
OrgCol EQU 07H ; hellgrau auf schwarz
NewCol EQU 0EH ; gelb auf schwarz
OrgCur EQU 70H ; weiß auf schwarz
NewCur EQU 1EH ; gelb auf blau
.MODEL TINY
.CODE
ORG 100H
Start:
Main PROC NEAR
MOV AH, 35h
MOV AL, 10h
INT 21H ; Original-INT 10h
MOV Int10_off, BX ; Offset und
MOV Int10_seg, ES ; Segment-Adresse retten
XOR AX,AX
MOV ES,AX
MOV BX,180h ; Adresse INT-Handler 60h
Test_ob_2tes: ; Anwender-INT 60h-67h
MOV AH,'w'
MOV AL,'k' ; Test ob schon geladen
CMP ES:[BX],AX ; durch Vergleich mit der
; Zeichenkette "wk"
JE Leider ; ist schon geladen!
ADD BX, 4 ; nächster Handler
CMP BX, 19Ch ; bis INT 67h
JA Test_ob_0
JMP Test_ob_2tes
Test_ob_0: ; wenn noch nicht geladen,
; testen ob Laden möglich
XOR AX, AX ; ist (INT frei)
MOV BX, 180h ; Adresse INT-Handler 60h
Anf:
CMP ES:[BX], AX ; Vergleich Highword mit 0
JNE Next
CMP ES:[BX+2], AX ; Vergleich Low-Word mit 0
JE Ok ; wenn vier Bytes gleich 0
; dann OK
Next:
ADD BX, 4 ; nächster Handler
CMP BX, 19Ch ; bis INT 67h
JA Leider ; wenn alle INT besetzt
JMP Anf ; --> Laden unmöglich
Leider:
MOV DX, OFFSET Nein
MOV AH, 09h
INT 21H ; Fehlermeldung ausgeben
MOV AX, 4C01h
INT 21H ; Programm beenden
Ok:
MOV AH,'w'
MOV AL,'k' ; Zeichenkette "wk" auf
MOV ES:[BX], AX ; ersten freien Handler
CLI ; zw. 60h..67h schreiben
MOV ES:[64], OFFSET Color ; Adresse der neuen
MOV ES:[66], CS ; ISR an die Stelle von
STI ; Int 10h setzen
MOV DX, OFFSET Install
MOV AH, 09h
INT 21h ; Erfolgsmeldung
MOV AX, 3100h
MOV DX, 27 ; Programm beenden, aber
INT 21h ; 27 Paragraphen (176 Byte
Main ENDP ; + PSP) resident halten
Color PROC FAR ; neue ISR
CLI ; Interrupt-Flag löschen
CMP AH, 09 ; Zeichen ausgeben?
JNE Ende ; nein!
CMP BL, OrgCol ; ursprüngl. Farbe?
JNE Inv ; wenn nein, invertiert?
MOV BL, NewCol ; wenn ja, dann neue Farbe
JMP Ende ; Zeichen schreiben
Inv:
CMP BL, OrgCur ; Cursorfarbe ermitteln
JNE Ende ; alles normal!
MOV BL, NewCur ; OK: neue Farbe
Ende:
STI ; Interrupt-Flag setzen
PUSHF ; Flag-Register auf Stack
; wegen call-iret
CALL CS:Int10_Vec ; Original-INT 10h:
; Zeichen schreiben
IRET ; zurück
Color ENDP
Int10_Vec LABEL DWORD
Int10_off DW ?
Int10_seg DW ?
Nein DB "Fehler! Int10 wird "
DB "nicht installiert."
DB 13, 10, "$"
Install DB "Int10 ist installiert."
DB 13, 10, "$"
END Start
;*------------------------------------------------- *
;* Ende von INT10.ASM *