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
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
|
|
|
|
|