Rev 81 |
Go to most recent revision |
Blame |
Compare with Previous |
Last modification |
View Log
| RSS feed
/* VGAlib version 1.2 - (c) 1993 Tommy Frandsen */
/* */
/* This library is free software; you can redistribute it and/or */
/* modify it without any restrictions. This library is distributed */
/* in the hope that it will be useful, but without any warranty. */
/* Multi-chipset support Copyright 1993 Harm Hanemaayer */
/* partially copyrighted (C) 1993 by Hartmut Schirmer */
#include <stdlib.h> /* for NULL */
#include "vga.h"
#include "libvga.h"
#include "driver.h"
/* BIOS mode 0Dh - 320x200x16 */
static const unsigned char g320x200x16_regs[60] =
{
0x2D, 0x27, 0x28, 0x90, 0x2B, 0x80, 0xBF, 0x1F, 0x00, 0xC0, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x14, 0x00, 0x96, 0xB9, 0xE3,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
0x0C, 0x0D, 0x0E, 0x0F, 0x01, 0x00, 0x0F, 0x00, 0x00,
0x00, 0x0F, 0x00, 0x20, 0x00, 0x00, 0x05, 0x0F, 0xFF,
0x03, 0x09, 0x0F, 0x00, 0x06,
0x63
};
/* BIOS mode 0Eh - 640x200x16 */
static const unsigned char g640x200x16_regs[60] =
{
0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0xC0, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x28, 0x00, 0x96, 0xB9, 0xE3,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
0x0C, 0x0D, 0x0E, 0x0F, 0x01, 0x00, 0x0F, 0x00, 0x00,
0x00, 0x0F, 0x00, 0x20, 0x00, 0x00, 0x05, 0x0F, 0xFF,
0x03, 0x01, 0x0F, 0x00, 0x06,
0x63
};
/* BIOS mode 10h - 640x350x16 */
static const unsigned char g640x350x16_regs[60] =
{
0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0x40, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x83, 0x85, 0x5D, 0x28, 0x0F, 0x63, 0xBA, 0xE3,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
0x0C, 0x0D, 0x0E, 0x0F, 0x01, 0x00, 0x0F, 0x00, 0x00,
0x00, 0x0F, 0x00, 0x20, 0x00, 0x00, 0x05, 0x0F, 0xFF,
0x03, 0x01, 0x0F, 0x00, 0x06,
0xA3
};
/* BIOS mode 12h - 640x480x16 */
static const unsigned char g640x480x16_regs[60] =
{
0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xEA, 0x8C, 0xDF, 0x28, 0x00, 0xE7, 0x04, 0xE3,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
0x0C, 0x0D, 0x0E, 0x0F, 0x01, 0x00, 0x0F, 0x00, 0x00,
0x00, 0x0F, 0x00, 0x20, 0x00, 0x00, 0x05, 0x0F, 0xFF,
0x03, 0x01, 0x0F, 0x00, 0x06,
0xE3
};
/* BIOS mode 13h - 320x200x256 */
static const unsigned char g320x200x256_regs[60] =
{
0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0x41, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x28, 0x40, 0x96, 0xB9, 0xA3,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
0x0C, 0x0D, 0x0E, 0x0F, 0x41, 0x00, 0x0F, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF,
0x03, 0x01, 0x0F, 0x00, 0x0E,
0x63
};
/* non-BIOS mode - 320x240x256 */
static const unsigned char g320x240x256_regs[60] =
{
0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0x0D, 0x3E, 0x00, 0x41, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xEA, 0xAC, 0xDF, 0x28, 0x00, 0xE7, 0x06, 0xE3,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
0x0C, 0x0D, 0x0E, 0x0F, 0x41, 0x00, 0x0F, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF,
0x03, 0x01, 0x0F, 0x00, 0x06,
0xE3
};
/* non-BIOS mode - 320x400x256 */
static const unsigned char g320x400x256_regs[60] =
{
0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0x40, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x28, 0x00, 0x96, 0xB9, 0xE3,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
0x0C, 0x0D, 0x0E, 0x0F, 0x41, 0x00, 0x0F, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF,
0x03, 0x01, 0x0F, 0x00, 0x06,
0x63
};
/* non-BIOS mode - 360x480x256 */
static const unsigned char g360x480x256_regs[60] =
{
0x6B, 0x59, 0x5A, 0x8E, 0x5E, 0x8A, 0x0D, 0x3E, 0x00, 0x40, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xEA, 0xAC, 0xDF, 0x2D, 0x00, 0xE7, 0x06, 0xE3,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
0x0C, 0x0D, 0x0E, 0x0F, 0x41, 0x00, 0x0F, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF,
0x03, 0x01, 0x0F, 0x00, 0x06,
0xE7
};
/* monochrome mode based on BIOS mode 12h - 640x480x2 */
#define g640x480x2_regs g640x480x16_regs
/* non BIOS mode - 720x348x2 based on mode 10h */
static const unsigned char g720x348x2_regs[60] =
{
0x6B, 0x59, 0x5A, 0x8E, 0x5E, 0x8A, 0xBF, 0x1F, 0x00, 0x40, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x83, 0x85, 0x5D, 0x2D, 0x0F, 0x63, 0xBA, 0xE3,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
0x0C, 0x0D, 0x0E, 0x0F, 0x01, 0x00, 0x0F, 0x00, 0x00,
0x00, 0x0F, 0x00, 0x20, 0x00, 0x00, 0x05, 0x0F, 0xFF,
0x03, 0x01, 0x0F, 0x00, 0x06,
0xA7
};
/* non-BIOS mode - 400x300x256 - added by Ark 28-JAN-2001 */
static const unsigned char g400x300x256X_regs[60] =
{
0x71, 0x63, 0x64, 0x92, 0x65, 0x82, 0x46, 0x1F, 0x00, 0x40, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x31, 0x80, 0x2B, 0x32, 0x00, 0x2F, 0x44, 0xE3,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
0x0C, 0x0D, 0x0E, 0x0F, 0x41, 0x00, 0x0F, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF,
0x03, 0x01, 0x0F, 0x00, 0x06,
0xA7
};
/* Mode table */
static ModeTable vga_modes[] =
{
/* *INDENT-OFF* */
OneModeEntry(640x480x2),
OneModeEntry(720x348x2),
OneModeEntry(320x200x16),
OneModeEntry(640x200x16),
OneModeEntry(640x350x16),
OneModeEntry(640x480x16),
OneModeEntry(320x200x256),
OneModeEntry(320x240x256),
OneModeEntry(320x400x256),
OneModeEntry(360x480x256),
OneModeEntry(400x300x256X),
#ifdef G720x350x16
OneModeEntry(720x350x16),
#endif
END_OF_MODE_TABLE
/* *INDENT-ON* */
};
/* Fill in chipset-specific modeinfo */
static void getmodeinfo(int mode, vga_modeinfo * modeinfo)
{
if (modeinfo->bytesperpixel == 1) { /* 320x200x256 linear mode */
modeinfo->maxpixels = 65536;
modeinfo->startaddressrange = 0xffff;
} else
switch (modeinfo->colors) {
case 16: /* 4-plane 16 color mode */
modeinfo->maxpixels = 65536 * 8;
modeinfo->startaddressrange = 0x7ffff;
break;
case 256: /* 4-plane 256 color mode */
modeinfo->maxpixels = 65536 * 4;
modeinfo->startaddressrange = 0x3ffff;
break;
}
modeinfo->maxlogicalwidth = 2040;
modeinfo->haveblit = 0;
modeinfo->flags &= ~(IS_INTERLACED | HAVE_RWPAGE);
}
static void nothing(void)
{
}
static int saveregs(unsigned char regs[])
{
return 0;
}
static void setregs(const unsigned char regs[], int mode)
{
}
/* Return nonzero if mode available */
static int modeavailable(int mode)
{
const unsigned char *regs;
regs = LOOKUPMODE(vga_modes, mode);
if (regs != NULL && regs != DISABLE_MODE)
return STDVGADRV;
return 0;
}
/* Set a mode */
static int lastmode;
static int setmode(int mode, int prv_mode)
{
/* standard VGA driver: setmode */
const unsigned char *regs;
if (mode == TEXT)
return 0; /* Do nothing. */
regs = LOOKUPMODE(vga_modes, mode);
if (regs == NULL || regs == DISABLE_MODE)
return 1;
lastmode = mode;
__svgalib_setregs(regs);
return 0;
}
/* Set display start */
static void setdisplaystart(int address)
{
vga_modeinfo *modeinfo;
modeinfo = vga_getmodeinfo(lastmode);
if (modeinfo->bytesperpixel == 0) /* not 320x200x256 linear */
switch (modeinfo->colors) {
case 16: /* planar 16-color mode */
__svgalib_outatt(0x33,(__svgalib_inatt(0x33)&0xf0) | (address & 7));
/* write sa0-2 to bits 0-2 */
address >>= 3;
break;
case 256: /* planar 256-color mode */
/* write sa0-1 to bits 1-2 */
__svgalib_outatt(0x33,(__svgalib_inatt(0x33)&0xf0) | ((address & 3)<<1) );
address >>= 2;
break;
}
__svgalib_outcrtc(0x0d, address & 0x00ff);
__svgalib_outcrtc(0x0c, (address & 0xff00) >> 8);
}
static void setlogicalwidth(int width)
{
__svgalib_outcrtc(0x13, width >> 3);
}
static int vgadrv_init(int, int, int);
static int vga_test(void)
{
unsigned char save, back;
/* Check if a DAC is present */
save = port_in(PEL_IW);
__svgalib_delay();
outb(PEL_IW, ~save);
__svgalib_delay();
back = port_in(PEL_IW);
__svgalib_delay();
outb(PEL_IW, save);
save = ~save;
if (back == save) {
vgadrv_init(0, 0, 0);
return 1;
}
return 0;
}
DriverSpecs __svgalib_vga_driverspecs =
{ /* standard VGA */
saveregs,
setregs,
nothing, /* unlock */
nothing, /* lock */
vga_test,
vgadrv_init,
(void (*)(int)) nothing, /* __svgalib_setpage */
(void (*)(int)) nothing, /* __svgalib_setrdpage */
(void (*)(int)) nothing, /* __svgalib_setwrpage */
setmode,
modeavailable,
setdisplaystart,
setlogicalwidth,
getmodeinfo,
0, /* bitblt */
0, /* imageblt */
0, /* fillblt */
0, /* hlinelistblt */
0, /* bltwait */
0, /* extset */
0,
0, /* linear */
NULL, /* Accelspecs */
NULL, /* Emulation */
};
/* Initialize chipset (called after detection) */
static int vgadrv_init(int force, int par1, int par2)
{
if (__svgalib_driver_report)
cprintf("Using VGA driver.\n");
__svgalib_driverspecs = &__svgalib_vga_driverspecs;
__svgalib_banked_mem_base=0xa0000;
__svgalib_banked_mem_size=0x10000;
return 0;
}