Engineering School, 2nd year
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

234 lines
5.2 KiB

page 60,135
title Chronometre 25eme ligne
; *************************************************
; * *
; * Assembleur 8086 sur PC Exercice 8 *
; * *
; *************************************************
name e8
extrn ci:far ,co:far
extrn inicrt:far
extrn clrcrt:far
CNT53 equ 43h
TIM0 equ 40h
CNT59 equ 20h
COUNT equ 100
pile segment stack 'stack'
dw 50 dup (?)
pile ends
data segment
h10 db '9' ;Dizaine d'heure en ASCII
h db '9:' ;Unité d'heure suivi de ':' en ASCII
m10 db '5' ;Dizaine de minutes en ASCII
m db '9:' ;Unité de minute suivi de ':' en ASCII
s10 db '5' ;Dizaine de seconde en ASCII
s db '9' ;Unité de seconde en ASCII
it8 dd ? ;Sauvegarde du vecteur d'interruption INT8 de MS-DOS
it23 dd ? ;Sauvegarde du vecteur d'interruption INT23H de MS-DOS
nit db 1 ;Compteur d'interruption de type 8.
memvid dw ? ;Segment de memoire video
data ends
;-------------------------------------------------------------------------------
code segment
assume cs:code,ds:data
start: cli ;Masquer l'entree INTR du 8086
mov ax,data
mov ds,ax ;DS permet d'acceder aux variables du segment data
call clrcrt ;Effacer l'ecran
call inicrt
mov memvid,dx ;Memoire video
;Sauvegarde des vecteurs d'interruption de MS-DOS
;------------------------------------------------
mov al,8
mov ah,35h
int 21h ;Le vecteur d'interruption numero 8 est placé dans ES:BX
mov word ptr it8,bx
mov word ptr it8+2,es
mov al,23h
mov ah,35h
int 21h ;Le vecteur d'interruption numero 23h est placé dans ES:BX
mov word ptr it23,bx
mov word ptr it23+2,es
;Mise en place de nos propres vecteurs d'interruption
;----------------------------------------------------
push ds
mov al,8
mov bx,seg ittim
mov ds,bx
mov dx,offset ittim
mov ah,25h
int 21h ;Initialisation du vecteur numero 8 avec DS:DX
mov al,23h
mov bx,seg itbrk
mov ds,bx
mov dx,offset itbrk
mov ah,25h
int 21h ;Initialisation du vecteur numero 23h avec DS:DX
pop ds
;Programmation du timer0 du 8253 :
;---------------------------------
mov al,00110110b ;tim0 => 2 octets ,mode 3, binaire
out CNT53,al
mov al,9ch
out TIM0,al
mov al,2eh
out TIM0,al ;Pour obtenir une IT toutes les 10 ms
sti
;Programme principal
;-------------------
always: call ci
jmp always
; ************************************
; * Programme d'interruption Timer *
; ************************************
; Le temps affiché varie de 00:00:00 a 99:59:59, puis repasse a 00:00:00 une
;seconde plus tard.
ittim: push ax
push bx
push cx
push dx
push si
push di
push ds
push es
mov ax,data
mov ds,ax ;Au cas ou ci modifie ds
dec nit ;On n'intervient que toutes les secondes cad toutes les 100 IT
jz non_saut
jmp fin
non_saut:
inc s
cmp s, '9'
jle fin_inc
mov s, '0'
inc s10
cmp s10, '5'
jle fin_inc
mov s10,'0'
inc m
cmp m, '9'
jle fin_inc
mov m,'0'
inc m10
cmp m10, '5'
jle fin_inc
mov m10, '0'
inc h
cmp h, '9'
jle fin_inc
mov h,'0'
inc h10
cmp h10,'9'
jle fin_inc
mov h10,'0'
fin_inc:
mov es,memvid
mov cx,8
mov bx,0
mov di,0
aff: mov al,[h10+di]
mov es:[3984+bx],al
add bx,2
inc di
loop aff
mov nit,COUNT
fin: mov al,20h
out CNT59,al ;Envoi d'un EOI non specifique au 8259A
pop es
pop ds
pop di
pop si
pop dx
pop cx
pop bx
pop ax
sti
iret
; ********************************************
; * Programme d'interruption pour CTRL+BREAK *
; ********************************************
itbrk: nop
push ax
push bx
push ds
;Restitution des vecteurs d'interruptions de MS-DOS
;--------------------------------------------------
xor ax,ax
mov es,ax ;es=0 pour acceder à la table des vecteurs.
mov ax,data ;ds pointe sur le segment data pour pouvoir acceder aux sauvegardes des vecteurs
mov ds,ax ;des vecteurs d'interruption.
push ds
lds bx,it8 ;DS:BX = vecteur INT8 MS-DOS
mov es:[4*8h],bx
mov es:[(4*8h)+2],ds
pop ds
lds bx,it23 ;DS:BX = vecteur INT23 MS-DOS
mov es:[4*23h],bx
mov es:[(4*23h)+2],ds
;Reprogrammation du timer0 conformément à MS-DOS
;-----------------------------------------------
xor al,al
out TIM0,al
out TIM0,al ;Il faut charger le timer avec 0000
call clrcrt ;Effacer l'ecran
;Initialisation de es pour le jmp inter-segment
;----------------------------------------------
mov ax,data
mov es,ax
pop ds
pop bx
pop ax
jmp es:dword ptr it23
code ends
end start