home *** CD-ROM | disk | FTP | other *** search
- ;*------------------------------------------------- *
- ;* 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 *
-