; Ejemplo de ISR que gestiona un contador de ticks, minutos y segundos. ORG 50000 CALL CLS ; 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 CALL ImprimirNumero ; Primera impresion: 00:00 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