home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9203 / asmtrick / int10.asm next >
Assembly Source File  |  1991-12-05  |  5KB  |  127 lines

  1. ;*------------------------------------------------- *
  2. ;*                    INT10.ASM                     *
  3. ;*       (C) 1991 Wolfgang Kraus & DMV-Verlag       *
  4. ;* speicherresidentes Utility zur farbigen Ausgabe  *
  5. ;* von Zeichen bei Programmen, die die Ausgabe über *
  6. ;* das BIOS (INT 10h) vornehmen.                    *
  7. ;* Sprache:    TASM ab 1.0                          *
  8. ;* Erstellung: TASM int10                           * 
  9. ;*             TLINK /t int10                       *
  10. ;* Farben:     0h...Schwarz    4h...Rot             *
  11. ;*             8h...Grau       Ch...Hellrot         *
  12. ;*             1h...Blau       5h...Magenta         *
  13. ;*             9h...Hellblau   Dh...H-Mag.          *
  14. ;*             2h...Gruen      6h...Braun           *
  15. ;*             Ah...Hellgruen  Eh...Gelb            *
  16. ;*             3h...Cyan       7h...Weiss           *
  17. ;*             Bh...Hell-Cyan  Fh...H-Weiß          *
  18. ;* ------------------------------------------------ *
  19.  
  20. OrgCol EQU  07H  ; hellgrau auf schwarz
  21. NewCol EQU  0EH  ; gelb auf schwarz
  22. OrgCur EQU  70H  ; weiß auf schwarz
  23. NewCur EQU  1EH  ; gelb auf blau
  24.  
  25. .MODEL TINY
  26.  
  27. .CODE
  28. ORG     100H
  29.  
  30. Start:
  31. Main    PROC NEAR
  32.    MOV     AH, 35h
  33.    MOV     AL, 10h
  34.    INT     21H              ; Original-INT 10h 
  35.    MOV     Int10_off, BX    ; Offset und
  36.    MOV     Int10_seg, ES    ; Segment-Adresse retten
  37.  
  38.    XOR     AX,AX   
  39.    MOV     ES,AX
  40.  
  41.    MOV     BX,180h          ; Adresse INT-Handler 60h
  42. Test_ob_2tes:               ; Anwender-INT 60h-67h 
  43.    MOV     AH,'w'
  44.    MOV     AL,'k'           ; Test ob schon geladen
  45.    CMP     ES:[BX],AX       ; durch Vergleich mit der 
  46.                             ; Zeichenkette "wk"
  47.    JE      Leider           ; ist schon geladen!
  48.    ADD     BX, 4            ; nächster Handler
  49.    CMP     BX, 19Ch         ; bis INT 67h
  50.    JA      Test_ob_0               
  51.    JMP     Test_ob_2tes
  52. Test_ob_0:                  ; wenn noch nicht geladen, 
  53.                             ; testen ob Laden möglich
  54.    XOR     AX, AX           ; ist (INT frei)
  55.    MOV     BX, 180h         ; Adresse INT-Handler 60h
  56. Anf:
  57.    CMP     ES:[BX], AX      ; Vergleich Highword mit 0
  58.    JNE     Next
  59.    CMP     ES:[BX+2], AX    ; Vergleich Low-Word mit 0
  60.    JE      Ok               ; wenn vier Bytes gleich 0 
  61.                             ; dann OK
  62. Next:
  63.    ADD     BX, 4            ; nächster Handler
  64.    CMP     BX, 19Ch         ; bis INT 67h
  65.    JA      Leider           ; wenn alle INT besetzt
  66.    JMP     Anf              ; --> Laden unmöglich
  67.  
  68. Leider:
  69.    MOV     DX, OFFSET Nein          
  70.    MOV     AH, 09h
  71.    INT     21H              ; Fehlermeldung ausgeben
  72.    MOV     AX, 4C01h
  73.    INT     21H              ; Programm beenden
  74.  
  75. Ok:
  76.    MOV     AH,'w'
  77.    MOV     AL,'k'           ; Zeichenkette "wk" auf
  78.    MOV     ES:[BX], AX      ; ersten freien Handler 
  79.    CLI                      ; zw. 60h..67h schreiben
  80.    MOV     ES:[64], OFFSET Color ; Adresse der neuen 
  81.    MOV     ES:[66], CS      ; ISR an die Stelle von
  82.    STI                      ; Int 10h setzen
  83.    MOV     DX, OFFSET Install
  84.    MOV     AH, 09h
  85.    INT     21h              ; Erfolgsmeldung
  86.    MOV     AX, 3100h
  87.    MOV     DX, 27           ; Programm beenden, aber 
  88.    INT     21h              ; 27 Paragraphen (176 Byte
  89. Main    ENDP                 ; + PSP) resident halten        
  90.  
  91.  
  92. Color   PROC FAR             ; neue ISR
  93.   CLI                        ; Interrupt-Flag löschen
  94.   CMP     AH, 09             ; Zeichen ausgeben?
  95.   JNE     Ende               ; nein!
  96.   CMP     BL, OrgCol         ; ursprüngl. Farbe?
  97.   JNE     Inv                ; wenn nein, invertiert?
  98.   MOV     BL, NewCol         ; wenn ja, dann neue Farbe
  99.   JMP     Ende               ; Zeichen schreiben
  100. Inv:                            
  101.   CMP     BL, OrgCur         ; Cursorfarbe ermitteln
  102.   JNE     Ende               ; alles normal!
  103.   MOV     BL, NewCur         ; OK: neue Farbe
  104. Ende:
  105.   STI                        ; Interrupt-Flag setzen
  106.   PUSHF                      ; Flag-Register auf Stack 
  107.                              ; wegen call-iret
  108.   CALL    CS:Int10_Vec       ; Original-INT 10h: 
  109.                              ; Zeichen schreiben
  110.   IRET                       ; zurück
  111. Color   ENDP
  112.  
  113. Int10_Vec       LABEL   DWORD
  114. Int10_off       DW      ?
  115. Int10_seg       DW      ?
  116.  
  117. Nein            DB      "Fehler! Int10 wird "
  118.                 DB      "nicht installiert."
  119.                 DB      13, 10, "$"
  120. Install         DB      "Int10 ist installiert." 
  121.                 DB      13, 10, "$"
  122.  
  123. END     Start
  124.  
  125. ;*------------------------------------------------- *
  126. ;*             Ende von INT10.ASM                   *
  127.