-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathzpu_syscall.c
34 lines (32 loc) · 1.26 KB
/
zpu_syscall.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
#include <stdlib.h>
#include <zpu_syscall.h>
#include <zpu_mem.h>
void zpu_syscall(zpu_t* zpu)
{
// int returnAdd = zpu_mem_get_uint32( zpu_get_mem(zpu), zpu_get_sp(zpu) + 0);
// int errNoAdd = zpu_mem_get_uint32( zpu_get_mem(zpu), zpu_get_sp(zpu) + 4);
int sysCallId = zpu_mem_get_uint32( zpu_get_mem(zpu), zpu_get_sp(zpu) + 8);
// int fileNo = zpu_mem_get_uint32( zpu_get_mem(zpu), zpu_get_sp(zpu) + 12);
int charIndex = zpu_mem_get_uint32( zpu_get_mem(zpu), zpu_get_sp(zpu) + 16);
int stringLength = zpu_mem_get_uint32( zpu_get_mem(zpu), zpu_get_sp(zpu) + 20);
switch (sysCallId)
{
case SYS_WRITE:
for (int i = 0; i < stringLength; i++)
{
putchar(zpu_mem_get_uint8( zpu_get_mem(zpu), charIndex++));
}
// Return value via R0 (AKA memory address 0)
zpu_mem_set_uint32( zpu_get_mem(zpu), 0, stringLength);
break;
case SYS_READ:
for (int i = 0; i < stringLength; i++)
{
zpu_mem_set_uint8( zpu_get_mem(zpu), charIndex++, getchar());
}
// Return value via R0 (AKA memory address 0)
zpu_mem_set_uint32( zpu_get_mem(zpu), 0, stringLength);
break;
}
}