00001
00036 #include "mips1_syscall.H"
00037 #include "ac_resources.H"
00038
00039 void mips1_syscall::get_buffer(int argn, unsigned char* buf, unsigned int size)
00040 {
00041 unsigned int addr = RB[4+argn];
00042
00043 for (unsigned int i = 0; i<size; i++, addr++) {
00044 buf[i] = DM.read_byte(addr);
00045 }
00046 }
00047
00048 void mips1_syscall::set_buffer(int argn, unsigned char* buf, unsigned int size)
00049 {
00050 unsigned int addr = RB[4+argn];
00051
00052 for (unsigned int i = 0; i<size; i++, addr++) {
00053 DM.write_byte(addr, buf[i]);
00054 }
00055 }
00056
00057 void mips1_syscall::set_buffer_noinvert(int argn, unsigned char* buf, unsigned int size)
00058 {
00059 unsigned int addr = RB[4+argn];
00060
00061 for (unsigned int i = 0; i<size; i+=4, addr+=4) {
00062 DM.write(addr, *(unsigned int *) &buf[i]);
00063 }
00064 }
00065
00066 int mips1_syscall::get_int(int argn)
00067 {
00068 return RB[4+argn];
00069 }
00070
00071 void mips1_syscall::set_int(int argn, int val)
00072 {
00073 RB[2+argn] = val;
00074 }
00075
00076 void mips1_syscall::return_from_syscall()
00077 {
00078 ac_pc = RB[31];
00079 }
00080
00081 void mips1_syscall::set_prog_args(int argc, char **argv)
00082 {
00083 int i, j, base;
00084
00085 unsigned int ac_argv[30];
00086 char ac_argstr[512];
00087
00088 base = AC_RAM_END - 512;
00089 for (i=0, j=0; i<argc; i++) {
00090 int len = strlen(argv[i]) + 1;
00091 ac_argv[i] = base + j;
00092 memcpy(&ac_argstr[j], argv[i], len);
00093 j += len;
00094 }
00095
00096
00097 RB[29] = AC_RAM_END-512;
00098 set_buffer(25, (unsigned char*) ac_argstr, 512);
00099
00100
00101 RB[29] = AC_RAM_END-512-120;
00102 set_buffer_noinvert(25, (unsigned char*) ac_argv, 120);
00103
00104
00105 RB[29] = AC_RAM_END-512-128;
00106
00107
00108 RB[4] = argc;
00109
00110
00111 RB[5] = AC_RAM_END-512-120;
00112 }