I am working on a retro computer project that needs somewhat high resolution video output (at least 800x600 16 bit color). All retro computers (by this I mean anything before 80286) I am aware of use much lower resolutions and color modes, so schematic of their video subsystem cannot be used as a starting point. My goal is to display relatively static hires picture and update it from time to time.
I thought that it would be a good idea to connect an old PCI video card, configure it, load data to the framebuffer, and focus on the main computing activity leaving the whole video output work to a video card. The problem is that I have no experience in low level video programming, so asking guidance from dear experienced members.
As a test bench I have an Arduino Mega 2560 board and Stealth Video 2500 PCI video card. The video card has 2Mb of DRAM and is PCI 2.1 and VBE 2.0 compliant. The video processor that is used is Alliance Semiconductor ProMotion-AT24.
The only technical document that I was able to get for the video processor is https://vgamuseum.info/index.php/cpu/item/download/45_fd02fb1278fd0ce4b988fffec470428a which is for the superior chip ProMotion-AT3D (I assume that the basic 2D functionality is the same.) This doc is quite concise and has little explanation. If anyone has found more informative programming guides for these old chips, please let me know here or in private messages.
So far, I have implemented essential PCI communication (standard is found here: https://w3edu.cs.vsu.ru/EDK/DOCs/PCI21.PDF) to read and write PCI Configuration Space Header in Arduino using Ports A,C,K,L for 32-bit AD lines, Port B - for C/BE#'s, and several other pins for PCI communication control. The PCI Configuration Space Header has little information, so a deeper dive into I/O Space of video card is needed.
>! PCI Configuration Space Header
>! Words requested: 64 Words read: 64
>! Received Data (HEX):
>! 64241142
>! 4200000
>! 3000000
>! 0
>! 0
>! BB22231
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! C0000
>! 0
>! 0
>! 80
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
>! 0
The further algorithm I see is to put the video card into a desired mode by setting certain values to certain registers and then write pixel data to the framebuffer. I suppose, the video card will do the rest (display picture of certain resolution and color mode.) Please correct me if I am too naive. As I can see, the usage of VESA BIOS Extensions (standard is found here: http://www.phatcode.net/res/221/files/vbe20.pdf) might simplify the process and make it hardware independent.
This is where I need guidance from old-school programmers who dealt with video register programming. A minimal step-by-step instruction of what to put to which register to set up 115h VESA mode with 800x600 resolution and 32-bit color, and how to put pixel data in the framebuffer would be a real treasure.