diff --git a/uxntal.1 b/uxntal.1 index 9315ddb..220efcf 100644 --- a/uxntal.1 +++ b/uxntal.1 @@ -29,7 +29,7 @@ There are also 256 bytes of device memory, which are used to interact with the v There are 32 base values for opcodes: - 0x00 \fB***\fP 0x08 \fBEQU\fP 0x10 \fBLDZ\fP 0x18 \fBADD\fP + 0x00 \fBBRK*\fP 0x08 \fBEQU\fP 0x10 \fBLDZ\fP 0x18 \fBADD\fP 0x01 \fBINC\fP 0x09 \fBNEQ\fP 0x11 \fBSTZ\fP 0x19 \fBSUB\fP 0x02 \fBPOP\fP 0x0a \fBGTH\fP 0x12 \fBLDR\fP 0x1a \fBMUL\fP 0x03 \fBNIP\fP 0x0b \fBLTH\fP 0x13 \fBSTR\fP 0x1b \fBDIV\fP @@ -40,9 +40,9 @@ There are 32 base values for opcodes: The "complete" opcode's value can be derived by combining the base value with its flags. -For example, \fBADD2k\fP is \fB(0x18 | 0x20 | 0x80)\fP = \fB0xb8\fP. +For example, \fBADD2k\fP is \fB(ADD | 2 | k)\fP = \fB(0x18 | 0x20 | 0x80)\fP = \fB0xb8\fP. -Unlike other opcodes, \fB0x00\fP is contextual. Its meaning depends on the \fImode\fP bits provided: +Unlike other opcodes, \fB0x00\fP (\fBBRK*\fP) is contextual: its meaning depends on the \fImode\fP bits provided: 0x00 \fBBRK\fP 0x80 \fBLIT\fP 0x20 \fBJCI\fP 0xa0 \fBLIT2\fP @@ -51,6 +51,23 @@ Unlike other opcodes, \fB0x00\fP is contextual. Its meaning depends on the \fImo .SH STACK EFFECTS +.BR + +.SS NOTATION + +Given a stack effect \fB( a^ b^ c^ -- c^ a^ b^ )\fP here is what each symbol means: + + \fB(\fP and \fB)\fP are comment delimiters + \fBa^\fP, \fBb^\fP, and \fBc^\fP are values on the stack + \fB^\fP indicates that each value is a \fIbyte\fP (\fB*\fP would indicate \fIshort\fP) + \fB--\fP separates the "before" and "after" of the stack effect + +The effect here is to move the top byte of the stack below the next two bytes, which could be achieved with \fBROT ROT\fP. + +By default stack effects describe the effect on \fBwst\fP. When \fBrst\fP is involved we use \fB[]\fP to differentiate the stacks. For example \fB( a* [b*] -- a+1* [b+1*] )\fP will increment the top short of both \fBwst\fP and \fBrst\fP. + +.SS EFFECTS AND MODES + Regular instructions have a single stack effect which is modified in a predictable way by any additional modes. For example the generic effect for \fBADD\fP is ( x y -- x+y ). The eight combinations of modes have the following effects: @@ -70,6 +87,10 @@ In \fIreturn\fP mode the stacks are reversed. Effects on \fBwst\fP will instead In \fIkeep\fP mode all the values on the left-hand side of the stack effect will also appear on the right-hand side before the outputs. For example, \fBSWP\fP is \fB(x y -- y x)\fP but \fBSWPk\fP is \fB(x y -- x y y x)\fP. +.SS TERMINOLOGY + +We consider the top of the stack to be the first value of the stack, and count back from there. For example, given the stack effect \fB( a b c -- )\fP we would say that \fBc\fP is the top of the stack, \fBb\fP is the second value (second from the top), and \fBa\fP is the third value (third from the top). + .SH REGULAR INSTRUCTIONS .BR @@ -77,66 +98,100 @@ In \fIkeep\fP mode all the values on the left-hand side of the stack effect will .SS INC ( x -- x+1 ) +Increment the top value of the stack by 1. + Overflow will be truncated, so \fB#ff INC\fP will evaluate to \fB0x00\fP. .SS POP ( x -- ) +Remove the top value of the stack. + \fBPOPk\fP is guaranteed to have no effect (it will not change the stack). .SS NIP ( x y -- y ) +Remove the second value of the stack. + .SS SWP ( x y -- y x ) +Swap the top two values of the stack. + .SS ROT ( x y z -- y z x ) +Rotate the top three values of the stack. The lowest becomes the top and the others are each shifted down one place. + .SS DUP ( x -- x x ) +Place a copy of the top value of the stack on top of the stack. + .SS OVR ( x y -- x y x ) +Place a copy of the second value of the stack on top of the stack. + .SS EQU ( x y -- x==y^ ) +Test whether the top two values of the stack are equal. + Result is guaranteed to be boolean (\fB0x00\fP or \fB0x01\fP). .SS NEQ ( x y -- x!=y^ ) +Test whether the top two values of the stack are not equal. + Result is guaranteed to be boolean (\fB0x00\fP or \fB0x01\fP). .SS GTH ( x y -- x>y^ ) +Test whether the second value of the stack is greater than the top. + Result is guaranteed to be boolean (\fB0x00\fP or \fB0x01\fP). .SS LTH ( x y -- x>l)<