newlib/libgloss/m68hc11/syscalls.c
Jeff Johnston 2ed0e93ccc 2002-10-18 Stephane Carrez <stcarrez@nerim.fr>
* m68hc11/syscalls.c (sbrk): Use ptrdiff_t for increment parameter.
2002-10-18 20:54:37 +00:00

75 lines
1.7 KiB
C

/* pseudo system calls for M68HC11 & M68HC12.
* Copyright (C) 1999, 2000, 2001, 2002 Stephane Carrez (stcarrez@nerim.fr)
*
* The authors hereby grant permission to use, copy, modify, distribute,
* and license this software and its documentation for any purpose, provided
* that existing copyright notices are retained in all copies and that this
* notice is included verbatim in any distributions. No written agreement,
* license, or royalty fee is required for any of the authorized uses.
* Modifications to this software may be copyrighted by their authors
* and need not follow the licensing terms described here, provided that
* the new terms are clearly indicated on the first page of each file where
* they apply.
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
extern void outbyte(char c);
extern char inbyte(void);
int
read(int file, void *p, size_t nbytes)
{
int i = 0;
char* buf = (char*) p;
for (i = 0; i < nbytes; i++) {
*(buf + i) = inbyte();
if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) {
i++;
break;
}
}
return (i);
}
int
write(int file, const void *p, size_t len)
{
const char *ptr = (const char*) p;
int todo;
for (todo = len; todo; --todo)
{
outbyte (*ptr++);
}
return(len);
}
void *
sbrk(ptrdiff_t incr)
{
extern char _end; /* Defined by the linker */
static char *heap_end;
char *prev_heap_end;
register char *stack_ptr asm ("sp");
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 ((void*) prev_heap_end);
}
/* end of syscalls.c */