F18A Firmware Update


MSC file for JTAG update with Xilinx IMPACT tool: f18a_250k_v18-mcs

In-System Update for TI-99/4A Computer: F18AUpdate_v18

Checksum History:


A small update to fix a sprite collision bug where sprite collisions were being incorrectly detected outside of the active display, and added hybrid VDP register write restriction to mask VDP register writes to three-bits when the F18A is locked, like the real 9918A does.

I’m happy to announce the F18A v1.7 firmware. This is a small update that fixes problems with the bitmap-layer (BML) display and related GPU PIX instruction. I have also added a graphic that displays the firmware version when the system is powered on. A nice side effect of the version display is that it is only triggered by a *real* electronic reset, so in some cases it could be used as a troubleshooting aid (to let you know if your system is doing a hardware vs software reset, or to know if your system is stuck in reset.) On the 99/4A you should see it any time you power-on your system or insert/remove a cartridge.

After a year of work I’m happy to announce the release of the F18A V1.6 Firmware. There have been many changes (see below), most of which were driven by suggestions, wishes, and feedback.

The main focus of the V1.6 changes was usability. When I created many of the initial F18A features I did not have any context for how they might be used, and in practice some of the features were cool but useless. About a year ago a 99/4A game developer (Rasmus) was using the F18A and starting asking if certain features would be possible, and thus began the changes and updates.

There are also a few bug fixes, most notably a change to the 5th sprite number in the status register. This change corrects the miner49er bug, and probably fixes compatibility problems with other software not reported to me.

One of the coolest (I think) new features is Tile Layer 2 (TL2), which is a second completely independent tile layer that sits on top of the first original tile layer (TL1). Both TL1 and TL2 can have their own name table, color table, and horizontal and vertical scroll registers.

Another new feature for those who really like the Text Modes (T40 / T80) is the ability for *each tile* to have its own foreground and background color. This means you can now do full ANSI color in terminal programs, easily highlight text, etc. The text modes now have single-page pixel-scroll support too.

There is a virtual scan line feature for those who want to simulate the look of the old CRT monitors.

And much more.

Change Log:

F18A V1.8 Aug 24, 2016

* Fixed sprite collision bug where sprite collisions were being incorrectly detected outside of the active display, after line 191 or 239 depending on the line mode.

* Added hybrid VR write restriction to mask VR writes to three-bits when the F18A is locked, like the real 9918A does.  However, if mode bit M4 is set (80-columns), writes to VRs over VR7 are *ignored* instead of masked to three-bits.  This allows various 9938 programs to work (or continue to work), as well as continue to support TurboForth that writes to VRs 0..15 to set up 80-columns (if straight masking was used, VRs 8..15 would over-write VR 0..7).

F18A V1.7 Jan 1, 2016

* Fixed Bitmap-Layer (BML) display bug
* Fixed GPU’s PIX instruction to properly calculate BML addresses
* Added power-on graphic that shows the current firmware version

F18A V1.6 Apr 26, 2015

* Removed fixed tile functionality
* Removed border scroll limit functionality
* Removed banner functionality
* Removed host-side 32-bit counter
* Removed host-side 32-bit RNG
* Removed GPU 32-bit counter
* Removed GPU 32-bit RNG
* Removed the sprite “disable value” (>F8) in the sprite Y-location when ROW30 is enabled.

* Added second tile layer with its own NTBA, CTBA, h/v page sizes, and h/v scroll regs

* Added ECM2/3 pattern table size selections for tiles and sprites.

* Added host-side segmented counter with 10ns accuracy.

* Added configurable HSYNC and VSYNC GPU triggers.

* Added fat-pixel (2×1) with 16-color support to the bitmap layer (BML).

* Added 1×1 page scroll support for T40 and T80 modes.

* Added option to reset most VDP registers to their power-on values.

* Added option to disable Tile Layer 1, which includes GM1, GM2, MCM, T40, and T80.
Sprites, the BML, and TL2 are still active and can be enabled/disabled independently.

* Added option to allow attribute byte to be fg/bg color select in T40 and T80.

* Added per-position tile attribute support.

* Added DMA capability to the GPU:
8xx0 – MSB src
8xx1 – LSB src
8xx2 – MSB dst
8xx3 – LSB dst
8xx4 – width
8xx5 – height
8xx6 – stride
8xx7 – 0..5 | !INC/DEC | !COPY/FILL
8xx8 – trigger

FILL (active high) will read a single byte at the src address and fill the
destination with that byte.

src, dst, width, height, and stride are copied to dedicated counters when
the DMA is triggered, thus the original values remain unchanged.

* Added USR3 jumper to control GROMCLK/CPUCLK output on pin37 to provide support for 9128/29

* Added USR2 jumper to disable/enable simulated scan lines (every other VGA scan line has its
color reduced by 50%.)  Also controllable via a new VDP register bit.

* Added a 5th sprite reporting option instead of reporting the max-sprite, which on the F18A
might be different than the original VDP because all 32 sprites can be on a single scan line.

* Added a new register  (VR51) to limit the maximum sprite processed.  This has nothing
to do with the number of sprites that can be visible on a scan line, which is controlled
by a separate register (VR30).  This register is always active and can be used instead of
the >D0 byte in the sprite Y-location, and is the only way to limit sprite processing early
when ROW30 is enabled.

* Changed the GPU interlock so that polling the VDP status register will not cause the GPU
to pause.  This should greatly increase GPU performance during heavy VDP interrupt polling.

* Fixed T80 NTBA two LSbit problem.  They are ignored (set to “00”) when the F18A
is locked to provide compatibility with the 9938 and avoid problem with software
that set the two LSbits of the NTBA to other than “11” as the 9938 documentation
specifies they should be.  This limits the T80 name table to 4K boundaries.  When
the F18A is unlocked, all 4-bits of the NTBA are used and the T80 name table can
be located on 1K boundaries.

* Fixed the 5th number update during a scan line.  As long as the 5S flag is zero, the 5th
number register follows the sprite scanning sequence.  Seems to be a transparent latch that
follows the input (current sprite being scanned) until latched by the 5S flag.  If the status
register is being polled and 5S is reset mid frame, then the 5th number begins following the
scanned sprites again.  This bug is known to have affected Miner49er on the 99/4A.

F18A V1.5 July 23, 2013

Not really a *bug* fix since the problem it corrects exists on the real 9918A, and only has to
do with sporadic collision bit reporting during heavy polling of the original 9918A VDP status
register. This was discovered while Rasmus was writing Titanium. The 9918A was not designed to
have its status register polled which is why it provides an interrupt output.

I don’t think the original 9918A designers took the hazard into consideration, but I decided to
make this correction because it is what the original designers would have done given their
preference (and I asked Karl Guttag about it). Thus, the F18A implements what you would consider
the “expected behavior”, and will work as expected where the original 9918A might not. I did not
make this decision lightly.

F18A V1.4 Mar 20, 2013, April 26, 2013

* Fixed the sprite collision bug.  Now only sprites with *on-screen pixels* are considered.
The posted XB games are working correctly with the update.

* Fixed the 40-column text mode problem when the F18A 30-row option was enabled.

* Added more user vectors to the default GPU code.

* Fixed GPU DIV, small separate update (April) without a revision number change.

F18A V1.3 Release firmware, July 2012

17 comments to F18A Firmware Update

  • dean chanin

    i am looking at buying the F18A upgrade for my colecovision console.i hope to hear from you with the details

  • Ken

    Hi, downloaded F18AUpdate_v17 from link above but it appears to have V1.6 instead of V1.7. Checksum 40CC which matches V1.6.


  • Marcelo Junio Teixeira

    Hi, I have a doubt about F18A: I have a ColecoVision console, I want to install the F18A on it, but how I can apply future revisions of firmware? I need a TI-99/4 computer just to apply firmware updates? Thank you.

  • Andreas Wollinger

    I would like to buy the F18A upgrade for my TI-99/4A.
    I hope you can help 😉

    • matthew

      I keep a status of F18A availability on my store page for the F18A. I’m currently out of stock, but if you want to be notified when the F18A is back in stock, send me your name and email via the contact form.

  • Tim

    I am currently using an HP LE1901w monitor. Whenever I turn off the console and power it back on, it takes anywhere from two to ten seconds for the monitor to “notice” it is receiving a signal. Any suggestions?

    • matthew

      I would suggest trying to isolate the problem:

      1. Try a different VGA cable.
      2. Try a different monitor.

      From that will will know if the problem is the F18A, VGA cable, or the monitor itself. You could also see if your monitor has settings to prevent it from sleeping. Finally, you could try a “factory reset” of the monitor if it has that option (some do, some don’t).

      • Tim

        Thank you for the suggestions. Here is what I’ve tested so far.

        I connected a Syncmaster 740 monitor, using the same cable as the LE1901. The screen appears within 1/2 to 1 second, consistently.

        I then reconnected the LE1901 (VGA connector only). I completed a factory reset: no change. I tried two different cables with no change. Toggling power options had no effect.

        I then remembered my work laptop has the same model monitor. I brought it over to the TI system (which was on at the time), plugged in the power, and plugged in the VGA cable. I then turned the TI off and on, and the 10 second delay was present. I noticed that if the TI is on when I press the LE190 power button to turn the monitor off, then on again, the screen display re-activates within one second. However, if I leave the screen on, then turn off the TI and turn the TI back on, the monitor requires up to 10 seconds to come alive.

        Lastly, if I turn the TI off and wait 10 seconds, the monitor will display a “monitor going to sleep” message, and the power light changes from green to amber. If I turn on the TI at this point, the power light changes to green and the screen displays within one second. This seems to be consistent.

        Let me know if there are any other tests you’d like me to perform. tim

  • Mervyn

    Hi, I am looking to buy F18A for TI 99/4A but see you are out of stock. Will you have more soon?

    • matthew

      Please see the note on the store page, i.e. send me a message via the contact form and I will add you to the waiting list.

  • mike

    How many sprites can you display now on a hori line– is it the same (4)? just wondering…

    • matthew

      It is configurable. All 32 sprites can be displayed on a single scan line, or you can choose to have the original 4 sprite limit. Most people choose to have all 32 sprites since it benefits existing software and can (in a lot of cases) eliminate sprite flicker. There is more info in the F18A project posts, and there is an index here:


  • Paul Mugleston


    I would like to buy an f18a for my ti99-4a

    hope to hear you are making more soon

    Paul Mugleston