This is a 32-bit MIPS I CPU emulator written in Scratch, with a 2.6MB address space. The source code can be loaded into Scratch from the scips.sb3 file, and is available here: https://scratch.mit.edu/projects/1000840481/.
Upon clicking the green flag, it loads the executable file (represented as a list of big-endian 32-bit integers) located in the proc:memory:program variable into virtual memory. You can click "See Inside" on the Scratch project, and then right-click on the proc:memory:program variable to import one of the CSVs in this repository (pre-compiled binaries) into scips.
- A UNIX environment
- gcc (or any C compiler)
The scratchmips-essentials.h contains a lot of implementations for useful library functions, like printf, cls, puts, putint, etc. Importing from the standard libraries will not work because coprocessor instructions and floating point registers have not been implemented. Also, MIPS uses the __start label the same way C uses the main label. Putting everything together, here is a sample Fibonacci number program:
#include "scratchmips-essentials.h"
int fib(int n) {
return n <= 1 ? n : ( fib(n - 1) + fib(n - 2) );
}
int __start() {
char buf[128];
gets(buf, 128);
int n = atoi(buf);
printf("fib(%d) = %d\n", n, fib(n));
return 0;
}There are multiple C -> MIPS compilers out there, but I'll be using the Linux MIPS toolchain. To install (using apt), run this command:
$ sudo apt install gcc-mips-linux-gnu
Then, using "main.c" as a stand-in for the file you wish to compile, and "main" as a stand-in for the output executable filename, run the following command:
$ mips-linux-gnu-gcc -march=mips1 -mfp32 -mabi=32 -mno-abicalls -mno-explicit-relocs -nostdlib main.c -o main
In order to import the executable into scips, it first needs to be converted into a CSV. The mips_to_csv.c file facilitates this, but first needs to be compiled (no xz shenanigans here):
$ gcc --std=c11 mips_to_csv.c -o mips_to_csv.o
Then, call mips_to_csv.o with the input executable as the first argument and the output filename as the second argument:
$ ./mips_to_csv.o main main.csv
Then, click "See Inside" on the Scratch Project, right-click on the proc:memory:program variable, and import the CSV.
scips implements the following syscalls from the MARS emulator (https://courses.missouristate.edu/kenvollmar/mars/help/syscallhelp.html): print string, read string, sbrk, exit, print character, read character (blocking), sleep, and random int.
It also implements a few custom syscalls:
| Service | Code in $v0 | Arguments | Result |
|---|---|---|---|
cls |
0 | clears stdout |
|
putsym |
3 | $a0 = idx of symbol to print |
outputs the symbol to stdout |
This is the list of supported symbols, where setting $a0 to 0 will output a red heart, and setting $a0 to 44 will output a brown square: 💖🔴🔺🔻🟥💙🔵🔹🔷🟦💛🟡🎇🎁🟨💚🟢🍏🥦🟩🧡🟠🔸🔶🟧💜🟣🍇🔮🟪🤍⚪❔❕⬜🖤⚫🏴💀⬛🤎🟤💩💼🟫