Update Kolibri version of libC library(for usage in TinyC).

Correction of various mistakes in functions of work with files.
For work with files 70 function is used.
Functions for work with memory are changed for use of the new manager of memory. 

git-svn-id: svn://kolibrios.org@610 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
andrew_programmer 2007-08-24 19:49:07 +00:00
parent fb3a10620e
commit e5c041df96
16 changed files with 445 additions and 823 deletions

View File

@ -1,11 +1,9 @@
#include "stdio.h" #include <stdio.h>
#include "string.h" #include <string.h>
int fclose(FILE* file) #include <stdlib.h>
void fclose(FILE* file)
{ {
int res;
res=_msys_write_file(file->filename, 0, file->filesize, file->buffer);
free(file->buffer); free(file->buffer);
free(file->filename);
free(file); free(file);
return res;
} }

View File

@ -1,4 +1,4 @@
#include "stdio.h" #include <stdio.h>
int feof(FILE* file) int feof(FILE* file)
{ {
return file->filepos>=file->filesize; return file->filepos>=file->filesize;

View File

@ -1,7 +1,7 @@
#include "stdio.h" #include <stdio.h>
int fflush(FILE* file) int fflush(FILE* file)
{ {
if ((file->mode & 3)==FILE_OPEN_READ) if ((file->mode & 3)==FILE_OPEN_READ)
return 0; return 0;
return _msys_file_write(file->filename, 0, file->filesize, file->buffer) ? EOF : 0; return(EOF);
} }

View File

@ -1,12 +1,22 @@
#include "stdio.h" #include <stdio.h>
int fgetc(FILE* file) int fgetc(FILE* file)
{ {
if ((file->mode & 3!=FILE_OPEN_READ) && (file->mode & FILE_OPEN_PLUS==0)) dword res;
return EOF;
if ((file->mode & 3!=FILE_OPEN_READ) && (file->mode & FILE_OPEN_PLUS==0)) return EOF;
if (file->filepos>=file->filesize) if (file->filepos>=file->filesize)
return EOF; {
return EOF;
}
else else
{ {
return (int)file->buffer[file->filepos++]; res=_ksys_readfile(file->filename,file->filepos,1,file->buffer);
if (res==0)
{
file->filepos++;
return (int)file->buffer[0];
}
else return(res);
} }
} }

View File

@ -1,142 +1,138 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <stdlib.h>
extern char __argv;
extern char __path;
extern struct{int argc; char** argv;} __ARGS; char* getfullpath(const char *path){
char* getfullpath(const char* relpath){ int i,j,relpath_pos,localpath_size;
byte prev_is_slash=0; int filename_size;
int len=0, depth=0, i; char local_path;
char* buff; char *programpath;
buff = malloc(strlen(__ARGS.argv[0]) + strlen(relpath)); char *newpath;
if(*relpath == '/') buff[0] = '\0';
else { i=0;
len = strrchr(__ARGS.argv[0], '/') - __ARGS.argv[0] + 1; local_path=1; //enable local path
strncpy(buff, __ARGS.argv[0], len); while((*(path+i)!='\0') || (*(path+i)!=0))
prev_is_slash = 1; {
buff[len] = 0; if (*(path+i)=='.')
for(i=0; buff[i]; i++) {
if(buff[i] == '/' && i < len-1) depth++; if (*(path+i+1)=='/')
} { //detected relative path
for (; *relpath; relpath++){ relpath_pos=i+2;
switch (*relpath){ local_path=0;
case '/': break;
prev_is_slash = 1; }
buff[len++] = '/';
break;
case '.':
if(*(relpath+1) == '.' && *(relpath+2) == '/' && prev_is_slash){
if(!depth) return 0;
buff[len-1] = 0;
len = strrchr(buff, '/') + 1 - buff;
buff[len] = 0;
depth--;
relpath += 2;
} else {
depth++;
buff[len++] = '.';
} }
break; if (*(path+i)=='/')
default: { //disabple local path
if(prev_is_slash){ local_path=0;
depth++; return(path);
prev_is_slash = 0;
} }
buff[len++] = *relpath; i++;
break; }
} filename_size=i;
}
buff[len]= '\0'; programpath=&__path;
return buff;
if (local_path==1)
{
i=0x400;
//find local path of program
while(*(programpath+i)!='/')
{
i--;
}
localpath_size=i;
newpath=malloc(0x400);
//copy local path to the new path
for(i=0;i<=localpath_size;i++)
{
*(newpath+i)=*(programpath+i);
}
//copy filename to the new path
for(i=0;i<filename_size;i++)
{
*(newpath+localpath_size+1+i)=*(path+i);
}
return(newpath);
}
//if we here than path is a relative
i=0x400;
//find local path of program
while(*(programpath+i)!='/')
{
i--;
}
localpath_size=i;
i=0;
//find file name size
while((*(path+relpath_pos+i)!='\0') || (*(path+relpath_pos+i)!=0))
{
i++;
}
filename_size=i;
newpath=malloc(0x400);
//copy local path to the new path
for(i=0;i<=localpath_size;i++)
{
*(newpath+i)=*(programpath+i);
}
//copy filename to the new path
for(i=0;i<filename_size;i++)
{
*(newpath+localpath_size+1+i)=*(path+relpath_pos+i);
}
return(newpath);
} }
FILE* fopen(const char* filename, const char *mode) FILE* fopen(const char* filename, const char *mode)
{ {
FILE* res; FILE* res;
int imode; int imode;
imode=0; imode=0;
if (*mode=='r') if (*mode=='r')
{
imode=FILE_OPEN_READ;
mode++;
}else if (*mode=='w')
{
imode=FILE_OPEN_WRITE;
mode++;
}else if (*mode=='a')
{
imode=FILE_OPEN_APPEND;
mode++;
}else
return 0;
if (*mode=='t')
{
imode|=FILE_OPEN_TEXT;
mode++;
}else if (*mode=='b')
mode++;
if (*mode=='+')
{
imode|=FILE_OPEN_PLUS;
mode++;
}
if (*mode!=0)
return 0;
res=malloc(sizeof(FILE));
res->buffer=0;
res->buffersize=0;
res->filesize=0;
res->filepos=0;
res->mode=imode;
res->filename=getfullpath(filename);
//check if file exists
res=_msys_read_file(res->filename, 0, 0, 0, &res->filesize);
if (res==5)
{ {
if ((imode & 3) == FILE_OPEN_READ) imode=FILE_OPEN_READ;
{ mode++;
free(res->filename); }else if (*mode=='w')
free(res);
return 0;
}
res=_msys_create_file(res->filename);
if (res!=0)
{
free(res->filename);
free(res);
return 0;
}
res->filesize=0;
}
if (imode & 3==FILE_OPEN_WRITE)
{ {
res->buffersize=512; imode=FILE_OPEN_WRITE;
res->buffer=malloc(res->buffersize); mode++;
if (res->buffer=0) }else if (*mode=='a')
{ {
free(res->filename); imode=FILE_OPEN_APPEND;
free(res); mode++;
return 0;
}
res->filesize=0;
}else }else
return 0;
if (*mode=='t')
{ {
res->buffersize=(res->filesize & (~511))+512; imode|=FILE_OPEN_TEXT;
res->buffer=malloc(res->buffersize); mode++;
if (res->buffer==0) }else if (*mode=='b')
{ mode++;
free(res); if (*mode=='+')
return 0; {
} imode|=FILE_OPEN_PLUS;
res=_msys_read_file(res->filename,0,res->filesize,res->buffer,0); mode++;
if (res!=0)
{
free(res->buffer);
free(res);
}
if (imode & 3==FILE_OPEN_APPEND)
res->filepos=res->filesize;
} }
return res; if (*mode!=0)
return 0;
res=malloc(sizeof(FILE));
res->buffer=malloc(256);
res->buffersize=256;
res->filesize=0;
res->filepos=0;
res->mode=imode;
res->filename=getfullpath(filename);
if ((imode==FILE_OPEN_READ) || (imode==FILE_OPEN_APPEND))
{
res->filesize=_ksys_get_filesize(res->filename);
}
return res;
} }

View File

@ -1,24 +1,35 @@
#include "stdio.h" #include "stdio.h"
int fputc(int c,FILE* file) int fputc(int c,FILE* file)
{ {
void* p; dword res;
if ((file->mode & 3)==FILE_OPEN_READ)
return EOF; if ((file->mode & 3)==FILE_OPEN_READ) return EOF;
file->buffer[0]=c;
if ((file->mode & 3)==FILE_OPEN_APPEND) if ((file->mode & 3)==FILE_OPEN_APPEND)
file->filepos=file->filesize;
if (file->filepos==file->filesize)
{ {
file->filepos=file->filesize;
file->filesize++; file->filesize++;
if (file->filesize>file->buffersize) res=_ksys_appendtofile(file->filename,file->filepos,1,file->buffer);
{ if (res!=0) return(res);
p=realloc(file->buffer,file->filesize+file->filesize<<1); file->filepos++;
if (p==0) return(0);
return EOF; }
file->buffersize=file->filesize+file->filesize<<1; if ((file->mode & 3)==FILE_OPEN_WRITE)
file->buffer=p; {
if (file->filepos==0)
{ //file not craeted
res=_ksys_rewritefile(file->filename,1,file->buffer);
if (res!=0) return(res);
file->filepos++;
return 0;
}
else
{ //file craeted and need append one byte
res=_ksys_appendtofile(file->filename,file->filepos,1,file->buffer);
if (res!=0) return(res);
file->filepos++;
return 0;
} }
} }
file->buffer[file->filepos]=(char)c;
file->filepos++;
return 0;
} }

View File

@ -1,12 +1,25 @@
#include "stdio.h" #include <stdio.h>
int fread(void* buffer,int size,int count,FILE* file) #include <mesys.h>
int fread(void *buffer,int size,int count,FILE* file)
{ {
if ((file->mode & 3!=FILE_OPEN_READ) && (file->mode & FILE_OPEN_PLUS==0)) dword res;
return 0; dword fullsize;
count=count*size;
if (count+file->filepos>file->filesize) if ((file->mode & 3!=FILE_OPEN_READ) && (file->mode & FILE_OPEN_PLUS==0)) return 0;
count=file->filesize-file->filepos;
memcpy(buffer,file->buffer+file->filepos,count); fullsize=count*size;
file->filepos+=count; if ((fullsize+file->filepos)>(file->filesize))
return count/size; {
fullsize=file->filesize-file->filepos;
if (fullsize<=0) return(0);
}
res=_ksys_readfile(file->filename,file->filepos,fullsize,buffer);
if (res==0)
{
file->filepos=file->filepos+fullsize;
fullsize=fullsize/size;
return(fullsize);
}
else return 0;
} }

View File

@ -1,23 +1,57 @@
#include "stdio.h" #include <stdio.h>
int fwrite(const void* buffer,int size,int count,FILE* file) #include <mesys.h>
int fwrite(void *buffer,int size,int count,FILE* file)
{ {
void* p; dword res;
if ((file->mode & 3==FILE_OPEN_READ) && (file->mode & FILE_OPEN_PLUS==0)) dword fullsize;
return 0;
if ((file->mode & 3==FILE_OPEN_READ) && (file->mode & FILE_OPEN_PLUS==0)) return 0;
if (file->mode & 3==FILE_OPEN_APPEND) if (file->mode & 3==FILE_OPEN_APPEND)
file->filepos=file->filesize; file->filepos=file->filesize;
count=count*size; fullsize=count*size;
if (file->buffersize<file->filepos+count)
if ((file->filesize)<(file->filepos+fullsize)) file->filesize=file->filepos+fullsize;
if (file->mode & 3==FILE_OPEN_APPEND)
{ {
p=realloc(file->buffer,(file->filepos+count)+(file->filepos+count)<<1); file->filepos==file->filesize;
if (p==0) res=_ksys_appendtofile(file->filename,file->filepos,fullsize,buffer);
return 0; if (res==0)
file->buffer=p; {
file->buffersize=(file->filepos+count)+(file->filepos+count)<<1; file->filepos+=fullsize;
fullsize=fullsize/size;
return(fullsize);
}
else return(0);
} }
if (file->filesize<file->filepos+count)
file->filesize=file->filepos+count; if (file->mode & 3==FILE_OPEN_WRITE)
memcpy(file->buffer+file->filepos,buffer,count); {
file->filepos+=count; if (file->filepos==0)
return count; { //file mot craeted yet
res=_ksys_rewritefile(file->filename,fullsize,buffer);
if (res==0)
{
file->filepos+=fullsize;
fullsize=fullsize/count;
return(fullsize);
}
else return(0);
}
else
{
res=_ksys_appendtofile(file->filename,file->filepos,fullsize,buffer);
if (res==0)
{
file->filepos+=fullsize;
fullsize=fullsize/count;
return(fullsize);
}
else return(0);
}
}
else return(0);
} }

View File

@ -1,11 +1,17 @@
#include "stdio.h" #include "stdio.h"
int ungetc(int c,FILE* file) int ungetc(int c,FILE* file)
{ {
dword res;
if (c==EOF) if (c==EOF)
return EOF; return EOF;
if (file->filepos<=0 || file->filepos>file->filesize) if (file->filepos<=0 || file->filepos>file->filesize)
return EOF; return EOF;
file->filepos--; file->filepos--;
file->buffer[file->filepos]=(char)c; res=_ksys_readfile(file->filename,file->filepos,1,file->buffer);
return c; if (res==0)
{
return(c);
}
else return(EOF);
} }

View File

@ -1,536 +1,41 @@
format ELF format ELF
include "proc32.inc"
section '.text' executable section '.text' executable
public malloc public malloc
public free public free
public realloc public realloc
public mf_init
;multithread: ;uncomment this for thread-safe version
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Memory allocator for MenuetOS ;;
;; Halyavin Andrey halyavin@land.ru, 2006 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; align 4
;; allocated mem block structure ;; proc malloc stdcall, size:dword
;; +0: bit 0 - used flag ;;
;; bits 31..1 - block size ;;
;; +4: address of prev block ;;
;; +8 .. +(blocksize) - allocated memory ;;
;; +(blocksize) - next block ;;
;; ;;
;; free mem block structure ;;
;; +0: bit 0 - used flag ;;
;; bits 31..1 - block size ;;
;; +4: address of prev block ;;
;; +8: prev free block ;;
;; +12: next free block ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
memblock.size=0
memblock.prevblock=4
memblock.prevfreeblock=8
memblock.nextfreeblock=12
mov eax,68
mov ebx,12
mov ecx,[size]
int 0x40
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ret
;; mf_init ;; endp
;; Initialize memory map for dynamic use ;;
;; input: eax: starting address or 0 ;;
;; output: none ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mf_init:
push ebx
push ecx
test eax,eax
jnz .noautodet
sub esp,1024
mov ebx,esp
mov ecx,-1
mov eax,9
int 0x40
mov eax,[esp+26]
add esp,1024
.noautodet:
add eax,15
and eax,not 15
mov [heapsmallblocks],eax
add eax,2048
mov [heapstart],eax
mov [heapfreelist],eax
mov [heaplastblock],eax
mov ecx,eax align 4
if defined heapstartsize proc free stdcall, pointer:dword
add ecx,heapstartsize
else
add ecx,4096
end if
add ecx,4095
and ecx,not 4095
push eax
mov eax,64
mov ebx,1
int 0x40
pop eax
mov [eax+memblock.prevblock],dword 0
mov [heapend],ecx
mov [eax+memblock.size],ecx
sub [eax+memblock.size],eax
xor ebx,ebx
mov dword [eax+memblock.prevfreeblock],heapfreelist-memblock.nextfreeblock
mov [eax+memblock.nextfreeblock],ebx
mov [heapmutex],ebx
push edi
mov edi,[heapsmallblocks]
mov ecx,512
xor eax,eax
rep stosd
pop edi
pop ecx
pop ebx
ret
if defined multithread mov eax,68
heaplock: mov ebx,13
push eax mov ecx,[pointer]
push ebx int 0x40
push ecx
mov eax,68
mov ebx,1
.loop:
xchg ecx,[heapmutex]
test ecx,ecx
jz .endloop
int 0x40 ;change task
jmp .loop
.endloop:
pop ecx
pop ebx
pop eax
ret
heapunlock: ret
mov [heapmutex],dword 0 endp
ret
end if
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; align 4
;; heap_split_block ;; proc realloc stdcall, pointer:dword, size:dword
;; Split free block to allocated block and free one. ;;
;; input: ;;
;; eax - size of allocated block ;;
;; ebx - block ;;
;; output: ;;
;; eax - real size of allocated block ;;
;; ebx - pointer to new block ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
heap_split_block:
push ecx
mov ecx,[ebx+memblock.size]
sub ecx,16
cmp ecx,eax
jge .norm
inc dword [ebx+memblock.size]
mov eax,ecx
xor ebx,ebx
pop ecx
ret
.norm:
add ecx,16
mov [ebx+memblock.size],eax
inc dword [ebx+memblock.size]
mov [ebx+eax+memblock.prevblock],ebx
add ebx,eax
sub ecx,eax
mov [ebx+memblock.size],ecx
mov ecx,eax
mov eax,ebx
call heap_fix_right
mov eax,ecx
pop ecx
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mov ebx,20
;; heap_add_free_block ;; mov eax,68
;; Add free block to one of free block lists. ;; mov ecx,[size]
;; input: ;; mov edx,[pointer]
;; eax - address of free block ;; int 0x40
;; output: ;;
;; none ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
heap_add_free_block:
cmp dword [eax+memblock.size],4096
push ebx
jge .bigblock
mov ebx,[eax+memblock.size]
shr ebx,1
add ebx,[heapsmallblocks]
push dword [ebx]
pop dword [eax+memblock.nextfreeblock]
mov [ebx],eax
mov dword [eax+memblock.prevfreeblock],ebx
sub dword [eax+memblock.prevfreeblock],memblock.nextfreeblock
mov ebx,[eax+memblock.nextfreeblock]
test ebx,ebx
jz .no_next_block
mov [ebx+memblock.prevfreeblock],eax
.no_next_block:
pop ebx
ret
.bigblock:
mov ebx,[heapfreelist]
mov [eax+memblock.nextfreeblock],ebx
mov [heapfreelist],eax
mov dword [eax+memblock.prevfreeblock],heapfreelist-memblock.nextfreeblock
; mov ebx,[eax+memblock.nextfreeblock]
test ebx,ebx
jz .no_next_big_block
mov [ebx+memblock.prevfreeblock],eax
.no_next_big_block:
pop ebx
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ret
;; heap_remove_block ;; endp
;; Remove free block from the list of free blocks. ;;
;; input: ;;
;; eax - free block ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
heap_remove_block:
push ebx
push ecx
mov ecx,[eax+memblock.prevfreeblock]
mov ebx,[eax+memblock.nextfreeblock]
mov [ecx+memblock.nextfreeblock],ebx
test ebx,ebx
jz .no_next_block
mov [ebx+memblock.prevfreeblock],ecx
.no_next_block:
pop ecx
pop ebx
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; mf_alloc
;; allocates a block of memory in heap
;; intput: eax: size of block
;; output: eax: address of allocated memory block or 0 if there's no mem.
;; allocator will not create new nodes that contain less that 8b of space,
;; and minimal allocation is actually 16 bytes - 8 for node and 8 for user.
;; allocator will never create non-aligned memory blocks.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mf_alloc:
test eax,eax
jg .not_null ; test that we are not allocating null size block
xor eax,eax
ret
.not_null:
if defined multithread
call heaplock
end if
push edi
; push edx
push ecx
push ebx
add eax,7
and eax,not 7 ; make sure that block size is aligned
lea edi,[eax+8] ; desired block size
cmp edi,4096
jge .general_cycle
mov ebx,[heapsmallblocks]
xor ecx,ecx
shr edi,1
.smallloop:
cmp [ebx+edi],ecx
jnz .smallblockfound
add edi,4
cmp edi,2048
jl .smallloop
lea edi,[eax+8]
jmp .general_cycle
.smallblockfound:
lea ecx,[eax+8]
mov eax,[ebx+edi]
call heap_remove_block
mov ebx,eax
xchg eax,ecx
call heap_split_block
test ebx,ebx
jz .perfect_small_block
mov eax,ebx
call heap_add_free_block
.perfect_small_block:
lea eax,[ecx+8]
jmp .ret
.general_cycle:
;edi - size needed
mov eax,[heapfreelist]
.loop:
test eax,eax
jz .new_mem
cmp [eax+memblock.size],edi
jge .blockfound
mov eax,[eax+memblock.nextfreeblock]
jmp .loop
.blockfound:
call heap_remove_block
mov ebx,eax
mov ecx,eax
mov eax,edi
call heap_split_block
test ebx,ebx
jz .perfect_block
mov eax,ebx
call heap_add_free_block
.perfect_block:
lea eax,[ecx+8]
.ret:
if defined multithread
call heapunlock
end if
pop ebx
pop ecx
; pop edx
pop edi
ret
.new_mem:
mov eax,edi
add eax,4095
and eax,not 4095
mov ecx,[heapend]
add [heapend],eax
push eax
mov eax,64
push ebx
push ecx
mov ecx,[heapend]
mov ebx,1
int 0x40
pop ecx
pop ebx
pop eax
mov [ecx+memblock.size],eax
mov eax,[heaplastblock]
mov [ecx+memblock.prevblock],eax
mov [heaplastblock],ecx
mov eax,ecx
call heap_add_free_block
jmp .general_cycle
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; heap_fix_right ;;
;; input: ;;
;; eax - pointer to free block ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
heap_fix_right:
push ebx
mov ebx,eax
add ebx,[eax+memblock.size]
cmp ebx,[heapend]
jz .endblock
mov [ebx+memblock.prevblock],eax
pop ebx
ret
.endblock:
mov [heaplastblock],eax
pop ebx
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; heap_merge_left ;;
;; input: ;;
;; eax - pointer to free block ;;
;; output: ;;
;; eax - pointer to merged block ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
heap_merge_left:
push ebx
mov ebx,[eax+memblock.prevblock]
test ebx,ebx
jz .ret
test byte [ebx+memblock.size],1
jnz .ret
xchg eax,ebx
call heap_remove_block
mov ebx,[ebx+memblock.size]
add [eax+memblock.size],ebx
call heap_fix_right
.ret:
pop ebx
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; heap_merge_right ;;
;; input: ;;
;; eax - pointer to free block ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
heap_merge_right:
push ebx
mov ebx,eax
add ebx,[eax+memblock.size]
cmp ebx,[heapend]
jz .ret
test byte [ebx+memblock.size],1
jnz .ret
xchg eax,ebx
call heap_remove_block
xchg eax,ebx
mov ebx,[ebx+memblock.size]
add [eax+memblock.size],ebx
call heap_fix_right
.ret:
pop ebx
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; mf_free ;;
;; input: ;;
;; eax - pointer ;;
;; output: ;;
;; eax=1 - ok ;;
;; eax=0 - failed ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mf_free:
test eax,eax
jnz .no_null
inc eax
ret
.no_null:
if defined multithread
call heaplock
end if
sub eax,8
dec dword [eax+memblock.size]
call heap_merge_left
call heap_merge_right
call heap_add_free_block
.ret:
if defined multithread
call heapunlock
end if
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; heap_try_reloc
;; input:
;; eax - address
;; ebx - new size
;; output:
;; ebx=1 - ok
;; ebx=0 - failed
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
heap_try_reloc:
push eax
sub eax,8
add ebx,15
dec dword [eax+memblock.size]
and ebx,not 7
cmp [eax+memblock.size],ebx
jge .truncate
push ebx
mov ebx,eax
add ebx,[eax+memblock.size]
cmp ebx,[heapend]
jz .fail ;todo: we can allocate new mem here
test [ebx+memblock.size],byte 1
jnz .fail
xchg eax,ebx
call heap_remove_block
mov eax,[eax+memblock.size]
add [ebx+memblock.size],eax
mov eax,ebx
call heap_fix_right
pop ebx
.truncate:
xchg eax,ebx
call heap_split_block
test ebx,ebx
jz .no_last_block
mov eax,ebx
call heap_add_free_block
call heap_merge_right
.no_last_block:
xor ebx,ebx
pop eax
inc ebx
ret
.fail:
pop ebx
xor ebx,ebx
pop eax
inc dword [eax-8+memblock.size]
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; mf_realloc
;; input:
;; eax - pointer
;; ebx - new size
;; output:
;; eax - new pointer
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mf_realloc:
push ebx
if defined multithread
call heaplock
end if
call heap_try_reloc
test ebx,ebx
jnz .ret
;allocate new memory
push eax
mov eax,[esp+4]
call mf_alloc
test eax,eax
jz .fail
push esi
push edi
push ecx
mov edi,eax
mov esi,[esp+12]
mov ecx,[esi-8+memblock.size]
shr ecx,2
rep movsd
pop ecx
pop edi
pop esi
xchg eax,[esp]
call mf_free
.fail:
pop eax
.ret:
if defined multithread
call heapunlock
end if
pop ebx
ret
;C entries
malloc:
mov eax,[esp+4]
call mf_alloc
ret
free:
mov eax,[esp+4]
call mf_free
ret
realloc:
mov edx,ebx
mov eax,[esp+4]
mov ebx,[esp+8]
call mf_realloc
mov ebx,edx
ret
section '.bss' writeable
heapsmallblocks rd 1
heapstart rd 1
heapend rd 1
heapfreelist rd 1
heapmutex rd 1
heaplastblock rd 1

View File

@ -0,0 +1,119 @@
format ELF
section '.text' executable
include 'proc32.inc'
public _ksys_get_filesize
public _ksys_readfile
public _ksys_rewritefile
public _ksys_appendtofile
align 4
proc _ksys_get_filesize stdcall, filename:dword
xor eax,eax
mov ebx,[filename]
mov [fileinfo.subproc],dword 5
mov [fileinfo.offset_l],eax
mov [fileinfo.offset_h],eax
mov [fileinfo.size],eax
mov [fileinfo.data],dword buffer_for_info
mov [fileinfo.letter],al
mov [fileinfo.filename],ebx
mov eax,70
mov ebx,fileinfo
int 0x40
test eax,eax
jnz error_for_file_size
mov eax,[buffer_for_info+32] ;file size
error_for_file_size:
ret
endp
align 4
proc _ksys_readfile stdcall,filename:dword,position:dword,sizeblock:dword,buffer:dword
xor eax,eax
mov ebx,[position]
mov ecx,[sizeblock]
mov edx,[buffer]
mov esi,[filename]
mov [fileinfo.subproc],eax
mov [fileinfo.offset_l],ebx
mov [fileinfo.offset_h],eax
mov [fileinfo.size],ecx
mov [fileinfo.data],edx
mov [fileinfo.letter],al
mov [fileinfo.filename],esi
mov eax,70
mov ebx,fileinfo
int 0x40
ret
endp
align 4
proc _ksys_rewritefile stdcall,filename:dword,sizeblock:dword,data_write:dword
xor eax,eax
mov ebx,[sizeblock]
mov ecx,[data_write]
mov edx,[filename]
mov [fileinfo.subproc],dword 2
mov [fileinfo.offset_l],eax
mov [fileinfo.offset_h],eax
mov [fileinfo.size],ebx
mov [fileinfo.data],ecx
mov [fileinfo.letter],al
mov [fileinfo.filename],edx
mov eax,70
mov ebx,fileinfo
int 0x40
ret
endp
align 4
proc _ksys_appendtofile stdcall,filename:dword,pos:dword,sizeblock:dword,data_append:dword
xor eax,eax
mov ebx,[pos]
mov ecx,[sizeblock]
mov edx,[data_append]
mov esi,[filename]
mov [fileinfo.subproc],dword 3
mov [fileinfo.offset_l],ebx
mov [fileinfo.offset_h],eax
mov [fileinfo.size],ecx
mov [fileinfo.data],edx
mov [fileinfo.letter],al
mov [fileinfo.filename],esi
mov eax,70
mov ebx,fileinfo
int 0x40
ret
endp
struc FILEIO
{
.subproc rd 1
.offset_l rd 1
.offset_h rd 1
.size rd 1
.data rd 1
.letter rb 1
.filename rd 1
}
fileinfo FILEIO
buffer_for_info rd 11

View File

@ -1,97 +0,0 @@
#include <stdio.h>
#include <mesys.h>
typedef struct{
dword subproc ;//* +0: dword: íîìåð ïîäôóíêöèè
int offset_l ;//* +4: dword: ñìåùåíèå â ôàéëå
int offset_h ;//* +8: dword: ñòàðøèé dword ñìåùåíèÿ (äîëæåí áûòü 0) èëè ïîëå ôëàãîâ
int size ;//* +12 = +0xC: dword: ðàçìåð
void* data ;//* +16 = +0x10: dword: óêàçàòåëü íà äàííûå
char letter ;//* +20 = +0x14: n db: ASCIIZ-ñòðîêà ñ èìåíåì ôàéëà
char* name ;// èëè
//* +20 = +0x14: db 0
//* +21 = +0x15: dd óêàçàòåëü íà ASCIIZ-ñòðîêó ñ èìåíåì ôàéëà
} mesys_file;
int stdcall _msys_read_file(char* filename, int fileoffset,int
size,void* data, int* filesize)
{
mesys_file file;
int res;
file.subproc = 0;
file.letter = 0;
file.offset_h = 0;
file.offset_l = fileoffset;
file.size = size;
file.name = filename;
file.data = data;
asm("movl $70,%eax");
asm("movl file,%ebx");
asm("int $0x40");
asm("movl %eax, res");
asm("movl %ebx, size");
if(res==0)
{
if(filesize) filesize = size;
return 0;
}else return res;
}
int stdcall _msys_write_file(char* filename,int fileoffset, int size, void* data)
{
mesys_file file;
file.subproc = 3;
file.letter = 0;
file.offset_h = 0;
file.offset_l = fileoffset;
file.size = size;
file.name = filename;
file.data = data;
asm("movl $70,%eax");
asm("movl file,%ebx");
asm("int $0x40");
}
void stdcall _msys_run_program(char* filename,char* parameters)
{
mesys_file file;
file.subproc = 7;
file.letter = 0;
file.offset_h = parameters;
file.offset_l = 0;
file.size = 0;
file.name = filename;
file.data = 0;
asm("movl $70,%eax");
asm("movl file,%ebx");
asm("int $0x40");
}
int stdcall _msys_create_file(char* filename)
{
mesys_file file;
file.subproc = 2;
file.letter = 0;
file.offset_h = 0;
file.offset_l = 0;
file.size = 0;
file.name = filename;
file.data = (dword)&file;
asm("movl $70,%eax");
asm("movl file,%ebx");
asm("int $0x40");
/* asm("movl %eax, 0(res)");
asm("movl %ebx, 0(size)");
return res;*/
}

View File

@ -1,7 +1,15 @@
format ELF format ELF
include "public_stdcall.inc"
include "proc32.inc"
section '.text' executable section '.text' executable
public_stdcall _msys_get_system_clock,0 public _msys_get_system_clock
mov eax,3
int 0x40 align 4
ret proc _msys_get_system_clock stdcall
mov eax,3
int 0x40
ret
endp

View File

@ -1,12 +1,19 @@
format ELF format ELF
include "public_stdcall.inc"
include "proc32.inc"
section '.text' executable section '.text' executable
public_stdcall _msys_debug_out,4
;arg1 - char to out public _msys_debug_out
push ebx
mov ecx,[esp+8] align 4
proc _msys_debug_out stdcall, c:byte
xor ecx,ecx
mov cl,byte[c]
mov ebx,1 mov ebx,1
mov eax,63 mov eax,63
int 0x40 int 0x40
pop ebx ret
ret 4
endp

View File

@ -1,7 +1,7 @@
#include "mesys.h" #include <mesys.h>
void debug_out_str(char* str) void debug_out_str(char* str)
{ {
while (*str!='\0') while ((*str!='\0') || (*str!=0))
{ {
_msys_debug_out(*str); _msys_debug_out(*str);
str++; str++;

View File

@ -1,17 +1,29 @@
format ELF format ELF
include "public_stdcall.inc"
include "proc32.inc"
section '.text' executable section '.text' executable
public_stdcall _msys_get_key,0
public _msys_get_key
public _msys_set_keyboard_mode
align 4
proc _msys_get_key stdcall
mov eax,2 mov eax,2
int 0x40 int 0x40
ret ret
public_stdcall _msys_set_keyboard_mode,4 endp
;arg1 - mode
align 4
proc _msys_set_keyboard_mode stdcall, mode:dword
mov edx,ebx mov edx,ebx
mov eax,66 mov eax,66
xor ebx,ebx xor ebx,ebx
inc ebx inc ebx
mov ecx,[esp+4] mov ecx,[mode]
mov ebx,edx mov ebx,edx
ret 4 ret
endp