home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Graphics 16,000
/
graphics-16000.iso
/
msdos
/
animutil
/
pvquan
/
vga
/
vga200.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-11-30
|
4KB
|
121 lines
/************************************************************************
* *
* Copyright (c) 1991, Frank van der Hulst *
* All Rights Reserved *
* *
* Authors: *
* FvdH - Frank van der Hulst (Wellington, NZ) *
* *
* Versions: *
* V1.1 910626 FvdH - QUANT released for DBW_RENDER *
* V1.2 911021 FvdH - QUANT released for PoV Ray *
* V1.3 911030 FvdH - Added 320x200x256x4 pages support *
* *
************************************************************************/
/*
VGA 320 * 200 * 256 mode display module.
This code is based on an assembler source file by K. Heidenstrom.
It contains routines to display images in 320*200 mode by modifying
the VGA registers.
Advantages of 320 * 200:
- Four separate video pages which can be displayed independently.
These contain two views of a scene, taken from slightly different
viewpoints. These are displayed alternately on the screen, in sync with
a pair of "chopper glasses", to give a 3D effect. Four pages allows
double-buffered animation.
- Less than 64K bytes per image
*/
#include <dos.h>
#include <mem.h>
#include "vga.h"
#define SC_INDEX 0x3c4
#define GC_INDEX 0x3ce
#define CRTC_INDEX 0x3d4
#define VGA_SEGMENT 0xa000
#define MAP_MASK 2
#define MEMORY_MODE 4
#define GRAPHICS_MODE 5
#define MISCELLANEOUS 6
#define MAX_SCAN_LINE 9
#define START_ADDRESS_HIGH 0x0c
#define UNDERLINE 0x14
#define MODE_CONTROL 0x17
static unsigned int act_segment = VGA_SEGMENT; /* Current page being written to */
void putpixel_200(unsigned int x, unsigned int y, unsigned char colour)
{
char far *addr;
addr = MK_FP(act_segment, y * (320/4) + x/4);
outport(SC_INDEX, (0x0100 << (x & 3)) | MAP_MASK); /* Write to only 1 plane */
*addr = colour;
}
void set320x200x4mode(void)
{
struct REGPACK regs;
regs.r_ax = 0x13; /* Set 320*200*256 graphics mode via BIOS */
intr(0x10, ®s);
/* Setup Sequencer - disable Chain 4 bit for bitplane-architecture
memory map */
outport(SC_INDEX, 0x604); /* Sequencer -- disable 'Chain 4' bit */
/* Set up CRTC for special video mode */
outport(CRTC_INDEX, 0xe317); /* CRTC -- Select "byte mode" */
outport(CRTC_INDEX, 20); /* Turn off "double word mode" */
/* Set up Graphics Controller for 256-colour mode, write mode 0, replace mode
Following is default setup anyway - not strictly needed */
outport(GC_INDEX, 0x4005); /* Graphics controller address register */
/* 256-colour mode, write mode zero */
outport(GC_INDEX, 3); /* Replace pixel values */
/* Now clear the whole screen, since the mode 13h set only clears 64K. Do this
before switching CRTC out of mode 13h, so that we don't see garbage on the
screen. */
outport(SC_INDEX, 0x0f00 | MAP_MASK); /* Write to 4 planes at once */
setmem(MK_FP(VGA_SEGMENT, 0), 0xffff, 0);
}
void set320x200x1mode(void)
{
struct REGPACK regs;
regs.r_ax = 0x13; /* Set 320*200*256 graphics mode via BIOS */
intr(0x10, ®s);
}
void end320x200mode(void)
{
struct REGPACK regs;
regs.r_ax = 3; /* Return to text mode */
intr(0x10, ®s);
}
void setvis_200(int page)
{
outport(CRTC_INDEX, (page << 14) | 0x0c);
}
char far *setact_200(int page)
{
act_segment = VGA_SEGMENT + (page << 10);
return MK_FP(act_segment, 0);
}