Category : Assembly Language Source Code
Archive   : TIMERH.ZIP
Filename : TIMER.ASM

 
Output of file : TIMER.ASM contained in archive : TIMERH.ZIP
PAGE ,132
title \asm_sour\timer.asm HIGH ACCURACY TIMER
subttl michael e. walraven
.MODEL MEDIUM

name timer
.cref
.lall

;
; High resolution timer, returns a 32 bit high resolution
; value which is the amount of elapsed time since the function
; was last called. The counts are 838.2ns each (1.19318 MHz)
; time_int() must be called first to set the timer chip to
; the proper mode.
; Counter 0 is changed in time_int() and the data from this
; counter is used in elaptime() so it must not be changed
; between calls.
; There should not be any interference in system timing
; max of 55 msec error introduced by time_int() into absolute
; system time.

; MEDIUM memory model/microsoft 5.00
; FAR PROGRAM, NEAR DATA
; cs: is code segment
; es: and ds: are data segment
; ss: within data segment
; ax: for integer return
; dx:ax: for long return

.DATA
; these data items located in the DSEG and can be accessed
; as near by C programs

PUBLIC SYS_HI
PUBLIC SYS_LOW
PUBLIC TIMER_COUNT

SYS_HI DW ? ;TIMER_HI VALUE FOR PREVIOUS CALL
SYS_LOW DW ? ;TIMER_LOW VALUE FOR PREVIOUS CALL
TIMER_COUNT DW ? ;8253 TIMER COUNT FOR PREVIOUS CALL


; NO ARGUMENTS PASSED to either function

TIMER_MODE EQU 043H
TIMER0 EQU 040H

BIOS SEGMENT AT 040H
ORG 06CH
TIMER_LOW DW ?
TIMER_HI DW ?
BIOS ENDS

PAGE
.CODE

PUBLIC _time_int
_time_int PROC

; void far time_int(void);
;
; SET THE TIMER MODE FOR PULSE OUTPUT, RATHER THAN SQUARE
; MODE AS SET BY DOS

MOV AL,00110100B ;CTR 0, LSB THEN MSB
;MODE 2, BINARY
OUT TIMER_MODE,AL ;MODE REGISTER FOR 8253
SUB AX,AX ;SET 0, RESULT IN MAX COUNT
OUT TIMER0,AL
OUT TIMER0,AL
RET
_time_int ENDP


PUBLIC _elaptime
_elaptime PROC

; long int far elaptime(void);
;
; DETERMINE ELAPSED TIME SINCE LAST CALL
; RETURNS 32 BIT (LONG) VALUE WHICH IS
; NEW - TIMER_HI:TIMER_LO:TIMER_COUNT MINUS
; OLD - TIMER_HI:TIMER_LO:TIMER_COUNT

; ASSUMPTION MADE THAT 32 BITS WILL NOT OVERFLOW!!!!

PUSH ES
MOV AX,BIOS
MOV ES,AX
ASSUME ES:BIOS

MOV AL,0 ;PREPARE TO LATCH COUNTER
OUT TIMER_MODE,AL ;LATCH 8253

PUSHF ;SAVE INTERRUPT STATE
CLI ;TURN INTERRUPT OFF WHILE READING CODE
IN AL,TIMER0
MOV DL,AL
IN AL,TIMER0
MOV DH,AL ;DX HAS NEW CHIP COUNT(count down value)

MOV BX,ES:TIMER_LOW ;BX HAS SYSTEM TIME LOW WORD
MOV AX,ES:TIMER_HI ;AX HAS SYSTEM TIME HIGH WORD

; NOW HAVE A 48 BIT WORD AX:BX:DX FOR THE PRESENT TIME
MOV CX,TIMER_COUNT ;SWAP AND SUBTRACT
MOV TIMER_COUNT,DX
SUB CX,DX

; CX: HAS LOW 16 BITS OF DIFFERENCE

MOV DX,SYS_LOW ;SWAP AND SUBTRACT
MOV SYS_LOW,BX
SBB BX,DX

; BX: HAS MID 16 BITS OF DIFFERENCE

MOV DX,SYS_HI ;SWAP AND SUBTRACT
MOV SYS_HI,AX
SBB AX,DX

; AX: HAS HIGH 16 BITS OF DIFFERENCE

; NOW HAVE A 48 BIT WORD THAT IS DIFFERENCE
; ONLY PASS BACK 32 BITS AT PRESENT
; AS DX:AX

MOV AX,CX ;LOW 16 BITS
MOV DX,BX ;MID 16 BITS


POPF
POP ES
RET
_elaptime ENDP


END



  3 Responses to “Category : Assembly Language Source Code
Archive   : TIMERH.ZIP
Filename : TIMER.ASM

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/