1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
|
; Fait que le mode vidéo 5 d'une carte VGA ou EGA offre les mêmes couleurs
; que celui d'une carte CGA reliée à un moniteur RGB :
; cyan, rouge et blanc.
; Par exemple, sous BASICA et GW-BASIC standard, le TSR intercepte l'action
; de SCREEN 1,1 puis de COLOR ou de PALETTE.
; MASM MODE5;
; LINK MODE5;
; EXE2BIN MODE5
; Ce TSR ne vérifie ni s'il est déjà chargé ni si une carte VGA ou EGA
; est effectivement active.
RougeVif EQU 14h
SEG_NUL SEGMENT AT 0
Adresse_nulle LABEL FAR
SEG_NUL ENDS
CODE SEGMENT
ASSUME CS:CODE
ORG 100h
Depart:
JMP SHORT INSTALLE
RESIDANT PROC
CMP AX,5 ; Mode vidéo 5 demandé ?
JE FctBonne ; Si oui, fonction bonne
PUSH DS ; Sauve DS & AX
PUSH AX
MOV AX,40h
MOV DS,AX ; ES : segment de données du BIOS
CMP BYTE PTR DS:49h,5 ; Mode vidéo 5 actif ?
POP AX ; Restitue DS & AX
POP DS
JNE AncInt ; Si non, se branche à l'anc. vect.
CMP AX,1002h ; Fct 10h, s-fct 2 (modifie palette) ?
JE FctBonne
CMP AH,0Bh ; Fct Bh (fixe palette graph. CGA) ?
JNE AncInt
OR BH,BH ; S-fct 0 (fixe couleur de fond) ?
JNZ Retour ; Sinon, empêche de changer de palette
CMP BL,0Fh ; Couleurs vives ?
JA FctBonne ; Si oui, ignore l'instruction suiv.
MOV BYTE PTR CS:Rouge,RougeVif-10h ; Rouge normal
FctBonne:
PUSH AX ; Sauve AX & BX
PUSH BX
PUSHF ; Exécute la fonction vidéo demandée :
CALL DWORD PTR CS:AncVect ; reg. FLAG empilé & anc. vect. appelé
MOV AX,1000h ; Modifie un attribut de palette
MOV BL,2 ; Attribut 2
MOV BH,RougeVif ; Rouge vif par défaut
Rouge EQU $-1
PUSHF
CALL DWORD PTR CS:AncVect
MOV BYTE PTR CS:Rouge,RougeVif
POP BX ; Restitue AX & BX
POP AX
Retour:
IRET ; Retour d'interruption
AncInt:
JMP Adresse_nulle
AncVect EQU $-4 ; Ancien vecteur
RESIDANT ENDP
INSTALLE PROC
XOR AX,AX
MOV ES,AX ; ES = 0
MOV BX,ES:40h ; Offset en 0:(10h * 4 + 0)
MOV ES,ES:42h ; Segment en 0:(10h * 4 + 2)
; Les quatres instructions préc. peuvent être remplacées sous DOS 2+ par :
; mov ax,3510h
; int 21h
MOV WORD PTR DS:AncVect+0,BX
MOV WORD PTR DS:AncVect+2,ES
MOV DX,OFFSET RESIDANT
MOV AX,2510h ; Modifie le vecteur d'une int.
INT 21h ; DS:DX : nouveau vecteur
MOV DX,OFFSET INSTALLE ; Octets à laisser en mémoire
INT 27h ; après avoir terminé le prgm
INSTALLE ENDP
CODE ENDS
END Depart |
Partager