Many years ago I wrote assembler for a 6800-based mini with very simple display screens - 8 rows of 32 characters, each character being encoded by 6 bits for the value (no lower case), along with one bit for "underline" and one bit for "flashing".

The displays were directly memory mapped in 256-byte blocks starting at 0xc000, and the O/S also split memory up into 256-byte buffers. So if you wanted to see what was actually going on, you just poked 0xc1 into a buffer-id to get a real-time display on VDU 1 of what the program on VDU 0 was doing.

Tell people these days that you used to work with a multi-tasking O/S on an 8-bit platform capable of driving 48 VDUs and 56 printers with 48K of RAM and they laugh at you. :(