; Ejemplo de ISR que gestiona un contador de ticks, minutos y segundos. ORG 50000 call CLS call ImprimirNumero ; Primera impresion: 00:00 ; Instalamos la ISR: ld hl, CLOCK_ISR_ASM_ROUTINE di ld ($feff), hl ; Guardamos en ($feff) la direccion de la ld a, 254 ; rutina CLOCK_ISR_ASM_ROUTINE ld i, a im 2 ei Bucle: ld a, (clock_changed) ; Comprobar si clock_changed ya es 1: and a ; A = A para forzar "seteo de flags" jr z, Bucle ; Si clock_changed no vale 1, no hay ; que imprimir el mensaje ; Si estamos aqui es que clock_changed = 1... lo reseteamos ; e imprimimos por pantalla la informaciĆ³n como MM:SS xor a ld (clock_changed), a ; clock_changed = 0 ImprimirNumero: ld bc, 0 call CursorAt ; Cursor en (0,0) ld a, (minutes) ; Imprimimos minutos + ":" + segundos call PrintNum2digits ld a, ":" rst 16 ld a, (seconds) call PrintNum2digits jr Bucle ; Repetir indefinidamente clock_changed DB 0 ticks DB 0 seconds DB 0 minutes DB 0 pause DB 0 abs_ticks DW 0 timer DW 0 ;----------------------------------------------------------------------- ; Rutina de ISR : incrementa ticks 50 veces por segundo, y el resto ; de las variables de acuerdo al valor de ticks. ;----------------------------------------------------------------------- CLOCK_ISR_ASM_ROUTINE: push af push hl ld a, (pause) or a jr nz, clock_isr_fin ; Si pause==1, no continuamos la ISR ld hl, (abs_ticks) inc hl ld (abs_ticks), hl ; Incrementamos abs_ticks (absolutos) ld hl, (timer) dec hl ld (timer), hl ; Decrementamos timer (absolutos) ld a, (ticks) inc a ld (ticks), a ; Incrementamos ticks (50 veces/seg) cp 50 jr c, clock_isr_fin ; if ticks < 50, fin de la ISR ; si ticks >= 50, cambiar seg:min xor a ld (ticks), a ; ticks = 0 ld a, 1 ld (clock_changed), a ; ha cambiado el numero de segundos ld a, (seconds) inc a ld (seconds), a ; seconds = segundos +1 cp 60 jr c, clock_isr_fin ; si segundos < 60 -> salir de la ISR xor a ; si segundos == 60 -> inc minutos ld (seconds), a ; seconds = 0 ld a, (minutes) inc a ld (minutes), a ; minutes = minutos + 1 cp 60 jr c, clock_isr_fin ; si minutos > 60 -> resetear minutos xor a ld (minutes), a ; minutes = 0 clock_isr_fin: pop hl pop af ei reti ;--------------------------------------------------------- INCLUDE "utils.asm" END 50000