• Updated 2023-07-12: Hello, Guest! Welcome back, and be sure to check out this follow-up post about our outage a week or so ago.

Upgrading Micron Xceed Color 30 to Color 30HR

zigzagjoe

Well-known member
I present: The first time, to my knowledge, that a production model Xceed Color 30 card is running 1024x768 resolution outside of Micron's labs.
1685649101968.png1685649112709.png

Not sure there are many folks interested in tinkering with an expensive rare card like this (with the exception of @Bolle), but in case you wish to try it, the modified ROM file is attached. Write it to a 27c256 PLCC EPROM and install it on the socket on your card.

To use this ROM, your card must read 250-0369-010 REV F at the top and the main ASIC must have "MAV" imprinted on it. As always, this is an at-your-own-risk affair, similar to overclocking. I don't think there's a real danger of blowing up your card by doing this, but you've been warned.

The added resolutions are 800x600, 832x624, 1024x768 each at up to 16 colors. A additional benefit is the Color 30 HR (aka 2.0) firmware eliminates the 512 x 341 hack on the grayscale Micron implemented originally. Internal grayscale becomes 512 x 342. Not sure this difference has been documented before.

The story:

I recently came into one of the Xceed Color boards. I'd really hoped for a Color 30HR card so I could run 800x600, even if it isn't the main use case for the card. However, it was a Color 30 card, is VGA or Portrait resolution only.

However, the Color 30 card is indistinguishable from the Color 30HR card, even down the the board revision. There is no sure-fire way to differentiate them without plugging it in. So this got me thinking. The cards appear physically identical, and the 30HR can do 800x600 - why can't my card? I got hacking. Thanks to the Micron tech docs and partial source, that made available a partial changelog and some source with comments to help guide my efforts.

Reviewing those documents and taking a deep dive into both the original 8KB Color 30 hardware and ROM, I came up with a list of challenges:
  • ROM change from 27c64 to 27c256
  • ROM code differences between 1.3 and 2.0
  • PAL differences??
  • ASIC change from Mavericks ("MAV") to Gambler ("GAM")
  • Faster VRAM (-8 vs -10), possibly other changed ICs
  • PCB differences?
  • Different ROM-resident driver code
The major challenge ended up being the ASIC change. The remaining challenges were either something I couldn't do anything about easily (PALs), they were provably non-issues (PCB rev, eeprom), or after a technical deep dive, my educated guess was "probably will work".

Lots of work in a disassembler followed. After getting the hint that 2 registers had been changed, I was able to compare the initialization sequences for the ASIC and modify the newer ROM to use the older ASIC's settings. This required a total of 25 changes, performed via a Powershell script to avoid fat-fingering.

1685651314237.png

I fixed the DeclROM checksum, wrote it, and guess what - it works!!! All the new resolutions work just fine along with internal grayscale. I'd hoped that the 7.5 monitors control panel would work with the newer code, but you still need to use the older 7.0 CP with the MonitorXceed 3.5 extension. I haven't tested the virtual desktop utility, but I have no reason to believe it'd have any issues as its initialization sequences were patched as well.

My card isn't Rev F/has a "GAM" chip:
  • If your main ASIC reads "GAM", but is seen as a Color 30 (non-HR). You should firmware 1.3a3 Rev 4, which was a simple tweak for Gambler ASIC support. I think you can simply write the commonly available 369C.ROM (Color 30HR 2.0) ROM to a 27C256 chip without changes. I haven't tested/can't test this.
  • I suspect the Rev E board could be made to work, but it may need some hacking to match the Rev F electrically. There is a schematic in this PDF that you would need to work through and verify your card against, I suspect the eeprom lines are of particular interest.
 

Attachments

  • 369C-30HR-Mav.zip
    4.6 KB · Views: 5

zigzagjoe

Well-known member
It definitely was a fun little weekend project. I am wonder if newer ROM versions than the 2.0 shipping code exist, and if they do, what the differences are. If anyone has a copy, send it my way!

In case it is useful for someone, my Color 30 (non-HR) ROM is attached (27c64 ROM, for a board with Maverick). That is ROM Version 1.3a3 Rev 3.

Here's what I came up with to recognize a 30HR card based on the minor differences.
  • Board Rev should be E or higher (Probably F)
  • ASIC must be "GAM"
  • ROM must be 27c256
  • RAM should be -8 (there may be some 30HR with -10, but most seem to have -8)
  • Presence of serial number sticker near PDS? 4 digit, old typeface
While these are not individually decisive, the more that are true, the more likely it is a 30HR card.

Complete resolutions supported:
1685723773759.png

Random technical notes:

I don't believe it would be possible to upgrade a Rev D card to 30HR. It seems that card used discrete crystals rather than the clock generator chip introduced on Rev E that has many discrete frequencies documented in the tech docs. Recognize by looking for this: 1685723941273.png

For Rev E, need to verify that EPROM A13 is wired to the appropriate bus and A14 is wired to XMODEWRTB. Maybe just tying this high would work too - ROM layout strongly suggests that this pin is high at all times as the bottom half of the ROM is empty.

Driver code in ROM seems to touch some registers directly, but not many - maybe just enough for live Gamma control? It should be possible to take a dump of this resource and put disassembled code or translate to DB.L data literals in the missing file theDriver.a to allow the full ROM to be built from source!

Patch technical details...

The ROM patches needed are as follows, along with the offsets into 369C.ROM
Two changes are being made:
MOVE.L to offset 2C (kMavAModesA) against register A0 or A4, invert the MSB for the G300EN bit which polarity changed in the Gambler chip.
MOVE.L to offset 08 (kMavBModesB) against register A0, clear bits 22 and 23 to set DEBUGSEL to 0 (TRANSWAITB)

0 21 7C ff 40 00 00 00 2C -> 21 7C 7f 40 00 00 00 2C found @ $41b6 (16822) 1 21 7C ff e0 00 00 00 08 -> 21 7C ff 20 00 00 00 08 found @ $41f4 (16884) 2 21 7C fe e0 00 00 00 08 -> 21 7C fe 20 00 00 00 08 found @ $4218 (16920) 3 21 7C ff 40 00 00 00 2C -> 21 7C 7f 40 00 00 00 2C found @ $43f2 (17394) 4 21 7C ff e0 00 00 00 08 -> 21 7C ff 20 00 00 00 08 found @ $4430 (17456) 5 21 7C ff 40 00 00 00 2C -> 21 7C 7f 40 00 00 00 2C found @ $44b6 (17590) 6 21 7C ff e0 00 00 00 08 -> 21 7C ff 20 00 00 00 08 found @ $44f4 (17652) 7 21 7C d6 60 00 00 00 2C -> 21 7C 56 60 00 00 00 2C found @ $457e (17790) 8 21 7C ff e0 00 00 00 08 -> 21 7C ff 20 00 00 00 08 found @ $45bc (17852) 9 21 7C ff 40 00 00 00 2C -> 21 7C 7f 40 00 00 00 2C found @ $4646 (17990) 10 21 7C ff e0 00 00 00 08 -> 21 7C ff 20 00 00 00 08 found @ $4684 (18052) 11 21 7C d6 60 00 00 00 2C -> 21 7C 56 60 00 00 00 2C found @ $470e (18190) 12 21 7C ff e0 00 00 00 08 -> 21 7C ff 20 00 00 00 08 found @ $474c (18252) 13 21 7C d6 60 00 00 00 2C -> 21 7C 56 60 00 00 00 2C found @ $47d6 (18390) 14 21 7C ff e0 00 00 00 08 -> 21 7C ff 20 00 00 00 08 found @ $4814 (18452) 15 21 7C d6 60 00 00 00 2C -> 21 7C 56 60 00 00 00 2C found @ $489e (18590) 16 21 7C ff e0 00 00 00 08 -> 21 7C ff 20 00 00 00 08 found @ $48dc (18652) 17 21 7C d6 60 00 00 00 2C -> 21 7C 56 60 00 00 00 2C found @ $4966 (18790) 18 21 7C ff e0 00 00 00 08 -> 21 7C ff 20 00 00 00 08 found @ $49a4 (18852) 19 21 7C d6 60 00 00 00 2C -> 21 7C 56 60 00 00 00 2C found @ $4a2e (18990) 20 21 7C ff e0 00 00 00 08 -> 21 7C ff 20 00 00 00 08 found @ $4a6c (19052) 21 21 7C fa 40 00 00 00 2C -> 21 7C 7a 40 00 00 00 2C found @ $4b82 (19330) 22 21 7C df e0 00 00 00 08 -> 21 7C df 20 00 00 00 08 found @ $4bc0 (19392) 23 29 7C d7 40 00 00 00 2C -> 29 7C 57 40 00 00 00 2C found @ $4d6e (19822) 24 29 7C d7 40 00 00 00 2C -> 29 7C 57 40 00 00 00 2C found @ $4d88 (19848) 25 29 7C d2 40 00 00 00 2C -> 29 7C 52 40 00 00 00 2C found @ $4da2 (19874)

After changing these values the DeclROM CRC must be updated. I used the gencrc tool from this page to do that.
 

Attachments

  • Color 30 ROM.zip
    3.6 KB · Views: 1

zigzagjoe

Well-known member
Wow, this is cool. Would it be possible hack in something weird like 1600x1200 @ 1bit?
Unfortunately no, the clock generator doesn't go that high. VRAM speed and RAMDAC speed are also problems.

The RAMDAC on card is a 66mhz one, which means the 65mhz clock for 1024x768 is right at spec. Some color 30hr cards have 80mhz DACs, so it might be possible to squeeze out a nonstandard (80mhz) 1152 x 864 at 4 bits.

My thinking, if someone wanted to take this further... It might be possible to get 800x600 up to 256 colors, and it ought to be straightfoward to add some horizonal resolution to the internal video resolution along the lines of this thread.
 

nickpunt

Well-known member
Oh nice, it'll be useful to get away from the 512x341 thing. Just to add some more mystery to your sleuthing @zigzagjoe I have a Color30 with GAM chip, 10ns vram, 27c256 ROM, and the 4 digit serial printed at the bottom. Dunno what ROM version it has tho, haven't checked.

IMG_3188.jpeg
 

zigzagjoe

Well-known member
Yep, these cards existed too, just to make things harder.... Seems to be an interim model made sometime after Jan 1992, based on the source. I'm not aware of any reason you would not be able to just write the unmodified 369C.rom (30HR) to a new 27c256 and drop it in.
Oh nice, it'll be useful to get away from the 512x341 thing. Just to add some more mystery to your sleuthing @zigzagjoe I have a Color30 with GAM chip, 10ns vram, 27c256 ROM, and the 4 digit serial printed at the bottom. Dunno what ROM version it has tho, haven't checked.

View attachment 58102
 
Top