Solved

Drawing in VGA using Visual C++ 5.0

Posted on 1998-09-14
3
350 Views
Last Modified: 2013-12-03
Hello,

I'm writing a small library that is supposed to write to a VGA graphic card. I need to test this library with visualC++.

I know how to program VGA mode 18 using registers.
But I don't know how to switch the screen into VGA mode.
I have a borland sample program that is doing it the following way:

#define int10 0x10

union REGS regs;
regs.h.ah = 0;
regs.h.al = (char)18;
int86( int10,&regs,&regs);

Great but I can't find REGS and int86 in Visual C++.

I know the screen is at 0xA0000000;
And color register is set by
outportb( 0x3C4, 2 );
outportb( 0x3C5, color ); /* one of 0..15 (15 = black) */

Bit mask is set by
outportb( 0x3CE, 8 );
outportb( 0x3CF, mask );

Writing into screen memory requires reading the byte first because a latch reset required. (that's what I was told).
Then one can write bits into screen memory.

I would like to be able to try this from Visual C++ 5.0.

I know it is crazy to try drawing into VGA that way but apparently some crazy computer science teacher beleive it is  still extreamly important to know how to do so.

Any help would be welcome.

0
Comment
Question by:meessen
  • 3
3 Comments
 
LVL 22

Accepted Solution

by:
nietod earned 50 total points
ID: 1414438
visual C++ only produces 32 bit windows programs.  A 32 bit windows program cannot access the VGA card (or any other hardware).  If you want to do this from windows, you will have to write a device driver.  (Or use a compiler that produces either DOS or 16 bit windows programs--but I wouldn't recomend doing this from a 16 bit windows program anyways.)
0
 
LVL 22

Expert Comment

by:nietod
ID: 1414439
Those functions are all fancy C++ interfaces for x86 assembly language instructions.  Given a C++ compiler that produces 16 bit code, you can use inline asssembly to perform the same steps, like

regs.h.ah = 0;
regs.h.al = (char)18;
int86( int10,&regs,&regs);

becomes

__asm
{
   MOV AH,0
   MOV AL,18
   INT 10
}

and

outportb( 0x3C4, 2 );
outportb( 0x3C5, color ); /* one of 0..15 (15 = black) */

becomes

__asm
{
   MOV DX,3C4H
   MOV AL,2
   OUT DX,AL
   MOV DX,3C5H
   MOV AL,color
   OUT DX,AL
}
0
 
LVL 22

Expert Comment

by:nietod
ID: 1414440
Note, you can use the above assembly in VC 5, right now (it will compile).  But when your program tries to perform those commands (INT 10 or OUT) windows will detect it and terminate the program with an access violation.
0

Featured Post

Salesforce Made Easy to Use

On-screen guidance at the moment of need enables you & your employees to focus on the core, you can now boost your adoption rates swiftly and simply with one easy tool.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

This tutorial is about how to put some of your C++ program's functionality into a standard DLL, and how to make working with the EXE and the DLL simple and seamless.   We'll be using Microsoft Visual Studio 2008 and we will cut out the noise; that i…
What my article will show is if you ever had to do processing to a listbox without being able to just select all the items in it. My software Visual Studio 2008 crystal report v11 My issue was I wanted to add crystal report to a form and show…
This is Part 3 in a 3-part series on Experts Exchange to discuss error handling in VBA code written for Excel. Part 1 of this series discussed basic error handling code using VBA. http://www.experts-exchange.com/videos/1478/Excel-Error-Handlin…
Finds all prime numbers in a range requested and places them in a public primes() array. I've demostrated a template size of 30 (2 * 3 * 5) but larger templates can be built such 210  (2 * 3 * 5 * 7) or 2310  (2 * 3 * 5 * 7 * 11). The larger templa…

726 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question