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