libc/libgloss/m32r/trapmon0.c

54 lines
1.1 KiB
C

/*
* Mon2000 Trap handler (syscall interface).
*
* This trap handler is linked into the mon2000 libgloss (libmon).
*/
#include <reent.h>
#include "syscall.h"
int __trap0 (int function, int p1, int p2, int p3, struct _reent *r)
{
int rc = 0;
switch (function) {
case SYS_exit:
/* loop so GDB can't go past system exit call */
while (1) {
asm volatile (
"ldi r0, #0 \n"
"trap #15 ; return control to Mon2000");
}
break;
case SYS_write:
{
int i;
for( i=0; i<p3; i++ ) {
asm volatile (
"ldi r0, #2 \n"
"ldi r1, #15 ; load Ctrl-O (ASCII 15) \n"
"trap #15 ; write Ctrl-O for quoting purposes" );
asm volatile (
"ldi r0, #2 \n"
"ldb r1, %0 \n"
"trap #15 ; write character to console"
: /* no outputs */
: "m" (((char*)p2)[i]));
}
rc = p3; /* return number of chars written */
break;
}
default:
rc = 0;
break;
}
return rc;
}