diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2017-12-15 09:38:53 -0500 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2017-12-15 09:39:34 -0500 |
commit | f95a4a932476be2ba99e2fd081e8d2bc6ea12813 (patch) | |
tree | 75f67192cb2d7b7b575c94edda318e475239b63c /newlib/libc/sys/z8ksim/glue.c | |
parent | f60aca96985e68c7d8a52eb7bc955fb80e132f73 (diff) |
Import newlib and create makefile
Diffstat (limited to 'newlib/libc/sys/z8ksim/glue.c')
-rw-r--r-- | newlib/libc/sys/z8ksim/glue.c | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/newlib/libc/sys/z8ksim/glue.c b/newlib/libc/sys/z8ksim/glue.c new file mode 100644 index 0000000..b3b0bab --- /dev/null +++ b/newlib/libc/sys/z8ksim/glue.c @@ -0,0 +1,156 @@ +#include "sys/syscall.h" +#include <sys/types.h> +#include <sys/stat.h> +#include <_ansi.h> +#include <errno.h> + +extern char _start_heap; +extern char _end_heap; +extern char _start_bss; +extern char _end_bss; + + +static int argl(long value) +{ + asm("ld r0,%H0" : : "r" (value)); + asm("ld r1,%I0" : : "r" (value)); + asm("sc %0" : : "i" (SYS_ARG)); +} + + +static int argw(value) +{ + asm("ld r1,%H0" : : "r" ( value)); + asm("ld r0,#0"); + asm("sc %0" : : "i" (SYS_ARG)); +} + +static int argp(void *value) +{ +#ifdef __Z8001__ + asm("ld r0,%H0" : : "r" (value)); + asm("ld r1,%I0" : : "r" (value)); +#else + asm("ld r1,%H0" : : "r" ( value)); + asm("ld r0,#0"); +#endif + asm("sc %0" : : "i" (SYS_ARG)); + +} + + + +#define ARGL(n, value) argl(value) +#define ARGW(n, value) argw(value) +#define ARGP(n, value) argp(value) + +#define MACRO(n) asm("sc %0" : : "i" (n)); + +int _read (int fd, char *buf,size_t nbytes) +{ + ARGW(0,fd); + ARGP(1,buf); + ARGP(2,(void *)(nbytes)); + MACRO(SYS_read); +} + +int _write (int fd, char *buf, size_t nbytes) +{ + ARGW(0,fd); + ARGP(1,buf); + ARGP(2,(void *)(nbytes)); + MACRO(SYS_write); +} + +int _open (const char *buf, int flags, int mode) +{ + ARGP(0, buf); + ARGW(1, flags); + ARGW(2, mode); + MACRO(SYS_open); +} + +int _close (int fd) +{ + ARGW(0,fd); + MACRO(SYS_close ); +} + +/* + * sbrk -- changes heap size size. Get nbytes more + * RAM. We just increment a pointer in what's + * left of memory on the board. + */ +caddr_t _sbrk (size_t nbytes) +{ + static char* heap_ptr = NULL; + caddr_t base; + + if (heap_ptr == NULL) { + heap_ptr = (caddr_t)&_start_heap; + } + + if (heap_ptr + nbytes < &_end_heap) { + base = heap_ptr; + heap_ptr += nbytes; + return (heap_ptr); + } else { + errno = ENOMEM; + return ((caddr_t)-1); + } +} + +int isatty (int fd) +{ + ARGW(0,fd); + MACRO(SYS_isatty); +} + +off_t _lseek (int fd, off_t offset, int whence) +{ + ARGW(0,fd); + ARGL(1,offset); + ARGW(2, whence); + MACRO(SYS_lseek); +} + +int _fstat (int fd, struct stat *buf) +{ + ARGW(0,fd); + ARGP(1,buf); + MACRO(SYS_fstat); +} + + + + +int +_exit(int val) +{ + ARGW(0,val); + MACRO(SYS_exit); +} + +time_t _time(time_t *timer) +{ + ARGP(0,timer); + MACRO(SYS_time); +} + +int +_creat (const char *path, int mode) +{ + ARGP(0, path); + ARGW(1, mode); + MACRO(SYS_creat); +} + +_kill(int pid, int val) +{ + _exit(val); +} + +_getpid() +{ + return 1; +} |