/* * file: sos.c * This is the bare-bones Simple Operating System (SOS) * designed to run on the STM machine. */ #include #include #include #include "stm.h" #include "sos.h" /*************************************************** * SOS Global Variables ***************************************************/ int maxinst = -1, /* Maximum number of instructions */ procindex = 0; /* Index of process */ char procname[NAMESIZE]; /* name of process */ /*************************************************** * Execute a trap ***************************************************/ void exec_trap() { int iread, addr; char buf[128]; // buffer for string output char c; int i; if (debug) printf("Process %s index %i Trap: ", procname, procindex); switch(regs[15]) { case 0: // halt terminate=1; if (debug) printf(" Terminate\n"); break; case 1: // input trap if (debug) printf(" >> INPUT TRAP: regs[14]=%d, ", regs[14]); if (regs[14] == 0) { // integer input iread = scanf("%i", ®s[13]); if (iread == 1) regs[12]=1; else if (iread==EOF) regs[12]=0; else error=1; } else { // string input addr = regs[13]; for (i=0; i< regs[14]; i++){ scanf("%c", &c); mem[addr+i]=c; if ((c=='\0')|| (c=='\n') || (c==EOF)) break; } regs[12] = i; if (i==0) error=0; } break; case 2: // output trap iread = regs[14]; if (debug) printf("\n >> OUTPUT TRAP: regs[14]=%d, ", iread); if (iread==0) { // integer output printf("%i \n", regs[13]); regs[12] = 1; } else { // string output addr = regs[13]; for (i=0; i< iread; i++) { c = (char)mem[addr+i]; if ((c == EOF) || (c=='\0')) break; else buf[i]=c; } buf[i] = '\0'; regs[12] = i; // number of characters read printf("%s", buf); // output string } break; case 10: //memory dump if (debug) printf("\n MEMORY DUMP \n"); addr = regs[14]; //start address iread = regs[13]; //size of dump for (i=0; i