clang-format

This commit is contained in:
Aren Elchinyan 2024-05-29 20:11:25 +03:00
parent 5d73ccc77a
commit 047fe62905
46 changed files with 15039 additions and 16725 deletions

30
.clang-format Normal file
View File

@ -0,0 +1,30 @@
ColumnLimit: 80
IndentWidth: 4
UseTab: ForIndentation
TabWidth: 4
SpacesBeforeTrailingComments: 1
NamespaceIndentation: None
AlignConsecutiveAssignments: false
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: true
AllowShortFunctionsOnASingleLine: Inline
AllowShortCaseLabelsOnASingleLine: true
AllowShortIfStatementsOnASingleLine: true
AllowShortLoopsOnASingleLine: true
BreakBeforeBinaryOperators: None
BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: false
ConstructorInitializerAllOnOneLineOrOnePerLine: true
DerivePointerAlignment: true
IndentCaseLabels: true
KeepEmptyLinesAtTheStartOfBlocks: false
PointerAlignment: Right
ContinuationIndentWidth: 4
SpacesInParentheses: false
SpacesInSquareBrackets: false
SpacesInAngles: false
SpaceInEmptyParentheses: true
IndentPPDirectives: None
IncludeBlocks: Preserve
Cpp11BracedListStyle: false
Standard: Cpp11

5
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,5 @@
{
"files.associations": {
"vbeaf.h": "c"
}
}

View File

@ -1,2 +1,2 @@
# freebe
# FreeBE/AF

View File

@ -1,7 +1,7 @@
/*
* ______ ____ ______ _____ ______
* ______ ____ ______ _____ ______
* | ____| | _ \| ____| / / _ \| ____|
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | __| '__/ _ \/ _ \ _ <| __| / /| _ | __|
* | | | | | __/ __/ |_) | |____ / / | | | | |
* |_| |_| \___|\___|____/|______/_/ |_| |_|_|
@ -14,52 +14,44 @@
* See freebe.txt for copyright information.
*/
// #define NO_HWPTR
#include <pc.h>
#include "vbeaf.h"
/* chipset information */
#define ATI_18800 1
#define ATI_18800_1 2
#define ATI_28800_2 3
#define ATI_28800_4 4
#define ATI_28800_5 5
#define ATI_18800 1
#define ATI_18800_1 2
#define ATI_28800_2 3
#define ATI_28800_4 4
#define ATI_28800_5 5
int ati_type;
int ati_port = 0x1CE;
/* driver function prototypes */
void SetBank32();
void SetBank32End();
int ExtStub();
void SetBank32( );
void SetBank32End( );
int ExtStub( );
long GetVideoModeInfo(AF_DRIVER *af, short mode, AF_MODE_INFO *modeInfo);
long SetVideoMode(AF_DRIVER *af, short mode, long virtualX, long virtualY, long *bytesPerLine, int numBuffers, AF_CRTCInfo *crtc);
long SetVideoMode(AF_DRIVER *af, short mode, long virtualX, long virtualY,
long *bytesPerLine, int numBuffers, AF_CRTCInfo *crtc);
void RestoreTextMode(AF_DRIVER *af);
long GetClosestPixelClock(AF_DRIVER *af, short mode, unsigned long pixelClock);
void SaveRestoreState(AF_DRIVER *af, int subfunc, void *saveBuf);
void SetDisplayStart(AF_DRIVER *af, long x, long y, long waitVRT);
void SetActiveBuffer(AF_DRIVER *af, long index);
void SetVisibleBuffer(AF_DRIVER *af, long index, long waitVRT);
int GetDisplayStartStatus(AF_DRIVER *af);
void SetPaletteData(AF_DRIVER *af, AF_PALETTE *pal, long num, long index, long waitVRT);
int GetDisplayStartStatus(AF_DRIVER *af);
void SetPaletteData(AF_DRIVER *af, AF_PALETTE *pal, long num, long index,
long waitVRT);
void SetBank(AF_DRIVER *af, long bank);
/* list which ports we are going to access (only needed under Linux) */
unsigned short ports_table[] = { 0xFFFF };
/* internal driver state variables */
int af_bpp;
int af_width;
@ -70,377 +62,318 @@ int af_scroll_x;
int af_scroll_y;
int af_bank;
/* FreeBE/AF extension allowing farptr access to video memory */
FAF_HWPTR_DATA hwptr;
/* list of available video modes */
typedef struct VIDEO_MODE
{
int w, h;
int bpp;
int num;
typedef struct VIDEO_MODE {
int w, h;
int bpp;
int num;
} VIDEO_MODE;
VIDEO_MODE mode_list[] = { { 640, 400, 8, 0x61 }, { 640, 480, 8, 0x62 } };
VIDEO_MODE mode_list[] =
{
{ 640, 400, 8, 0x61 },
{ 640, 480, 8, 0x62 }
};
#define NUM_MODES (int)(sizeof(mode_list)/sizeof(VIDEO_MODE))
short available_modes[NUM_MODES+1] = { 1, 2, -1 };
#define NUM_MODES (int)(sizeof(mode_list) / sizeof(VIDEO_MODE))
short available_modes[NUM_MODES + 1] = { 1, 2, -1 };
/* detect:
* Detects the presence of an ATI card.
*/
char *detect()
{
char *name = NULL;
char buf[16];
int sel, i;
char *detect( ) {
char *name = NULL;
char buf[16];
int sel, i;
sel = allocate_selector(0, 1024*1024);
if (sel < 0)
return NULL;
sel = allocate_selector(0, 1024 * 1024);
if (sel < 0) return NULL;
for (i=0; i<9; i++) /* check ID string */
buf[i] = _farpeekb(sel, 0xC0031+i);
for (i = 0; i < 9; i++) /* check ID string */
buf[i] = _farpeekb(sel, 0xC0031 + i);
if (memcmp(buf, "761295520", 9) != 0) {
free_selector(sel);
return NULL;
}
if (memcmp(buf, "761295520", 9) != 0) {
free_selector(sel);
return NULL;
}
ati_port = _farpeekw(sel, 0xC0010); /* read port address */
if (!ati_port)
ati_port = 0x1CE;
ati_port = _farpeekw(sel, 0xC0010); /* read port address */
if (!ati_port) ati_port = 0x1CE;
switch (_farpeekb(sel, 0xC0043)) { /* check ATI type */
switch (_farpeekb(sel, 0xC0043)) { /* check ATI type */
case '1':
ati_type = ATI_18800;
name = "18800";
break;
case '1':
ati_type = ATI_18800;
name = "18800";
break;
case '2':
ati_type = ATI_18800_1;
name = "18800-1";
break;
case '2':
ati_type = ATI_18800_1;
name = "18800-1";
break;
case '3':
ati_type = ATI_28800_2;
name = "28800-2";
break;
case '3':
ati_type = ATI_28800_2;
name = "28800-2";
break;
case '4':
ati_type = ATI_28800_4;
name = "28800-4";
break;
case '4':
ati_type = ATI_28800_4;
name = "28800-4";
break;
case '5':
ati_type = ATI_28800_5;
name = "28800-5";
break;
case '5':
ati_type = ATI_28800_5;
name = "28800-5";
break;
default:
/* unknown sort of ATI */
free_selector(sel);
return NULL;
}
default:
/* unknown sort of ATI */
free_selector(sel);
return NULL;
}
free_selector(sel);
free_selector(sel);
return name;
return name;
}
/* SetupDriver:
* Fills in our driver header block.
*/
int SetupDriver(AF_DRIVER *af)
{
char *name;
int vram_size;
int i;
int SetupDriver(AF_DRIVER *af) {
char *name;
int vram_size;
int i;
name = detect();
name = detect( );
if (!name)
return 1;
if (!name) return 1;
i = 0;
while (af->OemVendorName[i])
i++;
i = 0;
while (af->OemVendorName[i]) i++;
af->OemVendorName[i++] = ',';
af->OemVendorName[i++] = ' ';
af->OemVendorName[i++] = ',';
af->OemVendorName[i++] = ' ';
while (*name)
af->OemVendorName[i++] = *(name++);
while (*name) af->OemVendorName[i++] = *(name++);
af->OemVendorName[i] = 0;
af->OemVendorName[i] = 0;
if (get_vesa_info(&vram_size, NULL, NULL) != 0)
af->TotalMemory = 512;
else
af->TotalMemory = MIN(vram_size/1024, 512);
if (get_vesa_info(&vram_size, NULL, NULL) != 0)
af->TotalMemory = 512;
else
af->TotalMemory = MIN(vram_size / 1024, 512);
af->AvailableModes = available_modes;
af->AvailableModes = available_modes;
af->Attributes = (afHaveMultiBuffer |
afHaveVirtualScroll |
afHaveBankedBuffer);
af->Attributes =
(afHaveMultiBuffer | afHaveVirtualScroll | afHaveBankedBuffer);
af->BankSize = 64;
af->BankedBasePtr = 0xA0000;
af->BankSize = 64;
af->BankedBasePtr = 0xA0000;
af->IOPortsTable = ports_table;
af->IOPortsTable = ports_table;
af->SetBank32 = SetBank32;
af->SetBank32Len = (long)SetBank32End - (long)SetBank32;
af->SupplementalExt = ExtStub;
af->GetVideoModeInfo = GetVideoModeInfo;
af->SetVideoMode = SetVideoMode;
af->RestoreTextMode = RestoreTextMode;
af->GetClosestPixelClock = GetClosestPixelClock;
af->SaveRestoreState = SaveRestoreState;
af->SetDisplayStart = SetDisplayStart;
af->SetActiveBuffer = SetActiveBuffer;
af->SetVisibleBuffer = SetVisibleBuffer;
af->GetDisplayStartStatus = GetDisplayStartStatus;
af->SetPaletteData = SetPaletteData;
af->SetBank = SetBank;
af->SetBank32 = SetBank32;
af->SetBank32Len = (long)SetBank32End - (long)SetBank32;
af->SupplementalExt = ExtStub;
af->GetVideoModeInfo = GetVideoModeInfo;
af->SetVideoMode = SetVideoMode;
af->RestoreTextMode = RestoreTextMode;
af->GetClosestPixelClock = GetClosestPixelClock;
af->SaveRestoreState = SaveRestoreState;
af->SetDisplayStart = SetDisplayStart;
af->SetActiveBuffer = SetActiveBuffer;
af->SetVisibleBuffer = SetVisibleBuffer;
af->GetDisplayStartStatus = GetDisplayStartStatus;
af->SetPaletteData = SetPaletteData;
af->SetBank = SetBank;
return 0;
return 0;
}
/* InitDriver:
* The second thing to be called during the init process, after the
* The second thing to be called during the init process, after the
* application has mapped all the memory and I/O resources we need.
*/
int InitDriver(AF_DRIVER *af)
{
hwptr_init(hwptr.IOMemMaps[0], af->IOMemMaps[0]);
hwptr_init(hwptr.IOMemMaps[1], af->IOMemMaps[1]);
hwptr_init(hwptr.IOMemMaps[2], af->IOMemMaps[2]);
hwptr_init(hwptr.IOMemMaps[3], af->IOMemMaps[3]);
hwptr_init(hwptr.BankedMem, af->BankedMem);
hwptr_init(hwptr.LinearMem, af->LinearMem);
int InitDriver(AF_DRIVER *af) {
hwptr_init(hwptr.IOMemMaps[0], af->IOMemMaps[0]);
hwptr_init(hwptr.IOMemMaps[1], af->IOMemMaps[1]);
hwptr_init(hwptr.IOMemMaps[2], af->IOMemMaps[2]);
hwptr_init(hwptr.IOMemMaps[3], af->IOMemMaps[3]);
hwptr_init(hwptr.BankedMem, af->BankedMem);
hwptr_init(hwptr.LinearMem, af->LinearMem);
return 0;
return 0;
}
/* FreeBEX:
* Returns an interface structure for the requested FreeBE/AF extension.
*/
void *FreeBEX(AF_DRIVER *af, unsigned long id)
{
switch (id) {
void *FreeBEX(AF_DRIVER *af, unsigned long id) {
switch (id) {
#ifndef NO_HWPTR
#ifndef NO_HWPTR
case FAFEXT_HWPTR:
/* allow farptr access to video memory */
return &hwptr;
case FAFEXT_HWPTR:
/* allow farptr access to video memory */
return &hwptr;
#endif
#endif
default:
return NULL;
}
default: return NULL;
}
}
/* ExtStub:
* Vendor-specific extension hook: we don't provide any.
*/
int ExtStub()
{
return 0;
int ExtStub( ) {
return 0;
}
/* GetVideoModeInfo:
* Retrieves information about this video mode, returning zero on success
* or -1 if the mode is invalid.
*/
long GetVideoModeInfo(AF_DRIVER *af, short mode, AF_MODE_INFO *modeInfo)
{
VIDEO_MODE *info;
int i;
long GetVideoModeInfo(AF_DRIVER *af, short mode, AF_MODE_INFO *modeInfo) {
VIDEO_MODE *info;
int i;
if ((mode <= 0) || (mode > NUM_MODES))
return -1;
if ((mode <= 0) || (mode > NUM_MODES)) return -1;
info = &mode_list[mode-1];
info = &mode_list[mode - 1];
for (i=0; i<(int)sizeof(AF_MODE_INFO); i++)
((char *)modeInfo)[i] = 0;
for (i = 0; i < (int)sizeof(AF_MODE_INFO); i++) ((char *)modeInfo)[i] = 0;
modeInfo->Attributes = (afHaveMultiBuffer |
afHaveVirtualScroll |
afHaveBankedBuffer);
modeInfo->Attributes =
(afHaveMultiBuffer | afHaveVirtualScroll | afHaveBankedBuffer);
modeInfo->XResolution = info->w;
modeInfo->YResolution = info->h;
modeInfo->BitsPerPixel = info->bpp;
modeInfo->XResolution = info->w;
modeInfo->YResolution = info->h;
modeInfo->BitsPerPixel = info->bpp;
modeInfo->MaxBuffers = (af->TotalMemory*1024) /
(info->w*info->h*BYTES_PER_PIXEL(info->bpp));
modeInfo->MaxBuffers = (af->TotalMemory * 1024) /
(info->w * info->h * BYTES_PER_PIXEL(info->bpp));
if (info->w > 1024) {
modeInfo->MaxBytesPerScanLine = 2048*BYTES_PER_PIXEL(info->bpp);
modeInfo->MaxScanLineWidth = 2048;
}
else {
modeInfo->MaxBytesPerScanLine = 1024*BYTES_PER_PIXEL(info->bpp);
modeInfo->MaxScanLineWidth = 1024;
}
if (info->w > 1024) {
modeInfo->MaxBytesPerScanLine = 2048 * BYTES_PER_PIXEL(info->bpp);
modeInfo->MaxScanLineWidth = 2048;
} else {
modeInfo->MaxBytesPerScanLine = 1024 * BYTES_PER_PIXEL(info->bpp);
modeInfo->MaxScanLineWidth = 1024;
}
modeInfo->BytesPerScanLine = info->w*BYTES_PER_PIXEL(info->bpp);
modeInfo->BnkMaxBuffers = modeInfo->MaxBuffers;
modeInfo->BytesPerScanLine = info->w * BYTES_PER_PIXEL(info->bpp);
modeInfo->BnkMaxBuffers = modeInfo->MaxBuffers;
modeInfo->MaxPixelClock = 135000000;
modeInfo->MaxPixelClock = 135000000;
return 0;
return 0;
}
/* SetVideoMode:
* Sets the specified video mode, returning zero on success.
*/
long SetVideoMode(AF_DRIVER *af, short mode, long virtualX, long virtualY, long *bytesPerLine, int numBuffers, AF_CRTCInfo *crtc)
{
long available_vram;
long used_vram;
int width;
VIDEO_MODE *info;
RM_REGS r;
long SetVideoMode(AF_DRIVER *af, short mode, long virtualX, long virtualY,
long *bytesPerLine, int numBuffers, AF_CRTCInfo *crtc) {
long available_vram;
long used_vram;
int width;
VIDEO_MODE *info;
RM_REGS r;
/* reject anything with hardware stereo, linear framebuffer, or noclear */
if (mode & 0xC400)
return -1;
/* reject anything with hardware stereo, linear framebuffer, or noclear */
if (mode & 0xC400) return -1;
mode &= 0x3FF;
mode &= 0x3FF;
if ((mode <= 0) || (mode > NUM_MODES))
return -1;
if ((mode <= 0) || (mode > NUM_MODES)) return -1;
info = &mode_list[mode-1];
info = &mode_list[mode - 1];
/* call BIOS to set the mode */
r.x.ax = info->num;
rm_int(0x10, &r);
/* call BIOS to set the mode */
r.x.ax = info->num;
rm_int(0x10, &r);
/* adjust the virtual width for widescreen modes */
if (virtualX > info->w) {
if (virtualX > 1024)
return -1;
/* adjust the virtual width for widescreen modes */
if (virtualX > info->w) {
if (virtualX > 1024) return -1;
*bytesPerLine = ((virtualX*BYTES_PER_PIXEL(info->bpp))+15)&0xFFF0;
*bytesPerLine = ((virtualX * BYTES_PER_PIXEL(info->bpp)) + 15) & 0xFFF0;
width = read_vga_register(0x3D4, 0x13);
write_vga_register(0x3D4, 0x13, (width * (*bytesPerLine)) / (info->w*BYTES_PER_PIXEL(info->bpp)));
}
else
*bytesPerLine = info->w*BYTES_PER_PIXEL(info->bpp);
width = read_vga_register(0x3D4, 0x13);
write_vga_register(0x3D4, 0x13,
(width * (*bytesPerLine)) /
(info->w * BYTES_PER_PIXEL(info->bpp)));
} else
*bytesPerLine = info->w * BYTES_PER_PIXEL(info->bpp);
/* set up some hardware registers */
if (ati_type >= ATI_28800_4) /* allow display past 512k */
alter_vga_register(ati_port, 0xB6, 1, 1);
/* set up some hardware registers */
if (ati_type >= ATI_28800_4) /* allow display past 512k */
alter_vga_register(ati_port, 0xB6, 1, 1);
if (ati_type >= ATI_18800_1) /* select single bank mode */
alter_vga_register(ati_port, 0xBE, 8, 0);
if (ati_type >= ATI_18800_1) /* select single bank mode */
alter_vga_register(ati_port, 0xBE, 8, 0);
/* store info about the current mode */
af_bpp = info->bpp;
af_width = *bytesPerLine;
af_height = MAX(info->h, virtualY);
af_visible_page = 0;
af_active_page = 0;
af_scroll_x = 0;
af_scroll_y = 0;
af_bank = -1;
/* store info about the current mode */
af_bpp = info->bpp;
af_width = *bytesPerLine;
af_height = MAX(info->h, virtualY);
af_visible_page = 0;
af_active_page = 0;
af_scroll_x = 0;
af_scroll_y = 0;
af_bank = -1;
af->BufferEndX = af_width/BYTES_PER_PIXEL(af_bpp)-1;
af->BufferEndY = af_height-1;
af->OriginOffset = 0;
af->BufferEndX = af_width / BYTES_PER_PIXEL(af_bpp) - 1;
af->BufferEndY = af_height - 1;
af->OriginOffset = 0;
used_vram = af_width * af_height * numBuffers;
available_vram = af->TotalMemory*1024 ;
used_vram = af_width * af_height * numBuffers;
available_vram = af->TotalMemory * 1024;
if (used_vram > available_vram)
return -1;
if (used_vram > available_vram) return -1;
if (available_vram-used_vram >= af_width) {
af->OffscreenOffset = used_vram;
af->OffscreenStartY = af_height*numBuffers;
af->OffscreenEndY = available_vram/af_width-1;
}
else {
af->OffscreenOffset = 0;
af->OffscreenStartY = 0;
af->OffscreenEndY = 0;
}
if (available_vram - used_vram >= af_width) {
af->OffscreenOffset = used_vram;
af->OffscreenStartY = af_height * numBuffers;
af->OffscreenEndY = available_vram / af_width - 1;
} else {
af->OffscreenOffset = 0;
af->OffscreenStartY = 0;
af->OffscreenEndY = 0;
}
return 0;
return 0;
}
/* RestoreTextMode:
* Returns to text mode, shutting down the accelerator hardware.
*/
void RestoreTextMode(AF_DRIVER *af)
{
RM_REGS r;
void RestoreTextMode(AF_DRIVER *af) {
RM_REGS r;
r.x.ax = 3;
rm_int(0x10, &r);
r.x.ax = 3;
rm_int(0x10, &r);
}
/* GetClosestPixelClock:
* I don't have a clue what this should return: it is used for the
* refresh rate control.
*/
long GetClosestPixelClock(AF_DRIVER *af, short mode, unsigned long pixelClock)
{
/* ??? */
return 135000000;
long GetClosestPixelClock(AF_DRIVER *af, short mode, unsigned long pixelClock) {
/* ??? */
return 135000000;
}
/* SaveRestoreState:
* Stores the current driver status: not presently implemented.
*/
void SaveRestoreState(AF_DRIVER *af, int subfunc, void *saveBuf)
{
/* not implemented (not used by Allegro) */
void SaveRestoreState(AF_DRIVER *af, int subfunc, void *saveBuf) {
/* not implemented (not used by Allegro) */
}
/* SetDisplayStart:
* Hardware scrolling function. The waitVRT value may be one of:
*
@ -448,117 +381,97 @@ void SaveRestoreState(AF_DRIVER *af, int subfunc, void *saveBuf)
* 0 = set values and return immediately
* 1 = set values and wait for retrace
*/
void SetDisplayStart(AF_DRIVER *af, long x, long y, long waitVRT)
{
if (waitVRT >= 0) {
long a = (x * BYTES_PER_PIXEL(af_bpp)) + ((y + af_visible_page*af_height) * af_width);
void SetDisplayStart(AF_DRIVER *af, long x, long y, long waitVRT) {
if (waitVRT >= 0) {
long a = (x * BYTES_PER_PIXEL(af_bpp)) +
((y + af_visible_page * af_height) * af_width);
asm volatile ("cli");
asm volatile("cli");
if (waitVRT) {
do {
} while (inportb(0x3DA) & 1);
}
if (waitVRT) {
do { } while (inportb(0x3DA) & 1); }
/* write high bits to ATI-specific registers */
if (ati_type < ATI_28800_2) {
alter_vga_register(ati_port, 0xB0, 0xC0, a>>12);
}
else {
alter_vga_register(ati_port, 0xB0, 0x40, a>>12);
alter_vga_register(ati_port, 0xA3, 0x10, a>>15);
}
/* write high bits to ATI-specific registers */
if (ati_type < ATI_28800_2) {
alter_vga_register(ati_port, 0xB0, 0xC0, a >> 12);
} else {
alter_vga_register(ati_port, 0xB0, 0x40, a >> 12);
alter_vga_register(ati_port, 0xA3, 0x10, a >> 15);
}
/* write to normal VGA address registers */
write_vga_register(0x3D4, 0x0D, (a>>2) & 0xFF);
write_vga_register(0x3D4, 0x0C, (a>>10) & 0xFF);
/* write to normal VGA address registers */
write_vga_register(0x3D4, 0x0D, (a >> 2) & 0xFF);
write_vga_register(0x3D4, 0x0C, (a >> 10) & 0xFF);
asm volatile ("sti");
asm volatile("sti");
if (waitVRT) {
do {
} while (!(inportb(0x3DA) & 8));
}
}
if (waitVRT) {
do { } while (!(inportb(0x3DA) & 8)); }
}
af_scroll_x = x;
af_scroll_y = y;
af_scroll_x = x;
af_scroll_y = y;
}
/* SetActiveBuffer:
* Sets which buffer is being drawn onto, for use in multi buffering
* systems (not used by Allegro).
*/
void SetActiveBuffer(AF_DRIVER *af, long index)
{
if (af->OffscreenOffset) {
af->OffscreenStartY += af_active_page*af_height;
af->OffscreenEndY += af_active_page*af_height;
}
void SetActiveBuffer(AF_DRIVER *af, long index) {
if (af->OffscreenOffset) {
af->OffscreenStartY += af_active_page * af_height;
af->OffscreenEndY += af_active_page * af_height;
}
af_active_page = index;
af_active_page = index;
af->OriginOffset = af_width*af_height*index;
af->OriginOffset = af_width * af_height * index;
if (af->OffscreenOffset) {
af->OffscreenStartY -= af_active_page*af_height;
af->OffscreenEndY -= af_active_page*af_height;
}
if (af->OffscreenOffset) {
af->OffscreenStartY -= af_active_page * af_height;
af->OffscreenEndY -= af_active_page * af_height;
}
}
/* SetVisibleBuffer:
* Sets which buffer is displayed on the screen, for use in multi buffering
* systems (not used by Allegro).
*/
void SetVisibleBuffer(AF_DRIVER *af, long index, long waitVRT)
{
af_visible_page = index;
void SetVisibleBuffer(AF_DRIVER *af, long index, long waitVRT) {
af_visible_page = index;
SetDisplayStart(af, af_scroll_x, af_scroll_y, waitVRT);
SetDisplayStart(af, af_scroll_x, af_scroll_y, waitVRT);
}
/* GetDisplayStartStatus:
* Status poll for triple buffering. Not possible on the majority of
* present cards: this function is just a placeholder.
*/
int GetDisplayStartStatus(AF_DRIVER *af)
{
return 1;
int GetDisplayStartStatus(AF_DRIVER *af) {
return 1;
}
/* SetPaletteData:
* Palette setting routine.
*/
void SetPaletteData(AF_DRIVER *af, AF_PALETTE *pal, long num, long index, long waitVRT)
{
int i;
void SetPaletteData(AF_DRIVER *af, AF_PALETTE *pal, long num, long index,
long waitVRT) {
int i;
if (waitVRT) {
do {
} while (inportb(0x3DA) & 8);
if (waitVRT) {
do {
} while (inportb(0x3DA) & 8);
do {
} while (!(inportb(0x3DA) & 8));
}
do { } while (!(inportb(0x3DA) & 8)); }
for (i=0; i<num; i++) {
outportb(0x3C8, index+i);
outportb(0x3C9, pal[i].red/4);
outportb(0x3C9, pal[i].green/4);
outportb(0x3C9, pal[i].blue/4);
}
for (i = 0; i < num; i++) {
outportb(0x3C8, index + i);
outportb(0x3C9, pal[i].red / 4);
outportb(0x3C9, pal[i].green / 4);
outportb(0x3C9, pal[i].blue / 4);
}
}
/* SetBank32:
* Relocatable bank switch function, called with a bank number in %edx.
*/
@ -607,14 +520,7 @@ asm ("
*/
void SetBank(AF_DRIVER *af, long bank)
{
asm (
" call _SetBank32 "
:
: "d" (bank)
);
asm(" call _SetBank32 " : : "d"(bank));
af_bank = bank;
af_bank = bank;
}

View File

@ -1,7 +1,7 @@
/*
* ______ ____ ______ _____ ______
* ______ ____ ______ _____ ______
* | ____| | _ \| ____| / / _ \| ____|
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | __| '__/ _ \/ _ \ _ <| __| / /| _ | __|
* | | | | | __/ __/ |_) | |____ / / | | | | |
* |_| |_| \___|\___|____/|______/_/ |_| |_|_|
@ -12,34 +12,29 @@
* See freebe.txt for copyright information.
*/
#include "vbeaf.h"
AF_DRIVER drvhdr =
{
"VBEAF.DRV", /* Signature */
0x200, /* Version */
0, /* DriverRev */
"FreeBE/AF ATI 18800/28800 driver " FREEBE_VERSION, /* OemVendorName */
"This driver is free software", /* OemCopyright */
NULL, /* AvailableModes */
0, /* TotalMemory */
0, /* Attributes */
0, /* BankSize */
0, /* BankedBasePtr */
0, /* LinearSize */
0, /* LinearBasePtr */
0, /* LinearGranularity */
NULL, /* IOPortsTable */
{ NULL, NULL, NULL, NULL }, /* IOMemoryBase */
{ 0, 0, 0, 0 }, /* IOMemoryLen */
0, /* LinearStridePad */
-1, /* PCIVendorID */
-1, /* PCIDeviceID */
-1, /* PCISubSysVendorID */
-1, /* PCISubSysID */
0 /* Checksum */
AF_DRIVER drvhdr = {
"VBEAF.DRV", /* Signature */
0x200, /* Version */
0, /* DriverRev */
"FreeBE/AF ATI 18800/28800 driver " FREEBE_VERSION, /* OemVendorName */
"This driver is free software", /* OemCopyright */
NULL, /* AvailableModes */
0, /* TotalMemory */
0, /* Attributes */
0, /* BankSize */
0, /* BankedBasePtr */
0, /* LinearSize */
0, /* LinearBasePtr */
0, /* LinearGranularity */
NULL, /* IOPortsTable */
{ NULL, NULL, NULL, NULL }, /* IOMemoryBase */
{ 0, 0, 0, 0 }, /* IOMemoryLen */
0, /* LinearStridePad */
-1, /* PCIVendorID */
-1, /* PCIDeviceID */
-1, /* PCISubSysVendorID */
-1, /* PCISubSysID */
0 /* Checksum */
};

View File

@ -1,7 +1,7 @@
/*
* ______ ____ ______ _____ ______
* ______ ____ ______ _____ ______
* | ____| | _ \| ____| / / _ \| ____|
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | __| '__/ _ \/ _ \ _ <| __| / /| _ | __|
* | | | | | __/ __/ |_) | |____ / / | | | | |
* |_| |_| \___|\___|____/|______/_/ |_| |_|_|
@ -12,45 +12,40 @@
* See freebe.txt for copyright information.
*/
#include <pc.h>
#include "vbeaf.h"
/* driver function prototypes */
void SetBank32();
void SetBank32End();
int ExtStub();
void SetBank32( );
void SetBank32End( );
int ExtStub( );
long GetVideoModeInfo(AF_DRIVER *af, short mode, AF_MODE_INFO *modeInfo);
long SetVideoMode(AF_DRIVER *af, short mode, long virtualX, long virtualY, long *bytesPerLine, int numBuffers, AF_CRTCInfo *crtc);
long SetVideoMode(AF_DRIVER *af, short mode, long virtualX, long virtualY,
long *bytesPerLine, int numBuffers, AF_CRTCInfo *crtc);
void RestoreTextMode(AF_DRIVER *af);
long GetClosestPixelClock(AF_DRIVER *af, short mode, unsigned long pixelClock);
void SaveRestoreState(AF_DRIVER *af, int subfunc, void *saveBuf);
void SetDisplayStart(AF_DRIVER *af, long x, long y, long waitVRT);
void SetActiveBuffer(AF_DRIVER *af, long index);
void SetVisibleBuffer(AF_DRIVER *af, long index, long waitVRT);
int GetDisplayStartStatus(AF_DRIVER *af);
void SetPaletteData(AF_DRIVER *af, AF_PALETTE *pal, long num, long index, long waitVRT);
int GetDisplayStartStatus(AF_DRIVER *af);
void SetPaletteData(AF_DRIVER *af, AF_PALETTE *pal, long num, long index,
long waitVRT);
void SetBank(AF_DRIVER *af, long bank);
void WaitTillIdle(AF_DRIVER *af);
void SetMix(AF_DRIVER *af, long foreMix, long backMix);
/* if you need some video memory for internal use by the accelerator
* code (for example storing pattern data), you can define this value to
* code (for example storing pattern data), you can define this value to
* reserve room for yourself at the very end of the memory space, that
* the application will not be allowed to use.
*/
#define RESERVED_VRAM 0
#define RESERVED_VRAM 0
/* list which ports we are going to access (only needed under Linux) */
unsigned short ports_table[] = { 0xFFFF };
/* internal driver state variables */
int af_bpp;
int af_width;
@ -65,57 +60,55 @@ int af_fore_mix;
int af_back_mix;
int af_lines_per_bank;
/* note about VBE/AF multiple page modes: the API supports any number of
* video memory pages, one of which is "active" (being drawn onto), while
* the other is visible on your monitor. Allegro doesn't actually use
* this functionality, so you may safely leave it out and just reject
* any mode set requests with a numBuffers value greater than one, but
* that might upset other VBE/AF applications if they depend on this
* that might upset other VBE/AF applications if they depend on this
* functionality. To support multiple pages, you must offset all the
* hardware drawing operations so their coordinate system is relative
* to the active page. You must also maintain an offset from the start
* of vram to the start of the active page in the OriginOffset of the
* driver structure, and adjust the OffscreenStartY and OffscreenEndY
* values so they will refer to the same offscreen memory region regardless
* of the current accelerator coordinate system. This is all handled by the
* SetActiveBuffer() function below, so in practice you can simply add
* driver structure, and adjust the OffscreenStartY and OffscreenEndY
* values so they will refer to the same offscreen memory region regardless
* of the current accelerator coordinate system. This is all handled by the
* SetActiveBuffer() function below, so in practice you can simply add
* af_active_page*af_height onto the input Y coordinate of any accelerator
* drawing funcs, and multiple page modes should work correctly.
*/
#define ALG_NONE 0
#define ALG_2101 1
#define ALG_2201 2
#define ALG_2228 3
#define ALG_2301 4
#define ALG_NONE 0
#define ALG_2101 1
#define ALG_2201 2
#define ALG_2228 3
#define ALG_2301 4
#define ALG_UNKNOWN 5
int port_crtc = 0x3d4;
int port_attr = 0x3c0;
int port_seq = 0x3c4;
int port_grc = 0x3ce;
int port_seq = 0x3c4;
int port_grc = 0x3ce;
int alg_version = ALG_NONE, alg_vidmem = 0;
char *alg_name[6] = {
"none", "ALG-2101", "ALG-2201", "ALG-2228", "ALG-2301", "unknown"
};
char *alg_name[6] = { "none", "ALG-2101", "ALG-2201",
"ALG-2228", "ALG-2301", "unknown" };
int alg_caps[6] = {
0,
afHaveMultiBuffer | afHaveBankedBuffer | afHaveVirtualScroll /*| afHaveDualBuffers */,
afHaveMultiBuffer | afHaveBankedBuffer | afHaveVirtualScroll /*| afHaveDualBuffers */,
afHaveMultiBuffer | afHaveBankedBuffer | afHaveVirtualScroll /*| afHaveDualBuffers */,
afHaveMultiBuffer | afHaveBankedBuffer | afHaveVirtualScroll /*| afHaveDualBuffers */,
0
};
int alg_caps[6] = { 0,
afHaveMultiBuffer | afHaveBankedBuffer |
afHaveVirtualScroll /*| afHaveDualBuffers */,
afHaveMultiBuffer | afHaveBankedBuffer |
afHaveVirtualScroll /*| afHaveDualBuffers */,
afHaveMultiBuffer | afHaveBankedBuffer |
afHaveVirtualScroll /*| afHaveDualBuffers */,
afHaveMultiBuffer | afHaveBankedBuffer |
afHaveVirtualScroll /*| afHaveDualBuffers */,
0 };
struct mode_t {
int mode;
int w,h;
int w, h;
int bpp;
};
@ -123,117 +116,95 @@ struct mode_t {
struct mode_t mode_list[] = {
/* mode width height bpp */
{ 0x28, 512, 512, 8 },
{ 0x29, 640, 400, 8 },
{ 0x2a, 640, 480, 8 },
{ 0x2c, 800, 600, 8 },
{ 0x2e, 768, 1024, 8 },
{ 0x31, 1024, 768, 8 },
{ 0x33, 1024, 1024, 8 },
{ 0x37, 1280, 1024, 8 },
{ 0x28, 512, 512, 8 }, { 0x29, 640, 400, 8 }, { 0x2a, 640, 480, 8 },
{ 0x2c, 800, 600, 8 }, { 0x2e, 768, 1024, 8 }, { 0x31, 1024, 768, 8 },
{ 0x33, 1024, 1024, 8 }, { 0x37, 1280, 1024, 8 },
{ 0x40, 320, 200, 16 },
{ 0x41, 512, 512, 16 },
{ 0x42, 640, 400, 16 },
{ 0x43, 640, 480, 16 },
{ 0x44, 800, 600, 16 },
{ 0x45, 1024, 768, 16 },
{ 0x40, 320, 200, 16 }, { 0x41, 512, 512, 16 }, { 0x42, 640, 400, 16 },
{ 0x43, 640, 480, 16 }, { 0x44, 800, 600, 16 }, { 0x45, 1024, 768, 16 },
{ 0x48, 640, 480, 24 },
{ 0x49, 800, 600, 24 },
{ 0x48, 640, 480, 24 }, { 0x49, 800, 600, 24 },
{ 0, 0, 0, 0 }
{ 0, 0, 0, 0 }
};
short available_modes[MAX_MODES] = { -1 };
static inline void clrinx (int pt, int inx, int val)
{
write_vga_register (pt, inx, read_vga_register (pt, inx) & ~val);
static inline void clrinx(int pt, int inx, int val) {
write_vga_register(pt, inx, read_vga_register(pt, inx) & ~val);
}
static inline void setinx (int pt, int inx, int val)
{
write_vga_register (pt, inx, read_vga_register (pt, inx) | val);
static inline void setinx(int pt, int inx, int val) {
write_vga_register(pt, inx, read_vga_register(pt, inx) | val);
}
static inline void modinx (int pt, int inx, int mask, int nwv)
{
write_vga_register (pt, inx, (read_vga_register (pt, inx) & ~mask) | (nwv & mask));
static inline void modinx(int pt, int inx, int mask, int nwv) {
write_vga_register(pt, inx,
(read_vga_register(pt, inx) & ~mask) | (nwv & mask));
}
/* detect_alg:
* Sees whether or not an Avance Logic graphics card is present,
* and if one is it attempts to identify it.
*/
int detect_alg()
{
int detect_alg( ) {
int old;
alg_version = ALG_NONE;
alg_vidmem = 0;
old = read_vga_register (port_crtc, 0x1a);
clrinx (port_crtc, 0x1a, 0x10);
if (!test_vga_register (port_crtc, 0x19, 0xcf)) {
setinx (port_crtc, 0x1a, 0x10);
if (test_vga_register (port_crtc, 0x19, 0xcf) && test_vga_register (port_crtc, 0x1a, 0x3f)) {
int tmp = read_vga_register (port_crtc, 0x1a) >> 6;
old = read_vga_register(port_crtc, 0x1a);
clrinx(port_crtc, 0x1a, 0x10);
if (!test_vga_register(port_crtc, 0x19, 0xcf)) {
setinx(port_crtc, 0x1a, 0x10);
if (test_vga_register(port_crtc, 0x19, 0xcf) &&
test_vga_register(port_crtc, 0x1a, 0x3f)) {
int tmp = read_vga_register(port_crtc, 0x1a) >> 6;
switch (tmp) {
case 3:
alg_version = ALG_2101;
break;
case 3: alg_version = ALG_2101; break;
case 2:
if (read_vga_register (port_crtc, 0x1b) & 4)
if (read_vga_register(port_crtc, 0x1b) & 4)
alg_version = ALG_2228;
else
alg_version = ALG_2301;
break;
case 1:
alg_version = ALG_2201;
default:
alg_version = ALG_UNKNOWN;
case 1: alg_version = ALG_2201;
default: alg_version = ALG_UNKNOWN;
}
alg_vidmem = 256 << (read_vga_register (port_crtc, 0x1e) & 3);
alg_vidmem = 256 << (read_vga_register(port_crtc, 0x1e) & 3);
}
}
write_vga_register (port_crtc, 0x1a, old);
write_vga_register(port_crtc, 0x1a, old);
return alg_version;
}
/* create_available_mode_list:
* Scans the mode list checking memory requirements. Modes
* which pass the test go into the available_modes list.
*/
void create_available_mode_list()
{
void create_available_mode_list( ) {
struct mode_t *mode;
short *current_mode_in_list = available_modes;
for (mode = mode_list; mode->mode; mode++)
if (mode->w * mode->h * BYTES_PER_PIXEL (mode->bpp) < alg_vidmem * 1024)
if (mode->w * mode->h * BYTES_PER_PIXEL(mode->bpp) < alg_vidmem * 1024)
*current_mode_in_list++ = mode->mode;
*current_mode_in_list = -1;
}
/* SetupDriver:
* The first thing ever to be called after our code has been relocated.
* This is in charge of filling in the driver header with all the required
* information and function pointers. We do not yet have access to the
* video memory, so we can't talk directly to the card.
*/
int SetupDriver(AF_DRIVER *af)
{
int SetupDriver(AF_DRIVER *af) {
int i;
if (!detect_alg()) return -1;
if (!detect_alg( )) return -1;
create_available_mode_list();
create_available_mode_list( );
/* pointer to a list of the available mode numbers, ended by -1 */
af->AvailableModes = available_modes;
@ -244,10 +215,10 @@ int SetupDriver(AF_DRIVER *af)
/* driver attributes (see definitions in vbeaf.h) */
af->Attributes = alg_caps[alg_version];
#if 0
#if 0
if (linear_addr)
af->Attributes |= afHaveLinearBuffer;
#endif
#endif
/* banked memory size and location: zero if not supported */
af->BankSize = 64;
@ -261,7 +232,7 @@ int SetupDriver(AF_DRIVER *af)
af->IOPortsTable = ports_table;
/* list physical memory regions that we need to access (zero for none) */
for (i=0; i<4; i++) {
for (i = 0; i < 4; i++) {
af->IOMemoryBase[i] = 0;
af->IOMemoryLen[i] = 0;
}
@ -306,11 +277,11 @@ int SetupDriver(AF_DRIVER *af)
af->WaitTillIdle = WaitTillIdle;
/* on some cards the CPU cannot access the framebuffer while it is in
* hardware drawing mode. If this is the case, you should fill in these
* functions with routines to switch in and out of the accelerator mode.
* hardware drawing mode. If this is the case, you should fill in these
* functions with routines to switch in and out of the accelerator mode.
* The application will call EnableDirectAccess() whenever it is about
* to write to the framebuffer directly, and DisableDirectAccess()
* before it calls any hardware drawing routines. If this arbitration is
* to write to the framebuffer directly, and DisableDirectAccess()
* before it calls any hardware drawing routines. If this arbitration is
* not required, leave these routines as NULL.
*/
af->EnableDirectAccess = NULL;
@ -407,120 +378,105 @@ int SetupDriver(AF_DRIVER *af)
af->StartVideoFrame = NULL;
af->EndVideoFrame = NULL;
return 0;
return 0;
}
/* InitDriver:
* The second thing to be called during the init process, after the
* The second thing to be called during the init process, after the
* application has mapped all the memory and I/O resources we need.
* This is in charge of finding the card, returning 0 on success or
* -1 to abort.
*/
int InitDriver(AF_DRIVER *af)
{
return 0;
int InitDriver(AF_DRIVER *af) {
return 0;
}
/* FreeBEX:
* Returns an interface structure for the requested FreeBE/AF extension.
*/
void *FreeBEX(AF_DRIVER *af, unsigned long id)
{
switch (id) {
default:
return NULL;
}
void *FreeBEX(AF_DRIVER *af, unsigned long id) {
switch (id) {
default: return NULL;
}
}
/* ExtStub:
* Vendor-specific extension hook: we don't provide any.
*/
int ExtStub()
{
return 0;
int ExtStub( ) {
return 0;
}
/* findmode:
* Finds the given mode's entry in the mode list.
*/
struct mode_t *findmode (int mode)
{
struct mode_t *findmode(int mode) {
struct mode_t *ret;
for (ret = mode_list; ret->mode; ret++)
if (ret->mode == mode) return ret;
return NULL;
}
/* get_field_data:
* Fills in the mask size and position of each part of a pixel
* for the given colour depth.
*/
void get_field_data (int bpp, char *rm, char *rp, char *gm, char *gp, char *bm, char *bp, char *xm, char *xp)
{
void get_field_data(int bpp, char *rm, char *rp, char *gm, char *gp, char *bm,
char *bp, char *xm, char *xp) {
int pos = 0;
#define FIELD(xxx,size) *xxx##p = pos; pos += (*xxx##m = size)
#define FIELD(xxx, size) \
*xxx##p = pos; \
pos += (*xxx##m = size)
switch (bpp) {
case 15:
FIELD (b, 5);
FIELD (g, 5);
FIELD (r, 5);
FIELD (x, 1);
FIELD(b, 5);
FIELD(g, 5);
FIELD(r, 5);
FIELD(x, 1);
break;
case 16:
FIELD (b, 5);
FIELD (g, 6);
FIELD (r, 5);
FIELD (x, 0);
FIELD(b, 5);
FIELD(g, 6);
FIELD(r, 5);
FIELD(x, 0);
break;
case 24:
FIELD (b, 8);
FIELD (g, 8);
FIELD (r, 8);
FIELD (x, 0);
FIELD(b, 8);
FIELD(g, 8);
FIELD(r, 8);
FIELD(x, 0);
break;
case 32:
FIELD (b, 8);
FIELD (g, 8);
FIELD (r, 8);
FIELD (x, 8);
FIELD(b, 8);
FIELD(g, 8);
FIELD(r, 8);
FIELD(x, 8);
break;
default:
FIELD (b, 0);
FIELD (g, 0);
FIELD (r, 0);
FIELD (x, 0);
FIELD(b, 0);
FIELD(g, 0);
FIELD(r, 0);
FIELD(x, 0);
}
#undef FIELD
#undef FIELD
}
/* GetVideoModeInfo:
* Retrieves information about this video mode, returning zero on success
* or -1 if the mode is invalid.
*/
long GetVideoModeInfo(AF_DRIVER *af, short mode, AF_MODE_INFO *modeInfo)
{
long GetVideoModeInfo(AF_DRIVER *af, short mode, AF_MODE_INFO *modeInfo) {
int i;
int bytes_per_scanline;
struct mode_t *info = findmode (mode);
struct mode_t *info = findmode(mode);
if (!info) return -1;
/* clear the structure to zero */
for (i = 0; i < (int)sizeof(AF_MODE_INFO); i++)
((char *)modeInfo)[i] = 0;
for (i = 0; i < (int)sizeof(AF_MODE_INFO); i++) ((char *)modeInfo)[i] = 0;
/* copy data across from our stored list of mode attributes */
modeInfo->Attributes = alg_caps[alg_version];
@ -532,8 +488,8 @@ long GetVideoModeInfo(AF_DRIVER *af, short mode, AF_MODE_INFO *modeInfo)
bytes_per_scanline = info->w * BYTES_PER_PIXEL(info->bpp);
/* available pages of video memory */
modeInfo->MaxBuffers = (alg_vidmem * 1024 - RESERVED_VRAM) /
(bytes_per_scanline * info->h);
modeInfo->MaxBuffers =
(alg_vidmem * 1024 - RESERVED_VRAM) / (bytes_per_scanline * info->h);
/* maximum virtual scanline length in both bytes and pixels. How wide
* this can go will very much depend on the card: 1024 is pretty safe
@ -541,19 +497,18 @@ long GetVideoModeInfo(AF_DRIVER *af, short mode, AF_MODE_INFO *modeInfo)
* is capable of them.
*/
modeInfo->MaxScanLineWidth = 1024;
modeInfo->MaxBytesPerScanLine = modeInfo->MaxScanLineWidth*BYTES_PER_PIXEL(info->bpp);
modeInfo->MaxBytesPerScanLine =
modeInfo->MaxScanLineWidth * BYTES_PER_PIXEL(info->bpp);
/* for banked video modes, fill in these variables: */
modeInfo->BytesPerScanLine = bytes_per_scanline;
modeInfo->BnkMaxBuffers = modeInfo->MaxBuffers;
get_field_data (
info->bpp,
&modeInfo->RedMaskSize, &modeInfo->RedFieldPosition,
&modeInfo->GreenMaskSize, &modeInfo->GreenFieldPosition,
&modeInfo->BlueMaskSize, &modeInfo->BlueFieldPosition,
&modeInfo->RsvdMaskSize, &modeInfo->RsvdFieldPosition
);
get_field_data(info->bpp, &modeInfo->RedMaskSize,
&modeInfo->RedFieldPosition, &modeInfo->GreenMaskSize,
&modeInfo->GreenFieldPosition, &modeInfo->BlueMaskSize,
&modeInfo->BlueFieldPosition, &modeInfo->RsvdMaskSize,
&modeInfo->RsvdFieldPosition);
/* for linear video modes, fill in these variables: */
modeInfo->LinBytesPerScanLine = bytes_per_scanline;
@ -578,16 +533,14 @@ long GetVideoModeInfo(AF_DRIVER *af, short mode, AF_MODE_INFO *modeInfo)
return 0;
}
/* setvstart:
* Sets the display start address.
*/
void setvstart (int x, int y)
{
int addr = af_width * y + x * BYTES_PER_PIXEL (af_bpp);
void setvstart(int x, int y) {
int addr = af_width * y + x * BYTES_PER_PIXEL(af_bpp);
int display, pixels;
if (read_vga_register (port_grc, 0x0c) & 0x10) {
if (read_vga_register(port_grc, 0x0c) & 0x10) {
display = addr >> 3;
pixels = addr & 7;
} else {
@ -595,12 +548,11 @@ void setvstart (int x, int y)
pixels = addr & 3;
}
write_vga_register (port_crtc, 0x20, (display >> 16) & 0x07);
write_vga_register (port_crtc, 0x0c, (display >> 8) & 0xff);
write_vga_register (port_crtc, 0x0d, display & 0xff);
write_vga_register(port_crtc, 0x20, (display >> 16) & 0x07);
write_vga_register(port_crtc, 0x0c, (display >> 8) & 0xff);
write_vga_register(port_crtc, 0x0d, display & 0xff);
}
/* SetVideoMode:
* Sets the specified video mode, returning zero on success.
*
@ -613,8 +565,8 @@ void setvstart (int x, int y)
* 0x0800 = use refresh rate control
* 0x0400 = use hardware stereo
*/
long SetVideoMode(AF_DRIVER *af, short mode, long virtualX, long virtualY, long *bytesPerLine, int numBuffers, AF_CRTCInfo *crtc)
{
long SetVideoMode(AF_DRIVER *af, short mode, long virtualX, long virtualY,
long *bytesPerLine, int numBuffers, AF_CRTCInfo *crtc) {
int linear = ((mode & 0x4000) != 0);
long available_vram;
long used_vram;
@ -623,13 +575,12 @@ long SetVideoMode(AF_DRIVER *af, short mode, long virtualX, long virtualY, long
int interlaced, word_mode, double_word_mode, _8maps, shift;
/* reject anything with hardware stereo */
if (mode & 0x400)
return -1;
if (mode & 0x400) return -1;
/* mask off the other flag bits */
mode &= 0x3FF;
info = findmode (mode);
info = findmode(mode);
if (!info) return -1;
/* reject the linear flag if the mode doesn't support it */
@ -637,20 +588,20 @@ long SetVideoMode(AF_DRIVER *af, short mode, long virtualX, long virtualY, long
/* set the mode */
r.x.ax = info->mode;
rm_int (0x10, &r);
rm_int(0x10, &r);
if (r.h.ah) return -1;
setinx (port_crtc, 0x1A, 0x10); /* enable extensions */
setinx (port_crtc, 0x19, 0x02); /* enable >256k */
setinx (port_grc, 0x0F, 0x04); /* enable separate R/W banks */
setinx(port_crtc, 0x1A, 0x10); /* enable extensions */
setinx(port_crtc, 0x19, 0x02); /* enable >256k */
setinx(port_grc, 0x0F, 0x04); /* enable separate R/W banks */
af_bpp = info->bpp;
/* get some information about the mode */
interlaced = read_vga_register (port_crtc, 0x19) & 1;
double_word_mode = !!(read_vga_register (port_crtc, 0x14) & 0x40);
word_mode = !(read_vga_register (port_crtc, 0x17) & 0x40);
_8maps = !!(read_vga_register (0x3ce, 0x0c) & 0x10);
interlaced = read_vga_register(port_crtc, 0x19) & 1;
double_word_mode = !!(read_vga_register(port_crtc, 0x14) & 0x40);
word_mode = !(read_vga_register(port_crtc, 0x17) & 0x40);
_8maps = !!(read_vga_register(0x3ce, 0x0c) & 0x10);
/* calculate the shift factor for the scanline byte width */
shift = 0;
@ -664,7 +615,7 @@ long SetVideoMode(AF_DRIVER *af, short mode, long virtualX, long virtualY, long
if (interlaced) shift--;
/* sort out the virtaul screen size */
af_width = MAX (info->w, virtualX) * BYTES_PER_PIXEL (af_bpp);
af_width = MAX(info->w, virtualX) * BYTES_PER_PIXEL(af_bpp);
af_width = (((af_width - 1) >> shift) + 1) << shift;
/* test: force it to be power of two */
@ -675,10 +626,10 @@ long SetVideoMode(AF_DRIVER *af, short mode, long virtualX, long virtualY, long
}
/* Set scanline width */
write_vga_register (port_crtc, 0x13, af_width >> shift);
write_vga_register(port_crtc, 0x13, af_width >> shift);
/* could also write bit 8 to port_crtc:0x28 bit 8 */
af_height = MAX (info->h, virtualY);
af_height = MAX(info->h, virtualY);
af_linear = linear;
af_lines_per_bank = af->BankSize * 1024 / af_width;
@ -687,13 +638,13 @@ long SetVideoMode(AF_DRIVER *af, short mode, long virtualX, long virtualY, long
af_scroll_x = 0;
af_scroll_y = 0;
setvstart (af_scroll_x, af_scroll_y);
setvstart(af_scroll_x, af_scroll_y);
af_bank = 0;
/* return framebuffer dimensions to the application */
af->BufferEndX = af_width/BYTES_PER_PIXEL(af_bpp)-1;
af->BufferEndY = af_height-1;
af->BufferEndX = af_width / BYTES_PER_PIXEL(af_bpp) - 1;
af->BufferEndY = af_height - 1;
af->OriginOffset = 0;
used_vram = af_width * af_height * numBuffers;
@ -701,10 +652,10 @@ long SetVideoMode(AF_DRIVER *af, short mode, long virtualX, long virtualY, long
if (used_vram > available_vram) return -1;
if (available_vram-used_vram >= af_width) {
if (available_vram - used_vram >= af_width) {
af->OffscreenOffset = used_vram;
af->OffscreenStartY = af_height*numBuffers;
af->OffscreenEndY = available_vram/af_width-1;
af->OffscreenStartY = af_height * numBuffers;
af->OffscreenEndY = available_vram / af_width - 1;
} else {
af->OffscreenOffset = 0;
af->OffscreenStartY = 0;
@ -717,40 +668,32 @@ long SetVideoMode(AF_DRIVER *af, short mode, long virtualX, long virtualY, long
return 0;
}
/* RestoreTextMode:
* Returns to text mode, shutting down the accelerator hardware.
*/
void RestoreTextMode(AF_DRIVER *af)
{
RM_REGS r;
void RestoreTextMode(AF_DRIVER *af) {
RM_REGS r;
r.x.ax = 3;
rm_int(0x10, &r);
r.x.ax = 3;
rm_int(0x10, &r);
}
/* GetClosestPixelClock:
* I don't have a clue what this should return: it is used for the
* refresh rate control.
*/
long GetClosestPixelClock(AF_DRIVER *af, short mode, unsigned long pixelClock)
{
/* ??? */
return 135000000;
long GetClosestPixelClock(AF_DRIVER *af, short mode, unsigned long pixelClock) {
/* ??? */
return 135000000;
}
/* SaveRestoreState:
* Stores the current driver status: not presently implemented.
*/
void SaveRestoreState(AF_DRIVER *af, int subfunc, void *saveBuf)
{
/* not implemented (not used by Allegro) */
void SaveRestoreState(AF_DRIVER *af, int subfunc, void *saveBuf) {
/* not implemented (not used by Allegro) */
}
/* SetDisplayStart:
* Hardware scrolling function. The waitVRT value may be one of:
*
@ -758,109 +701,98 @@ void SaveRestoreState(AF_DRIVER *af, int subfunc, void *saveBuf)
* 0 = set values and return immediately
* 1 = set values and wait for retrace
*/
void SetDisplayStart(AF_DRIVER *af, long x, long y, long waitVRT)
{
void SetDisplayStart(AF_DRIVER *af, long x, long y, long waitVRT) {
af_scroll_x = x;
af_scroll_y = y;
if (waitVRT >= 0) setvstart (x, y);
if (waitVRT >= 0) setvstart(x, y);
if (waitVRT == 1) {
while (inportb (0x3da) & 8);
while (!(inportb (0x3da) & 8));
while (inportb(0x3da) & 8)
;
while (!(inportb(0x3da) & 8))
;
}
}
/* SetActiveBuffer:
* Sets which buffer is being drawn onto, for use in multi buffering
* systems (not used by Allegro).
*/
void SetActiveBuffer(AF_DRIVER *af, long index)
{
if (af->OffscreenOffset) {
af->OffscreenStartY += af_active_page*af_height;
af->OffscreenEndY += af_active_page*af_height;
}
void SetActiveBuffer(AF_DRIVER *af, long index) {
if (af->OffscreenOffset) {
af->OffscreenStartY += af_active_page * af_height;
af->OffscreenEndY += af_active_page * af_height;
}
af_active_page = index;
af_active_page = index;
af->OriginOffset = af_width*af_height*index;
af->OriginOffset = af_width * af_height * index;
if (af->OffscreenOffset) {
af->OffscreenStartY -= af_active_page*af_height;
af->OffscreenEndY -= af_active_page*af_height;
}
if (af->OffscreenOffset) {
af->OffscreenStartY -= af_active_page * af_height;
af->OffscreenEndY -= af_active_page * af_height;
}
}
/* SetVisibleBuffer:
* Sets which buffer is displayed on the screen, for use in multi buffering
* systems (not used by Allegro).
*/
void SetVisibleBuffer(AF_DRIVER *af, long index, long waitVRT)
{
af_visible_page = index;
void SetVisibleBuffer(AF_DRIVER *af, long index, long waitVRT) {
af_visible_page = index;
SetDisplayStart(af, af_scroll_x, af_scroll_y, waitVRT);
SetDisplayStart(af, af_scroll_x, af_scroll_y, waitVRT);
}
/* GetDisplayStartStatus:
* Status poll for triple buffering. Not possible on the majority of
* present cards: this function is just a placeholder.
*/
int GetDisplayStartStatus(AF_DRIVER *af)
{
return 1;
int GetDisplayStartStatus(AF_DRIVER *af) {
return 1;
}
/* SetPaletteData:
* Palette setting routine.
*/
void SetPaletteData(AF_DRIVER *af, AF_PALETTE *pal, long num, long index, long waitVRT)
{
int i;
void SetPaletteData(AF_DRIVER *af, AF_PALETTE *pal, long num, long index,
long waitVRT) {
int i;
if (waitVRT) {
do {
} while (inportb(0x3DA) & 8);
if (waitVRT) {
do {
} while (inportb(0x3DA) & 8);
do {
} while (!(inportb(0x3DA) & 8));
}
do { } while (!(inportb(0x3DA) & 8)); }
for (i=0; i<num; i++) {
outportb(0x3C8, index+i);
outportb(0x3C9, pal[i].red/4);
outportb(0x3C9, pal[i].green/4);
outportb(0x3C9, pal[i].blue/4);
}
for (i = 0; i < num; i++) {
outportb(0x3C8, index + i);
outportb(0x3C9, pal[i].red / 4);
outportb(0x3C9, pal[i].green / 4);
outportb(0x3C9, pal[i].blue / 4);
}
}
/* SetBank32:
* Relocatable bank switch function. This is called with a bank number in
* %edx. I'm not sure what registers it is allowed to clobber, so it is
* %edx. I'm not sure what registers it is allowed to clobber, so it is
* probably a good idea to save them all.
*
* This function may be copied anywhere within the address space of the
* calling program, so it must be 100% relocatable. That means that you
* must not refer to any internal variables of the /AF driver, because
* calling program, so it must be 100% relocatable. That means that you
* must not refer to any internal variables of the /AF driver, because
* you know nothing about where in memory it will be located. Your only
* input is the bank number in %edx, and your only output should be
* changing the relevant hardware registers.
*
* If you are unable to provide a relocatable bank switcher of this type,
* remove this function (clear the SetBank32 pointer to NULL during the
* header init), and fill in the SetBank() routine below instead. Allegro
* only ever uses SetBank(), so there will be no problem with leaving this
* function out, but you may have problems running other VBE/AF
* remove this function (clear the SetBank32 pointer to NULL during the
* header init), and fill in the SetBank() routine below instead. Allegro
* only ever uses SetBank(), so there will be no problem with leaving this
* function out, but you may have problems running other VBE/AF
* applications if you don't provide it.
*/
asm ("
#
#
.globl _SetBank32, _SetBank32End
.align 4
@ -881,7 +813,7 @@ asm ("
ret
_SetBank32End:
#
#
");
@ -894,13 +826,9 @@ asm ("
*/
void SetBank(AF_DRIVER *af, long bank)
{
asm (
" call _SetBank32 "
:
: "d" (bank)
);
asm(" call _SetBank32 " : : "d"(bank));
af_bank = bank;
af_bank = bank;
}
@ -910,11 +838,13 @@ void SetBank(AF_DRIVER *af, long bank)
*/
void WaitTillIdle(AF_DRIVER *af)
{
#ifndef USE_ALTERNATIVE_IDLE_CHECK
while (inportb (0x82aa) & 0x0f);
#else
while (inportb (0x82ba) & 0x80);
#endif
#ifndef USE_ALTERNATIVE_IDLE_CHECK
while (inportb(0x82aa) & 0x0f)
;
#else
while (inportb(0x82ba) & 0x80)
;
#endif
}
@ -938,11 +868,10 @@ void WaitTillIdle(AF_DRIVER *af)
*/
void SetMix(AF_DRIVER *af, long foreMix, long backMix)
{
af_fore_mix = foreMix;
af_fore_mix = foreMix;
if (backMix == AF_FORE_MIX)
af_back_mix = foreMix;
else
af_back_mix = backMix;
if (backMix == AF_FORE_MIX)
af_back_mix = foreMix;
else
af_back_mix = backMix;
}

View File

@ -1,7 +1,7 @@
/*
* ______ ____ ______ _____ ______
* ______ ____ ______ _____ ______
* | ____| | _ \| ____| / / _ \| ____|
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | __| '__/ _ \/ _ \ _ <| __| / /| _ | __|
* | | | | | __/ __/ |_) | |____ / / | | | | |
* |_| |_| \___|\___|____/|______/_/ |_| |_|_|
@ -12,34 +12,29 @@
* See freebe.txt for copyright information.
*/
#include "vbeaf.h"
AF_DRIVER drvhdr =
{
"VBEAF.DRV", /* Signature */
0x200, /* Version */
0, /* DriverRev */
"FreeBE/AF Avance Logic driver " FREEBE_VERSION, /* OemVendorName */
"This driver is free software", /* OemCopyright */
NULL, /* AvailableModes */
0, /* TotalMemory */
0, /* Attributes */
0, /* BankSize */
0, /* BankedBasePtr */
0, /* LinearSize */
0, /* LinearBasePtr */
0, /* LinearGranularity */
NULL, /* IOPortsTable */
{ NULL, NULL, NULL, NULL }, /* IOMemoryBase */
{ 0, 0, 0, 0 }, /* IOMemoryLen */
0, /* LinearStridePad */
-1, /* PCIVendorID */
-1, /* PCIDeviceID */
-1, /* PCISubSysVendorID */
-1, /* PCISubSysID */
0 /* Checksum */
AF_DRIVER drvhdr = {
"VBEAF.DRV", /* Signature */
0x200, /* Version */
0, /* DriverRev */
"FreeBE/AF Avance Logic driver " FREEBE_VERSION, /* OemVendorName */
"This driver is free software", /* OemCopyright */
NULL, /* AvailableModes */
0, /* TotalMemory */
0, /* Attributes */
0, /* BankSize */
0, /* BankedBasePtr */
0, /* LinearSize */
0, /* LinearBasePtr */
0, /* LinearGranularity */
NULL, /* IOPortsTable */
{ NULL, NULL, NULL, NULL }, /* IOMemoryBase */
{ 0, 0, 0, 0 }, /* IOMemoryLen */
0, /* LinearStridePad */
-1, /* PCIVendorID */
-1, /* PCIDeviceID */
-1, /* PCISubSysVendorID */
-1, /* PCISubSysID */
0 /* Checksum */
};

View File

@ -4,28 +4,28 @@
#include <pc.h>
typedef enum {
CLGD5426, //1
CLGD5428, //1
CLGD5429, //2
CLGD5430, //3
CLGD5434, //4
CLGD5434E, //5
CLGD5436, //6
CLGD5440, //7
CLGD5446, //8
CLGD5480, //9
CLGD7541, //10
CLGD7542, //11
CLGD7543, //10
CLGD7548, //12
CLGD7555, //13
CLGD7556 //13
CLGD5426, // 1
CLGD5428, // 1
CLGD5429, // 2
CLGD5430, // 3
CLGD5434, // 4
CLGD5434E, // 5
CLGD5436, // 6
CLGD5440, // 7
CLGD5446, // 8
CLGD5480, // 9
CLGD7541, // 10
CLGD7542, // 11
CLGD7543, // 10
CLGD7548, // 12
CLGD7555, // 13
CLGD7556 // 13
} cirrus_types;
#define KNOWN_CARDS 16
//54m30
//54m40 - triple buffer, transparent color register
// 54m30
// 54m40 - triple buffer, transparent color register
/*
1 - the oldest BitBLT capable chips, !!for color-expand with transparency
transparent color is used !!, maxwidth 2047, maxpitch 4095, maxheight 1023,
@ -33,41 +33,34 @@ all BitBLT registers except src&dstaddr are preserved, allow at most 7 bits
to be discarded with color expansion at the end of each scanline, color
expansion and hw cursor in 8 and 15/16bpp supported
2 - supports MMIO at b8000 or at the end of linear address space (2mb-256),
!!for color-expand with transparency 0 bits are just skipped!!, maxpitch 8191, color expansion
with left edge clipping&pattern vertical preset, supports color expanded
pattern polygon fills
3 - like 2, ? need srcaddr to be written for color expansion system to
screen ?, hw cursor also at 24/32bpp
4 - like 3, but 64 bit, maxwidth 8191, doesn't support clipping&vertical
preset and polygon fills, color expansion in 32bpp supported, for color
expansion with transparency all 4 bytes of fg color has to be written and 4
bytes of color has to be filled with not fg color, has bug in system to
display memory transfers, hw cursor also at 24/32bpp,
5 - the bug is corrected
6 - like 2, but 64 bit, maxwidth 8191, maxheight 2047,supports solid fill,
color expansion in 24 and 32bpp, for 24bpp color expansion transparency must
be enabled, but can invert the meaning of input data, so normal color
expansion can de done in two passes, has auto-start capability, hw cursor
also at 24/32bpp, triple buffer ?
7 - like 3 with video features
8 - like 9, no clipping, no X-Y pos.
9 - like 6, has clip rectangle, X-Y positioning, command list with possible
interrupt on completion, left edge clipping more complex, can probably triple
buffer, color expand with uses transparent color, no transparent mask
10 - (7541,7543) like 1, height is _not_ preserved
11 - (7542) don't know anything
12 - (7548) like 1 with MMIO, autostart, height is _not_ preserved
13 - (7555-6) like 6, MMIO in PCI 0x14 or offset 0x3fff00, triple buffer
GR16-17, no 32bpp color expansion, autostart
if banked GR6[3:2]=01,SR17[6]=0,SR17[7:4]=0
else SR17[6]=1,SR17[7:4]!=0
!!for color-expand with transparency 0 bits are just skipped!!, maxpitch 8191,
color expansion with left edge clipping&pattern vertical preset, supports color
expanded pattern polygon fills 3 - like 2, ? need srcaddr to be written for
color expansion system to screen ?, hw cursor also at 24/32bpp 4 - like 3, but
64 bit, maxwidth 8191, doesn't support clipping&vertical preset and polygon
fills, color expansion in 32bpp supported, for color expansion with transparency
all 4 bytes of fg color has to be written and 4 bytes of color has to be filled
with not fg color, has bug in system to display memory transfers, hw cursor also
at 24/32bpp, 5 - the bug is corrected 6 - like 2, but 64 bit, maxwidth 8191,
maxheight 2047,supports solid fill, color expansion in 24 and 32bpp, for 24bpp
color expansion transparency must be enabled, but can invert the meaning of
input data, so normal color expansion can de done in two passes, has auto-start
capability, hw cursor also at 24/32bpp, triple buffer ? 7 - like 3 with video
features 8 - like 9, no clipping, no X-Y pos. 9 - like 6, has clip rectangle,
X-Y positioning, command list with possible interrupt on completion, left edge
clipping more complex, can probably triple buffer, color expand with uses
transparent color, no transparent mask 10 - (7541,7543) like 1, height is _not_
preserved 11 - (7542) don't know anything 12 - (7548) like 1 with MMIO,
autostart, height is _not_ preserved 13 - (7555-6) like 6, MMIO in PCI 0x14 or
offset 0x3fff00, triple buffer GR16-17, no 32bpp color expansion, autostart if
banked GR6[3:2]=01,SR17[6]=0,SR17[7:4]=0 else SR17[6]=1,SR17[7:4]!=0
*/
typedef struct {
cirrus_types model;
int biosnum,pcinum;
char *desc;
int family;
cirrus_types model;
int biosnum, pcinum;
char *desc;
int family;
} CIRRUS_DETECT;
extern unsigned long af_mmio;
@ -75,38 +68,26 @@ extern unsigned long af_mmio;
#define GRX 0x3ce
#define _crtc 0x3d4
__inline__ void _vsync_out_h()
{
do {
} while (inportb(0x3DA) & 1);
}
__inline__ void _vsync_out_h( ) {
do { } while (inportb(0x3DA) & 1); }
/* _vsync_out_v:
* Waits until the VGA is not in a vertical retrace.
*/
__inline__ void _vsync_out_v()
{
do {
} while (inportb(0x3DA) & 8);
}
__inline__ void _vsync_out_v( ) {
do { } while (inportb(0x3DA) & 8); }
/* _vsync_in:
* Waits until the VGA is in the vertical retrace period.
*/
__inline__ void _vsync_in()
{
do {
} while (!(inportb(0x3DA) & 8));
}
__inline__ void _vsync_in( ) {
do { } while (!(inportb(0x3DA) & 8)); }
/* _write_hpp:
* Writes to the VGA pelpan register.
*/
__inline__ void _write_hpp(int value)
{
write_vga_register(0x3C0, 0x33, value);
__inline__ void _write_hpp(int value) {
write_vga_register(0x3C0, 0x33, value);
}
#define outm1(index, value) *(volatile char *)(af_mmio + index) = (value)
@ -114,108 +95,115 @@ __inline__ void _write_hpp(int value)
#define outm4(index, value) *(volatile long *)(af_mmio + index) = (value)
#define inmb(index) *(volatile char *)(af_mmio + index)
__inline__ void outp1(unsigned short port,unsigned char index,unsigned char value)
{
unsigned short w;
__inline__ void outp1(unsigned short port, unsigned char index,
unsigned char value) {
unsigned short w;
w=index;
w|=value<<8;
outportw(port,w);
w = index;
w |= value << 8;
outportw(port, w);
}
__inline__ void outp2(unsigned short port,unsigned char index,unsigned short value)
{
unsigned short w;
__inline__ void outp2(unsigned short port, unsigned char index,
unsigned short value) {
unsigned short w;
w=index;
w|=((value&0xff)<<8);
outportw(port,w);
w=index+1;
w|=(value&0xff00);
outportw(port,w);
w = index;
w |= ((value & 0xff) << 8);
outportw(port, w);
w = index + 1;
w |= (value & 0xff00);
outportw(port, w);
}
__inline__ void outp3(unsigned short port,unsigned char index,unsigned long value)
{
unsigned short w;
__inline__ void outp3(unsigned short port, unsigned char index,
unsigned long value) {
unsigned short w;
w=index;
w|=(value&0xff)<<8;
outportw(port,w);
w=index+1;
w|=(value&0xff00);
outportw(port,w);
w=index+2;
w|=(value>>8)&0xff00;
outportw(port,w);
w = index;
w |= (value & 0xff) << 8;
outportw(port, w);
w = index + 1;
w |= (value & 0xff00);
outportw(port, w);
w = index + 2;
w |= (value >> 8) & 0xff00;
outportw(port, w);
}
#define DISABLE() asm volatile ("cli");
#define ENABLE() asm volatile ("sti");
#define DISABLE( ) asm volatile("cli");
#define ENABLE( ) asm volatile("sti");
#define CIR_FORG8(color) outp1(GRX,0x01,(color))
#define CIR_FORG8(color) outp1(GRX, 0x01, (color))
#define CIR_FORG16(color) outp1(GRX,0x01,(color) & 0xff); \
outp1(GRX,0x11,((color)>>8) & 0xff)
#define CIR_FORG24(color) outp1(GRX,0x01,(color) & 0xff); \
outp1(GRX,0x11,((color)>>8) & 0xff); \
outp1(GRX,0x13,((color)>>16) & 0xff)
#define CIR_FORG32(color) outp1(GRX,0x01,(color) & 0xff); \
outp1(GRX,0x11,((color)>>8) & 0xff); \
outp1(GRX,0x13,((color)>>16) & 0xff); \
outp1(GRX,0x15,((color)>>24) & 0xff)
#define CIR_FORG16(color) \
outp1(GRX, 0x01, (color)&0xff); \
outp1(GRX, 0x11, ((color) >> 8) & 0xff)
#define CIR_FORG24(color) \
outp1(GRX, 0x01, (color)&0xff); \
outp1(GRX, 0x11, ((color) >> 8) & 0xff); \
outp1(GRX, 0x13, ((color) >> 16) & 0xff)
#define CIR_FORG32(color) \
outp1(GRX, 0x01, (color)&0xff); \
outp1(GRX, 0x11, ((color) >> 8) & 0xff); \
outp1(GRX, 0x13, ((color) >> 16) & 0xff); \
outp1(GRX, 0x15, ((color) >> 24) & 0xff)
#define CIR_BACKG8(color) outp1(GRX,0x00,(color))
#define CIR_BACKG16(color) outp1(GRX,0x00,(color) & 0xff); \
outp1(GRX,0x10,((color)>>8) & 0xff)
#define CIR_BACKG24(color) outp1(GRX,0x00,(color) & 0xff); \
outp1(GRX,0x10,((color)>>8) & 0xff); \
outp1(GRX,0x12,((color)>>16) & 0xff)
#define CIR_BACKG32(color) outp1(GRX,0x00,(color) & 0xff); \
outp1(GRX,0x10,((color)>>8) & 0xff); \
outp1(GRX,0x12,((color)>>16) & 0xff); \
outp1(GRX,0x14,((color)>>24) & 0xff)
#define CIR_BACKG8(color) outp1(GRX, 0x00, (color))
#define CIR_BACKG16(color) \
outp1(GRX, 0x00, (color)&0xff); \
outp1(GRX, 0x10, ((color) >> 8) & 0xff)
#define CIR_BACKG24(color) \
outp1(GRX, 0x00, (color)&0xff); \
outp1(GRX, 0x10, ((color) >> 8) & 0xff); \
outp1(GRX, 0x12, ((color) >> 16) & 0xff)
#define CIR_BACKG32(color) \
outp1(GRX, 0x00, (color)&0xff); \
outp1(GRX, 0x10, ((color) >> 8) & 0xff); \
outp1(GRX, 0x12, ((color) >> 16) & 0xff); \
outp1(GRX, 0x14, ((color) >> 24) & 0xff)
#define CIR_FORG8MMIO(color) outm1(0x04,(color))
#define CIR_FORG16MMIO(color) outm2(0x04,(color))
#define CIR_FORG24MMIO(color) outm4(0x04,(color))
#define CIR_FORG32MMIO(color) outm4(0x04,(color))
#define CIR_FORG8MMIO(color) outm1(0x04, (color))
#define CIR_FORG16MMIO(color) outm2(0x04, (color))
#define CIR_FORG24MMIO(color) outm4(0x04, (color))
#define CIR_FORG32MMIO(color) outm4(0x04, (color))
#define CIR_BACKG8MMIO(color) outm1(0x00,(color))
#define CIR_BACKG16MMIO(color) outm2(0x00,(color))
#define CIR_BACKG24MMIO(color) outm4(0x00,(color))
#define CIR_BACKG32MMIO(color) outm4(0x00,(color))
#define CIR_BACKG8MMIO(color) outm1(0x00, (color))
#define CIR_BACKG16MMIO(color) outm2(0x00, (color))
#define CIR_BACKG24MMIO(color) outm4(0x00, (color))
#define CIR_BACKG32MMIO(color) outm4(0x00, (color))
#define SET_WIDTH_HEIGHTMMIO(width,height) outm4(0x08,(width)|(((height)<<16)))
#define SET_WIDTH_HEIGHTMMIO(width, height) \
outm4(0x08, (width) | (((height) << 16)))
#define SET_PITCHESMMIO(src,dst) outm4(0x0c,(dst)|((src)<<16)
#define SET_PITCHESMMIO(src, dst) outm4(0x0c,(dst)|((src)<<16)
#define SET_DSTADDRMMIO(address) outm4(0x10,address)
#define SET_DSTADDRMMIO(address) outm4(0x10, address)
/* in last byte of is left edge clipping - to be added */
#define SET_SRCADDRMMIO(address) outm4(0x14,address)
#define SET_SRCADDRMMIO(address) outm4(0x14, address)
#define CIR_ROP_MODEMMIO(rop,mode) outm4(0x18,(mode)|((rop)<<16))
#define CIR_ROP_MODEMMIO(rop, mode) outm4(0x18, (mode) | ((rop) << 16))
#define CIR_BLTROPMMIO(rop) outm1(0x1a,rop)
#define CIR_BLTMODEMMIO(mode) outm1(0x18,mode)
#define CIR_BLTROPMMIO(rop) outm1(0x1a, rop)
#define CIR_BLTMODEMMIO(mode) outm1(0x18, mode)
#define CIR_WIDTH(width) outp2(GRX,0x20,width)
#define CIR_HEIGHT(height) outp2(GRX,0x22,height)
#define CIR_DSTPITCH(pitch) outp2(GRX,0x24,pitch)
#define CIR_SRCPITCH(pitch) outp2(GRX,0x26,pitch)
#define SET_DSTADDR(address) outp3(GRX,0x28,address)
#define SET_SRCADDR(address) outp3(GRX,0x2c,address)
#define CIR_BLTMODE(mode) outp1(GRX,0x30,mode)
#define CIR_BLTROP(rop) outp1(GRX,0x32,rop)
#define CIR_TRANS(color) outp2(GRX,0x34,(color)); \
outp2(GRX,0x38,0);
#define CIR_TRANSMMIO(color) outm2(0x34,(color))
#define CIR_WIDTH(width) outp2(GRX, 0x20, width)
#define CIR_HEIGHT(height) outp2(GRX, 0x22, height)
#define CIR_DSTPITCH(pitch) outp2(GRX, 0x24, pitch)
#define CIR_SRCPITCH(pitch) outp2(GRX, 0x26, pitch)
#define SET_DSTADDR(address) outp3(GRX, 0x28, address)
#define SET_SRCADDR(address) outp3(GRX, 0x2c, address)
#define CIR_BLTMODE(mode) outp1(GRX, 0x30, mode)
#define CIR_BLTROP(rop) outp1(GRX, 0x32, rop)
#define CIR_TRANS(color) \
outp2(GRX, 0x34, (color)); \
outp2(GRX, 0x38, 0);
#define CIR_TRANSMMIO(color) outm2(0x34, (color))
#define CIR_CMD(cmd) outp1(GRX,0x31,cmd)
#define CIR_CMD(cmd) outp1(GRX, 0x31, cmd)
#define CIR_CMDMMIO(cmd) outm1(0x40,cmd)
#define CIR_CMDMMIO(cmd) outm1(0x40, cmd)
#define CIR_BLT_PIX8 0
#define CIR_BLT_PIX15 16
@ -237,7 +225,8 @@ __inline__ void outp3(unsigned short port,unsigned char index,unsigned long valu
#define CIR_BLT_MEM 0x04
#define CIR_BLT_COLEXP 0x80
#define my_int(num,regs) asm("\
#define my_int(num, regs) \
asm("\
pushal; \
pushl %%esi; \
movl (%%esi),%%edi; \
@ -258,7 +247,7 @@ movl %%ebp,8(%%esi); \
movl %%edi,(%%esi); \
popl %%eax; \
movl %%eax,4(%%esi); \
popal" \
::"S" (regs), "i" (num))
popal" ::"S"(regs), \
"i"(num))
#endif

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
/*
* ______ ____ ______ _____ ______
* ______ ____ ______ _____ ______
* | ____| | _ \| ____| / / _ \| ____|
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | __| '__/ _ \/ _ \ _ <| __| / /| _ | __|
* | | | | | __/ __/ |_) | |____ / / | | | | |
* |_| |_| \___|\___|____/|______/_/ |_| |_|_|
@ -12,34 +12,29 @@
* See freebe.txt for copyright information.
*/
#include "vbeaf.h"
AF_DRIVER drvhdr =
{
"VBEAF.DRV", /* Signature */
0x200, /* Version */
0, /* DriverRev */
"FreeBE/AF Cirrus 54xx driver " FREEBE_VERSION, /* OemVendorName */
"This driver is free software", /* OemCopyright */
NULL, /* AvailableModes */
0, /* TotalMemory */
0, /* Attributes */
0, /* BankSize */
0, /* BankedBasePtr */
0, /* LinearSize */
0, /* LinearBasePtr */
0, /* LinearGranularity */
NULL, /* IOPortsTable */
{ NULL, NULL, NULL, NULL }, /* IOMemoryBase */
{ 0, 0, 0, 0 }, /* IOMemoryLen */
0, /* LinearStridePad */
-1, /* PCIVendorID */
-1, /* PCIDeviceID */
-1, /* PCISubSysVendorID */
-1, /* PCISubSysID */
0 /* Checksum */
AF_DRIVER drvhdr = {
"VBEAF.DRV", /* Signature */
0x200, /* Version */
0, /* DriverRev */
"FreeBE/AF Cirrus 54xx driver " FREEBE_VERSION, /* OemVendorName */
"This driver is free software", /* OemCopyright */
NULL, /* AvailableModes */
0, /* TotalMemory */
0, /* Attributes */
0, /* BankSize */
0, /* BankedBasePtr */
0, /* LinearSize */
0, /* LinearBasePtr */
0, /* LinearGranularity */
NULL, /* IOPortsTable */
{ NULL, NULL, NULL, NULL }, /* IOMemoryBase */
{ 0, 0, 0, 0 }, /* IOMemoryLen */
0, /* LinearStridePad */
-1, /* PCIVendorID */
-1, /* PCIDeviceID */
-1, /* PCISubSysVendorID */
-1, /* PCISubSysID */
0 /* Checksum */
};

313
drvgen.c
View File

@ -5,111 +5,104 @@
This software may be freely distributed with above copyright, no warranty.
Based on code by DJ Delorie, it's really his, enhanced, bugs fixed. */
#include "vbeaf.h"
#include <coff.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <coff.h>
#include "vbeaf.h"
extern AF_DRIVER drvhdr;
void exit_cleanup(void)
{
remove("drv__tmp.o");
void exit_cleanup(void) {
remove("drv__tmp.o");
}
int main(int argc, char **argv)
{
int errors = 0;
unsigned bss_start = 0;
FILHDR fh;
FILE *input_f, *output_f;
SCNHDR sc;
char *data, *strings;
SYMENT *sym;
RELOC *relocs;
int strsz, i;
long init1_offset,init2_offset,init3_offset,element_size,nrelocs,vbe_size;
int main(int argc, char **argv) {
int errors = 0;
unsigned bss_start = 0;
FILHDR fh;
FILE *input_f, *output_f;
SCNHDR sc;
char *data, *strings;
SYMENT *sym;
RELOC *relocs;
int strsz, i;
long init1_offset, init2_offset, init3_offset, element_size, nrelocs,
vbe_size;
if (argc < 6)
{
printf("Usage: drvgen output.drv oemext pnpinit initdrv input.o [input2.o ... -lgcc -lc]\n");
return 1;
}
if (argc < 6) {
printf("Usage: drvgen output.drv oemext pnpinit initdrv input.o "
"[input2.o ... -lgcc -lc]\n");
return 1;
}
input_f = fopen(argv[5], "rb");
if (!input_f)
{
perror(argv[5]);
return 1;
}
input_f = fopen(argv[5], "rb");
if (!input_f) {
perror(argv[5]);
return 1;
}
fread(&fh, 1, FILHSZ, input_f);
if (fh.f_nscns != 1 || argc > 5)
{
char command[1024];
fclose(input_f);
fread(&fh, 1, FILHSZ, input_f);
if (fh.f_nscns != 1 || argc > 5) {
char command[1024];
fclose(input_f);
strcpy(command,"ld -X -S -r -o drv__tmp.o -L");
strcat(command,getenv("DJDIR"));
strcat(command,"/lib ");
for(i=5;argv[i];i++) {
strcat(command,argv[i]);
strcat(command," ");
}
strcat(command,"-T ../drv.ld");
strcpy(command, "ld -X -S -r -o drv__tmp.o -L");
strcat(command, getenv("DJDIR"));
strcat(command, "/lib ");
for (i = 5; argv[i]; i++) {
strcat(command, argv[i]);
strcat(command, " ");
}
strcat(command, "-T ../drv.ld");
printf("%s\n",command);
i = system(command);
if(i)
return i;
printf("%s\n", command);
i = system(command);
if (i) return i;
input_f = fopen("drv__tmp.o", "rb");
if (!input_f)
{
perror(argv[5]);
return 1;
} else
atexit(exit_cleanup);
input_f = fopen("drv__tmp.o", "rb");
if (!input_f) {
perror(argv[5]);
return 1;
} else
atexit(exit_cleanup);
fread(&fh, 1, FILHSZ, input_f);
if (fh.f_nscns != 1) {
printf("Error: input file has more than one section; use -M for map\n");
return 1;
}
}
fread(&fh, 1, FILHSZ, input_f);
if (fh.f_nscns != 1) {
printf("Error: input file has more than one section; use -M for "
"map\n");
return 1;
}
}
fseek(input_f, fh.f_opthdr, 1);
fread(&sc, 1, SCNHSZ, input_f);
fseek(input_f, fh.f_opthdr, 1);
fread(&sc, 1, SCNHSZ, input_f);
init1_offset = -1;
init2_offset = -1;
init3_offset = -1;
element_size = sc.s_size;
nrelocs = sc.s_nreloc;
init1_offset = -1;
init2_offset = -1;
init3_offset = -1;
element_size = sc.s_size;
nrelocs = sc.s_nreloc;
data = malloc(sc.s_size);
fseek(input_f, sc.s_scnptr, 0);
fread(data, 1, sc.s_size, input_f);
data = malloc(sc.s_size);
fseek(input_f, sc.s_scnptr, 0);
fread(data, 1, sc.s_size, input_f);
sym = malloc(sizeof(SYMENT)*fh.f_nsyms);
fseek(input_f, fh.f_symptr, 0);
fread(sym, fh.f_nsyms, SYMESZ, input_f);
fread(&strsz, 1, 4, input_f);
strings = malloc(strsz);
fread(strings+4, 1, strsz-4, input_f);
strings[0] = 0;
for (i=0; i<(int)fh.f_nsyms; i++)
{
char tmp[9], *name;
if (sym[i].e.e.e_zeroes)
{
memcpy(tmp, sym[i].e.e_name, 8);
tmp[8] = 0;
name = tmp;
}
else
name = strings + sym[i].e.e.e_offset;
sym = malloc(sizeof(SYMENT) * fh.f_nsyms);
fseek(input_f, fh.f_symptr, 0);
fread(sym, fh.f_nsyms, SYMESZ, input_f);
fread(&strsz, 1, 4, input_f);
strings = malloc(strsz);
fread(strings + 4, 1, strsz - 4, input_f);
strings[0] = 0;
for (i = 0; i < (int)fh.f_nsyms; i++) {
char tmp[9], *name;
if (sym[i].e.e.e_zeroes) {
memcpy(tmp, sym[i].e.e_name, 8);
tmp[8] = 0;
name = tmp;
} else
name = strings + sym[i].e.e.e_offset;
#if 0
printf("[%3d] 0x%08x 0x%04x 0x%04x %d %s\n",
i,
@ -120,64 +113,58 @@ int main(int argc, char **argv)
name
);
#endif
if (sym[i].e_scnum == 0)
{
printf("Error: object contains unresolved external symbols (%s)\n", name);
errors ++;
}
if (strncmp(name, argv[2], strlen(argv[2])) == 0)
{
if (init1_offset != -1)
{
printf("Error: multiple symbols that start with %s (%s)!\n", argv[2], name);
errors++;
}
init1_offset = sym[i].e_value;
} else if (strncmp(name, argv[3], strlen(argv[3])) == 0)
{
if (init2_offset != -1)
{
printf("Error: multiple symbols that start with %s (%s)!\n", argv[3], name);
errors++;
}
init2_offset = sym[i].e_value;
} else if (strncmp(name, argv[4], strlen(argv[4])) == 0)
{
if (init3_offset != -1)
{
printf("Error: multiple symbols that start with %s (%s)!\n", argv[4], name);
errors++;
}
init3_offset = sym[i].e_value;
} else if (strcmp(name, ".bss") == 0 && !bss_start) {
bss_start = sym[i].e_value;
/* printf("bss_start 0x%x\n",bss_start); */
memset(data+bss_start, 0, sc.s_size - bss_start);
}
i += sym[i].e_numaux;
}
if (sym[i].e_scnum == 0) {
printf("Error: object contains unresolved external symbols (%s)\n",
name);
errors++;
}
if (strncmp(name, argv[2], strlen(argv[2])) == 0) {
if (init1_offset != -1) {
printf("Error: multiple symbols that start with %s (%s)!\n",
argv[2], name);
errors++;
}
init1_offset = sym[i].e_value;
} else if (strncmp(name, argv[3], strlen(argv[3])) == 0) {
if (init2_offset != -1) {
printf("Error: multiple symbols that start with %s (%s)!\n",
argv[3], name);
errors++;
}
init2_offset = sym[i].e_value;
} else if (strncmp(name, argv[4], strlen(argv[4])) == 0) {
if (init3_offset != -1) {
printf("Error: multiple symbols that start with %s (%s)!\n",
argv[4], name);
errors++;
}
init3_offset = sym[i].e_value;
} else if (strcmp(name, ".bss") == 0 && !bss_start) {
bss_start = sym[i].e_value;
/* printf("bss_start 0x%x\n",bss_start); */
memset(data + bss_start, 0, sc.s_size - bss_start);
}
i += sym[i].e_numaux;
}
if (init1_offset == -1)
{
printf("Error: symbol %s not found!\n", argv[2]);
errors++;
}
if (init1_offset == -1) {
printf("Error: symbol %s not found!\n", argv[2]);
errors++;
}
if (init2_offset == -1)
{
printf("Error: symbol %s not found!\n", argv[3]);
errors++;
}
if (init2_offset == -1) {
printf("Error: symbol %s not found!\n", argv[3]);
errors++;
}
if (init3_offset == -1)
{
printf("Error: symbol %s not found!\n", argv[4]);
errors++;
}
if (init3_offset == -1) {
printf("Error: symbol %s not found!\n", argv[4]);
errors++;
}
relocs = malloc(sizeof(RELOC)*sc.s_nreloc);
fseek(input_f, sc.s_relptr, 0);
fread(relocs, sc.s_nreloc, RELSZ, input_f);
relocs = malloc(sizeof(RELOC) * sc.s_nreloc);
fseek(input_f, sc.s_relptr, 0);
fread(relocs, sc.s_nreloc, RELSZ, input_f);
#if 0
for (i=0; i<sc.s_nreloc; i++)
printf("0x%08x %3d 0x%04x - 0x%08x\n",
@ -188,33 +175,31 @@ int main(int argc, char **argv)
);
#endif
fclose(input_f);
if (errors)
return errors;
fclose(input_f);
if (errors) return errors;
output_f = fopen(argv[1], "wb");
if (!output_f)
{
perror(argv[1]);
return 1;
}
output_f = fopen(argv[1], "wb");
if (!output_f) {
perror(argv[1]);
return 1;
}
for (i=0; i<sc.s_nreloc; i++)
if(relocs[i].r_type == 0x14) /* Don't do these, they are relative */
nrelocs--;
for (i = 0; i < sc.s_nreloc; i++)
if (relocs[i].r_type == 0x14) /* Don't do these, they are relative */
nrelocs--;
vbe_size=sizeof(drvhdr) + (1+nrelocs)*sizeof(long);
drvhdr.OemExt=(void*)(vbe_size+init1_offset);
drvhdr.PlugAndPlayInit=(void*)(vbe_size+init2_offset);
drvhdr.InitDriver=(void*)(vbe_size+init3_offset);
vbe_size = sizeof(drvhdr) + (1 + nrelocs) * sizeof(long);
drvhdr.OemExt = (void *)(vbe_size + init1_offset);
drvhdr.PlugAndPlayInit = (void *)(vbe_size + init2_offset);
drvhdr.InitDriver = (void *)(vbe_size + init3_offset);
fwrite(&drvhdr, 1, sizeof(drvhdr), output_f);
fwrite(&nrelocs, 1, sizeof(nrelocs), output_f);
for (i=0; i<sc.s_nreloc; i++)
if(relocs[i].r_type != 0x14) /* Don't do these, they are relative */
fwrite(&(relocs[i].r_vaddr), 1, sizeof(long), output_f);
fwrite(data, 1, sc.s_size, output_f);
fwrite(&drvhdr, 1, sizeof(drvhdr), output_f);
fwrite(&nrelocs, 1, sizeof(nrelocs), output_f);
for (i = 0; i < sc.s_nreloc; i++)
if (relocs[i].r_type != 0x14) /* Don't do these, they are relative */
fwrite(&(relocs[i].r_vaddr), 1, sizeof(long), output_f);
fwrite(data, 1, sc.s_size, output_f);
fclose(output_f);
return 0;
fclose(output_f);
return 0;
}

875
helper.c

File diff suppressed because it is too large Load Diff

2008
install.c

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
/*
* ______ ____ ______ _____ ______
* ______ ____ ______ _____ ______
* | ____| | _ \| ____| / / _ \| ____|
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | __| '__/ _ \/ _ \ _ <| __| / /| _ | __|
* | | | | | __/ __/ |_) | |____ / / | | | | |
* |_| |_| \___|\___|____/|______/_/ |_| |_|_|
@ -12,34 +12,29 @@
* See freebe.txt for copyright information.
*/
#include "vbeaf.h"
AF_DRIVER drvhdr =
{
"VBEAF.DRV", /* Signature */
0x200, /* Version */
0, /* DriverRev */
"FreeBE/AF ATI mach64 driver " FREEBE_VERSION, /* OemVendorName */
"This driver is free software", /* OemCopyright */
NULL, /* AvailableModes */
0, /* TotalMemory */
0, /* Attributes */
0, /* BankSize */
0, /* BankedBasePtr */
0, /* LinearSize */
0, /* LinearBasePtr */
0, /* LinearGranularity */
NULL, /* IOPortsTable */
{ NULL, NULL, NULL, NULL }, /* IOMemoryBase */
{ 0, 0, 0, 0 }, /* IOMemoryLen */
0, /* LinearStridePad */
-1, /* PCIVendorID */
-1, /* PCIDeviceID */
-1, /* PCISubSysVendorID */
-1, /* PCISubSysID */
0 /* Checksum */
AF_DRIVER drvhdr = {
"VBEAF.DRV", /* Signature */
0x200, /* Version */
0, /* DriverRev */
"FreeBE/AF ATI mach64 driver " FREEBE_VERSION, /* OemVendorName */
"This driver is free software", /* OemCopyright */
NULL, /* AvailableModes */
0, /* TotalMemory */
0, /* Attributes */
0, /* BankSize */
0, /* BankedBasePtr */
0, /* LinearSize */
0, /* LinearBasePtr */
0, /* LinearGranularity */
NULL, /* IOPortsTable */
{ NULL, NULL, NULL, NULL }, /* IOMemoryBase */
{ 0, 0, 0, 0 }, /* IOMemoryLen */
0, /* LinearStridePad */
-1, /* PCIVendorID */
-1, /* PCIDeviceID */
-1, /* PCISubSysVendorID */
-1, /* PCISubSysID */
0 /* Checksum */
};

View File

@ -31,7 +31,7 @@ CFLAGS = -O3 -m486 -fomit-frame-pointer -Wall -Werror
endif
endif
.PHONY: dummy drivers install all docs clean
.PHONY: dummy drivers install all docs clean format
.PRECIOUS: %.o drvgen.exe
@ -93,6 +93,9 @@ freebe.txt: freebe._tx
readme.txt: freebe._tx
makedoc -part -ascii readme.txt freebe._tx
format:
find . \( -name "*.c" -o -name "*.h" -o -name "*.cpp" -o -name "*.hpp" \) -print0 | xargs -0 clang-format -i -style=file
clean:
-rm -rv *.o */*.o *.d */*.d *.exe */*.exe *.dat */*.drv freebe.html freebe.txt readme.txt

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
/*
* ______ ____ ______ _____ ______
* ______ ____ ______ _____ ______
* | ____| | _ \| ____| / / _ \| ____|
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | __| '__/ _ \/ _ \ _ <| __| / /| _ | __|
* | | | | | __/ __/ |_) | |____ / / | | | | |
* |_| |_| \___|\___|____/|______/_/ |_| |_|_|
@ -12,34 +12,29 @@
* See freebe.txt for copyright information.
*/
#include "vbeaf.h"
AF_DRIVER drvhdr =
{
"VBEAF.DRV", /* Signature */
0x200, /* Version */
0, /* DriverRev */
"FreeBE/AF Matrox driver " FREEBE_VERSION, /* OemVendorName */
"This driver is free software", /* OemCopyright */
NULL, /* AvailableModes */
0, /* TotalMemory */
0, /* Attributes */
0, /* BankSize */
0, /* BankedBasePtr */
0, /* LinearSize */
0, /* LinearBasePtr */
0, /* LinearGranularity */
NULL, /* IOPortsTable */
{ NULL, NULL, NULL, NULL }, /* IOMemoryBase */
{ 0, 0, 0, 0 }, /* IOMemoryLen */
0, /* LinearStridePad */
-1, /* PCIVendorID */
-1, /* PCIDeviceID */
-1, /* PCISubSysVendorID */
-1, /* PCISubSysID */
0 /* Checksum */
AF_DRIVER drvhdr = {
"VBEAF.DRV", /* Signature */
0x200, /* Version */
0, /* DriverRev */
"FreeBE/AF Matrox driver " FREEBE_VERSION, /* OemVendorName */
"This driver is free software", /* OemCopyright */
NULL, /* AvailableModes */
0, /* TotalMemory */
0, /* Attributes */
0, /* BankSize */
0, /* BankedBasePtr */
0, /* LinearSize */
0, /* LinearBasePtr */
0, /* LinearGranularity */
NULL, /* IOPortsTable */
{ NULL, NULL, NULL, NULL }, /* IOMemoryBase */
{ 0, 0, 0, 0 }, /* IOMemoryLen */
0, /* LinearStridePad */
-1, /* PCIVendorID */
-1, /* PCIDeviceID */
-1, /* PCISubSysVendorID */
-1, /* PCISubSysID */
0 /* Checksum */
};

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
/*
* ______ ____ ______ _____ ______
* ______ ____ ______ _____ ______
* | ____| | _ \| ____| / / _ \| ____|
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | __| '__/ _ \/ _ \ _ <| __| / /| _ | __|
* | | | | | __/ __/ |_) | |____ / / | | | | |
* |_| |_| \___|\___|____/|______/_/ |_| |_|_|
@ -12,34 +12,29 @@
* See freebe.txt for copyright information.
*/
#include "vbeaf.h"
AF_DRIVER drvhdr =
{
"VBEAF.DRV", /* Signature */
0x200, /* Version */
0, /* DriverRev */
"FreeBE/AF NVidia driver " FREEBE_VERSION, /* OemVendorName */
"This driver is free software", /* OemCopyright */
NULL, /* AvailableModes */
0, /* TotalMemory */
0, /* Attributes */
0, /* BankSize */
0, /* BankedBasePtr */
0, /* LinearSize */
0, /* LinearBasePtr */
0, /* LinearGranularity */
NULL, /* IOPortsTable */
{ NULL, NULL, NULL, NULL }, /* IOMemoryBase */
{ 0, 0, 0, 0 }, /* IOMemoryLen */
0, /* LinearStridePad */
-1, /* PCIVendorID */
-1, /* PCIDeviceID */
-1, /* PCISubSysVendorID */
-1, /* PCISubSysID */
0 /* Checksum */
AF_DRIVER drvhdr = {
"VBEAF.DRV", /* Signature */
0x200, /* Version */
0, /* DriverRev */
"FreeBE/AF NVidia driver " FREEBE_VERSION, /* OemVendorName */
"This driver is free software", /* OemCopyright */
NULL, /* AvailableModes */
0, /* TotalMemory */
0, /* Attributes */
0, /* BankSize */
0, /* BankedBasePtr */
0, /* LinearSize */
0, /* LinearBasePtr */
0, /* LinearGranularity */
NULL, /* IOPortsTable */
{ NULL, NULL, NULL, NULL }, /* IOMemoryBase */
{ 0, 0, 0, 0 }, /* IOMemoryLen */
0, /* LinearStridePad */
-1, /* PCIVendorID */
-1, /* PCIDeviceID */
-1, /* PCISubSysVendorID */
-1, /* PCISubSysID */
0 /* Checksum */
};

View File

@ -11,361 +11,481 @@
* so I guess the copyright isn't a problem. I'm just using your data to
* save me the bother of having to grab my own. */
unsigned char VGA8x16Font[256*16]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x7E,0x81,0xA5,0x81,0x81,0xBD,0x99,0x81,0x81,0x7E,0x00,0x00,0x00,0x00,
0x00,0x00,0x7E,0xFF,0xDB,0xFF,0xFF,0xC3,0xE7,0xFF,0xFF,0x7E,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x6C,0xFE,0xFE,0xFE,0xFE,0x7C,0x38,0x10,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x10,0x38,0x7C,0xFE,0x7C,0x38,0x10,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x18,0x3C,0x3C,0xE7,0xE7,0xE7,0x99,0x18,0x3C,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x18,0x3C,0x7E,0xFF,0xFF,0x7E,0x18,0x18,0x3C,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x3C,0x3C,0x18,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE7,0xC3,0xC3,0xE7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x42,0x42,0x66,0x3C,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xC3,0x99,0xBD,0xBD,0x99,0xC3,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x1E,0x0E,0x1A,0x32,0x78,0xCC,0xCC,0xCC,0xCC,0x78,0x00,0x00,0x00,0x00,
0x00,0x00,0x3C,0x66,0x66,0x66,0x66,0x3C,0x18,0x7E,0x18,0x18,0x00,0x00,0x00,0x00,
0x00,0x00,0x3F,0x33,0x3F,0x30,0x30,0x30,0x30,0x70,0xF0,0xE0,0x00,0x00,0x00,0x00,
0x00,0x00,0x7F,0x63,0x7F,0x63,0x63,0x63,0x63,0x67,0xE7,0xE6,0xC0,0x00,0x00,0x00,
0x00,0x00,0x00,0x18,0x18,0xDB,0x3C,0xE7,0x3C,0xDB,0x18,0x18,0x00,0x00,0x00,0x00,
0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFE,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,
0x00,0x02,0x06,0x0E,0x1E,0x3E,0xFE,0x3E,0x1E,0x0E,0x06,0x02,0x00,0x00,0x00,0x00,
0x00,0x00,0x18,0x3C,0x7E,0x18,0x18,0x18,0x18,0x7E,0x3C,0x18,0x00,0x00,0x00,0x00,
0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x66,0x66,0x00,0x00,0x00,0x00,
0x00,0x00,0x7F,0xDB,0xDB,0xDB,0x7B,0x1B,0x1B,0x1B,0x1B,0x1B,0x00,0x00,0x00,0x00,
0x00,0x7C,0xC6,0x60,0x38,0x6C,0xC6,0xC6,0x6C,0x38,0x0C,0xC6,0x7C,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0xFE,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x18,0x3C,0x7E,0x18,0x18,0x18,0x18,0x7E,0x3C,0x18,0x7E,0x00,0x00,0x00,
0x00,0x00,0x18,0x3C,0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,
0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x3C,0x18,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x18,0x0C,0xFE,0x0C,0x18,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x30,0x60,0xFE,0x60,0x30,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x24,0x66,0xFF,0x66,0x24,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x10,0x38,0x38,0x7C,0x7C,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFE,0xFE,0x7C,0x7C,0x38,0x38,0x10,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x18,0x3C,0x3C,0x3C,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00,
0x00,0x63,0x63,0x63,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x6C,0x6C,0xFE,0x6C,0x6C,0x6C,0xFE,0x6C,0x6C,0x00,0x00,0x00,0x00,
0x18,0x18,0x7C,0xC6,0xC2,0xC0,0x7C,0x06,0x86,0xC6,0x7C,0x18,0x18,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xC2,0xC6,0x0C,0x18,0x30,0x60,0xC6,0x86,0x00,0x00,0x00,0x00,
0x00,0x00,0x38,0x6C,0x6C,0x38,0x76,0xDC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00,
0x00,0x30,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x0C,0x18,0x30,0x30,0x30,0x30,0x30,0x30,0x18,0x0C,0x00,0x00,0x00,0x00,
0x00,0x00,0x30,0x18,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x18,0x30,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x18,0x18,0xFF,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x02,0x06,0x0C,0x18,0x30,0x60,0xC0,0x80,0x00,0x00,0x00,0x00,
0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xD6,0xD6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x00,0x00,0x00,0x00,
0x00,0x00,0x7C,0xC6,0x06,0x0C,0x18,0x30,0x60,0xC0,0xC6,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x7C,0xC6,0x06,0x06,0x3C,0x06,0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x0C,0x1C,0x3C,0x6C,0xCC,0xFE,0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00,0x00,
0x00,0x00,0xFE,0xC0,0xC0,0xC0,0xFC,0x0E,0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x38,0x60,0xC0,0xC0,0xFC,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0xFE,0xC6,0x06,0x06,0x0C,0x18,0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x00,
0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7C,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7E,0x06,0x06,0x06,0x0C,0x78,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x06,0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x06,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x60,0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x60,0x00,0x00,0x00,0x00,
0x00,0x00,0x7C,0xC6,0xC6,0x0C,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x7C,0xC6,0xC6,0xDE,0xDE,0xDE,0xDC,0xC0,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00,
0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x66,0x66,0x66,0x66,0xFC,0x00,0x00,0x00,0x00,
0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xC0,0xC0,0xC2,0x66,0x3C,0x00,0x00,0x00,0x00,
0x00,0x00,0xF8,0x6C,0x66,0x66,0x66,0x66,0x66,0x66,0x6C,0xF8,0x00,0x00,0x00,0x00,
0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68,0x60,0x62,0x66,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00,
0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xDE,0xC6,0xC6,0x66,0x3A,0x00,0x00,0x00,0x00,
0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00,
0x00,0x00,0x3C,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00,
0x00,0x00,0x1E,0x0C,0x0C,0x0C,0x0C,0x0C,0xCC,0xCC,0xCC,0x78,0x00,0x00,0x00,0x00,
0x00,0x00,0xE6,0x66,0x6C,0x6C,0x78,0x78,0x6C,0x66,0x66,0xE6,0x00,0x00,0x00,0x00,
0x00,0x00,0xF0,0x60,0x60,0x60,0x60,0x60,0x60,0x62,0x66,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0xC3,0xE7,0xFF,0xDB,0xDB,0xC3,0xC3,0xC3,0xC3,0xC3,0x00,0x00,0x00,0x00,
0x00,0x00,0xC6,0xE6,0xF6,0xFE,0xDE,0xCE,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00,
0x00,0x00,0x38,0x6C,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x6C,0x38,0x00,0x00,0x00,0x00,
0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x60,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00,
0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xD6,0xDE,0x7C,0x0C,0x0E,0x00,0x00,
0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x6C,0x66,0x66,0x66,0xE6,0x00,0x00,0x00,0x00,
0x00,0x00,0x7C,0xC6,0xC6,0x60,0x38,0x0C,0x06,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xDB,0x99,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00,
0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x6C,0x38,0x10,0x00,0x00,0x00,0x00,
0x00,0x00,0xC3,0xC3,0xC3,0xC3,0xC3,0xDB,0xDB,0xFF,0x66,0x66,0x00,0x00,0x00,0x00,
0x00,0x00,0xC6,0xC6,0x6C,0x6C,0x38,0x38,0x6C,0x6C,0xC6,0xC6,0x00,0x00,0x00,0x00,
0x00,0x00,0x66,0x66,0x66,0x66,0x3C,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xC3,0x83,0x06,0x0C,0x18,0x30,0x61,0xC3,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x3E,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3E,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x80,0xC0,0xE0,0x70,0x38,0x1C,0x0E,0x06,0x02,0x00,0x00,0x00,0x00,
0x00,0x00,0x3E,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x3E,0x00,0x00,0x00,0x00,
0x10,0x38,0x6C,0xC6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,
0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00,
0x00,0x00,0xE0,0x60,0x60,0x78,0x6C,0x66,0x66,0x66,0x66,0xDC,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xC0,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x1C,0x0C,0x0C,0x3C,0x6C,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xFE,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x38,0x6C,0x64,0x60,0xF0,0x60,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x76,0xCC,0xCC,0xCC,0xCC,0xCC,0x7C,0x0C,0xCC,0x78,0x00,
0x00,0x00,0xE0,0x60,0x60,0x6C,0x76,0x66,0x66,0x66,0x66,0xE6,0x00,0x00,0x00,0x00,
0x00,0x00,0x18,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00,
0x00,0x00,0x06,0x06,0x00,0x0E,0x06,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3C,0x00,
0x00,0x00,0xE0,0x60,0x60,0x66,0x6C,0x78,0x78,0x6C,0x66,0xE6,0x00,0x00,0x00,0x00,
0x00,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xE6,0xFF,0xDB,0xDB,0xDB,0xDB,0xDB,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xDC,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xDC,0x66,0x66,0x66,0x66,0x66,0x7C,0x60,0x60,0xF0,0x00,
0x00,0x00,0x00,0x00,0x00,0x76,0xCC,0xCC,0xCC,0xCC,0xCC,0x7C,0x0C,0x0C,0x1E,0x00,
0x00,0x00,0x00,0x00,0x00,0xDC,0x76,0x62,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0x60,0x38,0x0C,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x10,0x30,0x30,0xFC,0x30,0x30,0x30,0x30,0x36,0x1C,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xC3,0xC3,0xC3,0xDB,0xDB,0xFF,0x66,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xC6,0x6C,0x38,0x38,0x38,0x6C,0xC6,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7E,0x06,0x0C,0xF8,0x00,
0x00,0x00,0x00,0x00,0x00,0xFE,0xCC,0x18,0x30,0x60,0xC6,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x0E,0x18,0x18,0x18,0x70,0x18,0x18,0x18,0x18,0x0E,0x00,0x00,0x00,0x00,
0x00,0x00,0x18,0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,
0x00,0x00,0x70,0x18,0x18,0x18,0x0E,0x18,0x18,0x18,0x18,0x70,0x00,0x00,0x00,0x00,
0x00,0x00,0x76,0xDC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xC6,0xFE,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xC0,0xC2,0x66,0x3C,0x0C,0x06,0x7C,0x00,0x00,
0x00,0x00,0xCC,0xCC,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00,
0x00,0x0C,0x18,0x30,0x00,0x7C,0xC6,0xFE,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x10,0x38,0x6C,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00,
0x00,0x00,0xCC,0xCC,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00,
0x00,0x60,0x30,0x18,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00,
0x00,0x38,0x6C,0x38,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x3C,0x66,0x60,0x60,0x66,0x3C,0x0C,0x06,0x3C,0x00,0x00,0x00,
0x00,0x10,0x38,0x6C,0x00,0x7C,0xC6,0xFE,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0xC6,0xC6,0x00,0x7C,0xC6,0xFE,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x60,0x30,0x18,0x00,0x7C,0xC6,0xFE,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x66,0x66,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00,
0x00,0x18,0x3C,0x66,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00,
0x00,0x60,0x30,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00,
0x00,0xC6,0xC6,0x10,0x38,0x6C,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00,
0x38,0x6C,0x38,0x00,0x38,0x6C,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00,
0x18,0x30,0x60,0x00,0xFE,0x66,0x60,0x7C,0x60,0x60,0x66,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x6E,0x3B,0x1B,0x7E,0xD8,0xDC,0x77,0x00,0x00,0x00,0x00,
0x00,0x00,0x3E,0x6C,0xCC,0xCC,0xFE,0xCC,0xCC,0xCC,0xCC,0xCE,0x00,0x00,0x00,0x00,
0x00,0x10,0x38,0x6C,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0xC6,0xC6,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x60,0x30,0x18,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x30,0x78,0xCC,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00,
0x00,0x60,0x30,0x18,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00,
0x00,0x00,0xC6,0xC6,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7E,0x06,0x0C,0x78,0x00,
0x00,0xC6,0xC6,0x00,0x38,0x6C,0xC6,0xC6,0xC6,0xC6,0x6C,0x38,0x00,0x00,0x00,0x00,
0x00,0xC6,0xC6,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x18,0x18,0x3C,0x66,0x60,0x60,0x60,0x66,0x3C,0x18,0x18,0x00,0x00,0x00,0x00,
0x00,0x38,0x6C,0x64,0x60,0xF0,0x60,0x60,0x60,0x60,0xE6,0xFC,0x00,0x00,0x00,0x00,
0x00,0x00,0xC3,0x66,0x3C,0x18,0x7E,0x18,0x7E,0x18,0x18,0x18,0x00,0x00,0x00,0x00,
0x00,0xFC,0x66,0x66,0x7C,0x62,0x66,0x6F,0x66,0x66,0x66,0xF3,0x00,0x00,0x00,0x00,
0x00,0x0E,0x1B,0x18,0x18,0x18,0x7E,0x18,0x18,0x18,0x18,0x18,0xD8,0x70,0x00,0x00,
0x00,0x18,0x30,0x60,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00,
0x00,0x0C,0x18,0x30,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00,
0x00,0x18,0x30,0x60,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x18,0x30,0x60,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00,
0x00,0x00,0x76,0xDC,0x00,0xDC,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00,
0x76,0xDC,0x00,0xC6,0xE6,0xF6,0xFE,0xDE,0xCE,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00,
0x00,0x3C,0x6C,0x6C,0x3E,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x38,0x6C,0x6C,0x38,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x30,0x30,0x00,0x30,0x30,0x60,0xC0,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,
0x00,0xC0,0xC0,0xC2,0xC6,0xCC,0x18,0x30,0x60,0xCE,0x93,0x06,0x0C,0x1F,0x00,0x00,
0x00,0xC0,0xC0,0xC2,0xC6,0xCC,0x18,0x30,0x66,0xCE,0x9A,0x3F,0x06,0x0F,0x00,0x00,
0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x18,0x3C,0x3C,0x3C,0x18,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x33,0x66,0xCC,0x66,0x33,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xCC,0x66,0x33,0x66,0xCC,0x00,0x00,0x00,0x00,0x00,0x00,
0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,
0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,
0xDD,0x77,0xDD,0x77,0xDD,0x77,0xDD,0x77,0xDD,0x77,0xDD,0x77,0xDD,0x77,0xDD,0x77,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x18,0x18,0x18,0x18,0x18,0xF8,0x18,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xF6,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
0x00,0x00,0x00,0x00,0x00,0xF8,0x18,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x36,0x36,0x36,0x36,0x36,0xF6,0x06,0xF6,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
0x00,0x00,0x00,0x00,0x00,0xFE,0x06,0xF6,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
0x36,0x36,0x36,0x36,0x36,0xF6,0x06,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x18,0x18,0x18,0x18,0x18,0xF8,0x18,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x18,0x18,0x18,0x18,0x18,0x1F,0x18,0x1F,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x37,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
0x36,0x36,0x36,0x36,0x36,0x37,0x30,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x3F,0x30,0x37,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
0x36,0x36,0x36,0x36,0x36,0xF7,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xF7,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
0x36,0x36,0x36,0x36,0x36,0x37,0x30,0x37,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x36,0x36,0x36,0x36,0x36,0xF7,0x00,0xF7,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
0x18,0x18,0x18,0x18,0x18,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x18,0x18,0x18,0x18,0x18,0x1F,0x18,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x1F,0x18,0x1F,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xFF,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
0x18,0x18,0x18,0x18,0x18,0xFF,0x18,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,
0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x76,0xDC,0xD8,0xD8,0xD8,0xDC,0x76,0x00,0x00,0x00,0x00,
0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xDC,0xC6,0xC3,0xC3,0xC3,0xCE,0x00,0x00,0x00,0x00,
0x00,0x00,0xFE,0xC6,0xC6,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x80,0xFE,0x6C,0x6C,0x6C,0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xFE,0xC6,0x60,0x30,0x18,0x30,0x60,0xC6,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x7E,0xD8,0xD8,0xD8,0xD8,0xD8,0x70,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x7C,0x60,0x60,0xC0,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x76,0xDC,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x7E,0x18,0x3C,0x66,0x66,0x66,0x3C,0x18,0x7E,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x38,0x6C,0xC6,0xC6,0xFE,0xC6,0xC6,0x6C,0x38,0x00,0x00,0x00,0x00,
0x00,0x00,0x38,0x6C,0xC6,0xC6,0xC6,0x6C,0x6C,0x6C,0x6C,0xEE,0x00,0x00,0x00,0x00,
0x00,0x00,0x1E,0x30,0x18,0x0C,0x3E,0x66,0x66,0x66,0x66,0x3C,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x7E,0xDB,0xDB,0xDB,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x03,0x06,0x7E,0xCF,0xDB,0xF3,0x7E,0x60,0xC0,0x00,0x00,0x00,0x00,
0x00,0x00,0x1C,0x30,0x60,0x60,0x7C,0x60,0x60,0x60,0x30,0x1C,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0xFE,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x18,0x18,0xFF,0x18,0x18,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x00,0x7E,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x00,0x7E,0x00,0x00,0x00,0x00,
0x00,0x00,0x0E,0x1B,0x1B,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xD8,0xD8,0xD8,0x70,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x18,0x18,0x00,0xFF,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x76,0xDC,0x00,0x76,0xDC,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x38,0x6C,0x6C,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x0F,0x0C,0x0C,0x0C,0x0C,0x0C,0xEC,0x6C,0x6C,0x3C,0x1C,0x00,0x00,0x00,0x00,
0x00,0xD8,0x6C,0x6C,0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x70,0x98,0x30,0x60,0xC8,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
unsigned char VGA8x16Font[256 * 16] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x81, 0xA5, 0x81, 0x81, 0xBD,
0x99, 0x81, 0x81, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFF,
0xDB, 0xFF, 0xFF, 0xC3, 0xE7, 0xFF, 0xFF, 0x7E, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x6C, 0xFE, 0xFE, 0xFE, 0xFE, 0x7C, 0x38, 0x10,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7C, 0xFE,
0x7C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
0x3C, 0x3C, 0xE7, 0xE7, 0xE7, 0x99, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x18, 0x3C, 0x7E, 0xFF, 0xFF, 0x7E, 0x18, 0x18, 0x3C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C,
0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xE7, 0xC3, 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x66, 0x42, 0x42, 0x66, 0x3C, 0x00,
0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x99, 0xBD,
0xBD, 0x99, 0xC3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x1E, 0x0E,
0x1A, 0x32, 0x78, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x18, 0x18,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x33, 0x3F, 0x30, 0x30, 0x30,
0x30, 0x70, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x63,
0x7F, 0x63, 0x63, 0x63, 0x63, 0x67, 0xE7, 0xE6, 0xC0, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x18, 0x18, 0xDB, 0x3C, 0xE7, 0x3C, 0xDB, 0x18, 0x18,
0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFE, 0xF8,
0xF0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0E,
0x1E, 0x3E, 0xFE, 0x3E, 0x1E, 0x0E, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xDB,
0xDB, 0xDB, 0x7B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x00, 0x00, 0x00, 0x00,
0x00, 0x7C, 0xC6, 0x60, 0x38, 0x6C, 0xC6, 0xC6, 0x6C, 0x38, 0x0C, 0xC6,
0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFE, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C,
0x7E, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x7E, 0x00, 0x00, 0x00,
0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x18, 0x0C, 0xFE, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xFE, 0x60, 0x30, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0,
0xC0, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x24, 0x66, 0xFF, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7C, 0x7C, 0xFE, 0xFE, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x7C, 0x7C,
0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x18, 0x3C, 0x3C, 0x3C, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18,
0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x63, 0x63, 0x22, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C,
0x6C, 0xFE, 0x6C, 0x6C, 0x6C, 0xFE, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00,
0x18, 0x18, 0x7C, 0xC6, 0xC2, 0xC0, 0x7C, 0x06, 0x86, 0xC6, 0x7C, 0x18,
0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xC6, 0x0C, 0x18,
0x30, 0x60, 0xC6, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6C,
0x6C, 0x38, 0x76, 0xDC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00,
0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x30,
0x30, 0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18,
0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0xFF,
0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x02, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xD6, 0xD6, 0xC6, 0xC6, 0xC6, 0x7C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6,
0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x7C, 0xC6, 0x06, 0x06, 0x3C, 0x06, 0x06, 0x06, 0xC6, 0x7C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x1C, 0x3C, 0x6C, 0xCC, 0xFE,
0x0C, 0x0C, 0x0C, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xC0,
0xC0, 0xC0, 0xFC, 0x0E, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x38, 0x60, 0xC0, 0xC0, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xC6, 0x06, 0x06, 0x0C, 0x18,
0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6,
0xC6, 0xC6, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0x06, 0x0C, 0x78,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0C, 0x06,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00,
0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
0x30, 0x18, 0x0C, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x0C, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xDE, 0xDE,
0xDE, 0xDC, 0xC0, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38,
0x6C, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x66, 0x66, 0x66, 0x66, 0xFC,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0, 0xC0, 0xC0,
0xC0, 0xC2, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x6C,
0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6C, 0xF8, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFE, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x62, 0x66, 0xFE,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x66, 0x62, 0x68, 0x78, 0x68,
0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x66,
0xC2, 0xC0, 0xC0, 0xDE, 0xC6, 0xC6, 0x66, 0x3A, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x0C,
0x0C, 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xE6, 0x66, 0x6C, 0x6C, 0x78, 0x78, 0x6C, 0x66, 0x66, 0xE6,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60,
0x60, 0x62, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0xE7,
0xFF, 0xDB, 0xDB, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xC6, 0xE6, 0xF6, 0xFE, 0xDE, 0xCE, 0xC6, 0xC6, 0xC6, 0xC6,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xC6,
0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x66,
0x66, 0x66, 0x7C, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xD6, 0xDE, 0x7C,
0x0C, 0x0E, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x6C,
0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6,
0xC6, 0x60, 0x38, 0x0C, 0x06, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFF, 0xDB, 0x99, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6,
0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xDB, 0xDB, 0xFF, 0x66, 0x66,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0x6C, 0x6C, 0x38, 0x38,
0x6C, 0x6C, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66,
0x66, 0x66, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFF, 0xC3, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x61, 0xC3, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x30, 0x30, 0x30, 0x30, 0x30,
0x30, 0x30, 0x30, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x3E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x3E,
0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00,
0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x7C,
0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x60,
0x60, 0x78, 0x6C, 0x66, 0x66, 0x66, 0x66, 0xDC, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0, 0xC0, 0xC6, 0x7C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x0C, 0x0C, 0x3C, 0x6C, 0xCC,
0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x7C, 0xC6, 0xFE, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x38, 0x6C, 0x64, 0x60, 0xF0, 0x60, 0x60, 0x60, 0x60, 0xF0,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCC, 0xCC,
0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0xCC, 0x78, 0x00, 0x00, 0x00, 0xE0, 0x60,
0x60, 0x6C, 0x76, 0x66, 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x0E, 0x06, 0x06,
0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3C, 0x00, 0x00, 0x00, 0xE0, 0x60,
0x60, 0x66, 0x6C, 0x78, 0x78, 0x6C, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xFF, 0xDB,
0xDB, 0xDB, 0xDB, 0xDB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xDC, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66,
0x66, 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x76, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0x0C, 0x1E, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x76, 0x62, 0x60, 0x60, 0x60, 0xF0,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0x60,
0x38, 0x0C, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x30,
0x30, 0xFC, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x76,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66,
0x66, 0x66, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xC3, 0xC3, 0xC3, 0xDB, 0xDB, 0xFF, 0x66, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x6C, 0x38, 0x38, 0x38, 0x6C, 0xC6,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6,
0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x0C, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFE, 0xCC, 0x18, 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x0E, 0x18, 0x18, 0x18, 0x70, 0x18, 0x18, 0x18, 0x18, 0x0E,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18,
0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x18,
0x18, 0x18, 0x0E, 0x18, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6C, 0xC6,
0xC6, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x66,
0xC2, 0xC0, 0xC0, 0xC0, 0xC2, 0x66, 0x3C, 0x0C, 0x06, 0x7C, 0x00, 0x00,
0x00, 0x00, 0xCC, 0xCC, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x76,
0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x00, 0x7C, 0xC6, 0xFE,
0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6C,
0x00, 0x78, 0x0C, 0x7C, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xCC, 0xCC, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0xCC, 0xCC, 0x76,
0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0C, 0x7C,
0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6C, 0x38,
0x00, 0x78, 0x0C, 0x7C, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x3C, 0x66, 0x60, 0x60, 0x66, 0x3C, 0x0C, 0x06,
0x3C, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6C, 0x00, 0x7C, 0xC6, 0xFE,
0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6,
0x00, 0x7C, 0xC6, 0xFE, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x60, 0x30, 0x18, 0x00, 0x7C, 0xC6, 0xFE, 0xC0, 0xC0, 0xC6, 0x7C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x38, 0x18, 0x18,
0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C, 0x66,
0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C,
0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0x10, 0x38, 0x6C, 0xC6, 0xC6,
0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6C, 0x38, 0x00,
0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
0x18, 0x30, 0x60, 0x00, 0xFE, 0x66, 0x60, 0x7C, 0x60, 0x60, 0x66, 0xFE,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x3B, 0x1B,
0x7E, 0xD8, 0xDC, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x6C,
0xCC, 0xCC, 0xFE, 0xCC, 0xCC, 0xCC, 0xCC, 0xCE, 0x00, 0x00, 0x00, 0x00,
0x00, 0x10, 0x38, 0x6C, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0x00, 0x7C, 0xC6, 0xC6,
0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18,
0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x30, 0x78, 0xCC, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x76,
0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0xCC, 0xCC, 0xCC,
0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6,
0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x0C, 0x78, 0x00,
0x00, 0xC6, 0xC6, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xC6, 0x6C, 0x38,
0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x3C,
0x66, 0x60, 0x60, 0x60, 0x66, 0x3C, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
0x00, 0x38, 0x6C, 0x64, 0x60, 0xF0, 0x60, 0x60, 0x60, 0x60, 0xE6, 0xFC,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x66, 0x3C, 0x18, 0x7E, 0x18,
0x7E, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x66, 0x66,
0x7C, 0x62, 0x66, 0x6F, 0x66, 0x66, 0x66, 0xF3, 0x00, 0x00, 0x00, 0x00,
0x00, 0x0E, 0x1B, 0x18, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18,
0xD8, 0x70, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0x78, 0x0C, 0x7C,
0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30,
0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x18, 0x30, 0x60, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0xCC, 0xCC, 0xCC,
0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC,
0x00, 0xDC, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
0x76, 0xDC, 0x00, 0xC6, 0xE6, 0xF6, 0xFE, 0xDE, 0xCE, 0xC6, 0xC6, 0xC6,
0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x6C, 0x6C, 0x3E, 0x00, 0x7E, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6C, 0x6C,
0x38, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, 0xC0, 0xC6, 0xC6, 0x7C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xC0,
0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFE, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xC0, 0xC0, 0xC2, 0xC6, 0xCC, 0x18, 0x30, 0x60, 0xCE, 0x93, 0x06,
0x0C, 0x1F, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC2, 0xC6, 0xCC, 0x18, 0x30,
0x66, 0xCE, 0x9A, 0x3F, 0x06, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
0x00, 0x18, 0x18, 0x18, 0x3C, 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x66, 0xCC, 0x66, 0x33, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0x66, 0x33,
0x66, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x11, 0x44,
0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA,
0x55, 0xAA, 0x55, 0xAA, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77,
0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0xF8,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36,
0x36, 0x36, 0x36, 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x36, 0x36, 0x36, 0x36,
0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18, 0xF8,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36,
0x36, 0xF6, 0x06, 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x06, 0xF6,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x36, 0xF6, 0x06, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFE, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0xF8,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x36, 0x37, 0x30, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFF, 0x00, 0xF7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36,
0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36,
0x36, 0xF7, 0x00, 0xF7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFF, 0x00, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x36, 0x36, 0x36, 0x36,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3F,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
0x18, 0x1F, 0x18, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x36, 0x36, 0x36, 0xFF, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0xFF, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0xF0, 0xF0,
0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x76, 0xDC, 0xD8, 0xD8, 0xD8, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xDC, 0xC6, 0xC3, 0xC3, 0xC3, 0xCE,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xC6, 0xC6, 0xC0, 0xC0, 0xC0,
0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x80, 0xFE, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFE, 0xC6, 0x60, 0x30, 0x18, 0x30, 0x60, 0xC6, 0xFE,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xD8, 0xD8,
0xD8, 0xD8, 0xD8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x66, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0x60, 0xC0, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x76, 0xDC, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x18, 0x3C, 0x66, 0x66,
0x66, 0x3C, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
0x6C, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0x6C, 0x6C, 0x6C, 0x6C, 0xEE,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x30, 0x18, 0x0C, 0x3E, 0x66,
0x66, 0x66, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x7E, 0xDB, 0xDB, 0xDB, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x03, 0x06, 0x7E, 0xCF, 0xDB, 0xF3, 0x7E, 0x60, 0xC0,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x30, 0x60, 0x60, 0x7C, 0x60,
0x60, 0x60, 0x30, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0xFF, 0x18,
0x18, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x18, 0x0C, 0x06, 0x0C, 0x18, 0x30, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0C, 0x00, 0x7E,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x1B, 0x1B, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0xD8, 0xD8, 0xD8, 0x70, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0xFF, 0x00, 0x18, 0x18, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC, 0x00,
0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6C, 0x6C,
0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0C, 0x0C,
0x0C, 0x0C, 0x0C, 0xEC, 0x6C, 0x6C, 0x3C, 0x1C, 0x00, 0x00, 0x00, 0x00,
0x00, 0xD8, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x98, 0x30, 0x60, 0xC8, 0xF8, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00
};
unsigned char DefaultTXTPalette[768]={
0x00,0x00,0x00,0x00,0x00,0x2A,0x00,0x2A,0x00,0x00,0x2A,0x2A,0x2A,0x00,0x00,0x2A,
0x00,0x2A,0x2A,0x2A,0x00,0x2A,0x2A,0x2A,0x00,0x00,0x15,0x00,0x00,0x3F,0x00,0x2A,
0x15,0x00,0x2A,0x3F,0x2A,0x00,0x15,0x2A,0x00,0x3F,0x2A,0x2A,0x15,0x2A,0x2A,0x3F,
0x00,0x15,0x00,0x00,0x15,0x2A,0x00,0x3F,0x00,0x00,0x3F,0x2A,0x2A,0x15,0x00,0x2A,
0x15,0x2A,0x2A,0x3F,0x00,0x2A,0x3F,0x2A,0x00,0x15,0x15,0x00,0x15,0x3F,0x00,0x3F,
0x15,0x00,0x3F,0x3F,0x2A,0x15,0x15,0x2A,0x15,0x3F,0x2A,0x3F,0x15,0x2A,0x3F,0x3F,
0x15,0x00,0x00,0x15,0x00,0x2A,0x15,0x2A,0x00,0x15,0x2A,0x2A,0x3F,0x00,0x00,0x3F,
0x00,0x2A,0x3F,0x2A,0x00,0x3F,0x2A,0x2A,0x15,0x00,0x15,0x15,0x00,0x3F,0x15,0x2A,
0x15,0x15,0x2A,0x3F,0x3F,0x00,0x15,0x3F,0x00,0x3F,0x3F,0x2A,0x15,0x3F,0x2A,0x3F,
0x15,0x15,0x00,0x15,0x15,0x2A,0x15,0x3F,0x00,0x15,0x3F,0x2A,0x3F,0x15,0x00,0x3F,
0x15,0x2A,0x3F,0x3F,0x00,0x3F,0x3F,0x2A,0x15,0x15,0x15,0x15,0x15,0x3F,0x15,0x3F,
0x15,0x15,0x3F,0x3F,0x3F,0x15,0x15,0x3F,0x15,0x3F,0x3F,0x3F,0x15,0x3F,0x3F,0x3F,
0x3F,0x1F,0x1F,0x3F,0x27,0x1F,0x3F,0x2F,0x1F,0x3F,0x37,0x1F,0x3F,0x3F,0x1F,0x37,
0x3F,0x1F,0x2F,0x3F,0x1F,0x27,0x3F,0x1F,0x1F,0x3F,0x1F,0x1F,0x3F,0x27,0x1F,0x3F,
0x2F,0x1F,0x3F,0x37,0x1F,0x3F,0x3F,0x1F,0x37,0x3F,0x1F,0x2F,0x3F,0x1F,0x27,0x3F,
0x2D,0x2D,0x3F,0x31,0x2D,0x3F,0x36,0x2D,0x3F,0x3A,0x2D,0x3F,0x3F,0x2D,0x3F,0x3F,
0x2D,0x3A,0x3F,0x2D,0x36,0x3F,0x2D,0x31,0x3F,0x2D,0x2D,0x3F,0x31,0x2D,0x3F,0x36,
0x2D,0x3F,0x3A,0x2D,0x3F,0x3F,0x2D,0x3A,0x3F,0x2D,0x36,0x3F,0x2D,0x31,0x3F,0x2D,
0x2D,0x3F,0x2D,0x2D,0x3F,0x31,0x2D,0x3F,0x36,0x2D,0x3F,0x3A,0x2D,0x3F,0x3F,0x2D,
0x3A,0x3F,0x2D,0x36,0x3F,0x2D,0x31,0x3F,0x00,0x00,0x1C,0x07,0x00,0x1C,0x0E,0x00,
0x1C,0x15,0x00,0x1C,0x1C,0x00,0x1C,0x1C,0x00,0x15,0x1C,0x00,0x0E,0x1C,0x00,0x07,
0x1C,0x00,0x00,0x1C,0x07,0x00,0x1C,0x0E,0x00,0x1C,0x15,0x00,0x1C,0x1C,0x00,0x15,
0x1C,0x00,0x0E,0x1C,0x00,0x07,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x07,0x00,0x1C,
0x0E,0x00,0x1C,0x15,0x00,0x1C,0x1C,0x00,0x15,0x1C,0x00,0x0E,0x1C,0x00,0x07,0x1C,
0x0E,0x0E,0x1C,0x11,0x0E,0x1C,0x15,0x0E,0x1C,0x18,0x0E,0x1C,0x1C,0x0E,0x1C,0x1C,
0x0E,0x18,0x1C,0x0E,0x15,0x1C,0x0E,0x11,0x1C,0x0E,0x0E,0x1C,0x11,0x0E,0x1C,0x15,
0x0E,0x1C,0x18,0x0E,0x1C,0x1C,0x0E,0x18,0x1C,0x0E,0x15,0x1C,0x0E,0x11,0x1C,0x0E,
0x0E,0x1C,0x0E,0x0E,0x1C,0x11,0x0E,0x1C,0x15,0x0E,0x1C,0x18,0x0E,0x1C,0x1C,0x0E,
0x18,0x1C,0x0E,0x15,0x1C,0x0E,0x11,0x1C,0x14,0x14,0x1C,0x16,0x14,0x1C,0x18,0x14,
0x1C,0x1A,0x14,0x1C,0x1C,0x14,0x1C,0x1C,0x14,0x1A,0x1C,0x14,0x18,0x1C,0x14,0x16,
0x1C,0x14,0x14,0x1C,0x16,0x14,0x1C,0x18,0x14,0x1C,0x1A,0x14,0x1C,0x1C,0x14,0x1A,
0x1C,0x14,0x18,0x1C,0x14,0x16,0x1C,0x14,0x14,0x1C,0x14,0x14,0x1C,0x16,0x14,0x1C,
0x18,0x14,0x1C,0x1A,0x14,0x1C,0x1C,0x14,0x1A,0x1C,0x14,0x18,0x1C,0x14,0x16,0x1C,
0x00,0x00,0x10,0x04,0x00,0x10,0x08,0x00,0x10,0x0C,0x00,0x10,0x10,0x00,0x10,0x10,
0x00,0x0C,0x10,0x00,0x08,0x10,0x00,0x04,0x10,0x00,0x00,0x10,0x04,0x00,0x10,0x08,
0x00,0x10,0x0C,0x00,0x10,0x10,0x00,0x0C,0x10,0x00,0x08,0x10,0x00,0x04,0x10,0x00,
0x00,0x10,0x00,0x00,0x10,0x04,0x00,0x10,0x08,0x00,0x10,0x0C,0x00,0x10,0x10,0x00,
0x0C,0x10,0x00,0x08,0x10,0x00,0x04,0x10,0x08,0x08,0x10,0x0A,0x08,0x10,0x0C,0x08,
0x10,0x0E,0x08,0x10,0x10,0x08,0x10,0x10,0x08,0x0E,0x10,0x08,0x0C,0x10,0x08,0x0A,
0x10,0x08,0x08,0x10,0x0A,0x08,0x10,0x0C,0x08,0x10,0x0E,0x08,0x10,0x10,0x08,0x0E,
0x10,0x08,0x0C,0x10,0x08,0x0A,0x10,0x08,0x08,0x10,0x08,0x08,0x10,0x0A,0x08,0x10,
0x0C,0x08,0x10,0x0E,0x08,0x10,0x10,0x08,0x0E,0x10,0x08,0x0C,0x10,0x08,0x0A,0x10,
0x0B,0x0B,0x10,0x0C,0x0B,0x10,0x0D,0x0B,0x10,0x0F,0x0B,0x10,0x10,0x0B,0x10,0x10,
0x0B,0x0F,0x10,0x0B,0x0D,0x10,0x0B,0x0C,0x10,0x0B,0x0B,0x10,0x0C,0x0B,0x10,0x0D,
0x0B,0x10,0x0F,0x0B,0x10,0x10,0x0B,0x0F,0x10,0x0B,0x0D,0x10,0x0B,0x0C,0x10,0x0B,
0x0B,0x10,0x0B,0x0B,0x10,0x0C,0x0B,0x10,0x0D,0x0B,0x10,0x0F,0x0B,0x10,0x10,0x0B,
0x0F,0x10,0x0B,0x0D,0x10,0x0B,0x0C,0x10,0x03,0x00,0x0F,0x02,0x00,0x0C,0x02,0x00,
0x09,0x01,0x00,0x07,0x01,0x00,0x04,0x00,0x00,0x02,0x00,0x00,0x00,0x3F,0x3F,0x3F};
unsigned char DefaultTXTPalette[768] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x2A,
0x2A, 0x00, 0x00, 0x2A, 0x00, 0x2A, 0x2A, 0x2A, 0x00, 0x2A, 0x2A, 0x2A,
0x00, 0x00, 0x15, 0x00, 0x00, 0x3F, 0x00, 0x2A, 0x15, 0x00, 0x2A, 0x3F,
0x2A, 0x00, 0x15, 0x2A, 0x00, 0x3F, 0x2A, 0x2A, 0x15, 0x2A, 0x2A, 0x3F,
0x00, 0x15, 0x00, 0x00, 0x15, 0x2A, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x2A,
0x2A, 0x15, 0x00, 0x2A, 0x15, 0x2A, 0x2A, 0x3F, 0x00, 0x2A, 0x3F, 0x2A,
0x00, 0x15, 0x15, 0x00, 0x15, 0x3F, 0x00, 0x3F, 0x15, 0x00, 0x3F, 0x3F,
0x2A, 0x15, 0x15, 0x2A, 0x15, 0x3F, 0x2A, 0x3F, 0x15, 0x2A, 0x3F, 0x3F,
0x15, 0x00, 0x00, 0x15, 0x00, 0x2A, 0x15, 0x2A, 0x00, 0x15, 0x2A, 0x2A,
0x3F, 0x00, 0x00, 0x3F, 0x00, 0x2A, 0x3F, 0x2A, 0x00, 0x3F, 0x2A, 0x2A,
0x15, 0x00, 0x15, 0x15, 0x00, 0x3F, 0x15, 0x2A, 0x15, 0x15, 0x2A, 0x3F,
0x3F, 0x00, 0x15, 0x3F, 0x00, 0x3F, 0x3F, 0x2A, 0x15, 0x3F, 0x2A, 0x3F,
0x15, 0x15, 0x00, 0x15, 0x15, 0x2A, 0x15, 0x3F, 0x00, 0x15, 0x3F, 0x2A,
0x3F, 0x15, 0x00, 0x3F, 0x15, 0x2A, 0x3F, 0x3F, 0x00, 0x3F, 0x3F, 0x2A,
0x15, 0x15, 0x15, 0x15, 0x15, 0x3F, 0x15, 0x3F, 0x15, 0x15, 0x3F, 0x3F,
0x3F, 0x15, 0x15, 0x3F, 0x15, 0x3F, 0x3F, 0x3F, 0x15, 0x3F, 0x3F, 0x3F,
0x3F, 0x1F, 0x1F, 0x3F, 0x27, 0x1F, 0x3F, 0x2F, 0x1F, 0x3F, 0x37, 0x1F,
0x3F, 0x3F, 0x1F, 0x37, 0x3F, 0x1F, 0x2F, 0x3F, 0x1F, 0x27, 0x3F, 0x1F,
0x1F, 0x3F, 0x1F, 0x1F, 0x3F, 0x27, 0x1F, 0x3F, 0x2F, 0x1F, 0x3F, 0x37,
0x1F, 0x3F, 0x3F, 0x1F, 0x37, 0x3F, 0x1F, 0x2F, 0x3F, 0x1F, 0x27, 0x3F,
0x2D, 0x2D, 0x3F, 0x31, 0x2D, 0x3F, 0x36, 0x2D, 0x3F, 0x3A, 0x2D, 0x3F,
0x3F, 0x2D, 0x3F, 0x3F, 0x2D, 0x3A, 0x3F, 0x2D, 0x36, 0x3F, 0x2D, 0x31,
0x3F, 0x2D, 0x2D, 0x3F, 0x31, 0x2D, 0x3F, 0x36, 0x2D, 0x3F, 0x3A, 0x2D,
0x3F, 0x3F, 0x2D, 0x3A, 0x3F, 0x2D, 0x36, 0x3F, 0x2D, 0x31, 0x3F, 0x2D,
0x2D, 0x3F, 0x2D, 0x2D, 0x3F, 0x31, 0x2D, 0x3F, 0x36, 0x2D, 0x3F, 0x3A,
0x2D, 0x3F, 0x3F, 0x2D, 0x3A, 0x3F, 0x2D, 0x36, 0x3F, 0x2D, 0x31, 0x3F,
0x00, 0x00, 0x1C, 0x07, 0x00, 0x1C, 0x0E, 0x00, 0x1C, 0x15, 0x00, 0x1C,
0x1C, 0x00, 0x1C, 0x1C, 0x00, 0x15, 0x1C, 0x00, 0x0E, 0x1C, 0x00, 0x07,
0x1C, 0x00, 0x00, 0x1C, 0x07, 0x00, 0x1C, 0x0E, 0x00, 0x1C, 0x15, 0x00,
0x1C, 0x1C, 0x00, 0x15, 0x1C, 0x00, 0x0E, 0x1C, 0x00, 0x07, 0x1C, 0x00,
0x00, 0x1C, 0x00, 0x00, 0x1C, 0x07, 0x00, 0x1C, 0x0E, 0x00, 0x1C, 0x15,
0x00, 0x1C, 0x1C, 0x00, 0x15, 0x1C, 0x00, 0x0E, 0x1C, 0x00, 0x07, 0x1C,
0x0E, 0x0E, 0x1C, 0x11, 0x0E, 0x1C, 0x15, 0x0E, 0x1C, 0x18, 0x0E, 0x1C,
0x1C, 0x0E, 0x1C, 0x1C, 0x0E, 0x18, 0x1C, 0x0E, 0x15, 0x1C, 0x0E, 0x11,
0x1C, 0x0E, 0x0E, 0x1C, 0x11, 0x0E, 0x1C, 0x15, 0x0E, 0x1C, 0x18, 0x0E,
0x1C, 0x1C, 0x0E, 0x18, 0x1C, 0x0E, 0x15, 0x1C, 0x0E, 0x11, 0x1C, 0x0E,
0x0E, 0x1C, 0x0E, 0x0E, 0x1C, 0x11, 0x0E, 0x1C, 0x15, 0x0E, 0x1C, 0x18,
0x0E, 0x1C, 0x1C, 0x0E, 0x18, 0x1C, 0x0E, 0x15, 0x1C, 0x0E, 0x11, 0x1C,
0x14, 0x14, 0x1C, 0x16, 0x14, 0x1C, 0x18, 0x14, 0x1C, 0x1A, 0x14, 0x1C,
0x1C, 0x14, 0x1C, 0x1C, 0x14, 0x1A, 0x1C, 0x14, 0x18, 0x1C, 0x14, 0x16,
0x1C, 0x14, 0x14, 0x1C, 0x16, 0x14, 0x1C, 0x18, 0x14, 0x1C, 0x1A, 0x14,
0x1C, 0x1C, 0x14, 0x1A, 0x1C, 0x14, 0x18, 0x1C, 0x14, 0x16, 0x1C, 0x14,
0x14, 0x1C, 0x14, 0x14, 0x1C, 0x16, 0x14, 0x1C, 0x18, 0x14, 0x1C, 0x1A,
0x14, 0x1C, 0x1C, 0x14, 0x1A, 0x1C, 0x14, 0x18, 0x1C, 0x14, 0x16, 0x1C,
0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x08, 0x00, 0x10, 0x0C, 0x00, 0x10,
0x10, 0x00, 0x10, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x10, 0x00, 0x04,
0x10, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x08, 0x00, 0x10, 0x0C, 0x00,
0x10, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x10, 0x00, 0x04, 0x10, 0x00,
0x00, 0x10, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x08, 0x00, 0x10, 0x0C,
0x00, 0x10, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x10, 0x00, 0x04, 0x10,
0x08, 0x08, 0x10, 0x0A, 0x08, 0x10, 0x0C, 0x08, 0x10, 0x0E, 0x08, 0x10,
0x10, 0x08, 0x10, 0x10, 0x08, 0x0E, 0x10, 0x08, 0x0C, 0x10, 0x08, 0x0A,
0x10, 0x08, 0x08, 0x10, 0x0A, 0x08, 0x10, 0x0C, 0x08, 0x10, 0x0E, 0x08,
0x10, 0x10, 0x08, 0x0E, 0x10, 0x08, 0x0C, 0x10, 0x08, 0x0A, 0x10, 0x08,
0x08, 0x10, 0x08, 0x08, 0x10, 0x0A, 0x08, 0x10, 0x0C, 0x08, 0x10, 0x0E,
0x08, 0x10, 0x10, 0x08, 0x0E, 0x10, 0x08, 0x0C, 0x10, 0x08, 0x0A, 0x10,
0x0B, 0x0B, 0x10, 0x0C, 0x0B, 0x10, 0x0D, 0x0B, 0x10, 0x0F, 0x0B, 0x10,
0x10, 0x0B, 0x10, 0x10, 0x0B, 0x0F, 0x10, 0x0B, 0x0D, 0x10, 0x0B, 0x0C,
0x10, 0x0B, 0x0B, 0x10, 0x0C, 0x0B, 0x10, 0x0D, 0x0B, 0x10, 0x0F, 0x0B,
0x10, 0x10, 0x0B, 0x0F, 0x10, 0x0B, 0x0D, 0x10, 0x0B, 0x0C, 0x10, 0x0B,
0x0B, 0x10, 0x0B, 0x0B, 0x10, 0x0C, 0x0B, 0x10, 0x0D, 0x0B, 0x10, 0x0F,
0x0B, 0x10, 0x10, 0x0B, 0x0F, 0x10, 0x0B, 0x0D, 0x10, 0x0B, 0x0C, 0x10,
0x03, 0x00, 0x0F, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x09, 0x01, 0x00, 0x07,
0x01, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F
};
unsigned char DefaultVGAPalette[768]={
0x00,0x00,0x00,0x00,0x00,0x2A,0x00,0x2A,0x00,0x00,0x2A,0x2A,0x2A,0x00,0x00,0x2A,
0x00,0x2A,0x2A,0x15,0x00,0x2A,0x2A,0x2A,0x15,0x15,0x15,0x15,0x15,0x3F,0x15,0x3F,
0x15,0x15,0x3F,0x3F,0x3F,0x15,0x15,0x3F,0x15,0x3F,0x3F,0x3F,0x15,0x3F,0x3F,0x3F,
0x00,0x00,0x00,0x05,0x05,0x05,0x08,0x08,0x08,0x0B,0x0B,0x0B,0x0E,0x0E,0x0E,0x11,
0x11,0x11,0x14,0x14,0x14,0x18,0x18,0x18,0x1C,0x1C,0x1C,0x20,0x20,0x20,0x24,0x24,
0x24,0x28,0x28,0x28,0x2D,0x2D,0x2D,0x32,0x32,0x32,0x38,0x38,0x38,0x3F,0x3F,0x3F,
0x00,0x00,0x3F,0x10,0x00,0x3F,0x1F,0x00,0x3F,0x2F,0x00,0x3F,0x3F,0x00,0x3F,0x3F,
0x00,0x2F,0x3F,0x00,0x1F,0x3F,0x00,0x10,0x3F,0x00,0x00,0x3F,0x10,0x00,0x3F,0x1F,
0x00,0x3F,0x2F,0x00,0x3F,0x3F,0x00,0x2F,0x3F,0x00,0x1F,0x3F,0x00,0x10,0x3F,0x00,
0x00,0x3F,0x00,0x00,0x3F,0x10,0x00,0x3F,0x1F,0x00,0x3F,0x2F,0x00,0x3F,0x3F,0x00,
0x2F,0x3F,0x00,0x1F,0x3F,0x00,0x10,0x3F,0x1F,0x1F,0x3F,0x27,0x1F,0x3F,0x2F,0x1F,
0x3F,0x37,0x1F,0x3F,0x3F,0x1F,0x3F,0x3F,0x1F,0x37,0x3F,0x1F,0x2F,0x3F,0x1F,0x27,
0x3F,0x1F,0x1F,0x3F,0x27,0x1F,0x3F,0x2F,0x1F,0x3F,0x37,0x1F,0x3F,0x3F,0x1F,0x37,
0x3F,0x1F,0x2F,0x3F,0x1F,0x27,0x3F,0x1F,0x1F,0x3F,0x1F,0x1F,0x3F,0x27,0x1F,0x3F,
0x2F,0x1F,0x3F,0x37,0x1F,0x3F,0x3F,0x1F,0x37,0x3F,0x1F,0x2F,0x3F,0x1F,0x27,0x3F,
0x2D,0x2D,0x3F,0x31,0x2D,0x3F,0x36,0x2D,0x3F,0x3A,0x2D,0x3F,0x3F,0x2D,0x3F,0x3F,
0x2D,0x3A,0x3F,0x2D,0x36,0x3F,0x2D,0x31,0x3F,0x2D,0x2D,0x3F,0x31,0x2D,0x3F,0x36,
0x2D,0x3F,0x3A,0x2D,0x3F,0x3F,0x2D,0x3A,0x3F,0x2D,0x36,0x3F,0x2D,0x31,0x3F,0x2D,
0x2D,0x3F,0x2D,0x2D,0x3F,0x31,0x2D,0x3F,0x36,0x2D,0x3F,0x3A,0x2D,0x3F,0x3F,0x2D,
0x3A,0x3F,0x2D,0x36,0x3F,0x2D,0x31,0x3F,0x00,0x00,0x1C,0x07,0x00,0x1C,0x0E,0x00,
0x1C,0x15,0x00,0x1C,0x1C,0x00,0x1C,0x1C,0x00,0x15,0x1C,0x00,0x0E,0x1C,0x00,0x07,
0x1C,0x00,0x00,0x1C,0x07,0x00,0x1C,0x0E,0x00,0x1C,0x15,0x00,0x1C,0x1C,0x00,0x15,
0x1C,0x00,0x0E,0x1C,0x00,0x07,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x07,0x00,0x1C,
0x0E,0x00,0x1C,0x15,0x00,0x1C,0x1C,0x00,0x15,0x1C,0x00,0x0E,0x1C,0x00,0x07,0x1C,
0x0E,0x0E,0x1C,0x11,0x0E,0x1C,0x15,0x0E,0x1C,0x18,0x0E,0x1C,0x1C,0x0E,0x1C,0x1C,
0x0E,0x18,0x1C,0x0E,0x15,0x1C,0x0E,0x11,0x1C,0x0E,0x0E,0x1C,0x11,0x0E,0x1C,0x15,
0x0E,0x1C,0x18,0x0E,0x1C,0x1C,0x0E,0x18,0x1C,0x0E,0x15,0x1C,0x0E,0x11,0x1C,0x0E,
0x0E,0x1C,0x0E,0x0E,0x1C,0x11,0x0E,0x1C,0x15,0x0E,0x1C,0x18,0x0E,0x1C,0x1C,0x0E,
0x18,0x1C,0x0E,0x15,0x1C,0x0E,0x11,0x1C,0x14,0x14,0x1C,0x16,0x14,0x1C,0x18,0x14,
0x1C,0x1A,0x14,0x1C,0x1C,0x14,0x1C,0x1C,0x14,0x1A,0x1C,0x14,0x18,0x1C,0x14,0x16,
0x1C,0x14,0x14,0x1C,0x16,0x14,0x1C,0x18,0x14,0x1C,0x1A,0x14,0x1C,0x1C,0x14,0x1A,
0x1C,0x14,0x18,0x1C,0x14,0x16,0x1C,0x14,0x14,0x1C,0x14,0x14,0x1C,0x16,0x14,0x1C,
0x18,0x14,0x1C,0x1A,0x14,0x1C,0x1C,0x14,0x1A,0x1C,0x14,0x18,0x1C,0x14,0x16,0x1C,
0x00,0x00,0x10,0x04,0x00,0x10,0x08,0x00,0x10,0x0C,0x00,0x10,0x10,0x00,0x10,0x10,
0x00,0x0C,0x10,0x00,0x08,0x10,0x00,0x04,0x10,0x00,0x00,0x10,0x04,0x00,0x10,0x08,
0x00,0x10,0x0C,0x00,0x10,0x10,0x00,0x0C,0x10,0x00,0x08,0x10,0x00,0x04,0x10,0x00,
0x00,0x10,0x00,0x00,0x10,0x04,0x00,0x10,0x08,0x00,0x10,0x0C,0x00,0x10,0x10,0x00,
0x0C,0x10,0x00,0x08,0x10,0x00,0x04,0x10,0x08,0x08,0x10,0x0A,0x08,0x10,0x0C,0x08,
0x10,0x0E,0x08,0x10,0x10,0x08,0x10,0x10,0x08,0x0E,0x10,0x08,0x0C,0x10,0x08,0x0A,
0x10,0x08,0x08,0x10,0x0A,0x08,0x10,0x0C,0x08,0x10,0x0E,0x08,0x10,0x10,0x08,0x0E,
0x10,0x08,0x0C,0x10,0x08,0x0A,0x10,0x08,0x08,0x10,0x08,0x08,0x10,0x0A,0x08,0x10,
0x0C,0x08,0x10,0x0E,0x08,0x10,0x10,0x08,0x0E,0x10,0x08,0x0C,0x10,0x08,0x0A,0x10,
0x0B,0x0B,0x10,0x0C,0x0B,0x10,0x0D,0x0B,0x10,0x0F,0x0B,0x10,0x10,0x0B,0x10,0x10,
0x0B,0x0F,0x10,0x0B,0x0D,0x10,0x0B,0x0C,0x10,0x0B,0x0B,0x10,0x0C,0x0B,0x10,0x0D,
0x0B,0x10,0x0F,0x0B,0x10,0x10,0x0B,0x0F,0x10,0x0B,0x0D,0x10,0x0B,0x0C,0x10,0x0B,
0x0B,0x10,0x0B,0x0B,0x10,0x0C,0x0B,0x10,0x0D,0x0B,0x10,0x0F,0x0B,0x10,0x10,0x0B,
0x0F,0x10,0x0B,0x0D,0x10,0x0B,0x0C,0x10,0x03,0x00,0x0F,0x02,0x00,0x0C,0x02,0x00,
0x09,0x01,0x00,0x07,0x01,0x00,0x04,0x00,0x00,0x02,0x00,0x00,0x00,0x3F,0x3F,0x3F};
unsigned char DefaultVGAPalette[768] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x2A,
0x2A, 0x00, 0x00, 0x2A, 0x00, 0x2A, 0x2A, 0x15, 0x00, 0x2A, 0x2A, 0x2A,
0x15, 0x15, 0x15, 0x15, 0x15, 0x3F, 0x15, 0x3F, 0x15, 0x15, 0x3F, 0x3F,
0x3F, 0x15, 0x15, 0x3F, 0x15, 0x3F, 0x3F, 0x3F, 0x15, 0x3F, 0x3F, 0x3F,
0x00, 0x00, 0x00, 0x05, 0x05, 0x05, 0x08, 0x08, 0x08, 0x0B, 0x0B, 0x0B,
0x0E, 0x0E, 0x0E, 0x11, 0x11, 0x11, 0x14, 0x14, 0x14, 0x18, 0x18, 0x18,
0x1C, 0x1C, 0x1C, 0x20, 0x20, 0x20, 0x24, 0x24, 0x24, 0x28, 0x28, 0x28,
0x2D, 0x2D, 0x2D, 0x32, 0x32, 0x32, 0x38, 0x38, 0x38, 0x3F, 0x3F, 0x3F,
0x00, 0x00, 0x3F, 0x10, 0x00, 0x3F, 0x1F, 0x00, 0x3F, 0x2F, 0x00, 0x3F,
0x3F, 0x00, 0x3F, 0x3F, 0x00, 0x2F, 0x3F, 0x00, 0x1F, 0x3F, 0x00, 0x10,
0x3F, 0x00, 0x00, 0x3F, 0x10, 0x00, 0x3F, 0x1F, 0x00, 0x3F, 0x2F, 0x00,
0x3F, 0x3F, 0x00, 0x2F, 0x3F, 0x00, 0x1F, 0x3F, 0x00, 0x10, 0x3F, 0x00,
0x00, 0x3F, 0x00, 0x00, 0x3F, 0x10, 0x00, 0x3F, 0x1F, 0x00, 0x3F, 0x2F,
0x00, 0x3F, 0x3F, 0x00, 0x2F, 0x3F, 0x00, 0x1F, 0x3F, 0x00, 0x10, 0x3F,
0x1F, 0x1F, 0x3F, 0x27, 0x1F, 0x3F, 0x2F, 0x1F, 0x3F, 0x37, 0x1F, 0x3F,
0x3F, 0x1F, 0x3F, 0x3F, 0x1F, 0x37, 0x3F, 0x1F, 0x2F, 0x3F, 0x1F, 0x27,
0x3F, 0x1F, 0x1F, 0x3F, 0x27, 0x1F, 0x3F, 0x2F, 0x1F, 0x3F, 0x37, 0x1F,
0x3F, 0x3F, 0x1F, 0x37, 0x3F, 0x1F, 0x2F, 0x3F, 0x1F, 0x27, 0x3F, 0x1F,
0x1F, 0x3F, 0x1F, 0x1F, 0x3F, 0x27, 0x1F, 0x3F, 0x2F, 0x1F, 0x3F, 0x37,
0x1F, 0x3F, 0x3F, 0x1F, 0x37, 0x3F, 0x1F, 0x2F, 0x3F, 0x1F, 0x27, 0x3F,
0x2D, 0x2D, 0x3F, 0x31, 0x2D, 0x3F, 0x36, 0x2D, 0x3F, 0x3A, 0x2D, 0x3F,
0x3F, 0x2D, 0x3F, 0x3F, 0x2D, 0x3A, 0x3F, 0x2D, 0x36, 0x3F, 0x2D, 0x31,
0x3F, 0x2D, 0x2D, 0x3F, 0x31, 0x2D, 0x3F, 0x36, 0x2D, 0x3F, 0x3A, 0x2D,
0x3F, 0x3F, 0x2D, 0x3A, 0x3F, 0x2D, 0x36, 0x3F, 0x2D, 0x31, 0x3F, 0x2D,
0x2D, 0x3F, 0x2D, 0x2D, 0x3F, 0x31, 0x2D, 0x3F, 0x36, 0x2D, 0x3F, 0x3A,
0x2D, 0x3F, 0x3F, 0x2D, 0x3A, 0x3F, 0x2D, 0x36, 0x3F, 0x2D, 0x31, 0x3F,
0x00, 0x00, 0x1C, 0x07, 0x00, 0x1C, 0x0E, 0x00, 0x1C, 0x15, 0x00, 0x1C,
0x1C, 0x00, 0x1C, 0x1C, 0x00, 0x15, 0x1C, 0x00, 0x0E, 0x1C, 0x00, 0x07,
0x1C, 0x00, 0x00, 0x1C, 0x07, 0x00, 0x1C, 0x0E, 0x00, 0x1C, 0x15, 0x00,
0x1C, 0x1C, 0x00, 0x15, 0x1C, 0x00, 0x0E, 0x1C, 0x00, 0x07, 0x1C, 0x00,
0x00, 0x1C, 0x00, 0x00, 0x1C, 0x07, 0x00, 0x1C, 0x0E, 0x00, 0x1C, 0x15,
0x00, 0x1C, 0x1C, 0x00, 0x15, 0x1C, 0x00, 0x0E, 0x1C, 0x00, 0x07, 0x1C,
0x0E, 0x0E, 0x1C, 0x11, 0x0E, 0x1C, 0x15, 0x0E, 0x1C, 0x18, 0x0E, 0x1C,
0x1C, 0x0E, 0x1C, 0x1C, 0x0E, 0x18, 0x1C, 0x0E, 0x15, 0x1C, 0x0E, 0x11,
0x1C, 0x0E, 0x0E, 0x1C, 0x11, 0x0E, 0x1C, 0x15, 0x0E, 0x1C, 0x18, 0x0E,
0x1C, 0x1C, 0x0E, 0x18, 0x1C, 0x0E, 0x15, 0x1C, 0x0E, 0x11, 0x1C, 0x0E,
0x0E, 0x1C, 0x0E, 0x0E, 0x1C, 0x11, 0x0E, 0x1C, 0x15, 0x0E, 0x1C, 0x18,
0x0E, 0x1C, 0x1C, 0x0E, 0x18, 0x1C, 0x0E, 0x15, 0x1C, 0x0E, 0x11, 0x1C,
0x14, 0x14, 0x1C, 0x16, 0x14, 0x1C, 0x18, 0x14, 0x1C, 0x1A, 0x14, 0x1C,
0x1C, 0x14, 0x1C, 0x1C, 0x14, 0x1A, 0x1C, 0x14, 0x18, 0x1C, 0x14, 0x16,
0x1C, 0x14, 0x14, 0x1C, 0x16, 0x14, 0x1C, 0x18, 0x14, 0x1C, 0x1A, 0x14,
0x1C, 0x1C, 0x14, 0x1A, 0x1C, 0x14, 0x18, 0x1C, 0x14, 0x16, 0x1C, 0x14,
0x14, 0x1C, 0x14, 0x14, 0x1C, 0x16, 0x14, 0x1C, 0x18, 0x14, 0x1C, 0x1A,
0x14, 0x1C, 0x1C, 0x14, 0x1A, 0x1C, 0x14, 0x18, 0x1C, 0x14, 0x16, 0x1C,
0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x08, 0x00, 0x10, 0x0C, 0x00, 0x10,
0x10, 0x00, 0x10, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x10, 0x00, 0x04,
0x10, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x08, 0x00, 0x10, 0x0C, 0x00,
0x10, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x10, 0x00, 0x04, 0x10, 0x00,
0x00, 0x10, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x08, 0x00, 0x10, 0x0C,
0x00, 0x10, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x10, 0x00, 0x04, 0x10,
0x08, 0x08, 0x10, 0x0A, 0x08, 0x10, 0x0C, 0x08, 0x10, 0x0E, 0x08, 0x10,
0x10, 0x08, 0x10, 0x10, 0x08, 0x0E, 0x10, 0x08, 0x0C, 0x10, 0x08, 0x0A,
0x10, 0x08, 0x08, 0x10, 0x0A, 0x08, 0x10, 0x0C, 0x08, 0x10, 0x0E, 0x08,
0x10, 0x10, 0x08, 0x0E, 0x10, 0x08, 0x0C, 0x10, 0x08, 0x0A, 0x10, 0x08,
0x08, 0x10, 0x08, 0x08, 0x10, 0x0A, 0x08, 0x10, 0x0C, 0x08, 0x10, 0x0E,
0x08, 0x10, 0x10, 0x08, 0x0E, 0x10, 0x08, 0x0C, 0x10, 0x08, 0x0A, 0x10,
0x0B, 0x0B, 0x10, 0x0C, 0x0B, 0x10, 0x0D, 0x0B, 0x10, 0x0F, 0x0B, 0x10,
0x10, 0x0B, 0x10, 0x10, 0x0B, 0x0F, 0x10, 0x0B, 0x0D, 0x10, 0x0B, 0x0C,
0x10, 0x0B, 0x0B, 0x10, 0x0C, 0x0B, 0x10, 0x0D, 0x0B, 0x10, 0x0F, 0x0B,
0x10, 0x10, 0x0B, 0x0F, 0x10, 0x0B, 0x0D, 0x10, 0x0B, 0x0C, 0x10, 0x0B,
0x0B, 0x10, 0x0B, 0x0B, 0x10, 0x0C, 0x0B, 0x10, 0x0D, 0x0B, 0x10, 0x0F,
0x0B, 0x10, 0x10, 0x0B, 0x0F, 0x10, 0x0B, 0x0D, 0x10, 0x0B, 0x0C, 0x10,
0x03, 0x00, 0x0F, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x09, 0x01, 0x00, 0x07,
0x01, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F
};

File diff suppressed because it is too large Load Diff

View File

@ -36,7 +36,9 @@
|* those rights set forth herein. *|
|* *|
\***************************************************************************/
/* $XFree86: xc/programs/Xserver/hw/xfree86/vga256/drivers/nv/riva_hw.h,v 1.1.2.2 1998/12/22 16:33:19 hohndel Exp $ */
/* $XFree86:
* xc/programs/Xserver/hw/xfree86/vga256/drivers/nv/riva_hw.h,v 1.1.2.2
* 1998/12/22 16:33:19 hohndel Exp $ */
#ifndef __RIVA_HW_H__
#define __RIVA_HW_H__
#define RIVA_SW_VERSION 0x00010000
@ -50,169 +52,155 @@
/*
* Raster OPeration. Windows style ROP3.
*/
typedef volatile struct
{
unsigned reserved00[4];
unsigned short FifoFree;
unsigned short Nop;
unsigned reserved01[0x0BB];
unsigned Rop3;
typedef volatile struct {
unsigned reserved00[4];
unsigned short FifoFree;
unsigned short Nop;
unsigned reserved01[0x0BB];
unsigned Rop3;
} RivaRop;
/*
* 8X8 Monochrome pattern.
*/
typedef volatile struct
{
unsigned reserved00[4];
unsigned short FifoFree;
unsigned short Nop;
unsigned reserved01[0x0BD];
unsigned Shape;
unsigned reserved03[0x001];
unsigned Color0;
unsigned Color1;
unsigned Monochrome[2];
typedef volatile struct {
unsigned reserved00[4];
unsigned short FifoFree;
unsigned short Nop;
unsigned reserved01[0x0BD];
unsigned Shape;
unsigned reserved03[0x001];
unsigned Color0;
unsigned Color1;
unsigned Monochrome[2];
} RivaPattern;
/*
* Scissor clip rectangle.
*/
typedef volatile struct
{
unsigned reserved00[4];
unsigned short FifoFree;
unsigned short Nop;
unsigned reserved01[0x0BB];
unsigned TopLeft;
unsigned WidthHeight;
typedef volatile struct {
unsigned reserved00[4];
unsigned short FifoFree;
unsigned short Nop;
unsigned reserved01[0x0BB];
unsigned TopLeft;
unsigned WidthHeight;
} RivaClip;
/*
* 2D filled rectangle.
*/
typedef volatile struct
{
unsigned reserved00[4];
unsigned short FifoFree;
unsigned short Nop[1];
unsigned reserved01[0x0BC];
unsigned Color;
unsigned reserved03[0x03E];
unsigned TopLeft;
unsigned WidthHeight;
typedef volatile struct {
unsigned reserved00[4];
unsigned short FifoFree;
unsigned short Nop[1];
unsigned reserved01[0x0BC];
unsigned Color;
unsigned reserved03[0x03E];
unsigned TopLeft;
unsigned WidthHeight;
} RivaRectangle;
/*
* 2D screen-screen BLT.
*/
typedef volatile struct
{
unsigned reserved00[4];
unsigned short FifoFree;
unsigned short Nop;
unsigned reserved01[0x0BB];
unsigned TopLeftSrc;
unsigned TopLeftDst;
unsigned WidthHeight;
typedef volatile struct {
unsigned reserved00[4];
unsigned short FifoFree;
unsigned short Nop;
unsigned reserved01[0x0BB];
unsigned TopLeftSrc;
unsigned TopLeftDst;
unsigned WidthHeight;
} RivaScreenBlt;
/*
* 2D pixel BLT.
*/
typedef volatile struct
{
unsigned reserved00[4];
unsigned short FifoFree;
unsigned short Nop[1];
unsigned reserved01[0x0BC];
unsigned TopLeft;
unsigned WidthHeight;
unsigned WidthHeightIn;
unsigned reserved02[0x03C];
unsigned Pixels;
typedef volatile struct {
unsigned reserved00[4];
unsigned short FifoFree;
unsigned short Nop[1];
unsigned reserved01[0x0BC];
unsigned TopLeft;
unsigned WidthHeight;
unsigned WidthHeightIn;
unsigned reserved02[0x03C];
unsigned Pixels;
} RivaPixmap;
/*
* Filled rectangle combined with monochrome expand. Useful for glyphs.
*/
typedef volatile struct
{
unsigned reserved00[4];
unsigned short FifoFree;
unsigned short Nop;
unsigned reserved01[0x0BB];
unsigned reserved03[(0x040)-1];
unsigned Color1A;
struct
{
unsigned TopLeft;
unsigned WidthHeight;
} UnclippedRectangle[64];
unsigned reserved04[(0x080)-3];
struct
{
unsigned TopLeft;
unsigned BottomRight;
} ClipB;
unsigned Color1B;
struct
{
unsigned TopLeft;
unsigned BottomRight;
} ClippedRectangle[64];
unsigned reserved05[(0x080)-5];
struct
{
unsigned TopLeft;
unsigned BottomRight;
} ClipC;
unsigned Color1C;
unsigned WidthHeightC;
unsigned PointC;
unsigned MonochromeData1C;
unsigned reserved06[(0x080)+121];
struct
{
unsigned TopLeft;
unsigned BottomRight;
} ClipD;
unsigned Color1D;
unsigned WidthHeightInD;
unsigned WidthHeightOutD;
unsigned PointD;
unsigned MonochromeData1D;
unsigned reserved07[(0x080)+120];
struct
{
unsigned TopLeft;
unsigned BottomRight;
} ClipE;
unsigned Color0E;
unsigned Color1E;
unsigned WidthHeightInE;
unsigned WidthHeightOutE;
unsigned PointE;
unsigned MonochromeData01E;
typedef volatile struct {
unsigned reserved00[4];
unsigned short FifoFree;
unsigned short Nop;
unsigned reserved01[0x0BB];
unsigned reserved03[(0x040) - 1];
unsigned Color1A;
struct {
unsigned TopLeft;
unsigned WidthHeight;
} UnclippedRectangle[64];
unsigned reserved04[(0x080) - 3];
struct {
unsigned TopLeft;
unsigned BottomRight;
} ClipB;
unsigned Color1B;
struct {
unsigned TopLeft;
unsigned BottomRight;
} ClippedRectangle[64];
unsigned reserved05[(0x080) - 5];
struct {
unsigned TopLeft;
unsigned BottomRight;
} ClipC;
unsigned Color1C;
unsigned WidthHeightC;
unsigned PointC;
unsigned MonochromeData1C;
unsigned reserved06[(0x080) + 121];
struct {
unsigned TopLeft;
unsigned BottomRight;
} ClipD;
unsigned Color1D;
unsigned WidthHeightInD;
unsigned WidthHeightOutD;
unsigned PointD;
unsigned MonochromeData1D;
unsigned reserved07[(0x080) + 120];
struct {
unsigned TopLeft;
unsigned BottomRight;
} ClipE;
unsigned Color0E;
unsigned Color1E;
unsigned WidthHeightInE;
unsigned WidthHeightOutE;
unsigned PointE;
unsigned MonochromeData01E;
} RivaBitmap;
/*
* 3D textured, Z buffered triangle.
*/
typedef volatile struct
{
unsigned reserved00[4];
unsigned short FifoFree;
unsigned short Nop;
unsigned reserved01[0x0BC];
unsigned TextureOffset;
unsigned TextureFormat;
unsigned TextureFilter;
unsigned FogColor;
unsigned Control;
unsigned AlphaTest;
unsigned reserved02[0x339];
unsigned FogAndIndex;
unsigned Color;
float ScreenX;
float ScreenY;
float ScreenZ;
float EyeM;
float TextureS;
float TextureT;
typedef volatile struct {
unsigned reserved00[4];
unsigned short FifoFree;
unsigned short Nop;
unsigned reserved01[0x0BC];
unsigned TextureOffset;
unsigned TextureFormat;
unsigned TextureFilter;
unsigned FogColor;
unsigned Control;
unsigned AlphaTest;
unsigned reserved02[0x339];
unsigned FogAndIndex;
unsigned Color;
float ScreenX;
float ScreenY;
float ScreenZ;
float EyeM;
float TextureS;
float TextureT;
} RivaTexturedTriangle03;
/***************************************************************************\
@ -226,96 +214,97 @@ struct _riva_hw_state;
/*
* Virtialized chip interface. Makes RIVA 128 and TNT look alike.
*/
typedef struct _riva_hw_inst
{
/*
* Chip specific settings.
*/
unsigned Architecture;
unsigned Version;
unsigned CrystalFreqKHz;
unsigned RamAmountKBytes;
unsigned MaxVClockFreqKHz;
unsigned RamBandwidthKBytesPerSec;
unsigned EnableIRQ;
unsigned IO;
unsigned LockUnlockIO;
unsigned LockUnlockIndex;
unsigned VBlankBit;
unsigned FifoFreeCount;
/*
* Non-FIFO registers.
*/
volatile unsigned *PCRTC;
volatile unsigned *PRAMDAC;
volatile unsigned *PFB;
volatile unsigned *PFIFO;
volatile unsigned *PGRAPH;
volatile unsigned *PEXTDEV;
volatile unsigned *PTIMER;
volatile unsigned *PMC;
volatile unsigned *PRAMIN;
volatile unsigned *FIFO;
volatile unsigned *CURSOR;
volatile unsigned *CURSORPOS;
volatile unsigned *VBLANKENABLE;
volatile unsigned *VBLANK;
/*
* Common chip functions.
*/
int (*Busy)(struct _riva_hw_inst *);
void (*CalcStateExt)(struct _riva_hw_inst *,struct _riva_hw_state *,int,int,int,int,int,int,int,int,int,int,int,int,int);
void (*LoadStateExt)(struct _riva_hw_inst *,struct _riva_hw_state *, int all);
void (*UnloadStateExt)(struct _riva_hw_inst *,struct _riva_hw_state *);
void (*SetStartAddress)(struct _riva_hw_inst *,unsigned);
void (*SetSurfaces2D)(struct _riva_hw_inst *,unsigned,unsigned);
void (*SetSurfaces3D)(struct _riva_hw_inst *,unsigned,unsigned);
int (*ShowHideCursor)(struct _riva_hw_inst *,int);
/*
* Current extended mode settings.
*/
struct _riva_hw_state *CurrentState;
/*
* FIFO registers.
*/
RivaRop *Rop;
RivaPattern *Patt;
RivaClip *Clip;
RivaPixmap *Pixmap;
RivaScreenBlt *Blt;
RivaBitmap *Bitmap;
RivaTexturedTriangle03 *Tri03;
typedef struct _riva_hw_inst {
/*
* Chip specific settings.
*/
unsigned Architecture;
unsigned Version;
unsigned CrystalFreqKHz;
unsigned RamAmountKBytes;
unsigned MaxVClockFreqKHz;
unsigned RamBandwidthKBytesPerSec;
unsigned EnableIRQ;
unsigned IO;
unsigned LockUnlockIO;
unsigned LockUnlockIndex;
unsigned VBlankBit;
unsigned FifoFreeCount;
/*
* Non-FIFO registers.
*/
volatile unsigned *PCRTC;
volatile unsigned *PRAMDAC;
volatile unsigned *PFB;
volatile unsigned *PFIFO;
volatile unsigned *PGRAPH;
volatile unsigned *PEXTDEV;
volatile unsigned *PTIMER;
volatile unsigned *PMC;
volatile unsigned *PRAMIN;
volatile unsigned *FIFO;
volatile unsigned *CURSOR;
volatile unsigned *CURSORPOS;
volatile unsigned *VBLANKENABLE;
volatile unsigned *VBLANK;
/*
* Common chip functions.
*/
int (*Busy)(struct _riva_hw_inst *);
void (*CalcStateExt)(struct _riva_hw_inst *, struct _riva_hw_state *, int,
int, int, int, int, int, int, int, int, int, int, int,
int);
void (*LoadStateExt)(struct _riva_hw_inst *, struct _riva_hw_state *,
int all);
void (*UnloadStateExt)(struct _riva_hw_inst *, struct _riva_hw_state *);
void (*SetStartAddress)(struct _riva_hw_inst *, unsigned);
void (*SetSurfaces2D)(struct _riva_hw_inst *, unsigned, unsigned);
void (*SetSurfaces3D)(struct _riva_hw_inst *, unsigned, unsigned);
int (*ShowHideCursor)(struct _riva_hw_inst *, int);
/*
* Current extended mode settings.
*/
struct _riva_hw_state *CurrentState;
/*
* FIFO registers.
*/
RivaRop *Rop;
RivaPattern *Patt;
RivaClip *Clip;
RivaPixmap *Pixmap;
RivaScreenBlt *Blt;
RivaBitmap *Bitmap;
RivaTexturedTriangle03 *Tri03;
} RIVA_HW_INST;
/*
* Extended mode state information.
*/
typedef struct _riva_hw_state
{
unsigned bpp;
unsigned width;
unsigned height;
unsigned repaint0;
unsigned repaint1;
unsigned screen;
unsigned pixel;
unsigned horiz;
unsigned arbitration0;
unsigned arbitration1;
unsigned vpll;
unsigned pllsel;
unsigned general;
unsigned config;
unsigned cursor0;
unsigned cursor1;
unsigned cursor2;
unsigned offset0;
unsigned offset1;
unsigned offset2;
unsigned offset3;
unsigned pitch0;
unsigned pitch1;
unsigned pitch2;
unsigned pitch3;
typedef struct _riva_hw_state {
unsigned bpp;
unsigned width;
unsigned height;
unsigned repaint0;
unsigned repaint1;
unsigned screen;
unsigned pixel;
unsigned horiz;
unsigned arbitration0;
unsigned arbitration1;
unsigned vpll;
unsigned pllsel;
unsigned general;
unsigned config;
unsigned cursor0;
unsigned cursor1;
unsigned cursor2;
unsigned offset0;
unsigned offset1;
unsigned offset2;
unsigned offset3;
unsigned pitch0;
unsigned pitch1;
unsigned pitch2;
unsigned pitch3;
} RIVA_HW_STATE;
/*
* External routines.
@ -324,13 +313,11 @@ int RivaGetConfig(RIVA_HW_INST *);
/*
* FIFO Free Count. Should attempt to yield processor if RIVA is busy.
*/
#define RIVA_FIFO_FREE(hwinst,hwptr,cnt) \
{ \
while ((hwinst).FifoFreeCount < (cnt)) \
{ \
(hwinst).FifoFreeCount = (hwinst).hwptr->FifoFree >> 2; \
} \
(hwinst).FifoFreeCount -= (cnt); \
}
#define RIVA_FIFO_FREE(hwinst, hwptr, cnt) \
{ \
while ((hwinst).FifoFreeCount < (cnt)) { \
(hwinst).FifoFreeCount = (hwinst).hwptr->FifoFree >> 2; \
} \
(hwinst).FifoFreeCount -= (cnt); \
}
#endif /* __RIVA_HW_H__ */

View File

@ -1,4 +1,4 @@
/***************************************************************************\
/***************************************************************************\
|* *|
|* Copyright 1993-1998 NVIDIA, Corporation. All rights reserved. *|
|* *|
@ -35,361 +35,196 @@
|* all U.S. Government End Users acquire the source code with only *|
|* those rights set forth herein. *|
|* *|
\***************************************************************************/
/* $XFree86: xc/programs/Xserver/hw/xfree86/vga256/drivers/nv/riva_tbl.h,v 1.1.2.2 1998/12/22 16:33:20 hohndel Exp $ */
\***************************************************************************/
/* $XFree86:
* xc/programs/Xserver/hw/xfree86/vga256/drivers/nv/riva_tbl.h,v 1.1.2.2
* 1998/12/22 16:33:20 hohndel Exp $ */
/*
* RIVA Fixed Functionality Init Tables.
*/
static unsigned RivaTablePMC[][2] =
{
{0x00000050, 0x00000000},
{0x00000080, 0xFFFF00FF},
{0x00000080, 0xFFFFFFFF}
static unsigned RivaTablePMC[][2] = { { 0x00000050, 0x00000000 },
{ 0x00000080, 0xFFFF00FF },
{ 0x00000080, 0xFFFFFFFF } };
static unsigned RivaTablePTIMER[][2] = { { 0x00000080, 0x00000008 },
{ 0x00000084, 0x00000003 },
{ 0x00000050, 0x00000000 },
{ 0x00000040, 0xFFFFFFFF } };
static unsigned RivaTableFIFO[][2] = {
{ 0x00000000, 0x80000000 }, { 0x00000800, 0x80000001 },
{ 0x00001000, 0x80000002 }, { 0x00001800, 0x80000010 },
{ 0x00002000, 0x80000011 }, { 0x00002800, 0x80000012 },
{ 0x00003800, 0x80000013 }
};
static unsigned RivaTablePTIMER[][2] =
{
{0x00000080, 0x00000008},
{0x00000084, 0x00000003},
{0x00000050, 0x00000000},
{0x00000040, 0xFFFFFFFF}
static unsigned nv3TablePFIFO[][2] = {
{ 0x00000140, 0x00000000 }, { 0x00000480, 0x00000000 },
{ 0x00000490, 0x00000000 }, { 0x00000494, 0x00000000 },
{ 0x00000481, 0x00000000 }, { 0x00000084, 0x00000000 },
{ 0x00000086, 0x00002000 }, { 0x00000085, 0x00002200 },
{ 0x00000484, 0x00000000 }, { 0x0000049C, 0x00000000 },
{ 0x00000104, 0x00000000 }, { 0x00000108, 0x00000000 },
{ 0x00000100, 0x00000000 }, { 0x000004A0, 0x00000000 },
{ 0x000004A4, 0x00000000 }, { 0x000004A8, 0x00000000 },
{ 0x000004AC, 0x00000000 }, { 0x000004B0, 0x00000000 },
{ 0x000004B4, 0x00000000 }, { 0x000004B8, 0x00000000 },
{ 0x000004BC, 0x00000000 }, { 0x00000050, 0x00000000 },
{ 0x00000040, 0xFFFFFFFF }, { 0x00000480, 0x00000001 },
{ 0x00000490, 0x00000001 }, { 0x00000140, 0x00000001 }
};
static unsigned RivaTableFIFO[][2] =
{
{0x00000000, 0x80000000},
{0x00000800, 0x80000001},
{0x00001000, 0x80000002},
{0x00001800, 0x80000010},
{0x00002000, 0x80000011},
{0x00002800, 0x80000012},
{0x00003800, 0x80000013}
static unsigned nv3TablePGRAPH[][2] = {
{ 0x00000020, 0x1230001F }, { 0x00000021, 0x10113000 },
{ 0x00000022, 0x1131F101 }, { 0x00000023, 0x0100F531 },
{ 0x00000060, 0x00000000 }, { 0x00000065, 0x00000000 },
{ 0x00000068, 0x00000000 }, { 0x00000069, 0x00000000 },
{ 0x0000006A, 0x00000000 }, { 0x0000006B, 0x00000000 },
{ 0x0000006C, 0x00000000 }, { 0x0000006D, 0x00000000 },
{ 0x0000006E, 0x00000000 }, { 0x0000006F, 0x00000000 },
{ 0x000001A8, 0x00000000 }, { 0x00000440, 0xFFFFFFFF },
{ 0x00000480, 0x00000001 }, { 0x000001A0, 0x00000000 },
{ 0x000001A2, 0x00000000 }, { 0x0000018A, 0xFFFFFFFF },
{ 0x00000190, 0x00000000 }, { 0x00000142, 0x00000000 },
{ 0x00000154, 0x00000000 }, { 0x00000155, 0xFFFFFFFF },
{ 0x00000156, 0x00000000 }, { 0x00000157, 0xFFFFFFFF },
{ 0x00000064, 0x10010002 }, { 0x00000050, 0x00000000 },
{ 0x00000051, 0x00000000 }, { 0x00000040, 0xFFFFFFFF },
{ 0x00000041, 0xFFFFFFFF }, { 0x00000440, 0xFFFFFFFF },
{ 0x000001A9, 0x00000001 }
};
static unsigned nv3TablePFIFO[][2] =
{
{0x00000140, 0x00000000},
{0x00000480, 0x00000000},
{0x00000490, 0x00000000},
{0x00000494, 0x00000000},
{0x00000481, 0x00000000},
{0x00000084, 0x00000000},
{0x00000086, 0x00002000},
{0x00000085, 0x00002200},
{0x00000484, 0x00000000},
{0x0000049C, 0x00000000},
{0x00000104, 0x00000000},
{0x00000108, 0x00000000},
{0x00000100, 0x00000000},
{0x000004A0, 0x00000000},
{0x000004A4, 0x00000000},
{0x000004A8, 0x00000000},
{0x000004AC, 0x00000000},
{0x000004B0, 0x00000000},
{0x000004B4, 0x00000000},
{0x000004B8, 0x00000000},
{0x000004BC, 0x00000000},
{0x00000050, 0x00000000},
{0x00000040, 0xFFFFFFFF},
{0x00000480, 0x00000001},
{0x00000490, 0x00000001},
{0x00000140, 0x00000001}
static unsigned nv3TablePGRAPH_8BPP[][2] = { { 0x000001AA, 0x00001111 } };
static unsigned nv3TablePGRAPH_15BPP[][2] = { { 0x000001AA, 0x00002222 } };
static unsigned nv3TablePGRAPH_32BPP[][2] = { { 0x000001AA, 0x00003333 } };
static unsigned nv3TablePRAMIN[][2] = {
{ 0x00000500, 0x00010000 }, { 0x00000501, 0x007FFFFF },
{ 0x00000200, 0x80000000 }, { 0x00000201, 0x00C20341 },
{ 0x00000204, 0x80000001 }, { 0x00000205, 0x00C50342 },
{ 0x00000208, 0x80000002 }, { 0x00000209, 0x00C60343 },
{ 0x00000240, 0x80000010 }, { 0x00000241, 0x00D10344 },
{ 0x00000244, 0x80000011 }, { 0x00000245, 0x00D00345 },
{ 0x00000248, 0x80000012 }, { 0x00000249, 0x00CC0346 },
{ 0x0000024C, 0x80000013 }, { 0x0000024D, 0x00D70347 },
{ 0x00000D05, 0x00000000 }, { 0x00000D06, 0x00000000 },
{ 0x00000D07, 0x00000000 }, { 0x00000D09, 0x00000000 },
{ 0x00000D0A, 0x00000000 }, { 0x00000D0B, 0x00000000 },
{ 0x00000D0D, 0x00000000 }, { 0x00000D0E, 0x00000000 },
{ 0x00000D0F, 0x00000000 }, { 0x00000D11, 0x00000000 },
{ 0x00000D12, 0x00000000 }, { 0x00000D13, 0x00000000 },
{ 0x00000D15, 0x00000000 }, { 0x00000D16, 0x00000000 },
{ 0x00000D17, 0x00000000 }, { 0x00000D19, 0x00000000 },
{ 0x00000D1A, 0x00000000 }, { 0x00000D1B, 0x00000000 },
{ 0x00000D1D, 0x00000140 }, { 0x00000D1E, 0x00000000 },
{ 0x00000D1F, 0x00000000 }
};
static unsigned nv3TablePGRAPH[][2] =
{
{0x00000020, 0x1230001F},
{0x00000021, 0x10113000},
{0x00000022, 0x1131F101},
{0x00000023, 0x0100F531},
{0x00000060, 0x00000000},
{0x00000065, 0x00000000},
{0x00000068, 0x00000000},
{0x00000069, 0x00000000},
{0x0000006A, 0x00000000},
{0x0000006B, 0x00000000},
{0x0000006C, 0x00000000},
{0x0000006D, 0x00000000},
{0x0000006E, 0x00000000},
{0x0000006F, 0x00000000},
{0x000001A8, 0x00000000},
{0x00000440, 0xFFFFFFFF},
{0x00000480, 0x00000001},
{0x000001A0, 0x00000000},
{0x000001A2, 0x00000000},
{0x0000018A, 0xFFFFFFFF},
{0x00000190, 0x00000000},
{0x00000142, 0x00000000},
{0x00000154, 0x00000000},
{0x00000155, 0xFFFFFFFF},
{0x00000156, 0x00000000},
{0x00000157, 0xFFFFFFFF},
{0x00000064, 0x10010002},
{0x00000050, 0x00000000},
{0x00000051, 0x00000000},
{0x00000040, 0xFFFFFFFF},
{0x00000041, 0xFFFFFFFF},
{0x00000440, 0xFFFFFFFF},
{0x000001A9, 0x00000001}
static unsigned nv3TablePRAMIN_8BPP[][2] = {
{ 0x00000D04, 0x10110203 }, { 0x00000D08, 0x10110203 },
{ 0x00000D0C, 0x10110203 }, { 0x00000D10, 0x10118203 },
{ 0x00000D14, 0x10110203 }, { 0x00000D18, 0x10110203 },
{ 0x00000D1C, 0x10419208 }
};
static unsigned nv3TablePGRAPH_8BPP[][2] =
{
{0x000001AA, 0x00001111}
static unsigned nv3TablePRAMIN_15BPP[][2] = {
{ 0x00000D04, 0x10110200 }, { 0x00000D08, 0x10110200 },
{ 0x00000D0C, 0x10110200 }, { 0x00000D10, 0x10118200 },
{ 0x00000D14, 0x10110200 }, { 0x00000D18, 0x10110200 },
{ 0x00000D1C, 0x10419208 }
};
static unsigned nv3TablePGRAPH_15BPP[][2] =
{
{0x000001AA, 0x00002222}
static unsigned nv3TablePRAMIN_32BPP[][2] = {
{ 0x00000D04, 0x10110201 }, { 0x00000D08, 0x10110201 },
{ 0x00000D0C, 0x10110201 }, { 0x00000D10, 0x10118201 },
{ 0x00000D14, 0x10110201 }, { 0x00000D18, 0x10110201 },
{ 0x00000D1C, 0x10419208 }
};
static unsigned nv3TablePGRAPH_32BPP[][2] =
{
{0x000001AA, 0x00003333}
static unsigned nv4TablePFIFO[][2] = {
{ 0x00000140, 0x00000000 }, { 0x00000480, 0x00000000 },
{ 0x00000494, 0x00000000 }, { 0x00000400, 0x00000000 },
{ 0x00000414, 0x00000000 }, { 0x00000084, 0x03000100 },
{ 0x00000085, 0x00000110 }, { 0x00000086, 0x00000112 },
{ 0x00000143, 0x0000FFFF }, { 0x00000496, 0x0000FFFF },
{ 0x00000050, 0x00000000 }, { 0x00000040, 0xFFFFFFFF },
{ 0x00000415, 0x00000001 }, { 0x00000480, 0x00000001 },
{ 0x00000494, 0x00000001 }, { 0x00000495, 0x00000001 },
{ 0x00000140, 0x00000001 }
};
static unsigned nv3TablePRAMIN[][2] =
{
{0x00000500, 0x00010000},
{0x00000501, 0x007FFFFF},
{0x00000200, 0x80000000},
{0x00000201, 0x00C20341},
{0x00000204, 0x80000001},
{0x00000205, 0x00C50342},
{0x00000208, 0x80000002},
{0x00000209, 0x00C60343},
{0x00000240, 0x80000010},
{0x00000241, 0x00D10344},
{0x00000244, 0x80000011},
{0x00000245, 0x00D00345},
{0x00000248, 0x80000012},
{0x00000249, 0x00CC0346},
{0x0000024C, 0x80000013},
{0x0000024D, 0x00D70347},
{0x00000D05, 0x00000000},
{0x00000D06, 0x00000000},
{0x00000D07, 0x00000000},
{0x00000D09, 0x00000000},
{0x00000D0A, 0x00000000},
{0x00000D0B, 0x00000000},
{0x00000D0D, 0x00000000},
{0x00000D0E, 0x00000000},
{0x00000D0F, 0x00000000},
{0x00000D11, 0x00000000},
{0x00000D12, 0x00000000},
{0x00000D13, 0x00000000},
{0x00000D15, 0x00000000},
{0x00000D16, 0x00000000},
{0x00000D17, 0x00000000},
{0x00000D19, 0x00000000},
{0x00000D1A, 0x00000000},
{0x00000D1B, 0x00000000},
{0x00000D1D, 0x00000140},
{0x00000D1E, 0x00000000},
{0x00000D1F, 0x00000000}
static unsigned nv4TablePGRAPH[][2] = {
{ 0x00000020, 0x1231C001 }, { 0x00000021, 0x72111101 },
{ 0x00000022, 0x11D5F071 }, { 0x00000023, 0x10D4FF31 },
{ 0x00000060, 0x00000000 }, { 0x00000068, 0x00000000 },
{ 0x00000070, 0x00000000 }, { 0x00000078, 0x00000000 },
{ 0x00000061, 0x00000000 }, { 0x00000069, 0x00000000 },
{ 0x00000071, 0x00000000 }, { 0x00000079, 0x00000000 },
{ 0x00000062, 0x00000000 }, { 0x0000006A, 0x00000000 },
{ 0x00000072, 0x00000000 }, { 0x0000007A, 0x00000000 },
{ 0x00000063, 0x00000000 }, { 0x0000006B, 0x00000000 },
{ 0x00000073, 0x00000000 }, { 0x0000007B, 0x00000000 },
{ 0x00000064, 0x00000000 }, { 0x0000006C, 0x00000000 },
{ 0x00000074, 0x00000000 }, { 0x0000007C, 0x00000000 },
{ 0x00000065, 0x00000000 }, { 0x0000006D, 0x00000000 },
{ 0x00000075, 0x00000000 }, { 0x0000007D, 0x00000000 },
{ 0x00000066, 0x00000000 }, { 0x0000006E, 0x00000000 },
{ 0x00000076, 0x00000000 }, { 0x0000007E, 0x00000000 },
{ 0x00000067, 0x00000000 }, { 0x0000006F, 0x00000000 },
{ 0x00000077, 0x00000000 }, { 0x0000007F, 0x00000000 },
{ 0x00000058, 0x00000000 }, { 0x00000059, 0x00000000 },
{ 0x0000005A, 0x00000000 }, { 0x0000005B, 0x00000000 },
{ 0x00000196, 0x00000000 }, { 0x000001A1, 0x00FFFFFF },
{ 0x00000197, 0x00000000 }, { 0x000001A2, 0x00FFFFFF },
{ 0x00000198, 0x00000000 }, { 0x000001A3, 0x00FFFFFF },
{ 0x00000199, 0x00000000 }, { 0x000001A4, 0x00FFFFFF },
{ 0x00000050, 0x00000000 }, { 0x00000040, 0xFFFFFFFF },
{ 0x0000005C, 0x10010100 }, { 0x000001C8, 0x00000001 }
};
static unsigned nv3TablePRAMIN_8BPP[][2] =
{
{0x00000D04, 0x10110203},
{0x00000D08, 0x10110203},
{0x00000D0C, 0x10110203},
{0x00000D10, 0x10118203},
{0x00000D14, 0x10110203},
{0x00000D18, 0x10110203},
{0x00000D1C, 0x10419208}
static unsigned nv4TablePGRAPH_8BPP[][2] = { { 0x000001C4, 0xFFFFFFFF },
{ 0x000001C9, 0x00111111 },
{ 0x00000186, 0x00001010 },
{ 0x0000020C, 0x01010101 } };
static unsigned nv4TablePGRAPH_15BPP[][2] = { { 0x000001C4, 0xFFFFFFFF },
{ 0x000001C9, 0x00226222 },
{ 0x00000186, 0x00002071 },
{ 0x0000020C, 0x09090909 } };
static unsigned nv4TablePGRAPH_16BPP[][2] = { { 0x000001C4, 0xFFFFFFFF },
{ 0x000001C9, 0x00556555 },
{ 0x00000186, 0x000050C2 },
{ 0x0000020C, 0x0C0C0C0C } };
static unsigned nv4TablePGRAPH_32BPP[][2] = { { 0x000001C4, 0xFFFFFFFF },
{ 0x000001C9, 0x0077D777 },
{ 0x00000186, 0x000070E5 },
{ 0x0000020C, 0x07070707 } };
static unsigned nv4TablePRAMIN[][2] = {
{ 0x00000000, 0x80000010 }, { 0x00000001, 0x80011145 },
{ 0x00000002, 0x80000011 }, { 0x00000003, 0x80011146 },
{ 0x00000004, 0x80000012 }, { 0x00000005, 0x80011147 },
{ 0x00000006, 0x80000013 }, { 0x00000007, 0x80011148 },
{ 0x00000020, 0x80000000 }, { 0x00000021, 0x80011142 },
{ 0x00000022, 0x80000001 }, { 0x00000023, 0x80011143 },
{ 0x00000024, 0x80000002 }, { 0x00000025, 0x80011144 },
{ 0x00000500, 0x00003000 }, { 0x00000501, 0x02FFFFFF },
{ 0x00000502, 0x00000002 }, { 0x00000503, 0x00000002 },
{ 0x00000508, 0x01008043 }, { 0x0000050A, 0x00000000 },
{ 0x0000050B, 0x00000000 }, { 0x0000050C, 0x01008019 },
{ 0x0000050E, 0x00000000 }, { 0x0000050F, 0x00000000 },
{ 0x00000510, 0x01008018 }, { 0x00000512, 0x00000000 },
{ 0x00000513, 0x00000000 }, { 0x00000514, 0x0100A033 },
{ 0x00000516, 0x00000000 }, { 0x00000517, 0x00000000 },
{ 0x00000518, 0x0100805F }, { 0x0000051A, 0x00000000 },
{ 0x0000051B, 0x00000000 }, { 0x0000051C, 0x0100804B },
{ 0x0000051E, 0x00000000 }, { 0x0000051F, 0x00000000 },
{ 0x00000520, 0x0100A048 }, { 0x00000521, 0x00000D01 },
{ 0x00000522, 0x11401140 }, { 0x00000523, 0x00000000 }
};
static unsigned nv3TablePRAMIN_15BPP[][2] =
{
{0x00000D04, 0x10110200},
{0x00000D08, 0x10110200},
{0x00000D0C, 0x10110200},
{0x00000D10, 0x10118200},
{0x00000D14, 0x10110200},
{0x00000D18, 0x10110200},
{0x00000D1C, 0x10419208}
static unsigned nv4TablePRAMIN_8BPP[][2] = {
{ 0x00000509, 0x00000301 }, { 0x0000050D, 0x00000301 },
{ 0x00000511, 0x00000301 }, { 0x00000515, 0x00000301 },
{ 0x00000519, 0x00000301 }, { 0x0000051D, 0x00000301 }
};
static unsigned nv3TablePRAMIN_32BPP[][2] =
{
{0x00000D04, 0x10110201},
{0x00000D08, 0x10110201},
{0x00000D0C, 0x10110201},
{0x00000D10, 0x10118201},
{0x00000D14, 0x10110201},
{0x00000D18, 0x10110201},
{0x00000D1C, 0x10419208}
static unsigned nv4TablePRAMIN_15BPP[][2] = {
{ 0x00000509, 0x00000901 }, { 0x0000050D, 0x00000901 },
{ 0x00000511, 0x00000901 }, { 0x00000515, 0x00000901 },
{ 0x00000519, 0x00000901 }, { 0x0000051D, 0x00000901 }
};
static unsigned nv4TablePFIFO[][2] =
{
{0x00000140, 0x00000000},
{0x00000480, 0x00000000},
{0x00000494, 0x00000000},
{0x00000400, 0x00000000},
{0x00000414, 0x00000000},
{0x00000084, 0x03000100},
{0x00000085, 0x00000110},
{0x00000086, 0x00000112},
{0x00000143, 0x0000FFFF},
{0x00000496, 0x0000FFFF},
{0x00000050, 0x00000000},
{0x00000040, 0xFFFFFFFF},
{0x00000415, 0x00000001},
{0x00000480, 0x00000001},
{0x00000494, 0x00000001},
{0x00000495, 0x00000001},
{0x00000140, 0x00000001}
static unsigned nv4TablePRAMIN_16BPP[][2] = {
{ 0x00000509, 0x00000C01 }, { 0x0000050D, 0x00000C01 },
{ 0x00000511, 0x00000C01 }, { 0x00000515, 0x00000C01 },
{ 0x00000519, 0x00000C01 }, { 0x0000051D, 0x00000C01 }
};
static unsigned nv4TablePGRAPH[][2] =
{
{0x00000020, 0x1231C001},
{0x00000021, 0x72111101},
{0x00000022, 0x11D5F071},
{0x00000023, 0x10D4FF31},
{0x00000060, 0x00000000},
{0x00000068, 0x00000000},
{0x00000070, 0x00000000},
{0x00000078, 0x00000000},
{0x00000061, 0x00000000},
{0x00000069, 0x00000000},
{0x00000071, 0x00000000},
{0x00000079, 0x00000000},
{0x00000062, 0x00000000},
{0x0000006A, 0x00000000},
{0x00000072, 0x00000000},
{0x0000007A, 0x00000000},
{0x00000063, 0x00000000},
{0x0000006B, 0x00000000},
{0x00000073, 0x00000000},
{0x0000007B, 0x00000000},
{0x00000064, 0x00000000},
{0x0000006C, 0x00000000},
{0x00000074, 0x00000000},
{0x0000007C, 0x00000000},
{0x00000065, 0x00000000},
{0x0000006D, 0x00000000},
{0x00000075, 0x00000000},
{0x0000007D, 0x00000000},
{0x00000066, 0x00000000},
{0x0000006E, 0x00000000},
{0x00000076, 0x00000000},
{0x0000007E, 0x00000000},
{0x00000067, 0x00000000},
{0x0000006F, 0x00000000},
{0x00000077, 0x00000000},
{0x0000007F, 0x00000000},
{0x00000058, 0x00000000},
{0x00000059, 0x00000000},
{0x0000005A, 0x00000000},
{0x0000005B, 0x00000000},
{0x00000196, 0x00000000},
{0x000001A1, 0x00FFFFFF},
{0x00000197, 0x00000000},
{0x000001A2, 0x00FFFFFF},
{0x00000198, 0x00000000},
{0x000001A3, 0x00FFFFFF},
{0x00000199, 0x00000000},
{0x000001A4, 0x00FFFFFF},
{0x00000050, 0x00000000},
{0x00000040, 0xFFFFFFFF},
{0x0000005C, 0x10010100},
{0x000001C8, 0x00000001}
static unsigned nv4TablePRAMIN_32BPP[][2] = {
{ 0x00000509, 0x00000E01 }, { 0x0000050D, 0x00000E01 },
{ 0x00000511, 0x00000E01 }, { 0x00000515, 0x00000E01 },
{ 0x00000519, 0x00000E01 }, { 0x0000051D, 0x00000E01 }
};
static unsigned nv4TablePGRAPH_8BPP[][2] =
{
{0x000001C4, 0xFFFFFFFF},
{0x000001C9, 0x00111111},
{0x00000186, 0x00001010},
{0x0000020C, 0x01010101}
};
static unsigned nv4TablePGRAPH_15BPP[][2] =
{
{0x000001C4, 0xFFFFFFFF},
{0x000001C9, 0x00226222},
{0x00000186, 0x00002071},
{0x0000020C, 0x09090909}
};
static unsigned nv4TablePGRAPH_16BPP[][2] =
{
{0x000001C4, 0xFFFFFFFF},
{0x000001C9, 0x00556555},
{0x00000186, 0x000050C2},
{0x0000020C, 0x0C0C0C0C}
};
static unsigned nv4TablePGRAPH_32BPP[][2] =
{
{0x000001C4, 0xFFFFFFFF},
{0x000001C9, 0x0077D777},
{0x00000186, 0x000070E5},
{0x0000020C, 0x07070707}
};
static unsigned nv4TablePRAMIN[][2] =
{
{0x00000000, 0x80000010},
{0x00000001, 0x80011145},
{0x00000002, 0x80000011},
{0x00000003, 0x80011146},
{0x00000004, 0x80000012},
{0x00000005, 0x80011147},
{0x00000006, 0x80000013},
{0x00000007, 0x80011148},
{0x00000020, 0x80000000},
{0x00000021, 0x80011142},
{0x00000022, 0x80000001},
{0x00000023, 0x80011143},
{0x00000024, 0x80000002},
{0x00000025, 0x80011144},
{0x00000500, 0x00003000},
{0x00000501, 0x02FFFFFF},
{0x00000502, 0x00000002},
{0x00000503, 0x00000002},
{0x00000508, 0x01008043},
{0x0000050A, 0x00000000},
{0x0000050B, 0x00000000},
{0x0000050C, 0x01008019},
{0x0000050E, 0x00000000},
{0x0000050F, 0x00000000},
{0x00000510, 0x01008018},
{0x00000512, 0x00000000},
{0x00000513, 0x00000000},
{0x00000514, 0x0100A033},
{0x00000516, 0x00000000},
{0x00000517, 0x00000000},
{0x00000518, 0x0100805F},
{0x0000051A, 0x00000000},
{0x0000051B, 0x00000000},
{0x0000051C, 0x0100804B},
{0x0000051E, 0x00000000},
{0x0000051F, 0x00000000},
{0x00000520, 0x0100A048},
{0x00000521, 0x00000D01},
{0x00000522, 0x11401140},
{0x00000523, 0x00000000}
};
static unsigned nv4TablePRAMIN_8BPP[][2] =
{
{0x00000509, 0x00000301},
{0x0000050D, 0x00000301},
{0x00000511, 0x00000301},
{0x00000515, 0x00000301},
{0x00000519, 0x00000301},
{0x0000051D, 0x00000301}
};
static unsigned nv4TablePRAMIN_15BPP[][2] =
{
{0x00000509, 0x00000901},
{0x0000050D, 0x00000901},
{0x00000511, 0x00000901},
{0x00000515, 0x00000901},
{0x00000519, 0x00000901},
{0x0000051D, 0x00000901}
};
static unsigned nv4TablePRAMIN_16BPP[][2] =
{
{0x00000509, 0x00000C01},
{0x0000050D, 0x00000C01},
{0x00000511, 0x00000C01},
{0x00000515, 0x00000C01},
{0x00000519, 0x00000C01},
{0x0000051D, 0x00000C01}
};
static unsigned nv4TablePRAMIN_32BPP[][2] =
{
{0x00000509, 0x00000E01},
{0x0000050D, 0x00000E01},
{0x00000511, 0x00000E01},
{0x00000515, 0x00000E01},
{0x00000519, 0x00000E01},
{0x0000051D, 0x00000E01}
};

View File

@ -1,7 +1,7 @@
/*
* ______ ____ ______ _____ ______
* ______ ____ ______ _____ ______
* | ____| | _ \| ____| / / _ \| ____|
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | __| '__/ _ \/ _ \ _ <| __| / /| _ | __|
* | | | | | __/ __/ |_) | |____ / / | | | | |
* |_| |_| \___|\___|____/|______/_/ |_| |_|_|
@ -14,50 +14,42 @@
* See freebe.txt for copyright information.
*/
// #define NO_HWPTR
#include <pc.h>
#include "vbeaf.h"
/* chipset information */
#define PVGA1 1
#define WD90C 2
#define PVGA1 1
#define WD90C 2
int paradise_type = 0;
/* driver function prototypes */
void CirrusSetBank32();
void CirrusSetBank32End();
void CirrusSetBank32( );
void CirrusSetBank32End( );
void CirrusSetBank(AF_DRIVER *af, long bank);
void ParadiseSetBank32();
void ParadiseSetBank32End();
void ParadiseSetBank32( );
void ParadiseSetBank32End( );
void ParadiseSetBank(AF_DRIVER *af, long bank);
int ExtStub();
int ExtStub( );
long GetVideoModeInfo(AF_DRIVER *af, short mode, AF_MODE_INFO *modeInfo);
long SetVideoMode(AF_DRIVER *af, short mode, long virtualX, long virtualY, long *bytesPerLine, int numBuffers, AF_CRTCInfo *crtc);
long SetVideoMode(AF_DRIVER *af, short mode, long virtualX, long virtualY,
long *bytesPerLine, int numBuffers, AF_CRTCInfo *crtc);
void RestoreTextMode(AF_DRIVER *af);
long GetClosestPixelClock(AF_DRIVER *af, short mode, unsigned long pixelClock);
void SaveRestoreState(AF_DRIVER *af, int subfunc, void *saveBuf);
void SetDisplayStart(AF_DRIVER *af, long x, long y, long waitVRT);
void SetActiveBuffer(AF_DRIVER *af, long index);
void SetVisibleBuffer(AF_DRIVER *af, long index, long waitVRT);
int GetDisplayStartStatus(AF_DRIVER *af);
void SetPaletteData(AF_DRIVER *af, AF_PALETTE *pal, long num, long index, long waitVRT);
int GetDisplayStartStatus(AF_DRIVER *af);
void SetPaletteData(AF_DRIVER *af, AF_PALETTE *pal, long num, long index,
long waitVRT);
/* list which ports we are going to access (only needed under Linux) */
unsigned short ports_table[] = { 0xFFFF };
/* internal driver state variables */
int af_bpp;
int af_width;
@ -68,386 +60,329 @@ int af_scroll_x;
int af_scroll_y;
int af_bank;
/* FreeBE/AF extension allowing farptr access to video memory */
FAF_HWPTR_DATA hwptr;
/* list of available video modes */
typedef struct VIDEO_MODE
{
int w, h;
int bpp;
int num;
typedef struct VIDEO_MODE {
int w, h;
int bpp;
int num;
} VIDEO_MODE;
VIDEO_MODE mode_list[] = { { 640, 400, 8, 0x5E },
{ 640, 480, 8, 0x5F },
{ 800, 600, 8, 0x5C } };
VIDEO_MODE mode_list[] =
{
{ 640, 400, 8, 0x5E },
{ 640, 480, 8, 0x5F },
{ 800, 600, 8, 0x5C }
};
#define NUM_MODES (int)(sizeof(mode_list)/sizeof(VIDEO_MODE))
short available_modes[NUM_MODES+1] = { 1, 2, 3, -1 };
#define NUM_MODES (int)(sizeof(mode_list) / sizeof(VIDEO_MODE))
short available_modes[NUM_MODES + 1] = { 1, 2, 3, -1 };
/* detect:
* Detects the presence of a Paradise card.
*/
char *detect(unsigned long *vidmem)
{
char *name = NULL;
RM_REGS r;
int old, old2;
char *detect(unsigned long *vidmem) {
char *name = NULL;
RM_REGS r;
int old, old2;
old = read_vga_register(0x3CE, 0xF);
write_vga_register(0x3CE, 0xF, old | 0x17); /* lock extended registers */
old = read_vga_register(0x3CE, 0xF);
write_vga_register(0x3CE, 0xF, old | 0x17); /* lock extended registers */
if (test_vga_register(0x3CE, 0x9, 0x7F)) { /* not a Paradise card! */
write_vga_register(0x3CE, 0xF, old);
return NULL;
}
if (test_vga_register(0x3CE, 0x9, 0x7F)) { /* not a Paradise card! */
write_vga_register(0x3CE, 0xF, old);
return NULL;
}
alter_vga_register(0x3CE, 0xF, 0x17, 5); /* unlock extended regs */
alter_vga_register(0x3CE, 0xF, 0x17, 5); /* unlock extended regs */
if (!test_vga_register(0x3CE, 0x9, 0x7F)) { /* not a Paradise card! */
write_vga_register(0x3CE, 0xF, old);
return NULL;
}
if (!test_vga_register(0x3CE, 0x9, 0x7F)) { /* not a Paradise card! */
write_vga_register(0x3CE, 0xF, old);
return NULL;
}
old2 = read_vga_register(0x3D4, 0x29);
alter_vga_register(0x3D4, 0x29, 0x8F, 0x85);
old2 = read_vga_register(0x3D4, 0x29);
alter_vga_register(0x3D4, 0x29, 0x8F, 0x85);
if (!test_vga_register(0x3D4, 0x2B, 0xFF)) {
paradise_type = PVGA1;
name = "PVGA1";
goto end;
}
if (!test_vga_register(0x3D4, 0x2B, 0xFF)) {
paradise_type = PVGA1;
name = "PVGA1";
goto end;
}
write_vga_register(0x3C4, 0x06, 0x48);
write_vga_register(0x3C4, 0x06, 0x48);
if (!test_vga_register(0x3C4, 0x7, 0xF0)) {
paradise_type = PVGA1;
name = "WD90C0x";
goto end;
}
if (!test_vga_register(0x3C4, 0x7, 0xF0)) {
paradise_type = PVGA1;
name = "WD90C0x";
goto end;
}
if (!test_vga_register(0x3C4, 0x10, 0xFF)) {
paradise_type = PVGA1;
name = "WD90C2x";
write_vga_register(0x3D4, 0x34, 0xA6);
if (read_vga_register(0x3D4, 0x32) & 0x20)
write_vga_register(0x3D4, 0x34, 0);
goto end;
}
if (!test_vga_register(0x3C4, 0x10, 0xFF)) {
paradise_type = PVGA1;
name = "WD90C2x";
write_vga_register(0x3D4, 0x34, 0xA6);
if (read_vga_register(0x3D4, 0x32) & 0x20)
write_vga_register(0x3D4, 0x34, 0);
goto end;
}
paradise_type = WD90C;
name = "WD90C1x or 24+";
paradise_type = WD90C;
name = "WD90C1x or 24+";
end:
end:
write_vga_register(0x3D4, 0x29, old2);
write_vga_register(0x3CE, 0xF, old);
write_vga_register(0x3D4, 0x29, old2);
write_vga_register(0x3CE, 0xF, old);
r.x.ax = 0x007F;
r.h.bh = 0x02;
rm_int(0x10, &r);
*vidmem = r.h.ch * 64;
r.x.ax = 0x007F;
r.h.bh = 0x02;
rm_int(0x10, &r);
*vidmem = r.h.ch * 64;
return name;
return name;
}
/* SetupDriver:
* Fills in our driver header block.
*/
int SetupDriver(AF_DRIVER *af)
{
char *name;
int i;
int SetupDriver(AF_DRIVER *af) {
char *name;
int i;
name = detect(&af->TotalMemory);
name = detect(&af->TotalMemory);
if (!name)
return 1;
if (!name) return 1;
i = 0;
while (af->OemVendorName[i])
i++;
i = 0;
while (af->OemVendorName[i]) i++;
af->OemVendorName[i++] = ',';
af->OemVendorName[i++] = ' ';
af->OemVendorName[i++] = ',';
af->OemVendorName[i++] = ' ';
while (*name)
af->OemVendorName[i++] = *(name++);
while (*name) af->OemVendorName[i++] = *(name++);
af->OemVendorName[i] = 0;
af->OemVendorName[i] = 0;
af->AvailableModes = available_modes;
af->AvailableModes = available_modes;
af->Attributes = (afHaveMultiBuffer |
afHaveVirtualScroll |
afHaveBankedBuffer);
af->Attributes =
(afHaveMultiBuffer | afHaveVirtualScroll | afHaveBankedBuffer);
af->BankSize = 64;
af->BankedBasePtr = 0xA0000;
af->BankSize = 64;
af->BankedBasePtr = 0xA0000;
af->IOPortsTable = ports_table;
af->IOPortsTable = ports_table;
if (paradise_type == PVGA1) {
af->SetBank32 = CirrusSetBank32;
af->SetBank32Len = (long)CirrusSetBank32End - (long)CirrusSetBank32;
af->SetBank = CirrusSetBank;
}
else {
af->SetBank32 = ParadiseSetBank32;
af->SetBank32Len = (long)ParadiseSetBank32End - (long)ParadiseSetBank32;
af->SetBank = ParadiseSetBank;
}
if (paradise_type == PVGA1) {
af->SetBank32 = CirrusSetBank32;
af->SetBank32Len = (long)CirrusSetBank32End - (long)CirrusSetBank32;
af->SetBank = CirrusSetBank;
} else {
af->SetBank32 = ParadiseSetBank32;
af->SetBank32Len = (long)ParadiseSetBank32End - (long)ParadiseSetBank32;
af->SetBank = ParadiseSetBank;
}
af->SupplementalExt = ExtStub;
af->GetVideoModeInfo = GetVideoModeInfo;
af->SetVideoMode = SetVideoMode;
af->RestoreTextMode = RestoreTextMode;
af->GetClosestPixelClock = GetClosestPixelClock;
af->SaveRestoreState = SaveRestoreState;
af->SetDisplayStart = SetDisplayStart;
af->SetActiveBuffer = SetActiveBuffer;
af->SetVisibleBuffer = SetVisibleBuffer;
af->GetDisplayStartStatus = GetDisplayStartStatus;
af->SetPaletteData = SetPaletteData;
af->SupplementalExt = ExtStub;
af->GetVideoModeInfo = GetVideoModeInfo;
af->SetVideoMode = SetVideoMode;
af->RestoreTextMode = RestoreTextMode;
af->GetClosestPixelClock = GetClosestPixelClock;
af->SaveRestoreState = SaveRestoreState;
af->SetDisplayStart = SetDisplayStart;
af->SetActiveBuffer = SetActiveBuffer;
af->SetVisibleBuffer = SetVisibleBuffer;
af->GetDisplayStartStatus = GetDisplayStartStatus;
af->SetPaletteData = SetPaletteData;
return 0;
return 0;
}
/* InitDriver:
* The second thing to be called during the init process, after the
* The second thing to be called during the init process, after the
* application has mapped all the memory and I/O resources we need.
*/
int InitDriver(AF_DRIVER *af)
{
hwptr_init(hwptr.IOMemMaps[0], af->IOMemMaps[0]);
hwptr_init(hwptr.IOMemMaps[1], af->IOMemMaps[1]);
hwptr_init(hwptr.IOMemMaps[2], af->IOMemMaps[2]);
hwptr_init(hwptr.IOMemMaps[3], af->IOMemMaps[3]);
hwptr_init(hwptr.BankedMem, af->BankedMem);
hwptr_init(hwptr.LinearMem, af->LinearMem);
int InitDriver(AF_DRIVER *af) {
hwptr_init(hwptr.IOMemMaps[0], af->IOMemMaps[0]);
hwptr_init(hwptr.IOMemMaps[1], af->IOMemMaps[1]);
hwptr_init(hwptr.IOMemMaps[2], af->IOMemMaps[2]);
hwptr_init(hwptr.IOMemMaps[3], af->IOMemMaps[3]);
hwptr_init(hwptr.BankedMem, af->BankedMem);
hwptr_init(hwptr.LinearMem, af->LinearMem);
return 0;
return 0;
}
/* FreeBEX:
* Returns an interface structure for the requested FreeBE/AF extension.
*/
void *FreeBEX(AF_DRIVER *af, unsigned long id)
{
switch (id) {
void *FreeBEX(AF_DRIVER *af, unsigned long id) {
switch (id) {
#ifndef NO_HWPTR
#ifndef NO_HWPTR
case FAFEXT_HWPTR:
/* allow farptr access to video memory */
return &hwptr;
case FAFEXT_HWPTR:
/* allow farptr access to video memory */
return &hwptr;
#endif
#endif
default:
return NULL;
}
default: return NULL;
}
}
/* ExtStub:
* Vendor-specific extension hook: we don't provide any.
*/
int ExtStub()
{
return 0;
int ExtStub( ) {
return 0;
}
/* GetVideoModeInfo:
* Retrieves information about this video mode, returning zero on success
* or -1 if the mode is invalid.
*/
long GetVideoModeInfo(AF_DRIVER *af, short mode, AF_MODE_INFO *modeInfo)
{
VIDEO_MODE *info;
int i;
long GetVideoModeInfo(AF_DRIVER *af, short mode, AF_MODE_INFO *modeInfo) {
VIDEO_MODE *info;
int i;
if ((mode <= 0) || (mode > NUM_MODES))
return -1;
if ((mode <= 0) || (mode > NUM_MODES)) return -1;
info = &mode_list[mode-1];
info = &mode_list[mode - 1];
for (i=0; i<(int)sizeof(AF_MODE_INFO); i++)
((char *)modeInfo)[i] = 0;
for (i = 0; i < (int)sizeof(AF_MODE_INFO); i++) ((char *)modeInfo)[i] = 0;
modeInfo->Attributes = (afHaveMultiBuffer |
afHaveVirtualScroll |
afHaveBankedBuffer);
modeInfo->Attributes =
(afHaveMultiBuffer | afHaveVirtualScroll | afHaveBankedBuffer);
modeInfo->XResolution = info->w;
modeInfo->YResolution = info->h;
modeInfo->BitsPerPixel = info->bpp;
modeInfo->XResolution = info->w;
modeInfo->YResolution = info->h;
modeInfo->BitsPerPixel = info->bpp;
modeInfo->MaxBuffers = (af->TotalMemory*1024) /
(info->w*info->h*BYTES_PER_PIXEL(info->bpp));
modeInfo->MaxBuffers = (af->TotalMemory * 1024) /
(info->w * info->h * BYTES_PER_PIXEL(info->bpp));
if (info->w > 1024) {
modeInfo->MaxBytesPerScanLine = 2048*BYTES_PER_PIXEL(info->bpp);
modeInfo->MaxScanLineWidth = 2048;
}
else {
modeInfo->MaxBytesPerScanLine = 1024*BYTES_PER_PIXEL(info->bpp);
modeInfo->MaxScanLineWidth = 1024;
}
if (info->w > 1024) {
modeInfo->MaxBytesPerScanLine = 2048 * BYTES_PER_PIXEL(info->bpp);
modeInfo->MaxScanLineWidth = 2048;
} else {
modeInfo->MaxBytesPerScanLine = 1024 * BYTES_PER_PIXEL(info->bpp);
modeInfo->MaxScanLineWidth = 1024;
}
modeInfo->BytesPerScanLine = info->w*BYTES_PER_PIXEL(info->bpp);
modeInfo->BnkMaxBuffers = modeInfo->MaxBuffers;
modeInfo->BytesPerScanLine = info->w * BYTES_PER_PIXEL(info->bpp);
modeInfo->BnkMaxBuffers = modeInfo->MaxBuffers;
modeInfo->MaxPixelClock = 135000000;
modeInfo->MaxPixelClock = 135000000;
return 0;
return 0;
}
/* SetVideoMode:
* Sets the specified video mode, returning zero on success.
*/
long SetVideoMode(AF_DRIVER *af, short mode, long virtualX, long virtualY, long *bytesPerLine, int numBuffers, AF_CRTCInfo *crtc)
{
long available_vram;
long used_vram;
int width;
VIDEO_MODE *info;
RM_REGS r;
long SetVideoMode(AF_DRIVER *af, short mode, long virtualX, long virtualY,
long *bytesPerLine, int numBuffers, AF_CRTCInfo *crtc) {
long available_vram;
long used_vram;
int width;
VIDEO_MODE *info;
RM_REGS r;
/* reject anything with hardware stereo, linear framebuffer, or noclear */
if (mode & 0xC400)
return -1;
/* reject anything with hardware stereo, linear framebuffer, or noclear */
if (mode & 0xC400) return -1;
mode &= 0x3FF;
mode &= 0x3FF;
if ((mode <= 0) || (mode > NUM_MODES))
return -1;
if ((mode <= 0) || (mode > NUM_MODES)) return -1;
info = &mode_list[mode-1];
info = &mode_list[mode - 1];
/* call BIOS to set the mode */
r.x.ax = info->num;
rm_int(0x10, &r);
/* call BIOS to set the mode */
r.x.ax = info->num;
rm_int(0x10, &r);
/* adjust the virtual width for widescreen modes */
if (virtualX > info->w) {
if (virtualX > 1024)
return -1;
/* adjust the virtual width for widescreen modes */
if (virtualX > info->w) {
if (virtualX > 1024) return -1;
*bytesPerLine = ((virtualX*BYTES_PER_PIXEL(info->bpp))+15)&0xFFF0;
*bytesPerLine = ((virtualX * BYTES_PER_PIXEL(info->bpp)) + 15) & 0xFFF0;
width = read_vga_register(0x3D4, 0x13);
write_vga_register(0x3D4, 0x13, (width * (*bytesPerLine)) / (info->w*BYTES_PER_PIXEL(info->bpp)));
}
else
*bytesPerLine = info->w*BYTES_PER_PIXEL(info->bpp);
width = read_vga_register(0x3D4, 0x13);
write_vga_register(0x3D4, 0x13,
(width * (*bytesPerLine)) /
(info->w * BYTES_PER_PIXEL(info->bpp)));
} else
*bytesPerLine = info->w * BYTES_PER_PIXEL(info->bpp);
/* set up some hardware registers */
if (paradise_type != PVGA1) {
write_vga_register(0x3C4, 0x06, 0x48);
/* set up some hardware registers */
if (paradise_type != PVGA1) {
write_vga_register(0x3C4, 0x06, 0x48);
alter_vga_register(0x3C4, 0x11, 0x80, 0x80);
alter_vga_register(0x3CE, 0x0B, 0x80, 0x80);
alter_vga_register(0x3C4, 0x11, 0x80, 0x80);
alter_vga_register(0x3CE, 0x0B, 0x80, 0x80);
write_vga_register(0x3C4, 0x06, 0x00);
}
write_vga_register(0x3C4, 0x06, 0x00);
}
/* store info about the current mode */
af_bpp = info->bpp;
af_width = *bytesPerLine;
af_height = MAX(info->h, virtualY);
af_visible_page = 0;
af_active_page = 0;
af_scroll_x = 0;
af_scroll_y = 0;
af_bank = -1;
/* store info about the current mode */
af_bpp = info->bpp;
af_width = *bytesPerLine;
af_height = MAX(info->h, virtualY);
af_visible_page = 0;
af_active_page = 0;
af_scroll_x = 0;
af_scroll_y = 0;
af_bank = -1;
af->BufferEndX = af_width/BYTES_PER_PIXEL(af_bpp)-1;
af->BufferEndY = af_height-1;
af->OriginOffset = 0;
af->BufferEndX = af_width / BYTES_PER_PIXEL(af_bpp) - 1;
af->BufferEndY = af_height - 1;
af->OriginOffset = 0;
used_vram = af_width * af_height * numBuffers;
available_vram = af->TotalMemory*1024 ;
used_vram = af_width * af_height * numBuffers;
available_vram = af->TotalMemory * 1024;
if (used_vram > available_vram)
return -1;
if (used_vram > available_vram) return -1;
if (available_vram-used_vram >= af_width) {
af->OffscreenOffset = used_vram;
af->OffscreenStartY = af_height*numBuffers;
af->OffscreenEndY = available_vram/af_width-1;
}
else {
af->OffscreenOffset = 0;
af->OffscreenStartY = 0;
af->OffscreenEndY = 0;
}
if (available_vram - used_vram >= af_width) {
af->OffscreenOffset = used_vram;
af->OffscreenStartY = af_height * numBuffers;
af->OffscreenEndY = available_vram / af_width - 1;
} else {
af->OffscreenOffset = 0;
af->OffscreenStartY = 0;
af->OffscreenEndY = 0;
}
return 0;
return 0;
}
/* RestoreTextMode:
* Returns to text mode, shutting down the accelerator hardware.
*/
void RestoreTextMode(AF_DRIVER *af)
{
RM_REGS r;
void RestoreTextMode(AF_DRIVER *af) {
RM_REGS r;
r.x.ax = 3;
rm_int(0x10, &r);
r.x.ax = 3;
rm_int(0x10, &r);
}
/* GetClosestPixelClock:
* I don't have a clue what this should return: it is used for the
* refresh rate control.
*/
long GetClosestPixelClock(AF_DRIVER *af, short mode, unsigned long pixelClock)
{
/* ??? */
return 135000000;
long GetClosestPixelClock(AF_DRIVER *af, short mode, unsigned long pixelClock) {
/* ??? */
return 135000000;
}
/* SaveRestoreState:
* Stores the current driver status: not presently implemented.
*/
void SaveRestoreState(AF_DRIVER *af, int subfunc, void *saveBuf)
{
/* not implemented (not used by Allegro) */
void SaveRestoreState(AF_DRIVER *af, int subfunc, void *saveBuf) {
/* not implemented (not used by Allegro) */
}
/* SetDisplayStart:
* Hardware scrolling function. The waitVRT value may be one of:
*
@ -455,111 +390,92 @@ void SaveRestoreState(AF_DRIVER *af, int subfunc, void *saveBuf)
* 0 = set values and return immediately
* 1 = set values and wait for retrace
*/
void SetDisplayStart(AF_DRIVER *af, long x, long y, long waitVRT)
{
if (waitVRT >= 0) {
long a = (x * BYTES_PER_PIXEL(af_bpp)) + ((y + af_visible_page*af_height) * af_width);
void SetDisplayStart(AF_DRIVER *af, long x, long y, long waitVRT) {
if (waitVRT >= 0) {
long a = (x * BYTES_PER_PIXEL(af_bpp)) +
((y + af_visible_page * af_height) * af_width);
asm volatile ("cli");
asm volatile("cli");
if (waitVRT) {
do {
} while (inportb(0x3DA) & 1);
}
if (waitVRT) {
do { } while (inportb(0x3DA) & 1); }
/* write high bits to Paradise register 3CE indx 0xD, bits 3-4 */
alter_vga_register(0x3CE, 0x0D, 0x18, a>>15);
/* write high bits to Paradise register 3CE indx 0xD, bits 3-4 */
alter_vga_register(0x3CE, 0x0D, 0x18, a >> 15);
/* write to normal VGA address registers */
write_vga_register(0x3D4, 0x0D, (a>>2) & 0xFF);
write_vga_register(0x3D4, 0x0C, (a>>10) & 0xFF);
/* write to normal VGA address registers */
write_vga_register(0x3D4, 0x0D, (a >> 2) & 0xFF);
write_vga_register(0x3D4, 0x0C, (a >> 10) & 0xFF);
asm volatile ("sti");
asm volatile("sti");
if (waitVRT) {
do {
} while (!(inportb(0x3DA) & 8));
}
}
if (waitVRT) {
do { } while (!(inportb(0x3DA) & 8)); }
}
af_scroll_x = x;
af_scroll_y = y;
af_scroll_x = x;
af_scroll_y = y;
}
/* SetActiveBuffer:
* Sets which buffer is being drawn onto, for use in multi buffering
* systems (not used by Allegro).
*/
void SetActiveBuffer(AF_DRIVER *af, long index)
{
if (af->OffscreenOffset) {
af->OffscreenStartY += af_active_page*af_height;
af->OffscreenEndY += af_active_page*af_height;
}
void SetActiveBuffer(AF_DRIVER *af, long index) {
if (af->OffscreenOffset) {
af->OffscreenStartY += af_active_page * af_height;
af->OffscreenEndY += af_active_page * af_height;
}
af_active_page = index;
af_active_page = index;
af->OriginOffset = af_width*af_height*index;
af->OriginOffset = af_width * af_height * index;
if (af->OffscreenOffset) {
af->OffscreenStartY -= af_active_page*af_height;
af->OffscreenEndY -= af_active_page*af_height;
}
if (af->OffscreenOffset) {
af->OffscreenStartY -= af_active_page * af_height;
af->OffscreenEndY -= af_active_page * af_height;
}
}
/* SetVisibleBuffer:
* Sets which buffer is displayed on the screen, for use in multi buffering
* systems (not used by Allegro).
*/
void SetVisibleBuffer(AF_DRIVER *af, long index, long waitVRT)
{
af_visible_page = index;
void SetVisibleBuffer(AF_DRIVER *af, long index, long waitVRT) {
af_visible_page = index;
SetDisplayStart(af, af_scroll_x, af_scroll_y, waitVRT);
SetDisplayStart(af, af_scroll_x, af_scroll_y, waitVRT);
}
/* GetDisplayStartStatus:
* Status poll for triple buffering. Not possible on the majority of
* present cards: this function is just a placeholder.
*/
int GetDisplayStartStatus(AF_DRIVER *af)
{
return 1;
int GetDisplayStartStatus(AF_DRIVER *af) {
return 1;
}
/* SetPaletteData:
* Palette setting routine.
*/
void SetPaletteData(AF_DRIVER *af, AF_PALETTE *pal, long num, long index, long waitVRT)
{
int i;
void SetPaletteData(AF_DRIVER *af, AF_PALETTE *pal, long num, long index,
long waitVRT) {
int i;
if (waitVRT) {
do {
} while (inportb(0x3DA) & 8);
if (waitVRT) {
do {
} while (inportb(0x3DA) & 8);
do {
} while (!(inportb(0x3DA) & 8));
}
do { } while (!(inportb(0x3DA) & 8)); }
for (i=0; i<num; i++) {
outportb(0x3C8, index+i);
outportb(0x3C9, pal[i].red/4);
outportb(0x3C9, pal[i].green/4);
outportb(0x3C9, pal[i].blue/4);
}
for (i = 0; i < num; i++) {
outportb(0x3C8, index + i);
outportb(0x3C9, pal[i].red / 4);
outportb(0x3C9, pal[i].green / 4);
outportb(0x3C9, pal[i].blue / 4);
}
}
/* CirrusSetBank32:
* Relocatable bank switch function, called with a bank number in %edx.
*/
@ -599,13 +515,9 @@ asm ("
*/
void CirrusSetBank(AF_DRIVER *af, long bank)
{
asm (
" call _CirrusSetBank32 "
:
: "d" (bank)
);
asm(" call _CirrusSetBank32 " : : "d"(bank));
af_bank = bank;
af_bank = bank;
}
@ -660,14 +572,7 @@ asm ("
*/
void ParadiseSetBank(AF_DRIVER *af, long bank)
{
asm (
" call _ParadiseSetBank32 "
:
: "d" (bank)
);
asm(" call _ParadiseSetBank32 " : : "d"(bank));
af_bank = bank;
af_bank = bank;
}

View File

@ -1,7 +1,7 @@
/*
* ______ ____ ______ _____ ______
* ______ ____ ______ _____ ______
* | ____| | _ \| ____| / / _ \| ____|
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | __| '__/ _ \/ _ \ _ <| __| / /| _ | __|
* | | | | | __/ __/ |_) | |____ / / | | | | |
* |_| |_| \___|\___|____/|______/_/ |_| |_|_|
@ -12,34 +12,29 @@
* See freebe.txt for copyright information.
*/
#include "vbeaf.h"
AF_DRIVER drvhdr =
{
"VBEAF.DRV", /* Signature */
0x200, /* Version */
0, /* DriverRev */
"FreeBE/AF Paradise driver " FREEBE_VERSION, /* OemVendorName */
"This driver is free software", /* OemCopyright */
NULL, /* AvailableModes */
0, /* TotalMemory */
0, /* Attributes */
0, /* BankSize */
0, /* BankedBasePtr */
0, /* LinearSize */
0, /* LinearBasePtr */
0, /* LinearGranularity */
NULL, /* IOPortsTable */
{ NULL, NULL, NULL, NULL }, /* IOMemoryBase */
{ 0, 0, 0, 0 }, /* IOMemoryLen */
0, /* LinearStridePad */
-1, /* PCIVendorID */
-1, /* PCIDeviceID */
-1, /* PCISubSysVendorID */
-1, /* PCISubSysID */
0 /* Checksum */
AF_DRIVER drvhdr = {
"VBEAF.DRV", /* Signature */
0x200, /* Version */
0, /* DriverRev */
"FreeBE/AF Paradise driver " FREEBE_VERSION, /* OemVendorName */
"This driver is free software", /* OemCopyright */
NULL, /* AvailableModes */
0, /* TotalMemory */
0, /* Attributes */
0, /* BankSize */
0, /* BankedBasePtr */
0, /* LinearSize */
0, /* LinearBasePtr */
0, /* LinearGranularity */
NULL, /* IOPortsTable */
{ NULL, NULL, NULL, NULL }, /* IOMemoryBase */
{ 0, 0, 0, 0 }, /* IOMemoryLen */
0, /* LinearStridePad */
-1, /* PCIVendorID */
-1, /* PCIDeviceID */
-1, /* PCISubSysVendorID */
-1, /* PCISubSysID */
0 /* Checksum */
};

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
/*
* ______ ____ ______ _____ ______
* ______ ____ ______ _____ ______
* | ____| | _ \| ____| / / _ \| ____|
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | __| '__/ _ \/ _ \ _ <| __| / /| _ | __|
* | | | | | __/ __/ |_) | |____ / / | | | | |
* |_| |_| \___|\___|____/|______/_/ |_| |_|_|
@ -12,34 +12,29 @@
* See freebe.txt for copyright information.
*/
#include "vbeaf.h"
AF_DRIVER drvhdr =
{
"VBEAF.DRV", /* Signature */
0x200, /* Version */
0, /* DriverRev */
"FreeBE/AF S3 driver " FREEBE_VERSION, /* OemVendorName */
"This driver is free software", /* OemCopyright */
NULL, /* AvailableModes */
0, /* TotalMemory */
0, /* Attributes */
0, /* BankSize */
0, /* BankedBasePtr */
0, /* LinearSize */
0, /* LinearBasePtr */
0, /* LinearGranularity */
NULL, /* IOPortsTable */
{ NULL, NULL, NULL, NULL }, /* IOMemoryBase */
{ 0, 0, 0, 0 }, /* IOMemoryLen */
0, /* LinearStridePad */
-1, /* PCIVendorID */
-1, /* PCIDeviceID */
-1, /* PCISubSysVendorID */
-1, /* PCISubSysID */
0 /* Checksum */
AF_DRIVER drvhdr = {
"VBEAF.DRV", /* Signature */
0x200, /* Version */
0, /* DriverRev */
"FreeBE/AF S3 driver " FREEBE_VERSION, /* OemVendorName */
"This driver is free software", /* OemCopyright */
NULL, /* AvailableModes */
0, /* TotalMemory */
0, /* Attributes */
0, /* BankSize */
0, /* BankedBasePtr */
0, /* LinearSize */
0, /* LinearBasePtr */
0, /* LinearGranularity */
NULL, /* IOPortsTable */
{ NULL, NULL, NULL, NULL }, /* IOMemoryBase */
{ 0, 0, 0, 0 }, /* IOMemoryLen */
0, /* LinearStridePad */
-1, /* PCIVendorID */
-1, /* PCIDeviceID */
-1, /* PCISubSysVendorID */
-1, /* PCISubSysID */
0 /* Checksum */
};

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
/*
* ______ ____ ______ _____ ______
* ______ ____ ______ _____ ______
* | ____| | _ \| ____| / / _ \| ____|
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | __| '__/ _ \/ _ \ _ <| __| / /| _ | __|
* | | | | | __/ __/ |_) | |____ / / | | | | |
* |_| |_| \___|\___|____/|______/_/ |_| |_|_|
@ -12,34 +12,29 @@
* See freebe.txt for copyright information.
*/
#include "vbeaf.h"
AF_DRIVER drvhdr =
{
"VBEAF.DRV", /* Signature */
0x200, /* Version */
0, /* DriverRev */
"FreeBE/AF stub driver implementation " FREEBE_VERSION, /* OemVendorName */
"This driver is free software", /* OemCopyright */
NULL, /* AvailableModes */
0, /* TotalMemory */
0, /* Attributes */
0, /* BankSize */
0, /* BankedBasePtr */
0, /* LinearSize */
0, /* LinearBasePtr */
0, /* LinearGranularity */
NULL, /* IOPortsTable */
{ NULL, NULL, NULL, NULL }, /* IOMemoryBase */
{ 0, 0, 0, 0 }, /* IOMemoryLen */
0, /* LinearStridePad */
-1, /* PCIVendorID */
-1, /* PCIDeviceID */
-1, /* PCISubSysVendorID */
-1, /* PCISubSysID */
0 /* Checksum */
AF_DRIVER drvhdr = {
"VBEAF.DRV", /* Signature */
0x200, /* Version */
0, /* DriverRev */
"FreeBE/AF stub driver implementation " FREEBE_VERSION, /* OemVendorName */
"This driver is free software", /* OemCopyright */
NULL, /* AvailableModes */
0, /* TotalMemory */
0, /* Attributes */
0, /* BankSize */
0, /* BankedBasePtr */
0, /* LinearSize */
0, /* LinearBasePtr */
0, /* LinearGranularity */
NULL, /* IOPortsTable */
{ NULL, NULL, NULL, NULL }, /* IOMemoryBase */
{ 0, 0, 0, 0 }, /* IOMemoryLen */
0, /* LinearStridePad */
-1, /* PCIVendorID */
-1, /* PCIDeviceID */
-1, /* PCISubSysVendorID */
-1, /* PCISubSysID */
0 /* Checksum */
};

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
/*
* ______ ____ ______ _____ ______
* ______ ____ ______ _____ ______
* | ____| | _ \| ____| / / _ \| ____|
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | __| '__/ _ \/ _ \ _ <| __| / /| _ | __|
* | | | | | __/ __/ |_) | |____ / / | | | | |
* |_| |_| \___|\___|____/|______/_/ |_| |_|_|
@ -12,34 +12,29 @@
* See freebe.txt for copyright information.
*/
#include "vbeaf.h"
AF_DRIVER drvhdr =
{
"VBEAF.DRV", /* Signature */
0x200, /* Version */
0x100, /* DriverRev */
"FreeBE/AF TGUI9440 driver " FREEBE_VERSION, /* OemVendorName */
"This driver is free software", /* OemCopyright */
NULL, /* AvailableModes */
0, /* TotalMemory */
0, /* Attributes */
0, /* BankSize */
0, /* BankedBasePtr */
0, /* LinearSize */
0, /* LinearBasePtr */
0, /* LinearGranularity */
NULL, /* IOPortsTable */
{ NULL, NULL, NULL, NULL }, /* IOMemoryBase */
{ 0, 0, 0, 0 }, /* IOMemoryLen */
0, /* LinearStridePad */
0x1023, /* PCIVendorID */
0x9440, /* PCIDeviceID */
0xFFFF, /* PCISubSysVendorID */
0xFFFF, /* PCISubSysID */
0 /* Checksum */
AF_DRIVER drvhdr = {
"VBEAF.DRV", /* Signature */
0x200, /* Version */
0x100, /* DriverRev */
"FreeBE/AF TGUI9440 driver " FREEBE_VERSION, /* OemVendorName */
"This driver is free software", /* OemCopyright */
NULL, /* AvailableModes */
0, /* TotalMemory */
0, /* Attributes */
0, /* BankSize */
0, /* BankedBasePtr */
0, /* LinearSize */
0, /* LinearBasePtr */
0, /* LinearGranularity */
NULL, /* IOPortsTable */
{ NULL, NULL, NULL, NULL }, /* IOMemoryBase */
{ 0, 0, 0, 0 }, /* IOMemoryLen */
0, /* LinearStridePad */
0x1023, /* PCIVendorID */
0x9440, /* PCIDeviceID */
0xFFFF, /* PCISubSysVendorID */
0xFFFF, /* PCISubSysID */
0 /* Checksum */
};

View File

@ -6,261 +6,347 @@ terms and conditions of the FreeBE/AF project. */
But don't use it for other driver without having clear if you can do it.
*/
uchar VGA8x16Font[256*16]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x7E,0x81,0xA5,0x81,0x81,0xBD,0x99,0x81,0x81,0x7E,0x00,0x00,0x00,0x00,
0x00,0x00,0x7E,0xFF,0xDB,0xFF,0xFF,0xC3,0xE7,0xFF,0xFF,0x7E,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x6C,0xFE,0xFE,0xFE,0xFE,0x7C,0x38,0x10,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x10,0x38,0x7C,0xFE,0x7C,0x38,0x10,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x18,0x3C,0x3C,0xE7,0xE7,0xE7,0x99,0x18,0x3C,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x18,0x3C,0x7E,0xFF,0xFF,0x7E,0x18,0x18,0x3C,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x3C,0x3C,0x18,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE7,0xC3,0xC3,0xE7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x42,0x42,0x66,0x3C,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xC3,0x99,0xBD,0xBD,0x99,0xC3,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x1E,0x0E,0x1A,0x32,0x78,0xCC,0xCC,0xCC,0xCC,0x78,0x00,0x00,0x00,0x00,
0x00,0x00,0x3C,0x66,0x66,0x66,0x66,0x3C,0x18,0x7E,0x18,0x18,0x00,0x00,0x00,0x00,
0x00,0x00,0x3F,0x33,0x3F,0x30,0x30,0x30,0x30,0x70,0xF0,0xE0,0x00,0x00,0x00,0x00,
0x00,0x00,0x7F,0x63,0x7F,0x63,0x63,0x63,0x63,0x67,0xE7,0xE6,0xC0,0x00,0x00,0x00,
0x00,0x00,0x00,0x18,0x18,0xDB,0x3C,0xE7,0x3C,0xDB,0x18,0x18,0x00,0x00,0x00,0x00,
0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFE,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,
0x00,0x02,0x06,0x0E,0x1E,0x3E,0xFE,0x3E,0x1E,0x0E,0x06,0x02,0x00,0x00,0x00,0x00,
0x00,0x00,0x18,0x3C,0x7E,0x18,0x18,0x18,0x18,0x7E,0x3C,0x18,0x00,0x00,0x00,0x00,
0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x66,0x66,0x00,0x00,0x00,0x00,
0x00,0x00,0x7F,0xDB,0xDB,0xDB,0x7B,0x1B,0x1B,0x1B,0x1B,0x1B,0x00,0x00,0x00,0x00,
0x00,0x7C,0xC6,0x60,0x38,0x6C,0xC6,0xC6,0x6C,0x38,0x0C,0xC6,0x7C,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0xFE,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x18,0x3C,0x7E,0x18,0x18,0x18,0x18,0x7E,0x3C,0x18,0x7E,0x00,0x00,0x00,
0x00,0x00,0x18,0x3C,0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,
0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x3C,0x18,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x18,0x0C,0xFE,0x0C,0x18,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x30,0x60,0xFE,0x60,0x30,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x24,0x66,0xFF,0x66,0x24,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x10,0x38,0x38,0x7C,0x7C,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFE,0xFE,0x7C,0x7C,0x38,0x38,0x10,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x18,0x3C,0x3C,0x3C,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00,
0x00,0x63,0x63,0x63,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x6C,0x6C,0xFE,0x6C,0x6C,0x6C,0xFE,0x6C,0x6C,0x00,0x00,0x00,0x00,
0x18,0x18,0x7C,0xC6,0xC2,0xC0,0x7C,0x06,0x86,0xC6,0x7C,0x18,0x18,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xC2,0xC6,0x0C,0x18,0x30,0x60,0xC6,0x86,0x00,0x00,0x00,0x00,
0x00,0x00,0x38,0x6C,0x6C,0x38,0x76,0xDC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00,
0x00,0x30,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x0C,0x18,0x30,0x30,0x30,0x30,0x30,0x30,0x18,0x0C,0x00,0x00,0x00,0x00,
0x00,0x00,0x30,0x18,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x18,0x30,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x18,0x18,0xFF,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x02,0x06,0x0C,0x18,0x30,0x60,0xC0,0x80,0x00,0x00,0x00,0x00,
0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xD6,0xD6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x00,0x00,0x00,0x00,
0x00,0x00,0x7C,0xC6,0x06,0x0C,0x18,0x30,0x60,0xC0,0xC6,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x7C,0xC6,0x06,0x06,0x3C,0x06,0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x0C,0x1C,0x3C,0x6C,0xCC,0xFE,0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00,0x00,
0x00,0x00,0xFE,0xC0,0xC0,0xC0,0xFC,0x0E,0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x38,0x60,0xC0,0xC0,0xFC,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0xFE,0xC6,0x06,0x06,0x0C,0x18,0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x00,
0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7C,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7E,0x06,0x06,0x06,0x0C,0x78,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x06,0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x06,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x60,0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x60,0x00,0x00,0x00,0x00,
0x00,0x00,0x7C,0xC6,0xC6,0x0C,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x7C,0xC6,0xC6,0xDE,0xDE,0xDE,0xDC,0xC0,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00,
0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x66,0x66,0x66,0x66,0xFC,0x00,0x00,0x00,0x00,
0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xC0,0xC0,0xC2,0x66,0x3C,0x00,0x00,0x00,0x00,
0x00,0x00,0xF8,0x6C,0x66,0x66,0x66,0x66,0x66,0x66,0x6C,0xF8,0x00,0x00,0x00,0x00,
0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68,0x60,0x62,0x66,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00,
0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xDE,0xC6,0xC6,0x66,0x3A,0x00,0x00,0x00,0x00,
0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00,
0x00,0x00,0x3C,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00,
0x00,0x00,0x1E,0x0C,0x0C,0x0C,0x0C,0x0C,0xCC,0xCC,0xCC,0x78,0x00,0x00,0x00,0x00,
0x00,0x00,0xE6,0x66,0x6C,0x6C,0x78,0x78,0x6C,0x66,0x66,0xE6,0x00,0x00,0x00,0x00,
0x00,0x00,0xF0,0x60,0x60,0x60,0x60,0x60,0x60,0x62,0x66,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0xC3,0xE7,0xFF,0xDB,0xDB,0xC3,0xC3,0xC3,0xC3,0xC3,0x00,0x00,0x00,0x00,
0x00,0x00,0xC6,0xE6,0xF6,0xFE,0xDE,0xCE,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00,
0x00,0x00,0x38,0x6C,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x6C,0x38,0x00,0x00,0x00,0x00,
0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x60,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00,
0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xD6,0xDE,0x7C,0x0C,0x0E,0x00,0x00,
0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x6C,0x66,0x66,0x66,0xE6,0x00,0x00,0x00,0x00,
0x00,0x00,0x7C,0xC6,0xC6,0x60,0x38,0x0C,0x06,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xDB,0x99,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00,
0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x6C,0x38,0x10,0x00,0x00,0x00,0x00,
0x00,0x00,0xC3,0xC3,0xC3,0xC3,0xC3,0xDB,0xDB,0xFF,0x66,0x66,0x00,0x00,0x00,0x00,
0x00,0x00,0xC6,0xC6,0x6C,0x6C,0x38,0x38,0x6C,0x6C,0xC6,0xC6,0x00,0x00,0x00,0x00,
0x00,0x00,0x66,0x66,0x66,0x66,0x3C,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xC3,0x83,0x06,0x0C,0x18,0x30,0x61,0xC3,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x3E,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3E,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x80,0xC0,0xE0,0x70,0x38,0x1C,0x0E,0x06,0x02,0x00,0x00,0x00,0x00,
0x00,0x00,0x3E,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x3E,0x00,0x00,0x00,0x00,
0x10,0x38,0x6C,0xC6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,
0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00,
0x00,0x00,0xE0,0x60,0x60,0x78,0x6C,0x66,0x66,0x66,0x66,0xDC,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xC0,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x1C,0x0C,0x0C,0x3C,0x6C,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xFE,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x38,0x6C,0x64,0x60,0xF0,0x60,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x76,0xCC,0xCC,0xCC,0xCC,0xCC,0x7C,0x0C,0xCC,0x78,0x00,
0x00,0x00,0xE0,0x60,0x60,0x6C,0x76,0x66,0x66,0x66,0x66,0xE6,0x00,0x00,0x00,0x00,
0x00,0x00,0x18,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00,
0x00,0x00,0x06,0x06,0x00,0x0E,0x06,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3C,0x00,
0x00,0x00,0xE0,0x60,0x60,0x66,0x6C,0x78,0x78,0x6C,0x66,0xE6,0x00,0x00,0x00,0x00,
0x00,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xE6,0xFF,0xDB,0xDB,0xDB,0xDB,0xDB,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xDC,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xDC,0x66,0x66,0x66,0x66,0x66,0x7C,0x60,0x60,0xF0,0x00,
0x00,0x00,0x00,0x00,0x00,0x76,0xCC,0xCC,0xCC,0xCC,0xCC,0x7C,0x0C,0x0C,0x1E,0x00,
0x00,0x00,0x00,0x00,0x00,0xDC,0x76,0x62,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0x60,0x38,0x0C,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x10,0x30,0x30,0xFC,0x30,0x30,0x30,0x30,0x36,0x1C,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xC3,0xC3,0xC3,0xDB,0xDB,0xFF,0x66,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xC6,0x6C,0x38,0x38,0x38,0x6C,0xC6,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7E,0x06,0x0C,0xF8,0x00,
0x00,0x00,0x00,0x00,0x00,0xFE,0xCC,0x18,0x30,0x60,0xC6,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x0E,0x18,0x18,0x18,0x70,0x18,0x18,0x18,0x18,0x0E,0x00,0x00,0x00,0x00,
0x00,0x00,0x18,0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,
0x00,0x00,0x70,0x18,0x18,0x18,0x0E,0x18,0x18,0x18,0x18,0x70,0x00,0x00,0x00,0x00,
0x00,0x00,0x76,0xDC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xC6,0xFE,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xC0,0xC2,0x66,0x3C,0x0C,0x06,0x7C,0x00,0x00,
0x00,0x00,0xCC,0xCC,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00,
0x00,0x0C,0x18,0x30,0x00,0x7C,0xC6,0xFE,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x10,0x38,0x6C,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00,
0x00,0x00,0xCC,0xCC,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00,
0x00,0x60,0x30,0x18,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00,
0x00,0x38,0x6C,0x38,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x3C,0x66,0x60,0x60,0x66,0x3C,0x0C,0x06,0x3C,0x00,0x00,0x00,
0x00,0x10,0x38,0x6C,0x00,0x7C,0xC6,0xFE,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0xC6,0xC6,0x00,0x7C,0xC6,0xFE,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x60,0x30,0x18,0x00,0x7C,0xC6,0xFE,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x66,0x66,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00,
0x00,0x18,0x3C,0x66,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00,
0x00,0x60,0x30,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00,
0x00,0xC6,0xC6,0x10,0x38,0x6C,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00,
0x38,0x6C,0x38,0x00,0x38,0x6C,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00,
0x18,0x30,0x60,0x00,0xFE,0x66,0x60,0x7C,0x60,0x60,0x66,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x6E,0x3B,0x1B,0x7E,0xD8,0xDC,0x77,0x00,0x00,0x00,0x00,
0x00,0x00,0x3E,0x6C,0xCC,0xCC,0xFE,0xCC,0xCC,0xCC,0xCC,0xCE,0x00,0x00,0x00,0x00,
0x00,0x10,0x38,0x6C,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0xC6,0xC6,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x60,0x30,0x18,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x30,0x78,0xCC,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00,
0x00,0x60,0x30,0x18,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00,
0x00,0x00,0xC6,0xC6,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7E,0x06,0x0C,0x78,0x00,
0x00,0xC6,0xC6,0x00,0x38,0x6C,0xC6,0xC6,0xC6,0xC6,0x6C,0x38,0x00,0x00,0x00,0x00,
0x00,0xC6,0xC6,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x18,0x18,0x3C,0x66,0x60,0x60,0x60,0x66,0x3C,0x18,0x18,0x00,0x00,0x00,0x00,
0x00,0x38,0x6C,0x64,0x60,0xF0,0x60,0x60,0x60,0x60,0xE6,0xFC,0x00,0x00,0x00,0x00,
0x00,0x00,0xC3,0x66,0x3C,0x18,0x7E,0x18,0x7E,0x18,0x18,0x18,0x00,0x00,0x00,0x00,
0x00,0xFC,0x66,0x66,0x7C,0x62,0x66,0x6F,0x66,0x66,0x66,0xF3,0x00,0x00,0x00,0x00,
0x00,0x0E,0x1B,0x18,0x18,0x18,0x7E,0x18,0x18,0x18,0x18,0x18,0xD8,0x70,0x00,0x00,
0x00,0x18,0x30,0x60,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00,
0x00,0x0C,0x18,0x30,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00,
0x00,0x18,0x30,0x60,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x18,0x30,0x60,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00,
0x00,0x00,0x76,0xDC,0x00,0xDC,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00,
0x76,0xDC,0x00,0xC6,0xE6,0xF6,0xFE,0xDE,0xCE,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00,
0x00,0x3C,0x6C,0x6C,0x3E,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x38,0x6C,0x6C,0x38,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x30,0x30,0x00,0x30,0x30,0x60,0xC0,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,
0x00,0xC0,0xC0,0xC2,0xC6,0xCC,0x18,0x30,0x60,0xCE,0x93,0x06,0x0C,0x1F,0x00,0x00,
0x00,0xC0,0xC0,0xC2,0xC6,0xCC,0x18,0x30,0x66,0xCE,0x9A,0x3F,0x06,0x0F,0x00,0x00,
0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x18,0x3C,0x3C,0x3C,0x18,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x33,0x66,0xCC,0x66,0x33,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xCC,0x66,0x33,0x66,0xCC,0x00,0x00,0x00,0x00,0x00,0x00,
0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,
0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,
0xDD,0x77,0xDD,0x77,0xDD,0x77,0xDD,0x77,0xDD,0x77,0xDD,0x77,0xDD,0x77,0xDD,0x77,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x18,0x18,0x18,0x18,0x18,0xF8,0x18,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xF6,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
0x00,0x00,0x00,0x00,0x00,0xF8,0x18,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x36,0x36,0x36,0x36,0x36,0xF6,0x06,0xF6,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
0x00,0x00,0x00,0x00,0x00,0xFE,0x06,0xF6,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
0x36,0x36,0x36,0x36,0x36,0xF6,0x06,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x18,0x18,0x18,0x18,0x18,0xF8,0x18,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x18,0x18,0x18,0x18,0x18,0x1F,0x18,0x1F,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x37,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
0x36,0x36,0x36,0x36,0x36,0x37,0x30,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x3F,0x30,0x37,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
0x36,0x36,0x36,0x36,0x36,0xF7,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xF7,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
0x36,0x36,0x36,0x36,0x36,0x37,0x30,0x37,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x36,0x36,0x36,0x36,0x36,0xF7,0x00,0xF7,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
0x18,0x18,0x18,0x18,0x18,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x18,0x18,0x18,0x18,0x18,0x1F,0x18,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x1F,0x18,0x1F,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xFF,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
0x18,0x18,0x18,0x18,0x18,0xFF,0x18,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,
0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x76,0xDC,0xD8,0xD8,0xD8,0xDC,0x76,0x00,0x00,0x00,0x00,
0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xDC,0xC6,0xC3,0xC3,0xC3,0xCE,0x00,0x00,0x00,0x00,
0x00,0x00,0xFE,0xC6,0xC6,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x80,0xFE,0x6C,0x6C,0x6C,0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xFE,0xC6,0x60,0x30,0x18,0x30,0x60,0xC6,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x7E,0xD8,0xD8,0xD8,0xD8,0xD8,0x70,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x7C,0x60,0x60,0xC0,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x76,0xDC,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x7E,0x18,0x3C,0x66,0x66,0x66,0x3C,0x18,0x7E,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x38,0x6C,0xC6,0xC6,0xFE,0xC6,0xC6,0x6C,0x38,0x00,0x00,0x00,0x00,
0x00,0x00,0x38,0x6C,0xC6,0xC6,0xC6,0x6C,0x6C,0x6C,0x6C,0xEE,0x00,0x00,0x00,0x00,
0x00,0x00,0x1E,0x30,0x18,0x0C,0x3E,0x66,0x66,0x66,0x66,0x3C,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x7E,0xDB,0xDB,0xDB,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x03,0x06,0x7E,0xCF,0xDB,0xF3,0x7E,0x60,0xC0,0x00,0x00,0x00,0x00,
0x00,0x00,0x1C,0x30,0x60,0x60,0x7C,0x60,0x60,0x60,0x30,0x1C,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0xFE,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x18,0x18,0xFF,0x18,0x18,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x00,0x7E,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x00,0x7E,0x00,0x00,0x00,0x00,
0x00,0x00,0x0E,0x1B,0x1B,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xD8,0xD8,0xD8,0x70,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x18,0x18,0x00,0xFF,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x76,0xDC,0x00,0x76,0xDC,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x38,0x6C,0x6C,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x0F,0x0C,0x0C,0x0C,0x0C,0x0C,0xEC,0x6C,0x6C,0x3C,0x1C,0x00,0x00,0x00,0x00,
0x00,0xD8,0x6C,0x6C,0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x70,0x98,0x30,0x60,0xC8,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
uchar VGA8x16Font[256 * 16] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x81, 0xA5, 0x81, 0x81, 0xBD,
0x99, 0x81, 0x81, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFF,
0xDB, 0xFF, 0xFF, 0xC3, 0xE7, 0xFF, 0xFF, 0x7E, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x6C, 0xFE, 0xFE, 0xFE, 0xFE, 0x7C, 0x38, 0x10,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7C, 0xFE,
0x7C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
0x3C, 0x3C, 0xE7, 0xE7, 0xE7, 0x99, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x18, 0x3C, 0x7E, 0xFF, 0xFF, 0x7E, 0x18, 0x18, 0x3C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C,
0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xE7, 0xC3, 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x66, 0x42, 0x42, 0x66, 0x3C, 0x00,
0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x99, 0xBD,
0xBD, 0x99, 0xC3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x1E, 0x0E,
0x1A, 0x32, 0x78, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x18, 0x18,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x33, 0x3F, 0x30, 0x30, 0x30,
0x30, 0x70, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x63,
0x7F, 0x63, 0x63, 0x63, 0x63, 0x67, 0xE7, 0xE6, 0xC0, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x18, 0x18, 0xDB, 0x3C, 0xE7, 0x3C, 0xDB, 0x18, 0x18,
0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFE, 0xF8,
0xF0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0E,
0x1E, 0x3E, 0xFE, 0x3E, 0x1E, 0x0E, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xDB,
0xDB, 0xDB, 0x7B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x00, 0x00, 0x00, 0x00,
0x00, 0x7C, 0xC6, 0x60, 0x38, 0x6C, 0xC6, 0xC6, 0x6C, 0x38, 0x0C, 0xC6,
0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFE, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C,
0x7E, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x7E, 0x00, 0x00, 0x00,
0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x18, 0x0C, 0xFE, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xFE, 0x60, 0x30, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0,
0xC0, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x24, 0x66, 0xFF, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7C, 0x7C, 0xFE, 0xFE, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x7C, 0x7C,
0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x18, 0x3C, 0x3C, 0x3C, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18,
0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x63, 0x63, 0x22, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C,
0x6C, 0xFE, 0x6C, 0x6C, 0x6C, 0xFE, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00,
0x18, 0x18, 0x7C, 0xC6, 0xC2, 0xC0, 0x7C, 0x06, 0x86, 0xC6, 0x7C, 0x18,
0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xC6, 0x0C, 0x18,
0x30, 0x60, 0xC6, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6C,
0x6C, 0x38, 0x76, 0xDC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00,
0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x30,
0x30, 0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18,
0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0xFF,
0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x02, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xD6, 0xD6, 0xC6, 0xC6, 0xC6, 0x7C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6,
0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x7C, 0xC6, 0x06, 0x06, 0x3C, 0x06, 0x06, 0x06, 0xC6, 0x7C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x1C, 0x3C, 0x6C, 0xCC, 0xFE,
0x0C, 0x0C, 0x0C, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xC0,
0xC0, 0xC0, 0xFC, 0x0E, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x38, 0x60, 0xC0, 0xC0, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xC6, 0x06, 0x06, 0x0C, 0x18,
0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6,
0xC6, 0xC6, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0x06, 0x0C, 0x78,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0C, 0x06,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00,
0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
0x30, 0x18, 0x0C, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x0C, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xDE, 0xDE,
0xDE, 0xDC, 0xC0, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38,
0x6C, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x66, 0x66, 0x66, 0x66, 0xFC,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0, 0xC0, 0xC0,
0xC0, 0xC2, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x6C,
0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6C, 0xF8, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFE, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x62, 0x66, 0xFE,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x66, 0x62, 0x68, 0x78, 0x68,
0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x66,
0xC2, 0xC0, 0xC0, 0xDE, 0xC6, 0xC6, 0x66, 0x3A, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x0C,
0x0C, 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xE6, 0x66, 0x6C, 0x6C, 0x78, 0x78, 0x6C, 0x66, 0x66, 0xE6,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60,
0x60, 0x62, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0xE7,
0xFF, 0xDB, 0xDB, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xC6, 0xE6, 0xF6, 0xFE, 0xDE, 0xCE, 0xC6, 0xC6, 0xC6, 0xC6,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xC6,
0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x66,
0x66, 0x66, 0x7C, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xD6, 0xDE, 0x7C,
0x0C, 0x0E, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x6C,
0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6,
0xC6, 0x60, 0x38, 0x0C, 0x06, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFF, 0xDB, 0x99, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6,
0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xDB, 0xDB, 0xFF, 0x66, 0x66,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0x6C, 0x6C, 0x38, 0x38,
0x6C, 0x6C, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66,
0x66, 0x66, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFF, 0xC3, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x61, 0xC3, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x30, 0x30, 0x30, 0x30, 0x30,
0x30, 0x30, 0x30, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x3E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x3E,
0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00,
0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x7C,
0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x60,
0x60, 0x78, 0x6C, 0x66, 0x66, 0x66, 0x66, 0xDC, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0, 0xC0, 0xC6, 0x7C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x0C, 0x0C, 0x3C, 0x6C, 0xCC,
0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x7C, 0xC6, 0xFE, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x38, 0x6C, 0x64, 0x60, 0xF0, 0x60, 0x60, 0x60, 0x60, 0xF0,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCC, 0xCC,
0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0xCC, 0x78, 0x00, 0x00, 0x00, 0xE0, 0x60,
0x60, 0x6C, 0x76, 0x66, 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x0E, 0x06, 0x06,
0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3C, 0x00, 0x00, 0x00, 0xE0, 0x60,
0x60, 0x66, 0x6C, 0x78, 0x78, 0x6C, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xFF, 0xDB,
0xDB, 0xDB, 0xDB, 0xDB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xDC, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66,
0x66, 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x76, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0x0C, 0x1E, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x76, 0x62, 0x60, 0x60, 0x60, 0xF0,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0x60,
0x38, 0x0C, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x30,
0x30, 0xFC, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x76,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66,
0x66, 0x66, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xC3, 0xC3, 0xC3, 0xDB, 0xDB, 0xFF, 0x66, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x6C, 0x38, 0x38, 0x38, 0x6C, 0xC6,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6,
0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x0C, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFE, 0xCC, 0x18, 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x0E, 0x18, 0x18, 0x18, 0x70, 0x18, 0x18, 0x18, 0x18, 0x0E,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18,
0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x18,
0x18, 0x18, 0x0E, 0x18, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6C, 0xC6,
0xC6, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x66,
0xC2, 0xC0, 0xC0, 0xC0, 0xC2, 0x66, 0x3C, 0x0C, 0x06, 0x7C, 0x00, 0x00,
0x00, 0x00, 0xCC, 0xCC, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x76,
0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x00, 0x7C, 0xC6, 0xFE,
0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6C,
0x00, 0x78, 0x0C, 0x7C, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xCC, 0xCC, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0xCC, 0xCC, 0x76,
0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0C, 0x7C,
0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6C, 0x38,
0x00, 0x78, 0x0C, 0x7C, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x3C, 0x66, 0x60, 0x60, 0x66, 0x3C, 0x0C, 0x06,
0x3C, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6C, 0x00, 0x7C, 0xC6, 0xFE,
0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6,
0x00, 0x7C, 0xC6, 0xFE, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x60, 0x30, 0x18, 0x00, 0x7C, 0xC6, 0xFE, 0xC0, 0xC0, 0xC6, 0x7C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x38, 0x18, 0x18,
0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C, 0x66,
0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C,
0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0x10, 0x38, 0x6C, 0xC6, 0xC6,
0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6C, 0x38, 0x00,
0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
0x18, 0x30, 0x60, 0x00, 0xFE, 0x66, 0x60, 0x7C, 0x60, 0x60, 0x66, 0xFE,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x3B, 0x1B,
0x7E, 0xD8, 0xDC, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x6C,
0xCC, 0xCC, 0xFE, 0xCC, 0xCC, 0xCC, 0xCC, 0xCE, 0x00, 0x00, 0x00, 0x00,
0x00, 0x10, 0x38, 0x6C, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0x00, 0x7C, 0xC6, 0xC6,
0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18,
0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x30, 0x78, 0xCC, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x76,
0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0xCC, 0xCC, 0xCC,
0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6,
0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x0C, 0x78, 0x00,
0x00, 0xC6, 0xC6, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xC6, 0x6C, 0x38,
0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x3C,
0x66, 0x60, 0x60, 0x60, 0x66, 0x3C, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
0x00, 0x38, 0x6C, 0x64, 0x60, 0xF0, 0x60, 0x60, 0x60, 0x60, 0xE6, 0xFC,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x66, 0x3C, 0x18, 0x7E, 0x18,
0x7E, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x66, 0x66,
0x7C, 0x62, 0x66, 0x6F, 0x66, 0x66, 0x66, 0xF3, 0x00, 0x00, 0x00, 0x00,
0x00, 0x0E, 0x1B, 0x18, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18,
0xD8, 0x70, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0x78, 0x0C, 0x7C,
0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30,
0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x18, 0x30, 0x60, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0xCC, 0xCC, 0xCC,
0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC,
0x00, 0xDC, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
0x76, 0xDC, 0x00, 0xC6, 0xE6, 0xF6, 0xFE, 0xDE, 0xCE, 0xC6, 0xC6, 0xC6,
0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x6C, 0x6C, 0x3E, 0x00, 0x7E, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6C, 0x6C,
0x38, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, 0xC0, 0xC6, 0xC6, 0x7C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xC0,
0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFE, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xC0, 0xC0, 0xC2, 0xC6, 0xCC, 0x18, 0x30, 0x60, 0xCE, 0x93, 0x06,
0x0C, 0x1F, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC2, 0xC6, 0xCC, 0x18, 0x30,
0x66, 0xCE, 0x9A, 0x3F, 0x06, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
0x00, 0x18, 0x18, 0x18, 0x3C, 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x66, 0xCC, 0x66, 0x33, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0x66, 0x33,
0x66, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x11, 0x44,
0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA,
0x55, 0xAA, 0x55, 0xAA, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77,
0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0xF8,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36,
0x36, 0x36, 0x36, 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x36, 0x36, 0x36, 0x36,
0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18, 0xF8,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36,
0x36, 0xF6, 0x06, 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x06, 0xF6,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x36, 0xF6, 0x06, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFE, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0xF8,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x36, 0x37, 0x30, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFF, 0x00, 0xF7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36,
0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36,
0x36, 0xF7, 0x00, 0xF7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFF, 0x00, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x36, 0x36, 0x36, 0x36,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3F,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
0x18, 0x1F, 0x18, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x36, 0x36, 0x36, 0xFF, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0xFF, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0xF0, 0xF0,
0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x76, 0xDC, 0xD8, 0xD8, 0xD8, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xDC, 0xC6, 0xC3, 0xC3, 0xC3, 0xCE,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xC6, 0xC6, 0xC0, 0xC0, 0xC0,
0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x80, 0xFE, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFE, 0xC6, 0x60, 0x30, 0x18, 0x30, 0x60, 0xC6, 0xFE,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xD8, 0xD8,
0xD8, 0xD8, 0xD8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x66, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0x60, 0xC0, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x76, 0xDC, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x18, 0x3C, 0x66, 0x66,
0x66, 0x3C, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
0x6C, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0x6C, 0x6C, 0x6C, 0x6C, 0xEE,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x30, 0x18, 0x0C, 0x3E, 0x66,
0x66, 0x66, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x7E, 0xDB, 0xDB, 0xDB, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x03, 0x06, 0x7E, 0xCF, 0xDB, 0xF3, 0x7E, 0x60, 0xC0,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x30, 0x60, 0x60, 0x7C, 0x60,
0x60, 0x60, 0x30, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0xFF, 0x18,
0x18, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x18, 0x0C, 0x06, 0x0C, 0x18, 0x30, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0C, 0x00, 0x7E,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x1B, 0x1B, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0xD8, 0xD8, 0xD8, 0x70, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0xFF, 0x00, 0x18, 0x18, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC, 0x00,
0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6C, 0x6C,
0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0C, 0x0C,
0x0C, 0x0C, 0x0C, 0xEC, 0x6C, 0x6C, 0x3C, 0x1C, 0x00, 0x00, 0x00, 0x00,
0x00, 0xD8, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x98, 0x30, 0x60, 0xC8, 0xF8, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00
};

View File

@ -15,130 +15,128 @@ terms and conditions of the FreeBE/AF project. */
0x00 to 0x18 */
// SVGALib and XFree86 uses <0x18 so they miss the line compare register,
// don't know why.
#define CRTbase 0
#define CRTcant 25
#define CRTbase 0
#define CRTcant 25
/* ATT Attribute Controller Registers
They control some attributes like 16 colors palette, overscan color, etc.
0x00 to 0x14 */
#define ATTbase (CRTbase+CRTcant)
#define ATTcant 21
#define ATTbase (CRTbase + CRTcant)
#define ATTcant 21
/* GRA Graphics Controller Registers
They control the read/write mode to the video memory.
0x00 to 0x08 */
#define GRAbase (ATTbase+ATTcant)
#define GRAcant 9
#define GRAbase (ATTbase + ATTcant)
#define GRAcant 9
/* SEQ Sequence Registers
They control how the memory is scanned.
0x00 to 0x04 */
#define SEQbase (GRAbase+GRAcant)
#define SEQcant 5
#define SEQbase (GRAbase + GRAcant)
#define SEQcant 5
/* MOR Miscellaneous Output Register
1 register */
#define MORbase (SEQbase+SEQcant)
#define MORcant 1
#define MORbase (SEQbase + SEQcant)
#define MORcant 1
#define VGARegsCant (MORbase+MORcant)
#define VGARegsCant (MORbase + MORcant)
/* Status values: Here I store special status values that doesn't
correspond to a physical register but to an operation plus some
special registers */
#define SPbase 0
#define SPcant 12
#define OldNewStatus SPbase+0
#define ALT_BNK_WRITE SPbase+1
#define ALT_BNK_READ SPbase+2
#define ALT_CLK SPbase+3
#define DAC_3C6 SPbase+4
#define DAC_3C6_4th SPbase+5
#define DAC_WR_ADD SPbase+6
#define MCLKLOW SPbase+7
#define MCLKHIG SPbase+8
#define VCLKLOW SPbase+9
#define VCLKHIG SPbase+10
#define DAC_INDEX SPbase+11
#define OldNewStatus SPbase + 0
#define ALT_BNK_WRITE SPbase + 1
#define ALT_BNK_READ SPbase + 2
#define ALT_CLK SPbase + 3
#define DAC_3C6 SPbase + 4
#define DAC_3C6_4th SPbase + 5
#define DAC_WR_ADD SPbase + 6
#define MCLKLOW SPbase + 7
#define MCLKHIG SPbase + 8
#define VCLKLOW SPbase + 9
#define VCLKHIG SPbase + 10
#define DAC_INDEX SPbase + 11
/* ESEQ Extra Sequence Registers
0x08 to 0x0F (They have some tricks) */
#define ESEQbase (SPbase+SPcant)
#define ESEQbase (SPbase + SPcant)
#define ESEQcant 5
#define ESEQ_0D_old ESEQbase+0
#define ESEQ_0E_old ESEQbase+1
#define ESEQ_0D_new ESEQbase+2
#define ESEQ_0E_new ESEQbase+3
#define ESEQ_0F ESEQbase+4
#define ESEQ_0D_old ESEQbase + 0
#define ESEQ_0E_old ESEQbase + 1
#define ESEQ_0D_new ESEQbase + 2
#define ESEQ_0E_new ESEQbase + 3
#define ESEQ_0F ESEQbase + 4
/* ECRT Extra CRT Registers
0x19 to 0x50 */
#define ECRTbase (ESEQbase+ESEQcant)
#define ECRTbase (ESEQbase + ESEQcant)
#define ECRTcant 33
#define ECRT_19 ECRTbase
#define ECRT_1E ECRTbase+1
#define ECRT_1F ECRTbase+2
#define ECRT_20 ECRTbase+3
#define ECRT_21 ECRTbase+4
#define ECRT_22 ECRTbase+5
#define ECRT_23 ECRTbase+6
#define ECRT_24 ECRTbase+7
#define ECRT_25 ECRTbase+8
#define ECRT_26 ECRTbase+9
#define ECRT_27 ECRTbase+10
#define ECRT_28 ECRTbase+11
#define ECRT_29 ECRTbase+12
#define ECRT_2A ECRTbase+13
#define ECRT_2C ECRTbase+14
#define ECRT_2F ECRTbase+15
#define ECRT_30 ECRTbase+16
#define ECRT_33 ECRTbase+17
#define ECRT_34 ECRTbase+18
#define ECRT_35 ECRTbase+19
#define ECRT_36 ECRTbase+20
#define ECRT_37 ECRTbase+21
#define ECRT_38 ECRTbase+22
#define ECRT_39 ECRTbase+23
#define ECRT_40 ECRTbase+24
#define ECRT_41 ECRTbase+25
#define ECRT_42 ECRTbase+26
#define ECRT_43 ECRTbase+27
#define ECRT_44 ECRTbase+28
#define ECRT_45 ECRTbase+29
#define ECRT_46 ECRTbase+30
#define ECRT_47 ECRTbase+31
#define ECRT_50 ECRTbase+32
#define ECRT_1E ECRTbase + 1
#define ECRT_1F ECRTbase + 2
#define ECRT_20 ECRTbase + 3
#define ECRT_21 ECRTbase + 4
#define ECRT_22 ECRTbase + 5
#define ECRT_23 ECRTbase + 6
#define ECRT_24 ECRTbase + 7
#define ECRT_25 ECRTbase + 8
#define ECRT_26 ECRTbase + 9
#define ECRT_27 ECRTbase + 10
#define ECRT_28 ECRTbase + 11
#define ECRT_29 ECRTbase + 12
#define ECRT_2A ECRTbase + 13
#define ECRT_2C ECRTbase + 14
#define ECRT_2F ECRTbase + 15
#define ECRT_30 ECRTbase + 16
#define ECRT_33 ECRTbase + 17
#define ECRT_34 ECRTbase + 18
#define ECRT_35 ECRTbase + 19
#define ECRT_36 ECRTbase + 20
#define ECRT_37 ECRTbase + 21
#define ECRT_38 ECRTbase + 22
#define ECRT_39 ECRTbase + 23
#define ECRT_40 ECRTbase + 24
#define ECRT_41 ECRTbase + 25
#define ECRT_42 ECRTbase + 26
#define ECRT_43 ECRTbase + 27
#define ECRT_44 ECRTbase + 28
#define ECRT_45 ECRTbase + 29
#define ECRT_46 ECRTbase + 30
#define ECRT_47 ECRTbase + 31
#define ECRT_50 ECRTbase + 32
/* EGRA Extra Graphics Controller Registers
0x0E, 0x0F, 0x23 and 0x2F */
#define EGRAbase (ECRTbase+ECRTcant)
#define EGRAbase (ECRTbase + ECRTcant)
#define EGRAcant 4
#define EGRA_0E_old EGRAbase
#define EGRA_0F EGRAbase+1
#define EGRA_23 EGRAbase+2
#define EGRA_2F EGRAbase+3
#define EGRA_0F EGRAbase + 1
#define EGRA_23 EGRAbase + 2
#define EGRA_2F EGRAbase + 3
/* EDAC Extra DAC/Clk */
#define EDACbase (EGRAbase+EGRAcant)
#define EDACcant 4
#define EDAC_00 EDACbase+0
#define EDAC_01 EDACbase+1
#define EDAC_02 EDACbase+2
#define EDAC_03 EDACbase+3
#define EDACbase (EGRAbase + EGRAcant)
#define EDACcant 4
#define EDAC_00 EDACbase + 0
#define EDAC_01 EDACbase + 1
#define EDAC_02 EDACbase + 2
#define EDAC_03 EDACbase + 3
/* GER Graphics Engine Register. Only the relevant stuff */
/* 0x22 and 0x23 */
#define GERbase (EDACbase+EDACcant)
#define GERbase (EDACbase + EDACcant)
#define GERcant 6
#define GER_22 GERbase+0
#define GER_23 GERbase+1
#define GER_44 GERbase+2
#define GER_45 GERbase+3
#define GER_46 GERbase+4
#define GER_47 GERbase+5
#define GER_22 GERbase + 0
#define GER_23 GERbase + 1
#define GER_44 GERbase + 2
#define GER_45 GERbase + 3
#define GER_46 GERbase + 4
#define GER_47 GERbase + 5
#define SVGARegsCant (GERbase+GERcant)
#define SVGARegsCant (GERbase + GERcant)
#ifdef __cplusplus
extern "C" {
#endif
int VGASaveRegs(uchar *regs, uchar *Sregs);
void VGALoadRegs(const uchar *regs,const uchar *Sregs);
int VGASaveRegs(uchar *regs, uchar *Sregs);
void VGALoadRegs(const uchar *regs, const uchar *Sregs);
void TGUI9440SaveRegs(uchar *regs);
void TGUI9440LoadRegs(const uchar *regs);
#ifdef __cplusplus
}
#endif

View File

@ -7,11 +7,11 @@ terms and conditions of the FreeBE/AF project. */
*****************************************************************************/
#include <pc.h>
#include "mytypes.h"
#include "regs.h"
#include "vga.h"
#include "tgui.h"
#include "vga.h"
#include <pc.h>
//#include <stdio.h>
@ -24,96 +24,88 @@ are not needed to store.
***************************************************************************/
void TGUI9440SaveRegs(uchar *regs)
{
int Old_New;
int i,Protect,DACaccess,DACaddress;
void TGUI9440SaveRegs(uchar *regs) {
int Old_New;
int i, Protect, DACaccess, DACaddress;
/* Extended Sequencer */
/* 8 is an status (old/new mode, field under scaning, FIFO in use) */
Old_New=ReadSEQ(8);
regs[OldNewStatus]=Old_New;
/* 9 is the revision code, A reserved, B chip ID */
/* Enter in old mode */
WriteSEQ(0xB,0);
regs[ESEQ_0D_old]=ReadSEQ(0xD);
regs[ESEQ_0E_old]=ReadSEQ(0xE);
regs[EGRA_0E_old]=ReadGRA(0xE);
/* Enter in new mode */
ReadSEQ(0xB);
regs[ESEQ_0D_new]=ReadSEQ(0xD);
//fprintf(stderr,"Lectura: %X %X\n",ReadSEQ(0x8),ReadSEQ(0xD));
Protect=
regs[ESEQ_0E_new]=ReadSEQ(0xE);
regs[ESEQ_0F] =ReadSEQ(0xF);
/* Unprotect the registers */
WriteSEQ(0xE,Protect | 0x80);
/* Extended Sequencer */
/* 8 is an status (old/new mode, field under scaning, FIFO in use) */
Old_New = ReadSEQ(8);
regs[OldNewStatus] = Old_New;
/* 9 is the revision code, A reserved, B chip ID */
/* Enter in old mode */
WriteSEQ(0xB, 0);
regs[ESEQ_0D_old] = ReadSEQ(0xD);
regs[ESEQ_0E_old] = ReadSEQ(0xE);
regs[EGRA_0E_old] = ReadGRA(0xE);
/* Enter in new mode */
ReadSEQ(0xB);
regs[ESEQ_0D_new] = ReadSEQ(0xD);
// fprintf(stderr,"Lectura: %X %X\n",ReadSEQ(0x8),ReadSEQ(0xD));
Protect = regs[ESEQ_0E_new] = ReadSEQ(0xE);
regs[ESEQ_0F] = ReadSEQ(0xF);
/* Unprotect the registers */
WriteSEQ(0xE, Protect | 0x80);
DACaccess=
regs[EGRA_0F]=ReadGRA(0xF);
regs[EGRA_23]=ReadGRA(0x23);
regs[EGRA_2F]=ReadGRA(0x2F);
/* Enable access to the DAC */
WriteGRA(0xF,DACaccess | 4);
DACaccess = regs[EGRA_0F] = ReadGRA(0xF);
regs[EGRA_23] = ReadGRA(0x23);
regs[EGRA_2F] = ReadGRA(0x2F);
/* Enable access to the DAC */
WriteGRA(0xF, DACaccess | 4);
/* These are alternative registers so I don't know if I really need to
store your content */
regs[ALT_BNK_WRITE]=inportb(0x3D8);
regs[ALT_BNK_READ] =inportb(0x3D9);
regs[ALT_CLK] =inportb(0x3DB);
/* These are alternative registers so I don't know if I really need to
store your content */
regs[ALT_BNK_WRITE] = inportb(0x3D8);
regs[ALT_BNK_READ] = inportb(0x3D9);
regs[ALT_CLK] = inportb(0x3DB);
/* These extended register are located in the CRT space but they aren't
contiguous */
regs[ECRTbase] = ReadCRT(0x19); // 0 (0x19)
for (i = 1; i < 14; i++)
regs[ECRTbase + i] = ReadCRT(0x1D + i); // 1-13 (0x1D-0x2A)
regs[ECRTbase + i] = ReadCRT(0x2C); // 14
i++;
regs[ECRTbase + i] = ReadCRT(0x2F); // 15
i++;
regs[ECRTbase + i] = ReadCRT(0x30); // 16
for (i++; i < 24; i++) regs[ECRTbase + i] = ReadCRT(0x22 + i); // 17-23
for (; i < 32; i++) regs[ECRTbase + i] = ReadCRT(0x28 + i); // 24-31
regs[ECRTbase + i] = ReadCRT(0x50); // 32
/* These extended register are located in the CRT space but they aren't
contiguous */
regs[ECRTbase]=ReadCRT(0x19); // 0 (0x19)
for (i=1; i<14; i++)
regs[ECRTbase+i]=ReadCRT(0x1D+i); // 1-13 (0x1D-0x2A)
regs[ECRTbase+i]=ReadCRT(0x2C); // 14
i++;
regs[ECRTbase+i]=ReadCRT(0x2F); // 15
i++;
regs[ECRTbase+i]=ReadCRT(0x30); // 16
for (i++; i<24; i++)
regs[ECRTbase+i]=ReadCRT(0x22+i); // 17-23
for (; i<32; i++)
regs[ECRTbase+i]=ReadCRT(0x28+i); // 24-31
regs[ECRTbase+i]=ReadCRT(0x50); // 32
/* Map the DAC safetly (0x3C6 so doesn't overlap others) */
DACaddress = ReadCRT(0x29);
WriteCRT(0x29, DACaddress & 0xFC);
regs[DAC_3C6] = inportb(0x3C6);
inportb(0x3C6);
inportb(0x3C6);
inportb(0x3C6);
regs[DAC_3C6_4th] = inportb(0x3C6);
regs[DAC_WR_ADD] = inportb(0x3C8);
regs[MCLKLOW] = inportb(0x43C6);
regs[MCLKHIG] = inportb(0x43C7);
regs[VCLKLOW] = inportb(0x43C8);
regs[VCLKHIG] = inportb(0x43C9);
regs[DAC_INDEX] = inportb(0x83C8);
/* Map the DAC safetly (0x3C6 so doesn't overlap others) */
DACaddress=ReadCRT(0x29);
WriteCRT(0x29,DACaddress & 0xFC);
regs[DAC_3C6] =inportb(0x3C6);
inportb(0x3C6); inportb(0x3C6); inportb(0x3C6);
regs[DAC_3C6_4th]=inportb(0x3C6);
regs[DAC_WR_ADD] =inportb(0x3C8);
regs[MCLKLOW] =inportb(0x43C6);
regs[MCLKHIG] =inportb(0x43C7);
regs[VCLKLOW] =inportb(0x43C8);
regs[VCLKHIG] =inportb(0x43C9);
regs[DAC_INDEX] =inportb(0x83C8);
for (i = 0; i < EDACcant; i++) regs[EDACbase + i] = ReadEDAC(i);
for (i=0; i<EDACcant; i++)
regs[EDACbase+i]=ReadEDAC(i);
/* The GER */
/* Enable it and map in memory */
WriteCRT(0x36, MODEINIT);
regs[GER_22] = Getb(0x22);
regs[GER_23] = Getb(0x23);
*((unsigned *)&regs[GER_44]) = Getl(0x44);
WriteCRT(0x36, regs[ECRT_36]);
/* The GER */
/* Enable it and map in memory */
WriteCRT(0x36,MODEINIT);
regs[GER_22]=Getb(0x22);
regs[GER_23]=Getb(0x23);
*((unsigned *)&regs[GER_44])=Getl(0x44);
WriteCRT(0x36,regs[ECRT_36]);
/* Restore the DAC mapping */
WriteCRT(0x29,DACaddress);
/* Restore the DAC access */
if ((DACaccess & 4)==0)
WriteGRA(0xF,DACaccess);
/* Restore the protection */
if ((Protect & 0x80)==0)
WriteSEQ(0xE,Protect);
/* Restore the old/new mode */
if ((Old_New & 0x80)==0)
WriteSEQ(0xB,0);
/* Restore the DAC mapping */
WriteCRT(0x29, DACaddress);
/* Restore the DAC access */
if ((DACaccess & 4) == 0) WriteGRA(0xF, DACaccess);
/* Restore the protection */
if ((Protect & 0x80) == 0) WriteSEQ(0xE, Protect);
/* Restore the old/new mode */
if ((Old_New & 0x80) == 0) WriteSEQ(0xB, 0);
}
/**[txh]********************************************************************
@ -125,45 +117,40 @@ are stored.
***************************************************************************/
int VGASaveRegs(uchar *regs, uchar *Sregs)
{
int i;
uchar MORval;
int VGASaveRegs(uchar *regs, uchar *Sregs) {
int i;
uchar MORval;
/* I'm trying to do this routine as strong and generic as possible
without loosing performance.
So I ever put the VGA chip in the color mode (ports=0x3Dx) but I
store the real state */
MORval=ReadMOR();
WriteMOR(MORval | 1);
regs[MORbase]=MORval;
/* I'm trying to do this routine as strong and generic as possible
without loosing performance.
So I ever put the VGA chip in the color mode (ports=0x3Dx) but I
store the real state */
MORval = ReadMOR( );
WriteMOR(MORval | 1);
regs[MORbase] = MORval;
/* I think the best place to put a call to save the chipset specific
registers is here because TGUI9440 can save some interesting things
about the VGA registers. For example: 3x4/5.24.b7 is the current
state of "Attribute Address Register" (3C0: address or data), that's
impossible to know in a VGA card. */
TGUI9440SaveRegs(Sregs);
/* I think the best place to put a call to save the chipset specific
registers is here because TGUI9440 can save some interesting things
about the VGA registers. For example: 3x4/5.24.b7 is the current
state of "Attribute Address Register" (3C0: address or data), that's
impossible to know in a VGA card. */
TGUI9440SaveRegs(Sregs);
for (i=0; i<CRTcant; i++)
regs[CRTbase+i]=ReadCRT(i);
for (i = 0; i < CRTcant; i++) regs[CRTbase + i] = ReadCRT(i);
/******* The Attribute Registers are worst that a pain in the ass I think
the @#*$ people from the Giant Blue tried to make it hard to
understand on purpose ********/
for (i=0; i<ATTcant; i++)
regs[ATTbase+i]=ReadATT(i);
ATTEndReads();
/******* The Attribute Registers are worst that a pain in the ass I think
the @#*$ people from the Giant Blue tried to make it hard to
understand on purpose ********/
for (i = 0; i < ATTcant; i++) regs[ATTbase + i] = ReadATT(i);
ATTEndReads( );
for (i=0; i<GRAcant; i++)
regs[GRAbase+i]=ReadGRA(i);
for (i = 0; i < GRAcant; i++) regs[GRAbase + i] = ReadGRA(i);
for (i=0; i<SEQcant; i++)
regs[SEQbase+i]=ReadSEQ(i);
for (i = 0; i < SEQcant; i++) regs[SEQbase + i] = ReadSEQ(i);
WriteMOR(MORval);
WriteMOR(MORval);
return VGARegsCant;
return VGARegsCant;
}
/**[txh]********************************************************************
@ -173,95 +160,90 @@ int VGASaveRegs(uchar *regs, uchar *Sregs)
***************************************************************************/
void TGUI9440LoadRegs(const uchar *regs)
{
int i,Protect,DACaccess,DACaddress;
void TGUI9440LoadRegs(const uchar *regs) {
int i, Protect, DACaccess, DACaddress;
/* Enter in old mode */
WriteSEQ(0xB,0);
WriteSEQ(0xD,regs[ESEQbase]);
WriteSEQ(0xE,regs[ESEQbase+1]);
WriteGRA(0xE,regs[EGRAbase]);
/* Enter in new mode */
ReadSEQ(0xB);
WriteSEQ(0xD,regs[ESEQ_0D_new]);
//fprintf(stderr,"Escritura: %X %X\n",ReadSEQ(0x8),ReadSEQ(0xD));
/* Unprotect the registers */
Protect=regs[ESEQbase+3];
WriteSEQ(0xE,Protect | 0x80);
WriteSEQ(0xF,regs[ESEQbase+4]);
/* Enter in old mode */
WriteSEQ(0xB, 0);
WriteSEQ(0xD, regs[ESEQbase]);
WriteSEQ(0xE, regs[ESEQbase + 1]);
WriteGRA(0xE, regs[EGRAbase]);
/* Enter in new mode */
ReadSEQ(0xB);
WriteSEQ(0xD, regs[ESEQ_0D_new]);
// fprintf(stderr,"Escritura: %X %X\n",ReadSEQ(0x8),ReadSEQ(0xD));
/* Unprotect the registers */
Protect = regs[ESEQbase + 3];
WriteSEQ(0xE, Protect | 0x80);
WriteSEQ(0xF, regs[ESEQbase + 4]);
/* Enable access to the DAC */
DACaccess=regs[EGRAbase+1];
WriteGRA(0x0F,DACaccess | 4);
WriteGRA(0x23,regs[EGRAbase+2]);
WriteGRA(0x2F,regs[EGRAbase+3]);
/* Enable access to the DAC */
DACaccess = regs[EGRAbase + 1];
WriteGRA(0x0F, DACaccess | 4);
WriteGRA(0x23, regs[EGRAbase + 2]);
WriteGRA(0x2F, regs[EGRAbase + 3]);
/* These are alternative registers so I don't know if I really need to
store your content */
outportb(0x3D8,regs[SPbase+1]);
outportb(0x3D9,regs[SPbase+2]);
//fprintf(stderr,"Escritura antes 3DB: %X %X\n",ReadSEQ(0x8),ReadSEQ(0xD));
outportb(0x3DB,regs[SPbase+3]);
//fprintf(stderr,"Escritura dopo: %X %X\n",ReadSEQ(0x8),ReadSEQ(0xD));
/* These are alternative registers so I don't know if I really need to
store your content */
outportb(0x3D8, regs[SPbase + 1]);
outportb(0x3D9, regs[SPbase + 2]);
// fprintf(stderr,"Escritura antes 3DB: %X %X\n",ReadSEQ(0x8),ReadSEQ(0xD));
outportb(0x3DB, regs[SPbase + 3]);
// fprintf(stderr,"Escritura dopo: %X %X\n",ReadSEQ(0x8),ReadSEQ(0xD));
/* These extended register are located in the CRT space but they aren't
contiguous */
WriteCRT(0x19, regs[ECRTbase]); // 0 (0x19)
for (i = 1; i < 14; i++)
WriteCRT(0x1D + i, regs[ECRTbase + i]); // 1-13 (0x1D-0x2A)
WriteCRT(0x2C, regs[ECRTbase + i]); // 14
i++;
WriteCRT(0x2F, regs[ECRTbase + i]); // 15
i++;
WriteCRT(0x30, regs[ECRTbase + i]); // 16
for (i++; i < 24; i++) WriteCRT(0x22 + i, regs[ECRTbase + i]); // 17-23
for (; i < 32; i++) WriteCRT(0x28 + i, regs[ECRTbase + i]); // 24-31
WriteCRT(0x50, regs[ECRTbase + i]); // 32
/* These extended register are located in the CRT space but they aren't
contiguous */
WriteCRT(0x19,regs[ECRTbase]); // 0 (0x19)
for (i=1; i<14; i++)
WriteCRT(0x1D+i,regs[ECRTbase+i]); // 1-13 (0x1D-0x2A)
WriteCRT(0x2C,regs[ECRTbase+i]); // 14
i++;
WriteCRT(0x2F,regs[ECRTbase+i]); // 15
i++;
WriteCRT(0x30,regs[ECRTbase+i]); // 16
for (i++; i<24; i++)
WriteCRT(0x22+i,regs[ECRTbase+i]); // 17-23
for (; i<32; i++)
WriteCRT(0x28+i,regs[ECRTbase+i]); // 24-31
WriteCRT(0x50,regs[ECRTbase+i]); // 32
/* Map the DAC safetly (0x3C6 so doesn't overlap others) */
DACaddress = regs[ECRT_29];
WriteCRT(0x29, DACaddress & 0xFC);
/* Map the DAC safetly (0x3C6 so doesn't overlap others) */
DACaddress=regs[ECRT_29];
WriteCRT(0x29,DACaddress & 0xFC);
inportb(0x3C8);
outportb(0x3C6, regs[DAC_3C6]);
inportb(0x3C8);
outportb(0x3C6,regs[DAC_3C6]);
inportb(0x3C8);
inportb(0x3C6);
inportb(0x3C6);
inportb(0x3C6);
inportb(0x3C6);
outportb(0x3C6, regs[DAC_3C6_4th]);
inportb(0x3C8);
inportb(0x3C6); inportb(0x3C6); inportb(0x3C6); inportb(0x3C6);
outportb(0x3C6,regs[DAC_3C6_4th]);
outportb(0x3C8, regs[SPbase + 6]);
outportb(0x43C6, regs[SPbase + 7]);
outportb(0x43C7, regs[SPbase + 8]);
outportb(0x43C8, regs[SPbase + 9]);
outportb(0x43C9, regs[SPbase + 10]);
outportb(0x83C8, regs[SPbase + 11]);
outportb(0x3C8,regs[SPbase+6]);
outportb(0x43C6,regs[SPbase+7]);
outportb(0x43C7,regs[SPbase+8]);
outportb(0x43C8,regs[SPbase+9]);
outportb(0x43C9,regs[SPbase+10]);
outportb(0x83C8,regs[SPbase+11]);
for (i = 0; i < EDACcant; i++) WriteEDAC(i, regs[EDACbase + i]);
for (i=0; i<EDACcant; i++)
WriteEDAC(i,regs[EDACbase+i]);
/* The GER */
/* Enable it and map in memory */
WriteCRT(0x36, MODEINIT);
Putb(0x22, regs[GER_22]);
Putb(0x23, regs[GER_23]);
Putl(0x44, *((unsigned *)&regs[GER_44]));
WriteCRT(0x36, regs[ECRT_36]);
/* The GER */
/* Enable it and map in memory */
WriteCRT(0x36,MODEINIT);
Putb(0x22,regs[GER_22]);
Putb(0x23,regs[GER_23]);
Putl(0x44,*((unsigned *)&regs[GER_44]));
WriteCRT(0x36,regs[ECRT_36]);
/* Restore the DAC mapping */
WriteCRT(0x29,DACaddress);
/* Restore the DAC access */
if ((DACaccess & 4)==0)
WriteGRA(0xF,DACaccess);
/* Restore the protection */
if ((Protect & 0x80)==0)
WriteSEQ(0xE,Protect);
/* Restore the old/new mode */
if ((regs[OldNewStatus] & 0x80)==0)
WriteSEQ(0xB,0);
/* Restore the DAC mapping */
WriteCRT(0x29, DACaddress);
/* Restore the DAC access */
if ((DACaccess & 4) == 0) WriteGRA(0xF, DACaccess);
/* Restore the protection */
if ((Protect & 0x80) == 0) WriteSEQ(0xE, Protect);
/* Restore the old/new mode */
if ((regs[OldNewStatus] & 0x80) == 0) WriteSEQ(0xB, 0);
}
/**[txh]********************************************************************
@ -271,57 +253,55 @@ void TGUI9440LoadRegs(const uchar *regs)
***************************************************************************/
void VGALoadRegs(const uchar *regs,const uchar *Sregs)
{
int i;
uchar CRT11,MORval;
void VGALoadRegs(const uchar *regs, const uchar *Sregs) {
int i;
uchar CRT11, MORval;
MORval=ReadMOR();
/* Ensure we are in the color mode or the ports could be moved to 0x3Bx */
WriteMOR(MORval | 1);
/* Wait a full retrace to avoid extra noise in screen */
while (inportb(0x3DA) & 8);
while (!(inportb(0x3DA) & 8));
MORval = ReadMOR( );
/* Ensure we are in the color mode or the ports could be moved to 0x3Bx */
WriteMOR(MORval | 1);
/* Wait a full retrace to avoid extra noise in screen */
while (inportb(0x3DA) & 8)
;
while (!(inportb(0x3DA) & 8))
;
/* Screen Off to avoid funny things displayed */
WriteSEQ(0x01,regs[SEQbase+1] | 0x20);
/* Screen Off to avoid funny things displayed */
WriteSEQ(0x01, regs[SEQbase + 1] | 0x20);
/* Synchronous reset ON, we must do it or we could lose video RAM contents */
WriteSEQ(0x00,1);
for (i=2; i<SEQcant; i++)
WriteSEQ(i,regs[SEQbase+i]);
/* Synchronous reset restored */
WriteSEQ(0x00,regs[SEQbase]);
/* Synchronous reset ON, we must do it or we could lose video RAM contents
*/
WriteSEQ(0x00, 1);
for (i = 2; i < SEQcant; i++) WriteSEQ(i, regs[SEQbase + i]);
/* Synchronous reset restored */
WriteSEQ(0x00, regs[SEQbase]);
/* Deprotect CRT registers 0-7 */
CRT11=regs[CRTbase+0x11];
WriteCRT(0x11,CRT11 & 0x7F);
/* write CRT registers */
for (i=0; i<CRTcant; i++)
if (i!=0x11)
WriteCRT(i,regs[CRTbase+i]);
/* Restore the protection state */
WriteCRT(0x11,CRT11);
/* Deprotect CRT registers 0-7 */
CRT11 = regs[CRTbase + 0x11];
WriteCRT(0x11, CRT11 & 0x7F);
/* write CRT registers */
for (i = 0; i < CRTcant; i++)
if (i != 0x11) WriteCRT(i, regs[CRTbase + i]);
/* Restore the protection state */
WriteCRT(0x11, CRT11);
for (i=0; i<GRAcant; i++)
WriteGRA(i,regs[GRAbase+i]);
for (i = 0; i < GRAcant; i++) WriteGRA(i, regs[GRAbase + i]);
/******* The Attribute Registers are worst that a pain in the ass I think
the @#*$ people from the Giant Blue tried to make it hard to
understand on purpose ********/
/* Ensure we will write to the index */
inportb(ATTdir);
for (; i<ATTcant; i++)
WriteATT(i,regs[ATTbase+i]);
ATTEndReads();
/******* The Attribute Registers are worst that a pain in the ass I think
the @#*$ people from the Giant Blue tried to make it hard to
understand on purpose ********/
/* Ensure we will write to the index */
inportb(ATTdir);
for (; i < ATTcant; i++) WriteATT(i, regs[ATTbase + i]);
ATTEndReads( );
TGUI9440LoadRegs(Sregs);
TGUI9440LoadRegs(Sregs);
/* Restore MOR */
WriteMOR(regs[MORbase]);
/* Restore MOR */
WriteMOR(regs[MORbase]);
/* Restore Screen On/Off status */
WriteSEQ(0x01,regs[SEQbase+1]);
/* Restore Screen On/Off status */
WriteSEQ(0x01, regs[SEQbase + 1]);
}
#ifdef INCLUDE_OLD_INERTIA_STUFF
@ -333,23 +313,21 @@ think that's a very strange stuff.
***************************************************************************/
void ReadVSync(int *start, int *end)
{
int s,e,aux;
void ReadVSync(int *start, int *end) {
int s, e, aux;
s=ReadCRT(0x10);
aux=ReadCRT(0x7);
s|=((aux & 0x04)<<6); /* b8 */
s|=((aux & 0x80)<<2); /* b9 */
aux=ReadCRT(0x27);
s|=((aux & 0x40)<<4); /* b10 */
*start=s;
/* Only 4 bits are available: */
e=(s & 0xFFF0) | (ReadCRT(0x11) & 0xF);
/* Adjust it */
if (e<s)
e+=0x10;
*end=e;
s = ReadCRT(0x10);
aux = ReadCRT(0x7);
s |= ((aux & 0x04) << 6); /* b8 */
s |= ((aux & 0x80) << 2); /* b9 */
aux = ReadCRT(0x27);
s |= ((aux & 0x40) << 4); /* b10 */
*start = s;
/* Only 4 bits are available: */
e = (s & 0xFFF0) | (ReadCRT(0x11) & 0xF);
/* Adjust it */
if (e < s) e += 0x10;
*end = e;
}
/**[txh]********************************************************************
@ -360,19 +338,18 @@ think that's a very strange stuff.
***************************************************************************/
void SetVSync(int start, int end)
{
int a;
void SetVSync(int start, int end) {
int a;
WriteCRT(0x10,start);
a=ReadCRT(0x7) & 0x7B;
a|=((start & 0x100)>>6); /* b8 */
a|=((start & 0x200)>>2); /* b9 */
WriteCRT(0x7,a);
a=ReadCRT(0x27) & 0xBF;
a|=((start & 0x400)>>4); /* b10 */
WriteCRT(0x27,a);
WriteCRT(0x11,0x80 | (end & 0x0F));
WriteCRT(0x10, start);
a = ReadCRT(0x7) & 0x7B;
a |= ((start & 0x100) >> 6); /* b8 */
a |= ((start & 0x200) >> 2); /* b9 */
WriteCRT(0x7, a);
a = ReadCRT(0x27) & 0xBF;
a |= ((start & 0x400) >> 4); /* b10 */
WriteCRT(0x27, a);
WriteCRT(0x11, 0x80 | (end & 0x0F));
}
#endif
@ -392,7 +369,7 @@ void SetVSync(int start, int end)
*3CF.0E-old
*3C5.0D-new
*3C5.0E-new We must manipulate b7 for other registers (enable from here and
restart at the end).
restart at the end).
3CF.0E-new [No!] Have alternative and could mess the alternative.
*3C5.0F [No] (Hardware specific)
*3CF.0F We must enable b2 and restart at the end.
@ -459,5 +436,3 @@ void SetVSync(int start, int end)
The rest of the GER can change in any way because I set all the values from
call to call.
*/

File diff suppressed because it is too large Load Diff

View File

@ -12,32 +12,31 @@ terms and conditions of the FreeBE/AF project. */
#define TripleScan 8
#define QuadrupleScan 0xC
/* b4-b6 */
#define BPP8 0x00
#define BPP8 0x00
#define BPP15 0x10
#define BPP16 0x20
#define BPP24 0x30
/* b7 */
#define Interlaced 0x80
/* b31 */
#define HaveAccel2D 0x80000000
#define HaveAccel2D 0x80000000
/* This mask erase all the flags passed in the CRTC structure */
#define InternalMask 0xFFFFFF70
#define ExtractBPP(a) ((a & 0x70)>>4)
#define is8BPP 0
#define ExtractBPP(a) ((a & 0x70) >> 4)
#define is8BPP 0
#define is15BPP 1
#define is16BPP 2
#define is24BPP 3
/**** Video mode structure ****/
typedef struct
{
int flags;
ushort hDisplay,hSyncStart,hSyncEnd,hTotal;
ushort vDisplay,vSyncStart,vSyncEnd,vTotal;
ushort minBytesPerScan;
uchar ClockType;
uchar ClockValHigh,ClockValLow;
typedef struct {
int flags;
ushort hDisplay, hSyncStart, hSyncEnd, hTotal;
ushort vDisplay, vSyncStart, vSyncEnd, vTotal;
ushort minBytesPerScan;
uchar ClockType;
uchar ClockValHigh, ClockValLow;
} VideoModeStr;
extern VideoModeStr *SupportedVideoModes[];
@ -49,7 +48,7 @@ extern "C" {
#endif
void CaptureSVGAStart(void);
void Set640x480x8bpp(void);
int GetBestPitchFor(int BytesPerScan, int BytesPerPixel);
int GetBestPitchFor(int BytesPerScan, int BytesPerPixel);
void SetVideoModeH(VideoModeStr *modeInfo, int width, int bpp);
void SetTextModeVGA(void);
void ReadVSync(int *start, int *end);
@ -57,4 +56,3 @@ void SetVSync(int start, int end);
#ifdef __cplusplus
}
#endif

View File

@ -4,8 +4,7 @@ terms and conditions of the FreeBE/AF project. */
/* TGUI Alternative bank selector */
/* It select the bank when we use a 32Kb or 64Kb window */
#define DestinationSegmentAddress 0x3D8
#define SourceSegmentAddress 0x3D9
#define SourceSegmentAddress 0x3D9
#define INLINE extern inline
@ -18,12 +17,24 @@ terms and conditions of the FreeBE/AF project. */
#ifdef IOMAPPED
#define MODEINIT 0x80
INLINE void Putb(unsigned pos, uchar val) { outportb(0x2100+pos,val); }
INLINE void Putw(unsigned pos, ushort val) { outportw(0x2100+pos,val); }
INLINE void Putl(unsigned pos, unsigned val) { outportl(0x2100+pos,val); }
INLINE uchar Getb(unsigned pos) { return inportb(0x2100+pos); }
INLINE ushort Getw(unsigned pos) { return inportw(0x2100+pos); }
INLINE unsigned Getl(unsigned pos) { return inportl(0x2100+pos); }
INLINE void Putb(unsigned pos, uchar val) {
outportb(0x2100 + pos, val);
}
INLINE void Putw(unsigned pos, ushort val) {
outportw(0x2100 + pos, val);
}
INLINE void Putl(unsigned pos, unsigned val) {
outportl(0x2100 + pos, val);
}
INLINE uchar Getb(unsigned pos) {
return inportb(0x2100 + pos);
}
INLINE ushort Getw(unsigned pos) {
return inportw(0x2100 + pos);
}
INLINE unsigned Getl(unsigned pos) {
return inportl(0x2100 + pos);
}
#else
// Memory mapped
#define MODEINIT 0x81
@ -31,12 +42,24 @@ INLINE unsigned Getl(unsigned pos) { return inportl(0x2100+pos); }
#define MMIOBASE 0xB7F00
//#define MMIOBASE 0xBFF00
//#define MODEINIT 0x82
INLINE void Putb(unsigned pos, uchar val) { _farnspokeb(MMIOBASE+pos,val); }
INLINE void Putw(unsigned pos, ushort val) { _farnspokew(MMIOBASE+pos,val); }
INLINE void Putl(unsigned pos, unsigned val) { _farnspokel(MMIOBASE+pos,val); }
INLINE uchar Getb(unsigned pos) { return _farnspeekb(MMIOBASE+pos); }
INLINE ushort Getw(unsigned pos) { return _farnspeekw(MMIOBASE+pos); }
INLINE unsigned Getl(unsigned pos) { return _farnspeekl(MMIOBASE+pos); }
INLINE void Putb(unsigned pos, uchar val) {
_farnspokeb(MMIOBASE + pos, val);
}
INLINE void Putw(unsigned pos, ushort val) {
_farnspokew(MMIOBASE + pos, val);
}
INLINE void Putl(unsigned pos, unsigned val) {
_farnspokel(MMIOBASE + pos, val);
}
INLINE uchar Getb(unsigned pos) {
return _farnspeekb(MMIOBASE + pos);
}
INLINE ushort Getw(unsigned pos) {
return _farnspeekw(MMIOBASE + pos);
}
INLINE unsigned Getl(unsigned pos) {
return _farnspeekl(MMIOBASE + pos);
}
#else
extern unsigned MMIOBASE;
/*
@ -53,12 +76,24 @@ that's normal in the "unoptimizer" module of gcc ;-)
Memory mapped I/O generates much compact code and I guess faster too, I
must test it.
*/
INLINE void Putb(unsigned pos, uchar val) { *((volatile uchar *)(MMIOBASE+pos))=val; }
INLINE void Putw(unsigned pos, ushort val) { *((volatile ushort *)(MMIOBASE+pos))=val; }
INLINE void Putl(unsigned pos, unsigned val) { *((volatile unsigned *)(MMIOBASE+pos))=val; }
INLINE uchar Getb(unsigned pos) { return *((volatile uchar *)(MMIOBASE+pos)); }
INLINE ushort Getw(unsigned pos) { return *((volatile ushort *)(MMIOBASE+pos)); }
INLINE unsigned Getl(unsigned pos) { return *((volatile unsigned *)(MMIOBASE+pos)); }
INLINE void Putb(unsigned pos, uchar val) {
*((volatile uchar *)(MMIOBASE + pos)) = val;
}
INLINE void Putw(unsigned pos, ushort val) {
*((volatile ushort *)(MMIOBASE + pos)) = val;
}
INLINE void Putl(unsigned pos, unsigned val) {
*((volatile unsigned *)(MMIOBASE + pos)) = val;
}
INLINE uchar Getb(unsigned pos) {
return *((volatile uchar *)(MMIOBASE + pos));
}
INLINE ushort Getw(unsigned pos) {
return *((volatile ushort *)(MMIOBASE + pos));
}
INLINE unsigned Getl(unsigned pos) {
return *((volatile unsigned *)(MMIOBASE + pos));
}
#endif
#endif
@ -83,22 +118,22 @@ INLINE unsigned Getl(unsigned pos) { return *((volatile unsigned *)(MMIOBASE+pos
#define GEDFR2 0x2A
#define GEDFR3 0x2B
/* All joined in one 32 bits: */
#define PatFromDisplay 0x00000002
#define PatFromSystem 0
#define SourceDataDisplay 0x00000004
#define SourceDataSystem 0
#define PatMono 0x00000020
#define PatColor 0
#define SourceDataMono 0x00000040
#define SourceDataColor 0
#define YDecreasing 0x00000100
#define XDecreasing 0x00000200
#define YMajor 0x00000400
#define TransparentEnable 0x00001000
#define TransparentReverse 0x00002000
#define SolidDrawing 0x00004000
#define PatternedDrawing 0
#define PatternedLines 0x00008000
#define PatFromDisplay 0x00000002
#define PatFromSystem 0
#define SourceDataDisplay 0x00000004
#define SourceDataSystem 0
#define PatMono 0x00000020
#define PatColor 0
#define SourceDataMono 0x00000040
#define SourceDataColor 0
#define YDecreasing 0x00000100
#define XDecreasing 0x00000200
#define YMajor 0x00000400
#define TransparentEnable 0x00001000
#define TransparentReverse 0x00002000
#define SolidDrawing 0x00004000
#define PatternedDrawing 0
#define PatternedLines 0x00008000
// Foreground Color 0 (Low 8 bits) and 1
#define FCR0 0x2C
#define FCR1 0x2D
@ -144,74 +179,66 @@ INLINE unsigned Getl(unsigned pos) { return *((volatile unsigned *)(MMIOBASE+pos
// Registers 0x80 to 0xFF are for the pattern
// ************************* End of GER values *****************************
// ****** Commands for GECoR ******
#define NOP 0
#define BitBLT 1
#define NOP 0
#define BitBLT 1
#define ScanLine 3
// Bresenham Line
#define BLine 4
#define BLine 4
// Short vector
#define SVector 5
#define SVector 5
extern unsigned long linearAddress;
#define Screenb ((uchar *)linearAddress)
#define Screenw ((ushort *)linearAddress)
#define Screenl ((unsigned *)linearAddress)
#define SetXLocation(a) Putw(DXL0,a)
#define SetYLocation(a) Putw(DYL0,a)
#define SetXYLocation(a,b) Putl(DXL0,(a) | ((b)<<16))
#define SetXYSource(a,b) Putl(SXL0,(a) | ((b)<<16))
#define SetForeground(a) Putw(FCR0,a)
#define SetBackground(a) Putw(BCR0,a)
#define SetForegroundMix(a) Putb(FMR,a)
#define SetPenStyleMask(a) Putw(PSMR0,a)
#define SetStyleMaskRepeatCount(a) Putb(SMRC,a)
#define SetXLocation(a) Putw(DXL0, a)
#define SetYLocation(a) Putw(DYL0, a)
#define SetXYLocation(a, b) Putl(DXL0, (a) | ((b) << 16))
#define SetXYSource(a, b) Putl(SXL0, (a) | ((b) << 16))
#define SetForeground(a) Putw(FCR0, a)
#define SetBackground(a) Putw(BCR0, a)
#define SetForegroundMix(a) Putb(FMR, a)
#define SetPenStyleMask(a) Putw(PSMR0, a)
#define SetStyleMaskRepeatCount(a) Putb(SMRC, a)
//#define SAFE_IO
INLINE
void SetLineSteps(int deltaY, int deltaX)
{
// Diagonal step is dY-dX, Axial step is dY both 16 bits signed
Putl(SXL0,((deltaY-deltaX) & 0xFFFF) | (deltaY<<16));
void SetLineSteps(int deltaY, int deltaX) {
// Diagonal step is dY-dX, Axial step is dY both 16 bits signed
Putl(SXL0, ((deltaY - deltaX) & 0xFFFF) | (deltaY << 16));
}
INLINE
void SetErrAndLen(int deltaY, int deltaX)
{
// Initial error is 2*dY-dX (signed), Length is ABS(dX) (unsigned)
Putl(ODXL0,((2*deltaY-deltaX) & 0xFFFF) | (deltaX<<16));
}
INLINE
void SetDimensions(int width, int height)
{
Putl(ODXL0,width | (height<<16));
void SetErrAndLen(int deltaY, int deltaX) {
// Initial error is 2*dY-dX (signed), Length is ABS(dX) (unsigned)
Putl(ODXL0, ((2 * deltaY - deltaX) & 0xFFFF) | (deltaX << 16));
}
INLINE
void SetWidth_1(int width)
{
Putw(ODXL0,width-1);
void SetDimensions(int width, int height) {
Putl(ODXL0, width | (height << 16));
}
INLINE
void SetWidth(int width)
{
Putw(ODXL0,width);
void SetWidth_1(int width) {
Putw(ODXL0, width - 1);
}
INLINE
void SetDrawFlags(int dir)
{
Putl(GEDFR0,dir);
void SetWidth(int width) {
Putw(ODXL0, width);
}
INLINE
void SetPatternLocation(unsigned offset)
{
Putw(PLR0,offset);
void SetDrawFlags(int dir) {
Putl(GEDFR0, dir);
}
INLINE
void SetPatternLocation(unsigned offset) {
Putw(PLR0, offset);
}
/*
@ -225,9 +252,9 @@ so we can have a queue of command in memory and transfer it to the TGUI
when the GER is ready.
*/
INLINE
void WaitGE(void)
{
while (Getb(GESR) & 0x80);
void WaitGE(void) {
while (Getb(GESR) & 0x80)
;
}
/*
@ -235,9 +262,9 @@ void WaitGE(void)
command will use the new settings ;-)
*/
INLINE
void WaitGEfifo(void)
{
while (Getb(GESR) & 0x20);
void WaitGEfifo(void) {
while (Getb(GESR) & 0x20)
;
}
/*
@ -247,84 +274,76 @@ during the Blit the CPU can't access the VRAM.
that's not the FreeBE/AF case.
*/
INLINE
void DoBlit(void)
{
Putb(GECoR,BitBLT);
#ifdef WAITTILLIDLE_NOT_NEEDED
WaitGE();
#endif
void DoBlit(void) {
Putb(GECoR, BitBLT);
#ifdef WAITTILLIDLE_NOT_NEEDED
WaitGE( );
#endif
}
INLINE
void DoBlitDontWait(void)
{
Putb(GECoR,BitBLT);
void DoBlitDontWait(void) {
Putb(GECoR, BitBLT);
}
INLINE
void DoBresenhamLine(void)
{
Putb(GECoR,BLine);
void DoBresenhamLine(void) {
Putb(GECoR, BLine);
}
INLINE
void DoScan(void)
{
Putb(GECoR,ScanLine);
void DoScan(void) {
Putb(GECoR, ScanLine);
}
INLINE
void SetNewMode(void)
{
ReadSEQ(0xB);
void SetNewMode(void) {
ReadSEQ(0xB);
}
INLINE
void SetOldMode(void)
{
WriteSEQ(0xB,0);
void SetOldMode(void) {
WriteSEQ(0xB, 0);
}
/**************************** RASTER OPERATIONS ****************************/
/* Most of them are for solid colors or patterns only */
#define ROP_0 0x00
#define ROP_0 0x00
#define ROP_n_PoD 0x05
#define ROP_nPaD 0x0A
#define ROP_nP 0x0F
#define ROP_PanD 0x50
#define ROP_nD 0x55
#define ROP_PxD 0x5A
#define ROP_nPaD 0x0A
#define ROP_nP 0x0F
#define ROP_PanD 0x50
#define ROP_nD 0x55
#define ROP_PxD 0x5A
#define ROP_n_PaD 0x5F
#define ROP_PaD 0xA0
#define ROP_PaD 0xA0
#define ROP_n_PxD 0xA5
#define ROP_D 0xAA
#define ROP_nPoD 0xAF
#define ROP_P 0xF0
#define ROP_PonD 0xF5
#define ROP_PoD 0xFA
#define ROP_1 0xFF
#define ROP_D 0xAA
#define ROP_nPoD 0xAF
#define ROP_P 0xF0
#define ROP_PonD 0xF5
#define ROP_PoD 0xFA
#define ROP_1 0xFF
/* These are for image blits only */
/* 0x00 is ROP_0 */
#define ROP_n_SoD 0x11
#define ROP_nSaD 0x22
#define ROP_nS 0x33
#define ROP_SanD 0x44
#define ROP_nSaD 0x22
#define ROP_nS 0x33
#define ROP_SanD 0x44
/* 0x55 is ROP_nD */
#define ROP_SxD 0x66
#define ROP_SxD 0x66
#define ROP_n_SaD 0x77
#define ROP_SaD 0x88
#define ROP_SaD 0x88
#define ROP_n_SxD 0x99
/* 0xAA is ROP_D */
#define ROP_nSoD 0xBB
#define ROP_S 0xCC
#define ROP_SonD 0xDD
#define ROP_SoD 0xEE
#define ROP_nSoD 0xBB
#define ROP_S 0xCC
#define ROP_SonD 0xDD
#define ROP_SoD 0xEE
/* 0xFF is ROP_1 */
#define VClockDiv2 0x20
#define VClockDiv4 0x40
#define VClockDiv2 0x20
#define VClockDiv4 0x40
#define VClockDiv1_5 0x60
#define DClockDiv2 0x80
#define DClockDiv2 0x80

View File

@ -3,88 +3,75 @@
terms and conditions of the FreeBE/AF project. */
/* (I don't take care about mono by now) */
/* VGA Atttibute controller */
#define ATTindex 0x3C0
#define ATTdataW 0x3C0
#define ATTdataR 0x3C1
#define ATTdir 0x3DA
#define ATTindex 0x3C0
#define ATTdataW 0x3C0
#define ATTdataR 0x3C1
#define ATTdir 0x3DA
/* Miscellaneous Output Register */
#define MORdataW 0x3C2
#define MORdataR 0x3CC
#define MORdataW 0x3C2
#define MORdataR 0x3CC
/* VGA Sequencer Registers */
#define Sequencer 0x3C4
#define SequencerIndex 0x3C4
#define SequencerData 0x3C5
#define Sequencer 0x3C4
#define SequencerIndex 0x3C4
#define SequencerData 0x3C5
/* VGA Palette Registers */
#define ReadDataAddress 0x3C7
#define WriteDataAddress 0x3C8
#define PaletteDataRegister 0x3C9
#define ReadDataAddress 0x3C7
#define WriteDataAddress 0x3C8
#define PaletteDataRegister 0x3C9
/* VGA Graphics Controller Registers */
#define GraphicsController 0x3CE
#define GraphicsControllerIndex 0x3CE
#define GraphicsControllerData 0x3CF
#define GraphicsController 0x3CE
#define GraphicsControllerIndex 0x3CE
#define GraphicsControllerData 0x3CF
/* VGA CRT Controller Register */
#define CRTController 0x3D4
#define CRTControllerIndex 0x3D4
#define CRTControllerData 0x3D5
#define CRTController 0x3D4
#define CRTControllerIndex 0x3D4
#define CRTControllerData 0x3D5
/* VGA Input Status Register 1 */
#define InputStatusRegister1 0x3DA
#define InputStatusRegister1 0x3DA
/* Trident's DAC/Clock */
#define EDACindex 0x83C8
#define EDACdata 0x83C6
#define EDACindex 0x83C8
#define EDACdata 0x83C6
//#define SAFE_IO
#ifdef SAFE_IO
/* C approach, safier than my assembler ;-) */
extern inline
uchar ReadCRT(uchar index)
{
outportb(CRTControllerIndex,index);
return inportb(CRTControllerData);
extern inline uchar ReadCRT(uchar index) {
outportb(CRTControllerIndex, index);
return inportb(CRTControllerData);
}
extern inline
uchar ReadGRA(uchar index)
{
outportb(GraphicsControllerIndex,index);
return inportb(GraphicsControllerData);
extern inline uchar ReadGRA(uchar index) {
outportb(GraphicsControllerIndex, index);
return inportb(GraphicsControllerData);
}
extern inline
uchar ReadSEQ(uchar index)
{
outportb(SequencerIndex,index);
return inportb(SequencerData);
extern inline uchar ReadSEQ(uchar index) {
outportb(SequencerIndex, index);
return inportb(SequencerData);
}
extern inline
void WriteCRT(uchar index, uchar value)
{
outportb(CRTControllerIndex,index);
outportb(CRTControllerData,value);
extern inline void WriteCRT(uchar index, uchar value) {
outportb(CRTControllerIndex, index);
outportb(CRTControllerData, value);
}
extern inline
void WriteGRA(uchar index, uchar value)
{
outportb(GraphicsControllerIndex,index);
outportb(GraphicsControllerData,value);
extern inline void WriteGRA(uchar index, uchar value) {
outportb(GraphicsControllerIndex, index);
outportb(GraphicsControllerData, value);
}
extern inline
void WriteSEQ(uchar index, uchar value)
{
outportb(SequencerIndex,index);
outportb(SequencerData,value);
extern inline void WriteSEQ(uchar index, uchar value) {
outportb(SequencerIndex, index);
outportb(SequencerData, value);
}
extern inline
void WaitVRT()
{
while (inportb(InputStatusRegister1) & 8);
while (!(inportb(InputStatusRegister1) & 8));
extern inline void WaitVRT( ) {
while (inportb(InputStatusRegister1) & 8)
;
while (!(inportb(InputStatusRegister1) & 8))
;
}
#else
@ -94,11 +81,9 @@ void WaitVRT()
They save 524 bytes in the driver (1.89%).
*/
extern inline
uchar ReadCRT(uchar index)
{
uchar a asm("%eax");
a=index;
extern inline uchar ReadCRT(uchar index) {
uchar a asm("%eax");
a = index;
asm volatile ("
outb %%al,%%dx
incl %%edx
@ -107,12 +92,9 @@ uchar ReadCRT(uchar index)
return a;
}
extern inline
uchar ReadGRA(uchar index)
{
uchar a asm("%eax");
a=index;
extern inline uchar ReadGRA(uchar index) {
uchar a asm("%eax");
a = index;
asm volatile ("
outb %%al,%%dx
incl %%edx
@ -121,11 +103,9 @@ uchar ReadGRA(uchar index)
return a;
}
extern inline
uchar ReadSEQ(uchar index)
{
uchar a asm("%eax");
a=index;
extern inline uchar ReadSEQ(uchar index) {
uchar a asm("%eax");
a = index;
asm volatile ("
outb %%al,%%dx
incl %%edx
@ -134,37 +114,28 @@ uchar ReadSEQ(uchar index)
return a;
}
extern inline
void WriteCRT(uchar index, uchar value)
{
extern inline void WriteCRT(uchar index, uchar value) {
asm volatile ("
movb %0,%%ah
outw %%ax,%%dx
" : : "qi" (value), "a" (index), "d" (CRTController) : "%eax");
}
extern inline
void WriteGRA(uchar index, uchar value)
{
extern inline void WriteGRA(uchar index, uchar value) {
asm volatile ("
movb %0,%%ah
outw %%ax,%%dx
" : : "qi" (value), "a" (index), "d" (GraphicsController) : "%eax");
}
extern inline
void WriteSEQ(uchar index, uchar value)
{
extern inline void WriteSEQ(uchar index, uchar value) {
asm volatile ("
movb %0,%%ah
outw %%ax,%%dx
" : : "qi" (value), "a" (index), "d" (Sequencer) : "%eax");
}
extern inline
void WaitVRT()
{
extern inline void WaitVRT( ) {
asm("
1:
inb %%dx,%%al
@ -180,69 +151,51 @@ void WaitVRT()
#endif
extern inline
uchar ReadATT(int index)
{
/* Ensure we will write to the index */
inportb(ATTdir);
/* Set the index and disable the screen or we will read nothing */
outportb(ATTindex,index);
return inportb(ATTdataR);
extern inline uchar ReadATT(int index) {
/* Ensure we will write to the index */
inportb(ATTdir);
/* Set the index and disable the screen or we will read nothing */
outportb(ATTindex, index);
return inportb(ATTdataR);
}
extern inline
void ATTEndReads(void)
{
/* Ensure we will write to the index */
inportb(ATTdir);
/* Enable the screen */
outportb(ATTindex,0x20);
extern inline void ATTEndReads(void) {
/* Ensure we will write to the index */
inportb(ATTdir);
/* Enable the screen */
outportb(ATTindex, 0x20);
}
extern inline
void WriteATT(int index, int val)
{
outportb(ATTindex,index);
outportb(ATTdataW,val);
extern inline void WriteATT(int index, int val) {
outportb(ATTindex, index);
outportb(ATTdataW, val);
}
extern inline
uchar ReadMOR(void)
{
return inportb(MORdataR);
extern inline uchar ReadMOR(void) {
return inportb(MORdataR);
}
extern inline
void WriteMOR(int val)
{
outportb(MORdataW,val);
extern inline void WriteMOR(int val) {
outportb(MORdataW, val);
}
extern inline
uchar ReadEDAC(int index)
{
outportb(EDACindex,index);
return inportb(EDACdata);
extern inline uchar ReadEDAC(int index) {
outportb(EDACindex, index);
return inportb(EDACdata);
}
extern inline
void WriteEDAC(int index, int val)
{
outportb(EDACindex,index);
outportb(EDACdata,val);
extern inline void WriteEDAC(int index, int val) {
outportb(EDACindex, index);
outportb(EDACdata, val);
}
extern inline
void RPF_SetPalRange(unsigned char *_pal_ptr, int color, int cant)
{
__asm__("
outb %%al,%%dx
incl %%edx
cli
rep
outsb
sti"
: : "c" (cant*3), "S" (_pal_ptr), "a" (color), "d" (0x3C8)
: "%eax", "%ecx", "%edx", "%esi");
extern inline void RPF_SetPalRange(unsigned char *_pal_ptr, int color,
int cant) {
__asm__("
outb %
% al,
% % dx incl % % edx cli rep outsb sti "
:
: "c"(cant * 3), "S"(_pal_ptr), "a"(color), "d"(0x3C8)
: "%eax", "%ecx", "%edx", "%esi");
}

View File

@ -1,7 +1,7 @@
/*
* ______ ____ ______ _____ ______
* ______ ____ ______ _____ ______
* | ____| | _ \| ____| / / _ \| ____|
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | __| '__/ _ \/ _ \ _ <| __| / /| _ | __|
* | | | | | __/ __/ |_) | |____ / / | | | | |
* |_| |_| \___|\___|____/|______/_/ |_| |_|_|
@ -14,59 +14,47 @@
* See freebe.txt for copyright information.
*/
// #define NO_HWPTR
#include <pc.h>
#include "vbeaf.h"
/* chipset information */
int chip_id = 0;
char *descriptions[] = { "TVGA 8900CL/D", "TVGA 9000i", "TVGA 9200CXr",
"TVGA LCD9100B", "TVGA GUI9420", "TVGA LX8200",
"TVGA 9400CXi", "TVGA LCD9320", "Unknown",
"TVGA GUI9420", "TVGA GUI9660", "TVGA GUI9440",
"TVGA GUI9430", "TVGA 9000C" };
char *descriptions[] =
{
"TVGA 8900CL/D", "TVGA 9000i", "TVGA 9200CXr",
"TVGA LCD9100B", "TVGA GUI9420", "TVGA LX8200", "TVGA 9400CXi",
"TVGA LCD9320", "Unknown", "TVGA GUI9420", "TVGA GUI9660",
"TVGA GUI9440", "TVGA GUI9430", "TVGA 9000C"
};
#define TV_LAST 13
#define TV_LAST 13
/* driver function prototypes */
void DualSetBank32();
void DualSetBank32End();
void DualSetBank32( );
void DualSetBank32End( );
void DualSetBank(AF_DRIVER *af, long bank);
void SingleSetBank32();
void SingleSetBank32End();
void SingleSetBank32( );
void SingleSetBank32End( );
void SingleSetBank(AF_DRIVER *af, long bank);
int ExtStub();
int ExtStub( );
long GetVideoModeInfo(AF_DRIVER *af, short mode, AF_MODE_INFO *modeInfo);
long SetVideoMode(AF_DRIVER *af, short mode, long virtualX, long virtualY, long *bytesPerLine, int numBuffers, AF_CRTCInfo *crtc);
long SetVideoMode(AF_DRIVER *af, short mode, long virtualX, long virtualY,
long *bytesPerLine, int numBuffers, AF_CRTCInfo *crtc);
void RestoreTextMode(AF_DRIVER *af);
long GetClosestPixelClock(AF_DRIVER *af, short mode, unsigned long pixelClock);
void SaveRestoreState(AF_DRIVER *af, int subfunc, void *saveBuf);
void SetDisplayStart(AF_DRIVER *af, long x, long y, long waitVRT);
void SetActiveBuffer(AF_DRIVER *af, long index);
void SetVisibleBuffer(AF_DRIVER *af, long index, long waitVRT);
int GetDisplayStartStatus(AF_DRIVER *af);
void SetPaletteData(AF_DRIVER *af, AF_PALETTE *pal, long num, long index, long waitVRT);
int GetDisplayStartStatus(AF_DRIVER *af);
void SetPaletteData(AF_DRIVER *af, AF_PALETTE *pal, long num, long index,
long waitVRT);
/* list which ports we are going to access (only needed under Linux) */
unsigned short ports_table[] = { 0xFFFF };
/* internal driver state variables */
int af_bpp;
int af_width;
@ -77,375 +65,319 @@ int af_scroll_x;
int af_scroll_y;
int af_bank;
/* FreeBE/AF extension allowing farptr access to video memory */
FAF_HWPTR_DATA hwptr;
/* list of available video modes */
typedef struct VIDEO_MODE
{
int w, h;
int bpp;
int num;
typedef struct VIDEO_MODE {
int w, h;
int bpp;
int num;
} VIDEO_MODE;
VIDEO_MODE mode_list[] = { { 640, 400, 8, 0x5C },
{ 640, 480, 8, 0x5D },
{ 800, 600, 8, 0x5E },
{ 1024, 768, 8, 0x62 } };
VIDEO_MODE mode_list[] =
{
{ 640, 400, 8, 0x5C },
{ 640, 480, 8, 0x5D },
{ 800, 600, 8, 0x5E },
{ 1024, 768, 8, 0x62 }
};
#define NUM_MODES (int)(sizeof(mode_list)/sizeof(VIDEO_MODE))
short available_modes[NUM_MODES+1] = { 1, 2, 3, 4, -1 };
#define NUM_MODES (int)(sizeof(mode_list) / sizeof(VIDEO_MODE))
short available_modes[NUM_MODES + 1] = { 1, 2, 3, 4, -1 };
/* detect:
* Detects the presence of a Trident card.
*/
char *detect(unsigned long *vidmem)
{
int old1, old2, val;
char *name = NULL;
char *detect(unsigned long *vidmem) {
int old1, old2, val;
char *name = NULL;
old1 = read_vga_register(0x3C4, 0x0B);
write_vga_register(0x3C4, 0x0B, 0); /* force old mode registers */
chip_id = inportb(0x3C5); /* now we have the ID */
old1 = read_vga_register(0x3C4, 0x0B);
write_vga_register(0x3C4, 0x0B, 0); /* force old mode registers */
chip_id = inportb(0x3C5); /* now we have the ID */
old2 = read_vga_register(0x3C4, 0x0E);
outportb(0x3C4+1, old2^0x55);
val = inportb(0x3C5);
outportb(0x3C5, old2);
old2 = read_vga_register(0x3C4, 0x0E);
outportb(0x3C4 + 1, old2 ^ 0x55);
val = inportb(0x3C5);
outportb(0x3C5, old2);
if (((val^old2) & 0x0F) == 7) { /* if bit 2 is inverted... */
outportb(0x3C5, old2^2); /* we're dealing with Trident */
if (((val ^ old2) & 0x0F) == 7) { /* if bit 2 is inverted... */
outportb(0x3C5, old2 ^ 2); /* we're dealing with Trident */
if (chip_id <= 2) /* don't like 8800 chips */
return FALSE;
if (chip_id <= 2) /* don't like 8800 chips */
return FALSE;
val = read_vga_register(0x3D4, 0x1F); /* determine the memory size */
switch (val & 3) {
case 0: *vidmem = 256; break;
case 1: *vidmem = 512; break;
case 2: *vidmem = 768; break;
case 3: if ((chip_id >= 0x33) && (val & 4))
*vidmem = 2048;
else
*vidmem = 1024;
break;
}
val = read_vga_register(0x3D4, 0x1F); /* determine the memory size */
switch (val & 3) {
case 0: *vidmem = 256; break;
case 1: *vidmem = 512; break;
case 2: *vidmem = 768; break;
case 3:
if ((chip_id >= 0x33) && (val & 4))
*vidmem = 2048;
else
*vidmem = 1024;
break;
}
/* provide user with a description of the chip s/he has */
if ((chip_id == 0x33) && (read_vga_register(0x3D4, 0x28) & 0x80))
/* is it TVGA 9000C */
name = descriptions[TV_LAST];
else if (chip_id >= 0x33)
name = descriptions[((chip_id & 0xF0) >> 4) - 3];
else {
switch (chip_id) {
case 3: name = "TR 8900B"; break;
case 4: name = "TVGA 8900C"; break;
case 0x13: name = "TVGA 8900C"; break;
case 0x23: name = "TR 9000"; break;
default: name = "Unknown"; break;
}
}
/* provide user with a description of the chip s/he has */
if ((chip_id == 0x33) && (read_vga_register(0x3D4, 0x28) & 0x80))
/* is it TVGA 9000C */
name = descriptions[TV_LAST];
else if (chip_id >= 0x33)
name = descriptions[((chip_id & 0xF0) >> 4) - 3];
else {
switch (chip_id) {
case 3: name = "TR 8900B"; break;
case 4: name = "TVGA 8900C"; break;
case 0x13: name = "TVGA 8900C"; break;
case 0x23: name = "TR 9000"; break;
default: name = "Unknown"; break;
}
}
return name;
}
return name;
}
write_vga_register(0x3C4, 0x0B, old1);
return NULL;
write_vga_register(0x3C4, 0x0B, old1);
return NULL;
}
/* SetupDriver:
* Fills in our driver header block.
*/
int SetupDriver(AF_DRIVER *af)
{
char *name;
int i;
int SetupDriver(AF_DRIVER *af) {
char *name;
int i;
name = detect(&af->TotalMemory);
name = detect(&af->TotalMemory);
if (!name)
return 1;
if (!name) return 1;
i = 0;
while (af->OemVendorName[i])
i++;
i = 0;
while (af->OemVendorName[i]) i++;
af->OemVendorName[i++] = ',';
af->OemVendorName[i++] = ' ';
af->OemVendorName[i++] = ',';
af->OemVendorName[i++] = ' ';
while (*name)
af->OemVendorName[i++] = *(name++);
while (*name) af->OemVendorName[i++] = *(name++);
af->OemVendorName[i] = 0;
af->OemVendorName[i] = 0;
af->AvailableModes = available_modes;
af->AvailableModes = available_modes;
af->Attributes = (afHaveMultiBuffer |
afHaveVirtualScroll |
afHaveBankedBuffer);
af->Attributes =
(afHaveMultiBuffer | afHaveVirtualScroll | afHaveBankedBuffer);
af->BankSize = 64;
af->BankedBasePtr = 0xA0000;
af->BankSize = 64;
af->BankedBasePtr = 0xA0000;
af->IOPortsTable = ports_table;
af->IOPortsTable = ports_table;
if (chip_id >= 0x33) {
af->SetBank = DualSetBank;
af->SetBank32 = DualSetBank32;
af->SetBank32Len = (long)DualSetBank32End - (long)DualSetBank32;
}
else {
af->SetBank = SingleSetBank;
af->SetBank32 = SingleSetBank32;
af->SetBank32Len = (long)SingleSetBank32End - (long)SingleSetBank32;
}
if (chip_id >= 0x33) {
af->SetBank = DualSetBank;
af->SetBank32 = DualSetBank32;
af->SetBank32Len = (long)DualSetBank32End - (long)DualSetBank32;
} else {
af->SetBank = SingleSetBank;
af->SetBank32 = SingleSetBank32;
af->SetBank32Len = (long)SingleSetBank32End - (long)SingleSetBank32;
}
af->SupplementalExt = ExtStub;
af->GetVideoModeInfo = GetVideoModeInfo;
af->SetVideoMode = SetVideoMode;
af->RestoreTextMode = RestoreTextMode;
af->GetClosestPixelClock = GetClosestPixelClock;
af->SaveRestoreState = SaveRestoreState;
af->SetDisplayStart = SetDisplayStart;
af->SetActiveBuffer = SetActiveBuffer;
af->SetVisibleBuffer = SetVisibleBuffer;
af->GetDisplayStartStatus = GetDisplayStartStatus;
af->SetPaletteData = SetPaletteData;
af->SupplementalExt = ExtStub;
af->GetVideoModeInfo = GetVideoModeInfo;
af->SetVideoMode = SetVideoMode;
af->RestoreTextMode = RestoreTextMode;
af->GetClosestPixelClock = GetClosestPixelClock;
af->SaveRestoreState = SaveRestoreState;
af->SetDisplayStart = SetDisplayStart;
af->SetActiveBuffer = SetActiveBuffer;
af->SetVisibleBuffer = SetVisibleBuffer;
af->GetDisplayStartStatus = GetDisplayStartStatus;
af->SetPaletteData = SetPaletteData;
return 0;
return 0;
}
/* InitDriver:
* The second thing to be called during the init process, after the
* The second thing to be called during the init process, after the
* application has mapped all the memory and I/O resources we need.
*/
int InitDriver(AF_DRIVER *af)
{
hwptr_init(hwptr.IOMemMaps[0], af->IOMemMaps[0]);
hwptr_init(hwptr.IOMemMaps[1], af->IOMemMaps[1]);
hwptr_init(hwptr.IOMemMaps[2], af->IOMemMaps[2]);
hwptr_init(hwptr.IOMemMaps[3], af->IOMemMaps[3]);
hwptr_init(hwptr.BankedMem, af->BankedMem);
hwptr_init(hwptr.LinearMem, af->LinearMem);
int InitDriver(AF_DRIVER *af) {
hwptr_init(hwptr.IOMemMaps[0], af->IOMemMaps[0]);
hwptr_init(hwptr.IOMemMaps[1], af->IOMemMaps[1]);
hwptr_init(hwptr.IOMemMaps[2], af->IOMemMaps[2]);
hwptr_init(hwptr.IOMemMaps[3], af->IOMemMaps[3]);
hwptr_init(hwptr.BankedMem, af->BankedMem);
hwptr_init(hwptr.LinearMem, af->LinearMem);
return 0;
return 0;
}
/* FreeBEX:
* Returns an interface structure for the requested FreeBE/AF extension.
*/
void *FreeBEX(AF_DRIVER *af, unsigned long id)
{
switch (id) {
void *FreeBEX(AF_DRIVER *af, unsigned long id) {
switch (id) {
#ifndef NO_HWPTR
#ifndef NO_HWPTR
case FAFEXT_HWPTR:
/* allow farptr access to video memory */
return &hwptr;
case FAFEXT_HWPTR:
/* allow farptr access to video memory */
return &hwptr;
#endif
#endif
default:
return NULL;
}
default: return NULL;
}
}
/* ExtStub:
* Vendor-specific extension hook: we don't provide any.
*/
int ExtStub()
{
return 0;
int ExtStub( ) {
return 0;
}
/* GetVideoModeInfo:
* Retrieves information about this video mode, returning zero on success
* or -1 if the mode is invalid.
*/
long GetVideoModeInfo(AF_DRIVER *af, short mode, AF_MODE_INFO *modeInfo)
{
VIDEO_MODE *info;
int i;
long GetVideoModeInfo(AF_DRIVER *af, short mode, AF_MODE_INFO *modeInfo) {
VIDEO_MODE *info;
int i;
if ((mode <= 0) || (mode > NUM_MODES))
return -1;
if ((mode <= 0) || (mode > NUM_MODES)) return -1;
info = &mode_list[mode-1];
info = &mode_list[mode - 1];
for (i=0; i<(int)sizeof(AF_MODE_INFO); i++)
((char *)modeInfo)[i] = 0;
for (i = 0; i < (int)sizeof(AF_MODE_INFO); i++) ((char *)modeInfo)[i] = 0;
modeInfo->Attributes = (afHaveMultiBuffer |
afHaveVirtualScroll |
afHaveBankedBuffer);
modeInfo->Attributes =
(afHaveMultiBuffer | afHaveVirtualScroll | afHaveBankedBuffer);
modeInfo->XResolution = info->w;
modeInfo->YResolution = info->h;
modeInfo->BitsPerPixel = info->bpp;
modeInfo->XResolution = info->w;
modeInfo->YResolution = info->h;
modeInfo->BitsPerPixel = info->bpp;
modeInfo->MaxBuffers = (af->TotalMemory*1024) /
(info->w*info->h*BYTES_PER_PIXEL(info->bpp));
modeInfo->MaxBuffers = (af->TotalMemory * 1024) /
(info->w * info->h * BYTES_PER_PIXEL(info->bpp));
if (info->w > 1024) {
modeInfo->MaxBytesPerScanLine = 2048*BYTES_PER_PIXEL(info->bpp);
modeInfo->MaxScanLineWidth = 2048;
}
else {
modeInfo->MaxBytesPerScanLine = 1024*BYTES_PER_PIXEL(info->bpp);
modeInfo->MaxScanLineWidth = 1024;
}
if (info->w > 1024) {
modeInfo->MaxBytesPerScanLine = 2048 * BYTES_PER_PIXEL(info->bpp);
modeInfo->MaxScanLineWidth = 2048;
} else {
modeInfo->MaxBytesPerScanLine = 1024 * BYTES_PER_PIXEL(info->bpp);
modeInfo->MaxScanLineWidth = 1024;
}
modeInfo->BytesPerScanLine = info->w*BYTES_PER_PIXEL(info->bpp);
modeInfo->BnkMaxBuffers = modeInfo->MaxBuffers;
modeInfo->BytesPerScanLine = info->w * BYTES_PER_PIXEL(info->bpp);
modeInfo->BnkMaxBuffers = modeInfo->MaxBuffers;
modeInfo->MaxPixelClock = 135000000;
modeInfo->MaxPixelClock = 135000000;
return 0;
return 0;
}
/* SetVideoMode:
* Sets the specified video mode, returning zero on success.
*/
long SetVideoMode(AF_DRIVER *af, short mode, long virtualX, long virtualY, long *bytesPerLine, int numBuffers, AF_CRTCInfo *crtc)
{
long available_vram;
long used_vram;
int width;
VIDEO_MODE *info;
RM_REGS r;
long SetVideoMode(AF_DRIVER *af, short mode, long virtualX, long virtualY,
long *bytesPerLine, int numBuffers, AF_CRTCInfo *crtc) {
long available_vram;
long used_vram;
int width;
VIDEO_MODE *info;
RM_REGS r;
/* reject anything with hardware stereo, linear framebuffer, or noclear */
if (mode & 0xC400)
return -1;
/* reject anything with hardware stereo, linear framebuffer, or noclear */
if (mode & 0xC400) return -1;
mode &= 0x3FF;
mode &= 0x3FF;
if ((mode <= 0) || (mode > NUM_MODES))
return -1;
if ((mode <= 0) || (mode > NUM_MODES)) return -1;
info = &mode_list[mode-1];
info = &mode_list[mode - 1];
/* call BIOS to set the mode */
r.x.ax = info->num;
rm_int(0x10, &r);
/* call BIOS to set the mode */
r.x.ax = info->num;
rm_int(0x10, &r);
/* adjust the virtual width for widescreen modes */
if (virtualX > info->w) {
if (virtualX > 1024)
return -1;
/* adjust the virtual width for widescreen modes */
if (virtualX > info->w) {
if (virtualX > 1024) return -1;
*bytesPerLine = ((virtualX*BYTES_PER_PIXEL(info->bpp))+15)&0xFFF0;
*bytesPerLine = ((virtualX * BYTES_PER_PIXEL(info->bpp)) + 15) & 0xFFF0;
width = read_vga_register(0x3D4, 0x13);
write_vga_register(0x3D4, 0x13, (width * (*bytesPerLine)) / (info->w*BYTES_PER_PIXEL(info->bpp)));
}
else
*bytesPerLine = info->w*BYTES_PER_PIXEL(info->bpp);
width = read_vga_register(0x3D4, 0x13);
write_vga_register(0x3D4, 0x13,
(width * (*bytesPerLine)) /
(info->w * BYTES_PER_PIXEL(info->bpp)));
} else
*bytesPerLine = info->w * BYTES_PER_PIXEL(info->bpp);
/* set up some hardware registers */
if (chip_id >= 0x33)
write_vga_register(0x3CE, 0x0F, 5); /* read/write banks */
else
read_vga_register(0x3C4, 0x0B); /* switch to new mode */
/* set up some hardware registers */
if (chip_id >= 0x33)
write_vga_register(0x3CE, 0x0F, 5); /* read/write banks */
else
read_vga_register(0x3C4, 0x0B); /* switch to new mode */
/* store info about the current mode */
af_bpp = info->bpp;
af_width = *bytesPerLine;
af_height = MAX(info->h, virtualY);
af_visible_page = 0;
af_active_page = 0;
af_scroll_x = 0;
af_scroll_y = 0;
af_bank = -1;
/* store info about the current mode */
af_bpp = info->bpp;
af_width = *bytesPerLine;
af_height = MAX(info->h, virtualY);
af_visible_page = 0;
af_active_page = 0;
af_scroll_x = 0;
af_scroll_y = 0;
af_bank = -1;
af->BufferEndX = af_width/BYTES_PER_PIXEL(af_bpp)-1;
af->BufferEndY = af_height-1;
af->OriginOffset = 0;
af->BufferEndX = af_width / BYTES_PER_PIXEL(af_bpp) - 1;
af->BufferEndY = af_height - 1;
af->OriginOffset = 0;
used_vram = af_width * af_height * numBuffers;
available_vram = af->TotalMemory*1024 ;
used_vram = af_width * af_height * numBuffers;
available_vram = af->TotalMemory * 1024;
if (used_vram > available_vram)
return -1;
if (used_vram > available_vram) return -1;
if (available_vram-used_vram >= af_width) {
af->OffscreenOffset = used_vram;
af->OffscreenStartY = af_height*numBuffers;
af->OffscreenEndY = available_vram/af_width-1;
}
else {
af->OffscreenOffset = 0;
af->OffscreenStartY = 0;
af->OffscreenEndY = 0;
}
if (available_vram - used_vram >= af_width) {
af->OffscreenOffset = used_vram;
af->OffscreenStartY = af_height * numBuffers;
af->OffscreenEndY = available_vram / af_width - 1;
} else {
af->OffscreenOffset = 0;
af->OffscreenStartY = 0;
af->OffscreenEndY = 0;
}
return 0;
return 0;
}
/* RestoreTextMode:
* Returns to text mode, shutting down the accelerator hardware.
*/
void RestoreTextMode(AF_DRIVER *af)
{
RM_REGS r;
void RestoreTextMode(AF_DRIVER *af) {
RM_REGS r;
r.x.ax = 3;
rm_int(0x10, &r);
r.x.ax = 3;
rm_int(0x10, &r);
}
/* GetClosestPixelClock:
* I don't have a clue what this should return: it is used for the
* refresh rate control.
*/
long GetClosestPixelClock(AF_DRIVER *af, short mode, unsigned long pixelClock)
{
/* ??? */
return 135000000;
long GetClosestPixelClock(AF_DRIVER *af, short mode, unsigned long pixelClock) {
/* ??? */
return 135000000;
}
/* SaveRestoreState:
* Stores the current driver status: not presently implemented.
*/
void SaveRestoreState(AF_DRIVER *af, int subfunc, void *saveBuf)
{
/* not implemented (not used by Allegro) */
void SaveRestoreState(AF_DRIVER *af, int subfunc, void *saveBuf) {
/* not implemented (not used by Allegro) */
}
/* SetDisplayStart:
* Hardware scrolling function. The waitVRT value may be one of:
*
@ -453,119 +385,101 @@ void SaveRestoreState(AF_DRIVER *af, int subfunc, void *saveBuf)
* 0 = set values and return immediately
* 1 = set values and wait for retrace
*/
void SetDisplayStart(AF_DRIVER *af, long x, long y, long waitVRT)
{
if (waitVRT >= 0) {
long a = ((x * BYTES_PER_PIXEL(af_bpp)) + ((y + af_visible_page*af_height) * af_width)) >> 2;
void SetDisplayStart(AF_DRIVER *af, long x, long y, long waitVRT) {
if (waitVRT >= 0) {
long a = ((x * BYTES_PER_PIXEL(af_bpp)) +
((y + af_visible_page * af_height) * af_width)) >>
2;
asm volatile ("cli");
asm volatile("cli");
if (waitVRT) {
do {
} while (inportb(0x3DA) & 1);
}
if (waitVRT) {
do { } while (inportb(0x3DA) & 1); }
/* first set the standard CRT Start registers */
outportw(0x3D4, (a & 0xFF00) | 0x0C);
outportw(0x3D4, ((a & 0x00FF) << 8) | 0x0D);
/* first set the standard CRT Start registers */
outportw(0x3D4, (a & 0xFF00) | 0x0C);
outportw(0x3D4, ((a & 0x00FF) << 8) | 0x0D);
/* set bit 16 of the screen start address */
outportb(0x3D4, 0x1E);
outportb(0x3D5, (inportb(0x3D5) & 0xDF) | ((a & 0x10000) >> 11) );
/* set bit 16 of the screen start address */
outportb(0x3D4, 0x1E);
outportb(0x3D5, (inportb(0x3D5) & 0xDF) | ((a & 0x10000) >> 11));
/* bits 17-19 of the start address: uses the 8900CL/D+ register */
outportb(0x3D4, 0x27);
outportb(0x3D5, (inportb(0x3D5) & 0xF8) | ((a & 0xE0000) >> 17) );
/* bits 17-19 of the start address: uses the 8900CL/D+ register */
outportb(0x3D4, 0x27);
outportb(0x3D5, (inportb(0x3D5) & 0xF8) | ((a & 0xE0000) >> 17));
/* set pel register */
if (waitVRT) {
do {
} while (!(inportb(0x3DA) & 8));
}
/* set pel register */
if (waitVRT) {
do { } while (!(inportb(0x3DA) & 8)); }
write_vga_register(0x3C0, 0x33, x&3);
write_vga_register(0x3C0, 0x33, x & 3);
asm volatile ("sti");
}
asm volatile("sti");
}
af_scroll_x = x;
af_scroll_y = y;
af_scroll_x = x;
af_scroll_y = y;
}
/* SetActiveBuffer:
* Sets which buffer is being drawn onto, for use in multi buffering
* systems (not used by Allegro).
*/
void SetActiveBuffer(AF_DRIVER *af, long index)
{
if (af->OffscreenOffset) {
af->OffscreenStartY += af_active_page*af_height;
af->OffscreenEndY += af_active_page*af_height;
}
void SetActiveBuffer(AF_DRIVER *af, long index) {
if (af->OffscreenOffset) {
af->OffscreenStartY += af_active_page * af_height;
af->OffscreenEndY += af_active_page * af_height;
}
af_active_page = index;
af_active_page = index;
af->OriginOffset = af_width*af_height*index;
af->OriginOffset = af_width * af_height * index;
if (af->OffscreenOffset) {
af->OffscreenStartY -= af_active_page*af_height;
af->OffscreenEndY -= af_active_page*af_height;
}
if (af->OffscreenOffset) {
af->OffscreenStartY -= af_active_page * af_height;
af->OffscreenEndY -= af_active_page * af_height;
}
}
/* SetVisibleBuffer:
* Sets which buffer is displayed on the screen, for use in multi buffering
* systems (not used by Allegro).
*/
void SetVisibleBuffer(AF_DRIVER *af, long index, long waitVRT)
{
af_visible_page = index;
void SetVisibleBuffer(AF_DRIVER *af, long index, long waitVRT) {
af_visible_page = index;
SetDisplayStart(af, af_scroll_x, af_scroll_y, waitVRT);
SetDisplayStart(af, af_scroll_x, af_scroll_y, waitVRT);
}
/* GetDisplayStartStatus:
* Status poll for triple buffering. Not possible on the majority of
* present cards: this function is just a placeholder.
*/
int GetDisplayStartStatus(AF_DRIVER *af)
{
return 1;
int GetDisplayStartStatus(AF_DRIVER *af) {
return 1;
}
/* SetPaletteData:
* Palette setting routine.
*/
void SetPaletteData(AF_DRIVER *af, AF_PALETTE *pal, long num, long index, long waitVRT)
{
int i;
void SetPaletteData(AF_DRIVER *af, AF_PALETTE *pal, long num, long index,
long waitVRT) {
int i;
if (waitVRT) {
do {
} while (inportb(0x3DA) & 8);
if (waitVRT) {
do {
} while (inportb(0x3DA) & 8);
do {
} while (!(inportb(0x3DA) & 8));
}
do { } while (!(inportb(0x3DA) & 8)); }
for (i=0; i<num; i++) {
outportb(0x3C8, index+i);
outportb(0x3C9, pal[i].red/4);
outportb(0x3C9, pal[i].green/4);
outportb(0x3C9, pal[i].blue/4);
}
for (i = 0; i < num; i++) {
outportb(0x3C8, index + i);
outportb(0x3C9, pal[i].red / 4);
outportb(0x3C9, pal[i].green / 4);
outportb(0x3C9, pal[i].blue / 4);
}
}
/* DualSetBank32:
* Relocatable bank switch function, called with a bank number in %edx.
*/
@ -602,13 +516,9 @@ asm ("
*/
void DualSetBank(AF_DRIVER *af, long bank)
{
asm (
" call _DualSetBank32 "
:
: "d" (bank)
);
asm(" call _DualSetBank32 " : : "d"(bank));
af_bank = bank;
af_bank = bank;
}
@ -660,14 +570,7 @@ asm ("
*/
void SingleSetBank(AF_DRIVER *af, long bank)
{
asm (
" call _SingleSetBank32 "
:
: "d" (bank)
);
asm(" call _SingleSetBank32 " : : "d"(bank));
af_bank = bank;
af_bank = bank;
}

View File

@ -1,7 +1,7 @@
/*
* ______ ____ ______ _____ ______
* ______ ____ ______ _____ ______
* | ____| | _ \| ____| / / _ \| ____|
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | __| '__/ _ \/ _ \ _ <| __| / /| _ | __|
* | | | | | __/ __/ |_) | |____ / / | | | | |
* |_| |_| \___|\___|____/|______/_/ |_| |_|_|
@ -12,34 +12,29 @@
* See freebe.txt for copyright information.
*/
#include "vbeaf.h"
AF_DRIVER drvhdr =
{
"VBEAF.DRV", /* Signature */
0x200, /* Version */
0, /* DriverRev */
"FreeBE/AF Trident driver " FREEBE_VERSION, /* OemVendorName */
"This driver is free software", /* OemCopyright */
NULL, /* AvailableModes */
0, /* TotalMemory */
0, /* Attributes */
0, /* BankSize */
0, /* BankedBasePtr */
0, /* LinearSize */
0, /* LinearBasePtr */
0, /* LinearGranularity */
NULL, /* IOPortsTable */
{ NULL, NULL, NULL, NULL }, /* IOMemoryBase */
{ 0, 0, 0, 0 }, /* IOMemoryLen */
0, /* LinearStridePad */
-1, /* PCIVendorID */
-1, /* PCIDeviceID */
-1, /* PCISubSysVendorID */
-1, /* PCISubSysID */
0 /* Checksum */
AF_DRIVER drvhdr = {
"VBEAF.DRV", /* Signature */
0x200, /* Version */
0, /* DriverRev */
"FreeBE/AF Trident driver " FREEBE_VERSION, /* OemVendorName */
"This driver is free software", /* OemCopyright */
NULL, /* AvailableModes */
0, /* TotalMemory */
0, /* Attributes */
0, /* BankSize */
0, /* BankedBasePtr */
0, /* LinearSize */
0, /* LinearBasePtr */
0, /* LinearGranularity */
NULL, /* IOPortsTable */
{ NULL, NULL, NULL, NULL }, /* IOMemoryBase */
{ 0, 0, 0, 0 }, /* IOMemoryLen */
0, /* LinearStridePad */
-1, /* PCIVendorID */
-1, /* PCIDeviceID */
-1, /* PCISubSysVendorID */
-1, /* PCISubSysID */
0 /* Checksum */
};

View File

@ -1,7 +1,7 @@
/*
* ______ ____ ______ _____ ______
* ______ ____ ______ _____ ______
* | ____| | _ \| ____| / / _ \| ____|
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | __| '__/ _ \/ _ \ _ <| __| / /| _ | __|
* | | | | | __/ __/ |_) | |____ / / | | | | |
* |_| |_| \___|\___|____/|______/_/ |_| |_|_|
@ -14,52 +14,44 @@
* See freebe.txt for copyright information.
*/
// #define NO_HWPTR
#include <pc.h>
#include "vbeaf.h"
/* chipset information */
#define ET_NONE 0
#define ET_3000 1
#define ET_4000 2
#define ET_6000 3
#define ET_NONE 0
#define ET_3000 1
#define ET_4000 2
#define ET_6000 3
int tseng_type = ET_NONE;
/* driver function prototypes */
void ET3000SetBank32();
void ET3000SetBank32End();
void ET3000SetBank32( );
void ET3000SetBank32End( );
void ET3000SetBank(AF_DRIVER *af, long bank);
void ET4000SetBank32();
void ET4000SetBank32End();
void ET4000SetBank32( );
void ET4000SetBank32End( );
void ET4000SetBank(AF_DRIVER *af, long bank);
int ExtStub();
int ExtStub( );
long GetVideoModeInfo(AF_DRIVER *af, short mode, AF_MODE_INFO *modeInfo);
long SetVideoMode(AF_DRIVER *af, short mode, long virtualX, long virtualY, long *bytesPerLine, int numBuffers, AF_CRTCInfo *crtc);
long SetVideoMode(AF_DRIVER *af, short mode, long virtualX, long virtualY,
long *bytesPerLine, int numBuffers, AF_CRTCInfo *crtc);
void RestoreTextMode(AF_DRIVER *af);
long GetClosestPixelClock(AF_DRIVER *af, short mode, unsigned long pixelClock);
void SaveRestoreState(AF_DRIVER *af, int subfunc, void *saveBuf);
void SetDisplayStart(AF_DRIVER *af, long x, long y, long waitVRT);
void SetActiveBuffer(AF_DRIVER *af, long index);
void SetVisibleBuffer(AF_DRIVER *af, long index, long waitVRT);
int GetDisplayStartStatus(AF_DRIVER *af);
void SetPaletteData(AF_DRIVER *af, AF_PALETTE *pal, long num, long index, long waitVRT);
int GetDisplayStartStatus(AF_DRIVER *af);
void SetPaletteData(AF_DRIVER *af, AF_PALETTE *pal, long num, long index,
long waitVRT);
/* list which ports we are going to access (only needed under Linux) */
unsigned short ports_table[] = { 0xFFFF };
/* internal driver state variables */
int af_bpp;
int af_width;
@ -70,412 +62,341 @@ int af_scroll_x;
int af_scroll_y;
int af_bank;
/* FreeBE/AF extension allowing farptr access to video memory */
FAF_HWPTR_DATA hwptr;
/* list of available video modes */
typedef struct VIDEO_MODE
{
int w, h;
int bpp;
int num;
int bios;
typedef struct VIDEO_MODE {
int w, h;
int bpp;
int num;
int bios;
} VIDEO_MODE;
VIDEO_MODE et3000_mode_list[] = { { 640, 350, 8, 0x2D, 0 },
{ 640, 480, 8, 0x2E, 0 },
{ 800, 600, 8, 0x30, 0 } };
VIDEO_MODE et3000_mode_list[] =
{
{ 640, 350, 8, 0x2D, 0 },
{ 640, 480, 8, 0x2E, 0 },
{ 800, 600, 8, 0x30, 0 }
VIDEO_MODE et4000_mode_list[] = {
{ 640, 350, 8, 0x2D, 0 }, { 640, 480, 8, 0x2E, 0 },
{ 640, 400, 8, 0x2F, 0 }, { 800, 600, 8, 0x30, 0 },
{ 1024, 768, 8, 0x38, 0 }, { 320, 200, 15, 0x13, 0x10F0 },
{ 640, 350, 15, 0x2D, 0x10F0 }, { 640, 480, 15, 0x2E, 0x10F0 },
{ 640, 400, 15, 0x2F, 0x10F0 }, { 800, 600, 15, 0x30, 0x10F0 },
{ 1024, 768, 15, 0x38, 0x10F0 }, { 640, 350, 24, 0x2DFF, 0x10F0 },
{ 640, 480, 24, 0x2EFF, 0x10F0 }, { 640, 400, 24, 0x2FFF, 0x10F0 },
{ 800, 600, 24, 0x30FF, 0x10F0 }
};
#define NUM_ET3000_MODES (int)(sizeof(et3000_mode_list) / sizeof(VIDEO_MODE))
#define NUM_ET4000_MODES (int)(sizeof(et4000_mode_list) / sizeof(VIDEO_MODE))
VIDEO_MODE et4000_mode_list[] =
{
{ 640, 350, 8, 0x2D, 0 },
{ 640, 480, 8, 0x2E, 0 },
{ 640, 400, 8, 0x2F, 0 },
{ 800, 600, 8, 0x30, 0 },
{ 1024, 768, 8, 0x38, 0 },
{ 320, 200, 15, 0x13, 0x10F0 },
{ 640, 350, 15, 0x2D, 0x10F0 },
{ 640, 480, 15, 0x2E, 0x10F0 },
{ 640, 400, 15, 0x2F, 0x10F0 },
{ 800, 600, 15, 0x30, 0x10F0 },
{ 1024, 768, 15, 0x38, 0x10F0 },
{ 640, 350, 24, 0x2DFF, 0x10F0 },
{ 640, 480, 24, 0x2EFF, 0x10F0 },
{ 640, 400, 24, 0x2FFF, 0x10F0 },
{ 800, 600, 24, 0x30FF, 0x10F0 }
};
#define NUM_ET3000_MODES (int)(sizeof(et3000_mode_list)/sizeof(VIDEO_MODE))
#define NUM_ET4000_MODES (int)(sizeof(et4000_mode_list)/sizeof(VIDEO_MODE))
short available_et3000_modes[NUM_ET3000_MODES+1] = { 1, 2, 3, -1 };
short available_et4000_modes[NUM_ET4000_MODES+1] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, -1 };
short available_et3000_modes[NUM_ET3000_MODES + 1] = { 1, 2, 3, -1 };
short available_et4000_modes[NUM_ET4000_MODES + 1] = { 1, 2, 3, 4, 5, 6,
7, 8, 9, 10, 11, 12,
13, 14, 15, -1 };
/* detect:
* Detects the presence of a Tseng card.
*/
int detect()
{
int old1, old2, subver;
int detect( ) {
int old1, old2, subver;
old1 = inportb(0x3BF);
old2 = inportb(0x3D4+4);
old1 = inportb(0x3BF);
old2 = inportb(0x3D4 + 4);
outportb(0x3BF, 3);
outportb(0x3D4+4, 0xA0);
outportb(0x3BF, 3);
outportb(0x3D4 + 4, 0xA0);
if (test_register(0x3CD, 0x3F)) {
if (test_vga_register(0x3D4, 0x33, 0x0F)) {
if (test_register(0x3CB, 0x33)) {
subver = read_vga_register(0x217A, 0xEC) >> 4;
if (subver <= 11)
return ET_4000;
else if (subver == 15)
return ET_6000;
/* else unknown Tseng */
}
else
return ET_4000;
}
else
return ET_3000;
}
if (test_register(0x3CD, 0x3F)) {
if (test_vga_register(0x3D4, 0x33, 0x0F)) {
if (test_register(0x3CB, 0x33)) {
subver = read_vga_register(0x217A, 0xEC) >> 4;
if (subver <= 11)
return ET_4000;
else if (subver == 15)
return ET_6000;
/* else unknown Tseng */
} else
return ET_4000;
} else
return ET_3000;
}
outportb(0x3BF, old1);
outportb(0x3D4+4, old2);
outportb(0x3BF, old1);
outportb(0x3D4 + 4, old2);
return ET_NONE;
return ET_NONE;
}
/* SetupDriver:
* Fills in our driver header block.
*/
int SetupDriver(AF_DRIVER *af)
{
char *name = NULL;
int vram_size;
int i;
int SetupDriver(AF_DRIVER *af) {
char *name = NULL;
int vram_size;
int i;
tseng_type = detect();
tseng_type = detect( );
switch (tseng_type) {
switch (tseng_type) {
case ET_3000: name = "ET3000"; break;
case ET_3000:
name = "ET3000";
break;
case ET_4000: name = "ET4000"; break;
case ET_4000:
name = "ET4000";
break;
case ET_6000: name = "ET6000"; break;
case ET_6000:
name = "ET6000";
break;
default: return 1;
}
default:
return 1;
}
i = 0;
while (af->OemVendorName[i]) i++;
i = 0;
while (af->OemVendorName[i])
i++;
af->OemVendorName[i++] = ',';
af->OemVendorName[i++] = ' ';
af->OemVendorName[i++] = ',';
af->OemVendorName[i++] = ' ';
while (*name) af->OemVendorName[i++] = *(name++);
while (*name)
af->OemVendorName[i++] = *(name++);
af->OemVendorName[i] = 0;
af->OemVendorName[i] = 0;
if (get_vesa_info(&vram_size, NULL, NULL) != 0) {
if (tseng_type == ET_3000)
af->TotalMemory = 512;
else
af->TotalMemory = 1024;
} else {
if (tseng_type == ET_3000)
af->TotalMemory = MIN(vram_size / 1024, 512);
else
af->TotalMemory = MIN(vram_size / 1024, 1024);
}
if (get_vesa_info(&vram_size, NULL, NULL) != 0) {
if (tseng_type == ET_3000)
af->TotalMemory = 512;
else
af->TotalMemory = 1024;
}
else {
if (tseng_type == ET_3000)
af->TotalMemory = MIN(vram_size/1024, 512);
else
af->TotalMemory = MIN(vram_size/1024, 1024);
}
if (tseng_type == ET_3000) {
af->AvailableModes = available_et3000_modes;
if (tseng_type == ET_3000) {
af->AvailableModes = available_et3000_modes;
af->SetBank32 = ET3000SetBank32;
af->SetBank32Len = (long)ET3000SetBank32End - (long)ET3000SetBank32;
af->SetBank = ET3000SetBank;
} else {
af->AvailableModes = available_et4000_modes;
af->SetBank32 = ET3000SetBank32;
af->SetBank32Len = (long)ET3000SetBank32End - (long)ET3000SetBank32;
af->SetBank = ET3000SetBank;
}
else {
af->AvailableModes = available_et4000_modes;
af->SetBank32 = ET4000SetBank32;
af->SetBank32Len = (long)ET4000SetBank32End - (long)ET4000SetBank32;
af->SetBank = ET4000SetBank;
}
af->SetBank32 = ET4000SetBank32;
af->SetBank32Len = (long)ET4000SetBank32End - (long)ET4000SetBank32;
af->SetBank = ET4000SetBank;
}
af->Attributes =
(afHaveMultiBuffer | afHaveVirtualScroll | afHaveBankedBuffer);
af->Attributes = (afHaveMultiBuffer |
afHaveVirtualScroll |
afHaveBankedBuffer);
af->BankSize = 64;
af->BankedBasePtr = 0xA0000;
af->BankSize = 64;
af->BankedBasePtr = 0xA0000;
af->IOPortsTable = ports_table;
af->IOPortsTable = ports_table;
af->SupplementalExt = ExtStub;
af->GetVideoModeInfo = GetVideoModeInfo;
af->SetVideoMode = SetVideoMode;
af->RestoreTextMode = RestoreTextMode;
af->GetClosestPixelClock = GetClosestPixelClock;
af->SaveRestoreState = SaveRestoreState;
af->SetDisplayStart = SetDisplayStart;
af->SetActiveBuffer = SetActiveBuffer;
af->SetVisibleBuffer = SetVisibleBuffer;
af->GetDisplayStartStatus = GetDisplayStartStatus;
af->SetPaletteData = SetPaletteData;
af->SupplementalExt = ExtStub;
af->GetVideoModeInfo = GetVideoModeInfo;
af->SetVideoMode = SetVideoMode;
af->RestoreTextMode = RestoreTextMode;
af->GetClosestPixelClock = GetClosestPixelClock;
af->SaveRestoreState = SaveRestoreState;
af->SetDisplayStart = SetDisplayStart;
af->SetActiveBuffer = SetActiveBuffer;
af->SetVisibleBuffer = SetVisibleBuffer;
af->GetDisplayStartStatus = GetDisplayStartStatus;
af->SetPaletteData = SetPaletteData;
return 0;
return 0;
}
/* InitDriver:
* The second thing to be called during the init process, after the
* The second thing to be called during the init process, after the
* application has mapped all the memory and I/O resources we need.
*/
int InitDriver(AF_DRIVER *af)
{
hwptr_init(hwptr.IOMemMaps[0], af->IOMemMaps[0]);
hwptr_init(hwptr.IOMemMaps[1], af->IOMemMaps[1]);
hwptr_init(hwptr.IOMemMaps[2], af->IOMemMaps[2]);
hwptr_init(hwptr.IOMemMaps[3], af->IOMemMaps[3]);
hwptr_init(hwptr.BankedMem, af->BankedMem);
hwptr_init(hwptr.LinearMem, af->LinearMem);
int InitDriver(AF_DRIVER *af) {
hwptr_init(hwptr.IOMemMaps[0], af->IOMemMaps[0]);
hwptr_init(hwptr.IOMemMaps[1], af->IOMemMaps[1]);
hwptr_init(hwptr.IOMemMaps[2], af->IOMemMaps[2]);
hwptr_init(hwptr.IOMemMaps[3], af->IOMemMaps[3]);
hwptr_init(hwptr.BankedMem, af->BankedMem);
hwptr_init(hwptr.LinearMem, af->LinearMem);
return 0;
return 0;
}
/* FreeBEX:
* Returns an interface structure for the requested FreeBE/AF extension.
*/
void *FreeBEX(AF_DRIVER *af, unsigned long id)
{
switch (id) {
void *FreeBEX(AF_DRIVER *af, unsigned long id) {
switch (id) {
#ifndef NO_HWPTR
#ifndef NO_HWPTR
case FAFEXT_HWPTR:
/* allow farptr access to video memory */
return &hwptr;
case FAFEXT_HWPTR:
/* allow farptr access to video memory */
return &hwptr;
#endif
#endif
default:
return NULL;
}
default: return NULL;
}
}
/* ExtStub:
* Vendor-specific extension hook: we don't provide any.
*/
int ExtStub()
{
return 0;
int ExtStub( ) {
return 0;
}
/* GetVideoModeInfo:
* Retrieves information about this video mode, returning zero on success
* or -1 if the mode is invalid.
*/
long GetVideoModeInfo(AF_DRIVER *af, short mode, AF_MODE_INFO *modeInfo)
{
VIDEO_MODE *info;
int i;
long GetVideoModeInfo(AF_DRIVER *af, short mode, AF_MODE_INFO *modeInfo) {
VIDEO_MODE *info;
int i;
if ((mode <= 0) || (mode > ((tseng_type == ET_3000) ? NUM_ET3000_MODES : NUM_ET4000_MODES)))
return -1;
if ((mode <= 0) || (mode > ((tseng_type == ET_3000) ? NUM_ET3000_MODES
: NUM_ET4000_MODES)))
return -1;
if (tseng_type == ET_3000)
info = &et3000_mode_list[mode-1];
else
info = &et4000_mode_list[mode-1];
if (tseng_type == ET_3000)
info = &et3000_mode_list[mode - 1];
else
info = &et4000_mode_list[mode - 1];
for (i=0; i<(int)sizeof(AF_MODE_INFO); i++)
((char *)modeInfo)[i] = 0;
for (i = 0; i < (int)sizeof(AF_MODE_INFO); i++) ((char *)modeInfo)[i] = 0;
modeInfo->Attributes = (afHaveMultiBuffer |
afHaveVirtualScroll |
afHaveBankedBuffer);
modeInfo->Attributes =
(afHaveMultiBuffer | afHaveVirtualScroll | afHaveBankedBuffer);
modeInfo->XResolution = info->w;
modeInfo->YResolution = info->h;
modeInfo->BitsPerPixel = info->bpp;
modeInfo->XResolution = info->w;
modeInfo->YResolution = info->h;
modeInfo->BitsPerPixel = info->bpp;
modeInfo->MaxBuffers = (af->TotalMemory*1024) /
(info->w*info->h*BYTES_PER_PIXEL(info->bpp));
modeInfo->MaxBuffers = (af->TotalMemory * 1024) /
(info->w * info->h * BYTES_PER_PIXEL(info->bpp));
if (info->w > 1024) {
modeInfo->MaxBytesPerScanLine = 2048*BYTES_PER_PIXEL(info->bpp);
modeInfo->MaxScanLineWidth = 2048;
}
else {
modeInfo->MaxBytesPerScanLine = 1024*BYTES_PER_PIXEL(info->bpp);
modeInfo->MaxScanLineWidth = 1024;
}
if (info->w > 1024) {
modeInfo->MaxBytesPerScanLine = 2048 * BYTES_PER_PIXEL(info->bpp);
modeInfo->MaxScanLineWidth = 2048;
} else {
modeInfo->MaxBytesPerScanLine = 1024 * BYTES_PER_PIXEL(info->bpp);
modeInfo->MaxScanLineWidth = 1024;
}
modeInfo->BytesPerScanLine = info->w*BYTES_PER_PIXEL(info->bpp);
modeInfo->BnkMaxBuffers = modeInfo->MaxBuffers;
modeInfo->BytesPerScanLine = info->w * BYTES_PER_PIXEL(info->bpp);
modeInfo->BnkMaxBuffers = modeInfo->MaxBuffers;
modeInfo->MaxPixelClock = 135000000;
modeInfo->MaxPixelClock = 135000000;
return 0;
return 0;
}
/* SetVideoMode:
* Sets the specified video mode, returning zero on success.
*/
long SetVideoMode(AF_DRIVER *af, short mode, long virtualX, long virtualY, long *bytesPerLine, int numBuffers, AF_CRTCInfo *crtc)
{
long available_vram;
long used_vram;
int width;
VIDEO_MODE *info;
RM_REGS r;
long SetVideoMode(AF_DRIVER *af, short mode, long virtualX, long virtualY,
long *bytesPerLine, int numBuffers, AF_CRTCInfo *crtc) {
long available_vram;
long used_vram;
int width;
VIDEO_MODE *info;
RM_REGS r;
/* reject anything with hardware stereo, linear framebuffer, or noclear */
if (mode & 0xC400)
return -1;
/* reject anything with hardware stereo, linear framebuffer, or noclear */
if (mode & 0xC400) return -1;
mode &= 0x3FF;
mode &= 0x3FF;
if ((mode <= 0) || (mode > ((tseng_type == ET_3000) ? NUM_ET3000_MODES : NUM_ET4000_MODES)))
return -1;
if ((mode <= 0) || (mode > ((tseng_type == ET_3000) ? NUM_ET3000_MODES
: NUM_ET4000_MODES)))
return -1;
if (tseng_type == ET_3000)
info = &et3000_mode_list[mode-1];
else
info = &et4000_mode_list[mode-1];
if (tseng_type == ET_3000)
info = &et3000_mode_list[mode - 1];
else
info = &et4000_mode_list[mode - 1];
/* call BIOS to set the mode */
if (info->bios) {
r.x.ax = info->bios;
r.x.bx = info->num;
}
else
r.x.ax = info->num;
/* call BIOS to set the mode */
if (info->bios) {
r.x.ax = info->bios;
r.x.bx = info->num;
} else
r.x.ax = info->num;
rm_int(0x10, &r);
rm_int(0x10, &r);
/* adjust the virtual width for widescreen modes */
if (virtualX > info->w) {
if (virtualX > 1024)
return -1;
/* adjust the virtual width for widescreen modes */
if (virtualX > info->w) {
if (virtualX > 1024) return -1;
*bytesPerLine = ((virtualX*BYTES_PER_PIXEL(info->bpp))+15)&0xFFF0;
*bytesPerLine = ((virtualX * BYTES_PER_PIXEL(info->bpp)) + 15) & 0xFFF0;
width = read_vga_register(0x3D4, 0x13);
write_vga_register(0x3D4, 0x13, (width * (*bytesPerLine)) / (info->w*BYTES_PER_PIXEL(info->bpp)));
}
else
*bytesPerLine = info->w*BYTES_PER_PIXEL(info->bpp);
width = read_vga_register(0x3D4, 0x13);
write_vga_register(0x3D4, 0x13,
(width * (*bytesPerLine)) /
(info->w * BYTES_PER_PIXEL(info->bpp)));
} else
*bytesPerLine = info->w * BYTES_PER_PIXEL(info->bpp);
/* store info about the current mode */
af_bpp = info->bpp;
af_width = *bytesPerLine;
af_height = MAX(info->h, virtualY);
af_visible_page = 0;
af_active_page = 0;
af_scroll_x = 0;
af_scroll_y = 0;
af_bank = -1;
/* store info about the current mode */
af_bpp = info->bpp;
af_width = *bytesPerLine;
af_height = MAX(info->h, virtualY);
af_visible_page = 0;
af_active_page = 0;
af_scroll_x = 0;
af_scroll_y = 0;
af_bank = -1;
af->BufferEndX = af_width/BYTES_PER_PIXEL(af_bpp)-1;
af->BufferEndY = af_height-1;
af->OriginOffset = 0;
af->BufferEndX = af_width / BYTES_PER_PIXEL(af_bpp) - 1;
af->BufferEndY = af_height - 1;
af->OriginOffset = 0;
used_vram = af_width * af_height * numBuffers;
available_vram = af->TotalMemory*1024 ;
used_vram = af_width * af_height * numBuffers;
available_vram = af->TotalMemory * 1024;
if (used_vram > available_vram)
return -1;
if (used_vram > available_vram) return -1;
if (available_vram-used_vram >= af_width) {
af->OffscreenOffset = used_vram;
af->OffscreenStartY = af_height*numBuffers;
af->OffscreenEndY = available_vram/af_width-1;
}
else {
af->OffscreenOffset = 0;
af->OffscreenStartY = 0;
af->OffscreenEndY = 0;
}
if (available_vram - used_vram >= af_width) {
af->OffscreenOffset = used_vram;
af->OffscreenStartY = af_height * numBuffers;
af->OffscreenEndY = available_vram / af_width - 1;
} else {
af->OffscreenOffset = 0;
af->OffscreenStartY = 0;
af->OffscreenEndY = 0;
}
return 0;
return 0;
}
/* RestoreTextMode:
* Returns to text mode, shutting down the accelerator hardware.
*/
void RestoreTextMode(AF_DRIVER *af)
{
RM_REGS r;
void RestoreTextMode(AF_DRIVER *af) {
RM_REGS r;
r.x.ax = 3;
rm_int(0x10, &r);
r.x.ax = 3;
rm_int(0x10, &r);
}
/* GetClosestPixelClock:
* I don't have a clue what this should return: it is used for the
* refresh rate control.
*/
long GetClosestPixelClock(AF_DRIVER *af, short mode, unsigned long pixelClock)
{
/* ??? */
return 135000000;
long GetClosestPixelClock(AF_DRIVER *af, short mode, unsigned long pixelClock) {
/* ??? */
return 135000000;
}
/* SaveRestoreState:
* Stores the current driver status: not presently implemented.
*/
void SaveRestoreState(AF_DRIVER *af, int subfunc, void *saveBuf)
{
/* not implemented (not used by Allegro) */
void SaveRestoreState(AF_DRIVER *af, int subfunc, void *saveBuf) {
/* not implemented (not used by Allegro) */
}
/* SetDisplayStart:
* Hardware scrolling function. The waitVRT value may be one of:
*
@ -483,120 +404,100 @@ void SaveRestoreState(AF_DRIVER *af, int subfunc, void *saveBuf)
* 0 = set values and return immediately
* 1 = set values and wait for retrace
*/
void SetDisplayStart(AF_DRIVER *af, long x, long y, long waitVRT)
{
if (waitVRT >= 0) {
long a = (x * BYTES_PER_PIXEL(af_bpp)) + ((y + af_visible_page*af_height) * af_width);
void SetDisplayStart(AF_DRIVER *af, long x, long y, long waitVRT) {
if (waitVRT >= 0) {
long a = (x * BYTES_PER_PIXEL(af_bpp)) +
((y + af_visible_page * af_height) * af_width);
asm volatile ("cli");
asm volatile("cli");
if (waitVRT) {
do {
} while (inportb(0x3DA) & 1);
}
if (waitVRT) {
do { } while (inportb(0x3DA) & 1); }
/* write high bit(s) to Tseng-specific registers */
if (tseng_type == ET_3000)
alter_vga_register(0x3D4, 0x23, 2, a>>17);
else if (tseng_type == ET_4000)
alter_vga_register(0x3D4, 0x33, 3, a>>18);
else if (tseng_type == ET_6000)
alter_vga_register(0x3D4, 0x33, 3, a>>17);
/* write high bit(s) to Tseng-specific registers */
if (tseng_type == ET_3000)
alter_vga_register(0x3D4, 0x23, 2, a >> 17);
else if (tseng_type == ET_4000)
alter_vga_register(0x3D4, 0x33, 3, a >> 18);
else if (tseng_type == ET_6000)
alter_vga_register(0x3D4, 0x33, 3, a >> 17);
/* write to normal VGA address registers */
write_vga_register(0x3D4, 0x0D, (a>>2) & 0xFF);
write_vga_register(0x3D4, 0x0C, (a>>10) & 0xFF);
/* write to normal VGA address registers */
write_vga_register(0x3D4, 0x0D, (a >> 2) & 0xFF);
write_vga_register(0x3D4, 0x0C, (a >> 10) & 0xFF);
asm volatile ("sti");
asm volatile("sti");
if (waitVRT) {
do {
} while (!(inportb(0x3DA) & 8));
}
if (waitVRT) {
do { } while (!(inportb(0x3DA) & 8)); }
/* write low 2 bits to VGA horizontal pan register */
if (af_bpp == 8)
write_vga_register(0x3C0, 0x33, a&3);
}
/* write low 2 bits to VGA horizontal pan register */
if (af_bpp == 8) write_vga_register(0x3C0, 0x33, a & 3);
}
af_scroll_x = x;
af_scroll_y = y;
af_scroll_x = x;
af_scroll_y = y;
}
/* SetActiveBuffer:
* Sets which buffer is being drawn onto, for use in multi buffering
* systems (not used by Allegro).
*/
void SetActiveBuffer(AF_DRIVER *af, long index)
{
if (af->OffscreenOffset) {
af->OffscreenStartY += af_active_page*af_height;
af->OffscreenEndY += af_active_page*af_height;
}
void SetActiveBuffer(AF_DRIVER *af, long index) {
if (af->OffscreenOffset) {
af->OffscreenStartY += af_active_page * af_height;
af->OffscreenEndY += af_active_page * af_height;
}
af_active_page = index;
af_active_page = index;
af->OriginOffset = af_width*af_height*index;
af->OriginOffset = af_width * af_height * index;
if (af->OffscreenOffset) {
af->OffscreenStartY -= af_active_page*af_height;
af->OffscreenEndY -= af_active_page*af_height;
}
if (af->OffscreenOffset) {
af->OffscreenStartY -= af_active_page * af_height;
af->OffscreenEndY -= af_active_page * af_height;
}
}
/* SetVisibleBuffer:
* Sets which buffer is displayed on the screen, for use in multi buffering
* systems (not used by Allegro).
*/
void SetVisibleBuffer(AF_DRIVER *af, long index, long waitVRT)
{
af_visible_page = index;
void SetVisibleBuffer(AF_DRIVER *af, long index, long waitVRT) {
af_visible_page = index;
SetDisplayStart(af, af_scroll_x, af_scroll_y, waitVRT);
SetDisplayStart(af, af_scroll_x, af_scroll_y, waitVRT);
}
/* GetDisplayStartStatus:
* Status poll for triple buffering. Not possible on the majority of
* present cards: this function is just a placeholder.
*/
int GetDisplayStartStatus(AF_DRIVER *af)
{
return 1;
int GetDisplayStartStatus(AF_DRIVER *af) {
return 1;
}
/* SetPaletteData:
* Palette setting routine.
*/
void SetPaletteData(AF_DRIVER *af, AF_PALETTE *pal, long num, long index, long waitVRT)
{
int i;
void SetPaletteData(AF_DRIVER *af, AF_PALETTE *pal, long num, long index,
long waitVRT) {
int i;
if (waitVRT) {
do {
} while (inportb(0x3DA) & 8);
if (waitVRT) {
do {
} while (inportb(0x3DA) & 8);
do {
} while (!(inportb(0x3DA) & 8));
}
do { } while (!(inportb(0x3DA) & 8)); }
for (i=0; i<num; i++) {
outportb(0x3C8, index+i);
outportb(0x3C9, pal[i].red/4);
outportb(0x3C9, pal[i].green/4);
outportb(0x3C9, pal[i].blue/4);
}
for (i = 0; i < num; i++) {
outportb(0x3C8, index + i);
outportb(0x3C9, pal[i].red / 4);
outportb(0x3C9, pal[i].green / 4);
outportb(0x3C9, pal[i].blue / 4);
}
}
/* ET3000SetBank32:
* Relocatable bank switch function, called with a bank number in %edx.
*/
@ -634,13 +535,9 @@ asm ("
*/
void ET3000SetBank(AF_DRIVER *af, long bank)
{
asm (
" call _ET3000SetBank32 "
:
: "d" (bank)
);
asm(" call _ET3000SetBank32 " : : "d"(bank));
af_bank = bank;
af_bank = bank;
}
@ -681,14 +578,7 @@ asm ("
*/
void ET4000SetBank(AF_DRIVER *af, long bank)
{
asm (
" call _ET4000SetBank32 "
:
: "d" (bank)
);
asm(" call _ET4000SetBank32 " : : "d"(bank));
af_bank = bank;
af_bank = bank;
}

View File

@ -1,7 +1,7 @@
/*
* ______ ____ ______ _____ ______
* ______ ____ ______ _____ ______
* | ____| | _ \| ____| / / _ \| ____|
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | __| '__/ _ \/ _ \ _ <| __| / /| _ | __|
* | | | | | __/ __/ |_) | |____ / / | | | | |
* |_| |_| \___|\___|____/|______/_/ |_| |_|_|
@ -12,34 +12,29 @@
* See freebe.txt for copyright information.
*/
#include "vbeaf.h"
AF_DRIVER drvhdr =
{
"VBEAF.DRV", /* Signature */
0x200, /* Version */
0, /* DriverRev */
"FreeBE/AF Tseng driver " FREEBE_VERSION, /* OemVendorName */
"This driver is free software", /* OemCopyright */
NULL, /* AvailableModes */
0, /* TotalMemory */
0, /* Attributes */
0, /* BankSize */
0, /* BankedBasePtr */
0, /* LinearSize */
0, /* LinearBasePtr */
0, /* LinearGranularity */
NULL, /* IOPortsTable */
{ NULL, NULL, NULL, NULL }, /* IOMemoryBase */
{ 0, 0, 0, 0 }, /* IOMemoryLen */
0, /* LinearStridePad */
-1, /* PCIVendorID */
-1, /* PCIDeviceID */
-1, /* PCISubSysVendorID */
-1, /* PCISubSysID */
0 /* Checksum */
AF_DRIVER drvhdr = {
"VBEAF.DRV", /* Signature */
0x200, /* Version */
0, /* DriverRev */
"FreeBE/AF Tseng driver " FREEBE_VERSION, /* OemVendorName */
"This driver is free software", /* OemCopyright */
NULL, /* AvailableModes */
0, /* TotalMemory */
0, /* Attributes */
0, /* BankSize */
0, /* BankedBasePtr */
0, /* LinearSize */
0, /* LinearBasePtr */
0, /* LinearGranularity */
NULL, /* IOPortsTable */
{ NULL, NULL, NULL, NULL }, /* IOMemoryBase */
{ 0, 0, 0, 0 }, /* IOMemoryLen */
0, /* LinearStridePad */
-1, /* PCIVendorID */
-1, /* PCIDeviceID */
-1, /* PCISubSysVendorID */
-1, /* PCISubSysID */
0 /* Checksum */
};

1260
vbeaf.h

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
/*
* ______ ____ ______ _____ ______
* ______ ____ ______ _____ ______
* | ____| | _ \| ____| / / _ \| ____|
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | __| '__/ _ \/ _ \ _ <| __| / /| _ | __|
* | | | | | __/ __/ |_) | |____ / / | | | | |
* |_| |_| \___|\___|____/|______/_/ |_| |_|_|
@ -14,39 +14,33 @@
* See freebe.txt for copyright information.
*/
// #define NO_HWPTR
#include <pc.h>
#include "vbeaf.h"
/* driver function prototypes */
void SetBank32();
void SetBank32End();
int ExtStub();
void SetBank32( );
void SetBank32End( );
int ExtStub( );
long GetVideoModeInfo(AF_DRIVER *af, short mode, AF_MODE_INFO *modeInfo);
long SetVideoMode(AF_DRIVER *af, short mode, long virtualX, long virtualY, long *bytesPerLine, int numBuffers, AF_CRTCInfo *crtc);
long SetVideoMode(AF_DRIVER *af, short mode, long virtualX, long virtualY,
long *bytesPerLine, int numBuffers, AF_CRTCInfo *crtc);
void RestoreTextMode(AF_DRIVER *af);
long GetClosestPixelClock(AF_DRIVER *af, short mode, unsigned long pixelClock);
void SaveRestoreState(AF_DRIVER *af, int subfunc, void *saveBuf);
void SetDisplayStart(AF_DRIVER *af, long x, long y, long waitVRT);
void SetActiveBuffer(AF_DRIVER *af, long index);
void SetVisibleBuffer(AF_DRIVER *af, long index, long waitVRT);
int GetDisplayStartStatus(AF_DRIVER *af);
void SetPaletteData(AF_DRIVER *af, AF_PALETTE *pal, long num, long index, long waitVRT);
int GetDisplayStartStatus(AF_DRIVER *af);
void SetPaletteData(AF_DRIVER *af, AF_PALETTE *pal, long num, long index,
long waitVRT);
void SetBank(AF_DRIVER *af, long bank);
/* list which ports we are going to access (only needed under Linux) */
unsigned short ports_table[] = { 0xFFFF };
/* internal driver state variables */
int af_bpp;
int af_width;
@ -57,357 +51,299 @@ int af_scroll_x;
int af_scroll_y;
int af_bank;
/* FreeBE/AF extension allowing farptr access to video memory */
FAF_HWPTR_DATA hwptr;
/* list of available video modes */
typedef struct VIDEO_MODE
{
int w, h;
int bpp;
int num;
typedef struct VIDEO_MODE {
int w, h;
int bpp;
int num;
} VIDEO_MODE;
VIDEO_MODE mode_list[] = { { 640, 400, 8, 0x66 },
{ 640, 480, 8, 0x67 },
{ 720, 540, 8, 0x68 },
{ 800, 600, 8, 0x69 },
{ 1024, 768, 8, 0x6A } };
VIDEO_MODE mode_list[] =
{
{ 640, 400, 8, 0x66 },
{ 640, 480, 8, 0x67 },
{ 720, 540, 8, 0x68 },
{ 800, 600, 8, 0x69 },
{ 1024, 768, 8, 0x6A }
};
#define NUM_MODES (int)(sizeof(mode_list)/sizeof(VIDEO_MODE))
short available_modes[NUM_MODES+1] = { 1, 2, 3, 4, 5, -1 };
#define NUM_MODES (int)(sizeof(mode_list) / sizeof(VIDEO_MODE))
short available_modes[NUM_MODES + 1] = { 1, 2, 3, 4, 5, -1 };
/* detect:
* Detects the presence of a Video-7 card.
*/
char *detect(unsigned long *vidmem)
{
RM_REGS r;
unsigned v;
int old;
char *detect(unsigned long *vidmem) {
RM_REGS r;
unsigned v;
int old;
old = read_vga_register(0x3C4, 6);
write_vga_register(0x3C4, 6, 0xEA); /* enable BIOS extensions */
old = read_vga_register(0x3C4, 6);
write_vga_register(0x3C4, 6, 0xEA); /* enable BIOS extensions */
r.x.ax = 0x6F00; /* installation check */
r.x.bx = 0x0000;
rm_int(0x10, &r);
if ((r.x.bx != 0x5637) && (r.x.bx != 0x4850)) {
write_vga_register(0x3C4, 6, old);
return NULL;
}
r.x.ax = 0x6F00; /* installation check */
r.x.bx = 0x0000;
rm_int(0x10, &r);
if ((r.x.bx != 0x5637) && (r.x.bx != 0x4850)) {
write_vga_register(0x3C4, 6, old);
return NULL;
}
r.x.ax = 0x6F07; /* get configuration */
rm_int(0x10, &r);
if (r.h.al != 0x6F) {
write_vga_register(0x3C4, 6, old);
return NULL;
}
r.x.ax = 0x6F07; /* get configuration */
rm_int(0x10, &r);
if (r.h.al != 0x6F) {
write_vga_register(0x3C4, 6, old);
return NULL;
}
*vidmem = (r.h.ah & 0x7F) * 256;
*vidmem = (r.h.ah & 0x7F) * 256;
v = (read_vga_register(0x3C4, 0x8F)<<8) + read_vga_register(0x3C4, 0x8E);
v = (read_vga_register(0x3C4, 0x8F) << 8) + read_vga_register(0x3C4, 0x8E);
switch (v) {
case 0x7140 ...
0x714F: return "V7 208A";
case 0x7151: return "V7 208B";
case 0x7152: return "V7 208CD";
case 0x7760: return "V7 216BC";
case 0x7763: return "V7 216D";
case 0x7764: return "V7 216E";
case 0x7765: return "V7 216F";
switch (v) {
case 0x7140 ... 0x714F: return "V7 208A";
case 0x7151: return "V7 208B";
case 0x7152: return "V7 208CD";
case 0x7760: return "V7 216BC";
case 0x7763: return "V7 216D";
case 0x7764: return "V7 216E";
case 0x7765: return "V7 216F";
default:
return NULL;
}
default: return NULL;
}
}
/* SetupDriver:
* Fills in our driver header block.
*/
int SetupDriver(AF_DRIVER *af)
{
char *name;
int i;
int SetupDriver(AF_DRIVER *af) {
char *name;
int i;
name = detect(&af->TotalMemory);
name = detect(&af->TotalMemory);
if (!name)
return 1;
if (!name) return 1;
i = 0;
while (af->OemVendorName[i])
i++;
i = 0;
while (af->OemVendorName[i]) i++;
af->OemVendorName[i++] = ',';
af->OemVendorName[i++] = ' ';
af->OemVendorName[i++] = ',';
af->OemVendorName[i++] = ' ';
while (*name)
af->OemVendorName[i++] = *(name++);
while (*name) af->OemVendorName[i++] = *(name++);
af->OemVendorName[i] = 0;
af->OemVendorName[i] = 0;
af->AvailableModes = available_modes;
af->AvailableModes = available_modes;
af->Attributes = (afHaveMultiBuffer |
afHaveVirtualScroll |
afHaveBankedBuffer);
af->Attributes =
(afHaveMultiBuffer | afHaveVirtualScroll | afHaveBankedBuffer);
af->BankSize = 64;
af->BankedBasePtr = 0xA0000;
af->BankSize = 64;
af->BankedBasePtr = 0xA0000;
af->IOPortsTable = ports_table;
af->IOPortsTable = ports_table;
af->SetBank32 = SetBank32;
af->SetBank32Len = (long)SetBank32End - (long)SetBank32;
af->SupplementalExt = ExtStub;
af->GetVideoModeInfo = GetVideoModeInfo;
af->SetVideoMode = SetVideoMode;
af->RestoreTextMode = RestoreTextMode;
af->GetClosestPixelClock = GetClosestPixelClock;
af->SaveRestoreState = SaveRestoreState;
af->SetDisplayStart = SetDisplayStart;
af->SetActiveBuffer = SetActiveBuffer;
af->SetVisibleBuffer = SetVisibleBuffer;
af->GetDisplayStartStatus = GetDisplayStartStatus;
af->SetPaletteData = SetPaletteData;
af->SetBank = SetBank;
af->SetBank32 = SetBank32;
af->SetBank32Len = (long)SetBank32End - (long)SetBank32;
af->SupplementalExt = ExtStub;
af->GetVideoModeInfo = GetVideoModeInfo;
af->SetVideoMode = SetVideoMode;
af->RestoreTextMode = RestoreTextMode;
af->GetClosestPixelClock = GetClosestPixelClock;
af->SaveRestoreState = SaveRestoreState;
af->SetDisplayStart = SetDisplayStart;
af->SetActiveBuffer = SetActiveBuffer;
af->SetVisibleBuffer = SetVisibleBuffer;
af->GetDisplayStartStatus = GetDisplayStartStatus;
af->SetPaletteData = SetPaletteData;
af->SetBank = SetBank;
return 0;
return 0;
}
/* InitDriver:
* The second thing to be called during the init process, after the
* The second thing to be called during the init process, after the
* application has mapped all the memory and I/O resources we need.
*/
int InitDriver(AF_DRIVER *af)
{
hwptr_init(hwptr.IOMemMaps[0], af->IOMemMaps[0]);
hwptr_init(hwptr.IOMemMaps[1], af->IOMemMaps[1]);
hwptr_init(hwptr.IOMemMaps[2], af->IOMemMaps[2]);
hwptr_init(hwptr.IOMemMaps[3], af->IOMemMaps[3]);
hwptr_init(hwptr.BankedMem, af->BankedMem);
hwptr_init(hwptr.LinearMem, af->LinearMem);
int InitDriver(AF_DRIVER *af) {
hwptr_init(hwptr.IOMemMaps[0], af->IOMemMaps[0]);
hwptr_init(hwptr.IOMemMaps[1], af->IOMemMaps[1]);
hwptr_init(hwptr.IOMemMaps[2], af->IOMemMaps[2]);
hwptr_init(hwptr.IOMemMaps[3], af->IOMemMaps[3]);
hwptr_init(hwptr.BankedMem, af->BankedMem);
hwptr_init(hwptr.LinearMem, af->LinearMem);
return 0;
return 0;
}
/* FreeBEX:
* Returns an interface structure for the requested FreeBE/AF extension.
*/
void *FreeBEX(AF_DRIVER *af, unsigned long id)
{
switch (id) {
void *FreeBEX(AF_DRIVER *af, unsigned long id) {
switch (id) {
#ifndef NO_HWPTR
#ifndef NO_HWPTR
case FAFEXT_HWPTR:
/* allow farptr access to video memory */
return &hwptr;
case FAFEXT_HWPTR:
/* allow farptr access to video memory */
return &hwptr;
#endif
#endif
default:
return NULL;
}
default: return NULL;
}
}
/* ExtStub:
* Vendor-specific extension hook: we don't provide any.
*/
int ExtStub()
{
return 0;
int ExtStub( ) {
return 0;
}
/* GetVideoModeInfo:
* Retrieves information about this video mode, returning zero on success
* or -1 if the mode is invalid.
*/
long GetVideoModeInfo(AF_DRIVER *af, short mode, AF_MODE_INFO *modeInfo)
{
VIDEO_MODE *info;
int i;
long GetVideoModeInfo(AF_DRIVER *af, short mode, AF_MODE_INFO *modeInfo) {
VIDEO_MODE *info;
int i;
if ((mode <= 0) || (mode > NUM_MODES))
return -1;
if ((mode <= 0) || (mode > NUM_MODES)) return -1;
info = &mode_list[mode-1];
info = &mode_list[mode - 1];
for (i=0; i<(int)sizeof(AF_MODE_INFO); i++)
((char *)modeInfo)[i] = 0;
for (i = 0; i < (int)sizeof(AF_MODE_INFO); i++) ((char *)modeInfo)[i] = 0;
modeInfo->Attributes = (afHaveMultiBuffer |
afHaveVirtualScroll |
afHaveBankedBuffer);
modeInfo->Attributes =
(afHaveMultiBuffer | afHaveVirtualScroll | afHaveBankedBuffer);
modeInfo->XResolution = info->w;
modeInfo->YResolution = info->h;
modeInfo->BitsPerPixel = info->bpp;
modeInfo->XResolution = info->w;
modeInfo->YResolution = info->h;
modeInfo->BitsPerPixel = info->bpp;
modeInfo->MaxBuffers = (af->TotalMemory*1024) /
(info->w*info->h*BYTES_PER_PIXEL(info->bpp));
modeInfo->MaxBuffers = (af->TotalMemory * 1024) /
(info->w * info->h * BYTES_PER_PIXEL(info->bpp));
if (info->w > 1024) {
modeInfo->MaxBytesPerScanLine = 2048*BYTES_PER_PIXEL(info->bpp);
modeInfo->MaxScanLineWidth = 2048;
}
else {
modeInfo->MaxBytesPerScanLine = 1024*BYTES_PER_PIXEL(info->bpp);
modeInfo->MaxScanLineWidth = 1024;
}
if (info->w > 1024) {
modeInfo->MaxBytesPerScanLine = 2048 * BYTES_PER_PIXEL(info->bpp);
modeInfo->MaxScanLineWidth = 2048;
} else {
modeInfo->MaxBytesPerScanLine = 1024 * BYTES_PER_PIXEL(info->bpp);
modeInfo->MaxScanLineWidth = 1024;
}
modeInfo->BytesPerScanLine = info->w*BYTES_PER_PIXEL(info->bpp);
modeInfo->BnkMaxBuffers = modeInfo->MaxBuffers;
modeInfo->BytesPerScanLine = info->w * BYTES_PER_PIXEL(info->bpp);
modeInfo->BnkMaxBuffers = modeInfo->MaxBuffers;
modeInfo->MaxPixelClock = 135000000;
modeInfo->MaxPixelClock = 135000000;
return 0;
return 0;
}
/* SetVideoMode:
* Sets the specified video mode, returning zero on success.
*/
long SetVideoMode(AF_DRIVER *af, short mode, long virtualX, long virtualY, long *bytesPerLine, int numBuffers, AF_CRTCInfo *crtc)
{
long available_vram;
long used_vram;
int width;
VIDEO_MODE *info;
RM_REGS r;
long SetVideoMode(AF_DRIVER *af, short mode, long virtualX, long virtualY,
long *bytesPerLine, int numBuffers, AF_CRTCInfo *crtc) {
long available_vram;
long used_vram;
int width;
VIDEO_MODE *info;
RM_REGS r;
/* reject anything with hardware stereo, linear framebuffer, or noclear */
if (mode & 0xC400)
return -1;
/* reject anything with hardware stereo, linear framebuffer, or noclear */
if (mode & 0xC400) return -1;
mode &= 0x3FF;
mode &= 0x3FF;
if ((mode <= 0) || (mode > NUM_MODES))
return -1;
if ((mode <= 0) || (mode > NUM_MODES)) return -1;
info = &mode_list[mode-1];
info = &mode_list[mode - 1];
/* call BIOS to set the mode */
r.x.ax = 0x6F05;
r.x.bx = info->num;
rm_int(0x10, &r);
/* call BIOS to set the mode */
r.x.ax = 0x6F05;
r.x.bx = info->num;
rm_int(0x10, &r);
/* adjust the virtual width for widescreen modes */
if (virtualX > info->w) {
if (virtualX > 1024)
return -1;
/* adjust the virtual width for widescreen modes */
if (virtualX > info->w) {
if (virtualX > 1024) return -1;
*bytesPerLine = ((virtualX*BYTES_PER_PIXEL(info->bpp))+15)&0xFFF0;
*bytesPerLine = ((virtualX * BYTES_PER_PIXEL(info->bpp)) + 15) & 0xFFF0;
width = read_vga_register(0x3D4, 0x13);
write_vga_register(0x3D4, 0x13, (width * (*bytesPerLine)) / (info->w*BYTES_PER_PIXEL(info->bpp)));
}
else
*bytesPerLine = info->w*BYTES_PER_PIXEL(info->bpp);
width = read_vga_register(0x3D4, 0x13);
write_vga_register(0x3D4, 0x13,
(width * (*bytesPerLine)) /
(info->w * BYTES_PER_PIXEL(info->bpp)));
} else
*bytesPerLine = info->w * BYTES_PER_PIXEL(info->bpp);
/* tweak some hardware registers */
write_vga_register(0x3C4, 6, 0xEA); /* enable BIOS extensions */
alter_vga_register(0x3C4, 0xE0, 0x80, 0); /* disable split banks */
alter_vga_register(0x3C4, 0xF6, 0xC0, 0xC0); /* disable wrap-around */
alter_vga_register(0x3C4, 0xFC, 0x07, 4); /* set compatibility control */
/* tweak some hardware registers */
write_vga_register(0x3C4, 6, 0xEA); /* enable BIOS extensions */
alter_vga_register(0x3C4, 0xE0, 0x80, 0); /* disable split banks */
alter_vga_register(0x3C4, 0xF6, 0xC0, 0xC0); /* disable wrap-around */
alter_vga_register(0x3C4, 0xFC, 0x07, 4); /* set compatibility control */
/* store info about the current mode */
af_bpp = info->bpp;
af_width = *bytesPerLine;
af_height = MAX(info->h, virtualY);
af_visible_page = 0;
af_active_page = 0;
af_scroll_x = 0;
af_scroll_y = 0;
af_bank = -1;
/* store info about the current mode */
af_bpp = info->bpp;
af_width = *bytesPerLine;
af_height = MAX(info->h, virtualY);
af_visible_page = 0;
af_active_page = 0;
af_scroll_x = 0;
af_scroll_y = 0;
af_bank = -1;
af->BufferEndX = af_width/BYTES_PER_PIXEL(af_bpp)-1;
af->BufferEndY = af_height-1;
af->OriginOffset = 0;
af->BufferEndX = af_width / BYTES_PER_PIXEL(af_bpp) - 1;
af->BufferEndY = af_height - 1;
af->OriginOffset = 0;
used_vram = af_width * af_height * numBuffers;
available_vram = af->TotalMemory*1024 ;
used_vram = af_width * af_height * numBuffers;
available_vram = af->TotalMemory * 1024;
if (used_vram > available_vram)
return -1;
if (used_vram > available_vram) return -1;
if (available_vram-used_vram >= af_width) {
af->OffscreenOffset = used_vram;
af->OffscreenStartY = af_height*numBuffers;
af->OffscreenEndY = available_vram/af_width-1;
}
else {
af->OffscreenOffset = 0;
af->OffscreenStartY = 0;
af->OffscreenEndY = 0;
}
if (available_vram - used_vram >= af_width) {
af->OffscreenOffset = used_vram;
af->OffscreenStartY = af_height * numBuffers;
af->OffscreenEndY = available_vram / af_width - 1;
} else {
af->OffscreenOffset = 0;
af->OffscreenStartY = 0;
af->OffscreenEndY = 0;
}
return 0;
return 0;
}
/* RestoreTextMode:
* Returns to text mode, shutting down the accelerator hardware.
*/
void RestoreTextMode(AF_DRIVER *af)
{
RM_REGS r;
void RestoreTextMode(AF_DRIVER *af) {
RM_REGS r;
r.x.ax = 3;
rm_int(0x10, &r);
r.x.ax = 3;
rm_int(0x10, &r);
}
/* GetClosestPixelClock:
* I don't have a clue what this should return: it is used for the
* refresh rate control.
*/
long GetClosestPixelClock(AF_DRIVER *af, short mode, unsigned long pixelClock)
{
/* ??? */
return 135000000;
long GetClosestPixelClock(AF_DRIVER *af, short mode, unsigned long pixelClock) {
/* ??? */
return 135000000;
}
/* SaveRestoreState:
* Stores the current driver status: not presently implemented.
*/
void SaveRestoreState(AF_DRIVER *af, int subfunc, void *saveBuf)
{
/* not implemented (not used by Allegro) */
void SaveRestoreState(AF_DRIVER *af, int subfunc, void *saveBuf) {
/* not implemented (not used by Allegro) */
}
/* SetDisplayStart:
* Hardware scrolling function. The waitVRT value may be one of:
*
@ -415,114 +351,95 @@ void SaveRestoreState(AF_DRIVER *af, int subfunc, void *saveBuf)
* 0 = set values and return immediately
* 1 = set values and wait for retrace
*/
void SetDisplayStart(AF_DRIVER *af, long x, long y, long waitVRT)
{
if (waitVRT >= 0) {
long a = (x * BYTES_PER_PIXEL(af_bpp)) + ((y + af_visible_page*af_height) * af_width);
void SetDisplayStart(AF_DRIVER *af, long x, long y, long waitVRT) {
if (waitVRT >= 0) {
long a = (x * BYTES_PER_PIXEL(af_bpp)) +
((y + af_visible_page * af_height) * af_width);
asm volatile ("cli");
asm volatile("cli");
if (waitVRT) {
do {
} while (inportb(0x3DA) & 1);
}
if (waitVRT) {
do { } while (inportb(0x3DA) & 1); }
/* write high bits to Video7 registers */
alter_vga_register(0x3C4, 0xF6, 0x30, a>>(18-4));
/* write high bits to Video7 registers */
alter_vga_register(0x3C4, 0xF6, 0x30, a >> (18 - 4));
/* write to normal VGA address registers */
write_vga_register(0x3D4, 0x0D, (a>>2) & 0xFF);
write_vga_register(0x3D4, 0x0C, (a>>10) & 0xFF);
/* write to normal VGA address registers */
write_vga_register(0x3D4, 0x0D, (a >> 2) & 0xFF);
write_vga_register(0x3D4, 0x0C, (a >> 10) & 0xFF);
asm volatile ("sti");
asm volatile("sti");
if (waitVRT) {
do {
} while (!(inportb(0x3DA) & 8));
}
if (waitVRT) {
do { } while (!(inportb(0x3DA) & 8)); }
/* write low 2 bits to VGA horizontal pan register */
write_vga_register(0x3C0, 0x33, a&3);
}
/* write low 2 bits to VGA horizontal pan register */
write_vga_register(0x3C0, 0x33, a & 3);
}
af_scroll_x = x;
af_scroll_y = y;
af_scroll_x = x;
af_scroll_y = y;
}
/* SetActiveBuffer:
* Sets which buffer is being drawn onto, for use in multi buffering
* systems (not used by Allegro).
*/
void SetActiveBuffer(AF_DRIVER *af, long index)
{
if (af->OffscreenOffset) {
af->OffscreenStartY += af_active_page*af_height;
af->OffscreenEndY += af_active_page*af_height;
}
void SetActiveBuffer(AF_DRIVER *af, long index) {
if (af->OffscreenOffset) {
af->OffscreenStartY += af_active_page * af_height;
af->OffscreenEndY += af_active_page * af_height;
}
af_active_page = index;
af_active_page = index;
af->OriginOffset = af_width*af_height*index;
af->OriginOffset = af_width * af_height * index;
if (af->OffscreenOffset) {
af->OffscreenStartY -= af_active_page*af_height;
af->OffscreenEndY -= af_active_page*af_height;
}
if (af->OffscreenOffset) {
af->OffscreenStartY -= af_active_page * af_height;
af->OffscreenEndY -= af_active_page * af_height;
}
}
/* SetVisibleBuffer:
* Sets which buffer is displayed on the screen, for use in multi buffering
* systems (not used by Allegro).
*/
void SetVisibleBuffer(AF_DRIVER *af, long index, long waitVRT)
{
af_visible_page = index;
void SetVisibleBuffer(AF_DRIVER *af, long index, long waitVRT) {
af_visible_page = index;
SetDisplayStart(af, af_scroll_x, af_scroll_y, waitVRT);
SetDisplayStart(af, af_scroll_x, af_scroll_y, waitVRT);
}
/* GetDisplayStartStatus:
* Status poll for triple buffering. Not possible on the majority of
* present cards: this function is just a placeholder.
*/
int GetDisplayStartStatus(AF_DRIVER *af)
{
return 1;
int GetDisplayStartStatus(AF_DRIVER *af) {
return 1;
}
/* SetPaletteData:
* Palette setting routine.
*/
void SetPaletteData(AF_DRIVER *af, AF_PALETTE *pal, long num, long index, long waitVRT)
{
int i;
void SetPaletteData(AF_DRIVER *af, AF_PALETTE *pal, long num, long index,
long waitVRT) {
int i;
if (waitVRT) {
do {
} while (inportb(0x3DA) & 8);
if (waitVRT) {
do {
} while (inportb(0x3DA) & 8);
do {
} while (!(inportb(0x3DA) & 8));
}
do { } while (!(inportb(0x3DA) & 8)); }
for (i=0; i<num; i++) {
outportb(0x3C8, index+i);
outportb(0x3C9, pal[i].red/4);
outportb(0x3C9, pal[i].green/4);
outportb(0x3C9, pal[i].blue/4);
}
for (i = 0; i < num; i++) {
outportb(0x3C8, index + i);
outportb(0x3C9, pal[i].red / 4);
outportb(0x3C9, pal[i].green / 4);
outportb(0x3C9, pal[i].blue / 4);
}
}
/* SetBank32:
* Relocatable bank switch function, called with a bank number in %edx.
*/
@ -558,14 +475,7 @@ asm ("
*/
void SetBank(AF_DRIVER *af, long bank)
{
asm (
" call _SetBank32 "
:
: "d" (bank)
);
asm(" call _SetBank32 " : : "d"(bank));
af_bank = bank;
af_bank = bank;
}

View File

@ -1,7 +1,7 @@
/*
* ______ ____ ______ _____ ______
* ______ ____ ______ _____ ______
* | ____| | _ \| ____| / / _ \| ____|
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | |__ _ __ ___ ___| |_) | |__ / / |_| | |__
* | __| '__/ _ \/ _ \ _ <| __| / /| _ | __|
* | | | | | __/ __/ |_) | |____ / / | | | | |
* |_| |_| \___|\___|____/|______/_/ |_| |_|_|
@ -12,34 +12,29 @@
* See freebe.txt for copyright information.
*/
#include "vbeaf.h"
AF_DRIVER drvhdr =
{
"VBEAF.DRV", /* Signature */
0x200, /* Version */
0, /* DriverRev */
"FreeBE/AF Video-7 driver " FREEBE_VERSION, /* OemVendorName */
"This driver is free software", /* OemCopyright */
NULL, /* AvailableModes */
0, /* TotalMemory */
0, /* Attributes */
0, /* BankSize */
0, /* BankedBasePtr */
0, /* LinearSize */
0, /* LinearBasePtr */
0, /* LinearGranularity */
NULL, /* IOPortsTable */
{ NULL, NULL, NULL, NULL }, /* IOMemoryBase */
{ 0, 0, 0, 0 }, /* IOMemoryLen */
0, /* LinearStridePad */
-1, /* PCIVendorID */
-1, /* PCIDeviceID */
-1, /* PCISubSysVendorID */
-1, /* PCISubSysID */
0 /* Checksum */
AF_DRIVER drvhdr = {
"VBEAF.DRV", /* Signature */
0x200, /* Version */
0, /* DriverRev */
"FreeBE/AF Video-7 driver " FREEBE_VERSION, /* OemVendorName */
"This driver is free software", /* OemCopyright */
NULL, /* AvailableModes */
0, /* TotalMemory */
0, /* Attributes */
0, /* BankSize */
0, /* BankedBasePtr */
0, /* LinearSize */
0, /* LinearBasePtr */
0, /* LinearGranularity */
NULL, /* IOPortsTable */
{ NULL, NULL, NULL, NULL }, /* IOMemoryBase */
{ 0, 0, 0, 0 }, /* IOMemoryLen */
0, /* LinearStridePad */
-1, /* PCIVendorID */
-1, /* PCIDeviceID */
-1, /* PCISubSysVendorID */
-1, /* PCISubSysID */
0 /* Checksum */
};