PonVector MACRO tipo,rutina
CLI
MOV AX,0
MOV ES,AX
MOV word ptr ES:[tipo * 4], OFFSET rutina
MOV word ptr ES:[tipo * 4 + 2 ], SEG rutina
STI
ENDM
;--------------------------
GuardaVector MACRO tipo,IPviejo,CSViejo
MOV AX,DATA
MOV DS,AX
MOV AX,0
MOV ES,AX
MOV DI,tipo*4
MOV AX,ES:[DI]
MOV IPviejo,AX
MOV AX,ES:[DI + 2]
MOV CSViejo,AX
ENDM
;----------------------------------------------------------------------
RestauraVector MACRO tipo,IPViejo,CSViejo
CLI
push ax
push ds
push es
push di
MOV AX,DATA
MOV DS,AX
MOV AX,0
MOV ES,AX
MOV DI,tipo*4
MOV AX,IPViejo
MOV ES:[DI] , AX
MOV AX,CSVIEJO
MOV ES:[DI+2], AX
pop di
pop es
pop ds
pop ax
STI
outp(0x43,0x3c);
outp(0x40,0)
outp(0x40,0);
ENDM
;----------------------------------------------------------------------
DATA SEGMENT
IP8Viejo dw ?
CS8Viejo dw ?
Fin db 0
cont dw 24
ContInt dw 18
n dw 0
DATA ENDS
;----------------------------------------------------------------------
CODE SEGMENT
MIPROG PROC FAR
ASSUME CS:CODE, DS:DATA
CLI
GuardaVector 8,IP8Viejo,CS8Viejo ; guardo vector del timer antiguo
PonVector 8,timernuevo ; pongo el vector dede mi nuevo timer
MOV AX,DATA
MOV DS,AX
STI
MOV n,48
DENUEVO:
Espera:
CMP n,"9"
JE quit
CMP Fin,1 ; ciclo de espera para contar las interrupciones
JNZ Espera
INC n
push ax
push dx
mov ah,2;
mov dx,n
int 21h
pop dx
pop ax
;imprime n ; imprime el segundo en el que va JE hagocero ; si es = a 5 significa que debo empezar el ciclo
MOV Fin,0 ; coloco en 0 la bandera que me indica que se realizaron
; las 18 interrupciones
MOV ContInt,18 ; coloco el contados de interrupciones en 18
JMP DENUEVO ; salto para empezar el ciclo nuevamente
quit:
RestauraVector 8,IP8Viejo,CS8Viejo ; restauro el vector del timer
MOV AX,4c00H
INT 21H ;retorno al S.O.
;----------------------------------------------------------------------
timernuevo:
PUSH AX
PUSH DS
MOV AX,DATA
MOV DS,AX
DEC ContInt ; decremento el contador de interrupciones para
; contar un segundo (18 interrupciones)
JNZ Salir
MOV Fin,1 ; coloco la bandera FIN en 1 para avisar que se
; cumplieron las 18 interrupciones
Salir:
MOV AL,20H ;comando fin de interrupcion
OUT 20H,AL
POP DS
POP AX
IRET
;----------------------------------------------------------------------
MIPROG ENDP
CODE ENDS
END MIPROG
bueno este programa muestra una generacion de numeros del 1 al 9 en un cierto intervalo de tiempo, la pregunta es como lo modifico para que ande mas lento o mas rapido segun los requerimientos, como por ejemplo que genere esos numeros en centecimas de segundos, como lo hago?, ojala me puedan ayudar
como idea se me ocurrio hacer eso, guiandome por este codigo en C
void ISRS::SetTimerFrequency(float hz)
{
float base=1193180.0;
unsigned short word;
base/=hz;
byte=(unsigned short)base;
outp(0x43,0x3c);
outp(0x40, LOW_BYTE(word));
outp(0x40,HIGH_BYTE(word));
}
pero no se como implementarlo!