diff options
Diffstat (limited to 'uxntal.html.markdown')
-rw-r--r-- | uxntal.html.markdown | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/uxntal.html.markdown b/uxntal.html.markdown new file mode 100644 index 00000000..c56e158a --- /dev/null +++ b/uxntal.html.markdown @@ -0,0 +1,174 @@ +--- +language: uxntal +contributors: + - ["Devine Lu Linvega", "https://wiki.xxiivv.com"] +filename: learnuxn.tal +--- + +Uxntal is a stack-machine assembly language targeting the [Uxn virtual machine](https://wiki.xxiivv.com/site/uxn.html). + +Stack machine programming might look at bit odd, as it uses a postfix notation, +which means that operators are always found at the end of an operation. For +instance, one would write 3 4 + instead of 3 + 4. + +The expression written (5 + 10) * 3 in conventional notation would be +written 10 5 + 3 * in reverse Polish notation. + +```forth +( This is a comment ) + +( All programming in Unxtal is done by manipulating the stack ) + +#12 ( push a byte ) +#3456 ( push a short ) + +( Uxn has 32 opcodes, each opcode has 3 possible modes ) + +POP ( pop a byte ) +POP2 ( pop a short ) + +( The modes are: + [2] The short mode consumes two bytes from the stack. + [k] The keep mode does not consume items from the stack. + [r] The return mode makes the operator operate on the return-stack. ) + +#12 #34 ADD ( 46 ) +#12 #34 ADDk ( 12 34 46 ) + +( The modes can be combined ) + +#1234 #5678 ADD2k ( 12 34 56 78 68 ac ) + +( The arithmetic/bitwise opcodes are: + ADD SUB MUL DIV + AND ORA EOR SFT ) + +( New opcodes can be created using macros ) + +%MOD2 { DIV2k MUL2 SUB2 } + +#1234 #0421 MOD2 ( 01 b0 ) + +( ---------------------------------------------------------------------------- ) + +( A short is simply two bytes, each byte can be manipulated ) + +#1234 SWP ( 34 12 ) +#1234 #5678 SWP2 ( 56 78 12 34 ) +#1234 #5678 SWP ( 12 34 78 56 ) + +( Individual bytes of a short can be removed from the stack ) + +#1234 POP ( 12 ) +#1234 NIP ( 34 ) + +( The stack opcodes are: + POP DUP NIP SWP OVR ROT ) + +( ---------------------------------------------------------------------------- ) + +( To compare values on the stack with each other ) + +#12 #34 EQU ( 00 ) +#12 #12 EQU ( 01 ) + +( Logic opcodes will put a flag with a value of either 00 or 01 ) + +#12 #34 LTH +#78 #56 GTH + #0101 EQU2 ( 01 ) + +( The logic opcodes are: + EQU NEQ GTH LTH ) + +( ---------------------------------------------------------------------------- ) + +( Uxn's accessible memory is as follows: + 256 bytes of working stack + 256 bytes of return stack + 65536 bytes of memory + 256 bytes of IO memory ) + +( The addressable memory is between 0000-ffff ) + +#12 #0200 STA ( stored 12 at 0200 in memory ) +#3456 #0201 STA2 ( stored 3456 at 0201 in memory ) +#0200 LDA2 ( 12 34 ) + +( The zero-page can be addressed with a single byte ) + +#1234 #80 STZ2 ( stored 12 at 0080, and 34 at 0081 ) +#80 LDZ2 ( 12 34 ) + +( Devices are ways for Uxn to communicate with the outside world + There is a maximum of 16 devices connected to Uxn at once + Device bytes are called ports, the Console device uses the 10-1f ports + The console's port 18 is called /write ) + +%EMIT { #18 DEO } + +#31 EMIT ( print "1" to console ) + +( A label is equal to a position in the program ) +@parent ( defines a label "parent" ) + &child ( defines a sublabel "parent/child" ) + +( Label positions can be pushed on stack ) +;parent ( push the absolute position, 2 bytes ) +,parent ( push the relative position, 1 byte ) +.parent ( push the zero-page position, 1 byte ) + +( The memory opcodes are: + LDZ STZ LDR STR + LDA STA DEI DEO ) + +( ---------------------------------------------------------------------------- ) + +( Logic allows to create conditionals ) + +#12 #34 NEQ ,skip JCN + #31 EMIT + @skip + +( Logic also allows to create for-loops ) + +#3a #30 +@loop + DUP EMIT ( print "123456789" to console ) + INC GTHk ,loop JCN +POP2 + +( Logic also allows to create while-loops ) + +;word +@while + LDAk EMIT + INC2 LDAk ,while JCN +POP2 +BRK + +@word "vermillion $1 + +( Subroutines can be jumped to with JSR, and returned from with JMP2r ) + +;word ,print-word JSR +BRK + +@print-word ( word* -- ) + @while + LDAk EMIT + INC2 LDAk ,while JCN + POP2 +JMP2r + +@word "cerulean + +( The jump opcodes are: + JMP JCN JSR ) +``` + +## Ready For More? + +* [Uxntal Lessons](https://compudanzas.net/uxn_tutorial.html) +* [Uxntal Assembly](https://wiki.xxiivv.com/site/uxntal.html) +* [Uxntal Resources](https://github.com/hundredrabbits/awesome-uxn) |