mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-23 20:05:26 +00:00
141 lines
3.0 KiB
NASM
141 lines
3.0 KiB
NASM
|
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
|
|||
|
|
|||
|
|