; *------------------------------------------------------------------------* ; * T_INT * ; *------------------------------------------------------------------------* T_INT SEGMENT ORG 100h ASSUME CS:T_INT JMP debut ;--Variables et constantes---------------------------------------------------- ;>> Clavier (gestionnaire): CLA_adre_memoire LABEL DWORD CLA_offs_memoire DW 0 CLA_segm_memoire DW 0 SYS_adre_retour LABEL DWORD SYS_offs_retour DW 0 SYS_segm_retour DW 0 SYS_sauv_regAX DW 0 SYS_sauv_regBX DW 0 SYS_sauv_regCX DW 0 SYS_sauv_regDX DW 0 SYS_sauv_regES DW 0 SYS_sauv_regDS DW 0 SYS_sauv_regCS DW 0 SYS_sauv_regSS DW 0 SYS_sauv_regSP DW 0 SYS_sauv_regBP DW 0 SYS_sauv_regDI DW 0 SYS_sauv_regSI DW 0 SYS_sauv_regIP DW 0 SYS_sauv_FLAG DW 0 CLA_touc_active DB 0 phrase_debut DB 10, 13, "Lancement du test...", 10, 13, 0 phrase_test DB 10, 13, "Test de l'interruption...", 10, 13, 0 phrase_fin DB 10, 13, "Fin du test...", 10, 13, 0 ;----------------------------------------------------------------------------- ;--Proc‚dures----------------------------------------------------------------- affiche PROC ; Affiche une chaine de type ASCIIZ. ; SI doit contenir l'adresse de la chaine. PUSH AX PUSH BX PUSH SI CLD aff_retour: LODSB OR AL, AL JZ aff_saut MOV AH, 0Eh MOV BX, 0007h INT 10h JMP aff_retour aff_saut: POP SI POP BX POP AX RET affiche ENDP ;----------------------------------------------------------------------------- debut: ;--Code de test---------------------------------------------------------------- MOV SI, OFFSET phrase_debut CALL affiche XOR AX, AX ; Initialise interruption MOV ES, AX ; ES = 0 MOV BX, 09h * 4 MOV AX, WORD PTR ES:[BX] MOV WORD PTR CLA_offs_memoire, AX ADD BX, 2 MOV AX, WORD PTR ES:[BX] MOV WORD PTR CLA_segm_memoire, AX MOV BX, 09h * 4 MOV WORD PTR ES:[BX], interruption_09h ADD BX, 2 MOV WORD PTR ES:[BX], CS retour: MOV AH, 01h INT 16h JNE retour MOV AH, 0 INT 16h CMP AL, 27 JE fin MOV AH, 0Eh INT 10h JMP retour fin: MOV SI, OFFSET phrase_fin CALL affiche INT 20h ;----------------------------------------------------------------------------- interruption_09h: ;----------------------------------------------------------------------------- MOV CS:SYS_sauv_regAX, AX IN AL, 60h CMP AL, 41 JE touche_active JMP autre_touche touche_active: MOV CS:SYS_sauv_regBX, BX MOV CS:SYS_sauv_regCX, CX MOV CS:SYS_sauv_regDX, DX MOV CS:SYS_sauv_regDS, DS MOV CS:SYS_sauv_regES, ES MOV CS:SYS_sauv_regDI, DI MOV CS:SYS_sauv_regSI, SI MOV AX, CS MOV DS, AX MOV ES, AX IN AL, 61h MOV AH, AL OR AL, 80h OUT 61h, AL MOV AL, AH OUT 61h, AL MOV AL, 20h OUT 20h, AL POP AX MOV CS:SYS_sauv_regIP, AX MOV CS:SYS_offs_retour, AX POP AX MOV CS:SYS_sauv_regCS, AX MOV CS:SYS_segm_retour, AX POP AX MOV CS:SYS_sauv_FLAG, AX ;--- MOV SI, OFFSET phrase_test CALL affiche ;--- MOV BX, CS:SYS_sauv_regBX MOV CX, CS:SYS_sauv_regCX MOV DX, CS:SYS_sauv_regDX MOV DS, CS:SYS_sauv_regDS MOV ES, CS:SYS_sauv_regES MOV DI, CS:SYS_sauv_regDI MOV SI, CS:SYS_sauv_regSI MOV AX, CS:SYS_sauv_FLAG PUSH AX MOV AX, CS:SYS_segm_retour PUSH AX MOV AX, CS:SYS_offs_retour PUSH AX MOV CS:SYS_sauv_regAX, AX IRET autre_touche: MOV CS:SYS_sauv_regAX, AX JMP CS:[CLA_adre_memoire] ;----------------------------------------------------------------------------- T_INT ENDS END