MalwareSourceCode/MSDOS/T-Index/Virus.MSDOS.Unknown.timer.asm

141 lines
3.0 KiB
NASM
Raw Normal View History

2021-01-13 00:01:59 +00:00
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