; Ejemplo de WaitNticks ORG 50000 ; Instalamos la ISR: ld hl, CLOCK_ISR_ASM_ROUTINE di ld (65279), hl ; Guardamos en (65279 = $feff) la direccion ld a, 254 ; de la rutina CLOCK_ISR_ASM_ROUTINE ld i, a im 2 ei Bucle_entrada: ld a, "." rst 16 ld a, "5" rst 16 ld a, " " rst 16 ; Imprimimos por pantalla ".5 " ld hl, 25 ; Esperamos 25 ticks (0.5 segundos) call WaitNTicks ld a, "3" rst 16 ld a, " " rst 16 ; Imprimimos por pantalla "3 " ld hl, 3*50 ; Esperamos 150 ticks (3 segundos) call WaitNTicks jp Bucle_entrada ticks DB 0 timer DW 0 ;----------------------------------------------------------------------- ; WaitNTicks: Esperamos N ticks de procesador (1/50th) en un bucle. ;----------------------------------------------------------------------- WaitNTicks: ld (timer), hl ; seteamos "timer" con el tiempo de espera Waitnticks_loop: ; bucle de espera, la ISR lo ira decrementando ld hl, (timer) ld a, h ; cuando (timer) valga 0 y lo decrementen, su cp $ff ; byte alto pasara a valer FFh, lo que quiere ; decir que ha pasado el tiempo a esperar. jr nz, Waitnticks_loop ; si no, al bucle de nuevo. ret ;----------------------------------------------------------------------- ; Rutina de ISR : incrementa ticks y decrementa timer 50 veces por seg. ;----------------------------------------------------------------------- CLOCK_ISR_ASM_ROUTINE: push af push hl 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 xor a ; si ticks >= 50, cambiar seg:min ld (ticks), a ; y ticks = 0 clock_isr_fin: pop hl pop af ei reti END 50000