MIPS Syscalls
Asking the simulator for a service
Sound
Program arguments
Print integer
$v0 = 1- In
$a0= Integer to print- From C
void sim_print_int(int value)
Print float
$v0 = 2- In
$f12= Float to print- From C
void sim_print_float(float value)
Print double
$v0 = 3- In
$f12= Double to print- From C
void sim_print_double(double value)
Print string
$v0 = 4- In
$a0= Address of NUL-terminated UTF-8 string to print- From C
void sim_print_string(const char *text)
Read integer
$v0 = 5- Out
$v0= Contains the integer parsed from the input line- Note
- Waits for a line in the Terminal and Enter, or reads scripted input in a Testcase. Trims surrounding whitespace and parses it as an integer. Invalid input stops the program with an input error.
- From C
int sim_read_int(void)
Read float
$v0 = 6- Out
$f0= Contains the floating-point value parsed from the input line- Note
- Waits for a line in the Terminal and Enter, or reads scripted input in a Testcase. Trims surrounding whitespace and parses it as a floating-point value. Invalid input stops the program with an input error.
- From C
float sim_read_float(void)
Read double
$v0 = 7- Out
$f0= Contains the double-precision value parsed from the input line- Note
- Waits for a line in the Terminal and Enter, or reads scripted input in a Testcase. Trims surrounding whitespace and parses it as a double-precision value. Invalid input stops the program with an input error.
- From C
double sim_read_double(void)
Read string
$v0 = 8- In
$a0= Address of input buffer;$a1= Size of input buffer in bytes- Out
- Memory at the address passed in
$a0is written through thebufferpointer. - Note
- Waits for a line in the Terminal and Enter, or reads scripted input in a Testcase. Stores UTF-8 with fgets-style limits: for buffer size n, writes at most n-1 bytes, adds a newline if there is room, then a NUL byte. Truncation can split a multibyte character. If n = 1, ignores input and writes only NUL; if n < 1, ignores input and writes nothing.
- From C
void sim_read_string(char *buffer, int size)
Sbrk (allocate heap memory)
$v0 = 9- In
$a0= Number of bytes to allocate- Out
$v0= Contains address of allocated memory- Note
- Heap exhaustion stops execution with a runtime error.
- From C
void *sim_sbrk(int bytes)
Exit (terminate execution)
$v0 = 10- Note
- Ends the program successfully with exit code 0.
- From C
void sim_exit(void)
Print character
$v0 = 11- In
$a0= Character to print- Note
- Prints the ASCII character whose code is in the low-order byte.
- From C
void sim_print_char(int character)
Read character
$v0 = 12- Out
$v0= Contains the input character code- Note
- Waits for one key in the Terminal and completes immediately; Enter returns 10. A Testcase supplies scripted input. Returns one UTF-16 code unit (16 bits), which may be half of a supplementary Unicode character.
- From C
int sim_read_char(void)
Open file
$v0 = 13- In
$a0= Address of NUL-terminated UTF-8 path in Project Files;$a1= Flags;$a2= Mode- Out
$v0= Contains file descriptor (-1 if error)- Note
- Opens a file in the Project Files, without accessing the computer’s disk. Use flag 0 to open for reading, 1 to open for writing (creating the file if needed), or 9 to open for writing and append (creating the file if needed). Editor extensions 2, 3, and 10 open for reading and writing: 2 requires an existing file, 3 creates or truncates, and 10 creates and appends writes. They share one file position. The mode argument is ignored. Failure returns -1. Descriptors 0, 1, and 2 are reserved for standard input, standard output, and standard error; project files receive descriptors starting at 3. Undo restores file changes; each Testcase starts with its own copy of the Project Files.
- From C
int sim_open(const char *path, int flags, int mode)
Read from file
$v0 = 14- In
$a0= File descriptor;$a1= Address of input buffer;$a2= Maximum number of bytes to read- Out
$v0= Contains number of bytes read (0 if end-of-file, -1 if error); Memory at the address passed in$a1is written through thebufferpointer.- Note
- Reads bytes from an open Project File. Descriptor 0 reads standard input from the Terminal: enter a line and press Enter. Ctrl+D or End of input on an empty line ends standard input; a Testcase uses scripted input and reaches end of input when its answers run out. Returns 0 at end of input or file, and -1 on failure. Undo restores file state; each Testcase uses its own copy of Project Files.
- From C
int sim_read(int fd, void *buffer, int length)
Write to file
$v0 = 15- In
$a0= File descriptor;$a1= Address of output buffer;$a2= Number of bytes to write- Out
$v0= Contains number of bytes written (-1 if error)- Note
- Writes bytes to an open Project File; descriptors 1 and 2 write to the Terminal as standard output and standard error. Returns the number of bytes written, or -1 on failure. Undo restores file changes; each Testcase uses its own copy of Project Files.
- From C
int sim_write(int fd, const void *buffer, int length)
Close file
$v0 = 16- In
$a0= File descriptor- From C
void sim_close(int fd)
Exit2 (terminate with value)
$v0 = 17- In
$a0= Termination result- Note
- Ends the program with the signed exit code in
$a0. The editor shows this code in the Log. - From C
void sim_exit2(int code)
Time (program time)
$v0 = 30- Out
$a0= Low order 32 bits of the program time;$a1= High order 32 bits of the program time- Note
- Returns milliseconds since 1970-01-01 UTC. In a Testcase, calendar time starts at 2000-01-01 UTC and advances through waits of service 32.
- From C
long long sim_time(void)
MIDI out
$v0 = 31- In
$a0= Pitch, 0 to 127: 60 is middle C, 62 is D, 64 is E; each step is one semitone;$a1= Duration in milliseconds;$a2= Instrument sound from the General MIDI list, numbered from 0 to 127: 0 piano, 40 violin, 56 trumpet, 73 flute;$a3= Volume, 0 (silent) to 127 (loudest)- Note
- Plays a note and continues immediately, allowing notes to overlap. Values outside 0 to 127 use these defaults: invalid pitch becomes 60 (middle C), invalid instrument becomes 0 (piano), and invalid volume becomes 100. A negative duration becomes 1000 milliseconds, as in MARS. The first note or MIDI-file request after opening or reloading the editor page waits while the browser loads the sound bank, the collection of instrument sounds; later runs share it. At most 64 notes sound at once, where MARS has no limit: starting another stops the oldest. Notes finish their duration after the program exits. Testcases are silent.
- From C
void sim_midi_out(int pitch, int duration, int instrument, int volume)
Sleep
$v0 = 32- In
$a0= The length of time to sleep in milliseconds- Note
- Service 32 - Lets that much program time pass before the next instruction. The editor stays responsive while it waits and the wait costs no instructions, so a program idling on the keyboard never reaches the execution limit; in a testcase it completes at once and advances the virtual clock instead.
- From C
void sim_sleep(int milliseconds)
MIDI out synchronous
$v0 = 33- In
$a0= Pitch, 0 to 127: 60 is middle C, 62 is D, 64 is E; each step is one semitone;$a1= Duration in milliseconds;$a2= Instrument sound from the General MIDI list, numbered from 0 to 127: 0 piano, 40 violin, 56 trumpet, 73 flute;$a3= Volume, 0 (silent) to 127 (loudest)- Note
- Plays a note with the same argument defaults as service 31, then waits for the requested duration before the next instruction. A sequence of these calls can play a melody. Muting or stopping the audible note does not shorten the wait. Testcases are silent; the wait completes immediately and advances the virtual clock by the duration.
- From C
void sim_midi_out_sync(int pitch, int duration, int instrument, int volume)
Print integer in hexadecimal
$v0 = 34- In
$a0= Integer to print- Note
- Displayed value is 8 hexadecimal digits, left-padding with zeroes if necessary.
- From C
void sim_print_hex(int value)
Print integer in binary
$v0 = 35- In
$a0= Integer to print- Note
- Displayed value is 32 bits, left-padding with zeroes if necessary.
- From C
void sim_print_binary(int value)
Print integer as unsigned
$v0 = 36- In
$a0= Integer to print- Note
- Displayed as unsigned decimal value.
- From C
void sim_print_unsigned(unsigned value)
Set seed
$v0 = 40- In
$a0= Generator ID: any integer selects an independent pseudorandom sequence;$a1= Seed for corresponding pseudorandom number generator- Note
- Seeds the generator selected by $a0. Each generator ID has an independent sequence. An unseeded ID starts from host randomness in an interactive run and a fixed per-ID seed in a testcase, making testcase runs repeatable. Values follow Java’s
Randomsequence for the same seed. Undo restores the state before a draw or reseed. - From C
void sim_random_seed(int generator, int seed)
Random int
$v0 = 41- In
$a0= Generator ID: any integer selects an independent pseudorandom sequence- Out
$a0= Contains the next pseudorandom, uniformly distributed int value from this random number generator's sequence- Note
- Each generator ID has an independent sequence. An unseeded ID starts from host randomness in an interactive run and a fixed per-ID seed in a testcase, making testcase runs repeatable. Service 40 sets an explicit seed. Values follow Java’s
Randomsequence for the same seed. Undo restores the state before a draw or reseed. - From C
int sim_random_int(int generator)
Random int range
$v0 = 42- In
$a0= Generator ID: any integer selects an independent pseudorandom sequence;$a1= Upper bound of range of returned values- Out
$a0= Contains pseudorandom, uniformly distributed int value in the range 0 <= [int] < [upper bound], drawn from this random number generator's sequence- Note
- Each generator ID has an independent sequence. An unseeded ID starts from host randomness in an interactive run and a fixed per-ID seed in a testcase, making testcase runs repeatable. Service 40 sets an explicit seed. Values follow Java’s
Randomsequence for the same seed. Undo restores the state before a draw or reseed. - From C
int sim_random_int_range(int generator, int bound)
Random float
$v0 = 43- In
$a0= Generator ID: any integer selects an independent pseudorandom sequence- Out
$f0= Contains the next pseudorandom, uniformly distributed float value in the range 0.0 <= f < 1.0 from this random number generator's sequence- Note
- Each generator ID has an independent sequence. An unseeded ID starts from host randomness in an interactive run and a fixed per-ID seed in a testcase, making testcase runs repeatable. Service 40 sets an explicit seed. Values follow Java’s
Randomsequence for the same seed. Undo restores the state before a draw or reseed. - From C
float sim_random_float(int generator)
Random double
$v0 = 44- In
$a0= Generator ID: any integer selects an independent pseudorandom sequence- Out
$f0= Contains the next pseudorandom, uniformly distributed double value in the range 0.0 <= f < 1.0 from this random number generator's sequence- Note
- Each generator ID has an independent sequence. An unseeded ID starts from host randomness in an interactive run and a fixed per-ID seed in a testcase, making testcase runs repeatable. Service 40 sets an explicit seed. Values follow Java’s
Randomsequence for the same seed. Undo restores the state before a draw or reseed. - From C
double sim_random_double(int generator)
ConfirmDialog
$v0 = 50- In
$a0= Address of NUL-terminated UTF-8 string that is the message to user- Out
$a0= Contains value of user-chosen option 0: Yes 1: No 2: Cancel- From C
int sim_confirm_dialog(const char *message)
InputDialogInt
$v0 = 51- In
$a0= Address of NUL-terminated UTF-8 string that is the message to user- Out
$a0= Contains int read;$a1= Contains status value 0: OK status -1: input data cannot be correctly parsed -2: Cancel was chosen -3: OK was chosen but no data had been input into field- From C
int sim_input_dialog_int(const char *message, int *status)
InputDialogFloat
$v0 = 52- In
$a0= Address of NUL-terminated UTF-8 string that is the message to user- Out
$f0= Contains the floating-point value parsed from the input line;$a1= Contains status value 0: OK status -1: input data cannot be correctly parsed -2: Cancel was chosen -3: OK was chosen but no data had been input into field- From C
float sim_input_dialog_float(const char *message, int *status)
InputDialogDouble
$v0 = 53- In
$a0= Address of NUL-terminated UTF-8 string that is the message to user- Out
$f0= Contains the double-precision value parsed from the input line;$a1= Contains status value 0: OK status -1: input data cannot be correctly parsed -2: Cancel was chosen -3: OK was chosen but no data had been input into field- From C
double sim_input_dialog_double(const char *message, int *status)
InputDialogString
$v0 = 54- In
$a0= Address of NUL-terminated UTF-8 string that is the message to user;$a1= Address of input buffer;$a2= Size of input buffer in bytes- Out
$a1= Contains status value 0: OK status. Buffer contains the input string. -2: Cancel was chosen. No change to buffer. -3: OK was chosen but no data had been input into field. No change to buffer. -4: length of the input string exceeded the specified maximum. Buffer contains the maximum allowable input string plus a terminating null.; Memory at the address passed in$a1is written through thebufferpointer.- Note
- Stores the entered string as UTF-8 in the buffer: at most n-1 bytes for buffer size n, followed by a newline if there is room and a terminating NUL. Truncation can split a multibyte character.
- From C
int sim_input_dialog_string(const char *message, char *buffer, int size)
MessageDialog
$v0 = 55- In
$a0= Address of NUL-terminated UTF-8 string that is the message to user;$a1= The type of message to be displayed: 0: error message, indicated by Error icon 1: information message, indicated by Information icon 2: warning message, indicated by Warning icon 3: question message, indicated by Question icon other: plain message (no icon displayed)- From C
void sim_message_dialog(const char *message, int type)
MessageDialogInt
$v0 = 56- In
$a0= Address of NUL-terminated UTF-8 string that is an information-type message to user;$a1= Int value to display in string form after the first string- From C
void sim_message_dialog_int(const char *message, int value)
MessageDialogFloat
$v0 = 57- In
$a0= Address of NUL-terminated UTF-8 string that is an information-type message to user;$f12= Float value to display in string form after the first string- From C
void sim_message_dialog_float(const char *message, float value)
MessageDialogDouble
$v0 = 58- In
$a0= Address of NUL-terminated UTF-8 string that is an information-type message to user;$f12= Double value to display in string form after the first string- From C
void sim_message_dialog_double(const char *message, double value)
MessageDialogString
$v0 = 59- In
$a0= Address of NUL-terminated UTF-8 string that is an information-type message to user;$a1= Address of NUL-terminated UTF-8 string to display after the first string- From C
void sim_message_dialog_string(const char *message, const char *text)
Lseek (move file position)
$v0 = 62- In
$a0= File descriptor;$a1= Offset in bytes;$a2= Where the offset counts from: 0 the start of the file, 1 the current position, 2 the end of the file- Out
$v0= Contains the new position, counted from the beginning of the file (-1 if error)- Note
- Seeks to a byte position in the file. Descriptors 0, 1, and 2 cannot seek.
- From C
int sim_lseek(int fd, int offset, int whence)