|
|
//***************************************************************************
//
// Module Name:
//
// permdata.c
//
// Abstract:
//
// This module contains all the global data used by the Permedia2 driver.
//
// Environment:
//
// Kernel mode
//
// Copyright (c) 1994-1998 3Dlabs Inc. Ltd. All rights reserved.
// Copyright (c) 1995-1999 Microsoft Corporation. All Rights Reserved.
//
//***************************************************************************
#include "permedia.h"
/*
* DATA STRUCTURES * =============== */
#if defined(ALLOC_PRAGMA)
#pragma data_seg("PAGED_DATA")
#endif
//
// Permedia2 Legacy Resource List
//
// RangeStart RangeLength
// | | RangeInIoSpace
// | | | RangeVisible
// +-----+-----+ | | | RangeShareable
// | | | | | | RangePassive
// v v v v v v v
VIDEO_ACCESS_RANGE P2LegacyResourceList[] = { {0x000C0000, 0x00000000, 0x00010000, 0, 0, 0, 0}, // ROM location
{0x000A0000, 0x00000000, 0x00020000, 0, 0, 1, 0}, // Frame buffer
{0x000003B0, 0x00000000, 0x0000000C, 1, 1, 1, 0}, // VGA regs
{0x000003C0, 0x00000000, 0x00000020, 1, 1, 1, 0} // VGA regs
};
ULONG P2LegacyResourceEntries = sizeof P2LegacyResourceList / sizeof P2LegacyResourceList[0];
// Entries for 3 bpp colors
// Index(0-7) -> Color(0-255)
ULONG bPal8[] = { 0x00, 0x24, 0x48, 0x6D, 0x91, 0xB6, 0xDA, 0xFF };
// Entries for 2 bpp colors
// Index(0-3) -> Color(0-255)
ULONG bPal4[] = { 0x00, 0x6D, 0xB6, 0xFF };
///////////////////////////////////////////////////////////////////////////
// Video mode table - Lists the information about each individual mode.
//
// Note that any new modes should be added here and to the appropriate
// P2_VIDEO_FREQUENCIES tables.
//
P2_VIDEO_MODES P2Modes[] = { { // 320x200x8bpp
0, // 'Contiguous' Int 10 mode number (for high-colour)
0, // 'Noncontiguous' Int 10 mode number
320, // 'Contiguous' screen stride
{ sizeof(VIDEO_MODE_INFORMATION), // Size of the mode informtion structure
0, // Mode index used in setting the mode
// (filled in later)
320, // X Resolution, in pixels
200, // Y Resolution, in pixels
320, // 'Noncontiguous' screen stride,
// in bytes (distance between the
// start point of two consecutive
// scan lines, in bytes)
1, // Number of video memory planes
8, // Number of bits per plane
1, // Screen Frequency, in Hertz ('1'
// means use hardware default)
320, // Horizontal size of screen in millimeters
240, // Vertical size of screen in millimeters
8, // Number Red pixels in DAC
8, // Number Green pixels in DAC
8, // Number Blue pixels in DAC
0x00000000, // Mask for Red Pixels in non-palette modes
0x00000000, // Mask for Green Pixels in non-palette modes
0x00000000, // Mask for Blue Pixels in non-palette modes
VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS | VIDEO_MODE_PALETTE_DRIVEN | VIDEO_MODE_MANAGED_PALETTE, // Mode description flags.
0, // Video Memory Bitmap Width (filled
// in later)
0 // Video Memory Bitmap Height (filled
// in later)
}, },
{ // 640x400x8bpp
0, 0, 640, { sizeof(VIDEO_MODE_INFORMATION), 0, 640, 400, 640, 1, 8, 1, 320, 240, 8, 8, 8, 0x00000000, 0x00000000, 0x00000000, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS | VIDEO_MODE_PALETTE_DRIVEN | VIDEO_MODE_MANAGED_PALETTE, } },
{ // 320x200x16bpp
0, 0, 640, { sizeof(VIDEO_MODE_INFORMATION), 0, 320, 200, 640, 1, 16, 1, 320, 240, 8, 8, 8, 0x0000f800, // BGR 5:6:5
0x000007e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } },
{ // 640x400x16bpp
0, 0, 1280, { sizeof(VIDEO_MODE_INFORMATION), 0, 640, 400, 1280, 1, 16, 1, 320, 240, 8, 8, 8, 0x0000f800, // BGR 5:6:5
0x000007e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } },
{ // 320x240x8bpp
0x0201, 0x0201, 320, { sizeof(VIDEO_MODE_INFORMATION), 0, 320, 240, 320, 1, 8, 1, 320, 240, 8, 8, 8, 0x00000000, 0x00000000, 0x00000000, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS | VIDEO_MODE_PALETTE_DRIVEN | VIDEO_MODE_MANAGED_PALETTE, } },
{ // 512x384x8bpp
0x0201, 0x0201, 512, { sizeof(VIDEO_MODE_INFORMATION), 0, 512, 384, 512, 1, 8, 1, 320, 240, 8, 8, 8, 0x00000000, 0x00000000, 0x00000000, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS | VIDEO_MODE_PALETTE_DRIVEN | VIDEO_MODE_MANAGED_PALETTE, } },
{ // 640x480x8bpp
0x0201, 0x0201, 640, { sizeof(VIDEO_MODE_INFORMATION), 0, 640, 480, 640, 1, 8, 1, 320, 240, 8, 8, 8, 0x00000000, 0x00000000, 0x00000000, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS | VIDEO_MODE_PALETTE_DRIVEN | VIDEO_MODE_MANAGED_PALETTE, } },
{ // 800x600x8bpp
0x0103, 0x0203, 800, { sizeof(VIDEO_MODE_INFORMATION), 0, 800, 600, 800, 1, 8, 1, 320, 240, 8, 8, 8, 0x00000000, 0x00000000, 0x00000000, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS | VIDEO_MODE_PALETTE_DRIVEN | VIDEO_MODE_MANAGED_PALETTE, } },
{ // 1024x768x8bpp
0x0205, 0x0205, 1024, { sizeof(VIDEO_MODE_INFORMATION), 0, 1024, 768, 1024, 1, 8, 1, 320, 240, 8, 8, 8, 0x00000000, 0x00000000, 0x00000000, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS | VIDEO_MODE_PALETTE_DRIVEN | VIDEO_MODE_MANAGED_PALETTE, } },
{ // 1152x870x8bpp
0x0207, 0x0207, 1152, { sizeof(VIDEO_MODE_INFORMATION), 0, 1152, 870, 1152, 1, 8, 1, 320, 240, 8, 8, 8, 0x00000000, 0x00000000, 0x00000000, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS | VIDEO_MODE_PALETTE_DRIVEN | VIDEO_MODE_MANAGED_PALETTE, } },
{ // 1280x1024x8bpp
0x0107, 0x0107, 1280, { sizeof(VIDEO_MODE_INFORMATION), 0, 1280, 1024, 1280, 1, 8, 1, 320, 240, 8, 8, 8, 0x00000000, 0x00000000, 0x00000000, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS | VIDEO_MODE_PALETTE_DRIVEN | VIDEO_MODE_MANAGED_PALETTE, } },
{ // 1600x1200x8bpp
0x0120, 0x0120, 1600, { sizeof(VIDEO_MODE_INFORMATION), 0, 1600, 1200, 1600, 1, 8, 1, 320, 240, 8, 8, 8, 0x00000000, 0x00000000, 0x00000000, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS | VIDEO_MODE_PALETTE_DRIVEN | VIDEO_MODE_MANAGED_PALETTE, } },
{ // 320x240x16bpp
0x0111, 0x0211, 640, { sizeof(VIDEO_MODE_INFORMATION), 0, 320, 240, 640, 1, 16, 1, 320, 240, 8, 8, 8, 0x0000f800, // BGR 5:6:5
0x000007e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } },
{ // 512x384x16bpp
0x0111, 0x0211, 1024, { sizeof(VIDEO_MODE_INFORMATION), 0, 512, 384, 1024, 1, 16, 1, 320, 240, 8, 8, 8, 0x0000f800, // BGR 5:6:5
0x000007e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } },
{ // 640x480x16bpp
0x0111, 0x0211, 1280, { sizeof(VIDEO_MODE_INFORMATION), 0, 640, 480, 1280, 1, 16, 1, 320, 240, 8, 8, 8, 0x0000f800, // BGR 5:6:5
0x000007e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } },
{ // 800x600x16bpp
0x0114, 0x0214, 1600, { sizeof(VIDEO_MODE_INFORMATION), 0, 800, 600, 1600, 1, 16, 1, 320, 240, 8, 8, 8, 0x0000f800, // BGR 5:6:5
0x000007e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } },
{ // 1024x768x16bpp
0x0117, 0x0117, 2048, { sizeof(VIDEO_MODE_INFORMATION), 0, 1024, 768, 2048, 1, 16, 1, 320, 240, 8, 8, 8, 0x0000f800, // BGR 5:6:5
0x000007e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } },
{ // 1152x870x16bpp
0x0118, 0x0222, 2304, { sizeof(VIDEO_MODE_INFORMATION), 0, 1152, 870, 2304, 1, 16, 1, 320, 240, 8, 8, 8, 0x0000f800, // BGR 5:6:5
0x000007e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } },
{ // 1280x1024x16bpp
0x011A, 0x021A, 2560, { sizeof(VIDEO_MODE_INFORMATION), 0, 1280, 1024, 2560, 1, 16, 1, 320, 240, 8, 8, 8, 0x0000f800, // BGR 5:6:5
0x000007e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } },
{ // 1600x1200x16bpp
0x0121, 0x0121, 3200, { sizeof(VIDEO_MODE_INFORMATION), 0, 1600, 1200, 3200, 1, 16, 1, 320, 240, 8, 8, 8, 0x0000f800, // BGR 5:6:5
0x000007e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } },
{ // 320x240x15bpp
0x0111, 0x0211, 640, { sizeof(VIDEO_MODE_INFORMATION), 0, 320, 240, 640, 1, 15, 1, 320, 240, 8, 8, 8, 0x00007c00, // BGR 5:5:5
0x000003e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } },
{ // 512x384x15bpp
0x0111, 0x0211, 1024, { sizeof(VIDEO_MODE_INFORMATION), 0, 512, 384, 1024, 1, 15, 1, 320, 240, 8, 8, 8, 0x00007c00, // BGR 5:5:5
0x000003e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } },
{ // 640x480x15bpp
0x0111, 0x0211, 1280, { sizeof(VIDEO_MODE_INFORMATION), 0, 640, 480, 1280, 1, 15, 1, 320, 240, 8, 8, 8, 0x00007c00, // BGR 5:5:5
0x000003e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } },
{ // 800x600x15bpp
0x0114, 0x0214, 1600, { sizeof(VIDEO_MODE_INFORMATION), 0, 800, 600, 1600, 1, 15, 1, 320, 240, 8, 8, 8, 0x00007c00, // BGR 5:5:5
0x000003e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } },
{ // 1024x768x15bpp
0x0117, 0x0117, 2048, { sizeof(VIDEO_MODE_INFORMATION), 0, 1024, 768, 2048, 1, 15, 1, 320, 240, 8, 8, 8, 0x00007c00, // BGR 5:5:5
0x000003e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } },
{ // 1152x870x15bpp
0x0118, 0x0222, 2304, { sizeof(VIDEO_MODE_INFORMATION), 0, 1152, 870, 2304, 1, 15, 1, 320, 240, 8, 8, 8, 0x00007c00, // BGR 5:5:5
0x000003e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } },
{ // 1280x1024x15bpp
0x011A, 0x021A, 2560, { sizeof(VIDEO_MODE_INFORMATION), 0, 1280, 1024, 2560, 1, 15, 1, 320, 240, 8, 8, 8, 0x00007c00, // BGR 5:5:5
0x000003e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } },
{ // 1600x1200x15bpp
0x0121, 0x0121, 3200, { sizeof(VIDEO_MODE_INFORMATION), 0, 1600, 1200, 3200, 1, 15, 1, 320, 240, 8, 8, 8, 0x00007c00, // BGR 5:5:5
0x000003e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } },
{ // 640x480x12bpp
0x0112, 0x0220, 2560, { sizeof(VIDEO_MODE_INFORMATION), 0, 640, 480, 2560, 1, 12, 1, 320, 240, 8, 8, 8, 0x000f0000, // BGR 4:4:4
0x00000f00, 0x0000000f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } },
{ // 800x600x12bpp
0x0115, 0x0221, 3200, { sizeof(VIDEO_MODE_INFORMATION), 0, 800, 600, 3200, 1, 12, 1, 320, 240, 8, 8, 8, 0x000f0000, // BGR 4:4:4
0x00000f00, 0x0000000f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } },
{ // 1024x768x12bpp
0x0118, 0x0222, 4096, { sizeof(VIDEO_MODE_INFORMATION), 0, 1024, 768, 4096, 1, 12, 1, 320, 240, 8, 8, 8, 0x000f0000, // BGR 4:4:4
0x00000f00, 0x0000000f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } },
{ // 1152x870x12bpp
0x0118, 0x0222, 4608, { sizeof(VIDEO_MODE_INFORMATION), 0, 1152, 870, 4608, 1, 12, 1, 320, 240, 8, 8, 8, 0x000f0000, // BGR 4:4:4
0x00000f00, 0x0000000f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } },
{ // 1280x1024x12bpp
0x011B, 0x011B, 5120, { sizeof(VIDEO_MODE_INFORMATION), 0, 1280, 1024, 5120, 1, 12, 1, 320, 240, 8, 8, 8, 0x000f0000, // BGR 4:4:4
0x00000f00, 0x0000000f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } },
{ // 1600x1200x12bpp
0x0122, 0x0122, 6400, { sizeof(VIDEO_MODE_INFORMATION), 0, 1600, 1200, 6400, 1, 12, 1, 320, 240, 8, 8, 8, 0x000f0000, // BGR 4:4:4
0x00000f00, 0x0000000f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } },
{ // 320x240x32bpp
0x0112, 0x0220, 1280, { sizeof(VIDEO_MODE_INFORMATION), 0, 320, 240, 1280, 1, 32, 1, 320, 240, 8, 8, 8, 0x00ff0000, // BGR 8:8:8
0x0000ff00, 0x000000ff, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } },
{ // 512x384x32bpp
0x0112, 0x0220, 2048, { sizeof(VIDEO_MODE_INFORMATION), 0, 512, 384, 2048, 1, 32, 1, 320, 240, 8, 8, 8, 0x00ff0000, // BGR 8:8:8
0x0000ff00, 0x000000ff, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } },
{ // 640x480x32bpp
0x0112, 0x0220, 2560, { sizeof(VIDEO_MODE_INFORMATION), 0, 640, 480, 2560, 1, 32, 1, 320, 240, 8, 8, 8, 0x00ff0000, // BGR 8:8:8
0x0000ff00, 0x000000ff, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } },
{ // 800x600x32bpp
0x0115, 0x0221, 3200, { sizeof(VIDEO_MODE_INFORMATION), 0, 800, 600, 3200, 1, 32, 1, 320, 240, 8, 8, 8, 0x00ff0000, // BGR 8:8:8
0x0000ff00, 0x000000ff, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } },
{ // 1024x768x32bpp
0x0118, 0x0222, 4096, { sizeof(VIDEO_MODE_INFORMATION), 0, 1024, 768, 4096, 1, 32, 1, 320, 240, 8, 8, 8, 0x00ff0000, // BGR 8:8:8
0x0000ff00, 0x000000ff, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } },
{ // 1152x870x32bpp
0x0118, 0x0222, 4608, { sizeof(VIDEO_MODE_INFORMATION), 0, 1152, 870, 4608, 1, 32, 1, 320, 240, 8, 8, 8, 0x00ff0000, // BGR 8:8:8
0x0000ff00, 0x000000ff, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } },
{ // 1280x1024x32bpp
0x011B, 0x011B, 5120, { sizeof(VIDEO_MODE_INFORMATION), 0, 1280, 1024, 5120, 1, 32, 1, 320, 240, 8, 8, 8, 0x00ff0000, // BGR 8:8:8
0x0000ff00, 0x000000ff, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } },
{ // 1600x1200x32bpp
0x0122, 0x0122, 6400, { sizeof(VIDEO_MODE_INFORMATION), 0, 1600, 1200, 6400, 1, 32, 1, 320, 240, 8, 8, 8, 0x00ff0000, // BGR 8:8:8
0x0000ff00, 0x000000ff, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } },
{ // 640x480x24bpp
0, // 'Contiguous' Int 10 mode number (for high-colour) (UNUSED)
0, // 'Noncontiguous' Int 10 mode number (UNUSED)
1920, // 'Contiguous' screen stride (640 by 3 bytes/pixel)
{ sizeof(VIDEO_MODE_INFORMATION), // Size of the mode informtion structure
0, // Mode index used in setting the mode
// (filled in later)
640, // X Resolution, in pixels
480, // Y Resolution, in pixels
1920, // 'Noncontiguous' screen stride,
// in bytes (distance between the
// start point of two consecutive
// scan lines, in bytes)
1, // Number of video memory planes
24, // Number of bits per plane
1, // Screen Frequency, in Hertz ('1'
// means use hardware default)
320, // Horizontal size of screen in millimeters
240, // Vertical size of screen in millimeters
8, // Number Red pixels in DAC
8, // Number Green pixels in DAC
8, // Number Blue pixels in DAC
0x00ff0000, // Mask for Red Pixels in non-palette modes
0x0000ff00, // Mask for Green Pixels in non-palette modes
0x000000ff, // Mask for Blue Pixels in non-palette modes
VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, // Mode description flags.
}, },
{ // 800x600x24bpp
0, // 'Contiguous' Int 10 mode number (for high-colour) (UNUSED)
0, // 'Noncontiguous' Int 10 mode number (UNUSED)
2400, // 'Contiguous' screen stride (800 by 3 bytes/pixel)
{ sizeof(VIDEO_MODE_INFORMATION), // Size of the mode informtion structure
0, // Mode index used in setting the mode
// (filled in later)
800, // X Resolution, in pixels
600, // Y Resolution, in pixels
2400, // 'Noncontiguous' screen stride,
// in bytes (distance between the
// start point of two consecutive
// scan lines, in bytes)
1, // Number of video memory planes
24, // Number of bits per plane
1, // Screen Frequency, in Hertz ('1'
// means use hardware default)
320, // Horizontal size of screen in millimeters
240, // Vertical size of screen in millimeters
8, // Number Red pixels in DAC
8, // Number Green pixels in DAC
8, // Number Blue pixels in DAC
0x00ff0000, // Mask for Red Pixels in non-palette modes
0x0000ff00, // Mask for Green Pixels in non-palette modes
0x000000ff, // Mask for Blue Pixels in non-palette modes
VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, // Mode description flags.
}, },
{ // 1024x768x24bpp
0, // 'Contiguous' Int 10 mode number (for high-colour) (UNUSED)
0, // 'Noncontiguous' Int 10 mode number (UNUSED)
3072, // 'Contiguous' screen stride (1024 by 3 bytes/pixel)
{ sizeof(VIDEO_MODE_INFORMATION), // Size of the mode informtion structure
0, // Mode index used in setting the mode
// (filled in later)
1024, // X Resolution, in pixels
768, // Y Resolution, in pixels
3072, // 'Noncontiguous' screen stride,
// in bytes (distance between the
// start point of two consecutive
// scan lines, in bytes)
1, // Number of video memory planes
24, // Number of bits per plane
1, // Screen Frequency, in Hertz ('1'
// means use hardware default)
320, // Horizontal size of screen in millimeters
240, // Vertical size of screen in millimeters
8, // Number Red pixels in DAC
8, // Number Green pixels in DAC
8, // Number Blue pixels in DAC
0x00ff0000, // Mask for Red Pixels in non-palette modes
0x0000ff00, // Mask for Green Pixels in non-palette modes
0x000000ff, // Mask for Blue Pixels in non-palette modes
VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, // Mode description flags.
}, },
{ // 1152x870x24bpp
0, // 'Contiguous' Int 10 mode number (for high-colour) (UNUSED)
0, // 'Noncontiguous' Int 10 mode number (UNUSED)
3456, // 'Contiguous' screen stride (1152 by 3 bytes/pixel)
{ sizeof(VIDEO_MODE_INFORMATION), // Size of the mode informtion structure
0, // Mode index used in setting the mode
// (filled in later)
1152, // X Resolution, in pixels
870, // Y Resolution, in pixels
3072, // 'Noncontiguous' screen stride,
// in bytes (distance between the
// start point of two consecutive
// scan lines, in bytes)
1, // Number of video memory planes
24, // Number of bits per plane
1, // Screen Frequency, in Hertz ('1'
// means use hardware default)
320, // Horizontal size of screen in millimeters
240, // Vertical size of screen in millimeters
8, // Number Red pixels in DAC
8, // Number Green pixels in DAC
8, // Number Blue pixels in DAC
0x00ff0000, // Mask for Red Pixels in non-palette modes
0x0000ff00, // Mask for Green Pixels in non-palette modes
0x000000ff, // Mask for Blue Pixels in non-palette modes
VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, // Mode description flags.
}, },
{ // 1280x1024x24bpp
0, // 'Contiguous' Int 10 mode number (for high-colour) (UNUSED)
0, // 'Noncontiguous' Int 10 mode number (UNUSED)
3840, // 'Contiguous' screen stride (1280 by 3 bytes/pixel)
{ sizeof(VIDEO_MODE_INFORMATION), // Size of the mode informtion structure
0, // Mode index used in setting the mode
// (filled in later)
3840, // X Resolution, in pixels
1280, // Y Resolution, in pixels
1024, // 'Noncontiguous' screen stride,
// in bytes (distance between the
// start point of two consecutive
// scan lines, in bytes)
1, // Number of video memory planes
24, // Number of bits per plane
1, // Screen Frequency, in Hertz ('1'
// means use hardware default)
320, // Horizontal size of screen in millimeters
240, // Vertical size of screen in millimeters
8, // Number Red pixels in DAC
8, // Number Green pixels in DAC
8, // Number Blue pixels in DAC
0x00ff0000, // Mask for Red Pixels in non-palette modes
0x0000ff00, // Mask for Green Pixels in non-palette modes
0x000000ff, // Mask for Blue Pixels in non-palette modes
VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, // Mode description flags.
}, },
{ // 1600x1200x24bpp
0, // 'Contiguous' Int 10 mode number (for high-colour) (UNUSED)
0, // 'Noncontiguous' Int 10 mode number (UNUSED)
4800, // 'Contiguous' screen stride (1600 by 3 bytes/pixel)
{ sizeof(VIDEO_MODE_INFORMATION), // Size of the mode informtion structure
0, // Mode index used in setting the mode
// (filled in later)
1600, // X Resolution, in pixels
1280, // Y Resolution, in pixels
4800, // 'Noncontiguous' screen stride,
// in bytes (distance between the
// start point of two consecutive
// scan lines, in bytes)
1, // Number of video memory planes
24, // Number of bits per plane
1, // Screen Frequency, in Hertz ('1'
// means use hardware default)
320, // Horizontal size of screen in millimeters
240, // Vertical size of screen in millimeters
8, // Number Red pixels in DAC
8, // Number Green pixels in DAC
8, // Number Blue pixels in DAC
0x00ff0000, // Mask for Red Pixels in non-palette modes
0x0000ff00, // Mask for Green Pixels in non-palette modes
0x000000ff, // Mask for Blue Pixels in non-palette modes
VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, // Mode description flags.
}, }, };
ULONG NumP2VideoModes = sizeof(P2Modes) / sizeof(P2Modes[0]);
/*****************************************************************************
* Reference Permedia2 hard-wired mode-sets. * * The order they appear here is the order they appear in the Display Applet. * ****************************************************************************/
//
// We can replace the hard coded list of frequencies with a hard-coded list
// of pixel depths, which is a lot easier to maintain, and takes less memory.
// What we then do is for each 'TIMINGS' registry entry and for each timing
// entry we create 'P2DepthCnt' frequency table entries, one for each pixel
// depth. Once we have done that then we validate the entries in the frequency
// list with the 'P2VideoModes' array.
//
ULONG P2DepthList [] = { 8, 16, 24, 32 };
#define P2DepthCnt (sizeof(P2DepthList) / sizeof(P2DepthList[0]))
//
// VESA_LIST []
// ------------
//
// This is an array of structures containing the VESA definition
// for a width, height, frequency combination.
//
//
typedef struct // Extended VESA TIMING structure
{ ULONG Width; ULONG Height; ULONG Frequency; VESA_TIMING_STANDARD VESAInfo; } VESA_TIMING_STANDARD_EXT;
VESA_TIMING_STANDARD_EXT VESA_LIST [] = { //
// I have commented out the VESA-compliant 640x480@60 and replaced it
// with a VGA-compliant one. This is because some monitors won't SYNC
// with the values that we have.
//
//640,480,60, {0x064,0x02,0x08,0x0a,0x00,0x1f1,0x01,0x03,0x0d,0x00 },
640,480,60, {0x064,0x02,0x0c,0x06,0x00,0x20d,0x0a,0x02,0x21,0x00 }, 640,480,75, {0x066,0x03,0x08,0x0b,0x00,0x1f6,0x01,0x03,0x12,0x00 }, 640,480,85, {0x068,0x04,0x08,0x0c,0x00,0x1f9,0x01,0x03,0x15,0x00 }, 640,480,100, {0x06a,0x05,0x08,0x0d,0x00,0x1fd,0x01,0x03,0x19,0x00 },
800,600,60, {0x084,0x05,0x10,0x0b,0x01,0x274,0x01,0x04,0x17,0x01 }, 800,600,75, {0x084,0x02,0x0a,0x14,0x01,0x271,0x01,0x03,0x15,0x01 }, 800,600,85, {0x083,0x04,0x08,0x13,0x01,0x277,0x01,0x03,0x1b,0x01 }, 800,600,100, {0x086,0x06,0x0b,0x11,0x01,0x27c,0x01,0x03,0x20,0x01 },
1024,768,60, {0x0a8,0x03,0x11,0x14,0x01,0x326,0x04,0x06,0x1c,0x01 }, 1024,768,75, {0x0a4,0x02,0x0c,0x16,0x01,0x320,0x01,0x03,0x1c,0x01 }, 1024,768,85, {0x0ac,0x06,0x0c,0x1a,0x01,0x328,0x01,0x03,0x24,0x01 }, 1024,768,100, {0x0ae,0x09,0x0e,0x17,0x01,0x32e,0x01,0x03,0x2a,0x01 },
1152,870,60, {0x0c8,0x08,0x10,0x20,0x01,0x38a,0x01,0x03,0x20,0x01 }, 1152,870,75, {0x0c2,0x09,0x10,0x19,0x01,0x38c,0x01,0x03,0x22,0x01 }, 1152,870,85, {0x0c5,0x08,0x10,0x1d,0x01,0x391,0x01,0x03,0x27,0x01 }, 1152,870,100, {0x0c4,0x0a,0x10,0x1a,0x01,0x39a,0x01,0x03,0x30,0x01 },
1280,1024,60, {0x0d3,0x06,0x0e,0x1f,0x01,0x42a,0x01,0x03,0x26,0x01 }, 1280,1024,75, {0x0d3,0x02,0x12,0x1f,0x01,0x42a,0x01,0x03,0x26,0x01 }, 1280,1024,85, {0x0d8,0x06,0x14,0x1e,0x01,0x430,0x01,0x03,0x2c,0x01 }, 1280,1024,100, {0x0dc,0x0c,0x12,0x1e,0x01,0x43d,0x01,0x03,0x39,0x01 },
1600,1200,60, {0x10e,0x08,0x18,0x26,0x01,0x4e2,0x01,0x03,0x2e,0x01 }, 1600,1200,75, {0x10e,0x08,0x18,0x26,0x01,0x4e2,0x01,0x03,0x2e,0x01 }, 1600,1200,85, {0x10e,0x08,0x18,0x26,0x01,0x4e2,0x01,0x03,0x2e,0x01 }, 1600,1200,100, {0x114,0x10,0x16,0x26,0x01,0x4f7,0x01,0x03,0x43,0x01 },
//320,240,60, {0x032,0x01,0x04,0x05,0x00,0x0f9,0x01,0x03,0x05,0x00 },
320,240,75, {0x033,0x02,0x04,0x05,0x00,0x0fb,0x01,0x03,0x07,0x00 }, 320,240,85, {0x034,0x02,0x04,0x06,0x00,0x0fd,0x01,0x03,0x09,0x00 }, 320,240,100, {0x034,0x02,0x04,0x06,0x00,0x0ff,0x01,0x03,0x0b,0x00 },
//
// TMM: 512x384@60Hz seems to work OK, but some older monitors refuse to
// SYNC, so I have commented it out.
//
//512,384,60, {0x04c,0x00,0x06,0x06,0x00,0x18e,0x01,0x03,0x0a,0x00 },
512,384,75, {0x050,0x02,0x06,0x08,0x00,0x192,0x01,0x03,0x0e,0x00 }, 512,384,85, {0x052,0x02,0x07,0x09,0x00,0x194,0x01,0x03,0x10,0x00 }, 512,384,100, {0x052,0x02,0x07,0x09,0x00,0x197,0x01,0x03,0x13,0x00 },
//320,200,60, {0x02a,0x00,0x03,0x01,0x00,0x0d0,0x01,0x03,0x04,0x00 },
320,200,75, {0x02c,0x00,0x04,0x02,0x00,0x0d2,0x01,0x03,0x06,0x00 }, 320,200,85, {0x02e,0x00,0x04,0x03,0x00,0x0d3,0x01,0x03,0x07,0x00 }, 320,200,100, {0x030,0x00,0x04,0x04,0x00,0x0d5,0x01,0x03,0x09,0x00 },
//640,400,60, {0x062,0x01,0x08,0x09,0x00,0x19f,0x01,0x03,0x0b,0x01 },
640,400,75, {0x064,0x02,0x08,0x0a,0x00,0x1a2,0x01,0x03,0x0e,0x01 }, 640,400,85, {0x066,0x03,0x08,0x0b,0x00,0x1a5,0x01,0x03,0x11,0x01 }, 640,400,100, {0x068,0x04,0x08,0x0c,0x00,0x1a8,0x01,0x03,0x14,0x01 }
};
#define VESA_CNT (sizeof(VESA_LIST) / sizeof(VESA_LIST [0]))
VESA_TIMING_STANDARD_EXT VESA_LIST_P2S [] = { 1280,1024,85, {0x0c6,0x04,0x0b,0x17,0x01,0x41e,0x01,0x03,0x1a,0x01 }, 1600,1200,60, {0x106,0x0a,0x15,0x1f,0x01,0x4d4,0x01,0x03,0x20,0x01 } };
#define VESA_CNT_P2S (sizeof(VESA_LIST_P2S) / sizeof(VESA_LIST_P2S [0]))
P2_VIDEO_FREQUENCIES freqList[VESA_CNT * P2DepthCnt + 1];
#if defined(ALLOC_PRAGMA)
#pragma data_seg()
#endif
/*
* THE CODE * ======== */
#if defined(ALLOC_PRAGMA)
#pragma alloc_text(PAGE,GetVideoTiming)
#pragma alloc_text(PAGE,BuildFrequencyList)
#endif
BOOLEAN GetVideoTiming ( PHW_DEVICE_EXTENSION hwDeviceExtension, ULONG xRes, ULONG yRes, ULONG Freq, ULONG Depth, VESA_TIMING_STANDARD * VESATimings )
/*++
Routine Description:
Given a width, height and frequency this function will return a VESA timing information.
The information is extracted from the timing definitions in the registry, if there aren't any in the registry then it looks up the values in the VESA_LIST.
--*/ { ULONG i, j, hackCnt; BOOLEAN retVal; VESA_TIMING_STANDARD_EXT * hackList = NULL;
DEBUG_PRINT((2, "GetVideoTiming: xres %d, yres %d, freq %d, Depth\n", xRes, yRes, Freq, Depth));
//
// Allow us to put hacks in for chips that can't support the proper
// VESA values
//
if ((DEVICE_FAMILY_ID(hwDeviceExtension->deviceInfo.DeviceId) == PERMEDIA_P2S_ID || (DEVICE_FAMILY_ID(hwDeviceExtension->deviceInfo.DeviceId) == PERMEDIA_P2_ID && hwDeviceExtension->deviceInfo.RevisionId == PERMEDIA2A_REV_ID)) && Depth > 16) {
//
// P2S & P2A can't handle VESA versions of 1600x1200 & 1280x1024, 32BPP
//
hackList = VESA_LIST_P2S; hackCnt = VESA_CNT_P2S; }
retVal = FALSE; // Nothing found yet
//
// If we have a hack list then search through it
//
if (hackList != NULL) { for (i = 0; !retVal && i < hackCnt; i++) { //
// Comparewidth, height and frequency
//
if (hackList [i].Width == xRes && hackList [i].Height == yRes && hackList [i].Frequency == Freq ) { //
// We got a match
//
*VESATimings = hackList [i].VESAInfo;
retVal = TRUE;
DEBUG_PRINT((2, "Found value in hack list\n")) ; } } }
//
// Loop through the table looking for a match
//
for (i = 0; !retVal && i < VESA_CNT; i++) { //
// Comparewidth, height and frequency
//
if (VESA_LIST [i].Width == xRes && VESA_LIST [i].Height == yRes && VESA_LIST [i].Frequency == Freq ) { //
// We got a match
//
*VESATimings = VESA_LIST [i].VESAInfo;
retVal = TRUE; } }
return (retVal); }
LONG BuildFrequencyList ( PHW_DEVICE_EXTENSION hwDeviceExtension )
/*++
Routine Description:
This function creates a table of P2_VIDEO_FREQENCIES entries pointedat by hwDeviceExtension->FrequencyTable.
The list is created by examining the 'TIMING\xxx,yyy,zzz' registry entries, if there aren't any entries then the hard-coded VESA_LIST is used.
--*/ { ULONG i, j, k;
hwDeviceExtension->FrequencyTable = freqList;
//
// loop through the list of VESA resolutions
//
for (i = 0, k = 0; i < VESA_CNT; i++) { //
// For every supported pixel depth, create a frequency entry
//
for (j = 0; j < P2DepthCnt; j++, k++) { freqList [k].BitsPerPel = P2DepthList [j]; freqList [k].ScreenWidth = VESA_LIST [i].Width; freqList [k].ScreenHeight = VESA_LIST [i].Height; freqList [k].ScreenFrequency = VESA_LIST [i].Frequency; freqList [k].PixelClock = ( (VESA_LIST[i].VESAInfo.HTot * VESA_LIST [i].VESAInfo.VTot * 8) / 100 ) * VESA_LIST [i].Frequency; } }
return (TRUE); }
|