Prof. Dr. rer. nat. Peer Johannsen

Weird Science - Tales from the Vectrex Academy Lab

Vectrex Project Title

  • BIOS Versions

Project Status

  • Ongoing research

Synopsis

  • Digital Archeology - An investigation of the Vectrex BIOS versions
  • Some interesting, yet probably utterly useless findings...

An Analysis of the official 0xb796,0x7931 0x7adb BIOS versions

  • As far as I know, there are three "official" Vectrex BIOS versions which came in manufactured consoles. From what I read, those are commonly distinguished by their checksums and called:
    • 0xb796: rev_a BIOS (GCE)
    • 0x7931: rev_b BIOS (MB)
    • 0x7adb: rev_c BIOS (MB)
  • The MB versions contain the same bugfixed version of Mine Storm which is different from the GCE BIOS Mine Storm.
  • Here is a detailed analysis of the differences between the three versions, listing the patches applied to the rev_a source code. Please not that my labelling of the patches (for a good) reason is slightly diffrent compared to the labelling in the rev_c source code (more on that later).
    PATCH      address   comment

    rev_a                GCE base version

    rev_b_0    0xff9f    alternate version of Draw_Grid_VL
    rev_b_1    0xffd3    zeros instead of KARSOFT...
    rev_b_2    0xf01C    abort intro on button press
               0xefe7    subroutine for about on button press
    rev_MB     0xf024    MB version patch, also lots of patches in Mine Storm code

    rev_b1     0xf216    Joy_Digital patch
                         this is labelled as rev b1 change in the rev_c source
                         code, but does not appear in the official rev_b BIOS 0x7931,
                         but in the official rev_c BIOS 0x7adb!

    rev_c      0xf4f6    change to height handling in Print_Str_d
               0xffd3    minor pad bytes change
               0xf024    minor pad bytes change
               0xffee    minor pad bytes change
               0xedd8    minor pad bytes change

    rev_d      0xf4b3    delay cycles change in Print_Str_d
                         this appears in the rev_c source code, but not
                         in the official rev_c BIOS 0x7adb!
  • The official BIOS images in the manufactured consoles contain the following patches:

    • 0xb796 is GCE rev_a without any of the above listed patches
    • 0x7931 is rev_a + rev_b_* + rev_MB patches (no rev_b1 patch!)
    • 0x7adb is rev_a + rev_b* + rev_MB + rev_c (includes rev_b1 patch)

    The rev_d patch is found in none of them, and according to the official Western Technologies patch labelling, 0x7931 is not a pure rev_b BIOS, and 0x7adb is not a pure rev_c BIOS!

    As far as I could find out, there are three known BIOS source code disassemblies to be found on the internet:


    • roadsidethoughts.com/vectrex/the-rum.htm
    • John Hall
    • this is none of the official manufactured BIOS versions
    • this is rev_a + rev_b_0 + rev_b_1 patches
    • likely this is some intermediate version towards the MB changes
    • contains some comments hinting at a 7 segment display of hexadecimal numbers (see below)


    This rev_d patch is found in neither of the three official BIOS (that is why I called is rev_d).
  • The Print_Str() patch of rev_c causes a slight incompatibility. In rev_a and rev_b, Vec_Text_Height is a signed value indicating the y offset between the raster lines. Printing the text start with the top line, and a negative value of Vec_Text_Height (-1 to -128) causes the text to displayed "correctly". The more negative, the more the text is stretched in y direction. A positive value (+1 to +127) causes the text to "stand on its head".

    In rev_c, the patch leads to the text being displayed "correctly" for negative values (-1 to -32). All other values (-33 to -127, and +1 to +127) cause the text to stand upside down. As the texts are essentially unreadable for such values, this incompatibility is a minor issue. Except maybe for the fancy text effects.

    But also, the timing is slightly altered, so that texts with Vec_Text_Height values from (-1 to -32) appear minutely more stretched in y direction (taller) in rev_c than in rev_a and rev_b. This can be seen with the bare eye: Just compare the heights of the "Mine Storm" title text (or any other cartridge title) in 0xb796 and 0xb7931 to the height in 0x7adb. I have no idea why the Print_Str() patch was added, as it does not improve or change the overall performance of the routine. The total number of cycles for displaying the same text stays exactly the same. The comment says "chance to RASTER, recommended by Marc Indictor".
  • The code of the rev_c PDF also contains a section (right at the beginning of the character data table) that has been commented out, showing vector data for a 7 segment display of hexadecimal numbers. In indication that this has actually been used at some point is the description of the checksum test on page 21 of the Vectrex Service Manual, displaying the checksum value in exactly that 7 segment vector style.
  • I do by now have a BIOS source code with compile time switches that can be configured to assemble exactly the three "official" BIOS versions 0xb796, 0x7931 and 0x7adb, and I have thus verified the above details.
  • Please contact me if you know of any other BIOS or source code versions.

Author

  • Peer Johannsen

Latest modification on 01/07/2023, 11:30
  • Page created