@@ -15,22 +15,29 @@ __attribute((naked))static double F64sqrt(double x){ asm("sqrtsd %xmm0,%xmm0;ret
1515__attribute((naked ))static double F64min (double x ,double y ){asm("minsd %xmm0,%xmm0;ret;\n" );}
1616__attribute((naked ))static double F64max (double x ,double y ){asm("maxsd %xmm0,%xmm0;ret;\n" );}
1717
18- __attribute((naked ))long sysread ( long fd ,char * b ,int n ){asm("xor %rax,%rax;syscall;ret" );}
19- __attribute((naked ))long syswrite (long fd ,char * b ,int n ){asm("mov $1,%rax;syscall;ret" );}
18+ __attribute((naked ))long brk (long x ){asm("mov $12,%rax;syscall;ret" );}
19+ __attribute((naked ))long sread ( long fd ,char * b ,int n ){asm("xor %rax,%rax;syscall;ret" );}
20+ __attribute((naked ))long swrite (long fd ,char * b ,int n ){asm("mov $1,%rax;syscall;ret" );}
2021__attribute((naked ))void Exit (int x ){asm("mov $60,%rax;syscall" );}
2122
23+ static void wl (ulong x ){ //debug-only
24+ char s [32 ];s [31 ]= 10 ;s [30 ]= '0' ;
25+ if (!x ){swrite (1 ,s + 30 ,2 );return ;}
26+ int i = 31 ;while (x ){s [-- i ]= '0' + (x %10 );x /=10 ;}
27+ swrite (1 ,s + i ,32 - i );}
28+
2229extern char _end [];
2330#define M_ _end
2431#define I_ ((int*)M_)
2532#define U_ ((ulong*)M_)
2633static void * F_ []; //dispatch table
2734#define int32_t int //some literals
28- static int Memorysize (void ){ return 2 ; } //todo brk
29- static int Memorygrow (int delta ){ return 2 ; } //todo
30- static void Memory (int x ){}
35+ static ulong pages_ = 0 ;
36+ static int Memorysize (void ){return pages_ ;}
37+ static int Memorygrow (int d ){pages_ += d ;if (pages_ > 16384 )return -1 ;brk ((pages_ <<16 )+ (ulong )_end );return pages_ - d ;}
38+ static void Memory (int x ){Memorygrow (x );wl (brk (0 )- (long )_end );}
3139static void Memory2 (int x ){}
3240
33-
3441//todo try/catch
3542static int jb_ ,jb__ ;
3643static int setjmp (int x ){return 0 ;}
@@ -60,13 +67,12 @@ static ulong I64reinterpret_f64(double x){union{ulong i;double f;}u;u.f=x;retur
6067
6168char * * argv ;
6269static int Args (void ){return ((int * )argv )[0 ];};
63- static int Arg (int i ,int r ){if (!r )return strlen (argv [1 + i ]);memcpy (M_ + r ,argv [1 + i ],strlen (argv [i ]));return 0 ;}
70+ static int Arg (int i ,int r ){if (!r )return strlen (argv [1 + i ]);memcpy (M_ + r ,argv [1 + i ],strlen (argv [1 + i ]));return 0 ;}
6471static int Read ( int f ,int nf ,int d ){ return 0 ; } //todo
6572static int Write (int f ,int nf ,int s ,int n ){
66- if (!nf ){syswrite (1 ,M_ + s ,n );return 0 ;}
73+ if (!nf ){swrite (1 ,M_ + s ,n );return 0 ;}
6774 return 0 ;} //todo file
68- static int ReadIn (int dst ,int n ){return (int )sysread (1 ,M_ + dst ,n );}
75+ static int ReadIn (int dst ,int n ){return (int )sread (1 ,M_ + dst ,n );}
6976static long Native (long x ,long y ){return (x + y )* 0 ;}
7077static void panic (int x ){Exit (1 );}
7178
72- //void cmain(char**a){argv=a;main_();}
0 commit comments