The 8-bit native code runs from the EPROM. So that needs a programmer and an UV eraser to update. I got mine from Aliexpress, they aren't expensive. In reality, at that level you do your programming in an emulator until you think it is right, and then burn it into the EPROM. There are several emulators around already.
That is very limiting of course, especially if you want to mix application code with keeping the hardware signals active. It means that you have to cycle count everything you do. That gets annoying real quick.
So there is also a virtualised CPU in there (vCPU), implemented in 8-bits code, that takes its instructions from RAM. It runs whenever the video/audio/IO loop has nothing to do. For convenience it implements 16-bit operations. It also takes care of counting cycles: it knows at what point to give control back to the video/audio/IO loop.
My applications are written for this vCPU. Also the ones that are in the menu: they literally first get loaded from ROM to RAM prior to execution. (Having said that: Racer uses two snippets of code that are written in the 8-bit machine language for speed.) Even the menu itself is vCPU code. And most of the reset sequence as well.
Now this interpreter opens the door for hacking without changing the ROM. The Loader is the escape hatch: it listens on the control port and allows an external device to push data into RAM and execute it.
I'm now using an Arduino as such a device because they are flexible and cheap.
Using this route you can push precompiled programs into the system. And that program can in turn accept other kind of signals, such as those of a keyboard. I have just agreed with the emulator guys on a standard file format for such object files. But you can also imagine that you hookup a keyboard to the Arduino. (That is my hope for this weekend in fact).
These are things under active development. Every week it gets a bit easier. Every week documentation gets a bit clearer. The hardware is there. ROM v1 demonstrates pretty well the capabilities. Now it is time to expand on the eco system.
What you can also do is this: develop a program as a vCPU object file. And then burn that in an EPROM, replacing one of the built-in applications (for example, replacing Menu.gcl). Then your code will always start after boot, without ever having to go down to the 8-bit level.
Another approach is simply to ignore video. One guy I know is planning to hookup an LED display, make a compiler that generates 8-bit object code, and ignore VGA/sound generation altogether.
In the blog section I show what we can do now:
https://gigatron.io/?p=937