It's also not that hard to write a simple real bare-metal GUI in assembler. I had to built some lab apparatus under OS/2 1.0, which didn't have a GUI, and most of it was in assembler. It's a while back, but from memory, the main bits I needed were lines and circle segments (using Bresenham's algorithm); mouse pointer draw/refresh; writing text (I copied bitmaps for VGA text from MS/DOS); menus; text entry; and mouse drag as a way of selecting an area or marking a circle. Apart from the mouse pointer, it was single-threaded and pretty simplistic, but good enough to be in use for several years. It had to be: it wasn't easy to move to OS/2 1.1 and get the Presentation Manage GUI because they changed the memory model and for performance reasons some of the bit-bashing I needed for a non-GUI part of the system was done with a large amount of wire-wrap. Anyway, the bare-metal GUI bit was really pretty simple to implement.