54 lines
1.1 KiB
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;
|
|
}
|
|
|
|
|