/kernel/trunk/core/exports.inc |
---|
62,7 → 62,14 |
szSleep db 'Sleep',0 |
szGetTimerTicks db 'GetTimerTicks',0 |
szStrncat db 'strncat',0 |
szStrncpy db 'strncpy',0 |
szstrncmp db 'strncmp',0 |
szStrnlen db 'strnlen',0 |
szStrchr db 'strchr',0 |
szStrrchr db 'strrchr',0 |
align 16 |
kernel_export: |
dd szRegService , reg_service |
115,9 → 122,18 |
dd szSetMouseData , set_mouse_data |
dd szSleep , delay_ms |
dd szGetTimerTicks , get_timer_ticks |
dd szStrncat , strncat |
dd szStrncpy , strncpy |
dd szstrncmp , strncmp |
dd szStrnlen , strnlen |
dd szStrchr , strchr |
dd szStrrchr , strrchr |
exp_lfb: |
dd szLFBAddress , 0 |
dd 0 |
dd 0 ;terminator, must be zero |
endg |
/kernel/trunk/core/ext_lib.inc |
---|
228,7 → 228,7 |
mov edx,[exp] |
.next: test edx,edx |
jz .end |
stdcall strcmp,[edx],[sz_name] |
stdcall strncmp,[edx],[sz_name], dword -1 |
test eax,eax |
jz .ok |
add edx,8 |
306,21 → 306,4 |
ret |
endp |
proc strcmp, str1:dword,str2:dword |
push esi edi |
mov esi,[str1] |
mov edi,[str2] |
xor eax,eax |
@@: lodsb |
scasb |
jne .fail |
or al,al |
jnz @b |
jmp .ok |
.fail: or eax,-1 |
.ok: pop edi esi |
ret |
endp |
s_libname db 64 dup (0) |
/kernel/trunk/core/memory.inc |
---|
1057,42 → 1057,7 |
endp |
align 4 |
proc strncmp stdcall, str1:dword, str2:dword, count:dword |
mov ecx,[count] |
jecxz .end |
mov ebx,ecx |
mov edi,[str1] |
mov esi,edi |
xor eax,eax |
repne scasb |
neg ecx ; cx = count - strlen |
add ecx,ebx ; strlen + count - strlen |
.okay: |
mov edi,esi |
mov esi,[str2] |
repe cmpsb |
mov al,[esi-1] |
xor ecx,ecx |
cmp al,[edi-1] |
ja .str2_big |
je .end |
.str1_big: |
sub ecx,2 |
.str2_big: |
not ecx |
.end: |
mov eax,ecx |
ret |
endp |
align 4 |
proc stall stdcall, delay:dword |
push ecx |
1120,227 → 1085,8 |
ret |
endp |
align 4 |
k_strrchr: |
push eax |
xor eax,eax |
or ecx,-1 |
repne scasb |
add ecx,1 |
neg ecx |
sub edi,1 |
pop eax |
std |
repne scasb |
cld |
add edi,1 |
cmp [edi],al |
jne @F |
mov eax,edi |
ret |
@@: |
xor eax,eax |
ret |
align 4 |
proc k_strncpy stdcall, dest:dword, src:dword, maxlen:dword |
mov eax, [dest] |
mov esi, [src] |
mov ecx, [maxlen] |
test eax, eax |
jz .L9 |
test esi, esi |
jz .L9 |
test ecx, ecx |
jz .L9 |
sub esi, eax |
jmp .L1 |
align 4 |
.L2: |
mov edx, [esi+eax] |
mov [eax], dl |
test dl, dl |
jz .L7 |
mov [eax+1], dh |
test dh, dh |
jz .L6 |
shr edx, 16 |
mov [eax+2],dl |
test dl, dl |
jz .L5 |
mov [eax+3], dh |
test dh, dh |
jz .L4 |
add eax, 4 |
.L1: |
sub ecx, 4 |
jae .L2 |
add ecx, 4 |
jz .L9 |
mov dl, [eax+esi] |
mov [eax], dl |
test dl, dl |
jz .L3 |
inc eax |
dec ecx |
jz .L9 |
mov dl, [eax+esi] |
mov [eax], dl |
test dl, dl |
jz .L3 |
inc eax |
dec ecx |
jz .L9 |
mov dl, [eax+esi] |
mov [eax], dl |
test dl, dl |
jz .L3 |
inc eax |
jmp .L9 |
.L4: dec ecx |
inc eax |
.L5: dec ecx |
inc eax |
.L6: dec ecx |
inc eax |
.L7: |
add ecx,3 |
jz .L9 |
.L8: |
mov byte [ecx+eax], 0 |
.L3: |
dec ecx |
jnz .L8 |
.L9: |
ret |
endp |
if 0 |
magic equ 0xfefefeff |
k_strlen: |
mov eax,[esp+4] |
mov edx, 3 |
and edx, eax |
jz .L1 |
jp .L0 |
cmp dh, byte [eax] |
je .L2 |
inc eax |
cmp dh, byte [eax] |
je .L2 |
inc eax |
xor edx, 2 |
jz .L1 |
.L0: |
cmp dh, [eax] |
je .L2 |
inc eax |
xor edx, edx |
.L1: |
mov ecx, [eax] |
add eax, 4 |
sub edx, ecx |
add ecx, magic |
dec edx |
jnc .L3 |
xor edx, ecx |
and edx, not magic |
jne .L3 |
mov ecx, [eax] |
add eax, 4 |
sub edx, ecx |
add ecx, magic |
dec edx |
jnc .L3 |
xor edx, ecx |
and edx, not magic |
jne .L3 |
mov ecx, [eax] |
add eax, 4 |
sub edx, ecx |
add ecx, magic |
dec edx |
jnc .L3 |
xor edx, ecx |
and edx, not magic |
jne .L3 |
mov ecx, [eax] |
add eax, 4 |
sub edx, ecx |
add ecx, magic |
dec edx |
jnc .L3 |
xor edx, ecx |
and edx, not magic |
je .L1 |
.L3: sub eax ,4 |
sub ecx, magic |
cmp cl, 0 |
jz .L2 |
inc eax |
test ch, ch |
jz .L2 |
shr ecx, 16 |
inc eax |
cmp cl,0 |
jz .L2 |
inc eax |
.L2: |
sub eax, [esp+4] |
ret |
end if |
if 0 |
push eax |
push edx |
mov edx, 0x400 ;bochs |
/kernel/trunk/core/string.inc |
---|
0,0 → 1,187 |
$Revision: 431 $ |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;; ;; |
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; |
;; Distributed under terms of the GNU General Public License ;; |
;; Author: Kees J. Bot 1 Jan 1994 ;; |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
; size_t strncat(char *s1, const char *s2, size_t n) |
; Append string s2 to s1. |
; char *strchr(const char *s, int c) |
; int strncmp(const char *s1, const char *s2, size_t n) |
; Compare two strings. |
; char *strncpy(char *s1, const char *s2, size_t n) |
; Copy string s2 to s1. |
; size_t strnlen(const char *s, size_t n) |
; Return the length of a string. |
; proc strrchr stdcall, s:dword, c:dword |
; Look for the last occurrence a character in a string. |
proc strncat stdcall, s1:dword, s2:dword, n:dword |
push esi |
push edi |
mov edi, [s1] ; String s1 |
mov edx, [n] ; Maximum length |
mov ecx, -1 |
xor al, al ; Null byte |
cld |
repne scasb ; Look for the zero byte in s1 |
dec edi ; Back one up (and clear 'Z' flag) |
push edi ; Save end of s1 |
mov edi, [s2] ; edi = string s2 |
mov ecx, edx ; Maximum count |
repne scasb ; Look for the end of s2 |
jne @F |
inc ecx ; Exclude null byte |
@@: |
sub edx, ecx ; Number of bytes in s2 |
mov ecx, edx |
mov esi, [s2] ; esi = string s2 |
pop edi ; edi = end of string s1 |
rep movsb ; Copy bytes |
stosb ; Add a terminating null |
mov eax, [s1] ; Return s1 |
pop edi |
pop esi |
ret |
endp |
align 4 |
proc strncmp stdcall, s1:dword, s2:dword, n:dword |
push esi |
push edi |
mov ecx, [n] |
test ecx, ecx ; Max length is zero? |
je .done |
mov esi, [s1] ; esi = string s1 |
mov edi, [s2] ; edi = string s2 |
cld |
.compare: |
cmpsb ; Compare two bytes |
jne .done |
cmp byte [esi-1], 0 ; End of string? |
je .done |
dec ecx ; Length limit reached? |
jne .compare |
.done: |
seta al ; al = (s1 > s2) |
setb ah ; ah = (s1 < s2) |
sub al, ah |
movsx eax, al ; eax = (s1 > s2) - (s1 < s2), i.e. -1, 0, 1 |
pop edi |
pop esi |
ret |
endp |
align 4 |
proc strncpy stdcall, s1:dword, s2:dword, n:dword |
push esi |
push edi |
mov ecx, [n] ; Maximum length |
mov edi, [s2] ; edi = string s2 |
xor al, al ; Look for a zero byte |
mov edx, ecx ; Save maximum count |
cld |
repne scasb ; Look for end of s2 |
sub edx, ecx ; Number of bytes in s2 including null |
xchg ecx, edx |
mov esi, [s2] ; esi = string s2 |
mov edi, [s1] ; edi = string s1 |
rep movsb ; Copy bytes |
mov ecx, edx ; Number of bytes not copied |
rep stosb ; strncpy always copies n bytes by null padding |
mov eax, [s1] ; Return s1 |
pop edi |
pop esi |
ret |
endp |
align 4 |
proc strnlen stdcall, s:dword, n:dword |
push edi |
mov edi, [s] ; edi = string |
xor al, al ; Look for a zero byte |
mov edx, ecx ; Save maximum count |
cmp cl, 1 ; 'Z' bit must be clear if ecx = 0 |
cld |
repne scasb ; Look for zero |
jne @F |
inc ecx ; Don't count zero byte |
@@: |
mov eax, edx |
sub eax, ecx ; Compute bytes scanned |
pop edi |
ret |
endp |
align 4 |
proc strchr stdcall, s:dword, c:dword |
push edi |
cld |
mov edi, [s] ; edi = string |
mov edx, 16 ; Look at small chunks of the string |
.next: |
shl edx, 1 ; Chunks become bigger each time |
mov ecx, edx |
xor al, al ; Look for the zero at the end |
repne scasb |
pushf ; Remember the flags |
sub ecx, edx |
neg ecx ; Some or all of the chunk |
sub edi, ecx ; Step back |
mov eax, [c] ; The character to look for |
repne scasb |
je .found |
popf ; Did we find the end of string earlier? |
jne .next ; No, try again |
xor eax, eax ; Return NULL |
pop edi |
ret |
.found: |
pop eax ; Get rid of those flags |
lea eax, [edi-1] ; Address of byte found |
pop edi |
ret |
endp |
proc strrchr stdcall, s:dword, c:dword |
push edi |
mov edi, [s] ; edi = string |
mov ecx, -1 |
xor al, al |
cld |
repne scasb ; Look for the end of the string |
not ecx ; -1 - ecx = Length of the string + null |
dec edi ; Put edi back on the zero byte |
mov eax, [c] ; The character to look for |
std ; Downwards search |
repne scasb |
cld ; Direction bit back to default |
jne .fail |
lea eax, [edi+1] ; Found it |
pop edi |
ret |
.fail: |
xor eax, eax ; Not there |
pop edi |
ret |
endp |
/kernel/trunk/core/taskman.inc |
---|
76,7 → 76,6 |
pushad |
mov [cmdline], ebx |
mov [flags], edx |
; [ebp] pointer to filename |
84,12 → 83,16 |
lea eax, [filename] |
mov dword [eax+1020],0 ;force terminate |
;string |
stdcall k_strncpy, eax, [ebp], 1023 |
stdcall strncpy, eax, [ebp], 1023 |
mov [cmdline], ebx |
test ebx, ebx |
jz @F |
lea eax, [cmdline] |
mov dword [eax+252], 0 |
stdcall k_strncpy, eax, [cmdline], 255 |
stdcall strncpy, eax, ebx, 255 |
@@: |
lea eax, [filename] |
stdcall load_file, eax |
mov ecx, -ERROR_FILE_NOT_FOUND |
136,9 → 139,8 |
_clear_ 256 ;clean extended information about process |
; write application name |
lea edi, [filename] |
mov al, '/' |
call k_strrchr ; now eax points to name without path |
lea eax, [filename] |
stdcall strrchr, eax, '/' ; now eax points to name without path |
lea esi, [eax+1] |
test eax, eax |
963,7 → 965,7 |
.add_command_line: |
mov edx,[params] |
mov edx,[edx] ;app_cmdline |
test edx,edx |
test edx, [cmd_line] ;check both src & dst |
jz @F ;application don't need parameters |
mov eax, edx |
973,7 → 975,7 |
cmp eax, [SLOT_BASE+APPDATA.mem_size+ebx*8] |
ja @f |
stdcall k_strncpy, edx, [cmd_line], 256 |
stdcall strncpy, edx, [cmd_line], 256 |
@@: |
mov edx,[params] |
mov edx, [edx+4] ;app_path |
984,7 → 986,7 |
jc @f |
cmp eax, [SLOT_BASE+APPDATA.mem_size+ebx*8] |
ja @f |
stdcall k_strncpy, edx, [app_path], 1024 |
stdcall strncpy, edx, [app_path], 1024 |
@@: |
mov ebx,[slot] |
mov eax,ebx |
/kernel/trunk/drivers/imports.inc |
---|
145,6 → 145,26 |
if used GetTimerTicks |
extrn GetTimerTicks |
end if |
if used strncat |
extrn strncat |
end if |
if used strncpy |
extrn strncpy |
end if |
if used strncmp |
extrn strncmp |
end if |
if used strnlen |
extrn strnlen |
end if |
if used strchr |
extrn strchr |
end if |
if used strrchr |
extrn strrchr |
end if |
if used LFBAddress |
extrn LFBAddress |
end if |
/kernel/trunk/init.inc |
---|
71,12 → 71,13 |
or ebx, CR4_PSE |
mov eax, PG_LARGE+PG_SW |
bt [cpu_caps-OS_BASE], CAPS_PGE |
jnc @F |
; bt [cpu_caps-OS_BASE], CAPS_PGE |
; jnc @F |
or eax, PG_GLOBAL |
or ebx, CR4_PGE |
@@: |
; or eax, PG_GLOBAL |
; or ebx, CR4_PGE |
; |
;@@: |
mov cr4, ebx |
dec [pg_data.kernel_tables-OS_BASE] |
122,15 → 123,8 |
mov edi, (sys_pgdir-OS_BASE) |
lea esi, [edi+(OS_BASE shr 20)] |
lodsd |
and eax, not PG_GLOBAL |
stosd |
lodsd |
and eax, not PG_GLOBAL |
stosd |
lodsd |
and eax, not PG_GLOBAL |
stosd |
movsd |
movsd |
ret |
endp |
/kernel/trunk/kernel.asm |
---|
277,10 → 277,19 |
mov fs,bx |
mov gs,bx |
mov dword [sys_pgdir], 0 |
mov dword [sys_pgdir+4], 0 |
mov dword [sys_pgdir+8], 0 |
bt [cpu_caps], CAPS_PGE |
jnc @F |
or dword [sys_pgdir+(OS_BASE shr 20)], PG_GLOBAL |
mov ebx, cr4 |
or ebx, CR4_PGE |
mov cr4, ebx |
@@: |
xor eax, eax |
mov dword [sys_pgdir], eax |
mov dword [sys_pgdir+4], eax |
mov eax, cr3 |
mov cr3, eax ; flush TLB |
/kernel/trunk/kernel32.inc |
---|
171,6 → 171,7 |
include "core/taskman.inc" |
include "core/dll.inc" |
include "core/exports.inc" |
include "core/string.inc" |
; GUI stuff |
include "gui/window.inc" |