Part 3 – Writing to the framebuffer
The previous instalment of this project saw a working VGA framebuffer being filled by an automated hardware process. Since then I’ve managed to get the TG68 processor running a program from a blockram-based ROM, and writing to the DE1 board’s SDRAM.
The memory map for the TG68 looks something like this:
- $000000: ROM (at the moment the ROM code just runs sequentially from $000008. Will eventually need to put an interrupt table in place and move the code elsewhere.)
- $0FFFFA: A couple of variables
- $100000: The frambuffer
- $7FFFFE: The initial stack pointer
For the ROM I use an M4K blockram, with initial contents specified with an MIF file. To create the MIF I first assemble the code with Easy68K, then convert the S-Record file it produces to MIF format using srec_cat, like so:
srec_cat in.S68 -o out.mif -mif 16
The ROM program currently backfills the screen, then draws random rectangles in an incrementing colour. The display is Hi-Colour (5-6-5) bit, which is dithered to fit the DE1’s 4-bit-per-gun output.
The complete project, for anyone who’s interested, can be found here.
Currently the fill-rate is pretty lousy since only a single 16-bit word can be written per slot. I need to add a writethrough cache of some kind, preferably one capable of merging successive writes to a single burst.
Possible future plans for the project include:
- CPU cache – separate instruction and data. Just one burst (64 bit) initially.
- Writeback cache – to allow (a) the CPU to continue working while a write is in progress, and (b) to gang sequential writes into a single burst write.
Sprite controller – just one sprite for mouse pointer.
- Multiple screenmodes.
- Sprite controller. Just one sprite, for a mouse pointer.
- A colourtable for indexed modes
- VBlank interrupt
- Interrupts in general
- SD card interface
- PS/2 controller
- Hardware registers for framebuffer address, sprite position, PS2 data, etc.