Files
lba1-classic/LIB386/LIB_SYS/TIMER_A.ASM
Gwen Gourevich c5f4f6ba25 Initial commit
2021-10-27 10:34:18 +02:00

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