page 55,100 name H_RES ; EXERCICE COMPLEMENTAIRE ; Utlisation de l'entree 1ch de la table ; des vecteurs d'interruption pour installer ; un programme resident (TSR). ; Ce programme affiche l'heure systeme a l'ecran ; sous la forme d'une fenetre placee en haut et ; a droite. ; Ce TSR est ecrit de tel maniere qu'il ne ; comporte qu'un seul segment ou sont inclus ; la pile, les data, et le code. ; La procedure d'assemblage suivante permet de ; realiser le fichier executable H_RES.COM. Un ; TSR doit en effet avoir une taille minimum pour ; ne pas "encombrer" la memoire. ; ASSEMBLAGE : TASM H_RES.ASM ; LINKAGE : TLINK /T H_RES ; rq. ; Cette horloge pourrait aussi bien etre installer ; avec l'entree 8 car elle ne modifie pas le ; comportement du systeme d'exploitation. ; le traitement de texte ne suportant pas les ; caracteres ascii etendus ceux qui constituent ; le cadre de l'horloge ne sont pas visibles. TIM0 equ 40h CNT59 equ 20h RAM_VIDEO equ 0b800h ATT_CADRE equ 1fh ATT_LETTRE equ 70h ATT_CHIFFRE equ 0fh ATT_OMBRE equ 70h TAILLE_PILE equ 30 ; nombre paire TAILLE_TSR equ 70 ; en paragraphes ( multiple de 16 ) ; cette taille doit etre suffisante ; pour inclure le programme et son ; environnement. ;-------------------------------------------------------------- .MODEL TINY .CODE ORG 100h ; le code commence a l'adresse 100h ; apres le PSP start: jmp short debut ; definition de la pile et des datas dans ; le segment de code (segment unique) pile dw TAILLE_PILE dup (?) clock dw ? heure dw ? att db ? L0 db ? ; dizaine d'heures L1 db ? ; heures (unite) L2 db ? ; dizaine de minutes L3 db ? ; minutes (unite) C0 db ? C1 db ? C2 db ? C3 db ? C4 db ? C5 db ? it_save dd ? ;-------------------------------------------------------------- debut: cli ; initialisation de la pile dans le segment de code mov ax,cs mov ss,ax mov ax,offset cs:pile+TAILLE_PILE-2 mov sp,ax ; sauvegarde de la routine d'interrution MS-DOS mov al,1ch mov ah,35h int 21h mov word ptr cs:it_save,bx mov word ptr cs:it_save+2,es ; installation de la routine d'interruption mov al,1ch mov bx,cs mov ds,bx mov dx,offset cs:ittim mov ah,25h int 21h sti ; programme principal : installation du TSR mov dx,TAILLE_TSR mov ax,3100h int 21h ;-------------------------------------------------------------- ittim: nop push ax bx dx es ; heure = peek(0x0040,0x006e) ; clock = peek(0x0040,0x006c), ; nombre de secondes ecoulees depuis le debut de l'heure mov ax,64 mov es,ax mov bx,word ptr es:[110] mov word ptr cs:heure,bx mov ax,word ptr es:[108] mov word ptr cs:clock,ax ; L[0]=heure/10+48 L[1]=heure%10+48 mov ax,word ptr cs:heure mov bx,10 xor dx,dx div bx add al,48 mov byte ptr cs:L0,al mov ax,word ptr cs:heure mov bx,10 xor dx,dx div bx add dl,48 mov byte ptr cs:L1,dl ; L[2]=((clock/182*10)/60)/10+48 ; L[3]=((clock/182*10)/60)%10+48 mov ax,word ptr cs:clock mov bx,182 xor dx,dx div bx mov dx,10 imul dx mov bx,60 xor dx,dx div bx mov bx,10 xor dx,dx div bx add al,48 mov byte ptr cs:L2,al add dl,48 mov byte ptr cs:L3,dl mov ax,RAM_VIDEO mov es,ax ; sauvegarde attribut(69,5) mov al,byte ptr es:[777] mov byte ptr cs:att,al ; test caractere(69,1) É caractere(69,2) º caractere(69,3) È ; test caractere(79,1) » caractere(79,2) º caractere(79,3) ¼ mov al,byte ptr es:[136] mov byte ptr cs:C0,al mov al,byte ptr es:[296] mov byte ptr cs:C1,al mov al,byte ptr es:[456] mov byte ptr cs:C2,al mov al,byte ptr es:[156] mov byte ptr cs:C3,al mov al,byte ptr es:[316] mov byte ptr cs:C4,al mov al,byte ptr es:[476] mov byte ptr cs:C5,al cmp byte ptr cs:C0,'É' jne short reaffichage cmp byte ptr cs:C1,'º' jne short reaffichage cmp byte ptr cs:C2,'È' jne short reaffichage cmp byte ptr cs:C3,'»' jne short reaffichage cmp byte ptr cs:C4,'º' jne short reaffichage cmp byte ptr cs:C5,'¼' jne short reaffichage jmp affichage_heure reaffichage: ; le reaffichage de la fenetre n'a lieu que si ; cette derniere a ete modifiee ; affichage de la fenetre X = 69 Y = 1 mov byte ptr es:[136],'É' mov byte ptr es:[137],ATT_CADRE mov byte ptr es:[138],'Í' mov byte ptr es:[139],ATT_CADRE mov byte ptr es:[140],'Í' mov byte ptr es:[141],ATT_CADRE mov byte ptr es:[142],'H' mov byte ptr es:[143],ATT_LETTRE mov byte ptr es:[144],'E' mov byte ptr es:[145],ATT_LETTRE mov byte ptr es:[146],'U' mov byte ptr es:[147],ATT_LETTRE mov byte ptr es:[148],'R' mov byte ptr es:[149],ATT_LETTRE mov byte ptr es:[150],'E' mov byte ptr es:[151],ATT_LETTRE mov byte ptr es:[152],'Í' mov byte ptr es:[153],ATT_CADRE mov byte ptr es:[154],'Í' mov byte ptr es:[155],ATT_CADRE mov byte ptr es:[156],'»' mov byte ptr es:[157],ATT_CADRE mov byte ptr es:[296],'º' mov byte ptr es:[297],ATT_CADRE mov byte ptr es:[298],' ' mov byte ptr es:[299],ATT_CADRE mov byte ptr es:[300],' ' mov byte ptr es:[301],ATT_CADRE mov byte ptr es:[312],' ' mov byte ptr es:[313],ATT_CADRE mov byte ptr es:[314],' ' mov byte ptr es:[315],ATT_CADRE mov byte ptr es:[316],'º' mov byte ptr es:[317],ATT_CADRE mov byte ptr es:[456],'È' mov byte ptr es:[457],ATT_CADRE mov byte ptr es:[458],'Í' mov byte ptr es:[459],ATT_CADRE mov byte ptr es:[460],'Í' mov byte ptr es:[461],ATT_CADRE mov byte ptr es:[462],'Í' mov byte ptr es:[463],ATT_CADRE mov byte ptr es:[464],'Í' mov byte ptr es:[465],ATT_CADRE mov byte ptr es:[466],'Í' mov byte ptr es:[467],ATT_CADRE mov byte ptr es:[468],'Í' mov byte ptr es:[469],ATT_CADRE mov byte ptr es:[470],'Í' mov byte ptr es:[471],ATT_CADRE mov byte ptr es:[472],'Í' mov byte ptr es:[473],ATT_CADRE mov byte ptr es:[474],'Í' mov byte ptr es:[475],ATT_CADRE mov byte ptr es:[476],'¼' mov byte ptr es:[477],ATT_CADRE ; creation de l'ombre de la fenetre mov byte ptr es:[319],ATT_OMBRE mov byte ptr es:[479],ATT_OMBRE mov bx,22 mov al,cs:att affi_ombre: mov byte ptr es:[617+bx],ATT_OMBRE mov byte ptr es:[777+bx],al dec bx dec bx jnz short affi_ombre ; affichage des : avec clignottement mov byte ptr es:[306],':' mov byte ptr es:[307],ATT_CHIFFRE+80h affichage_heure: ; affichage des caracteres qui ; constituent les heures et les minutes mov dl,byte ptr cs:L0 mov byte ptr es:[302],dl mov byte ptr es:[303],ATT_CHIFFRE mov dl,byte ptr cs:L1 mov byte ptr es:[304],dl mov byte ptr es:[305],ATT_CHIFFRE mov dl,byte ptr cs:L2 mov byte ptr es:[308],dl mov byte ptr es:[309],ATT_CHIFFRE mov dl,byte ptr cs:L3 mov byte ptr es:[310],dl mov byte ptr es:[311],ATT_CHIFFRE ; appel de l'ancienne routine d'interruption: ; pour preserver la "coherence" du systeme ; d'exploitation pushf call dword ptr cs:it_save ; envoi d'un EOI non specifique au 8259A mov al,20h out CNT59,al pop es dx bx ax iret ;-------------------------------------------------------------- END start