Over the years I have been playing with the idea of writing interpreters and compilers, and I say idea on purpose, because I haven’t been very successful at it. Something similar happens with operating systems and virtual machines, although I have been a bit better with the latter, I had many projects started over the years without results.
Considering that I have been doing game development consistently for almost 10 years now, the idea of a fantasy console is so perfect if you want to write those, that I would say it was almost inevitable I made one.
And that’s why the TR-8 fantasy console came about.
It is all very work in progress and, instead of spending a lot of time planing and designing without getting to make anything, I decided to start implementing and put together things as I go. And you can tell when you look at the design of the 8-bit CPU.
Without getting in too much detail, an example program:
.org 0
; address of the frame interrupt vector
.equ INT_VECT 0xff00
; setup an int handler so we
; can use the frame int to sync
ld a, >INT_VECT
ld x, <INT_VECT
ld b, <int_handler
ld [a : x], b
inc x
ld b, >int_handler
ld [a : x], b
; enable interrupts
cif
; loop filling the screen with one
; colour cycling the whole palette
ld b, 0
loop:
call fill
inc b
and b, 15
; wait 1 second
ld x, 60
wait_loop:
halt
dec x
bnz
jmp wait_loop
jmp loop
; fill frame-buffer with a color in reg b
fill:
ld a, 0xbf
ld x, 0
ld y, 0x40
fill_loop:
ld [a : x], b
inc x
bno
jmp fill_loop
inc a
dec y
bnz
jmp fill_loop
ret
int_handler:
iret
That may give a bit of a taste of what is TR-8.
At the moment I’m working on three essential components:
- a virtual machine for the CPU
- an assembler
- a “player” that uses the virtual machine and provides the other bits of that make it “a console”
All written in C –hopefully portable–, with SDL2 for the player.
As I say, it is a work in progress, but this is what I have decided so far:
- Display: 128 x 128 pixels 16 colors (using the default EGA palette for now)
- Memory: 64K
- CPU: TR-8, 8-bit, 8M instr/sec (for now, likely make it slower when I add the hardware blitter)
- Sound: TBD, likely to be either a PSG or perhaps FM (OPL3?)
- Programming: ASM
The TR-8 CPU is inspired by the 8-bit CPUs I have programmed: the Z80 and the 6502; but also the MIPS (specially on how I’m encoding the instructions). This is not about a good design but about having some fun.
The main features of the CPU are:
- 16-bit registers: stack pointer (SP) and program counter (PC)
- 8-bit registers: 4 general purpose registers (a, b, x, y), flags register (F)
- frame interrupt (60Hz)
- port based IO (very Z80)
- a frame buffer (16K of RAM as video RAM; I thought about implementing a VDP but then I realised I was copying the MSX!)
I don’t know how far I’m going to get. I guess I will implement enough to feel satisfied, perhaps making a game for it, and that’s probably it. I don’t expect anybody using this, when you can make games for actual 8-bit machines –or more user-friendly fantasy consoles like the Pico-8 or the Tic-80–.