UP | HOME

uxn - a new rabbit hole

uxn / varvara

shit - sorry for the wording - I found a new rabbit hole, it caught my attention because of some mastodon posts. I think in uxn you can dive in for aeons. Have a look at uxn or rather varvara, as the whole stack is called. It is a virtual 64kb computer, running on any device where a corresponding emulator exists. The architecture is quite simple:

  • 32 opcodes in 3 modes (shorts (2), keep stack (k), and access return stack (r))
  • No registers, just two stacks: working stack, return stack
  • zero page (first 1kb)
  • devices: screen, keyboard, console, controller, audio, and others (as far as I understood, you can build also your own devices, at least there are two reserved for that)
  • easy graphics and sprites (bitmap sprites in 1 or 2 colors, drawing pixels)

uxntal

The uxn-virtual machine can be programed in uxntal, a forth-oriented assembler. If you ever did some assembler in the 8-bit era, f.e. 6502 on the C64, you'll be into it in some hours. You'll find also a nice tutorial at compudanzas site.

Ahhh, so much fun to write in assembler again, haven't done this for about 30 years. In the distant past I got some experience in 6502 on the Commodore 64 ($a9 LDA, $8d STA, will never forget these opcodes) and also the 68000, which I programmed at the Amiga. Never will forget AMIGA Maschinensprache (German), my first intro into Assembler with Amiga.

Uxnasm, the assembler offers a lot of functionality: macros and an extensive way to handle labels. There exists uxnasm in C for your host system, but also a bare-metal versions asma.tal and drifblim, these run on uxn itself. And - of course - there are various emacs-modes with syntax highlight for uxntal and other functionalities. I chose uxntal-mode, as I like simply hitting C-x C-e to compile and start a rom.

What I would love to have, is also org-babel support for uxncli.

See below, my first uxntal progam, printing hexvalues from the stack.

  ( print-bytes.tal )

( devices )
|10 @Console [ &vector $2 &read $1 &pad $5 &write $1 &error $1 ]

( macros )
%EMIT           { .Console/write DEO } ( char -- )
%NL             { #0a EMIT } ( -- )
%BLANK          { #20 EMIT } ( -- )
%QUIT           { #010f DEO } ( -- )

|0100 
        #9f
        ;print-byte JSR2 BLANK
        #aa
        ;print-byte JSR2 NL
        #1234
        ;print-short JSR2 NL
        QUIT
BRK

( prints a short on stack )
@print-short ( short -- )
       SWP
       ,print-byte JSR
       ,print-byte JSR
JMP2r

( prints a byte on stack )
@print-byte ( byte -- )
        DUP
        #04 SFT
        ,&print-nibble JSR
        #0f AND
        ,&print-nibble JSR
        JMP2r
    &print-nibble
        #30 ADD
        DUP
        #3a LTH
        ,&output JCN
        #07 ADD
    &output
        EMIT
JMP2r

Ideas

Just some ideas, what I would like to do with that stuff, if there weren't that many time constrains …

  • uxn-emulator in Common Lisp
  • an simple emacs clone for uxn
  • your own operating system in uxn
  • a befunge machine in uxn
  • nice games
  • gemini client / server

Guys behind it

Not only uxn is interesting, the creators behind uxn, who started the project AFAIU, are very intersting people. Since 2016 they live on a sail boat. Have a look at their site and wiki. Everything they publish is real artists work. I enjoy just having a look at their websites and projectsdescriptions.

Date: 2022-10-16 Sun 00:00

Author: Otto Diesenbacher-Reinmüller

Validate