summaryrefslogtreecommitdiff
path: root/doc/ecall.txt
blob: 02cdcab62047ef2531f02d5974dbf5b655f67c61 (plain)
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
RVController M-mode ecall functions
===================================

Executing an ecall instruction in M-mode (currently the only mode) functions as an emulator call.
The operation to be performed is selected by:
* When in RV32E mode (misa[4] = 1, misa[8] = 0): register a5
* When in RV32I mode (misa[4] = 0, misa[8] = 1) AND register a7 is 0: register a5
* Otherwise: register a7

The available operations are:

a7(/a5) = 0
No operation

a7(/a5) = 1
Prints the integer value from register a0

a7(/a5) = 4
Prints the null-terminated string from the address specified by register a0

a7(/a5) = 5
Reads an integer from the console and stores it into register a0
This will block until the user enters a valid number

a7(/a5) = 8
Reads a string from the console and stores it (with a null terminator) into the address pointed to by register a0
Will not read more than the length specified in register a1, anything more is discarded
This will block until the user types something

a7(/a5) = 10
Exits the program (halts the CPU)

a7(/a5) = 11
Prints the character stored in the register a0

a7(/a5) = 12
Reads one character from the console (any more characters on the line are discarded) and stores it into register a0

a7(/a5) = 128
Gets a random integer (between the values in registers a0 and a1) and stores it into register a0

a7(/a5) = 129
Sends a digilines string message:
* channel is specified by the null-terminated string at the address specified by register a0
* message is specified by the null-terminated string at the address specified by register a1

a7(/a5) = 130
Gets the number of characters available to read from the console input buffer
Result is stored in register a0

a7(/a5) = 131
Clears the console input buffer

a7(/a5) = 132
Reads one character from the console input buffer and stores it into register a0
This will not block - if no data is available to read, a NUL character (0) is returned
The input buffer can store up to 256 characters - if full, incoming characters are dropped

a7(/a5) = 133
Gets the number of messages in the digilines receive buffer
Result is stored in register a0

a7(/a5) = 134
Clears the digilines receive buffer

a7(/a5) = 135
Reads one message from the digilines receive buffer, returns channel and message as null-terminated strings
This will not block - if no data is available to read, zero-length strings will be returned
Arguments:
a0 - Address that the channel string will be written to
a1 - Size of the buffer that the channel string will be written into
a2 - Address that the message will be written to
a3 - Size of the buffer that the message will be written into

All values not listed are reserved.