179 lines
3.0 KiB
NASM
179 lines
3.0 KiB
NASM
;----------------------------------------------------------------------------
|
|
; TIMER_A.ASM 386
|
|
; (c) Adeline 1993
|
|
;----------------------------------------------------------------------------
|
|
.386p
|
|
|
|
.model SMALL, SYSCALL
|
|
|
|
.data
|
|
|
|
DIVISOR equ 23864 ; 1193180 (Base Freq) / 50
|
|
FREQUENCE equ 50 ; 1193180 (Base Freq) / 23864
|
|
|
|
public NoLanguage TimerSystem
|
|
public NoLanguage TimerRef
|
|
public NoLanguage NbFramePerSecond
|
|
public NoLanguage WaitNbTicks
|
|
public NoLanguage CmptFrame
|
|
public NoLanguage Cmpt_18
|
|
|
|
TimerRef dd 0000
|
|
NbFramePerSecond dw 00
|
|
WaitNbTicks dw 1
|
|
CmptFrame dw 00
|
|
Cmpt_18 dw 00
|
|
TimerSystem dd 0000
|
|
|
|
.data
|
|
|
|
extrn NoLanguage Old_PM08_Sel:WORD
|
|
extrn NoLanguage Old_PM08_Off:DWORD
|
|
|
|
.code
|
|
|
|
public NoLanguage SetTimer
|
|
public NoLanguage NewIntPM08
|
|
public NoLanguage NewProc08
|
|
|
|
;----------------------------------------------------------------------------
|
|
SetTimer proc ,\
|
|
counter:DWORD
|
|
|
|
cli
|
|
|
|
mov ecx, counter
|
|
mov al, 36h
|
|
out 43h, al
|
|
mov al, cl
|
|
out 40h, al
|
|
mov al, ch
|
|
out 40h, al
|
|
|
|
sti
|
|
ret
|
|
SetTimer endp
|
|
|
|
;----------------------------------------------------------------------------
|
|
comment @
|
|
|
|
NewIntPM08 proc far
|
|
|
|
push eax
|
|
push ds
|
|
|
|
mov ax, DGROUP
|
|
mov ds, ax
|
|
|
|
inc dword ptr [TimerSystem]
|
|
inc dword ptr [TimerRef]
|
|
|
|
dec word ptr [WaitNbTicks]
|
|
jnz short noevaluate
|
|
|
|
mov word ptr [WaitNbTicks], FREQUENCE
|
|
|
|
mov ax, word ptr [CmptFrame]
|
|
mov word ptr [NbFramePerSecond], ax
|
|
|
|
mov word ptr [CmptFrame], 0
|
|
noevaluate:
|
|
add word ptr [Cmpt_18], DIVISOR
|
|
jc short oldint08
|
|
|
|
mov al, 20h
|
|
out 20h, al
|
|
|
|
pop ds
|
|
pop eax
|
|
iretd
|
|
oldint08:
|
|
pop ds
|
|
pop eax
|
|
|
|
int 0F2h ; old int08
|
|
|
|
iretd
|
|
|
|
NewIntPM08 endp
|
|
|
|
@
|
|
|
|
;----------------------------------------------------------------------------
|
|
NewIntPM08 proc far
|
|
|
|
push eax
|
|
push ecx
|
|
push ds
|
|
|
|
mov ax, DGROUP
|
|
mov ds, ax
|
|
|
|
inc dword ptr [TimerSystem]
|
|
inc dword ptr [TimerRef]
|
|
|
|
dec word ptr [WaitNbTicks]
|
|
jnz short noevaluate
|
|
|
|
mov word ptr [WaitNbTicks], FREQUENCE
|
|
|
|
mov ax, word ptr [CmptFrame]
|
|
mov word ptr [NbFramePerSecond], ax
|
|
|
|
mov word ptr [CmptFrame], 0
|
|
noevaluate:
|
|
add word ptr [Cmpt_18], DIVISOR
|
|
jc short oldint08
|
|
|
|
mov al, 20h
|
|
out 20h, al
|
|
|
|
pop ds
|
|
pop ecx
|
|
pop eax
|
|
iretd
|
|
oldint08:
|
|
xor eax, eax
|
|
mov ecx, [Old_PM08_Off]
|
|
mov ax, [Old_PM08_Sel]
|
|
|
|
xchg ecx, [esp+4]
|
|
xchg eax, [esp+8]
|
|
|
|
pop ds
|
|
retf
|
|
|
|
NewIntPM08 endp
|
|
|
|
;----------------------------------------------------------------------------
|
|
|
|
NewProc08 proc
|
|
|
|
push eax
|
|
push ds
|
|
|
|
mov ax, DGROUP
|
|
mov ds, ax
|
|
|
|
inc dword ptr [TimerRef]
|
|
inc dword ptr [TimerSystem]
|
|
|
|
dec word ptr [WaitNbTicks]
|
|
jnz short noevaluate
|
|
|
|
mov word ptr [WaitNbTicks], FREQUENCE
|
|
mov ax, word ptr [CmptFrame]
|
|
mov word ptr [NbFramePerSecond], ax
|
|
mov word ptr [CmptFrame], 0
|
|
noevaluate:
|
|
|
|
pop ds
|
|
pop eax
|
|
|
|
ret
|
|
|
|
NewProc08 endp
|
|
|
|
;----------------------------------------------------------------------------
|
|
; The
|
|
End |