Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 468 → Rev 477

/programs/develop/fast_call_test/MACROS.INC
129,7 → 129,11
end if
}
 
macro mcall a,b,c,d,e,f { ; mike.dld
__CPU_type equ p5
SYSENTER_VAR equ 0
 
macro mcall a,b,c,d,e,f { ; mike.dld, updated by Ghost for Fast System Calls
local ..ret_point
__mov eax,a
__mov ebx,b
__mov ecx,c
136,11 → 140,33
__mov edx,d
__mov esi,e
__mov edi,f
 
if __CPU_type eq p5
int 0x40
else
if __CPU_type eq p6
push ebp
mov ebp, esp
push ..ret_point ; it may be 2 or 5 byte
sysenter
..ret_point:
pop edx
pop ecx
 
else
if __CPU_type eq k6
push ecx
syscall
pop ecx
else
display 'ERROR : unknown CPU type'
int 0x40
end if
end if
end if
}
 
 
 
; language for programs
lang fix ru ; ru en fr ge fi
 
/programs/develop/fast_call_test/test.ASM
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: