192 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			192 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
| #include <_ansi.h>
 | |
| #include <sys/types.h>
 | |
| #include <sys/stat.h>
 | |
| #include "sys/syscall.h"
 | |
| int errno;
 | |
| 
 | |
| 
 | |
| 
 | |
| int
 | |
| _read (int file,
 | |
|        char *ptr,
 | |
|        int len)
 | |
| {
 | |
|   return __trap3 (SYS_read, file, ptr, len);
 | |
| }
 | |
| 
 | |
| 
 | |
| int
 | |
| _lseek (int file,
 | |
| 	int ptr,
 | |
| 	int dir)
 | |
| {
 | |
|   return __trap3 (SYS_lseek, file, ptr, dir);
 | |
| }
 | |
| 
 | |
| static
 | |
| writechar (char c)
 | |
| {
 | |
|   asm ("lda %0" : : "r" (c));
 | |
|   asm ("wdm");
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| int
 | |
| _write (
 | |
| 	 int file,
 | |
| 	 char *ptr,
 | |
| 	 int len)
 | |
| {
 | |
|   return __trap3 (SYS_write, file, ptr, len);
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| int
 | |
| _close (int file)
 | |
| {
 | |
|   return __trap3 (SYS_close, file, 0, 0);
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| caddr_t
 | |
| _sbrk (int incr)
 | |
| {
 | |
|   extern char end;		/* Defined by the linker */
 | |
|   static char *heap_end;
 | |
|   char *prev_heap_end;
 | |
| 
 | |
|   if (heap_end == 0)
 | |
|     {
 | |
|       heap_end = &end;
 | |
|     }
 | |
|   prev_heap_end = heap_end;
 | |
|   if (heap_end + incr > stack_ptr)
 | |
|     {
 | |
|       _write (1, "Heap and stack collision\n", 25);
 | |
|       abort ();
 | |
|     }
 | |
| 
 | |
|   heap_end += incr;
 | |
|   return (caddr_t) prev_heap_end;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| int
 | |
| _fstat (int file,
 | |
| 	struct stat *st)
 | |
| {
 | |
|   st->st_mode = S_IFCHR;
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| 
 | |
| int
 | |
| _open (
 | |
| 	char *path,
 | |
| 	int flags)
 | |
| {
 | |
|   return __trap3 (SYS_open, path, flags, 0);
 | |
| }
 | |
| 
 | |
| int
 | |
| _unlink ()
 | |
| {
 | |
|   return -1;
 | |
| }
 | |
| 
 | |
| isatty (fd)
 | |
|      int fd;
 | |
| {
 | |
|   return 1;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| _exit (n)
 | |
| {
 | |
|   return __trap3 (SYS_exit, n, 0, 0);
 | |
| }
 | |
| 
 | |
| 
 | |
| _kill (n, m)
 | |
| {
 | |
|   return __trap3 (SYS_exit, 0xdead, 0, 0);
 | |
| }
 | |
| 
 | |
| 
 | |
| _getpid (n)
 | |
| {
 | |
|   return 1;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| _raise ()
 | |
| {
 | |
| 
 | |
| }
 | |
| 
 | |
| int
 | |
| _stat (const char *path, struct stat *st)
 | |
| 
 | |
| {
 | |
|   return _trap3 (SYS_stat, path, st, 0);
 | |
| }
 | |
| 
 | |
| int
 | |
| _chmod (const char *path, short mode)
 | |
| {
 | |
|   return _trap3 (SYS_chmod, path, mode);
 | |
| }
 | |
| 
 | |
| int
 | |
| _chown (const char *path, short owner, short group)
 | |
| {
 | |
|   return _trap3 (SYS_chown, path, owner, group);
 | |
| }
 | |
| 
 | |
| int
 | |
| _utime (path, times)
 | |
|      const char *path;
 | |
|      char *times;
 | |
| {
 | |
|   return _trap3 (SYS_utime, path, times);
 | |
| }
 | |
| 
 | |
| int
 | |
| _fork ()
 | |
| {
 | |
|   return _trap3 (SYS_fork);
 | |
| }
 | |
| 
 | |
| int
 | |
| _wait (statusp)
 | |
|      int *statusp;
 | |
| {
 | |
|   return _trap3 (SYS_wait);
 | |
| }
 | |
| 
 | |
| int
 | |
| _execve (const char *path, char *const argv[], char *const envp[])
 | |
| {
 | |
|   return _trap3 (SYS_execve, path, argv, envp);
 | |
| }
 | |
| 
 | |
| int
 | |
| _execv (const char *path, char *const argv[])
 | |
| {
 | |
|   return _trap3 (SYS_execv, path, argv);
 | |
| }
 | |
| 
 | |
| int
 | |
| _pipe (int *fd)
 | |
| {
 | |
|   return _trap3 (SYS_pipe, fd);
 | |
| }
 |