1
« en: Martes 14 de Diciembre de 2010, 23:33 »
Buenas noches estoy haciendo un cronometro digital divido en dos
La segunda parte del cronometro nose si tengo las interrupciones bien o mal ni el clock es que ya no tengo ni idea como continuar alguien me podria ayudar?
la primera es la siguiente :
;************************************
; DEFINICIO DE VALORS CONSTANTS
;*************************************
escape equ 1bh ; Codi escape
fila_cron equ 9bh ; Posicio fila icolumna
col_cron equ 9bh ; dels digits delcronometre
fila_cont equ 14bh ; Posicio fila i columna
col_cont equ 3Ah ; controls cronometre
fila_conts equ 15h ; Posicio fila i columna
;******************************************
; DECLARACIO DE VARIABLES.
;******************************************
.data
;-------- Variables del Sistema ------------
hores db 23h ; Registres cronometre codificats en BCD
minuts db 59h ; inicialitzats al valor 23h:59m:06s
segons db 06h
flag db 00h
PUBLIC hores, minuts, segons,flag
;-------- Taula de visualitzacions ---------------
buf_cron db 15 dup ('$') ; Buffer visualitzacio cronometre
miss_tit db 'C R O N O M E T R E D I G I T A L $'
miss_esc db '<ESC>: Sortir $' ; Missatge escape
miss_strt db ' <S>: Start/Stop $' ; Missatge Start/Stop
miss_clr db ' <C>: Clear $' ; Missatge Clear
miss_aut db 'Autors: Pere Ortega i Sergi Jimenez $' ; Missatge autors
miss_dat db 'DATA: 12/11/2010 $' ; Missatge data
;*********************************************
; INICI PROGRAMA. SEGMENT DE CODI
;*********************************************
.code
entrada: mov ax,@data ; Alinea segment de dades
mov ds,ax
call borra_pant ; Borra pantalla monitor
call vis_gen ; Visualitza controls cronometre
bucle: call omp_buf ; Omple buffer crono
call vis_cron ; Visualitza valors crono
;***************************************************************
; BUCLE PRINCIPAL: GESTIO CONTROL CRONOMETRE
;***************************************************************
; Bucle continu que controla el funcionament del
; cronometre. Es detecta la tecla que s'ha premut i s'executa el
; comandament associat:
; <ESC> : Sortir del programa (implementar)
; <S> o <s>: Engega i/o atura el cronometre (de moment no implementar)
; <C> 0 <c>: Borra el crono. Tot a zero. (implementar)
;****************************************************************
gescont:
mov ah,10h
int 16h
cmp al,'S'
jne no_s
not flag
no_s: cmp al,'s'
jne C
not flag
C: cmp al,'C'
jne no_c
mov hores,00h
mov minuts,00h
mov segons,00h
no_c: cmp al,'c'
jne exit
mov hores,00h
mov minuts,00h
mov segons,00h
exit: cmp al,escape
jne bucle
mov ax,4c00h ; Finalitza el programa, i sortida al MS-DOS
int 21h
;****************************************
; S U B R U T I N E S
;****************************************
;****************************************
; ESBORRAT DE PANTALLA
;****************************************
borra_pant:
mov ah,06h
mov al,00h
mov bh,07h
mov ch,00h
mov cl,00h
mov dh,18h
mov dl,4Fh
mov ah,06
int 10h
ret
;******************************************
; SUBRUTINA VISUALITZACIO GENERAL
;******************************************
vis_gen:
;------- Visualitza titol -------------
mov AH, 02h
mov BH, 00h
mov DH, 01h
mov DL, 15h
int 10h
mov Dx, OFFSET miss_tit
MOV AH, 09h
int 21h
;------- Visualitza autors--------------------------------
mov AH, 02h
mov BH, 00h
mov DH, 0Bh
mov DL, 11h
int 10h
mov DX,OFFSET miss_aut
MOV AH,09h
int 21h
;------- Visualitza data ----------------------------------
mov AH, 02h
mov BH, 00h
mov DH, 0Bh
mov DL, 38h
int 10h
MOV AH, 09h
mov Dx, OFFSET miss_dat
int 21h
;------- Visualitza start/stop----------------------------
mov AH, 02h
mov BH, 00h
mov DH, 14h
mov DL, 30h
int 10h
MOV AH, 09h
mov Dx,OFFSET miss_strt
int 21h
;------- Visualització clear--------------------------------
mov AH, 02h
mov BH, 00h
mov DH, 15h
mov DL, 30h
int 10h
mov Dx,OFFSET miss_clr
MOV AH, 09h
int 21h
;------- Visualitza sortida-------------------------------
mov AH, 02h
mov BH, 00h
mov DH, 17h
mov DL, 32h
int 10h
MOV DX, OFFSET miss_esc
Mov AH, 09h
int 21h
;**********************************************************
; SUBRUTINA OMPLE BUFFER CRONOMETRE
; Converteix cada digit al corresponent codi ASCII
; i es construeix la tirallonga per tenir el format de
; sortida demanat.
;----------------------------------------------------------
; FORMAT SORTIDA: HHh:MMm:SSs
; Exemple: 12h:36m:54s
;**********************************************************
omp_buf:
lea di,buf_cron
mov al,hores
call conversor
mov [di],ah
inc di
mov [di],al
inc di
mov [di],byte ptr 'h'
inc di
mov [di],byte ptr ':'
inc di
mov al,minuts
call conversor
mov [di],ah
inc di
mov [di],al
inc di
mov [di],byte ptr 'm'
inc di
mov [di],byte ptr ':'
inc di
mov al,segons
call conversor
mov [di],ah
inc di
mov [di],al
inc di
mov [di],byte ptr 's'
ret
; - Es recomsnable escriure una subrutina de us local que converteixi
; els dos digits de cada un dels camps als codis ASCII
; corresponents. Recorda que per convertir valors nuumerics a ASCII
; sols cal sumar 30H al valor a convertir.
; - Utilitzeu un punter amb adrecament indirecte per anar escrivint
; cada caracter al buffer de desti.
; - Recordeu que l'assemblador enten com a codi ASCII
; qualsevol dada o tirallonga tancada entre cometes ' '.
;********************************************************************
; SUBRUTINA VISUALITZACIO CRONOMETRE
; Subrutina que mostra el valor actual del cronometre,
; Es va refrescant continuament en el bucle gestcont: del
; programa principal
;********************************************************************
vis_cron:
mov ah,02h ; Posiciona Cursor
mov bh,00h
mov dh,07h
mov dl,23h
int 10h
mov ah,09h ; Visualitza buf_cron.
lea dx,buf_cron
int 21h
ret
;**********************************************; CONVERSIO DE HEX A ASCII
;
;********************************************************************
conversor: mov cl,4h
shl ax,cl
and ah,0fh
add ah,30h
shr al,cl
and al,0fh
add al,30h
ret
end entrada
La segunda parte es esta:
;******************************************************
.model small
;------------ DECLARACIONS EXTERNES I PUBLIQUES -----------
extrn segons:byte
extrn minuts:byte
extrn hores:byte
extrn flag
;------------- VARIABLES DEL MODUL ------------------------
.data
cont18 db 18h ; Comptador auxiliar 1/18 segons
cs_antic dw 0h
ip_antic dw 0h
.code
;------- INICIALITZACIO INTERRUPCIONS ------------------
ini_int:
;----- Salvar interrupcio anterior
cli
push
mov ah,35h ; Utilitzar Funcio 35 de INT 21H
mov al, 1Ch
int21h
mov cs_antic,es
mov ip_antic,Bx
pop es
int 21h
;----- Instal.lar nova interrupcio
push ds
mov ah,25h ; Utilitzar Funcio 25 de INT 21H
mov al,21h
ret
;-------- RESTAURACIO INTERRUPCIONS -------------
rest_int:
;----- Restaurar interrupcio original
cli
push ; Utilitzar Funcio 25 de INT 21H
mov ah,25h
mov al, 1Ch
mov ds_antic,es
mov dx_antic,Bx
pop es
int 21h
ret
;*******************************************************
; SUBRUTINA SERVEI INTERRUPCIO DEL CRONOMETRE
;*******************************************************
; Ha d'anar incrementant els registres (hores),(minuts)
; i (segons) de manera sincronitzada entre si.
; Cal implementar contadors BCD
; Per mitja d'una variable de control "flag", es fara
; el control de marxa/paro del cronometre. Aquesta
; variable es compartida entre el programa principal
; i el servei d'interrupcio, amb el criteri segent:
; 00H = OFF, cronometre aturat
; 0FFh = ON, cronometre en marxa
;*******************************************************
; MOLT IMPORTANT EN ELS SERVEIS D'INTERRUPCIO:
; En els serveis d'interrupcio cal que el procediment
; sigui de tipus FAR (llunya) i que la rutina ha de ser
; transparent salvant tots els registres de la CPU que
; s'utilitzin.
; Tambe cal tornar a aliniar el segment de dades si
; es fan servir variables de memoria.
;*******************************************************
clock:
push ds
mov ax,@data ; Alinea segment de dades
mov ds,ax
; Control Start/Stop
cmp flag,0
jnbe sortida
; Descomptador 1/18"
dec cont18
cmp cont18,0h
jnbe sortida
; Comptador de segons
inc segons
daa
cmp segons,60h
jnbe sortida
segons=0h ; Comptador de minuts
inc minuts
daa
cmp minuts,60h
jnbe sortida
minuts=0h
; Comptador d'hores
inc hores
daa
cmp hores,240h
jnbe sortida
hores=0h
sortida:
iret
end