source: xtideuniversalbios/trunk/Assembly_Library/Src/Time/Delay.asm @ 245

Last change on this file since 245 was 245, checked in by aitotat@…, 12 years ago

Changes to Assembly Library:

  • Added functions to reboot computer.
  • Added JMP_DELAY macro.
File size: 2.7 KB
Line 
1; Project name  :   Assembly Library
2; Description   :   Delay functions.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
8; Clears prefetch queue by jumping to next instruction.
9; This delays much more than nop instruction of fast systems.
10;
11; JMP_DELAY
12;   Parameters
13;       Nothing
14;   Returns:
15;       Nothing
16;   Corrupts registers:
17;       Nothing
18;--------------------------------------------------------------------
19%macro JMP_DELAY 0
20    jmp     SHORT %%NextInstruction
21%%NextInstruction:
22%endmacro
23
24
25;--------------------------------------------------------------------
26; Mimimun delays (without fetching) with some CPU architectures:
27;   8088/8086:  17 cycles for jump + 5 cycles for last comparison
28;   286:        10 cycles for jump + 4 cycles for last comparison
29;   386:        13 cycles for jump + ? cycles for last comparison
30;   486:         7 cycles for jump + 6 cycles for last comparison
31;
32; DELAY_WITH_LOOP_INSTRUCTION
33;   Parameters
34;       CX:     Loop iterations (0 is maximum delay with 65536 iterations)
35;   Returns:
36;       Nothing
37;   Corrupts registers:
38;       CX
39;--------------------------------------------------------------------
40%macro DELAY_WITH_LOOP_INSTRUCTION 0
41%%StartOfLoop:
42    loop    %%StartOfLoop
43%endmacro
44
45
46;--------------------------------------------------------------------
47; Delay is always at least one millisecond since
48; RTC resolution is 977 microsecs.
49;
50; Delay_MicrosecondsFromAX
51;   Parameters:
52;       AX:     Number of microsecs to wait
53;   Returns:
54;       Nothing
55;   Corrupts registers:
56;       AX
57;--------------------------------------------------------------------
58ALIGN JUMP_ALIGN
59Delay_MicrosecondsFromAX:
60    push    dx
61    push    cx
62
63    xor     cx, cx
64    xchg    dx, ax                          ; Microsecs now in CX:DX
65    mov     ah, EVENT_WAIT                  ; Event Wait
66    int     BIOS_SYSTEM_INTERRUPT_15h
67    sti                                     ; XT BIOSes return with interrupt disabled
68
69    pop     cx
70    pop     dx
71    mov     ax, 1                           ; Prepare to wait 1 timer tick
72    jc      SHORT Delay_TimerTicksFromAX    ; Event Wait was unsupported or busy
73    ret
74
75
76;--------------------------------------------------------------------
77; First tick might take 0...54.9 ms and remaining ticks
78; will occur at 54.9 ms intervals.
79;
80; Delay_TimerTicksFromAX
81;   Parameters:
82;       AX:     Number of timer ticks to wait
83;   Returns:
84;       Nothing
85;   Corrupts registers:
86;       AX
87;--------------------------------------------------------------------
88ALIGN JUMP_ALIGN
89Delay_TimerTicksFromAX:
90    push    dx
91
92    sti                         ; Make sure that interrupts are enabled
93    xchg    dx, ax
94    call    TimerTicks_ReadFromBdaToAX
95    add     dx, ax              ; DX = end time
96.WaitLoop:
97    call    TimerTicks_ReadFromBdaToAX
98    cmp     ax, dx
99    jb      SHORT .WaitLoop     ; Loop until end time is reached
100
101    pop     dx
102    ret
Note: See TracBrowser for help on using the repository browser.