ISA 8-Bit Video Experiments

A Series of Experiment to Create an ISA 8-Bit Video Card

Similar projects worth following
With the goal of creating an 8-bit ISA Video cards, this project is to create a series of experimental boards to validate portions of the design.

This project aims to recreate the original design for the IBM MDA and CGA video cards with modern output methods of TFT LCD, VGA and DVI. The inspiration for the project came from the The Cheap Video Cookbook from Dan Lancaster ( a free pdf of the book is available HERE ). There are a few additional accessory projects that assist in development of this project. They include:

8-Bit ISA I/O Card

8-Bit ISA ROM Card

LCD Interface Board

PC ROM Bios Extension Tools

Additional I've created a list with various projects and info:

Experiments in 8-Bit IBM PC Architecture 


6845 register initialization source code

asm - 7.76 kB - 01/01/2021 at 20:16



PDF Schematic - This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. CC-BY-NC 4.0, Copyright (C) 2019, David Anders. All Rights Reserved.

Adobe Portable Document Format - 18.90 kB - 01/01/2021 at 19:03


WinCUPL PLD Source Code - This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. CC-BY-NC 4.0, Copyright (C) 2019, David Anders. All Rights Reserved.

Zip Archive - 859.00 bytes - 01/01/2021 at 18:09



PDF Schematic - This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. CC-BY-NC 4.0, Copyright (C) 2021, David Anders. All Rights Reserved.

Adobe Portable Document Format - 42.79 kB - 01/01/2021 at 18:04



Datasheet for the Motorola MC6845 CRTC Integrated Circuit

Adobe Portable Document Format - 1.37 MB - 08/12/2019 at 04:49


View all 12 files

  • I've Got VGA Output!!

    Dave's Dev Lab10/22/2019 at 14:46 2 comments

    After a considerable amount of debugging, (with the help of @agp.cooper and @Alastair Hewitt ) I was able to get solid 40x30 text output from my 8-bit video board! I'm using a 8x16 font with the resolution of 640x480@60Hz and driving it with a pixel clock of 12.5875MHz, which is within the range of the clock speeds supported for the MC6845. I've got a ton of stuff to test before making a new revision of the board, but..... it works!

  • *Deep Dive Into CRTC*

    Dave's Dev Lab09/14/2019 at 02:07 2 comments

    As part of my video card project, i've been digging into the datasheets for some of the various Cathode Ray Tube Controler chips (CRTC) used on early video cards. the MC6845 is the "gold standard" for these chips. there are a bunch of variations on these chips, and while most websites and hackers will tell you they are identical, that isn't exactly true. The MC6845 and HD46505 (and HD46505R) having a clock limit of 3MHz. While the R6545 has 2.5MHz and the R6545E has a limit of 3.7MHz. Hitachi renamed their HD46505 to HD6845, but there was another change that happened at the exact same time. Hitachi made the HD6845S with 3.7MHz support! so why is this clock limit important? to support 640x400@70Hz, you need a pixel clock of 25.175MHz. that clock is then divided by 8 to provide the clock to the CRTC. in this case the divided clock would be 3.147MHz, outside of the maximum clock range for the standdard 6845 chip. so watch out for ebay sellers who have listings for HD6845S, but are selling you a HD46505, because the specifications are NOT the same. if you want to get 3.7MHz support, you will need a HD46505S, HD6845S, or R6545E.

  • ‚Äč BIOS ROM Extension Working!

    Dave's Dev Lab09/06/2019 at 21:07 0 comments

    After some hacking around with some x86 assembly and reviewing some example code from the EMS Flash Board project, I was successfully able to get my hijacked video int10h working! It's been a long time since I felt such excitement in seeing a DOS prompt!
    NOTE: now that I have it working at this level, I have to decide where to go to next.... color/attributes support? VGA support? DVI-D? graphics?

  • Video Test Successful!

    Dave's Dev Lab09/02/2019 at 23:30 0 comments

    After a couple hiccups with some direction control signals and some code tweaks for the memory address decoding, I've been successful in writing data to the LCD panel! Next phase of testing is to use the boot-rom card to register the LCD panel as a CGA black-and-white display at 60x34 characters....

  • Video Test Pattern on LCD!

    Dave's Dev Lab08/20/2019 at 03:02 0 comments

    After doing a bit of debugging, I was happy to see data on the LCD panel! The test pattern data is just a cycle through the 0 to 255 ASCII characters. the LCD display is a 480x272 pixel display. using the 8x8 character from the CGA/MDA ROM, give me a character resolution of 60x34. Couple of minor issues interfacing to the LCD. The LCD is expecting negative triggered VSYNC and HSYNC, but the MC6845 is outputting positive edge VSYNC and HSYNC. i had to cobble on some inverters. The datasheet for the LCD indicates that it can work without Data Enable (DE), but i wasn't able to get that working, so I needed to connect the DE from the MC6845 to finally get it working! on to the next phase!

  • We Control the Horizontal and Vertical!

    Dave's Dev Lab08/13/2019 at 01:07 0 comments

    The first of the MC6845 based video test boards is assembled and working! I am able to write to the registers on the 6845 to set both the horizontal and vertical timing which I was able to verify with my oscilloscope. Earlier in the week I installed Open-Watcom and setup an environment where i could compile DOS executables on my linux desktop. once that was working i created a simple iotool that allows me to read/write to port addresses from the DOS prompt. The original IBM designers left port 0x300 to 0x31F available for prototype cards, so i'm currently mapping the 6845's registers to 0x300 and 0x301 using a GAL16V8. after doing a series of tests, i'll order up the next board which include a Data ROM and a Character ROM. 

View all 6 project logs

Enjoy this project?



tomstock wrote 02/18/2022 at 15:55 point

Doing a video card repair I found myself with an extra 6850 which I also saw mentioned in Bil Herd's book as being the "standard" for CRT control of the time.  This caught my attention and after some searching I found your project AND the reference to the awesome book.  THANK YOU this is going to be a fun project.

  Are you sure? yes | no

vinci18 wrote 01/04/2021 at 23:57 point

Successfully loaded your register values from Arduino; 6845 is ticking; now I am struggling  with calculation; the 6850 datasheet is very confusing. I assume that for  40x25 characters (8x8) blocks I should have HSYNC 15,750 Hz.  I cannot figure out what  B1 - B10 are on p.19. May try to program registers to reasonable values and tinker with crystals.  Any help or reference will be very appreciated

  Are you sure? yes | no

Dave's Dev Lab wrote 01/05/2021 at 20:14 point

are you trying to do VGA or connect to a LCD panel?

  Are you sure? yes | no

vinci18 wrote 01/01/2021 at 14:44 point

Hello, I am looking at creating a timebase for SHARP MZ-700 computer (need to use 8x8 font and 320x200 screen). I cannot figure out from your schematics what exactly the oscillator frequency should be. Also the content of GAL's will help. Thank you. Alex.

  Are you sure? yes | no

Dave's Dev Lab wrote 01/01/2021 at 18:13 point

@vinci18 - hey there! i've updated the schematic pdf and uploaded the PLD source files. the board was designed to support a wide range of oscillators because i didn't know which one would work the best. i ended up just using a stock 25.1750MHz oscillator that i purchased on ebay! let me know if you have any more questions!

  Are you sure? yes | no

vinci18 wrote 01/01/2021 at 19:21 point

Great thanks. Do you have by any chance as an example a  set of 6845 register values for 25.175 oscillator and  any kind of display, say 40x25 so that I figure out everything and can calculate exactly what I need. I will start using Arduino to program 6845, look at the scope and then go further. Thanks

  Are you sure? yes | no

vinci18 wrote 01/01/2021 at 19:38 point

And another question - I see that 25.175 is divided by 16, so 6845 clock is 1.69 MHz. Do you need the high frequency anywhere else? My Z80 runs at 3.54 or 7.37 MHz. Can I clock 6845S with 3.55 MHz?

  Are you sure? yes | no

Dave's Dev Lab wrote 01/01/2021 at 20:29 point

@vinci18 - i've added a display.asm file that contains the initial register settings i am using with the VGA interface(if i remember correctly!). the 25.175MHz is the standard reference clock for a number of VGA resolutions. this frequency is needed to make sure that the pixel clock is accurate. for my design i am dividing the 25.175MHz in half, which generates 12.5875 which is used for the primary pixel clock (dot clock). the dot clock divided by 2 and divided by 4 are required in order to control the data latching timing. while the dot clock divided by 8 is the character clock needed for the 6845. this page has some info about the VGA timings:

  Are you sure? yes | no

M.NOORI wrote 12/18/2020 at 09:54 point

I want  design 8 bit isa vga mono card with AVR ATmega. can you help me?

  Are you sure? yes | no

M.NOORI wrote 12/18/2020 at 09:50 point


I have a question.

1. this board have 15 pin vga output?

2. and i use in 8088 pc with vga monitor?

if it is ok , then it is very good project .

3. and it is mono or color?

4. text or graphical?

  Are you sure? yes | no

Dave's Dev Lab wrote 01/01/2021 at 18:20 point

@M.NOORI there is a separate PCB with the VGA connector and yes this can be used on any motherboard that supports 8-Bit ISA slots. this version of the design is mono and only text.

  Are you sure? yes | no

Dave's Dev Lab wrote 01/01/2021 at 19:04 point

i've added a PDF schematic for the VGA interface board....

  Are you sure? yes | no

Ian Hanschen wrote 12/15/2020 at 17:35 point

Very cool! I am looking into doing this (and hopefully) more with an FPGA but there is a lot of elegance in this design!

  Are you sure? yes | no

Dave's Dev Lab wrote 12/15/2020 at 21:25 point

@Ian Hanschen - thanks for the feedback!

  Are you sure? yes | no

EtchedPixels wrote 02/21/2020 at 22:37 point

Funnily enough I stumbled across a design today that was using a 6545 (so 2.5MHz limited) to generate VGA sort of range video and it's both clever and simple. The row and address lines are wired to two sets of 8bit wide RAM in parallel, and the CPU sees the RAM as addresses from A1 upwards, with A0 selecting between the two 8bit wide RAMs (and gating cs/wr/oe). So the computer thinks it has 8bit wide RAM, the 6845 doesn't care how wide the RAM is and the shift register is now loading 16bits at a time so doubles the pixel clock sustainable.

  Are you sure? yes | no

Dave's Dev Lab wrote 02/21/2020 at 22:43 point

oh that is clever indeed! any links to that project?

  Are you sure? yes | no

EtchedPixels wrote 02/22/2020 at 16:17 point

Not online - but it was taken from an app note

"Operating at very fast character clock rates"

  Are you sure? yes | no

Dave's Dev Lab wrote 02/22/2020 at 18:08 point

@EtchedPixels - dandy thanks!

  Are you sure? yes | no

Alan Paton wrote 02/17/2020 at 21:41 point

Thanks for your detailed reply.  I noticed the difference because I am using an Interak computer which displays 80 characters using a 6845.

The characters are 8x10 pixels and the clock is 15MHz but the computer uses a mono CRT monitor.  I don't think it will display on an LCD monitor but it would be better if it did as CRT monitors will not be around forever.

  Are you sure? yes | no

Dave's Dev Lab wrote 02/17/2020 at 21:52 point

Right, the 15MHz clock is well within the specs of the based MCP6845. most of the older CRT designs used a much lower clock frequency such as those of the IBM Monochrome Display Adapter (MDA) and Color Graphics Adapter (CGA). most likely the resolution you are operating at is 640x200@60Hz (similar to CGA in mono mode). if you do the math of 640x200x60=7680000 pixels per second which could easily be driven by a 15MHz clock source. The issue for driving VGA is the that base clock frequencies start at the 25.175MHz, so you can do some fix ups to make it work. you could easily make a new type of video card for Interak with VGA support using the MCP6845...

  Are you sure? yes | no

Dave's Dev Lab wrote 02/17/2020 at 22:12 point

do have any links to documentation on the video display unit you are using with your Interak?

  Are you sure? yes | no

Alan Paton wrote 02/12/2020 at 22:13 point

Really interesting project, thanks for posting it. 

At the beginning of your description you say that you are using an 8x16 font - I assume this is 8 pixels by 16 pixels. But you also say that you have a resolution of 640 x 480. This would give a text display of 80 characters (8 x 80 = 640) not the display shown of 40 characters.

Can you say why this is?  Thanks, Alan

  Are you sure? yes | no

Dave's Dev Lab wrote 02/12/2020 at 22:44 point

great question! i probably should have explained that a little better! so.... a normal VGA resolution of 640x480 operates at a clock frequency of 25.175MHz which provides a refresh rate of 60 frames a second or 60Hz. in order for me to use an original MC6845 chip, the maximum frequency i can operate at is 16MHz (2MHz bus times 8 pixels), which is well blow the 25.175MHz needed for the 640x480 resolution at 60Hz. with that in mind, i am actually operating at 1/2 of 25.175MHz ( 12.5875MHz). This effectively causes each pixel in data to be draw twice horizontally, or in other words, it cause the horizontal resolution to be cut in half, giving the final resolution of 320x480 at 60Hz with a character resolution of 40x30 when using the 8x16 font. if 40x30 sounds like a familiar resolution from the late 70's and 80's computer era, this is why! The chips had max clock frequencies so 40x30 was easy to generate!

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates