4,7 → 4,6 |
; Compile with FASM for Kolibri |
; |
; |
SYSENTER_VAR equ 0 |
use32 |
org 0x0 |
db 'MENUET01' |
20,6 → 19,7 |
|
START: print 'Please wait' |
; ÷åðåç áûñòðûé âûçîâ (SYSENTER) |
__CPU_type equ p6 |
test1: mov eax, 1 |
cpuid |
test edx, 0x800 |
34,12 → 34,10 |
mov [old_tsc + 4], edx |
|
mov ebx, 0x100000 |
mov dword[SYSENTER_VAR], .ret_p |
mov [SYSENTER_VAR + 4], esp |
align 32 |
.nxt: mov eax, 19 ; ôóíêöèÿ ïóñòûøêà |
sysenter ; ïîðòÿòñÿ ecx, edx |
.ret_p: dec ebx |
.nxt: mcall 19 ; ôóíêöèÿ ïóñòûøêà |
; ïîðòÿòñÿ ecx, edx |
dec ebx |
jnz .nxt |
|
xor eax, eax |
56,6 → 54,7 |
|
;---------------------------------------------- |
; ÷åðåç áûñòðûé âûçîâ (SYSCALL) |
__CPU_type equ k6 |
test2: xor eax, eax |
cpuid |
cmp ecx, "cAMD" |
75,12 → 74,9 |
|
mov ebx, 0x100000 |
align 32 |
.nxt: mov eax, 19 |
push ecx |
syscall |
pop ecx |
.nxt: mcall 19 ; ôóíêöèÿ ïóñòûøêà |
|
.ret_p: dec ebx |
dec ebx |
jnz .nxt |
|
xor eax, eax |
96,6 → 92,7 |
.end: print ' <- Fast call (SYSCALL)' |
;---------------------------------------------- |
; ÷åðåç øëþç ïðåðûâàíèÿ |
__CPU_type equ p5 |
xor eax, eax |
cpuid |
rdtsc |
104,8 → 101,7 |
|
test3: mov ebx, 0x100000 |
align 32 |
.nxt: mov eax, 19 ; ôóíêöèÿ ïóñòûøêà |
int 0x40 |
.nxt: mcall 19 ; ôóíêöèÿ ïóñòûøêà |
dec ebx |
jnz .nxt |
|
121,42 → 117,7 |
debug_print_hex eax |
print ' <- Interrupt' |
|
call show_alive |
mov eax, -1 |
int 0x40 |
mcall -1 |
;--------------------------------------------- |
show_alive: |
; ÷åðåç áûñòðûé âûçîâ, íàñòðàèâàåì ðåãèñòðû äëÿ âîçâðàòà |
mov eax, 63 |
mov ebx, 1 |
mov esi, msg_Ok |
.nxt: mov cl, [esi] |
test cl, cl |
jz .end |
|
mov dword[SYSENTER_VAR], .ret_p |
mov [SYSENTER_VAR + 4], esp |
sysenter ; ïîðòÿòñÿ ecx, edx |
|
.ret_p: inc esi |
jmp .nxt |
.end: ret |
; ÷åðåç øëþç ïðåðûâàíèÿ |
; mov eax, 63 |
; mov ebx, 1 |
; mov esi, msg_Ok |
; @@: mov cl, [esi] |
; test cl, cl |
; jz @f |
|
; int 0x40 |
|
; inc esi |
; jmp @b |
; @@: ret |
|
|
old_tsc: dd 0, 0 |
|
msg_Ok db 'Alive!', 10, 13, 0 |
I_END: |