forked from KolibriOS/kolibrios
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:
parent
fb3a10620e
commit
e5c041df96
@ -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;
|
|
||||||
}
|
}
|
@ -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;
|
||||||
|
@ -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);
|
||||||
}
|
}
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
@ -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);
|
||||||
}
|
}
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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
|
|
||||||
|
119
programs/develop/metcc/trunk/libc/mesys/_ksys_files_acces.asm
Normal file
119
programs/develop/metcc/trunk/libc/mesys/_ksys_files_acces.asm
Normal 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
|
@ -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;*/
|
|
||||||
}
|
|
@ -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
|
@ -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
|
||||||
|
@ -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++;
|
||||||
|
@ -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
|
Loading…
Reference in New Issue
Block a user