Development Journal Index:
[catlist name=f18a orderby=date order=asc date=yes excludeposts=30 numberposts=100]
F18A stands for “FPGA TMS9918A” (hence the project’s title) and will be 100% hardware and pin compatible replacement for a TMS9918A VDP (video display processor). I started this project for a few reasons:
- For some reason, I have always wanted to make my own video card
- I have an emotional attachment to the TI-99/4A Home Computer (since it was my first computer)
- I wanted to be able to use a standard VGA monitor with my 99/4A instead of a TV or composite monitor
- I wanted to get into, and learn about, FPGAs and an HDL (hardware description language)
- I always wanted to make my own integrated circuits (chips) and understand how they work on the inside
- There are some things about the TMS9918A that I wanted to fix
The initial goals were lofty and I have since trimmed them back to something I can accomplish in a decent amount of time (1 year or so and still balance life, family, kids, etc.) I also just started documenting this project after working on it for about 5 or 6 months, so I’ll be making “catch up” posts for a while.
After having worked on the design for about 4 months, these are the goals that I think I can manage in the 1.0 version:
- Be pin compatible with the original TMS9918A VDP, i.e. a direct replacement in any existing computer
- Be 100% compatible in functionality
- Support standard VGA monitors (currently 640×480, but the final 1.0 will run at 800×600)
- Add a 9938 compatible 80-column mode
- Add a few additional video resolutions to better support remaking arcade games
- Increase the color palette to 512 colors
- Remove the “access window” limitations for full-on high speed access to VDP RAM all the time
- Increase VDP RAM to at least 512K, but probably 1MB in the end
- Allow all 32 sprites on a single horizontal scan line
- Add flags to flip sprites horizontally and vertically
Some additional features I’m kicking around are:
- Support a dedicated hardware mouse and USB/PS2 keyboard
- Provide a single-cycle 32-bit Mersenne Twister random number generator
- Dual-screen output (great for 2-player head-to-head games)
- Add horizontal and vertical scroll registers
- Provide hardware support for virtual screens with scrollable playfields
- A true bitmap layer
- Enhanced tile-map that supports larger pattern tables, colors, flip x and y, etc.
Some of these extra features appeared in the later Yamaha 9938, 9958, and 9990 VDPs. However the Yamaha chips are rare and details / documentation has proven very hard to find. Some of the features, like the Mersenne Twister are on the list because the VHDL to add that support is already available as an open source project and all I would have to do it tie it into the VDP. Generating random numbers on an older computer is a hard and time consuming task, but the FPGA could generated a new 32-bit RNG every clock cycle.
Something else I need to point out is that I’m running the FPGA at 100MHz, so I have the luxury of adding enhancements that the original chip simply can not do, like displaying all 32 sprites on the same line, and removing the VDP “access window” problem. This has great potential for new games, as well as eliminating sprite flicker in existing games.
Since this introduction post is 5 months over due, I’ll list here what I have working so far:
- Original 256×192 displayed in 2x (512×384) on a 640×480 VGA monitor
- All 4 video modes: Graphics I, Graphics II, Multicolor, Text
- 512 color palette
- Full speed CPU interface (no delays due to access windows)
- 16K VDP RAM using the FPGA’s block RAM
- Physical drop-in replacement (via a socket) of the original 9918A
The list of things to complete before I think v1.0 is ready:
- Implement sprites
- Add undocumented hybrid graphic modes
- Add the 9938 compatible 80-column mode
- Change VRAM to use an external SRAM instead of the FPGA’s block RAM
- Change to 800×600 base resolution instead of 640×480
- Design, order, and build the prototype circuit board
Progress was moving along pretty good until the summer months and life got busy again. I hope to get moving on this list soon!
Last I want to mention that an important aspect of this project is compatibility and availability. Even though I’m doing this first and foremost for myself, I would like to think that other people with interest in systems like the 99/4A, ColecoVision, and MSX1 would also have a large interest in having this hardware available. I intend to make this project compatible with existing systems, and I intent to make it readily available to those who want it, i.e. you won’t have to hope and pray for one to “pop up” on ebay.