132 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			132 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
| /* Operating system  and traps for mvme187bug, the motorolola BUG
 | |
|    monitor for m88k */
 | |
| 
 | |
| #include <sys/types.h>
 | |
| #include <sys/stat.h>
 | |
| #include <sys/times.h>
 | |
| #include <errno.h>
 | |
| 
 | |
| #include "sys/systraps.h"
 | |
| 
 | |
| static void writechar(int c) {
 | |
|   register int n asm ("r2");
 | |
|   n = c;
 | |
|   SYSTRAP(OUTCHR);
 | |
|   return;
 | |
| }
 | |
| 
 | |
| static int readchar(void) {
 | |
|   register int n asm ("r2");
 | |
|   SYSTRAP(INCHR);
 | |
|   return(n);
 | |
| }
 | |
| 
 | |
| int read(int file, char *ptr, int len) {
 | |
|   int todo;
 | |
| 
 | |
|   for (todo = len; todo; --todo) {
 | |
|     *ptr++ = readchar();
 | |
|   }
 | |
| 
 | |
|   return(len);
 | |
| }
 | |
| 
 | |
| int lseek(int file, int ptr, int dir) {
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| int write(int file, char *ptr, int len) {
 | |
|   int todo;
 | |
|   
 | |
|   for (todo = len; todo; --todo) {
 | |
|     writechar(*ptr++);
 | |
|   }
 | |
|   return(len);
 | |
| }
 | |
| 
 | |
| int close(int file) {
 | |
|   return(-1);
 | |
| }
 | |
| 
 | |
| 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 isatty(int file) {
 | |
|   return(1);
 | |
| }
 | |
| 
 | |
| int fstat(int file, struct stat *st) {
 | |
|   st->st_mode = S_IFCHR;
 | |
|   return(0);
 | |
| }
 | |
| 
 | |
| int stat(char *__restrict filename, struct stat *__restrict st) {
 | |
|   st->st_mode = S_IFCHR;
 | |
|   return(0);
 | |
| }
 | |
| 
 | |
| int open(const char *path, int flags) {
 | |
|   return(0);
 | |
| }
 | |
| 
 | |
| 
 | |
| int _exit() {
 | |
|   SYSTRAP(RETURN);
 | |
| }
 | |
| 
 | |
| int execve(char *name, char **argv, char **env) {
 | |
|   errno = ENOMEM;
 | |
|   return(-1);
 | |
| }
 | |
| 
 | |
| int fork() {
 | |
|   errno = EAGAIN;
 | |
|   return(-1);
 | |
| }
 | |
| 
 | |
| int getpid() {
 | |
|   return(1);
 | |
| }
 | |
| 
 | |
| int kill(int pid, int sig) {
 | |
|   errno = EINVAL;
 | |
|   return(-1);
 | |
| }
 | |
| 
 | |
| int link(char *old, char *new) {
 | |
|   errno = EMLINK;
 | |
|   return(-1);
 | |
| }
 | |
| 
 | |
| clock_t times(struct tms *buf) {
 | |
|   return(-1);
 | |
| }
 | |
| 
 | |
| int unlink(char *name) {
 | |
|   errno = ENOENT;
 | |
|   return(-1);
 | |
| }
 | |
| 
 | |
| int wait(int *status) {
 | |
|   errno = ECHILD;
 | |
|   return(-1);
 | |
| }
 | |
| 
 | |
| /* end of syscalls.c */
 |