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