diff options
55 files changed, 36354 insertions, 0 deletions
diff --git a/man/via.man b/man/via.man new file mode 100644 index 0000000..23e0526 --- /dev/null +++ b/man/via.man @@ -0,0 +1,121 @@ +.\" $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via.man,v 1.4 2003/12/19 22:00:46 dawes Exp $ +.\" shorthand for double quote that works everywhere. +.ds q \N'34' +.TH VIA __drivermansuffix__ __vendorversion__ +.SH NAME +via \- VIA video driver +.SH SYNOPSIS +.nf +.B "Section \*qDevice\*q" +.BI " Identifier \*q" devname \*q +.B " Driver \*qvia\*q" +\ \ ... +.B EndSection +.fi +.SH DESCRIPTION +.B via +is an XFree86 driver for VIA video chipsets. +.PP +The +.B via +driver supports the VIA CLE266 (CLE3122, CLE3022) chipset video and the +VIA KM400/K8M800 VT3204/5/7204/5 video, including 2D acceleration and the Xv +video overlay extensions. Flat panel, TV and VGA outputs are supported. +.PP +Direct rendering 3D is available for this device only using XFree86 4.2 +builds. If you are interested in porting the DRI support to current XFree86 +then please see the DRI project on sourceforge.net. +.PP +.SH CONFIGURATION DETAILS +Please refer to XF86Config(__filemansuffix__) for general configuration +details. This section only covers configuration details specific to this +driver. +.PP +The following driver +.B options +are supported +.TP +.BI "Option \*qNoAccel\*q \*q" boolean \*q +Disable or enable acceleration. Default: acceleration is enabled. +.TP +.BI "Option \*qHWCursor\*q \*q" boolean \*q +Disable or enable use of hardware cursors. The default is enabled. +.TP +.BI "Option \*qSWCursor\*q \*q" boolean \*q +Disable or enable the use of a software cursor. The default is disabled. +.TP +.BI "Option \*qShadowFB\*q \*q" boolean \*q +Use a shadow frame buffer. This is required when rotating the display, +but otherwise defaults to disabled. +.TP +.BI "Option \*qUseBIOS\*q \*q" boolean \*q +Use the video BIOS to set modes. Default false. +.TP +.BI "Option \*qVideoRAM\*q \*q" boolean \*q +Override the VideoRAM auto detection. This should never be needed. +.TP +.BI "Option \*qRotate\*q \*q" string \*q +Rotate the display either clockwise ("CW") or counter clockwise ("CCW"). +Rotation is only supported unaccelerated. +.TP +.BI "Option \*qActiveDevice\*q \*q" string \*q +Specify the active device combination. The choices are "CRT,TV", +"CRT,LCD", "CRT,DFP", "TV,DFP", "CRT", "LCD", or "DFP", for the various +supported combinations of VGA CRT output, LCD panel output, DFP output and +TV output. +.TP +.BI "Option \*qLCDDualEdge\*q \*q" boolean \*q +Use dual edge mode to set the LCD. +.TP +.BI "Option \*qCenter\*q \*q" boolean \*q +Disable or enable image centering on DVI displays. +.TP +.BI "Option \*qPanelSize\*q \*q" string \*q +Specify the size (width x height) of the LCD panel attached to the +system. Sizes 640x480, 800x600, 1024x768, 1280x1024, and 1400x1050 +are supported. +.TP +.BI "Option \*qTVDotCrawl\*q \*q" boolean \*q +Disable or enable dotcrawl. +.TP +.BI "Option \*qTVType\*q \*q" string \*q +Specify TV output format. The driver currently supports NTSC and +PAL timings only. +.TP +.BI "Option \*qTVOutput\*q \*q" string \*q +Specify which TV output to use. The driver supports "S-Video", "Composite", +"SC", "RGB" and "YCbCr" outputs. Note that on many boards the composite +video port is shared with audio out and jumper selected. +.TP +.BI "Option \*qTVVScan\*q \*q" string \*q +Specify whether to underscan the TV image (bordering it with black), or +overscan it (losing the edges of the picture). +.TP +.BI "Option \*qTVHScale\*q \*q" string \*q +Not yet implemented. +.TP +.BI "Option \*qTVEncoder\*q \*q" string \*q +Specify which TV encoder chip is attached to the system. The driver +currently supports the VT1621 and VT1622 encoders. +.TP +.BI "Option \*qRefresh\*q \*q" integer \*q +Specify the desired refresh. +.TP +.BI "Option \*qDisableVQ\*q \*q" boolean \*q +Disable or enable the use of VQ. VQ is enabled by default. +.TP +.BI "Option \*qCap0Deinterlace\*q \*q" string \*q +Set the capture 0 port interlace mode to either Bob or Weave. +.TP +.BI "Option \*qCap1Deinterlace\*q \*q" string \*q +Set the capture 1 port interlace mode to either Bob or Weave. +.TP +.BI "Option \*qCap0FieldSwap\*q \*q" string \*q +Perform field swapping on capture port 0. +.TP +.BI "Option \*qDRIXINERAMA\*q \*q" boolean \*q +Set DRI Xinerama mode. Currently unsupported. +.SH "SEE ALSO" +XFree86(1), XF86Config(__filemansuffix__), xf86config(1), Xserver(1), X(__miscmansuffix__) +.SH AUTHORS +Authors include: ... diff --git a/src/Imakefile b/src/Imakefile new file mode 100644 index 0000000..b7ec568 --- /dev/null +++ b/src/Imakefile @@ -0,0 +1,148 @@ +XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/Imakefile,v 1.8 2003/12/31 05:42:04 dawes Exp $ + +#define IHaveModules +#include <Server.tmpl> + +#if BuildXF86DRI +DRISRCS = via_dri.c +DRIOBJS = via_dri.o +DRIINCLUDES = -I$(SERVERSRC)/GL/dri -I$(LIBSRC)/GL/dri \ + -I$(XF86OSSRC)/linux/drm/kernel -I$(TOP)/include +DRIDEFINES = $(GLX_DEFINES) +#endif + +SRCS = via_driver.c \ + via_tuner.c \ + via_accel.c \ + via_bandwidth.c \ + via_bios.c \ + via_vbe.c \ + via_cursor.c \ + via_shadow.c \ + via_dga.c \ + via_video.c \ + via_i2c.c \ + via_gpioi2c.c \ + via_utility.c \ + via_swov.c \ + via_regrec.c \ + via_hwdiff.c \ + via_memory.c \ + via_memcpy.c \ + via_xvmc.c \ + via_overlay.c $(DRISRCS) + +OBJS = via_driver.o \ + via_tuner.o \ + via_accel.o \ + via_bandwidth.o \ + via_bios.o \ + via_vbe.o \ + via_cursor.o \ + via_shadow.o \ + via_dga.o \ + via_video.o \ + via_i2c.o \ + via_gpioi2c.o \ + via_utility.o \ + via_swov.o \ + via_regrec.o \ + via_hwdiff.o \ + via_memory.o \ + via_memcpy.o \ + via_xvmc.o \ + via_overlay.o $(DRIOBJS) + + +DEFINES = -DPSZ=8 + +#if defined(XF86DriverSDK) +INCLUDES = -I. -I../../include +#else +INCLUDES = -I. -I$(XF86COMSRC) -I$(XF86OSSRC) \ + -I$(SERVERSRC)/mfb -I$(SERVERSRC)/mi \ + -I$(SERVERSRC)/cfb -I$(XF86SRC)/xaa \ + -I$(XF86SRC)/xf1bpp -I$(XF86SRC)/xf4bpp \ + -I$(XF86SRC)/xf24_32bpp -I$(SERVERSRC)/Xext \ + -I$(XF86SRC)/vgahw -I$(XF86SRC)/ramdac \ + -I$(XF86SRC)/ddc -I$(XF86SRC)/i2c \ + -I$(XF86SRC)/rac -I$(XF86SRC)/int10 -I$(SERVERSRC)/render \ + -I$(SERVERSRC)/include -I$(XINCLUDESRC) -I$(FONTINCSRC) \ + -I$(EXTINCSRC) -I$(XF86SRC)/vbe -I$(XF86SRC)/shadowfb \ + -I$(SERVERSRC)/fb $(DRIINCLUDES) +#endif + +DEFINES = $(DRIDEFINES) + +#if MakeHasPosixVariableSubstitutions +SubdirLibraryRule($(OBJS)) +#endif + +NormalAsmObjectRule() + +ModuleObjectRule() +ObjectModuleTarget(via, $(OBJS)) + +InstallObjectModule(via,$(MODULEDIR),drivers) + +#if !defined(XF86DriverSDK) +CppManTarget(via,) +InstallModuleManPage(via) +#endif + +DependTarget() + +InstallDriverSDKNonExecFile(Imakefile,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_hwdiff.c,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_capture.h,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_compose.h,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(ddmpeg.h,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_overlay.c,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_overlay.h,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(ginfo.h,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_regrec.c,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_regrec.h,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via.h,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_accel.c,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_bandwidth.c,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_bandwidth.h,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_bios.c,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_bios.h,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_vbe.c,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_ch7019.h,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_common.h,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_cursor.c,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_dga.c,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_dri.c,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_dri.h,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_driver.c,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_driver.h,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_fs454.h,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_gpioi2c.c,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_gpioi2c.h,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_i2c.c,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_mode.h,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_priv.h,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_refresh.h,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_regs.h,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_saa7108.h,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_shadow.c,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_swov.c,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_swov.h,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_tv2.h,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_tv3.h,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_utility.c,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_utility.h,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_video.c,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_video.h,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_xvmc.c,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_vt1622a.h,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_memory.c,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_memcpy.c,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_memcpy.h,$(DRIVERSDKDIR)/drivers/via) +InstallDriverSDKNonExecFile(via_xvmc.c,$(DRIVERSDKDIR)/drivers/via) + +InstallDriverSDKNonExecFile(videodev.h,$(DRIVERSDKDIR)/drivers/via) + + +InstallDriverSDKObjectModule(via,$(DRIVERSDKMODULEDIR),drivers) diff --git a/src/ddmpeg.h b/src/ddmpeg.h new file mode 100644 index 0000000..c6dd0cd --- /dev/null +++ b/src/ddmpeg.h @@ -0,0 +1,466 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/ddmpeg.h,v 1.4 2003/08/27 15:16:06 tsi Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef _VIA_DDMPEG_H_ +#define _VIA_DDMPEG_H_ 1 + +#include "via_capture.h" + +/* + * Overlay surfaces ( frame buffers ) we use + */ +#define NUM_FRAME_BUFFERS 4 + +/* + * Alignment macro functions + */ +#define ALIGN_TO_32_BYTES(f) (((f) + 31) & ~31) +#define ALIGN_TO_16_BYTES(f) (((f) + 15) & ~15) +#define ALIGN_TO_256_BITS(f) (((f) + 255) & ~255) +#define ALIGN_TO_8_BYTES(f) (((f) + 7) & ~7) +#define ALIGN_TO_64_BITS(f) (((f) + 63) & ~63) +#define ENG_ALIGN_BYTE ALIGN_TO_32_BYTES +#define ENG_ALIGN_BIT ALIGN_TO_256_BITS + +/* + * FOURCC definitions + */ + +#define FOURCC_VIA 0x4E4B4C57 /*VIA*/ +#define FOURCC_SUBP 0x50425553 /*SUBP*/ +#define FOURCC_TV0 0x00325654 /*TV0*/ +#define FOURCC_TV1 0x00315654 /*TV1*/ +#define FOURCC_ALPHA 0x48504C41 /*ALPH*/ +#define FOURCC_YUY2 0x32595559 /*YUY2*/ +#define FOURCC_YV12 0x32315659 /*YV12*/ +#define FOURCC_Y211 0x31313259 +#define FOURCC_UYVY 0x59565955 +#define FOURCC_YVYU 0x55595659 +#define FOURCC_IYUV 0x56555949 /* #define FOURCC_IYUV 'VUYI'*/ + +#define FOURCC_HQVMPEG 0x31565148 /*HQV1*/ +#define FOURCC_HQVTV0 0x33565148 /*HQV3*/ +#define FOURCC_HQVTV1 0x32565148 /*HQV2*/ +#define FOURCC_HQVSW 0x34565148 /*HQV4*/ + + + +/* + * Actions for MPEG functions + */ + +#define CREATEDRIVER 0x00 +#define DESTROYDRIVER CREATEDRIVER +1 +#define CREATESURFACE CREATEDRIVER +2 +#define DESTROYSURFACE CREATEDRIVER +3 +#define LOCKSURFACE CREATEDRIVER +4 +#define UNLOCKSURFACE CREATEDRIVER +5 +#define UPDATEOVERLAY CREATEDRIVER +6 +#define FLIP CREATEDRIVER +7 +#define SETALPHAWIN CREATEDRIVER +8 +#define BEGINPICTRE CREATEDRIVER +9 +#define BEGINPICTURE CREATEDRIVER +9 +#define ENDPICTURE CREATEDRIVER +10 +#define SLICERECEIVEDATA CREATEDRIVER +11 +#define DRIVERPROC CREATEDRIVER +12 +#define DISPLAYCONTROL CREATEDRIVER +13 +#define SUBPICTURE CREATEDRIVER +14 +#define SETDEINTERLACEMODE CREATEDRIVER +15 +#define MPEGENABLE CREATEDRIVER +16 +#define MPEGGETPICTYPE CREATEDRIVER +17 + +/* + * Actions for Capture functions / XV standard functions + */ + +#define PUTVIDEO CREATEDRIVER +100 +#define PUTSTILL CREATEDRIVER +101 +#define GETVIDEO CREATEDRIVER +102 +#define GETSTILL CREATEDRIVER +103 +#define STOPVIDEO CREATEDRIVER +104 +#define SETPORTATTRIBUTE CREATEDRIVER +105 +#define GETPORTATTRIBUTE CREATEDRIVER +106 +#define SELECTCAPTUREPORT CREATEDRIVER +107 +#define VIDEOCONTROL CREATEDRIVER +108 +#define HQVCONTROL CREATEDRIVER +109 +#define PUTIMAGE CREATEDRIVER +110 + +#define VDEC_DETECT CREATEDRIVER +150 +#define VDEC_INIT CREATEDRIVER +151 +#define TUNER_DETECT CREATEDRIVER +152 +#define TUNER_INIT CREATEDRIVER +153 +#define TUNER_SETTVBAND_CABLE CREATEDRIVER +154 +#define TUNER_SETCHANNEL CREATEDRIVER +155 + +#define AUDIOCONTROL CREATEDRIVER +170 + +/* + * Define for Utility functions using XvPutImage. + */ +/* Primary ID */ +#define UT_XV_FUNC_BIOS 0x11 /* Primary ID */ +#define UT_XV_FUNC_DRIVER 0x12 +#define UT_XV_FUNC_DEVICE 0x13 +#define UT_XV_FUNC_PANEL 0x14 +#define UT_XV_FUNC_TV 0x15 +#define UT_XV_FUNC_GAMMA 0x16 +/* Secondary ID */ +#define UT_XV_FUNC_BIOS_GetChipID 0x01 /* Get Chip ID */ +#define UT_XV_FUNC_BIOS_GetVersion 0x02 /* Get the version of the BIOS */ +#define UT_XV_FUNC_BIOS_GetDate 0x03 /* Get the date (year, month, day) of the BIOS. */ +#define UT_XV_FUNC_BIOS_GetVideoMemSizeMB 0x04 /* Get the video memory size, in MB */ + +#define UT_XV_FUNC_DRIVER_GetFileName 0x01 +#define UT_XV_FUNC_DRIVER_GetFileVersion 0x02 +/* Return value */ +#define UT_RESULT_OK 1 /* Return value */ +#define UT_RESULT_FAIL 0 +#define UT_RESULT_NO_FUNC -1 + + +/* + * Structures for create surface + */ +typedef struct _DDSURFACEDESC +{ + unsigned long dwSize; /* size of the DDSURFACEDESC structure*/ + unsigned long dwFlags; /* determines what fields are valid*/ + unsigned long dwHeight; /* height of surface to be created*/ + unsigned long dwWidth; /* width of input surface*/ + unsigned long lPitch; /* distance to start of next line(return value)*/ + unsigned long dwBackBufferCount; /* number of back buffers requested*/ + void * lpSurface; /* pointer to the surface memory*/ + unsigned long dwColorSpaceLowValue; /* low boundary of color space that is to*/ + /* be treated as Color Key, inclusive*/ + unsigned long dwColorSpaceHighValue; /* high boundary of color space that is*/ + /* to be treated as Color Key, inclusive*/ + unsigned long dwFourCC; /* (FOURCC code)*/ +} DDSURFACEDESC; +typedef DDSURFACEDESC * LPDDSURFACEDESC; + + +/* + * Structures for SubPicture + */ +typedef struct _SUBDEVICE +{ + unsigned char * lpSUBOverlaySurface[2]; /*Max 2 Pointers to SUB Overlay Surface*/ + unsigned long dwSUBPhysicalAddr[2]; /*Max 2 Physical address to SUB Overlay Surface*/ + unsigned long dwPitch; /*SUB frame buffer pitch*/ + unsigned long gdwSUBSrcWidth; /*SUB Source Width*/ + unsigned long gdwSUBSrcHeight; /*SUB Source Height*/ + unsigned long gdwSUBDstWidth; /*SUB Destination Width*/ + unsigned long gdwSUBDstHeight; /*SUB Destination Height*/ + unsigned long gdwSUBDstLeft; /*SUB Position : Left*/ + unsigned long gdwSUBDstTop; /*SUB Position : Top*/ +}SUBDEVICE; +typedef SUBDEVICE * LPSUBDEVICE; + + +/* + * Structures for H/W mpeg decode + */ +typedef struct _MPGDEVICE +{ + unsigned char * lpVideoMemIO; /* Pointer to Video Memory MAP IO */ + unsigned char * lpMPEGOverlaySurface[NUM_FRAME_BUFFERS];/* Max 4 Pointers to MPEG Overlay Surface */ + unsigned long dwMPEGPhysicalAddr[NUM_FRAME_BUFFERS]; /* Max 4 Physical address to MPEG Overlay Surface */ + unsigned long dwWidth; /* MPEG coded_picture_width */ + unsigned long dwHeight; /* MPEG coded_picture_height */ + unsigned long dwPitch; /* MPEG frame buffer pitch */ + unsigned long dwPageNum; /* Frame buffer Number */ + unsigned char byDeviceType; /* Device type. Such as DEV_MPEG and DEV_SUBP */ + unsigned long gdwSetBufferIndex; /* Used to assigned buffer pointer in SetOverlayBuffer() */ + unsigned long gdwMPGState; /* MPG states */ + unsigned long gdwSUBPState; /* Sub Picture states */ + unsigned long dwSubpPageNum; /* SubPicture Frame buffer Number */ + unsigned long dwSUBPPitch; /* SubPicture Pitch */ + unsigned long gdwSUBPSrcLeft; /* SubPicture Position : Left */ + unsigned long gdwSUBPSrcTop; /* SubPicture Position : Top */ + unsigned long gdwSUBPSrcWidth; /* SubPicture Source Width */ + unsigned long gdwSUBPSrcHeight; /* SubPicture Source Height */ + unsigned long gdwSUBPDisplayIndex; /* Subpicture Display Index */ + unsigned long gdwMPGSrcWidth; /* MPEG Source Width */ + unsigned long gdwMPGSrcHeight; /* MPEG Source Height */ + unsigned long gdwMPGDstWidth; /* MPEG Destination Width */ + unsigned long gdwMPGDstHeight; /* MPEG Destination Height */ + unsigned long gdwMPGDstLeft; /* MPEG Position : Left */ + unsigned long gdwMPGDstTop; /* MPEG Position : Top */ + unsigned long dwDeinterlaceMode; /* BOB / WEAVE */ + unsigned long gdwSUBP_NotVisible; + unsigned long dwMPEGYPhysicalAddr[NUM_FRAME_BUFFERS]; /* Physical address to MPEG Y Overlay Surface */ + unsigned long dwMPEGCbPhysicalAddr[NUM_FRAME_BUFFERS]; /* Physical address to MPEG Cb Overlay Surface */ + unsigned long dwMPEGCrPhysicalAddr[NUM_FRAME_BUFFERS]; /* Physical address to MPEG Cr Overlay Surface */ + unsigned long dwMPEGDisplayIndex ; /* Currently display index */ + unsigned long dwHQVAddr[3]; /* Physical address to HQV surface -- CLE_C0 */ + /*unsigned long dwHQVAddr[2];*/ /* Physical address to HQV surface */ + unsigned long dwEnableErrorConcealment; /* For MPEG ErrorConcealment */ + /* Chip Info */ + unsigned long dwVendorID; + unsigned long dwDeviceID; + unsigned long dwRevisionID; + unsigned long dwSubVendorID; + unsigned long dwSubDeviceID; +}MPGDEVICE, * LPMPGDEVICE; + + +/* + * Structures for S/W mpeg decode + */ +typedef struct _SWDEVICE +{ + unsigned char * lpSWOverlaySurface[2]; /* Max 2 Pointers to SW Overlay Surface*/ + unsigned long dwSWPhysicalAddr[2]; /*Max 2 Physical address to SW Overlay Surface */ + unsigned long dwSWCbPhysicalAddr[2]; /* Physical address to SW Cb Overlay Surface, for YV12 format use */ + unsigned long dwSWCrPhysicalAddr[2]; /* Physical address to SW Cr Overlay Surface, for YV12 format use */ + unsigned long dwHQVAddr[3]; /* Physical address to HQV surface -- CLE_C0 */ + /*unsigned long dwHQVAddr[2];*/ /*Max 2 Physical address to SW HQV Overlay Surface*/ + unsigned long dwWidth; /*SW Source Width, not changed*/ + unsigned long dwHeight; /*SW Source Height, not changed*/ + unsigned long dwPitch; /*SW frame buffer pitch*/ + unsigned long gdwSWSrcWidth; /*SW Source Width, changed if window is out of screen*/ + unsigned long gdwSWSrcHeight; /*SW Source Height, changed if window is out of screen*/ + unsigned long gdwSWDstWidth; /*SW Destination Width*/ + unsigned long gdwSWDstHeight; /*SW Destination Height*/ + unsigned long gdwSWDstLeft; /*SW Position : Left*/ + unsigned long gdwSWDstTop; /*SW Position : Top*/ + unsigned long dwDeinterlaceMode; /*BOB / WEAVE*/ +}SWDEVICE; +typedef SWDEVICE * LPSWDEVICE; + + +/* Device Type of MPGDEVICE */ +#define DEV_MPEG 0 +#define DEV_SUBP 1 + +/* dwDecodePictStruct and dwDisplayPictStruct of VIAMPGSURFACE */ +#define VIA_PICT_STRUCT_TOP 0x00000001 +#define VIA_PICT_STRUCT_BOTTOM 0x00000002 +#define VIA_PICT_STRUCT_FRAME 0x00000003 + +/* + * Structures for LOCK surface + */ + +typedef struct _DDLOCK +{ + unsigned long dwVersion; + unsigned long dwFourCC; + unsigned long dwPhysicalBase; + SUBDEVICE SubDev; + CAPDEVICE Capdev_TV0; + CAPDEVICE Capdev_TV1; + MPGDEVICE MPGDev; + SWDEVICE SWDevice; +} DDLOCK; +typedef DDLOCK * LPDDLOCK; + + +/* + * structure for passing information to DDHAL UpdateOverlay fn + */ +typedef struct _RECTL +{ + unsigned long left; + unsigned long top; + unsigned long right; + unsigned long bottom; +} RECTL; + +typedef struct _DDUPDATEOVERLAY +{ + RECTL rDest; /* dest rect */ + RECTL rSrc; /* src rect */ + unsigned long dwFlags; /* flags */ + unsigned long dwColorSpaceLowValue; + unsigned long dwColorSpaceHighValue; + unsigned long dwFourcc; +} DDUPDATEOVERLAY; +typedef DDUPDATEOVERLAY * LPDDUPDATEOVERLAY; + +typedef struct _ADJUSTFRAME +{ + int x; + int y; +} ADJUSTFRAME; +typedef ADJUSTFRAME * LPADJUSTFRAME; + +/* Definition for dwFlags */ +#define DDOVER_HIDE 0x00000001 +#define DDOVER_SHOW 0x00000002 +#define DDOVER_KEYDEST 0x00000004 +#define DDOVER_ENABLE 0x00000008 +#define DDOVER_CLIP 0x00000010 +/* + * Display each field of video port data individually without + * causing any jittery artifacts + */ +#define DDOVER_BOB 0x00200000l + +/* + * Indicates that bob/weave decisions should not be overridden by other + * interfaces. + */ +#define DDOVER_OVERRIDEBOBWEAVE 0x00400000l + +/* + * Indicates that the surface memory is composed of interleaved fields. + */ +#define DDOVER_INTERLEAVED 0x00800000l + +/* + * Indicates that bob will be performed using hardware rather than + * software or emulated. + */ +#define DDOVER_BOBHARDWARE 0x01000000l + +typedef struct _DDFLIP +{ + unsigned long dwBuffIndex; + unsigned long dwFlags; +} DDFLIP; +typedef DDFLIP * LPDDFLIP; + +typedef struct +{ + CARD32 dwWidth; + CARD32 dwHeight; + CARD32 dwOffset; + CARD32 dwUVoffset; + CARD32 dwFlipTime; + CARD32 dwFlipTag; + CARD32 dwStartAddr; + CARD32 dwV1OriWidth; + CARD32 dwV1OriHeight; + CARD32 dwV1OriPitch; + CARD32 dwV1SrcWidth; + CARD32 dwV1SrcHeight; + CARD32 dwV1SrcLeft; + CARD32 dwV1SrcRight; + CARD32 dwV1SrcTop; + CARD32 dwV1SrcBot; + CARD32 dwSPWidth; + CARD32 dwSPHeight; + CARD32 dwSPLeft; + CARD32 dwSPRight; + CARD32 dwSPTop; + CARD32 dwSPBot; + CARD32 dwSPOffset; + CARD32 dwSPstartAddr; + CARD32 dwDisplayPictStruct; + CARD32 dwDisplayBuffIndex; /* Display buffer Index. 0 to ( dwBufferNumber -1) */ + CARD32 dwFetchAlignment; + CARD32 dwSPPitch; + unsigned long dwHQVAddr[3]; /* CLE_C0 */ + /*unsigned long dwHQVAddr[2];*/ + CARD32 dwMPEGDeinterlaceMode; /* default value : VIA_DEINTERLACE_WEAVE */ + CARD32 dwMPEGProgressiveMode; /* default value : VIA_PROGRESSIVE */ + CARD32 dwHQVheapInfo; /* video memory heap of the HQV buffer */ + CARD32 dwVideoControl; /* video control flag */ + CARD32 dwminifyH; /* Horizontal minify factor */ + CARD32 dwminifyV; /* Vertical minify factor */ + CARD32 dwMpegDecoded; +} OVERLAYRECORD; + +/* DeinterLace Mode */ +#define VIA_DEINTERLACE_WEAVE 0x00000000 +#define VIA_DEINTERLACE_BOB 0x00000001 +#define VIA_NON_PROGRESSIVE 0x00000000 +#define VIA_PROGRESSIVE 0x00000010 + +/* + * DDPIXELFORMAT + */ +typedef struct _DDPIXELFORMAT +{ + unsigned long dwSize; /* size of structure */ + unsigned long dwFlags; /* pixel format flags */ + unsigned long dwFourCC; /* (FOURCC code) */ + + unsigned long dwRGBBitCount; /* how many bits per pixel */ + unsigned long dwYUVBitCount; /* how many bits per pixel */ + unsigned long dwZBufferBitDepth; /* how many bits for z buffers */ + unsigned long dwAlphaBitDepth; /* how many bits for alpha channels */ + + unsigned long dwRBitMask; /* mask for red bit */ + unsigned long dwYBitMask; /* mask for Y bits */ + + unsigned long dwGBitMask; /* mask for green bits */ + unsigned long dwUBitMask; /* mask for U bits */ + + unsigned long dwBBitMask; /* mask for blue bits */ + unsigned long dwVBitMask; /* mask for V bits */ + + unsigned long dwRGBAlphaBitMask; /* mask for alpha channel */ + unsigned long dwYUVAlphaBitMask; /* mask for alpha channel */ + unsigned long dwRGBZBitMask; /* mask for Z channel */ + unsigned long dwYUVZBitMask; /* mask for Z channel */ +} DDPIXELFORMAT; +typedef DDPIXELFORMAT * LPDDPIXELFORMAT; + +/**************************************************************************** + * + * PIXELFORMAT FLAGS + * + ****************************************************************************/ + +/* + * The FourCC code is valid. + */ +#define DDPF_FOURCC 0x00000004l + +/* + * The RGB data in the pixel format structure is valid. + */ +#define DDPF_RGB 0x00000040l + + + +/* + * Return value of Proprietary Interface + */ + +#define PI_OK 0x00 +#define PI_ERR 0x01 +#define PI_ERR_NO_X_WINDOW PI_ERR +1 +#define PI_ERR_CANNOT_OPEN_VIDEO_DEVICE PI_ERR +2 +#define PI_ERR_CANNOT_USE_IOCTL PI_ERR +3 +#define PI_ERR_CANNOT_CREATE_SURFACE PI_ERR +4 + + +/* + * Exported Driver functions + */ + +unsigned long VIADriverProc(unsigned long wAction, void * lpParam); +unsigned long VIABeginPicture(void * lpMPGSurface); +unsigned long VIAEndPicture(void * lpMPGSurface); +unsigned long VIASliceReceiveData(unsigned long dwByteCount, unsigned char * lpData); +unsigned long VIADisplayControl(unsigned long devType, void * lpData); +unsigned long VIASUBPicture(void * lpSubp); +unsigned long VIASetDeInterlaceMode(unsigned long dwMode); +int PrivPutImage(unsigned char* buf); + +#endif /* _VIA_DDMPEG_H_ */ diff --git a/src/via.h b/src/via.h new file mode 100644 index 0000000..ceb5fb0 --- /dev/null +++ b/src/via.h @@ -0,0 +1,635 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via.h,v 1.5 2004/01/05 00:34:17 dawes Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef _VIA_H_ +#define _VIA_H_ 1 + +/* Video status flag */ + +#define VIDEO_SHOW 0x80000000 /*Video on*/ +#define VIDEO_HIDE 0x00000000 /*Video off*/ +#define VIDEO_MPEG_INUSE 0x08000000 /*Video is used with MPEG */ +#define VIDEO_HQV_INUSE 0x04000000 /*Video is used with HQV*/ +#define VIDEO_CAPTURE0_INUSE 0x02000000 /*Video is used with CAPTURE 0*/ +#define VIDEO_CAPTURE1_INUSE 0x00000000 /*Video is used with CAPTURE 1*/ +#define VIDEO_1_INUSE 0x01000000 /*Video 1 is used with software flip*/ +#define VIDEO_3_INUSE 0x00000000 /*Video 3 is used with software flip*/ +#define MPEG_USE_V1 0x00010000 /*[16] : 1:MPEG use V1, 0:MPEG use V3*/ +#define MPEG_USE_V3 0x00000000 /*[16] : 1:MPEG use V1, 0:MPEG use V3*/ +#define MPEG_USE_HQV 0x00020000 /*[17] : 1:MPEG use HQV,0:MPEG not use HQV*/ +#define MPEG_USE_HW_FLIP 0x00040000 /*[18] : 1:MPEG use H/W flip,0:MPEG use S/W flip*/ +#define MPEG_USE_SW_FLIP 0x00000000 /*[18] : 1:MPEG use H/W flip,0:MPEG use S/W flip*/ +#define CAP0_USE_V1 0x00001000 /*[12] : 1:Capture 0 use V1, 0:Capture 0 use V3*/ +#define CAP0_USE_V3 0x00000000 /*[12] : 1:Capture 0 use V1, 0:Capture 0 use V3*/ +#define CAP0_USE_HQV 0x00002000 /*[13] : 1:Capture 0 use HQV,0:Capture 0 not use HQV*/ +#define CAP0_USE_HW_FLIP 0x00004000 /*[14] : 1:Capture 0 use H/W flip,0:Capture 0 use S/W flip*/ +#define CAP0_USE_CCIR656 0x00008000 /*[15] : 1:Capture 0 use CCIR656,0:Capture 0 CCIR601*/ +#define CAP1_USE_V1 0x00000100 /*[ 8] : 1:Capture 1 use V1, 0:Capture 1 use V3*/ +#define CAP1_USE_V3 0x00000000 /*[ 8] : 1:Capture 1 use V1, 0:Capture 1 use V3*/ +#define CAP1_USE_HQV 0x00000200 /*[ 9] : 1:Capture 1 use HQV,0:Capture 1 not use HQV*/ +#define CAP1_USE_HW_FLIP 0x00000400 /*[10] : 1:Capture 1 use H/W flip,0:Capture 1 use S/W flip */ +#define SW_USE_V1 0x00000010 /*[ 4] : 1:Capture 1 use V1, 0:Capture 1 use V3 */ +#define SW_USE_V3 0x00000000 /*[ 4] : 1:Capture 1 use V1, 0:Capture 1 use V3 */ +#define SW_USE_HQV 0x00000020 /*[ 5] : 1:Capture 1 use HQV,0:Capture 1 not use HQV */ + +/* +#define VIDEO1_INUSE 0x00000010 //[ 4] : 1:Video 1 is used with S/W flip +#define VIDEO1_USE_HQV 0x00000020 //[ 5] : 1:Video 1 use HQV with S/W flip +#define VIDEO3_INUSE 0x00000001 //[ 0] : 1:Video 3 is used with S/W flip +#define VIDEO3_USE_HQV 0x00000002 //[ 1] : 1:Video 3 use HQV with S/W flip +*/ + +/* H/W registers for Video Engine */ + +/* + * bus master + */ +#define PCI_MASTER_ENABLE 0x01 +#define PCI_MASTER_SCATTER 0x00 +#define PCI_MASTER_SINGLE 0x02 +#define PCI_MASTER_GUI 0x00 +#define PCI_MASTER_VIDEO 0x04 +#define PCI_MASTER_INPUT 0x00 +#define PCI_MASTER_OUTPUT 0x08 + +/* + * video registers + */ +#define V_FLAGS 0x00 +#define V_CAP_STATUS 0x04 +#define V_FLIP_STATUS 0x04 +#define V_ALPHA_WIN_START 0x08 +#define V_ALPHA_WIN_END 0x0C +#define V_ALPHA_CONTROL 0x10 +#define V_CRT_STARTADDR 0x14 +#define V_CRT_STARTADDR_2 0x18 +#define V_ALPHA_STRIDE 0x1C +#define V_COLOR_KEY 0x20 +#define V_ALPHA_STARTADDR 0x24 +#define V_CHROMAKEY_LOW 0x28 +#define V_CHROMAKEY_HIGH 0x2C +#define V1_CONTROL 0x30 +#define V12_QWORD_PER_LINE 0x34 +#define V1_STARTADDR_1 0x38 +#define V1_STARTADDR_Y1 V1_STARTADDR_1 +#define V1_STRIDE 0x3C +#define V1_WIN_START_Y 0x40 +#define V1_WIN_START_X 0x42 +#define V1_WIN_END_Y 0x44 +#define V1_WIN_END_X 0x46 +#define V1_STARTADDR_2 0x48 +#define V1_STARTADDR_Y2 V1_STARTADDR_2 +#define V1_ZOOM_CONTROL 0x4C +#define V1_MINI_CONTROL 0x50 +#define V1_STARTADDR_0 0x54 +#define V1_STARTADDR_Y0 V1_STARTADDR_0 +#define V_FIFO_CONTROL 0x58 +#define V1_STARTADDR_3 0x5C +#define V1_STARTADDR_Y3 V1_STARTADDR_3 +#define HI_CONTROL 0x60 +#define SND_COLOR_KEY 0x64 +#define ALPHA_V3_PREFIFO_CONTROL 0x68 +#define V1_SOURCE_HEIGHT 0x6C +#define HI_TRANSPARENT_COLOR 0x70 +#define V_DISPLAY_TEMP 0x74 /* No use */ +#define ALPHA_V3_FIFO_CONTROL 0x78 +#define V3_SOURCE_WIDTH 0x7C +#define V3_COLOR_KEY 0x80 +#define V1_ColorSpaceReg_1 0x84 +#define V1_ColorSpaceReg_2 0x88 +#define V1_STARTADDR_CB0 0x8C +#define V1_OPAQUE_CONTROL 0x90 /* To be deleted */ +#define V3_OPAQUE_CONTROL 0x94 /* To be deleted */ +#define V_COMPOSE_MODE 0x98 +#define V3_STARTADDR_2 0x9C +#define V3_CONTROL 0xA0 +#define V3_STARTADDR_0 0xA4 +#define V3_STARTADDR_1 0xA8 +#define V3_STRIDE 0xAC +#define V3_WIN_START_Y 0xB0 +#define V3_WIN_START_X 0xB2 +#define V3_WIN_END_Y 0xB4 +#define V3_WIN_END_X 0xB6 +#define V3_ALPHA_QWORD_PER_LINE 0xB8 +#define V3_ZOOM_CONTROL 0xBC +#define V3_MINI_CONTROL 0xC0 +#define V3_ColorSpaceReg_1 0xC4 +#define V3_ColorSpaceReg_2 0xC8 +#define V3_DISPLAY_TEMP 0xCC /* No use */ +#define V1_STARTADDR_CB1 0xE4 +#define V1_STARTADDR_CB2 0xE8 +#define V1_STARTADDR_CB3 0xEC +#define V1_STARTADDR_CR0 0xF0 +#define V1_STARTADDR_CR1 0xF4 +#define V1_STARTADDR_CR2 0xF8 +#define V1_STARTADDR_CR3 0xFC + +/* Video Capture Engine Registers + * Capture Port 1 + */ +#define CAP0_MASKS 0x100 +#define CAP1_MASKS 0x104 +#define CAP0_CONTROL 0x110 +#define CAP0_H_RANGE 0x114 +#define CAP0_V_RANGE 0x118 +#define CAP0_SCAL_CONTROL 0x11C +#define CAP0_VBI_H_RANGE 0x120 +#define CAP0_VBI_V_RANGE 0x124 +#define CAP0_VBI_STARTADDR 0x128 +#define CAP0_VBI_STRIDE 0x12C +#define CAP0_ANCIL_COUNT 0x130 +#define CAP0_MAXCOUNT 0x134 +#define CAP0_VBIMAX_COUNT 0x138 +#define CAP0_DATA_COUNT 0x13C +#define CAP0_FB_STARTADDR0 0x140 +#define CAP0_FB_STARTADDR1 0x144 +#define CAP0_FB_STARTADDR2 0x148 +#define CAP0_STRIDE 0x150 +/* Capture Port 2 */ +#define CAP1_CONTROL 0x154 +#define CAP1_SCAL_CONTROL 0x160 +#define CAP1_VBI_H_RANGE 0x164 /*To be deleted*/ +#define CAP1_VBI_V_RANGE 0x168 /*To be deleted*/ +#define CAP1_VBI_STARTADDR 0x16C /*To be deleted*/ +#define CAP1_VBI_STRIDE 0x170 /*To be deleted*/ +#define CAP1_ANCIL_COUNT 0x174 /*To be deleted*/ +#define CAP1_MAXCOUNT 0x178 +#define CAP1_VBIMAX_COUNT 0x17C /*To be deleted*/ +#define CAP1_DATA_COUNT 0x180 +#define CAP1_FB_STARTADDR0 0x184 +#define CAP1_FB_STARTADDR1 0x188 +#define CAP1_STRIDE 0x18C + +/* SUBPICTURE Registers */ +#define SUBP_CONTROL_STRIDE 0x1C0 +#define SUBP_STARTADDR 0x1C4 +#define RAM_TABLE_CONTROL 0x1C8 +#define RAM_TABLE_READ 0x1CC + +/* HQV Registers */ +#define HQV_CONTROL 0x1D0 +#define HQV_SRC_STARTADDR_Y 0x1D4 +#define HQV_SRC_STARTADDR_U 0x1D8 +#define HQV_SRC_STARTADDR_V 0x1DC +#define HQV_SRC_FETCH_LINE 0x1E0 +#define HQV_FILTER_CONTROL 0x1E4 +#define HQV_MINIFY_CONTROL 0x1E8 +#define HQV_DST_STARTADDR0 0x1EC +#define HQV_DST_STARTADDR1 0x1F0 +#define HQV_DST_STARTADDR2 0x1FC +#define HQV_DST_STRIDE 0x1F4 +#define HQV_SRC_STRIDE 0x1F8 + + +/* + * Video command definition + */ +/* #define V_ALPHA_CONTROL 0x210 */ +#define ALPHA_WIN_EXPIRENUMBER_4 0x00040000 +#define ALPHA_WIN_CONSTANT_FACTOR_4 0x00004000 +#define ALPHA_WIN_CONSTANT_FACTOR_12 0x0000c000 +#define ALPHA_WIN_BLENDING_CONSTANT 0x00000000 +#define ALPHA_WIN_BLENDING_ALPHA 0x00000001 +#define ALPHA_WIN_BLENDING_GRAPHIC 0x00000002 +#define ALPHA_WIN_PREFIFO_THRESHOLD_12 0x000c0000 +#define ALPHA_WIN_FIFO_THRESHOLD_8 0x000c0000 +#define ALPHA_WIN_FIFO_DEPTH_16 0x00100000 + +/* V_CHROMAKEY_LOW 0x228 */ +#define V_CHROMAKEY_V3 0x80000000 + +/* V1_CONTROL 0x230 */ +#define V1_ENABLE 0x00000001 +#define V1_FULL_SCREEN 0x00000002 +#define V1_YUV422 0x00000000 +#define V1_RGB32 0x00000004 +#define V1_RGB15 0x00000008 +#define V1_RGB16 0x0000000C +#define V1_YCbCr420 0x00000010 +#define V1_COLORSPACE_SIGN 0x00000080 +#define V1_SRC_IS_FIELD_PIC 0x00000200 +#define V1_SRC_IS_FRAME_PIC 0x00000000 +#define V1_BOB_ENABLE 0x00400000 +#define V1_FIELD_BASE 0x00000000 +#define V1_FRAME_BASE 0x01000000 +#define V1_SWAP_SW 0x00000000 +#define V1_SWAP_HW_HQV 0x02000000 +#define V1_SWAP_HW_CAPTURE 0x04000000 +#define V1_SWAP_HW_MC 0x06000000 +/* #define V1_DOUBLE_BUFFERS 0x00000000 */ +/* #define V1_QUADRUPLE_BUFFERS 0x18000000 */ +#define V1_EXPIRE_NUM 0x00050000 +#define V1_EXPIRE_NUM_A 0x000a0000 +#define V1_EXPIRE_NUM_F 0x000f0000 /* jason */ +#define V1_FIFO_EXTENDED 0x00200000 +#define V1_ON_CRT 0x00000000 +#define V1_ON_SND_DISPLAY 0x80000000 +#define V1_FIFO_32V1_32V2 0x00000000 +#define V1_FIFO_48V1_32V2 0x00200000 + +/* V12_QWORD_PER_LINE 0x234 */ +#define V1_FETCH_COUNT 0x3ff00000 +#define V1_FETCHCOUNT_ALIGNMENT 0x0000000f +#define V1_FETCHCOUNT_UNIT 0x00000004 /* Doubld QWORD */ + +/* V1_STRIDE */ +#define V1_STRIDE_YMASK 0x00001fff +#define V1_STRIDE_UVMASK 0x1ff00000 + +/* V1_ZOOM_CONTROL 0x24C */ +#define V1_X_ZOOM_ENABLE 0x80000000 +#define V1_Y_ZOOM_ENABLE 0x00008000 + +/* V1_MINI_CONTROL 0x250 */ +#define V1_X_INTERPOLY 0x00000002 /* X interpolation */ +#define V1_Y_INTERPOLY 0x00000001 /* Y interpolation */ +#define V1_YCBCR_INTERPOLY 0x00000004 /* Y, Cb, Cr all interpolation */ +#define V1_X_DIV_2 0x01000000 +#define V1_X_DIV_4 0x03000000 +#define V1_X_DIV_8 0x05000000 +#define V1_X_DIV_16 0x07000000 +#define V1_Y_DIV_2 0x00010000 +#define V1_Y_DIV_4 0x00030000 +#define V1_Y_DIV_8 0x00050000 +#define V1_Y_DIV_16 0x00070000 + +/* V1_STARTADDR0 0x254 */ +#define SW_FLIP_ODD 0x08000000 + +/* V_FIFO_CONTROL 0x258 + * IA2 has 32 level FIFO for packet mode video format + * 32 level FIFO for planar mode video YV12. with extension reg 230 bit 21 enable + * 16 level FIFO for planar mode video YV12. with extension reg 230 bit 21 disable + * BCos of 128 bits. 1 level in IA2 = 2 level in VT3122 + */ +#define V1_FIFO_DEPTH12 0x0000000B +#define V1_FIFO_DEPTH16 0x0000000F +#define V1_FIFO_DEPTH32 0x0000001F +#define V1_FIFO_DEPTH48 0x0000002F +#define V1_FIFO_DEPTH64 0x0000003F +#define V1_FIFO_THRESHOLD6 0x00000600 +#define V1_FIFO_THRESHOLD8 0x00000800 +#define V1_FIFO_THRESHOLD12 0x00000C00 +#define V1_FIFO_THRESHOLD16 0x00001000 +#define V1_FIFO_THRESHOLD24 0x00001800 +#define V1_FIFO_THRESHOLD32 0x00002000 +#define V1_FIFO_THRESHOLD40 0x00002800 +#define V1_FIFO_THRESHOLD48 0x00003000 +#define V1_FIFO_THRESHOLD56 0x00003800 +#define V1_FIFO_THRESHOLD61 0x00003D00 +#define V1_FIFO_PRETHRESHOLD10 0x0A000000 +#define V1_FIFO_PRETHRESHOLD12 0x0C000000 +#define V1_FIFO_PRETHRESHOLD29 0x1d000000 +#define V1_FIFO_PRETHRESHOLD40 0x28000000 +#define V1_FIFO_PRETHRESHOLD44 0x2c000000 +#define V1_FIFO_PRETHRESHOLD56 0x38000000 +#define V1_FIFO_PRETHRESHOLD61 0x3D000000 + +/* ALPHA_V3_FIFO_CONTROL 0x278 + * IA2 has 32 level FIFO for packet mode video format + * 32 level FIFO for planar mode video YV12. with extension reg 230 bit 21 enable + * 16 level FIFO for planar mode video YV12. with extension reg 230 bit 21 disable + * 8 level FIFO for ALPHA + * BCos of 128 bits. 1 level in IA2 = 2 level in VT3122 + */ +#define V3_FIFO_DEPTH16 0x0000000F +#define V3_FIFO_DEPTH24 0x00000017 +#define V3_FIFO_DEPTH32 0x0000001F +#define V3_FIFO_DEPTH48 0x0000002F +#define V3_FIFO_DEPTH64 0x0000003F +#define V3_FIFO_THRESHOLD8 0x00000800 +#define V3_FIFO_THRESHOLD12 0x00000C00 +#define V3_FIFO_THRESHOLD16 0x00001000 +#define V3_FIFO_THRESHOLD24 0x00001800 +#define V3_FIFO_THRESHOLD32 0x00002000 +#define V3_FIFO_THRESHOLD40 0x00002800 +#define V3_FIFO_THRESHOLD48 0x00003000 +#define V3_FIFO_THRESHOLD56 0x00003800 +#define V3_FIFO_THRESHOLD61 0x00003D00 +#define V3_FIFO_PRETHRESHOLD10 0x0000000A +#define V3_FIFO_PRETHRESHOLD12 0x0000000C +#define V3_FIFO_PRETHRESHOLD29 0x0000001d +#define V3_FIFO_PRETHRESHOLD40 0x00000028 +#define V3_FIFO_PRETHRESHOLD44 0x0000002c +#define V3_FIFO_PRETHRESHOLD56 0x00000038 +#define V3_FIFO_PRETHRESHOLD61 0x0000003D +#define V3_FIFO_MASK 0x0000007F +#define ALPHA_FIFO_DEPTH8 0x00070000 +#define ALPHA_FIFO_THRESHOLD4 0x04000000 +#define ALPHA_FIFO_MASK 0xffff0000 +#define ALPHA_FIFO_PRETHRESHOLD4 0x00040000 + +/* IA2 */ +#define ColorSpaceValue_1 0x140020f2 +#define ColorSpaceValue_2 0x0a0a2c00 + +#define ColorSpaceValue_1_3123C0 0x13000DED +#define ColorSpaceValue_2_3123C0 0x13171000 + +/* For TV setting */ +#define ColorSpaceValue_1TV 0x140020f2 +#define ColorSpaceValue_2TV 0x0a0a2c00 + +/* V_COMPOSE_MODE 0x298 */ +#define SELECT_VIDEO_IF_COLOR_KEY 0x00000001 /* select video if (color key),otherwise select graphics */ +#define SELECT_VIDEO3_IF_COLOR_KEY 0x00000020 /* For 3123C0, select video3 if (color key),otherwise select graphics */ +#define SELECT_VIDEO_IF_CHROMA_KEY 0x00000002 /* 0x0000000a //select video if (chroma key ),otherwise select graphics */ +#define ALWAYS_SELECT_VIDEO 0x00000000 /* always select video,Chroma key and Color key disable */ +#define COMPOSE_V1_V3 0x00000000 /* V1 on top of V3 */ +#define COMPOSE_V3_V1 0x00100000 /* V3 on top of V1 */ +#define COMPOSE_V1_TOP 0x00000000 +#define COMPOSE_V3_TOP 0x00100000 +#define V1_COMMAND_FIRE 0x80000000 /* V1 commands fire */ +#define V3_COMMAND_FIRE 0x40000000 /* V3 commands fire */ +#define V_COMMAND_LOAD 0x20000000 /* Video register always loaded */ +#define V_COMMAND_LOAD_VBI 0x10000000 /* Video register always loaded at vbi without waiting source flip */ +#define V3_COMMAND_LOAD 0x08000000 /* CLE_C0 Video3 register always loaded */ +#define V3_COMMAND_LOAD_VBI 0x00000100 /* CLE_C0 Video3 register always loaded at vbi without waiting source flip */ +#define SECOND_DISPLAY_COLOR_KEY_ENABLE 0x00010000 + +/* V3_ZOOM_CONTROL 0x2bc */ +#define V3_X_ZOOM_ENABLE 0x80000000 +#define V3_Y_ZOOM_ENABLE 0x00008000 + +/* V3_MINI_CONTROL 0x2c0 */ +#define V3_X_INTERPOLY 0x00000002 /* X interpolation */ +#define V3_Y_INTERPOLY 0x00000001 /* Y interpolation */ +#define V3_YCBCR_INTERPOLY 0x00000004 /* Y, Cb, Cr all interpolation */ +#define V3_X_DIV_2 0x01000000 +#define V3_X_DIV_4 0x03000000 +#define V3_X_DIV_8 0x05000000 +#define V3_X_DIV_16 0x07000000 +#define V3_Y_DIV_2 0x00010000 +#define V3_Y_DIV_4 0x00030000 +#define V3_Y_DIV_8 0x00050000 +#define V3_Y_DIV_16 0x00070000 + +/* SUBP_CONTROL_STRIDE 0x3c0 */ +#define SUBP_HQV_ENABLE 0x00010000 +#define SUBP_IA44 0x00020000 +#define SUBP_AI44 0x00000000 +#define SUBP_STRIDE_MASK 0x00001fff +#define SUBP_CONTROL_MASK 0x00070000 + +/* RAM_TABLE_CONTROL 0x3c8 */ +#define RAM_TABLE_RGB_ENABLE 0x00000007 + +/* CAPTURE0_CONTROL 0x310 */ +#define C0_ENABLE 0x00000001 +#define BUFFER_2_MODE 0x00000000 +#define BUFFER_3_MODE 0x00000004 +#define BUFFER_4_MODE 0x00000006 +#define SWAP_YUYV 0x00000000 +#define SWAP_UYVY 0x00000100 +#define SWAP_YVYU 0x00000200 +#define SWAP_VYUY 0x00000300 +#define IN_601_8 0x00000000 +#define IN_656_8 0x00000010 +#define IN_601_16 0x00000020 +#define IN_656_16 0x00000030 +#define DEINTER_ODD 0x00000000 +#define DEINTER_EVEN 0x00001000 +#define DEINTER_ODD_EVEN 0x00002000 +#define DEINTER_FRAME 0x00003000 +#define VIP_1 0x00000000 +#define VIP_2 0x00000400 +#define H_FILTER_2 0x00010000 +#define H_FILTER_4 0x00020000 +#define H_FILTER_8_1331 0x00030000 +#define H_FILTER_8_12221 0x00040000 +#define VIP_ENABLE 0x00000008 +#define EN_FIELD_SIG 0x00000800 +#define VREF_INVERT 0x00100000 +#define FIELD_INPUT_INVERSE 0x00400000 +#define FIELD_INVERSE 0x40000000 + +#define C1_H_MINI_EN 0x00000800 +#define C0_H_MINI_EN 0x00000800 +#define C1_V_MINI_EN 0x04000000 +#define C0_V_MINI_EN 0x04000000 +#define C1_H_MINI_2 0x00000400 + +/* CAPTURE1_CONTROL 0x354 */ +#define C1_ENABLE 0x00000001 + +/* V3_CONTROL 0x2A0 */ +#define V3_ENABLE 0x00000001 +#define V3_FULL_SCREEN 0x00000002 +#define V3_YUV422 0x00000000 +#define V3_RGB32 0x00000004 +#define V3_RGB15 0x00000008 +#define V3_RGB16 0x0000000C +#define V3_COLORSPACE_SIGN 0x00000080 +#define V3_EXPIRE_NUM 0x00040000 +#define V3_EXPIRE_NUM_F 0x000f0000 +#define V3_BOB_ENABLE 0x00400000 +#define V3_FIELD_BASE 0x00000000 +#define V3_FRAME_BASE 0x01000000 +#define V3_SWAP_SW 0x00000000 +#define V3_SWAP_HW_HQV 0x02000000 +#define V3_FLIP_HW_CAPTURE0 0x04000000 +#define V3_FLIP_HW_CAPTURE1 0x06000000 + +/* V3_ALPHA_FETCH_COUNT 0x2B8 */ +#define V3_FETCH_COUNT 0x3ff00000 +#define ALPHA_FETCH_COUNT 0x000003ff + +/* HQV_CONTROL 0x3D0 */ +#define HQV_RGB32 0x00000000 +#define HQV_RGB16 0x20000000 +#define HQV_RGB15 0x30000000 +#define HQV_YUV422 0x80000000 +#define HQV_YUV420 0xC0000000 +#define HQV_ENABLE 0x08000000 +#define HQV_SRC_SW 0x00000000 +#define HQV_SRC_MC 0x01000000 +#define HQV_SRC_CAPTURE0 0x02000000 +#define HQV_SRC_CAPTURE1 0x03000000 +#define HQV_FLIP_EVEN 0x00000000 +#define HQV_FLIP_ODD 0x00000020 +#define HQV_SW_FLIP 0x00000010 /* Write 1 to flip HQV buffer */ +#define HQV_DEINTERLACE 0x00010000 /* First line of odd field will be repeated 3 times */ +#define HQV_FIELD_2_FRAME 0x00020000 /* Src is field. Display each line 2 times */ +#define HQV_FRAME_2_FIELD 0x00040000 /* Src is field. Display field */ +#define HQV_FRAME_UV 0x00000000 /* Src is Non-interleaved */ +#define HQV_FIELD_UV 0x00100000 /* Src is interleaved */ +#define HQV_IDLE 0x00000008 +#define HQV_FLIP_STATUS 0x00000001 +#define HQV_DOUBLE_BUFF 0x00000000 +#define HQV_TRIPLE_BUFF 0x04000000 +#define HQV_SUBPIC_FLIP 0x00008000 +#define HQV_FIFO_STATUS 0x00001000 + +/* HQV_FILTER_CONTROL 0x3E4 */ +#define HQV_H_LOWPASS_2TAP 0x00000001 +#define HQV_H_LOWPASS_4TAP 0x00000002 +#define HQV_H_LOWPASS_8TAP1 0x00000003 /* To be deleted */ +#define HQV_H_LOWPASS_8TAP2 0x00000004 /* To be deleted */ +#define HQV_H_HIGH_PASS 0x00000008 +#define HQV_H_LOW_PASS 0x00000000 +#define HQV_V_LOWPASS_2TAP 0x00010000 +#define HQV_V_LOWPASS_4TAP 0x00020000 +#define HQV_V_LOWPASS_8TAP1 0x00030000 +#define HQV_V_LOWPASS_8TAP2 0x00040000 +#define HQV_V_HIGH_PASS 0x00080000 +#define HQV_V_LOW_PASS 0x00000000 +#define HQV_H_HIPASS_F1_DEFAULT 0x00000040 +#define HQV_H_HIPASS_F2_DEFAULT 0x00000000 +#define HQV_V_HIPASS_F1_DEFAULT 0x00400000 +#define HQV_V_HIPASS_F2_DEFAULT 0x00000000 +#define HQV_H_HIPASS_F1_2TAP 0x00000050 +#define HQV_H_HIPASS_F2_2TAP 0x00000100 +#define HQV_V_HIPASS_F1_2TAP 0x00500000 +#define HQV_V_HIPASS_F2_2TAP 0x01000000 +#define HQV_H_HIPASS_F1_4TAP 0x00000060 +#define HQV_H_HIPASS_F2_4TAP 0x00000200 +#define HQV_V_HIPASS_F1_4TAP 0x00600000 +#define HQV_V_HIPASS_F2_4TAP 0x02000000 +#define HQV_H_HIPASS_F1_8TAP 0x00000080 +#define HQV_H_HIPASS_F2_8TAP 0x00000400 +#define HQV_V_HIPASS_F1_8TAP 0x00800000 +#define HQV_V_HIPASS_F2_8TAP 0x04000000 +/* IA2 NEW */ +#define HQV_V_FILTER2 0x00080000 +#define HQV_H_FILTER2 0x00000008 +#define HQV_H_TAP2_11 0x00000041 +#define HQV_H_TAP4_121 0x00000042 +#define HQV_H_TAP4_1111 0x00000401 +#define HQV_H_TAP8_1331 0x00000221 +#define HQV_H_TAP8_12221 0x00000402 +#define HQV_H_TAP16_1991 0x00000159 +#define HQV_H_TAP16_141041 0x0000026A +#define HQV_H_TAP32 0x0000015A +#define HQV_V_TAP2_11 0x00410000 +#define HQV_V_TAP4_121 0x00420000 +#define HQV_V_TAP4_1111 0x04010000 +#define HQV_V_TAP8_1331 0x02210000 +#define HQV_V_TAP8_12221 0x04020000 +#define HQV_V_TAP16_1991 0x01590000 +#define HQV_V_TAP16_141041 0x026A0000 +#define HQV_V_TAP32 0x015A0000 +#define HQV_V_FILTER_DEFAULT 0x00420000 +#define HQV_H_FILTER_DEFAULT 0x00000040 + + + + +/* HQV_MINI_CONTROL 0x3E8 */ +#define HQV_H_MINIFY_ENABLE 0x00000800 +#define HQV_V_MINIFY_ENABLE 0x08000000 +#define HQV_VDEBLOCK_FILTER 0x80000000 +#define HQV_HDEBLOCK_FILTER 0x00008000 + + +#define CHROMA_KEY_LOW 0x00FFFFFF +#define CHROMA_KEY_HIGH 0x00FFFFFF + +/* V_CAP_STATUS */ +#define V_ST_UPDATE_NOT_YET 0x00000003 +#define V1_ST_UPDATE_NOT_YET 0x00000001 +#define V3_ST_UPDATE_NOT_YET 0x00000008 + +#define VBI_STATUS 0x00000002 + +/* + * Macros for Video MMIO + */ +#ifndef V4L2 +#define VIDInB(port) *((volatile CARD8 *)(pVia->VidMapBase + (port))) +#define VIDInW(port) *((volatile CARD16 *)(pVia->VidMapBase + (port))) +#define VIDInD(port) *((volatile CARD32 *)(pVia->VidMapBase + (port))) +#define VIDOutB(port, data) *((volatile CARD8 *)(pVia->VidMapBase + (port))) = (data) +#define VIDOutW(port, data) *((volatile CARD16 *)(pVia->VidMapBase + (port))) = (data) +#define VIDOutD(port, data) *((volatile CARD32 *)(pVia->VidMapBase + (port))) = (data) +#define MPGOutD(port, data) *((volatile CARD32 *)(pVia->MpegMapBase +(port))) = (data) +#define MPGInD(port) *((volatile CARD32 *)(pVia->MpegMapBase +(port))) +#endif + +/* + * Macros for GE MMIO + */ +#define GEInW(port) *((volatile CARD16 *)(lpGEMMIO + (port))) +#define GEInD(port) *((volatile CARD32 *)(lpGEMMIO + (port))) +#define GEOutW(port, data) *((volatile CARD16 *)(lpGEMMIO + (port))) = (data) +#define GEOutD(port, data) *((volatile CARD32 *)(lpGEMMIO + (port))) = (data) + +/* + * MPEG 1/2 Slice Engine (at 0xC00 relative to base) + */ + +#define MPG_CONTROL 0x00 +#define MPG_CONTROL_STRUCT 0x03 +#define MPG_CONTROL_STRUCT_TOP 0x01 +#define MPG_CONTROL_STRUCT_BOTTOM 0x02 +#define MPG_CONTROL_STRUCT_FRAME 0x03 + /* Use TOP if interlaced */ +#define MPG_CONTROL_TYPE 0x3C +#define MPG_CONTROL_TYPE_I (0x01 << 2) +#define MPG_CONTROL_TYPE_B (0x02 << 2) +#define MPG_CONTROL_TYPE_P (0x03 << 3) +#define MPG_CONTROL_ALTSCAN 0x40 +#define MPG_BLOCK 0x08 /* Unsure */ +#define MPG_COMMAND 0x0C +#define MPG_DATA1 0x10 +#define MPG_DATA2 0x14 +#define MPG_DATA3 0x18 +#define MPG_DATA4 0x1C + +#define MPG_YPHYSICAL(x) (0x20 + 12*(x)) +#define MPG_CbPHYSICAL(x) (0x24 + 12*(x)) +#define MPG_CrPHYSICAL(x) (0x28 + 12*(x)) + +#define MPG_PITCH 0x50 +#define MPG_STATUS 0x54 + +#define MPG_MATRIX_IDX 0x5C +#define MPG_MATRIX_IDX_INTRA 0x00 +#define MPG_MATRIX_IDX_NON 0x01 +#define MPG_MATRIX_DATA 0x60 + +#define MPG_SLICE_CTRL_1 0x90 +#define MPG_SLICE_MBAMAX 0x2FFF +#define MPG_SLICE_PREDICTIVE_DCT 0x4000 +#define MPG_SLICE_TOP_FIRST 0x8000 +#define MPG_SLICE_MACROBLOCK_WIDTH(x) ((x)<<18) /* in 64's */ +#define MPG_SLICE_CTRL_2 0x94 +#define MPG_SLICE_CONCEAL_MVEC 0x0000001 +#define MPG_SLICE_QSCALE_TYPE 0x0000002 +#define MPG_SLICE_DCPRECISION 0x000000C +#define MPG_SLICE_MACROBQUOT 0x0FFFFF0 +#define MPG_SLICE_INTRAVLC 0x1000000 +#define MPG_SLICE_CTRL_3 0x98 +#define MPG_SLICE_FHMVR 0x0000003 +#define MPG_SLICE_FVMVR 0x000000C +#define MPG_SLICE_BHMVR 0x0000030 +#define MPG_SLICE_BVMVR 0x00000C0 +#define MPG_SLICE_SECOND_FIELD 0x0100000 +#define MPG_SLICE_RESET 0x0400000 +#define MPG_SLICE_LENGTH 0x9C +#define MPG_SLICE_DATA 0xA0 + + + +#endif /* _VIA_H_ */ diff --git a/src/via_accel.c b/src/via_accel.c new file mode 100644 index 0000000..9e4297d --- /dev/null +++ b/src/via_accel.c @@ -0,0 +1,1225 @@ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_accel.c,v 1.11 2004/01/29 03:13:24 dawes Exp $ */ + +/************************************************************************* + * + * File: via_accel.c + * Content: 2D acceleration function for VIA/S3G UniChrom + * + ************************************************************************/ + +#include "Xarch.h" +#include "xaalocal.h" +#include "xaarop.h" +#include "miline.h" + +#include "via_driver.h" +#include "via_regs.h" + +/* Forward declaration of functions used in the driver */ + +static void VIASetupForScreenToScreenCopy( + ScrnInfoPtr pScrn, + int xdir, + int ydir, + int rop, + unsigned planemask, + int trans_color); + +static void VIASubsequentScreenToScreenCopy( + ScrnInfoPtr pScrn, + int x1, + int y1, + int x2, + int y2, + int w, + int h); + +static void VIASetupForSolidFill( + ScrnInfoPtr pScrn, + int color, + int rop, + unsigned planemask); + +static void VIASubsequentSolidFillRect( + ScrnInfoPtr pScrn, + int x, + int y, + int w, + int h); + +static void VIASetupForMono8x8PatternFill( + ScrnInfoPtr pScrn, + int pattern0, + int pattern1, + int fg, + int bg, + int rop, + unsigned planemask); + +static void VIASubsequentMono8x8PatternFillRect( + ScrnInfoPtr pScrn, + int patOffx, + int patOffy, + int x, + int y, + int w, + int h); + +static void VIASetupForColor8x8PatternFill( + ScrnInfoPtr pScrn, + int patternx, + int patterny, + int rop, + unsigned planemask, + int trans_color); + +static void VIASubsequentColor8x8PatternFillRect( + ScrnInfoPtr pScrn, + int patOffx, + int patOffy, + int x, + int y, + int w, + int h); + +static void VIASetupForCPUToScreenColorExpandFill( + ScrnInfoPtr pScrn, + int fg, + int bg, + int rop, + unsigned planemask); + +static void VIASubsequentScanlineCPUToScreenColorExpandFill( + ScrnInfoPtr pScrn, + int x, + int y, + int w, + int h, + int skipleft); + +static void VIASetupForScreenToScreenColorExpand( + ScrnInfoPtr pScrn, + int bg, + int fg, + int rop, + unsigned planemask); + +static void VIASubsequentScreenToScreenColorExpand( + ScrnInfoPtr pScrn, + int x, + int y, + int w, + int h, + int srcx, + int srcy, + int offset); + +static void VIASetupForImageWrite( + ScrnInfoPtr pScrn, + int rop, + unsigned planemask, + int trans_color, + int bpp, + int depth); + +static void VIASubsequentImageWriteRect( + ScrnInfoPtr pScrn, + int x, + int y, + int w, + int h, + int skipleft); + +static void +VIASetupForSolidLine( + ScrnInfoPtr pScrn, + int color, + int rop, + unsigned int planemask); + +static void +VIASubsequentSolidTwoPointLine( + ScrnInfoPtr pScrn, + int x1, + int y1, + int x2, + int y2, + int flags); + +static void +VIASubsequentSolidHorVertLine( + ScrnInfoPtr pScrn, + int x, + int y, + int len, + int dir); + +static void +VIASetupForDashedLine( + ScrnInfoPtr pScrn, + int fg, + int bg, + int rop, + unsigned int planemask, + int length, + unsigned char *pattern); + +static void +VIASubsequentDashedTwoPointLine( + ScrnInfoPtr pScrn, + int x1, + int y1, + int x2, + int y2, + int flags, + int phase); + +static void VIASetClippingRectangle( + ScrnInfoPtr pScrn, + int x1, + int y1, + int x2, + int y2); + +static void VIADisableClipping( ScrnInfoPtr ); + + +void +VIAInitialize2DEngine(ScrnInfoPtr pScrn) +{ + VIAPtr pVia = VIAPTR(pScrn); + CARD32 dwVQStartAddr, dwVQEndAddr; + CARD32 dwVQLen, dwVQStartL, dwVQEndL, dwVQStartEndH; + CARD32 dwGEMode; + + /* init 2D engine regs to reset 2D engine */ + VIASETREG(0x04, 0x0); + VIASETREG(0x08, 0x0); + VIASETREG(0x0c, 0x0); + VIASETREG(0x10, 0x0); + VIASETREG(0x14, 0x0); + VIASETREG(0x18, 0x0); + VIASETREG(0x1c, 0x0); + VIASETREG(0x20, 0x0); + VIASETREG(0x24, 0x0); + VIASETREG(0x28, 0x0); + VIASETREG(0x2c, 0x0); + VIASETREG(0x30, 0x0); + VIASETREG(0x34, 0x0); + VIASETREG(0x38, 0x0); + VIASETREG(0x3c, 0x0); + VIASETREG(0x40, 0x0); + + /* Init AGP and VQ regs */ + VIASETREG(0x43c, 0x00100000); + VIASETREG(0x440, 0x00000000); + VIASETREG(0x440, 0x00333004); + VIASETREG(0x440, 0x60000000); + VIASETREG(0x440, 0x61000000); + VIASETREG(0x440, 0x62000000); + VIASETREG(0x440, 0x63000000); + VIASETREG(0x440, 0x64000000); + VIASETREG(0x440, 0x7D000000); + + VIASETREG(0x43c, 0xfe020000); + VIASETREG(0x440, 0x00000000); + + if (pVia->VQStart != 0) { + /* Enable VQ */ + dwVQStartAddr = pVia->VQStart; + dwVQEndAddr = pVia->VQEnd; + dwVQStartL = 0x50000000 | (dwVQStartAddr & 0xFFFFFF); + dwVQEndL = 0x51000000 | (dwVQEndAddr & 0xFFFFFF); + dwVQStartEndH = 0x52000000 | ((dwVQStartAddr & 0xFF000000) >> 24) | + ((dwVQEndAddr & 0xFF000000) >> 16); + dwVQLen = 0x53000000 | (VIA_VQ_SIZE >> 3); + + VIASETREG(0x43c, 0x00fe0000); + VIASETREG(0x440, 0x080003fe); + VIASETREG(0x440, 0x0a00027c); + VIASETREG(0x440, 0x0b000260); + VIASETREG(0x440, 0x0c000274); + VIASETREG(0x440, 0x0d000264); + VIASETREG(0x440, 0x0e000000); + VIASETREG(0x440, 0x0f000020); + VIASETREG(0x440, 0x1000027e); + VIASETREG(0x440, 0x110002fe); + VIASETREG(0x440, 0x200f0060); + + VIASETREG(0x440, 0x00000006); + VIASETREG(0x440, 0x40008c0f); + VIASETREG(0x440, 0x44000000); + VIASETREG(0x440, 0x45080c04); + VIASETREG(0x440, 0x46800408); + + VIASETREG(0x440, dwVQStartEndH); + VIASETREG(0x440, dwVQStartL); + VIASETREG(0x440, dwVQEndL); + VIASETREG(0x440, dwVQLen); + } + else { + /* Diable VQ */ + VIASETREG(0x43c, 0x00fe0000); + VIASETREG(0x440, 0x00000004); + VIASETREG(0x440, 0x40008c0f); + VIASETREG(0x440, 0x44000000); + VIASETREG(0x440, 0x45080c04); + VIASETREG(0x440, 0x46800408); + } + + dwGEMode = 0; + + switch (pScrn->bitsPerPixel) { + case 16: + dwGEMode |= VIA_GEM_16bpp; + break; + case 32: + dwGEMode |= VIA_GEM_32bpp; + default: + dwGEMode |= VIA_GEM_8bpp; + break; + } + +#if 0 + switch (pScrn->displayWidth) { + case 800: + dwGEMode |= VIA_GEM_800; + break; + case 1024: + dwGEMode |= VIA_GEM_1024; + break; + case 1280: + dwGEMode |= VIA_GEM_1280; + break; + case 1600: + dwGEMode |= VIA_GEM_1600; + break; + case 2048: + dwGEMode |= VIA_GEM_2048; + break; + default: + dwGEMode |= VIA_GEM_640; + break; + } +#endif + + /* Set BPP and Pitch */ + VIASETREG(VIA_REG_GEMODE, dwGEMode); + + /* Set Src and Dst base address and pitch, pitch is qword */ + VIASETREG(VIA_REG_SRCBASE, 0x0); + VIASETREG(VIA_REG_DSTBASE, 0x0); + VIASETREG(VIA_REG_PITCH, VIA_PITCH_ENABLE | + ((pScrn->displayWidth * pScrn->bitsPerPixel >> 3) >> 3) | + (((pScrn->displayWidth * pScrn->bitsPerPixel >> 3) >> 3) << 16)); +} + + + +/* Acceleration init function, sets up pointers to our accelerated functions */ +Bool +VIAInitAccel(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + VIAPtr pVia = VIAPTR(pScrn); + XAAInfoRecPtr xaaptr; + BoxRec AvailFBArea; + unsigned long cacheEnd; + unsigned long cacheEndTmp; + + pVia->VQStart = 0; + if (((pVia->FBFreeEnd - pVia->FBFreeStart) >= VIA_VQ_SIZE) && + pVia->VQEnable) { + /* Reserved space for VQ */ + pVia->VQStart = pVia->FBFreeEnd - VIA_VQ_SIZE; + pVia->VQEnd = pVia->VQStart + VIA_VQ_SIZE - 1; + pVia->FBFreeEnd -= VIA_VQ_SIZE; + } + if (pVia->hwcursor) { + pVia->FBFreeEnd -= VIA_CURSOR_SIZE; + } + + VIAInitialize2DEngine(pScrn); + + if (pScrn->depth == 8) { + pVia->PlaneMask = 0xFF; + } + else if (pScrn->depth == 15) { + pVia->PlaneMask = 0x7FFF; + } + else if (pScrn->depth == 16) { + pVia->PlaneMask = 0xFFFF; + } + else if (pScrn->depth == 24) { + pVia->PlaneMask = 0xFFFFFF; + } + + /* General acceleration flags */ + if (!(xaaptr = pVia->AccelInfoRec = XAACreateInfoRec())) + return FALSE; + + xaaptr->Flags = PIXMAP_CACHE | + OFFSCREEN_PIXMAPS | + LINEAR_FRAMEBUFFER | + MICROSOFT_ZERO_LINE_BIAS | + 0; + + if (pScrn->bitsPerPixel == 8) + xaaptr->CachePixelGranularity = 128; + + /* Clipping */ + xaaptr->SetClippingRectangle = VIASetClippingRectangle; + xaaptr->DisableClipping = VIADisableClipping; + xaaptr->ClippingFlags = HARDWARE_CLIP_SOLID_FILL | + HARDWARE_CLIP_SOLID_LINE | + HARDWARE_CLIP_DASHED_LINE | + HARDWARE_CLIP_SCREEN_TO_SCREEN_COPY | + HARDWARE_CLIP_MONO_8x8_FILL | + HARDWARE_CLIP_COLOR_8x8_FILL | + HARDWARE_CLIP_SCREEN_TO_SCREEN_COLOR_EXPAND | + 0; + + xaaptr->Sync = VIAAccelSync; + + /* ScreenToScreen copies */ + xaaptr->SetupForScreenToScreenCopy = VIASetupForScreenToScreenCopy; + xaaptr->SubsequentScreenToScreenCopy = VIASubsequentScreenToScreenCopy; + xaaptr->ScreenToScreenCopyFlags = NO_PLANEMASK | ROP_NEEDS_SOURCE; + + /* Solid filled rectangles */ + xaaptr->SetupForSolidFill = VIASetupForSolidFill; + xaaptr->SubsequentSolidFillRect = VIASubsequentSolidFillRect; + xaaptr->SolidFillFlags = NO_PLANEMASK | ROP_NEEDS_SOURCE; + + /* Mono 8x8 pattern fills */ + xaaptr->SetupForMono8x8PatternFill = VIASetupForMono8x8PatternFill; + xaaptr->SubsequentMono8x8PatternFillRect = + VIASubsequentMono8x8PatternFillRect; + xaaptr->Mono8x8PatternFillFlags = NO_PLANEMASK | + HARDWARE_PATTERN_PROGRAMMED_BITS | + ROP_NEEDS_SOURCE | + BIT_ORDER_IN_BYTE_MSBFIRST | + 0; + + /* Color 8x8 pattern fills */ + xaaptr->SetupForColor8x8PatternFill = VIASetupForColor8x8PatternFill; + xaaptr->SubsequentColor8x8PatternFillRect = + VIASubsequentColor8x8PatternFillRect; + xaaptr->Color8x8PatternFillFlags = NO_PLANEMASK | + NO_TRANSPARENCY | + HARDWARE_PATTERN_PROGRAMMED_BITS | + ROP_NEEDS_SOURCE | + 0; + + /*=* This function is only used in drawing check box when use RedHat 7.2 + * Raleigh Theme. The behavior is a little strange, so we temporarily + * disable this function. *=*/ + /* Screen to Screen color expansion. */ + xaaptr->SetupForScreenToScreenColorExpandFill = + VIASetupForScreenToScreenColorExpand; + xaaptr->SubsequentScreenToScreenColorExpandFill = + VIASubsequentScreenToScreenColorExpand; + xaaptr->ScreenToScreenColorExpandFillFlags = NO_PLANEMASK | + BIT_ORDER_IN_BYTE_MSBFIRST | + ROP_NEEDS_SOURCE | + 0; + + /* Solid lines */ + xaaptr->SetupForSolidLine = VIASetupForSolidLine; + xaaptr->SubsequentSolidTwoPointLine = VIASubsequentSolidTwoPointLine; + xaaptr->SubsequentSolidHorVertLine = VIASubsequentSolidHorVertLine; + xaaptr->SolidBresenhamLineErrorTermBits = 14; + xaaptr->SolidLineFlags = NO_PLANEMASK | ROP_NEEDS_SOURCE; + + /* dashed line */ + xaaptr->SetupForDashedLine = VIASetupForDashedLine; + xaaptr->SubsequentDashedTwoPointLine = VIASubsequentDashedTwoPointLine; + xaaptr->DashPatternMaxLength = 8; + xaaptr->DashedLineFlags = NO_PLANEMASK | + ROP_NEEDS_SOURCE | + LINE_PATTERN_POWER_OF_2_ONLY | + LINE_PATTERN_MSBFIRST_LSBJUSTIFIED | + 0; + + /* CPU to Screen color expansion */ + xaaptr->ScanlineCPUToScreenColorExpandFillFlags = NO_PLANEMASK | + CPU_TRANSFER_PAD_DWORD | + SCANLINE_PAD_DWORD | + BIT_ORDER_IN_BYTE_MSBFIRST | + LEFT_EDGE_CLIPPING | + ROP_NEEDS_SOURCE | + 0; + + xaaptr->SetupForScanlineCPUToScreenColorExpandFill = + VIASetupForCPUToScreenColorExpandFill; + xaaptr->SubsequentScanlineCPUToScreenColorExpandFill = + VIASubsequentScanlineCPUToScreenColorExpandFill; + xaaptr->ColorExpandBase = pVia->BltBase; + xaaptr->ColorExpandRange = VIA_MMIO_BLTSIZE; + + /* ImageWrite */ + xaaptr->ImageWriteFlags = NO_PLANEMASK | + CPU_TRANSFER_PAD_DWORD | + SCANLINE_PAD_DWORD | + BIT_ORDER_IN_BYTE_MSBFIRST | + LEFT_EDGE_CLIPPING | + ROP_NEEDS_SOURCE | + /*NO_GXCOPY |*/ + /*SYNC_AFTER_IMAGE_WRITE |*/ + 0; + + xaaptr->SetupForImageWrite = VIASetupForImageWrite; + xaaptr->SubsequentImageWriteRect = VIASubsequentImageWriteRect; + xaaptr->ImageWriteBase = pVia->BltBase; + xaaptr->ImageWriteRange = VIA_MMIO_BLTSIZE; + + /* We reserve space for pixel cache */ + + cacheEnd = pVia->FBFreeEnd / pVia->Bpl; + cacheEndTmp = (pVia->FBFreeStart + VIA_PIXMAP_CACHE_SIZE + pVia->Bpl-1) + / pVia->Bpl; + + /* + * Use only requested pixmap size if it is less than available + * offscreen memory. + */ + + if(cacheEnd > cacheEndTmp) + cacheEnd = cacheEndTmp; + /* + * Clip to the blitter limit + */ + + if (cacheEnd > VIA_MAX_ACCEL_Y) + cacheEnd = VIA_MAX_ACCEL_Y; + + pVia->FBFreeStart = (cacheEnd + 1) *pVia->Bpl; + + /* + * Finally, we set up the video memory space available to the pixmap + * cache + */ + + AvailFBArea.x1 = 0; + AvailFBArea.y1 = 0; + AvailFBArea.x2 = pScrn->displayWidth; + AvailFBArea.y2 = cacheEnd; + + xf86InitFBManager(pScreen, &AvailFBArea); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Using %d lines for offscreen memory.\n", + AvailFBArea.y2 - pScrn->virtualY )); + + return XAAInit(pScreen, xaaptr); +} + + + +/* The sync function for the GE */ +void VIAAccelSync(ScrnInfoPtr pScrn) +{ + VIAPtr pVia = VIAPTR(pScrn); + + WaitIdle(); +} + + +/* These are the ScreenToScreen bitblt functions. We support all ROPs, all + * directions. + * + */ + +static void +VIASetupForScreenToScreenCopy( + ScrnInfoPtr pScrn, + int xdir, + int ydir, + int rop, + unsigned planemask, + int trans_color) +{ + VIAPtr pVia = VIAPTR(pScrn); + int cmd; + + cmd = VIA_GEC_BLT | (XAACopyROP[rop] << 24); + + if (xdir < 0) + cmd |= VIA_GEC_DECX; + + if (ydir < 0) + cmd |= VIA_GEC_DECY; + + pVia->SavedCmd = cmd; + + if (trans_color != -1) { + /* Transparent Bitblt */ + VIASETREG(VIA_REG_SRCCOLORKEY, trans_color); + VIASETREG(VIA_REG_KEYCONTROL, 0x4000); + } + else { + /* Disable Transparent Bitblt */ + VIASETREG(VIA_REG_KEYCONTROL, 0x0); + } +} + + +static void +VIASubsequentScreenToScreenCopy( + ScrnInfoPtr pScrn, + int x1, + int y1, + int x2, + int y2, + int w, + int h) +{ + VIAPtr pVia = VIAPTR(pScrn); + + if (!w || !h) + return; + + if (pVia->SavedCmd & VIA_GEC_DECX) { + x1 += (w - 1); + x2 += (w - 1); + } + + if (pVia->SavedCmd & VIA_GEC_DECY) { + y1 += (h - 1); + y2 += (h - 1); + } + + /* Set Src and Dst base address and pitch, pitch is qword */ + VIASETREG(VIA_REG_SRCBASE, 0x0); + VIASETREG(VIA_REG_DSTBASE, 0x0); + VIASETREG(VIA_REG_PITCH, VIA_PITCH_ENABLE | + ((pScrn->displayWidth * pScrn->bitsPerPixel >> 3) >> 3) | + (((pScrn->displayWidth * pScrn->bitsPerPixel >> 3) >> 3) << 16)); + + VIASETREG(VIA_REG_SRCPOS, ((y1 << 16) | x1)); + VIASETREG(VIA_REG_DSTPOS, ((y2 << 16) | x2)); + VIASETREG(VIA_REG_DIMENSION, (((h - 1) << 16) | (w - 1))); + VIASETREG(VIA_REG_GECMD, pVia->SavedCmd); +} + + +/* + * SetupForSolidFill is also called to set up for lines. + */ + +static void +VIASetupForSolidFill( + ScrnInfoPtr pScrn, + int color, + int rop, + unsigned planemask) +{ + VIAPtr pVia = VIAPTR(pScrn); + int cmd; + + cmd = VIA_GEC_BLT | VIA_GEC_FIXCOLOR_PAT | (XAAPatternROP[rop] << 24); + + pVia->SavedCmd = cmd; + pVia->SavedFgColor = color; +} + + +static void +VIASubsequentSolidFillRect( + ScrnInfoPtr pScrn, + int x, + int y, + int w, + int h) +{ + VIAPtr pVia = VIAPTR(pScrn); + + if (!w || !h) + return; + + /* Set Src and Dst base address and pitch, pitch is qword */ + VIASETREG(VIA_REG_SRCBASE, 0x0); + VIASETREG(VIA_REG_DSTBASE, 0x0); + VIASETREG(VIA_REG_PITCH, VIA_PITCH_ENABLE | + ((pScrn->displayWidth * pScrn->bitsPerPixel >> 3) >> 3) | + (((pScrn->displayWidth * pScrn->bitsPerPixel >> 3) >> 3) << 16)); + + VIASETREG(VIA_REG_DSTPOS, ((y << 16) | x)); + VIASETREG(VIA_REG_DIMENSION, (((h - 1) << 16) | (w - 1))); + VIASETREG(VIA_REG_FGCOLOR, pVia->SavedFgColor); + VIASETREG(VIA_REG_GECMD, pVia->SavedCmd); +} + + +/* + * The meaning of the two pattern paremeters to Setup & Subsequent for + * Mono8x8Patterns varies depending on the flag bits. We specify + * HW_PROGRAMMED_BITS, which means our hardware can handle 8x8 patterns + * without caching in the frame buffer. Thus, Setup gets the pattern bits. + * There is no way with BCI to rotate an 8x8 pattern, so we do NOT specify + * HW_PROGRAMMED_ORIGIN. XAA wil rotate it for us and pass the rotated + * pattern to both Setup and Subsequent. If we DID specify PROGRAMMED_ORIGIN, + * then Setup would get the unrotated pattern, and Subsequent gets the + * origin values. + */ + +static void +VIASetupForMono8x8PatternFill( + ScrnInfoPtr pScrn, + int pattern0, + int pattern1, + int fg, + int bg, + int rop, + unsigned planemask) +{ + VIAPtr pVia = VIAPTR(pScrn); + int cmd; + + cmd = VIA_GEC_BLT | VIA_GEC_PAT_REG | VIA_GEC_PAT_MONO | + (XAAPatternROP[rop] << 24); + + if (bg == -1) { + /* transparent mono pattern */ + cmd |= VIA_GEC_MPAT_TRANS; + } + + pVia->SavedCmd = cmd; + pVia->SavedFgColor = fg; + pVia->SavedBgColor = bg; + pVia->SavedPattern0 = pattern0; + pVia->SavedPattern1 = pattern1; +} + + +static void +VIASubsequentMono8x8PatternFillRect( + ScrnInfoPtr pScrn, + int patOffx, + int patOffy, + int x, + int y, + int w, + int h) +{ + VIAPtr pVia = VIAPTR(pScrn); + CARD32 dwPatOffset; + + if (!w || !h) + return; + + dwPatOffset = ((patOffy & 0x7) << 29) | ((patOffx & 0x7) << 26); + + /* Set Src and Dst base address and pitch, pitch is qword */ + VIASETREG(VIA_REG_SRCBASE, 0x0); + VIASETREG(VIA_REG_DSTBASE, 0x0); + VIASETREG(VIA_REG_PITCH, VIA_PITCH_ENABLE | + ((pScrn->displayWidth * pScrn->bitsPerPixel >> 3) >> 3) | + (((pScrn->displayWidth * pScrn->bitsPerPixel >> 3) >> 3) << 16)); + + VIASETREG(VIA_REG_DSTPOS, ((y << 16) | x)); + VIASETREG(VIA_REG_DIMENSION, (((h - 1) << 16) | (w - 1))); + VIASETREG(VIA_REG_PATADDR, dwPatOffset); + VIASETREG(VIA_REG_FGCOLOR, pVia->SavedFgColor); + VIASETREG(VIA_REG_BGCOLOR, pVia->SavedBgColor); + VIASETREG(VIA_REG_MONOPAT0, pVia->SavedPattern0); + VIASETREG(VIA_REG_MONOPAT1, pVia->SavedPattern1); + VIASETREG(VIA_REG_GECMD, pVia->SavedCmd); +} + +static void +VIASetupForColor8x8PatternFill( + ScrnInfoPtr pScrn, + int patternx, + int patterny, + int rop, + unsigned planemask, + int trans_color) +{ + VIAPtr pVia = VIAPTR(pScrn); + int cmd; + + cmd = VIA_GEC_BLT | (XAAPatternROP[rop] << 24); + + pVia->SavedCmd = cmd; + pVia->SavedPatternAddr = (patternx * pVia->Bpp + patterny * pVia->Bpl); +} + + +static void +VIASubsequentColor8x8PatternFillRect( + ScrnInfoPtr pScrn, + int patOffx, + int patOffy, + int x, + int y, + int w, + int h) +{ + VIAPtr pVia = VIAPTR(pScrn); + CARD32 dwPatAddr; + + if (!w || !h) + return; + + dwPatAddr = (pVia->SavedPatternAddr >> 3) | + ((patOffy & 0x7) << 29) | ((patOffx & 0x7) << 26); + + /* Set Src and Dst base address and pitch, pitch is qword */ + VIASETREG(VIA_REG_SRCBASE, 0x0); + VIASETREG(VIA_REG_DSTBASE, 0x0); + VIASETREG(VIA_REG_PITCH, VIA_PITCH_ENABLE | + ((pScrn->displayWidth * pScrn->bitsPerPixel >> 3) >> 3) | + (((pScrn->displayWidth * pScrn->bitsPerPixel >> 3) >> 3) << 16)); + + VIASETREG(VIA_REG_DSTPOS, ((y << 16) | x)); + VIASETREG(VIA_REG_DIMENSION, (((h - 1) << 16) | (w - 1))); + VIASETREG(VIA_REG_PATADDR, dwPatAddr); + VIASETREG(VIA_REG_GECMD, pVia->SavedCmd); +} + +static void +VIASetupForCPUToScreenColorExpandFill( + ScrnInfoPtr pScrn, + int fg, + int bg, + int rop, + unsigned planemask) +{ + VIAPtr pVia = VIAPTR(pScrn); + int cmd; + + cmd = VIA_GEC_BLT | VIA_GEC_SRC_SYS | VIA_GEC_SRC_MONO | + (XAACopyROP[rop] << 24); + + if (bg == -1) { + cmd |= VIA_GEC_MSRC_TRANS; + } + + pVia->SavedCmd = cmd; + pVia->SavedFgColor = fg; + pVia->SavedBgColor = bg; + + /* Disable Transparent Bitblt */ + VIASETREG(VIA_REG_KEYCONTROL, 0x0); +} + + +static void +VIASubsequentScanlineCPUToScreenColorExpandFill( + ScrnInfoPtr pScrn, + int x, + int y, + int w, + int h, + int skipleft) +{ + VIAPtr pVia = VIAPTR(pScrn); + + /* XAA will be sending bitmap data next. */ + /* We should probably wait for empty/idle here. */ + + if (skipleft) { + VIASetClippingRectangle(pScrn, (x + skipleft), y, (x + w - 1), (y + h -1)); + } + + /* Set Src and Dst base address and pitch, pitch is qword */ + VIASETREG(VIA_REG_SRCBASE, 0x0); + VIASETREG(VIA_REG_DSTBASE, 0x0); + VIASETREG(VIA_REG_PITCH, VIA_PITCH_ENABLE | + ((pScrn->displayWidth * pScrn->bitsPerPixel >> 3) >> 3) | + (((pScrn->displayWidth * pScrn->bitsPerPixel >> 3) >> 3) << 16)); + + VIASETREG(VIA_REG_SRCPOS, 0); + VIASETREG(VIA_REG_DSTPOS, ((y << 16) | x)); + VIASETREG(VIA_REG_DIMENSION, (((h - 1) << 16) | (w - 1))); + VIASETREG(VIA_REG_FGCOLOR, pVia->SavedFgColor); + VIASETREG(VIA_REG_BGCOLOR, pVia->SavedBgColor); + VIASETREG(VIA_REG_GECMD, pVia->SavedCmd); +} + + +static void +VIASetupForScreenToScreenColorExpand( + ScrnInfoPtr pScrn, + int fg, + int bg, + int rop, + unsigned int planemask) +{ + VIAPtr pVia = VIAPTR(pScrn); + int cmd; + + cmd = VIA_GEC_BLT | VIA_GEC_SRC_MONO | (XAACopyROP[rop] << 24); + + if (bg == -1) { + cmd |= VIA_GEC_MSRC_TRANS; + } + + pVia->SavedCmd = cmd; + pVia->SavedFgColor = fg; + pVia->SavedBgColor = bg; + + /* Disable Transparent Bitblt */ + VIASETREG(VIA_REG_KEYCONTROL, 0x0); +} + + +static void +VIASubsequentScreenToScreenColorExpand( + ScrnInfoPtr pScrn, + int x, + int y, + int w, + int h, + int srcx, + int srcy, + int offset) +{ + VIAPtr pVia = VIAPTR(pScrn); + + /* Set Src and Dst base address and pitch, pitch is qword */ + VIASETREG(VIA_REG_SRCBASE, 0x0); + VIASETREG(VIA_REG_DSTBASE, 0x0); + VIASETREG(VIA_REG_PITCH, VIA_PITCH_ENABLE | + ((pScrn->displayWidth * pScrn->bitsPerPixel >> 3) >> 3) | + (((pScrn->displayWidth * pScrn->bitsPerPixel >> 3) >> 3) << 16)); + + VIASETREG(VIA_REG_SRCBASE, ((((srcy * pScrn->displayWidth) + srcx) * + (pScrn->bitsPerPixel >> 3)) >> 3)); + srcy = 0; + srcx = 0; + + VIASETREG(VIA_REG_SRCPOS, ((srcy << 16) | + (srcx * pScrn->bitsPerPixel + offset))); + VIASETREG(VIA_REG_DSTPOS, ((y << 16) | x)); + VIASETREG(VIA_REG_DIMENSION, (((h - 1) << 16) | (w - 1))); + VIASETREG(VIA_REG_FGCOLOR, pVia->SavedFgColor); + VIASETREG(VIA_REG_BGCOLOR, pVia->SavedBgColor); + VIASETREG(VIA_REG_GECMD, pVia->SavedCmd); + + VIASETREG(VIA_REG_SRCBASE, 0x0); +} + +static void +VIASetupForImageWrite( + ScrnInfoPtr pScrn, + int rop, + unsigned planemask, + int trans_color, + int bpp, + int depth) +{ + VIAPtr pVia = VIAPTR(pScrn); + int cmd; + + /* We don't record bpp and depth because we assume bpp is equal to + bpp of screen. Is this assume correct ? */ + + cmd = VIA_GEC_BLT | VIA_GEC_SRC_SYS | (XAACopyROP[rop] << 24); + + pVia->SavedCmd = cmd; + + if (trans_color != -1) { + /* Transparent Bitblt */ + VIASETREG(VIA_REG_SRCCOLORKEY, trans_color); + VIASETREG(VIA_REG_KEYCONTROL, 0x4000); + } + else { + /* Disable Transparent Bitblt */ + VIASETREG(VIA_REG_KEYCONTROL, 0x0); + } + +} + + +static void +VIASubsequentImageWriteRect( + ScrnInfoPtr pScrn, + int x, + int y, + int w, + int h, + int skipleft) +{ + VIAPtr pVia = VIAPTR(pScrn); + + if (skipleft) { + VIASetClippingRectangle(pScrn, (x + skipleft), y, (x + w - 1), (y + h -1)); + } + + /* Set Src and Dst base address and pitch, pitch is qword */ + VIASETREG(VIA_REG_SRCBASE, 0x0); + VIASETREG(VIA_REG_DSTBASE, 0x0); + VIASETREG(VIA_REG_PITCH, VIA_PITCH_ENABLE | + ((pScrn->displayWidth * pScrn->bitsPerPixel >> 3) >> 3) | + (((pScrn->displayWidth * pScrn->bitsPerPixel >> 3) >> 3) << 16)); + + VIASETREG(VIA_REG_SRCPOS, 0); + VIASETREG(VIA_REG_DSTPOS, ((y << 16) | x)); + VIASETREG(VIA_REG_DIMENSION, (((h - 1) << 16) | (w - 1))); + VIASETREG(VIA_REG_GECMD, pVia->SavedCmd); +} + + +/* Setup for XAA solid lines. */ +static void +VIASetupForSolidLine( + ScrnInfoPtr pScrn, + int color, + int rop, + unsigned int planemask) +{ + VIAPtr pVia = VIAPTR(pScrn); + int cmd; + + /* we move VIA_GEC_LINE from here to the place firing command */ + cmd = VIA_GEC_FIXCOLOR_PAT | (XAAPatternROP[rop] << 24); + + pVia->SavedCmd = cmd; + pVia->SavedFgColor = color; + + /* set solid line pattern */ + VIASETREG(VIA_REG_MONOPAT0, 0xFF); + VIASETREG(VIA_REG_FGCOLOR, pVia->SavedFgColor); +} + + +static void +VIASubsequentSolidTwoPointLine( + ScrnInfoPtr pScrn, + int x1, + int y1, + int x2, + int y2, + int flags) +{ + VIAPtr pVia = VIAPTR(pScrn); + int dx, dy, cmd, tmp, error = 1; + + cmd = pVia->SavedCmd | VIA_GEC_LINE; + + dx = x2 - x1; + if (dx < 0) { + dx = -dx; + cmd |= VIA_GEC_DECX; /* line will be drawn from right */ + error = 0; + } + + dy = y2 - y1; + if (dy < 0) { + dy = -dy; + cmd |= VIA_GEC_DECY; /* line will be drawn from bottom */ + } + + if (dy > dx) { + tmp = dy; + dy = dx; + dx = tmp; /* Swap 'dx' and 'dy' */ + cmd |= VIA_GEC_Y_MAJOR; /* Y major line */ + } + + if (flags & OMIT_LAST) { + cmd |= VIA_GEC_LASTPIXEL_OFF; + } + + /* Set Src and Dst base address and pitch, pitch is qword */ + VIASETREG(VIA_REG_SRCBASE, 0x0); + VIASETREG(VIA_REG_DSTBASE, 0x0); + VIASETREG(VIA_REG_PITCH, VIA_PITCH_ENABLE | + ((pScrn->displayWidth * pScrn->bitsPerPixel >> 3) >> 3) | + (((pScrn->displayWidth * pScrn->bitsPerPixel >> 3) >> 3) << 16)); + + /* major = 2*dmaj, minor = 2*dmin, err = -dmaj - ((bias >> octant) & 1) */ + /* K1 = 2*dmin K2 = 2*(dmin - dmax) */ + /* Error Term = (StartX<EndX) ? (2*dmin - dmax - 1) : (2*(dmin - dmax)) */ + VIASETREG(VIA_REG_LINE_K1K2, ((((dy << 1) & 0x3fff) << 16)| + (((dy - dx) << 1) & 0x3fff))); + VIASETREG(VIA_REG_LINE_XY, ((y1 << 16) | x1)); + VIASETREG(VIA_REG_DIMENSION, dx); + VIASETREG(VIA_REG_LINE_ERROR, (((dy << 1) - dx - error) & 0x3fff)); + VIASETREG(VIA_REG_GECMD, cmd); + +} + + +/* Subsequent XAA solid horizontal and vertical lines */ +static void +VIASubsequentSolidHorVertLine( + ScrnInfoPtr pScrn, + int x, + int y, + int len, + int dir) +{ + VIAPtr pVia = VIAPTR(pScrn); + + /* Set Src and Dst base address and pitch, pitch is qword */ + VIASETREG(VIA_REG_SRCBASE, 0x0); + VIASETREG(VIA_REG_DSTBASE, 0x0); + VIASETREG(VIA_REG_PITCH, VIA_PITCH_ENABLE | + ((pScrn->displayWidth * pScrn->bitsPerPixel >> 3) >> 3) | + (((pScrn->displayWidth * pScrn->bitsPerPixel >> 3) >> 3) << 16)); + + if (dir == DEGREES_0) { + VIASETREG(VIA_REG_DSTPOS, ((y << 16) | x)); + VIASETREG(VIA_REG_DIMENSION, (len - 1)); + VIASETREG(VIA_REG_GECMD, pVia->SavedCmd | VIA_GEC_BLT); + } + else { + VIASETREG(VIA_REG_DSTPOS, ((y << 16) | x)); + VIASETREG(VIA_REG_DIMENSION, ((len - 1) << 16)); + VIASETREG(VIA_REG_GECMD, pVia->SavedCmd | VIA_GEC_BLT); + } +} + +static void +VIASetupForDashedLine( + ScrnInfoPtr pScrn, + int fg, + int bg, + int rop, + unsigned int planemask, + int length, + unsigned char *pattern) +{ + VIAPtr pVia = VIAPTR(pScrn); + int cmd; + CARD32 pat = *(CARD32 *)pattern; + + cmd = VIA_GEC_LINE | VIA_GEC_FIXCOLOR_PAT | (XAAPatternROP[rop] << 24); + + if (bg == -1) { + /* transparent mono pattern */ + cmd |= VIA_GEC_MPAT_TRANS; + } + + pVia->SavedCmd = cmd; + pVia->SavedFgColor = fg; + pVia->SavedBgColor = bg; + + switch (length) { + case 2: pat |= pat << 2; /* fall through */ + case 4: pat |= pat << 4; /* fall through */ + case 8: pat |= pat << 8; /* fall through */ + case 16: pat |= pat << 16; + } + + pVia->SavedPattern0 = pat; + + VIASETREG(VIA_REG_FGCOLOR, pVia->SavedFgColor); + VIASETREG(VIA_REG_BGCOLOR, pVia->SavedBgColor); + VIASETREG(VIA_REG_MONOPAT0, pVia->SavedPattern0); +} + + +static void +VIASubsequentDashedTwoPointLine( + ScrnInfoPtr pScrn, + int x1, + int y1, + int x2, + int y2, + int flags, + int phase) +{ + VIAPtr pVia = VIAPTR(pScrn); + int dx, dy, cmd, tmp, error = 1; + + cmd = pVia->SavedCmd; + + dx = x2 - x1; + if (dx < 0) { + dx = -dx; + cmd |= VIA_GEC_DECX; /* line will be drawn from right */ + error = 0; + } + + dy = y2 - y1; + if (dy < 0) { + dy = -dy; + cmd |= VIA_GEC_DECY; /* line will be drawn from bottom */ + } + + if (dy > dx) { + tmp = dy; + dy = dx; + dx = tmp; /* Swap 'dx' and 'dy' */ + cmd |= VIA_GEC_Y_MAJOR; /* Y major line */ + } + + if (flags & OMIT_LAST) { + cmd |= VIA_GEC_LASTPIXEL_OFF; + } + + /* Set Src and Dst base address and pitch, pitch is qword */ + VIASETREG(VIA_REG_SRCBASE, 0x0); + VIASETREG(VIA_REG_DSTBASE, 0x0); + VIASETREG(VIA_REG_PITCH, VIA_PITCH_ENABLE | + ((pScrn->displayWidth * pScrn->bitsPerPixel >> 3) >> 3) | + (((pScrn->displayWidth * pScrn->bitsPerPixel >> 3) >> 3) << 16)); + + /* major = 2*dmaj, minor = 2*dmin, err = -dmaj - ((bias >> octant) & 1) */ + /* K1 = 2*dmin K2 = 2*(dmin - dmax) */ + /* Error Term = (StartX<EndX) ? (2*dmin - dmax - 1) : (2*(dmin - dmax)) */ + VIASETREG(VIA_REG_LINE_K1K2, ((((dy << 1) & 0x3fff) << 16)| + (((dy - dx) << 1) & 0x3fff))); + VIASETREG(VIA_REG_LINE_XY, ((y1 << 16) | x1)); + VIASETREG(VIA_REG_DIMENSION, dx); + VIASETREG(VIA_REG_LINE_ERROR, (((dy << 1) - dx - error) & 0x3fff) | 0xFF0000); + VIASETREG(VIA_REG_GECMD, cmd); +} + + +static void +VIASetClippingRectangle( + ScrnInfoPtr pScrn, + int x1, + int y1, + int x2, + int y2) +{ + VIAPtr pVia = VIAPTR(pScrn); + +#ifdef DEBUG_EXTRA + ErrorF("ClipRect, (%4d,%4d)-(%4d,%4d) \n", x1, y1, x2, y2 ); +#endif + + VIASETREG(VIA_REG_CLIPTL, ((y1 << 16) | x1)); + VIASETREG(VIA_REG_CLIPBR, ((y2 << 16) | x2)); + pVia->SavedCmd |= VIA_GEC_CLIP_ENABLE; +} + + +static void VIADisableClipping(ScrnInfoPtr pScrn) +{ + VIAPtr pVia = VIAPTR(pScrn); + +#ifdef DEBUG_EXTRA + ErrorF("Kill ClipRect\n"); +#endif + + pVia->SavedCmd &= ~VIA_GEC_CLIP_ENABLE; +} diff --git a/src/via_bandwidth.c b/src/via_bandwidth.c new file mode 100644 index 0000000..3bd24e4 --- /dev/null +++ b/src/via_bandwidth.c @@ -0,0 +1,385 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_bandwidth.c,v 1.3 2004/01/05 00:34:17 dawes Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ +#include "via_driver.h" +#include "via_bandwidth.h" + +void VIADisabledExtendedFIFO(VIABIOSInfoPtr pBIOSInfo) +{ + VIABIOSInfoPtr pVia = pBIOSInfo; + CARD32 dwGE230, dwGE298; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIADisabledExtendedFIFO\n")); + /* Cause of exit XWindow will dump back register value, others chipset no + * need to set extended fifo value */ + if (pBIOSInfo->Chipset == VIA_CLE266 && pBIOSInfo->ChipRev < 15 && + (pBIOSInfo->HDisplay > 1024 || pBIOSInfo->HasSecondary)) { + /* Turn off Extend FIFO */ + /* 0x298[29] */ + dwGE298 = VIAGETREG(0x298); + VIASETREG(0x298, dwGE298 | 0x20000000); + /* 0x230[21] */ + dwGE230 = VIAGETREG(0x230); + VIASETREG(0x230, dwGE230 & ~0x00200000); + /* 0x298[29] */ + dwGE298 = VIAGETREG(0x298); + VIASETREG(0x298, dwGE298 & ~0x20000000); + } +} + +void VIAEnabledPrimaryExtendedFIFO(VIABIOSInfoPtr pBIOSInfo) +{ + VIABIOSInfoPtr pVia = pBIOSInfo; + CARD8 bRegTemp; + CARD32 dwGE230, dwGE298; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIAEnabledPrimaryExtendedFIFO\n")); + switch (pBIOSInfo->Chipset) { + case VIA_CLE266: + if (pBIOSInfo->ChipRev > 14) { /* For 3123Cx */ + if (pBIOSInfo->HasSecondary) { /* SAMM or DuoView case */ + if (pBIOSInfo->HDisplay >= 1024) + { + /* 3c5.16[0:5] */ + VGAOUT8(0x3C4, 0x16); + bRegTemp = VGAIN8(0x3C5); + bRegTemp &= ~0x3F; + bRegTemp |= 0x1C; + VGAOUT8(0x3C5, bRegTemp); + /* 3c5.17[0:6] */ + VGAOUT8(0x3C4, 0x17); + bRegTemp = VGAIN8(0x3C5); + bRegTemp &= ~0x7F; + bRegTemp |= 0x3F; + VGAOUT8(0x3C5, bRegTemp); + } + } + else /* Single view or Simultaneous case */ + { + if (pBIOSInfo->HDisplay > 1024) + { + /* 3c5.16[0:5] */ + VGAOUT8(0x3C4, 0x16); + bRegTemp = VGAIN8(0x3C5); + bRegTemp &= ~0x3F; + bRegTemp |= 0x17; + VGAOUT8(0x3C5, bRegTemp); + /* 3c5.17[0:6] */ + VGAOUT8(0x3C4, 0x17); + bRegTemp = VGAIN8(0x3C5); + bRegTemp &= ~0x7F; + bRegTemp |= 0x2F; + VGAOUT8(0x3C5, bRegTemp); + } + } + /* 3c5.18[0:5] */ + VGAOUT8(0x3C4, 0x18); + bRegTemp = VGAIN8(0x3C5); + bRegTemp &= ~0x3F; + bRegTemp |= 0x17; + bRegTemp |= 0x40; /* force the preq always higher than treq */ + VGAOUT8(0x3C5, bRegTemp); + } + else { /* for 3123Ax */ + if (pBIOSInfo->HDisplay > 1024 || pBIOSInfo->HasSecondary) { + /* Turn on Extend FIFO */ + /* 0x298[29] */ + dwGE298 = VIAGETREG(0x298); + VIASETREG(0x298, dwGE298 | 0x20000000); + /* 0x230[21] */ + dwGE230 = VIAGETREG(0x230); + VIASETREG(0x230, dwGE230 | 0x00200000); + /* 0x298[29] */ + dwGE298 = VIAGETREG(0x298); + VIASETREG(0x298, dwGE298 & ~0x20000000); + + /* 3c5.16[0:5] */ + VGAOUT8(0x3C4, 0x16); + bRegTemp = VGAIN8(0x3C5); + bRegTemp &= ~0x3F; + bRegTemp |= 0x17; + /* bRegTemp |= 0x10; */ + VGAOUT8(0x3C5, bRegTemp); + /* 3c5.17[0:6] */ + VGAOUT8(0x3C4, 0x17); + bRegTemp = VGAIN8(0x3C5); + bRegTemp &= ~0x7F; + bRegTemp |= 0x2F; + /*bRegTemp |= 0x1F;*/ + VGAOUT8(0x3C5, bRegTemp); + /* 3c5.18[0:5] */ + VGAOUT8(0x3C4, 0x18); + bRegTemp = VGAIN8(0x3C5); + bRegTemp &= ~0x3F; + bRegTemp |= 0x17; + bRegTemp |= 0x40; /* force the preq always higher than treq */ + VGAOUT8(0x3C5, bRegTemp); + } + } + break; + case VIA_KM400: + case VIA_K8M800: + if (pBIOSInfo->HasSecondary) { /* SAMM or DuoView case */ + if ((pBIOSInfo->HDisplay >= 1600) && + (pBIOSInfo->MemClk <= VIA_MEM_DDR200)) { + /* enable CRT extendded FIFO */ + VGAOUT8(0x3C4, 0x17); + VGAOUT8(0x3C5, 0x1C); + /* revise second display queue depth and read threshold */ + VGAOUT8(0x3C4, 0x16); + bRegTemp = VGAIN8(0x3C5); + bRegTemp &= ~0x3F; + bRegTemp = (bRegTemp) | (0x09); + VGAOUT8(0x3C5, bRegTemp); + } + else { + /* enable CRT extended FIFO */ + VGAOUT8(0x3C4, 0x17); + VGAOUT8(0x3C5,0x3F); + /* revise second display queue depth and read threshold */ + VGAOUT8(0x3C4, 0x16); + bRegTemp = VGAIN8(0x3C5); + bRegTemp &= ~0x3F; + bRegTemp = (bRegTemp) | (0x1C); + VGAOUT8(0x3C5, bRegTemp); + } + /* 3c5.18[0:5] */ + VGAOUT8(0x3C4, 0x18); + bRegTemp = VGAIN8(0x3C5); + bRegTemp &= ~0x3F; + bRegTemp |= 0x17; + bRegTemp |= 0x40; /* force the preq always higher than treq */ + VGAOUT8(0x3C5, bRegTemp); + } + else { + if ( (pBIOSInfo->HDisplay > 1024) && (pBIOSInfo->HDisplay <= 1280) ) + { + /* enable CRT extendded FIFO */ + VGAOUT8(0x3C4, 0x17); + VGAOUT8(0x3C5, 0x3F); + /* revise second display queue depth and read threshold */ + VGAOUT8(0x3C4, 0x16); + bRegTemp = VGAIN8(0x3C5); + bRegTemp &= ~0x3F; + bRegTemp = (bRegTemp) | (0x17); + VGAOUT8(0x3C5, bRegTemp); + } + else if ((pBIOSInfo->HDisplay > 1280)) + { + /* enable CRT extendded FIFO */ + VGAOUT8(0x3C4, 0x17); + VGAOUT8(0x3C5, 0x3F); + /* revise second display queue depth and read threshold */ + VGAOUT8(0x3C4, 0x16); + bRegTemp = VGAIN8(0x3C5); + bRegTemp &= ~0x3F; + bRegTemp = (bRegTemp) | (0x1C); + VGAOUT8(0x3C5, bRegTemp); + } + else + { + /* enable CRT extendded FIFO */ + VGAOUT8(0x3C4, 0x17); + VGAOUT8(0x3C5, 0x3F); + /* revise second display queue depth and read threshold */ + VGAOUT8(0x3C4, 0x16); + bRegTemp = VGAIN8(0x3C5); + bRegTemp &= ~0x3F; + bRegTemp = (bRegTemp) | (0x10); + VGAOUT8(0x3C5, bRegTemp); + } + /* 3c5.18[0:5] */ + VGAOUT8(0x3C4, 0x18); + bRegTemp = VGAIN8(0x3C5); + bRegTemp &= ~0x3F; + bRegTemp |= 0x17; + bRegTemp |= 0x40; /* force the preq always higher than treq */ + VGAOUT8(0x3C5, bRegTemp); + } + break; + default: + break; + } +} + +void VIAEnabledSecondaryExtendedFIFO(VIABIOSInfoPtr pBIOSInfo) +{ + VIABIOSInfoPtr pVia = pBIOSInfo; + CARD8 bRegTemp; + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIAEnabledSecondaryExtendedFIFO\n")); + switch (pBIOSInfo->Chipset) { + case VIA_CLE266: + if (pBIOSInfo->ChipRev > 15) { /* for 3123Cx */ + if (((pBIOSInfo->ActiveDevice & (VIA_DEVICE_LCD | VIA_DEVICE_DFP)) && + (pBIOSInfo->panelX >= 1024)) || (pBIOSInfo->HDisplay >= 1024)) { + /* enable extendded FIFO */ + VGAOUT8(0x3D4, 0x6a); + bRegTemp = VGAIN8(0x3D5); + bRegTemp |= 0x20; + VGAOUT8(0x3D5, bRegTemp); + /* revise second display queue depth and read threshold */ + VGAOUT8(0x3D4, 0x68); + VGAOUT8(0x3D5, 0xab); + } + else + { + /* disable extendded FIFO */ + VGAOUT8(0x3D4, 0x6a); + bRegTemp = VGAIN8(0x3D5); + bRegTemp &= ~0x20; + VGAOUT8(0x3D5, bRegTemp); + /* revise second display queue depth and read threshold */ + VGAOUT8(0x3D4, 0x68); + VGAOUT8(0x3D5, 0x67); + } + } + else { /* for 3123Ax */ + /* TV highest X-Resolution is smaller than 1280, + * pBIOSInfo->HDisplay >= 1280 don't care. */ + if ((pBIOSInfo->ActiveDevice & (VIA_DEVICE_LCD | VIA_DEVICE_DFP)) && + (((pBIOSInfo->panelY > 768) && (pBIOSInfo->bitsPerPixel >= 24) && + (pBIOSInfo->MemClk <= VIA_MEM_DDR200)) || + ((pBIOSInfo->panelX > 1280) && (pBIOSInfo->bitsPerPixel >= 24) && + (pBIOSInfo->MemClk <= VIA_MEM_DDR266)))) { + /* enable extendded FIFO */ + VGAOUT8(0x3D4, 0x6a); + bRegTemp = VGAIN8(0x3D5); + bRegTemp |= 0x20; + VGAOUT8(0x3D5, bRegTemp); + /* revise second display queue depth and read threshold */ + VGAOUT8(0x3D4, 0x68); + VGAOUT8(0x3D5, 0xab); + } + else { + /* disable extendded FIFO */ + VGAOUT8(0x3D4, 0x6a); + bRegTemp = VGAIN8(0x3D5); + bRegTemp &= ~0x20; + VGAOUT8(0x3D5, bRegTemp); + /* revise second display queue depth and read threshold */ + VGAOUT8(0x3D4, 0x68); + VGAOUT8(0x3D5, 0x67); + } + } + break; + case VIA_KM400: + case VIA_K8M800: + if ((((pBIOSInfo->ActiveDevice & (VIA_DEVICE_LCD | VIA_DEVICE_DFP)) && + (pBIOSInfo->panelX >= 1600)) || (pBIOSInfo->HDisplay >= 1600)) && + (pBIOSInfo->MemClk <= VIA_MEM_DDR200)) { + /* enable extendded FIFO */ + VGAOUT8(0x3D4, 0x6a); + bRegTemp = VGAIN8(0x3D5); + bRegTemp |= 0x20; + VGAOUT8(0x3D5, bRegTemp); + /* revise second display queue depth and read threshold */ + VGAOUT8(0x3D4, 0x68); + VGAOUT8(0x3D5, 0xeb); + } + else if (((((pBIOSInfo->ActiveDevice & (VIA_DEVICE_LCD | VIA_DEVICE_DFP)) && + (pBIOSInfo->panelX > 1024)) || (pBIOSInfo->HDisplay > 1024)) && + (pBIOSInfo->bitsPerPixel == 32) && + (pBIOSInfo->MemClk <= VIA_MEM_DDR333)) || + ((((pBIOSInfo->ActiveDevice & (VIA_DEVICE_LCD | VIA_DEVICE_DFP)) && + (pBIOSInfo->panelX == 1024)) || (pBIOSInfo->HDisplay == 1024)) && + (pBIOSInfo->bitsPerPixel == 32) && + (pBIOSInfo->MemClk <= VIA_MEM_DDR200))) { + /* enable extendded FIFO */ + VGAOUT8(0x3D4, 0x6a); + bRegTemp = VGAIN8(0x3D5); + bRegTemp |= 0x20; + VGAOUT8(0x3D5, bRegTemp); + /* revise second display queue depth and read threshold */ + VGAOUT8(0x3D4, 0x68); + VGAOUT8(0x3D5, 0xca); + } + else if (((((pBIOSInfo->ActiveDevice & (VIA_DEVICE_LCD | VIA_DEVICE_DFP)) && + (pBIOSInfo->panelX > 1280)) || (pBIOSInfo->HDisplay > 1280)) && + (pBIOSInfo->bitsPerPixel == 16) && + (pBIOSInfo->MemClk <= VIA_MEM_DDR333)) || + ((((pBIOSInfo->ActiveDevice & (VIA_DEVICE_LCD | VIA_DEVICE_DFP)) && + (pBIOSInfo->panelX == 1280)) || (pBIOSInfo->HDisplay == 1280)) && + (pBIOSInfo->bitsPerPixel == 16) && + (pBIOSInfo->MemClk <= VIA_MEM_DDR200))) { + /* enable extendded FIFO */ + VGAOUT8(0x3D4, 0x6a); + bRegTemp = VGAIN8(0x3D5); + bRegTemp |= 0x20; + VGAOUT8(0x3D5, bRegTemp); + /* revise second display queue depth and read threshold */ + VGAOUT8(0x3D4, 0x68); + VGAOUT8(0x3D5, 0xab); + } + else { + /* disable extendded FIFO */ + VGAOUT8(0x3D4, 0x6a); + bRegTemp = VGAIN8(0x3D5); + bRegTemp &= ~0x20; + VGAOUT8(0x3D5, bRegTemp); + /* revise second display queue depth and read threshold */ + VGAOUT8(0x3D4, 0x68); + VGAOUT8(0x3D5, 0x67); + } + break; + default: + break; + } +} + +void VIAFillExpireNumber(VIABIOSInfoPtr pBIOSInfo) +{ + VIABIOSInfoPtr pVia = pBIOSInfo; + CARD8 bRegTemp; + const VIAPanel3C522Tue* TuneExpireNum; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIAFillExpireNumber\n")); + switch (pBIOSInfo->Chipset) { + case VIA_CLE266: + if (pBIOSInfo->ChipRev > 14) { + TuneExpireNum = Panel_Tuning_LstC0; + } + else { + TuneExpireNum = Panel_Tuning_Lst; + } + break; + case VIA_KM400: + case VIA_K8M800: + TuneExpireNum = Panel_Tuning_Lst3205; + break; + default: + return; + break; + } + while (TuneExpireNum->wPanelXres != 0) { + if (TuneExpireNum->wPanelXres == pBIOSInfo->panelX && + TuneExpireNum->wPanelYres == pBIOSInfo->panelY && + TuneExpireNum->wPanelBpp == pBIOSInfo->bitsPerPixel && + TuneExpireNum->bRamClock == pBIOSInfo->MemClk) { + VGAOUT8(0x3C4, 0x22); + bRegTemp = VGAIN8(0x3C5) & ~0x1F; + VGAOUT8(0x3C5, (bRegTemp | TuneExpireNum->bTuningValue)); + } + TuneExpireNum ++; + } +} diff --git a/src/via_bandwidth.h b/src/via_bandwidth.h new file mode 100644 index 0000000..5dbcfff --- /dev/null +++ b/src/via_bandwidth.h @@ -0,0 +1,58 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_bandwidth.h,v 1.2 2003/08/27 15:16:06 tsi Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef _VIA_BANDWIDTH_H_ +#define _VIA_BANDWIDTH_H_ 1 + +typedef struct _VIAPanel3C522Tue +{ + CARD16 wPanelXres; + CARD16 wPanelYres; + CARD16 wPanelBpp; + CARD8 bRamClock; + CARD8 bTuningValue; +} VIAPanel3C522Tue, *pVIAPanel3C522Tue; + +static const VIAPanel3C522Tue Panel_Tuning_Lst[] = { + {1280, 768,32,0x03,0x3}, {1280,1024,32,0x03,0x4}, {1280,1024,32,0x04,0x3}, + {1600,1200,16,0x03,0x4}, {1600,1200,32,0x04,0x4}, {1024, 768,32,0x03,0xA}, + {1400,1050,16,0x03,0x3}, {1400,1050,32,0x03,0x4}, {1400,1050,32,0x04,0x4}, + { 800, 600,32,0x03,0xA}, { 0, 0, 0, 0, 0} +}; + +static const VIAPanel3C522Tue Panel_Tuning_LstC0[] = { + {1280, 768,32,0x03,0x3}, {1280,1024,32,0x03,0x4}, {1280,1024,32,0x04,0x4}, + {1600,1200,32,0x03,0x3}, {1600,1200,32,0x04,0x4}, {1024, 768,32,0x03,0xA}, + {1400,1050,32,0x03,0x4}, {1400,1050,32,0x04,0x4}, + { 800, 600,32,0x03,0xA}, { 0, 0, 0, 0, 0} +}; + +static const VIAPanel3C522Tue Panel_Tuning_Lst3205[]={ + {1280,1024,32,0x03,0x3}, {1280,1024,32,0x04,0x9}, {1280, 768,32,0x03,0x3}, + {1280, 768,32,0x04,0x9}, {1400,1050,32,0x03,0x3}, {1400,1050,32,0x04,0x9}, + {1600,1200,32,0x03,0x4}, {1600,1200,32,0x04,0xA}, { 0, 0, 0, 0, 0} +}; + +#endif /* _VIA_BANDWIDTH_H_ */ diff --git a/src/via_bios.c b/src/via_bios.c new file mode 100644 index 0000000..89b7001 --- /dev/null +++ b/src/via_bios.c @@ -0,0 +1,8625 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_bios.c,v 1.11 2004/02/20 21:50:06 dawes Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/************************************************************************* + * + * File: via_bios.c + * Content: Get the mode table from VGA BIOS and set mode by this table + * + ************************************************************************/ + +/* +#define CREATE_MODETABLE_HEADERFILE +#define CREATE_TV2_HEADERFILE +#define CREATE_TV3_HEADERFILE +#define CREATE_SAA7108_HEADERFILE +#define CREATE_CH7019_HEADERFILE +#define CREATE_FS454_HEADERFILE +*/ + +#include "via_driver.h" +#include "via_refresh.h" + + +/*=* + * + * int VIACheckTVExist(VIABIOSInfoPtr) - Check TV Endcoder + * + * Return Type: int + * + * The Definition of Input Value: + * + * VIABIOSInfoPtr + * + * The Definition of Return Value: + * + * 0 - None + * 1 - VIA VT1621 + * 2 - VIA VT1622 + * 3 - Chrontel 7009 + * 4 - Chrontel 7019 + * 5 - Philips SAA7108 + *=*/ +int +VIACheckTVExist(VIABIOSInfoPtr pBIOSInfo) +{ + I2CDevPtr dev; + unsigned char W_Buffer[1]; + unsigned char R_Buffer[1]; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIACheckTVExist\n")); + /* Check For TV2/TV3 */ + if (xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, 0x40)) { + dev = xf86CreateI2CDevRec(); + dev->DevName = "TV"; + dev->SlaveAddr = 0x40; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + + if (xf86I2CDevInit(dev)) { + W_Buffer[0] = 0x1B; + xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,1); + xf86DestroyI2CDevRec(dev,TRUE); + switch (R_Buffer[0]) { + case 2: + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, + "Found TVEncoder VT1621!\n")); + pBIOSInfo->TVEncoder = VIA_TV2PLUS; + pBIOSInfo->TVI2CAdd = 0x40; + break; + case 3: + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, + "Found TVEncoder VT1622!\n")); + pBIOSInfo->TVEncoder = VIA_TV3; + pBIOSInfo->TVI2CAdd = 0x40; + break; + case 16: + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, + "Found TVEncoder VT1622A!\n")); + pBIOSInfo->TVEncoder = VIA_VT1622A; + pBIOSInfo->TVI2CAdd = 0x40; + break; + default: + pBIOSInfo->TVEncoder = VIA_NONETV; + break; + } + } + else + xf86DestroyI2CDevRec(dev,TRUE); + } + else + pBIOSInfo->TVEncoder = VIA_NONETV; + + /* Check For SAA7108 */ + if (!pBIOSInfo->TVEncoder) { + if (xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, 0x88)) { + dev = xf86CreateI2CDevRec(); + dev->DevName = "SAA7108"; + dev->SlaveAddr = 0x88; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + + if (xf86I2CDevInit(dev)) { + W_Buffer[0] = 0x1C; + xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,1); + xf86DestroyI2CDevRec(dev,TRUE); + if (R_Buffer[0] == 0x04) { + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, + "Found TVEncoder Philips SAA7108!\n")); + pBIOSInfo->TVEncoder = VIA_SAA7108; + pBIOSInfo->TVI2CAdd = 0x88; + } + else + pBIOSInfo->TVEncoder = VIA_NONETV; + } + else + xf86DestroyI2CDevRec(dev,TRUE); + } + else + pBIOSInfo->TVEncoder = VIA_NONETV; + } + + /* Check For FS454 */ + if (!pBIOSInfo->TVEncoder) { + if (xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, 0xD4)) { + dev = xf86CreateI2CDevRec(); + dev->DevName = "FS454"; + dev->SlaveAddr = 0xD4; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + + if (xf86I2CDevInit(dev)) { + W_Buffer[0] = 0x7F; + xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,1); + xf86DestroyI2CDevRec(dev,TRUE); + if (R_Buffer[0] == 0x20) { + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, + "Found TVEncoder FOCUS 453/454!\n")); + pBIOSInfo->TVEncoder = VIA_FS454; + pBIOSInfo->TVI2CAdd = 0xD4; + } + else + pBIOSInfo->TVEncoder = VIA_NONETV; + } + else + xf86DestroyI2CDevRec(dev,TRUE); + } + else + pBIOSInfo->TVEncoder = VIA_NONETV; + } + + /* Check For CH7019 */ + if (!pBIOSInfo->TVEncoder) { + if (xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, 0xEA)) { + dev = xf86CreateI2CDevRec(); + dev->DevName = "CH7019"; + dev->SlaveAddr = 0xEA; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + + if (xf86I2CDevInit(dev)) { + W_Buffer[0] = 0x4B; + xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,1); + xf86DestroyI2CDevRec(dev,TRUE); + if (R_Buffer[0] == 0x19) { + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, + "Found TVEncoder Chrontel 7019!\n")); + pBIOSInfo->TVEncoder = VIA_CH7019; + pBIOSInfo->TVI2CAdd = 0xEA; + } + else + pBIOSInfo->TVEncoder = VIA_NONETV; + } + else + xf86DestroyI2CDevRec(dev,TRUE); + } + else + pBIOSInfo->TVEncoder = VIA_NONETV; + } + + if (pBIOSInfo->TVEncoder == VIA_NONETV) { + if (VIAGPIOI2C_Initial(pBIOSInfo, 0x40)) { + VIAGPIOI2C_Read(pBIOSInfo, 0x1B, R_Buffer, 1); + switch (R_Buffer[0]) { + case 16: + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, + "Found TVEncoder VT1623!\n")); + pBIOSInfo->TVEncoder = VIA_VT1623; + break; + default: + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, + "Unknow TVEncoder Type:%d!\n", R_Buffer[0])); + break; + } + } + } + return pBIOSInfo->TVEncoder; +} + +#ifdef UNUSED +/*=* + * + * long VIAQueryChipInfo(VIABIOSInfoPtr) - Query Chip Information + * + * Return Type: log + * + * The Definition of Input Value: + * + * VIABIOSInfoPtr + * + * The Definition of Return Value: + * + * [31:24] Major BIOS Version Number + * [31:24] Minor BIOS Version Number + * [15:8] Type of External TV Encoder + * 0 - None + * 1 - VIA VT1621 + * 2 - VIA VT1622 + * 3 - Chrontel 7009 + * 4 - Chrontel 7019 + * 5 - Philips SAA7108 + * [7:6] Reserved + * [5] DVI Display Supported + * [4] Reserved + * [3] PAL TV Display Supported + * [2] NTSC TV Display Supported + * [1] LCD Display Supported + * [0] CRT Display Supported + *=*/ +static long +VIAQueryChipInfo(VIABIOSInfoPtr pBIOSInfo) +{ + VIAModeTablePtr pViaModeTable; + long tmp; + unsigned char support = 0; + + pViaModeTable = pBIOSInfo->pModeTable; + + tmp = ((long)(pViaModeTable->BIOSVer)) << 16; + tmp |= ((long)(VIACheckTVExist(pBIOSInfo))) << 8; + + if (VIA_CRT_SUPPORT) + support |= VIA_CRT_SUPPORT_BIT; + if (VIA_LCD_SUPPORT) + support |= VIA_LCD_SUPPORT_BIT; + if (VIA_NTSC_SUPPORT) + support |= VIA_NTSC_SUPPORT_BIT; + if (VIA_PAL_SUPPORT) + support |= VIA_PAL_SUPPORT_BIT; + if (VIA_DVI_SUPPORT) + support |= VIA_DVI_SUPPORT_BIT; + + tmp |= (long)(support); + + return tmp; +} +#endif /* UNUSED */ + +#ifdef UNUSED +/*=* + * + * char* VIAGetBIOSInfo(VIABIOSInfoPtr) - Get BIOS Release Date + * + * Return Type: string pointer + * + * The Definition of Input Value: + * + * VIABIOSInfoPtr + * + * The Definition of Return Value: + * + * BIOS release date string pointer + *=*/ +static char * +VIAGetBIOSInfo(VIABIOSInfoPtr pBIOSInfo) +{ + return pBIOSInfo->pModeTable->BIOSDate; +} +#endif /* UNUSED */ + +#ifdef UNUSED +/*=* + * + * Bool VIASetActiveDisplay(VIABIOSInfoPtr, unsigned char) + * + * - Set Active Display Device + * + * Return Type: Bool + * + * The Definition of Input Value: + * + * VIABIOSInfoPtr + * + * Bit[7] 2nd Path + * Bit[6] 1/0 MHS Enable/Disable + * Bit[5] 0 = Bypass Callback, 1 = Enable Callback + * Bit[4] 0 = Hot-Key Sequence Control (OEM Specific) + * Bit[3] LCD + * Bit[2] TV + * Bit[1] CRT + * Bit[0] DVI + * + * The Definition of Return Value: + * + * Success - TRUE + * Not Success - FALSE + *=*/ +static Bool +VIASetActiveDisplay(VIABIOSInfoPtr pBIOSInfo, unsigned char display) +{ + VIABIOSInfoPtr pVia; + unsigned char tmp; + + pVia = pBIOSInfo; + + switch (display & 0x0F) { + case 0x07: /* WCRTON + WTVON + WDVION */ + case 0x0E: /* WCRTON + WTVON + WLCDON */ + return FALSE; + default: + break; + } + + VGAOUT8(0x3D4, 0x3E); + tmp = VGAIN8(0x3D5) & 0xF0; + tmp |= (display & 0x0F); + VGAOUT8(0x3D5, tmp); + + if ((display & 0xC0) == 0x80) + return FALSE; + + VGAOUT8(0x3D4, 0x3B); + tmp = VGAIN8(0x3D5) & 0xE7; + tmp |= ((display & 0xC0) >> 3); + VGAOUT8(0x3D5, tmp); + + return TRUE; +} +#endif /* UNUSED */ + +/*=* + * + * unsigned char VIAGetActiveDisplay(VIABIOSInfoPtr, unsigned char) + * + * - Get Active Display Device + * + * Return Type: unsigned char + * + * The Definition of Input Value: + * + * VIABIOSInfoPtr + * + * The Definition of Return Value: + * + * Bit[7] 2nd Path + * Bit[6] 1/0 MHS Enable/Disable + * Bit[5] 0 = Bypass Callback, 1 = Enable Callback + * Bit[4] 0 = Hot-Key Sequence Control (OEM Specific) + * Bit[3] LCD + * Bit[2] TV + * Bit[1] CRT + * Bit[0] DVI + *=*/ +unsigned char +VIAGetActiveDisplay(VIABIOSInfoPtr pBIOSInfo) +{ + VIABIOSInfoPtr pVia; + unsigned char tmp; + + pVia = pBIOSInfo; + + VGAOUT8(0x3D4, 0x3E); + tmp = (VGAIN8(0x3D5) & 0xF0) >> 4; + + VGAOUT8(0x3D4, 0x3B); + tmp |= ((VGAIN8(0x3D5) & 0x18) << 3); + + return tmp; +} + +/*=* + * + * unsigned char VIASensorCH7019(VIABIOSInfoPtr pBIOSInfo) + * + * - Sense Chrontel 7019 Encoder + * + * Return Type: unsigned char + * + * The Definition of Input Value: + * + * VIABIOSInfoPtr + * + * The Definition of Return Value: + * + * 00h No Connected + * 02h Composite + * 04h S_VIDEO + * 06h Composite + S_VIDEO + * FFh Undefine + *=*/ +static unsigned char +VIASensorCH7019(VIABIOSInfoPtr pBIOSInfo) +{ + unsigned char tv20, ret = 0x06; + I2CDevPtr dev; + unsigned char W_Buffer[2]; + unsigned char R_Buffer[1]; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIASensorCH7019\n")); + dev = xf86CreateI2CDevRec(); + dev->DevName = "CH7019"; + dev->SlaveAddr = 0xEA; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + + if (xf86I2CDevInit(dev)) { + /* turn all DACPD on */ + W_Buffer[0] = 0x49; + W_Buffer[1] = 0X40; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + /* set connection detect rgister (0x20) SENSE bit (BIT0) to 1 */ + W_Buffer[0] = 0x20; + xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,1); + tv20 = R_Buffer[0]; + W_Buffer[1] = (tv20 | 0x01); + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + usleep(1); + /* reset the SENSE bit to 0 */ + W_Buffer[1] = (tv20 & (~0x01)); + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + /* read the status bits */ + xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,1); + xf86DestroyI2CDevRec(dev,TRUE); + } + else { + xf86DestroyI2CDevRec(dev,TRUE); + } + /* Always return 0x06 */ + return ret; +} + +/*=* + * + * unsigned char VIASensorSAA7108(VIABIOSInfoPtr pBIOSInfo) + * + * - Sense Philips SAA7108 Encoder + * + * Return Type: unsigned char + * + * The Definition of Input Value: + * + * VIABIOSInfoPtr + * + * The Definition of Return Value: + * + * 0 No Connected + * BIT0=1 Composite + * BIT1=1 S_VIDEO + * BIT2=1 RGB + * BIT3=1 YCbCr + * FF Undefine + *=*/ +static unsigned char +VIASensorSAA7108(VIABIOSInfoPtr pBIOSInfo) +{ + unsigned char tv2d, tv61, tmp = 0, ret = 0; + I2CDevPtr dev; + unsigned char W_Buffer[2]; + unsigned char R_Buffer[1]; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIASensorSAA7108\n")); + dev = xf86CreateI2CDevRec(); + dev->DevName = "SAA7108"; + dev->SlaveAddr = 0x88; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + + if (xf86I2CDevInit(dev)) { + + /* Encoder On */ + W_Buffer[0] = 0x2D; + xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,1); + tv2d = R_Buffer[0]; + W_Buffer[1] = 0XB4; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + + /* Power Control */ + W_Buffer[0] = 0x61; + xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,1); + tv61 = R_Buffer[0]; + W_Buffer[1] = (tv61 & (~0x60)); + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + + /* Monitor Sense Mode Threshold */ + W_Buffer[0] = 0x1A; + W_Buffer[1] = 0X46; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + + /* Monitor Sense On */ + W_Buffer[0] = 0x1B; + W_Buffer[1] = 0X80; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + usleep(1); + + /* Monitor Sense Off */ + W_Buffer[1] = 0; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + + /* Monitor Sense Result */ + xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,1); + tmp = R_Buffer[0] & 0x07; + + /* Restore Power Control & Encoder On/Off Status */ + W_Buffer[0] = 0x61; + W_Buffer[1] = tv61; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + W_Buffer[0] = 0x2D; + W_Buffer[1] = tv2d; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + xf86DestroyI2CDevRec(dev,TRUE); + } + else { + xf86DestroyI2CDevRec(dev,TRUE); + } + + switch (tmp) { + case 0: /* YCbCr */ + ret = 0x08; + break; + case 1: /* S_VIDEO */ + ret = 0x02; + break; + case 6: /* Composite */ + ret = 0x01; + break; + case 7: /* No Connected */ + ret = 0; + break; + default: /* Undefine */ + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "Sense Result :%d\n", tmp)); + ret = 0xFF; + break; + } + return ret; +} + +/*=* + * + * unsigned char VIASensorTV2(VIABIOSInfoPtr pBIOSInfo) + * + * - Sense TV2+ Encoder + * + * Return Type: unsigned char + * + * The Definition of Input Value: + * + * VIABIOSInfoPtr + * + * The Definition of Return Value: + * + * Bit[2] Bit[0] + * 0 0 - Composite + S-Video + * 0 1 - S-Video + * 1 0 - Composite + * 1 1 - None + *=*/ +static unsigned char +VIASensorTV2(VIABIOSInfoPtr pBIOSInfo) +{ + I2CDevPtr dev; + unsigned char save, tmp = 0x05; + unsigned char W_Buffer[2]; + unsigned char R_Buffer[1]; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIASensorTV2\n")); + dev = xf86CreateI2CDevRec(); + dev->DevName = "VT1621"; + dev->SlaveAddr = 0x40; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + + if (xf86I2CDevInit(dev)) { + W_Buffer[0] = 0x0E; + xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,1); + save = R_Buffer[0]; + W_Buffer[1] = 0x08; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + W_Buffer[1] = 0; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + W_Buffer[0] = 0x0F; + xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,1); + tmp = R_Buffer[0] & 0x0F; + W_Buffer[0] = 0x0E; + W_Buffer[1] = save; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + xf86DestroyI2CDevRec(dev,TRUE); + } + else { + xf86DestroyI2CDevRec(dev,TRUE); + } + + return tmp; +} + + +/*=* + * + * unsigned char VIASensorTV3(VIABIOSInfoPtr pBIOSInfo) + * + * - Sense TV3 Encoder + * + * Return Type: unsigned char + * + * The Definition of Input Value: + * + * VIABIOSInfoPtr + * + * The Definition of Return Value: + * + * Bit[3] Bit[2] Bit[1] Bit[0] + * 1 1 1 1 - None + * 0 1 1 1 - Composite + * 1 1 1 0 - Composite + * - Others: S-Video + *=*/ +static unsigned char +VIASensorTV3(VIABIOSInfoPtr pBIOSInfo) +{ + I2CDevPtr dev; + unsigned char save, tmp = 0; + unsigned char W_Buffer[2]; + unsigned char R_Buffer[1]; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIASensorTV3\n")); + if (pBIOSInfo->TVEncoder == VIA_VT1623) { + VIAGPIOI2C_Initial(pBIOSInfo, 0x40); + VIAGPIOI2C_Read(pBIOSInfo, 0x0E, R_Buffer, 1); + save = R_Buffer[0]; + W_Buffer[0] = 0; + VIAGPIOI2C_Write(pBIOSInfo, 0x0E, W_Buffer[0]); + W_Buffer[0] = 0x80; + VIAGPIOI2C_Write(pBIOSInfo, 0x0E, W_Buffer[0]); + W_Buffer[0] = 0; + VIAGPIOI2C_Write(pBIOSInfo, 0x0E, W_Buffer[0]); + VIAGPIOI2C_Read(pBIOSInfo, 0x0F, R_Buffer, 1); + tmp = R_Buffer[0] & 0x0F; + W_Buffer[0] = save; + VIAGPIOI2C_Write(pBIOSInfo, 0x0E, W_Buffer[0]); + } + else { + dev = xf86CreateI2CDevRec(); + dev->DevName = "VT1622"; + dev->SlaveAddr = 0x40; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + + if (xf86I2CDevInit(dev)) { + W_Buffer[0] = 0x0E; + xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,1); + save = R_Buffer[0]; + W_Buffer[1] = 0; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + W_Buffer[1] = 0x80; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + W_Buffer[1] = 0; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + W_Buffer[0] = 0x0F; + xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,1); + tmp = R_Buffer[0] & 0x0F; + W_Buffer[0] = 0x0E; + W_Buffer[1] = save; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + xf86DestroyI2CDevRec(dev,TRUE); + } + else { + xf86DestroyI2CDevRec(dev,TRUE); + } + } + return tmp; +} + + +/*=* + * + * Bool VIASensorDVI(pBIOSInfo) + * + * - Sense DVI Connector + * + * Return Type: Bool + * + * The Definition of Input Value: + * + * VIABIOSInfoPtr + * + * The Definition of Return Value: + * + * DVI Attached - TRUE + * DVI Not Attached - FALSE + *=*/ +static Bool +VIASensorDVI(VIABIOSInfoPtr pBIOSInfo) +{ + VIABIOSInfoPtr pVia = pBIOSInfo; + unsigned char SlaveAddr, cr6c, cr93; + Bool ret = FALSE; + I2CDevPtr dev; + unsigned char W_Buffer[1]; + unsigned char R_Buffer[1]; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIASensorDVI\n")); + + /* Enable DI0, DI1 */ + VGAOUT8(0x3d4, 0x6C); + cr6c = VGAIN8(0x3d5); + VGAOUT8(0x3d5, cr6c | 0x21); + VGAOUT8(0x3d4, 0x93); + cr93 = VGAIN8(0x3d5); + if (pBIOSInfo->ChipRev > 15) { + VGAOUT8(0x3d5, 0xA3); + } + else { + VGAOUT8(0x3d5, 0xBF); + } + + /* Enable LCD */ + VIAEnableLCD(pBIOSInfo); + + switch (pBIOSInfo->TMDS) { + case VIA_SIL164: + SlaveAddr = 0x70; + break; + case VIA_VT3192: + SlaveAddr = 0x10; + break; + default: + return ret; + break; + } + + if (xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, SlaveAddr)) { + dev = xf86CreateI2CDevRec(); + dev->DevName = "TMDS"; + dev->SlaveAddr = SlaveAddr; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + + if (xf86I2CDevInit(dev)) { + W_Buffer[0] = 0x09; + xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,1); + xf86DestroyI2CDevRec(dev,TRUE); + if (R_Buffer[0] & 0x04) + ret = TRUE; + } + else + xf86DestroyI2CDevRec(dev,TRUE); + } + + if (pBIOSInfo->Chipset != VIA_CLE266) { + VIAGPIOI2C_Initial(pBIOSInfo, SlaveAddr); + VIAGPIOI2C_Read(pBIOSInfo, 0x09, R_Buffer, 1); + if (R_Buffer[0] & 0x04) + ret = TRUE; + } + + /* Disable LCD */ + VIADisableLCD(pBIOSInfo); + + /* Restore DI0, DI1 status */ + VGAOUT8(0x3d4, 0x6C); + VGAOUT8(0x3d5, cr6c); + VGAOUT8(0x3d4, 0x93); + VGAOUT8(0x3d5, cr93); + + return ret; +} + +Bool +VIAPostDVI(VIABIOSInfoPtr pBIOSInfo) +{ + VIABIOSInfoPtr pVia = pBIOSInfo; + unsigned char cr6c, cr93; + Bool ret = FALSE; + I2CDevPtr dev; + unsigned char W_Buffer[2]; + unsigned char R_Buffer[4]; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIAPostDVI\n")); + + /* Enable DI0, DI1 */ + VGAOUT8(0x3d4, 0x6C); + cr6c = VGAIN8(0x3d5); + VGAOUT8(0x3d5, cr6c | 0x21); + VGAOUT8(0x3d4, 0x93); + cr93 = VGAIN8(0x3d5); + if (pBIOSInfo->ChipRev > 15) { + VGAOUT8(0x3d5, 0xA3); + } + else { + VGAOUT8(0x3d5, 0xBF); + } + + /* Enable LCD */ + VIAEnableLCD(pBIOSInfo); + + if (xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, 0x70)) { + dev = xf86CreateI2CDevRec(); + dev->DevName = "TMDS"; + dev->SlaveAddr = 0x70; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + if (xf86I2CDevInit(dev)) { + W_Buffer[0] = 0x00; + xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,4); + if (R_Buffer[0] == 0x06 && R_Buffer[1] == 0x11) { /* This is VT3191 */ + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, + "Found VIA LVDS Transmiter!\n")); + if (R_Buffer[2] == 0x91 && R_Buffer[3] == 0x31) { + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, + "VIA: VT1631!\n")); + pBIOSInfo->LVDS = VIA_VT3191; + W_Buffer[0] = 0x08; + if (pBIOSInfo->BusWidth == VIA_DI_24BIT && pBIOSInfo->LCDDualEdge) + W_Buffer[1] = 0x0D; + else + W_Buffer[1] = 0x09; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + xf86DestroyI2CDevRec(dev,TRUE); + ret = TRUE; + } + else { + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, + "VIA: Unknow Chip!!\n")); + xf86DestroyI2CDevRec(dev,TRUE); + } + } + else if (R_Buffer[0] == 0x01 && R_Buffer[1] == 0x00) { /* This is Sil164 */ + W_Buffer[0] = 0x02; + xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,2); + if (R_Buffer[0] && R_Buffer[1]) { + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, + "Found TMDS Transmiter Silicon164.\n")); + pBIOSInfo->TMDS = VIA_SIL164; + W_Buffer[0] = 0x08; + if (pBIOSInfo->BusWidth == VIA_DI_24BIT) { + if (pBIOSInfo->LCDDualEdge) + W_Buffer[1] = 0x3F; + else + W_Buffer[1] = 0x37; + } + else /* 12Bit Only has Single Mode */ + W_Buffer[1] = 0x3B; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + W_Buffer[0] = 0x0C; + W_Buffer[1] = 0x09; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + xf86DestroyI2CDevRec(dev,TRUE); + ret = TRUE; + } + else { + xf86DestroyI2CDevRec(dev,TRUE); + } + } + else { + xf86DestroyI2CDevRec(dev,TRUE); + } + } + else { + xf86DestroyI2CDevRec(dev,TRUE); + } + } + + /* Check VT3192 TMDS Exist or not?*/ + if (!pBIOSInfo->TMDS) { + if (xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, 0x10)) { + dev = xf86CreateI2CDevRec(); + dev->DevName = "TMDS"; + dev->SlaveAddr = 0x10; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + if (xf86I2CDevInit(dev)) { + W_Buffer[0] = 0x00; + xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,4); + + if (R_Buffer[0] == 0x06 && R_Buffer[1] == 0x11) { /* This is VT3192 */ + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, + "Found VIA TMDS Transmiter!\n")); + pBIOSInfo->TMDS = VIA_VT3192; + if (R_Buffer[2] == 0x92 && R_Buffer[3] == 0x31) { + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, + "VIA: VT1632!\n")); + pBIOSInfo->TMDS = VIA_VT3192; + W_Buffer[0] = 0x08; + if (pBIOSInfo->BusWidth == VIA_DI_24BIT) { + if (pBIOSInfo->LCDDualEdge) + W_Buffer[1] = 0x3F; + else + W_Buffer[1] = 0x37; + } + else + W_Buffer[1] = 0x3B; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + xf86DestroyI2CDevRec(dev,TRUE); + ret = TRUE; + } + else { + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, + "VIA: Unknow Chip!!\n")); + xf86DestroyI2CDevRec(dev,TRUE); + } + } + else { + xf86DestroyI2CDevRec(dev,TRUE); + } + } + else { + xf86DestroyI2CDevRec(dev,TRUE); + } + } + } + + /* Check CH7019 LVDS Exist or not?*/ + if (!pBIOSInfo->LVDS) { + if (xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, 0xEA)) { + dev = xf86CreateI2CDevRec(); + dev->DevName = "LVDS"; + dev->SlaveAddr = 0xEA; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + if (xf86I2CDevInit(dev)) { + W_Buffer[0] = 0x4B; + xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,1); + /* Load CH7019 LVDS init table */ + if (pBIOSInfo->LCDDualEdge || R_Buffer[0] == 0x3B) { /* DUAL_INIT Table */ + W_Buffer[0] = 0x64; + W_Buffer[1] = 0x14; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + W_Buffer[0] = 0x71; + W_Buffer[1] = 0xE3; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + W_Buffer[0] = 0x73; + W_Buffer[1] = 0xDB; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + W_Buffer[0] = 0x74; + W_Buffer[1] = 0xF6; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + W_Buffer[0] = 0x76; + W_Buffer[1] = 0xAF; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + } + else if (R_Buffer[0] == 0x19 || R_Buffer[0] == 0x1B || + R_Buffer[0] == 0x3A){ /* SINGLE_INIT Table */ + W_Buffer[0] = 0x64; + W_Buffer[1] = 0x04; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + W_Buffer[0] = 0x71; + W_Buffer[1] = 0xAD; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + W_Buffer[0] = 0x73; + W_Buffer[1] = 0xC8; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + W_Buffer[0] = 0x74; + W_Buffer[1] = 0xF3; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + W_Buffer[0] = 0x76; + W_Buffer[1] = 0xAD; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + } + /* COMMON_INIT Table */ + W_Buffer[0] = 0x63; + W_Buffer[1] = 0x4B; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + W_Buffer[0] = 0x1C; + W_Buffer[1] = 0x40; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + W_Buffer[0] = 0x6F; + W_Buffer[1] = 0x00; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + W_Buffer[0] = 0x21; + W_Buffer[1] = 0x84; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + W_Buffer[0] = 0x70; + W_Buffer[1] = 0xC0; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + W_Buffer[0] = 0x72; + W_Buffer[1] = 0xAD; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + W_Buffer[0] = 0x78; + W_Buffer[1] = 0x20; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + W_Buffer[0] = 0x15; + W_Buffer[1] = 0x00; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + /* 2.set panel power sequence timing */ + W_Buffer[0] = 0x67; + W_Buffer[1] = 0x01; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + W_Buffer[0] = 0x68; + W_Buffer[1] = 0x6E; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + W_Buffer[0] = 0x69; + W_Buffer[1] = 0x01; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + W_Buffer[0] = 0x6A; + W_Buffer[1] = 0x01; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + W_Buffer[0] = 0x6B; + W_Buffer[1] = 0x09; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + W_Buffer[0] = 0x66; + W_Buffer[1] = 0x20; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + + /* CH7017 support 24Bit panel */ + if (R_Buffer[0] == 0x1B || pBIOSInfo->BusWidth == VIA_DI_24BIT) { + /* Set LVDS output 24 bits mode*/ + W_Buffer[0] = 0x64; + xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,1); + W_Buffer[1] = R_Buffer[0] | 0x20; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + } +#if 0 + for (i = 0; i < 10; i++) { + W_Buffer[0] = 0x63; + xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,1); + W_Buffer[1] = (R_Buffer[0] | 0x40); + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + usleep(1); + W_Buffer[1] &= ~0x40; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + + usleep(100); + W_Buffer[0] = 0x66; + xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,1); + if (((R_Buffer[0] & 0x44) == 0x44) || (i >= 9)) { /* PLL lock OK, Turn on VDD */ + if (i >= 9) { + usleep(500); + } + W_Buffer[1] = R_Buffer[0] | 0x01; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, "CH7019 PLL lock ok!\n")); + break; + } + } +#endif + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, "Found Chrontel LVDS Transmiter!\n")); + pBIOSInfo->LVDS = VIA_CH7019LVDS; + /*pBIOSInfo->BusWidth = VIA_DI_12BIT;*/ + ret = TRUE; + + xf86DestroyI2CDevRec(dev,TRUE); + } + else { + xf86DestroyI2CDevRec(dev,TRUE); + } + } + } + + /* GPIO Sense */ + if (pBIOSInfo->Chipset != VIA_CLE266) { + VIAGPIOI2C_Initial(pBIOSInfo, 0x70); + VIAGPIOI2C_Read(pBIOSInfo, 0, R_Buffer, 2); + if (R_Buffer[0] == 0x06 && R_Buffer[1] == 0x11) { /* VIA LVDS */ + VIAGPIOI2C_Read(pBIOSInfo, 2, R_Buffer, 2); + if (R_Buffer[0] == 0x91 && R_Buffer[1] == 0x31) { + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, + "Found LVDS Transmiter VT1631.\n")); + pBIOSInfo->LVDS = VIA_VT3191; + if (pBIOSInfo->BusWidth == VIA_DI_24BIT && pBIOSInfo->LCDDualEdge) + VIAGPIOI2C_Write(pBIOSInfo, 0x08, 0x0D); + else + VIAGPIOI2C_Write(pBIOSInfo, 0x08, 0x09); + ret = TRUE; + } + } + else if (R_Buffer[0] == 0x01 && R_Buffer[1] == 0x0) {/* Silicon TMDS */ + VIAGPIOI2C_Read(pBIOSInfo, 2, R_Buffer, 2); + if (R_Buffer[0] && R_Buffer[1]) { + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, + "Found TMDS Transmiter Silicon164.\n")); + pBIOSInfo->TMDS = VIA_SIL164; + if (pBIOSInfo->BusWidth == VIA_DI_24BIT) { + if (pBIOSInfo->LCDDualEdge) + VIAGPIOI2C_Write(pBIOSInfo, 0x08, 0x3F); + else + VIAGPIOI2C_Write(pBIOSInfo, 0x08, 0x37); + } + else { + VIAGPIOI2C_Write(pBIOSInfo, 0x08, 0x3B); + } + VIAGPIOI2C_Write(pBIOSInfo, 0x0C, 0x09); + ret = TRUE; + } + } + + VIAGPIOI2C_Initial(pBIOSInfo, 0x10); + VIAGPIOI2C_Read(pBIOSInfo, 0, R_Buffer, 2); + if (R_Buffer[0] == 0x06 && R_Buffer[1] == 0x11) { /* VIA TMDS */ + VIAGPIOI2C_Read(pBIOSInfo, 2, R_Buffer, 2); + if (R_Buffer[0] == 0x92 && R_Buffer[1] == 0x31) { + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, + "Found TMDS Transmiter VT1632.\n")); + pBIOSInfo->TMDS = VIA_VT3192; + if (pBIOSInfo->BusWidth == VIA_DI_24BIT) { + if (pBIOSInfo->LCDDualEdge) + VIAGPIOI2C_Write(pBIOSInfo, 0x08, 0x3F); + else + VIAGPIOI2C_Write(pBIOSInfo, 0x08, 0x37); + } + else { + VIAGPIOI2C_Write(pBIOSInfo, 0x08, 0x3B); + } + ret = TRUE; + } + } + } + /* Disable LCD */ + VIADisableLCD(pBIOSInfo); + + /* Restore DI0, DI1 status */ + VGAOUT8(0x3d4, 0x6C); + VGAOUT8(0x3d5, cr6c); + VGAOUT8(0x3d4, 0x93); + VGAOUT8(0x3d5, cr93); + + if (pBIOSInfo->LVDS && pBIOSInfo->PanelSize == VIA_PANEL_INVALID) { + VGAOUT8(0x3d4, 0x3F); + pBIOSInfo->PanelSize = (int)(VGAIN8(0x3d5) >> 4); + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, + "Get PanelID From Scratch Pad is %d\n", pBIOSInfo->PanelSize)); + } + + return ret; +} + +/*=* + * + * unsigned char VIAGetDeviceDetect(VIABIOSInfoPtr) + * + * - Get Display Device Attched + * + * Return Type: unsigned char + * + * The Definition of Input Value: + * + * VIABIOSInfoPtr + * + * The Definition of Return Value: + * + * Bit[7] Reserved ------------ 2nd TV Connector + * Bit[6] Reserved ------------ 1st TV Connector + * Bit[5] Reserved + * Bit[4] CRT2 + * Bit[3] DFP + * Bit[2] TV + * Bit[1] LCD + * Bit[0] CRT + *=*/ +unsigned char +VIAGetDeviceDetect(VIABIOSInfoPtr pBIOSInfo) +{ + unsigned char tmp, sense; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIAGetDeviceDetect\n")); + + tmp = VIA_DEVICE_CRT1; /* Default assume color CRT attached */ +/* + if (VIA_LCD_SUPPORT) { + if (VIA_UNCOVERD_LCD_PANEL) + tmp |= 0x08; + } +*/ + if (pBIOSInfo->LVDS) { + pBIOSInfo->LCDAttach = TRUE; + tmp |= VIA_DEVICE_LCD; + } + + switch (pBIOSInfo->TVEncoder) { + case VIA_NONETV: + pBIOSInfo->TVAttach = FALSE; + break; + case VIA_TV2PLUS: + sense = VIASensorTV2(pBIOSInfo); + if (sense == 0x05) { + pBIOSInfo->TVAttach = FALSE; /* No TV Output Attached */ + } + else { + tmp |= VIA_DEVICE_TV; + pBIOSInfo->TVAttach = TRUE; + if (!pBIOSInfo->TVOutput) { + if (sense == 0) { + /*tmp |= 0xC0; Connect S_Video + Composite */ + pBIOSInfo->TVOutput = TVOUTPUT_SC; + } + if (sense == 0x01) { + /*tmp |= 0x80; Connect S_Video */ + pBIOSInfo->TVOutput = TVOUTPUT_SVIDEO; + } + else { + /*tmp |= 0x40; Connect Composite */ + pBIOSInfo->TVOutput = TVOUTPUT_COMPOSITE; + } + } + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, "TV2 sense = %d ,TVOutput = %d\n", sense, pBIOSInfo->TVOutput)); + } + break; + case VIA_TV3: + case VIA_VT1622A: + case VIA_VT1623: + sense = VIASensorTV3(pBIOSInfo); + if (sense == 0x0F) { + pBIOSInfo->TVAttach = FALSE; /* No TV Output Attached */ + } + else { + tmp |= VIA_DEVICE_TV; + pBIOSInfo->TVAttach = TRUE; + if (!pBIOSInfo->TVOutput) { + if (sense == 0x07 || sense == 0x0E) { + /*tmp |= 0x40; Connect Composite */ + pBIOSInfo->TVOutput = TVOUTPUT_COMPOSITE; + } + else { + /*tmp |= 0x80; Connect S_Video */ + pBIOSInfo->TVOutput = TVOUTPUT_SVIDEO; + } + } + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, "TV3 sense = %d ,TVOutput = %d\n", sense, pBIOSInfo->TVOutput)); + } + break; + case VIA_CH7009: + case VIA_CH7019: + sense = VIASensorCH7019(pBIOSInfo); + if (!sense) { + pBIOSInfo->TVAttach = FALSE; /* No TV Output Attached */ + } + else { + tmp |= VIA_DEVICE_TV; + pBIOSInfo->TVAttach = TRUE; + if (!pBIOSInfo->TVOutput) { + if (sense == 0x02) { + pBIOSInfo->TVOutput = TVOUTPUT_COMPOSITE; + } + else { + pBIOSInfo->TVOutput = TVOUTPUT_SVIDEO; + } + } + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, "CH7019 sense = %d ,TVOutput = %d\n", sense, pBIOSInfo->TVOutput)); + } + break; + case VIA_SAA7108: + sense = VIASensorSAA7108(pBIOSInfo); + if (!sense) { + pBIOSInfo->TVAttach = FALSE; /* No TV Output Attached */ + } + else { + tmp |= VIA_DEVICE_TV; + pBIOSInfo->TVAttach = TRUE; + if (!pBIOSInfo->TVOutput) { + switch (sense) { + case 0x01: + pBIOSInfo->TVOutput = TVOUTPUT_COMPOSITE; + break; + case 0x02: + pBIOSInfo->TVOutput = TVOUTPUT_SVIDEO; + break; + case 0x04: + pBIOSInfo->TVOutput = TVOUTPUT_RGB; + break; + case 0x08: + pBIOSInfo->TVOutput = TVOUTPUT_YCBCR; + break; + default: + pBIOSInfo->TVOutput = TVOUTPUT_COMPOSITE; + break; + } + } + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, "SAA7108 sense = %d ,TVOutput = %d\n", sense, pBIOSInfo->TVOutput)); + } + break; + case VIA_FS454: + tmp |= VIA_DEVICE_TV; + pBIOSInfo->TVAttach = TRUE; + break; + default: + break; + } + + if (pBIOSInfo->TMDS) { + if (VIASensorDVI(pBIOSInfo)) { + tmp |= VIA_DEVICE_DFP; + pBIOSInfo->DVIAttach = TRUE; + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, "DVI has Attachment.\n")); + if (pBIOSInfo->PanelSize == VIA_PANEL_INVALID) + VIAGetPanelInfo(pBIOSInfo); + } + else { + pBIOSInfo->DVIAttach = FALSE; + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, "DVI hasn't Attachment.\n")); + } + } + + if ((pBIOSInfo->Chipset == VIA_KM400) && !(tmp & VIA_DEVICE_LCD)) { + /* there currently is no infrastructure to check if another device + is already using this i2cbus, this will be solved later when + the whole i2c output detection is reworked. + VT1622 TV encoder does not reply to DDC/EDID. */ + + /* if there is a hardwired panel attached then the second i2cbus + will respond to DDC/EDID address probe (at least on I2CScans + i have seen from acer aspires) */ + + if (xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, 0xA0) || + xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, 0xA2)) { + tmp |= VIA_DEVICE_LCD; + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, "DDC/EDID response on I2C_Port2 on km400/kn400: assume hardwired panel.\n")); + } + } + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, "Returning %d.\n", tmp)); + return tmp; +} + +#ifdef UNUSED +/*=* + * + * Bool VIASetPanelState(VIABIOSInfoPtr, unsigned char) + * + * - Set Flat Panel Expaension/Centering State + * + * Return Type: Bool + * + * The Definition of Input Value: + * + * VIABIOSInfoPtr + * + * Bit[7:1] Reserved + * Bit[0] 0/1 = Centering/Expansion + * + * The Definition of Return Value: + * + * Success - TRUE + * Not Success - FALSE + *=*/ +static Bool +VIASetPanelState(VIABIOSInfoPtr pBIOSInfo, unsigned char state) +{ + VIABIOSInfoPtr pVia; + unsigned char tmp; + + pVia = pBIOSInfo; + + tmp = state & 0x01; + VGAOUT8(0x3D4, 0x3B); + tmp |= (VGAIN8(0x3D5) & 0xFE); + VGAOUT8(0x3D5, tmp); + + return TRUE; +} + + +/*=* + * + * unsigned char VIAGetPanelState(VIABIOSInfoPtr) + * + * - Get Flat Panel Expaension/Centering State + * + * Return Type: unsigend char + * + * The Definition of Input Value: + * + * VIABIOSInfoPtr + * + * Bit[7:1] Reserved + * Bit[0] 0/1 = Centering/Expansion + * + * The Definition of Return Value: + * + * Bit[7:1] Reserved + * Bit[0] 0/1 = Centering/Expansion + *=*/ +static unsigned char +VIAGetPanelState(VIABIOSInfoPtr pBIOSInfo) +{ + VIABIOSInfoPtr pVia; + unsigned char tmp; + + pVia = pBIOSInfo; + + VGAOUT8(0x3D4, 0x3B); + tmp = VGAIN8(0x3D5) & 0x01; + + return tmp; +} +#endif /* UNUSED */ + +/*=* + * + * int VIAQueryDVIEDID(void) + * + * - Query Flat Panel's EDID Table Version Through DVI Connector + * + * Return Type: int + * + * The Definition of Input Value: + * + * VIABIOSInfoPtr + * + * The Definition of Return Value: + * + * 0 - Found No EDID Table + * 1 - Found EDID1 Table + * 2 - Found EDID2 Table + *=*/ +static int +VIAQueryDVIEDID(VIABIOSInfoPtr pBIOSInfo) +{ + I2CDevPtr dev; + unsigned char W_Buffer[1]; + unsigned char R_Buffer[2]; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIAQueryDVIEDID\n")); + if (xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, 0xA0)) { + pBIOSInfo->dev = xf86CreateI2CDevRec(); + dev = pBIOSInfo->dev; + dev->DevName = "EDID1"; + dev->SlaveAddr = 0xA0; + dev->ByteTimeout = 2200; /* VESA DDC spec 3 p. 43 (+10 %) */ + dev->StartTimeout = 550; + dev->BitTimeout = 40; + dev->ByteTimeout = 40; + dev->AcknTimeout = 40; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + + if (xf86I2CDevInit(dev)) { + W_Buffer[0] = 0; + xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,2); + if ((R_Buffer[0] == 0) && (R_Buffer[1] == 0xFF)) + return 1; /* Found EDID1 Table */ + else + xf86DestroyI2CDevRec(dev,TRUE); + } + else { + xf86DestroyI2CDevRec(dev,TRUE); + } + } + + if (xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, 0xA2)) { + pBIOSInfo->dev = xf86CreateI2CDevRec(); + dev = pBIOSInfo->dev; + dev->DevName = "EDID2"; + dev->SlaveAddr = 0xA2; + dev->ByteTimeout = 2200; /* VESA DDC spec 3 p. 43 (+10 %) */ + dev->StartTimeout = 550; + dev->BitTimeout = 40; + dev->ByteTimeout = 40; + dev->AcknTimeout = 40; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + + if (xf86I2CDevInit(dev)) { + W_Buffer[0] = 0; + xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,1); + if (R_Buffer[0] == 0x20) + return 2; /* Found EDID2 Table */ + else { + xf86DestroyI2CDevRec(dev,TRUE); + return 0; /* Found No EDID Table */ + } + } + else { + xf86DestroyI2CDevRec(dev,TRUE); + return 0; /* Found No EDID Table */ + } + } + + if (pBIOSInfo->Chipset != VIA_CLE266) { + VIAGPIOI2C_Initial(pBIOSInfo, 0xA0); + VIAGPIOI2C_Read(pBIOSInfo, 0, R_Buffer, 2); + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "R_Buffer[0]=%d\n", R_Buffer[0])); + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "R_Buffer[1]=%d\n", R_Buffer[1])); + if ((R_Buffer[0] == 0) && (R_Buffer[1] == 0xFF)) + return 1; /* Found EDID1 Table */ + else { + VIAGPIOI2C_Initial(pBIOSInfo, 0xA2); + VIAGPIOI2C_Read(pBIOSInfo, 0, R_Buffer, 1); + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "R_Buffer[0]=%d\n", R_Buffer[0])); + if (R_Buffer[0] == 0x20) + return 2; /* Found EDID2 Table */ + else + return 0; /* Found No EDID Table */ + } + } + + return 0; +} + + +/*=* + * + * unsigned char VIAGetPanelSizeFromDDCv1(VIABIOSInfoPtr pBIOSInfo) + * + * - Get Panel Size Using EDID1 Table + * + * Return Type: unsigned char + * + * The Definition of Input Value: + * + * VIABIOSInfoPtr + * + * The Definition of Return Value: + * + * 0 - 640x480 + * 1 - 800x600 + * 2 - 1024x768 + * 3 - 1280x768 + * 4 - 1280x1024 + * 5 - 1400x1050 + * 6 - 1600x1200 + * 0xFF - Not Supported Panel Size + *=*/ +static unsigned char +VIAGetPanelSizeFromDDCv1(VIABIOSInfoPtr pBIOSInfo) +{ + ScrnInfoPtr pScrn = xf86Screens[pBIOSInfo->scrnIndex]; + xf86MonPtr pMon; + int i, max = 0; + unsigned char W_Buffer[1]; + unsigned char R_Buffer[1]; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIAGetPanelSizeFromDDCv1\n")); + for (i = 0x23; i < 0x35; i++) { + switch (i) { + case 0x23: + if (pBIOSInfo->Chipset == VIA_CLE266) { + W_Buffer[0] = i; + xf86I2CWriteRead(pBIOSInfo->dev, W_Buffer,1, R_Buffer,1); + } + else { + VIAGPIOI2C_Read(pBIOSInfo, i, R_Buffer, 1); + } + if (R_Buffer[0] & 0x3C) + max = 640; + if (R_Buffer[0] & 0xC0) + max = 720; + if (R_Buffer[0] & 0x03) + max = 800; + break; + case 0x24: + if (pBIOSInfo->Chipset == VIA_CLE266) { + W_Buffer[0] = i; + xf86I2CWriteRead(pBIOSInfo->dev, W_Buffer,1, R_Buffer,1); + } + else { + VIAGPIOI2C_Read(pBIOSInfo, i, R_Buffer, 1); + } + if (R_Buffer[0] & 0xC0) + max = 800; + if (R_Buffer[0] & 0x1E) + max = 1024; + if (R_Buffer[0] & 0x01) + max = 1280; + break; + case 0x26: + case 0x28: + case 0x2A: + case 0x2C: + case 0x2E: + case 0x30: + case 0x32: + case 0x34: + if (pBIOSInfo->Chipset == VIA_CLE266) { + W_Buffer[0] = i; + xf86I2CWriteRead(pBIOSInfo->dev, W_Buffer,1, R_Buffer,1); + } + else { + VIAGPIOI2C_Read(pBIOSInfo, i, R_Buffer, 1); + } + if (R_Buffer[0] == 1) + break; + R_Buffer[0] += 31; + R_Buffer[0] = R_Buffer[0] << 3; /* data = (data + 31) * 8 */ + if (R_Buffer[0] > max) + max = R_Buffer[0]; + break; + default: + break; + } + } + + if (pBIOSInfo->Chipset == VIA_CLE266) { + xf86DestroyI2CDevRec(pBIOSInfo->dev,TRUE); + + pMon = xf86DoEDID_DDC2(pScrn->scrnIndex, pBIOSInfo->I2C_Port2); + if (pMon) { + pBIOSInfo->DDC2 = pMon; + xf86PrintEDID(pMon); + xf86SetDDCproperties(pScrn, pMon); + for (i = 0; i < 8; i++) { + if (pMon->timings2[i].hsize > max) { + max = pMon->timings2[i].hsize; + } + } + if (pBIOSInfo->DDC1) { + xf86SetDDCproperties(pScrn, pBIOSInfo->DDC1); + } + } + } + + switch (max) { + case 640: + pBIOSInfo->PanelSize = VIA_PANEL6X4; + break; + case 800: + pBIOSInfo->PanelSize = VIA_PANEL8X6; + break; + case 1024: + pBIOSInfo->PanelSize = VIA_PANEL10X7; + break; + case 1280: + pBIOSInfo->PanelSize = VIA_PANEL12X10; + break; + case 1400: + pBIOSInfo->PanelSize = VIA_PANEL14X10; + break; + case 1600: + pBIOSInfo->PanelSize = VIA_PANEL16X12; + break; + default: + pBIOSInfo->PanelSize = VIA_PANEL_INVALID; + break; + } + return pBIOSInfo->PanelSize; +} + + +/*=* + * + * unsigned char VIAGetPanelSizeFromDDCv2(VIABIOSInfoPtr pBIOSInfo) + * + * - Get Panel Size Using EDID2 Table + * + * Return Type: unsigned char + * + * The Definition of Input Value: + * + * VIABIOSInfoPtr + * + * The Definition of Return Value: + * + * 0 - 640x480 + * 1 - 800x600 + * 2 - 1024x768 + * 3 - 1280x768 + * 4 - 1280x1024 + * 5 - 1400x1050 + * 6 - 1600x1200 + * 0xFF - Not Supported Panel Size + *=*/ +static unsigned char +VIAGetPanelSizeFromDDCv2(VIABIOSInfoPtr pBIOSInfo) +{ + int data = 0; + unsigned char W_Buffer[1]; + unsigned char R_Buffer[1]; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIAGetPanelSizeFromDDCv2\n")); + if (pBIOSInfo->Chipset == VIA_CLE266) { + W_Buffer[0] = 0x77; + xf86I2CWriteRead(pBIOSInfo->dev, W_Buffer,1, R_Buffer,1); + data = R_Buffer[0]; + data = data << 8; + W_Buffer[0] = 0x76; + xf86I2CWriteRead(pBIOSInfo->dev, W_Buffer,1, R_Buffer,1); + data |= R_Buffer[0]; + + xf86DestroyI2CDevRec(pBIOSInfo->dev,TRUE); + } + else { + VIAGPIOI2C_Read(pBIOSInfo, 0x76, R_Buffer, 2); + data = R_Buffer[0]; + data += R_Buffer[1] << 8; + } + + switch (data) { + case 640: + pBIOSInfo->PanelSize = VIA_PANEL6X4; + break; + case 800: + pBIOSInfo->PanelSize = VIA_PANEL8X6; + break; + case 1024: + pBIOSInfo->PanelSize = VIA_PANEL10X7; + break; + case 1280: + pBIOSInfo->PanelSize = VIA_PANEL12X10; + break; + case 1400: + pBIOSInfo->PanelSize = VIA_PANEL14X10; + break; + case 1600: + pBIOSInfo->PanelSize = VIA_PANEL16X12; + break; + default: + pBIOSInfo->PanelSize = VIA_PANEL_INVALID; + break; + } + return pBIOSInfo->PanelSize; +} + +/*=* + * + * unsigned char VIAGetPanelInfo(VIABIOSInfoPtr pBIOSInfo) + * + * - Get Panel Size + * + * Return Type: unsigned char + * + * The Definition of Input Value: + * + * VIABIOSInfoPtr + * + * The Definition of Return Value: + * + * 0 - 640x480 + * 1 - 800x600 + * 2 - 1024x768 + * 3 - 1280x768 + * 4 - 1280x1024 + * 5 - 1400x1050 + * 6 - 1600x1200 + * 0xFF - Not Supported Panel Size + *=*/ +unsigned char +VIAGetPanelInfo(VIABIOSInfoPtr pBIOSInfo) +{ + VIABIOSInfoPtr pVia = pBIOSInfo; + unsigned char cr6c, cr93; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIAGetPanelInfo\n")); + + if (pBIOSInfo->PanelSize == VIA_PANEL_INVALID) { + + /* Enable DI0, DI1 */ + VGAOUT8(0x3d4, 0x6C); + cr6c = VGAIN8(0x3d5); + VGAOUT8(0x3d5, cr6c | 0x21); + VGAOUT8(0x3d4, 0x93); + cr93 = VGAIN8(0x3d5); + if (pBIOSInfo->ChipRev > 15) { + VGAOUT8(0x3d5, 0xA3); + } + else { + VGAOUT8(0x3d5, 0xBF); + } + + /* Enable LCD */ + VIAEnableLCD(pBIOSInfo); + + switch (VIAQueryDVIEDID(pBIOSInfo)) { + case 1: + VIAGetPanelSizeFromDDCv1(pBIOSInfo); + break; + case 2: + VIAGetPanelSizeFromDDCv2(pBIOSInfo); + break; + default: + break; + } + + /* Disable LCD */ + VIADisableLCD(pBIOSInfo); + + /* Restore DI0, DI1 status */ + VGAOUT8(0x3d4, 0x6C); + VGAOUT8(0x3d5, cr6c); + VGAOUT8(0x3d4, 0x93); + VGAOUT8(0x3d5, cr93); + } + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "PanelSize = %d\n", pBIOSInfo->PanelSize)); + return (unsigned char)(pBIOSInfo->PanelSize); +} + +#ifndef CREATE_MODETABLE_HEADERFILE +#include "via_mode.h" +#endif +#ifndef CREATE_TV2_HEADERFILE +#include "via_tv2.h" +#endif +#ifndef CREATE_TV3_HEADERFILE +#include "via_tv3.h" +#endif +#ifndef CREATE_VT1622A_HEADERFILE +#include "via_vt1622a.h" +#endif +#ifndef CREATE_SAA7108_HEADERFILE +#include "via_saa7108.h" +#endif +#ifndef CREATE_CH7019_HEADERFILE +#include "via_ch7019.h" +#endif +#ifndef CREATE_FS454_HEADERFILE +#include "via_fs454.h" +#endif + +#if !defined (CREATE_MODETABLE_HEADERFILE) || !defined (CREATE_TV2_HEADERFILE) || \ + !defined (CREATE_TV3_HEADERFILE) || !defined (CREATE_VT1622A_HEADERFILE) || \ + !defined (CREATE_SAA7108_HEADERFILE) || !defined (CREATE_CH7019_HEADERFILE) || \ + !defined (CREATE_FS454_HEADERFILE) +#include "via_modeheaders.c" +#endif + +#ifdef CREATE_CH7019_HEADERFILE +static void +VIAGetCH7019Mask(VIAModeTablePtr pViaModeTable, + unsigned char *pBIOS, + unsigned char *pTable) +{ + unsigned char *pRom; + int i, j, k, m; + CARD16 tmp; + + DEBUG(xf86Msg(X_INFO, "VIAGetCH7019Mask\n")); + /* Get start of TV Mask Table */ + pRom = pTable + VIA_BIOS_TVMASKTAB_POS; + DEBUG(xf86Msg(X_INFO, "csTVMaskTbl: %X\n", *((CARD16 *)pRom))); + pRom = pBIOS + *((CARD16 *)pRom); + + for (i = 0, j = 0, k = 0; i < 9; i++) { + tmp = *((CARD16 *)pRom); + for (m = 0; m < 16; m++, j++) { + if ((tmp >> m) & 0x01) { + pViaModeTable->ch7019MaskTable.TV[j] = 0xFF; + k++; + } + else { + pViaModeTable->ch7019MaskTable.TV[j] = 0; + } + } + pRom += 2; + } + pViaModeTable->ch7019MaskTable.numTV = k; + + for (i = 0, j = 0, k = 0; i < 2; i++) { + tmp = *((CARD16 *)pRom); + for (m = 0; m < 16; m++, j++) { + if ((tmp >> m) & 0x01) { + pViaModeTable->ch7019MaskTable.CRTC1[j] = 0xFF; + k++; + } + else { + pViaModeTable->ch7019MaskTable.CRTC1[j] = 0; + } + } + pRom += 2; + } + pViaModeTable->ch7019MaskTable.numCRTC1 = k; + + pViaModeTable->ch7019MaskTable.misc1 = *pRom++; + + for (i = 0, j = 0, k = 0; i < 2; i++) { + tmp = *((CARD16 *)pRom); + for (m = 0; m < 16; m++, j++) { + if ((tmp >> m) & 0x01) { + pViaModeTable->ch7019MaskTable.CRTC2[j] = 0xFF; + k++; + } + else { + pViaModeTable->ch7019MaskTable.CRTC2[j] = 0; + } + } + pRom += 2; + } + pViaModeTable->ch7019MaskTable.numCRTC2 = k; + + pViaModeTable->ch7019MaskTable.misc2 = *pRom++; + +} + +static void +VIAGetCH7019NTSC(VIAModeTablePtr pViaModeTable, + unsigned char *pBIOS, + unsigned char *pTable) +{ + VIABIOSCH7019TablePtr pCH7019Tab; + unsigned char *pRom, *pNTSC; + unsigned char *pTVTable; + unsigned char numCRTC; + unsigned char numPatch, numReg; + int vScan, offset; + int i, j, k, n; + + pCH7019Tab = NULL; + pTVTable = NULL; + + DEBUG(xf86Msg(X_INFO, "VIAGetCH7019NTSC\n")); + for (vScan = 0; vScan < 2; vScan++) { + switch (vScan) { + case VIA_TVNORMAL: + /* Get pointer table of all mode */ + pRom = pTable + VIA_BIOS_TVMODETAB_POS; + DEBUG(xf86Msg(X_INFO, "csTVModeTbl: %X\n", *((CARD16 *)pRom))); + pTVTable = pBIOS + *((CARD16 *)pRom); + + pCH7019Tab = pViaModeTable->ch7019Table; + /* HSoffset = 2; */ + break; + case VIA_TVOVER: + /* Get pointer table of all mode */ + pRom = pTable + VIA_BIOS_MODEOVERTAB_POS; + DEBUG(xf86Msg(X_INFO, "csTVModeOverTbl: %X\n", *((CARD16 *)pRom))); + pTVTable = pBIOS + *((CARD16 *)pRom); + + pCH7019Tab = pViaModeTable->ch7019OverTable; + /* HSoffset = 38; */ + break; + } + + /* offset: skip MODE3, MODE13 */ + for (offset = 11, n = 0; n < VIA_BIOS_NUM_CH7019; offset += 5, n++) { + + /* Get pointer table of each mode */ + pRom = pTVTable + offset; + + if ((*((CARD16 *)pRom)) != 0) { + pNTSC = pBIOS + *((CARD16 *)pRom); + + /* Get start of TV Table */ + pRom = pNTSC + 1; + pRom = pBIOS + *((CARD16 *)pRom); + + for (i = 0, j = 0; i < pViaModeTable->ch7019MaskTable.numTV; j++) { + if (pViaModeTable->ch7019MaskTable.TV[j] == 0xFF) { + pCH7019Tab[n].TVNTSC[j] = *pRom++; + i++; + } + } + + numCRTC = *pRom++; + + for (i = 0, j = 0, k = 0; i < numCRTC; j++) { + if (pViaModeTable->ch7019MaskTable.CRTC1[j] == 0xFF) { + if (i >= pViaModeTable->ch7019MaskTable.numCRTC1) { + pCH7019Tab[n].MiscNTSC1[k++] = *pRom++; + i++; + } + else { + pCH7019Tab[n].CRTCNTSC1[j] = *pRom++; + i++; + } + } + } + + for (i = 0, j = 0, k = 0; i < pViaModeTable->ch7019MaskTable.numCRTC2; j++) { + if (pViaModeTable->ch7019MaskTable.CRTC2[j] == 0xFF) { + /* CRTC 65-57 8bpp, 16bpp, 32bpp */ + if (j == 0x15) { + pCH7019Tab[n].CRTCNTSC2_8BPP[j] = *pRom++; + pCH7019Tab[n].CRTCNTSC2_8BPP[j+1] = *pRom++; + pCH7019Tab[n].CRTCNTSC2_8BPP[j+2] = *pRom++; + pCH7019Tab[n].CRTCNTSC2_16BPP[j] = *pRom++; + pCH7019Tab[n].CRTCNTSC2_16BPP[j+1] = *pRom++; + pCH7019Tab[n].CRTCNTSC2_16BPP[j+2] = *pRom++; + pCH7019Tab[n].CRTCNTSC2_32BPP[j++] = *pRom++; + pCH7019Tab[n].CRTCNTSC2_32BPP[j++] = *pRom++; + pCH7019Tab[n].CRTCNTSC2_32BPP[j] = *pRom++; + i += 3; + } + else { + /* For CRTC 6A-6C */ + if (i >= (pViaModeTable->ch7019MaskTable.numCRTC2 - 3)) { + pCH7019Tab[n].CRTCNTSC2_8BPP[j] = *pRom; + pCH7019Tab[n].CRTCNTSC2_16BPP[j] = *pRom; + pCH7019Tab[n].CRTCNTSC2_32BPP[j] = *pRom++; + i++; + } + else { + pCH7019Tab[n].CRTCNTSC2_8BPP[j] = *pRom; + pCH7019Tab[n].CRTCNTSC2_16BPP[j] = *pRom; + pCH7019Tab[n].CRTCNTSC2_32BPP[j] = *pRom++; + i++; + } + } + } + } + + k = 3; + /* LCK 3c5.44-45 */ + if (pViaModeTable->ch7019MaskTable.misc2 & 0x18) { + pCH7019Tab[n].MiscNTSC2[k++] = *pRom++; + pCH7019Tab[n].MiscNTSC2[k++] = *pRom++; + } + + /* Patch as setting 2nd path */ + numPatch = (int)(pViaModeTable->ch7019MaskTable.misc2 >> 5); + for (i = 0; i < numPatch; i++) { + pCH7019Tab[n].PatchNTSC2[i] = *((CARD16 *)pRom); + pRom += 2; + } + + /* Get DotCrawl Table */ + pRom = pNTSC + 4; + pRom = pBIOS + *((CARD16 *)pRom); + + numReg = *pRom++; + pCH7019Tab[n].DotCrawlNTSC[0] = numReg; + for ( i = 1; i < (numReg + 1); i++) { + pCH7019Tab[n].DotCrawlNTSC[i] = *((CARD16 *)pRom); + pRom += 2; + } + } + } + } +} + +static void +VIAGetCH7019PAL(VIAModeTablePtr pViaModeTable, + unsigned char *pBIOS, + unsigned char *pTable) +{ + VIABIOSCH7019TablePtr pCH7019Tab; + unsigned char *pRom, *pPAL; + unsigned char *pTVTable; + unsigned char numCRTC; + unsigned char numPatch; + int vScan, offset; + int i, j, k, n; + + pCH7019Tab = NULL; + pTVTable = NULL; + + DEBUG(xf86Msg(X_INFO, "VIAGetSAA7108PAL\n")); + for (vScan = 0; vScan < 2; vScan++) { + switch (vScan) { + case VIA_TVNORMAL: + /* Get pointer table of all mode */ + pRom = pTable + VIA_BIOS_TVMODETAB_POS; + pTVTable = pBIOS + *((CARD16 *)pRom); + + pCH7019Tab = pViaModeTable->ch7019Table; + /* HSoffset = 4; */ + break; + case VIA_TVOVER: + /* Get pointer table of all mode */ + pRom = pTable + VIA_BIOS_MODEOVERTAB_POS; + pTVTable = pBIOS + *((CARD16 *)pRom); + + pCH7019Tab = pViaModeTable->ch7019OverTable; + /* HSoffset = 40; */ + break; + } + + /* offset: skip MODE3, MODE13 */ + for (offset = 13, n = 0; n < VIA_BIOS_NUM_CH7019; offset += 5, n++) { + + /* Get pointer table of each mode */ + pRom = pTVTable + offset; + + if (*((CARD16 *)pRom) != 0) { + pPAL = pBIOS + *((CARD16 *)pRom); + + /* Get start of TV Table */ + pRom = pPAL + 1; + pRom = pBIOS + *((CARD16 *)pRom); + + for (i = 0, j = 0; i < pViaModeTable->ch7019MaskTable.numTV; j++) { + if (pViaModeTable->ch7019MaskTable.TV[j] == 0xFF) { + pCH7019Tab[n].TVPAL[j] = *pRom++; + i++; + } + } + + numCRTC = *pRom++; + + for (i = 0, j = 0, k = 0; i < numCRTC; j++) { + if (pViaModeTable->ch7019MaskTable.CRTC1[j] == 0xFF) { + if (i >= pViaModeTable->ch7019MaskTable.numCRTC1) { + pCH7019Tab[n].MiscPAL1[k++] = *pRom++; + i++; + } + else { + pCH7019Tab[n].CRTCPAL1[j] = *pRom++; + i++; + } + } + } + + for (i = 0, j = 0, k = 0; i < pViaModeTable->ch7019MaskTable.numCRTC2; j++) { + if (pViaModeTable->ch7019MaskTable.CRTC2[j] == 0xFF) { + if (j == 0x15) { + pCH7019Tab[n].CRTCPAL2_8BPP[j] = *pRom++; + pCH7019Tab[n].CRTCPAL2_8BPP[j+1] = *pRom++; + pCH7019Tab[n].CRTCPAL2_8BPP[j+2] = *pRom++; + pCH7019Tab[n].CRTCPAL2_16BPP[j] = *pRom++; + pCH7019Tab[n].CRTCPAL2_16BPP[j+1] = *pRom++; + pCH7019Tab[n].CRTCPAL2_16BPP[j+2] = *pRom++; + pCH7019Tab[n].CRTCPAL2_32BPP[j++] = *pRom++; + pCH7019Tab[n].CRTCPAL2_32BPP[j++] = *pRom++; + pCH7019Tab[n].CRTCPAL2_32BPP[j] = *pRom++; + i += 3; + } + else { + /* For CRTC 6A-6C */ + if (i >= (pViaModeTable->ch7019MaskTable.numCRTC2 - 3)) { + pCH7019Tab[n].CRTCPAL2_8BPP[j] = *pRom; + pCH7019Tab[n].CRTCPAL2_16BPP[j] = *pRom; + pCH7019Tab[n].CRTCPAL2_32BPP[j] = *pRom++; + i++; + } + else { + pCH7019Tab[n].CRTCPAL2_8BPP[j] = *pRom; + pCH7019Tab[n].CRTCPAL2_16BPP[j] = *pRom; + pCH7019Tab[n].CRTCPAL2_32BPP[j] = *pRom++; + i++; + } + } + } + } + + k = 3; + /* LCK 3c5.44-45 */ + if (pViaModeTable->ch7019MaskTable.misc2 & 0x18) { + pCH7019Tab[n].MiscPAL2[k++] = *pRom++; + pCH7019Tab[n].MiscPAL2[k++] = *pRom++; + } + + /* Patch as setting 2nd path */ + numPatch = (int)(pViaModeTable->ch7019MaskTable.misc2 >> 5); + for (i = 0; i < numPatch; i++) { + pCH7019Tab[n].PatchPAL2[i] = *((CARD16 *)pRom); + pRom += 2; + } + } + } + } +} +#endif /* CREATE_CH7019_HEADERFILE */ + +#ifdef CREATE_SAA7108_HEADERFILE +static void +VIAGetSAA7108Mask(VIAModeTablePtr pViaModeTable, + unsigned char *pBIOS, + unsigned char *pTable) +{ + unsigned char *pRom; + int i, j, k, m; + CARD16 tmp; + + DEBUG(xf86Msg(X_INFO, "VIAGetSAA7108Mask\n")); + /* Get start of TV Mask Table */ + pRom = pTable + VIA_BIOS_TVMASKTAB_POS; + DEBUG(xf86Msg(X_INFO, "csTVMaskTbl: %X\n", *((CARD16 *)pRom))); + pRom = pBIOS + *((CARD16 *)pRom); + + for (i = 0, j = 0, k = 0; i < 11; i++) { + tmp = *((CARD16 *)pRom); + for (m = 0; m < 16; m++, j++) { + if ((tmp >> m) & 0x01) { + pViaModeTable->saa7108MaskTable.TV[j] = 0xFF; + k++; + } + else { + pViaModeTable->saa7108MaskTable.TV[j] = 0; + } + } + pRom += 2; + } + pViaModeTable->saa7108MaskTable.numTV = k; + + for (i = 0, j = 0, k = 0; i < 2; i++) { + tmp = *((CARD16 *)pRom); + for (m = 0; m < 16; m++, j++) { + if ((tmp >> m) & 0x01) { + pViaModeTable->saa7108MaskTable.CRTC1[j] = 0xFF; + k++; + } + else { + pViaModeTable->saa7108MaskTable.CRTC1[j] = 0; + } + } + pRom += 2; + } + pViaModeTable->saa7108MaskTable.numCRTC1 = k; + + pViaModeTable->saa7108MaskTable.misc1 = *pRom++; + + for (i = 0, j = 0, k = 0; i < 2; i++) { + tmp = *((CARD16 *)pRom); + for (m = 0; m < 16; m++, j++) { + if ((tmp >> m) & 0x01) { + pViaModeTable->saa7108MaskTable.CRTC2[j] = 0xFF; + k++; + } + else { + pViaModeTable->saa7108MaskTable.CRTC2[j] = 0; + } + } + pRom += 2; + } + pViaModeTable->saa7108MaskTable.numCRTC2 = k; + + pViaModeTable->saa7108MaskTable.misc2 = *pRom++; + +} + +static void +VIAGetSAA7108NTSC(VIAModeTablePtr pViaModeTable, + unsigned char *pBIOS, + unsigned char *pTable) +{ + VIABIOSSAA7108TablePtr pSAA7108Tab; + unsigned char *pRom, *pNTSC; + unsigned char *pTVTable; + unsigned char numCRTC; + unsigned char numPatch, numReg; + int vScan, offset; + int i, j, k, n; + + pSAA7108Tab = NULL; + pTVTable = NULL; + + DEBUG(xf86Msg(X_INFO, "VIAGetSAA7108NTSC\n")); + for (vScan = 0; vScan < 2; vScan++) { + switch (vScan) { + case VIA_TVNORMAL: + /* Get pointer table of all mode */ + pRom = pTable + VIA_BIOS_TVMODETAB_POS; + DEBUG(xf86Msg(X_INFO, "csTVModeTbl: %X\n", *((CARD16 *)pRom))); + pTVTable = pBIOS + *((CARD16 *)pRom); + + pSAA7108Tab = pViaModeTable->saa7108Table; + /* HSoffset = 2; */ + break; + case VIA_TVOVER: + /* Get pointer table of all mode */ + pRom = pTable + VIA_BIOS_MODEOVERTAB_POS; + DEBUG(xf86Msg(X_INFO, "csTVModeOverTbl: %X\n", *((CARD16 *)pRom))); + pTVTable = pBIOS + *((CARD16 *)pRom); + + pSAA7108Tab = pViaModeTable->saa7108OverTable; + /* HSoffset = 38; */ + break; + } + + /* offset: skip MODE3, MODE13 */ + for (offset = 11, n = 0; n < VIA_BIOS_NUM_SAA7108; offset += 5, n++) { + + /* Get pointer table of each mode */ + pRom = pTVTable + offset; + + if ((*((CARD16 *)pRom)) != 0) { + pNTSC = pBIOS + *((CARD16 *)pRom); + + /* Get start of TV Table */ + pRom = pNTSC + 1; + pRom = pBIOS + *((CARD16 *)pRom); + + for (i = 0, j = 0; i < pViaModeTable->saa7108MaskTable.numTV; j++) { + if (pViaModeTable->saa7108MaskTable.TV[j] == 0xFF) { + pSAA7108Tab[n].TVNTSC[j] = *pRom++; + i++; + } + } + + numCRTC = *pRom++; + + for (i = 0, j = 0, k = 0; i < numCRTC; j++) { + if (pViaModeTable->saa7108MaskTable.CRTC1[j] == 0xFF) { + if (i >= pViaModeTable->saa7108MaskTable.numCRTC1) { + pSAA7108Tab[n].MiscNTSC1[k++] = *pRom++; + i++; + } + else { + pSAA7108Tab[n].CRTCNTSC1[j] = *pRom++; + i++; + } + } + } + + for (i = 0, j = 0, k = 0; i < pViaModeTable->saa7108MaskTable.numCRTC2; j++) { + if (pViaModeTable->saa7108MaskTable.CRTC2[j] == 0xFF) { + /* CRTC 65-57 8bpp, 16bpp, 32bpp */ + if (j == 0x15) { + pSAA7108Tab[n].CRTCNTSC2_8BPP[j] = *pRom++; + pSAA7108Tab[n].CRTCNTSC2_8BPP[j+1] = *pRom++; + pSAA7108Tab[n].CRTCNTSC2_8BPP[j+2] = *pRom++; + pSAA7108Tab[n].CRTCNTSC2_16BPP[j] = *pRom++; + pSAA7108Tab[n].CRTCNTSC2_16BPP[j+1] = *pRom++; + pSAA7108Tab[n].CRTCNTSC2_16BPP[j+2] = *pRom++; + pSAA7108Tab[n].CRTCNTSC2_32BPP[j++] = *pRom++; + pSAA7108Tab[n].CRTCNTSC2_32BPP[j++] = *pRom++; + pSAA7108Tab[n].CRTCNTSC2_32BPP[j] = *pRom++; + i += 3; + } + else { + /* For CRTC 6A-6C */ + if (i >= (pViaModeTable->saa7108MaskTable.numCRTC2 - 3)) { + pSAA7108Tab[n].CRTCNTSC2_8BPP[j] = *pRom; + pSAA7108Tab[n].CRTCNTSC2_16BPP[j] = *pRom; + pSAA7108Tab[n].CRTCNTSC2_32BPP[j] = *pRom++; + i++; + } + else { + pSAA7108Tab[n].CRTCNTSC2_8BPP[j] = *pRom; + pSAA7108Tab[n].CRTCNTSC2_16BPP[j] = *pRom; + pSAA7108Tab[n].CRTCNTSC2_32BPP[j] = *pRom++; + i++; + } + } + } + } + + k = 3; + /* LCK 3c5.44-45 */ + if (pViaModeTable->saa7108MaskTable.misc2 & 0x18) { + pSAA7108Tab[n].MiscNTSC2[k++] = *pRom++; + pSAA7108Tab[n].MiscNTSC2[k++] = *pRom++; + } + + /* Patch as setting 2nd path */ + numPatch = (int)(pViaModeTable->saa7108MaskTable.misc2 >> 5); + for (i = 0; i < numPatch; i++) { + pSAA7108Tab[n].PatchNTSC2[i] = *((CARD16 *)pRom); + pRom += 2; + } + + /* Get RGB Table */ + pRom = pNTSC + 4; + pRom = pBIOS + *((CARD16 *)pRom); + + numReg = *pRom++; + pSAA7108Tab[n].RGBNTSC[0] = numReg; + for ( i = 1; i < (numReg + 1); i++) { + pSAA7108Tab[n].RGBNTSC[i] = *((CARD16 *)pRom); + pRom += 2; + } + + /* Get YCbCr Table */ + pRom = pNTSC + 7; + pRom = pBIOS + *((CARD16 *)pRom); + + numReg = *pRom++; + pSAA7108Tab[n].YCbCrNTSC[0] = numReg; + for ( i = 1; i < (numReg + 1); i++) { + pSAA7108Tab[n].YCbCrNTSC[i] = *((CARD16 *)pRom); + pRom += 2; + } + } + } + } +} + +static void +VIAGetSAA7108PAL(VIAModeTablePtr pViaModeTable, + unsigned char *pBIOS, + unsigned char *pTable) +{ + VIABIOSSAA7108TablePtr pSAA7108Tab; + unsigned char *pRom, *pPAL; + unsigned char *pTVTable; + unsigned char numCRTC; + unsigned char numPatch, numReg; + int vScan, offset; + int i, j, k, n; + + pSAA7108Tab = NULL; + pTVTable = NULL; + + DEBUG(xf86Msg(X_INFO, "VIAGetSAA7108PAL\n")); + for (vScan = 0; vScan < 2; vScan++) { + switch (vScan) { + case VIA_TVNORMAL: + /* Get pointer table of all mode */ + pRom = pTable + VIA_BIOS_TVMODETAB_POS; + pTVTable = pBIOS + *((CARD16 *)pRom); + + pSAA7108Tab = pViaModeTable->saa7108Table; + /* HSoffset = 4; */ + break; + case VIA_TVOVER: + /* Get pointer table of all mode */ + pRom = pTable + VIA_BIOS_MODEOVERTAB_POS; + pTVTable = pBIOS + *((CARD16 *)pRom); + + pSAA7108Tab = pViaModeTable->saa7108OverTable; + /* HSoffset = 40; */ + break; + } + + /* offset: skip MODE3, MODE13 */ + for (offset = 13, n = 0; n < VIA_BIOS_NUM_SAA7108; offset += 5, n++) { + + /* Get pointer table of each mode */ + pRom = pTVTable + offset; + + if (*((CARD16 *)pRom) != 0) { + pPAL = pBIOS + *((CARD16 *)pRom); + + /* Get start of TV Table */ + pRom = pPAL + 1; + pRom = pBIOS + *((CARD16 *)pRom); + + for (i = 0, j = 0; i < pViaModeTable->saa7108MaskTable.numTV; j++) { + if (pViaModeTable->saa7108MaskTable.TV[j] == 0xFF) { + pSAA7108Tab[n].TVPAL[j] = *pRom++; + i++; + } + } + + numCRTC = *pRom++; + + for (i = 0, j = 0, k = 0; i < numCRTC; j++) { + if (pViaModeTable->saa7108MaskTable.CRTC1[j] == 0xFF) { + if (i >= pViaModeTable->saa7108MaskTable.numCRTC1) { + pSAA7108Tab[n].MiscPAL1[k++] = *pRom++; + i++; + } + else { + pSAA7108Tab[n].CRTCPAL1[j] = *pRom++; + i++; + } + } + } + + for (i = 0, j = 0, k = 0; i < pViaModeTable->saa7108MaskTable.numCRTC2; j++) { + if (pViaModeTable->saa7108MaskTable.CRTC2[j] == 0xFF) { + if (j == 0x15) { + pSAA7108Tab[n].CRTCPAL2_8BPP[j] = *pRom++; + pSAA7108Tab[n].CRTCPAL2_8BPP[j+1] = *pRom++; + pSAA7108Tab[n].CRTCPAL2_8BPP[j+2] = *pRom++; + pSAA7108Tab[n].CRTCPAL2_16BPP[j] = *pRom++; + pSAA7108Tab[n].CRTCPAL2_16BPP[j+1] = *pRom++; + pSAA7108Tab[n].CRTCPAL2_16BPP[j+2] = *pRom++; + pSAA7108Tab[n].CRTCPAL2_32BPP[j++] = *pRom++; + pSAA7108Tab[n].CRTCPAL2_32BPP[j++] = *pRom++; + pSAA7108Tab[n].CRTCPAL2_32BPP[j] = *pRom++; + i += 3; + } + else { + /* For CRTC 6A-6C */ + if (i >= (pViaModeTable->saa7108MaskTable.numCRTC2 - 3)) { + pSAA7108Tab[n].CRTCPAL2_8BPP[j] = *pRom; + pSAA7108Tab[n].CRTCPAL2_16BPP[j] = *pRom; + pSAA7108Tab[n].CRTCPAL2_32BPP[j] = *pRom++; + i++; + } + else { + pSAA7108Tab[n].CRTCPAL2_8BPP[j] = *pRom; + pSAA7108Tab[n].CRTCPAL2_16BPP[j] = *pRom; + pSAA7108Tab[n].CRTCPAL2_32BPP[j] = *pRom++; + i++; + } + } + } + } + + k = 3; + /* LCK 3c5.44-45 */ + if (pViaModeTable->saa7108MaskTable.misc2 & 0x18) { + pSAA7108Tab[n].MiscPAL2[k++] = *pRom++; + pSAA7108Tab[n].MiscPAL2[k++] = *pRom++; + } + + /* Patch as setting 2nd path */ + numPatch = (int)(pViaModeTable->saa7108MaskTable.misc2 >> 5); + for (i = 0; i < numPatch; i++) { + pSAA7108Tab[n].PatchPAL2[i] = *((CARD16 *)pRom); + pRom += 2; + } + + /* Get RGB Table */ + pRom = pPAL + 4; + pRom = pBIOS + *((CARD16 *)pRom); + + numReg = *pRom++; + pSAA7108Tab[n].RGBPAL[0] = numReg; + for ( i = 1; i < (numReg + 1); i++) { + pSAA7108Tab[n].RGBPAL[i] = *((CARD16 *)pRom); + pRom += 2; + } + + /* Get YCbCr Table */ + pRom = pPAL + 7; + pRom = pBIOS + *((CARD16 *)pRom); + + numReg = *pRom++; + pSAA7108Tab[n].YCbCrPAL[0] = numReg; + for ( i = 1; i < (numReg + 1); i++) { + pSAA7108Tab[n].YCbCrPAL[i] = *((CARD16 *)pRom); + pRom += 2; + } + } + } + } +} +#endif /* CREATE_SAA7108_HEADERFILE */ + +#ifdef CREATE_TV2_HEADERFILE +static void +VIAGetTV2Mask(VIAModeTablePtr pViaModeTable, + unsigned char *pBIOS, + unsigned char *pTable) +{ + unsigned char *pRom; + int i, j, k, m; + CARD16 tmp; + + DEBUG(xf86Msg(X_INFO, "VIAGetTV2Mask\n")); + /* Get start of TV Mask Table */ + pRom = pTable + VIA_BIOS_TVMASKTAB_POS; + pRom = pBIOS + *((CARD16 *)pRom); + + for (i = 0, j = 0, k = 0; i < 9; i++) { + tmp = *((CARD16 *)pRom); + for (m = 0; m < 16; m++, j++) { + if ((tmp >> m) & 0x01) { + pViaModeTable->tv2MaskTable.TV[j] = 0xFF; + k++; + } + else { + pViaModeTable->tv2MaskTable.TV[j] = 0; + } + } + pRom += 2; + } + pViaModeTable->tv2MaskTable.numTV = k; + + for (i = 0, j = 0, k = 0; i < 2; i++) { + tmp = *((CARD16 *)pRom); + for (m = 0; m < 16; m++, j++) { + if ((tmp >> m) & 0x01) { + pViaModeTable->tv2MaskTable.CRTC1[j] = 0xFF; + k++; + } + else { + pViaModeTable->tv2MaskTable.CRTC1[j] = 0; + } + } + pRom += 2; + } + pViaModeTable->tv2MaskTable.numCRTC1 = k; + + pViaModeTable->tv2MaskTable.misc1 = *pRom++; + + for (i = 0, j = 0, k = 0; i < 2; i++) { + tmp = *((CARD16 *)pRom); + for (m = 0; m < 16; m++, j++) { + if ((tmp >> m) & 0x01) { + pViaModeTable->tv2MaskTable.CRTC2[j] = 0xFF; + k++; + } + else { + pViaModeTable->tv2MaskTable.CRTC2[j] = 0; + } + } + pRom += 2; + } + pViaModeTable->tv2MaskTable.numCRTC2 = k; + + pViaModeTable->tv2MaskTable.misc2 = *pRom++; +} +#endif /* CREATE_TV2_HEADERFILE */ + +#ifdef CREATE_TV3_HEADERFILE +static void +VIAGetTV3Mask(VIAModeTablePtr pViaModeTable, + unsigned char *pBIOS, + unsigned char *pTable) +{ + unsigned char *pRom; + int i, j, k, m; + CARD16 tmp; + + DEBUG(xf86Msg(X_INFO, "VIAGetTV3Mask\n")); + /* Get start of TV Mask Table */ + pRom = pTable + VIA_BIOS_TVMASKTAB_POS; + DEBUG(xf86Msg(X_INFO, "csTVMaskTbl: %X\n", *((CARD16 *)pRom))); + pRom = pBIOS + *((CARD16 *)pRom); + + for (i = 0, j = 0, k = 0; i < 9; i++) { + tmp = *((CARD16 *)pRom); + for (m = 0; m < 16; m++, j++) { + if ((tmp >> m) & 0x01) { + pViaModeTable->tv3MaskTable.TV[j] = 0xFF; + k++; + } + else { + pViaModeTable->tv3MaskTable.TV[j] = 0; + } + } + pRom += 2; + } + pViaModeTable->tv3MaskTable.numTV = k; + + for (i = 0, j = 0, k = 0; i < 2; i++) { + tmp = *((CARD16 *)pRom); + for (m = 0; m < 16; m++, j++) { + if ((tmp >> m) & 0x01) { + pViaModeTable->tv3MaskTable.CRTC1[j] = 0xFF; + k++; + } + else { + pViaModeTable->tv3MaskTable.CRTC1[j] = 0; + } + } + pRom += 2; + } + pViaModeTable->tv3MaskTable.numCRTC1 = k; + + pViaModeTable->tv3MaskTable.misc1 = *pRom++; + + for (i = 0, j = 0, k = 0; i < 2; i++) { + tmp = *((CARD16 *)pRom); + for (m = 0; m < 16; m++, j++) { + if ((tmp >> m) & 0x01) { + pViaModeTable->tv3MaskTable.CRTC2[j] = 0xFF; + k++; + } + else { + pViaModeTable->tv3MaskTable.CRTC2[j] = 0; + } + } + pRom += 2; + } + pViaModeTable->tv3MaskTable.numCRTC2 = k; + + pViaModeTable->tv3MaskTable.misc2 = *pRom++; + +} +#endif /* CREATE_TV3_HEADERFILE */ + +#ifdef CREATE_TV2_HEADERFILE +static void +VIAGetTV2NTSC(VIAModeTablePtr pViaModeTable, + unsigned char *pBIOS, + unsigned char *pTable) +{ + VIABIOSTV2TablePtr pTV2Tab; + unsigned char *pRom, *pNTSC; + unsigned char *pTVTable; + unsigned char numCRTC; + unsigned char numPatch, numReg; + int vScan, offset; + int i, j, k, n; + + pTV2Tab = NULL; + pTVTable = NULL; + + DEBUG(xf86Msg(X_INFO, "VIAGetTV2NTSC\n")); + for (vScan = 0; vScan < 2; vScan++) { + switch (vScan) { + case VIA_TVNORMAL: + /* Get start of TV Table */ + pRom = pTable + VIA_BIOS_TVMODETAB_POS; + pTVTable = pBIOS + *((CARD16 *)pRom); + + pTV2Tab = pViaModeTable->tv2Table; + break; + case VIA_TVOVER: + /* Get start of TV Table */ + pRom = pTable + VIA_BIOS_MODEOVERTAB_POS; + pTVTable = pBIOS + *((CARD16 *)pRom); + + pTV2Tab = pViaModeTable->tv2OverTable; + break; + } + + for (offset = 16, n = 0; n < VIA_BIOS_NUM_TV2; offset += 5, n++) { + + pRom = pTVTable + offset; + pNTSC = pBIOS + *((CARD16 *)pRom); + + pRom = pNTSC + 1; + pRom = pBIOS + *((CARD16 *)pRom); + + for (i = 0, j = 0; i < pViaModeTable->tv2MaskTable.numTV; j++) { + if (pViaModeTable->tv2MaskTable.TV[j] == 0xFF) { + pTV2Tab[n].TVNTSCC[j] = *pRom++; + i++; + } + } + + for (i = 0, j = 0; i < pViaModeTable->tv2MaskTable.numTV; j++) { + if (pViaModeTable->tv2MaskTable.TV[j] == 0xFF) { + if (j >= 0x53) { + pTV2Tab[n].TVNTSCS[j] = *pRom++; + i++; + } + else { + pTV2Tab[n].TVNTSCS[j] = + pTV2Tab[n].TVNTSCC[j]; + i++; + } + } + } + + numCRTC = *pRom++; + + for (i = 0, j = 0, k = 0; i < numCRTC; j++) { + if (pViaModeTable->tv2MaskTable.CRTC1[j] == 0xFF) { + if (i >= pViaModeTable->tv2MaskTable.numCRTC1) { + pTV2Tab[n].MiscNTSC1[k++] = *pRom++; + i++; + } + else { + pTV2Tab[n].CRTCNTSC1[j] = *pRom++; + i++; + } + } + } + + for (i = 0, j = 0, k = 0; i < pViaModeTable->tv2MaskTable.numCRTC2; j++) { + if (pViaModeTable->tv2MaskTable.CRTC2[j] == 0xFF) { + /* CRTC 65-57 8bpp, 16bpp, 32bpp */ + if (j == 0x15) { + pTV2Tab[n].CRTCNTSC2_8BPP[j] = *pRom++; + pTV2Tab[n].CRTCNTSC2_8BPP[j+1] = *pRom++; + pTV2Tab[n].CRTCNTSC2_8BPP[j+2] = *pRom++; + pTV2Tab[n].CRTCNTSC2_16BPP[j] = *pRom++; + pTV2Tab[n].CRTCNTSC2_16BPP[j+1] = *pRom++; + pTV2Tab[n].CRTCNTSC2_16BPP[j+2] = *pRom++; + pTV2Tab[n].CRTCNTSC2_32BPP[j++] = *pRom++; + pTV2Tab[n].CRTCNTSC2_32BPP[j++] = *pRom++; + pTV2Tab[n].CRTCNTSC2_32BPP[j] = *pRom++; + i += 3; + } + else { + /* For CRTC 6A-6C */ + if (i >= (pViaModeTable->tv2MaskTable.numCRTC2 - 3)) { + pTV2Tab[n].CRTCNTSC2_8BPP[j] = *pRom; + pTV2Tab[n].CRTCNTSC2_16BPP[j] = *pRom; + pTV2Tab[n].CRTCNTSC2_32BPP[j] = *pRom++; + i++; + } + else { + pTV2Tab[n].CRTCNTSC2_8BPP[j] = *pRom; + pTV2Tab[n].CRTCNTSC2_16BPP[j] = *pRom; + pTV2Tab[n].CRTCNTSC2_32BPP[j] = *pRom++; + i++; + } + } + } + } + + k = 3; + /* LCK 3c5.44-45 */ + if (pViaModeTable->tv2MaskTable.misc2 & 0x18) { + pTV2Tab[n].MiscNTSC2[k++] = *pRom++; + pTV2Tab[n].MiscNTSC2[k++] = *pRom++; + } + + /* Patch as setting 2nd path */ + numPatch = (int)(pViaModeTable->tv2MaskTable.misc2 >> 5); + for (i = 0; i < numPatch; i++) { + pTV2Tab[n].PatchNTSC2[i] = *((CARD16 *)pRom); + pRom += 2; + } + + /* Get DotCrawl Table */ + pRom = pNTSC + 4; + pRom = pBIOS + *((CARD16 *)pRom); + + numReg = *pRom++; + pTV2Tab[n].DotCrawlNTSC[0] = numReg; + for ( i = 1; i < (numReg + 1); i++) { + pTV2Tab[n].DotCrawlNTSC[i] = *((CARD16 *)pRom); + pRom += 2; + } + } + } +} + +static void +VIAGetTV2PAL(VIAModeTablePtr pViaModeTable, + unsigned char *pBIOS, + unsigned char *pTable) +{ + VIABIOSTV2TablePtr pTV2Tab; + unsigned char *pRom, *pPAL; + unsigned char *pTVTable; + unsigned char numCRTC; + int vScan, offset; + int numPatch; + int i, j, k, n; + + pTV2Tab = NULL; + pTVTable = NULL; + + DEBUG(xf86Msg(X_INFO, "VIAGetTV2PAL\n")); + for (vScan = 0; vScan < 2; vScan++) { + switch (vScan) { + case VIA_TVNORMAL: + /* Get start of TV Table */ + pRom = pTable + VIA_BIOS_TVMODETAB_POS; + pTVTable = pBIOS + *((CARD16 *)pRom); + + pTV2Tab = pViaModeTable->tv2Table; + break; + case VIA_TVOVER: + /* Get start of TV Table */ + pRom = pTable + VIA_BIOS_MODEOVERTAB_POS; + pTVTable = pBIOS + *((CARD16 *)pRom); + + pTV2Tab = pViaModeTable->tv2OverTable; + break; + } + + for (offset = 18, n = 0; n < VIA_BIOS_NUM_TV2; offset += 5, n++) { + + pRom = pTVTable + offset; + pPAL = pBIOS + *((CARD16 *)pRom); + + pRom = pPAL + 1; + pRom = pBIOS + *((CARD16 *)pRom); + + for (i = 0, j = 0; i < pViaModeTable->tv2MaskTable.numTV; j++) { + if (pViaModeTable->tv2MaskTable.TV[j] == 0xFF) { + pTV2Tab[n].TVPALC[j] = *pRom++; + i++; + } + } + + for (i = 0, j = 0; i < pViaModeTable->tv2MaskTable.numTV; j++) { + if (pViaModeTable->tv2MaskTable.TV[j] == 0xFF) { + if (j >= 0x53) { + pTV2Tab[n].TVPALS[j] = *pRom++; + i++; + } + else { + pTV2Tab[n].TVPALS[j] = + pTV2Tab[n].TVPALC[j]; + i++; + } + } + } + + numCRTC = *pRom++; + + for (i = 0, j = 0, k = 0; i < numCRTC; j++) { + if (pViaModeTable->tv2MaskTable.CRTC1[j] == 0xFF) { + if (i >= pViaModeTable->tv2MaskTable.numCRTC1) { + pTV2Tab[n].MiscPAL1[k++] = *pRom++; + i++; + } + else { + pTV2Tab[n].CRTCPAL1[j] = *pRom++; + i++; + } + } + } + + for (i = 0, j = 0, k = 0; i < pViaModeTable->tv2MaskTable.numCRTC2; j++) { + if (pViaModeTable->tv2MaskTable.CRTC2[j] == 0xFF) { + /* CRTC 65-57 8bpp, 16bpp, 32bpp */ + if (j == 0x15) { + pTV2Tab[n].CRTCPAL2_8BPP[j] = *pRom++; + pTV2Tab[n].CRTCPAL2_8BPP[j+1] = *pRom++; + pTV2Tab[n].CRTCPAL2_8BPP[j+2] = *pRom++; + pTV2Tab[n].CRTCPAL2_16BPP[j] = *pRom++; + pTV2Tab[n].CRTCPAL2_16BPP[j+1] = *pRom++; + pTV2Tab[n].CRTCPAL2_16BPP[j+2] = *pRom++; + pTV2Tab[n].CRTCPAL2_32BPP[j++] = *pRom++; + pTV2Tab[n].CRTCPAL2_32BPP[j++] = *pRom++; + pTV2Tab[n].CRTCPAL2_32BPP[j] = *pRom++; + i += 3; + } + else { + /* For CRTC 6A-6C */ + if (i >= (pViaModeTable->tv2MaskTable.numCRTC2 - 3)) { + pTV2Tab[n].CRTCPAL2_8BPP[j] = *pRom; + pTV2Tab[n].CRTCPAL2_16BPP[j] = *pRom; + pTV2Tab[n].CRTCPAL2_32BPP[j] = *pRom++; + i++; + } + else { + pTV2Tab[n].CRTCPAL2_8BPP[j] = *pRom; + pTV2Tab[n].CRTCPAL2_16BPP[j] = *pRom; + pTV2Tab[n].CRTCPAL2_32BPP[j] = *pRom++; + i++; + } + } + } + } + + k = 3; + /* LCK 3c5.44-45 */ + if (pViaModeTable->tv2MaskTable.misc2 & 0x18) { + pTV2Tab[n].MiscPAL2[k++] = *pRom++; + pTV2Tab[n].MiscPAL2[k++] = *pRom++; + } + + /* Patch as setting 2nd path */ + numPatch = (int)(pViaModeTable->tv2MaskTable.misc2 >> 5); + for (i = 0; i < numPatch; i++) { + pTV2Tab[n].PatchPAL2[i] = *((CARD16 *)pRom); + pRom += 2; + } + } + } +} +#endif /* CREATE_TV2_HEADERFILE */ + +#ifdef CREATE_TV3_HEADERFILE +static void +VIAGetTV3NTSC(VIAModeTablePtr pViaModeTable, + unsigned char *pBIOS, + unsigned char *pTable) +{ + VIABIOSTV3TablePtr pTV3Tab; + unsigned char *pRom, *pNTSC; + unsigned char *pTVTable; + unsigned char numCRTC; + unsigned char numPatch, numReg; + int vScan, offset; + int i, j, k, n; + + pTV3Tab = NULL; + pTVTable = NULL; + + DEBUG(xf86Msg(X_INFO, "VIAGetTV3NTSC\n")); + for (vScan = 0; vScan < 2; vScan++) { + switch (vScan) { + case VIA_TVNORMAL: + /* Get pointer table of all mode */ + pRom = pTable + VIA_BIOS_TVMODETAB_POS; + DEBUG(xf86Msg(X_INFO, "csTVModeTbl: %X\n", *((CARD16 *)pRom))); + pTVTable = pBIOS + *((CARD16 *)pRom); + + pTV3Tab = pViaModeTable->tv3Table; + /* HSoffset = 2; */ + break; + case VIA_TVOVER: + /* Get pointer table of all mode */ + pRom = pTable + VIA_BIOS_MODEOVERTAB_POS; + DEBUG(xf86Msg(X_INFO, "csTVModeOverTbl: %X\n", *((CARD16 *)pRom))); + pTVTable = pBIOS + *((CARD16 *)pRom); + + pTV3Tab = pViaModeTable->tv3OverTable; + /* HSoffset = 38; */ + break; + } + + /* offset: skip MODE3, MODE13 */ + for (offset = 11, n = 0; n < VIA_BIOS_NUM_TV3; offset += 5, n++) { + + /* Get pointer table of each mode */ + pRom = pTVTable + offset; + + if ((*((CARD16 *)pRom)) != 0) { + + pNTSC = pBIOS + *((CARD16 *)pRom); + + /* Get start of TV Table */ + pRom = pNTSC + 1; + pRom = pBIOS + *((CARD16 *)pRom); + + for (i = 0, j = 0; i < pViaModeTable->tv3MaskTable.numTV; j++) { + if (pViaModeTable->tv3MaskTable.TV[j] == 0xFF) { + pTV3Tab[n].TVNTSC[j] = *pRom++; + i++; + } + } + + numCRTC = *pRom++; + + for (i = 0, j = 0, k = 0; i < numCRTC; j++) { + if (pViaModeTable->tv3MaskTable.CRTC1[j] == 0xFF) { + if (i >= pViaModeTable->tv3MaskTable.numCRTC1) { + pTV3Tab[n].MiscNTSC1[k++] = *pRom++; + i++; + } + else { + pTV3Tab[n].CRTCNTSC1[j] = *pRom++; + i++; + } + } + } + + for (i = 0, j = 0, k = 0; i < pViaModeTable->tv3MaskTable.numCRTC2; j++) { + if (pViaModeTable->tv3MaskTable.CRTC2[j] == 0xFF) { + /* CRTC 65-57 8bpp, 16bpp, 32bpp */ + if (j == 0x15) { + pTV3Tab[n].CRTCNTSC2_8BPP[j] = *pRom++; + pTV3Tab[n].CRTCNTSC2_8BPP[j+1] = *pRom++; + pTV3Tab[n].CRTCNTSC2_8BPP[j+2] = *pRom++; + pTV3Tab[n].CRTCNTSC2_16BPP[j] = *pRom++; + pTV3Tab[n].CRTCNTSC2_16BPP[j+1] = *pRom++; + pTV3Tab[n].CRTCNTSC2_16BPP[j+2] = *pRom++; + pTV3Tab[n].CRTCNTSC2_32BPP[j++] = *pRom++; + pTV3Tab[n].CRTCNTSC2_32BPP[j++] = *pRom++; + pTV3Tab[n].CRTCNTSC2_32BPP[j] = *pRom++; + i += 3; + } + else { + /* For CRTC 6A-6C */ + if (i >= (pViaModeTable->tv3MaskTable.numCRTC2 - 3)) { + pTV3Tab[n].CRTCNTSC2_8BPP[j] = *pRom; + pTV3Tab[n].CRTCNTSC2_16BPP[j] = *pRom; + pTV3Tab[n].CRTCNTSC2_32BPP[j] = *pRom++; + i++; + } + else { + pTV3Tab[n].CRTCNTSC2_8BPP[j] = *pRom; + pTV3Tab[n].CRTCNTSC2_16BPP[j] = *pRom; + pTV3Tab[n].CRTCNTSC2_32BPP[j] = *pRom++; + i++; + } + } + } + } + + k = 3; + /* LCK 3c5.44-45 */ + if (pViaModeTable->tv3MaskTable.misc2 & 0x18) { + pTV3Tab[n].MiscNTSC2[k++] = *pRom++; + pTV3Tab[n].MiscNTSC2[k++] = *pRom++; + } + + /* Patch as setting 2nd path */ + numPatch = (int)(pViaModeTable->tv3MaskTable.misc2 >> 5); + for (i = 0; i < numPatch; i++) { + pTV3Tab[n].PatchNTSC2[i] = *((CARD16 *)pRom); + pRom += 2; + } + + /* Get RGB Table */ + pRom = pNTSC + 4; + pRom = pBIOS + *((CARD16 *)pRom); + + numReg = *pRom++; + pTV3Tab[n].RGBNTSC[0] = numReg; + for ( i = 1; i < (numReg + 1); i++) { + pTV3Tab[n].RGBNTSC[i] = *((CARD16 *)pRom); + pRom += 2; + } + + /* Get YCbCr Table */ + pRom = pNTSC + 7; + pRom = pBIOS + *((CARD16 *)pRom); + + numReg = *pRom++; + pTV3Tab[n].YCbCrNTSC[0] = numReg; + for ( i = 1; i < (numReg + 1); i++) { + pTV3Tab[n].YCbCrNTSC[i] = *((CARD16 *)pRom); + pRom += 2; + } + +#if 0 + /* Get SDTV_RGB Table */ + pRom = pNTSC + 10; + pRom = pBIOS + *((CARD16 *)pRom); + + numReg = *pRom++; + pTV3Tab[n].SDTV_RGBNTSC[0] = numReg; + for ( i = 1; i < (numReg + 1); i++) { + pTV3Tab[n].SDTV_RGBNTSC[i] = *((CARD16 *)pRom); + pRom += 2; + } + + /* Get SDTV_YCbCr Table */ + pRom = pNTSC + 13; + pRom = pBIOS + *((CARD16 *)pRom); + + numReg = *pRom++; + pTV3Tab[n].SDTV_YCbCrNTSC[0] = numReg; + for ( i = 1; i < (numReg + 1); i++) { + pTV3Tab[n].SDTV_YCbCrNTSC[i] = *((CARD16 *)pRom); + pRom += 2; + } + + /* Get DotCrawl Table */ + pRom = pNTSC + 16; + pRom = pBIOS + *((CARD16 *)pRom); +#endif + + /* Get DotCrawl Table */ + pRom = pNTSC + 10; + pRom = pBIOS + *((CARD16 *)pRom); + + numReg = *pRom++; + pTV3Tab[n].DotCrawlNTSC[0] = numReg; + for ( i = 1; i < (numReg + 1); i++) { + pTV3Tab[n].DotCrawlNTSC[i] = *((CARD16 *)pRom); + pRom += 2; + } + } + } + } +} +#endif /* CREATE_TV3_HEADERFILE */ + +#ifdef CREATE_FS454_HEADERFILE +static void +VIAGetFS454Mask(VIAModeTablePtr pViaModeTable, + unsigned char *pBIOS, + unsigned char *pTable) +{ + unsigned char *pRom; + int i, j, k, m; + CARD16 tmp; + + DEBUG(xf86Msg(X_INFO, "VIAGetFS454Mask\n")); + /* Get start of TV Mask Table */ + pRom = pTable + VIA_BIOS_TVMASKTAB_POS; + DEBUG(xf86Msg(X_INFO, "csTVMaskTbl: %X\n", *((CARD16 *)pRom))); + pRom = pBIOS + *((CARD16 *)pRom); + + /* Skip Zero TV Register Mask Table */ + pRom += (9*2); + + for (i = 0, j = 0, k = 0; i < 2; i++) { + tmp = *((CARD16 *)pRom); + for (m = 0; m < 16; m++, j++) { + if ((tmp >> m) & 0x01) { + pViaModeTable->fs454MaskTable.CRTC1[j] = 0xFF; + k++; + } + else { + pViaModeTable->fs454MaskTable.CRTC1[j] = 0; + } + } + pRom += 2; + } + pViaModeTable->fs454MaskTable.numCRTC1 = k; + + pViaModeTable->fs454MaskTable.misc1 = *pRom++; + + for (i = 0, j = 0, k = 0; i < 2; i++) { + tmp = *((CARD16 *)pRom); + for (m = 0; m < 16; m++, j++) { + if ((tmp >> m) & 0x01) { + pViaModeTable->fs454MaskTable.CRTC2[j] = 0xFF; + k++; + } + else { + pViaModeTable->fs454MaskTable.CRTC2[j] = 0; + } + } + pRom += 2; + } + pViaModeTable->fs454MaskTable.numCRTC2 = k; + + pViaModeTable->fs454MaskTable.misc2 = *pRom++; + +} + +static void +VIAGetFS454NTSC(VIAModeTablePtr pViaModeTable, + unsigned char *pBIOS, + unsigned char *pTable) +{ + VIABIOSFS454TablePtr pFS454Tbl; + unsigned char *pRom, *pNTSC; + unsigned char *pTVTable; + unsigned char numCRTC, numReg; + int vScan, offset; + int i, j, k, n; + + pFS454Tbl = NULL; + pTVTable = NULL; + + DEBUG(xf86Msg(X_INFO, "VIAGetFS454NTSC\n")); + for (vScan = 0; vScan < 2; vScan++) { + switch (vScan) { + case VIA_TVNORMAL: + /* Get pointer table of all mode */ + pRom = pTable + VIA_BIOS_TVMODETAB_POS; + DEBUG(xf86Msg(X_INFO, "csTVModeTbl: %X\n", *((CARD16 *)pRom))); + pTVTable = pBIOS + *((CARD16 *)pRom); + + pFS454Tbl = pViaModeTable->fs454Table; + /* HSoffset = 2; */ + break; + case VIA_TVOVER: + /* Get pointer table of all mode */ + pRom = pTable + VIA_BIOS_MODEOVERTAB_POS; + DEBUG(xf86Msg(X_INFO, "csTVModeOverTbl: %X\n", *((CARD16 *)pRom))); + pTVTable = pBIOS + *((CARD16 *)pRom); + + pFS454Tbl = pViaModeTable->fs454OverTable; + /* HSoffset = 38; */ + break; + } + + /* offset: skip MODE3, MODE13 */ + for (offset = 11, n = 0; n < VIA_BIOS_NUM_FS454; offset += 5, n++) { + + /* Get pointer table of each mode */ + pRom = pTVTable + offset; + + if ((*((CARD16 *)pRom)) != 0) { + + pNTSC = pBIOS + *((CARD16 *)pRom); + + /* Get start of TV Table */ + pRom = pNTSC + 1; + pRom = pBIOS + *((CARD16 *)pRom); + + numReg = *pRom++; + pFS454Tbl[n].TVNTSC[0] = numReg; + for (i = 1; i < (numReg + 1); i++) { + pFS454Tbl[n].TVNTSC[i] = *((CARD16 *)pRom); + pRom += 2; + } + + numCRTC = *pRom++; + + for (i = 0, j = 0, k = 0; i < numCRTC; j++) { + if (pViaModeTable->fs454MaskTable.CRTC1[j] == 0xFF) { + if (i >= pViaModeTable->fs454MaskTable.numCRTC1) { + pFS454Tbl[n].MiscNTSC1[k++] = *pRom++; + i++; + } + else { + pFS454Tbl[n].CRTCNTSC1[j] = *pRom++; + i++; + } + } + } + + for (i = 0, j = 0, k = 0; i < pViaModeTable->fs454MaskTable.numCRTC2; j++) { + if (pViaModeTable->fs454MaskTable.CRTC2[j] == 0xFF) { + /* CRTC 65-57 8bpp, 16bpp, 32bpp */ + if (j == 0x15) { + pFS454Tbl[n].CRTCNTSC2_8BPP[j] = *pRom++; + pFS454Tbl[n].CRTCNTSC2_8BPP[j+1] = *pRom++; + pFS454Tbl[n].CRTCNTSC2_8BPP[j+2] = *pRom++; + pFS454Tbl[n].CRTCNTSC2_16BPP[j] = *pRom++; + pFS454Tbl[n].CRTCNTSC2_16BPP[j+1] = *pRom++; + pFS454Tbl[n].CRTCNTSC2_16BPP[j+2] = *pRom++; + pFS454Tbl[n].CRTCNTSC2_32BPP[j++] = *pRom++; + pFS454Tbl[n].CRTCNTSC2_32BPP[j++] = *pRom++; + pFS454Tbl[n].CRTCNTSC2_32BPP[j] = *pRom++; + i += 3; + } + else { + /* For CRTC 6A-6C */ + if (i >= (pViaModeTable->fs454MaskTable.numCRTC2 - 3)) { + pFS454Tbl[n].CRTCNTSC2_8BPP[j] = *pRom; + pFS454Tbl[n].CRTCNTSC2_16BPP[j] = *pRom; + pFS454Tbl[n].CRTCNTSC2_32BPP[j] = *pRom++; + i++; + } + else { + pFS454Tbl[n].CRTCNTSC2_8BPP[j] = *pRom; + pFS454Tbl[n].CRTCNTSC2_16BPP[j] = *pRom; + pFS454Tbl[n].CRTCNTSC2_32BPP[j] = *pRom++; + i++; + } + } + } + } + + k = 3; + /* LCK 3c5.44-45 */ + if (pViaModeTable->fs454MaskTable.misc2 & 0x18) { + pFS454Tbl[n].MiscNTSC2[k++] = *pRom++; + pFS454Tbl[n].MiscNTSC2[k++] = *pRom++; + } + + /* Get RGB Table */ + pRom = pNTSC + 4; + pRom = pBIOS + *((CARD16 *)pRom); + + numReg = *pRom++; + pFS454Tbl[n].RGBNTSC[0] = numReg; + for ( i = 1; i < (numReg + 1); i++) { + pFS454Tbl[n].RGBNTSC[i] = *((CARD16 *)pRom); + pRom += 2; + } + + /* Get YCbCr Table */ + pRom = pNTSC + 7; + pRom = pBIOS + *((CARD16 *)pRom); + + numReg = *pRom++; + pFS454Tbl[n].YCbCrNTSC[0] = numReg; + for ( i = 1; i < (numReg + 1); i++) { + pFS454Tbl[n].YCbCrNTSC[i] = *((CARD16 *)pRom); + pRom += 2; + } + + /* Get DotCrawl Table */ + pRom = pNTSC + 10; + pRom = pBIOS + *((CARD16 *)pRom); + + numReg = *pRom++; + pFS454Tbl[n].DotCrawlNTSC[0] = numReg; + for ( i = 1; i < (numReg + 1); i++) { + pFS454Tbl[n].DotCrawlNTSC[i] = *((CARD16 *)pRom); + pRom += 2; + } + } + } + } +} +#endif /* CREATE_FS454_HEADERFILE */ + +#ifdef CREATE_TV3_HEADERFILE +static void +VIAGetTV3PAL(VIAModeTablePtr pViaModeTable, + unsigned char *pBIOS, + unsigned char *pTable) +{ + VIABIOSTV3TablePtr pTV3Tab; + unsigned char *pRom, *pPAL; + unsigned char *pTVTable; + unsigned char numCRTC; + unsigned char numPatch, numReg; + int vScan, offset; + int i, j, k, n; + + pTV3Tab = NULL; + pTVTable = NULL; + + DEBUG(xf86Msg(X_INFO, "VIAGetTV3PAL\n")); + for (vScan = 0; vScan < 2; vScan++) { + switch (vScan) { + case VIA_TVNORMAL: + /* Get pointer table of all mode */ + pRom = pTable + VIA_BIOS_TVMODETAB_POS; + pTVTable = pBIOS + *((CARD16 *)pRom); + + pTV3Tab = pViaModeTable->tv3Table; + /* HSoffset = 4; */ + break; + case VIA_TVOVER: + /* Get pointer table of all mode */ + pRom = pTable + VIA_BIOS_MODEOVERTAB_POS; + pTVTable = pBIOS + *((CARD16 *)pRom); + + pTV3Tab = pViaModeTable->tv3OverTable; + /* HSoffset = 40; */ + break; + } + + /* offset: skip MODE3, MODE13 */ + for (offset = 13, n = 0; n < VIA_BIOS_NUM_TV3; offset += 5, n++) { + + /* Get pointer table of each mode */ + pRom = pTVTable + offset; + + if (*((CARD16 *)pRom) != 0) { + + pPAL = pBIOS + *((CARD16 *)pRom); + + /* Get start of TV Table */ + pRom = pPAL + 1; + pRom = pBIOS + *((CARD16 *)pRom); + + for (i = 0, j = 0; i < pViaModeTable->tv3MaskTable.numTV; j++) { + if (pViaModeTable->tv3MaskTable.TV[j] == 0xFF) { + pTV3Tab[n].TVPAL[j] = *pRom++; + i++; + } + } + + numCRTC = *pRom++; + + for (i = 0, j = 0, k = 0; i < numCRTC; j++) { + if (pViaModeTable->tv3MaskTable.CRTC1[j] == 0xFF) { + if (i >= pViaModeTable->tv3MaskTable.numCRTC1) { + pTV3Tab[n].MiscPAL1[k++] = *pRom++; + i++; + } + else { + pTV3Tab[n].CRTCPAL1[j] = *pRom++; + i++; + } + } + } + + for (i = 0, j = 0, k = 0; i < pViaModeTable->tv3MaskTable.numCRTC2; j++) { + if (pViaModeTable->tv3MaskTable.CRTC2[j] == 0xFF) { + if (j == 0x15) { + pTV3Tab[n].CRTCPAL2_8BPP[j] = *pRom++; + pTV3Tab[n].CRTCPAL2_8BPP[j+1] = *pRom++; + pTV3Tab[n].CRTCPAL2_8BPP[j+2] = *pRom++; + pTV3Tab[n].CRTCPAL2_16BPP[j] = *pRom++; + pTV3Tab[n].CRTCPAL2_16BPP[j+1] = *pRom++; + pTV3Tab[n].CRTCPAL2_16BPP[j+2] = *pRom++; + pTV3Tab[n].CRTCPAL2_32BPP[j++] = *pRom++; + pTV3Tab[n].CRTCPAL2_32BPP[j++] = *pRom++; + pTV3Tab[n].CRTCPAL2_32BPP[j] = *pRom++; + i += 3; + } + else { + /* For CRTC 6A-6C */ + if (i >= (pViaModeTable->tv3MaskTable.numCRTC2 - 3)) { + pTV3Tab[n].CRTCPAL2_8BPP[j] = *pRom; + pTV3Tab[n].CRTCPAL2_16BPP[j] = *pRom; + pTV3Tab[n].CRTCPAL2_32BPP[j] = *pRom++; + i++; + } + else { + pTV3Tab[n].CRTCPAL2_8BPP[j] = *pRom; + pTV3Tab[n].CRTCPAL2_16BPP[j] = *pRom; + pTV3Tab[n].CRTCPAL2_32BPP[j] = *pRom++; + i++; + } + } + } + } + + k = 3; + /* LCK 3c5.44-45 */ + if (pViaModeTable->tv3MaskTable.misc2 & 0x18) { + pTV3Tab[n].MiscPAL2[k++] = *pRom++; + pTV3Tab[n].MiscPAL2[k++] = *pRom++; + } + + /* Patch as setting 2nd path */ + numPatch = (int)(pViaModeTable->tv3MaskTable.misc2 >> 5); + for (i = 0; i < numPatch; i++) { + pTV3Tab[n].PatchPAL2[i] = *((CARD16 *)pRom); + pRom += 2; + } + + /* Get RGB Table */ + pRom = pPAL + 4; + pRom = pBIOS + *((CARD16 *)pRom); + + numReg = *pRom++; + pTV3Tab[n].RGBPAL[0] = numReg; + for ( i = 1; i < (numReg + 1); i++) { + pTV3Tab[n].RGBPAL[i] = *((CARD16 *)pRom); + pRom += 2; + } + + /* Get YCbCr Table */ + pRom = pPAL + 7; + pRom = pBIOS + *((CARD16 *)pRom); + + numReg = *pRom++; + pTV3Tab[n].YCbCrPAL[0] = numReg; + for ( i = 1; i < (numReg + 1); i++) { + pTV3Tab[n].YCbCrPAL[i] = *((CARD16 *)pRom); + pRom += 2; + } + +#if 0 + /* Get SDTV_RGB Table */ + pRom = pPAL + 10; + pRom = pBIOS + *((CARD16 *)pRom); + + numReg = *pRom++; + pTV3Tab[n].SDTV_RGBPAL[0] = numReg; + for ( i = 1; i < (numReg + 1); i++) { + pTV3Tab[n].SDTV_RGBPAL[i] = *((CARD16 *)pRom); + pRom += 2; + } + + /* Get SDTV_YCbCr Table */ + pRom = pPAL + 13; + pRom = pBIOS + *((CARD16 *)pRom); + + numReg = *pRom++; + pTV3Tab[n].SDTV_YCbCrPAL[0] = numReg; + for ( i = 1; i < (numReg + 1); i++) { + pTV3Tab[n].SDTV_YCbCrPAL[i] = *((CARD16 *)pRom); + pRom += 2; + } +#endif + } + } + } +} +#endif /* CREATE_TV3_HEADERFILE */ + +/* Check TV mode table is TV2+ or TV3 */ +static int +VIAGetTVTabVer(VIABIOSInfoPtr pBIOSInfo, unsigned char *pBIOS) +{ + unsigned char *pRom, *pTable; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIAGetTVTabVer\n")); + /* Get the start of Table */ + pRom = pBIOS + VIA_BIOS_OFFSET_POS; + pTable = pBIOS + *((CARD16 *)pRom); + + /* Get start of TV Mask Table */ + pRom = pTable + VIA_BIOS_TVMASKTAB_POS; + pRom = pBIOS + *((CARD16 *)pRom); + + pRom += 12; + if (*((CARD16 *)pRom) == 0x03) { + pBIOSInfo->BIOSTVTabVer = 2; + return 2; + } + else { + pBIOSInfo->BIOSTVTabVer = 3; + return 3; + } +} + + +Bool +VIAGetBIOSTable(VIABIOSInfoPtr pBIOSInfo) +{ + VIAModeTablePtr pViaModeTable = pBIOSInfo->pModeTable; + unsigned char *pBIOS = NULL, *pRom, *pTable, *pFPanel, *pLCDTable, *pSuptTable; + unsigned char *pRefreshTableStart; + unsigned char *pRefreshIndexTable; + unsigned char *pRefreshTable; + unsigned char numSuptPanel, numEntry; + unsigned short tableSize; + int romSize; + int i = 0, j, k, m, sum; + + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIAGetBIOSTable\n")); + + if (!(pBIOS=xcalloc(1, 0x10000))) { + ErrorF("Allocate memory fail !!\n"); + return FALSE; + } + + if (xf86ReadBIOS(0xC0000, 0, pBIOS, 0x10000) != 0x10000) { + pBIOSInfo->UseBIOS = FALSE; + xfree(pBIOS); + ErrorF("Read VGA BIOS image fail !!\n"); + } + else { + if (*((CARD16 *) pBIOS) != 0xAA55) { + pBIOSInfo->UseBIOS = FALSE; + xfree(pBIOS); + ErrorF("VGA BIOS image is wrong!!\n"); + } + else { + romSize = *((CARD8 *) (pBIOS + VIA_BIOS_SIZE_POS)) * 512; + pRom = pBIOS; + sum = 0; + + for (i = 0; i < romSize; i++) { + sum += *pRom++; + } + + if (((CARD8) sum) != 0) { + pBIOSInfo->UseBIOS = FALSE; + xfree(pBIOS); + ErrorF("VGA BIOS image is wrong!! CheckSum = %x\n", sum); + } + } + } + + /* To check is TV Encoder match with BIOS TV mode table */ + if (pBIOSInfo->UseBIOS) { + int TVEncoder = pBIOSInfo->TVEncoder; + if (TVEncoder && (VIAGetTVTabVer(pBIOSInfo, pBIOS) != (TVEncoder+1))) { + pBIOSInfo->UseBIOS = FALSE; + xfree(pBIOS); + } + } + + /* Get the start of Table */ + pRom = pBIOS + VIA_BIOS_OFFSET_POS; + pTable = pBIOS + *((CARD16 *)pRom); + +#ifdef CREATE_CH7019_HEADERFILE + VIAGetCH7019Mask(pViaModeTable, pBIOS, pTable); + VIAGetCH7019NTSC(pViaModeTable, pBIOS, pTable); + VIAGetCH7019PAL(pViaModeTable, pBIOS, pTable); + VIACreateCH7019(pViaModeTable); +#else + pViaModeTable->ch7019MaskTable = ch7019MaskTable; + for (i = 0; i < VIA_BIOS_NUM_CH7019; i++) { + pViaModeTable->ch7019Table[i] = ch7019Table[i]; + pViaModeTable->ch7019OverTable[i] = ch7019OverTable[i]; + } +#endif +#ifdef CREATE_FS454_HEADERFILE + VIAGetFS454Mask(pViaModeTable, pBIOS, pTable); + VIAGetFS454NTSC(pViaModeTable, pBIOS, pTable); + /*VIAGetFS454PAL(pViaModeTable, pBIOS, pTable);*/ + VIACreateFS454(pViaModeTable); +#else + pViaModeTable->fs454MaskTable = fs454MaskTable; + for (i = 0; i < VIA_BIOS_NUM_FS454; i++) { + pViaModeTable->fs454Table[i] = fs454Table[i]; + pViaModeTable->fs454OverTable[i] = fs454OverTable[i]; + } +#endif +#ifdef CREATE_SAA7108_HEADERFILE + VIAGetSAA7108Mask(pViaModeTable, pBIOS, pTable); + VIAGetSAA7108NTSC(pViaModeTable, pBIOS, pTable); + VIAGetSAA7108PAL(pViaModeTable, pBIOS, pTable); + VIACreateSAA7108(pViaModeTable); +#else + pViaModeTable->saa7108MaskTable = saa7108MaskTable; + for (i = 0; i < VIA_BIOS_NUM_SAA7108; i++) { + pViaModeTable->saa7108Table[i] = saa7108Table[i]; + pViaModeTable->saa7108OverTable[i] = saa7108OverTable[i]; + } +#endif +#ifdef CREATE_TV2_HEADERFILE + VIAGetTV2Mask(pViaModeTable, pBIOS, pTable); + VIAGetTV2NTSC(pViaModeTable, pBIOS, pTable); + VIAGetTV2PAL(pViaModeTable, pBIOS, pTable); + VIACreateTV2(pViaModeTable); +#else + pViaModeTable->tv2MaskTable = tv2MaskTable; + for (i = 0; i < VIA_BIOS_NUM_TV2; i++) { + pViaModeTable->tv2Table[i] = tv2Table[i]; + pViaModeTable->tv2OverTable[i] = tv2OverTable[i]; + } +#endif +#ifdef CREATE_TV3_HEADERFILE + VIAGetTV3Mask(pViaModeTable, pBIOS, pTable); + VIAGetTV3NTSC(pViaModeTable, pBIOS, pTable); + VIAGetTV3PAL(pViaModeTable, pBIOS, pTable); + VIACreateTV3(pViaModeTable); +#else + pViaModeTable->tv3MaskTable = tv3MaskTable; + for (i = 0; i < VIA_BIOS_NUM_TV3; i++) { + pViaModeTable->tv3Table[i] = tv3Table[i]; + pViaModeTable->tv3OverTable[i] = tv3OverTable[i]; + } +#endif +#ifdef CREATE_VT1622A_HEADERFILE + VIAGetTV3Mask(pViaModeTable, pBIOS, pTable); + VIAGetTV3NTSC(pViaModeTable, pBIOS, pTable); + VIAGetTV3PAL(pViaModeTable, pBIOS, pTable); + VIACreateVT1622A(pViaModeTable); +#else + pViaModeTable->vt1622aMaskTable = vt1622aMaskTable; + for (i = 0; i < VIA_BIOS_NUM_TV3; i++) { + pViaModeTable->vt1622aTable[i] = vt1622aTable[i]; + pViaModeTable->vt1622aOverTable[i] = vt1622aOverTable[i]; + } +#endif +#ifndef CREATE_MODETABLE_HEADERFILE + if (!pBIOSInfo->UseBIOS) { + pViaModeTable->BIOSVer = BIOSVer; + pViaModeTable->BIOSDate = BIOSDate; + pViaModeTable->NumModes = NumModes; + pViaModeTable->NumPowerOn = NumPowerOn; + pViaModeTable->NumPowerOff = NumPowerOff; + pViaModeTable->Modes = Modes; + pViaModeTable->commExtTable = commExtTable; + pViaModeTable->stdModeExtTable = stdModeExtTable; + for (i = 0; i < VIA_BIOS_NUM_RES; i++) { + for (j = 0; j < VIA_BIOS_NUM_REFRESH; j++) { + pViaModeTable->refreshTable[i][j] = refreshTable[i][j]; + } + } + for (i = 0; i < VIA_BIOS_NUM_PANEL; i++) { + pViaModeTable->lcdTable[i] = lcdTable[i]; + } + for (i = 0; i < VIA_BIOS_NUM_LCD_POWER_SEQ; i++) { + pViaModeTable->powerOn[i] = powerOn[i]; + pViaModeTable->powerOff[i] = powerOff[i]; + } + pViaModeTable->modeFix = modeFix; + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "BIOS Version: %x.%x\n", + (pViaModeTable->BIOSVer >> 8), (pViaModeTable->BIOSVer & 0xFF))); + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "BIOS Release Date: %s\n", pViaModeTable->BIOSDate)); + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "Get mode table from via_mode.h\n")); + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "-- VIAGetBIOSTable Done!\n")); + xfree(pBIOS); + return TRUE; + } +#else + pBIOSInfo->UseBIOS = TRUE; +#endif /* #ifndef CREATE_MODETABLE_HEADERFILE */ + + /* Get the start of biosver structure */ + pRom = pTable + VIA_BIOS_BIOSVER_POS; + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "bcpPost: %X\n", i, *((CARD16 *)pRom))); + pRom = pBIOS + *((CARD16 *)pRom); + + /* The offset should be 44, but the actual image is less three char. */ + /* pRom += 44; */ + pRom += 41; + pViaModeTable->BIOSVer = *pRom++; + pViaModeTable->BIOSVer = (pViaModeTable->BIOSVer << 8) | *pRom; + xf86DrvMsg(pBIOSInfo->scrnIndex, X_DEFAULT, "BIOS Version: %x.%x\n", + (pViaModeTable->BIOSVer >> 8), (pViaModeTable->BIOSVer & 0xFF)); + + /* Get the start of bcpPost structure */ + pRom = pTable + VIA_BIOS_BCPPOST_POS; + pRom = pBIOS + *((CARD16 *)pRom); + + pViaModeTable->BIOSDate = (char *) xcalloc(9, sizeof(char)); + + pRom += 10; + for (i = 0; i < 8; i++) { + pViaModeTable->BIOSDate[i] = *pRom; + pRom++; + } + xf86DrvMsg(pBIOSInfo->scrnIndex, X_DEFAULT, "BIOS Release Date: %s\n", pViaModeTable->BIOSDate); + + /* Get CSTAB Tables */ + pRom = pTable + VIA_BIOS_CSTAB_POS; + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "cstabExtendEnd: %X\n", *((CARD16 *)pRom))); + pRom = pBIOS + *((CARD16 *)pRom); + + pViaModeTable->NumModes = *pRom; + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "BIOS Support Mode Numbers: %hu\n", pViaModeTable->NumModes)); + pViaModeTable->Modes = (VIAModeEntryPtr) xcalloc(pViaModeTable->NumModes, + sizeof(VIAModeEntry)); + + for (i = 0, j = pViaModeTable->NumModes - 1; i < pViaModeTable->NumModes; i++, j--) { + pRom -= 8; + pViaModeTable->Modes[j].Mode = *pRom; + pViaModeTable->Modes[j].Bpp = *(pRom + 2); + pViaModeTable->Modes[j].extModeExtTable.numEntry = 0; + pViaModeTable->Modes[j].MClk = 0; + pViaModeTable->Modes[j].VClk = 0; + + /* Using Mode Number To Set Resolution */ + switch (pViaModeTable->Modes[j].Mode) { + case 0x14: + case 0x15: + case 0x16: + pViaModeTable->Modes[j].Height = 576; + pViaModeTable->Modes[j].Width = 1024; + break; + case 0x22: + case 0x23: + case 0x24: + pViaModeTable->Modes[j].Height = 300; + pViaModeTable->Modes[j].Width = 400; + break; + case 0x25: + case 0x26: + case 0x27: + pViaModeTable->Modes[j].Height = 384; + pViaModeTable->Modes[j].Width = 512; + break; + case 0x2E: + case 0x2F: + case 0x30: + pViaModeTable->Modes[j].Height = 400; + pViaModeTable->Modes[j].Width = 640; + break; + case 0x31: + case 0x32: + case 0x33: + case 0x34: + pViaModeTable->Modes[j].Height = 480; + pViaModeTable->Modes[j].Width = 640; + break; + case 0x35: + case 0x36: + case 0x37: + case 0x38: + case 0x39: + pViaModeTable->Modes[j].Height = 600; + pViaModeTable->Modes[j].Width = 800; + break; + case 0x3A: + case 0x3B: + case 0x3C: + case 0x3D: + case 0x3E: + pViaModeTable->Modes[j].Height = 768; + pViaModeTable->Modes[j].Width = 1024; + break; + case 0x3F: + case 0x40: + case 0x41: + case 0x42: + case 0x43: + pViaModeTable->Modes[j].Height = 864; + pViaModeTable->Modes[j].Width = 1152; + break; + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + pViaModeTable->Modes[j].Height = 1024; + pViaModeTable->Modes[j].Width = 1280; + break; + case 0x49: + case 0x4A: + case 0x4B: + case 0x4C: + case 0x4D: + pViaModeTable->Modes[j].Height = 1200; + pViaModeTable->Modes[j].Width = 1600; + break; + case 0x50: + case 0x51: + case 0x52: + case 0x53: + pViaModeTable->Modes[j].Height = 1050; + pViaModeTable->Modes[j].Width = 1440; + break; + case 0x54: + case 0x55: + case 0x56: + case 0x57: + pViaModeTable->Modes[j].Height = 768; + pViaModeTable->Modes[j].Width = 1280; + break; + case 0x58: + case 0x59: + case 0x5A: + case 0x5B: + pViaModeTable->Modes[j].Height = 960; + pViaModeTable->Modes[j].Width = 1280; + break; +#if 0 + case 0x60: + case 0x61: + case 0x62: + pViaModeTable->Modes[j].Height = 1440; + pViaModeTable->Modes[j].Width = 1920; + break; +#endif + case 0x63: + case 0x64: + case 0x65: + pViaModeTable->Modes[j].Height = 480; + pViaModeTable->Modes[j].Width = 848; + break; + case 0x66: + case 0x67: + case 0x68: + pViaModeTable->Modes[j].Height = 1050; + pViaModeTable->Modes[j].Width = 1400; + break; + case 0x70: + case 0x71: + case 0x72: + pViaModeTable->Modes[j].Height = 480; + pViaModeTable->Modes[j].Width = 720; + break; + case 0x73: + case 0x74: + case 0x75: + pViaModeTable->Modes[j].Height = 576; + pViaModeTable->Modes[j].Width = 720; + break; + case 0x76: + case 0x77: + case 0x78: + pViaModeTable->Modes[j].Height = 512; + pViaModeTable->Modes[j].Width = 1024; + break; + case 0x79: + case 0x7A: + case 0x7B: + pViaModeTable->Modes[j].Height = 480; + pViaModeTable->Modes[j].Width = 856; + break; + case 0x5C: + case 0x5D: + case 0x5E: + pViaModeTable->Modes[j].Height = 200; + pViaModeTable->Modes[j].Width = 320; + break; + case 0x7C: + case 0x7D: + case 0x7E: + pViaModeTable->Modes[j].Height = 240; + pViaModeTable->Modes[j].Width = 320; + break; + default: + pViaModeTable->Modes[j].Height = 0; + pViaModeTable->Modes[j].Width = 0; + break; + } + } + + /* Get Set Mode Regs. Init. (Standard VGA) */ + pRom = pTable + VIA_BIOS_STDVGAREGTAB_POS; + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "csVidParams: %X\n", *((CARD16 *)pRom))); + pRom = pBIOS + *((CARD16 *)pRom); + + for (i = 0; i < pViaModeTable->NumModes; i++) { + pViaModeTable->Modes[i].stdVgaTable.columns = *pRom++; + pViaModeTable->Modes[i].stdVgaTable.rows = *pRom++; + pViaModeTable->Modes[i].stdVgaTable.fontHeight = *pRom++; + pViaModeTable->Modes[i].stdVgaTable.pageSize = *((CARD16 *)pRom++); + + pRom++; + + for (j = 1; j < 5; j++) { + pViaModeTable->Modes[i].stdVgaTable.SR[j] = *pRom++; + } + + pViaModeTable->Modes[i].stdVgaTable.misc = *pRom++; + + for (j = 0; j < 25; j++) { + pViaModeTable->Modes[i].stdVgaTable.CR[j] = *pRom++; + } + + for (j = 0; j < 20; j++) { + pViaModeTable->Modes[i].stdVgaTable.AR[j] = *pRom++; + } + + for (j = 0; j < 9; j++) { + pViaModeTable->Modes[i].stdVgaTable.GR[j] = *pRom++; + } + } + + /* Get Commmon Ext. Regs */ + pRom = pTable + VIA_BIOS_COMMEXTREGTAB_POS; + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "Mode_XRegs: %X\n", *((CARD16 *)pRom))); + pRom = pBIOS + *((CARD16 *)pRom); + + for (j = 0; *pRom != 0xFF; j++) { + switch (*pRom++) { + case ZCR: + pViaModeTable->commExtTable.port[j] = 0xD4; + break; + case ZSR: + pViaModeTable->commExtTable.port[j] = 0xC4; + break; + case ZGR: + pViaModeTable->commExtTable.port[j] = 0xCE; + break; + default: + pViaModeTable->commExtTable.port[j] = *pRom; + break; + } + /*pViaModeTable->commExtTable.port[j] = *pRom++;*/ + pViaModeTable->commExtTable.offset[j] = *pRom++; + pViaModeTable->commExtTable.mask[j] = *pRom++; + pViaModeTable->commExtTable.data[j] = *pRom++; + } + + pViaModeTable->commExtTable.numEntry = j; + + /* Get Standard Mode-Spec. Extend Regs */ + pRom = pTable + VIA_BIOS_STDMODEXTREGTAB_POS; + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "StdMode_XRegs: %X\n", *((CARD16 *)pRom))); + pRom = pBIOS + *((CARD16 *)pRom); + + for (j = 0; *pRom != 0xFF; j++) { + switch (*pRom++) { + case ZCR: + pViaModeTable->stdModeExtTable.port[j] = 0xD4; + break; + case ZSR: + pViaModeTable->stdModeExtTable.port[j] = 0xC4; + break; + case ZGR: + pViaModeTable->stdModeExtTable.port[j] = 0xCE; + break; + default: + pViaModeTable->stdModeExtTable.port[j] = *pRom; + break; + } + /*pViaModeTable->stdModeExtTable.port[j] = *pRom++;*/ + pViaModeTable->stdModeExtTable.offset[j] = *pRom++; + pViaModeTable->stdModeExtTable.mask[j] = *pRom++; + pViaModeTable->stdModeExtTable.data[j] = *pRom++; + } + + pViaModeTable->stdModeExtTable.numEntry = j; + + /* Get Extended Mode-Spec. Extend Regs */ + pRom = pTable + VIA_BIOS_EXTMODEREGTAB_POS; + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "csextModeTbl: %X\n", *((CARD16 *)pRom))); + pRom = pBIOS + *((CARD16 *)pRom); + + while (*pRom != 0xFF) { + unsigned char *pExtModeExtTable; + CARD16 mode = *pRom; + + for (i = 0; i < pViaModeTable->NumModes; i++) { + if (pViaModeTable->Modes[i].Mode == mode) + break; + } + + if (i == pViaModeTable->NumModes) { + /* Cannot find a match mode, skip this mode information */ + pRom += 11; + continue; + } + + pViaModeTable->Modes[i].MemNeed = *(pRom + 1); + pViaModeTable->Modes[i].VClk = *((CARD16 *)(pRom + 2)); + pViaModeTable->Modes[i].MClk = *((CARD16 *)(pRom + 4)); + + pExtModeExtTable = pBIOS + *((CARD16 *)(pRom + 6)); + + for (j = 0; *pExtModeExtTable != 0xFF; j++) { + switch (*pExtModeExtTable++) { + case ZCR: + pViaModeTable->Modes[i].extModeExtTable.port[j] = 0xD4; + break; + case ZSR: + pViaModeTable->Modes[i].extModeExtTable.port[j] = 0xC4; + break; + case ZGR: + pViaModeTable->Modes[i].extModeExtTable.port[j] = 0xCE; + break; + default: + pViaModeTable->Modes[i].extModeExtTable.port[j] = *pExtModeExtTable; + break; + } + /*pViaModeTable->Modes[i].extModeExtTable.port[j] = *pExtModeExtTable++;*/ + pViaModeTable->Modes[i].extModeExtTable.offset[j] = *pExtModeExtTable++; + pViaModeTable->Modes[i].extModeExtTable.mask[j] = *pExtModeExtTable++; + pViaModeTable->Modes[i].extModeExtTable.data[j] = *pExtModeExtTable++; + } + + pViaModeTable->Modes[i].extModeExtTable.numEntry = j; + + pRom += 11; + } + + /* Get Refresh Rate Table */ + pRom = pTable + VIA_BIOS_REFRESHMODETAB_POS; + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "csModeRateTbl: %X\n", *((CARD16 *)pRom))); + pRom = pBIOS + *((CARD16 *)pRom); + + for (i = 0; i < VIA_BIOS_NUM_RES; i++) { + for (j = 0; j < VIA_BIOS_NUM_REFRESH; j++) { + /* Set all modes is invalid */ + pViaModeTable->refreshTable[i][j].refresh = 0; + } + } + + i = 0; + + while (*((CARD16 *)pRom) != 0xFFFF) { + if (i >= VIA_BIOS_NUM_RES) { + xfree(pBIOS); + xfree(pViaModeTable->BIOSDate); + xfree(pViaModeTable->Modes); + ErrorF("Too many modes for Refresh Table!!\n"); + return FALSE; + } + + pRefreshTableStart = pBIOS + *((CARD16 *)pRom); + pRefreshIndexTable = pRefreshTableStart + 3; + j = 0; + + while (*pRefreshIndexTable != 0xFF) { + if (j >= VIA_BIOS_NUM_REFRESH) { + xfree(pBIOS); + xfree(pViaModeTable->BIOSDate); + xfree(pViaModeTable->Modes); + ErrorF("Too many refresh modes for Refresh Table!!\n"); + return FALSE; + } + + switch (*pRefreshIndexTable) { + case 0: + pViaModeTable->refreshTable[i][j].refresh = 60; + break; + case 1: + pViaModeTable->refreshTable[i][j].refresh = 56; + break; + case 2: + pViaModeTable->refreshTable[i][j].refresh = 65; + break; + case 3: + pViaModeTable->refreshTable[i][j].refresh = 70; + break; + case 4: + pViaModeTable->refreshTable[i][j].refresh = 72; + break; + case 5: + pViaModeTable->refreshTable[i][j].refresh = 75; + break; + case 6: + pViaModeTable->refreshTable[i][j].refresh = 80; + break; + case 7: + pViaModeTable->refreshTable[i][j].refresh = 85; + break; + case 8: + pViaModeTable->refreshTable[i][j].refresh = 90; + break; + case 9: + pViaModeTable->refreshTable[i][j].refresh = 100; + break; + case 10: + pViaModeTable->refreshTable[i][j].refresh = 120; + break; + default: + pViaModeTable->refreshTable[i][j].refresh = 255; + break; + } + + pRefreshTable = pRefreshTableStart + *(pRefreshIndexTable + 1); + + pViaModeTable->refreshTable[i][j].VClk = *((CARD16 *) pRefreshTable); + pRefreshTable += 2; + + for (k = 0; k < 11; k++) { + pViaModeTable->refreshTable[i][j].CR[k] = *pRefreshTable++; + } + + pRefreshIndexTable += 3; + j++; + } + + pRom += 2; + + /* Skip Mode table, we don't need it */ + while (*pRom++ != 0x0) + ; + + i++; + } + + /* Get BIOS LCD Mode Table */ + /* Get start of LCD Table */ + pRom = pTable + VIA_BIOS_LCDMODETAB_POS; + pRom = pBIOS + *((CARD16 *)pRom); + + /* No. of Support Panels */ + pRom += 6; /* Skip six char. - "FPANEL" */ + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "numSuptPanel: %X\n", *pRom)); + numSuptPanel = *pRom; + + /* Point to LCD 640x480 Table */ + pRom += 3; + pFPanel = pRom; + + for (i = 0; i < numSuptPanel; i++) { + + /* Get fpIndex */ + pViaModeTable->lcdTable[i].fpIndex = *pRom++; + + /* Get fpSize */ + pViaModeTable->lcdTable[i].fpSize = *pRom++; + + /* Get No. of Entry */ + numEntry = *pRom++; + + /* vidMemAdjust skip */ + pRom++; + + /* Get Table Size */ + tableSize = *((CARD16 *)pRom); + + /* Get Support Mode Table */ + pRom += 2; + pSuptTable = pRom; + + /* Get Power Seqence Index */ + pRom += 2; + pViaModeTable->lcdTable[i].powerSeq = *pRom++; + + pLCDTable = pRom; + + pRom = pSuptTable; + pRom = pBIOS + *((CARD16 *)pRom); + + for (j = 0; j < VIA_BIOS_NUM_LCD_SUPPORT_MASK; j++) { + pViaModeTable->lcdTable[i].SuptMode[j] = *((CARD16 *)pRom); + pRom += 2; + } + + /* Get FPconfig Table */ + pRom = pLCDTable; + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "FPconfigTbl000%d: %X\n", i, *((CARD16 *)pRom))); + pRom = pBIOS + *((CARD16 *)pRom); + + for (j = 0; *pRom != 0xFF; j++) { + switch (*pRom++) { + case ZCR: + pViaModeTable->lcdTable[i].FPconfigTb.port[j] = 0xD4; + break; + case ZSR: + pViaModeTable->lcdTable[i].FPconfigTb.port[j] = 0xC4; + break; + case ZGR: + pViaModeTable->lcdTable[i].FPconfigTb.port[j] = 0xCE; + break; + default: + pViaModeTable->lcdTable[i].FPconfigTb.port[j] = *pRom; + break; + } + /*pViaModeTable->lcdTable[i].FPconfigTb.port[j] = *pRom++;*/ + pViaModeTable->lcdTable[i].FPconfigTb.offset[j] = *pRom++; + pViaModeTable->lcdTable[i].FPconfigTb.data[j] = *pRom++; + } + pViaModeTable->lcdTable[i].FPconfigTb.numEntry = j; + + /* Get Init Table */ + pRom = pLCDTable + 2; + pRom = pBIOS + *((CARD16 *)pRom); + + pViaModeTable->lcdTable[i].InitTb.LCDClk = *((CARD16 *)pRom); + pViaModeTable->lcdTable[i].InitTb.VClk = *((CARD16 *)(pRom+2)); + pRom += 4; + + pViaModeTable->lcdTable[i].InitTb.LCDClk_12Bit = *((CARD16 *)pRom); + pViaModeTable->lcdTable[i].InitTb.VClk_12Bit = *((CARD16 *)(pRom+2)); + pRom += 4; + + for (j = 0; *pRom != 0xFF; j++) { + /*pViaModeTable->lcdTable[i].InitTb.port[j] = *pRom++;*/ + pViaModeTable->lcdTable[i].InitTb.port[j] = 0xD4; + pViaModeTable->lcdTable[i].InitTb.offset[j] = *pRom++; + pViaModeTable->lcdTable[i].InitTb.data[j] = *pRom++; + } + pViaModeTable->lcdTable[i].InitTb.numEntry = j; + + /* Get MPatchDP2Ctr Table */ + pRom = pLCDTable + 4; + pRom = pBIOS + *((CARD16 *)pRom); + + for (j = 0; *pRom != 0xFF; j++) { + pViaModeTable->lcdTable[i].MPatchDP2Ctr[j].Mode = *pRom; + pRom++; + + pViaModeTable->lcdTable[i].MPatchDP2Ctr[j].LCDClk = *((CARD16 *)pRom); + pViaModeTable->lcdTable[i].MPatchDP2Ctr[j].VClk = *((CARD16 *)(pRom+2)); + pRom += 4; + + pViaModeTable->lcdTable[i].MPatchDP2Ctr[j].LCDClk_12Bit = *((CARD16 *)pRom); + pViaModeTable->lcdTable[i].MPatchDP2Ctr[j].VClk_12Bit = *((CARD16 *)(pRom+2)); + pRom += 4; + for (k = 0; *pRom != 0xFF; k++) { + pViaModeTable->lcdTable[i].MPatchDP2Ctr[j].port[k] = 0xD4; + pViaModeTable->lcdTable[i].MPatchDP2Ctr[j].offset[k] = *pRom++; + pViaModeTable->lcdTable[i].MPatchDP2Ctr[j].data[k] = *pRom++; + } + pViaModeTable->lcdTable[i].MPatchDP2Ctr[j].numEntry = k; + pRom++; + } + pViaModeTable->lcdTable[i].numMPatchDP2Ctr = j; + + /* Get MPatchDP2Exp Table */ + pRom = pLCDTable + 6; + pRom = pBIOS + *((CARD16 *)pRom); + + for (j = 0; *pRom != 0xFF; j++) { + pViaModeTable->lcdTable[i].MPatchDP2Exp[j].Mode = *pRom; + pRom++; + + pViaModeTable->lcdTable[i].MPatchDP2Exp[j].LCDClk = *((CARD16 *)pRom); + pViaModeTable->lcdTable[i].MPatchDP2Exp[j].VClk = *((CARD16 *)(pRom+2)); + pRom += 4; + + pViaModeTable->lcdTable[i].MPatchDP2Exp[j].LCDClk_12Bit = *((CARD16 *)pRom); + pViaModeTable->lcdTable[i].MPatchDP2Exp[j].VClk_12Bit = *((CARD16 *)(pRom+2)); + pRom += 4; + for (k = 0; *pRom != 0xFF; k++) { + pViaModeTable->lcdTable[i].MPatchDP2Exp[j].port[k] = 0xD4; + pViaModeTable->lcdTable[i].MPatchDP2Exp[j].offset[k] = *pRom++; + pViaModeTable->lcdTable[i].MPatchDP2Exp[j].data[k] = *pRom++; + } + pViaModeTable->lcdTable[i].MPatchDP2Exp[j].numEntry = k; + pRom++; + } + pViaModeTable->lcdTable[i].numMPatchDP2Exp = j; + + /* Get MPatchDP1Ctr Table */ + pRom = pLCDTable + 8; + pRom = pBIOS + *((CARD16 *)pRom); + + for (j = 0; *pRom != 0xFF; j++) { + pViaModeTable->lcdTable[i].MPatchDP1Ctr[j].Mode = *pRom; + pRom++; + + for (k = 0; *pRom != 0xFF; k++) { + switch (*pRom++) { + case ZCR: + pViaModeTable->lcdTable[i].MPatchDP1Ctr[j].port[k] = 0xD4; + break; + case ZSR: + pViaModeTable->lcdTable[i].MPatchDP1Ctr[j].port[k] = 0xC4; + break; + case ZGR: + pViaModeTable->lcdTable[i].MPatchDP1Ctr[j].port[k] = 0xCE; + break; + default: + pViaModeTable->lcdTable[i].MPatchDP1Ctr[j].port[k] = *pRom; + break; + } + /*pViaModeTable->lcdTable[i].MPatchDP1Ctr[j].port[k] = *pRom++;*/ + pViaModeTable->lcdTable[i].MPatchDP1Ctr[j].offset[k] = *pRom++; + pViaModeTable->lcdTable[i].MPatchDP1Ctr[j].data[k] = *pRom++; + } + pViaModeTable->lcdTable[i].MPatchDP1Ctr[j].numEntry = k; + pRom++; + } + pViaModeTable->lcdTable[i].numMPatchDP1Ctr = j; + + /* Get MPatchDP1Exp Table */ + pRom = pLCDTable + 10; + pRom = pBIOS + *((CARD16 *)pRom); + + for (j = 0; *pRom != 0xFF; j++) { + pViaModeTable->lcdTable[i].MPatchDP1Exp[j].Mode = *pRom; + pRom++; + + for (k = 0; *pRom != 0xFF; k++) { + switch (*pRom++) { + case ZCR: + pViaModeTable->lcdTable[i].MPatchDP1Exp[j].port[k] = 0xD4; + break; + case ZSR: + pViaModeTable->lcdTable[i].MPatchDP1Exp[j].port[k] = 0xC4; + break; + case ZGR: + pViaModeTable->lcdTable[i].MPatchDP1Exp[j].port[k] = 0xCE; + break; + default: + pViaModeTable->lcdTable[i].MPatchDP1Exp[j].port[k] = *pRom; + break; + } + /*pViaModeTable->lcdTable[i].MPatchDP1Exp[j].port[k] = *pRom++;*/ + pViaModeTable->lcdTable[i].MPatchDP1Exp[j].offset[k] = *pRom++; + pViaModeTable->lcdTable[i].MPatchDP1Exp[j].data[k] = *pRom++; + } + pViaModeTable->lcdTable[i].MPatchDP1Exp[j].numEntry = k; + pRom++; + } + pViaModeTable->lcdTable[i].numMPatchDP1Exp = j; + + /* Get LowResCtr Table */ + pRom = pLCDTable + 12; + pRom = pBIOS + *((CARD16 *)pRom); + + pViaModeTable->lcdTable[i].LowResCtr.LCDClk = *((CARD16 *)pRom); + pViaModeTable->lcdTable[i].LowResCtr.VClk = *((CARD16 *)(pRom+2)); + pRom += 4; + + pViaModeTable->lcdTable[i].LowResCtr.LCDClk_12Bit = *((CARD16 *)pRom); + pViaModeTable->lcdTable[i].LowResCtr.VClk_12Bit = *((CARD16 *)(pRom+2)); + pRom += 4; + + for (j = 0; *pRom != 0xFF; j++) { + /*pViaModeTable->lcdTable[i].LowResCtr.port[j] = *pRom++;*/ + pViaModeTable->lcdTable[i].LowResCtr.port[j] = 0xD4; + pViaModeTable->lcdTable[i].LowResCtr.offset[j] = *pRom++; + pViaModeTable->lcdTable[i].LowResCtr.data[j] = *pRom++; + } + pViaModeTable->lcdTable[i].LowResCtr.numEntry = j; + + /* Get LowResExp Table */ + pRom = pLCDTable + 14; + pRom = pBIOS + *((CARD16 *)pRom); + + pViaModeTable->lcdTable[i].LowResExp.LCDClk = *((CARD16 *)pRom); + pViaModeTable->lcdTable[i].LowResExp.VClk = *((CARD16 *)(pRom+2)); + pRom += 4; + + pViaModeTable->lcdTable[i].LowResExp.LCDClk_12Bit = *((CARD16 *)pRom); + pViaModeTable->lcdTable[i].LowResExp.VClk_12Bit = *((CARD16 *)(pRom+2)); + pRom += 4; + + for (j = 0; *pRom != 0xFF; j++) { + /*pViaModeTable->lcdTable[i].LowResExp.port[j] = *pRom++;*/ + pViaModeTable->lcdTable[i].LowResExp.port[j] = 0xD4; + pViaModeTable->lcdTable[i].LowResExp.offset[j] = *pRom++; + pViaModeTable->lcdTable[i].LowResExp.data[j] = *pRom++; + } + pViaModeTable->lcdTable[i].LowResExp.numEntry = j; + + /* No. of Mxxx */ + numEntry = (numEntry - 8) / 2; + + /* Get MxxxCtr & MxxxExp Table */ + for (j = 0, m = 8; j < numEntry; j++, m++) { + pRom = pLCDTable + (m * 2); + pRom = pBIOS + *((CARD16 *)pRom); + + if (*pRom == 0xFF) { + k = 0; + } + else { + pViaModeTable->lcdTable[i].MCtr[j].LCDClk = *((CARD16 *)pRom); + pViaModeTable->lcdTable[i].MCtr[j].VClk = *((CARD16 *)(pRom+2)); + pRom += 4; + + pViaModeTable->lcdTable[i].MCtr[j].LCDClk_12Bit = *((CARD16 *)pRom); + pViaModeTable->lcdTable[i].MCtr[j].VClk_12Bit = *((CARD16 *)(pRom+2)); + pRom += 4; + + for (k = 0; *pRom != 0xFF; k++) { + /*pViaModeTable->lcdTable[i].MCtr[j].port[k] = *pRom++;*/ + pViaModeTable->lcdTable[i].MCtr[j].port[k] = 0xD4; + pViaModeTable->lcdTable[i].MCtr[j].offset[k] = *pRom++; + pViaModeTable->lcdTable[i].MCtr[j].data[k] = *pRom++; + } + } + pViaModeTable->lcdTable[i].MCtr[j].numEntry = k; + + m++; + pRom = pLCDTable + (m * 2); + pRom = pBIOS + *((CARD16 *)pRom); + + if (*pRom == 0xFF) { + k = 0; + } + else { + pViaModeTable->lcdTable[i].MExp[j].LCDClk = *((CARD16 *)pRom); + pViaModeTable->lcdTable[i].MExp[j].VClk = *((CARD16 *)(pRom+2)); + pRom += 4; + + pViaModeTable->lcdTable[i].MExp[j].LCDClk_12Bit = *((CARD16 *)pRom); + pViaModeTable->lcdTable[i].MExp[j].VClk_12Bit = *((CARD16 *)(pRom+2)); + pRom += 4; + + for (k = 0; *pRom != 0xFF; k++) { + /*pViaModeTable->lcdTable[i].MExp[j].port[k] = *pRom++;*/ + pViaModeTable->lcdTable[i].MExp[j].port[k] = 0xD4; + pViaModeTable->lcdTable[i].MExp[j].offset[k] = *pRom++; + pViaModeTable->lcdTable[i].MExp[j].data[k] = *pRom++; + } + } + pViaModeTable->lcdTable[i].MExp[j].numEntry = k; + } + + /* Point to Next Support Panel */ + pRom = pFPanel + tableSize; + pFPanel = pRom; + } + + /* Get start of PowerOn Seqence Table */ + if (VIAGetTVTabVer(pBIOSInfo, pBIOS) == 3) { + pRom = pTable + VIA_BIOS_LCDPOWERON_POS; + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "LCD_POWER_ON: %X\n", *((CARD16 *)pRom))); + pRom = pBIOS + *((CARD16 *)pRom); + } + else { + pRom = pTable + VIA_BIOS_LCDPOWERON_POS - 2; + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "LCD_POWER_ON: %X\n", *((CARD16 *)pRom))); + pRom = pBIOS + *((CARD16 *)pRom); + } + + for (i = 0; (*((CARD16 *)pRom)) != 0xFFFF; i++) { + if ((*pRom) == 0xFF) + pRom++; + + pViaModeTable->powerOn[i].powerSeq = *pRom++; + + pRom += 2; + + for (j = 0; *pRom != 0xFF; j++) { + switch (*pRom++) { + case ZCR: + pViaModeTable->powerOn[i].port[j] = 0xD4; + break; + case ZSR: + pViaModeTable->powerOn[i].port[j] = 0xC4; + break; + case ZGR: + pViaModeTable->powerOn[i].port[j] = 0xCE; + break; + default: + pViaModeTable->powerOn[i].port[j] = *pRom; + break; + } + /*pViaModeTable->powerOn[i].port[j] = *pRom++;*/ + pViaModeTable->powerOn[i].offset[j] = *pRom++; + pViaModeTable->powerOn[i].mask[j] = *pRom++; + pViaModeTable->powerOn[i].data[j] = *pRom++; + pViaModeTable->powerOn[i].delay[j] = *((CARD16 *)pRom); + pRom += 2; + } + + pViaModeTable->powerOn[i].numEntry = j; + } + + pViaModeTable->NumPowerOn = i; + + /* Get start of PowerOff Seqence Table */ + if (VIAGetTVTabVer(pBIOSInfo, pBIOS) == 3) { + pRom = pTable + VIA_BIOS_LCDPOWEROFF_POS; + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "LCD_POWER_OFF: %X\n", *((CARD16 *)pRom))); + pRom = pBIOS + *((CARD16 *)pRom); + } + else { + pRom = pTable + VIA_BIOS_LCDPOWEROFF_POS - 4; + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "LCD_POWER_OFF: %X\n", *((CARD16 *)pRom))); + pRom = pBIOS + *((CARD16 *)pRom); + } + + for (i = 0; (*((CARD16 *)pRom)) != 0xFFFF; i++) { + if ((*pRom) == 0xFF) + pRom++; + + pViaModeTable->powerOff[i].powerSeq = *pRom++; + + pRom += 2; + + for (j = 0; *pRom != 0xFF; j++) { + switch (*pRom++) { + case ZCR: + pViaModeTable->powerOff[i].port[j] = 0xD4; + break; + case ZSR: + pViaModeTable->powerOff[i].port[j] = 0xC4; + break; + case ZGR: + pViaModeTable->powerOff[i].port[j] = 0xCE; + break; + default: + pViaModeTable->powerOff[i].port[j] = *pRom; + break; + } + /*pViaModeTable->powerOff[i].port[j] = *pRom++;*/ + pViaModeTable->powerOff[i].offset[j] = *pRom++; + pViaModeTable->powerOff[i].mask[j] = *pRom++; + pViaModeTable->powerOff[i].data[j] = *pRom++; + pViaModeTable->powerOff[i].delay[j] = *((CARD16 *)pRom); + pRom += 2; + } + + pViaModeTable->powerOff[i].numEntry = j; + } + + pViaModeTable->NumPowerOff = i; + + /* Get start of Mode Fix Table */ + if (VIAGetTVTabVer(pBIOSInfo, pBIOS) == 3) { + pRom = pTable + VIA_BIOS_LCDMODEFIX_POS; + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "LCD_MODEFIX: %X\n", *((CARD16 *)pRom))); + pRom = pBIOS + *((CARD16 *)pRom); + } + else { + pRom = pTable + VIA_BIOS_LCDMODEFIX_POS - 4; + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "LCD_MODEFIX: %X\n", *((CARD16 *)pRom))); + pRom = pBIOS + *((CARD16 *)pRom); + } + + for (i = 0; *pRom != 0xFF; i++) { + pViaModeTable->modeFix.reqMode[i] = *pRom++; + pViaModeTable->modeFix.fixMode[i] = *pRom++; + } + + pViaModeTable->modeFix.numEntry = i; + + xf86Msg(X_DEFAULT, "VIAGetBIOSTable Done\n"); + +/* Create Mode Table Header File */ +#ifdef CREATE_MODETABLE_HEADERFILE + if (!VIACreateHeaderFile(pViaModeTable)) { + xfree(pBIOS); + xfree(pViaModeTable->BIOSDate); + xfree(pViaModeTable->Modes); + return FALSE; + } +#endif /* CREATE_MODETABLE_HEADERFILE */ + +#ifdef CREATE_TV2_HEADERFILE + if (VIAGetTVTabVer(pBIOSInfo, pBIOS) != 2) { + ErrorF("BIOS version is wrong!! There is no TV2+ table.\n"); + xfree(pBIOS); + xfree(pViaModeTable->BIOSDate); + xfree(pViaModeTable->Modes); + return FALSE; + } + else { + if (!VIACreateTV2(pViaModeTable)) { + xfree(pBIOS); + xfree(pViaModeTable->BIOSDate); + xfree(pViaModeTable->Modes); + return FALSE; + } + } +#endif /* CREATE_TV2_HEADERFILE */ + +#ifdef DBG_MODETABLE_FILE + VIAPrintModeTableFile(pViaModeTable, pBIOS); +#endif /* DBG_MODETABLE_FILE */ + + xfree(pBIOS); + return TRUE; +} + +static int +VIAFindSupportRefreshRate(VIABIOSInfoPtr pBIOSInfo, int resIndex) +{ + int bppIndex, refIndex; + int needRefresh; + const int *supRefTab; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIAFindSupportRefreshRate\n")); + bppIndex = 0; + supRefTab = NULL; + needRefresh = pBIOSInfo->Refresh; + + if (needRefresh <= supportRef[0]) { + refIndex = 0; + } + else if (needRefresh >= supportRef[VIA_NUM_REFRESH_RATE - 1]) { + refIndex = VIA_NUM_REFRESH_RATE - 1; + } + else { + for (refIndex = 0; refIndex < VIA_NUM_REFRESH_RATE; refIndex++) { + if (needRefresh < supportRef[refIndex + 1]) { + break; + } + } + } + + switch (pBIOSInfo->bitsPerPixel) { + case 8: + bppIndex = 0; + break; + case 16: + bppIndex = 1; + break; + case 24: + case 32: + bppIndex = 2; + break; + } + + switch (pBIOSInfo->MemClk) { + case VIA_MEM_SDR66: + case VIA_MEM_SDR100: + supRefTab = SDR100[bppIndex][resIndex]; + break; + case VIA_MEM_SDR133: + supRefTab = SDR133[bppIndex][resIndex]; + break; + case VIA_MEM_DDR200: + supRefTab = DDR200[bppIndex][resIndex]; + break; + case VIA_MEM_DDR266: + case VIA_MEM_DDR333: + case VIA_MEM_DDR400: + supRefTab = DDR266[bppIndex][resIndex]; + break; + } + + for ( ; refIndex >= 0; refIndex--) { + if (supRefTab[refIndex]) { + needRefresh = supportRef[refIndex]; + break; + } + } + + pBIOSInfo->FoundRefresh = needRefresh; + return refIndex; +} + +Bool +VIAFindModeUseBIOSTable(VIABIOSInfoPtr pBIOSInfo) +{ + VIABIOSInfoPtr pVia = pBIOSInfo; + VIAModeTablePtr pViaModeTable; + int refresh, maxRefresh, needRefresh, refreshMode; + int refIndex; + int i, j, k; + int modeNum, tmp; + Bool setVirtual = FALSE; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIAFindModeUseBIOSTable\n")); + pViaModeTable = pBIOSInfo->pModeTable; + + i = 0; + j = VIA_RES_INVALID; + + /* detemine support highest resolution by Memory clk */ + VGAOUT8(0x3D4, 0x3D); + pBIOSInfo->MemClk = (VGAIN8(0x3D5) & 0xF0) >> 4; + if ((pBIOSInfo->bitsPerPixel > 16) && (pBIOSInfo->HDisplay == 1600) && + (pBIOSInfo->VDisplay == 1200) && (pBIOSInfo->MemClk < VIA_MEM_DDR266)) { + ErrorF("\n1600x1200 True Color only support in MEMCLK higher than DDR266 platform!!\n"); + ErrorF("Please use lower bpp or resolution.\n"); + return FALSE; + } + + if ((pBIOSInfo->ActiveDevice & VIA_DEVICE_DFP) && (pBIOSInfo->PanelSize == VIA_PANEL_INVALID)) { + VIAGetPanelInfo(pBIOSInfo); + } + + pBIOSInfo->UserSetting->DefaultSetting = FALSE; + + if (!pBIOSInfo->ActiveDevice) { + pBIOSInfo->ActiveDevice = VIAGetDeviceDetect(pBIOSInfo); + } + /* TV + LCD/DVI has no simultaneous, block it */ + if ((pBIOSInfo->ActiveDevice & VIA_DEVICE_TV) + && (pBIOSInfo->ActiveDevice & (VIA_DEVICE_LCD | VIA_DEVICE_DFP))) { + pBIOSInfo->ActiveDevice = VIA_DEVICE_TV; + } + + if ((pBIOSInfo->ActiveDevice & VIA_DEVICE_TV) && + (pBIOSInfo->CrtcHDisplay > 1024) && ( + (pBIOSInfo->TVEncoder == VIA_TV3) || + (pBIOSInfo->TVEncoder == VIA_VT1622A) || + (pBIOSInfo->TVEncoder == VIA_CH7019) || + (pBIOSInfo->TVEncoder == VIA_SAA7108) || + (pBIOSInfo->TVEncoder == VIA_FS454))) { + for (i = 0; i < pViaModeTable->NumModes; i++) { + if ((pViaModeTable->Modes[i].Bpp == pBIOSInfo->bitsPerPixel) && + (pViaModeTable->Modes[i].Width == 1024) && + (pViaModeTable->Modes[i].Height == 768)) + break; + } + + if (i == pViaModeTable->NumModes) { + ErrorF("\nVIASetModeUseBIOSTable: Cannot find suitable mode!!\n"); + ErrorF("Mode setting in XF86Config(-4) is not supported!!\n"); + return FALSE; + } + + j = VIA_RES_1024X768; + pBIOSInfo->frameX1 = 1023; + pBIOSInfo->frameY1 = 767; + pBIOSInfo->HDisplay = 1024; + pBIOSInfo->VDisplay = 768; + pBIOSInfo->CrtcHDisplay = 1024; + pBIOSInfo->CrtcVDisplay = 768; + } + else if ((pBIOSInfo->ActiveDevice & VIA_DEVICE_TV) && (pBIOSInfo->CrtcHDisplay > 800) + && (pBIOSInfo->TVEncoder == VIA_TV2PLUS)) { + for (i = 0; i < pViaModeTable->NumModes; i++) { + if ((pViaModeTable->Modes[i].Bpp == pBIOSInfo->bitsPerPixel) && + (pViaModeTable->Modes[i].Width == 800) && + (pViaModeTable->Modes[i].Height == 600)) + break; + } + + if (i == pViaModeTable->NumModes) { + ErrorF("\nVIASetModeUseBIOSTable: Cannot find suitable mode!!\n"); + ErrorF("Mode setting in XF86Config(-4) is not supported!!\n"); + return FALSE; + } + + j = VIA_RES_800X600; + pBIOSInfo->frameX1 = 799; + pBIOSInfo->frameY1 = 599; + pBIOSInfo->HDisplay = 800; + pBIOSInfo->VDisplay = 600; + pBIOSInfo->CrtcHDisplay = 800; + pBIOSInfo->CrtcVDisplay = 600; + } + else { + for (i = 0; i < pViaModeTable->NumModes; i++) { + if ((pViaModeTable->Modes[i].Bpp == pBIOSInfo->bitsPerPixel) && + (pViaModeTable->Modes[i].Width == pBIOSInfo->CrtcHDisplay) && + (pViaModeTable->Modes[i].Height == pBIOSInfo->CrtcVDisplay)) + break; + } + + if (i == pViaModeTable->NumModes) { + ErrorF("\nVIASetModeUseBIOSTable: Cannot find suitable mode!!\n"); + ErrorF("Mode setting in XF86Config(-4) is not supported!!\n"); + return FALSE; + } + + modeNum = (int)pViaModeTable->Modes[i].Mode; + + if (pBIOSInfo->ActiveDevice & (VIA_DEVICE_DFP | VIA_DEVICE_LCD)) { + switch (pBIOSInfo->PanelSize) { + case VIA_PANEL6X4: + pBIOSInfo->panelX = 640; + pBIOSInfo->panelY = 480; + j = VIA_RES_640X480; + break; + case VIA_PANEL8X6: + pBIOSInfo->panelX = 800; + pBIOSInfo->panelY = 600; + j = VIA_RES_800X600; + break; + case VIA_PANEL10X7: + pBIOSInfo->panelX = 1024; + pBIOSInfo->panelY = 768; + j = VIA_RES_1024X768; + break; + case VIA_PANEL12X7: + pBIOSInfo->panelX = 1280; + pBIOSInfo->panelY = 768; + j = VIA_RES_1280X768; + break; + case VIA_PANEL12X10: + pBIOSInfo->panelX = 1280; + pBIOSInfo->panelY = 1024; + j = VIA_RES_1280X1024; + break; + case VIA_PANEL14X10: + pBIOSInfo->panelX = 1400; + pBIOSInfo->panelY = 1050; + j = VIA_RES_1400X1050; + break; + case VIA_PANEL16X12: + pBIOSInfo->panelX = 1600; + pBIOSInfo->panelY = 1200; + j = VIA_RES_1600X1200; + break; + default: + pBIOSInfo->PanelSize = VIA_PANEL10X7; + pBIOSInfo->panelX = 1024; + pBIOSInfo->panelY = 768; + j = VIA_RES_1024X768; + break; + } + + /* Find Panel Size Index */ + for (k = 0; k < VIA_BIOS_NUM_PANEL; k++) { + if (pViaModeTable->lcdTable[k].fpSize == pBIOSInfo->PanelSize) + break; + }; + + tmp = 0x1; + tmp = tmp << (modeNum & 0xF); + if ((CARD16)(tmp) & + pViaModeTable->lcdTable[k].SuptMode[(modeNum >> 4)]) { + } + else { + if ((pBIOSInfo->CrtcHDisplay > pBIOSInfo->panelX) && + (pBIOSInfo->CrtcVDisplay > pBIOSInfo->panelY)) { + setVirtual = TRUE; + pBIOSInfo->frameX1 = pBIOSInfo->panelX - 1; + pBIOSInfo->frameY1 = pBIOSInfo->panelY - 1; + pBIOSInfo->HDisplay = pBIOSInfo->panelX; + pBIOSInfo->VDisplay = pBIOSInfo->panelY; + pBIOSInfo->CrtcHDisplay = pBIOSInfo->panelX; + pBIOSInfo->CrtcVDisplay = pBIOSInfo->panelY; + } + else { + pBIOSInfo->DVIAttach = FALSE; + pBIOSInfo->scaleY = FALSE; + pBIOSInfo->panelX = 0; + pBIOSInfo->panelY = 0; + } + } + } + + if (setVirtual) { + for (i = 0; i < pViaModeTable->NumModes; i++) { + if ((pViaModeTable->Modes[i].Bpp == pBIOSInfo->bitsPerPixel) && + (pViaModeTable->Modes[i].Width == pBIOSInfo->HDisplay) && + (pViaModeTable->Modes[i].Height == pBIOSInfo->VDisplay)) + break; + } + + if (i == pViaModeTable->NumModes) { + ErrorF("\nVIASetModeUseBIOSTable: Cannot find suitable mode!!\n"); + ErrorF("Mode setting in XF86Config(-4) is not supported!!\n"); + return FALSE; + } + } + + switch (pBIOSInfo->CrtcVDisplay) { + case 480: + switch (pBIOSInfo->CrtcHDisplay) { + case 640: + j = VIA_RES_640X480; + break; + case 720: + j = VIA_RES_720X480; + break; + case 848: + j = VIA_RES_848X480; + break; + case 856: + j = VIA_RES_856X480; + break; + default: + break; + } + break; + case 512: + j = VIA_RES_1024X512; + break; + case 576: + switch (pBIOSInfo->CrtcHDisplay) { + case 720: + j = VIA_RES_720X576; + break; + case 1024: + j = VIA_RES_1024X576; + break; + default: + break; + } + break; + case 600: + j = VIA_RES_800X600; + break; + case 768: + switch (pBIOSInfo->CrtcHDisplay) { + case 1024: + j = VIA_RES_1024X768; + break; + case 1280: + j = VIA_RES_1280X768; + break; + default: + break; + } + break; + case 864: + j = VIA_RES_1152X864; + break; + case 960: + j = VIA_RES_1280X960; + break; + case 1024: + j = VIA_RES_1280X1024; + break; + case 1050: + switch (pBIOSInfo->CrtcHDisplay) { + case 1440: + j = VIA_RES_1440X1050; + break; + case 1400: + j = VIA_RES_1400X1050; + break; + default: + break; + } + break; + case 1200: + j = VIA_RES_1600X1200; + break; + default: + j = VIA_RES_INVALID; + break; + } + } + + k = 0; + + if (j != VIA_RES_INVALID) { + if (pBIOSInfo->OptRefresh) { + pBIOSInfo->Refresh = pBIOSInfo->OptRefresh; + refIndex = VIAFindSupportRefreshRate(pBIOSInfo, j); + needRefresh = pBIOSInfo->FoundRefresh; + if (refIndex < 0) { + xf86DrvMsg(pBIOSInfo->scrnIndex, X_ERROR, "Mode setting in XF86Config(-4) is not supported!!\n"); + xf86DrvMsg(pBIOSInfo->scrnIndex, X_ERROR, "Please use lower bpp or resolution.\n"); + return FALSE; + } + } + else { + /* use the monitor information */ + /* needRefresh = (pBIOSInfo->Clock * 1000) / (pBIOSInfo->HTotal * pBIOSInfo->VTotal); */ + /* Do rounding */ + needRefresh = ((pBIOSInfo->Clock * 10000) / (pBIOSInfo->HTotal * pBIOSInfo->VTotal) + 5) / 10; + pBIOSInfo->Refresh = needRefresh; + refIndex = VIAFindSupportRefreshRate(pBIOSInfo, j); + needRefresh = pBIOSInfo->FoundRefresh; + if (refIndex < 0) { + xf86DrvMsg(pBIOSInfo->scrnIndex, X_ERROR, "Mode setting in XF86Config(-4) is not supported!!\n"); + xf86DrvMsg(pBIOSInfo->scrnIndex, X_ERROR, "Please use lower bpp or resolution.\n"); + return FALSE; + } + } + + refreshMode = 0xFF; + maxRefresh = 0; + + while (pViaModeTable->refreshTable[j][k].refresh != 0x0) { + refresh = pViaModeTable->refreshTable[j][k].refresh; + if (refresh != 0xFF) { + if ((refresh <= needRefresh) && (refresh > maxRefresh)) { + refreshMode = k; + maxRefresh = refresh; + } + } + k++; + } + + if ((refreshMode == 0xFF) && (needRefresh < 60)) { + xf86DrvMsg(pBIOSInfo->scrnIndex, X_ERROR, "VIASetModeUseBIOSTable: Cannot Find suitable refresh!!\n"); + return FALSE; + } + + k = refreshMode; + } + + pBIOSInfo->mode = i; + pBIOSInfo->resMode = j; + pBIOSInfo->refresh = k; + /* pBIOSInfo->widthByQWord = (pBIOSInfo->displayWidth * (pBIOSInfo->bitsPerPixel >> 3)) >> 3; */ + pBIOSInfo->offsetWidthByQWord = (pBIOSInfo->displayWidth * (pBIOSInfo->bitsPerPixel >> 3)) >> 3; + pBIOSInfo->countWidthByQWord = (pBIOSInfo->CrtcHDisplay * (pBIOSInfo->bitsPerPixel >> 3)) >> 3; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "pBISOInfo->FoundRefresh: %d\n", pBIOSInfo->FoundRefresh)); + return TRUE; +} + +static void +VIASetLCDMode(VIABIOSInfoPtr pBIOSInfo) +{ + VIABIOSInfoPtr pVia = pBIOSInfo; + VIAModeTablePtr pViaModeTable = pBIOSInfo->pModeTable; + CARD8 modeNum, tmp; + int resIdx; + int port, offset, data; + int resMode = pBIOSInfo->resMode; + int i, j, k, misc; + + + modeNum = (CARD8)(pViaModeTable->Modes[pBIOSInfo->mode].Mode); + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIASetLCDMode\n")); + /* Panel Size 1600x1200 Not Supported Now*/ + if (pBIOSInfo->PanelSize == VIA_PANEL16X12) { + xfree(pViaModeTable->BIOSDate); + xfree(pViaModeTable->Modes); + xf86DrvMsg(pBIOSInfo->scrnIndex, X_ERROR, "VIASetModeUseBIOSTable: Panel Size Not Support!!\n"); + } + + /* Find Panel Size Index */ + for (i = 0; i < VIA_BIOS_NUM_PANEL; i++) { + if (pViaModeTable->lcdTable[i].fpSize == pBIOSInfo->PanelSize) + break; + }; + + if (i == VIA_BIOS_NUM_PANEL) { + xfree(pViaModeTable->BIOSDate); + xfree(pViaModeTable->Modes); + xf86DrvMsg(pBIOSInfo->scrnIndex, X_ERROR, "VIASetModeUseBIOSTable: Panel Size Not Support!!\n"); + } + + if (pBIOSInfo->PanelSize == VIA_PANEL12X10) { + VGAOUT8(0x3d4, 0x89); + VGAOUT8(0x3d5, 0x07); + } + + /* LCD Expand Mode Y Scale Flag */ + pBIOSInfo->scaleY = FALSE; + + /* Set LCD InitTb Regs */ + + /* Set LClk */ + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp & 0x7F); + + if (pBIOSInfo->BusWidth == VIA_DI_12BIT) { + VGAOUT8(0x3c4, 0x44); + VGAOUT8(0x3c5, (pViaModeTable->lcdTable[i].InitTb.LCDClk_12Bit >> 8)); + VGAOUT8(0x3c4, 0x45); + VGAOUT8(0x3c5, (pViaModeTable->lcdTable[i].InitTb.LCDClk_12Bit & 0xFF)); + } + else { + VGAOUT8(0x3c4, 0x44); + VGAOUT8(0x3c5, (pViaModeTable->lcdTable[i].InitTb.LCDClk >> 8)); + VGAOUT8(0x3c4, 0x45); + VGAOUT8(0x3c5, (pViaModeTable->lcdTable[i].InitTb.LCDClk & 0xFF)); + } + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x80); + + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp | 0x04); + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp & 0xFB); + + if (!pBIOSInfo->IsSecondary) { + /* Set VClk */ + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp & 0x7F); + + if (pBIOSInfo->BusWidth == VIA_DI_12BIT) { + VGAOUT8(0x3c4, 0x46); + VGAOUT8(0x3c5, (pViaModeTable->lcdTable[i].InitTb.VClk_12Bit >> 8)); + VGAOUT8(0x3c4, 0x47); + VGAOUT8(0x3c5, (pViaModeTable->lcdTable[i].InitTb.VClk_12Bit & 0xFF)); + } + else { + VGAOUT8(0x3c4, 0x46); + VGAOUT8(0x3c5, (pViaModeTable->lcdTable[i].InitTb.VClk >> 8)); + VGAOUT8(0x3c4, 0x47); + VGAOUT8(0x3c5, (pViaModeTable->lcdTable[i].InitTb.VClk & 0xFF)); + } + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x80); + + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp | 0x02); + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp & 0xFD); + } + + /* Use external clock */ + data = VGAIN8(0x3cc) | 0x0C; + VGAOUT8(0x3c2, data); + + for (j = 0; + j < pViaModeTable->lcdTable[i].InitTb.numEntry; + j++) + { + port = pViaModeTable->lcdTable[i].InitTb.port[j]; + offset = pViaModeTable->lcdTable[i].InitTb.offset[j]; + data = pViaModeTable->lcdTable[i].InitTb.data[j]; + VGAOUT8(0x300+port, offset); + VGAOUT8(0x301+port, data); + } + + if ((pBIOSInfo->CrtcHDisplay == pBIOSInfo->panelX) && + (pBIOSInfo->CrtcVDisplay == pBIOSInfo->panelY)) { + /* Set LClk */ + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp & 0x7F); + + if (pBIOSInfo->BusWidth == VIA_DI_12BIT) { + VGAOUT8(0x3c4, 0x44); + VGAOUT8(0x3c5, (pViaModeTable->lcdTable[i].InitTb.LCDClk_12Bit >> 8)); + VGAOUT8(0x3c4, 0x45); + VGAOUT8(0x3c5, (pViaModeTable->lcdTable[i].InitTb.LCDClk_12Bit & 0xFF)); + } + else { + VGAOUT8(0x3c4, 0x44); + VGAOUT8(0x3c5, (pViaModeTable->lcdTable[i].InitTb.LCDClk >> 8)); + VGAOUT8(0x3c4, 0x45); + VGAOUT8(0x3c5, (pViaModeTable->lcdTable[i].InitTb.LCDClk & 0xFF)); + } + + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x80); + + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp | 0x04); + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp & 0xFB); + + if (!pBIOSInfo->IsSecondary) { + /* Set VClk */ + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp & 0x7F); + + if (pBIOSInfo->BusWidth == VIA_DI_12BIT) { + VGAOUT8(0x3c4, 0x46); + VGAOUT8(0x3c5, (pViaModeTable->lcdTable[i].InitTb.VClk_12Bit >> 8)); + VGAOUT8(0x3c4, 0x47); + VGAOUT8(0x3c5, (pViaModeTable->lcdTable[i].InitTb.VClk_12Bit & 0xFF)); + } + else { + VGAOUT8(0x3c4, 0x46); + VGAOUT8(0x3c5, (pViaModeTable->lcdTable[i].InitTb.VClk >> 8)); + VGAOUT8(0x3c4, 0x47); + VGAOUT8(0x3c5, (pViaModeTable->lcdTable[i].InitTb.VClk & 0xFF)); + } + + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x80); + + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp | 0x02); + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp & 0xFD); + } + + /* Use external clock */ + data = VGAIN8(0x3cc) | 0x0C; + VGAOUT8(0x3c2, data); + } + else { + if (!(pBIOSInfo->Center)) { + /* LCD Expand Mode Y Scale Flag */ + pBIOSInfo->scaleY = TRUE; + } + + resIdx = VIA_RES_INVALID; + + /* Find MxxxCtr & MxxxExp Index and + * HWCursor Y Scale (PanelSize Y / Res. Y) */ + pBIOSInfo->resY = pBIOSInfo->CrtcVDisplay; + switch (resMode) { + case VIA_RES_640X480: + resIdx = 0; + break; + case VIA_RES_800X600: + resIdx = 1; + break; + case VIA_RES_1024X768: + resIdx = 2; + break; + case VIA_RES_1152X864: + resIdx = 3; + break; + case VIA_RES_1280X768: + case VIA_RES_1280X960: + case VIA_RES_1280X1024: + if (pBIOSInfo->PanelSize == VIA_PANEL12X10) + resIdx = VIA_RES_INVALID; + else + resIdx = 4; + break; + default: + resIdx = VIA_RES_INVALID; + break; + } + + if ((pBIOSInfo->CrtcHDisplay == 640) && + (pBIOSInfo->CrtcVDisplay == 400)) + resIdx = 0; + + if (pBIOSInfo->Center) { + if (resIdx != VIA_RES_INVALID) { + /* Set LCD MxxxCtr Regs */ + for (j = 0; + j < pViaModeTable->lcdTable[i].MCtr[resIdx].numEntry; + j++) + { + port = pViaModeTable->lcdTable[i].MCtr[resIdx].port[j]; + offset = pViaModeTable->lcdTable[i].MCtr[resIdx].offset[j]; + data = pViaModeTable->lcdTable[i].MCtr[resIdx].data[j]; + VGAOUT8(0x300+port, offset); + VGAOUT8(0x301+port, data); + } + + /* Set LClk */ + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp & 0x7F); + + if (pBIOSInfo->BusWidth == VIA_DI_12BIT) { + VGAOUT8(0x3c4, 0x44); + VGAOUT8(0x3c5, + (pViaModeTable->lcdTable[i].MCtr[resIdx].LCDClk_12Bit >> 8)); + VGAOUT8(0x3c4, 0x45); + VGAOUT8(0x3c5, + (pViaModeTable->lcdTable[i].MCtr[resIdx].LCDClk_12Bit & 0xFF)); + } + else { + VGAOUT8(0x3c4, 0x44); + VGAOUT8(0x3c5, + (pViaModeTable->lcdTable[i].MCtr[resIdx].LCDClk >> 8)); + VGAOUT8(0x3c4, 0x45); + VGAOUT8(0x3c5, + (pViaModeTable->lcdTable[i].MCtr[resIdx].LCDClk & 0xFF)); + } + + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x80); + + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp | 0x04); + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp & 0xFB); + + if (!pBIOSInfo->IsSecondary) { + /* Set VClk */ + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp & 0x7F); + + if (pBIOSInfo->BusWidth == VIA_DI_12BIT) { + VGAOUT8(0x3c4, 0x46); + VGAOUT8(0x3c5, + (pViaModeTable->lcdTable[i].MCtr[resIdx].VClk_12Bit >> 8)); + VGAOUT8(0x3c4, 0x47); + VGAOUT8(0x3c5, + (pViaModeTable->lcdTable[i].MCtr[resIdx].VClk_12Bit & 0xFF)); + } + else { + VGAOUT8(0x3c4, 0x46); + VGAOUT8(0x3c5, + (pViaModeTable->lcdTable[i].MCtr[resIdx].VClk >> 8)); + VGAOUT8(0x3c4, 0x47); + VGAOUT8(0x3c5, + (pViaModeTable->lcdTable[i].MCtr[resIdx].VClk & 0xFF)); + } + + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x80); + + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp | 0x02); + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp & 0xFD); + } + } + + for (j = 0; j < pViaModeTable->modeFix.numEntry; j++) { + if (pViaModeTable->modeFix.reqMode[j] == modeNum) { + modeNum = pViaModeTable->modeFix.fixMode[j]; + break; + } + } + + for (j = 0; j < pViaModeTable->lcdTable[i].numMPatchDP2Ctr; j++) { + if (pViaModeTable->lcdTable[i].MPatchDP2Ctr[j].Mode == modeNum) + break; + } + + if (j != pViaModeTable->lcdTable[i].numMPatchDP2Ctr) { + /* Set LCD MPatchDP2Ctr Regs */ + for (k = 0; + k < pViaModeTable->lcdTable[i].MPatchDP2Ctr[j].numEntry; + k++) + { + port = pViaModeTable->lcdTable[i].MPatchDP2Ctr[j].port[k]; + offset = pViaModeTable->lcdTable[i].MPatchDP2Ctr[j].offset[k]; + data = pViaModeTable->lcdTable[i].MPatchDP2Ctr[j].data[k]; + VGAOUT8(0x300+port, offset); + VGAOUT8(0x301+port, data); + } + + /* Set LClk */ + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp & 0x7F); + + if (pBIOSInfo->BusWidth == VIA_DI_12BIT) { + VGAOUT8(0x3c4, 0x44); + VGAOUT8(0x3c5, + (pViaModeTable->lcdTable[i].MPatchDP2Ctr[j].LCDClk_12Bit >> 8)); + VGAOUT8(0x3c4, 0x45); + VGAOUT8(0x3c5, + (pViaModeTable->lcdTable[i].MPatchDP2Ctr[j].LCDClk_12Bit & 0xFF)); + } + else { + VGAOUT8(0x3c4, 0x44); + VGAOUT8(0x3c5, + (pViaModeTable->lcdTable[i].MPatchDP2Ctr[j].LCDClk >> 8)); + VGAOUT8(0x3c4, 0x45); + VGAOUT8(0x3c5, + (pViaModeTable->lcdTable[i].MPatchDP2Ctr[j].LCDClk & 0xFF)); + } + + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x80); + + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp | 0x04); + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp & 0xFB); + + if (!pBIOSInfo->IsSecondary) { + /* Set VClk */ + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp & 0x7F); + + if (pBIOSInfo->BusWidth == VIA_DI_12BIT) { + VGAOUT8(0x3c4, 0x46); + VGAOUT8(0x3c5, + (pViaModeTable->lcdTable[i].MPatchDP2Ctr[j].VClk_12Bit >> 8)); + VGAOUT8(0x3c4, 0x47); + VGAOUT8(0x3c5, + (pViaModeTable->lcdTable[i].MPatchDP2Ctr[j].VClk_12Bit & 0xFF)); + } + else { + VGAOUT8(0x3c4, 0x46); + VGAOUT8(0x3c5, + (pViaModeTable->lcdTable[i].MPatchDP2Ctr[j].VClk >> 8)); + VGAOUT8(0x3c4, 0x47); + VGAOUT8(0x3c5, + (pViaModeTable->lcdTable[i].MPatchDP2Ctr[j].VClk & 0xFF)); + } + + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x80); + + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp | 0x02); + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp & 0xFD); + } + } + + for (j = 0; j < pViaModeTable->lcdTable[i].numMPatchDP1Ctr; j++) { + if (pViaModeTable->lcdTable[i].MPatchDP1Ctr[j].Mode == modeNum) + break; + } + + if ((j != pViaModeTable->lcdTable[i].numMPatchDP1Ctr) && + pBIOSInfo->IsSecondary) { + /* Set LCD MPatchDP1Ctr Regs */ + for (k = 0; + k < pViaModeTable->lcdTable[i].MPatchDP1Ctr[j].numEntry; + k++) + { + port = pViaModeTable->lcdTable[i].MPatchDP1Ctr[j].port[k]; + offset = pViaModeTable->lcdTable[i].MPatchDP1Ctr[j].offset[k]; + data = pViaModeTable->lcdTable[i].MPatchDP1Ctr[j].data[k]; + VGAOUT8(0x300+port, offset); + VGAOUT8(0x301+port, data); + } + } + + /* Use external clock */ + data = VGAIN8(0x3cc) | 0x0C; + VGAOUT8(0x3c2, data); + + } + else { + if (resIdx != VIA_RES_INVALID) { + /* Set LCD MxxxExp Regs */ + for (j = 0; + j < pViaModeTable->lcdTable[i].MExp[resIdx].numEntry; + j++) + { + port = pViaModeTable->lcdTable[i].MExp[resIdx].port[j]; + offset = pViaModeTable->lcdTable[i].MExp[resIdx].offset[j]; + data = pViaModeTable->lcdTable[i].MExp[resIdx].data[j]; + VGAOUT8(0x300+port, offset); + VGAOUT8(0x301+port, data); + } + + /* Set LClk */ + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp & 0x7F); + + if (pBIOSInfo->BusWidth == VIA_DI_12BIT) { + VGAOUT8(0x3c4, 0x44); + VGAOUT8(0x3c5, + (pViaModeTable->lcdTable[i].MExp[resIdx].LCDClk_12Bit >> 8)); + VGAOUT8(0x3c4, 0x45); + VGAOUT8(0x3c5, + (pViaModeTable->lcdTable[i].MExp[resIdx].LCDClk_12Bit & 0xFF)); + } + else { + VGAOUT8(0x3c4, 0x44); + VGAOUT8(0x3c5, + (pViaModeTable->lcdTable[i].MExp[resIdx].LCDClk >> 8)); + VGAOUT8(0x3c4, 0x45); + VGAOUT8(0x3c5, + (pViaModeTable->lcdTable[i].MExp[resIdx].LCDClk & 0xFF)); + } + + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x80); + + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp | 0x04); + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp & 0xFB); + + if (!pBIOSInfo->IsSecondary) { + /* Set VClk */ + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp & 0x7F); + + if (pBIOSInfo->BusWidth == VIA_DI_12BIT) { + VGAOUT8(0x3c4, 0x46); + VGAOUT8(0x3c5, + (pViaModeTable->lcdTable[i].MExp[resIdx].VClk_12Bit >> 8)); + VGAOUT8(0x3c4, 0x47); + VGAOUT8(0x3c5, + (pViaModeTable->lcdTable[i].MExp[resIdx].VClk_12Bit & 0xFF)); + } + else { + VGAOUT8(0x3c4, 0x46); + VGAOUT8(0x3c5, + (pViaModeTable->lcdTable[i].MExp[resIdx].VClk >> 8)); + VGAOUT8(0x3c4, 0x47); + VGAOUT8(0x3c5, + (pViaModeTable->lcdTable[i].MExp[resIdx].VClk & 0xFF)); + } + + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x80); + + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp | 0x02); + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp & 0xFD); + } + } + + for (j = 0; j < pViaModeTable->modeFix.numEntry; j++) { + if (pViaModeTable->modeFix.reqMode[j] == modeNum) { + modeNum = pViaModeTable->modeFix.fixMode[j]; + break; + } + } + + for (j = 0; j < pViaModeTable->lcdTable[i].numMPatchDP2Exp; j++) { + if (pViaModeTable->lcdTable[i].MPatchDP2Exp[j].Mode == modeNum) + break; + } + + if (j != pViaModeTable->lcdTable[i].numMPatchDP2Exp) { + if (pBIOSInfo->CrtcHDisplay == pBIOSInfo->panelX) + pBIOSInfo->scaleY = FALSE; + /* Set LCD MPatchExp Regs */ + for (k = 0; + k < pViaModeTable->lcdTable[i].MPatchDP2Exp[j].numEntry; + k++) + { + port = pViaModeTable->lcdTable[i].MPatchDP2Exp[j].port[k]; + offset = pViaModeTable->lcdTable[i].MPatchDP2Exp[j].offset[k]; + data = pViaModeTable->lcdTable[i].MPatchDP2Exp[j].data[k]; + VGAOUT8(0x300+port, offset); + VGAOUT8(0x301+port, data); + } + + /* Set LClk */ + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp & 0x7F); + + if (pBIOSInfo->BusWidth == VIA_DI_12BIT) { + VGAOUT8(0x3c4, 0x44); + VGAOUT8(0x3c5, + (pViaModeTable->lcdTable[i].MPatchDP2Exp[j].LCDClk_12Bit >> 8)); + VGAOUT8(0x3c4, 0x45); + VGAOUT8(0x3c5, + (pViaModeTable->lcdTable[i].MPatchDP2Exp[j].LCDClk_12Bit & 0xFF)); + } + else { + VGAOUT8(0x3c4, 0x44); + VGAOUT8(0x3c5, + (pViaModeTable->lcdTable[i].MPatchDP2Exp[j].LCDClk >> 8)); + VGAOUT8(0x3c4, 0x45); + VGAOUT8(0x3c5, + (pViaModeTable->lcdTable[i].MPatchDP2Exp[j].LCDClk & 0xFF)); + } + + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x80); + + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp | 0x04); + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp & 0xFB); + + if (!pBIOSInfo->IsSecondary) { + /* Set VClk */ + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp & 0x7F); + + if (pBIOSInfo->BusWidth == VIA_DI_12BIT) { + VGAOUT8(0x3c4, 0x46); + VGAOUT8(0x3c5, + (pViaModeTable->lcdTable[i].MPatchDP2Exp[j].VClk_12Bit >> 8)); + VGAOUT8(0x3c4, 0x47); + VGAOUT8(0x3c5, + (pViaModeTable->lcdTable[i].MPatchDP2Exp[j].VClk_12Bit & 0xFF)); + } + else { + VGAOUT8(0x3c4, 0x46); + VGAOUT8(0x3c5, + (pViaModeTable->lcdTable[i].MPatchDP2Exp[j].VClk >> 8)); + VGAOUT8(0x3c4, 0x47); + VGAOUT8(0x3c5, + (pViaModeTable->lcdTable[i].MPatchDP2Exp[j].VClk & 0xFF)); + } + + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x80); + + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp | 0x02); + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp & 0xFD); + } + } + + for (j = 0; j < pViaModeTable->lcdTable[i].numMPatchDP1Exp; j++) { + if (pViaModeTable->lcdTable[i].MPatchDP1Exp[j].Mode == modeNum) + break; + } + + if ((j != pViaModeTable->lcdTable[i].numMPatchDP1Exp) && + pBIOSInfo->IsSecondary) { + /* Set LCD MPatchDP1Ctr Regs */ + for (k = 0; + k < pViaModeTable->lcdTable[i].MPatchDP1Exp[j].numEntry; + k++) + { + port = pViaModeTable->lcdTable[i].MPatchDP1Exp[j].port[k]; + offset = pViaModeTable->lcdTable[i].MPatchDP1Exp[j].offset[k]; + data = pViaModeTable->lcdTable[i].MPatchDP1Exp[j].data[k]; + VGAOUT8(0x300+port, offset); + VGAOUT8(0x301+port, data); + } + } + + /* Use external clock */ + data = VGAIN8(0x3cc) | 0x0C; + VGAOUT8(0x3c2, data); + } + } + + /* LCD patch 3D5.02 */ + VGAOUT8(0x3d4, 0x01); + misc = VGAIN8(0x3d5); + VGAOUT8(0x3d4, 0x02); + VGAOUT8(0x3d5, misc); + + /* Enable LCD */ + if (!pBIOSInfo->IsSecondary) { + /* CRT Display Source Bit 6 - 0: CRT, 1: LCD */ + VGAOUT8(0x3c4, 0x16); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp | 0x40); + + /* Enable Simultaneous */ + if (pBIOSInfo->BusWidth == VIA_DI_12BIT) { + VGAOUT8(0x3d4, 0x6B); + VGAOUT8(0x3d5, 0xA8); + if (pBIOSInfo->Chipset == VIA_CLE266 && pBIOSInfo->ChipRev < 15) { + VGAOUT8(0x3d4, 0x93); + VGAOUT8(0x3d5, 0xB1); + } + else { + VGAOUT8(0x3d4, 0x93); + VGAOUT8(0x3d5, 0xAF); + } + } + else { + VGAOUT8(0x3d4, 0x6B); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x08); + VGAOUT8(0x3d4, 0x93); + VGAOUT8(0x3d5, 0x0); + } + VGAOUT8(0x3d4, 0x6A); + VGAOUT8(0x3d5, 0x48); + } + else { + /* CRT Display Source Bit 6 - 0: CRT, 1: LCD */ + VGAOUT8(0x3c4, 0x16); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp & ~0x40); + + /* Enable SAMM */ + if (pBIOSInfo->BusWidth == VIA_DI_12BIT) { + VGAOUT8(0x3d4, 0x6B); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x20); + if (pBIOSInfo->Chipset == VIA_CLE266 && pBIOSInfo->ChipRev < 15) { + VGAOUT8(0x3d4, 0x93); + VGAOUT8(0x3d5, 0xB1); + } + else { + VGAOUT8(0x3d4, 0x93); + VGAOUT8(0x3d5, 0xAF); + } + } + else { + VGAOUT8(0x3d4, 0x6B); + VGAOUT8(0x3d5, 0); + VGAOUT8(0x3d4, 0x93); + VGAOUT8(0x3d5, 0x0); + } + VGAOUT8(0x3d4, 0x6A); + VGAOUT8(0x3d5, 0xC8); + } +} + +void +VIAPreSetTV2Mode(VIABIOSInfoPtr pBIOSInfo) +{ + VIAModeTablePtr pViaModeTable = pBIOSInfo->pModeTable; + CARD8 *TV; + CARD16 *DotCrawl, *Patch2; + unsigned int tvIndx = pBIOSInfo->resTVMode; + int i, j; + unsigned char W_Buffer[VIA_BIOS_MAX_NUM_TV_REG+1]; + unsigned char W_Other[2]; + int w_bytes; + I2CDevPtr dev; + unsigned char R_Buffer[1]; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIAPreSetTV2Mode\n")); + TV = NULL; + DotCrawl = NULL; + Patch2 = NULL; + W_Buffer[0] = 0; + for (i = 0; i < VIA_BIOS_MAX_NUM_TV_REG; i++) { + W_Buffer[i+1] = pBIOSInfo->TVRegs[i]; + } + + if (pBIOSInfo->TVType == TVTYPE_PAL) { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + Patch2 = pViaModeTable->tv2Table[tvIndx].PatchPAL2; + if (pBIOSInfo->TVOutput == TVOUTPUT_COMPOSITE) + TV = pViaModeTable->tv2Table[tvIndx].TVPALC; + else + TV = pViaModeTable->tv2Table[tvIndx].TVPALS; + break; + case VIA_TVOVER: + Patch2 = pViaModeTable->tv2OverTable[tvIndx].PatchPAL2; + if (pBIOSInfo->TVOutput == TVOUTPUT_COMPOSITE) + TV = pViaModeTable->tv2OverTable[tvIndx].TVPALC; + else + TV = pViaModeTable->tv2OverTable[tvIndx].TVPALS; + break; + } + } + else { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + Patch2 = pViaModeTable->tv2Table[tvIndx].PatchNTSC2; + DotCrawl = pViaModeTable->tv2Table[tvIndx].DotCrawlNTSC; + if (pBIOSInfo->TVOutput == TVOUTPUT_COMPOSITE) + TV = pViaModeTable->tv2Table[tvIndx].TVNTSCC; + else + TV = pViaModeTable->tv2Table[tvIndx].TVNTSCS; + break; + case VIA_TVOVER: + Patch2 = pViaModeTable->tv2OverTable[tvIndx].PatchNTSC2; + DotCrawl = pViaModeTable->tv2OverTable[tvIndx].DotCrawlNTSC; + if (pBIOSInfo->TVOutput == TVOUTPUT_COMPOSITE) + TV = pViaModeTable->tv2OverTable[tvIndx].TVNTSCC; + else + TV = pViaModeTable->tv2OverTable[tvIndx].TVNTSCS; + break; + } + } + + /* Set TV mode */ + for (i = 0, j = 0; i < pViaModeTable->tv2MaskTable.numTV + && j < VIA_BIOS_MAX_NUM_TV_REG ; j++) { + if (pViaModeTable->tv2MaskTable.TV[j] == 0xFF) { + W_Buffer[j+1] = TV[j]; + i++; + } + } + + w_bytes = j + 1; + + dev = xf86CreateI2CDevRec(); + dev->DevName = "VT1621"; + dev->SlaveAddr = 0x40; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + + xf86I2CDevInit(dev); + + xf86I2CWriteRead(dev, W_Buffer,w_bytes, NULL,0); + + /* Turn on all Composite and S-Video output */ + W_Other[0] = 0x0E; + W_Other[1] = 0; + xf86I2CWriteRead(dev, W_Other,2, NULL,0); + + if (pBIOSInfo->TVDotCrawl && (pBIOSInfo->TVType == TVTYPE_NTSC)) { + int numReg = (int)(DotCrawl[0]); + + for (i = 1; i < (numReg + 1); i++) { + W_Other[0] = (unsigned char)(DotCrawl[i] & 0xFF); + if (W_Other[0] == 0x11) { + xf86I2CWriteRead(dev, W_Other,1, R_Buffer,1); + W_Other[1] = R_Buffer[0] | (unsigned char)(DotCrawl[i] >> 8); + } + else { + W_Other[1] = (unsigned char)(DotCrawl[i] >> 8); + } + xf86I2CWriteRead(dev, W_Other,2, NULL,0); + } + } + + if (pBIOSInfo->IsSecondary) { + int numPatch; + + /* Patch as setting 2nd path */ + numPatch = (int)(pViaModeTable->tv2MaskTable.misc2 >> 5); + for (i = 0; i < numPatch; i++) { + W_Other[0] = (unsigned char)(Patch2[i] & 0xFF); + W_Other[1] = (unsigned char)(Patch2[i] >> 8); + xf86I2CWriteRead(dev, W_Other,2, NULL,0); + } + } + + xf86DestroyI2CDevRec(dev,TRUE); +} + +void +VIAPreSetCH7019Mode(VIABIOSInfoPtr pBIOSInfo) +{ + VIAModeTablePtr pViaModeTable = pBIOSInfo->pModeTable; + CARD8 *TV; + CARD16 *DotCrawl, *Patch2; + unsigned int tvIndx = pBIOSInfo->resTVMode; + int i, j; + unsigned char W_Buffer[VIA_BIOS_MAX_NUM_TV_REG + 1]; + unsigned char W_Other[2]; + int w_bytes; + I2CDevPtr dev; + unsigned char R_Buffer[1]; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIAPreSetCH7019Mode\n")); + DotCrawl = NULL; + Patch2 = NULL; + TV = NULL; + W_Buffer[0] = 0; + for (i = 0; i < VIA_BIOS_MAX_NUM_TV_REG; i++) { + W_Buffer[i+1] = pBIOSInfo->TVRegs[i]; + } + + if (pBIOSInfo->TVType == TVTYPE_PAL) { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + TV = pViaModeTable->ch7019Table[tvIndx].TVPAL; + Patch2 = pViaModeTable->ch7019Table[tvIndx].PatchPAL2; + break; + case VIA_TVOVER: + TV = pViaModeTable->ch7019OverTable[tvIndx].TVPAL; + Patch2 = pViaModeTable->ch7019OverTable[tvIndx].PatchPAL2; + break; + } + } + else { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + TV = pViaModeTable->ch7019Table[tvIndx].TVNTSC; + DotCrawl = pViaModeTable->ch7019Table[tvIndx].DotCrawlNTSC; + Patch2 = pViaModeTable->ch7019Table[tvIndx].PatchNTSC2; + break; + case VIA_TVOVER: + TV = pViaModeTable->ch7019OverTable[tvIndx].TVNTSC; + DotCrawl = pViaModeTable->ch7019OverTable[tvIndx].DotCrawlNTSC; + Patch2 = pViaModeTable->ch7019OverTable[tvIndx].PatchNTSC2; + break; + } + } + + for (i = 0, j = 0; i < pViaModeTable->ch7019MaskTable.numTV + && j < VIA_BIOS_MAX_NUM_TV_REG ; j++) { + if (pViaModeTable->ch7019MaskTable.TV[j] == 0xFF) { + W_Buffer[j+1] = TV[j]; + i++; + } + } + + w_bytes = j + 1; + + dev = xf86CreateI2CDevRec(); + dev->DevName = "CH7019"; + dev->SlaveAddr = 0xEA; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + + xf86I2CDevInit(dev); + + /* Disable TV avoid set mode garbage */ + W_Other[0] = 0x49; + W_Other[1] = 0X3E; + xf86I2CWriteRead(dev, W_Other,2, NULL,0); + W_Other[0] = 0x1E; + W_Other[1] = 0xD0; + xf86I2CWriteRead(dev, W_Other,2, NULL,0); + + xf86I2CWriteRead(dev, W_Buffer,w_bytes, NULL,0); + + if (pBIOSInfo->TVDotCrawl && (pBIOSInfo->TVType == TVTYPE_NTSC)) { + int numReg = (int)(DotCrawl[0]); + + for (i = 1; i < (numReg + 1); i++) { + W_Other[0] = (unsigned char)(DotCrawl[i] & 0xFF); + if (W_Other[0] == 0x11) { + xf86I2CWriteRead(dev, W_Other,1, R_Buffer,1); + W_Other[1] = R_Buffer[0] | (unsigned char)(DotCrawl[i] >> 8); + } + else { + W_Other[1] = (unsigned char)(DotCrawl[i] >> 8); + } + xf86I2CWriteRead(dev, W_Other,2, NULL,0); + } + } + + /* Turn TV CH7019 DAC On */ + W_Other[0] = 0x49; + W_Other[1] = 0x20; + xf86I2CWriteRead(dev, W_Other,2, NULL,0); + + if (pBIOSInfo->IsSecondary) { + int numPatch; + + /* Patch as setting 2nd path */ + numPatch = (int)(pViaModeTable->ch7019MaskTable.misc2 >> 5); + for (i = 0; i < numPatch; i++) { + W_Other[0] = (unsigned char)(Patch2[i] & 0xFF); + W_Other[1] = (unsigned char)(Patch2[i] >> 8); + xf86I2CWriteRead(dev, W_Other,2, NULL,0); + } + } + + xf86DestroyI2CDevRec(dev,TRUE); +} + +void +VIAPreSetFS454Mode(VIABIOSInfoPtr pBIOSInfo) +{ + VIAModeTablePtr pViaModeTable = pBIOSInfo->pModeTable; + CARD16 *TV, *DotCrawl, *RGB, *YCbCr; + unsigned int tvIndx = pBIOSInfo->resTVMode; + int tvType = pBIOSInfo->TVType; + int i, numReg; + unsigned char W_Buffer[2]; + unsigned char R_Buffer[1]; + I2CDevPtr dev; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIAPreSetFS454Mode\n")); + TV = NULL; + DotCrawl = NULL; + RGB = NULL; + YCbCr = NULL; + W_Buffer[0] = 0; + + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + TV = pViaModeTable->fs454Table[tvIndx].TVNTSC; + DotCrawl = pViaModeTable->fs454Table[tvIndx].DotCrawlNTSC; + RGB = pViaModeTable->fs454Table[tvIndx].RGBNTSC; + YCbCr = pViaModeTable->fs454Table[tvIndx].YCbCrNTSC; + break; + case VIA_TVOVER: + TV = pViaModeTable->fs454OverTable[tvIndx].TVNTSC; + DotCrawl = pViaModeTable->fs454OverTable[tvIndx].DotCrawlNTSC; + RGB = pViaModeTable->fs454OverTable[tvIndx].RGBNTSC; + YCbCr = pViaModeTable->fs454OverTable[tvIndx].YCbCrNTSC; + break; + } + + dev = xf86CreateI2CDevRec(); + dev->DevName = "FS454"; + dev->SlaveAddr = 0xD4; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + + xf86I2CDevInit(dev); + + /* Turn on all Composite and S-Video output */ + numReg = (int)(TV[0]); + for (i = 1; i < (numReg + 1); i++){ + W_Buffer[0] = (unsigned char)(TV[i] & 0xFF);; + W_Buffer[1] = (unsigned char)(TV[i] >> 8); + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + } + + if (pBIOSInfo->TVDotCrawl && (tvType == TVTYPE_NTSC)) { + numReg = (int)(DotCrawl[0]); + for (i = 1; i < (numReg + 1); i++) { + W_Buffer[0] = (unsigned char)(DotCrawl[i] & 0xFF); + if (W_Buffer[0] == 0x11) { + xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,1); + W_Buffer[1] = R_Buffer[0] | (unsigned char)(DotCrawl[i] >> 8); + } + else { + W_Buffer[1] = (unsigned char)(DotCrawl[i] >> 8); + } + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + } + } + + if (pBIOSInfo->TVOutput == TVOUTPUT_RGB) { + numReg = (int)(RGB[0]); + for (i = 1; i < (numReg + 1); i++) { + W_Buffer[0] = (unsigned char)(RGB[i] & 0xFF); + W_Buffer[1] = (unsigned char)(RGB[i] >> 8); + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + } + } + + if (pBIOSInfo->TVOutput == TVOUTPUT_YCBCR) { + numReg = (int)(YCbCr[0]); + for (i = 1; i < (numReg + 1); i++) { + W_Buffer[0] = (unsigned char)(YCbCr[i] & 0xFF); + W_Buffer[1] = (unsigned char)(YCbCr[i] >> 8); + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + } + } + + xf86DestroyI2CDevRec(dev,TRUE); +} + +static void +VIAPreSetSAA7108Mode(VIABIOSInfoPtr pBIOSInfo) +{ + VIAModeTablePtr pViaModeTable = pBIOSInfo->pModeTable; + CARD8 *TV; + CARD16 *RGB, *YCbCr, *Patch2; + unsigned int tvIndx = pBIOSInfo->resTVMode; + int i, j; + unsigned char W_Buffer[VIA_BIOS_MAX_NUM_SAA7108_TV_REG + 1]; + unsigned char W_Other[4]; + int w_bytes; + I2CDevPtr dev; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIAPreSetSAA7108Mode\n")); + RGB = NULL; + YCbCr = NULL; + Patch2 = NULL; + TV = NULL; + W_Buffer[0] = 0; + for (i = 0; i < VIA_BIOS_MAX_NUM_SAA7108_TV_REG; i++) { + W_Buffer[i+1] = pBIOSInfo->TVRegs[i]; + } + + if (pBIOSInfo->TVType == TVTYPE_PAL) { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + TV = pViaModeTable->saa7108Table[tvIndx].TVPAL; + RGB = pViaModeTable->saa7108Table[tvIndx].RGBPAL; + YCbCr = pViaModeTable->saa7108Table[tvIndx].YCbCrPAL; + Patch2 = pViaModeTable->saa7108Table[tvIndx].PatchPAL2; + break; + case VIA_TVOVER: + TV = pViaModeTable->saa7108OverTable[tvIndx].TVPAL; + RGB = pViaModeTable->saa7108OverTable[tvIndx].RGBPAL; + YCbCr = pViaModeTable->saa7108OverTable[tvIndx].YCbCrPAL; + Patch2 = pViaModeTable->saa7108OverTable[tvIndx].PatchPAL2; + break; + } + } + else { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + TV = pViaModeTable->saa7108Table[tvIndx].TVNTSC; + RGB = pViaModeTable->saa7108Table[tvIndx].RGBNTSC; + YCbCr = pViaModeTable->saa7108Table[tvIndx].YCbCrNTSC; + Patch2 = pViaModeTable->saa7108Table[tvIndx].PatchNTSC2; + break; + case VIA_TVOVER: + TV = pViaModeTable->saa7108OverTable[tvIndx].TVNTSC; + RGB = pViaModeTable->saa7108OverTable[tvIndx].RGBNTSC; + YCbCr = pViaModeTable->saa7108OverTable[tvIndx].YCbCrNTSC; + Patch2 = pViaModeTable->saa7108OverTable[tvIndx].PatchNTSC2; + break; + } + } + + for (i = 0, j = 0; i < pViaModeTable->saa7108MaskTable.numTV + && j < VIA_BIOS_MAX_NUM_SAA7108_TV_REG; j++) { + if (pViaModeTable->saa7108MaskTable.TV[j] == 0xFF) { + W_Buffer[j+1] = TV[j]; + i++; + } + } + + w_bytes = j + 1; + + dev = xf86CreateI2CDevRec(); + dev->DevName = "SAA7108"; + dev->SlaveAddr = pBIOSInfo->TVI2CAdd; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + + xf86I2CDevInit(dev); + + /* Initial SAA7108AE TV Encoder */ + W_Other[0] = 0x2D; + W_Other[1] = 0x08; + xf86I2CWriteRead(dev, W_Other,2, NULL,0); + W_Other[0] = 0xFD; + W_Other[1] = 0x80; + xf86I2CWriteRead(dev, W_Other,2, NULL,0); + W_Other[0] = 0x37; + W_Other[1] = 0x12; + xf86I2CWriteRead(dev, W_Other,2, NULL,0); + W_Other[0] = 0x3A; + W_Other[1] = 0x04; + xf86I2CWriteRead(dev, W_Other,2, NULL,0); + W_Other[0] = 0xA2; + W_Other[1] = 0x0; + xf86I2CWriteRead(dev, W_Other,2, NULL,0); + W_Other[0] = 0xFA; + W_Other[1] = 0x07; + xf86I2CWriteRead(dev, W_Other,2, NULL,0); + W_Other[0] = 0x17; + W_Other[1] = 0x1B; + W_Other[2] = 0x1B; + W_Other[3] = 0x1F; + xf86I2CWriteRead(dev, W_Other,4, NULL,0); + W_Other[0] = 0x38; + W_Other[1] = 0x1A; + W_Other[2] = 0x1A; + xf86I2CWriteRead(dev, W_Other,3, NULL,0); + W_Other[0] = 0x20; + W_Other[1] = 0x0; + xf86I2CWriteRead(dev, W_Other,2, NULL,0); + + xf86I2CWriteRead(dev, W_Buffer,w_bytes, NULL,0); + + /* Turn on all Composite and S-Video output ,Enable TV */ + if ((pBIOSInfo->TVOutput == TVOUTPUT_SVIDEO) || + (pBIOSInfo->TVOutput == TVOUTPUT_COMPOSITE)) { + W_Other[0] = 0x2D; + W_Other[1] = 0xB4; + xf86I2CWriteRead(dev, W_Other,2, NULL,0); + } + else if (pBIOSInfo->TVOutput == TVOUTPUT_RGB) { + int numReg = (int)(RGB[0]); + for (i = 1; i < (numReg + 1); i++) { + W_Other[0] = (unsigned char)(RGB[i] & 0xFF); + W_Other[1] = (unsigned char)(RGB[i] >> 8); + xf86I2CWriteRead(dev, W_Other,2, NULL,0); + } + W_Other[0] = 0x2D; + W_Other[1] = 0; + xf86I2CWriteRead(dev, W_Other,2, NULL,0); + } + else if (pBIOSInfo->TVOutput == TVOUTPUT_YCBCR) { + int numReg = (int)(YCbCr[0]); + for (i = 1; i < (numReg + 1); i++) { + W_Other[0] = (unsigned char)(YCbCr[i] & 0xFF); + W_Other[1] = (unsigned char)(YCbCr[i] >> 8); + xf86I2CWriteRead(dev, W_Other,2, NULL,0); + } + W_Other[0] = 0x2D; + W_Other[1] = 0x84; + xf86I2CWriteRead(dev, W_Other,2, NULL,0); + } + + if (pBIOSInfo->IsSecondary) { + int numPatch; + + /* Patch as setting 2nd path */ + numPatch = (int)(pViaModeTable->saa7108MaskTable.misc2 >> 5); + for (i = 0; i < numPatch; i++) { + W_Other[0] = (unsigned char)(Patch2[i] & 0xFF); + W_Other[1] = (unsigned char)(Patch2[i] >> 8); + xf86I2CWriteRead(dev, W_Other,2, NULL,0); + } + } + + xf86DestroyI2CDevRec(dev,TRUE); +} + +static void +VIAPreSetVT1623Mode(VIABIOSInfoPtr pBIOSInfo) +{ + VIAModeTablePtr pViaModeTable = pBIOSInfo->pModeTable; + VIABIOSTVMASKTablePtr TVMaskTbl; + CARD8 *TV; + CARD16 *DotCrawl, *RGB, *YCbCr, *Patch2; + unsigned int tvIndx = pBIOSInfo->resTVMode; + int tvType = pBIOSInfo->TVType; + int i, j; + unsigned char W_Buffer[VIA_BIOS_MAX_NUM_TV_REG + 1]; + unsigned char W_Other[2]; + int w_bytes; + unsigned char R_Buffer[1]; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIAPreSetVT1623Mode\n")); + DotCrawl = NULL; + RGB = NULL; + YCbCr = NULL; + Patch2 = NULL; + TV = NULL; + W_Buffer[0] = 0; + for (i = 0; i < VIA_BIOS_MAX_NUM_TV_REG; i++) { + W_Buffer[i+1] = pBIOSInfo->TVRegs[i]; + } + + TVMaskTbl = &pViaModeTable->vt1622aMaskTable; + if (tvType == TVTYPE_PAL) { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + TV = pViaModeTable->vt1622aTable[tvIndx].TVPAL; + RGB = pViaModeTable->vt1622aTable[tvIndx].RGBPAL; + YCbCr = pViaModeTable->vt1622aTable[tvIndx].YCbCrPAL; + Patch2 = pViaModeTable->vt1622aTable[tvIndx].PatchPAL2; + break; + case VIA_TVOVER: + TV = pViaModeTable->vt1622aOverTable[tvIndx].TVPAL; + RGB = pViaModeTable->vt1622aOverTable[tvIndx].RGBPAL; + YCbCr = pViaModeTable->vt1622aOverTable[tvIndx].YCbCrPAL; + Patch2 = pViaModeTable->vt1622aOverTable[tvIndx].PatchPAL2; + break; + } + } + else { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + TV = pViaModeTable->vt1622aTable[tvIndx].TVNTSC; + DotCrawl = pViaModeTable->vt1622aTable[tvIndx].DotCrawlNTSC; + RGB = pViaModeTable->vt1622aTable[tvIndx].RGBNTSC; + YCbCr = pViaModeTable->vt1622aTable[tvIndx].YCbCrNTSC; + Patch2 = pViaModeTable->vt1622aTable[tvIndx].PatchNTSC2; + break; + case VIA_TVOVER: + TV = pViaModeTable->vt1622aOverTable[tvIndx].TVNTSC; + DotCrawl = pViaModeTable->vt1622aOverTable[tvIndx].DotCrawlNTSC; + RGB = pViaModeTable->vt1622aOverTable[tvIndx].RGBNTSC; + YCbCr = pViaModeTable->vt1622aOverTable[tvIndx].YCbCrNTSC; + Patch2 = pViaModeTable->vt1622aOverTable[tvIndx].PatchNTSC2; + break; + } + } + + for (i = 0, j = 0; i < TVMaskTbl->numTV + && j < VIA_BIOS_MAX_NUM_TV_REG ; j++) { + if (TVMaskTbl->TV[j] == 0xFF) { + W_Buffer[j+1] = TV[j]; + i++; + } + } + w_bytes = j + 1; + + VIAGPIOI2C_Initial(pBIOSInfo, 0x40); + /* TV Reset */ + VIAGPIOI2C_Write(pBIOSInfo, 0x1D, 0x0); + VIAGPIOI2C_Write(pBIOSInfo, 0x1D, 0x80); + + for (i = 0; i < w_bytes && i < VIA_BIOS_MAX_NUM_TV_REG; i++) { + VIAGPIOI2C_Write(pBIOSInfo, i, W_Buffer[i+1]); + } + + /* Turn on all Composite and S-Video output */ + VIAGPIOI2C_Write(pBIOSInfo, 0x0E, 0x0); + + if (pBIOSInfo->TVDotCrawl && (tvType == TVTYPE_NTSC)) { + int numReg = (int)(DotCrawl[0]); + + for (i = 1; i < (numReg + 1); i++) { + W_Other[0] = (unsigned char)(DotCrawl[i] & 0xFF); + if (W_Other[0] == 0x11) { + VIAGPIOI2C_Read(pBIOSInfo, 0x11, R_Buffer, 1); + W_Other[1] = R_Buffer[0] | (unsigned char)(DotCrawl[i] >> 8); + } + else { + W_Other[1] = (unsigned char)(DotCrawl[i] >> 8); + } + VIAGPIOI2C_Write(pBIOSInfo, W_Other[0], W_Other[1]); + } + } + + if (pBIOSInfo->TVOutput == TVOUTPUT_RGB) { + int numReg = (int)(RGB[0]); + + for (i = 1; i < (numReg + 1); i++) { + W_Other[0] = (unsigned char)(RGB[i] & 0xFF); + W_Other[1] = (unsigned char)(RGB[i] >> 8); + VIAGPIOI2C_Write(pBIOSInfo, W_Other[0], W_Other[1]); + } + + } + + if (pBIOSInfo->TVOutput == TVOUTPUT_YCBCR) { + int numReg = (int)(YCbCr[0]); + + for (i = 1; i < (numReg + 1); i++) { + W_Other[0] = (unsigned char)(YCbCr[i] & 0xFF); + W_Other[1] = (unsigned char)(YCbCr[i] >> 8); + VIAGPIOI2C_Write(pBIOSInfo, W_Other[0], W_Other[1]); + } + + } + + if (pBIOSInfo->IsSecondary) { + int numPatch; + + /* Patch as setting 2nd path */ + numPatch = (int)(TVMaskTbl->misc2 >> 5); + for (i = 0; i < numPatch; i++) { + W_Other[0] = (unsigned char)(Patch2[i] & 0xFF); + W_Other[1] = (unsigned char)(Patch2[i] >> 8); + VIAGPIOI2C_Write(pBIOSInfo, W_Other[0], W_Other[1]); + } + } +} + +void +VIAPostSetCH7019Mode(VIABIOSInfoPtr pBIOSInfo) +{ + VIABIOSInfoPtr pVia; + VIAModeTablePtr pViaModeTable = pBIOSInfo->pModeTable; + CARD8 *CRTC1, *CRTC2, *Misc1, *Misc2, tmp; + unsigned int tvIndx = pBIOSInfo->resTVMode; + int i, j, data; + + pVia = pBIOSInfo; + CRTC1 = NULL; + CRTC2 = NULL; + Misc1 = NULL; + Misc2 = NULL; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIAPostSetCH7019Mode\n")); + + if (pBIOSInfo->TVType == TVTYPE_PAL) { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + CRTC1 = pViaModeTable->ch7019Table[tvIndx].CRTCPAL1; + switch (pBIOSInfo->bitsPerPixel) { + case 8: + CRTC2 = pViaModeTable->ch7019Table[tvIndx].CRTCPAL2_8BPP; + break; + case 16: + CRTC2 = pViaModeTable->ch7019Table[tvIndx].CRTCPAL2_16BPP; + break; + case 24: + case 32: + CRTC2 = pViaModeTable->ch7019Table[tvIndx].CRTCPAL2_32BPP; + break; + } + Misc1 = pViaModeTable->ch7019Table[tvIndx].MiscPAL1; + Misc2 = pViaModeTable->ch7019Table[tvIndx].MiscPAL2; + break; + case VIA_TVOVER: + CRTC1 = pViaModeTable->ch7019OverTable[tvIndx].CRTCPAL1; + switch (pBIOSInfo->bitsPerPixel) { + case 8: + CRTC2 = pViaModeTable->ch7019OverTable[tvIndx].CRTCPAL2_8BPP; + break; + case 16: + CRTC2 = pViaModeTable->ch7019OverTable[tvIndx].CRTCPAL2_16BPP; + break; + case 24: + case 32: + CRTC2 = pViaModeTable->ch7019OverTable[tvIndx].CRTCPAL2_32BPP; + break; + } + Misc1 = pViaModeTable->ch7019OverTable[tvIndx].MiscPAL1; + Misc2 = pViaModeTable->ch7019OverTable[tvIndx].MiscPAL2; + break; + } + } + else { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + CRTC1 = pViaModeTable->ch7019Table[tvIndx].CRTCNTSC1; + switch (pBIOSInfo->bitsPerPixel) { + case 8: + CRTC2 = pViaModeTable->ch7019Table[tvIndx].CRTCNTSC2_8BPP; + break; + case 16: + CRTC2 = pViaModeTable->ch7019Table[tvIndx].CRTCNTSC2_16BPP; + break; + case 24: + case 32: + CRTC2 = pViaModeTable->ch7019Table[tvIndx].CRTCNTSC2_32BPP; + break; + } + Misc1 = pViaModeTable->ch7019Table[tvIndx].MiscNTSC1; + Misc2 = pViaModeTable->ch7019Table[tvIndx].MiscNTSC2; + break; + case VIA_TVOVER: + CRTC1 = pViaModeTable->ch7019OverTable[tvIndx].CRTCNTSC1; + switch (pBIOSInfo->bitsPerPixel) { + case 8: + CRTC2 = pViaModeTable->ch7019OverTable[tvIndx].CRTCNTSC2_8BPP; + break; + case 16: + CRTC2 = pViaModeTable->ch7019OverTable[tvIndx].CRTCNTSC2_16BPP; + break; + case 24: + case 32: + CRTC2 = pViaModeTable->ch7019OverTable[tvIndx].CRTCNTSC2_32BPP; + break; + } + Misc1 = pViaModeTable->ch7019OverTable[tvIndx].MiscNTSC1; + Misc2 = pViaModeTable->ch7019OverTable[tvIndx].MiscNTSC2; + break; + } + } + + if (pBIOSInfo->IsSecondary) { + for (i = 0, j = 0; i < pViaModeTable->ch7019MaskTable.numCRTC2; j++) { + if (pViaModeTable->ch7019MaskTable.CRTC2[j] == 0xFF) { + VGAOUT8(0x3d4, j + 0x50); + VGAOUT8(0x3d5, CRTC2[j]); + i++; + } + } + + j = 3; + + if (pViaModeTable->ch7019MaskTable.misc2 & 0x18) { + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp & 0x7F); + + VGAOUT8(0x3c4, 0x44); + VGAOUT8(0x3c5, Misc2[j++]); + VGAOUT8(0x3c4, 0x45); + VGAOUT8(0x3c5, Misc2[j++]); + + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x80); + + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp | 0x04); + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp & 0xFB); + + /* Use external clock */ + data = VGAIN8(0x3cc) | 0x0C; + VGAOUT8(0x3c2, data); + } + + VGAOUT8(0x3d4, 0x6A); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0xC0); + VGAOUT8(0x3d4, 0x6B); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x01); + VGAOUT8(0x3d4, 0x6C); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x01); + + /* Disable LCD Scaling */ + if (!pBIOSInfo->SAMM || pBIOSInfo->FirstInit) { + VGAOUT8(0x3d4, 0x79); + VGAOUT8(0x3d5, 0); + } + } + else { + for (i = 0, j = 0; i < pViaModeTable->ch7019MaskTable.numCRTC1; j++) { + if (pViaModeTable->ch7019MaskTable.CRTC1[j] == 0xFF) { + VGAOUT8(0x3d4, j); + VGAOUT8(0x3d5, CRTC1[j]); + i++; + } + } + + j = 0; + + VGAOUT8(0x3d4, 0x33); + tmp = VGAIN8(0x3d5); + if (Misc1[j] & 0x20) { + VGAOUT8(0x3d5, tmp | 0x20); + j++; + } + else { + VGAOUT8(0x3d5, tmp & 0xdf); + j++; + } + VGAOUT8(0x3d4, 0x6A); + VGAOUT8(0x3d5, Misc1[j++]); + VGAOUT8(0x3d4, 0x6B); + VGAOUT8(0x3d5, Misc1[j++] | 0x01); + + if (!pBIOSInfo->A2) { + VGAOUT8(0x3d4, 0x6C); + VGAOUT8(0x3d5, (Misc1[j++] & 0xE1) | 0x01); + } + else { + VGAOUT8(0x3d4, 0x6C); + VGAOUT8(0x3d5, Misc1[j++] | 0x01); + } + + if (pViaModeTable->ch7019MaskTable.misc1 & 0x30) { + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp & 0x7F); + + VGAOUT8(0x3c4, 0x46); + VGAOUT8(0x3c5, Misc1[j++]); + VGAOUT8(0x3c4, 0x47); + VGAOUT8(0x3c5, Misc1[j++]); + + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x80); + + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp | 0x02); + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp & 0xFD); + + /* Use external clock */ + data = VGAIN8(0x3cc) | 0x0C; + VGAOUT8(0x3c2, data); + } + } +} + +void +VIAPostSetFS454Mode(VIABIOSInfoPtr pBIOSInfo) +{ + VIABIOSInfoPtr pVia; + VIAModeTablePtr pViaModeTable = pBIOSInfo->pModeTable; + CARD8 *CRTC1, *Misc1, tmp; + unsigned int tvIndx = pBIOSInfo->resTVMode; + int i, j, data; + + + pVia = pBIOSInfo; + CRTC1 = NULL; + Misc1 = NULL; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIAPostSetFS454Mode\n")); + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + CRTC1 = pViaModeTable->fs454Table[tvIndx].CRTCNTSC1; + Misc1 = pViaModeTable->fs454Table[tvIndx].MiscNTSC1; + break; + case VIA_TVOVER: + CRTC1 = pViaModeTable->fs454OverTable[tvIndx].CRTCNTSC1; + Misc1 = pViaModeTable->fs454OverTable[tvIndx].MiscNTSC1; + break; + } + + for (i = 0, j = 0; i < pViaModeTable->fs454MaskTable.numCRTC1; j++) { + if (pViaModeTable->fs454MaskTable.CRTC1[j] == 0xFF) { + VGAOUT8(0x3d4, j); + VGAOUT8(0x3d5, CRTC1[j]); + i++; + } + } + + j = 0; + + VGAOUT8(0x3d4, 0x33); + tmp = VGAIN8(0x3d5); + if (Misc1[j] & 0x20) { + VGAOUT8(0x3d5, tmp | 0x20); + j++; + } + else { + VGAOUT8(0x3d5, tmp & 0xdf); + j++; + } + VGAOUT8(0x3d4, 0x6A); + VGAOUT8(0x3d5, Misc1[j++]); + VGAOUT8(0x3d4, 0x6B); + VGAOUT8(0x3d5, Misc1[j++] | 0x01); + + if (!pBIOSInfo->A2) { + VGAOUT8(0x3d4, 0x6C); + VGAOUT8(0x3d5, (Misc1[j++] & 0xE1) | 0x01); + } + else { + VGAOUT8(0x3d4, 0x6C); + VGAOUT8(0x3d5, Misc1[j++] | 0x01); + } + + if (pViaModeTable->fs454MaskTable.misc1 & 0x30) { + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp & 0x7F); + + VGAOUT8(0x3c4, 0x46); + VGAOUT8(0x3c5, Misc1[j++]); + VGAOUT8(0x3c4, 0x47); + VGAOUT8(0x3c5, Misc1[j++]); + + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x80); + + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp | 0x02); + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp & 0xFD); + + /* Use external clock */ + data = VGAIN8(0x3cc) | 0x0C; + VGAOUT8(0x3c2, data); + } +} + +static void +VIAPostSetSAA7108Mode(VIABIOSInfoPtr pBIOSInfo) +{ + VIABIOSInfoPtr pVia; + VIAModeTablePtr pViaModeTable = pBIOSInfo->pModeTable; + CARD8 *CRTC1, *CRTC2, *Misc1, *Misc2, tmp; + unsigned int tvIndx = pBIOSInfo->resTVMode; + int i, j, data; + + + pVia = pBIOSInfo; + CRTC1 = NULL; + CRTC2 = NULL; + Misc1 = NULL; + Misc2 = NULL; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIAPostSetSAA7108Mode\n")); + if (pBIOSInfo->TVType == TVTYPE_PAL) { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + CRTC1 = pViaModeTable->saa7108Table[tvIndx].CRTCPAL1; + switch (pBIOSInfo->bitsPerPixel) { + case 8: + CRTC2 = pViaModeTable->saa7108Table[tvIndx].CRTCPAL2_8BPP; + break; + case 16: + CRTC2 = pViaModeTable->saa7108Table[tvIndx].CRTCPAL2_16BPP; + break; + case 24: + case 32: + CRTC2 = pViaModeTable->saa7108Table[tvIndx].CRTCPAL2_32BPP; + break; + } + Misc1 = pViaModeTable->saa7108Table[tvIndx].MiscPAL1; + Misc2 = pViaModeTable->saa7108Table[tvIndx].MiscPAL2; + break; + case VIA_TVOVER: + CRTC1 = pViaModeTable->saa7108OverTable[tvIndx].CRTCPAL1; + switch (pBIOSInfo->bitsPerPixel) { + case 8: + CRTC2 = pViaModeTable->saa7108OverTable[tvIndx].CRTCPAL2_8BPP; + break; + case 16: + CRTC2 = pViaModeTable->saa7108OverTable[tvIndx].CRTCPAL2_16BPP; + break; + case 24: + case 32: + CRTC2 = pViaModeTable->saa7108OverTable[tvIndx].CRTCPAL2_32BPP; + break; + } + Misc1 = pViaModeTable->saa7108OverTable[tvIndx].MiscPAL1; + Misc2 = pViaModeTable->saa7108OverTable[tvIndx].MiscPAL2; + break; + } + } + else { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + CRTC1 = pViaModeTable->saa7108Table[tvIndx].CRTCNTSC1; + switch (pBIOSInfo->bitsPerPixel) { + case 8: + CRTC2 = pViaModeTable->saa7108Table[tvIndx].CRTCNTSC2_8BPP; + break; + case 16: + CRTC2 = pViaModeTable->saa7108Table[tvIndx].CRTCNTSC2_16BPP; + break; + case 24: + case 32: + CRTC2 = pViaModeTable->saa7108Table[tvIndx].CRTCNTSC2_32BPP; + break; + } + Misc1 = pViaModeTable->saa7108Table[tvIndx].MiscNTSC1; + Misc2 = pViaModeTable->saa7108Table[tvIndx].MiscNTSC2; + break; + case VIA_TVOVER: + CRTC1 = pViaModeTable->saa7108OverTable[tvIndx].CRTCNTSC1; + switch (pBIOSInfo->bitsPerPixel) { + case 8: + CRTC2 = pViaModeTable->saa7108OverTable[tvIndx].CRTCNTSC2_8BPP; + break; + case 16: + CRTC2 = pViaModeTable->saa7108OverTable[tvIndx].CRTCNTSC2_16BPP; + break; + case 24: + case 32: + CRTC2 = pViaModeTable->saa7108OverTable[tvIndx].CRTCNTSC2_32BPP; + break; + } + Misc1 = pViaModeTable->saa7108OverTable[tvIndx].MiscNTSC1; + Misc2 = pViaModeTable->saa7108OverTable[tvIndx].MiscNTSC2; + break; + } + } + + if (pBIOSInfo->IsSecondary) { + for (i = 0, j = 0; i < pViaModeTable->saa7108MaskTable.numCRTC2; j++) { + if (pViaModeTable->saa7108MaskTable.CRTC2[j] == 0xFF) { + VGAOUT8(0x3d4, j + 0x50); + VGAOUT8(0x3d5, CRTC2[j]); + i++; + } + } + + j = 3; + + if (pViaModeTable->saa7108MaskTable.misc2 & 0x18) { + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp & 0x7F); + + VGAOUT8(0x3c4, 0x44); + VGAOUT8(0x3c5, Misc2[j++]); + VGAOUT8(0x3c4, 0x45); + VGAOUT8(0x3c5, Misc2[j++]); + + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x80); + + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp | 0x04); + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp & 0xFB); + + /* Use external clock */ + data = VGAIN8(0x3cc) | 0x0C; + VGAOUT8(0x3c2, data); + } + + VGAOUT8(0x3d4, 0x6A); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0xC0); + VGAOUT8(0x3d4, 0x6B); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x01); + VGAOUT8(0x3d4, 0x6C); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x01); + + /* Disable LCD Scaling */ + if (!pBIOSInfo->SAMM || pBIOSInfo->FirstInit) { + VGAOUT8(0x3d4, 0x79); + VGAOUT8(0x3d5, 0); + } + } + else { + for (i = 0, j = 0; i < pViaModeTable->saa7108MaskTable.numCRTC1; j++) { + if (pViaModeTable->saa7108MaskTable.CRTC1[j] == 0xFF) { + VGAOUT8(0x3d4, j); + VGAOUT8(0x3d5, CRTC1[j]); + i++; + } + } + + j = 0; + + VGAOUT8(0x3d4, 0x33); + tmp = VGAIN8(0x3d5); + if (Misc1[j] & 0x20) { + VGAOUT8(0x3d5, tmp | 0x20); + j++; + } + else { + VGAOUT8(0x3d5, tmp & 0xdf); + j++; + } + + VGAOUT8(0x3d4, 0x6A); + VGAOUT8(0x3d5, Misc1[j++]); + VGAOUT8(0x3d4, 0x6B); + VGAOUT8(0x3d5, Misc1[j++] | 0x01); + + if (!pBIOSInfo->A2) { + VGAOUT8(0x3d4, 0x6C); + VGAOUT8(0x3d5, (Misc1[j++] & 0xE1) | 0x01); + } + else { + VGAOUT8(0x3d4, 0x6C); + VGAOUT8(0x3d5, Misc1[j++] | 0x01); + } + + if (pViaModeTable->saa7108MaskTable.misc1 & 0x30) { + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp & 0x7F); + + VGAOUT8(0x3c4, 0x46); + VGAOUT8(0x3c5, Misc1[j++]); + VGAOUT8(0x3c4, 0x47); + VGAOUT8(0x3c5, Misc1[j++]); + + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x80); + + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp | 0x02); + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp & 0xFD); + + /* Use external clock */ + data = VGAIN8(0x3cc) | 0x0C; + VGAOUT8(0x3c2, data); + } + } +} + +void +VIAPostSetTV2Mode(VIABIOSInfoPtr pBIOSInfo) +{ + VIABIOSInfoPtr pVia; + VIAModeTablePtr pViaModeTable = pBIOSInfo->pModeTable; + CARD8 *CRTC1, *CRTC2, *Misc1, *Misc2, tmp; + unsigned int tvIndx = pBIOSInfo->resTVMode; + int i, j, data; + + + pVia = pBIOSInfo; + CRTC1 = NULL; + CRTC2 = NULL; + Misc1 = NULL; + Misc2 = NULL; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIAPostSetTV2Mode\n")); + if (pBIOSInfo->TVType == TVTYPE_PAL) { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + CRTC1 = pViaModeTable->tv2Table[tvIndx].CRTCPAL1; + switch (pBIOSInfo->bitsPerPixel) { + case 8: + CRTC2 = pViaModeTable->tv2Table[tvIndx].CRTCPAL2_8BPP; + break; + case 16: + CRTC2 = pViaModeTable->tv2Table[tvIndx].CRTCPAL2_16BPP; + break; + case 24: + case 32: + CRTC2 = pViaModeTable->tv2Table[tvIndx].CRTCPAL2_32BPP; + break; + } + Misc1 = pViaModeTable->tv2Table[tvIndx].MiscPAL1; + Misc2 = pViaModeTable->tv2Table[tvIndx].MiscPAL2; + break; + case VIA_TVOVER: + CRTC1 = pViaModeTable->tv2OverTable[tvIndx].CRTCPAL1; + switch (pBIOSInfo->bitsPerPixel) { + case 8: + CRTC2 = pViaModeTable->tv2OverTable[tvIndx].CRTCPAL2_8BPP; + break; + case 16: + CRTC2 = pViaModeTable->tv2OverTable[tvIndx].CRTCPAL2_16BPP; + break; + case 24: + case 32: + CRTC2 = pViaModeTable->tv2OverTable[tvIndx].CRTCPAL2_32BPP; + break; + } + Misc1 = pViaModeTable->tv2OverTable[tvIndx].MiscPAL1; + Misc2 = pViaModeTable->tv2OverTable[tvIndx].MiscPAL2; + break; + } + } + else { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + CRTC1 = pViaModeTable->tv2Table[tvIndx].CRTCNTSC1; + switch (pBIOSInfo->bitsPerPixel) { + case 8: + CRTC2 = pViaModeTable->tv2Table[tvIndx].CRTCNTSC2_8BPP; + break; + case 16: + CRTC2 = pViaModeTable->tv2Table[tvIndx].CRTCNTSC2_16BPP; + break; + case 24: + case 32: + CRTC2 = pViaModeTable->tv2Table[tvIndx].CRTCNTSC2_32BPP; + break; + } + Misc1 = pViaModeTable->tv2Table[tvIndx].MiscNTSC1; + Misc2 = pViaModeTable->tv2Table[tvIndx].MiscNTSC2; + break; + case VIA_TVOVER: + CRTC1 = pViaModeTable->tv2OverTable[tvIndx].CRTCNTSC1; + switch (pBIOSInfo->bitsPerPixel) { + case 8: + CRTC2 = pViaModeTable->tv2OverTable[tvIndx].CRTCNTSC2_8BPP; + break; + case 16: + CRTC2 = pViaModeTable->tv2OverTable[tvIndx].CRTCNTSC2_16BPP; + break; + case 24: + case 32: + CRTC2 = pViaModeTable->tv2OverTable[tvIndx].CRTCNTSC2_32BPP; + break; + } + Misc1 = pViaModeTable->tv2OverTable[tvIndx].MiscNTSC1; + Misc2 = pViaModeTable->tv2OverTable[tvIndx].MiscNTSC2; + break; + } + } + + if (pBIOSInfo->IsSecondary) { + for (i = 0, j = 0; i < pViaModeTable->tv2MaskTable.numCRTC2; j++) { + if (pViaModeTable->tv2MaskTable.CRTC2[j] == 0xFF) { + VGAOUT8(0x3d4, j + 0x50); + VGAOUT8(0x3d5, CRTC2[j]); + i++; + } + } + + j = 3; + + if (pViaModeTable->tv2MaskTable.misc2 & 0x18) { + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp & 0x7F); + + VGAOUT8(0x3c4, 0x44); + VGAOUT8(0x3c5, Misc2[j++]); + VGAOUT8(0x3c4, 0x45); + VGAOUT8(0x3c5, Misc2[j++]); + + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x80); + + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp | 0x04); + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp & 0xFB); + + /* Use external clock */ + data = VGAIN8(0x3cc) | 0x0C; + VGAOUT8(0x3c2, data); + } + + VGAOUT8(0x3d4, 0x6A); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0xC0); + VGAOUT8(0x3d4, 0x6B); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x01); + VGAOUT8(0x3d4, 0x6C); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x01); + + /* Disable LCD Scaling */ + if (!pBIOSInfo->SAMM || pBIOSInfo->FirstInit) { + VGAOUT8(0x3d4, 0x79); + VGAOUT8(0x3d5, 0); + } + } + else { + for (i = 0, j = 0; i < pViaModeTable->tv2MaskTable.numCRTC1; j++) { + if (pViaModeTable->tv2MaskTable.CRTC1[j] == 0xFF) { + VGAOUT8(0x3d4, j); + VGAOUT8(0x3d5, CRTC1[j]); + i++; + } + } + + j = 0; + + VGAOUT8(0x3d4, 0x33); + tmp = VGAIN8(0x3d5); + if (Misc1[j] & 0x20) { + VGAOUT8(0x3d5, tmp | 0x20); + j++; + } + else { + VGAOUT8(0x3d5, tmp & 0xdf); + j++; + } + + VGAOUT8(0x3d4, 0x6A); + VGAOUT8(0x3d5, Misc1[j++]); + VGAOUT8(0x3d4, 0x6B); + VGAOUT8(0x3d5, Misc1[j++] | 0x01); + VGAOUT8(0x3d4, 0x6C); + VGAOUT8(0x3d5, Misc1[j++] | 0x01); + + if (pViaModeTable->tv2MaskTable.misc1 & 0x30) { + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp & 0x7F); + + VGAOUT8(0x3c4, 0x46); + VGAOUT8(0x3c5, Misc1[j++]); + VGAOUT8(0x3c4, 0x47); + VGAOUT8(0x3c5, Misc1[j++]); + + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x80); + + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp | 0x02); + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp & 0xFD); + + /* Use external clock */ + data = VGAIN8(0x3cc) | 0x0C; + VGAOUT8(0x3c2, data); + } + } +} + +void +VIAPreSetTV3Mode(VIABIOSInfoPtr pBIOSInfo) +{ + VIAModeTablePtr pViaModeTable = pBIOSInfo->pModeTable; + VIABIOSTVMASKTablePtr TVMaskTbl; + CARD8 *TV; + CARD16 *DotCrawl, *RGB, *YCbCr, *Patch2; + unsigned int tvIndx = pBIOSInfo->resTVMode; + int tvType = pBIOSInfo->TVType; + int i, j; + unsigned char W_Buffer[VIA_BIOS_MAX_NUM_TV_REG + 1]; + unsigned char W_Other[2]; + int w_bytes; + I2CDevPtr dev; + unsigned char R_Buffer[1]; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIAPreSetTV3Mode\n")); + DotCrawl = NULL; + RGB = NULL; + YCbCr = NULL; + Patch2 = NULL; + TV = NULL; + W_Buffer[0] = 0; + for (i = 0; i < VIA_BIOS_MAX_NUM_TV_REG; i++) { + W_Buffer[i+1] = pBIOSInfo->TVRegs[i]; + } + + if (pBIOSInfo->TVEncoder == VIA_TV3) { + TVMaskTbl = &pViaModeTable->tv3MaskTable; + if (tvType == TVTYPE_PAL) { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + TV = pViaModeTable->tv3Table[tvIndx].TVPAL; + RGB = pViaModeTable->tv3Table[tvIndx].RGBPAL; + YCbCr = pViaModeTable->tv3Table[tvIndx].YCbCrPAL; + Patch2 = pViaModeTable->tv3Table[tvIndx].PatchPAL2; + break; + case VIA_TVOVER: + TV = pViaModeTable->tv3OverTable[tvIndx].TVPAL; + RGB = pViaModeTable->tv3OverTable[tvIndx].RGBPAL; + YCbCr = pViaModeTable->tv3OverTable[tvIndx].YCbCrPAL; + Patch2 = pViaModeTable->tv3OverTable[tvIndx].PatchPAL2; + break; + } + } + else { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + TV = pViaModeTable->tv3Table[tvIndx].TVNTSC; + DotCrawl = pViaModeTable->tv3Table[tvIndx].DotCrawlNTSC; + RGB = pViaModeTable->tv3Table[tvIndx].RGBNTSC; + YCbCr = pViaModeTable->tv3Table[tvIndx].YCbCrNTSC; + Patch2 = pViaModeTable->tv3Table[tvIndx].PatchNTSC2; + break; + case VIA_TVOVER: + TV = pViaModeTable->tv3OverTable[tvIndx].TVNTSC; + DotCrawl = pViaModeTable->tv3OverTable[tvIndx].DotCrawlNTSC; + RGB = pViaModeTable->tv3OverTable[tvIndx].RGBNTSC; + YCbCr = pViaModeTable->tv3OverTable[tvIndx].YCbCrNTSC; + Patch2 = pViaModeTable->tv3OverTable[tvIndx].PatchNTSC2; + break; + } + } + } + else { + TVMaskTbl = &pViaModeTable->vt1622aMaskTable; + if (tvType == TVTYPE_PAL) { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + TV = pViaModeTable->vt1622aTable[tvIndx].TVPAL; + RGB = pViaModeTable->vt1622aTable[tvIndx].RGBPAL; + YCbCr = pViaModeTable->vt1622aTable[tvIndx].YCbCrPAL; + Patch2 = pViaModeTable->vt1622aTable[tvIndx].PatchPAL2; + break; + case VIA_TVOVER: + TV = pViaModeTable->vt1622aOverTable[tvIndx].TVPAL; + RGB = pViaModeTable->vt1622aOverTable[tvIndx].RGBPAL; + YCbCr = pViaModeTable->vt1622aOverTable[tvIndx].YCbCrPAL; + Patch2 = pViaModeTable->vt1622aOverTable[tvIndx].PatchPAL2; + break; + } + } + else { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + TV = pViaModeTable->vt1622aTable[tvIndx].TVNTSC; + DotCrawl = pViaModeTable->vt1622aTable[tvIndx].DotCrawlNTSC; + RGB = pViaModeTable->vt1622aTable[tvIndx].RGBNTSC; + YCbCr = pViaModeTable->vt1622aTable[tvIndx].YCbCrNTSC; + Patch2 = pViaModeTable->vt1622aTable[tvIndx].PatchNTSC2; + break; + case VIA_TVOVER: + TV = pViaModeTable->vt1622aOverTable[tvIndx].TVNTSC; + DotCrawl = pViaModeTable->vt1622aOverTable[tvIndx].DotCrawlNTSC; + RGB = pViaModeTable->vt1622aOverTable[tvIndx].RGBNTSC; + YCbCr = pViaModeTable->vt1622aOverTable[tvIndx].YCbCrNTSC; + Patch2 = pViaModeTable->vt1622aOverTable[tvIndx].PatchNTSC2; + break; + } + } + } + + for (i = 0, j = 0; i < TVMaskTbl->numTV + && j < VIA_BIOS_MAX_NUM_TV_REG; j++) { + if (TVMaskTbl->TV[j] == 0xFF) { + W_Buffer[j+1] = TV[j]; + i++; + } + } + w_bytes = j + 1; + + dev = xf86CreateI2CDevRec(); + dev->DevName = "VT1622"; + dev->SlaveAddr = 0x40; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + + xf86I2CDevInit(dev); + + /* TV Reset */ + W_Other[0] = 0x1D; + W_Other[1] = 0; + xf86I2CWriteRead(dev, W_Other,2, NULL,0); + W_Other[0] = 0x1D; + W_Other[1] = 0x80; + xf86I2CWriteRead(dev, W_Other,2, NULL,0); + + xf86I2CWriteRead(dev, W_Buffer,w_bytes, NULL,0); + + /* Turn on all Composite and S-Video output */ + W_Other[0] = 0x0E; + W_Other[1] = 0; + xf86I2CWriteRead(dev, W_Other,2, NULL,0); + + if (pBIOSInfo->TVDotCrawl && (tvType == TVTYPE_NTSC)) { + int numReg = (int)(DotCrawl[0]); + + for (i = 1; i < (numReg + 1); i++) { + W_Other[0] = (unsigned char)(DotCrawl[i] & 0xFF); + if (W_Other[0] == 0x11) { + xf86I2CWriteRead(dev, W_Other,1, R_Buffer,1); + W_Other[1] = R_Buffer[0] | (unsigned char)(DotCrawl[i] >> 8); + } + else { + W_Other[1] = (unsigned char)(DotCrawl[i] >> 8); + } + xf86I2CWriteRead(dev, W_Other,2, NULL,0); + } + } + + if (pBIOSInfo->TVOutput == TVOUTPUT_RGB) { + int numReg = (int)(RGB[0]); + + for (i = 1; i < (numReg + 1); i++) { + W_Other[0] = (unsigned char)(RGB[i] & 0xFF); + W_Other[1] = (unsigned char)(RGB[i] >> 8); + xf86I2CWriteRead(dev, W_Other,2, NULL,0); + } + + } + + if (pBIOSInfo->TVOutput == TVOUTPUT_YCBCR) { + int numReg = (int)(YCbCr[0]); + + for (i = 1; i < (numReg + 1); i++) { + W_Other[0] = (unsigned char)(YCbCr[i] & 0xFF); + W_Other[1] = (unsigned char)(YCbCr[i] >> 8); + xf86I2CWriteRead(dev, W_Other,2, NULL,0); + } + + } + + if (pBIOSInfo->IsSecondary) { + int numPatch; + + /* Patch as setting 2nd path */ + numPatch = (int)(TVMaskTbl->misc2 >> 5); + for (i = 0; i < numPatch; i++) { + W_Other[0] = (unsigned char)(Patch2[i] & 0xFF); + W_Other[1] = (unsigned char)(Patch2[i] >> 8); + xf86I2CWriteRead(dev, W_Other,2, NULL,0); + } + } + + xf86DestroyI2CDevRec(dev,TRUE); +} + +void +VIAPostSetTV3Mode(VIABIOSInfoPtr pBIOSInfo) +{ + VIABIOSInfoPtr pVia; + VIAModeTablePtr pViaModeTable = pBIOSInfo->pModeTable; + VIABIOSTVMASKTablePtr TVMaskTbl; + CARD8 *CRTC1, *CRTC2, *Misc1, *Misc2, tmp; + unsigned int tvIndx = pBIOSInfo->resTVMode; + int i, j, data; + + + pVia = pBIOSInfo; + CRTC1 = NULL; + CRTC2 = NULL; + Misc1 = NULL; + Misc2 = NULL; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIAPostSetTV3Mode\n")); + if (pBIOSInfo->TVEncoder == VIA_TV3) { + TVMaskTbl = &pViaModeTable->tv3MaskTable; + if (pBIOSInfo->TVType == TVTYPE_PAL) { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + CRTC1 = pViaModeTable->tv3Table[tvIndx].CRTCPAL1; + switch (pBIOSInfo->bitsPerPixel) { + case 8: + CRTC2 = pViaModeTable->tv3Table[tvIndx].CRTCPAL2_8BPP; + break; + case 16: + CRTC2 = pViaModeTable->tv3Table[tvIndx].CRTCPAL2_16BPP; + break; + case 24: + case 32: + CRTC2 = pViaModeTable->tv3Table[tvIndx].CRTCPAL2_32BPP; + break; + } + Misc1 = pViaModeTable->tv3Table[tvIndx].MiscPAL1; + Misc2 = pViaModeTable->tv3Table[tvIndx].MiscPAL2; + break; + case VIA_TVOVER: + CRTC1 = pViaModeTable->tv3OverTable[tvIndx].CRTCPAL1; + switch (pBIOSInfo->bitsPerPixel) { + case 8: + CRTC2 = pViaModeTable->tv3OverTable[tvIndx].CRTCPAL2_8BPP; + break; + case 16: + CRTC2 = pViaModeTable->tv3OverTable[tvIndx].CRTCPAL2_16BPP; + break; + case 24: + case 32: + CRTC2 = pViaModeTable->tv3OverTable[tvIndx].CRTCPAL2_32BPP; + break; + } + Misc1 = pViaModeTable->tv3OverTable[tvIndx].MiscPAL1; + Misc2 = pViaModeTable->tv3OverTable[tvIndx].MiscPAL2; + break; + } + } + else { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + CRTC1 = pViaModeTable->tv3Table[tvIndx].CRTCNTSC1; + switch (pBIOSInfo->bitsPerPixel) { + case 8: + CRTC2 = pViaModeTable->tv3Table[tvIndx].CRTCNTSC2_8BPP; + break; + case 16: + CRTC2 = pViaModeTable->tv3Table[tvIndx].CRTCNTSC2_16BPP; + break; + case 24: + case 32: + CRTC2 = pViaModeTable->tv3Table[tvIndx].CRTCNTSC2_32BPP; + break; + } + Misc1 = pViaModeTable->tv3Table[tvIndx].MiscNTSC1; + Misc2 = pViaModeTable->tv3Table[tvIndx].MiscNTSC2; + break; + case VIA_TVOVER: + CRTC1 = pViaModeTable->tv3OverTable[tvIndx].CRTCNTSC1; + switch (pBIOSInfo->bitsPerPixel) { + case 8: + CRTC2 = pViaModeTable->tv3OverTable[tvIndx].CRTCNTSC2_8BPP; + break; + case 16: + CRTC2 = pViaModeTable->tv3OverTable[tvIndx].CRTCNTSC2_16BPP; + break; + case 24: + case 32: + CRTC2 = pViaModeTable->tv3OverTable[tvIndx].CRTCNTSC2_32BPP; + break; + } + Misc1 = pViaModeTable->tv3OverTable[tvIndx].MiscNTSC1; + Misc2 = pViaModeTable->tv3OverTable[tvIndx].MiscNTSC2; + break; + } + } + } + else { + TVMaskTbl = &pViaModeTable->vt1622aMaskTable; + if (pBIOSInfo->TVType == TVTYPE_PAL) { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + CRTC1 = pViaModeTable->vt1622aTable[tvIndx].CRTCPAL1; + switch (pBIOSInfo->bitsPerPixel) { + case 8: + CRTC2 = pViaModeTable->vt1622aTable[tvIndx].CRTCPAL2_8BPP; + break; + case 16: + CRTC2 = pViaModeTable->vt1622aTable[tvIndx].CRTCPAL2_16BPP; + break; + case 24: + case 32: + CRTC2 = pViaModeTable->vt1622aTable[tvIndx].CRTCPAL2_32BPP; + break; + } + Misc1 = pViaModeTable->vt1622aTable[tvIndx].MiscPAL1; + Misc2 = pViaModeTable->vt1622aTable[tvIndx].MiscPAL2; + break; + case VIA_TVOVER: + CRTC1 = pViaModeTable->vt1622aOverTable[tvIndx].CRTCPAL1; + switch (pBIOSInfo->bitsPerPixel) { + case 8: + CRTC2 = pViaModeTable->vt1622aOverTable[tvIndx].CRTCPAL2_8BPP; + break; + case 16: + CRTC2 = pViaModeTable->vt1622aOverTable[tvIndx].CRTCPAL2_16BPP; + break; + case 24: + case 32: + CRTC2 = pViaModeTable->vt1622aOverTable[tvIndx].CRTCPAL2_32BPP; + break; + } + Misc1 = pViaModeTable->vt1622aOverTable[tvIndx].MiscPAL1; + Misc2 = pViaModeTable->vt1622aOverTable[tvIndx].MiscPAL2; + break; + } + } + else { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + CRTC1 = pViaModeTable->vt1622aTable[tvIndx].CRTCNTSC1; + switch (pBIOSInfo->bitsPerPixel) { + case 8: + CRTC2 = pViaModeTable->vt1622aTable[tvIndx].CRTCNTSC2_8BPP; + break; + case 16: + CRTC2 = pViaModeTable->vt1622aTable[tvIndx].CRTCNTSC2_16BPP; + break; + case 24: + case 32: + CRTC2 = pViaModeTable->vt1622aTable[tvIndx].CRTCNTSC2_32BPP; + break; + } + Misc1 = pViaModeTable->vt1622aTable[tvIndx].MiscNTSC1; + Misc2 = pViaModeTable->vt1622aTable[tvIndx].MiscNTSC2; + break; + case VIA_TVOVER: + CRTC1 = pViaModeTable->vt1622aOverTable[tvIndx].CRTCNTSC1; + switch (pBIOSInfo->bitsPerPixel) { + case 8: + CRTC2 = pViaModeTable->vt1622aOverTable[tvIndx].CRTCNTSC2_8BPP; + break; + case 16: + CRTC2 = pViaModeTable->vt1622aOverTable[tvIndx].CRTCNTSC2_16BPP; + break; + case 24: + case 32: + CRTC2 = pViaModeTable->vt1622aOverTable[tvIndx].CRTCNTSC2_32BPP; + break; + } + Misc1 = pViaModeTable->vt1622aOverTable[tvIndx].MiscNTSC1; + Misc2 = pViaModeTable->vt1622aOverTable[tvIndx].MiscNTSC2; + break; + } + } + } + + if (pBIOSInfo->IsSecondary) { + for (i = 0, j = 0; i < TVMaskTbl->numCRTC2; j++) { + if (TVMaskTbl->CRTC2[j] == 0xFF) { + VGAOUT8(0x3d4, j + 0x50); + VGAOUT8(0x3d5, CRTC2[j]); + i++; + } + } + + j = 3; + + if (TVMaskTbl->misc2 & 0x18) { + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp & 0x7F); + + /* CLE266Ax use 2x XCLK */ + if ((pBIOSInfo->Chipset == VIA_CLE266) && + (pBIOSInfo->ChipRev < 15)) { + VGAOUT8(0x3d4, 0x6B); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x20); + if (pBIOSInfo->A2) { + VGAOUT8(0x3d4, 0x6C); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x1C); + } + VGAOUT8(0x3c4, 0x44); + VGAOUT8(0x3c5, 0x47); + VGAOUT8(0x3c4, 0x45); + VGAOUT8(0x3c5, 0x1C); + } + else { + VGAOUT8(0x3c4, 0x44); + VGAOUT8(0x3c5, Misc2[j++]); + VGAOUT8(0x3c4, 0x45); + VGAOUT8(0x3c5, Misc2[j++]); + } + + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x80); + + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp | 0x04); + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp & 0xFB); + + /* Use external clock */ + data = VGAIN8(0x3cc) | 0x0C; + VGAOUT8(0x3c2, data); + } + + VGAOUT8(0x3d4, 0x6A); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0xC0); + VGAOUT8(0x3d4, 0x6B); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x01); + VGAOUT8(0x3d4, 0x6C); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x01); + + /* Disable LCD Scaling */ + if (!pBIOSInfo->SAMM || pBIOSInfo->FirstInit) { + VGAOUT8(0x3d4, 0x79); + VGAOUT8(0x3d5, 0); + } + } + else { + for (i = 0, j = 0; i < TVMaskTbl->numCRTC1; j++) { + if (TVMaskTbl->CRTC1[j] == 0xFF) { + VGAOUT8(0x3d4, j); + VGAOUT8(0x3d5, CRTC1[j]); + i++; + } + } + + j = 0; + + VGAOUT8(0x3d4, 0x33); + tmp = VGAIN8(0x3d5); + if (Misc1[j] & 0x20) { + VGAOUT8(0x3d5, tmp | 0x20); + j++; + } + else { + VGAOUT8(0x3d5, tmp & 0xdf); + j++; + } + VGAOUT8(0x3d4, 0x6A); + VGAOUT8(0x3d5, Misc1[j++]); + if ((pBIOSInfo->Chipset == VIA_CLE266) && + (pBIOSInfo->ChipRev < 15)) { + VGAOUT8(0x3d4, 0x6B); + VGAOUT8(0x3d5, Misc1[j++] | 0x81); + if (pBIOSInfo->A2) { + VGAOUT8(0x3d4, 0x6C); + VGAOUT8(0x3d5, Misc1[j++] | 0x01); + } + else { + j++; + } + } + else { + VGAOUT8(0x3d4, 0x6B); + VGAOUT8(0x3d5, Misc1[j++] | 0x01); + j++; + } + + if (TVMaskTbl->misc1 & 0x30) { + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp & 0x7F); + + /* CLE266Ax use 2x XCLK */ + if ((pBIOSInfo->Chipset == VIA_CLE266) && + (pBIOSInfo->ChipRev < 15)) { + VGAOUT8(0x3c4, 0x46); + VGAOUT8(0x3c5, 0x47); + VGAOUT8(0x3c4, 0x47); + VGAOUT8(0x3c5, 0x1C); + } + else { + VGAOUT8(0x3c4, 0x46); + VGAOUT8(0x3c5, Misc1[j++]); + VGAOUT8(0x3c4, 0x47); + VGAOUT8(0x3c5, Misc1[j++]); + } + + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x80); + + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp | 0x02); + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp & 0xFD); + + /* Use external clock */ + data = VGAIN8(0x3cc) | 0x0C; + VGAOUT8(0x3c2, data); + } + VGAOUT8(0x3d4, 0x6A); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x40); + VGAOUT8(0x3d4, 0x6B); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x01); + VGAOUT8(0x3d4, 0x6C); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x01); + } +} + +#ifdef UNUSED +static void +VIADisableExtendedFIFO(VIABIOSInfoPtr pBIOSInfo) +{ + VIABIOSInfoPtr pVia; + CARD32 dwTemp; + + pVia = pBIOSInfo; + + dwTemp = (CARD32)VIAGETREG(0x298); + dwTemp |= 0x20000000; + VIASETREG(0x298, dwTemp); + + dwTemp = (CARD32)VIAGETREG(0x230); + dwTemp &= ~0x00200000; + VIASETREG(0x230, dwTemp); + + dwTemp = (CARD32)VIAGETREG(0x298); + dwTemp &= ~0x20000000; + VIASETREG(0x298, dwTemp); +} + + +static void +VIAEnableExtendedFIFO(VIABIOSInfoPtr pBIOSInfo) +{ + VIABIOSInfoPtr pVia; + CARD32 dwTemp; + CARD8 bTemp; + + pVia = pBIOSInfo; + + dwTemp = (CARD32)VIAGETREG(0x298); + dwTemp |= 0x20000000; + VIASETREG(0x298, dwTemp); + + dwTemp = (CARD32)VIAGETREG(0x230); + dwTemp |= 0x00200000; + VIASETREG(0x230, dwTemp); + + dwTemp = (CARD32)VIAGETREG(0x298); + dwTemp &= ~0x20000000; + VIASETREG(0x298, dwTemp); + + VGAOUT8(0x3C4, 0x17); + bTemp = VGAIN8(0x3C5); + bTemp &= ~0x7F; + bTemp |= 0x2F; + VGAOUT8(0x3C5, bTemp); + + VGAOUT8(0x3C4, 0x16); + bTemp = VGAIN8(0x3C5); + bTemp &= ~0x3F; + bTemp |= 0x17; + VGAOUT8(0x3C5, bTemp); + + VGAOUT8(0x3C4, 0x18); + bTemp = VGAIN8(0x3C5); + bTemp &= ~0x3F; + bTemp |= 0x17; + bTemp |= 0x40; /* force the preq always higher than treq */ + VGAOUT8(0x3C5, bTemp); +} +#endif /* UNUSED */ + +static void +VIAPitchAlignmentPatch(VIABIOSInfoPtr pBIOSInfo) +{ + VIABIOSInfoPtr pVia = pBIOSInfo; + CARD8 cr13, cr35, cr65, cr66, cr67; + CARD32 dwScreenPitch= 0; + CARD32 dwPitch; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, "VIAPitchAlignmentPatch\n")); + dwPitch = pBIOSInfo->HDisplay * (pBIOSInfo->bitsPerPixel >> 3); + if (dwPitch & 0x1F) { /* Is 32 Byte Alignment ? */ + dwScreenPitch = ((dwPitch + 31) & ~31) >> 3; + if (!pBIOSInfo->IsSecondary) { + cr13 = (CARD8)(dwScreenPitch & 0xFF); + VGAOUT8(0x3D4, 0x13); + VGAOUT8(0x3D5, cr13); + VGAOUT8(0x3D4, 0x35); + cr35 = VGAIN8(0x3D5) & 0x1F; + cr35 |= (CARD8)((dwScreenPitch & 0x700) >> 3); + VGAOUT8(0x3D5, cr35); + } + else { + cr66 = (CARD8)(dwScreenPitch & 0xFF); + VGAOUT8(0x3D4, 0x66); + VGAOUT8(0x3D5, cr66); + VGAOUT8(0x3D4, 0x67); + cr67 = VGAIN8(0x3D5) & 0xFC; + cr67 |= (CARD8)((dwScreenPitch & 0x300) >> 8); + VGAOUT8(0x3D5, cr67); + + /* Fetch Count */ + VGAOUT8(0x3D4, 0x67); + cr67 = VGAIN8(0x3D5) & 0xF3; + cr67 |= (CARD8)((dwScreenPitch & 0x600) >> 7); + VGAOUT8(0x3D5, cr67); + cr65 = (CARD8)((dwScreenPitch >> 1) & 0xFF); + cr65 += 2; + VGAOUT8(0x3D4, 0x65); + VGAOUT8(0x3D5, cr65); + } + } +} + +Bool +VIASetModeUseBIOSTable(VIABIOSInfoPtr pBIOSInfo) +{ + VIABIOSInfoPtr pVia; + VIAModeTablePtr pViaModeTable = pBIOSInfo->pModeTable; + VIAUserSettingPtr UserSetting = pBIOSInfo->UserSetting; + BOOL setTV = FALSE; + int mode, resMode, refresh; + int port, offset, mask, data; + int countWidthByQWord, offsetWidthByQWord; + int i, j, k, m, n; + unsigned char cr13, cr35, sr1c, sr1d; + CARD8 misc, tmp; + + pVia = pBIOSInfo; + mode = pBIOSInfo->mode; + resMode = pBIOSInfo->resMode; + refresh = pBIOSInfo->refresh; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIASetModeUseBIOSTable\n")); + /* Turn off Screen */ + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp & 0x7f); + + /* Clean Second Path Status */ +#if 0 + if (pBIOSInfo->SAMM) { + if (pBIOSInfo->FirstInit) { + VGAOUT8(0x3d4, 0x6A); + VGAOUT8(0x3d5, 0x40); + if (pBIOSInfo->Chipset == VIA_CLE266 && pBIOSInfo->ChipRev < 15) { + VGAOUT8(0x3d4, 0x6B); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x3E); + } + else { + VGAOUT8(0x3d4, 0x6B); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp & 0x0E); + } + VGAOUT8(0x3d4, 0x6C); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp & 0xFE); + VGAOUT8(0x3d4, 0x93); + VGAOUT8(0x3d5, 0x0); + } + } + else { + VGAOUT8(0x3d4, 0x6A); + VGAOUT8(0x3d5, 0x0); + VGAOUT8(0x3d4, 0x6B); + VGAOUT8(0x3d5, 0x0); + VGAOUT8(0x3d4, 0x6C); + VGAOUT8(0x3d5, 0x0); + VGAOUT8(0x3d4, 0x93); + VGAOUT8(0x3d5, 0x0); + } +#endif + VGAOUT8(0x3d4, 0x6A); + VGAOUT8(0x3d5, 0x0); + VGAOUT8(0x3d4, 0x6B); + VGAOUT8(0x3d5, 0x0); + VGAOUT8(0x3d4, 0x6C); + VGAOUT8(0x3d5, 0x0); + VGAOUT8(0x3d4, 0x93); + VGAOUT8(0x3d5, 0x0); + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "Active Device is %d\n", + pBIOSInfo->ActiveDevice)); + + if (pBIOSInfo->ActiveDevice & VIA_DEVICE_TV) { + /* Found TV resmod index */ + switch (pBIOSInfo->resMode) { + case VIA_RES_640X480 : + pBIOSInfo->resTVMode = VIA_TVRES_640X480; + break; + case VIA_RES_800X600 : + pBIOSInfo->resTVMode = VIA_TVRES_800X600; + break; + case VIA_RES_1024X768 : + pBIOSInfo->resTVMode = VIA_TVRES_1024X768; + break; + case VIA_RES_848X480 : + pBIOSInfo->resTVMode = VIA_TVRES_848X480; + break; + case VIA_RES_720X480 : + pBIOSInfo->resTVMode = VIA_TVRES_720X480; + pBIOSInfo->TVType = TVTYPE_NTSC; + break; + case VIA_RES_720X576 : + pBIOSInfo->resTVMode = VIA_TVRES_720X576; + pBIOSInfo->TVType = TVTYPE_PAL; + break; + default : + pBIOSInfo->resTVMode = pBIOSInfo->resMode; + break; + } + + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + if (resMode == VIA_RES_640X480 || resMode == VIA_RES_800X600) { + setTV = TRUE; + VIAPreSetTV2Mode(pBIOSInfo); + } + break; + case VIA_TV3: + case VIA_VT1622A: + if (resMode == VIA_RES_640X480 || resMode == VIA_RES_800X600 || + resMode == VIA_RES_1024X768 || resMode == VIA_RES_720X480 || + resMode == VIA_RES_720X576 || resMode == VIA_RES_848X480) { + setTV = TRUE; + VIAPreSetTV3Mode(pBIOSInfo); + } + break; + case VIA_VT1623: + if (resMode == VIA_RES_640X480 || resMode == VIA_RES_800X600 || + resMode == VIA_RES_1024X768 || resMode == VIA_RES_720X480 || + resMode == VIA_RES_720X576 || resMode == VIA_RES_848X480) { + setTV = TRUE; + VIAPreSetVT1623Mode(pBIOSInfo); + } + break; + case VIA_CH7009: + case VIA_CH7019: + if (resMode == VIA_RES_640X480 || resMode == VIA_RES_800X600 || + resMode == VIA_RES_1024X768) { + setTV = TRUE; + VIAPreSetCH7019Mode(pBIOSInfo); + } + break; + case VIA_SAA7108: + if (resMode == VIA_RES_640X480 || resMode == VIA_RES_800X600 || + resMode == VIA_RES_1024X768 || resMode == VIA_RES_848X480) { + setTV = TRUE; + VIAPreSetSAA7108Mode(pBIOSInfo); + } + break; + case VIA_FS454: + if (resMode == VIA_RES_640X480 || resMode == VIA_RES_800X600 || + resMode == VIA_RES_1024X768 || resMode == VIA_RES_720X480) { + setTV = TRUE; + VIAPreSetFS454Mode(pBIOSInfo); + } + break; + } + } + + /* Close TV Output, if TVEncoder not support current resolution */ + if (!setTV && !pBIOSInfo->SAMM) { + I2CDevPtr dev; + unsigned char W_Buffer[2]; + + dev = xf86CreateI2CDevRec(); + dev->DevName = "TV"; + dev->SlaveAddr = pBIOSInfo->TVI2CAdd; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + if (xf86I2CDevInit(dev)) { + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + W_Buffer[0] = 0x0E; + W_Buffer[1] = 0x03; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + break; + case VIA_TV3: + case VIA_VT1622A: + W_Buffer[0] = 0x0E; + W_Buffer[1] = 0x0F; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + break; + case VIA_VT1623: + VIAGPIOI2C_Initial(pBIOSInfo, 0x40); + VIAGPIOI2C_Write(pBIOSInfo, 0x0E, 0x0F); + break; + case VIA_CH7019: + W_Buffer[0] = 0x49; + W_Buffer[1] = 0x3E; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + W_Buffer[0] = 0x1E; + W_Buffer[1] = 0xD0; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + break; + case VIA_SAA7108: + W_Buffer[0] = 0x2D; + W_Buffer[1] = 0x08; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + break; + case VIA_FS454: + default: + break; + } + xf86DestroyI2CDevRec(dev,TRUE); + } + else + xf86DestroyI2CDevRec(dev,TRUE); + } + + i = mode; + + /* Get Standard VGA Regs */ + /* Set Sequences regs */ + for (j = 1; j < 5; j++) { + VGAOUT8(0x3c4, j); + VGAOUT8(0x3c5, pViaModeTable->Modes[i].stdVgaTable.SR[j]); + } + + /* Set Misc reg */ + VGAOUT8(0x3c2, pViaModeTable->Modes[i].stdVgaTable.misc); + + /* Set CRTC regs */ + for (j = 0; j < 25; j++) { + VGAOUT8(0x3d4, j); + VGAOUT8(0x3d5, pViaModeTable->Modes[i].stdVgaTable.CR[j]); + } + + /* Set attribute regs */ + for (j = 0; j < 20; j++) { + misc = VGAIN8(0x3da); + VGAOUT8(0x3c0, j); + VGAOUT8(0x3c0, pViaModeTable->Modes[i].stdVgaTable.AR[j]); + } + + for (j = 0; j < 9; j++) { + VGAOUT8(0x3ce, j); + VGAOUT8(0x3cf, pViaModeTable->Modes[i].stdVgaTable.GR[j]); + } + + /* Unlock Extended regs */ + VGAOUT8(0x3c4, 0x10); + VGAOUT8(0x3c5, 0x01); + + /* Set Commmon Ext. Regs */ + for (j = 0; j < pViaModeTable->commExtTable.numEntry; j++) { + port = pViaModeTable->commExtTable.port[j]; + offset = pViaModeTable->commExtTable.offset[j]; + mask = pViaModeTable->commExtTable.mask[j]; + data = pViaModeTable->commExtTable.data[j] & mask; + VGAOUT8(0x300+port, offset); + VGAOUT8(0x301+port, data); + } + + if (pViaModeTable->Modes[i].Mode <= 0x13) { + /* Set Standard Mode-Spec. Extend Regs */ + for (j = 0; j < pViaModeTable->stdModeExtTable.numEntry; j++) { + port = pViaModeTable->stdModeExtTable.port[j]; + offset = pViaModeTable->stdModeExtTable.offset[j]; + mask = pViaModeTable->stdModeExtTable.mask[j]; + data = pViaModeTable->stdModeExtTable.data[j] & mask; + VGAOUT8(0x300+port, offset); + VGAOUT8(0x301+port, data); + } + } + else { + /* Set Extended Mode-Spec. Extend Regs */ + for (j = 0; j < pViaModeTable->Modes[i].extModeExtTable.numEntry; j++) { + port = pViaModeTable->Modes[i].extModeExtTable.port[j]; + offset = pViaModeTable->Modes[i].extModeExtTable.offset[j]; + mask = pViaModeTable->Modes[i].extModeExtTable.mask[j]; + data = pViaModeTable->Modes[i].extModeExtTable.data[j] & mask; + VGAOUT8(0x300+port, offset); + VGAOUT8(0x301+port, data); + } + } + + j = resMode; + + if ((j != VIA_RES_INVALID) && (refresh != 0xFF) && !setTV) { + k = refresh; + + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp & 0x7F); + + VGAOUT8(0x3c4, 0x46); + VGAOUT8(0x3c5, (pViaModeTable->refreshTable[j][k].VClk >> 8)); + VGAOUT8(0x3c4, 0x47); + VGAOUT8(0x3c5, (pViaModeTable->refreshTable[j][k].VClk & 0xFF)); + + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x80); + + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp | 0x02); + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp & 0xFD); + + m = 0; + VGAOUT8(0x3d4, 0x0); + VGAOUT8(0x3d5, pViaModeTable->refreshTable[j][k].CR[m++]); + + for (n = 2; n <= 7; n++) { + VGAOUT8(0x3d4, n); + VGAOUT8(0x3d5, pViaModeTable->refreshTable[j][k].CR[m++]); + } + + for (n = 16; n <= 17; n++) { + VGAOUT8(0x3d4, n); + VGAOUT8(0x3d5, pViaModeTable->refreshTable[j][k].CR[m++]); + } + + for (n = 21; n <= 22; n++) { + VGAOUT8(0x3d4, n); + VGAOUT8(0x3d5, pViaModeTable->refreshTable[j][k].CR[m++]); + } + + /* Use external clock */ + data = VGAIN8(0x3cc) | 0x0C; + VGAOUT8(0x3c2, data); + + } + else { + if (pViaModeTable->Modes[i].VClk != 0) { + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp & 0x7F); + + VGAOUT8(0x3c4, 0x46); + VGAOUT8(0x3c5, (pViaModeTable->Modes[i].VClk >> 8)); + VGAOUT8(0x3c4, 0x47); + VGAOUT8(0x3c5, (pViaModeTable->Modes[i].VClk & 0xFF)); + + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x80); + + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp | 0x02); + VGAOUT8(0x3c4, 0x40); + tmp = VGAIN8(0x3c5); + VGAOUT8(0x3c5, tmp & 0xFD); + + /* Use external clock */ + data = VGAIN8(0x3cc) | 0x0C; + VGAOUT8(0x3c2, data); + } + } + + /* Set Quadword offset and counter */ + /*=* Fix bandwidth problem when using virtual desktop *=*/ + countWidthByQWord = pBIOSInfo->countWidthByQWord; + offsetWidthByQWord = pBIOSInfo->offsetWidthByQWord; + + VGAOUT8(0x3d4, 0x35); + cr35 = VGAIN8(0x3d5) & 0x1f; + + cr13 = offsetWidthByQWord & 0xFF; + cr35 |= (offsetWidthByQWord & 0x700) >> 3; /* bit 7:5: offset 10:8 */ + + VGAOUT8(0x3c4, 0x1d); + sr1d = VGAIN8(0x3c5); + + /* Patch for non 32bit alignment mode */ + VIAPitchAlignmentPatch(pBIOSInfo); + + /* Enable Refresh to avoid data lose when enter screen saver */ + /* Refresh disable & 128-bit alignment */ + sr1d = (sr1d & 0xfc) | (countWidthByQWord >> 9); + sr1c = ((countWidthByQWord >> 1) + 1) & 0xff; + /* sr1d = ((sr1d & 0xfc) | (widthByQWord >> 8)) | 0x80; */ + /* sr1c = widthByQWord & 0xff; */ + + VGAOUT8(0x3d4, 0x13); + VGAOUT8(0x3d5, cr13); + VGAOUT8(0x3d4, 0x35); + VGAOUT8(0x3d5, cr35); + VGAOUT8(0x3c4, 0x1c); + VGAOUT8(0x3c5, sr1c); + VGAOUT8(0x3c4, 0x1d); + VGAOUT8(0x3c5, sr1d); + + /* Enable MMIO & PCI burst (1 wait state) */ + VGAOUT8(0x3c4, 0x1a); + data = VGAIN8(0x3c5); + VGAOUT8(0x3c5, data | 0x06); + + /* Enable modify CRTC starting address */ + VGAOUT8(0x3d4, 0x11); + misc = VGAIN8(0x3d5); + VGAOUT8(0x3d5, misc & 0x7f); + + if (pBIOSInfo->FirstInit) { + /* Clear Memory */ + memset(pBIOSInfo->FBBase, 0x00, pBIOSInfo->videoRambytes); + /*pBIOSInfo->FirstInit = FALSE;*/ + } + + /*=* Patch for horizontal blanking end bit6 *=*/ + VGAOUT8(0x3d4, 0x02); + data = VGAIN8(0x3d5); /* Save Blanking Start */ + + VGAOUT8(0x3d4, 0x03); + misc = VGAIN8(0x3d5) & 0x1f; /* Save Blanking End bit[4:0] */ + + VGAOUT8(0x3d4, 0x05); + misc |= ((VGAIN8(0x3d5) & 0x80) >> 2); /* Blanking End bit[5:0] */ + + if ((data & 0x3f) > misc) { /* Is Blanking End overflow ? */ + if (data & 0x40) { /* Blanking Start bit6 = ? */ + VGAOUT8(0x3d4, 0x33); /* bit6 = 1, Blanking End bit6 = 0 */ + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp & 0xdf); + } + else { + VGAOUT8(0x3d4, 0x33); /* bit6 = 0, Blanking End bit6 = 1 */ + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x20); + } + } + else { + if (data & 0x40) { /* Blanking Start bit6 = ? */ + VGAOUT8(0x3d4, 0x33); /* bit6 = 1, Blanking End bit6 = 1 */ + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x20); + } + else { + VGAOUT8(0x3d4, 0x33); /* bit6 = 0, Blanking End bit6 = 0 */ + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp & 0xdf); + } + } + + /* LCD Simultaneous Set Mode */ + if (pBIOSInfo->ActiveDevice & (VIA_DEVICE_DFP | VIA_DEVICE_LCD)) { + VIASetLCDMode(pBIOSInfo); + VIAEnableLCD(pBIOSInfo); + } + else if ((pBIOSInfo->ConnectedDevice & (VIA_DEVICE_DFP | VIA_DEVICE_LCD)) && + (!pBIOSInfo->HasSecondary)) { + VIADisableLCD(pBIOSInfo); + } + + if (setTV) { + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + VIAPostSetTV2Mode(pBIOSInfo); + break; + case VIA_TV3: + case VIA_VT1622A: + case VIA_VT1623: + VIAPostSetTV3Mode(pBIOSInfo); + break; + case VIA_CH7009: + case VIA_CH7019: + VIAPostSetCH7019Mode(pBIOSInfo); + break; + case VIA_SAA7108: + VIAPostSetSAA7108Mode(pBIOSInfo); + break; + case VIA_FS454: + VIAPostSetFS454Mode(pBIOSInfo); + break; + } + } + + /* load/save TV attribute for utility. */ + if (!pBIOSInfo->HasSecondary && (pBIOSInfo->ActiveDevice & VIA_DEVICE_TV)) { + /* Read User Setting */ + if (UserSetting->DefaultSetting) { + VIARestoreUserSetting(pBIOSInfo); + } + else { /* Read from I2C */ + VIAUTGetInfo(pBIOSInfo); + } + } + + VIAEnabledPrimaryExtendedFIFO(pBIOSInfo); + + /* Enable CRT Controller (3D5.17 Hardware Reset) */ + VGAOUT8(0x3d4, 0x17); + misc = VGAIN8(0x3d5); + VGAOUT8(0x3d5, (misc | 0x80)); + + /* Turn off CRT, if user doesn't want crt on */ + if (!(pBIOSInfo->ActiveDevice & VIA_DEVICE_CRT1)) { + VGAOUT8(0x3d4, 0x36); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp | 0x30); + } + + /* Open Screen */ + misc = VGAIN8(0x3da); + VGAOUT8(0x3c0, 0x20); + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "-- VIASetModeUseBIOSTable Done!\n")); + return TRUE; +} + +Bool +VIASetModeForMHS(VIABIOSInfoPtr pBIOSInfo) +{ + VIABIOSInfoPtr pVia; + BOOL setTV = FALSE; + int resMode; + int countWidthByQWord, offsetWidthByQWord; + unsigned char cr65, cr66, cr67, tmp; + + pVia = pBIOSInfo; + resMode = pBIOSInfo->resMode; + pBIOSInfo->SetTV = FALSE; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIASetModeForMHS\n")); + /* Turn off Screen */ + VGAOUT8(0x3d4, 0x17); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp & 0x7f); + + if (pBIOSInfo->ActiveDevice & VIA_DEVICE_TV) { + /* Found TV resmod index */ + switch (pBIOSInfo->resMode) { + case VIA_RES_640X480 : + pBIOSInfo->resTVMode = VIA_TVRES_640X480; + break; + case VIA_RES_800X600 : + pBIOSInfo->resTVMode = VIA_TVRES_800X600; + break; + case VIA_RES_1024X768 : + pBIOSInfo->resTVMode = VIA_TVRES_1024X768; + break; + case VIA_RES_848X480 : + pBIOSInfo->resTVMode = VIA_TVRES_848X480; + break; + case VIA_RES_720X480 : + pBIOSInfo->resTVMode = VIA_TVRES_720X480; + pBIOSInfo->TVType = TVTYPE_NTSC; + break; + case VIA_RES_720X576 : + pBIOSInfo->resTVMode = VIA_TVRES_720X576; + pBIOSInfo->TVType = TVTYPE_PAL; + break; + default : + pBIOSInfo->resTVMode = pBIOSInfo->resMode; + break; + } + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + if (resMode == VIA_RES_640X480 || resMode == VIA_RES_800X600) { + setTV = TRUE; + pBIOSInfo->SetTV = TRUE; + VIAPreSetTV2Mode(pBIOSInfo); + VIAPostSetTV2Mode(pBIOSInfo); + } + break; + case VIA_TV3: + case VIA_VT1622A: + if (resMode == VIA_RES_640X480 || resMode == VIA_RES_800X600 || + resMode == VIA_RES_1024X768 || resMode == VIA_RES_720X480 || + resMode == VIA_RES_720X576 || resMode == VIA_RES_848X480) { + setTV = TRUE; + pBIOSInfo->SetTV = TRUE; + VIAPreSetTV3Mode(pBIOSInfo); + VIAPostSetTV3Mode(pBIOSInfo); + } + break; + case VIA_CH7009: + case VIA_CH7019: + if (resMode == VIA_RES_640X480 || resMode == VIA_RES_800X600 || + resMode == VIA_RES_1024X768) { + setTV = TRUE; + pBIOSInfo->SetTV = TRUE; + VIAPreSetCH7019Mode(pBIOSInfo); + VIAPostSetCH7019Mode(pBIOSInfo); + } + break; + case VIA_SAA7108: + if (resMode == VIA_RES_640X480 || resMode == VIA_RES_800X600 || + resMode == VIA_RES_1024X768 || resMode == VIA_RES_848X480) { + setTV = TRUE; + pBIOSInfo->SetTV = TRUE; + VIAPreSetSAA7108Mode(pBIOSInfo); + VIAPostSetSAA7108Mode(pBIOSInfo); + } + break; + case VIA_FS454: + return FALSE; + break; + } + } + + /* Close TV Output, if TVEncoder not support current resolution */ + if ((pBIOSInfo->ActiveDevice & VIA_DEVICE_TV) && (!setTV)) { + I2CDevPtr dev; + unsigned char W_Buffer[2]; + + dev = xf86CreateI2CDevRec(); + dev->DevName = "TV"; + dev->SlaveAddr = pBIOSInfo->TVI2CAdd; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + if (xf86I2CDevInit(dev)) { + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + W_Buffer[0] = 0x0E; + W_Buffer[1] = 0x03; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + break; + case VIA_TV3: + case VIA_VT1622A: + W_Buffer[0] = 0x0E; + W_Buffer[1] = 0x0F; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + break; + case VIA_CH7019: + W_Buffer[0] = 0x49; + W_Buffer[1] = 0x3E; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + W_Buffer[0] = 0x1E; + W_Buffer[1] = 0xD0; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + break; + case VIA_SAA7108: + W_Buffer[0] = 0x2D; + W_Buffer[1] = 0x08; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + break; + case VIA_FS454: + default: + break; + } + xf86DestroyI2CDevRec(dev,TRUE); + } + else + xf86DestroyI2CDevRec(dev,TRUE); + ErrorF("TV resolution not supported!!\n"); + } + + if (!pBIOSInfo->A2) { + VGAOUT8(0x3d4, 0x6C); + tmp = VGAIN8(0x3d5); + VGAOUT8(0x3d5, tmp & 0xE1); + } + + if (pBIOSInfo->ActiveDevice & (VIA_DEVICE_DFP | VIA_DEVICE_LCD)) { + pBIOSInfo->SetDVI = TRUE; + VIASetLCDMode(pBIOSInfo); + VIAEnableLCD(pBIOSInfo); + } + else if (pBIOSInfo->ConnectedDevice & (VIA_DEVICE_DFP | VIA_DEVICE_LCD)) { + VIADisableLCD(pBIOSInfo); + } + + + /* Set Extended FIFO & Expire Number */ + VIAEnabledSecondaryExtendedFIFO(pBIOSInfo); + VIAFillExpireNumber(pBIOSInfo); + /* Set Quadword offset and counter */ + countWidthByQWord = pBIOSInfo->countWidthByQWord; + offsetWidthByQWord = pBIOSInfo->offsetWidthByQWord; + + VGAOUT8(0x3d4, 0x67); + cr67 = VGAIN8(0x3d5) & 0xFC; + + cr66 = offsetWidthByQWord & 0xFF; + cr67 |= (offsetWidthByQWord & 0x300) >> 8; + + VGAOUT8(0x3d4, 0x66); + VGAOUT8(0x3d5, cr66); + VGAOUT8(0x3d4, 0x67); + VGAOUT8(0x3d5, cr67); + + VGAOUT8(0x3d4, 0x67); + cr67 = VGAIN8(0x3d5) & 0xF3; + + cr67 |= (countWidthByQWord & 0x600) >> 7; + cr65 = (countWidthByQWord >> 1) & 0xff; + + VGAOUT8(0x3d4, 0x65); + VGAOUT8(0x3d5, cr65); + VGAOUT8(0x3d4, 0x67); + VGAOUT8(0x3d5, cr67); + + VGAOUT8(0x3d4, 0x67); + cr67 = VGAIN8(0x3d5); + + switch (pBIOSInfo->bitsPerPixel) { + case 8: + cr67 &= 0x3F; + VGAOUT8(0x3d5, cr67); + break; + case 16: + cr67 &= 0x3F; + cr67 |= 0x40; + VGAOUT8(0x3d5, cr67); + break; + case 24: + case 32: + cr67 |= 0x80; + VGAOUT8(0x3d5, cr67); + break; + } + + /* Patch for non 32bit alignment mode */ + VIAPitchAlignmentPatch(pBIOSInfo); + + /* Open Screen */ + (void) VGAIN8(0x3da); + VGAOUT8(0x3c0, 0x20); + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "-- VIASetModeForMHS Done!\n")); + return TRUE; +} + +Bool +VIASavePalette(ScrnInfoPtr pScrn, LOCO *colors) { + VIAPtr pVia = VIAPTR(pScrn); + int i, sr1a, sr1b, cr67, cr6a; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIASavePalette\n")); + /*VGAOUT8(0x3C4, 0x16); + sr16 = VGAIN8(0x3C5);*/ + VGAOUT8(0x3C4, 0x1A); + sr1a = VGAIN8(0x3C5); + VGAOUT8(0x3C4, 0x1B); + sr1b = VGAIN8(0x3C5); + VGAOUT8(0x3D4, 0x67); + cr67 = VGAIN8(0x3D5); + VGAOUT8(0x3D4, 0x6A); + cr6a = VGAIN8(0x3D5); + /*VGAOUT8(0x3C4, 0x16); + if (pScrn->bitsPerPixel == 8) + VGAOUT8(0x3C5, sr16 & ~0x80); + else + VGAOUT8(0x3C5, sr16 | 0x80);*/ + if (pVia->IsSecondary) { + VGAOUT8(0x3C4, 0x1A); + VGAOUT8(0x3C5, sr1a | 0x01); + VGAOUT8(0x3C4, 0x1B); + VGAOUT8(0x3C5, sr1b | 0x80); + VGAOUT8(0x3D4, 0x67); + VGAOUT8(0x3D5, cr67 & 0x3F); + VGAOUT8(0x3D4, 0x6A); + VGAOUT8(0x3D5, cr6a | 0xC0); + } + else { + VGAOUT8(0x3C4, 0x1A); + VGAOUT8(0x3C5, sr1a & 0xFE); + VGAOUT8(0x3C4, 0x1B); + VGAOUT8(0x3C5, sr1b | 0x20); + } + + VGAOUT8(0x3c7, 0); + for (i = 0; i < 256; i++) { + colors[i].red = VGAIN8(0x3c9); + colors[i].green = VGAIN8(0x3c9); + colors[i].blue = VGAIN8(0x3c9); + DEBUG(xf86Msg(X_INFO, "%d, %d, %d\n", colors[i].red, colors[i].green, colors[i].blue)); + } + WaitIdle(); + + /*if (pScrn->bitsPerPixel == 8) { + VGAOUT8(0x3C4, 0x16); + VGAOUT8(0x3C5, sr16); + } + VGAOUT8(0x3C4, 0x16); + VGAOUT8(0x3C5, sr16);*/ + VGAOUT8(0x3C4, 0x1A); + VGAOUT8(0x3C5, sr1a); + VGAOUT8(0x3C4, 0x1B); + VGAOUT8(0x3C5, sr1b); + + if (pVia->IsSecondary) { + VGAOUT8(0x3D4, 0x67); + VGAOUT8(0x3D5, cr67); + VGAOUT8(0x3D4, 0x6A); + VGAOUT8(0x3D5, cr6a); + } + return TRUE; +} + +Bool +VIARestorePalette(ScrnInfoPtr pScrn, LOCO *colors) { + VIAPtr pVia = VIAPTR(pScrn); + int i, sr1a, sr1b, cr67, cr6a, sr16; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIARestorePalette\n")); + VGAOUT8(0x3C4, 0x16); + sr16 = VGAIN8(0x3C5); + VGAOUT8(0x3C4, 0x1A); + sr1a = VGAIN8(0x3C5); + VGAOUT8(0x3C4, 0x1B); + sr1b = VGAIN8(0x3C5); + VGAOUT8(0x3D4, 0x67); + cr67 = VGAIN8(0x3D5); + VGAOUT8(0x3D4, 0x6A); + cr6a = VGAIN8(0x3D5); + VGAOUT8(0x3C4, 0x16); + if (pScrn->bitsPerPixel == 8) + VGAOUT8(0x3C5, sr16 & ~0x80); + else + VGAOUT8(0x3C5, sr16 | 0x80); + if (pVia->IsSecondary) { + VGAOUT8(0x3C4, 0x1A); + VGAOUT8(0x3C5, sr1a | 0x01); + VGAOUT8(0x3C4, 0x1B); + VGAOUT8(0x3C5, sr1b | 0x80); + VGAOUT8(0x3D4, 0x67); + VGAOUT8(0x3D5, cr67 & 0x3F); + VGAOUT8(0x3D4, 0x6A); + VGAOUT8(0x3D5, cr6a | 0xC0); + } + else { + VGAOUT8(0x3C4, 0x1A); + VGAOUT8(0x3C5, sr1a & 0xFE); + VGAOUT8(0x3C4, 0x1B); + VGAOUT8(0x3C5, sr1b | 0x20); + } + + VGAOUT8(0x3c8, 0); + for (i = 0; i < 256; i++) { + VGAOUT8(0x3c9, colors[i].red); + VGAOUT8(0x3c9, colors[i].green); + VGAOUT8(0x3c9, colors[i].blue); + /*DEBUG(xf86Msg(X_INFO, "%d, %d, %d\n", colors[i].red, colors[i].green, colors[i].blue));*/ + } + WaitIdle(); + /*if (pScrn->bitsPerPixel == 8) { + VGAOUT8(0x3C4, 0x16); + VGAOUT8(0x3C5, sr16); + } + VGAOUT8(0x3C4, 0x16); + VGAOUT8(0x3C5, sr16);*/ + VGAOUT8(0x3C4, 0x1A); + VGAOUT8(0x3C5, sr1a); + VGAOUT8(0x3C4, 0x1B); + VGAOUT8(0x3C5, sr1b); + + if (pVia->IsSecondary) { + VGAOUT8(0x3D4, 0x67); + VGAOUT8(0x3D5, cr67); + VGAOUT8(0x3D4, 0x6A); + VGAOUT8(0x3D5, cr6a); + } + return TRUE; +} + +void +VIAEnableLCD(VIABIOSInfoPtr pBIOSInfo) +{ + VIABIOSInfoPtr pVia = pBIOSInfo; + VIAModeTablePtr pViaModeTable = pBIOSInfo->pModeTable; + I2CDevPtr dev; + unsigned char W_Buffer[2], R_Buffer[1]; + unsigned char cr6a; + int i, j, k; + int port, offset, mask, data; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, "VIAEnableLCD\n")); + /* Enable LCD */ + VGAOUT8(0x3d4, 0x6A); + cr6a = VGAIN8(0x3d5); + VGAOUT8(0x3d5, cr6a | 0x08); + + /* Find Panel Size Index for PowerSeq Table */ + if (pBIOSInfo->Chipset == VIA_CLE266) { + if (pBIOSInfo->PanelSize != VIA_RES_INVALID) { + for (i = 0; i < VIA_BIOS_NUM_PANEL; i++) { + if (pViaModeTable->lcdTable[i].fpSize == pBIOSInfo->PanelSize) + break; + } + + for (j = 0; j < pViaModeTable->NumPowerOn; j++) { + if (pViaModeTable->lcdTable[i].powerSeq == + pViaModeTable->powerOn[j].powerSeq) + break; + } + } + else { + j = 0; + } + } + else { /* KM and K8M use PowerSeq Table index 2. */ + j = 2; + } + + usleep(1); + for (k = 0; k < pViaModeTable->powerOn[j].numEntry; k++) { + port = pViaModeTable->powerOn[j].port[k]; + offset = pViaModeTable->powerOn[j].offset[k]; + mask = pViaModeTable->powerOn[j].mask[k]; + data = pViaModeTable->powerOn[j].data[k] & mask; + VGAOUT8(0x300+port, offset); + VGAOUT8(0x301+port, data); + usleep(pViaModeTable->powerOn[j].delay[k]); + } + usleep(1); + + /* Patch for CH7019LVDS PLL Lock */ + if (pBIOSInfo->LVDS == VIA_CH7019LVDS) { + dev = xf86CreateI2CDevRec(); + dev->DevName = "LVDS"; + dev->SlaveAddr = 0xEA; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + if (xf86I2CDevInit(dev)) { + W_Buffer[0] = 0x63; + W_Buffer[1] = 0x4B; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + W_Buffer[0] = 0x66; + W_Buffer[1] = 0x20; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + for (i = 0; i < 10; i++) { + W_Buffer[0] = 0x63; + xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,1); + usleep(100); + W_Buffer[0] = 0x63; + W_Buffer[1] = (R_Buffer[0] | 0x40); + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, "[%d]write 0x63 = %X!\n", i+1, W_Buffer[1])); + usleep(1); + W_Buffer[0] = 0x63; + W_Buffer[1] &= ~0x40; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, "[%d]write 0x63 = %X!\n", i+1, W_Buffer[1])); + usleep(100); + W_Buffer[0] = 0x66; + xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,1); + if (((R_Buffer[0] & 0x44) == 0x44) || (i >= 9)) { /* PLL lock OK, Turn on VDD */ + usleep(500); + W_Buffer[1] = R_Buffer[0] | 0x01; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, "CH7019 PLL lock ok!\n")); + /* reset data path */ + W_Buffer[0] = 0x48; + xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,1); + W_Buffer[1] = R_Buffer[0] & ~0x08; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + usleep(1); + W_Buffer[1] = R_Buffer[0]; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + break; + } + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, "[%d]CH7019 PLL lock fail!\n", i+1)); + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, "[%d]0x66 = %X!\n", i+1, R_Buffer[0])); + } + xf86DestroyI2CDevRec(dev,TRUE); + } + } +} + +void +VIADisableLCD(VIABIOSInfoPtr pBIOSInfo) +{ + VIABIOSInfoPtr pVia = pBIOSInfo; + VIAModeTablePtr pViaModeTable = pBIOSInfo->pModeTable; + I2CDevPtr dev; + unsigned char W_Buffer[2], R_Buffer[1]; + unsigned char cr6a, tmp; + int i, j, k; + int port, offset, mask, data; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_PROBED, "VIADisableLCD\n")); + /* Patch for CH7019LVDS PLL Lock */ + if (pBIOSInfo->LVDS == VIA_CH7019LVDS) { + dev = xf86CreateI2CDevRec(); + dev->DevName = "LVDS"; + dev->SlaveAddr = 0xEA; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + if (xf86I2CDevInit(dev)) { + /* Turn off VDD (Turn off backlignt only) */ + W_Buffer[0] = 0x66; + xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,1); + W_Buffer[1] &= ~0x01; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + usleep(100); + /* Turn off LVDS path */ + W_Buffer[0] = 0x63; + xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,1); + W_Buffer[1] = (R_Buffer[0] | 0x40); + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + + xf86DestroyI2CDevRec(dev,TRUE); + } + } + + /* Disable LCD */ + VGAOUT8(0x3d4, 0x6A); + cr6a = VGAIN8(0x3d5); + VGAOUT8(0x3d5, (cr6a & ~0x08)); + + /* Find Panel Size Index */ + for (i = 0; i < VIA_BIOS_NUM_PANEL; i++) { + if (pViaModeTable->lcdTable[i].fpSize == pBIOSInfo->PanelSize) + break; + } + + for (j = 0; j < pViaModeTable->NumPowerOn; j++) { + if (pViaModeTable->lcdTable[i].powerSeq == + pViaModeTable->powerOn[j].powerSeq) + break; + } + + for (k = 0; k < pViaModeTable->powerOff[j].numEntry; k++) { + port = pViaModeTable->powerOff[j].port[k]; + offset = pViaModeTable->powerOff[j].offset[k]; + mask = pViaModeTable->powerOff[j].mask[k]; + data = pViaModeTable->powerOff[j].data[k] & mask; + VGAOUT8(0x300+port, offset); + tmp = VGAIN8(0x301+port); + VGAOUT8(0x301+port, (tmp & ~mask) | data); + usleep(pViaModeTable->powerOff[j].delay[k]); + } +} diff --git a/src/via_bios.h b/src/via_bios.h new file mode 100644 index 0000000..71ce028 --- /dev/null +++ b/src/via_bios.h @@ -0,0 +1,633 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_bios.h,v 1.4 2003/12/31 05:42:04 dawes Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef _VIA_BIOS_H_ +#define _VIA_BIOS_H_ 1 + +#define VIA_CRT_SUPPORT TRUE +#define VIA_LCD_SUPPORT TRUE +#define VIA_UNCOVERD_LCD_PANEL FALSE +#define VIA_NTSC_SUPPORT TRUE +#define VIA_PAL_SUPPORT TRUE +#define VIA_DVI_SUPPORT TRUE + +#define VIA_CRT_SUPPORT_BIT 0x01 +#define VIA_LCD_SUPPORT_BIT 0x02 +#define VIA_NTSC_SUPPORT_BIT 0x04 +#define VIA_PAL_SUPPORT_BIT 0x08 +#define VIA_DVI_SUPPORT_BIT 0x20 + +#define VIA_BIOS_REG_TABLE_MAX_NUM 32 +#define VIA_BIOS_REG_LCD_MAX_NUM 48 +#define VIA_BIOS_NUM_RES 17 +#define VIA_BIOS_NUM_REFRESH 5 +#define VIA_BIOS_NUM_LCD_SUPPORT_MASK 8 +#define VIA_BIOS_NUM_LCD_POWER_SEQ 4 +#define VIA_BIOS_NUM_PANEL 7 +#define VIA_BIOS_MAX_NUM_MPATCH2 18 +#define VIA_BIOS_MAX_NUM_MPATCH1 9 +#define VIA_BIOS_MAX_NUM_CTREXP 5 +#define VIA_BIOS_MAX_NUM_TV_REG 144 /* 00 - 8F, tv2,tv3,ch7019 are the same */ +#define VIA_BIOS_MAX_NUM_SAA7108_TV_REG 176 /* 00 - AF */ +#define VIA_BIOS_NUM_FS454_TV_REG 32 /* Nums of TV Register in setmode needs */ +#define VIA_BIOS_MAX_NUM_TV_CRTC 32 +#define VIA_BIOS_NUM_TV_SPECIAL_REG 8 +#define VIA_BIOS_MAX_NUM_TV_PATCH 8 +#define VIA_BIOS_NUM_TV_OTHER 16 +#define VIA_BIOS_NUM_TV2 2 +#define VIA_BIOS_NUM_TV3 6 +#define VIA_BIOS_NUM_SAA7108 4 +#define VIA_BIOS_NUM_CH7019 3 +#define VIA_BIOS_NUM_FS454 5 + + +/* The position of some BIOS information from start of BIOS */ +#define VIA_BIOS_SIZE_POS 0x2 +#define VIA_BIOS_OFFSET_POS 0x1B + +/* The offset of table from table start */ +#define VIA_BIOS_CSTAB_POS 6 +#define VIA_BIOS_STDVGAREGTAB_POS 8 +#define VIA_BIOS_COMMEXTREGTAB_POS 10 +#define VIA_BIOS_STDMODEXTREGTAB_POS 12 +#define VIA_BIOS_EXTMODEREGTAB_POS 14 +#define VIA_BIOS_REFRESHMODETAB_POS 16 +#define VIA_BIOS_BIOSVER_POS 18 +#define VIA_BIOS_BCPPOST_POS 20 +#define VIA_BIOS_LCDMODETAB_POS 40 +#define VIA_BIOS_TVMODETAB_POS 42 +#define VIA_BIOS_TVMASKTAB_POS 44 +#define VIA_BIOS_MODEOVERTAB_POS 46 +#define VIA_BIOS_TV3HSCALETAB_POS 48 +#define VIA_BIOS_LCDPOWERON_POS 50 +#define VIA_BIOS_LCDPOWEROFF_POS 52 +#define VIA_BIOS_LCDMODEFIX_POS 54 +#define ZCR 0x0 +#define ZSR 0x1 +#define ZGR 0x2 + +#define VIA_RES_640X480 0 +#define VIA_RES_800X600 1 +#define VIA_RES_1024X768 2 +#define VIA_RES_1152X864 3 +#define VIA_RES_1280X1024 4 +#define VIA_RES_1600X1200 5 +#define VIA_RES_1440X1050 6 +#define VIA_RES_1280X768 7 +#define VIA_RES_1280X960 8 +#define VIA_RES_1920X1440 9 +#define VIA_RES_848X480 10 +#define VIA_RES_1400X1050 11 +#define VIA_RES_720X480 12 +#define VIA_RES_720X576 13 +#define VIA_RES_1024X512 14 +#define VIA_RES_856X480 15 +#define VIA_RES_1024X576 16 +#define VIA_RES_INVALID 255 + +#define VIA_TVRES_640X480 0 +#define VIA_TVRES_800X600 1 +#define VIA_TVRES_1024X768 2 +#define VIA_TVRES_848X480 3 +#define VIA_TVRES_720X480 4 +#define VIA_TVRES_720X576 5 + + +#define VIA_NUM_REFRESH_RATE 5 +#define VIA_PANEL6X4 0 +#define VIA_PANEL8X6 1 +#define VIA_PANEL10X7 2 +#define VIA_PANEL12X7 3 +#define VIA_PANEL12X10 4 +#define VIA_PANEL14X10 5 +#define VIA_PANEL16X12 6 +#define VIA_PANEL_INVALID 255 + +#define VIA_NONEDVI 0x00 +#define VIA_VT3191 0x01 +#define VIA_CH7019LVDS 0x02 +#define VIA_TTLTYPE 0x07 +#define VIA_VT3192 0x09 +#define VIA_VT3193 0x0A +#define VIA_SIL164 0x0B +#define VIA_SIL168 0x0C +#define VIA_Hardwired 0x0F + +#define TVTYPE_NONE 0x00 +#define TVTYPE_NTSC 0x01 +#define TVTYPE_PAL 0x02 + +#define TVOUTPUT_NONE 0x00 +#define TVOUTPUT_COMPOSITE 0x01 +#define TVOUTPUT_SVIDEO 0x02 +#define TVOUTPUT_RGB 0x04 +#define TVOUTPUT_YCBCR 0x08 +#define TVOUTPUT_SC 0x16 + +#define VIA_NONETV 0 +#define VIA_TV2PLUS 1 +#define VIA_TV3 2 +#define VIA_CH7009 3 +#define VIA_CH7019 4 +#define VIA_SAA7108 5 +#define VIA_CH7005 6 +#define VIA_VT1622A 7 +#define VIA_FS454 8 +#define VIA_VT1623 9 + +#define VIA_TVNORMAL 0 +#define VIA_TVOVER 1 +#define VIA_NO_TVHSCALE 0 +#define VIA_TVHSCALE0 0 +#define VIA_TVHSCALE1 1 +#define VIA_TVHSCALE2 2 +#define VIA_TVHSCALE3 3 +#define VIA_TVHSCALE4 4 +#define VIA_TV_NUM_HSCALE_LEVEL 8 +#define VIA_TV_NUM_HSCALE_REG 16 + +#define VIA_DEVICE_CRT1 0x01 +#define VIA_DEVICE_LCD 0x02 +#define VIA_DEVICE_TV 0x04 +#define VIA_DEVICE_DFP 0x08 +#define VIA_DEVICE_CRT2 0x10 + +/* System Memory CLK */ +#define VIA_MEM_SDR66 0x00 +#define VIA_MEM_SDR100 0x01 +#define VIA_MEM_SDR133 0x02 +#define VIA_MEM_DDR200 0x03 +#define VIA_MEM_DDR266 0x04 +#define VIA_MEM_DDR333 0x05 +#define VIA_MEM_DDR400 0x06 + +/* Digital Output Bus Width */ +#define VIA_DI_12BIT 0x00 +#define VIA_DI_24BIT 0x01 + +#define CAP_WEAVE 0x0 +#define CAP_BOB 0x1 + +typedef struct _GPIOI2C_INFO +{ + CARD8 bGPIOPort; + CARD8 bSlaveAddr; + int I2C_WAIT_TIME; + int STARTTIMEOUT; + int BYTETIMEOUT; + int HOLDTIME; + int BITTIMEOUT; +} GPIOI2C_INFO, *PGPIOI2C_INFO; + +typedef struct _VIABIOSSTDVGATABLE { + CARD8 columns; + CARD8 rows; + CARD8 fontHeight; + CARD16 pageSize; + CARD8 SR[5]; + CARD8 misc; + CARD8 CR[25]; + CARD8 AR[20]; + CARD8 GR[9]; +} VIABIOSStdVGATableRec, *VIABIOSStdVGATablePtr; + + +typedef struct _VIABIOSREFRESHTABLE { + CARD8 refresh; + CARD16 VClk; + CARD8 CR[14]; +} VIABIOSRefreshTableRec, *VIABIOSRefreshTablePtr; + + +typedef struct _VIABIOSREGTABLE { + CARD8 port[VIA_BIOS_REG_TABLE_MAX_NUM]; + CARD8 offset[VIA_BIOS_REG_TABLE_MAX_NUM]; + CARD8 mask[VIA_BIOS_REG_TABLE_MAX_NUM]; + CARD8 data[VIA_BIOS_REG_TABLE_MAX_NUM]; + int numEntry; +} VIABIOSRegTableRec, *VIABIOSRegTablePtr; + + +typedef struct _VIAVMODEENTRY { + unsigned short Width; + unsigned short Height; + unsigned short Bpp; + unsigned short Mode; + unsigned short MemNeed; + unsigned short MClk; + unsigned short VClk; + VIABIOSStdVGATableRec stdVgaTable; + VIABIOSRegTableRec extModeExtTable; +} VIAModeEntry, *VIAModeEntryPtr; + + +typedef struct _VIALCDMODEENTRY { + CARD16 LCDClk; + CARD16 VClk; + CARD16 LCDClk_12Bit; + CARD16 VClk_12Bit; + CARD8 port[VIA_BIOS_REG_LCD_MAX_NUM]; + CARD8 offset[VIA_BIOS_REG_LCD_MAX_NUM]; + CARD8 data[VIA_BIOS_REG_LCD_MAX_NUM]; + int numEntry; +} VIALCDModeEntry, *VIALCDModeEntryPtr; + + +typedef struct _VIALCDMPATCHENTRY { + CARD8 Mode; + CARD16 LCDClk; + CARD16 VClk; + CARD16 LCDClk_12Bit; + CARD16 VClk_12Bit; + CARD8 port[VIA_BIOS_REG_LCD_MAX_NUM]; + CARD8 offset[VIA_BIOS_REG_LCD_MAX_NUM]; + CARD8 data[VIA_BIOS_REG_LCD_MAX_NUM]; + int numEntry; +} VIALCDMPatchEntry, *VIALCDMPatchEntryPtr; + + +typedef struct _VIALCDMODEFIX { + CARD8 reqMode[32]; + CARD8 fixMode[32]; + int numEntry; +} VIALCDModeFixRec, *VIALCDModeFixRecPtr; + + +typedef struct _VIALCDPOWERSEQUENCE { + CARD8 powerSeq; + CARD8 port[4]; + CARD8 offset[4]; + CARD8 mask[4]; + CARD8 data[4]; + CARD16 delay[4]; + int numEntry; +} VIALCDPowerSeqRec, *VIALCDPowerSeqRecPtr; + + +typedef struct _VIALCDMODETABLE { + CARD8 fpIndex; + CARD8 fpSize; + CARD8 powerSeq; + int numMPatchDP2Ctr; + int numMPatchDP2Exp; + int numMPatchDP1Ctr; + int numMPatchDP1Exp; + CARD16 SuptMode[VIA_BIOS_NUM_LCD_SUPPORT_MASK]; + VIALCDModeEntry FPconfigTb; + VIALCDModeEntry InitTb; + VIALCDMPatchEntry MPatchDP2Ctr[VIA_BIOS_MAX_NUM_MPATCH2]; + VIALCDMPatchEntry MPatchDP2Exp[VIA_BIOS_MAX_NUM_MPATCH2]; + VIALCDMPatchEntry MPatchDP1Ctr[VIA_BIOS_MAX_NUM_MPATCH1]; + VIALCDMPatchEntry MPatchDP1Exp[VIA_BIOS_MAX_NUM_MPATCH1]; + VIALCDModeEntry LowResCtr; + VIALCDModeEntry LowResExp; + VIALCDModeEntry MCtr[VIA_BIOS_MAX_NUM_CTREXP]; + VIALCDModeEntry MExp[VIA_BIOS_MAX_NUM_CTREXP]; +} VIALCDModeTableRec, *VIALCDModePtr; + + +typedef struct _VIATVMASKTABLE { + CARD8 TV[VIA_BIOS_MAX_NUM_TV_REG]; + CARD8 CRTC1[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD8 CRTC2[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD8 misc1; + CARD8 misc2; + int numTV; + int numCRTC1; + int numCRTC2; +} VIABIOSTVMASKTableRec, *VIABIOSTVMASKTablePtr; + +typedef struct _VIASAA7108TVMASKTABLE { + CARD8 TV[VIA_BIOS_MAX_NUM_SAA7108_TV_REG]; + CARD8 CRTC1[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD8 CRTC2[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD8 misc1; + CARD8 misc2; + int numTV; + int numCRTC1; + int numCRTC2; +} VIABIOSSAA7108TVMASKTableRec, *VIABIOSSAA7108TVMASKTablePtr; + +typedef struct _VIAFS454TVMASKTABLE { + CARD8 CRTC1[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD8 CRTC2[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD8 misc1; + CARD8 misc2; + int numCRTC1; + int numCRTC2; +} VIABIOSFS454TVMASKTableRec, *VIABIOSFS454TVMASKTablePtr; + +typedef struct _VIATVMODETABLE { + CARD8 TVNTSCC[VIA_BIOS_MAX_NUM_TV_REG]; + CARD8 TVNTSCS[VIA_BIOS_MAX_NUM_TV_REG]; + CARD8 CRTCNTSC1[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD8 MiscNTSC1[VIA_BIOS_NUM_TV_SPECIAL_REG]; + CARD8 MiscNTSC2[VIA_BIOS_NUM_TV_SPECIAL_REG]; + CARD8 CRTCNTSC2_8BPP[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD8 CRTCNTSC2_16BPP[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD8 CRTCNTSC2_32BPP[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD16 PatchNTSC2[VIA_BIOS_MAX_NUM_TV_PATCH]; + CARD16 DotCrawlNTSC[VIA_BIOS_NUM_TV_OTHER]; + CARD8 TVPALC[VIA_BIOS_MAX_NUM_TV_REG]; + CARD8 TVPALS[VIA_BIOS_MAX_NUM_TV_REG]; + CARD8 CRTCPAL1[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD8 MiscPAL1[VIA_BIOS_NUM_TV_SPECIAL_REG]; + CARD8 MiscPAL2[VIA_BIOS_NUM_TV_SPECIAL_REG]; + CARD8 CRTCPAL2_8BPP[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD8 CRTCPAL2_16BPP[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD8 CRTCPAL2_32BPP[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD16 PatchPAL2[VIA_BIOS_MAX_NUM_TV_PATCH]; +} VIABIOSTV2TableRec, *VIABIOSTV2TablePtr; + + +typedef struct _VIATV3MODETABLE { + CARD8 TVNTSC[VIA_BIOS_MAX_NUM_TV_REG]; + CARD8 CRTCNTSC1[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD8 MiscNTSC1[VIA_BIOS_NUM_TV_SPECIAL_REG]; + CARD8 MiscNTSC2[VIA_BIOS_NUM_TV_SPECIAL_REG]; + CARD8 CRTCNTSC2_8BPP[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD8 CRTCNTSC2_16BPP[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD8 CRTCNTSC2_32BPP[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD16 PatchNTSC2[VIA_BIOS_MAX_NUM_TV_PATCH]; + CARD16 RGBNTSC[VIA_BIOS_NUM_TV_OTHER]; + CARD16 YCbCrNTSC[VIA_BIOS_NUM_TV_OTHER]; + CARD16 SDTV_RGBNTSC[VIA_BIOS_NUM_TV_OTHER]; + CARD16 SDTV_YCbCrNTSC[VIA_BIOS_NUM_TV_OTHER]; + CARD16 DotCrawlNTSC[VIA_BIOS_NUM_TV_OTHER]; + CARD8 TVPAL[VIA_BIOS_MAX_NUM_TV_REG]; + CARD8 CRTCPAL1[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD8 MiscPAL1[VIA_BIOS_NUM_TV_SPECIAL_REG]; + CARD8 MiscPAL2[VIA_BIOS_NUM_TV_SPECIAL_REG]; + CARD8 CRTCPAL2_8BPP[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD8 CRTCPAL2_16BPP[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD8 CRTCPAL2_32BPP[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD16 PatchPAL2[VIA_BIOS_MAX_NUM_TV_PATCH]; + CARD16 RGBPAL[VIA_BIOS_NUM_TV_OTHER]; + CARD16 YCbCrPAL[VIA_BIOS_NUM_TV_OTHER]; + CARD16 SDTV_RGBPAL[VIA_BIOS_NUM_TV_OTHER]; + CARD16 SDTV_YCbCrPAL[VIA_BIOS_NUM_TV_OTHER]; +} VIABIOSTV3TableRec, *VIABIOSTV3TablePtr; + + +typedef struct _VIAPHILIPSMODETABLE { + CARD8 TVNTSC[VIA_BIOS_MAX_NUM_SAA7108_TV_REG]; + CARD8 CRTCNTSC1[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD8 MiscNTSC1[VIA_BIOS_NUM_TV_SPECIAL_REG]; + CARD8 MiscNTSC2[VIA_BIOS_NUM_TV_SPECIAL_REG]; + CARD8 CRTCNTSC2_8BPP[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD8 CRTCNTSC2_16BPP[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD8 CRTCNTSC2_32BPP[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD16 PatchNTSC2[VIA_BIOS_MAX_NUM_TV_PATCH]; + CARD16 RGBNTSC[VIA_BIOS_NUM_TV_OTHER]; + CARD16 YCbCrNTSC[VIA_BIOS_NUM_TV_OTHER]; + CARD8 TVPAL[VIA_BIOS_MAX_NUM_SAA7108_TV_REG]; + CARD8 CRTCPAL1[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD8 MiscPAL1[VIA_BIOS_NUM_TV_SPECIAL_REG]; + CARD8 MiscPAL2[VIA_BIOS_NUM_TV_SPECIAL_REG]; + CARD8 CRTCPAL2_8BPP[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD8 CRTCPAL2_16BPP[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD8 CRTCPAL2_32BPP[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD16 PatchPAL2[VIA_BIOS_MAX_NUM_TV_PATCH]; + CARD16 RGBPAL[VIA_BIOS_NUM_TV_OTHER]; + CARD16 YCbCrPAL[VIA_BIOS_NUM_TV_OTHER]; +} VIABIOSSAA7108TableRec, *VIABIOSSAA7108TablePtr; + +typedef struct _VIACH7019MODETABLE { + CARD8 TVNTSC[VIA_BIOS_MAX_NUM_TV_REG]; + CARD8 CRTCNTSC1[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD8 MiscNTSC1[VIA_BIOS_NUM_TV_SPECIAL_REG]; + CARD8 MiscNTSC2[VIA_BIOS_NUM_TV_SPECIAL_REG]; + CARD8 CRTCNTSC2_8BPP[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD8 CRTCNTSC2_16BPP[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD8 CRTCNTSC2_32BPP[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD16 PatchNTSC2[VIA_BIOS_MAX_NUM_TV_PATCH]; + CARD16 DotCrawlNTSC[VIA_BIOS_NUM_TV_OTHER]; + CARD8 TVPAL[VIA_BIOS_MAX_NUM_TV_REG]; + CARD8 CRTCPAL1[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD8 MiscPAL1[VIA_BIOS_NUM_TV_SPECIAL_REG]; + CARD8 MiscPAL2[VIA_BIOS_NUM_TV_SPECIAL_REG]; + CARD8 CRTCPAL2_8BPP[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD8 CRTCPAL2_16BPP[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD8 CRTCPAL2_32BPP[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD16 PatchPAL2[VIA_BIOS_MAX_NUM_TV_PATCH]; +} VIABIOSCH7019TableRec, *VIABIOSCH7019TablePtr; + +typedef struct _VIAFS454MODETABLE { + CARD16 TVNTSC[VIA_BIOS_NUM_FS454_TV_REG]; + CARD8 CRTCNTSC1[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD8 MiscNTSC1[VIA_BIOS_NUM_TV_SPECIAL_REG]; + CARD8 MiscNTSC2[VIA_BIOS_NUM_TV_SPECIAL_REG]; + CARD8 CRTCNTSC2_8BPP[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD8 CRTCNTSC2_16BPP[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD8 CRTCNTSC2_32BPP[VIA_BIOS_MAX_NUM_TV_CRTC]; + CARD16 RGBNTSC[VIA_BIOS_NUM_TV_OTHER]; + CARD16 YCbCrNTSC[VIA_BIOS_NUM_TV_OTHER]; + CARD16 DotCrawlNTSC[VIA_BIOS_NUM_TV_OTHER]; +} VIABIOSFS454TableRec, *VIABIOSFS454TablePtr; + +typedef struct _VIAVMODETABLE { + unsigned short BIOSVer; + char * BIOSDate; + unsigned short NumModes; + int NumPowerOn; + int NumPowerOff; + VIAModeEntryPtr Modes; + VIABIOSRegTableRec commExtTable; + VIABIOSRegTableRec stdModeExtTable; + VIABIOSRefreshTableRec refreshTable[VIA_BIOS_NUM_RES][VIA_BIOS_NUM_REFRESH]; + VIALCDModeTableRec lcdTable[VIA_BIOS_NUM_PANEL]; + VIALCDPowerSeqRec powerOn[VIA_BIOS_NUM_LCD_POWER_SEQ]; + VIALCDPowerSeqRec powerOff[VIA_BIOS_NUM_LCD_POWER_SEQ]; + VIALCDModeFixRec modeFix; + VIABIOSTVMASKTableRec tv2MaskTable; + VIABIOSTVMASKTableRec tv3MaskTable; + VIABIOSTVMASKTableRec vt1622aMaskTable; + VIABIOSSAA7108TVMASKTableRec saa7108MaskTable; + VIABIOSTVMASKTableRec ch7019MaskTable; + VIABIOSFS454TVMASKTableRec fs454MaskTable; + VIABIOSTV2TableRec tv2Table[VIA_BIOS_NUM_TV2]; + VIABIOSTV2TableRec tv2OverTable[VIA_BIOS_NUM_TV2]; + VIABIOSTV3TableRec tv3Table[VIA_BIOS_NUM_TV3]; + VIABIOSTV3TableRec tv3OverTable[VIA_BIOS_NUM_TV3]; + VIABIOSTV3TableRec vt1622aTable[VIA_BIOS_NUM_TV3]; + VIABIOSTV3TableRec vt1622aOverTable[VIA_BIOS_NUM_TV3]; + VIABIOSSAA7108TableRec saa7108Table[VIA_BIOS_NUM_SAA7108]; + VIABIOSSAA7108TableRec saa7108OverTable[VIA_BIOS_NUM_SAA7108]; + VIABIOSCH7019TableRec ch7019Table[VIA_BIOS_NUM_CH7019]; + VIABIOSCH7019TableRec ch7019OverTable[VIA_BIOS_NUM_CH7019]; + VIABIOSFS454TableRec fs454Table[VIA_BIOS_NUM_FS454]; + VIABIOSFS454TableRec fs454OverTable[VIA_BIOS_NUM_FS454]; +} VIAModeTableRec, *VIAModeTablePtr; + +typedef struct _VIAUserSettingRec +{ + Bool DefaultSetting; + Bool AdaptiveFilterOn; + unsigned long tvVPosition; + unsigned long tvHPosition; + unsigned long tvFFilter; + unsigned long tvAdaptiveFFilter; + unsigned long tvBrightness; + unsigned long tvContrast; + unsigned long tvSaturation; + unsigned long tvTint; +} VIAUserSettingRec, *VIAUserSettingPtr; + +typedef struct _VIABIOSINFO { + VIAModeTablePtr pModeTable; + + int Chipset; + int ChipRev; + unsigned char TMDS; + unsigned char LVDS; + /*int DVIEncoder;*/ + int TVEncoder; + int BIOSTVTabVer; + + unsigned char* MapBase; + Bool FirstInit; + unsigned char* FBBase; + unsigned long videoRambytes; + unsigned char MemClk; + int scrnIndex; + + unsigned int mode, refresh, resMode; + int countWidthByQWord; + int offsetWidthByQWord; + + unsigned char ConnectedDevice; + unsigned char ActiveDevice; + unsigned char DefaultActiveDevice; + + /* Here are all the BIOS Relative Options */ + int BIOSMajorVersion; + int BIOSMinorVersion; + unsigned char BIOSDateYear; + unsigned char BIOSDateMonth; + unsigned char BIOSDateDay; + Bool A2; + Bool UseBIOS; + Bool LCDDualEdge; /* mean add-on card is 2CH or Dual or DDR */ + Bool DVIAttach; + Bool LCDAttach; + Bool Center; + Bool TVAttach; + Bool TVDotCrawl; + unsigned char BusWidth; /* Digital Output Bus Width */ + int PanelSize; + int TVType; + int TVOutput; + int TVVScan; + int TVHScale; + int OptRefresh; + int Refresh; + int FoundRefresh; + + /* LCD Simultaneous Expand Mode HWCursor Y Scale */ + Bool scaleY; + int panelX; + int panelY; + int resY; + + /* Some Used Member of ScrnInfoRec */ + int bitsPerPixel; /* fb bpp */ + int displayWidth; /* memory pitch */ + int frameX1; /* viewport position */ + int frameY1; + int SaveframeX1; + int SaveframeY1; + + /* Some Used Member of DisplayModeRec */ + int Clock; /* pixel clock freq */ + int HTotal; + int VTotal; + int HDisplay; /* horizontal timing */ + int VDisplay; /* vertical timing */ + int SaveHDisplay; + int SaveVDisplay; + int CrtcHDisplay; + int CrtcVDisplay; + int SaveCrtcHDisplay; + int SaveCrtcVDisplay; + + /* I2C & DDC */ + GPIOI2C_INFO GPIOI2CInfo; + I2CBusPtr I2C_Port1; + I2CBusPtr I2C_Port2; + xf86MonPtr DDC1; + xf86MonPtr DDC2; + I2CDevPtr dev; + + unsigned int resTVMode; + unsigned char TVI2CAdd; + unsigned char TVRegs[0xFF]; + + /* MHS */ + Bool SAMM; /* SAMM success or not? */ + Bool IsSecondary; + Bool HasSecondary; + Bool SetTV; + Bool SetDVI; + + /* Utility User Setting */ + VIAUserSettingPtr UserSetting; + LOCO colors[256]; /* Gamma value. LOCO typedef in colormapst.h */ +} VIABIOSInfoRec, *VIABIOSInfoPtr; + +/* Functions protype */ +int VIACheckTVExist(VIABIOSInfoPtr pBIOSInfo); +unsigned char VIAGetActiveDisplay(VIABIOSInfoPtr pBIOSInfo); +Bool VIAPostDVI(VIABIOSInfoPtr pBIOSInfo); +unsigned char VIAGetDeviceDetect(VIABIOSInfoPtr pBIOSInfo); +unsigned char VIAGetPanelInfo(VIABIOSInfoPtr pBIOSInfo); +void VIAPreSetCH7019Mode(VIABIOSInfoPtr pBIOSInfo); +void VIAPreSetFS454Mode(VIABIOSInfoPtr pBIOSInfo); +void VIAPreSetTV2Mode(VIABIOSInfoPtr pBIOSInfo); +void VIAPreSetTV3Mode(VIABIOSInfoPtr pBIOSInfo); +void VIAPostSetCH7019Mode(VIABIOSInfoPtr pBIOSInfo); +void VIAPostSetFS454Mode(VIABIOSInfoPtr pBIOSInfo); +void VIAPostSetTV2Mode(VIABIOSInfoPtr pBIOSInfo); +void VIAPostSetTV3Mode(VIABIOSInfoPtr pBIOSInfo); +Bool VIAGetBIOSTable(VIABIOSInfoPtr pBIOSInfo); +Bool VIAFindModeUseBIOSTable(VIABIOSInfoPtr pBIOSInfo); +Bool VIASetModeUseBIOSTable(VIABIOSInfoPtr pBIOSInfo); +Bool VIASetModeForMHS(VIABIOSInfoPtr pBIOSInfo); +Bool VIASavePalette(ScrnInfoPtr pScrn, LOCO *colors); +Bool VIARestorePalette(ScrnInfoPtr pScrn, LOCO *colors); + +/* via_vbe.c */ +Bool ViaVBEGetBIOSVersion(ScrnInfoPtr pScrn); +CARD8 ViaVBEGetActiveDevice(ScrnInfoPtr pScrn); +CARD16 ViaVBEGetDisplayDeviceInfo(ScrnInfoPtr pScrn, CARD8 *numDevice); +Bool ViaVBEGetBIOSDate(ScrnInfoPtr pScrn); +int ViaVBEGetVideoMemSize(ScrnInfoPtr pScrn); + +/* in via_bandwidth.c */ +void VIADisabledExtendedFIFO(VIABIOSInfoPtr pBIOSInfo); +void VIAEnabledPrimaryExtendedFIFO(VIABIOSInfoPtr pBIOSInfo); +void VIAEnabledSecondaryExtendedFIFO(VIABIOSInfoPtr pBIOSInfo); +void VIAFillExpireNumber(VIABIOSInfoPtr pBIOSInfo); + +#endif /* _VIA_BIOS_H_ */ diff --git a/src/via_capture.h b/src/via_capture.h new file mode 100644 index 0000000..c14d102 --- /dev/null +++ b/src/via_capture.h @@ -0,0 +1,77 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_capture.h,v 1.2 2003/08/27 15:16:07 tsi Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef _VIA_CAPTURE_H_ +#define _VIA_CAPTURE_H_ 1 + +typedef struct _VIACapRec { + unsigned long dwDeinterlaceMode; + unsigned long VideoDecoder; + unsigned long Tuner; + unsigned long TVEncoder; + int Vdec_Slave_Write; + int Vdec_Slave_Read; + int Tuner_Slave_Write; + int Tuner_Slave_Read; + int TVEncoder_Slave_Write; + int TVEncoder_Slave_Read; +} VIACapRec; + +/* Definition for dwFlags */ + +#define DDOVER_KEYDEST 0x00000004 + +/*Definition for LPVIAGETPORTATTR->attribute*/ +#define ATTR_ENCODING 0 /* XV_ENCODING */ +#define ATTR_INIT_AUDIO ATTR_ENCODING+50 /* XV_MUTE */ +#define ATTR_MUTE_ON ATTR_ENCODING+51 /* XV_MUTE */ +#define ATTR_MUTE_OFF ATTR_ENCODING+52 /* XV_MUTE */ +#define ATTR_VOLUME ATTR_ENCODING+53 /* XV_VOLUME */ +#define ATTR_STEREO ATTR_ENCODING+54 /* XV_VOLUME */ +#define ATTR_SAP ATTR_ENCODING+55 /* XV_SAP */ +#define ATTR_TUNER_AUDIO_SWITCH ATTR_ENCODING+56 /* XV_TUNER_AUDIO */ +#define ATTR_AUDIO_CONTROLByAP ATTR_ENCODING+57 /* XV_AUDIOCTRL */ + +#define DEV_TV0 0 +#define DEV_TV1 1 + +typedef struct _CAPDEVICE { + unsigned char *lpCAPOverlaySurface[3]; /* Max 3 Pointers to CAP Overlay Surface */ + unsigned long dwCAPPhysicalAddr[3]; /*Max 3 Physical address to CAP Overlay Surface */ + unsigned long dwHQVAddr[2]; /*Max 2 Physical address to CAP HQV Overlay Surface */ + CARD32 dwWidth; /*CAP Source Width, not changed */ + CARD32 dwHeight; /*CAP Source Height, not changed */ + CARD32 dwPitch; /*CAP frame buffer pitch */ + unsigned char byDeviceType; /*Device type. Such as DEV_TV1 and DEV_TV0 */ + CARD32 gdwCAPSrcWidth; /*CAP Source Width, changed if window is out of screen */ + CARD32 gdwCAPSrcHeight; /*CAP Source Height, changed if window is out of screen */ + CARD32 gdwCAPDstWidth; /*CAP Destination Width */ + CARD32 gdwCAPDstHeight; /*CAP Destination Height */ + CARD32 gdwCAPDstLeft; /*CAP Position : Left */ + CARD32 gdwCAPDstTop; /*CAP Position : Top */ + CARD32 dwDeinterlaceMode; /*BOB / WEAVE */ +} CAPDEVICE; + +#endif /* _VIA_CAPTURE_H_ */ diff --git a/src/via_ch7019.h b/src/via_ch7019.h new file mode 100644 index 0000000..09b7e5e --- /dev/null +++ b/src/via_ch7019.h @@ -0,0 +1,156 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_ch7019.h,v 1.2 2003/08/27 15:16:08 tsi Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef _VIA_CH7019_H_ +#define _VIA_CH7019_H_ 1 + +static const VIABIOSTVMASKTableRec ch7019MaskTable = { + { 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0, 0XFF, 0, 0, 0, 0, 0, 0, 0XFF, 0, 0XFF, 0, 0, 0XFF, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0, 0, 0, 0, 0, 0XFF, 0XFF, 0XFF, 0, 0, 0XFF, 0XFF, 0XFF, 0, 0, 0 }, + 0X3F, 0X38, 24, 13, 22 +}; + +static const VIABIOSCH7019TableRec ch7019Table[] = { + { + { 0X6A, 0X7F, 0X7E, 0X8D, 0X21, 0X2E, 0X4, 0X83, 0X3, 0X80, 0X3F, 0X7E, 0X20, 0X80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X40, 0XD2, 0X80, 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X5D, 0X4F, 0X4F, 0X81, 0X52, 0X9E, 0X56, 0XBA, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X8, 0, 0XDF, 0, 0, 0XDF, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0XF, 0X7F, 0X7F, 0XF, 0X9A, 0X23, 0X8F, 0XEF, 0X57, 0XDF, 0XDF, 0X57, 0X11, 0XA, 0X8, 0X50, 0, 0, 0, 0, 0, 0X28, 0X50, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, + { 0XF, 0X7F, 0X7F, 0XF, 0X9A, 0X23, 0X8F, 0XEF, 0X57, 0XDF, 0XDF, 0X57, 0X11, 0XA, 0X8, 0X50, 0, 0, 0, 0, 0, 0X50, 0XA0, 0X40, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, + { 0XF, 0X7F, 0X7F, 0XF, 0X9A, 0X23, 0X8F, 0XEF, 0X57, 0XDF, 0XDF, 0X57, 0X11, 0XA, 0X8, 0X50, 0, 0, 0, 0, 0, 0XA0, 0X40, 0X81, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, + { 0X2284, 0, 0, 0, 0, 0, 0, 0 }, + { 0X2, 0X811, 0X9217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X61, 0X7F, 0XE0, 0X8F, 0X31, 0X35, 0X33, 0X6E, 0X3, 0X81, 0X4, 0X9, 0X26, 0X6F, 0X1F, 0XD0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X40, 0XD2, 0X80, 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X64, 0X4F, 0X4F, 0X88, 0X53, 0X83, 0X6F, 0XBA, 0, 0X40, 0, 0, 0, 0, 0, 0, 0X11, 0, 0XDF, 0, 0, 0XDF, 0X70, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0X47, 0X7F, 0X7F, 0X47, 0X9A, 0X23, 0X95, 0X1E, 0X70, 0XDF, 0XDF, 0X70, 0X51, 0XA, 0X11, 0X5D, 0, 0, 0, 0, 0, 0X28, 0X50, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, + { 0X47, 0X7F, 0X7F, 0X47, 0X9A, 0X23, 0X95, 0X1E, 0X70, 0XDF, 0XDF, 0X70, 0X51, 0XA, 0X11, 0X5D, 0, 0, 0, 0, 0, 0X50, 0XA0, 0X40, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, + { 0X47, 0X7F, 0X7F, 0X47, 0X9A, 0X23, 0X95, 0X1E, 0X70, 0XDF, 0XDF, 0X70, 0X51, 0XA, 0X11, 0X5D, 0, 0, 0, 0, 0, 0XA0, 0X40, 0X81, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, + { 0X3284, 0, 0, 0, 0, 0, 0, 0 }, + }, + { + { 0XCF, 0X7F, 0X76, 0X8F, 0X59, 0X3C, 0X15, 0X83, 0X3, 0X88, 0X59, 0X2E, 0X19, 0X8B, 0X3A, 0X63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X40, 0XD2, 0X80, 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X80, 0X63, 0X63, 0X84, 0X69, 0X1A, 0XEC, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X5C, 0, 0X57, 0, 0, 0X57, 0XED, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0X27, 0X1F, 0X1F, 0X27, 0XE3, 0X34, 0X48, 0XD6, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X5C, 0X5D, 0, 0, 0, 0, 0, 0X32, 0X64, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, + { 0X27, 0X1F, 0X1F, 0X27, 0XE3, 0X34, 0X48, 0XD6, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X5C, 0X5D, 0, 0, 0, 0, 0, 0X64, 0XC8, 0X40, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, + { 0X27, 0X1F, 0X1F, 0X27, 0XE3, 0X34, 0X48, 0XD6, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X5C, 0X5D, 0, 0, 0, 0, 0, 0XC8, 0X90, 0X81, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, + { 0X5A84, 0, 0, 0, 0, 0, 0, 0 }, + { 0X2, 0X811, 0X5117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0XC3, 0X7F, 0XE0, 0X8F, 0X39, 0X3F, 0X38, 0X70, 0X3, 0X81, 0X21, 0X56, 0X1F, 0X87, 0X28, 0X18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X40, 0XD2, 0X80, 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X73, 0X63, 0X63, 0X97, 0X67, 0X91, 0XEC, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X7E, 0, 0X57, 0, 0, 0X57, 0XED, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0XBF, 0X1F, 0X1F, 0XBF, 0XDB, 0X33, 0X38, 0X8E, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X74, 0X4D, 0, 0, 0, 0, 0, 0X32, 0X64, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, + { 0XBF, 0X1F, 0X1F, 0XBF, 0XDB, 0X33, 0X38, 0X8E, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X74, 0X4D, 0, 0, 0, 0, 0, 0X64, 0XC8, 0X40, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, + { 0XBF, 0X1F, 0X1F, 0XBF, 0XDB, 0X33, 0X38, 0X8E, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X74, 0X4D, 0, 0, 0, 0, 0, 0XC8, 0X90, 0X81, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, + { 0X3A84, 0, 0, 0, 0, 0, 0, 0 }, + }, + { + { 0XEE, 0X7F, 0X7E, 0X87, 0X49, 0X32, 0X9, 0X83, 0X3, 0X88, 0X47, 0X4D, 0X1B, 0XE4, 0X89, 0X51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X40, 0XD2, 0X80, 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X8C, 0X7F, 0X7F, 0X90, 0X81, 0X8, 0XAF, 0XF5, 0, 0X60, 0, 0, 0, 0, 0, 0, 0XC, 0, 0XFF, 0, 0, 0XFF, 0XB0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0X80, 0XE, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0X87, 0XFF, 0XFF, 0X87, 0X23, 0X34, 0X9, 0X3F, 0XB0, 0XFF, 0XFF, 0XB0, 0X9A, 0X13, 0XC, 0X7A, 0, 0, 0, 0, 0, 0X40, 0X80, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, + { 0X87, 0XFF, 0XFF, 0X87, 0X23, 0X34, 0X9, 0X3F, 0XB0, 0XFF, 0XFF, 0XB0, 0X9A, 0X13, 0XC, 0X7A, 0, 0, 0, 0, 0, 0X80, 0, 0X41, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, + { 0X87, 0XFF, 0XFF, 0X87, 0X23, 0X34, 0X9, 0X3F, 0XB0, 0XFF, 0XFF, 0XB0, 0X9A, 0X13, 0XC, 0X7A, 0, 0, 0, 0, 0, 0, 0, 0X86, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, + { 0X4A84, 0, 0, 0, 0, 0, 0, 0 }, + { 0X2, 0X811, 0X6717, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0XE5, 0X7F, 0XE0, 0X8F, 0XC1, 0X3E, 0X4A, 0X70, 0, 0X81, 0X7, 0X2A, 0X20, 0X6D, 0XC2, 0XD7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X40, 0XD2, 0X80, 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0XAA, 0X7F, 0X7F, 0X8E, 0X83, 0X97, 0XE6, 0XF5, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X11, 0, 0XFF, 0, 0, 0XFF, 0XE7, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0X80, 0XE, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0X77, 0XFF, 0XFF, 0X77, 0X2B, 0X35, 0X1B, 0XBE, 0XE7, 0XFF, 0XFF, 0XE7, 0X9A, 0X13, 0X7, 0X7B, 0, 0, 0, 0, 0, 0X40, 0X80, 0, 0, 0, 0X80, 0X20, 0X8E, 0, 0, 0 }, + { 0X77, 0XFF, 0XFF, 0X77, 0X2B, 0X35, 0X1B, 0XBE, 0XE7, 0XFF, 0XFF, 0XE7, 0X9A, 0X13, 0X7, 0X7B, 0, 0, 0, 0, 0, 0X80, 0, 0X41, 0, 0, 0X80, 0X20, 0X8E, 0, 0, 0 }, + { 0X77, 0XFF, 0XFF, 0X77, 0X2B, 0X35, 0X1B, 0XBE, 0XE7, 0XFF, 0XFF, 0XE7, 0X9A, 0X13, 0X7, 0X7B, 0, 0, 0, 0, 0, 0, 0, 0X86, 0, 0, 0X80, 0X20, 0X8E, 0, 0, 0 }, + { 0XC284, 0, 0, 0, 0, 0, 0, 0 }, + } +}; + +static const VIABIOSCH7019TableRec ch7019OverTable[] = { + { + { 0X69, 0X7F, 0X7E, 0X8D, 0X10, 0X19, 0, 0X83, 0X3, 0X80, 0X3F, 0X6E, 0X25, 0X24, 0X92, 0X49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X40, 0XD2, 0X80, 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X5D, 0X4F, 0X4F, 0X81, 0X52, 0X9E, 0XB, 0X3E, 0, 0X60, 0, 0, 0, 0, 0, 0, 0XEE, 0, 0XDF, 0, 0, 0XDF, 0XC, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0XF, 0X7F, 0X7F, 0XF, 0X9A, 0X23, 0X8F, 0XFF, 0XC, 0XDF, 0XDF, 0XC, 0X11, 0XA, 0XEE, 0X31, 0, 0, 0, 0, 0, 0X28, 0X50, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, + { 0XF, 0X7F, 0X7F, 0XF, 0X9A, 0X23, 0X8F, 0XFF, 0XC, 0XDF, 0XDF, 0XC, 0X11, 0XA, 0XEE, 0X31, 0, 0, 0, 0, 0, 0X50, 0XA0, 0X40, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, + { 0XF, 0X7F, 0X7F, 0XF, 0X9A, 0X23, 0X8F, 0XFF, 0XC, 0XDF, 0XDF, 0XC, 0X11, 0XA, 0XEE, 0X31, 0, 0, 0, 0, 0, 0XA0, 0X40, 0X81, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, + { 0X1184, 0, 0, 0, 0, 0, 0, 0 }, + { 0X2, 0X811, 0XAD17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X60, 0X7F, 0XE0, 0X8F, 0X31, 0X1B, 0X2D, 0X6E, 0X3, 0X81, 0XD, 0X14, 0X30, 0XA, 0XE7, 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X40, 0XD2, 0X80, 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X64, 0X4F, 0X4F, 0X88, 0X53, 0X83, 0XF2, 0X1F, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XE5, 0, 0XDF, 0, 0, 0XDF, 0XF3, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0X47, 0X7F, 0X7F, 0X47, 0X9A, 0X23, 0X95, 0XFF, 0XF3, 0XDF, 0XDF, 0XF3, 0X9, 0X9, 0XE5, 0X40, 0, 0, 0, 0, 0, 0X28, 0X50, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, + { 0X47, 0X7F, 0X7F, 0X47, 0X9A, 0X23, 0X95, 0XFF, 0XF3, 0XDF, 0XDF, 0XF3, 0X9, 0X9, 0XE5, 0X40, 0, 0, 0, 0, 0, 0X50, 0XA0, 0X40, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, + { 0X47, 0X7F, 0X7F, 0X47, 0X9A, 0X23, 0X95, 0XFF, 0XF3, 0XDF, 0XDF, 0XF3, 0X9, 0X9, 0XE5, 0X40, 0, 0, 0, 0, 0, 0XA0, 0X40, 0X81, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, + { 0X3184, 0, 0, 0, 0, 0, 0, 0 }, + }, + { + { 0XCE, 0X7F, 0X76, 0X8F, 0X51, 0X2E, 0X10, 0X83, 0X3, 0X81, 0X13, 0X3E, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X40, 0XD2, 0X80, 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X7D, 0X63, 0X63, 0X81, 0X69, 0X18, 0XBA, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X5A, 0, 0X57, 0, 0, 0X57, 0XBB, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0XF, 0X1F, 0X1F, 0XF, 0XE3, 0X34, 0X44, 0XC6, 0XBB, 0X57, 0X57, 0XBB, 0X52, 0X12, 0X3F, 0X59, 0, 0, 0, 0, 0, 0X32, 0X64, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, + { 0XF, 0X1F, 0X1F, 0XF, 0XE3, 0X34, 0X44, 0XC6, 0XBB, 0X57, 0X57, 0XBB, 0X52, 0X12, 0X3F, 0X59, 0, 0, 0, 0, 0, 0X64, 0XC8, 0X40, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, + { 0XF, 0X1F, 0X1F, 0XF, 0XE3, 0X34, 0X44, 0XC6, 0XBB, 0X57, 0X57, 0XBB, 0X52, 0X12, 0X3F, 0X59, 0, 0, 0, 0, 0, 0XC8, 0X90, 0X81, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, + { 0X5284, 0, 0, 0, 0, 0, 0, 0 }, + { 0X2, 0X811, 0XD017, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0XC1, 0X7F, 0XE0, 0X8F, 0X20, 0X1D, 0X36, 0X70, 0X3, 0X94, 0X39, 0X87, 0X26, 0X79, 0X8C, 0XC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X40, 0XD2, 0X80, 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X71, 0X63, 0X63, 0X95, 0X67, 0X90, 0X6F, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X57, 0, 0X57, 0, 0, 0X57, 0X70, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0XAF, 0X1F, 0X1F, 0XAF, 0XDB, 0X33, 0X35, 0X8E, 0X70, 0X57, 0X57, 0X70, 0X52, 0X12, 0X57, 0X5A, 0, 0, 0, 0, 0, 0X32, 0X64, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, + { 0XAF, 0X1F, 0X1F, 0XAF, 0XDB, 0X33, 0X35, 0X8E, 0X70, 0X57, 0X57, 0X70, 0X52, 0X12, 0X57, 0X5A, 0, 0, 0, 0, 0, 0X64, 0XC8, 0X40, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, + { 0XAF, 0X1F, 0X1F, 0XAF, 0XDB, 0X33, 0X35, 0X8E, 0X70, 0X57, 0X57, 0X70, 0X52, 0X12, 0X57, 0X5A, 0, 0, 0, 0, 0, 0XC8, 0X90, 0X81, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, + { 0X2184, 0, 0, 0, 0, 0, 0, 0 }, + }, + { + { 0XED, 0X7F, 0X7E, 0X87, 0X49, 0X20, 0, 0X83, 0X3, 0X90, 0X89, 0X35, 0X1F, 0X61, 0X1A, 0X7C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X40, 0XD2, 0X80, 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X8C, 0X7F, 0X7F, 0X90, 0X81, 0X8, 0X46, 0XF5, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X4, 0, 0XFF, 0, 0, 0XFF, 0X47, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0X87, 0XFF, 0XFF, 0X87, 0X23, 0X34, 0X9, 0X38, 0X47, 0XFF, 0XFF, 0X47, 0X9A, 0X13, 0X4, 0X6F, 0, 0, 0, 0, 0, 0X40, 0X80, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, + { 0X87, 0XFF, 0XFF, 0X87, 0X23, 0X34, 0X9, 0X38, 0X47, 0XFF, 0XFF, 0X47, 0X9A, 0X13, 0X4, 0X6F, 0, 0, 0, 0, 0, 0X80, 0, 0X41, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, + { 0X87, 0XFF, 0XFF, 0X87, 0X23, 0X34, 0X9, 0X38, 0X47, 0XFF, 0XFF, 0X47, 0X9A, 0X13, 0X4, 0X6F, 0, 0, 0, 0, 0, 0, 0, 0X86, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, + { 0X5084, 0, 0, 0, 0, 0, 0, 0 }, + { 0X2, 0X811, 0X4517, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0XE4, 0X7F, 0XA0, 0X8F, 0XB1, 0X28, 0X37, 0X70, 0, 0X81, 0X10, 0X4C, 0X25, 0XF, 0XBA, 0X1B, 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X40, 0XD2, 0X80, 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0XAA, 0X7F, 0X7F, 0X8E, 0X84, 0X97, 0X69, 0XF5, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X7, 0, 0XFF, 0, 0, 0XFF, 0X6A, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0X77, 0XFF, 0XFF, 0X77, 0X2B, 0X35, 0X1B, 0XB7, 0X6A, 0XFF, 0XFF, 0X6A, 0X9A, 0X13, 0X7, 0X77, 0, 0, 0, 0, 0, 0X40, 0X80, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, + { 0X77, 0XFF, 0XFF, 0X77, 0X2B, 0X35, 0X1B, 0XB7, 0X6A, 0XFF, 0XFF, 0X6A, 0X9A, 0X13, 0X7, 0X77, 0, 0, 0, 0, 0, 0X80, 0, 0X41, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, + { 0X77, 0XFF, 0XFF, 0X77, 0X2B, 0X35, 0X1B, 0XB7, 0X6A, 0XFF, 0XFF, 0X6A, 0X9A, 0X13, 0X7, 0X77, 0, 0, 0, 0, 0, 0, 0, 0X86, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, + { 0XB184, 0, 0, 0, 0, 0, 0, 0 }, + } +}; + +#endif /* _VIA_CH7019_H_ */ diff --git a/src/via_common.h b/src/via_common.h new file mode 100644 index 0000000..db0a711 --- /dev/null +++ b/src/via_common.h @@ -0,0 +1,55 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_common.h,v 1.2 2003/08/27 15:16:08 tsi Exp $ */ + +#ifndef _VIA_COMMON_H_ +#define _VIA_COMMON_H_ 1 + +#include "xf86drm.h" + +/* WARNING: If you change any of these defines, make sure to change + * the kernel include file as well (via_drm.h) + */ + +/* Driver specific DRM command indices + * NOTE: these are not OS specific, but they are driver specific + */ + +#define DRM_VIA_ALLOCMEM 0 +#define DRM_VIA_FREEMEM 1 +#define DRM_VIA_AGP_INIT 2 +#define DRM_VIA_FB_INIT 3 +#define DRM_VIA_MAP_INIT 4 + +#define VIDEO 0 + +typedef struct +{ + unsigned int context; + unsigned int type; + unsigned int size; + unsigned long index; + unsigned long offset; +} drmViaMem; + +typedef struct { + unsigned int offset; + unsigned int size; +} drmViaAgp; + +typedef struct { + unsigned int offset; + unsigned int size; +} drmViaFb; + +typedef struct +{ + enum { + VIA_INIT_MAP = 0x01, + VIA_CLEANUP_MAP = 0x02 + } func; + unsigned long sarea_priv_offset; + unsigned long fb_offset; + unsigned long mmio_offset; + unsigned long agpAddr; +} drmViaInit; + +#endif /* _VIA_COMMON_H_ */ diff --git a/src/via_compose.h b/src/via_compose.h new file mode 100644 index 0000000..ec43963 --- /dev/null +++ b/src/via_compose.h @@ -0,0 +1,67 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_compose.h,v 1.2 2003/08/27 15:16:08 tsi Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/* Definition of APs Distribution */ +#ifndef _VIA_COMPOSE_H_ +#define _VIA_COMPOSE_H_ 1 + + /* Video Control definition */ +#define VW_DVD_ONLY 0x00000001 /* ????????????????? */ +#define VW_TV_ONLY 0x00000002 /* ????????????????? */ +/*#define VW_INTERNAL_OPAQUE 0x00000008 */ /* ????????????????? */ + +#define VW_DVD_TOP 0x00000010 /* ATOM("XV_COMPOSE") */ +#define VW_TV_TOP 0x00000020 /* ATOM("XV_COMPOSE") */ +#define VW_TV0_TOP 0x00000100 /* ATOM("XV_COMPOSE") */ +#define VW_TV1_TOP 0x00000200 /* ATOM("XV_COMPOSE") */ +/*#define VW_TV_FULL 0x00000400 */ /*Not recommended*/ + +#define VW_BOB_TV0 0x00010000 /* ATOM("XV_BOB") */ +#define VW_BOB_TV1 0x00020000 /* ATOM("XV_BOB") */ +/*#define VW_WEAVE_TV1 0x00040000 */ /* ATOM("XV_BOB") */ +/*#define VW_WEAVE_TV2 0x00080000 */ /* ATOM("XV_BOB") */ + +#define VW_HIGHQVDO_OFF 0x00000000 /* ATOM("XV_HIGHQVDO") */ +#define VW_HIGHQVDO_DVD 0x00000001 /* ATOM("XV_HIGHQVDO") */ +#define VW_HIGHQVDO_TV0 0x00000002 /* ATOM("XV_HIGHQVDO") */ +#define VW_HIGHQVDO_TV1 0x00000004 /* ATOM("XV_HIGHQVDO") */ + + /* Audio Control definition */ + /* Quality */ +#define AUDIO_STEREO 0x00000001 /* ATOM("XV_AUDIOCTRL") */ +#define AUDIO_SAP 0x00000002 /* ATOM("XV_AUDIOCTRL") */ +#define AUDIO_DUAL 0x00000004 /* ATOM("XV_AUDIOCTRL") */ + + /* Mute */ +#define AUDIO_ON 0x00000010 /* ATOM("XV_AUDIOCTRL") */ +#define AUDIO_OFF 0x00000020 /* ATOM("XV_AUDIOCTRL") */ + + /* Source */ +#define AUDIO_TV0 0x00000100 /* ATOM("XV_AUDIOCTRL") */ +#define AUDIO_TV1 0x00000200 /* ATOM("XV_AUDIOCTRL") */ +#define AUDIO_SVIDEO 0x00000400 /* not available now */ +#define AUDIO_COMPOSE 0x00000800 /* */ + +#endif /* _VIA_COMPOSE_H_ */ diff --git a/src/via_cursor.c b/src/via_cursor.c new file mode 100644 index 0000000..ef4a728 --- /dev/null +++ b/src/via_cursor.c @@ -0,0 +1,191 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_cursor.c,v 1.3 2003/08/27 15:16:08 tsi Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/************************************************************************* + * + * File: via_cursor.c + * Content: Hardware cursor support for VIA/S3G UniChrom + * + ************************************************************************/ + +#include "via_driver.h" + +static void VIALoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src); +static void VIASetCursorPosition(ScrnInfoPtr pScrn, int x, int y); +static void VIASetCursorColors(ScrnInfoPtr pScrn, int bg, int fg); + + +/* + * Read/write to the DAC via MMIO + */ + +#define inCRReg(reg) (VGAHWPTR(pScrn))->readCrtc(VGAHWPTR(pScrn), reg) +#define outCRReg(reg, val) (VGAHWPTR(pScrn))->writeCrtc(VGAHWPTR(pScrn), reg, val) +#define inStatus1() (VGAHWPTR(pScrn))->readST01(VGAHWPTR(pScrn)) + + +#define MAX_CURS 32 + +Bool +VIAHWCursorInit(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + VIAPtr pVia = VIAPTR(pScrn); + xf86CursorInfoPtr infoPtr; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAHWCursorInit\n")); + infoPtr = xf86CreateCursorInfoRec(); + if (!infoPtr) + return FALSE; + + pVia->CursorInfoRec = infoPtr; + + infoPtr->MaxWidth = MAX_CURS; + infoPtr->MaxHeight = MAX_CURS; + infoPtr->Flags = HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_32 | + HARDWARE_CURSOR_AND_SOURCE_WITH_MASK | + /*HARDWARE_CURSOR_SWAP_SOURCE_AND_MASK |*/ + HARDWARE_CURSOR_TRUECOLOR_AT_8BPP | + HARDWARE_CURSOR_INVERT_MASK | + HARDWARE_CURSOR_BIT_ORDER_MSBFIRST| + 0; + + infoPtr->SetCursorColors = VIASetCursorColors; + infoPtr->SetCursorPosition = VIASetCursorPosition; + infoPtr->LoadCursorImage = VIALoadCursorImage; + infoPtr->HideCursor = VIAHideCursor; + infoPtr->ShowCursor = VIAShowCursor; + infoPtr->UseHWCursor = NULL; + + if (!pVia->CursorStart) { + pVia->CursorStart = pVia->FBFreeEnd - VIA_CURSOR_SIZE; + pVia->FBFreeEnd -= VIA_CURSOR_SIZE; + + /* Set cursor location in frame buffer. */ + VIASETREG(VIA_REG_CURSOR_MODE, pVia->CursorStart); + } + + return xf86InitCursor(pScreen, infoPtr); +} + + + +void +VIAShowCursor(ScrnInfoPtr pScrn) +{ + VIAPtr pVia = VIAPTR(pScrn); + CARD32 dwCursorMode; + + dwCursorMode = VIAGETREG(VIA_REG_CURSOR_MODE); + + /* Turn on Hardware Cursor */ + VIASETREG(VIA_REG_CURSOR_MODE, dwCursorMode | 0x3); +} + + +void +VIAHideCursor(ScrnInfoPtr pScrn) +{ + VIAPtr pVia = VIAPTR(pScrn); + CARD32 dwCursorMode; + + dwCursorMode = VIAGETREG(VIA_REG_CURSOR_MODE); + + /* Turn cursor off. */ + VIASETREG(VIA_REG_CURSOR_MODE, dwCursorMode & 0xFFFFFFFE); +} + + +static void +VIALoadCursorImage(ScrnInfoPtr pScrn, unsigned char* src) +{ + VIAPtr pVia = VIAPTR(pScrn); + CARD32 dwCursorMode; + + WaitIdle(); + + dwCursorMode = VIAGETREG(VIA_REG_CURSOR_MODE); + + /* Turn cursor off. */ + VIASETREG(VIA_REG_CURSOR_MODE, dwCursorMode & 0xFFFFFFFE); + + /* Upload the cursor image to the frame buffer. */ + memcpy(pVia->FBBase + pVia->CursorStart, src, MAX_CURS * MAX_CURS / 8 * 2); + + /* Restore cursor status */ + VIASETREG(VIA_REG_CURSOR_MODE, dwCursorMode); +} + +static void +VIASetCursorPosition(ScrnInfoPtr pScrn, int x, int y) +{ + VIAPtr pVia = VIAPTR(pScrn); + VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; + unsigned char xoff, yoff; + CARD32 dwCursorMode; + + if (x < 0) { + xoff = ((-x) & 0xFE); + x = 0; + } else { + xoff = 0; + } + + if (y < 0) { + yoff = ((-y) & 0xFE); + y = 0; + } else { + yoff = 0; + /* LCD Expand Mode Cursor Y Position Re-Calculated */ + if (pBIOSInfo->scaleY) { + y = (int)(((pBIOSInfo->panelY * y) + (pBIOSInfo->resY >> 1)) / pBIOSInfo->resY); + } + } + + /* Hide cursor before set cursor position in order to avoid ghost cursor + * image when directly set cursor position. It should be a HW bug but + * we can use patch by SW. */ + dwCursorMode = VIAGETREG(VIA_REG_CURSOR_MODE); + + /* Turn cursor off. */ + VIASETREG(VIA_REG_CURSOR_MODE, dwCursorMode & 0xFFFFFFFE); + + VIASETREG(VIA_REG_CURSOR_ORG, ((xoff << 16) | (yoff & 0x003f))); + VIASETREG(VIA_REG_CURSOR_POS, ((x << 16) | (y & 0x07ff))); + + /* Restore cursor status */ + VIASETREG(VIA_REG_CURSOR_MODE, dwCursorMode); +} + + +static void +VIASetCursorColors(ScrnInfoPtr pScrn, int bg, int fg) +{ + VIAPtr pVia = VIAPTR(pScrn); + + VIASETREG(VIA_REG_CURSOR_FG, fg); + VIASETREG(VIA_REG_CURSOR_BG, bg); + +} diff --git a/src/via_dga.c b/src/via_dga.c new file mode 100644 index 0000000..8481c3a --- /dev/null +++ b/src/via_dga.c @@ -0,0 +1,355 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_dga.c,v 1.4 2003/08/27 15:16:08 tsi Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + + +#include "xaalocal.h" +#include "via_driver.h" +#include "dgaproc.h" + + +static Bool VIADGAOpenFramebuffer(ScrnInfoPtr, char **, unsigned char **, + int *, int *, int *); +static Bool VIADGASetMode(ScrnInfoPtr, DGAModePtr); +static int VIADGAGetViewport(ScrnInfoPtr); +static void VIADGASetViewport(ScrnInfoPtr, int, int, int); +static void VIADGAFillRect(ScrnInfoPtr, int, int, int, int, unsigned long); +static void VIADGABlitRect(ScrnInfoPtr, int, int, int, int, int, int); + + +static +DGAFunctionRec VIADGAFuncs = { + VIADGAOpenFramebuffer, + NULL, /* CloseFrameBuffer */ + VIADGASetMode, + VIADGASetViewport, + VIADGAGetViewport, + VIAAccelSync, + VIADGAFillRect, + VIADGABlitRect, + NULL /* BlitTransRect */ +}; + +#define DGATRACE 4 + + +static DGAModePtr +VIASetupDGAMode( + ScrnInfoPtr pScrn, + DGAModePtr modes, + int *num, + int bitsPerPixel, + int depth, + Bool pixmap, + int secondPitch, + unsigned long red, + unsigned long green, + unsigned long blue, + short visualClass +) +{ + VIAPtr pVia = VIAPTR(pScrn); + DGAModePtr mode, newmodes = NULL; + DisplayModePtr pMode, firstMode; + int otherPitch, Bpp = bitsPerPixel >> 3; + Bool oneMore; + + xf86ErrorFVerb(DGATRACE, " VIASetupDGAMode\n"); + + pMode = firstMode = pScrn->modes; + + /* + * DGA 1.0 would only provide modes where the depth and stride + * matched the current desktop. Some DGA apps might still expect + * this, so we provide them, too. + */ + + while (pMode) { + + otherPitch = secondPitch ? secondPitch : pMode->HDisplay; + + if (pMode->HDisplay != otherPitch) { + newmodes = xrealloc(modes, (*num + 2) * sizeof(DGAModeRec)); + oneMore = TRUE; + } + else { + newmodes = xrealloc(modes, (*num + 1) * sizeof(DGAModeRec)); + oneMore = FALSE; + } + + if (!newmodes) { + xfree(modes); + return NULL; + } + + modes = newmodes; + +SECOND_PASS: + + mode = modes + *num; + (*num)++; + + mode->mode = pMode; + mode->flags = DGA_CONCURRENT_ACCESS | DGA_PIXMAP_AVAILABLE; + + if(!pVia->NoAccel) + mode->flags |= DGA_FILL_RECT | DGA_BLIT_RECT; + + if (pMode->Flags & V_DBLSCAN) + mode->flags |= DGA_DOUBLESCAN; + + if (pMode->Flags & V_INTERLACE) + mode->flags |= DGA_INTERLACED; + + mode->byteOrder = pScrn->imageByteOrder; + mode->depth = depth; + mode->bitsPerPixel = bitsPerPixel; + mode->red_mask = red; + mode->green_mask = green; + mode->blue_mask = blue; + mode->visualClass = visualClass; + mode->viewportWidth = pMode->HDisplay; + mode->viewportHeight = pMode->VDisplay; + mode->xViewportStep = 2; + mode->yViewportStep = 1; + mode->viewportFlags = DGA_FLIP_RETRACE; + mode->offset = 0; + mode->address = pVia->FBBase; + + xf86ErrorFVerb(DGATRACE, + "VIADGAInit vpWid=%d, vpHgt=%d, Bpp=%d, mdbitsPP=%d\n", + mode->viewportWidth, + mode->viewportHeight, + Bpp, + mode->bitsPerPixel); + + if (oneMore) { /* first one is narrow width */ + mode->bytesPerScanline = ((pMode->HDisplay * Bpp) + 3) & ~3L; + mode->imageWidth = pMode->HDisplay; + mode->imageHeight = pMode->VDisplay; + mode->pixmapWidth = mode->imageWidth; + mode->pixmapHeight = mode->imageHeight; + mode->maxViewportX = mode->imageWidth - mode->viewportWidth; + + /* this might need to get clamped to some maximum */ + mode->maxViewportY = mode->imageHeight - mode->viewportHeight; + oneMore = FALSE; + + xf86ErrorFVerb(DGATRACE, + "VIADGAInit 1 imgHgt=%d, stride=%d\n", + mode->imageHeight, + mode->bytesPerScanline ); + + goto SECOND_PASS; + } + else { + mode->bytesPerScanline = ((pScrn->displayWidth * Bpp) + 3) & ~3L; + mode->imageWidth = pScrn->displayWidth; + mode->imageHeight = pVia->videoRambytes / mode->bytesPerScanline; + mode->pixmapWidth = mode->imageWidth; + mode->pixmapHeight = mode->imageHeight; + mode->maxViewportX = mode->imageWidth - mode->viewportWidth; + /* this might need to get clamped to some maximum */ + mode->maxViewportY = mode->imageHeight - mode->viewportHeight; + + xf86ErrorFVerb(DGATRACE, + "VIADGAInit 2 imgHgt=%d, stride=%d\n", + mode->imageHeight, + mode->bytesPerScanline); + } + + pMode = pMode->next; + + if (pMode == firstMode) + break; + } + + return modes; +} + + +Bool +VIADGAInit(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + VIAPtr pVia = VIAPTR(pScrn); + DGAModePtr modes = NULL; + int num = 0; + + xf86ErrorFVerb(DGATRACE, " VIADGAInit\n"); + + /* 8 */ + modes = VIASetupDGAMode(pScrn, modes, &num, 8, 8, + (pScrn->bitsPerPixel == 8), + (pScrn->bitsPerPixel != 8) ? 0 : pScrn->displayWidth, + 0, 0, 0, PseudoColor); + + /* 16 */ + modes = VIASetupDGAMode(pScrn, modes, &num, 16, 16, + (pScrn->bitsPerPixel == 16), + (pScrn->depth != 16) ? 0 : pScrn->displayWidth, + 0xf800, 0x07e0, 0x001f, TrueColor); + + modes = VIASetupDGAMode(pScrn, modes, &num, 16, 16, + (pScrn->bitsPerPixel == 16), + (pScrn->depth != 16) ? 0 : pScrn->displayWidth, + 0xf800, 0x07e0, 0x001f, DirectColor); + + /* 24-in-32 */ + modes = VIASetupDGAMode(pScrn, modes, &num, 32, 24, + (pScrn->bitsPerPixel == 32), + (pScrn->bitsPerPixel != 32) ? 0 : pScrn->displayWidth, + 0xff0000, 0x00ff00, 0x0000ff, TrueColor); + + modes = VIASetupDGAMode(pScrn, modes, &num, 32, 24, + (pScrn->bitsPerPixel == 32), + (pScrn->bitsPerPixel != 32) ? 0 : pScrn->displayWidth, + 0xff0000, 0x00ff00, 0x0000ff, DirectColor); + + pVia->numDGAModes = num; + pVia->DGAModes = modes; + + return DGAInit(pScreen, &VIADGAFuncs, modes, num); +} + + +static Bool +VIADGASetMode(ScrnInfoPtr pScrn, DGAModePtr pMode) +{ + int index = pScrn->pScreen->myNum; + VIAPtr pVia = VIAPTR(pScrn); + + if (!pMode) { /* restore the original mode */ + /* put the ScreenParameters back */ + + pScrn->displayWidth = pVia->DGAOldDisplayWidth; + pScrn->bitsPerPixel = pVia->DGAOldBitsPerPixel; + pScrn->depth = pVia->DGAOldDepth; + + VIASwitchMode(index, pScrn->currentMode, 0); + if (pVia->hwcursor) + VIAShowCursor(pScrn); + + pVia->DGAactive = FALSE; + } + else { +#if 0 + ErrorF("pScrn->bitsPerPixel %d, pScrn->depth %d\n", + pScrn->bitsPerPixel, pScrn->depth); + ErrorF(" want bitsPerPixel %d, want depth %d\n", + pMode->bitsPerPixel, pMode->depth); +#endif + + if (pVia->hwcursor) + VIAHideCursor(pScrn); + + if (!pVia->DGAactive) { /* save the old parameters */ + pVia->DGAOldDisplayWidth = pScrn->displayWidth; + pVia->DGAOldBitsPerPixel = pScrn->bitsPerPixel; + pVia->DGAOldDepth = pScrn->depth; + + pVia->DGAactive = TRUE; + } + + pScrn->bitsPerPixel = pMode->bitsPerPixel; + pScrn->depth = pMode->depth; + pScrn->displayWidth = pMode->bytesPerScanline / + (pMode->bitsPerPixel >> 3); + + VIASwitchMode(index, pMode->mode, 0); + } + + return TRUE; +} + + +static int +VIADGAGetViewport(ScrnInfoPtr pScrn) +{ + VIAPtr pVia = VIAPTR(pScrn); + return pVia->DGAViewportStatus; +} + + +static void +VIADGASetViewport(ScrnInfoPtr pScrn, int x, int y, int flags) +{ + VIAPtr pVia = VIAPTR(pScrn); + + VIAAdjustFrame(pScrn->pScreen->myNum, x, y, flags); + pVia->DGAViewportStatus = 0; /* MGAAdjustFrame loops until finished */ +} + + +static void +VIADGAFillRect(ScrnInfoPtr pScrn, int x, int y, int w, int h, unsigned long color) +{ + VIAPtr pVia = VIAPTR(pScrn); + + if (pVia->AccelInfoRec) { + (*pVia->AccelInfoRec->SetupForSolidFill)(pScrn, color, GXcopy, ~0); + (*pVia->AccelInfoRec->SubsequentSolidFillRect)(pScrn, x, y, w, h); + SET_SYNC_FLAG(pVia->AccelInfoRec); + } +} + + +static void +VIADGABlitRect(ScrnInfoPtr pScrn, int srcx, int srcy, int w, int h, + int dstx, int dsty) +{ + VIAPtr pVia = VIAPTR(pScrn); + + if (pVia->AccelInfoRec) { + int xdir = ((srcx < dstx) && (srcy == dsty)) ? -1 : 1; + int ydir = (srcy < dsty) ? -1 : 1; + + (*pVia->AccelInfoRec->SetupForScreenToScreenCopy)( + pScrn, xdir, ydir, GXcopy, ~0, -1); + (*pVia->AccelInfoRec->SubsequentScreenToScreenCopy)( + pScrn, srcx, srcy, dstx, dsty, w, h); + SET_SYNC_FLAG(pVia->AccelInfoRec); + } +} + + +static Bool +VIADGAOpenFramebuffer( + ScrnInfoPtr pScrn, + char **name, + unsigned char **mem, + int *size, + int *offset, + int *flags) +{ + VIAPtr pVia = VIAPTR(pScrn); + + *name = NULL; /* no special device */ + *mem = (unsigned char*)pVia->FrameBufferBase; + *size = pVia->videoRambytes; + *offset = 0; + *flags = DGA_NEED_ROOT; + + return TRUE; +} diff --git a/src/via_dri.c b/src/via_dri.c new file mode 100644 index 0000000..4e72eb9 --- /dev/null +++ b/src/via_dri.c @@ -0,0 +1,676 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_dri.c,v 1.9 2004/02/08 17:57:10 tsi Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ +#include "xf86.h" +#include "xf86_OSproc.h" +#include "xf86_ansic.h" +#include "xf86Priv.h" + +#include "xf86PciInfo.h" +#include "xf86Pci.h" + +#define _XF86DRI_SERVER_ +#include "GL/glxtokens.h" +#include "sarea.h" + +#include "via_driver.h" +#include "via_dri.h" +#include "via_common.h" +#include "xf86drm.h" + +extern void GlxSetVisualConfigs( + int nconfigs, + __GLXvisualConfig *configs, + void **configprivs +); + +#define VIDEO 0 +#define AGP 1 +#define AGP_PAGE_SIZE 4096 +#define AGP_PAGES 8192 +#define AGP_SIZE (AGP_PAGE_SIZE * AGP_PAGES) +#define AGP_CMDBUF_PAGES 256 +#define AGP_CMDBUF_SIZE (AGP_PAGE_SIZE * AGP_CMDBUF_PAGES) + +static char VIAKernelDriverName[] = "via"; +static char VIAClientDriverName[] = "via"; +int test_alloc_FB(ScreenPtr pScreen, VIAPtr pVia, int Size); +int test_alloc_AGP(ScreenPtr pScreen, VIAPtr pVia, int Size); +static Bool VIAInitVisualConfigs(ScreenPtr pScreen); +static Bool VIADRIAgpInit(ScreenPtr pScreen, VIAPtr pVia); +static Bool VIADRIPciInit(ScreenPtr pScreen, VIAPtr pVia); +static Bool VIADRIFBInit(ScreenPtr pScreen, VIAPtr pVia); +static Bool VIADRIKernelInit(ScreenPtr pScreen, VIAPtr pVia); +static Bool VIADRIMapInit(ScreenPtr pScreen, VIAPtr pVia); + +static Bool VIACreateContext(ScreenPtr pScreen, VisualPtr visual, + drmContext hwContext, void *pVisualConfigPriv, + DRIContextType contextStore); +static void VIADestroyContext(ScreenPtr pScreen, drmContext hwContext, + DRIContextType contextStore); +static void VIADRISwapContext(ScreenPtr pScreen, DRISyncType syncType, + DRIContextType readContextType, + void *readContextStore, + DRIContextType writeContextType, + void *writeContextStore); +static void VIADRIInitBuffers(WindowPtr pWin, RegionPtr prgn, CARD32 index); +static void VIADRIMoveBuffers(WindowPtr pParent, DDXPointRec ptOldOrg, + RegionPtr prgnSrc, CARD32 index); + + +static void VIADRIIrqInit( ScrnInfoPtr pScrn , VIADRIPtr pVIADRI) +{ + VIAPtr pVia = VIAPTR(pScrn); + + pVIADRI->irqEnabled = drmGetInterruptFromBusID + (pVia->drmFD, + ((pciConfigPtr)pVia->PciInfo->thisCard)->busnum, + ((pciConfigPtr)pVia->PciInfo->thisCard)->devnum, + ((pciConfigPtr)pVia->PciInfo->thisCard)->funcnum); + if ((drmCtlInstHandler(pVia->drmFD, pVIADRI->irqEnabled))) { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "[drm] Failure adding irq handler. " + "Falling back to irq-free operation.\n"); + pVIADRI->irqEnabled = 0; + } + + if (pVIADRI->irqEnabled) + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "[drm] Irq handler installed, using IRQ %d.\n", + pVIADRI->irqEnabled); +} + +static void VIADRIIrqExit( ScrnInfoPtr pScrn , VIADRIPtr pVIADRI) { + + VIAPtr pVia = VIAPTR(pScrn); + + if (pVIADRI->irqEnabled) { + if (drmCtlUninstHandler(pVia->drmFD)) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO,"[drm] Irq handler uninstalled.\n"); + } else { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[drm] Could not uninstall irq handler.\n"); + } + } +} + + + + +static Bool VIADRIAgpInit(ScreenPtr pScreen, VIAPtr pVia) +{ + unsigned long agp_phys; + drmAddress agpaddr; + VIADRIPtr pVIADRI; + DRIInfoPtr pDRIInfo; + pDRIInfo = pVia->pDRIInfo; + pVIADRI = pDRIInfo->devPrivate; + pVia->agpSize = 0; + + if (drmAgpAcquire(pVia->drmFD) < 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] drmAgpAcquire failed %d\n", errno); + return FALSE; + } + + if (drmAgpEnable(pVia->drmFD, drmAgpGetMode(pVia->drmFD)&~0x0) < 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] drmAgpEnable failed\n"); + return FALSE; + } + + xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] drmAgpEnabled succeeded\n"); + + if (drmAgpAlloc(pVia->drmFD, AGP_SIZE, 0, &agp_phys, &pVia->agpHandle) < 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[drm] drmAgpAlloc failed\n"); + drmAgpRelease(pVia->drmFD); + return FALSE; + } + + if (drmAgpBind(pVia->drmFD, pVia->agpHandle, 0) < 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[drm] drmAgpBind failed\n"); + drmAgpFree(pVia->drmFD, pVia->agpHandle); + drmAgpRelease(pVia->drmFD); + + return FALSE; + } + + pVia->agpSize = AGP_SIZE; + pVia->agpAddr = drmAgpBase(pVia->drmFD); + xf86DrvMsg(pScreen->myNum, X_INFO, + "[drm] agpAddr = 0x%08lx\n",pVia->agpAddr); + + pVIADRI->agp.size = pVia->agpSize; + if (drmAddMap(pVia->drmFD, (drmHandle)0, + pVIADRI->agp.size, DRM_AGP, 0, + &pVIADRI->agp.handle) < 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[drm] Failed to map public agp area\n"); + pVIADRI->agp.size = 0; + drmAgpUnbind(pVia->drmFD, pVia->agpHandle); + drmAgpFree(pVia->drmFD, pVia->agpHandle); + drmAgpRelease(pVia->drmFD); + return FALSE; + } + /* Map AGP from kernel to Xserver - Not really needed */ + drmMap(pVia->drmFD, pVIADRI->agp.handle, pVIADRI->agp.size, &agpaddr); + pVia->agpMappedAddr = agpaddr; + + xf86DrvMsg(pScreen->myNum, X_INFO, + "[drm] agpBase = %p\n", pVia->agpBase); + xf86DrvMsg(pScreen->myNum, X_INFO, + "[drm] agpAddr = 0x%08lx\n", pVia->agpAddr); + xf86DrvMsg(pScreen->myNum, X_INFO, + "[drm] agpSize = 0x%08x\n", pVia->agpSize); + xf86DrvMsg(pScreen->myNum, X_INFO, + "[drm] agp physical addr = 0x%08lx\n", agp_phys); + + { + drmViaAgp agp; + agp.offset = 0; + agp.size = AGP_SIZE; + if (drmCommandWrite(pVia->drmFD, DRM_VIA_AGP_INIT, &agp, + sizeof(drmViaAgp)) < 0) { + drmUnmap(agpaddr,pVia->agpSize); + drmRmMap(pVia->drmFD,pVIADRI->agp.handle); + drmAgpUnbind(pVia->drmFD, pVia->agpHandle); + drmAgpFree(pVia->drmFD, pVia->agpHandle); + drmAgpRelease(pVia->drmFD); + return FALSE; + } + } + + return TRUE; + +} +static Bool VIADRIFBInit(ScreenPtr pScreen, VIAPtr pVia) +{ + int FBSize = pVia->FBFreeEnd-pVia->FBFreeStart; + int FBOffset = pVia->FBFreeStart; + VIADRIPtr pVIADRI = pVia->pDRIInfo->devPrivate; + pVIADRI->fbOffset = FBOffset; + pVIADRI->fbSize = pVia->videoRambytes; + + { + drmViaFb fb; + fb.offset = FBOffset; + fb.size = FBSize; + + if (drmCommandWrite(pVia->drmFD, DRM_VIA_FB_INIT, &fb, + sizeof(drmViaFb)) < 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[drm] failed to init frame buffer area\n"); + return FALSE; + } else { + xf86DrvMsg(pScreen->myNum, X_INFO, + "[drm] FBFreeStart= 0x%08x FBFreeEnd= 0x%08x " + "FBSize= 0x%08x\n", + pVia->FBFreeStart, pVia->FBFreeEnd, FBSize); + return TRUE; + } + } +} + +static Bool VIADRIPciInit(ScreenPtr pScreen, VIAPtr pVia) +{ + return TRUE; +} + +static Bool +VIAInitVisualConfigs(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + VIAPtr pVia = VIAPTR(pScrn); + int numConfigs = 0; + __GLXvisualConfig *pConfigs = 0; + VIAConfigPrivPtr pVIAConfigs = 0; + VIAConfigPrivPtr *pVIAConfigPtrs = 0; + int i, db, stencil, accum; + + switch (pScrn->bitsPerPixel) { + case 8: + case 24: + break; + case 16: + case 32: + numConfigs = 8; + if (!(pConfigs = (__GLXvisualConfig*)xcalloc(sizeof(__GLXvisualConfig), + numConfigs))) + return FALSE; + if (!(pVIAConfigs = (VIAConfigPrivPtr)xcalloc(sizeof(VIAConfigPrivRec), + numConfigs))) { + xfree(pConfigs); + return FALSE; + } + if (!(pVIAConfigPtrs = (VIAConfigPrivPtr*)xcalloc(sizeof(VIAConfigPrivPtr), + numConfigs))) { + xfree(pConfigs); + xfree(pVIAConfigs); + return FALSE; + } + for (i=0; i<numConfigs; i++) + pVIAConfigPtrs[i] = &pVIAConfigs[i]; + + i = 0; + for (accum = 0; accum <= 1; accum++) { + for (stencil=0; stencil<=1; stencil++) { + for (db = 0; db <= 1; db++) { + pConfigs[i].vid = -1; + pConfigs[i].class = -1; + pConfigs[i].rgba = TRUE; + pConfigs[i].redSize = -1; + pConfigs[i].greenSize = -1; + pConfigs[i].blueSize = -1; + pConfigs[i].redMask = -1; + pConfigs[i].greenMask = -1; + pConfigs[i].blueMask = -1; + pConfigs[i].alphaMask = 0; + + if (accum) { + pConfigs[i].accumRedSize = 16; + pConfigs[i].accumGreenSize = 16; + pConfigs[i].accumBlueSize = 16; + pConfigs[i].accumAlphaSize = 16; + } + else { + pConfigs[i].accumRedSize = 0; + pConfigs[i].accumGreenSize = 0; + pConfigs[i].accumBlueSize = 0; + pConfigs[i].accumAlphaSize = 0; + } + if (db) + pConfigs[i].doubleBuffer = TRUE; + else + pConfigs[i].doubleBuffer = FALSE; + + pConfigs[i].stereo = FALSE; + pConfigs[i].bufferSize = -1; + + switch (stencil) { + case 0: + pConfigs[i].depthSize = 0; + pConfigs[i].stencilSize = 0; + break; + case 1: + pConfigs[i].depthSize = 16; + pConfigs[i].stencilSize = 0; + break; + case 2: + pConfigs[i].depthSize = 32; + pConfigs[i].stencilSize = 0; + break; + case 3: + pConfigs[i].depthSize = 24; + pConfigs[i].stencilSize = 8; + break; + } + + pConfigs[i].auxBuffers = 0; + pConfigs[i].level = 0; + pConfigs[i].visualRating = GLX_NONE_EXT; + pConfigs[i].transparentPixel = 0; + pConfigs[i].transparentRed = 0; + pConfigs[i].transparentGreen = 0; + pConfigs[i].transparentBlue = 0; + pConfigs[i].transparentAlpha = 0; + pConfigs[i].transparentIndex = 0; + i++; + } + } + } + + if (i != numConfigs) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[dri] Incorrect initialization of visuals. Disabling DRI.\n"); + return FALSE; + } + + break; + } + + pVia->numVisualConfigs = numConfigs; + pVia->pVisualConfigs = pConfigs; + pVia->pVisualConfigsPriv = pVIAConfigs; + GlxSetVisualConfigs(numConfigs, pConfigs, (void**)pVIAConfigPtrs); + + return TRUE; +} + +Bool VIADRIScreenInit(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + VIAPtr pVia = VIAPTR(pScrn); + DRIInfoPtr pDRIInfo; + VIADRIPtr pVIADRI; + + /* Check that the GLX, DRI, and DRM modules have been loaded by testing + * for canonical symbols in each module. */ + if (!xf86LoaderCheckSymbol("GlxSetVisualConfigs")) return FALSE; + if (!xf86LoaderCheckSymbol("DRIScreenInit")) return FALSE; + if (!xf86LoaderCheckSymbol("drmAvailable")) return FALSE; + if (!xf86LoaderCheckSymbol("DRIQueryVersion")) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[dri] VIADRIScreenInit failed (libdri.a too old)\n"); + return FALSE; + } + + /* Check the DRI version */ + { + int major, minor, patch; + DRIQueryVersion(&major, &minor, &patch); + if (major != 4 || minor < 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[dri] VIADRIScreenInit failed because of a version mismatch.\n" + "[dri] libDRI version is %d.%d.%d but version 4.0.x is needed.\n" + "[dri] Disabling DRI.\n", + major, minor, patch); + return FALSE; + } + } + + pDRIInfo = DRICreateInfoRec(); + + if (!pDRIInfo) return FALSE; + + pVia->pDRIInfo = pDRIInfo; + pDRIInfo->drmDriverName = VIAKernelDriverName; + pDRIInfo->clientDriverName = VIAClientDriverName; + pDRIInfo->busIdString = xalloc(64); + sprintf(pDRIInfo->busIdString, "PCI:%d:%d:%d", + ((pciConfigPtr)pVia->PciInfo->thisCard)->busnum, + ((pciConfigPtr)pVia->PciInfo->thisCard)->devnum, + ((pciConfigPtr)pVia->PciInfo->thisCard)->funcnum); + pDRIInfo->ddxDriverMajorVersion = VIA_VERSION_MAJOR; + pDRIInfo->ddxDriverMinorVersion = VIA_VERSION_MINOR; + pDRIInfo->ddxDriverPatchVersion = PATCHLEVEL; + pDRIInfo->frameBufferPhysicalAddress = pVia->FrameBufferBase; + pDRIInfo->frameBufferSize = pVia->videoRambytes; + + pDRIInfo->frameBufferStride = (pScrn->displayWidth * + pScrn->bitsPerPixel / 8); + pDRIInfo->ddxDrawableTableEntry = VIA_MAX_DRAWABLES; + + if (SAREA_MAX_DRAWABLES < VIA_MAX_DRAWABLES) + pDRIInfo->maxDrawableTableEntry = SAREA_MAX_DRAWABLES; + else + pDRIInfo->maxDrawableTableEntry = VIA_MAX_DRAWABLES; + +#ifdef NOT_DONE + /* FIXME need to extend DRI protocol to pass this size back to client + * for SAREA mapping that includes a device private record + */ + pDRIInfo->SAREASize = + ((sizeof(XF86DRISAREARec) + 0xfff) & 0x1000); /* round to page */ + /* + shared memory device private rec */ +#else + /* For now the mapping works by using a fixed size defined + * in the SAREA header + */ + if (sizeof(XF86DRISAREARec)+sizeof(VIASAREAPriv) > SAREA_MAX) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Data does not fit in SAREA\n"); + return FALSE; + } + pDRIInfo->SAREASize = SAREA_MAX; +#endif + + if (!(pVIADRI = (VIADRIPtr)xcalloc(sizeof(VIADRIRec),1))) { + DRIDestroyInfoRec(pVia->pDRIInfo); + pVia->pDRIInfo=0; + return FALSE; + } + pDRIInfo->devPrivate = pVIADRI; + pDRIInfo->devPrivateSize = sizeof(VIADRIRec); + pDRIInfo->contextSize = sizeof(VIADRIContextRec); + + pDRIInfo->CreateContext = VIACreateContext; + pDRIInfo->DestroyContext = VIADestroyContext; + pDRIInfo->SwapContext = VIADRISwapContext; + pDRIInfo->InitBuffers = VIADRIInitBuffers; + pDRIInfo->MoveBuffers = VIADRIMoveBuffers; + pDRIInfo->bufferRequests = DRI_ALL_WINDOWS; + + if (!DRIScreenInit(pScreen, pDRIInfo, &pVia->drmFD)) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[dri] DRIScreenInit failed. Disabling DRI.\n"); + xfree(pDRIInfo->devPrivate); + pDRIInfo->devPrivate=0; + DRIDestroyInfoRec(pVia->pDRIInfo); + pVia->pDRIInfo=0; + pVia->drmFD = -1; + return FALSE; + } + + + pVia->IsPCI = !VIADRIAgpInit(pScreen, pVia); + + if (pVia->IsPCI) { + VIADRIPciInit(pScreen, pVia); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[dri] use pci.\n" ); + } + else + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[dri] use agp.\n" ); + + if (!(VIADRIFBInit(pScreen, pVia))) { + VIADRICloseScreen(pScreen); + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[dri] frame buffer initialize fial .\n" ); + return FALSE; + } + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[dri] frame buffer initialized.\n" ); + + if (!(VIAInitVisualConfigs(pScreen))) { + VIADRICloseScreen(pScreen); + return FALSE; + } + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[dri] visual configs initialized.\n" ); + + /* DRIScreenInit doesn't add all the common mappings. Add additional mappings here. */ + if (!VIADRIMapInit(pScreen, pVia)) { + VIADRICloseScreen(pScreen); + return FALSE; + } + pVIADRI->regs.size = VIA_MMIO_REGSIZE; + pVIADRI->regs.map = 0; + pVIADRI->regs.handle = pVia->registerHandle; + xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] mmio Registers = 0x%08lx\n", + pVIADRI->regs.handle); + + pVIADRI->drixinerama = pVia->drixinerama; + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[dri] mmio mapped.\n" ); + + return TRUE; +} + +void +VIADRICloseScreen(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + VIAPtr pVia = VIAPTR(pScrn); + VIADRIPtr pVIADRI; + + if (pVia->agpSize) { + drmUnmap(pVia->agpMappedAddr,pVia->agpSize); + drmRmMap(pVia->drmFD,pVia->agpHandle); + drmAgpUnbind(pVia->drmFD, pVia->agpHandle); + xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Freeing agp memory\n"); + drmAgpFree(pVia->drmFD, pVia->agpHandle); + xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Releasing agp module\n"); + drmAgpRelease(pVia->drmFD); + } + + + DRICloseScreen(pScreen); + + if (pVia->pDRIInfo) { + if ((pVIADRI = (VIADRIPtr) pVia->pDRIInfo->devPrivate)) { + VIADRIIrqExit(pScrn, pVIADRI); + xfree(pVIADRI); + pVia->pDRIInfo->devPrivate=0; + } + DRIDestroyInfoRec(pVia->pDRIInfo); + pVia->pDRIInfo=0; + } + + if (pVia->pVisualConfigs) { + xfree(pVia->pVisualConfigs); + pVia->pVisualConfigs = NULL; + } + if (pVia->pVisualConfigsPriv) { + xfree(pVia->pVisualConfigsPriv); + pVia->pVisualConfigsPriv = NULL; + } +} + +/* TODO: xserver receives driver's swapping event and does something + * according the data initialized in this function. + */ +static Bool +VIACreateContext(ScreenPtr pScreen, VisualPtr visual, + drmContext hwContext, void *pVisualConfigPriv, + DRIContextType contextStore) +{ + return TRUE; +} + +static void +VIADestroyContext(ScreenPtr pScreen, drmContext hwContext, + DRIContextType contextStore) +{ +} + +Bool +VIADRIFinishScreenInit(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + VIAPtr pVia = VIAPTR(pScrn); + VIADRIPtr pVIADRI; + + pVia->pDRIInfo->driverSwapMethod = DRI_HIDE_X_CONTEXT; + + DRIFinishScreenInit(pScreen); + + if (!VIADRIKernelInit(pScreen, pVia)) { + VIADRICloseScreen(pScreen); + return FALSE; + } + xf86DrvMsg(pScreen->myNum, X_INFO, "[dri] kernel data initialized.\n"); + + /* set SAREA value */ + { + VIASAREAPriv *saPriv; + + saPriv=(VIASAREAPriv*)DRIGetSAREAPrivate(pScreen); + assert(saPriv); + memset(saPriv, 0, sizeof(*saPriv)); + saPriv->ctxOwner = -1; + } + pVIADRI=(VIADRIPtr)pVia->pDRIInfo->devPrivate; + pVIADRI->deviceID=pVia->Chipset; + pVIADRI->width=pScrn->virtualX; + pVIADRI->height=pScrn->virtualY; + pVIADRI->mem=pScrn->videoRam*1024; + pVIADRI->bytesPerPixel= (pScrn->bitsPerPixel+7) / 8; + pVIADRI->sarea_priv_offset = sizeof(XF86DRISAREARec); + /* TODO */ + pVIADRI->scrnX=pVIADRI->width; + pVIADRI->scrnY=pVIADRI->height; + + /* Initialize IRQ */ + VIADRIIrqInit(pScrn, pVIADRI); + + return TRUE; +} + +static void +VIADRISwapContext(ScreenPtr pScreen, DRISyncType syncType, + DRIContextType oldContextType, void *oldContext, + DRIContextType newContextType, void *newContext) +{ + /*ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + VIAPtr pVia = VIAPTR(pScrn); + */ + return; +} + +static void +VIADRIInitBuffers(WindowPtr pWin, RegionPtr prgn, CARD32 index) +{ + /*ScreenPtr pScreen = pWin->drawable.pScreen; + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + VIAPtr pVia = VIAPTR(pScrn); + */ + return; +} + +static void +VIADRIMoveBuffers(WindowPtr pParent, DDXPointRec ptOldOrg, + RegionPtr prgnSrc, CARD32 index) +{ + /*ScreenPtr pScreen = pParent->drawable.pScreen; + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + VIAPtr pVia = VIAPTR(pScrn); + */ + return; +} + +/* Initialize the kernel data structures. */ +static Bool VIADRIKernelInit(ScreenPtr pScreen, VIAPtr pVia) +{ + drmViaInit drmInfo; + memset(&drmInfo, 0, sizeof(drmViaInit)); + drmInfo.func = VIA_INIT_MAP; + drmInfo.sarea_priv_offset = sizeof(XF86DRISAREARec); + drmInfo.fb_offset = pVia->FrameBufferBase; + drmInfo.mmio_offset = pVia->registerHandle; + if (pVia->IsPCI) + drmInfo.agpAddr = (CARD32)NULL; + else + drmInfo.agpAddr = (CARD32)pVia->agpAddr; + + if ((drmCommandWrite(pVia->drmFD, DRM_VIA_MAP_INIT,&drmInfo, + sizeof(drmViaInit))) < 0) + return FALSE; + + + return TRUE; +} +/* Add a map for the MMIO registers */ +static Bool VIADRIMapInit(ScreenPtr pScreen, VIAPtr pVia) +{ + int flags = 0; + + if (drmAddMap(pVia->drmFD, pVia->MmioBase, VIA_MMIO_REGSIZE, + DRM_REGISTERS, flags, &pVia->registerHandle) < 0) { + return FALSE; + } + + xf86DrvMsg(pScreen->myNum, X_INFO, + "[drm] register handle = 0x%08lx\n", pVia->registerHandle); + + return TRUE; +} + + diff --git a/src/via_dri.h b/src/via_dri.h new file mode 100644 index 0000000..547a8ba --- /dev/null +++ b/src/via_dri.h @@ -0,0 +1,169 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_dri.h,v 1.2 2003/08/27 15:16:08 tsi Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef _VIA_DRI_H_ +#define _VIA_DRI_H_ 1 + +#include "drm.h" +#include "xf86drm.h" + +#define VIA_MAX_DRAWABLES 256 + +#define VIA_VERSION_MAJOR 4 +#define VIA_VERSION_MINOR 1 + +/* + * BEGIN compatibility with the DRM module via_drm.h + * Structures here MUST be the same as used in the drm module. + */ + +#define VIA_NR_SAREA_CLIPRECTS 8 +#define VIA_NR_TEX_REGIONS 64 + +/* + * + */ + + + +#define VIA_NR_XVMC_LOCKS 2 +#define VIA_MAX_CACHELINE_SIZE 64 +#define XVMCLOCKPTR(saPriv,lockNo) \ + ((volatile drmLock *)(((((unsigned long) (saPriv)->XvMCLockArea) + \ + (VIA_MAX_CACHELINE_SIZE - 1)) & \ + ~(VIA_MAX_CACHELINE_SIZE - 1)) + \ + VIA_MAX_CACHELINE_SIZE*(lockNo))) + +/* + * Potentially suspending lock for the decoder hardware. + */ + +#define XVMC_DECODER_FUTEX(saPriv) XVMCLOCKPTR(saPriv,0) + +/* + * Fast spinlock for exclusive read / writes in the XvMC part of the SAREA. + */ + +#define XVMC_SAREA_SPINLOCK(saPriv) XVMCLOCKPTR(saPriv,1) + +typedef struct _drm_via_tex_region { + unsigned char next, prev; /* indices to form a circular LRU */ + unsigned char inUse; /* owned by a client, or free? */ + int age; /* tracked by clients to update */ + /*local LRU's */ +} drm_via_tex_region_t; + + +typedef struct _drm_via_futex { + enum { + VIA_FUTEX_WAIT = 0x00, + VIA_FUTEX_WAKE = 0X01 + }fut; + unsigned int op; + unsigned int ms; + unsigned int lock; + unsigned int val; +} drm_via_futex_t; + + +typedef struct _drm_via_sarea { + unsigned int dirty; + unsigned int nbox; + drm_clip_rect_t boxes[VIA_NR_SAREA_CLIPRECTS]; + drm_via_tex_region_t texList[VIA_NR_TEX_REGIONS + 1]; + int texAge; /* last time texture was uploaded */ + int ctxOwner; /* last context to upload state */ + int vertexPrim; + + /* + * Below, common variables for XvMC. + */ + + unsigned + XvMCSubPicOn, + XvMCDisplaying, + XvMCCtxNoGrabbed; + /* + * We want the lock integers alone on, and aligned to, a cache line. + * Therefore this somewhat strange construct. + */ + + CARD8 XvMCLockArea[VIA_MAX_CACHELINE_SIZE * (VIA_NR_XVMC_LOCKS + 1)]; + +} drm_via_sarea_t; + +/* + * END compatibility region. + */ + + +typedef drm_via_sarea_t VIASAREAPriv; + +typedef struct { + drmHandle handle; + drmSize size; + drmAddress map; +} viaRegion, *viaRegionPtr; + +typedef struct { + viaRegion regs, agp; + int deviceID; + int width; + int height; + int mem; + int bytesPerPixel; + int priv1; + int priv2; + int fbOffset; + int fbSize; + Bool drixinerama; + + int backOffset; + int depthOffset; + int textureOffset; + int textureSize; + int irqEnabled; + unsigned int scrnX, scrnY; + int sarea_priv_offset; +} VIADRIRec, *VIADRIPtr; + +typedef struct { + int dummy; +} VIAConfigPrivRec, *VIAConfigPrivPtr; + +typedef struct { + int dummy; +} VIADRIContextRec, *VIADRIContextPtr; + +#ifdef XFree86Server + +#include "screenint.h" + +Bool VIADRIScreenInit(ScreenPtr pScreen); +void VIADRICloseScreen(ScreenPtr pScreen); +Bool VIADRIFinishScreenInit(ScreenPtr pScreen); + +#endif /* XFree86Server */ +#endif /* _VIA_DRI_H_ */ diff --git a/src/via_driver.c b/src/via_driver.c new file mode 100644 index 0000000..d40f4a2 --- /dev/null +++ b/src/via_driver.c @@ -0,0 +1,3399 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_driver.c,v 1.29 2004/02/20 21:46:35 dawes Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/************************************************************************* + * + * File: via_driver.c + * Content: XFree86 4.0 for VIA/S3G UniChrom + * + ************************************************************************/ + +#include "xf86RAC.h" +#include "shadowfb.h" + +#include "globals.h" +#define DPMS_SERVER +#include "extensions/dpms.h" + + +#include "via_driver.h" +#include "via_video.h" +#include "videodev.h" +#include "via_swov.h" + +#include "ddmpeg.h" +#include "via_capture.h" +#include "via.h" +#ifdef XF86DRI +#include "dri.h" +#endif + +/* + * prototypes + */ + +static void VIAIdentify(int flags); +static Bool VIAProbe(DriverPtr drv, int flags); +static Bool VIAPreInit(ScrnInfoPtr pScrn, int flags); +static Bool VIAEnterVT(int scrnIndex, int flags); +static void VIALeaveVT(int scrnIndex, int flags); +static void VIASave(ScrnInfoPtr pScrn); +static void VIAWriteMode(ScrnInfoPtr pScrn, vgaRegPtr, VIARegPtr); +static Bool VIAModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode); +static Bool VIACloseScreen(int scrnIndex, ScreenPtr pScreen); +static Bool VIASaveScreen(ScreenPtr pScreen, int mode); +static void VIALoadPalette(ScrnInfoPtr pScrn, int numColors, int *indicies, + LOCO *colors, VisualPtr pVisual); +static Bool VIAScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, + char **argv); +static int VIAInternalScreenInit(int scrnIndex, ScreenPtr pScreen); +static void VIAFreeScreen(int scrnIndex, int flags); +static ModeStatus VIAValidMode(int index, DisplayModePtr mode, + Bool verbose, int flags); +static void VIADPMS(ScrnInfoPtr pScrn, int mode, int flags); +static const OptionInfoRec * VIAAvailableOptions(int chipid, int busid); + + +static void VIAEnableMMIO(ScrnInfoPtr pScrn); +static void VIADisableMMIO(ScrnInfoPtr pScrn); +static Bool VIAMapMMIO(ScrnInfoPtr pScrn); +static Bool VIAMapFB(ScrnInfoPtr pScrn); +static void VIAUnmapMem(ScrnInfoPtr pScrn); +Bool VIADeviceSelection(ScrnInfoPtr pScrn); +Bool VIADeviceDispatch(ScrnInfoPtr pScrn); + +#ifdef XF86DRI +void VIAInitialize3DEngine(ScrnInfoPtr pScrn); +#endif + +DriverRec VIA = +{ + VIA_VERSION, + DRIVER_NAME, + VIAIdentify, + VIAProbe, + VIAAvailableOptions, + NULL, + 0 +}; + + +/* Supported chipsets */ + +static SymTabRec VIAChipsets[] = { + {VIA_CLE266, "CLE266"}, + {VIA_KM400, "KM400"}, + {VIA_K8M800, "K8M800"}, + {-1, NULL } +}; + + +/* This table maps a PCI device ID to a chipset family identifier. */ + +static PciChipsets VIAPciChipsets[] = { + {VIA_CLE266, PCI_CHIP_CLE3122, RES_SHARED_VGA}, + {VIA_CLE266, PCI_CHIP_CLE3022, RES_SHARED_VGA}, + {VIA_KM400, PCI_CHIP_VT7205, RES_SHARED_VGA}, + {VIA_KM400, PCI_CHIP_VT3205, RES_SHARED_VGA}, + {VIA_K8M800, PCI_CHIP_VT7204, RES_SHARED_VGA}, + {VIA_K8M800, PCI_CHIP_VT3204, RES_SHARED_VGA}, + {-1, -1, RES_UNDEFINED} +}; + +int gVIAEntityIndex = -1; + +typedef enum { + OPTION_A2, + OPTION_PCI_BURST, + OPTION_PCI_RETRY, + OPTION_NOACCEL, + OPTION_SWCURSOR, + OPTION_HWCURSOR, + OPTION_SHADOW_FB, + OPTION_ROTATE, + OPTION_USEBIOS, + OPTION_VIDEORAM, + OPTION_ACTIVEDEVICE, + OPTION_LCDDUALEDGE, + OPTION_BUSWIDTH, + OPTION_CENTER, + OPTION_PANELSIZE, + OPTION_TVDOTCRAWL, + OPTION_TVTYPE, + OPTION_TVOUTPUT, + OPTION_TVVSCAN, + OPTION_TVHSCALE, + OPTION_TVENCODER, + OPTION_REFRESH, + OPTION_DISABLEVQ, + OPTION_CAP0_DEINTERLACE, + OPTION_CAP1_DEINTERLACE, + OPTION_CAP0_FIELDSWAP, + OPTION_DRIXINERAMA +} VIAOpts; + + +static OptionInfoRec VIAOptions[] = +{ + {OPTION_A2, "A2", OPTV_BOOLEAN, {0}, FALSE}, + {OPTION_NOACCEL, "NoAccel", OPTV_BOOLEAN, {0}, FALSE}, + {OPTION_HWCURSOR, "HWCursor", OPTV_BOOLEAN, {0}, FALSE}, + {OPTION_SWCURSOR, "SWCursor", OPTV_BOOLEAN, {0}, FALSE}, + {OPTION_SHADOW_FB, "ShadowFB", OPTV_BOOLEAN, {0}, FALSE}, + {OPTION_ROTATE, "Rotate", OPTV_ANYSTR, {0}, FALSE}, + {OPTION_USEBIOS, "UseBIOS", OPTV_BOOLEAN, {0}, FALSE}, + {OPTION_VIDEORAM, "VideoRAM", OPTV_INTEGER, {0}, FALSE}, + {OPTION_ACTIVEDEVICE, "ActiveDevice", OPTV_ANYSTR, {0}, FALSE}, + {OPTION_LCDDUALEDGE, "LCDDualEdge", OPTV_BOOLEAN, {0}, FALSE}, + {OPTION_BUSWIDTH, "BusWidth", OPTV_ANYSTR, {0}, FALSE}, + {OPTION_CENTER, "Center", OPTV_BOOLEAN, {0}, FALSE}, + {OPTION_PANELSIZE, "PanelSize", OPTV_ANYSTR, {0}, FALSE}, + {OPTION_TVDOTCRAWL, "TVDotCrawl", OPTV_BOOLEAN, {0}, FALSE}, + {OPTION_TVTYPE, "TVType", OPTV_ANYSTR, {0}, FALSE}, + {OPTION_TVOUTPUT, "TVOutput", OPTV_ANYSTR, {0}, FALSE}, + {OPTION_TVVSCAN, "TVVScan", OPTV_ANYSTR, {0}, FALSE}, + {OPTION_TVHSCALE, "TVHScale", OPTV_ANYSTR, {0}, FALSE}, + {OPTION_TVENCODER, "TVEncoder", OPTV_ANYSTR, {0}, FALSE}, + {OPTION_REFRESH, "Refresh", OPTV_INTEGER, {0}, FALSE}, + {OPTION_DISABLEVQ, "DisableVQ", OPTV_BOOLEAN, {0}, FALSE}, + {OPTION_CAP0_DEINTERLACE, "Cap0Deinterlace", OPTV_ANYSTR, {0}, FALSE}, + {OPTION_CAP1_DEINTERLACE, "Cap1Deinterlace", OPTV_ANYSTR, {0}, FALSE}, + {OPTION_CAP0_FIELDSWAP, "Cap0FieldSwap", OPTV_BOOLEAN, {0}, FALSE}, + {OPTION_DRIXINERAMA, "DRIXINERAMA", OPTV_BOOLEAN, {0}, FALSE}, + {-1, NULL, OPTV_NONE, {0}, FALSE} +}; + + +static const char *vgaHWSymbols[] = { + "vgaHWGetHWRec", + "vgaHWSetMmioFuncs", + "vgaHWSetStdFuncs", + "vgaHWGetIOBase", + "vgaHWSave", + "vgaHWProtect", + "vgaHWRestore", + "vgaHWMapMem", + "vgaHWUnmapMem", + "vgaHWInit", + "vgaHWSaveScreen", + "vgaHWLock", + "vgaHWUnlock", + "vgaHWFreeHWRec", + NULL +}; + + +static const char *ramdacSymbols[] = { + "xf86InitCursor", + "xf86CreateCursorInfoRec", + "xf86DestroyCursorInfoRec", + NULL +}; + +static const char *vbeSymbols[] = { + "VBEInit", + "vbeDoEDID", + "vbeFree", + NULL +}; + +static const char *ddcSymbols[] = { + "xf86PrintEDID", + "xf86DoEDID_DDC1", + "xf86DoEDID_DDC2", + "xf86SetDDCproperties", + NULL +}; + + +static const char *i2cSymbols[] = { + "xf86CreateI2CBusRec", + "xf86I2CBusInit", + "xf86CreateI2CDevRec", + "xf86I2CDevInit", + "xf86I2CWriteRead", + "xf86I2CProbeAddress", + "xf86DestroyI2CDevRec", + NULL +}; + +static const char *xaaSymbols[] = { + "XAACopyROP", + "XAACopyROP_PM", + "XAAPatternROP", + "XAACreateInfoRec", + "XAADestroyInfoRec", + "XAAInit", + "XAAFillSolidRects", + NULL +}; + +static const char *shadowSymbols[] = { + "ShadowFBInit", + NULL +}; + +#ifdef USE_FB +static const char *fbSymbols[] = { + "fbScreenInit", + "fbPictureInit", + NULL +}; +#else +static const char *cfbSymbols[] = { + "cfbScreenInit", + "cfb16ScreenInit", + "cfb24ScreenInit", + "cfb24_32ScreenInit", + "cfb32ScreenInit", + "cfb16BresS", + "cfb24BresS", + NULL +}; +#endif + +#ifdef XFree86LOADER +#ifdef XF86DRI +static const char *drmSymbols[] = { + "drmAddBufs", + "drmAddMap", + "drmAgpAcquire", + "drmAgpAlloc", + "drmAgpBase", + "drmAgpBind", + "drmAgpDeviceId", + "drmAgpEnable", + "drmAgpFree", + "drmAgpGetMode", + "drmAgpRelease", + "drmAgpVendorId", + "drmCtlInstHandler", + "drmCtlUninstHandler", + "drmCommandNone", + "drmCommandWrite", + "drmFreeVersion", + "drmGetInterruptFromBusID", + "drmGetLibVersion", + "drmGetVersion", + "drmMap", + "drmMapBufs", + "drmUnmap", + "drmUnmapBufs", + "drmAgpUnbind", + "drmRmMap", + "drmCreateContext", + "drmAuthMagic", + "drmDestroyContext", + "drmSetContextFlags", + NULL +}; + +static const char *driSymbols[] = { + "DRICloseScreen", + "DRICreateInfoRec", + "DRIDestroyInfoRec", + "DRIFinishScreenInit", + "DRIGetSAREAPrivate", + "DRILock", + "DRIQueryVersion", + "DRIScreenInit", + "DRIUnlock", + "DRIOpenConnection", + "DRICloseConnection", + "GlxSetVisualConfigs", + NULL +}; +#endif + +static MODULESETUPPROTO(VIASetup); + +static XF86ModuleVersionInfo VIAVersRec = { + "via", + MODULEVENDORSTRING, + MODINFOSTRING1, + MODINFOSTRING2, + XF86_VERSION_CURRENT, + VERSION_MAJOR, VERSION_MINOR, PATCHLEVEL, + ABI_CLASS_VIDEODRV, + ABI_VIDEODRV_VERSION, + MOD_CLASS_VIDEODRV, + {0, 0, 0, 0} +}; + +XF86ModuleData viaModuleData = {&VIAVersRec, VIASetup, NULL}; + +static void +viaFillGraphicInfo(ScrnInfoPtr pScrn) +{ + VIAPtr pVia = VIAPTR(pScrn); + VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; + LPVIAGRAPHICINFO graphicInfo = &(pVia->graphicInfo); + LPSCREENINFO Screen; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "viaFillGraphicInfo\n")); + + /* vfInitHWDiff(); */ + if (pVia->IsSecondary) { + /* So far we have only used this when !pVia->IsSecondary */ + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using viaFillGraphicInfo on secondary screen.\n"); + Screen = &(graphicInfo->Screen[1]); + } else + Screen = &(graphicInfo->Screen[0]); + + Screen->TotalVRAM = pVia->videoRambytes; + Screen->VideoHeapBase = (unsigned long) pVia->FBFreeStart; + Screen->VideoHeapEnd = (unsigned long) (pVia->FBFreeEnd - 1); + Screen->dwWidth = pBIOSInfo->CrtcHDisplay; + Screen->dwHeight = pBIOSInfo->CrtcVDisplay; + Screen->dwSaveWidth = pBIOSInfo->SaveHDisplay; + Screen->dwSaveHeight = pBIOSInfo->SaveVDisplay; + Screen->dwBPP = pScrn->bitsPerPixel; + Screen->dwPitch = (((pScrn->virtualX) + 15) & ~15) * (pScrn->bitsPerPixel) / 8; + Screen->dwRefreshRate = (unsigned long)pBIOSInfo->FoundRefresh; + Screen->dwDVIOn = pBIOSInfo->DVIAttach; + Screen->dwLCDOn = pBIOSInfo->LCDAttach; + + if (pBIOSInfo->SaveHDisplay > pBIOSInfo->CrtcHDisplay) + Screen->dwPanning = 1; + else + Screen->dwPanning = 0; + + Screen->dwExpand = pBIOSInfo->scaleY; + Screen->dwPanelWidth = pBIOSInfo->panelX; + Screen->dwPanelHeight = pBIOSInfo->panelY; + Screen->dwActiveDevice = pBIOSInfo->ActiveDevice; + + graphicInfo->RevisionID = pVia->ChipRev; + graphicInfo->dwDeviceID = pVia->ChipId; + graphicInfo->SAMM = pBIOSInfo->SAMM; + graphicInfo->dwActiveDevice = pVia->ActiveDevice; + + /* Added to pass DRM info to V4L */ +#ifdef XF86DRI + graphicInfo->DRMEnabled = pVia->directRenderingEnabled; +#else + graphicInfo->DRMEnabled = 0; +#endif +} + +static pointer VIASetup(pointer module, pointer opts, int *errmaj, int *errmin) +{ + static Bool setupDone = FALSE; + + if (!setupDone) { + setupDone = TRUE; + xf86AddDriver(&VIA, module, 0); + LoaderRefSymLists(vgaHWSymbols, +#ifdef USE_FB + fbSymbols, +#else + cfbSymbols, +#endif + ramdacSymbols, + xaaSymbols, + shadowSymbols, + vbeSymbols, + i2cSymbols, + ddcSymbols, + /* + mpegSymbols, + */ +#ifdef XF86DRI + drmSymbols, + driSymbols, +#endif + NULL); + + return (pointer) 1; + } + else { + if (errmaj) + *errmaj = LDR_ONCEONLY; + + return NULL; + } +} /* VIASetup */ + +#endif /* XFree86LOADER */ + + +static int +WaitIdleCLE266(VIAPtr pVia) +{ + int loop = 0; + + mem_barrier(); + + while (!(VIAGETREG(VIA_REG_STATUS) & VIA_VR_QUEUE_BUSY) && (loop++ < MAXLOOP)) + ; + + while ((VIAGETREG(VIA_REG_STATUS) & + (VIA_CMD_RGTR_BUSY | VIA_2D_ENG_BUSY | VIA_3D_ENG_BUSY)) && + (loop++ < MAXLOOP)) + ; + + return loop >= MAXLOOP; +} + + +static Bool VIAGetRec(ScrnInfoPtr pScrn) +{ + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAGetRec\n")); + if (pScrn->driverPrivate) + return TRUE; + + pScrn->driverPrivate = xnfcalloc(sizeof(VIARec), 1); + ((VIARec *)(pScrn->driverPrivate))->pBIOSInfo = + xnfcalloc(sizeof(VIABIOSInfoRec), 1); + ((VIARec *)(pScrn->driverPrivate))->pBIOSInfo->UserSetting = + xnfcalloc(sizeof(VIAUserSettingRec), 1); + ((VIARec *)(pScrn->driverPrivate))->pBIOSInfo->pModeTable = + xnfcalloc(sizeof(VIAModeTableRec), 1); + + /* initial value in VIARec */ + ((VIARec *)(pScrn->driverPrivate))->SavedReg.mode = 0xFF; + ((VIARec *)(pScrn->driverPrivate))->ModeReg.mode = 0xFF; + + ((VIARec *)(pScrn->driverPrivate))->pBIOSInfo->FirstInit = TRUE; + + ((VIARec *)(pScrn->driverPrivate))->V4Lfd = -1; + + return TRUE; + +} /* VIAGetRec */ + + +static void VIAFreeRec(ScrnInfoPtr pScrn) +{ + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAFreeRec\n")); + if (!pScrn->driverPrivate) + return; + + if (VIAPTR(pScrn)->pVbe) + vbeFree(VIAPTR(pScrn)->pVbe); + + xfree(((VIARec *)(pScrn->driverPrivate))->pBIOSInfo->pModeTable); + xfree(((VIARec *)(pScrn->driverPrivate))->pBIOSInfo->UserSetting); + xfree(((VIARec *)(pScrn->driverPrivate))->pBIOSInfo); + ViaTunerDestroy(pScrn); + xfree(pScrn->driverPrivate); + pScrn->driverPrivate = NULL; + + VIAUnmapMem(pScrn); + +} /* VIAFreeRec */ + + +static const OptionInfoRec * VIAAvailableOptions(int chipid, int busid) +{ + + return VIAOptions; + +} /* VIAAvailableOptions */ + + +static void VIAIdentify(int flags) +{ + xf86PrintChipsets("VIA", "driver for VIA chipsets", VIAChipsets); +} /* VIAIdentify */ + + +static Bool VIAProbe(DriverPtr drv, int flags) +{ + GDevPtr *devSections; + int *usedChips; + int numDevSections; + int numUsed; + Bool foundScreen = FALSE; + int i; + + /* sanity checks */ + if ((numDevSections = xf86MatchDevice(DRIVER_NAME, &devSections)) <= 0) + return FALSE; + + if (xf86GetPciVideoInfo() == NULL) + return FALSE; + + numUsed = xf86MatchPciInstances(DRIVER_NAME, + PCI_VIA_VENDOR_ID, + VIAChipsets, + VIAPciChipsets, + devSections, + numDevSections, + drv, + &usedChips); + xfree(devSections); + + if (numUsed <= 0) + return FALSE; + + if (flags & PROBE_DETECT) { + foundScreen = TRUE; + } + else { + for (i = 0; i < numUsed; i++) { + ScrnInfoPtr pScrn = xf86AllocateScreen(drv, 0); + EntityInfoPtr pEnt; + if ((pScrn = xf86ConfigPciEntity(pScrn, 0, usedChips[i], + VIAPciChipsets, 0, 0, 0, 0, 0))) + { + pScrn->driverVersion = VIA_VERSION; + pScrn->driverName = DRIVER_NAME; + pScrn->name = "VIA"; + pScrn->Probe = VIAProbe; + pScrn->PreInit = VIAPreInit; + pScrn->ScreenInit = VIAScreenInit; + pScrn->SwitchMode = VIASwitchMode; + pScrn->AdjustFrame = VIAAdjustFrame; + pScrn->EnterVT = VIAEnterVT; + pScrn->LeaveVT = VIALeaveVT; + pScrn->FreeScreen = VIAFreeScreen; + pScrn->ValidMode = VIAValidMode; + foundScreen = TRUE; + } + /* + xf86ConfigActivePciEntity(pScrn, + usedChips[i], + VIAPciChipsets, + NULL, + NULL, + NULL, + NULL, + NULL); + */ + + pEnt = xf86GetEntityInfo(usedChips[i]); + + /* CLE266 card support Dual-Head, mark the entity as sharable*/ + if(pEnt->chipset == VIA_CLE266 || pEnt->chipset == VIA_KM400) + { + static int instance = 0; + DevUnion* pPriv; + + xf86SetEntitySharable(usedChips[i]); + xf86SetEntityInstanceForScreen(pScrn, + pScrn->entityList[0], instance); + + if(gVIAEntityIndex < 0) + { + gVIAEntityIndex = xf86AllocateEntityPrivateIndex(); + pPriv = xf86GetEntityPrivate(pScrn->entityList[0], + gVIAEntityIndex); + + if (!pPriv->ptr) + { + VIAEntPtr pVIAEnt; + pPriv->ptr = xnfcalloc(sizeof(VIAEntRec), 1); + pVIAEnt = pPriv->ptr; + pVIAEnt->IsDRIEnabled = FALSE; + pVIAEnt->BypassSecondary = FALSE; + pVIAEnt->HasSecondary = FALSE; + pVIAEnt->IsSecondaryRestored = FALSE; + } + } + instance++; + } + xfree(pEnt); + } + } + + xfree(usedChips); + + return foundScreen; + +} /* VIAProbe */ + + +static int LookupChipID(PciChipsets* pset, int ChipID) +{ + /* Is there a function to do this for me? */ + while (pset->numChipset >= 0) + { + if (pset->PCIid == ChipID) + return pset->numChipset; + + pset++; + } + + return -1; + +} /* LookupChipID */ + +#if 0 +/* see VIAddc1 */ +static unsigned int +VIAddc1Read(ScrnInfoPtr pScrn) +{ + register vgaHWPtr hwp = VGAHWPTR(pScrn); + VIAPtr pVia = VIAPTR(pScrn); + register CARD8 tmp; + + while (hwp->readST01(hwp)&0x8) {}; + while (!(hwp->readST01(hwp)&0x8)) {}; + + VGAOUT8(0x3c4, 0x26); + tmp = VGAIN8(0x3c5); + return ((unsigned int) ((tmp & 0x08) >> 3)); +} +#endif + +static xf86MonPtr +VIAddc1(int scrnIndex, VIAPtr pVia) +{ +#if 0 + /* broken on cle266 & km400. see bug 812. */ + + xf86MonPtr pMon; + CARD8 tmp; + + DEBUG(xf86DrvMsg(scrnIndex, X_INFO, "VIAddc1\n")); + + /* initialize chipset */ + VGAOUT8(0x3c4, 0x26); + tmp = VGAIN8(0x3c5); + + VGAOUT8(0x3c4, 0x26); + VGAOUT8(0x3c5, (tmp | 0x11)); + + pMon = xf86DoEDID_DDC1(scrnIndex, vgaHWddc1SetSpeed, VIAddc1Read); + + /* undo initialization */ + VGAOUT8(0x3c4, 0x26); + VGAOUT8(0x3c5, tmp); + + return pMon; +#else + return NULL; +#endif +} + +static void +VIAProbeDDC(ScrnInfoPtr pScrn, int index) +{ + vbeInfoPtr pVbe; + + if (xf86LoadSubModule(pScrn, "vbe")) { + xf86LoaderReqSymLists(vbeSymbols, NULL); + pVbe = VBEInit(NULL,index); + ConfiguredMonitor = vbeDoEDID(pVbe, NULL); + vbeFree(pVbe); + } +} + + +static Bool VIAPreInit(ScrnInfoPtr pScrn, int flags) +{ + EntityInfoPtr pEnt; + VIAPtr pVia; + VIABIOSInfoPtr pBIOSInfo; + MessageType from = X_DEFAULT; + ClockRangePtr clockRanges; + char *s = NULL; +#ifndef USE_FB + char *mod = NULL; + const char *reqSym = NULL; +#endif + vgaHWPtr hwp; + int i, bMemSize = 0; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAPreInit\n")); + + if (pScrn->numEntities > 1) + return FALSE; + + if (flags & PROBE_DETECT) + return FALSE; + + if (!xf86LoadSubModule(pScrn, "vgahw")) + return FALSE; + + xf86LoaderReqSymLists(vgaHWSymbols, NULL); + if (!vgaHWGetHWRec(pScrn)) + return FALSE; + +#if 0 + /* Here we can alter the number of registers saved and restored by the + * standard vgaHWSave and Restore routines. + */ + vgaHWSetRegCounts(pScrn, VGA_NUM_CRTC, VGA_NUM_SEQ, VGA_NUM_GFX, VGA_NUM_ATTR); +#endif + + if (!VIAGetRec(pScrn)) { + return FALSE; + } + + pVia = VIAPTR(pScrn); + pBIOSInfo = pVia->pBIOSInfo; + + pVia->IsSecondary = FALSE; + pEnt = xf86GetEntityInfo(pScrn->entityList[0]); + if (pEnt->resources) { + xfree(pEnt); + VIAFreeRec(pScrn); + return FALSE; + } + + pVia->EntityIndex = pEnt->index; + + if(xf86IsEntityShared(pScrn->entityList[0])) + { + if(xf86IsPrimInitDone(pScrn->entityList[0])) + { + DevUnion* pPriv; + VIAEntPtr pVIAEnt; + VIAPtr pVia1; + + pVia->IsSecondary = TRUE; + pPriv = xf86GetEntityPrivate(pScrn->entityList[0], + gVIAEntityIndex); + pVIAEnt = pPriv->ptr; + if (pVIAEnt->BypassSecondary) { + xfree(pEnt); + VIAFreeRec(pScrn); + return FALSE; + } + pVIAEnt->pSecondaryScrn = pScrn; + pVIAEnt->HasSecondary = TRUE; + pVia1 = VIAPTR(pVIAEnt->pPrimaryScrn); + pVia1->HasSecondary = TRUE; + pVia->sharedData = pVia1->sharedData; + } + else + { + DevUnion* pPriv; + VIAEntPtr pVIAEnt; + + xf86SetPrimInitDone(pScrn->entityList[0]); + pPriv = xf86GetEntityPrivate(pScrn->entityList[0], + gVIAEntityIndex); + pVia->sharedData = xnfcalloc(sizeof(ViaSharedRec),1); + pVIAEnt = pPriv->ptr; + pVIAEnt->pPrimaryScrn = pScrn; + pVIAEnt->IsDRIEnabled = FALSE; + pVIAEnt->BypassSecondary = FALSE; + pVIAEnt->HasSecondary = FALSE; + pVIAEnt->RestorePrimary = FALSE; + pVIAEnt->IsSecondaryRestored = FALSE; + } + } else { + pVia->sharedData = xnfcalloc(sizeof(ViaSharedRec),1); + } + + if (flags & PROBE_DETECT) { + VIAProbeDDC(pScrn, pVia->EntityIndex); + return TRUE; + } + + pScrn->monitor = pScrn->confScreen->monitor; + + /* + * We support depths of 8, 16 and 24. + * We support bpp of 8, 16, and 32. + */ + + if (!xf86SetDepthBpp(pScrn, 0, 0, 0, Support32bppFb)) { + xfree(pEnt); + VIAFreeRec(pScrn); + return FALSE; + } + else { + switch (pScrn->depth) { + case 8: + case 16: + case 24: + case 32: + /* OK */ + break; + default: + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Given depth (%d) is not supported by this driver\n", + pScrn->depth); + xfree(pEnt); + VIAFreeRec(pScrn); + return FALSE; + } + } + + xf86PrintDepthBpp(pScrn); + + if (pScrn->depth == 32) { + pScrn->depth = 24; + } + + if (pScrn->depth > 8) { + rgb zeros = {0, 0, 0}; + + if (!xf86SetWeight(pScrn, zeros, zeros)) { + xfree(pEnt); + VIAFreeRec(pScrn); + return FALSE; + } else { + /* TODO check weight returned is supported */ + ; + } + } + + if (!xf86SetDefaultVisual(pScrn, -1)) { + return FALSE; + } + else { + /* We don't currently support DirectColor at > 8bpp */ + if (pScrn->depth > 8 && pScrn->defaultVisual != TrueColor) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Given default visual" + " (%s) is not supported at depth %d\n", + xf86GetVisualName(pScrn->defaultVisual), pScrn->depth); + xfree(pEnt); + VIAFreeRec(pScrn); + return FALSE; + } + } + + /* We use a programmable clock */ + pScrn->progClock = TRUE; + + xf86CollectOptions(pScrn, NULL); + + /* Set the bits per RGB for 8bpp mode */ + if (pScrn->depth == 8) + pScrn->rgbBits = 6; + + xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, VIAOptions); + +#ifdef XF86DRI + pVia->drixinerama = FALSE; + if (xf86IsOptionSet(VIAOptions, OPTION_DRIXINERAMA)) + pVia->drixinerama = TRUE; +#else + if (xf86IsOptionSet(VIAOptions, OPTION_DRIXINERAMA)) + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "Option: drixinerama ignored, no DRI support compiled into driver.\n"); +#endif + if (xf86ReturnOptValBool(VIAOptions, OPTION_PCI_BURST, FALSE)) { + pVia->pci_burst = TRUE; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "Option: pci_burst - PCI burst read enabled\n"); + } + else { + pVia->pci_burst = FALSE; + } + + pVia->NoPCIRetry = 1; /* default */ + if (xf86ReturnOptValBool(VIAOptions, OPTION_PCI_RETRY, FALSE)) { + if (xf86ReturnOptValBool(VIAOptions, OPTION_PCI_BURST, FALSE)) { + pVia->NoPCIRetry = 0; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Option: pci_retry\n"); + } + else { + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "\"pci_retry\" option requires \"pci_burst\"\n"); + } + } + + if (xf86IsOptionSet(VIAOptions, OPTION_SHADOW_FB)) { + pVia->shadowFB = TRUE; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Option: ShadowFB %s.\n", + pVia->shadowFB ? "enabled" : "disabled"); + } + else { + pVia->shadowFB = FALSE; + } + + if ((s = xf86GetOptValString(VIAOptions, OPTION_ROTATE))) { + if (!xf86NameCmp(s, "CW")) { + /* accel is disabled below for shadowFB */ + pVia->shadowFB = TRUE; + pVia->rotate = 1; + pVia->hwcursor = FALSE; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "Rotating screen clockwise - acceleration disabled\n"); + } + else if(!xf86NameCmp(s, "CCW")) { + pVia->shadowFB = TRUE; + pVia->rotate = -1; + pVia->hwcursor = FALSE; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Rotating screen" + "counter clockwise - acceleration disabled\n"); + } + else { + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "\"%s\" is not a valid" + "value for Option \"Rotate\"\n", s); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Valid options are \"CW\" or \"CCW\"\n"); + } + } + + if (xf86ReturnOptValBool(VIAOptions, OPTION_NOACCEL, FALSE)) { + pVia->NoAccel = TRUE; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "Option: NoAccel -Acceleration Disabled\n"); + } + else { + pVia->NoAccel = FALSE; + } + + if (pVia->shadowFB && !pVia->NoAccel) { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "HW acceleration not supported with \"shadowFB\".\n"); + pVia->NoAccel = TRUE; + } + + /* + * The SWCursor setting takes priority over HWCursor. The default + * if neither is specified is HW. + */ + + from = X_DEFAULT; + pVia->hwcursor = pVia->shadowFB ? FALSE : TRUE; + if (xf86GetOptValBool(VIAOptions, OPTION_HWCURSOR, &pVia->hwcursor)) + from = X_CONFIG; + + if (xf86ReturnOptValBool(VIAOptions, OPTION_SWCURSOR, FALSE)) { + pVia->hwcursor = FALSE; + from = X_CONFIG; + } + + if (pVia->IsSecondary) pVia->hwcursor = FALSE; + + xf86DrvMsg(pScrn->scrnIndex, from, "Using %s cursor\n", + pVia->hwcursor ? "HW" : "SW"); + + if (xf86ReturnOptValBool(VIAOptions, OPTION_A2, FALSE)) { + pBIOSInfo->A2 = TRUE; + } + else { + pBIOSInfo->A2 = FALSE; + } + + from = X_DEFAULT; + if (xf86ReturnOptValBool(VIAOptions, OPTION_USEBIOS, FALSE)) { + from = X_CONFIG; + pBIOSInfo->UseBIOS = TRUE; + } + else { + pBIOSInfo->UseBIOS = FALSE; + } + xf86DrvMsg(pScrn->scrnIndex, from, "%ssing video BIOS to set modes\n", + pBIOSInfo->UseBIOS ? "U" : "Not u" ); + + pScrn->videoRam = 0; + if(xf86GetOptValInteger(VIAOptions, OPTION_VIDEORAM, &pScrn->videoRam)) { + xf86DrvMsg( pScrn->scrnIndex, X_CONFIG, + "Option: VideoRAM %dkB\n", pScrn->videoRam ); + } + + if (xf86ReturnOptValBool(VIAOptions, OPTION_DISABLEVQ, FALSE)) { + pVia->VQEnable = FALSE; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "Option: DisableVQ -VQ Disabled\n"); + } + else { + pVia->VQEnable = TRUE; + } + + /* ActiveDevice Option for device selection */ + pBIOSInfo->ActiveDevice = 0x00; + if ((s = xf86GetOptValString(VIAOptions, OPTION_ACTIVEDEVICE))) { + if (!xf86NameCmp(s, "CRT,TV") || !xf86NameCmp(s, "TV,CRT")) { + pBIOSInfo->ActiveDevice = VIA_DEVICE_CRT1 | VIA_DEVICE_TV; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Active Device is CRT and TV.\n"); + } + else if(!xf86NameCmp(s, "CRT,LCD") || !xf86NameCmp(s, "LCD,CRT")) { + pBIOSInfo->ActiveDevice = VIA_DEVICE_CRT1 | VIA_DEVICE_LCD; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Active Device is CRT and LCD.\n"); + } + else if(!xf86NameCmp(s, "CRT,DFP") || !xf86NameCmp(s, "DFP,CRT") + || !xf86NameCmp(s, "CRT,DVI") || !xf86NameCmp(s, "DVI,CRT")) { + pBIOSInfo->ActiveDevice = VIA_DEVICE_CRT1 | VIA_DEVICE_DFP; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Active Device is CRT and DFP.\n"); + } + else if(!xf86NameCmp(s, "TV,DFP") || !xf86NameCmp(s, "DFP,TV") + || !xf86NameCmp(s, "TV,DVI") || !xf86NameCmp(s, "DVI,TV")) { + pBIOSInfo->ActiveDevice = VIA_DEVICE_TV | VIA_DEVICE_DFP; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Active Device is TV and DFP.\n"); + } +#if 0 + else if(!xf86NameCmp(s, "DFP,LCD") || !xf86NameCmp(s, "LCD,DFP") + || !xf86NameCmp(s, "LCD,DVI") || !xf86NameCmp(s, "DVI,LCD")) { + pBIOSInfo->ActiveDevice = VIA_DEVICE_DFP | VIA_DEVICE_LCD; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Active Device is DFP and LCD.\n"); + } +#endif + else if(!xf86NameCmp(s, "CRT") || !xf86NameCmp(s, "CRT ONLY")) { + pBIOSInfo->ActiveDevice = VIA_DEVICE_CRT1; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Active Device is CRT Only.\n"); + } + else if(!xf86NameCmp(s, "LCD") || !xf86NameCmp(s, "LCD ONLY")) { + pBIOSInfo->ActiveDevice = VIA_DEVICE_LCD; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Active Device is LCD Only.\n"); + } + else if(!xf86NameCmp(s, "TV") || !xf86NameCmp(s, "TV ONLY")) { + pBIOSInfo->ActiveDevice = VIA_DEVICE_TV; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Active Device is TV Only.\n"); + } + else if(!xf86NameCmp(s, "DFP") || !xf86NameCmp(s, "DFP ONLY") + || !xf86NameCmp(s, "DVI") || !xf86NameCmp(s, "DVI ONLY")) { + pBIOSInfo->ActiveDevice = VIA_DEVICE_DFP; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Active Device is DFP Only.\n"); + } + else { + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Option \"%s\" can't recognize!, Active Device by default.\n", s); + } + } + + /* LCDDualEdge Option */ + pBIOSInfo->LCDDualEdge = FALSE; + if (xf86ReturnOptValBool(VIAOptions, OPTION_LCDDUALEDGE, FALSE)) { + pBIOSInfo->LCDDualEdge = TRUE; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "Option: Using Dual Edge mode to set LCD\n"); + } + else { + pBIOSInfo->LCDDualEdge = FALSE; + } + + /* Digital Output Bus Width Option */ + pBIOSInfo->BusWidth = VIA_DI_12BIT; + if ((s = xf86GetOptValString(VIAOptions, OPTION_BUSWIDTH))) { + if (!xf86NameCmp(s, "12BIT")) { + pBIOSInfo->BusWidth = VIA_DI_12BIT; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "Digital Output Bus Width is 12BIT\n"); + } + else if (!xf86NameCmp(s, "24BIT")) { + pBIOSInfo->BusWidth = VIA_DI_24BIT; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "Digital Output Bus Width is 24BIT\n"); + } + } + + /* LCD Center/Expend Option */ + if (xf86ReturnOptValBool(VIAOptions, OPTION_CENTER, FALSE)) { + pBIOSInfo->Center = TRUE; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "DVI Center is On\n"); + } + else { + pBIOSInfo->Center = FALSE; + } + + /* Panel Size Option */ + pBIOSInfo->PanelSize = VIA_PANEL_INVALID; + if ((s = xf86GetOptValString(VIAOptions, OPTION_PANELSIZE))) { + if (!xf86NameCmp(s, "640x480")) { + pBIOSInfo->PanelSize = VIA_PANEL6X4; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "Selected Panel Size is 640x480\n"); + } + else if (!xf86NameCmp(s, "800x600")) { + pBIOSInfo->PanelSize = VIA_PANEL8X6; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "Selected Panel Size is 800x600\n"); + } + else if(!xf86NameCmp(s, "1024x768")) { + pBIOSInfo->PanelSize = VIA_PANEL10X7; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "Selected Panel Size is 1024x768\n"); + } + else if (!xf86NameCmp(s, "1280x768")) { + pBIOSInfo->PanelSize = VIA_PANEL12X7; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "Selected Panel Size is 1280x768\n"); + } + else if (!xf86NameCmp(s, "1280x1024")) { + pBIOSInfo->PanelSize = VIA_PANEL12X10; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "Selected Panel Size is 1280x1024\n"); + } + else if (!xf86NameCmp(s, "1400x1050")) { + pBIOSInfo->PanelSize = VIA_PANEL14X10; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "Selected Panel Size is 1400x1050\n"); + } + } + + /* TV DotCrawl Enable Option */ + if (xf86ReturnOptValBool(VIAOptions, OPTION_TVDOTCRAWL, FALSE)) { + pBIOSInfo->TVDotCrawl = TRUE; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "DotCrawl is Enable\n"); + } + else { + pBIOSInfo->TVDotCrawl = FALSE; + } + + pBIOSInfo->TVType = TVTYPE_NONE; + if ((s = xf86GetOptValString(VIAOptions, OPTION_TVTYPE))) { + if (!xf86NameCmp(s, "NTSC")) { + pBIOSInfo->TVType = TVTYPE_NTSC; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Type is NTSC\n"); + } + else if(!xf86NameCmp(s, "PAL")) { + pBIOSInfo->TVType = TVTYPE_PAL; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Type is PAL\n"); + } + } + + /* TV out put signal Option */ + pBIOSInfo->TVOutput = TVOUTPUT_NONE; + if ((s = xf86GetOptValString(VIAOptions, OPTION_TVOUTPUT))) { + if (!xf86NameCmp(s, "S-Video")) { + pBIOSInfo->TVOutput = TVOUTPUT_SVIDEO; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Output Signal is S-Video\n"); + } + else if(!xf86NameCmp(s, "Composite")) { + pBIOSInfo->TVOutput = TVOUTPUT_COMPOSITE; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Output Signal is Composite\n"); + } + else if(!xf86NameCmp(s, "SC")) { + pBIOSInfo->TVOutput = TVOUTPUT_SC; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Output Signal is SC\n"); + } + else if(!xf86NameCmp(s, "RGB")) { + pBIOSInfo->TVOutput = TVOUTPUT_RGB; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Output Signal is RGB\n"); + } + else if(!xf86NameCmp(s, "YCbCr")) { + pBIOSInfo->TVOutput = TVOUTPUT_YCBCR; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Output Signal is YCbCr\n"); + } + } + + /* TV Standard Option */ + pBIOSInfo->TVVScan = VIA_TVNORMAL; + if ((s = xf86GetOptValString(VIAOptions, OPTION_TVVSCAN))) { + if (!xf86NameCmp(s, "under")) { + pBIOSInfo->TVVScan = VIA_TVNORMAL; + } + else if (!xf86NameCmp(s, "over")) { + pBIOSInfo->TVVScan = VIA_TVOVER; + } + } + + pBIOSInfo->TVHScale = VIA_NO_TVHSCALE; + if ((s = xf86GetOptValString(VIAOptions, OPTION_TVHSCALE))) { +#if 0 + if (!xf86NameCmp(s, "0")) { + pBIOSInfo->TVHScale = VIA_TVHSCALE0; + } + else if (!xf86NameCmp(s, "1")) { + pBIOSInfo->TVHScale = VIA_TVHSCALE1; + } + else if(!xf86NameCmp(s, "2")) { + pBIOSInfo->TVHScale = VIA_TVHSCALE2; + } + else if (!xf86NameCmp(s, "3")) { + pBIOSInfo->TVHScale = VIA_TVHSCALE3; + } + else if (!xf86NameCmp(s, "4")) { + pBIOSInfo->TVHScale = VIA_TVHSCALE4; + } +#endif + } + + /* TV Encoder Type Option */ + pBIOSInfo->TVEncoder = VIA_NONETV; + if ((s = xf86GetOptValString(VIAOptions, OPTION_TVENCODER))) { + if (!xf86NameCmp(s, "VT1621")) { + pBIOSInfo->TVEncoder = VIA_TV2PLUS; + pBIOSInfo->TVI2CAdd = 0x40; + } + else if(!xf86NameCmp(s, "VT1622")) { + pBIOSInfo->TVEncoder = VIA_TV3; + pBIOSInfo->TVI2CAdd = 0x40; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Encoder is VT1622!\n"); + } + else if(!xf86NameCmp(s, "VT1622A")) { + pBIOSInfo->TVEncoder = VIA_VT1622A; + pBIOSInfo->TVI2CAdd = 0x40; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Encoder is VT1622!\n"); + } + else if(!xf86NameCmp(s, "CH7019")) { + pBIOSInfo->TVEncoder = VIA_CH7019; + pBIOSInfo->TVI2CAdd = 0xEA; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Encoder is CH7019!\n"); + } + else if(!xf86NameCmp(s, "SAA7108")) { + pBIOSInfo->TVEncoder = VIA_SAA7108; + pBIOSInfo->TVI2CAdd = 0x88; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Encoder is SAA7108!\n"); + } + else if(!xf86NameCmp(s, "FS454")) { + pBIOSInfo->TVEncoder = VIA_FS454; + pBIOSInfo->TVI2CAdd = 0xD4; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Encoder is FS453/FS454!\n"); + } + } + + if (xf86GetOptValInteger(VIAOptions, OPTION_REFRESH, &(pBIOSInfo->OptRefresh))) { + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Refresh is %d\n", pBIOSInfo->OptRefresh); + } + + if (xf86LoadSubModule(pScrn, "vbe")) { + xf86LoaderReqSymLists(vbeSymbols, NULL); + pVia->pVbe = VBEInit(NULL, pVia->EntityIndex); + } + + pVia->PciInfo = xf86GetPciInfoForEntity(pEnt->index); + xf86RegisterResources(pEnt->index, NULL, ResNone); + /* + xf86SetOperatingState(RES_SHARED_VGA, pEnt->index, ResUnusedOpr); + xf86SetOperatingState(resVgaMemShared, pEnt->index, ResDisableOpr); + */ + + if (pEnt->device->chipset && *pEnt->device->chipset) { + pScrn->chipset = pEnt->device->chipset; + pVia->ChipId = pEnt->device->chipID; + pVia->Chipset = xf86StringToToken(VIAChipsets, pScrn->chipset); + from = X_CONFIG; + } else if (pEnt->device->chipID >= 0) { + pVia->ChipId = pEnt->device->chipID; + pVia->Chipset = LookupChipID(VIAPciChipsets, pVia->ChipId); + pScrn->chipset = (char *)xf86TokenToString(VIAChipsets, + pVia->Chipset); + from = X_CONFIG; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "ChipID override: 0x%04X\n", + pEnt->device->chipID); + } else { + from = X_PROBED; + pVia->ChipId = pVia->PciInfo->chipType; + pVia->Chipset = LookupChipID(VIAPciChipsets, pVia->ChipId); + pScrn->chipset = (char *)xf86TokenToString(VIAChipsets, + pVia->Chipset); + } + + if (pEnt->device->chipRev >= 0) { + pVia->ChipRev = pEnt->device->chipRev; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "ChipRev override: %d\n", + pVia->ChipRev); + } + else { + /*pVia->ChipRev = pVia->PciInfo->chipRev;*/ + /* Read PCI bus 0, dev 0, function 0, index 0xF6 to get chip rev. */ + pVia->ChipRev = pciReadByte(pciTag(0, 0, 0), 0xF6); + } + + if (pEnt->device->videoRam != 0) { + if (!pScrn->videoRam) + pScrn->videoRam = pEnt->device->videoRam; + else { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "Video Memory Size in Option is %d KB, Detect is %d KB!", + pScrn->videoRam, pEnt->device->videoRam); + } + } + pBIOSInfo->Chipset = pVia->Chipset; + pBIOSInfo->ChipRev = pVia->ChipRev; + + xfree(pEnt); + + VIAvfInitHWDiff(pVia); + + /* maybe throw in some more sanity checks here */ + + xf86DrvMsg(pScrn->scrnIndex, from, "Chipset: \"%s\"\n", pScrn->chipset); + + pVia->PciTag = pciTag(pVia->PciInfo->bus, pVia->PciInfo->device, + pVia->PciInfo->func); + + switch (pVia->ChipRev) { + case 2: + pBIOSInfo->A2 = TRUE; + break; + default: + pBIOSInfo->A2 = FALSE; + break; + } + xf86DrvMsg(pScrn->scrnIndex, from, "Chipset Rev.: %d\n", pVia->ChipRev); + + hwp = VGAHWPTR(pScrn); + vgaHWGetIOBase(hwp); + + if (!VIAMapMMIO(pScrn)) { + VIAFreeRec(pScrn); + return FALSE; + } + + ViaVBEGetBIOSVersion(pScrn); + ViaVBEGetBIOSDate(pScrn); + + if (pBIOSInfo->TVType == TVTYPE_NONE) { + /* use jumper to determine TV Type */ + VGAOUT8(0x3D4, 0x3B); + if (VGAIN8(0x3D5) & 0x02) { + pBIOSInfo->TVType = TVTYPE_PAL; + } + else { + pBIOSInfo->TVType = TVTYPE_NTSC; + } + } + + { + Gamma zeros = {0.0, 0.0, 0.0}; + + if (!xf86SetGamma(pScrn, zeros)) { + VIAFreeRec(pScrn); + return FALSE; + } + } + + /* Next go on to detect amount of installed ram */ + if (pScrn->videoRam < 16384 || pScrn->videoRam > 65536) { + bMemSize = ViaVBEGetVideoMemSize(pScrn); + if (bMemSize) { + pScrn->videoRam = bMemSize << 6; + } + else { + if(pVia->Chipset == VIA_CLE266) + VGAOUT8(0x3C4, 0x34); + else + VGAOUT8(0x3C4, 0x39); + bMemSize = VGAIN8(0x3c5); + if (bMemSize > 16 && bMemSize <= 128) { + pScrn->videoRam = (bMemSize + 1) << 9; + } + else if (bMemSize > 0 && bMemSize < 31){ + pScrn->videoRam = bMemSize << 12; + } + else { + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "bMemSize = %d\nGet Video Memory Size by default.\n", bMemSize)); + pScrn->videoRam = 16 << 10; /* Assume the base 16Mb */ + } + } + } + + /* Split FB for SAMM */ + /* FIXME: For now, split FB into two equal sections. This should + * be able to be adjusted by user with a config option. */ + if (pVia->IsSecondary) { + DevUnion* pPriv; + VIAEntPtr pVIAEnt; + VIAPtr pVia1; + + pPriv = xf86GetEntityPrivate(pScrn->entityList[0], + gVIAEntityIndex); + pVIAEnt = pPriv->ptr; + pScrn->videoRam = pScrn->videoRam >> 1; + pVIAEnt->pPrimaryScrn->videoRam = pScrn->videoRam; + pVia1 = VIAPTR(pVIAEnt->pPrimaryScrn); + pVia1->videoRambytes = pScrn->videoRam << 10; + pVia->FrameBufferBase += (pScrn->videoRam << 10); + } + + pVia->videoRambytes = pScrn->videoRam << 10; + xf86DrvMsg(pScrn->scrnIndex, X_PROBED,"videoram = %dk\n", + pScrn->videoRam); + + /* Set status word positions based on chip type. */ + + switch (pVia->Chipset) { + case VIA_CLE266: + pVia->myWaitIdle = WaitIdleCLE266; + break; + default: + pVia->myWaitIdle = WaitIdleCLE266; + break; + } + + if (!xf86LoadSubModule(pScrn, "i2c")) { + VIAFreeRec(pScrn); + return FALSE; + } + else { + xf86LoaderReqSymLists(i2cSymbols,NULL); + VIAI2CInit(pScrn); + } + + if (!xf86LoadSubModule(pScrn, "ddc")) { + VIAFreeRec(pScrn); + return FALSE; + } + else { + xf86LoaderReqSymLists(ddcSymbols, NULL); + + if (!(pVia->pVbe && ((pVia->DDC1 = vbeDoEDID(pVia->pVbe, NULL))))) + if (!(pVia->DDC1 = xf86DoEDID_DDC2(pScrn->scrnIndex, pVia->I2C_Port1))) + pVia->DDC1 = VIAddc1(pScrn->scrnIndex, pVia); + + if (pVia->DDC1) { + xf86PrintEDID(pVia->DDC1); + xf86SetDDCproperties(pScrn, pVia->DDC1); + } + } + + /* + * Setup the ClockRanges, which describe what clock ranges are available, + * and what sort of modes they can be used for. + */ + + clockRanges = xnfalloc(sizeof(ClockRange)); + clockRanges->next = NULL; + clockRanges->minClock = 20000; + clockRanges->maxClock = 230000; + + clockRanges->clockIndex = -1; + clockRanges->interlaceAllowed = TRUE; + clockRanges->doubleScanAllowed = FALSE; + + + /* + * xf86ValidateModes will check that the mode HTotal and VTotal values + * don't exceed the chipset's limit if pScrn->maxHValue and + * pScrn->maxVValue are set. Since our VIAValidMode() already takes + * care of this, we don't worry about setting them here. + */ + + /* Select valid modes from those available */ + i = xf86ValidateModes(pScrn, + pScrn->monitor->Modes, /* availModes */ + pScrn->display->modes, /* modeNames */ + clockRanges, /* list of clock ranges */ + NULL, /* list of line pitches */ + 256, /* mini line pitch */ + 2048, /* max line pitch */ + 16 * pScrn->bitsPerPixel, /* pitch inc (bits) */ + 128, /* min height */ + 2048, /* max height */ + pScrn->display->virtualX, /* virtual width */ + pScrn->display->virtualY, /* virutal height */ + pVia->videoRambytes, /* size of video memory */ + LOOKUP_BEST_REFRESH); /* lookup mode flags */ + + if (i == -1) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "xf86ValidateModes failure\n"); + VIAFreeRec(pScrn); + return FALSE; + } + + xf86PruneDriverModes(pScrn); + + if (i == 0 || pScrn->modes == NULL) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "No valid modes found\n"); + VIAFreeRec(pScrn); + return FALSE; + } + + /* Set up screen parameters. */ + pVia->Bpp = pScrn->bitsPerPixel >> 3; + pVia->Bpl = pScrn->displayWidth * pVia->Bpp; + + if (!VIAGetBIOSTable(pBIOSInfo)) { + VIAFreeRec(pScrn); + return FALSE; + } + + pBIOSInfo->I2C_Port1 = pVia->I2C_Port1; + pBIOSInfo->I2C_Port2 = pVia->I2C_Port2; + pBIOSInfo->DDC1 = pVia->DDC1; + pBIOSInfo->DDC2 = pVia->DDC2; + + /* Detect TV Encoder */ + if (!pBIOSInfo->TVEncoder) { + pBIOSInfo->TVEncoder = VIACheckTVExist(pBIOSInfo); + } + /* Detect TMDS/LVDS Encoder */ + VIAPostDVI(pBIOSInfo); + /*VIAGetPanelInfo(pBIOSInfo);*/ + pBIOSInfo->ConnectedDevice = VIAGetDeviceDetect(pBIOSInfo); + + xf86SetCrtcForModes(pScrn, INTERLACE_HALVE_V); + pScrn->currentMode = pScrn->modes; + xf86PrintModes(pScrn); + xf86SetDpi(pScrn, 0, 0); + +#ifdef USE_FB + if (xf86LoadSubModule(pScrn, "fb") == NULL) { + VIAFreeRec(pScrn); + return FALSE; + } + + xf86LoaderReqSymLists(fbSymbols, NULL); + +#else + /* load bpp-specific modules */ + switch (pScrn->bitsPerPixel) { + case 8: + mod = "cfb"; + reqSym = "cfbScreenInit"; + break; + case 16: + mod = "cfb16"; + reqSym = "cfb16ScreenInit"; + break; + case 32: + mod = "cfb32"; + reqSym = "cfb32ScreenInit"; + break; + } + + if (mod && xf86LoadSubModule(pScrn, mod) == NULL) { + VIAFreeRec(pScrn); + return FALSE; + } + + xf86LoaderReqSymbols(reqSym, NULL); +#endif + + if (!pVia->NoAccel) { + if(!xf86LoadSubModule(pScrn, "xaa")) { + VIAFreeRec(pScrn); + return FALSE; + } + xf86LoaderReqSymLists(xaaSymbols, NULL); + } + + if (pVia->hwcursor) { + if (!xf86LoadSubModule(pScrn, "ramdac")) { + VIAFreeRec(pScrn); + return FALSE; + } + xf86LoaderReqSymLists(ramdacSymbols, NULL); + } + + if (pVia->shadowFB) { + if (!xf86LoadSubModule(pScrn, "shadowfb")) { + VIAFreeRec(pScrn); + return FALSE; + } + xf86LoaderReqSymLists(shadowSymbols, NULL); + } + + /* Capture option parameter */ + pVia->Cap0_Deinterlace = CAP_BOB; + if ((s = xf86GetOptValString(VIAOptions, OPTION_CAP0_DEINTERLACE))) { + if (!xf86NameCmp(s, "Bob")) { + pVia->Cap0_Deinterlace = CAP_BOB; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Capture 0 de-interlace mode is Bob\n"); + } + else if(!xf86NameCmp(s, "Weave")) { + pVia->Cap0_Deinterlace = CAP_WEAVE; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Capture 0 de-interlace mode is Weave\n"); + } + } + + pVia->Cap1_Deinterlace = CAP_BOB; + if ((s = xf86GetOptValString(VIAOptions, OPTION_CAP1_DEINTERLACE))) { + if (!xf86NameCmp(s, "Bob")) { + pVia->Cap1_Deinterlace = CAP_BOB; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Capture 1 de-interlace mode is Bob\n"); + } + else if(!xf86NameCmp(s, "Weave")) { + pVia->Cap1_Deinterlace = CAP_WEAVE; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Capture 1 de-interlace mode is Weave\n"); + } + } + + if (xf86ReturnOptValBool(VIAOptions, OPTION_CAP0_FIELDSWAP, FALSE)) { + pVia->Cap0_FieldSwap = TRUE; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "Option: Cap0_FieldSwap Enabled\n"); + } + else { + pVia->Cap0_FieldSwap = FALSE; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "Option: Cap0_FieldSwap Disabled\n"); + } + + /* xf86LoaderReqSymLists(mpegSymbols, NULL); */ + + VIADeviceSelection(pScrn); + if (pVia->IsSecondary) { + if (pBIOSInfo->SAMM) + VIADeviceDispatch(pScrn); + else { + VIAFreeRec(pScrn); + return FALSE; + } + } + + VIAUnmapMem(pScrn); + + return TRUE; +} + + +static Bool VIAEnterVT(int scrnIndex, int flags) +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + VIAPtr pVia = VIAPTR(pScrn); + vgaHWPtr hwp = VGAHWPTR(pScrn); + Bool ret; + + /* FIXME: Rebind AGP memory here */ + /* FIXME: Unlock DRI here */ + DEBUG(xf86DrvMsg(scrnIndex, X_INFO, "VIAEnterVT\n")); + VIASave(pScrn); + vgaHWUnlock(hwp); + + ret = VIAModeInit(pScrn, pScrn->currentMode); + + /* Patch for APM suspend resume, HWCursor has garbage */ + if (pVia->hwcursor && pVia->CursorImage) { + DEBUG(xf86DrvMsg(scrnIndex, X_INFO, "Restore Cursor Image!\n")); + memcpy(pVia->FBBase + pVia->CursorStart, pVia->CursorImage, 0x1000); + VIASETREG(VIA_REG_CURSOR_FG, pVia->CursorFG); + VIASETREG(VIA_REG_CURSOR_BG, pVia->CursorBG); + VIASETREG(VIA_REG_CURSOR_MODE, pVia->CursorMC); + xfree(pVia->CursorImage); + /*VIALoadCursorImage(pScrn, *pVia->CursorImage);*/ + } + + /* retore video status */ + if (!pVia->IsSecondary) + viaRestoreVideo(pScrn); + + VIAAdjustFrame(scrnIndex, pScrn->frameX0, pScrn->frameY0, 0); + return ret; +} + + +static void VIALeaveVT(int scrnIndex, int flags) +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + vgaHWPtr hwp = VGAHWPTR(pScrn); + VIAPtr pVia = VIAPTR(pScrn); + vgaRegPtr vgaSavePtr = &hwp->SavedReg; + VIARegPtr viaSavePtr = &pVia->SavedReg; + + DEBUG(xf86DrvMsg(scrnIndex, X_INFO, "VIALeaveVT\n")); + + /* FIXME: take the DRI lock here to avoid accidents */ + /* FIXME: unbind the AGP memory ? */ + + /* Wait Hardware Engine idle to exit graphicd mode */ + WaitIdle(); + + if (pVia->VQEnable) { + /* if we use VQ, disable it before we exit */ + VIASETREG(0x43c, 0x00fe0000); + VIASETREG(0x440, 0x00000004); + } + + /* Save video status and turn off all video activities */ + if (!pVia->IsSecondary) + viaSaveVideo(pScrn); + + if (pVia->hwcursor) { + pVia->CursorImage = xcalloc(1, 0x1000); + memcpy(pVia->CursorImage, pVia->FBBase + pVia->CursorStart, 0x1000); + pVia->CursorFG = (CARD32)VIAGETREG(VIA_REG_CURSOR_FG); + pVia->CursorBG = (CARD32)VIAGETREG(VIA_REG_CURSOR_BG); + pVia->CursorMC = (CARD32)VIAGETREG(VIA_REG_CURSOR_MODE); + } + + VIAWriteMode(pScrn, vgaSavePtr, viaSavePtr); + vgaHWLock(hwp); +} + + +static void VIASave(ScrnInfoPtr pScrn) +{ + vgaHWPtr hwp = VGAHWPTR(pScrn); + vgaRegPtr vgaSavePtr = &hwp->SavedReg; + VIAPtr pVia = VIAPTR(pScrn); + VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; + VIARegPtr save = &pVia->SavedReg; + int vgaCRIndex, vgaCRReg, vgaIOBase; + int i; + I2CDevPtr dev; + unsigned char W_Buffer[1]; + unsigned char TVRegs[0xFF]; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIASave\n")); + + if(pVia->IsSecondary) + { + DevUnion* pPriv; + VIAEntPtr pVIAEnt; + VIAPtr pVia1; + vgaHWPtr hwp1; + pPriv = xf86GetEntityPrivate(pScrn->entityList[0], + gVIAEntityIndex); + pVIAEnt = pPriv->ptr; + hwp1 = VGAHWPTR(pVIAEnt->pPrimaryScrn); + pVia1 = VIAPTR(pVIAEnt->pPrimaryScrn); + hwp->SavedReg = hwp1->SavedReg; + pVia->SavedReg = pVia1->SavedReg; + } + else { + vgaHWProtect(pScrn, TRUE); + + if (xf86IsPrimaryPci(pVia->PciInfo)) { + vgaHWSave(pScrn, vgaSavePtr, VGA_SR_ALL); + } + else { + vgaHWSave(pScrn, vgaSavePtr, VGA_SR_MODE); + } + + vgaIOBase = hwp->IOBase; + vgaCRReg = vgaIOBase + 5; + vgaCRIndex = vgaIOBase + 4; + + /* Unlock Extended Regs */ + outb(0x3c4, 0x10); + outb(0x3c5, 0x01); + + VGAOUT8(0x3c4, 0x14); + save->SR14 = VGAIN8(0x3c5); + VGAOUT8(0x3c4, 0x15); + save->SR15 = VGAIN8(0x3c5); + VGAOUT8(0x3c4, 0x16); + save->SR16 = VGAIN8(0x3c5); + VGAOUT8(0x3c4, 0x17); + save->SR17 = VGAIN8(0x3c5); + VGAOUT8(0x3c4, 0x18); + save->SR18 = VGAIN8(0x3c5); + VGAOUT8(0x3c4, 0x19); + save->SR19 = VGAIN8(0x3c5); + VGAOUT8(0x3c4, 0x1a); + save->SR1A = VGAIN8(0x3c5); + VGAOUT8(0x3c4, 0x1b); + save->SR1B = VGAIN8(0x3c5); + VGAOUT8(0x3c4, 0x1c); + save->SR1C = VGAIN8(0x3c5); + VGAOUT8(0x3c4, 0x1d); + save->SR1D = VGAIN8(0x3c5); + VGAOUT8(0x3c4, 0x1e); + save->SR1E = VGAIN8(0x3c5); + VGAOUT8(0x3c4, 0x1f); + save->SR1F = VGAIN8(0x3c5); + VGAOUT8(0x3c4, 0x22); + save->SR22 = VGAIN8(0x3c5); + VGAOUT8(0x3c4, 0x23); + save->SR23 = VGAIN8(0x3c5); + VGAOUT8(0x3c4, 0x24); + save->SR24 = VGAIN8(0x3c5); + VGAOUT8(0x3c4, 0x25); + save->SR25 = VGAIN8(0x3c5); + VGAOUT8(0x3c4, 0x26); + save->SR26 = VGAIN8(0x3c5); + VGAOUT8(0x3c4, 0x27); + save->SR27 = VGAIN8(0x3c5); + VGAOUT8(0x3c4, 0x28); + save->SR28 = VGAIN8(0x3c5); + VGAOUT8(0x3c4, 0x29); + save->SR29 = VGAIN8(0x3c5); + VGAOUT8(0x3c4, 0x2a); + save->SR2A = VGAIN8(0x3c5); + VGAOUT8(0x3c4, 0x2b); + save->SR2B = VGAIN8(0x3c5); + VGAOUT8(0x3c4, 0x2e); + save->SR2E = VGAIN8(0x3c5); + VGAOUT8(0x3c4, 0x44); + save->SR44 = VGAIN8(0x3c5); + VGAOUT8(0x3c4, 0x45); + save->SR45 = VGAIN8(0x3c5); + VGAOUT8(0x3c4, 0x46); + save->SR46 = VGAIN8(0x3c5); + VGAOUT8(0x3c4, 0x47); + save->SR47 = VGAIN8(0x3c5); + + VGAOUT8(vgaCRIndex, 0x13); + save->CR13 = VGAIN8(vgaCRReg); + VGAOUT8(vgaCRIndex, 0x32); + save->CR32 = VGAIN8(vgaCRReg); + VGAOUT8(vgaCRIndex, 0x33); + save->CR33 = VGAIN8(vgaCRReg); + VGAOUT8(vgaCRIndex, 0x34); + save->CR34 = VGAIN8(vgaCRReg); + VGAOUT8(vgaCRIndex, 0x35); + save->CR35 = VGAIN8(vgaCRReg); + VGAOUT8(vgaCRIndex, 0x36); + save->CR36 = VGAIN8(vgaCRReg); + + /* Saving TV register status before set mode */ + switch (pBIOSInfo->TVEncoder) { + case VIA_NONETV: + break; + case VIA_VT1623: + VIAGPIOI2C_Initial(pBIOSInfo, 0x40); + for (i = 0; i < 0x6C; i++) { + VIAGPIOI2C_ReadByte(pBIOSInfo, i, (TVRegs + i)); + save->TVRegs[i] = TVRegs[i]; + /*DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Save TV Register[%d]0x%X\n", i, save->TVRegs[i]));*/ + } + break; + default: + if (xf86I2CProbeAddress(pVia->I2C_Port2, pBIOSInfo->TVI2CAdd)) { + dev = xf86CreateI2CDevRec(); + dev->DevName = "TV"; + dev->SlaveAddr = pBIOSInfo->TVI2CAdd; + dev->pI2CBus = pVia->I2C_Port2; + + if (xf86I2CDevInit(dev)) { + W_Buffer[0] = 0; + xf86I2CWriteRead(dev, W_Buffer,1, TVRegs, 0xFF); + for (i = 0; i < 0xFF; i++) { + save->TVRegs[i] = TVRegs[i]; + } + xf86DestroyI2CDevRec(dev,TRUE); + } + else + xf86DestroyI2CDevRec(dev,TRUE); + } + break; + } + + /* Saving LVDS register status before set mode + if (pBIOSInfo->LVDS == VIA_CH7019LVDS) { + dev = xf86CreateI2CDevRec(); + dev->DevName = "LVDS"; + dev->SlaveAddr = 0xEA; + dev->pI2CBus = pVia->I2C_Port2; + + if (xf86I2CDevInit(dev)) { + for (i = 0; i < 0x40; i++) { + W_Buffer[0] = i + 0x40; + xf86I2CWriteRead(dev, W_Buffer, 1, save->LCDRegs + i, 1); + } + xf86DestroyI2CDevRec(dev,TRUE); + } + else + xf86DestroyI2CDevRec(dev,TRUE); + }*/ + + /* Save LCD control regs */ + for (i = 0; i < 68; i++) { + VGAOUT8(vgaCRIndex, i + 0x50); + save->CRTCRegs[i] = VGAIN8(vgaCRReg); + } + + if (!pVia->ModeStructInit) { + vgaHWCopyReg(&hwp->ModeReg, vgaSavePtr); + memcpy(&pVia->ModeReg, save, sizeof(VIARegRec)); + pVia->ModeStructInit = TRUE; + } + vgaHWProtect(pScrn, FALSE); + } + return; +} + + +static void VIAWriteMode(ScrnInfoPtr pScrn, vgaRegPtr vgaSavePtr, + VIARegPtr restore) +{ + vgaHWPtr hwp = VGAHWPTR(pScrn); + VIAPtr pVia = VIAPTR(pScrn); + VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; + int vgaCRIndex, vgaCRReg, vgaIOBase; +/* Bool graphicsMode = FALSE;*/ + int i; + unsigned char W_Buffer[3]; + I2CDevPtr dev = NULL; + CARD8 tmp; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAWriteMode\n")); + vgaIOBase = hwp->IOBase; + vgaCRIndex = vgaIOBase + 4; + vgaCRReg = vgaIOBase + 5; + + /* + * If we figured out a VESA mode number for this timing, just use + * the VGA BIOS to do the switching, with a few additional tweaks. + */ + if (restore->mode != 0xFF) + { + /* Set up the mode. Don't clear video RAM. */ + if (!pVia->IsSecondary) + VIASetModeUseBIOSTable(pBIOSInfo); + else + VIASetModeForMHS(pBIOSInfo); + + /* Restore the DAC.*/ + if (pBIOSInfo->FirstInit ) { + vgaHWRestore(pScrn, vgaSavePtr, VGA_SR_CMAP); + } + /*else { + vgaHWRestore(pScrn, vgaSavePtr, VGA_SR_MODE); + } + vgaHWRestore(pScrn, vgaSavePtr, VGA_SR_CMAP);*/ + pBIOSInfo->FirstInit = FALSE; + /* Enable the graphics engine. */ + if (!pVia->NoAccel) + VIAInitialize2DEngine(pScrn); + +#ifdef XF86DRI + VIAInitialize3DEngine(pScrn); +#endif + return; + } + vgaHWProtect(pScrn, TRUE); + /* Unlock Extended Regs */ + outb(0x3c4, 0x10); + outb(0x3c5, 0x01); + + /* How can we know the mode is graphical mode or not ? */ + /* graphicsMode = (restore->mode == 0xFF) ? FALSE : TRUE; */ + + VGAOUT8(vgaCRIndex, 0x6a); + VGAOUT8(vgaCRReg, 0); + VGAOUT8(vgaCRIndex, 0x6b); + VGAOUT8(vgaCRReg, 0); + VGAOUT8(vgaCRIndex, 0x6c); + VGAOUT8(vgaCRReg, 0); + + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + case VIA_TV3: + case VIA_CH7009: + case VIA_CH7019: + case VIA_SAA7108: + case VIA_CH7005: + case VIA_VT1622A: + dev = xf86CreateI2CDevRec(); + dev->DevName = "TV"; + dev->SlaveAddr = pBIOSInfo->TVI2CAdd; + dev->pI2CBus = pVia->I2C_Port2; + if (xf86I2CDevInit(dev)) { + for (i = 0; i < 0xFF; i++) { + W_Buffer[0] = (unsigned char)(i); + W_Buffer[1] = (unsigned char)(restore->TVRegs[i]); + xf86I2CWriteRead(dev, W_Buffer, 2, NULL,0); + } + xf86DestroyI2CDevRec(dev,TRUE); + } + else + xf86DestroyI2CDevRec(dev,TRUE); + break; + case VIA_FS454: + dev = xf86CreateI2CDevRec(); + dev->DevName = "TV"; + dev->SlaveAddr = pBIOSInfo->TVI2CAdd; + dev->pI2CBus = pVia->I2C_Port2; + if (xf86I2CDevInit(dev)) { + + /* QPR programming */ + W_Buffer[0] = 0xC4; + W_Buffer[1] = (unsigned char)(restore->TVRegs[0xC4]); + W_Buffer[2] = (unsigned char)(restore->TVRegs[0xC5]); + xf86I2CWriteRead(dev, W_Buffer,3, NULL,0); + + /* Restore TV Regs */ + for (i = 0; i < 0xFF; i++) { + W_Buffer[0] = (unsigned char)(i); + W_Buffer[1] = (unsigned char)(restore->TVRegs[i]); + if (i == 0xC4) + i++; + else + xf86I2CWriteRead(dev, W_Buffer, 2, NULL,0); + } + xf86DestroyI2CDevRec(dev,TRUE); + } + else + xf86DestroyI2CDevRec(dev,TRUE); + break; + case VIA_VT1623: + VIAGPIOI2C_Initial(pBIOSInfo, 0x40); + for (i = 0; i < 0x6C; i++) { + VIAGPIOI2C_Write(pBIOSInfo, i, restore->TVRegs[i]); + /*DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Write Back Register[%d]:0x%X\n", i, restore->TVRegs[i]));*/ + } + break; + default: + break; + } + + /* restore the standard vga regs */ + if (xf86IsPrimaryPci(pVia->PciInfo)) + vgaHWRestore(pScrn, vgaSavePtr, VGA_SR_ALL); + else + vgaHWRestore(pScrn, vgaSavePtr, VGA_SR_MODE); + + /* restore extended regs */ + VGAOUT8(0x3c4, 0x14); + VGAOUT8(0x3c5, restore->SR14); + VGAOUT8(0x3c4, 0x15); + VGAOUT8(0x3c5, restore->SR15); + VGAOUT8(0x3c4, 0x16); + VGAOUT8(0x3c5, restore->SR16); + VGAOUT8(0x3c4, 0x17); + VGAOUT8(0x3c5, restore->SR17); + VGAOUT8(0x3c4, 0x18); + VGAOUT8(0x3c5, restore->SR18); + VGAOUT8(0x3c4, 0x19); + VGAOUT8(0x3c5, restore->SR19); + VGAOUT8(0x3c4, 0x1a); + VGAOUT8(0x3c5, restore->SR1A); + VGAOUT8(0x3c4, 0x1b); + VGAOUT8(0x3c5, restore->SR1B); + VGAOUT8(0x3c4, 0x1c); + VGAOUT8(0x3c5, restore->SR1C); + VGAOUT8(0x3c4, 0x1d); + VGAOUT8(0x3c5, restore->SR1D); + VGAOUT8(0x3c4, 0x1e); + VGAOUT8(0x3c5, restore->SR1E); + VGAOUT8(0x3c4, 0x1f); + VGAOUT8(0x3c5, restore->SR1F); + VGAOUT8(0x3c4, 0x22); + VGAOUT8(0x3c5, restore->SR22); + VGAOUT8(0x3c4, 0x23); + VGAOUT8(0x3c5, restore->SR23); + VGAOUT8(0x3c4, 0x24); + VGAOUT8(0x3c5, restore->SR24); + VGAOUT8(0x3c4, 0x25); + VGAOUT8(0x3c5, restore->SR25); + VGAOUT8(0x3c4, 0x26); + VGAOUT8(0x3c5, restore->SR26); + VGAOUT8(0x3c4, 0x27); + VGAOUT8(0x3c5, restore->SR27); + VGAOUT8(0x3c4, 0x28); + VGAOUT8(0x3c5, restore->SR28); + VGAOUT8(0x3c4, 0x29); + VGAOUT8(0x3c5, restore->SR29); + VGAOUT8(0x3c4, 0x2a); + VGAOUT8(0x3c5, restore->SR2A); + VGAOUT8(0x3c4, 0x2b); + VGAOUT8(0x3c5, restore->SR2B); + VGAOUT8(0x3c4, 0x2e); + VGAOUT8(0x3c5, restore->SR2E); + VGAOUT8(0x3c4, 0x44); + VGAOUT8(0x3c5, restore->SR44); + VGAOUT8(0x3c4, 0x45); + VGAOUT8(0x3c5, restore->SR45); + VGAOUT8(0x3c4, 0x46); + VGAOUT8(0x3c5, restore->SR46); + VGAOUT8(0x3c4, 0x47); + VGAOUT8(0x3c5, restore->SR47); + + VGAOUT8(vgaCRIndex, 0x13); + VGAOUT8(vgaCRReg, restore->CR13); + VGAOUT8(vgaCRIndex, 0x32); + VGAOUT8(vgaCRReg, restore->CR32); + VGAOUT8(vgaCRIndex, 0x33); + VGAOUT8(vgaCRReg, restore->CR33); + VGAOUT8(vgaCRIndex, 0x34); + VGAOUT8(vgaCRReg, restore->CR34); + VGAOUT8(vgaCRIndex, 0x35); + VGAOUT8(vgaCRReg, restore->CR35); + VGAOUT8(vgaCRIndex, 0x36); + VGAOUT8(vgaCRReg, restore->CR36); + + /* Restore LCD control regs */ + for (i = 0; i < 68; i++) { + VGAOUT8(vgaCRIndex, i + 0x50); + VGAOUT8(vgaCRReg, restore->CRTCRegs[i]); + } + + /*if (pBIOSInfo->LVDS == VIA_CH7019LVDS) { + dev = xf86CreateI2CDevRec(); + dev->DevName = "LVDS"; + dev->SlaveAddr = 0xEA; + dev->pI2CBus = pVia->I2C_Port2; + + if (xf86I2CDevInit(dev)) { + for (i = 0; i < 0x40; i++) { + W_Buffer[0] = (unsigned char)(i + 0x40); + W_Buffer[1] = (unsigned char)(restore->LCDRegs[i]); + xf86I2CWriteRead(dev, W_Buffer, 2, NULL,0); + } + + xf86DestroyI2CDevRec(dev,TRUE); + } + else + xf86DestroyI2CDevRec(dev,TRUE); + + ActiveDevice = ViaVBEGetActiveDevice(pScrn); + }*/ + if (pBIOSInfo->DefaultActiveDevice & VIA_DEVICE_LCD) + VIAEnableLCD(pBIOSInfo); + + VIADisabledExtendedFIFO(pBIOSInfo); + /* Reset clock */ + tmp = VGAIN8(0x3cc); + VGAOUT8(0x3c2, tmp); + + /* If we're going into graphics mode and acceleration was enabled, */ +/* + if (graphicsMode && (!pVia->NoAccel)) { + VIAInitialize2DEngine(pScrn); + } +*/ + vgaHWProtect(pScrn, FALSE); + return; +} + + +static Bool VIAMapMMIO(ScrnInfoPtr pScrn) +{ + VIAPtr pVia = VIAPTR(pScrn); + VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; + vgaHWPtr hwp; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAMapMMIO\n")); + + pVia->FrameBufferBase = pVia->PciInfo->memBase[0]; + pVia->MmioBase = pVia->PciInfo->memBase[1]; + + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "mapping MMIO @ 0x%lx with size 0x%x\n", + pVia->MmioBase, VIA_MMIO_REGSIZE); + + pVia->MapBase = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO, pVia->PciTag, + pVia->MmioBase, + VIA_MMIO_REGSIZE); + pBIOSInfo->MapBase = pVia->MapBase; + + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "mapping BitBlt MMIO @ 0x%lx with size 0x%x\n", + pVia->MmioBase + VIA_MMIO_BLTBASE, VIA_MMIO_BLTSIZE); + + pVia->BltBase = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO, pVia->PciTag, + pVia->MmioBase + VIA_MMIO_BLTBASE, + VIA_MMIO_BLTSIZE); + + if (!pVia->MapBase || !pVia->BltBase) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Internal error: cound not map registers\n"); + return FALSE; + } + + /* Memory mapped IO for Video Engine */ + pVia->VidMapBase = pVia->MapBase + 0x200; + /* Memory mapped IO for Mpeg Engine */ + pVia->MpegMapBase = pVia->MapBase + 0xc00; + + VIAEnableMMIO(pScrn); + hwp = VGAHWPTR(pScrn); + vgaHWGetIOBase(hwp); + + return TRUE; +} + + +static Bool VIAMapFB(ScrnInfoPtr pScrn) +{ + VIAPtr pVia = VIAPTR(pScrn); + VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAMapFB\n")); + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "mapping framebuffer @ 0x%lx with size 0x%lx\n", + pVia->FrameBufferBase, pVia->videoRambytes); + + if (pVia->videoRambytes) { + + /* + * FIXME: This is a hack to get rid of offending wrongly sized + * MTRR regions set up by the VIA BIOS. Should be taken care of + * in the OS support layer. + */ + + unsigned char *tmp; + tmp = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO, + pVia->PciTag, pVia->FrameBufferBase, + pVia->videoRambytes); + xf86UnMapVidMem(pScrn->scrnIndex, (pointer)tmp, + pVia->videoRambytes); + + /* + * End of hack. + */ + + pVia->FBBase = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_FRAMEBUFFER, + pVia->PciTag, pVia->FrameBufferBase, + pVia->videoRambytes); + pBIOSInfo->FBBase = pVia->FBBase; + pBIOSInfo->videoRambytes = pVia->videoRambytes; + + if (!pVia->FBBase) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Internal error: could not map framebuffer\n"); + return FALSE; + } + + pVia->FBStart = pVia->FBBase; + pVia->FBFreeStart = (pScrn->displayWidth * pScrn->bitsPerPixel >> 3) * + pScrn->virtualY; + pVia->FBFreeEnd = pVia->videoRambytes; + + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "Frame buffer start: %p, free start: 0x%x end: 0x%x\n", + pVia->FBStart, pVia->FBFreeStart, pVia->FBFreeEnd); + } + + pScrn->memPhysBase = pVia->PciInfo->memBase[0]; + pScrn->fbOffset = 0; + if(pVia->IsSecondary) pScrn->fbOffset = pScrn->videoRam << 10; + + return TRUE; +} + + +static void VIAUnmapMem(ScrnInfoPtr pScrn) +{ + VIAPtr pVia; + + pVia = VIAPTR(pScrn); + + VIADisableMMIO(pScrn); + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAUnmapMem\n")); + + if (pVia->MapBase) { + xf86UnMapVidMem(pScrn->scrnIndex, (pointer)pVia->MapBase, + VIA_MMIO_REGSIZE); + } + + if (pVia->BltBase) { + xf86UnMapVidMem(pScrn->scrnIndex, (pointer)pVia->BltBase, + VIA_MMIO_BLTSIZE); + } + + if (pVia->FBBase) { + xf86UnMapVidMem(pScrn->scrnIndex, (pointer)pVia->FBBase, + pVia->videoRambytes); + } + + return; +} + +/* + * this code is really one big hack, we are not bothering with checking + * what else might be using this hardware. I'd rather remove it and wait + * until thomas his xvmc is used by whatever is using ddmpeg now. But at + * least this is a bit nicer than the previous. + */ +static Bool +viaInitV4L(ScrnInfoPtr pScrn) +{ + VIAPtr pVia = VIAPTR(pScrn); + /* int i; */ + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "viaInitV4L\n")); + + /* FIXME: check other devices too */ + /* for (i = 0; i < 1; i++) { */ + + pVia->V4Lfd = open("/dev/video2",O_RDWR); + + if (pVia->V4Lfd != -1) { + /* FIXME: check id */ + /* if (1) { */ + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "V4L device found: /dev/video2\n"); + if (ioctl(pVia->V4Lfd, VIAMGR_INFO_XSERVERON, &pVia->graphicInfo) == -1) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "V4Lfd IOCTL VIAMGR_INFO_XSERVERON failed.\n"); + close(pVia->V4Lfd); + pVia->V4Lfd = -1; + return FALSE; + } else + return TRUE; + /* } else { + close(pVia->V4Lfd); + pVia->V4Lfd = -1; + } */ + } + /*} */ + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "viaInitV4L: failed to open v4l device.\n")); + return FALSE; +} + +/* + * + */ +static Bool +viaWriteModeV4L(ScrnInfoPtr pScrn) +{ + VIAPtr pVia = VIAPTR(pScrn); + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "viaWriteModeV4L\n")); + + if (pVia->V4Lfd == -1) + return FALSE; + + if (ioctl(pVia->V4Lfd, VIA_VID_SET_2D_INFO, &pVia->graphicInfo) != -1) + return TRUE; + + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "V4Lfd IOCTL VIA_VID_SET_2D_INFO failed.\n"); + close(pVia->V4Lfd); + pVia->V4Lfd = -1; + return FALSE; +} + +/* + * + */ +static Bool +viaCloseV4L(ScrnInfoPtr pScrn) +{ + VIAPtr pVia = VIAPTR(pScrn); + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "viaCloseV4L\n")); + + if (pVia->V4Lfd == -1) + return FALSE; + + if (ioctl(pVia->V4Lfd, VIAMGR_INFO_XSERVEROFF, &pVia->graphicInfo) != -1) { + close(pVia->V4Lfd); + pVia->V4Lfd = -1; + return TRUE; + } + + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "V4Lfd IOCTL VIAMGR_INFO_XSERVEROFF failed.\n"); + close(pVia->V4Lfd); + pVia->V4Lfd = -1; + return FALSE; +} + +static Bool VIAScreenInit(int scrnIndex, ScreenPtr pScreen, + int argc, char **argv) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + vgaHWPtr hwp = VGAHWPTR(pScrn); + VIAPtr pVia = VIAPTR(pScrn); + int ret; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAScreenInit\n")); + vgaHWUnlock(hwp); + + if (!VIAMapFB(pScrn)) + return FALSE; + + if (!VIAMapMMIO(pScrn)) + return FALSE; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- Mem Mapped\n")); + + VIASave(pScrn); + + vgaHWBlankScreen(pScrn, FALSE); + + if (!VIAModeInit(pScrn, pScrn->currentMode)) + return FALSE; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- State saved\n")); + + /* Darken the screen for aesthetic reasons and set the viewport */ + VIASaveScreen(pScreen, SCREEN_SAVER_ON); + pScrn->AdjustFrame(scrnIndex, pScrn->frameX0, pScrn->frameY0, 0); + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- Blanked\n")); + + miClearVisualTypes(); + + if (pScrn->bitsPerPixel > 8 && !pVia->IsSecondary) { + if (!miSetVisualTypes(pScrn->depth, TrueColorMask, + pScrn->rgbBits, pScrn->defaultVisual)) + return FALSE; + if (!miSetPixmapDepths()) + return FALSE; + } else { + if (!miSetVisualTypes(pScrn->depth, miGetDefaultVisualMask(pScrn->depth), + pScrn->rgbBits, pScrn->defaultVisual)) + return FALSE; + if (!miSetPixmapDepths()) + return FALSE; + } + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- Visuals set up\n")); + + ret = VIAInternalScreenInit(scrnIndex, pScreen); + + if (!ret) + return FALSE; + + xf86SetBlackWhitePixels(pScreen); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- B & W\n")); + + if (pScrn->bitsPerPixel > 8) { + VisualPtr visual; + + visual = pScreen->visuals + pScreen->numVisuals; + while (--visual >= pScreen->visuals) { + if ((visual->class | DynamicClass) == DirectColor) { + visual->offsetRed = pScrn->offset.red; + visual->offsetGreen = pScrn->offset.green; + visual->offsetBlue = pScrn->offset.blue; + visual->redMask = pScrn->mask.red; + visual->greenMask = pScrn->mask.green; + visual->blueMask = pScrn->mask.blue; + } + } + } + +#ifdef USE_FB + /* must be after RGB ordering fixed */ + fbPictureInit(pScreen, 0, 0); +#endif + + if (!pVia->NoAccel) { + VIAInitAccel(pScreen); + } +#ifdef XFREE86_44 + else { + /* + * This is needed because xf86InitFBManagerLinear in VIAInitLinear + * needs xf86InitFBManager to have been initialized, and + * xf86InitFBManager needs at least one line of free memory to + * work. This is only for Xv in Noaccel part, and since Xv is in some + * sense accelerated, it might be a better idea to disable it + * altogether. + */ + BoxRec AvailFBArea; + + AvailFBArea.x1 = 0; + AvailFBArea.y1 = 0; + AvailFBArea.x2 = pScrn->displayWidth; + AvailFBArea.y2 = pScrn->virtualY + 1; + /* + * Update FBFreeStart also for other memory managers, since + * we steal one line to make xf86InitFBManager work. + */ + pVia->FBFreeStart = (AvailFBArea.y2 + 1) * pVia->Bpl; + xf86InitFBManager(pScreen, &AvailFBArea); + } +#endif + + miInitializeBackingStore(pScreen); + xf86SetBackingStore(pScreen); + /*xf86SetSilkenMouse(pScreen);*/ + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- Backing store set up\n")); + + if(!pVia->shadowFB) /* hardware cursor needs to wrap this layer */ + VIADGAInit(pScreen); + + miDCInitialize(pScreen, xf86GetPointerScreenFuncs()); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- SW cursor set up\n")); + + if (pVia->hwcursor) { + if (!VIAHWCursorInit(pScreen)) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Hardware cursor initialization failed\n"); + } + } + + if (pVia->shadowFB) { + RefreshAreaFuncPtr refreshArea = VIARefreshArea; + + if(pVia->rotate) { + if (!pVia->PointerMoved) { + pVia->PointerMoved = pScrn->PointerMoved; + pScrn->PointerMoved = VIAPointerMoved; + } + + switch(pScrn->bitsPerPixel) { + case 8: + refreshArea = VIARefreshArea8; + break; + case 16: + refreshArea = VIARefreshArea16; + break; + case 32: + refreshArea = VIARefreshArea32; + break; + } + } + + ShadowFBInit(pScreen, refreshArea); + } + + if (!miCreateDefColormap(pScreen)) + return FALSE; + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- Def Color map set up\n")); + + if (!xf86HandleColormaps(pScreen, 256, 6, VIALoadPalette, NULL, + CMAP_RELOAD_ON_MODE_SWITCH + | CMAP_PALETTED_TRUECOLOR)) + return FALSE; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- Palette loaded\n")); + + vgaHWBlankScreen(pScrn, TRUE); + + pVia->CloseScreen = pScreen->CloseScreen; + pScreen->SaveScreen = VIASaveScreen; + pScreen->CloseScreen = VIACloseScreen; + + xf86DPMSInit(pScreen, VIADPMS, 0); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- DPMS set up\n")); + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- Color maps etc. set up\n")); + +#ifdef XF86DRI + pVia->directRenderingEnabled = VIADRIScreenInit(pScreen); + + if (pVia->directRenderingEnabled) { + pVia->directRenderingEnabled = VIADRIFinishScreenInit(pScreen); + } + if (pVia->directRenderingEnabled) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "direct rendering enabled\n"); + } + else { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "direct rendering disabled\n"); + } + if (!pVia->directRenderingEnabled) + VIAInitLinear(pScreen); +#else + VIAInitLinear(pScreen); +#endif + + + if (!pVia->IsSecondary) { + /* The chipset is checked in viaInitVideo */ + viaFillGraphicInfo(pScrn); + viaInitVideo(pScreen); +#ifdef XF86DRI + pVia->XvMCEnabled = 0; + if(pVia->Chipset == VIA_CLE266) + ViaInitXVMC(pScreen); +#endif + viaInitV4L(pScrn); + } + + if (serverGeneration == 1) + xf86ShowUnusedOptions(pScrn->scrnIndex, pScrn->options); + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- Done\n")); + return TRUE; +} + + +static int VIAInternalScreenInit(int scrnIndex, ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn; + VIAPtr pVia; + int width, height, displayWidth; + unsigned char *FBStart; + int ret = TRUE; + + xf86DrvMsg(scrnIndex, X_INFO, "VIAInternalScreenInit\n"); + + pScrn = xf86Screens[pScreen->myNum]; + pVia = VIAPTR(pScrn); + + displayWidth = pScrn->displayWidth; + + if (pVia->rotate) { + height = pScrn->virtualX; + width = pScrn->virtualY; + } else { + width = pScrn->virtualX; + height = pScrn->virtualY; + } + + if (pVia->shadowFB) { + pVia->ShadowPitch = BitmapBytePad(pScrn->bitsPerPixel * width); + pVia->ShadowPtr = xalloc(pVia->ShadowPitch * height); + displayWidth = pVia->ShadowPitch / (pScrn->bitsPerPixel >> 3); + FBStart = pVia->ShadowPtr; + } + else { + pVia->ShadowPtr = NULL; + FBStart = pVia->FBStart; + } + +#ifdef USE_FB + ret = fbScreenInit(pScreen, FBStart, width, height, + pScrn->xDpi, pScrn->yDpi, displayWidth, + pScrn->bitsPerPixel); +#else + switch (pScrn->bitsPerPixel) { + case 8: + ret = cfbScreenInit(pScreen, FBStart, width, height, pScrn->xDpi, + pScrn->yDpi, displayWidth); + break; + + case 16: + ret = cfb16ScreenInit(pScreen, FBStart, width, height, pScrn->xDpi, + pScrn->yDpi, displayWidth); + break; + + case 32: + ret = cfb32ScreenInit(pScreen, FBStart, width, height, pScrn->xDpi, + pScrn->yDpi, displayWidth); + break; + + default: + xf86DrvMsg(scrnIndex, X_ERROR, + "Internal error: invalid bpp (%d) in SavageScreenInit\n", + pScrn->bitsPerPixel); + ret = FALSE; + break; + } +#endif + + return ret; +} + + +static ModeStatus VIAValidMode(int scrnIndex, DisplayModePtr mode, + Bool verbose, int flags) +{ + DEBUG(xf86DrvMsg(scrnIndex, X_INFO, "VIAValidMode\n")); + /* TODO check modes */ + return MODE_OK; +} + + +static void VIABIOSInit(VIAPtr pVia, ScrnInfoPtr pScrn, DisplayModePtr pMode) +{ + int i; + VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; + + pBIOSInfo->bitsPerPixel = pScrn->bitsPerPixel; + pBIOSInfo->displayWidth = pScrn->displayWidth; + pBIOSInfo->frameX1 = pScrn->frameX1; + pBIOSInfo->frameY1 = pScrn->frameY1; + pBIOSInfo->scrnIndex = pScrn->scrnIndex; + + pBIOSInfo->Clock = pMode->Clock; + pBIOSInfo->HTotal = pMode->HTotal; + pBIOSInfo->VTotal = pMode->VTotal; + pBIOSInfo->HDisplay = pMode->HDisplay; + pBIOSInfo->VDisplay = pMode->VDisplay; + pBIOSInfo->CrtcHDisplay = pMode->CrtcHDisplay; + pBIOSInfo->CrtcVDisplay = pMode->CrtcVDisplay; + if (pBIOSInfo->FirstInit) { + pBIOSInfo->SaveframeX1 = pScrn->frameX1; + pBIOSInfo->SaveframeY1 = pScrn->frameY1; + pBIOSInfo->SaveHDisplay = pMode->HDisplay; + pBIOSInfo->SaveVDisplay = pMode->VDisplay; + pBIOSInfo->SaveCrtcHDisplay = pMode->CrtcHDisplay; + pBIOSInfo->SaveCrtcVDisplay = pMode->CrtcVDisplay; + } + + pBIOSInfo->IsSecondary = pVia->IsSecondary; + pBIOSInfo->HasSecondary = pVia->HasSecondary; + + for (i = 0; i < 0xFF; i++) { + pBIOSInfo->TVRegs[i] = pVia->SavedReg.TVRegs[i]; + } +} + + +static void VIAPostFindMode(VIAPtr pVia, ScrnInfoPtr pScrn, DisplayModePtr pMode) +{ + VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; + + pVia->ModeReg.mode = pBIOSInfo->mode; + pVia->ModeReg.resMode = pBIOSInfo->resMode; + pVia->ModeReg.refresh = pBIOSInfo->refresh; + pVia->ModeReg.offsetWidthByQWord = pBIOSInfo->offsetWidthByQWord; + pVia->ModeReg.countWidthByQWord = pBIOSInfo->countWidthByQWord; + + pScrn->frameX1 = pBIOSInfo->frameX1; + pScrn->frameY1 = pBIOSInfo->frameY1; + pMode->HDisplay = pBIOSInfo->HDisplay; + pMode->VDisplay = pBIOSInfo->VDisplay; + +} + + +static Bool VIAModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode) +{ + vgaHWPtr hwp = VGAHWPTR(pScrn); + VIAPtr pVia = VIAPTR(pScrn); + VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; + VIARegPtr new = &pVia->ModeReg; + vgaRegPtr vganew = &hwp->ModeReg; + /* DDUPDATEOVERLAY UpdateOverlay; */ + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAModeInit\n")); + + if (!vgaHWInit(pScrn, mode)) { + vgaHWBlankScreen(pScrn, TRUE); + return FALSE; + } + + pScrn->vtSema = TRUE; + + VIABIOSInit(pVia, pScrn, mode); + + if (!VIAFindModeUseBIOSTable(pBIOSInfo)) { + vgaHWBlankScreen(pScrn, TRUE); + VIAFreeRec(pScrn); + return FALSE; + } + + VIAPostFindMode(pVia, pScrn, mode); + + /* FIXME - need DRI lock for this bit - see i810 */ + /* do it! */ + VIAWriteMode(pScrn, vganew, new); + + /* pass graphic info to via_v4l kernel module */ + /* Coz mode changes, some member in pVia->graphicInfo need to modify */ + if (VIA_SERIES(pVia->Chipset) && !pVia->IsSecondary) + { + viaFillGraphicInfo(pScrn); + viaWriteModeV4L(pScrn); + + /* Save MCLK value*/ + VGAOUT8(0x3C4, 0x16); + pVia->swov.Save_3C4_16 = VGAIN8(0x3C5); + DBG_DD(ErrorF(" 3c4.16 : %08x \n",VGAIN8(0x3C5))); + VGAOUT8(0x3C4, 0x17); + pVia->swov.Save_3C4_17 = VGAIN8(0x3C5); + DBG_DD(ErrorF(" 3c4.17 : %08x \n",VGAIN8(0x3C5))); + VGAOUT8(0x3C4, 0x18); + pVia->swov.Save_3C4_18 = VGAIN8(0x3C5); + DBG_DD(ErrorF(" 3c4.18 : %08x \n",VGAIN8(0x3C5))); + } + VIAAdjustFrame(pScrn->scrnIndex, pScrn->frameX0, pScrn->frameY0, 0); + return TRUE; +} + + +static Bool VIACloseScreen(int scrnIndex, ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + vgaHWPtr hwp = VGAHWPTR(pScrn); + VIAPtr pVia = VIAPTR(pScrn); + vgaRegPtr vgaSavePtr = &hwp->SavedReg; + VIARegPtr viaSavePtr = &pVia->SavedReg; + CARD32 dwCursorMode; + + DEBUG(xf86DrvMsg(scrnIndex, X_INFO, "VIACloseScreen\n")); + + /* Is the display currently visible ? */ + if(pScrn->vtSema) + { + /* Wait Hardware Engine idle to exit graphical mode */ + WaitIdle(); + + /* Patch for normal log out and restart X, 3D application will hang */ + VIAWriteMode(pScrn, vgaSavePtr, viaSavePtr); + + if (!pVia->IsSecondary) { + viaCloseV4L(pScrn); + + /* Turn off all video activities */ +#ifdef XF86DRI + ViaCleanupXVMC(pScreen); +#endif + viaExitVideo(pScrn); + + /* Diable Hardware Cursor */ + dwCursorMode = VIAGETREG(VIA_REG_CURSOR_MODE); + VIASETREG(VIA_REG_CURSOR_MODE, dwCursorMode & 0xFFFFFFFE); + } + + if (pVia->VQEnable) { + /* if we use VQ, disable it before we exit */ + VIASETREG(0x43c, 0x00fe0000); + VIASETREG(0x440, 0x00000004); + } + } +#ifdef XF86DRI + if (pVia->directRenderingEnabled) { + VIADRICloseScreen(pScreen); + } +#endif + if (pVia->AccelInfoRec) { + XAADestroyInfoRec(pVia->AccelInfoRec); + pVia->AccelInfoRec = NULL; + } + if (pVia->CursorInfoRec) { + xf86DestroyCursorInfoRec(pVia->CursorInfoRec); + pVia->CursorInfoRec = NULL; + } + if (pVia->ShadowPtr) { + xfree(pVia->ShadowPtr); + pVia->ShadowPtr = NULL; + } + if (pVia->DGAModes) { + xfree(pVia->DGAModes); + pVia->DGAModes = NULL; + } + + if (pScrn->vtSema) { + VIAWriteMode(pScrn, vgaSavePtr, viaSavePtr); + vgaHWLock(hwp); + VIAUnmapMem(pScrn); + } + pScrn->vtSema = FALSE; + pScreen->CloseScreen = pVia->CloseScreen; + return (*pScreen->CloseScreen)(scrnIndex, pScreen); +} + +/* + * This only gets called when a screen is being deleted. It does not + * get called routinely at the end of a server generation. + */ +static void VIAFreeScreen(int scrnIndex, int flags) +{ + DEBUG(xf86DrvMsg(scrnIndex, X_INFO, "VIAFreeScreen\n")); + if (xf86LoaderCheckSymbol("vgaHWFreeHWRec")) + vgaHWFreeHWRec(xf86Screens[scrnIndex]); + VIAFreeRec(xf86Screens[scrnIndex]); +} + +static Bool VIASaveScreen(ScreenPtr pScreen, int mode) +{ + return vgaHWSaveScreen(pScreen, mode); +} + + +void VIAAdjustFrame(int scrnIndex, int x, int y, int flags) +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + vgaHWPtr hwp = VGAHWPTR(pScrn); + VIAPtr pVia = VIAPTR(pScrn); + int Base, tmp; + int vgaCRIndex, vgaCRReg, vgaIOBase; + DDLOCK ddLock; + LPDDLOCK lpddLock = &ddLock; + DDUPDATEOVERLAY UpdateOverlay; + ADJUSTFRAME AdjustFrame; + + DEBUG(xf86DrvMsg(scrnIndex, X_INFO, "VIAAdjustFrame\n")); + vgaIOBase = hwp->IOBase; + vgaCRIndex = vgaIOBase + 4; + vgaCRReg = vgaIOBase + 5; + + Base = (y * pScrn->displayWidth + x) * (pScrn->bitsPerPixel / 8); + + /* now program the start address registers */ + if (pVia->IsSecondary) { + Base = (Base + pScrn->fbOffset) >> 3; + VGAOUT8(vgaCRIndex, 0x62); + tmp = VGAIN8(vgaCRReg) & 0x01; + tmp |= (Base & 0x7F) << 1; + VGAOUT8(vgaCRReg, tmp); + VGAOUT8(vgaCRIndex, 0x63); + VGAOUT8(vgaCRReg, ((Base & 0x7F80) >> 7)); + VGAOUT8(vgaCRIndex, 0x64); + VGAOUT8(vgaCRReg, ((Base & 0x7F8000) >> 15)); + } + else { + Base = Base >> 1; + VGAOUT16(vgaCRIndex, (Base & 0x00ff00) | 0x0c); + VGAOUT16(vgaCRIndex, ((Base & 0x00ff) << 8) | 0x0d); + VGAOUT16(vgaCRIndex, ((Base & 0xff0000) >> 8) | 0x34); + } + + /* Pass Panning (x, y) info to V4L */ + AdjustFrame.x = x; + AdjustFrame.y = y; + + VIAVidAdjustFrame(pScrn,&AdjustFrame); + + /* Check if HW mpeg engine active */ + if (pVia->Video.VideoStatus & SW_VIDEO_ON) /* SW video case */ + { + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + " Call SW MPEG UpdateOverlay at panning mode.\n"); + + ddLock.dwFourCC = FOURCC_YUY2; + + VIAVidLockSurface(pScrn, &ddLock); + + UpdateOverlay.dwFlags = DDOVER_SHOW | DDOVER_KEYDEST; + UpdateOverlay.dwColorSpaceLowValue = VIAGETREG(0x220); + UpdateOverlay.rSrc.left = 0; + UpdateOverlay.rSrc.top = 0; + UpdateOverlay.rSrc.right = 720; + UpdateOverlay.rSrc.bottom = 480; + + UpdateOverlay.rDest.left = (int) lpddLock->SWDevice.gdwSWDstLeft; + UpdateOverlay.rDest.top = (int) lpddLock->SWDevice.gdwSWDstTop; + UpdateOverlay.rDest.right = UpdateOverlay.rDest.left + lpddLock->SWDevice.gdwSWDstWidth; + UpdateOverlay.rDest.bottom = UpdateOverlay.rDest.top + lpddLock->SWDevice.gdwSWDstHeight; + + VIAVidUpdateOverlay(pScrn, &UpdateOverlay); + } + else if (VIAGETREG(0x310) & 0x1) /* capture 0 (TV0) case */ + { + ddLock.dwFourCC = FOURCC_TV0; + + VIAVidLockSurface(pScrn, &ddLock); + } + + if (VIAGETREG(0x354) & 0x1) /* capture 1 (TV1) case */ + { + ddLock.dwFourCC = FOURCC_TV1; + + VIAVidLockSurface(pScrn, &ddLock); + } + + return; +} + + +Bool VIASwitchMode(int scrnIndex, DisplayModePtr mode, int flags) +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + VIAPtr pVia = VIAPTR(pScrn); + + DEBUG(xf86DrvMsg(scrnIndex, X_INFO, "VIASwitchMode\n")); + /* Wait Hardware Engine idle to switch graphicd mode */ + WaitIdle(); + + if (pVia->VQEnable) { + /* if we use VQ, disable it before we exit */ + VIASETREG(0x43c, 0x00fe0000); + VIASETREG(0x440, 0x00000004); + } + + return VIAModeInit(xf86Screens[scrnIndex], mode); +} + + +void VIAEnableMMIO(ScrnInfoPtr pScrn) +{ + vgaHWPtr hwp = VGAHWPTR(pScrn); + VIAPtr pVia = VIAPTR(pScrn); + unsigned char val; + + if (xf86IsPrimaryPci(pVia->PciInfo)) { + /* If we are primary card, we still use std vga port. If we use + * MMIO, system will hang in vgaHWSave when our card used in + * PLE and KLE (integrated Trident MVP4) + */ + vgaHWSetStdFuncs(hwp); + } + else { + vgaHWSetMmioFuncs(hwp, pVia->MapBase, 0x8000); + } + + val = VGAIN8(0x3c3); + VGAOUT8(0x3c3, val | 0x01); + val = VGAIN8(VGA_MISC_OUT_R); + VGAOUT8(VGA_MISC_OUT_W, val | 0x01); + + /* Unlock Extended IO Space */ + VGAOUT8(0x3c4, 0x10); + VGAOUT8(0x3c5, 0x01); + + /* Enable MMIO */ + if(!pVia->IsSecondary) { + VGAOUT8(0x3c4, 0x1a); + val = VGAIN8(0x3c5); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "primary val = %x\n", val)); + VGAOUT8(0x3c5, val | 0x68); + } + else { + VGAOUT8(0x3c4, 0x1a); + val = VGAIN8(0x3c5); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "secondary val = %x\n", val)); + VGAOUT8(0x3c5, val | 0x38); + } + + return; +} + + +void VIADisableMMIO(ScrnInfoPtr pScrn) +{ + VIAPtr pVia = VIAPTR(pScrn); + unsigned char val; + + VGAOUT8(0x3c4, 0x1a); + val = VGAIN8(0x3c5); + VGAOUT8(0x3c5, val & 0x97); + + return; +} + + +void VIALoadPalette(ScrnInfoPtr pScrn, int numColors, int *indicies, + LOCO *colors, VisualPtr pVisual) +{ + VIAPtr pVia = VIAPTR(pScrn); + int i, index; + int sr1a, sr1b, cr67, cr6a; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIALoadPalette\n")); + + if (pScrn->bitsPerPixel != 8) + return; + VGAOUT8(0x3C4, 0x1A); + sr1a = VGAIN8(0x3C5); + VGAOUT8(0x3C4, 0x1B); + sr1b = VGAIN8(0x3C5); + VGAOUT8(0x3D4, 0x67); + cr67 = VGAIN8(0x3D5); + VGAOUT8(0x3D4, 0x6A); + cr6a = VGAIN8(0x3D5); + + if (pVia->IsSecondary) { + VGAOUT8(0x3C4, 0x1A); + VGAOUT8(0x3C5, sr1a | 0x01); + VGAOUT8(0x3C4, 0x1B); + VGAOUT8(0x3C5, sr1b | 0x80); + VGAOUT8(0x3D4, 0x67); + VGAOUT8(0x3D5, cr67 & 0x3F); + VGAOUT8(0x3D4, 0x6A); + VGAOUT8(0x3D5, cr6a | 0xC0); + } + + for (i = 0; i < numColors; i++) { + index = indicies[i]; + VGAOUT8(0x3c8, index); + VGAOUT8(0x3c9, colors[index].red); + VGAOUT8(0x3c9, colors[index].green); + VGAOUT8(0x3c9, colors[index].blue); + } + + if (pVia->IsSecondary) { + VGAOUT8(0x3C4, 0x1A); + VGAOUT8(0x3C5, sr1a); + VGAOUT8(0x3C4, 0x1B); + VGAOUT8(0x3C5, sr1b); + VGAOUT8(0x3D4, 0x67); + VGAOUT8(0x3D5, cr67); + VGAOUT8(0x3D4, 0x6A); + VGAOUT8(0x3D5, cr6a); + + /* Screen 0 palette was changed by mode setting of Screen 1, + * so load again */ + for (i = 0; i < numColors; i++) { + index = indicies[i]; + VGAOUT8(0x3c8, index); + VGAOUT8(0x3c9, colors[index].red); + VGAOUT8(0x3c9, colors[index].green); + VGAOUT8(0x3c9, colors[index].blue); + } + + } + +} + + +static void VIADPMS(ScrnInfoPtr pScrn, int mode, int flags) +{ + vgaHWPtr hwp = VGAHWPTR(pScrn); + VIAPtr pVia = VIAPTR(pScrn); + VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; + int vgaCRIndex, vgaCRReg; + CARD8 val; + + I2CDevPtr dev; + unsigned char W_Buffer[2]; + + vgaCRIndex = hwp->IOBase + 4; + vgaCRReg = hwp->IOBase + 5; + + /* Clear DPMS setting */ + VGAOUT8(vgaCRIndex, 0x36); + val = VGAIN8(vgaCRReg); + val &= 0xCF; + /* Turn Off CRT, if user doesn't want crt on */ + if (!pVia->IsSecondary && !(pBIOSInfo->ActiveDevice & VIA_DEVICE_CRT1)) { + val |= 0x30; + } + + switch (mode) { + case DPMSModeOn: + if (pBIOSInfo->ActiveDevice & (VIA_DEVICE_DFP | VIA_DEVICE_LCD)) { + /* Enable LCD */ + VIAEnableLCD(pBIOSInfo); + } + + if (pBIOSInfo->ActiveDevice & VIA_DEVICE_TV) { + dev = xf86CreateI2CDevRec(); + dev->DevName = "TV"; + dev->SlaveAddr = pBIOSInfo->TVI2CAdd; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + if (xf86I2CDevInit(dev)) { + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + case VIA_TV3: + case VIA_VT1622A: + W_Buffer[0] = 0x0E; + W_Buffer[1] = 0x0; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + break; + case VIA_VT1623: + VIAGPIOI2C_Initial(pBIOSInfo, 0x40); + VIAGPIOI2C_Write(pBIOSInfo, 0x0E, 0); + break; + case VIA_CH7019: + W_Buffer[0] = 0x49; + W_Buffer[1] = 0x20; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + /*W_Buffer[0] = 0x1E; + W_Buffer[1] = 0xD0; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0);*/ + break; + case VIA_SAA7108: + W_Buffer[0] = 0x2D; + switch (pBIOSInfo->TVOutput) { + case TVOUTPUT_COMPOSITE: + case TVOUTPUT_SVIDEO: + W_Buffer[1] = 0xB4; + break; + case TVOUTPUT_RGB: + W_Buffer[1] = 0; + break; + case TVOUTPUT_YCBCR: + W_Buffer[1] = 0x84; + break; + default: + W_Buffer[1] = 0x08; + break; + } + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + break; + default: + break; + } + xf86DestroyI2CDevRec(dev,TRUE); + } + else + xf86DestroyI2CDevRec(dev,TRUE); + } + VGAOUT8(vgaCRIndex, 0x36); + VGAOUT8(vgaCRReg, val); + break; + case DPMSModeStandby: + case DPMSModeSuspend: + case DPMSModeOff: + if (pBIOSInfo->ActiveDevice & (VIA_DEVICE_DFP | VIA_DEVICE_LCD)) { + VIADisableLCD(pBIOSInfo); + } + if (pBIOSInfo->ActiveDevice & VIA_DEVICE_TV) { + dev = xf86CreateI2CDevRec(); + dev->DevName = "TV"; + dev->SlaveAddr = pBIOSInfo->TVI2CAdd; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + if (xf86I2CDevInit(dev)) { + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + W_Buffer[0] = 0x0E; + W_Buffer[1] = 0x03; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + break; + case VIA_TV3: + case VIA_VT1622A: + W_Buffer[0] = 0x0E; + W_Buffer[1] = 0x0F; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + break; + case VIA_VT1623: + VIAGPIOI2C_Initial(pBIOSInfo, 0x40); + VIAGPIOI2C_Write(pBIOSInfo, 0x0E, 0x0F); + break; + case VIA_CH7019: + W_Buffer[0] = 0x49; + W_Buffer[1] = 0x3E; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + W_Buffer[0] = 0x1E; + W_Buffer[1] = 0xD0; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + break; + case VIA_SAA7108: + W_Buffer[0] = 0x2D; + W_Buffer[1] = 0x08; + xf86I2CWriteRead(dev, W_Buffer,2, NULL,0); + break; + default: + break; + } + xf86DestroyI2CDevRec(dev,TRUE); + } + else + xf86DestroyI2CDevRec(dev,TRUE); + } + + val |= 0x30; + VGAOUT8(vgaCRIndex, 0x36); + VGAOUT8(vgaCRReg, val); + break; + default: + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Invalid DPMS mode %d\n", mode); + break; + } + return; +} + + +/* Active Device according connected status */ +Bool VIADeviceSelection(ScrnInfoPtr pScrn) +{ + VIAPtr pVia = VIAPTR(pScrn); + VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; + /*unsigned int i; + unsigned char numDevice;*/ + pBIOSInfo->SAMM = FALSE; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIADeviceSelection\n")); + pBIOSInfo->DefaultActiveDevice = ViaVBEGetActiveDevice(pScrn); + /* if XF86Config Option "ActiveDevice" hasn't set, active device according CMOS */ + if (!pBIOSInfo->ActiveDevice) { + pBIOSInfo->ActiveDevice = pBIOSInfo->DefaultActiveDevice; + } + /* if XF86Config-4 set SAMM, and only active one device, active device according CMOS */ + else if (pVia->IsSecondary && (pBIOSInfo->ActiveDevice == VIA_DEVICE_CRT1 || + pBIOSInfo->ActiveDevice == VIA_DEVICE_LCD || + pBIOSInfo->ActiveDevice == VIA_DEVICE_TV || + pBIOSInfo->ActiveDevice == VIA_DEVICE_DFP || + pBIOSInfo->ActiveDevice == VIA_DEVICE_CRT2)){ + pBIOSInfo->ActiveDevice = pBIOSInfo->DefaultActiveDevice; + } + if (((pBIOSInfo->ActiveDevice & pBIOSInfo->ConnectedDevice) == pBIOSInfo->ActiveDevice) + && (pVia->IsSecondary)) { + pBIOSInfo->SAMM = TRUE; + } + pBIOSInfo->ActiveDevice &= pBIOSInfo->ConnectedDevice; + pVia->ActiveDevice = pBIOSInfo->ActiveDevice; + + /*if (pBIOSInfo->ActiveDevice & VIA_DEVICE_LCD) { + pBIOSInfo->DVIEncoder = VIA_VT3191; + numDevice = 0x02; + i = ViaVBEGetDisplayDeviceInfo(pScrn, &numDevice); + if (i != 0xFFFF) { + if (pBIOSInfo->PanelSize == VIA_PANEL_INVALID) + pBIOSInfo->PanelSize = numDevice; + }*/ + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Connected Device is %d\n", pBIOSInfo->ConnectedDevice)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Active Device is %d\n", pBIOSInfo->ActiveDevice)); + + return TRUE; +} + +/* SAMM device dispatch */ +Bool VIADeviceDispatch(ScrnInfoPtr pScrn) +{ + DevUnion* pPriv = xf86GetEntityPrivate(pScrn->entityList[0], gVIAEntityIndex); + VIAEntPtr pVIAEnt = pPriv->ptr; + VIAPtr pVia1 = VIAPTR(pScrn), pVia0 = VIAPTR(pVIAEnt->pPrimaryScrn); + VIABIOSInfoPtr pBIOSInfo1 = pVia1->pBIOSInfo, pBIOSInfo0 = pVia0->pBIOSInfo; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIADeviceDispatch\n")); + pBIOSInfo0->SAMM = TRUE; + switch (pBIOSInfo1->ActiveDevice) { + case (VIA_DEVICE_CRT1 | VIA_DEVICE_LCD) : /* If CRT + LCD, CRT is IGA1 */ + pBIOSInfo0->ActiveDevice = VIA_DEVICE_CRT1; + pBIOSInfo1->ActiveDevice = VIA_DEVICE_LCD; + break; + case (VIA_DEVICE_CRT1 | VIA_DEVICE_TV) : /* If CRT + TV, CRT is IGA1 */ + pBIOSInfo0->ActiveDevice = VIA_DEVICE_CRT1; + pBIOSInfo1->ActiveDevice = VIA_DEVICE_TV; + break; + case (VIA_DEVICE_CRT1 | VIA_DEVICE_DFP) : /* If CRT + DFP, CRT is IGA1 */ + pBIOSInfo0->ActiveDevice = VIA_DEVICE_CRT1; + pBIOSInfo1->ActiveDevice = VIA_DEVICE_DFP; + break; + case (VIA_DEVICE_LCD | VIA_DEVICE_TV) : /* If LCD + TV, TV is IGA1 */ + pBIOSInfo0->ActiveDevice = VIA_DEVICE_TV; + pBIOSInfo1->ActiveDevice = VIA_DEVICE_LCD; + break; + case (VIA_DEVICE_LCD | VIA_DEVICE_DFP) : /* If LCD + DFP, DFP is IGA1 */ + pBIOSInfo0->ActiveDevice = VIA_DEVICE_DFP; + pBIOSInfo1->ActiveDevice = VIA_DEVICE_LCD; + break; + case (VIA_DEVICE_TV | VIA_DEVICE_DFP) : /* If TV + DFP, TV is IGA1 */ + pBIOSInfo0->ActiveDevice = VIA_DEVICE_TV; + pBIOSInfo1->ActiveDevice = VIA_DEVICE_DFP; + break; + default : + return FALSE; + break; + } + DEBUG(xf86DrvMsg(pVIAEnt->pPrimaryScrn->scrnIndex, X_INFO, "Active Device is %d\n", pBIOSInfo0->ActiveDevice)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Active Device is %d\n", pBIOSInfo1->ActiveDevice)); + return TRUE; +} + +#ifdef XF86DRI +void +VIAInitialize3DEngine(ScrnInfoPtr pScrn) +{ + VIAPtr pVia = VIAPTR(pScrn); + int i; + + if (!pVia->sharedData->b3DRegsInitialized) + { + + VIASETREG(0x43C, 0x00010000); + + for (i = 0; i <= 0x7D; i++) + { + VIASETREG(0x440, (CARD32) i << 24); + } + + VIASETREG(0x43C, 0x00020000); + + for (i = 0; i <= 0x94; i++) + { + VIASETREG(0x440, (CARD32) i << 24); + } + + VIASETREG(0x440, 0x82400000); + + VIASETREG(0x43C, 0x01020000); + + + for (i = 0; i <= 0x94; i++) + { + VIASETREG(0x440, (CARD32) i << 24); + } + + VIASETREG(0x440, 0x82400000); + VIASETREG(0x43C, 0xfe020000); + + for (i = 0; i <= 0x03; i++) + { + VIASETREG(0x440, (CARD32) i << 24); + } + + VIASETREG(0x43C, 0x00030000); + + for (i = 0; i <= 0xff; i++) + { + VIASETREG(0x440, 0); + } + VIASETREG(0x43C, 0x00100000); + VIASETREG(0x440, 0x00333004); + VIASETREG(0x440, 0x10000002); + VIASETREG(0x440, 0x60000000); + VIASETREG(0x440, 0x61000000); + VIASETREG(0x440, 0x62000000); + VIASETREG(0x440, 0x63000000); + VIASETREG(0x440, 0x64000000); + + VIASETREG(0x43C, 0x00fe0000); + + if (pVia->ChipRev >= 3 ) + VIASETREG(0x440,0x40008c0f); + else + VIASETREG(0x440,0x4000800f); + + VIASETREG(0x440,0x44000000); + VIASETREG(0x440,0x45080C04); + VIASETREG(0x440,0x46800408); + VIASETREG(0x440,0x50000000); + VIASETREG(0x440,0x51000000); + VIASETREG(0x440,0x52000000); + VIASETREG(0x440,0x53000000); + + pVia->sharedData->b3DRegsInitialized = 1; + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "3D Engine has been initialized.\n"); + } + + VIASETREG(0x43C,0x00fe0000); + VIASETREG(0x440,0x08000001); + VIASETREG(0x440,0x0A000183); + VIASETREG(0x440,0x0B00019F); + VIASETREG(0x440,0x0C00018B); + VIASETREG(0x440,0x0D00019B); + VIASETREG(0x440,0x0E000000); + VIASETREG(0x440,0x0F000000); + VIASETREG(0x440,0x10000000); + VIASETREG(0x440,0x11000000); + VIASETREG(0x440,0x20000000); +} +#endif diff --git a/src/via_driver.h b/src/via_driver.h new file mode 100644 index 0000000..0939f83 --- /dev/null +++ b/src/via_driver.h @@ -0,0 +1,530 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_driver.h,v 1.13 2004/02/08 17:57:10 tsi Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef _VIA_DRIVER_H_ +#define _VIA_DRIVER_H_ 1 + +/* #define DEBUG_PRINT */ + + +#ifdef DEBUG_PRINT +#define DEBUG(x) x +#else +#define DEBUG(x) +#endif + +#include "vgaHW.h" +#include "xf86.h" +#include "xf86Resources.h" +#include "xf86_ansic.h" +#include "xf86Pci.h" +#include "xf86PciInfo.h" +#include "xf86_OSproc.h" +#include "compiler.h" +#include "xf86Cursor.h" +#include "mipointer.h" +#include "micmap.h" + +#define USE_FB +#ifdef USE_FB +#include "fb.h" +#else +#include "cfb.h" +#include "cfb16.h" +#include "cfb32.h" +#endif + +#include "xf86cmap.h" +#include "vbe.h" +#include "xaa.h" + +#include "via_regs.h" +#include "via_bios.h" +#include "via_gpioi2c.h" +#include "via_priv.h" +/* #include "ginfo.h" */ +#include "via_privioctl.h" + +#ifdef XF86DRI +#define _XF86DRI_SERVER_ +#include "sarea.h" +#include "dri.h" +#include "GL/glxint.h" +#include "via_dri.h" +#endif + +#define DRIVER_NAME "via" +#define DRIVER_VERSION "4.1.0" +#define VERSION_MAJOR 4 +#define VERSION_MINOR 1 +#define PATCHLEVEL 30 +#define VIA_VERSION ((VERSION_MAJOR<<24) | (VERSION_MINOR<<16) | PATCHLEVEL) + +#if XF86_VERSION_CURRENT < XF86_VERSION_NUMERIC(4,3,99,14,0) +#undef XFREE86_44 +#else +#define XFREE86_44 1 +#endif + +#define VGAIN8(addr) MMIO_IN8(pVia->MapBase+0x8000, addr) +#define VGAIN16(addr) MMIO_IN16(pVia->MapBase+0x8000, addr) +#define VGAIN(addr) MMIO_IN32(pVia->MapBase+0x8000, addr) + +#define VGAOUT8(addr, val) MMIO_OUT8(pVia->MapBase+0x8000, addr, val) +#define VGAOUT16(addr, val) MMIO_OUT16(pVia->MapBase+0x8000, addr, val) +#define VGAOUT(addr, val) MMIO_OUT32(pVia->MapBase+0x8000, addr, val) + +#define INREG(addr) MMIO_IN32(pVia->MapBase, addr) +#define OUTREG(addr, val) MMIO_OUT32(pVia->MapBase, addr, val) +#define INREG16(addr) MMIO_IN16(pVia->MapBase, addr) +#define OUTREG16(addr, val) MMIO_OUT16(pVia->MapBase, addr, val) + + +#define VIA_MAX_ACCEL_X (2047) +#define VIA_MAX_ACCEL_Y (2047) +#ifdef XFREE86_44 +#define VIA_PIXMAP_CACHE_SIZE (4 * (VIA_MAX_ACCEL_X + 1) * (VIA_MAX_ACCEL_Y +1)) +#else +#define VIA_PIXMAP_CACHE_SIZE (256 * 1024) +#endif /* XFREE86_44 */ +#define VIA_CURSOR_SIZE (4 * 1024) +#define VIA_VQ_SIZE (256 * 1024) + +typedef struct { + unsigned int mode, refresh, resMode; + int countWidthByQWord; + int offsetWidthByQWord; + unsigned char SR08, SR0A, SR0F; + + /* extended Sequencer registers */ + unsigned char SR10, SR11, SR12, SR13,SR14,SR15,SR16; + unsigned char SR17, SR18, SR19, SR1A,SR1B,SR1C,SR1D,SR1E; + unsigned char SR1F, SR20, SR21, SR22,SR23,SR24,SR25,SR26; + unsigned char SR27, SR28, SR29, SR2A,SR2B,SR2C,SR2D,SR2E; + unsigned char SR2F, SR30, SR31, SR32,SR33,SR34,SR40,SR41; + unsigned char SR42, SR43, SR44, SR45,SR46,SR47; + + unsigned char Clock; + + /* extended CRTC registers */ + unsigned char CR13, CR30, CR31, CR32, CR33, CR34, CR35, CR36; + unsigned char CR37, CR38, CR39, CR3A, CR40, CR41, CR42, CR43; + unsigned char CR44, CR45, CR46, CR47, CR48, CR49, CR4A; + unsigned char CRTCRegs[68]; + unsigned char TVRegs[0xFF]; +/* unsigned char LCDRegs[0x40];*/ +} VIARegRec, *VIARegPtr; + +/*Definition for CapturePortID*/ +#define PORT0 0 /* Capture Port 0*/ +#define PORT1 1 /* Capture Port 1*/ + +typedef struct __viaVideoControl { + CARD16 PORTID; + CARD32 dwCompose; + CARD32 dwHighQVDO; + CARD32 VideoStatus; + CARD32 dwAction; +#define ACTION_SET_PORTID 0 +#define ACTION_SET_COMPOSE 1 +#define ACTION_SET_HQV 2 +#define ACTION_SET_BOB 4 +#define ACTION_SET_VIDEOSTATUS 8 + Bool Cap0OnScreen1; /* True: Capture0 On Screen1 ; False: Capture0 On Screen0 */ + Bool Cap1OnScreen1; /* True: Capture1 On Screen1 ; False: Capture1 On Screen0 */ + Bool MPEGOnScreen1; /* True: MPEG On Screen1 ; False: MPEG On Screen0 */ +} VIAVideoControlRec, VIAVideoControlPtr; + +/*For Video HW Difference */ +#define VIA_REVISION_CLEC0 0x10 +#define VIA_REVISION_CLEC1 0x11 +#define VIA_REVISION_CLECX 0x10 + +#define VID_HWDIFF_TRUE 0x00000001 +#define VID_HWDIFF_FALSE 0x00000000 + +/* + * Video HW Difference Structure + */ + +typedef struct __VIAHWRec +{ + unsigned long dwThreeHQVBuffer; /* Use Three HQV Buffers*/ + unsigned long dwV3SrcHeightSetting; /* Set Video Source Width and Height*/ + unsigned long dwSupportExtendFIFO; /* Support Extand FIFO*/ + unsigned long dwHQVFetchByteUnit; /* HQV Fetch Count unit is byte*/ + unsigned long dwHQVInitPatch; /* Initialize HQV Engine 2 times*/ + unsigned long dwSupportV3Gamma; /* Support V3 Gamma */ + unsigned long dwUpdFlip; /* Set HQV3D0[15] to flip video*/ + unsigned long dwHQVDisablePatch; /* Change Video Engine Clock setting for HQV disable bug*/ + unsigned long dwSUBFlip; /* Set HQV3D0[15] to flip video for sub-picture blending*/ + unsigned long dwNeedV3Prefetch; /* V3 pre-fetch function for K8*/ + unsigned long dwNeedV4Prefetch; /* V4 pre-fetch function for K8*/ + unsigned long dwUseSystemMemory; /* Use system memory for DXVA compressed data buffers*/ + unsigned long dwExpandVerPatch; /* Patch video HW bug in expand SIM mode or same display path*/ + unsigned long dwExpandVerHorPatch; /* Patch video HW bug in expand SAMM mode or same display path*/ + unsigned long dwV3ExpireNumTune; /* Change V3 expire number setting for V3 bandwidth issue*/ + unsigned long dwV3FIFOThresholdTune; /* Change V3 FIFO, Threshold and Pre-threshold setting for V3 bandwidth issue*/ + unsigned long dwCheckHQVFIFOEmpty; /* HW Flip path, need to check HQV FIFO status */ + unsigned long dwUseMPEGAGP; /* Use MPEG AGP function*/ + unsigned long dwV3FIFOPatch; /* For CLE V3 FIFO Bug (srcWidth <= 8)*/ + unsigned long dwSupportTwoColorKey; /* Support two color key*/ + unsigned long dwCxColorSpace; /* CLE_Cx ColorSpace*/ +} VIAHWRec; + +/*Wait Function Structure and Flag*/ +typedef struct _WaitHWINFO +{ + unsigned char * pjVideo; /* MMIO Address Info*/ + unsigned long dwVideoFlag; /* Video Flag*/ +}WaitHWINFO, * LPWaitHWINFO; + +/* VIA Tuners */ +typedef struct +{ + int decoderType; /* Decoder I2C Type */ +#define SAA7108H 0 +#define SAA7113H 1 +#define SAA7114H 2 + I2CDevPtr I2C; /* Decoder I2C */ + I2CDevPtr FMI2C; /* FM Tuner I2C */ + + /* Not yet used */ + int autoDetect; /* Autodetect mode */ + int tunerMode; /* Fixed mode */ +} ViaTunerRec, *ViaTunerPtr; + +/* + * varables that need to be shared among different screens. + */ +typedef struct { + Bool b3DRegsInitialized; +} ViaSharedRec, *ViaSharedPtr; + +#ifdef XF86DRI + +#define VIA_XVMC_MAX_BUFFERS 2 +#define VIA_XVMC_MAX_CONTEXTS 4 +#define VIA_XVMC_MAX_SURFACES 20 + + + + +typedef struct { + VIAMem memory_ref; + unsigned long offsets[VIA_XVMC_MAX_BUFFERS]; +} ViaXvMCSurfacePriv; + +typedef struct { + drmContext drmCtx; +} ViaXvMCContextPriv; + +typedef struct { + XID contexts[VIA_XVMC_MAX_CONTEXTS]; + XID surfaces[VIA_XVMC_MAX_SURFACES]; + ViaXvMCSurfacePriv *sPrivs[VIA_XVMC_MAX_SURFACES]; + ViaXvMCContextPriv *cPrivs[VIA_XVMC_MAX_CONTEXTS]; + int nContexts,nSurfaces; + drmHandle mmioBase,fbBase,sAreaBase; + unsigned sAreaSize; + drmAddress sAreaAddr; +}ViaXvMC, *ViaXvMCPtr; + +#endif + +typedef struct _VIA { + VIARegRec SavedReg; + VIARegRec ModeReg; + xf86CursorInfoPtr CursorInfoRec; + Bool ModeStructInit; + int Bpp, Bpl; + unsigned PlaneMask; + + unsigned long videoRambytes; + int videoRamKbytes; + int FBFreeStart; + int FBFreeEnd; + int CursorStart; + int VQStart; + int VQEnd; + + /* These are physical addresses. */ + unsigned long FrameBufferBase; + unsigned long MmioBase; + + /* These are linear addresses. */ + unsigned char* MapBase; + unsigned char* VidMapBase; + unsigned char* MpegMapBase; + unsigned char* BltBase; + unsigned char* MapBaseDense; + unsigned char* FBBase; + unsigned char* FBStart; + + /* Private memory pool management */ + int SWOVUsed[MEM_BLOCKS]; /* Free map for SWOV pool */ + unsigned long SWOVPool; /* Base of SWOV pool */ + unsigned long SWOVSize; /* Size of SWOV blocks */ + + Bool PrimaryVidMapped; + int dacSpeedBpp; + int minClock, maxClock; + int MCLK, REFCLK, LCDclk; + double refclk_fact; + + /* Here are all the Options */ + Bool VQEnable; + Bool pci_burst; + Bool NoPCIRetry; + Bool hwcursor; + Bool NoAccel; + Bool shadowFB; + int rotate; + + CloseScreenProcPtr CloseScreen; + pciVideoPtr PciInfo; + PCITAG PciTag; + int Chipset; + int ChipId; + int ChipRev; + vbeInfoPtr pVbe; + int EntityIndex; + + /* Support for shadowFB and rotation */ + unsigned char* ShadowPtr; + int ShadowPitch; + void (*PointerMoved)(int index, int x, int y); + + /* Support for XAA acceleration */ + XAAInfoRecPtr AccelInfoRec; + xRectangle Rect; + CARD32 SavedCmd; + CARD32 SavedFgColor; + CARD32 SavedBgColor; + CARD32 SavedPattern0; + CARD32 SavedPattern1; + CARD32 SavedPatternAddr; + + /* BIOS Info Ptr */ + VIABIOSInfoPtr pBIOSInfo; + + /* Support for DGA */ + int numDGAModes; + DGAModePtr DGAModes; + Bool DGAactive; + int DGAViewportStatus; + int DGAOldDisplayWidth; + int DGAOldBitsPerPixel; + int DGAOldDepth; + /* The various wait handlers. */ + int (*myWaitIdle)(struct _VIA*); + + /* I2C & DDC */ + I2CBusPtr I2C_Port1; + I2CBusPtr I2C_Port2; + xf86MonPtr DDC1; + xf86MonPtr DDC2; + + /* MHS */ + Bool IsSecondary; + Bool HasSecondary; + + /* Capture de-interlace Mode */ + CARD32 Cap0_Deinterlace; + CARD32 Cap1_Deinterlace; + + Bool Cap0_FieldSwap; + +#ifdef XF86DRI + Bool directRenderingEnabled; + Bool XvMCEnabled; + DRIInfoPtr pDRIInfo; + int drmFD; + int numVisualConfigs; + __GLXvisualConfig* pVisualConfigs; + VIAConfigPrivPtr pVisualConfigsPriv; + unsigned long agpHandle; + unsigned long registerHandle; + unsigned long agpAddr; + drmAddress agpMappedAddr; + unsigned char *agpBase; + unsigned int agpSize; + Bool IsPCI; + Bool drixinerama; + ViaXvMC xvmc; +#endif + unsigned char ActiveDevice; /* if SAMM, non-equal pBIOSInfo->ActiveDevice */ + unsigned char *CursorImage; + CARD32 CursorFG; + CARD32 CursorBG; + CARD32 CursorMC; + + /* Video */ + swovRec swov; + VIAVideoControlRec Video; + VIAHWRec ViaHW; + unsigned long dwV1, dwV3; + unsigned long OverlaySupported; + unsigned long dwFrameNum; + + pointer VidReg; + unsigned long gdwVidRegCounter; + unsigned long old_dwUseExtendedFIFO; + + /* Overlay TV Tuners */ + ViaTunerPtr Tuner[2]; + I2CDevPtr CXA2104S; + int AudioMode; + int AudioMute; + + /* Global 2D state block - needs to slowly die */ + VIAGRAPHICINFO graphicInfo; + ViaSharedPtr sharedData; + int V4Lfd; +} VIARec, *VIAPtr; + + +typedef struct +{ + Bool IsDRIEnabled; + + Bool HasSecondary; + Bool BypassSecondary; + /*These two registers are used to make sure the CRTC2 is + retored before CRTC_EXT, otherwise it could lead to blank screen.*/ + Bool IsSecondaryRestored; + Bool RestorePrimary; + + ScrnInfoPtr pSecondaryScrn; + ScrnInfoPtr pPrimaryScrn; +}VIAEntRec, *VIAEntPtr; + + +/* Shortcuts. These depend on a local symbol "pVia". */ + +#define WaitIdle() pVia->myWaitIdle(pVia) +#define VIAPTR(p) ((VIAPtr)((p)->driverPrivate)) + + +/* Prototypes. */ +void VIAAdjustFrame(int scrnIndex, int y, int x, int flags); +Bool VIASwitchMode(int scrnIndex, DisplayModePtr mode, int flags); + +/* In HwDiff.c */ +void VIAvfInitHWDiff(VIAPtr pVia ); + +/* In via_cursor.c. */ +Bool VIAHWCursorInit(ScreenPtr pScreen); +void VIAShowCursor(ScrnInfoPtr); +void VIAHideCursor(ScrnInfoPtr); + + +/* In via_accel.c. */ +Bool VIAInitAccel(ScreenPtr); +void VIAInitialize2DEngine(ScrnInfoPtr); +void VIAAccelSync(ScrnInfoPtr); + + +/* In via_shadow.c */ +void VIAPointerMoved(int index, int x, int y); +void VIARefreshArea(ScrnInfoPtr pScrn, int num, BoxPtr pbox); +void VIARefreshArea8(ScrnInfoPtr pScrn, int num, BoxPtr pbox); +void VIARefreshArea16(ScrnInfoPtr pScrn, int num, BoxPtr pbox); +void VIARefreshArea24(ScrnInfoPtr pScrn, int num, BoxPtr pbox); +void VIARefreshArea32(ScrnInfoPtr pScrn, int num, BoxPtr pbox); + + +/* In via_bios.c */ +void VIAEnableLCD(VIABIOSInfoPtr pBIOSInfo); +void VIADisableLCD(VIABIOSInfoPtr pBIOSInfo); + +/* In via_dga.c */ +Bool VIADGAInit(ScreenPtr); + +/* In via_i2c.c */ +Bool VIAI2CInit(ScrnInfoPtr pScrn); + +/* In via_gpioi2c.c */ +Bool VIAGPIOI2C_Write(VIABIOSInfoPtr pBIOSInfo, int SubAddress, CARD8 Data); +Bool VIAGPIOI2C_Read(VIABIOSInfoPtr pBIOSInfo, int SubAddress, CARD8 *Buffer, int BufferLen); +Bool VIAGPIOI2C_ReadByte(VIABIOSInfoPtr pBIOSInfo, int SubAddress, CARD8 *Buffer); +Bool VIAGPIOI2C_Initial(VIABIOSInfoPtr pBIOSInfo, CARD8 SlaveDevice); + +/*In via_video.c*/ +void viaInitVideo(ScreenPtr pScreen); +void viaExitVideo(ScrnInfoPtr pScrn); +void viaResetVideo(ScrnInfoPtr pScrn); +void viaSaveVideo(ScrnInfoPtr pScrn); +void viaRestoreVideo(ScrnInfoPtr pScrn); + +/*In via_utility.c */ +void VIAXVUtilityProc(ScrnInfoPtr pScrn, unsigned char* buf); +Bool VIAUTGetInfo(VIABIOSInfoPtr pBIOSInfo); +Bool VIALoadUserSetting(VIABIOSInfoPtr pBIOSInfo); +Bool VIALoadGammaSetting(VIABIOSInfoPtr pBIOSInfo); +Bool VIARestoreUserSetting(VIABIOSInfoPtr pBIOSInfo); +void VIAUTRemoveRestartFlag(VIABIOSInfoPtr pBIOSInfo); + +/* in via_overlay.c */ +unsigned long viaOverlayHQVCalcZoomHeight (VIAPtr pVia, unsigned long srcHeight,unsigned long dstHeight, + unsigned long * lpzoomCtl, unsigned long * lpminiCtl, unsigned long * lpHQVfilterCtl, unsigned long * lpHQVminiCtl,unsigned long * lpHQVzoomflag); +unsigned long viaOverlayGetSrcStartAddress (VIAPtr pVia, unsigned long dwVideoFlag,RECTL rSrc,RECTL rDest, unsigned long dwSrcPitch,LPDDPIXELFORMAT lpDPF,unsigned long * lpHQVoffset ); +void viaOverlayGetDisplayCount(VIAPtr pVIa, unsigned long dwVideoFlag,LPDDPIXELFORMAT lpDPF,unsigned long dwSrcWidth,unsigned long * lpDisplayCountW); +unsigned long viaOverlayHQVCalcZoomWidth(VIAPtr pVia, unsigned long dwVideoFlag, unsigned long srcWidth , unsigned long dstWidth, + unsigned long * lpzoomCtl, unsigned long * lpminiCtl, unsigned long * lpHQVfilterCtl, unsigned long * lpHQVminiCtl,unsigned long * lpHQVzoomflag); +void viaOverlayGetV1Format(VIAPtr pVia, unsigned long dwVideoFlag,LPDDPIXELFORMAT lpDPF, unsigned long * lpdwVidCtl,unsigned long * lpdwHQVCtl ); +void viaOverlayGetV3Format(VIAPtr pVia, unsigned long dwVideoFlag,LPDDPIXELFORMAT lpDPF, unsigned long * lpdwVidCtl,unsigned long * lpdwHQVCtl ); + +/* In via_memory.c */ +void VIAFreeLinear(VIAMemPtr); +unsigned long VIAAllocLinear(VIAMemPtr, ScrnInfoPtr, unsigned long); +void VIAInitLinear(ScreenPtr pScreen); + +/* In via_tuner.c */ +void ViaTunerStandard(ViaTunerPtr, int); +void ViaTunerBrightness(ViaTunerPtr, int); +void ViaTunerContrast(ViaTunerPtr, int); +void ViaTunerHue(ViaTunerPtr, int); +void ViaTunerLuminance(ViaTunerPtr, int); +void ViaTunerSaturation(ViaTunerPtr, int); +void ViaTunerInput(ViaTunerPtr, int); +#define MODE_TV 0 +#define MODE_SVIDEO 1 +#define MODE_COMPOSITE 2 + +void ViaTunerChannel(ViaTunerPtr, int, int); +void ViaAudioSelect(VIAPtr pVia, int tuner); +void ViaAudioInit(VIAPtr pVia); +void ViaAudioMode(VIAPtr pVia, int mode); +void ViaAudioMute(VIAPtr pVia, int mute); +void ViaTunerProbe(ScrnInfoPtr pScrn); +void ViaTunerDestroy(ScrnInfoPtr pScrn); + +/* In via_hwmc.c */ + +void ViaInitXVMC(ScreenPtr); +void ViaCleanupXVMC(ScreenPtr); + +#endif /* _VIA_DRIVER_H_ */ diff --git a/src/via_fs454.h b/src/via_fs454.h new file mode 100644 index 0000000..dd51042 --- /dev/null +++ b/src/via_fs454.h @@ -0,0 +1,161 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_fs454.h,v 1.2 2003/08/27 15:16:09 tsi Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef _VIA_FS454_H_ +#define _VIA_FS454_H_ 1 + +static const VIABIOSFS454TVMASKTableRec fs454MaskTable = { + { 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0, 0XFF, 0, 0, 0, 0, 0, 0, 0XFF, 0, 0XFF, 0, 0, 0XFF, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0, 0, 0, 0, 0, 0XFF, 0XFF, 0XFF, 0, 0, 0XFF, 0XFF, 0XFF, 0, 0, 0 }, + 0X3F, 0X18, 13, 22 +}; + +static const VIABIOSFS454TableRec fs454Table[] = { + { + { 0X1C, 0X48C4, 0X98C5, 0, 0X1, 0X100E, 0XF, 0X92, 0X393, 0XFA0, 0X2A1, 0X100E, 0X40F, 0X100E, 0XF, 0XFF9E, 0XFF9F, 0XA0, 0X3A1, 0X100C, 0X740D, 0X100E, 0X40F, 0X92, 0XB93, 0X3200, 0X1, 0X2A02, 0X3, 0, 0, 0 }, + { 0X70, 0X4F, 0X4F, 0X94, 0X5E, 0X88, 0X6F, 0XBA, 0, 0X40, 0, 0, 0, 0, 0, 0, 0X16, 0, 0XDF, 0, 0, 0XDF, 0X70, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0XF, 0X7F, 0X7F, 0XF, 0X9A, 0X23, 0X8F, 0XE5, 0X57, 0XDF, 0XDF, 0X57, 0X11, 0XA, 0XE7, 0X21, 0, 0, 0, 0, 0, 0X28, 0X50, 0, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XF, 0X7F, 0X7F, 0XF, 0X9A, 0X23, 0X8F, 0XE5, 0X57, 0XDF, 0XDF, 0X57, 0X11, 0XA, 0XE7, 0X21, 0, 0, 0, 0, 0, 0X50, 0XA0, 0X40, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XF, 0X7F, 0X7F, 0XF, 0X9A, 0X23, 0X8F, 0XE5, 0X57, 0XDF, 0XDF, 0X57, 0X11, 0XA, 0XE7, 0X21, 0, 0, 0, 0, 0, 0XA0, 0X40, 0X81, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X7, 0X2A02, 0XAF65, 0XAA66, 0XAA67, 0X9127, 0X9C2B, 0X272C, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X5065, 0X4B66, 0X4D67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X3, 0X811, 0XBE16, 0X8717, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + }, + { + { 0X1C, 0X4CC4, 0X98C5, 0, 0X1, 0X100E, 0XF, 0X92, 0X393, 0XFA0, 0X2A1, 0X100E, 0X40F, 0X100E, 0XF, 0XFF9E, 0XFF9F, 0XA0, 0X3A1, 0X100C, 0X740D, 0X100E, 0X40F, 0X92, 0XB93, 0, 0X1, 0X2302, 0X3, 0, 0, 0 }, + { 0X79, 0X63, 0X63, 0X9D, 0X68, 0X95, 0X5, 0XF1, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X9C, 0, 0X57, 0, 0, 0X57, 0X6, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0XEF, 0X1F, 0X1F, 0XEF, 0XDB, 0X33, 0X3F, 0XE7, 0X6, 0X57, 0X57, 0X6, 0X5A, 0X13, 0XAD, 0X5D, 0, 0, 0, 0, 0, 0X32, 0X64, 0, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XEF, 0X1F, 0X1F, 0XEF, 0XDB, 0X33, 0X3F, 0XE7, 0X6, 0X57, 0X57, 0X6, 0X5A, 0X13, 0XAD, 0X5D, 0, 0, 0, 0, 0, 0X64, 0XC8, 0X40, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XEF, 0X1F, 0X1F, 0XEF, 0XDB, 0X33, 0X3F, 0XE7, 0X6, 0X57, 0X57, 0X6, 0X5A, 0X13, 0XAD, 0X5D, 0, 0, 0, 0, 0, 0XC8, 0X90, 0X81, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X6, 0X2A02, 0X9365, 0X9066, 0X9067, 0X9127, 0X9C2B, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X4365, 0X4A66, 0X4967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X3, 0X811, 0X1216, 0X4917, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + }, + { + { 0X1C, 0X4EC4, 0X98C5, 0, 0X1, 0X100E, 0XF, 0X92, 0X393, 0XFA0, 0X2A1, 0X100E, 0X40F, 0X100E, 0XF, 0XFF9E, 0XFF9F, 0XA0, 0X3A1, 0X100C, 0X740D, 0X900E, 0X40F, 0X92, 0XB93, 0X1000, 0X1, 0X4602, 0X3, 0, 0, 0 }, + { 0X97, 0X7F, 0X7F, 0X9B, 0X85, 0XD, 0XE6, 0XF5, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X52, 0, 0XFF, 0, 0, 0XFF, 0XE7, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0X87, 0XFF, 0XFF, 0X87, 0X23, 0X34, 0X9, 0X38, 0XB0, 0XFF, 0XFF, 0XB0, 0X9A, 0X13, 0X14, 0X7A, 0, 0, 0, 0, 0, 0X40, 0X80, 0, 0, 0, 0X80, 0X20, 0X9C, 0, 0, 0 }, + { 0X87, 0XFF, 0XFF, 0X87, 0X23, 0X34, 0X9, 0X38, 0XB0, 0XFF, 0XFF, 0XB0, 0X9A, 0X13, 0X14, 0X7A, 0, 0, 0, 0, 0, 0X80, 0, 0X41, 0, 0, 0X80, 0X20, 0X9C, 0, 0, 0 }, + { 0X87, 0XFF, 0XFF, 0X87, 0X23, 0X34, 0X9, 0X38, 0XB0, 0XFF, 0XFF, 0XB0, 0X9A, 0X13, 0X14, 0X7A, 0, 0, 0, 0, 0, 0, 0, 0X86, 0, 0, 0X80, 0X20, 0X9C, 0, 0, 0 }, + { 0X6, 0X2A02, 0XC265, 0XBE66, 0XBE67, 0X9127, 0X9C2B, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X5865, 0X4B66, 0X4A67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X3, 0X811, 0X1816, 0X6117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + }, + { + { 0X1C, 0X4EC4, 0X98C5, 0, 0X1, 0X100E, 0XF, 0X92, 0X393, 0XFA0, 0X2A1, 0X100E, 0X40F, 0X100E, 0XF, 0XFF9E, 0XFF9F, 0XA0, 0X3A1, 0X100C, 0X740D, 0X100E, 0X40F, 0X92, 0XB93, 0X1000, 0X1, 0X4602, 0X3, 0, 0, 0 }, + { 0X91, 0X69, 0X69, 0X95, 0X6D, 0X1, 0X43, 0X3E, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XEF, 0, 0XDF, 0, 0, 0XDF, 0X44, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0XAF, 0X4F, 0X4F, 0XAF, 0XE3, 0X34, 0X67, 0XA4, 0X44, 0XDF, 0XDF, 0X44, 0X51, 0XA, 0XEF, 0X24, 0, 0, 0, 0, 0, 0X35, 0X6A, 0, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XAF, 0X4F, 0X4F, 0XAF, 0XE3, 0X34, 0X67, 0XA4, 0X44, 0XDF, 0XDF, 0X44, 0X51, 0XA, 0XEF, 0X24, 0, 0, 0, 0, 0, 0X6A, 0XD4, 0X40, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XAF, 0X4F, 0X4F, 0XAF, 0XE3, 0X34, 0X67, 0XA4, 0X44, 0XDF, 0XDF, 0X44, 0X51, 0XA, 0XEF, 0X24, 0, 0, 0, 0, 0, 0XD4, 0XA8, 0X81, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X6, 0X2A02, 0X9465, 0X9066, 0X9167, 0X9127, 0X9C2B, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X4465, 0X4566, 0X4567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X3, 0X811, 0X5B16, 0XA017, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + }, + { + { 0X1C, 0X4AC4, 0X98C5, 0, 0X1, 0X100E, 0XF, 0X92, 0X393, 0XFA0, 0X2A1, 0X100E, 0X40F, 0X100E, 0XF, 0XFF9E, 0XFF9F, 0XA0, 0X3A1, 0X100C, 0X740D, 0X100E, 0X40F, 0X92, 0XB93, 0X1D00, 0X1, 0X2A02, 0X3, 0, 0, 0 }, + { 0X70, 0X59, 0X59, 0X94, 0X66, 0X8A, 0X6F, 0XBA, 0, 0X40, 0, 0, 0, 0, 0, 0, 0X14, 0, 0XDF, 0, 0, 0XDF, 0X70, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0X47, 0XCF, 0XCF, 0X47, 0X9A, 0X23, 0XD9, 0XA, 0X57, 0XDF, 0XDF, 0X57, 0X51, 0XA, 0XFF, 0X3B, 0, 0, 0, 0, 0, 0X2D, 0X5A, 0, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X47, 0XCF, 0XCF, 0X47, 0X9A, 0X23, 0XD9, 0XA, 0X57, 0XDF, 0XDF, 0X57, 0X51, 0XA, 0XFF, 0X3B, 0, 0, 0, 0, 0, 0X5A, 0XB4, 0X40, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X47, 0XCF, 0XCF, 0X47, 0X9A, 0X23, 0XD9, 0XA, 0X57, 0XDF, 0XDF, 0X57, 0X51, 0XA, 0XFF, 0X3B, 0, 0, 0, 0, 0, 0XB4, 0X68, 0X81, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X6, 0X2A02, 0X9465, 0X9066, 0X9067, 0X9127, 0X9C2B, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X4265, 0X4966, 0X4867, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X3, 0X811, 0XC316, 0X4C17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + } +}; + +static const VIABIOSFS454TableRec fs454OverTable[] = { + { + { 0X1C, 0X40C4, 0X98C5, 0, 0X1, 0X100E, 0XF, 0X92, 0X393, 0XFA0, 0X2A1, 0X100E, 0X40F, 0X100E, 0XF, 0XFF9E, 0XFF9F, 0XA0, 0X3A1, 0X100C, 0X740D, 0X100E, 0X40F, 0X92, 0XB93, 0X8000, 0X1, 0X1802, 0X3, 0, 0, 0 }, + { 0X70, 0X4F, 0X4F, 0X94, 0X5C, 0X84, 0XB, 0X3E, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XEE, 0, 0XDF, 0, 0, 0XDF, 0XC, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0XCF, 0X7F, 0X7F, 0XCF, 0X92, 0X22, 0X87, 0XBC, 0X2F, 0XDF, 0XDF, 0X2F, 0X11, 0XA, 0XFF, 0X24, 0, 0, 0, 0, 0, 0X28, 0X50, 0, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XCF, 0X7F, 0X7F, 0XCF, 0X92, 0X22, 0X87, 0XBC, 0X2F, 0XDF, 0XDF, 0X2F, 0X11, 0XA, 0XFF, 0X24, 0, 0, 0, 0, 0, 0X50, 0XA0, 0X40, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XCF, 0X7F, 0X7F, 0XCF, 0X92, 0X22, 0X87, 0XBC, 0X2F, 0XDF, 0XDF, 0X2F, 0X11, 0XA, 0XFF, 0X24, 0, 0, 0, 0, 0, 0XA0, 0X40, 0X81, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X4, 0X2A02, 0XAD65, 0XA966, 0XA967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X4F65, 0X4966, 0X4967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X3, 0X811, 0XF416, 0X9F17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + }, + { + { 0X1C, 0X44C4, 0X98C5, 0, 0X1, 0X100E, 0XF, 0X92, 0X393, 0XFA0, 0X2A1, 0X100E, 0X40F, 0X100E, 0XF, 0XFF9E, 0XFF9F, 0XA0, 0X3A1, 0X100C, 0X740D, 0X100E, 0X40F, 0X92, 0XB93, 0X6000, 0X1, 0X1D02, 0X3, 0, 0, 0 }, + { 0X79, 0X63, 0X63, 0X9D, 0X6D, 0X95, 0X88, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X58, 0, 0X57, 0, 0, 0X57, 0X89, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0X37, 0X1F, 0X1F, 0X37, 0XE3, 0X34, 0X4A, 0X8B, 0X98, 0X57, 0X57, 0X98, 0X52, 0X12, 0X59, 0X48, 0, 0, 0, 0, 0, 0X32, 0X64, 0, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X37, 0X1F, 0X1F, 0X37, 0XE3, 0X34, 0X4A, 0X8B, 0X98, 0X57, 0X57, 0X98, 0X52, 0X12, 0X59, 0X48, 0, 0, 0, 0, 0, 0X64, 0XC8, 0X40, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X37, 0X1F, 0X1F, 0X37, 0XE3, 0X34, 0X4A, 0X8B, 0X98, 0X57, 0X57, 0X98, 0X52, 0X12, 0X59, 0X48, 0, 0, 0, 0, 0, 0XC8, 0X90, 0X81, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X4, 0X2A02, 0X9365, 0X9066, 0X9067, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X4265, 0X4566, 0X4567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X3, 0X811, 0X1416, 0XC717, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + }, + { + { 0X1C, 0X46C4, 0X98C5, 0, 0X1, 0X100E, 0XF, 0X92, 0X393, 0XFA0, 0X2A1, 0X100E, 0X40F, 0X100E, 0XF, 0XFF9E, 0XFF9F, 0XA0, 0X3A1, 0X100C, 0X740D, 0X900E, 0X40F, 0X92, 0XB93, 0X2300, 0X1, 0X2502, 0X3, 0, 0, 0 }, + { 0X97, 0X7F, 0X7F, 0X9B, 0X89, 0X11, 0X37, 0XF5, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X3, 0, 0XFF, 0, 0, 0XFF, 0X38, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0X80, 0X16, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0XAF, 0XFF, 0XFF, 0XAF, 0X23, 0X34, 0XC, 0X49, 0X47, 0XFF, 0XFF, 0X47, 0X9A, 0X13, 0X4, 0X7A, 0, 0, 0, 0, 0, 0X40, 0X80, 0, 0, 0, 0X80, 0X20, 0X9C, 0, 0, 0 }, + { 0XAF, 0XFF, 0XFF, 0XAF, 0X23, 0X34, 0XC, 0X49, 0X47, 0XFF, 0XFF, 0X47, 0X9A, 0X13, 0X4, 0X7A, 0, 0, 0, 0, 0, 0X80, 0, 0X41, 0, 0, 0X80, 0X20, 0X9C, 0, 0, 0 }, + { 0XAF, 0XFF, 0XFF, 0XAF, 0X23, 0X34, 0XC, 0X49, 0X47, 0XFF, 0XFF, 0X47, 0X9A, 0X13, 0X4, 0X7A, 0, 0, 0, 0, 0, 0, 0, 0X86, 0, 0, 0X80, 0X20, 0X9C, 0, 0, 0 }, + { 0X4, 0X2A02, 0XC265, 0XBE66, 0XBE67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X5765, 0X4566, 0X4567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X3, 0X811, 0X6316, 0X3D17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + }, + { + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + }, + { + { 0X1C, 0X42C4, 0X98C5, 0, 0X1, 0X100E, 0XF, 0X92, 0X393, 0XFA0, 0X2A1, 0X100E, 0X40F, 0X100E, 0XF, 0XFF9E, 0XFF9F, 0XA0, 0X3A1, 0X100C, 0X740D, 0X100E, 0X40F, 0X92, 0XB93, 0X5000, 0X1, 0X1802, 0X3, 0, 0, 0 }, + { 0X70, 0X59, 0X59, 0X94, 0X62, 0X8C, 0XB, 0X3E, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XE8, 0, 0XDF, 0, 0, 0XDF, 0XC, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0X1F, 0XCF, 0XCF, 0X1F, 0X9A, 0X23, 0XD6, 0XF6, 0XC, 0XDF, 0XDF, 0XC, 0X11, 0XA, 0XE1, 0X28, 0, 0, 0, 0, 0, 0X2D, 0X5A, 0, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X1F, 0XCF, 0XCF, 0X1F, 0X9A, 0X23, 0XD6, 0XF6, 0XC, 0XDF, 0XDF, 0XC, 0X11, 0XA, 0XE1, 0X28, 0, 0, 0, 0, 0, 0X5A, 0XB4, 0X40, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X1F, 0XCF, 0XCF, 0X1F, 0X9A, 0X23, 0XD6, 0XF6, 0XC, 0XDF, 0XDF, 0XC, 0X11, 0XA, 0XE1, 0X28, 0, 0, 0, 0, 0, 0XB4, 0X68, 0X81, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X4, 0X2A02, 0XAB65, 0XA766, 0XA767, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X4D65, 0X4966, 0X4967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X3, 0X811, 0X1E16, 0X5C17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + } +}; + +#endif /* _VIA_FS454_H_ */ diff --git a/src/via_gpioi2c.c b/src/via_gpioi2c.c new file mode 100644 index 0000000..d91f7b1 --- /dev/null +++ b/src/via_gpioi2c.c @@ -0,0 +1,490 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_gpioi2c.c,v 1.3 2003/11/03 05:11:46 tsi Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "via_driver.h" +#include "via_gpioi2c.h" + +static void delayIn_usec(int usec); +static void HWGPIOI2C_SetSCL(VIABIOSInfoPtr pBIOSInfo, CARD8 flag); +static void HWGPIOI2C_SetSDA(VIABIOSInfoPtr pBIOSInfo, CARD8 flag); +static CARD8 HWGPIOI2C_GetSDA(VIABIOSInfoPtr pBIOSInfo); +static void GPIOI2C_START(VIABIOSInfoPtr pBIOSInfo); +static void GPIOI2C_STOP(VIABIOSInfoPtr pBIOSInfo); +static Bool GPIOI2C_ACKNOWLEDGE(VIABIOSInfoPtr pBIOSInfo); +static Bool GPIOI2C_SENDACKNOWLEDGE(VIABIOSInfoPtr pBIOSInfo); +static Bool GPIOI2C_SENDNACKNOWLEDGE(VIABIOSInfoPtr pBIOSInfo); +static Bool GPIOI2C_ReadBit(VIABIOSInfoPtr pBIOSInfo, int *psda, int timeout); +static CARD8 GPIOI2C_ReadData(VIABIOSInfoPtr pBIOSInfo); +static Bool GPIOI2C_WriteBit(VIABIOSInfoPtr pBIOSInfo, int sda, int timeout); +static Bool GPIOI2C_WriteData(VIABIOSInfoPtr pBIOSInfo, CARD8 Data); +static void I2C_RW_Control(VIABIOSInfoPtr pBIOSInfo, CARD8 Command, CARD8 Data); + +/* I2C Functions */ + +Bool VIAGPIOI2C_Initial(VIABIOSInfoPtr pBIOSInfo, CARD8 SlaveDevice) +{ + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "GPIOI2C_Initial\n")); + switch (pBIOSInfo->Chipset) + { + case VIA_KM400: + case VIA_K8M800: + GPIOPORT = 0x2C; + break; + default: + GPIOPORT = 0; + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, + "GPIOI2C initial failure!\n")); + return FALSE; + } +/* + switch (pBIOSInfo->TVEncoder) + { + case VIA_VT1623: + break; + default: + SLAVEADDR = 0; + return FALSE; + } +*/ + if (SlaveDevice == 0xA0 || SlaveDevice == 0xA2) { + I2C_WAIT_TIME = 40; + STARTTIMEOUT = 550; + BYTETIMEOUT = 2200; + HOLDTIME = 5; + BITTIMEOUT = 5; + } + else { + I2C_WAIT_TIME = 5; + STARTTIMEOUT = 5; + BYTETIMEOUT = 5; + HOLDTIME = 5; + BITTIMEOUT = 5; + } + + SLAVEADDR = SlaveDevice; + + return TRUE; +} + +/* I2C R/W Control */ +static void I2C_RW_Control(VIABIOSInfoPtr pBIOSInfo, CARD8 Command, CARD8 Data) +{ + VIABIOSInfoPtr pVia = pBIOSInfo; + CARD8 value; + + switch(Command) { + case I2C_RELEASE: + VGAOUT8(0x3c4, GPIOPORT); + value = VGAIN8(0x3c5) & (CARD8)(~GPIOI2C_MASKD); + VGAOUT8(0x3c5, value); + break; + case I2C_WRITE_SCL: + VGAOUT8(0x3c4, GPIOPORT); + value = VGAIN8(0x3c5) & (CARD8)(~GPIOI2C_SCL_MASK); + value |= GPIOI2C_SCL_WRITE; + if (Data) { + VGAOUT8(0x3c5, (value | I2C_OUTPUT_CLOCK)); + } + else { + VGAOUT8(0x3c5, (value & (CARD8)(~I2C_OUTPUT_CLOCK))); + } + break; + case I2C_READ_SCL: + VGAOUT8(0x3c4, GPIOPORT); + value = VGAIN8(0x3c5) & (CARD8)(~GPIOI2C_SCL_MASK); + VGAOUT8(0x3c5, (value | GPIOI2C_SCL_READ)); + break; + case I2C_WRITE_SDA: + VGAOUT8(0x3c4, GPIOPORT); + value = VGAIN8(0x3c5) & (CARD8)(~GPIOI2C_SDA_MASK); + value |= GPIOI2C_SDA_WRITE; + if (Data) { + VGAOUT8(0x3c5, (value | I2C_OUTPUT_DATA)); + } + else { + VGAOUT8(0x3c5, (value & (CARD8)(~I2C_OUTPUT_DATA))); + } + break; + case I2C_READ_SDA: + VGAOUT8(0x3c4, GPIOPORT); + value = VGAIN8(0x3c5) & (CARD8)(~GPIOI2C_SDA_MASK); + VGAOUT8(0x3c5, (value | GPIOI2C_SCL_READ)); + break; + default: + break; + } +} + +static void delayIn_usec(int usec) +{ + long b_secs, b_usecs; + long a_secs, a_usecs; + long d_secs, d_usecs; + long diff; + + if (usec > 0) { + xf86getsecs(&b_secs, &b_usecs); + do { + /* It would be nice to use {xf86}usleep, + * but usleep (1) takes >10000 usec ! + */ + xf86getsecs(&a_secs, &a_usecs); + d_secs = (a_secs - b_secs); + d_usecs = (a_usecs - b_usecs); + diff = d_secs*1000000 + d_usecs; + } while (diff>0 && diff< (usec + 1)); + } +} + +/* Set SCL */ +static void HWGPIOI2C_SetSCL(VIABIOSInfoPtr pBIOSInfo, CARD8 flag) +{ + I2C_RW_Control(pBIOSInfo, I2C_WRITE_SCL, flag); + if (flag) delayIn_usec(I2C_WAIT_TIME); + delayIn_usec(I2C_WAIT_TIME); +} + +/* Set SDA */ +static void HWGPIOI2C_SetSDA(VIABIOSInfoPtr pBIOSInfo, CARD8 flag) +{ + I2C_RW_Control(pBIOSInfo, I2C_WRITE_SDA, flag); + delayIn_usec(I2C_WAIT_TIME); +} + +/* Get SDA */ +static CARD8 HWGPIOI2C_GetSDA(VIABIOSInfoPtr pBIOSInfo) +{ + VIABIOSInfoPtr pVia = pBIOSInfo; + CARD8 value; + + VGAOUT8(0x3c4, GPIOPORT); + value = VGAIN8(0x3c5); + if (value & I2C_INPUT_DATA) + return 1; + else + return 0; +} + +/* START Condition */ +static void GPIOI2C_START(VIABIOSInfoPtr pBIOSInfo) +{ + HWGPIOI2C_SetSDA(pBIOSInfo, 1); + HWGPIOI2C_SetSCL(pBIOSInfo, 1); + delayIn_usec(STARTTIMEOUT); + HWGPIOI2C_SetSDA(pBIOSInfo, 0); + HWGPIOI2C_SetSCL(pBIOSInfo, 0); +} + +/* STOP Condition */ +static void GPIOI2C_STOP(VIABIOSInfoPtr pBIOSInfo) +{ + HWGPIOI2C_SetSDA(pBIOSInfo, 0); + HWGPIOI2C_SetSCL(pBIOSInfo, 1); + HWGPIOI2C_SetSDA(pBIOSInfo, 1); + I2C_RW_Control(pBIOSInfo, I2C_RELEASE, 0); + /* to make the differentiation of next START condition */ + delayIn_usec(I2C_WAIT_TIME); +} + +/* Check ACK */ +static Bool GPIOI2C_ACKNOWLEDGE(VIABIOSInfoPtr pBIOSInfo) +{ + CARD8 Status; + + I2C_RW_Control(pBIOSInfo, I2C_READ_SDA, 0); + delayIn_usec(I2C_WAIT_TIME); + HWGPIOI2C_SetSCL(pBIOSInfo, 1); + Status = HWGPIOI2C_GetSDA(pBIOSInfo); + I2C_RW_Control(pBIOSInfo, I2C_WRITE_SDA, Status); + HWGPIOI2C_SetSCL(pBIOSInfo, 0); + delayIn_usec(I2C_WAIT_TIME); + + if(Status) return FALSE; + else return TRUE; +} + +/* Send ACK */ +static Bool GPIOI2C_SENDACKNOWLEDGE(VIABIOSInfoPtr pBIOSInfo) +{ + HWGPIOI2C_SetSDA(pBIOSInfo, 0); + HWGPIOI2C_SetSCL(pBIOSInfo, 1); + HWGPIOI2C_SetSCL(pBIOSInfo, 0); + delayIn_usec(I2C_WAIT_TIME); + + return TRUE; +} + +/* Send NACK */ +static Bool GPIOI2C_SENDNACKNOWLEDGE(VIABIOSInfoPtr pBIOSInfo) +{ + HWGPIOI2C_SetSDA(pBIOSInfo, 1); + HWGPIOI2C_SetSCL(pBIOSInfo, 1); + HWGPIOI2C_SetSCL(pBIOSInfo, 0); + delayIn_usec(I2C_WAIT_TIME); + + return TRUE; +} + +/* Write Data(Bit by Bit) to I2C */ +static Bool GPIOI2C_WriteData(VIABIOSInfoPtr pBIOSInfo, CARD8 Data) +{ + int i; + + if (!GPIOI2C_WriteBit(pBIOSInfo, (Data >> 7) & 1, BYTETIMEOUT)) + return FALSE; + + for (i = 6; i >= 0; i--) + if (!GPIOI2C_WriteBit(pBIOSInfo, (Data >> i) & 1, BITTIMEOUT)) + return FALSE; + + return GPIOI2C_ACKNOWLEDGE(pBIOSInfo); +} + +static Bool GPIOI2C_WriteBit(VIABIOSInfoPtr pBIOSInfo, int sda, int timeout) +{ + Bool ret = TRUE; + + HWGPIOI2C_SetSDA(pBIOSInfo, sda); + delayIn_usec(I2C_WAIT_TIME/5); + HWGPIOI2C_SetSCL(pBIOSInfo, 1); + delayIn_usec(HOLDTIME); + delayIn_usec(timeout); + HWGPIOI2C_SetSCL(pBIOSInfo, 0); + delayIn_usec(I2C_WAIT_TIME/5); + + return ret; +} + +static Bool GPIOI2C_ReadBit(VIABIOSInfoPtr pBIOSInfo, int *psda, int timeout) +{ + Bool ret = TRUE; + + I2C_RW_Control(pBIOSInfo, I2C_READ_SDA, 0); + delayIn_usec(I2C_WAIT_TIME/5); + HWGPIOI2C_SetSCL(pBIOSInfo, 1); + delayIn_usec(HOLDTIME); + delayIn_usec(timeout); + *psda = HWGPIOI2C_GetSDA(pBIOSInfo); + HWGPIOI2C_SetSCL(pBIOSInfo, 0); + delayIn_usec(I2C_WAIT_TIME/5); + + return ret; +} + +/* Read Data(Bit by Bit) from I2C */ +static CARD8 GPIOI2C_ReadData(VIABIOSInfoPtr pBIOSInfo) +{ + int i, sda; + CARD8 data; + + if(!GPIOI2C_ReadBit(pBIOSInfo, &sda, BYTETIMEOUT)) + return 0; + + data = (sda > 0) << 7; + for (i = 6; i >= 0; i--) + if (!GPIOI2C_ReadBit(pBIOSInfo, &sda, BITTIMEOUT)) + return 0; + else + data |= (sda > 0) << i; + + return data; +} + +/* Write Data(one Byte) to Desired Device on I2C */ +Bool VIAGPIOI2C_Write(VIABIOSInfoPtr pBIOSInfo, int SubAddress, CARD8 Data) +{ + int Retry; + Bool Done = FALSE; + + for(Retry = 1; Retry <= WRITE_MAX_RETRIES; Retry++) + { + GPIOI2C_START(pBIOSInfo); + + if(!GPIOI2C_WriteData(pBIOSInfo, SLAVEADDR)) { + + GPIOI2C_STOP(pBIOSInfo); + continue; + } + + if(SubAddress & 0xF00) { /* write 12-bit sub address */ + if(!GPIOI2C_WriteData(pBIOSInfo, (CARD8)((SubAddress/0x100)&0x0F))) { + + GPIOI2C_STOP(pBIOSInfo); + continue; + } + if(!GPIOI2C_WriteData(pBIOSInfo, (CARD8)(SubAddress%0x100))) { + + GPIOI2C_STOP(pBIOSInfo); + continue; + } + } else { /* write 8-bit sub address */ + if(!GPIOI2C_WriteData(pBIOSInfo, (CARD8)(SubAddress))) { + + GPIOI2C_STOP(pBIOSInfo); + continue; + } + } + + if(!GPIOI2C_WriteData(pBIOSInfo, Data)) { + + GPIOI2C_STOP(pBIOSInfo); + continue; + } + Done = TRUE; + break; + } + + GPIOI2C_STOP(pBIOSInfo); + + return Done; +} + +/* Read Data from Desired Device on I2C */ +Bool VIAGPIOI2C_Read(VIABIOSInfoPtr pBIOSInfo, int SubAddress, CARD8 *Buffer, int BufferLen) +{ + int i, Retry; + + for(Retry = 1; Retry <= READ_MAX_RETRIES; Retry++) + { + GPIOI2C_START(pBIOSInfo); + if(!GPIOI2C_WriteData(pBIOSInfo, SLAVEADDR&0xFE)) { + + GPIOI2C_STOP(pBIOSInfo); + continue; + } + + if(SubAddress & 0xF00) { /* write 12-bit sub address */ + if(!GPIOI2C_WriteData(pBIOSInfo, (CARD8)((SubAddress/0x100)&0x0F))) { + + GPIOI2C_STOP(pBIOSInfo); + continue; + } + if(!GPIOI2C_WriteData(pBIOSInfo, (CARD8)(SubAddress%0x100))) { + + GPIOI2C_STOP(pBIOSInfo); + continue; + } + } else { /* write 8-bit sub address */ + if(!GPIOI2C_WriteData(pBIOSInfo, (CARD8)(SubAddress))) { + + GPIOI2C_STOP(pBIOSInfo); + continue; + } + } + + break; + } + + if (Retry > READ_MAX_RETRIES) return FALSE; + + for(Retry = 1; Retry <= READ_MAX_RETRIES; Retry++) + { + GPIOI2C_START(pBIOSInfo); + if(!GPIOI2C_WriteData(pBIOSInfo, SLAVEADDR | 0x01)) { + + GPIOI2C_STOP(pBIOSInfo); + continue; + } + for(i = 0; i < BufferLen; i++) { + + *Buffer = GPIOI2C_ReadData(pBIOSInfo); + Buffer ++; + if(BufferLen == 1) + /*GPIOI2C_SENDACKNOWLEDGE(pBIOSInfo);*/ /* send ACK for normal operation */ + GPIOI2C_SENDNACKNOWLEDGE(pBIOSInfo); /* send NACK for VT3191/VT3192 only */ + else if(i < BufferLen - 1) + GPIOI2C_SENDACKNOWLEDGE(pBIOSInfo); /* send ACK */ + else + GPIOI2C_SENDNACKNOWLEDGE(pBIOSInfo); /* send NACK */ + } + GPIOI2C_STOP(pBIOSInfo); + break; + } + + if (Retry > READ_MAX_RETRIES) + return FALSE; + else + return TRUE; +} + +/* Read Data(one Byte) from Desired Device on I2C */ +Bool VIAGPIOI2C_ReadByte(VIABIOSInfoPtr pBIOSInfo, int SubAddress, CARD8 *Buffer) +{ + int Retry; + + for(Retry = 1; Retry <= READ_MAX_RETRIES; Retry++) + { + GPIOI2C_START(pBIOSInfo); + if(!GPIOI2C_WriteData(pBIOSInfo, SLAVEADDR & 0xFE)) { + + GPIOI2C_STOP(pBIOSInfo); + continue; + } + + if(SubAddress & 0xF00) { /* write 12-bit sub address */ + if(!GPIOI2C_WriteData(pBIOSInfo, (CARD8)((SubAddress/0x100)&0x0F))) { + + GPIOI2C_STOP(pBIOSInfo); + continue; + } + if(!GPIOI2C_WriteData(pBIOSInfo, (CARD8)(SubAddress%0x100))) { + + GPIOI2C_STOP(pBIOSInfo); + continue; + } + } else { /* write 8-bit sub address */ + if(!GPIOI2C_WriteData(pBIOSInfo, (CARD8)(SubAddress))) { + + GPIOI2C_STOP(pBIOSInfo); + continue; + } + } + + break; + } + + if (Retry > READ_MAX_RETRIES) return FALSE; + + for(Retry = 1; Retry <= READ_MAX_RETRIES; Retry++) { + + GPIOI2C_START(pBIOSInfo); + + if(!GPIOI2C_WriteData(pBIOSInfo, SLAVEADDR | 0x01)) { + + GPIOI2C_STOP(pBIOSInfo); + continue; + } + + *Buffer = GPIOI2C_ReadData(pBIOSInfo); + + GPIOI2C_STOP(pBIOSInfo); + break; + } + + if (Retry > READ_MAX_RETRIES) + return FALSE; + else + return TRUE; +} diff --git a/src/via_gpioi2c.h b/src/via_gpioi2c.h new file mode 100644 index 0000000..08f7cd6 --- /dev/null +++ b/src/via_gpioi2c.h @@ -0,0 +1,61 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_gpioi2c.h,v 1.2 2003/08/27 15:16:09 tsi Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef _VIA_GPIOI2C_H_ +#define _VIA_GPIOI2C_H_ 1 + +#define GPIOPORT (pBIOSInfo->GPIOI2CInfo.bGPIOPort) +#define SLAVEADDR (pBIOSInfo->GPIOI2CInfo.bSlaveAddr) +#define I2C_WAIT_TIME (pBIOSInfo->GPIOI2CInfo.I2C_WAIT_TIME) +#define STARTTIMEOUT (pBIOSInfo->GPIOI2CInfo.STARTTIMEOUT) +#define BYTETIMEOUT (pBIOSInfo->GPIOI2CInfo.BYTETIMEOUT) +#define HOLDTIME (pBIOSInfo->GPIOI2CInfo.HOLDTIME) +#define BITTIMEOUT (pBIOSInfo->GPIOI2CInfo.BITTIMEOUT) + +#define GPIOI2C_MASKD 0xC0 +#define GPIOI2C_SCL_MASK 0x80 +#define GPIOI2C_SCL_WRITE 0x80 +#define GPIOI2C_SCL_READ 0x80 +#define GPIOI2C_SDA_MASK 0x40 +#define GPIOI2C_SDA_WRITE 0x40 +#define GPIOI2C_SDA_READ 0x00 + +#define I2C_RELEASE 0x00 +#define I2C_WRITE_SCL 0x01 +#define I2C_READ_SCL 0x02 +#define I2C_WRITE_SDA 0x03 +#define I2C_READ_SDA 0x04 + +#define I2C_SDA_SCL_MASK 0x30 +#define I2C_SDA_SCL 0x30 +#define I2C_OUTPUT_CLOCK 0x20 +#define I2C_OUTPUT_DATA 0x10 +#define I2C_INPUT_CLOCK 0x08 +#define I2C_INPUT_DATA 0x04 + +#define READ_MAX_RETRIES 20 +#define WRITE_MAX_RETRIES 20 + +#endif /* _VIA_GPIOI2C_H_ */ diff --git a/src/via_hwdiff.c b/src/via_hwdiff.c new file mode 100644 index 0000000..70f4ec5 --- /dev/null +++ b/src/via_hwdiff.c @@ -0,0 +1,128 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_hwdiff.c,v 1.2 2003/08/27 15:16:09 tsi Exp $ */ +/************************************************************************* + * + * HWDiff.c + * + * Implement all Video Function for the Driver + * + * DATE 04/07/2003 + * + *************************************************************************/ + +#include "via_driver.h" + +void VIAvfInitHWDiff(VIAPtr pVia) +{ + switch(pVia->ChipId) + { + case PCI_CHIP_VT3204: + /* + * HW Difference Flag + */ + pVia->ViaHW.dwThreeHQVBuffer = VID_HWDIFF_TRUE; + pVia->ViaHW.dwV3SrcHeightSetting = VID_HWDIFF_TRUE; + pVia->ViaHW.dwSupportExtendFIFO = VID_HWDIFF_FALSE; + pVia->ViaHW.dwHQVFetchByteUnit = VID_HWDIFF_TRUE; + pVia->ViaHW.dwHQVInitPatch = VID_HWDIFF_FALSE; + pVia->ViaHW.dwSupportV3Gamma=VID_HWDIFF_TRUE; + pVia->ViaHW.dwUpdFlip = VID_HWDIFF_TRUE; + pVia->ViaHW.dwHQVDisablePatch = VID_HWDIFF_TRUE; + pVia->ViaHW.dwSUBFlip = VID_HWDIFF_TRUE; + pVia->ViaHW.dwNeedV3Prefetch = VID_HWDIFF_TRUE; + pVia->ViaHW.dwNeedV4Prefetch = VID_HWDIFF_TRUE; + pVia->ViaHW.dwUseSystemMemory = VID_HWDIFF_FALSE; + pVia->ViaHW.dwExpandVerPatch = VID_HWDIFF_TRUE; + pVia->ViaHW.dwExpandVerHorPatch = VID_HWDIFF_FALSE; + pVia->ViaHW.dwV3ExpireNumTune = VID_HWDIFF_TRUE; + pVia->ViaHW.dwV3FIFOThresholdTune = VID_HWDIFF_TRUE; + pVia->ViaHW.dwCheckHQVFIFOEmpty = VID_HWDIFF_TRUE; + pVia->ViaHW.dwUseMPEGAGP = VID_HWDIFF_TRUE; + pVia->ViaHW.dwV3FIFOPatch = VID_HWDIFF_FALSE; + pVia->ViaHW.dwSupportTwoColorKey = VID_HWDIFF_FALSE; + break; + case PCI_CHIP_VT3205: + /* + * HW Difference Flag + */ + pVia->ViaHW.dwThreeHQVBuffer = VID_HWDIFF_TRUE; + pVia->ViaHW.dwV3SrcHeightSetting = VID_HWDIFF_TRUE; + pVia->ViaHW.dwSupportExtendFIFO = VID_HWDIFF_FALSE; + pVia->ViaHW.dwHQVFetchByteUnit = VID_HWDIFF_TRUE; + pVia->ViaHW.dwHQVInitPatch = VID_HWDIFF_FALSE; + pVia->ViaHW.dwSupportV3Gamma=VID_HWDIFF_FALSE; + pVia->ViaHW.dwUpdFlip = VID_HWDIFF_TRUE; + pVia->ViaHW.dwHQVDisablePatch = VID_HWDIFF_TRUE; + pVia->ViaHW.dwSUBFlip = VID_HWDIFF_TRUE; + pVia->ViaHW.dwNeedV3Prefetch = VID_HWDIFF_FALSE; + pVia->ViaHW.dwNeedV4Prefetch = VID_HWDIFF_FALSE; + pVia->ViaHW.dwUseSystemMemory = VID_HWDIFF_TRUE; + pVia->ViaHW.dwExpandVerPatch = VID_HWDIFF_TRUE; + pVia->ViaHW.dwExpandVerHorPatch = VID_HWDIFF_TRUE; + pVia->ViaHW.dwV3ExpireNumTune = VID_HWDIFF_TRUE; + pVia->ViaHW.dwV3FIFOThresholdTune = VID_HWDIFF_TRUE; + pVia->ViaHW.dwCheckHQVFIFOEmpty = VID_HWDIFF_FALSE; + pVia->ViaHW.dwUseMPEGAGP = VID_HWDIFF_TRUE; + pVia->ViaHW.dwV3FIFOPatch = VID_HWDIFF_FALSE; + pVia->ViaHW.dwSupportTwoColorKey = VID_HWDIFF_FALSE; + break; + case PCI_CHIP_CLE3022: + case PCI_CHIP_CLE3122: + switch (pVia->ChipRev) + { + case VIA_REVISION_CLEC0: + case VIA_REVISION_CLEC1: + /* + * HW Difference Flag + */ + pVia->ViaHW.dwThreeHQVBuffer = VID_HWDIFF_TRUE; + pVia->ViaHW.dwV3SrcHeightSetting = VID_HWDIFF_TRUE; + pVia->ViaHW.dwSupportExtendFIFO = VID_HWDIFF_FALSE; + pVia->ViaHW.dwHQVFetchByteUnit = VID_HWDIFF_TRUE; + pVia->ViaHW.dwHQVInitPatch = VID_HWDIFF_FALSE; + pVia->ViaHW.dwSupportV3Gamma=VID_HWDIFF_FALSE; + pVia->ViaHW.dwUpdFlip = VID_HWDIFF_TRUE; + pVia->ViaHW.dwHQVDisablePatch = VID_HWDIFF_TRUE; + pVia->ViaHW.dwSUBFlip = VID_HWDIFF_TRUE; + pVia->ViaHW.dwNeedV3Prefetch = VID_HWDIFF_FALSE; + pVia->ViaHW.dwNeedV4Prefetch = VID_HWDIFF_FALSE; + pVia->ViaHW.dwUseSystemMemory = VID_HWDIFF_FALSE; + pVia->ViaHW.dwExpandVerPatch = VID_HWDIFF_TRUE; + pVia->ViaHW.dwExpandVerHorPatch = VID_HWDIFF_TRUE; + pVia->ViaHW.dwV3ExpireNumTune = VID_HWDIFF_FALSE; + pVia->ViaHW.dwV3FIFOThresholdTune = VID_HWDIFF_FALSE; + pVia->ViaHW.dwCheckHQVFIFOEmpty = VID_HWDIFF_TRUE; + pVia->ViaHW.dwUseMPEGAGP = VID_HWDIFF_FALSE; + pVia->ViaHW.dwV3FIFOPatch = VID_HWDIFF_TRUE; + pVia->ViaHW.dwSupportTwoColorKey = VID_HWDIFF_TRUE; + /*pVia->ViaHW.dwCxColorSpace = VID_HWDIFF_TRUE;*/ + break; + default: + /* + * HW Difference Flag + */ + pVia->ViaHW.dwThreeHQVBuffer = VID_HWDIFF_FALSE; + pVia->ViaHW.dwV3SrcHeightSetting = VID_HWDIFF_FALSE; + pVia->ViaHW.dwSupportExtendFIFO = VID_HWDIFF_TRUE; + pVia->ViaHW.dwHQVFetchByteUnit = VID_HWDIFF_FALSE; + pVia->ViaHW.dwHQVInitPatch = VID_HWDIFF_TRUE; + pVia->ViaHW.dwSupportV3Gamma=VID_HWDIFF_FALSE; + pVia->ViaHW.dwUpdFlip = VID_HWDIFF_FALSE; + pVia->ViaHW.dwHQVDisablePatch = VID_HWDIFF_FALSE; + pVia->ViaHW.dwSUBFlip = VID_HWDIFF_FALSE; + pVia->ViaHW.dwNeedV3Prefetch = VID_HWDIFF_FALSE; + pVia->ViaHW.dwNeedV4Prefetch = VID_HWDIFF_FALSE; + pVia->ViaHW.dwUseSystemMemory = VID_HWDIFF_FALSE; + pVia->ViaHW.dwExpandVerPatch = VID_HWDIFF_TRUE; + pVia->ViaHW.dwExpandVerHorPatch = VID_HWDIFF_TRUE; + pVia->ViaHW.dwV3ExpireNumTune = VID_HWDIFF_FALSE; + pVia->ViaHW.dwV3FIFOThresholdTune = VID_HWDIFF_FALSE; + pVia->ViaHW.dwCheckHQVFIFOEmpty = VID_HWDIFF_FALSE; + pVia->ViaHW.dwUseMPEGAGP = VID_HWDIFF_FALSE; + pVia->ViaHW.dwV3FIFOPatch = VID_HWDIFF_TRUE; + pVia->ViaHW.dwSupportTwoColorKey = VID_HWDIFF_FALSE; + pVia->ViaHW.dwCxColorSpace = VID_HWDIFF_FALSE; + break; + }/*CLEC0 Switch*/ + break; + } +} diff --git a/src/via_i2c.c b/src/via_i2c.c new file mode 100644 index 0000000..e873810 --- /dev/null +++ b/src/via_i2c.c @@ -0,0 +1,414 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_i2c.c,v 1.4 2003/12/31 05:42:05 dawes Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + + +#include "xf86.h" +#include "xf86_OSproc.h" +#include "xf86_ansic.h" +#include "compiler.h" + +#include "xf86Pci.h" +#include "xf86PciInfo.h" + +#include "vgaHW.h" + +#include "via_driver.h" + +/* + * DDC2 support requires DDC_SDA_MASK and DDC_SCL_MASK + */ +#define DDC_SDA_READ_MASK (1 << 2) +#define DDC_SCL_READ_MASK (1 << 3) +#define DDC_SDA_WRITE_MASK (1 << 4) +#define DDC_SCL_WRITE_MASK (1 << 5) + +/* I2C Function for DDC2 */ +static void +VIAI2C1PutBits(I2CBusPtr b, int clock, int data) +{ + CARD8 reg; + + outb(0x3c4, 0x26); + reg = inb(0x3c5); + reg &= 0xF0; + reg |= 0x01; /* Enable DDC */ + + if (clock) + reg |= DDC_SCL_WRITE_MASK; + else + reg &= ~DDC_SCL_WRITE_MASK; + + if (data) + reg |= DDC_SDA_WRITE_MASK; + else + reg &= ~DDC_SDA_WRITE_MASK; + + outb(0x3c4, 0x26); + outb(0x3c5, reg); +} + +static void +VIAI2C1GetBits(I2CBusPtr b, int *clock, int *data) +{ + CARD8 reg; + + outb(0x3c4, 0x26); + reg = inb(0x3c5); + + *clock = (reg & DDC_SCL_READ_MASK) != 0; + *data = (reg & DDC_SDA_READ_MASK) != 0; +} + +/* Function for DVI DDC2. Also used for the tuner and TV IC's */ + +static void +VIAI2C2PutBits(I2CBusPtr b, int clock, int data) +{ + CARD8 reg; + + outb(0x3c4, 0x31); + reg = inb(0x3c5); + reg &= 0xF0; + reg |= 0x01; /* Enable DDC */ + + if (clock) + reg |= DDC_SCL_WRITE_MASK; + else + reg &= ~DDC_SCL_WRITE_MASK; + + if (data) + reg |= DDC_SDA_WRITE_MASK; + else + reg &= ~DDC_SDA_WRITE_MASK; + + outb(0x3c4, 0x31); + outb(0x3c5, reg); +} + +static void +VIAI2C2GetBits(I2CBusPtr b, int *clock, int *data) +{ + CARD8 reg; + + outb(0x3c4, 0x31); + reg = inb(0x3c5); + + *clock = (reg & DDC_SCL_READ_MASK) != 0; + *data = (reg & DDC_SDA_READ_MASK) != 0; +} + + +Bool +VIAI2CInit(ScrnInfoPtr pScrn) +{ + VIAPtr pVia = VIAPTR(pScrn); + I2CBusPtr I2CPtr1, I2CPtr2; + + I2CPtr1 = xf86CreateI2CBusRec(); + I2CPtr2 = xf86CreateI2CBusRec(); + if (!I2CPtr1 || !I2CPtr2) + return FALSE; + + I2CPtr1->BusName = "I2C bus 1"; + I2CPtr1->scrnIndex = pScrn->scrnIndex; + I2CPtr1->I2CPutBits = VIAI2C1PutBits; + I2CPtr1->I2CGetBits = VIAI2C1GetBits; + + I2CPtr2->BusName = "I2C bus 2"; + I2CPtr2->scrnIndex = pScrn->scrnIndex; + I2CPtr2->I2CPutBits = VIAI2C2PutBits; + I2CPtr2->I2CGetBits = VIAI2C2GetBits; + + if (!xf86I2CBusInit(I2CPtr1) || !xf86I2CBusInit(I2CPtr2)) + return FALSE; + + pVia->I2C_Port1 = I2CPtr1; + pVia->I2C_Port2 = I2CPtr2; + + return TRUE; +} + +#ifdef _MY_I2C_ +/*------------------------------------------------ + I2C Module + ------------------------------------------------*/ + +static int pcI2CIndex = 0x3c4; +static int pcI2Cport = 0x3c5; +/* +static int pcIndexReg = 0x31; +static int pcSDAReadBack= 0x31; +*/ + +static int gSDA=0; + + +#if 0 +static void I2CUDelay(int usec) +{ + long b_secs, b_usecs; + long a_secs, a_usecs; + long d_secs, d_usecs; + long diff; + + if (usec > 0) { + xf86getsecs(&b_secs, &b_usecs); + do { + /* It would be nice to use {xf86}usleep, + * but usleep (1) takes >10000 usec ! + */ + xf86getsecs(&a_secs, &a_usecs); + d_secs = (a_secs - b_secs); + d_usecs = (a_usecs - b_usecs); + diff = d_secs*1000000 + d_usecs; + } while (diff>0 && diff< (usec + 1)); + } +} +#endif + +/* Enable I2C */ +void I2C_Enable(int pcIndexReg) +{ + int tempI2Cdata, Reg3C4H; + + /* save 3c4H */ + Reg3C4H = inb(pcI2CIndex); + + outb(pcI2CIndex, pcIndexReg); + tempI2Cdata = inb(pcI2Cport); + + tempI2Cdata |= 0x01; /* Bit 0:I2C Serial Port Enable */ + outb(pcI2Cport, tempI2Cdata); + + /* restore 3c4H */ + outb(pcI2CIndex, Reg3C4H); + +} /* I2C_enable */ + + + +/* reverse data */ +long I2C_reverk(register unsigned data) +{ + unsigned long rdata = 0; + int i; + + for ( i = 0; i < 16 ; i++ ) { + rdata |= ( data & 1 ); /* strip off LSBIT */ + data >>= 1; + rdata <<= 1; + } + return(rdata >> 1); + +} /* I2C_reverk */ + + + +/* get an acknowledge back from a slave device */ +int I2C_ack_pc(int pcIndexReg) +{ + int ack; + + I2C_regwrit_pc(pcIndexReg, I2C_SDA, 1); + I2C_regwrit_pc(pcIndexReg, I2C_SCL, HICLK); + ack = I2C_regread_pc(pcIndexReg, I2C_SDA); + I2C_regwrit_pc(pcIndexReg, I2C_SCL, LOCLK); + + return (ack); + +} /* I2C_ack_pc */ + + + +/* send a start condition */ +void I2C_start_pc(int pcIndexReg) +{ + I2C_regwrit_pc(pcIndexReg, I2C_SDA, 1); + I2C_regwrit_pc(pcIndexReg, I2C_SCL, HICLK); + I2C_regwrit_pc(pcIndexReg, I2C_SDA, 0); + I2C_regwrit_pc(pcIndexReg, I2C_SCL, LOCLK); + +} /* I2C_start_pc */ + + + +/* send a stop condition */ +void I2C_stop_pc(int pcIndexReg) +{ + I2C_regwrit_pc(pcIndexReg, I2C_SDA, 0); + I2C_regwrit_pc(pcIndexReg, I2C_SCL, HICLK); + I2C_regwrit_pc(pcIndexReg, I2C_SDA, 1); + +} /* I2C_stop_pc */ + + + +/* write I2C data */ +int I2C_wdata_pc(int pcIndexReg, unsigned type , unsigned data) +{ + int i; + + data = (unsigned int)(I2C_reverk(data) >> 8); /* MSBIT goes out first */ + + if ( type == I2C_ADR ) + I2C_start_pc(pcIndexReg); + + for ( i = 0; i < 8; data >>=1, i++ ) { + I2C_regwrit_pc(pcIndexReg, I2C_SDA, data); + I2C_regwrit_pc(pcIndexReg, I2C_SCL, HICLK); + I2C_regwrit_pc(pcIndexReg, I2C_SCL, LOCLK); + } + + return I2C_ack_pc(pcIndexReg); /* wait for acknowledge */ + +} /* I2C_wdata_pc */ + + +/* Write SCL/SDA bit */ +void I2C_regwrit_pc(int pcIndexReg, unsigned type, unsigned data ) +{ + int tempI2Cdata, Reg3C4H; + + /* save 3c4H */ + Reg3C4H = inb(pcI2CIndex); + + outb(pcI2CIndex, pcIndexReg); + tempI2Cdata = inb(pcI2Cport); + + + switch (type) { + case I2C_SCL: + tempI2Cdata &= 0xcf; /* bit5 SPCLCK, bit4 SDATA */ + tempI2Cdata |= gSDA | ( (data & 1)<< 5); + outb(pcI2Cport, tempI2Cdata); + break; + + case I2C_SDA: + tempI2Cdata &= 0xef; + tempI2Cdata |= ( (data & 1) << 4); + outb(pcI2Cport, tempI2Cdata); + + gSDA = 0; + gSDA = ( (data & 1) << 4); + + break; + } + + /* restore 3c4H */ + outb(pcI2CIndex, Reg3C4H); + +} /* I2C_regwrit_pc */ + + + +/* Read SDA bit */ +int I2C_regread_pc(int pcIndexReg, unsigned type) +{ + int temp=0,Reg3C4H; + + /* save 3c4H */ + Reg3C4H = inb(pcI2CIndex); + + switch (type) { + case I2C_SCL : + break; + + case I2C_SDA: + outb(pcI2CIndex, pcIndexReg); + temp = ( inb(pcI2Cport) >> 2) & 0x01; + break; + } + + /* restore 3c4H */ + outb(pcI2CIndex, Reg3C4H); + + return(temp); + +} /* I2C_regread_pc */ + + +void I2C_wdata(int pcIndexReg, int addr, int subAddr, int data) +{ + int ack = 1; + + ack = I2C_wdata_pc(pcIndexReg, I2C_ADR, addr); + ack = I2C_wdata_pc(pcIndexReg, I2C_DAT, subAddr); + ack = I2C_wdata_pc(pcIndexReg, I2C_DAT, data); + + I2C_stop_pc(pcIndexReg); +} + + +int I2C_rdata(int pcIndexReg, int addr, unsigned subAddr) +{ + int StatusData =0, data, i; + + I2C_wdata_pc(pcIndexReg, I2C_ADR, addr); + I2C_wdata_pc(pcIndexReg, I2C_DAT, subAddr); + I2C_stop_pc(pcIndexReg); + + I2C_wdata_pc(pcIndexReg, I2C_ADR, addr+1); + + + /* pull SDA High */ + I2C_regwrit_pc(pcIndexReg, I2C_SDA, 1); + + /* Read Register */ + for ( i = 0; i <= 7 ; i++ ) { + + I2C_regwrit_pc(pcIndexReg, I2C_SCL, HICLK); + data = I2C_regread_pc(pcIndexReg, I2C_SDA); + I2C_regwrit_pc(pcIndexReg, I2C_SCL, LOCLK); + + data &= 0x01; /* Keep SDA only */ + StatusData <<= 1; + StatusData |= data; + } + + I2C_stop_pc(pcIndexReg); + return(StatusData); +} + +Bool I2C_Write(int pcIndexReg, int addr, unsigned char *WriteBuffer, int nWrite) +{ + int s = 0; + int ack = 1; + + ack = I2C_wdata_pc(pcIndexReg, I2C_ADR, addr); + + if (nWrite > 0) { + for (; nWrite > 0; WriteBuffer++, nWrite--) + ack = I2C_wdata_pc(pcIndexReg, I2C_DAT, *WriteBuffer); + s++; + } + else { + I2C_stop_pc(pcIndexReg); + return (s); + } + + I2C_stop_pc(pcIndexReg); + return (s); +} +#endif diff --git a/src/via_i2c.h b/src/via_i2c.h new file mode 100644 index 0000000..57ce7b3 --- /dev/null +++ b/src/via_i2c.h @@ -0,0 +1,28 @@ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_i2c.h,v 1.1 2003/04/15 15:35:47 alanh Exp $ */ +#ifndef __VIAI2C_H +#define __VIAI2C_H + +#endif /*__VIAI2C_H */ diff --git a/src/via_memcpy.c b/src/via_memcpy.c new file mode 100644 index 0000000..b4cfb77 --- /dev/null +++ b/src/via_memcpy.c @@ -0,0 +1,669 @@ +/* + * Copyright (C) 2004 Thomas Hellstrom, All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE CODE SUPPLIER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "via_driver.h" +#include "via_memcpy.h" +#include "compiler.h" + + +#define BSIZ 2048 /* Size of /proc/cpuinfo buffer */ +#define BSIZW 720 /* Typical Copy Width (YUV420) Copy. */ +#define BSIZA 736 /* Multiple of 32 bytes */ +#define BSIZH 576 /* Typical Copy Hight */ + +#define SSE_PREFETCH " prefetchnta " +#define FENCE __asm__ __volatile__ ("sfence":::"memory"); +#define FENCEMMS __asm__ __volatile__ ("\t" \ + "sfence\n\t" \ + "emms\n\t" \ + :::"memory"); +#define FEMMS __asm__ __volatile__("femms":::"memory"); +#define EMMS __asm__ __volatile__("emms":::"memory"); + +#define NOW_PREFETCH " prefetch " + + +#define PREFETCH1(arch_prefetch,from) \ + __asm__ __volatile__ ( \ + "1: " arch_prefetch "(%0)\n" \ + arch_prefetch "32(%0)\n" \ + arch_prefetch "64(%0)\n" \ + arch_prefetch "96(%0)\n" \ + arch_prefetch "128(%0)\n" \ + arch_prefetch "160(%0)\n" \ + arch_prefetch "192(%0)\n" \ + arch_prefetch "256(%0)\n" \ + arch_prefetch "288(%0)\n" \ + "2:\n" \ + : : "r" (from) ); + +#define PREFETCH2(arch_prefetch,from) \ + __asm__ __volatile__ ( \ + arch_prefetch "320(%0)\n" \ + : : "r" (from) ); +#define PREFETCH3(arch_prefetch,from) \ + __asm__ __volatile__ ( \ + arch_prefetch "288(%0)\n" \ + : : "r" (from) ); + + + +#define small_memcpy(to,from,n) \ + { \ + __asm__ __volatile__( \ + "movl %2,%%ecx\n\t" \ + "sarl $2,%%ecx\n\t" \ + "rep ; movsl\n\t" \ + "testb $2,%b2\n\t" \ + "je 1f\n\t" \ + "movsw\n" \ + "1:\ttestb $1,%b2\n\t" \ + "je 2f\n\t" \ + "movsb\n" \ + "2:" \ + :"=&D" (to), "=&S" (from) \ + :"q" (n),"0" ((long) to),"1" ((long) from) \ + : "%ecx","memory"); \ + } + + +#define SSE_CPY(prefetch,from,to,dummy,lcnt) \ + if ((unsigned long) from & 15) { \ + __asm__ __volatile__ ( \ + "1:\n" \ + prefetch "320(%1)\n" \ + " movups (%1), %%xmm0\n" \ + " movups 16(%1), %%xmm1\n" \ + " movntps %%xmm0, (%0)\n" \ + " movntps %%xmm1, 16(%0)\n" \ + prefetch "352(%1)\n" \ + " movups 32(%1), %%xmm2\n" \ + " movups 48(%1), %%xmm3\n" \ + " movntps %%xmm2, 32(%0)\n" \ + " movntps %%xmm3, 48(%0)\n" \ + " addl $64,%0\n" \ + " addl $64,%1\n" \ + " decl %2\n" \ + " jne 1b\n" \ + :"=&D"(to), "=&S"(from), "=&r"(dummy) \ + :"0" (to), "1" (from), "2" (lcnt): "memory"); \ + } else { \ + __asm__ __volatile__ ( \ + "2:\n" \ + prefetch "320(%1)\n" \ + " movaps (%1), %%xmm0\n" \ + " movaps 16(%1), %%xmm1\n" \ + " movntps %%xmm0, (%0)\n" \ + " movntps %%xmm1, 16(%0)\n" \ + prefetch "352(%1)\n" \ + " movaps 32(%1), %%xmm2\n" \ + " movaps 48(%1), %%xmm3\n" \ + " movntps %%xmm2, 32(%0)\n" \ + " movntps %%xmm3, 48(%0)\n" \ + " addl $64,%0\n" \ + " addl $64,%1\n" \ + " decl %2\n" \ + " jne 2b\n" \ + :"=&D"(to), "=&S"(from), "=&r"(dummy) \ + :"0" (to), "1" (from), "2" (lcnt): "memory"); \ + } + +#define MMX_CPY(prefetch,from,to,dummy,lcnt) \ + __asm__ __volatile__ ( \ + "1:\n" \ + prefetch "320(%1)\n" \ + "2: movq (%1), %%mm0\n" \ + " movq 8(%1), %%mm1\n" \ + " movq 16(%1), %%mm2\n" \ + " movq 24(%1), %%mm3\n" \ + " movq %%mm0, (%0)\n" \ + " movq %%mm1, 8(%0)\n" \ + " movq %%mm2, 16(%0)\n" \ + " movq %%mm3, 24(%0)\n" \ + prefetch "352(%1)\n" \ + " movq 32(%1), %%mm0\n" \ + " movq 40(%1), %%mm1\n" \ + " movq 48(%1), %%mm2\n" \ + " movq 56(%1), %%mm3\n" \ + " movq %%mm0, 32(%0)\n" \ + " movq %%mm1, 40(%0)\n" \ + " movq %%mm2, 48(%0)\n" \ + " movq %%mm3, 56(%0)\n" \ + " addl $64,%0\n" \ + " addl $64,%1\n" \ + " decl %2\n" \ + " jne 1b\n" \ + :"=&D"(to), "=&S"(from), "=&r"(dummy) \ + :"0" (to), "1" (from), "2" (lcnt) : "memory"); + +#define MMXEXT_CPY(prefetch,from,to,dummy,lcnt) \ + __asm__ __volatile__ ( \ + ".p2align 4,,7\n" \ + "1:\n" \ + prefetch "320(%1)\n" \ + " movq (%1), %%mm0\n" \ + " movq 8(%1), %%mm1\n" \ + " movq 16(%1), %%mm2\n" \ + " movq 24(%1), %%mm3\n" \ + " movntq %%mm0, (%0)\n" \ + " movntq %%mm1, 8(%0)\n" \ + " movntq %%mm2, 16(%0)\n" \ + " movntq %%mm3, 24(%0)\n" \ + prefetch "352(%1)\n" \ + " movq 32(%1), %%mm0\n" \ + " movq 40(%1), %%mm1\n" \ + " movq 48(%1), %%mm2\n" \ + " movq 56(%1), %%mm3\n" \ + " movntq %%mm0, 32(%0)\n" \ + " movntq %%mm1, 40(%0)\n" \ + " movntq %%mm2, 48(%0)\n" \ + " movntq %%mm3, 56(%0)\n" \ + " addl $64,%0\n" \ + " addl $64,%1\n" \ + " decl %2\n" \ + " jne 1b\n" \ + :"=&D"(to), "=&S"(from), "=&r"(dummy) \ + :"0" (to), "1" (from), "2" (lcnt) : "memory"); + + +#define PREFETCH_FUNC(prefix,itype,ptype,begin,fence) \ + \ + static void prefix##_YUV42X(unsigned char *to, \ + const unsigned char *from, \ + int dstPitch, \ + int w, \ + int h, \ + int yuv422) \ + \ + { \ + int \ + dadd,rest,count,hc,lcnt; \ + register int dummy; \ + PREFETCH1(ptype##_PREFETCH,from); \ + begin; \ + count = 2; \ + \ + /* \ + * If destination pitch and width ar equal, do it all in one go. \ + */ \ + \ + if ( yuv422 ) { \ + w <<= 1; \ + if (w == dstPitch) { \ + w *= h; \ + h = 1; \ + dstPitch = w; \ + count = 0; \ + } else { \ + h -= 1; \ + count = 1; \ + } \ + } else if (w == dstPitch) { \ + w = h*(w + (w >> 1)); \ + count = 0; \ + h = 1; \ + dstPitch = w; \ + } \ + \ + lcnt = w >> 6; \ + rest = w & 63; \ + while(count--) { \ + hc = h; \ + lcnt = w >> 6; \ + rest = w & 63; \ + dadd = dstPitch - w; \ + while(hc--) { \ + if (lcnt) { \ + itype##_CPY(ptype##_PREFETCH,from,to,dummy, \ + lcnt); \ + } \ + if (rest) { \ + PREFETCH2(ptype##_PREFETCH,from); \ + small_memcpy(to, from, rest); \ + PREFETCH3(ptype##_PREFETCH,from); \ + } \ + to += dadd; \ + } \ + w >>= 1; \ + dstPitch >>= 1; \ + h -= 1; \ + } \ + if (lcnt > 5) { \ + lcnt -= 5; \ + itype##_CPY(ptype##_PREFETCH,from,to,dummy,lcnt); \ + lcnt = 5; \ + } \ + if (lcnt) { \ + itype##_CPY("#",from,to,dummy,lcnt); \ + } \ + if (rest) small_memcpy(to, from, rest); \ + fence; \ + } + +#define NOPREFETCH_FUNC(prefix,itype,begin,fence) \ + static void prefix##_YUV42X(unsigned char *to, \ + const unsigned char *from, \ + int dstPitch, \ + int w, \ + int h, \ + int yuv422) \ + \ + { \ + int \ + dadd,rest,count,hc,lcnt; \ + register int dummy; \ + begin; \ + count = 2; \ + \ + /* \ + * If destination pitch and width ar equal, do it all in one go. \ + */ \ + \ + if ( yuv422 ) { \ + w <<= 1; \ + count = 1; \ + if (w == dstPitch) { \ + w *= h; \ + h = 1; \ + dstPitch = w; \ + } \ + } else if (w == dstPitch) { \ + w = h*(w + (w >> 1)); \ + count = 1; \ + h = 1; \ + dstPitch = w; \ + } \ + \ + lcnt = w >> 6; \ + rest = w & 63; \ + while(count--) { \ + hc = h; \ + dadd = dstPitch - w; \ + lcnt = w >> 6; \ + rest = w & 63; \ + while(hc--) { \ + if (lcnt) { \ + itype##_CPY("#",from,to,dummy,lcnt); \ + } \ + if (rest) small_memcpy(to, from, rest); \ + to += dadd; \ + } \ + w >>= 1; \ + dstPitch >>= 1; \ + } \ + fence; \ + } \ + +#if !defined(__i386__) || (defined(linux) && defined(__i386__)) + +static void libc_YUV42X(unsigned char *dst, + const unsigned char *src, + int dstPitch, + int w, + int h, int yuv422) { + if ( yuv422 ) w <<= 1; + if (dstPitch == w) { + int size = h*((yuv422) ? w : (w + (w >> 1))); + xf86memcpy(dst, src, size); + return; + } else { + int count; + + /* copy Y component to video memory */ + + count = h; + while(count--) { + xf86memcpy(dst, src, w); + src += w; + dst += dstPitch; + } + + /* UV component is 1/2 of Y */ + + if (! yuv422 ) { + + w >>= 1; + dstPitch >>= 1; + + /* copy V(Cr),U(Cb) components to video memory */ + + count = h; + while(count--) { + xf86memcpy(dst, src, w); + src += w; + dst += dstPitch; + } + } + } +} +#endif + +#ifdef __i386__ + + + +/* linux kernel __memcpy */ +static __inline void * __memcpy(void * to, const void * from, size_t n) +{ + int d1,d2,d3; + + __asm__ __volatile__( + "rep ; movsl\n\t" + "testb $2,%b4\n\t" + "je 1f\n\t" + "movsw\n" + "1:\ttestb $1,%b4\n\t" + "je 2f\n\t" + "movsb\n" + "2:" + : "=&c" (d1), "=&D" (d2), "=&S" (d3) + :"0" (n >> 2), "q" (n),"1" ((long) to),"2" ((long) from) + : "memory"); + + return (to); +} + + +static void kernel_YUV42X(unsigned char *dst, + const unsigned char *src, + int dstPitch, + int w, + int h, int yuv422) { + + if ( yuv422 ) w <<= 1; + if (dstPitch == w) { + int size = h*((yuv422) ? w : (w + (w >> 1))); + __memcpy(dst, src, size); + return; + } else { + int count; + + /* copy Y component to video memory */ + + count = h; + while(count--) { + __memcpy(dst, src, w); + src += w; + dst += dstPitch; + } + + /* UV component is 1/2 of Y */ + + if (! yuv422 ) { + + w >>= 1; + dstPitch >>= 1; + + /* copy V(Cr),U(Cb) components to video memory */ + + count = h; + while(count--) { + __memcpy(dst, src, w); + src += w; + dst += dstPitch; + } + } + } +} + +#ifdef linux + +PREFETCH_FUNC(sse,SSE,SSE,,FENCE) +PREFETCH_FUNC(mmxext,MMXEXT,SSE,EMMS,FENCEMMS) +PREFETCH_FUNC(now,MMX,NOW,FEMMS,FEMMS) +NOPREFETCH_FUNC(mmx,MMX,EMMS,EMMS) + + +static void * kernel_memcpy(void * to, const void * from, size_t len) { + return __memcpy(to, from, len); +} + +static unsigned fastrdtsc(void) +{ + unsigned eax; + __asm__ volatile ("\t" + "cpuid\n\t" + ".byte 0x0f, 0x31" + : "=a" (eax) + : "0"(0) + : "ebx","ecx","edx","cc"); + return eax; +} + + + +static unsigned time_function(vidCopyFunc mf,unsigned char *buf1, + unsigned char *buf2) { + unsigned t,t2; + + t = fastrdtsc(); + + (*mf)(buf1,buf2,BSIZA,BSIZW,BSIZH,0); + + t2 = fastrdtsc(); + return ((t < t2) ? t2 - t : 0xFFFFFFFFU - (t - t2 -1)); +} + +enum {libc=0,kernel,sse,mmx,now,mmxext,totNum}; + + +typedef struct { + vidCopyFunc mFunc; + char *mName,**cpuFlag; +} McFuncData; + +char *libc_cpuflags[] = {" ",0}; +char *kernel_cpuflags[] = {" ",0}; +char *sse_cpuflags[] = {" sse ",0}; +char *mmx_cpuflags[] = {" mmx ",0}; +char *now_cpuflags[] = {" 3dnow ",0}; +char *mmx2_cpuflags[] = {" mmxext ", " sse ",0}; + +static McFuncData mcFunctions[totNum] = + {{libc_YUV42X,"libc",libc_cpuflags}, + {kernel_YUV42X,"kernel",kernel_cpuflags}, + {sse_YUV42X,"SSE",sse_cpuflags}, + {mmx_YUV42X,"MMX",mmx_cpuflags}, + {now_YUV42X,"3DNow!",now_cpuflags}, + {mmxext_YUV42X,"MMX2",mmx2_cpuflags}}; + + +static int cpuValid(const char *cpuinfo, char **flags) { + + for(; *flags != 0; flags++) { + if (strstr(cpuinfo,*flags)) return 1; + } + + return 0; +} +#endif + + +vidCopyFunc viaVidCopyInit( char *copyType, + ScreenPtr pScreen ) { + + /* + * Benchmark the video copy routines using a relevant benchmark + * and choose the fastest. + */ + + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; +#ifdef linux + char buf[BSIZ]; + unsigned char *buf1,*buf2,*buf3; + char *tmpBuf,*endBuf; + int count,j,bestSoFar; + unsigned best,tmp,testSize,alignSize,tmp2; + VIAMem tmpFbBuffer; + McFuncData *curData; + FILE *cpuInfoFile; + double cpuFreq; + VIAPtr pVia = VIAPTR(pScrn); + + pScrn->pScreen = pScreen; + if (NULL == (cpuInfoFile = fopen("/proc/cpuinfo","r"))) { + return libc_YUV42X; + } + count = fread(buf,1,BSIZ,cpuInfoFile); + if (ferror(cpuInfoFile)) { + fclose(cpuInfoFile); + return libc_YUV42X; + } + fclose(cpuInfoFile); + if (BSIZ == count) { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "\"/proc/cpuinfo\" file too long. " + "Using Linux kernel memcpy.\n"); + return libc_YUV42X; + } + buf[count] = 0; + + while(count--) + if ('\n' == buf[count]) buf[count] = ' '; + + /* + * Extract the cpu frequency. + */ + + cpuFreq = 0.; + + if (NULL != (tmpBuf = strstr(buf,"cpu MHz"))) { + if (NULL != (tmpBuf = strstr(tmpBuf,":") + 1)) { + cpuFreq = strtod(tmpBuf,&endBuf); + if (endBuf == tmpBuf) tmpBuf = NULL; + } + } + + alignSize = BSIZH*(BSIZA + (BSIZA >> 1)); + testSize = BSIZH*(BSIZW + (BSIZW >> 1)); + tmpFbBuffer.pool = 0; + + /* + * Allocate an area of offscreen FB memory, (buf1), a simulated video + * player buffer (buf2) and a pool of uninitialized "video" data (buf3). + */ + + if (VIAAllocLinear(&tmpFbBuffer, pScrn, alignSize + 31)) + return libc_YUV42X; + if (NULL == (buf2 = (unsigned char *)xalloc(testSize))) { + VIAFreeLinear(&tmpFbBuffer); + return libc_YUV42X; + } + if (NULL == (buf3 = (unsigned char *)xalloc(testSize))) { + xfree(buf2); + VIAFreeLinear(&tmpFbBuffer); + return libc_YUV42X; + } + buf1 = (unsigned char *)pVia->FBBase + tmpFbBuffer.base; + + /* + * Align the frame buffer destination memory to a 32 byte boundary. + */ + + if ((unsigned long)buf1 & 31) + buf1 += (32 - ((unsigned long)buf1 & 31)); + + bestSoFar = 0; + best = 0xFFFFFFFFU; + + /* + * Make probable buf1 and buf2 are not paged out by + * referencing them. + */ + + libc_YUV42X(buf1,buf2,BSIZA,BSIZW,BSIZH,0); + + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Benchmarking %s copy. Less is better.\n",copyType); + for (j=0; j<totNum; ++j) { + curData = mcFunctions + j; + + if (cpuValid(buf,curData->cpuFlag)) { + + /* + * Simulate setup of the video buffer. + */ + + kernel_memcpy(buf2,buf3,testSize); + + /* + * Copy the video buffer to frame-buffer memory. + */ + + tmp = time_function(curData->mFunc,buf1,buf2); + + /* + * Do it again to avoid context switch effects. + */ + + kernel_memcpy(buf2,buf3,testSize); + tmp2 = time_function(curData->mFunc,buf1,buf2); + tmp = (tmp2 < tmp) ? tmp2 : tmp; + + if (NULL == tmpBuf) { + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "Timed %6s YUV420 copy... %u.\n",curData->mName,tmp); + } else { + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "Timed %6s YUV420 copy... %u. " + "Throughput: %.1f MiB/s.\n",curData->mName,tmp, + cpuFreq * 1.e6 * (double)testSize / + ((double)(tmp) * (double)(0x100000))); + } + if (tmp < best) { + best = tmp; + bestSoFar = j; + } + } else { + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "Ditch %6s YUV420 copy... Not supported by CPU.\n", + curData->mName); + + } + } + xfree(buf3); + xfree(buf2); + VIAFreeLinear(&tmpFbBuffer); + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "Using %s YUV42X copy for %s.\n",mcFunctions[bestSoFar].mName, + copyType); + return mcFunctions[bestSoFar].mFunc; +#endif + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Using copy of Linux kernel memcpy for video.\n"); + return kernel_YUV42X; +} + +#else + +vidCopyFunc viaVidCopyInit( char *copyType, + ScreenPtr pScreen ) { + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Using default xfree86 memcpy for video.\n"); + return libc_YUV42X; +} + +#endif + diff --git a/src/via_memcpy.h b/src/via_memcpy.h new file mode 100644 index 0000000..338bd6d --- /dev/null +++ b/src/via_memcpy.h @@ -0,0 +1,31 @@ +/* + * Copyright 2004 Thomas Hellstrom, All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE CODE SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ +#ifndef _VIA_MEMCPY_H_ +#define _VIA_MEMCPY_H_ +#include "xf86.h" + +typedef void (*vidCopyFunc)(unsigned char *, const unsigned char *, + int, int, int, int); +extern vidCopyFunc viaVidCopyInit( char *copyType, ScreenPtr pScreen ); + +#endif diff --git a/src/via_memory.c b/src/via_memory.c new file mode 100644 index 0000000..868bb8a --- /dev/null +++ b/src/via_memory.c @@ -0,0 +1,211 @@ +/* + * Copyright 2003 Red Hat, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_memory.c,v 1.5 2004/01/29 03:13:25 dawes Exp $ */ + +#include "xf86.h" +#include "xf86_OSproc.h" +#include "xf86_ansic.h" +#include "xf86fbman.h" + +#include "via_compose.h" +#include "via_capture.h" +#include "via.h" +#include "ddmpeg.h" +#include "xf86drm.h" + +#include "via_overlay.h" +#include "via_driver.h" +#include "via_regrec.h" +#include "via_priv.h" +#include "via_swov.h" +#include "via_common.h" + + +/* + * Isolate the wonders of X memory allocation, DRI memory allocation + * and 4.3 or 4.4 differences in once abstraction + * + * The pool code indicates who provided the memory + * 0 - nobody + * 1 - xf86 linear (Used in 4.4 only) + * 2 - DRM + * 3 - Preallocated buffer (Used in 4.3 only) + */ + +void VIAFreeLinear(VIAMemPtr mem) +{ + VIAPtr pVia; + DEBUG(ErrorF("Freed %lu (pool %d)\n", mem->base, mem->pool)); + switch(mem->pool) + { + case 0: + return; + case 1: + xf86FreeOffscreenLinear(mem->linear); + mem->linear = NULL; + mem->pool = 0; + return; + case 2: +#ifdef XF86DRI + if(drmCommandWrite(mem->drm_fd, DRM_VIA_FREEMEM, + &mem->drm, sizeof(drmViaMem)) < 0) + ErrorF("DRM module failed free.\n"); +#endif + mem->pool = 0; + return; + case 3: + mem->pool = 0; + pVia = mem->pVia; + pVia->SWOVUsed[mem->slot] = 0; + return; + } +} + +#ifdef XFREE86_44 +static unsigned long offScreenLinear(VIAMemPtr mem, ScrnInfoPtr pScrn, + unsigned long size) { + + int depth = (pScrn->bitsPerPixel + 7) >> 3; + /* Make sure we don't truncate requested size */ + mem->linear = xf86AllocateOffscreenLinear(pScrn->pScreen, + ( size + depth - 1 ) / depth, + 32, NULL, NULL, NULL); + if(mem->linear == NULL) + return BadAlloc; + mem->base = mem->linear->offset * depth; + mem->pool = 1; + return Success; + +} +#endif + +unsigned long VIAAllocLinear(VIAMemPtr mem, ScrnInfoPtr pScrn, unsigned long size) +{ +#if defined(XF86DRI) || !defined(XFREE86_44) + VIAPtr pVia = VIAPTR(pScrn); +#endif + +#ifdef XF86DRI + int ret; + + + if(mem->pool) + ErrorF("VIA Double Alloc.\n"); + + if(pVia->graphicInfo.DRMEnabled) { + mem->drm_fd = pVia->drmFD; + mem->drm.context = 1; + mem->drm.size = size; + mem->drm.type = VIDEO; + ret = drmCommandWrite(mem->drm_fd, DRM_VIA_ALLOCMEM, &mem->drm, + sizeof(drmViaMem)); + if (ret || (size != mem->drm.size)) { +#ifdef XFREE86_44 + /* + * Try XY Fallback before failing. + */ + + if (Success == offScreenLinear(mem, pScrn, size)) + return Success; +#endif + ErrorF("DRM memory allocation failed\n"); + return BadAlloc; + } + + mem->base = mem->drm.offset; + mem->pool = 2; + DEBUG(ErrorF("Fulfilled via DRI at %lu\n", mem->base)); + return 0; + } +#endif + +#ifdef XFREE86_44 + { + if (Success == offScreenLinear(mem, pScrn, size)) + return Success; + ErrorF("Linear memory allocation failed\n"); + return BadAlloc; + } +#else + { + int i; + if(size > pVia->SWOVSize) + return BadAccess; + for(i = 0; i < MEM_BLOCKS; i++) { + if(!pVia->SWOVUsed[i]) { + pVia->SWOVUsed[i] = 1; + mem->pool = 3; + mem->base = pVia->SWOVPool + pVia->SWOVSize * i; + mem->pVia = pVia; + mem->slot = i; + DEBUG(ErrorF("Fulfilled via pool at %lu\n", mem->base)); + return 0; + } + } + } + ErrorF("Out of pools.\n"); + return BadAlloc; +#endif +} + +#ifndef XFREE86_44 + +static void +VIAInitPool(VIAPtr pVia, unsigned long offset, unsigned long size) +{ + DEBUG(ErrorF("VIAInitPool %lu bytes at %lu\n", size, offset)); + + size /= 4; + + DEBUG(ErrorF("VIAInitPool %d pools of %lu bytes\n", MEM_BLOCKS, size)); + pVia->SWOVPool = offset; + pVia->SWOVSize = size; +} + +#endif + +void VIAInitLinear(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + VIAPtr pVia = VIAPTR(pScrn); +#ifdef XFREE86_44 + /* + * In the 44 path we must take care not to truncate offset and size so + * that we get overlaps. If there is available memory below line 2048 + * we use it. + */ + unsigned long offset = (pVia->FBFreeStart + pVia->Bpp - 1 ) / pVia->Bpp; + unsigned long size = pVia->FBFreeEnd / pVia->Bpp - offset; + if (size > 0) xf86InitFBManagerLinear(pScreen, offset, size); +#else + /* + * In the 43 path we don't have to care about truncation. just use + * all available memory, also below line 2048. The drm module uses + * pVia->FBFreeStart as offscreen available start. We do it to. + */ + unsigned long offset = pVia->FBFreeStart; + unsigned long size = pVia->FBFreeEnd - offset; + if (size > 0 ) VIAInitPool(pVia, offset, size); +#endif +} + diff --git a/src/via_mode.h b/src/via_mode.h new file mode 100644 index 0000000..4897a4d --- /dev/null +++ b/src/via_mode.h @@ -0,0 +1,870 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_mode.h,v 1.4 2004/02/09 01:45:23 dawes Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef _VIA_MODE_H_ +#define _VIA_MODE_H_ 1 + +static const unsigned short BIOSVer = 0X10; + +static char BIOSDate[] = + { 0X30, 0X34, 0X2F, 0X31, 0X35, 0X2F, 0X30, 0X33, 0 }; + +static const unsigned short NumModes = 97; + +static const int NumPowerOn = 2; + +static const int NumPowerOff = 2; + +static VIAModeEntry Modes[] = { + { 0, 0, 4, 0, 0, 0, 0, { 40, 24, 8, 0X800, { 0, 0X9, 0X3, 0, 0X2 }, 0X63, { 0X2D, 0X27, 0X28, 0X90, 0X2B, 0XA0, 0XBF, 0X1F, 0, 0XC7, 0X6, 0X7, 0, 0, 0, 0, 0X9C, 0X6E, 0X8F, 0X14, 0X1F, 0X96, 0XB9, 0XA3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X10, 0X11, 0X12, 0X13, 0X14, 0X15, 0X16, 0X17, 0X8, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X10, 0XE, 0, 0XFF } }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } }, + { 0, 0, 4, 0X1, 0, 0, 0, { 40, 24, 8, 0X800, { 0, 0X9, 0X3, 0, 0X2 }, 0X63, { 0X2D, 0X27, 0X28, 0X90, 0X2B, 0XA0, 0XBF, 0X1F, 0, 0XC7, 0X6, 0X7, 0, 0, 0, 0, 0X9C, 0X6E, 0X8F, 0X14, 0X1F, 0X96, 0XB9, 0XA3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X10, 0X11, 0X12, 0X13, 0X14, 0X15, 0X16, 0X17, 0X8, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X10, 0XE, 0, 0XFF } }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } }, + { 0, 0, 4, 0X2, 0, 0, 0, { 80, 24, 8, 0X1000, { 0, 0X1, 0X3, 0, 0X2 }, 0X63, { 0X5F, 0X4F, 0X50, 0X82, 0X55, 0X81, 0XBF, 0X1F, 0, 0XC7, 0X6, 0X7, 0, 0, 0, 0, 0X9C, 0X6E, 0X8F, 0X28, 0X1F, 0X96, 0XB9, 0XA3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X10, 0X11, 0X12, 0X13, 0X14, 0X15, 0X16, 0X17, 0X8, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X10, 0XE, 0, 0XFF } }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } }, + { 0, 0, 4, 0X3, 0, 0, 0, { 80, 24, 8, 0X1000, { 0, 0X1, 0X3, 0, 0X2 }, 0X63, { 0X5F, 0X4F, 0X50, 0X82, 0X55, 0X81, 0XBF, 0X1F, 0, 0XC7, 0X6, 0X7, 0, 0, 0, 0, 0X9C, 0X6E, 0X8F, 0X28, 0X1F, 0X96, 0XB9, 0XA3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X10, 0X11, 0X12, 0X13, 0X14, 0X15, 0X16, 0X17, 0X8, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X10, 0XE, 0, 0XFF } }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } }, + { 0, 0, 2, 0X4, 0, 0, 0, { 40, 24, 8, 0X4000, { 0, 0X9, 0X3, 0, 0X2 }, 0X63, { 0X2D, 0X27, 0X28, 0X90, 0X2B, 0X80, 0XBF, 0X1F, 0, 0XC1, 0, 0, 0, 0, 0, 0, 0X9C, 0X6E, 0X8F, 0X14, 0, 0X96, 0XB9, 0XA2, 0XFF }, { 0, 0X13, 0X15, 0X17, 0X2, 0X4, 0X6, 0X7, 0X10, 0X11, 0X12, 0X13, 0X14, 0X15, 0X16, 0X17, 0X1, 0, 0X3, 0 }, { 0, 0, 0, 0, 0, 0X30, 0XF, 0, 0XFF } }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } }, + { 0, 0, 2, 0X5, 0, 0, 0, { 40, 24, 8, 0X4000, { 0, 0X9, 0X3, 0, 0X2 }, 0X63, { 0X2D, 0X27, 0X28, 0X90, 0X2B, 0X80, 0XBF, 0X1F, 0, 0XC1, 0, 0, 0, 0, 0, 0, 0X9C, 0X6E, 0X8F, 0X14, 0, 0X96, 0XB9, 0XA2, 0XFF }, { 0, 0X13, 0X15, 0X17, 0X2, 0X4, 0X6, 0X7, 0X10, 0X11, 0X12, 0X13, 0X14, 0X15, 0X16, 0X17, 0X1, 0, 0X3, 0 }, { 0, 0, 0, 0, 0, 0X30, 0XF, 0, 0XFF } }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } }, + { 0, 0, 1, 0X6, 0, 0, 0, { 80, 24, 8, 0X4000, { 0, 0X1, 0X1, 0, 0X6 }, 0X63, { 0X5F, 0X4F, 0X50, 0X82, 0X54, 0X80, 0XBF, 0X1F, 0, 0XC1, 0, 0, 0, 0, 0, 0, 0X9C, 0X6E, 0X8F, 0X28, 0, 0X96, 0XB9, 0XC2, 0XFF }, { 0, 0X17, 0X17, 0X17, 0X17, 0X17, 0X17, 0X17, 0X17, 0X17, 0X17, 0X17, 0X17, 0X17, 0X17, 0X17, 0X1, 0, 0X1, 0 }, { 0, 0, 0, 0, 0, 0, 0XD, 0, 0XFF } }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } }, + { 0, 0, 0, 0X7, 0, 0, 0, { 80, 24, 14, 0X1000, { 0, 0, 0X3, 0, 0X2 }, 0XA6, { 0X5F, 0X4F, 0X50, 0X82, 0X55, 0X81, 0XBF, 0X1F, 0, 0X4D, 0XB, 0XC, 0, 0, 0, 0, 0X83, 0X65, 0X5D, 0X28, 0XD, 0X63, 0XBA, 0XA3, 0XFF }, { 0, 0X8, 0X8, 0X8, 0X8, 0X8, 0X8, 0X8, 0X10, 0X18, 0X18, 0X18, 0X18, 0X18, 0X18, 0X18, 0XE, 0, 0XF, 0X8 }, { 0, 0, 0, 0, 0, 0X10, 0XA, 0, 0XFF } }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } }, + { 0, 0, 4, 0X8, 0, 0, 0, { 80, 24, 16, 0X7D00, { 0, 0X1, 0XF, 0, 0X6 }, 0X63, { 0X5F, 0X4F, 0X50, 0X82, 0X55, 0X81, 0XBF, 0X1F, 0, 0X40, 0, 0, 0, 0, 0, 0, 0X9C, 0X6E, 0X8F, 0X28, 0X1F, 0X96, 0XB9, 0XE3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X14, 0X7, 0X38, 0X39, 0X3A, 0X3B, 0X3C, 0X3D, 0X3E, 0X3F, 0X1, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0, 0X5, 0XF, 0XFF } }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } }, + { 0, 0, 4, 0X6A, 16, 0X432E, 0XC459, { 100, 74, 8, 0XFA00, { 0, 0X1, 0XF, 0, 0X6 }, 0XF, { 0X7B, 0X63, 0X64, 0X9E, 0X69, 0X92, 0X6F, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X58, 0X6A, 0X57, 0X32, 0, 0X58, 0X6F, 0XE3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X14, 0X7, 0X38, 0X39, 0X3A, 0X3B, 0X3C, 0X3D, 0X3E, 0X3F, 0X1, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X20, 0X6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 } }, + { 0, 0, 4, 0X6B, 0, 0, 0, { 100, 74, 8, 0XFA00, { 0, 0X1, 0XF, 0, 0X6 }, 0XF, { 0X7B, 0X63, 0X64, 0X9E, 0X69, 0X92, 0X6F, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X58, 0X6A, 0X57, 0X32, 0, 0X58, 0X6F, 0XE3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X14, 0X7, 0X38, 0X39, 0X3A, 0X3B, 0X3C, 0X3D, 0X3E, 0X3F, 0X1, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0, 0X5, 0XF, 0XFF } }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } }, + { 0, 0, 4, 0X6C, 0, 0, 0, { 100, 74, 8, 0XFA00, { 0, 0X1, 0XF, 0, 0X6 }, 0XF, { 0X7B, 0X63, 0X64, 0X9E, 0X69, 0X92, 0X6F, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X58, 0X6A, 0X57, 0X32, 0, 0X58, 0X6F, 0XE3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X14, 0X7, 0X38, 0X39, 0X3A, 0X3B, 0X3C, 0X3D, 0X3E, 0X3F, 0X1, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0, 0X5, 0XF, 0XFF } }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } }, + { 0, 0, 4, 0X6D, 0, 0, 0, { 100, 74, 8, 0XFA00, { 0, 0X1, 0XF, 0, 0X6 }, 0XF, { 0X7B, 0X63, 0X64, 0X9E, 0X69, 0X92, 0X6F, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X58, 0X6A, 0X57, 0X32, 0, 0X58, 0X6F, 0XE3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X14, 0X7, 0X38, 0X39, 0X3A, 0X3B, 0X3C, 0X3D, 0X3E, 0X3F, 0X1, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0, 0X5, 0XF, 0XFF } }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } }, + { 0, 0, 4, 0XD, 0, 0, 0, { 40, 24, 8, 0X2000, { 0, 0X9, 0XF, 0, 0X6 }, 0X63, { 0X2D, 0X27, 0X28, 0X90, 0X2B, 0X80, 0XBF, 0X1F, 0, 0XC0, 0, 0, 0, 0, 0, 0, 0X9C, 0X6E, 0X8F, 0X14, 0, 0X96, 0XB9, 0XE3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X10, 0X11, 0X12, 0X13, 0X14, 0X15, 0X16, 0X17, 0X1, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0, 0X5, 0XF, 0XFF } }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } }, + { 0, 0, 4, 0XE, 0, 0, 0, { 80, 24, 8, 0X4000, { 0, 0X1, 0XF, 0, 0X6 }, 0X63, { 0X5F, 0X4F, 0X50, 0X82, 0X54, 0X80, 0XBF, 0X1F, 0, 0XC0, 0, 0, 0, 0, 0, 0, 0X9C, 0X6E, 0X8F, 0X28, 0, 0X96, 0XB9, 0XE3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X10, 0X11, 0X12, 0X13, 0X14, 0X15, 0X16, 0X17, 0X1, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0, 0X5, 0XF, 0XFF } }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } }, + { 0, 0, 0, 0XF, 0, 0, 0, { 80, 24, 14, 0X8000, { 0, 0X1, 0XF, 0, 0X6 }, 0XA2, { 0X5F, 0X4F, 0X50, 0X82, 0X54, 0X80, 0XBF, 0X1F, 0, 0X40, 0, 0, 0, 0, 0, 0, 0X83, 0X65, 0X5D, 0X28, 0XF, 0X63, 0XBA, 0XE3, 0XFF }, { 0, 0X8, 0, 0, 0X18, 0X18, 0, 0, 0, 0X8, 0, 0, 0, 0X18, 0, 0, 0XB, 0, 0X5, 0 }, { 0, 0, 0, 0, 0, 0, 0X5, 0X5, 0XFF } }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } }, + { 0, 0, 4, 0X10, 0, 0, 0, { 80, 24, 14, 0X8000, { 0, 0X1, 0XF, 0, 0X6 }, 0XA3, { 0X5F, 0X4F, 0X50, 0X82, 0X54, 0X80, 0XBF, 0X1F, 0, 0X40, 0, 0, 0, 0, 0, 0, 0X83, 0X65, 0X5D, 0X28, 0XF, 0X63, 0XBA, 0XE3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X14, 0X7, 0X38, 0X39, 0X3A, 0X3B, 0X3C, 0X3D, 0X3E, 0X3F, 0X1, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0, 0X5, 0XF, 0XFF } }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } }, + { 0, 0, 0, 0XF, 0, 0, 0, { 80, 24, 14, 0X8000, { 0, 0X1, 0XF, 0, 0X6 }, 0XA2, { 0X5F, 0X4F, 0X50, 0X82, 0X54, 0X80, 0XBF, 0X1F, 0, 0X40, 0, 0, 0, 0, 0, 0, 0X83, 0X65, 0X5D, 0X28, 0XF, 0X63, 0XBA, 0XE3, 0XFF }, { 0, 0X8, 0, 0, 0X18, 0X18, 0, 0, 0, 0X8, 0, 0, 0, 0X18, 0, 0, 0XB, 0, 0X5, 0 }, { 0, 0, 0, 0, 0, 0, 0X5, 0X5, 0XFF } }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } }, + { 0, 0, 4, 0X10, 0, 0, 0, { 80, 24, 14, 0X8000, { 0, 0X1, 0XF, 0, 0X6 }, 0XA3, { 0X5F, 0X4F, 0X50, 0X82, 0X54, 0X80, 0XBF, 0X1F, 0, 0X40, 0, 0, 0, 0, 0, 0, 0X83, 0X65, 0X5D, 0X28, 0XF, 0X63, 0XBA, 0XE3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X14, 0X7, 0X38, 0X39, 0X3A, 0X3B, 0X3C, 0X3D, 0X3E, 0X3F, 0X1, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0, 0X5, 0XF, 0XFF } }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } }, + { 0, 0, 4, 0, 0, 0, 0, { 40, 24, 14, 0X800, { 0, 0X9, 0X3, 0, 0X2 }, 0XA3, { 0X2D, 0X27, 0X28, 0X90, 0X2B, 0XA0, 0XBF, 0X1F, 0, 0X4D, 0XB, 0XC, 0, 0, 0, 0, 0X83, 0X65, 0X5D, 0X14, 0X1F, 0X63, 0XBA, 0XA3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X14, 0X7, 0X38, 0X39, 0X3A, 0X3B, 0X3C, 0X3D, 0X3E, 0X3F, 0X8, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X10, 0XE, 0, 0XFF } }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } }, + { 0, 0, 4, 0X1, 0, 0, 0, { 40, 24, 14, 0X800, { 0, 0X9, 0X3, 0, 0X2 }, 0XA3, { 0X2D, 0X27, 0X28, 0X90, 0X2B, 0XA0, 0XBF, 0X1F, 0, 0X4D, 0XB, 0XC, 0, 0, 0, 0, 0X83, 0X65, 0X5D, 0X14, 0X1F, 0X63, 0XBA, 0XA3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X14, 0X7, 0X38, 0X39, 0X3A, 0X3B, 0X3C, 0X3D, 0X3E, 0X3F, 0X8, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X10, 0XE, 0, 0XFF } }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } }, + { 0, 0, 4, 0X2, 0, 0, 0, { 80, 24, 14, 0X1000, { 0, 0X1, 0X3, 0, 0X2 }, 0XA3, { 0X5F, 0X4F, 0X50, 0X82, 0X55, 0X81, 0XBF, 0X1F, 0, 0X4D, 0XB, 0XC, 0, 0, 0, 0, 0X83, 0X65, 0X5D, 0X28, 0X1F, 0X63, 0XBA, 0XA3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X14, 0X7, 0X38, 0X39, 0X3A, 0X3B, 0X3C, 0X3D, 0X3E, 0X3F, 0X8, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X10, 0XE, 0, 0XFF } }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } }, + { 0, 0, 4, 0X3, 0, 0, 0, { 80, 24, 14, 0X1000, { 0, 0X1, 0X3, 0, 0X2 }, 0XA3, { 0X5F, 0X4F, 0X50, 0X82, 0X55, 0X81, 0XBF, 0X1F, 0, 0X4D, 0XB, 0XC, 0, 0, 0, 0, 0X83, 0X65, 0X5D, 0X28, 0X1F, 0X63, 0XBA, 0XA3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X14, 0X7, 0X38, 0X39, 0X3A, 0X3B, 0X3C, 0X3D, 0X3E, 0X3F, 0X8, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X10, 0XE, 0, 0XFF } }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } }, + { 0, 0, 4, 0, 0, 0, 0, { 40, 24, 16, 0X800, { 0, 0X8, 0X3, 0, 0X2 }, 0X67, { 0X2D, 0X27, 0X28, 0X90, 0X2B, 0XA0, 0XBF, 0X1F, 0, 0X4F, 0XD, 0XE, 0, 0, 0, 0, 0X9C, 0X6E, 0X8F, 0X14, 0X1F, 0X96, 0XB9, 0XA3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X14, 0X7, 0X38, 0X39, 0X3A, 0X3B, 0X3C, 0X3D, 0X3E, 0X3F, 0XC, 0, 0XF, 0X8 }, { 0, 0, 0, 0, 0, 0X10, 0XE, 0, 0XFF } }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } }, + { 0, 0, 4, 0X2, 0, 0, 0, { 80, 24, 16, 0X1000, { 0, 0, 0X3, 0, 0X2 }, 0X67, { 0X5F, 0X4F, 0X50, 0X82, 0X55, 0X81, 0XBF, 0X1F, 0, 0X4F, 0XD, 0XE, 0, 0, 0, 0, 0X9C, 0X6E, 0X8F, 0X28, 0X1F, 0X96, 0XB9, 0XA3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X14, 0X7, 0X38, 0X39, 0X3A, 0X3B, 0X3C, 0X3D, 0X3E, 0X3F, 0XC, 0, 0XF, 0X8 }, { 0, 0, 0, 0, 0, 0X10, 0XE, 0, 0XFF } }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } }, + { 0, 0, 0, 0X7, 0, 0, 0, { 80, 24, 16, 0X1000, { 0, 0, 0X3, 0, 0X2 }, 0X66, { 0X5F, 0X4F, 0X50, 0X82, 0X55, 0X81, 0XBF, 0X1F, 0, 0X4F, 0XD, 0XE, 0, 0, 0, 0, 0X9C, 0X6E, 0X8F, 0X28, 0XF, 0X96, 0XB9, 0XA3, 0XFF }, { 0, 0X8, 0X8, 0X8, 0X8, 0X8, 0X8, 0X8, 0X10, 0X18, 0X18, 0X18, 0X18, 0X18, 0X18, 0X18, 0XE, 0, 0XF, 0X8 }, { 0, 0, 0, 0, 0, 0X10, 0XA, 0, 0XFF } }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } }, + { 0, 0, 1, 0X11, 0, 0, 0, { 80, 29, 16, 0XA000, { 0, 0X1, 0XF, 0, 0X6 }, 0XE3, { 0X5F, 0X4F, 0X50, 0X82, 0X54, 0X80, 0XB, 0X3E, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XEA, 0X6C, 0XDF, 0X28, 0, 0XE7, 0X4, 0XC3, 0XFF }, { 0, 0X3F, 0X3F, 0X3F, 0X3F, 0X3F, 0X3F, 0X3F, 0X3F, 0X3F, 0X3F, 0X3F, 0X3F, 0X3F, 0X3F, 0X3F, 0X1, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0, 0X5, 0X1, 0XFF } }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } }, + { 0, 0, 4, 0X12, 0, 0, 0, { 80, 29, 16, 0XA000, { 0, 0X1, 0XF, 0, 0X6 }, 0XE3, { 0X5F, 0X4F, 0X50, 0X82, 0X54, 0X80, 0XB, 0X3E, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XEA, 0X6C, 0XDF, 0X28, 0, 0XE7, 0X4, 0XE3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X14, 0X7, 0X38, 0X39, 0X3A, 0X3B, 0X3C, 0X3D, 0X3E, 0X3F, 0X1, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0, 0X5, 0XF, 0XFF } }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } }, + { 0, 0, 8, 0X13, 0, 0, 0, { 40, 24, 8, 0X2000, { 0, 0X1, 0XF, 0, 0XE }, 0X63, { 0X5F, 0X4F, 0X50, 0X82, 0X54, 0X80, 0XBF, 0X1F, 0, 0X41, 0, 0, 0, 0, 0, 0, 0X9C, 0X6E, 0X8F, 0X28, 0X40, 0X96, 0XB9, 0XA3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } }, + { 0, 0, 4, 0X28, 1, 0X432E, 0X8638, { 80, 59, 8, 0X2580, { 0, 0, 0X3, 0, 0X2 }, 0X67, { 0X5F, 0X4F, 0X50, 0X82, 0X55, 0X9E, 0XB, 0X3E, 0, 0X47, 0X6, 0X7, 0, 0, 0, 0, 0XEA, 0X60, 0XDF, 0X28, 0X1F, 0XE7, 0X9, 0X23, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X14, 0X7, 0X38, 0X39, 0X3A, 0X3B, 0X3C, 0X3D, 0X3E, 0X3F, 0XC, 0, 0XF, 0X8 }, { 0, 0, 0, 0, 0, 0X10, 0XE, 0, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X1A, 0X1C, 0X1D, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XFD, 0XFF, 0X3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0X58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 4 } }, + { 0, 0, 4, 0X29, 1, 0X432E, 0XC46E, { 132, 24, 16, 0X19C8, { 0, 0, 0X3, 0, 0X2 }, 0X67, { 0XA7, 0X83, 0X84, 0X82, 0X8E, 0X9B, 0XBF, 0X1F, 0, 0X4F, 0XD, 0XE, 0, 0, 0, 0, 0X9C, 0X6E, 0X8F, 0X42, 0X1F, 0X96, 0XB9, 0X23, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X14, 0X7, 0X38, 0X39, 0X3A, 0X3B, 0X3C, 0X3D, 0X3E, 0X3F, 0XC, 0, 0XF, 0X8 }, { 0, 0, 0, 0, 0, 0X10, 0XE, 0, 0XFF } }, { { 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 } }, + { 0, 0, 4, 0X2A, 1, 0X432E, 0XC46E, { 132, 42, 8, 0X2C58, { 0, 0, 0X3, 0, 0X2 }, 0X67, { 0XA7, 0X83, 0X84, 0X82, 0X8E, 0X9B, 0XBF, 0X1F, 0, 0X47, 0X6, 0X7, 0, 0, 0, 0, 0X83, 0X65, 0X57, 0X42, 0X1F, 0X63, 0XBA, 0X23, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X14, 0X7, 0X38, 0X39, 0X3A, 0X3B, 0X3C, 0X3D, 0X3E, 0X3F, 0XC, 0, 0XF, 0X8 }, { 0, 0, 0, 0, 0, 0X10, 0XE, 0, 0XFF } }, { { 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 } }, + { 0, 0, 4, 0X2B, 1, 0X432E, 0XC46E, { 132, 49, 8, 0X3390, { 0, 0, 0X3, 0, 0X2 }, 0X67, { 0XA7, 0X83, 0X84, 0X82, 0X8E, 0X9B, 0XBF, 0X1F, 0, 0X47, 0X6, 0X7, 0, 0, 0, 0, 0X9C, 0X6E, 0X8F, 0X42, 0X1F, 0X96, 0XB9, 0X23, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X14, 0X7, 0X38, 0X39, 0X3A, 0X3B, 0X3C, 0X3D, 0X3E, 0X3F, 0XC, 0, 0XF, 0X8 }, { 0, 0, 0, 0, 0, 0X10, 0XE, 0, 0XFF } }, { { 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 } }, + { 0, 0, 4, 0X2C, 1, 0X432E, 0XC47F, { 132, 59, 8, 0X3DE0, { 0, 0, 0X3, 0, 0X2 }, 0X67, { 0XA7, 0X83, 0X84, 0X82, 0X8E, 0X9B, 0XB, 0X3E, 0, 0X47, 0X6, 0X7, 0, 0, 0, 0, 0XEA, 0X6C, 0XDF, 0X42, 0X1F, 0XE7, 0X5, 0X23, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X14, 0X7, 0X38, 0X39, 0X3A, 0X3B, 0X3C, 0X3D, 0X3E, 0X3F, 0XC, 0, 0XF, 0X8 }, { 0, 0, 0, 0, 0, 0X10, 0XE, 0, 0XFF } }, { { 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 } }, + { 640, 400, 16, 0X2E, 8, 0X432E, 0X86B1, { 80, 24, 16, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0X4F, { 0X61, 0X4F, 0X4F, 0X85, 0X53, 0X9B, 0XA3, 0X1F, 0, 0X40, 0X1E, 0, 0, 0, 0, 0, 0X90, 0X63, 0X8F, 0XA0, 0X40, 0X8F, 0XA4, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XB6, 0X26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 } }, + { 640, 400, 32, 0X2F, 16, 0X432E, 0X86B1, { 80, 24, 16, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0X4F, { 0X61, 0X4F, 0X4F, 0X85, 0X53, 0X9B, 0XA3, 0X1F, 0, 0X40, 0X1E, 0, 0, 0, 0, 0, 0X90, 0X63, 0X8F, 0X40, 0X40, 0X8F, 0XA4, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X27, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAE, 0X26, 0X20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 3 } }, + { 640, 400, 8, 0X30, 4, 0X432E, 0X86B1, { 80, 24, 16, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0X4F, { 0X61, 0X4F, 0X4F, 0X85, 0X53, 0X9B, 0XA3, 0X1F, 0, 0X40, 0X1E, 0, 0, 0, 0, 0, 0X90, 0X63, 0X8F, 0X50, 0X40, 0X8F, 0XA4, 0X23, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X22, 0X26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 } }, + { 640, 480, 8, 0X31, 5, 0X432E, 0XC763, { 80, 29, 16, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0XCF, { 0X5F, 0X4F, 0X50, 0X82, 0X52, 0X9E, 0XB, 0X3E, 0, 0X40, 0X1E, 0, 0, 0, 0, 0, 0XE9, 0XB, 0XDF, 0X50, 0X40, 0XE7, 0X4, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X22, 0X26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 } }, + { 640, 480, 16, 0X33, 10, 0X432E, 0XC763, { 80, 29, 16, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0XCF, { 0X5F, 0X4F, 0X50, 0X82, 0X52, 0X9E, 0XB, 0X3E, 0, 0X40, 0X1E, 0, 0, 0, 0, 0, 0XE9, 0XB, 0XDF, 0XA0, 0X40, 0XE7, 0X4, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XB6, 0X26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 } }, + { 640, 480, 32, 0X34, 20, 0X432E, 0XC763, { 80, 29, 16, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0XCF, { 0X5F, 0X4F, 0X50, 0X82, 0X52, 0X9E, 0XB, 0X3E, 0, 0X40, 0X1E, 0, 0, 0, 0, 0, 0XE9, 0XB, 0XDF, 0X40, 0X40, 0XE7, 0X4, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X27, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAE, 0X26, 0X20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 3 } }, + { 800, 600, 4, 0X35, 16, 0X432E, 0XC459, { 100, 74, 8, 0XFA00, { 0, 0X1, 0XF, 0, 0X6 }, 0XF, { 0X7F, 0X63, 0X63, 0X83, 0X69, 0X19, 0X72, 0XF0, 0, 0X60, 0X1E, 0, 0, 0, 0, 0, 0X58, 0XC, 0X57, 0X32, 0, 0X57, 0X73, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X14, 0X7, 0X38, 0X39, 0X3A, 0X3B, 0X3C, 0X3D, 0X3E, 0X3F, 0X1, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X20, 0X6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 } }, + { 800, 600, 8, 0X36, 8, 0X432E, 0XC459, { 100, 74, 8, 0XFA00, { 0, 0X1, 0XF, 0X3, 0XE }, 0XF, { 0X7F, 0X63, 0X63, 0X83, 0X69, 0X19, 0X72, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X58, 0XC, 0X57, 0X64, 0, 0X57, 0X73, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X22, 0X6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 } }, + { 800, 600, 16, 0X38, 16, 0X432E, 0XC459, { 100, 74, 8, 0XFA00, { 0, 0X1, 0XF, 0X3, 0XE }, 0XF, { 0X7F, 0X63, 0X63, 0X83, 0X69, 0X19, 0X72, 0XF0, 0, 0X60, 0X1E, 0, 0, 0, 0, 0, 0X58, 0XC, 0X57, 0XC8, 0, 0X57, 0X73, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XB6, 0X6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 } }, + { 800, 600, 32, 0X39, 32, 0X432E, 0XC459, { 100, 74, 8, 0XFA00, { 0, 0X1, 0XF, 0X3, 0XE }, 0XF, { 0X7F, 0X63, 0X63, 0X83, 0X69, 0X19, 0X72, 0XF0, 0, 0X60, 0X1E, 0, 0, 0, 0, 0, 0X58, 0XC, 0X57, 0X90, 0, 0X57, 0X73, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X7, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAE, 0X6, 0X20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 3 } }, + { 1024, 768, 4, 0X3A, 24, 0X432E, 0X86ED, { 128, 47, 16, 0X8000, { 0, 0X1, 0XF, 0, 0X6 }, 0XCF, { 0XA3, 0X7F, 0X7F, 0X87, 0X83, 0X94, 0X24, 0XF5, 0, 0X60, 0X1E, 0, 0, 0, 0, 0, 0X2, 0X8, 0XFF, 0X40, 0, 0XFF, 0X25, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X14, 0X7, 0X38, 0X39, 0X3A, 0X3B, 0X3C, 0X3D, 0X3E, 0X3F, 0X1, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X20, 0XC, 0X1F, 0X4C, 0X6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5 } }, + { 1024, 768, 8, 0X3B, 12, 0X432E, 0X86ED, { 128, 47, 16, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0XCF, { 0XA3, 0X7F, 0X7F, 0X87, 0X83, 0X94, 0X24, 0XF5, 0, 0X60, 0X1E, 0, 0, 0, 0, 0, 0X2, 0X8, 0XFF, 0X80, 0, 0XFF, 0X25, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X22, 0XC, 0X1F, 0X4C, 0X6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5 } }, + { 1024, 768, 16, 0X3D, 24, 0X432E, 0X86ED, { 128, 47, 16, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0XCF, { 0XA3, 0X7F, 0X7F, 0X87, 0X83, 0X94, 0X24, 0XF5, 0, 0X60, 0X1E, 0, 0, 0, 0, 0, 0X2, 0X8, 0XFF, 0, 0, 0XFF, 0X25, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X7, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XB6, 0XC, 0X1F, 0X4C, 0X6, 0X20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 } }, + { 1024, 768, 32, 0X3E, 48, 0X432E, 0X86ED, { 128, 47, 16, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0XCF, { 0XA3, 0X7F, 0X7F, 0X87, 0X83, 0X94, 0X24, 0XF5, 0, 0X60, 0X1E, 0, 0, 0, 0, 0, 0X2, 0X8, 0XFF, 0, 0, 0XFF, 0X25, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X7, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAE, 0XC, 0X1F, 0X4C, 0X6, 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 } }, + { 1152, 864, 8, 0X40, 16, 0X432E, 0X45B9, { 144, 53, 16, 0XFFFF, { 0, 0X1, 0XF, 0, 0XE }, 0XF, { 0XB9, 0X8F, 0X8F, 0X9D, 0X98, 0X87, 0X7D, 0XFF, 0, 0X60, 0X1E, 0, 0, 0, 0, 0, 0X60, 0X3, 0X5F, 0X90, 0, 0X5F, 0X7E, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X1, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X22, 0XC, 0X1F, 0X4C, 0X6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5 } }, + { 1152, 864, 16, 0X42, 32, 0X432E, 0X45B9, { 144, 53, 16, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0XF, { 0XB9, 0X8F, 0X8F, 0X9D, 0X98, 0X87, 0X7D, 0XFF, 0, 0X60, 0X1E, 0, 0, 0, 0, 0, 0X60, 0X3, 0X5F, 0X20, 0, 0X5F, 0X7E, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X7, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XB6, 0XC, 0X1F, 0X4C, 0X6, 0X20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 } }, + { 1152, 864, 32, 0X43, 64, 0X432E, 0X45B9, { 144, 53, 16, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0XF, { 0XB9, 0X8F, 0X8F, 0X9D, 0X98, 0X87, 0X7D, 0XFF, 0, 0X60, 0X1E, 0, 0, 0, 0, 0, 0X60, 0X3, 0X5F, 0X40, 0, 0X5F, 0X7E, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X7, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAE, 0XC, 0X1F, 0X4C, 0X6, 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 } }, + { 1280, 1024, 4, 0X44, 40, 0X432E, 0X8479, { 160, 63, 16, 0X8000, { 0, 0X1, 0XF, 0, 0X6 }, 0XF, { 0XCE, 0X9F, 0X9F, 0X92, 0XA6, 0X14, 0X28, 0X5A, 0, 0X60, 0X1E, 0, 0, 0, 0, 0, 0, 0X3, 0XFF, 0X50, 0, 0XFF, 0X29, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X14, 0X7, 0X38, 0X39, 0X3A, 0X3B, 0X3C, 0X3D, 0X3E, 0X3F, 0X1, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X27, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X20, 0XC, 0X1F, 0X4C, 0X26, 0X13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 } }, + { 1280, 1024, 8, 0X45, 20, 0X432E, 0X8479, { 160, 63, 16, 0XFFFF, { 0, 0X1, 0XF, 0, 0XE }, 0XF, { 0XCE, 0X9F, 0X9F, 0X92, 0XA6, 0X14, 0X28, 0X5A, 0, 0X60, 0X1E, 0, 0, 0, 0, 0, 0, 0X3, 0XFF, 0XA0, 0, 0XFF, 0X29, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X1, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X27, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X22, 0XC, 0X1F, 0X4C, 0X26, 0X13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 } }, + { 1280, 1024, 16, 0X47, 40, 0X432E, 0X8479, { 160, 63, 16, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0XF, { 0XCE, 0X9F, 0X9F, 0X92, 0XA6, 0X14, 0X28, 0X5A, 0, 0X60, 0X1E, 0, 0, 0, 0, 0, 0, 0X3, 0XFF, 0X40, 0, 0XFF, 0X29, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X27, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XB6, 0XC, 0X1F, 0X4C, 0X26, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 } }, + { 1280, 1024, 32, 0X48, 80, 0X432E, 0X8479, { 160, 63, 16, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0XF, { 0XCE, 0X9F, 0X9F, 0X92, 0XA6, 0X14, 0X28, 0X4A, 0, 0X20, 0X1E, 0, 0, 0, 0, 0, 0, 0X3, 0XFF, 0X80, 0, 0XFF, 0X29, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X27, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAE, 0XC, 0X1F, 0X4C, 0X26, 0X53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 } }, + { 1600, 1200, 8, 0X4A, 30, 0X432E, 0X4571, { 200, 74, 16, 0XFFFF, { 0, 0X1, 0XF, 0, 0XE }, 0XF, { 0X9, 0XC7, 0XC7, 0X8D, 0XD0, 0X8, 0XE0, 0X10, 0, 0X40, 0X1E, 0, 0, 0, 0, 0, 0XB0, 0X3, 0XAF, 0XC8, 0, 0XAF, 0XE1, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X1, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X7, 0XFF, 0X8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X22, 0XF, 0X1F, 0X4F, 0X6, 0X1F, 0X8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7 } }, + { 1600, 1200, 16, 0X4C, 60, 0X432E, 0X4571, { 200, 74, 16, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0XF, { 0X9, 0XC7, 0XC7, 0X8D, 0XD0, 0X8, 0XE0, 0X10, 0, 0X40, 0X1E, 0, 0, 0, 0, 0, 0XB0, 0X3, 0XAF, 0X90, 0, 0XAF, 0XE1, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X7, 0XFF, 0X8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XB6, 0XF, 0X1F, 0X4F, 0X6, 0X3F, 0X8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7 } }, + { 1600, 1200, 32, 0X4D, 120, 0X432E, 0X4571, { 200, 74, 16, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0XF, { 0X9, 0XC7, 0XC7, 0X8D, 0XD0, 0X8, 0XE0, 0X10, 0, 0X40, 0X1E, 0, 0, 0, 0, 0, 0XB0, 0X3, 0XAF, 0X20, 0, 0XAF, 0XE1, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X7, 0XFF, 0X8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAE, 0XF, 0X1F, 0X4F, 0X6, 0X7F, 0X8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7 } }, + { 1280, 768, 8, 0X54, 15, 0X432E, 0X622, { 160, 47, 16, 0XFFFF, { 0, 0X1, 0XF, 0, 0XE }, 0X8F, { 0XCE, 0X9F, 0X9F, 0X92, 0XA6, 0X14, 0X20, 0XE5, 0, 0X20, 0X1E, 0, 0, 0, 0, 0, 0X2, 0X8, 0XFF, 0XA0, 0, 0XFF, 0X21, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X1, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X27, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X22, 0XC, 0X1F, 0X4C, 0X26, 0X10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 } }, + { 1280, 768, 16, 0X56, 30, 0X432E, 0X622, { 160, 47, 16, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0X8F, { 0XCE, 0X9F, 0X9F, 0X92, 0XA6, 0X14, 0X20, 0XE5, 0, 0X20, 0X1E, 0, 0, 0, 0, 0, 0X2, 0X8, 0XFF, 0X40, 0, 0XFF, 0X21, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X27, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XB6, 0XC, 0X1F, 0X4C, 0X26, 0X30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 } }, + { 1280, 768, 32, 0X57, 60, 0X432E, 0X622, { 160, 47, 16, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0X8F, { 0XCE, 0X9F, 0X9F, 0X92, 0XA6, 0X14, 0X20, 0XE5, 0, 0X20, 0X1E, 0, 0, 0, 0, 0, 0X2, 0X8, 0XFF, 0X80, 0, 0XFF, 0X21, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X27, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAE, 0XC, 0X1F, 0X4C, 0X26, 0X50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 } }, + { 1280, 960, 8, 0X58, 19, 0X432E, 0X8479, { 160, 59, 16, 0XFFFF, { 0, 0X1, 0XF, 0, 0XE }, 0XF, { 0XDC, 0X9F, 0X9F, 0X80, 0XAC, 0X9A, 0XE6, 0XEF, 0, 0X20, 0X1E, 0, 0, 0, 0, 0, 0XC0, 0X3, 0XBF, 0XA0, 0, 0XBF, 0XE7, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X1, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X27, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X22, 0XC, 0X1F, 0X4C, 0X26, 0X10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 } }, + { 1280, 960, 16, 0X5A, 38, 0X432E, 0X8479, { 160, 59, 16, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0XF, { 0XDC, 0X9F, 0X9F, 0X80, 0XAC, 0X9A, 0XE6, 0XEF, 0, 0X20, 0X1E, 0, 0, 0, 0, 0, 0XC0, 0X3, 0XBF, 0X40, 0, 0XBF, 0XE7, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X27, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XB6, 0XC, 0X1F, 0X4C, 0X26, 0X30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 } }, + { 1280, 960, 32, 0X5B, 76, 0X432E, 0X8479, { 160, 59, 16, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0XF, { 0XDC, 0X9F, 0X9F, 0X80, 0XAC, 0X9A, 0XE6, 0XEF, 0, 0X20, 0X1E, 0, 0, 0, 0, 0, 0XC0, 0X3, 0XBF, 0X80, 0, 0XBF, 0XE7, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X27, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAE, 0XC, 0X1F, 0X4C, 0X26, 0X50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 } }, + { 848, 480, 8, 0X63, 7, 0X432E, 0X4721, { 106, 29, 16, 0XFFFF, { 0, 0X1, 0XF, 0, 0XE }, 0XF, { 0X83, 0X69, 0X69, 0X7, 0X6C, 0X1A, 0X3, 0X3E, 0, 0X40, 0X1E, 0, 0, 0, 0, 0, 0XE5, 0XD, 0XDF, 0X6A, 0, 0XDF, 0X4, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X22, 0X6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 } }, + { 848, 480, 16, 0X64, 13, 0X432E, 0X4721, { 106, 29, 16, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0XF, { 0X83, 0X69, 0X69, 0X7, 0X6C, 0X1A, 0X3, 0X3E, 0, 0X40, 0X1E, 0, 0, 0, 0, 0, 0XE5, 0XD, 0XDF, 0XD4, 0, 0XDF, 0X4, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XB6, 0X6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 } }, + { 848, 480, 32, 0X65, 25, 0X432E, 0X4721, { 106, 29, 16, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0XF, { 0X83, 0X69, 0X69, 0X7, 0X6C, 0X1A, 0X3, 0X3E, 0, 0X40, 0X1E, 0, 0, 0, 0, 0, 0XE5, 0XD, 0XDF, 0XA8, 0, 0XDF, 0X4, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X7, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAE, 0X6, 0X20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 3 } }, + { 1400, 1050, 8, 0X66, 25, 0X432E, 0X73C, { 175, 74, 14, 0XFFFF, { 0, 0X1, 0XF, 0, 0XE }, 0X4F, { 0XE6, 0XAE, 0XAE, 0X8A, 0XBA, 0X8D, 0X3D, 0X10, 0, 0, 0X1E, 0, 0, 0, 0, 0, 0X1A, 0XD, 0X19, 0XAF, 0, 0X19, 0X3E, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X1, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X27, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X22, 0XC, 0X1F, 0X4C, 0X26, 0X1F, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 } }, + { 1400, 1050, 16, 0X67, 50, 0X432E, 0X73C, { 175, 74, 14, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0X4F, { 0XE6, 0XAE, 0XAE, 0X8A, 0XBA, 0X8D, 0X3D, 0, 0, 0, 0X1E, 0, 0, 0, 0, 0, 0X1A, 0XD, 0X19, 0X5E, 0, 0X19, 0X3E, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X27, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XB6, 0XC, 0X1F, 0X4C, 0X26, 0X3F, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 } }, + { 1400, 1050, 32, 0X68, 100, 0X432E, 0X73C, { 175, 74, 14, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0X4F, { 0XE6, 0XAE, 0XAE, 0X8A, 0XBA, 0X8D, 0X3D, 0, 0, 0, 0X1E, 0, 0, 0, 0, 0, 0X1A, 0XD, 0X19, 0XBC, 0, 0X19, 0X3E, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X27, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAE, 0XC, 0X1F, 0X4C, 0X26, 0X5F, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 } }, + { 720, 480, 8, 0X70, 6, 0X432E, 0X471A, { 90, 29, 16, 0XFFFF, { 0, 0X1, 0XF, 0X3, 0XE }, 0X4F, { 0X6B, 0X59, 0X59, 0X8F, 0X5C, 0X85, 0XEF, 0X1F, 0, 0X40, 0X1E, 0, 0, 0, 0, 0, 0XE0, 0X3, 0XDF, 0X5A, 0, 0XDF, 0XF0, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X22, 0X26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 } }, + { 720, 480, 16, 0X71, 12, 0X432E, 0X471A, { 90, 29, 16, 0X8000, { 0, 0X1, 0XF, 0X3, 0XE }, 0X4F, { 0X6B, 0X59, 0X59, 0X8F, 0X5C, 0X85, 0XEF, 0X1F, 0, 0X40, 0X1E, 0, 0, 0, 0, 0, 0XE0, 0X3, 0XDF, 0XB4, 0, 0XDF, 0XF0, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XB6, 0X26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 } }, + { 720, 480, 32, 0X72, 24, 0X432E, 0X471A, { 90, 29, 16, 0X8000, { 0, 0X1, 0XF, 0X3, 0XE }, 0X4F, { 0X6B, 0X59, 0X59, 0X8F, 0X5C, 0X85, 0XEF, 0X1F, 0, 0X40, 0X1E, 0, 0, 0, 0, 0, 0XE0, 0X3, 0XDF, 0X68, 0, 0XDF, 0XF0, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X27, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAE, 0X26, 0X20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 3 } }, + { 720, 576, 8, 0X73, 7, 0X432E, 0XC449, { 90, 35, 16, 0XFFFF, { 0, 0X1, 0XF, 0X3, 0XE }, 0X4F, { 0X6D, 0X59, 0X59, 0X91, 0X5D, 0X86, 0X53, 0XF0, 0, 0X60, 0X1E, 0, 0, 0, 0, 0, 0X40, 0X3, 0X3F, 0X5A, 0, 0X3F, 0X54, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X22, 0X26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 } }, + { 720, 576, 16, 0X74, 14, 0X432E, 0XC449, { 90, 35, 16, 0X8000, { 0, 0X1, 0XF, 0X3, 0XE }, 0X4F, { 0X6D, 0X59, 0X59, 0X91, 0X5D, 0X86, 0X53, 0XF0, 0, 0X60, 0X1E, 0, 0, 0, 0, 0, 0X40, 0X3, 0X3F, 0XB4, 0, 0X3F, 0X54, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XB6, 0X26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 } }, + { 720, 576, 32, 0X75, 28, 0X432E, 0XC449, { 90, 35, 16, 0X8000, { 0, 0X1, 0XF, 0X3, 0XE }, 0X4F, { 0X6D, 0X59, 0X59, 0X91, 0X5D, 0X86, 0X53, 0XF0, 0, 0X60, 0X1E, 0, 0, 0, 0, 0, 0X40, 0X3, 0X3F, 0X68, 0, 0X3F, 0X54, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X27, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAE, 0X26, 0X20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 3 } }, + { 1024, 512, 8, 0X76, 8, 0X432E, 0X4417, { 128, 31, 16, 0XFFFF, { 0, 0X1, 0XF, 0X3, 0XE }, 0X4F, { 0X9D, 0X7F, 0X7F, 0X81, 0X84, 0X91, 0X11, 0XBA, 0, 0X40, 0X1E, 0, 0, 0, 0, 0, 0, 0X3, 0XFF, 0X80, 0, 0XFF, 0X12, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X22, 0XC, 0X1F, 0X4C, 0X6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5 } }, + { 1024, 512, 16, 0X77, 16, 0X432E, 0X4417, { 128, 31, 16, 0X8000, { 0, 0X1, 0XF, 0X3, 0XE }, 0X4F, { 0X9D, 0X7F, 0X7F, 0X81, 0X84, 0X91, 0X11, 0XBA, 0, 0X40, 0X1E, 0, 0, 0, 0, 0, 0, 0X3, 0XFF, 0, 0, 0XFF, 0X12, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X7, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XB6, 0XC, 0X1F, 0X4C, 0X6, 0X20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 } }, + { 1024, 512, 32, 0X78, 32, 0X432E, 0X4417, { 128, 31, 16, 0X8000, { 0, 0X1, 0XF, 0X3, 0XE }, 0X4F, { 0X9D, 0X7F, 0X7F, 0X81, 0X84, 0X91, 0X11, 0XBA, 0, 0X40, 0X1E, 0, 0, 0, 0, 0, 0, 0X3, 0XFF, 0, 0, 0XFF, 0X12, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X7, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAE, 0XC, 0X1F, 0X4C, 0X6, 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 } }, + { 856, 480, 8, 0X79, 7, 0X432E, 0X471F, { 107, 29, 16, 0XFFFF, { 0, 0X1, 0XF, 0, 0XE }, 0X4F, { 0X80, 0X6A, 0X6A, 0X84, 0X6D, 0X18, 0XEF, 0X1F, 0, 0X40, 0X1E, 0, 0, 0, 0, 0, 0XE0, 0X3, 0XDF, 0X6B, 0, 0XDF, 0XF0, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X22, 0X6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 } }, + { 856, 480, 16, 0X7A, 14, 0X432E, 0X471F, { 107, 29, 16, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0X4F, { 0X80, 0X6A, 0X6A, 0X84, 0X6D, 0X18, 0XEF, 0X1F, 0, 0X40, 0X1E, 0, 0, 0, 0, 0, 0XE0, 0X3, 0XDF, 0XD6, 0, 0XDF, 0XF0, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XB6, 0X6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 } }, + { 856, 480, 32, 0X7B, 28, 0X432E, 0X471F, { 107, 29, 16, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0X4F, { 0X80, 0X6A, 0X6A, 0X84, 0X6D, 0X18, 0XEF, 0X1F, 0, 0X40, 0X1E, 0, 0, 0, 0, 0, 0XE0, 0X3, 0XDF, 0XAA, 0, 0XDF, 0XF0, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X7, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAE, 0X6, 0X20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 3 } }, + { 320, 200, 8, 0X5C, 1, 0X432E, 0XC6B2, { 40, 24, 8, 0XFFFF, { 0, 0X1, 0XF, 0, 0XE }, 0X4F, { 0X2F, 0X27, 0X27, 0X93, 0X2A, 0X8E, 0XA3, 0X1F, 0, 0XC0, 0X1E, 0, 0, 0, 0, 0, 0X90, 0X3, 0X8F, 0X28, 0, 0X8F, 0XA4, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X22, 0X6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 } }, + { 320, 200, 16, 0X5D, 2, 0X432E, 0XC6B2, { 40, 24, 8, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0X4F, { 0X2F, 0X27, 0X27, 0X93, 0X2A, 0X8E, 0XA3, 0X1F, 0, 0XC0, 0X1E, 0, 0, 0, 0, 0, 0X90, 0X3, 0X8F, 0X50, 0, 0X8F, 0XA4, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XB6, 0X6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 } }, + { 320, 200, 32, 0X5E, 4, 0X432E, 0XC6B2, { 40, 24, 8, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0X4F, { 0X2F, 0X27, 0X27, 0X93, 0X2A, 0X8E, 0XA3, 0X1F, 0, 0XC0, 0X1E, 0, 0, 0, 0, 0, 0X90, 0X3, 0X8F, 0XA0, 0, 0X8F, 0XA4, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X7, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAE, 0X6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 3 } }, + { 320, 240, 8, 0X7C, 2, 0X432E, 0XC746, { 40, 29, 8, 0XFFFF, { 0, 0X1, 0XF, 0, 0XE }, 0X4F, { 0X2F, 0X27, 0X27, 0X93, 0X2A, 0X8E, 0XF7, 0X1F, 0, 0XC0, 0X1E, 0, 0, 0, 0, 0, 0XE0, 0X3, 0XDF, 0X28, 0, 0XDF, 0XF8, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X22, 0X6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 } }, + { 320, 240, 16, 0X7D, 3, 0X432E, 0XC746, { 40, 29, 8, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0X4F, { 0X2F, 0X27, 0X27, 0X93, 0X2A, 0X8E, 0XF7, 0X1F, 0, 0XC0, 0X1E, 0, 0, 0, 0, 0, 0XE0, 0X3, 0XDF, 0X50, 0, 0XDF, 0XF8, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XB6, 0X6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 } }, + { 320, 240, 32, 0X7E, 5, 0X432E, 0XC746, { 40, 29, 8, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0X4F, { 0X2F, 0X27, 0X27, 0X93, 0X2A, 0X8E, 0XF7, 0X1F, 0, 0XC0, 0X1E, 0, 0, 0, 0, 0, 0XE0, 0X3, 0XDF, 0XA0, 0, 0XDF, 0XF8, 0X63, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X7, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAE, 0X6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 3 } }, + { 400, 300, 8, 0X22, 2, 0X432E, 0XC54F, { 50, 36, 8, 0XFFFF, { 0, 0X1, 0XF, 0, 0XE }, 0X4F, { 0X3D, 0X31, 0X31, 0X81, 0X35, 0X1A, 0X74, 0XF0, 0, 0XE0, 0X1E, 0, 0, 0, 0, 0, 0X58, 0XB, 0X57, 0X32, 0X40, 0X57, 0X75, 0XE3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X22, 0X26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 } }, + { 400, 300, 16, 0X23, 4, 0X432E, 0XC54F, { 50, 36, 8, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0X4F, { 0X3D, 0X31, 0X31, 0X81, 0X35, 0X1A, 0X74, 0XF0, 0, 0XE0, 0X1E, 0, 0, 0, 0, 0, 0X58, 0XB, 0X57, 0X64, 0X40, 0X57, 0X75, 0XE3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XB6, 0X26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 } }, + { 400, 300, 32, 0X24, 8, 0X432E, 0XC54F, { 50, 36, 8, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0X4F, { 0X3D, 0X31, 0X31, 0X81, 0X35, 0X1A, 0X74, 0XF0, 0, 0XE0, 0X1E, 0, 0, 0, 0, 0, 0X58, 0XB, 0X57, 0XC8, 0X40, 0X57, 0X75, 0XE3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X27, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAE, 0X26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 3 } }, + { 512, 384, 8, 0X25, 3, 0X432E, 0XC53F, { 64, 47, 8, 0XFFFF, { 0, 0X1, 0XF, 0, 0XE }, 0X4F, { 0X4D, 0X3F, 0X3F, 0X91, 0X42, 0X9, 0X92, 0X1F, 0, 0X40, 0X1E, 0, 0, 0, 0, 0, 0X80, 0X3, 0X7F, 0X40, 0X40, 0X7F, 0X93, 0XE3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X22, 0X26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 } }, + { 512, 384, 16, 0X26, 6, 0X432E, 0XC53F, { 64, 47, 8, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0X4F, { 0X4D, 0X3F, 0X3F, 0X91, 0X42, 0X9, 0X92, 0X1F, 0, 0X40, 0X1E, 0, 0, 0, 0, 0, 0X80, 0X3, 0X7F, 0X80, 0X40, 0X7F, 0X93, 0XE3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XB6, 0X26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 } }, + { 512, 384, 32, 0X27, 12, 0X432E, 0XC53F, { 64, 47, 8, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0X4F, { 0X4D, 0X3F, 0X3F, 0X91, 0X42, 0X9, 0X92, 0X1F, 0, 0X40, 0X1E, 0, 0, 0, 0, 0, 0X80, 0X3, 0X7F, 0, 0X40, 0X7F, 0X93, 0XE3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X27, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAE, 0X26, 0X20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 3 } }, + { 1024, 576, 8, 0X14, 9, 0X432E, 0XC4E9, { 128, 35, 16, 0XFFFF, { 0, 0X1, 0XF, 0X3, 0XE }, 0X4F, { 0X9F, 0X7F, 0X7F, 0X83, 0X85, 0X92, 0X53, 0XF0, 0, 0X60, 0X1E, 0, 0, 0, 0, 0, 0X40, 0X3, 0X3F, 0X80, 0, 0X3F, 0X54, 0XE3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X22, 0XC, 0X1F, 0X4C, 0X6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5 } }, + { 1024, 576, 16, 0X15, 18, 0X432E, 0XC4E9, { 128, 35, 16, 0X8000, { 0, 0X1, 0XF, 0X3, 0XE }, 0X4F, { 0X9F, 0X7F, 0X7F, 0X83, 0X85, 0X92, 0X53, 0XF0, 0, 0X60, 0X1E, 0, 0, 0, 0, 0, 0X40, 0X3, 0X3F, 0, 0, 0X3F, 0X54, 0XE3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X7, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XB6, 0XC, 0X1F, 0X4C, 0X6, 0X20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 } }, + { 1024, 576, 32, 0X16, 36, 0X432E, 0XC4E9, { 128, 35, 16, 0X8000, { 0, 0X1, 0XF, 0X3, 0XE }, 0X4F, { 0X9F, 0X7F, 0X7F, 0X83, 0X85, 0X92, 0X53, 0XF0, 0, 0X60, 0X1E, 0, 0, 0, 0, 0, 0X40, 0X3, 0X3F, 0, 0, 0X3F, 0X54, 0XE3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X7, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAE, 0XC, 0X1F, 0X4C, 0X6, 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 } } +}; + +static const VIABIOSRegTableRec commExtTable = { + { 0XC4, 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XCE, 0XCE, 0XCE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X1A, 0X32, 0X33, 0X34, 0X35, 0X36, 0X20, 0X21, 0X22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X2, 0XBF, 0XFF, 0XFF, 0XFD, 0XFF, 0XFF, 0XFF, 0XFF, 0X8, 0XFF, 0XFF, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X2, 0X8, 0X1F, 0X4E, 0X8, 0, 0X6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 13 }; + +static const VIABIOSRegTableRec stdModeExtTable = { + { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X1A, 0X1C, 0X1D, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XFD, 0XFF, 0X3, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0X58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5 }; + +static const VIABIOSRefreshTableRec refreshTable[17][5] = { + { + { 75, 0XC3B5, { 0X64, 0X4F, 0X88, 0X52, 0X9A, 0XF2, 0X1F, 0XE0, 0X3, 0XDF, 0XF3, 0, 0, 0 } }, + { 85, 0XC5E5, { 0X63, 0X4F, 0X87, 0X57, 0X9E, 0XFB, 0X1F, 0XE0, 0X3, 0XDF, 0XFC, 0, 0, 0 } }, + { 100, 0XC579, { 0X65, 0X4F, 0X89, 0X55, 0X9D, 0XFB, 0X1F, 0XE0, 0X3, 0XDF, 0XFC, 0, 0, 0 } }, + { 120, 0XC475, { 0X65, 0X4F, 0X89, 0X55, 0X9D, 0X1, 0X3E, 0XE0, 0X3, 0XDF, 0X2, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + }, + { + { 75, 0X8653, { 0X7F, 0X63, 0X83, 0X66, 0X10, 0X6F, 0XF0, 0X58, 0XB, 0X57, 0X70, 0, 0, 0 } }, + { 85, 0X47B7, { 0X7E, 0X63, 0X82, 0X68, 0X10, 0X75, 0XF0, 0X58, 0XB, 0X57, 0X76, 0, 0, 0 } }, + { 100, 0X413, { 0X81, 0X63, 0X85, 0X6A, 0X15, 0X7A, 0XF0, 0X58, 0XB, 0X57, 0X7B, 0, 0, 0 } }, + { 120, 0X729, { 0X83, 0X63, 0X87, 0X6B, 0X16, 0X81, 0XF0, 0X58, 0XB, 0X57, 0X82, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + }, + { + { 75, 0X4321, { 0X9F, 0X7F, 0X83, 0X82, 0X8E, 0X1E, 0XF5, 0, 0X3, 0XFF, 0X1F, 0, 0, 0 } }, + { 85, 0X521, { 0XA7, 0X7F, 0X8B, 0X86, 0X92, 0X26, 0XF5, 0, 0X3, 0XFF, 0X27, 0, 0, 0 } }, + { 100, 0X465F, { 0XA9, 0X7F, 0XD, 0X89, 0X97, 0X2C, 0XF5, 0, 0X3, 0XFF, 0X2D, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + }, + { + { 75, 0X47EA, { 0XC3, 0X8F, 0X87, 0X98, 0X8, 0X82, 0XFF, 0X60, 0X3, 0X5F, 0X83, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + }, + { + { 75, 0X455E, { 0XCE, 0X9F, 0X92, 0XA2, 0X14, 0X28, 0X5A, 0, 0X3, 0XFF, 0X29, 0, 0, 0 } }, + { 85, 0X5B7, { 0XD3, 0X9F, 0X97, 0XA8, 0X1C, 0X2E, 0X5A, 0, 0X3, 0XFF, 0X2F, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + }, + { + { 75, 0X763, { 0X9, 0XC7, 0X8D, 0XD0, 0X8, 0XE0, 0X10, 0XB0, 0X3, 0XAF, 0XE1, 0, 0, 0 } }, + { 85, 0X550, { 0X9, 0XC7, 0X8D, 0XD0, 0X8, 0XE0, 0X10, 0XB0, 0X3, 0XAF, 0XE1, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + }, + { + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + }, + { + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + }, + { + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + }, + { + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + }, + { + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + }, + { + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + }, + { + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + }, + { + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + }, + { + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + }, + { + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + }, + { + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } } + } +}; + +static const VIALCDModeTableRec lcdTable[] = { + { 0, 0, 0X1, 13, 13, 5, 5, + { 0XE0FF, 0XF, 0XC0FC, 0X1B, 0, 0X7000, 0, 0X7000 }, + { 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7A, 0X7B, 0X7C, 0X7D, 0X7E, 0X7F, 0X80, 0X81, 0X82, 0X83, 0X84, 0X85, 0X86, 0X87, 0X88, 0X89, 0X8A, 0X8B, 0X8C, 0X8D, 0X8E, 0X8F, 0X90, 0X68, 0X69, 0X92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0X2, 0X3, 0X4, 0X7, 0XA, 0XD, 0X13, 0X16, 0X19, 0X1C, 0X1D, 0X1E, 0X1F, 0, 0, 0X88, 0XD, 0X5D, 0X79, 0XFF, 0X10, 0XB, 0X67, 0, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 26 }, + { 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X58, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X6F, 0X70, 0X71, 0X72, 0X73, 0X74, 0X75, 0X76, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1F, 0X7F, 0X7F, 0X1F, 0X9A, 0X23, 0X87, 0XE7, 0XC, 0XDF, 0XDF, 0XC, 0X11, 0XA, 0XE1, 0X23, 0XA0, 0X50, 0, 0X5F, 0X63, 0XB, 0XDF, 0X12, 0XDF, 0XC, 0X12, 0XE2, 0X14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 32 }, + { + { 0, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X6D, 0X6E, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X2D, 0X31, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 12 }, + { 0X2, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X6, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0XD, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X6D, 0X6E, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X2D, 0X31, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 12 }, + { 0XE, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0XF, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0X9E, 0XCB, 0X9, 0XA0, 0X22, 0X5D, 0X5D, 0XA1, 0X13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X10, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0X9E, 0XCB, 0X9, 0XA0, 0X22, 0X5D, 0X5D, 0XA1, 0X13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X13, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X30, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X5C, 0XC763, 0XC763, 0X8763, 0X8763, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0XDF, 0X7F, 0X51, 0X13, 0XE7, 0X47, 0XC7, 0X53, 0X80, 0X9, 0X2, 0X55, 0X37, 0X50, 0XC7, 0X2, 0XC7, 0X2, 0X56, 0X18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 }, + { 0X7C, 0XC763, 0XC763, 0X8763, 0X8763, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0XDF, 0X7F, 0X51, 0X13, 0XE7, 0X47, 0XEF, 0X67, 0X94, 0X9, 0X2, 0X69, 0X2B, 0X50, 0XEF, 0X2, 0XEF, 0X2, 0X6A, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 }, + { 0X22, 0XC763, 0XC763, 0X8763, 0X8763, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X7, 0XA7, 0X92, 0X13, 0XF, 0X6F, 0X2B, 0X85, 0XB2, 0X9, 0XA, 0X87, 0X29, 0X64, 0X2B, 0X2B, 0X88, 0X1A, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 19 }, + { 0X25, 0XC763, 0XC763, 0X8763, 0X8763, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0X3F, 0XDF, 0X92, 0X13, 0X47, 0XA7, 0X7F, 0XAF, 0XDC, 0X9, 0XA, 0XB1, 0X34, 0X80, 0X7F, 0X7F, 0XB2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + }, + { + { 0, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X6D, 0X6E, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X2D, 0X31, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 12 }, + { 0X2, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X6, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0XD, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X6D, 0X6E, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X2D, 0X31, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 12 }, + { 0XE, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0XF, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0X9E, 0XCB, 0X9, 0XA0, 0X22, 0X5D, 0X5D, 0XA1, 0X13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X10, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0X9E, 0XCB, 0X9, 0XA0, 0X22, 0X5D, 0X5D, 0XA1, 0X13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X13, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X30, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X5C, 0XC763, 0XC763, 0X8763, 0X8763, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0XDF, 0X7F, 0X51, 0X13, 0XE7, 0X47, 0XC7, 0X53, 0X80, 0X9, 0X2, 0X55, 0X37, 0X50, 0XC7, 0X2, 0XC7, 0X2, 0X56, 0X18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 }, + { 0X7C, 0XC763, 0XC763, 0X8763, 0X8763, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0XDF, 0X7F, 0X51, 0X13, 0XE7, 0X47, 0XEF, 0X67, 0X94, 0X9, 0X2, 0X69, 0X2B, 0X50, 0XEF, 0X2, 0XEF, 0X2, 0X6A, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 }, + { 0X22, 0XC763, 0XC763, 0X8763, 0X8763, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X7, 0XA7, 0X92, 0X13, 0XF, 0X6F, 0X2B, 0X85, 0XB2, 0X9, 0XA, 0X87, 0X29, 0X64, 0X2B, 0X2B, 0X88, 0X1A, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 19 }, + { 0X25, 0XC763, 0XC763, 0X8763, 0X8763, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0X3F, 0XDF, 0X92, 0X13, 0X47, 0XA7, 0X7F, 0XAF, 0XDC, 0X9, 0XA, 0XB1, 0X34, 0X80, 0X7F, 0X7F, 0XB2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + }, + { + { 0, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X2, 0, 0, 0, 0, { 0XC4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0X11, 0X4, 0X5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0X6E, 0X52, 0X9E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 4 }, + { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X3D, 0X89, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, + { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X3D, 0X89, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, + { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + }, + { + { 0, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X2, 0, 0, 0, 0, { 0XC4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0X11, 0X4, 0X5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0X6E, 0X52, 0X9E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 4 }, + { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X3D, 0X89, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, + { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X3D, 0X89, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, + { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + }, + { 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X6D, 0X6E, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X2D, 0X31, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 12 }, + { 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X6D, 0X6E, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X2D, 0X31, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 12 }, + { + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + }, + { + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + } + }, + { 0X1, 0X1, 0X1, 14, 13, 4, 4, + { 0XE0FF, 0XF, 0XC1FC, 0X37B, 0, 0X7000, 0, 0X7000 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X58, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X6F, 0X70, 0X71, 0X72, 0X73, 0X74, 0X75, 0X76, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1F, 0X1F, 0X1F, 0X1F, 0XE3, 0X34, 0X47, 0XC7, 0X73, 0X57, 0X57, 0X73, 0X52, 0X12, 0X58, 0X5C, 0XC8, 0X6E, 0, 0X7F, 0X83, 0X72, 0X57, 0X22, 0X57, 0X73, 0X22, 0X59, 0X2D, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 32 }, + { + { 0, 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X56, 0X57, 0X65, 0X66, 0X6D, 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X25, 0XCF, 0XF7, 0XF7, 0XDA, 0X1F, 0X9F, 0XB4, 0X6E, 0X36, 0X3A, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 }, + { 0X2, 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X6D, 0X6E, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XF3, 0XF, 0X51, 0XF4, 0X38, 0XA2, 0X7F, 0X83, 0X8F, 0X8F, 0XF5, 0X19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 13 }, + { 0X6, 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XF3, 0XF, 0X51, 0XF4, 0X38, 0X8F, 0X8F, 0XF5, 0X19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0XD, 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0XE, 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XF3, 0XF, 0X51, 0XF4, 0X38, 0X8F, 0X8F, 0XF5, 0X19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0XF, 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0XDA, 0XF6, 0X49, 0XDB, 0X3F, 0X5D, 0X5D, 0XDC, 0X10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X10, 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0XDA, 0XF6, 0X49, 0XDB, 0X3F, 0XA2, 0X5D, 0X5D, 0XDC, 0X10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 }, + { 0X13, 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XF3, 0XF, 0X51, 0XF4, 0X38, 0XA2, 0X8F, 0X8F, 0XF5, 0X19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 }, + { 0X28, 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X56, 0X57, 0X65, 0X6D, 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1C, 0XCF, 0XF7, 0XF7, 0XDA, 0X1F, 0X9F, 0XB4, 0X70, 0X74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X30, 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XF3, 0XF, 0X51, 0XF4, 0X38, 0X8F, 0X8F, 0XF5, 0X19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X5C, 0XC459, 0XC459, 0XC259, 0XC259, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X2F, 0X2F, 0X14, 0X57, 0XD7, 0XC7, 0X8F, 0XAB, 0X9, 0X2, 0X90, 0X34, 0X50, 0XC7, 0X2, 0XC7, 0X2, 0X91, 0X15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 20 }, + { 0X7C, 0XC459, 0XC459, 0XC259, 0XC259, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X2F, 0X2F, 0X14, 0X57, 0XD7, 0XEF, 0XA3, 0XBF, 0X9, 0X2, 0XA4, 0X28, 0X50, 0XEF, 0X2, 0XEF, 0X2, 0XA5, 0X19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 20 }, + { 0X22, 0XC459, 0XC459, 0XC259, 0XC259, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X57, 0X57, 0X14, 0X7F, 0XFF, 0X2B, 0XC1, 0XDD, 0X9, 0XC2, 0X26, 0X64, 0X2B, 0X2B, 0XC3, 0X17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 17 }, + { 0X25, 0XC459, 0XC459, 0XC259, 0XC259, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0X8F, 0X8F, 0X14, 0XB7, 0X37, 0X7F, 0XEB, 0X7, 0X51, 0XEC, 0X30, 0X80, 0X7F, 0X7F, 0XED, 0X11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 17 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + }, + { + { 0, 0X8643, 0X86B9, 0X4643, 0X46B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X21, 0X21, 0XB4, 0X66, 0X98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5 }, + { 0X2, 0X8643, 0X86B3, 0X4643, 0X46B3, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X66, 0X6D, 0X6E, 0X6F, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X2F, 0X2F, 0X73, 0X61, 0X65, 0X72, 0X33, 0XAA, 0XB7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, + { 0X6, 0X8643, 0X86B3, 0X4643, 0X46B3, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAA, 0XB7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, + { 0XE, 0X8643, 0X86B3, 0X4643, 0X46B3, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAA, 0XB7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, + { 0XF, 0X8643, 0X86B3, 0X4643, 0X46B3, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X54, 0XB7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, + { 0X10, 0X8643, 0X86B3, 0X4643, 0X46B3, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X54, 0XB7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, + { 0X13, 0X8643, 0X86B3, 0X4643, 0X46B3, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAA, 0XB7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, + { 0X28, 0X8643, 0X86B9, 0X4643, 0X46B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X21, 0X21, 0XB4, 0X72, 0X98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5 }, + { 0X30, 0X8643, 0X86B3, 0X4643, 0X46B3, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAA, 0XB7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, + { 0X5C, 0XC459, 0XC7BB, 0XC259, 0XC776, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1F, 0X1F, 0X50, 0X5A, 0X2D, 0X31, 0X98, 0X54, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, + { 0X7C, 0XC459, 0XC7BB, 0XC259, 0XC776, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1F, 0X1F, 0X50, 0X55, 0X2D, 0X31, 0X98, 0X98, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, + { 0X22, 0XC459, 0XC643, 0XC259, 0X8643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1B, 0X1B, 0X64, 0X5A, 0X3D, 0X41, 0, 0, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, + { 0X25, 0XC459, 0X4511, 0XC259, 0X8544, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X23, 0X23, 0X80, 0X61, 0X4C, 0X50, 0X8E, 0X8E, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + }, + { + { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X4B, 0X9B, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, + { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X4B, 0X9B, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, + { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + }, + { + { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X2A, 0X90, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, + { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X2A, 0X90, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, + { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + }, + { 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X66, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0XCF, 0XCF, 0X9A, 0X24, 0XF7, 0X77, 0X8F, 0XF3, 0XF, 0X51, 0XA, 0XF4, 0X38, 0XA0, 0X68, 0X3D, 0X41, 0X8F, 0X12, 0X8F, 0X12, 0XF5, 0X19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 24 }, + { 0X8643, 0X86B2, 0X4643, 0X46B2, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X2F, 0X2F, 0XA0, 0X5F, 0X2D, 0X31, 0X32, 0XAA, 0XB7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, + { + { 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0XCF, 0XCF, 0X9A, 0X24, 0XF7, 0X77, 0XDF, 0X1B, 0X37, 0XA, 0X1C, 0X40, 0XA0, 0XDF, 0X12, 0XDF, 0X12, 0X1D, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 20 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + }, + { + { 0X8643, 0X86B3, 0X4643, 0X46B3, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1A, 0X1A, 0XA0, 0X5F, 0X63, 0X33, 0X32, 0XF7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + } + }, + { 0X2, 0X2, 0X1, 13, 14, 4, 4, + { 0XE0FF, 0XF, 0XC1FC, 0X6F7B, 0, 0X7000, 0, 0X7000 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X58, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X6F, 0X70, 0X71, 0X72, 0X73, 0X74, 0X75, 0X76, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0XFF, 0XFF, 0X3F, 0X2B, 0X35, 0X17, 0X9F, 0X25, 0XFF, 0XFF, 0X25, 0X9A, 0X13, 0, 0X62, 0, 0X96, 0X4, 0XA3, 0XA7, 0X24, 0XFF, 0X23, 0XFF, 0X25, 0X23, 0X3, 0X39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 32 }, + { + { 0, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X56, 0X57, 0X5C, 0X65, 0X66, 0X6D, 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X45, 0XCF, 0X67, 0XA7, 0XE3, 0X7F, 0X7, 0X12, 0XB4, 0X87, 0X46, 0X4A, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 12 }, + { 0X2, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X66, 0X70, 0X72, 0X73, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X84, 0XD4, 0X8F, 0X47, 0X6D, 0X4A, 0X50, 0XA2, 0XA0, 0X8E, 0X8E, 0X6E, 0X12, 0X4A, 0X20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 15 }, + { 0X6, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X47, 0X6D, 0X4A, 0X50, 0X8F, 0X8F, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, + { 0XE, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X47, 0X6D, 0X4A, 0X50, 0X8F, 0X8F, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, + { 0XF, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0X2E, 0X54, 0X31, 0X57, 0X5D, 0X5D, 0X32, 0X28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, + { 0X10, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0X2E, 0X54, 0X31, 0X57, 0XA2, 0X5D, 0X5D, 0X32, 0X28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X13, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X47, 0X6D, 0X4A, 0X50, 0XA2, 0X8F, 0X8F, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X28, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X56, 0X57, 0X5C, 0X65, 0X6D, 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X45, 0XCF, 0X67, 0XA7, 0X7F, 0X7, 0X12, 0XB4, 0X91, 0X95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X30, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X47, 0X6D, 0X4A, 0X50, 0X8F, 0X8F, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, + { 0X5C, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X9F, 0XDF, 0X9A, 0X15, 0XB7, 0X3F, 0XC7, 0XE3, 0X9, 0X51, 0X3, 0XE6, 0X2C, 0X50, 0XC7, 0X3, 0XC7, 0X3, 0XE7, 0X1D, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 }, + { 0X7C, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X9F, 0XDF, 0X9A, 0X15, 0XB7, 0X3F, 0XEF, 0XF7, 0X1D, 0X51, 0X3, 0XFA, 0X20, 0X50, 0XEF, 0X3, 0XEF, 0X3, 0XFB, 0X11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 }, + { 0X22, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XC7, 0X7, 0XA2, 0X15, 0XDF, 0X67, 0X2B, 0X15, 0X3B, 0X18, 0X5E, 0X64, 0X2B, 0X2B, 0X19, 0X2F, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 17 }, + { 0X25, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0XFF, 0X3F, 0XE2, 0X15, 0X17, 0X9F, 0X7F, 0X3F, 0X65, 0X42, 0X48, 0X80, 0X7F, 0X7F, 0X43, 0X29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 17 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + }, + { + { 0, 0X86ED, 0X875A, 0X46ED, 0X475A, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X43, 0X43, 0XB4, 0X82, 0X30, 0X34, 0XD0, 0X14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 }, + { 0X2, 0X86ED, 0X874C, 0X46ED, 0X474C, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X73, 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0X62, 0XA2, 0XFE, 0XFE, 0X24, 0X80, 0X14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 }, + { 0X6, 0X86ED, 0X874C, 0X46ED, 0X474C, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X80, 0X14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, + { 0XD, 0X86ED, 0XC5ED, 0X46ED, 0X85ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X66, 0X6D, 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X4F, 0X4F, 0X82, 0X2E, 0X32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5 }, + { 0XE, 0X86ED, 0X874C, 0X46ED, 0X474C, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X80, 0X14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, + { 0XF, 0X86ED, 0X874C, 0X46ED, 0X474C, { 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X80, 0XD2, 0X67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 3 }, + { 0X10, 0X86ED, 0X874C, 0X46ED, 0X474C, { 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0X80, 0XD2, 0X67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 4 }, + { 0X13, 0X86ED, 0X874C, 0X46ED, 0X474C, { 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0X80, 0X14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 3 }, + { 0X28, 0X86ED, 0X472B, 0X46ED, 0X72B, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X3F, 0XB4, 0X87, 0XD0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5 }, + { 0X30, 0X86ED, 0X874C, 0X46ED, 0X474C, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X5C, 0X86ED, 0XC5B5, 0X46ED, 0X85B5, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X3F, 0X50, 0X78, 0X2C, 0X30, 0X40, 0XA, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, + { 0X7C, 0X86ED, 0XC5B5, 0X46ED, 0X85B5, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X3F, 0X50, 0X7C, 0X2C, 0X30, 0X40, 0X40, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, + { 0X22, 0X86ED, 0XC4B9, 0X46ED, 0X84B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X41, 0X41, 0X64, 0X73, 0X3D, 0X41, 0X90, 0X90, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, + { 0X25, 0X86ED, 0XC447, 0X46ED, 0X8447, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3E, 0X3E, 0X80, 0X8E, 0X4D, 0X51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + }, + { + { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X57, 0X88, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, + { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X57, 0X88, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, + { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + }, + { + { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X2A, 0X90, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, + { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X2A, 0X90, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, + { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + }, + { 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0X3F, 0X7F, 0XE3, 0X25, 0X57, 0XDF, 0X8F, 0X47, 0X6D, 0X52, 0XB, 0X4A, 0X50, 0XA0, 0, 0X4F, 0X53, 0X8F, 0X13, 0X8F, 0X13, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 24 }, + { 0X86ED, 0X842B, 0X46ED, 0X442B, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X47, 0X47, 0XA0, 0X7D, 0, 0X2D, 0X31, 0X80, 0X10, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { + { 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0X3F, 0X7F, 0XE3, 0X25, 0X57, 0XDF, 0XDF, 0X6F, 0X95, 0X52, 0XB, 0X72, 0X58, 0XA0, 0, 0XDF, 0X13, 0XDF, 0X13, 0X73, 0X29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 22 }, + { 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X67, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1F, 0X8F, 0XCF, 0XE3, 0XA7, 0X2F, 0X57, 0XAB, 0XD1, 0X12, 0XAE, 0X54, 0XC8, 0, 0X57, 0X57, 0XAF, 0X25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + }, + { + { 0X86ED, 0X874C, 0X46ED, 0X474C, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X47, 0X47, 0XA0, 0X8C, 0, 0X60, 0X64, 0X81, 0X80, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X86ED, 0X84B9, 0X46ED, 0X44B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X37, 0X37, 0XC8, 0X8C, 0, 0X7E, 0X82, 0X21, 0X20, 0XF7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + } + }, + { 0X3, 0X3, 0X1, 12, 13, 8, 4, + { 0XE0FF, 0XF, 0XC0FC, 0X6F7B, 0, 0X70D0, 0, 0X7000 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X58, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X6F, 0X70, 0X71, 0X72, 0X73, 0X74, 0X75, 0X76, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X97, 0XFF, 0XFF, 0X97, 0X74, 0X46, 0X2F, 0X9F, 0X25, 0XFF, 0XFF, 0X25, 0XDA, 0X13, 0X2, 0X68, 0X40, 0XBE, 0X4, 0XCE, 0XD2, 0X24, 0XFF, 0X23, 0XFF, 0X25, 0X23, 0X3, 0X39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 32 }, + { + { 0, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X56, 0X57, 0X5C, 0X65, 0X6D, 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9B, 0XCF, 0XE7, 0X7F, 0X2B, 0X17, 0X87, 0X92, 0XB4, 0X59, 0X5D, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 }, + { 0X2, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X52, 0X53, 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X6D, 0X6E, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0X4F, 0X8F, 0X47, 0X6D, 0X4A, 0X4B, 0XA2, 0XCD, 0XD1, 0X8F, 0X8F, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 15 }, + { 0X6, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X47, 0X6D, 0X4A, 0X50, 0X8F, 0X8F, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, + { 0XE, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X47, 0X6D, 0X4A, 0X50, 0X8F, 0X8F, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, + { 0XF, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0X2E, 0X54, 0X31, 0X57, 0X5D, 0X5D, 0X32, 0X28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, + { 0X10, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0X2E, 0X54, 0X31, 0X57, 0XA2, 0X5D, 0X5D, 0X32, 0X28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X13, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X47, 0X6D, 0X4A, 0X50, 0XA2, 0X8F, 0X8F, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X30, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X47, 0X6D, 0X4A, 0X50, 0X8F, 0X8F, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, + { 0X5C, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X1F, 0XB7, 0XE3, 0X16, 0X4F, 0XBF, 0XC7, 0XE3, 0X9, 0X51, 0X3, 0XE6, 0X2C, 0X50, 0XC7, 0X3, 0XC7, 0X3, 0XE7, 0X1D, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 }, + { 0X7C, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X1F, 0XB7, 0XE3, 0X16, 0X4F, 0XBF, 0XEF, 0XF7, 0X1D, 0X51, 0X3, 0XFA, 0X20, 0X50, 0XEF, 0X3, 0XEF, 0X3, 0XFB, 0X11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 }, + { 0X22, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X47, 0XDF, 0XE3, 0X16, 0X77, 0XE7, 0X2B, 0X15, 0X3B, 0X52, 0X18, 0X5E, 0X64, 0X2B, 0X2B, 0X19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 17 }, + { 0X25, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0X7F, 0X17, 0X16, 0X1F, 0X1F, 0X7F, 0X3F, 0X65, 0X42, 0X48, 0X80, 0X7F, 0X7F, 0X43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 15 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + }, + { + { 0, 0X45B9, 0X853D, 0X5B9, 0X453D, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X66, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X91, 0XFF, 0XFF, 0X91, 0X74, 0X46, 0X2F, 0X9F, 0XFF, 0XFF, 0X25, 0XDA, 0X13, 0X2, 0X68, 0XB4, 0XA0, 0X2D, 0X31, 0XFF, 0X23, 0XFF, 0X23, 0X3, 0X39, 0X40, 0X14, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 28 }, + { 0X2, 0X45B9, 0X451B, 0X5B9, 0X51B, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA9, 0XA9, 0XA2, 0XB8, 0X60, 0X64, 0X1, 0X14, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, + { 0X6, 0X45B9, 0X451B, 0X5B9, 0X51B, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X55, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X26, 0X14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, + { 0XD, 0X45B9, 0XC5ED, 0X5B9, 0X85ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X66, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAA, 0XFF, 0XFF, 0XAA, 0X74, 0X46, 0X2F, 0X9F, 0XFF, 0XFF, 0X25, 0XDA, 0X13, 0X2, 0X68, 0XA0, 0X2E, 0X32, 0XFF, 0X23, 0XFF, 0X23, 0X3, 0X39, 0X10, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 26 }, + { 0XE, 0X45B9, 0X451B, 0X5B9, 0X51B, { 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X75, 0X76, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X4, 0X49, 0X14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 3 }, + { 0XF, 0X45B9, 0X451B, 0X5B9, 0X51B, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XD2, 0X67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, + { 0X10, 0X45B9, 0X451B, 0X5B9, 0X51B, { 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0X1, 0XD2, 0X67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 4 }, + { 0X13, 0X45B9, 0X451B, 0X5B9, 0X51B, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X67, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0, 0X1, 0X14, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5 }, + { 0X30, 0X45B9, 0X451B, 0X5B9, 0X51B, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X5C, 0X45B9, 0X851B, 0X5B9, 0X85B6, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X66, 0X6D, 0X6E, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X8C, 0X2D, 0X31, 0XA, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 }, + { 0X7C, 0X45B9, 0X851B, 0X5B9, 0X85B6, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X66, 0X6D, 0X6E, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X8C, 0X2D, 0X31, 0X40, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 }, + { 0X22, 0X45B9, 0XC4B9, 0X5B9, 0X84B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X99, 0X99, 0X64, 0XB0, 0X3D, 0X41, 0X40, 0X90, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, + { 0X25, 0X45B9, 0X471F, 0X5B9, 0X877C, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X80, 0X4D, 0X51, 0X98, 0, 0X97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + }, + { + { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X29, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X2A, 0, 0, 0, 0, { 0XD4, 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XC7, 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, + { 0X2B, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X2C, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X6A, 0X98, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, + { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X6A, 0X98, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, + { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + }, + { + { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X2A, 0X90, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, + { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X2A, 0X90, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, + { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + }, + { 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9F, 0X7F, 0XBF, 0X57, 0XEB, 0X26, 0XEF, 0X5F, 0X8F, 0X47, 0X6D, 0X12, 0XB, 0X4A, 0X50, 0XA0, 0, 0X65, 0X69, 0X8F, 0X13, 0X8F, 0X13, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 25 }, + { 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9F, 0X7F, 0XBF, 0X57, 0XEB, 0X26, 0XEF, 0X5F, 0X8F, 0X47, 0X6D, 0X12, 0XB, 0X4A, 0X50, 0XA0, 0, 0X65, 0X69, 0X8F, 0X13, 0X8F, 0X13, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 25 }, + { + { 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0XBF, 0X57, 0XEB, 0X26, 0XEF, 0X5F, 0XDF, 0X6F, 0X95, 0X12, 0XB, 0X72, 0X58, 0XA0, 0, 0XDF, 0X13, 0XDF, 0X13, 0X73, 0X29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 22 }, + { 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X67, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1F, 0XF, 0XA7, 0X2C, 0X36, 0X3F, 0XAF, 0X57, 0XAB, 0XD1, 0X92, 0XAE, 0X54, 0XC8, 0, 0X57, 0X57, 0XAF, 0X25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 19 }, + { 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0X17, 0X34, 0X36, 0XAF, 0X1F, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + }, + { + { 0X45B9, 0X451B, 0X5B9, 0X51B, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA9, 0XA9, 0XA0, 0XB8, 0, 0X60, 0X64, 0, 0X80, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X45B9, 0X84B9, 0X5B9, 0X44B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XBF, 0XBF, 0XC8, 0XBB, 0, 0X82, 0X86, 0X80, 0X20, 0XE7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X45B9, 0X8448, 0X5B9, 0X4448, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X65, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X87, 0XFF, 0XFF, 0X87, 0X74, 0X46, 0X2F, 0X9F, 0, 0, 0, 0XC3, 0X1B, 0, 0XA0, 0XA4, 0, 0X33, 0, 0X33, 0X34, 0XFF, 0XF7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 23 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + } + }, + { 0X4, 0X4, 0X1, 14, 15, 8, 4, + { 0XE0FF, 0XF, 0XC0FC, 0X6F7B, 0X1B0, 0X7DD0, 0, 0X7000 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X58, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X6F, 0X70, 0X71, 0X72, 0X73, 0X74, 0X75, 0X76, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X97, 0XFF, 0XFF, 0X97, 0X74, 0X46, 0X2F, 0X9F, 0X29, 0XFF, 0XFF, 0X29, 0XE3, 0X1C, 0, 0X83, 0X40, 0XBE, 0X4, 0XCE, 0XD2, 0X28, 0XFF, 0X34, 0XFF, 0X29, 0X34, 0X1, 0X44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 32 }, + { + { 0, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X56, 0X57, 0X5C, 0X65, 0X6D, 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9B, 0XCF, 0XE7, 0X7F, 0X2B, 0X17, 0X87, 0X92, 0XB4, 0X59, 0X5D, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 }, + { 0X2, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XC7, 0XF1, 0X12, 0XC8, 0X4B, 0XA2, 0X8F, 0X8F, 0XC9, 0X2C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 }, + { 0X6, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XC7, 0XF1, 0X12, 0XC8, 0X4B, 0X8F, 0X8F, 0XC9, 0X2C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0XE, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XC7, 0XF1, 0X12, 0XC8, 0X4B, 0X8F, 0X8F, 0XC9, 0X2C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0XF, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0XAE, 0XD8, 0X12, 0XAF, 0X52, 0X5D, 0X5D, 0XB0, 0X23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X10, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0XAE, 0XD8, 0X12, 0XAF, 0X52, 0XA2, 0X5D, 0X5D, 0XB0, 0X23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 }, + { 0X13, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XC7, 0XF1, 0X12, 0XC8, 0X4B, 0XA2, 0X8F, 0X8F, 0XC9, 0X2C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 }, + { 0X30, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XC7, 0XF1, 0X12, 0XC8, 0X4B, 0X8F, 0X8F, 0XC9, 0X2C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X54, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X71, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0XA9, 0XDB, 0X14, 0X80, 0X63, 0X24, 0X24, 0X81, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X58, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XBF, 0XDF, 0X9, 0XE0, 0X63, 0XBF, 0XBF, 0XE1, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, + { 0X5C, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X1F, 0XB7, 0XE3, 0X16, 0X4F, 0XBF, 0XC7, 0X63, 0X8D, 0X52, 0X4, 0X64, 0X47, 0X50, 0XC7, 0X4, 0XC7, 0X4, 0X65, 0X28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 }, + { 0X7C, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X1F, 0XB7, 0XE3, 0X16, 0X4F, 0XBF, 0XEF, 0X77, 0XA1, 0X52, 0X4, 0X78, 0X5B, 0X50, 0XEF, 0X4, 0XEF, 0X4, 0X79, 0X2C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 }, + { 0X22, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X47, 0XDF, 0XE3, 0X16, 0X77, 0XE7, 0X2B, 0X95, 0XBF, 0X52, 0X96, 0X59, 0X64, 0X2B, 0X2B, 0X97, 0X2A, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, + { 0X25, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0X7F, 0X17, 0X16, 0XAF, 0X1F, 0X7F, 0XBF, 0XE9, 0X12, 0XC0, 0X43, 0X80, 0X7F, 0X7F, 0XC1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 16 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + }, + { + { 0, 0X8479, 0X8663, 0X4479, 0X4441, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X92, 0X92, 0XB4, 0XA8, 0X2E, 0X32, 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7 }, + { 0X2, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XBF, 0XBF, 0XA2, 0XB5, 0X61, 0X65, 0X1, 0X90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 }, + { 0X6, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X66, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAE, 0X90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, + { 0XD, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0XE, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0XF, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X10, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0X5E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, + { 0X13, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0X90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, + { 0X30, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0X90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, + { 0X54, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X71, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0XA9, 0XDB, 0X14, 0X80, 0X63, 0X24, 0X24, 0X81, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X58, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XBF, 0XDF, 0X9, 0XE0, 0X63, 0XBF, 0XBF, 0XE1, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, + { 0X5C, 0X8479, 0X4719, 0X4479, 0X87E4, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X66, 0X6D, 0X6E, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X82, 0X2D, 0X31, 0XC8, 0X17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 }, + { 0X7C, 0X8479, 0X4719, 0X4479, 0X87E4, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X66, 0X6D, 0X6E, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X82, 0X2D, 0X31, 0XF0, 0X17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 }, + { 0X22, 0X8479, 0X4721, 0X4479, 0X4742, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X64, 0X3D, 0X41, 0X40, 0X2C, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 }, + { 0X25, 0X8479, 0X4729, 0X4479, 0X4752, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X80, 0X4D, 0X51, 0X98, 0X7F, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + }, + { + { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X29, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X2A, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X2B, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X2C, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X6A, 0X98, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, + { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X6A, 0X98, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, + { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + }, + { + { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X2A, 0X90, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, + { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X2A, 0X90, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, + { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + }, + { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9F, 0X7F, 0XBF, 0X57, 0XEB, 0X26, 0XEF, 0X5F, 0X8F, 0XC7, 0XF1, 0X12, 0XC, 0XC8, 0X4B, 0XA0, 0, 0X65, 0X69, 0X8F, 0X14, 0X8F, 0X14, 0XC9, 0X2C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 25 }, + { 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9D, 0X9D, 0XA0, 0X91, 0, 0X2D, 0X31, 0X90, 0X67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, + { + { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0XBF, 0X57, 0XEB, 0X26, 0XEF, 0X5F, 0XDF, 0XEF, 0X19, 0X1A, 0XC, 0XF0, 0X53, 0XA0, 0, 0XDF, 0X14, 0XDF, 0X14, 0XF1, 0X24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 22 }, + { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1F, 0XF, 0XA7, 0X2C, 0X36, 0X3F, 0XAF, 0X57, 0X2B, 0X55, 0X9B, 0X14, 0X2C, 0X6F, 0XC8, 0, 0X57, 0X24, 0X57, 0X24, 0X2D, 0X30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 22 }, + { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X71, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0X17, 0X34, 0X36, 0XAF, 0X1F, 0X7F, 0XA9, 0XDB, 0X14, 0X80, 0X63, 0, 0X24, 0X24, 0X81, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 17 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + }, + { + { 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9D, 0X9D, 0XA0, 0XAA, 0, 0X5F, 0X63, 0XE0, 0X67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, + { 0X8479, 0X721, 0X4479, 0X742, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X67, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9D, 0X9D, 0XC8, 0, 0X7F, 0X83, 0X81, 0X58, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, + { 0X8479, 0X51E, 0X4479, 0X53C, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X6D, 0X6E, 0X77, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9D, 0X9D, 0, 0XA3, 0XA7, 0X34, 0XF7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + } + }, + { 0X5, 0X5, 0X1, 14, 14, 8, 10, + { 0XE0FF, 0XF, 0XC0FC, 0X6F7B, 0X1B0, 0X7DD0, 0X1C0, 0X7000 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X58, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X6F, 0X70, 0X71, 0X72, 0X73, 0X74, 0X75, 0X76, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X97, 0X77, 0X77, 0X97, 0X75, 0X56, 0XA7, 0X17, 0X29, 0X19, 0X19, 0X29, 0XA4, 0X24, 0X1A, 0X9D, 0X5E, 0XBE, 0X4, 0XCE, 0XD2, 0X28, 0X19, 0X44, 0X19, 0X29, 0X44, 0X1B, 0X4E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 32 }, + { + { 0, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X56, 0X57, 0X65, 0X6D, 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9B, 0XCF, 0X23, 0X43, 0X2C, 0X53, 0XC3, 0XB4, 0X59, 0X5D, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X2, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X6D, 0X6E, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X8F, 0XD4, 0XE4, 0X92, 0XD5, 0X58, 0XA2, 0XCD, 0XD1, 0X8F, 0X8F, 0XD6, 0X29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 14 }, + { 0X6, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X66, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XD4, 0XE4, 0X92, 0XD5, 0X58, 0XC3, 0X8F, 0X8F, 0XD6, 0X29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 }, + { 0XE, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XD4, 0XE4, 0X92, 0XD5, 0X58, 0X8F, 0X8F, 0XD6, 0X29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0XF, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0XBB, 0XCB, 0X92, 0XBC, 0X5F, 0X5D, 0X5D, 0XBD, 0X20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X10, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0XBB, 0XCB, 0X92, 0XBC, 0X5F, 0XA2, 0X5D, 0X5D, 0XBD, 0X20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 }, + { 0X13, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XD4, 0XE4, 0X92, 0XD5, 0X58, 0XA2, 0X8F, 0X8F, 0XD6, 0X29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 }, + { 0X30, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XD4, 0XE4, 0X92, 0XD5, 0X58, 0X8F, 0X8F, 0XD6, 0X29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X54, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X71, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8C, 0X9C, 0XDB, 0X14, 0X8D, 0X70, 0X24, 0X24, 0X8E, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X58, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XBF, 0XEC, 0XFC, 0XDB, 0XED, 0X70, 0XBF, 0XBF, 0XEE, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X5C, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X5B, 0X7B, 0XE3, 0X16, 0X8B, 0XFB, 0XC7, 0X70, 0X80, 0X52, 0X4, 0X71, 0X54, 0X50, 0XC7, 0X4, 0XC7, 0X4, 0X72, 0X25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 }, + { 0X7C, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X5B, 0X7B, 0XE3, 0X16, 0X8B, 0XFB, 0XEF, 0X84, 0X94, 0X52, 0X4, 0X85, 0X48, 0X50, 0XEF, 0X4, 0XEF, 0X4, 0X86, 0X29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 }, + { 0X22, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X83, 0XA3, 0XE3, 0X16, 0XB3, 0X23, 0X2B, 0XA2, 0XB2, 0X12, 0XA3, 0X46, 0X64, 0X2B, 0X2B, 0XA4, 0X27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, + { 0X25, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0XBB, 0XDB, 0XE3, 0X16, 0XEB, 0X5B, 0X7F, 0XCC, 0XDC, 0X12, 0XCD, 0X50, 0X80, 0X7F, 0X7F, 0XCE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 17 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + }, + { + { 0, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X2, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0X86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, + { 0X6, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0XE, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0XF, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X10, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0X54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, + { 0X13, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0X86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, + { 0X30, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X54, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X66, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XCA, 0XEC, 0XB7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 3 }, + { 0X58, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X66, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XCA, 0XA8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, + { 0X5C, 0X8479, 0X4719, 0X4479, 0X87E4, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X8C, 0X2D, 0X31, 0XEA, 0XC2, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7 }, + { 0X7C, 0X8479, 0X4719, 0X4479, 0X87E4, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X8C, 0X2D, 0X31, 0XEA, 0XEA, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7 }, + { 0X22, 0X8479, 0X4721, 0X4479, 0X4742, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X64, 0XAA, 0X3D, 0X41, 0X24, 0X24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 }, + { 0X25, 0X8479, 0X4729, 0X4479, 0X4752, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X80, 0XAA, 0X4D, 0X51, 0X76, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + }, + { + { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X29, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X2A, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X2B, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X2C, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X71, 0X9F, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, + { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X71, 0X9F, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, + { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + }, + { + { 0, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X28, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X29, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X2A, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X2B, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X2C, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X2A, 0X90, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, + { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X2A, 0X90, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 } + }, + { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9F, 0X7F, 0XFB, 0X1B, 0X2B, 0X26, 0X2B, 0X9B, 0X8F, 0XD4, 0XE4, 0X92, 0XC, 0XD5, 0X58, 0XA0, 0, 0X65, 0X69, 0X8F, 0X14, 0X8F, 0X14, 0XD6, 0X29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 25 }, + { 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9D, 0X9D, 0XA0, 0XA0, 0, 0X2D, 0X31, 0XD4, 0X86, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { + { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0XFB, 0X1B, 0X2B, 0X26, 0X2B, 0X9B, 0XDF, 0XFC, 0XC, 0X9A, 0XC, 0XFD, 0X40, 0XA0, 0, 0XDF, 0X14, 0XDF, 0X14, 0XFE, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 22 }, + { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X70, 0X71, 0X72, 0X73, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1F, 0X4B, 0X6B, 0X2C, 0X36, 0X7B, 0XEB, 0X57, 0X38, 0X48, 0X9B, 0X14, 0X39, 0X7C, 0XC8, 0, 0X57, 0X24, 0X57, 0X29, 0X24, 0X3A, 0X3D, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 23 }, + { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0XBB, 0XDB, 0X2C, 0X36, 0XEB, 0X5B, 0XFF, 0X8C, 0X9C, 0XDB, 0X14, 0X8D, 0X70, 0, 0XFF, 0X24, 0XFF, 0X24, 0X8E, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0X3B, 0X5B, 0X46, 0X6B, 0XDB, 0XFF, 0XC, 0X1C, 0XE4, 0X1C, 0XD, 0X90, 0X40, 0XFF, 0X34, 0XFF, 0X34, 0XE, 0X41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 20 } + }, + { + { 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X67, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9D, 0X9D, 0XA0, 0, 0X5F, 0X63, 0XD4, 0XD4, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, + { 0X8479, 0X721, 0X4479, 0X742, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X67, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9D, 0X9D, 0XC8, 0, 0X7F, 0X83, 0X48, 0X48, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, + { 0X8479, 0X51E, 0X4479, 0X53C, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9D, 0X9D, 0, 0XC3, 0XA3, 0XA7, 0XEC, 0XEC, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X66, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X40, 0XC9, 0XA8, 0XE6, 0XF7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5 } + } + }, + { 0X6, 0X6, 0X1, 15, 15, 4, 4, + { 0XE0FF, 0XF, 0XC0FC, 0X6F7B, 0X37B0, 0X7DDD, 0X1C0, 0X7000 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X58, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X6F, 0X70, 0X71, 0X72, 0X73, 0X74, 0X75, 0X76, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6F, 0X3F, 0X3F, 0, 0X86, 0X68, 0X7F, 0X3F, 0XE1, 0XAF, 0XAF, 0XE1, 0XE4, 0X24, 0XB0, 0X93, 0X90, 0XFA, 0X4, 0X9, 0XD, 0XE0, 0XAF, 0X4C, 0XAF, 0XE1, 0X44, 0XB1, 0X44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 32 }, + { + { 0, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X56, 0X57, 0X65, 0X6D, 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XCF, 0X87, 0XB7, 0X34, 0XC7, 0X87, 0XB4, 0X73, 0X77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, + { 0X2, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X55, 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA8, 0X8F, 0X1F, 0X51, 0X20, 0X73, 0XA2, 0X8F, 0X8F, 0X21, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 }, + { 0X6, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X1F, 0X51, 0X20, 0X63, 0X8F, 0X8F, 0X21, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, + { 0XE, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X1F, 0X51, 0X20, 0X63, 0X8F, 0X8F, 0X21, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, + { 0XF, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0X6, 0X38, 0X7, 0X6A, 0X5D, 0X5D, 0X8, 0X3B, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, + { 0X10, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0X6, 0X38, 0X7, 0X6A, 0XA2, 0X5D, 0X5D, 0X8, 0X3B, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X13, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X1F, 0X51, 0X20, 0X63, 0XA2, 0X8F, 0X8F, 0X21, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X30, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X1F, 0X51, 0X20, 0X63, 0X8F, 0X8F, 0X21, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, + { 0X54, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X71, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XD7, 0X9, 0XA3, 0X14, 0XD8, 0X7B, 0X2C, 0X24, 0XD9, 0X3C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X58, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X70, 0X72, 0X75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XBF, 0X37, 0X69, 0X38, 0XBF, 0XBF, 0X39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7 }, + { 0X5C, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0XBF, 0XEF, 0XEB, 0X18, 0XFF, 0XBF, 0XC7, 0XBB, 0XED, 0X12, 0X4, 0XBC, 0X5F, 0X50, 0XC7, 0XC, 0XC7, 0X4, 0XBD, 0X20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 }, + { 0X7C, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0XBF, 0XEF, 0XEB, 0X18, 0XFF, 0XBF, 0XEF, 0XCF, 0X1, 0X1A, 0X4, 0XD0, 0X53, 0X50, 0XEF, 0XC, 0XEF, 0X4, 0XD1, 0X24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 }, + { 0X22, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XE7, 0X17, 0X33, 0X18, 0X27, 0XE7, 0X2B, 0XED, 0X1F, 0X9A, 0XC, 0XEE, 0X51, 0X64, 0X2B, 0X2B, 0XEF, 0X22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 19 }, + { 0X25, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0X1F, 0X4F, 0X18, 0X5F, 0X1F, 0X7F, 0X17, 0X49, 0X18, 0X7B, 0X80, 0X7F, 0X7F, 0X19, 0X3C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 16 }, + { 0X66, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X77, 0XDB, 0XFF, 0XBD, 0X58, 0X1B, 0XDB, 0X19, 0X64, 0X96, 0XA4, 0X65, 0X88, 0X5E, 0X19, 0X19, 0X66, 0X49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + }, + { + { 0, 0X4571, 0X8671, 0X571, 0X4671, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X66, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X3F, 0, 0X86, 0X68, 0X7F, 0X3F, 0XAF, 0XAF, 0XE1, 0XE4, 0X24, 0XB0, 0X93, 0XB4, 0XBE, 0X2D, 0X31, 0XAF, 0X44, 0XAF, 0X44, 0XB1, 0X44, 0XCC, 0X54, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 27 }, + { 0X2, 0X4571, 0XC47F, 0X571, 0X847F, { 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0X9A, 0X54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 3 }, + { 0X6, 0X4571, 0XC47F, 0X571, 0X847F, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X2A, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0XE, 0X4571, 0XC47F, 0X571, 0X847F, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0XF, 0X4571, 0XC47F, 0X571, 0X847F, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X2A, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X10, 0X4571, 0XC47F, 0X571, 0X847F, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0X2A, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, + { 0X13, 0X4571, 0XC47F, 0X571, 0X847F, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0X54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, + { 0X30, 0X4571, 0XC47F, 0X571, 0X847F, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X54, 0X4571, 0X477C, 0X571, 0X77C, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8E, 0XB7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, + { 0X58, 0X4571, 0X477C, 0X571, 0X77C, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X5C, 0X4571, 0X873D, 0X571, 0X877A, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6D, 0X50, 0XC8, 0X2F, 0X33, 0XCC, 0XAA, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 }, + { 0X7C, 0X4571, 0X873D, 0X571, 0X877A, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6D, 0X50, 0XC8, 0X2F, 0X33, 0XCC, 0XCC, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 }, + { 0X22, 0X4571, 0XC56F, 0X571, 0X856F, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X64, 0XBE, 0X3D, 0X41, 0, 0, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 }, + { 0X25, 0X4571, 0X8760, 0X571, 0X4760, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X71, 0X80, 0XC8, 0X4D, 0X51, 0X46, 0X46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7 }, + { 0X66, 0X4571, 0X45E5, 0X571, 0X5E5, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X65, 0X6D, 0X6E, 0X71, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X75, 0X5E, 0XED, 0XF1, 0X44, 0X80, 0X80, 0XF7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + }, + { + { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X5C, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X7C, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + }, + { + { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X5C, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X7C, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } + }, + { 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0X5F, 0X8F, 0X34, 0X28, 0X9F, 0X5F, 0X8F, 0X1F, 0X51, 0XDB, 0XC, 0X20, 0X63, 0XA0, 0, 0X82, 0X86, 0X8F, 0X14, 0X8F, 0X14, 0X21, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 24 }, + { 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0X5F, 0X8F, 0X34, 0X28, 0X9F, 0X5F, 0X8F, 0X1F, 0X51, 0XDB, 0XC, 0X20, 0X63, 0XA0, 0, 0X82, 0X86, 0X8F, 0X14, 0X8F, 0X14, 0X21, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 24 }, + { + { 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0X5F, 0X8F, 0X34, 0X28, 0X9F, 0X5F, 0XDF, 0X47, 0X79, 0XDB, 0XC, 0X48, 0X6B, 0XA0, 0, 0XDF, 0X1C, 0XDF, 0X14, 0X49, 0X3C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 22 }, + { 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1F, 0XAF, 0XDF, 0X34, 0X38, 0XEF, 0XAF, 0X57, 0X83, 0XB5, 0XDB, 0X14, 0X84, 0X67, 0XC8, 0, 0X57, 0X2C, 0X57, 0X24, 0X85, 0X38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 22 }, + { 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0X1F, 0X4F, 0X7D, 0X38, 0X5F, 0X1F, 0XFF, 0XD7, 0X9, 0XA3, 0X14, 0XD8, 0X7B, 0, 0XFF, 0X2C, 0XFF, 0X24, 0XD9, 0X3C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0X9F, 0XCF, 0X7D, 0X48, 0XDF, 0X9F, 0XFF, 0X57, 0X89, 0XA4, 0X1C, 0X58, 0X9B, 0X40, 0XFF, 0X3C, 0XFF, 0X34, 0X59, 0X4C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 } + }, + { + { 0X4571, 0XC47F, 0X571, 0X847F, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X71, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X73, 0XA0, 0XD8, 0, 0X5A, 0X5E, 0X44, 0X98, 0X98, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, + { 0X4571, 0X856F, 0X571, 0X456F, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X71, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0XC8, 0XE1, 0, 0X7F, 0X83, 0X44, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 }, + { 0X4571, 0X454A, 0X571, 0X54A, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X65, 0X66, 0X6D, 0X6E, 0X71, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0, 0XF0, 0XAB, 0XAF, 0X44, 0X8E, 0X8E, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, + { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, + { 0X4571, 0X477C, 0X571, 0X77C, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X65, 0X6D, 0X6E, 0X71, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7D, 0X40, 0XD0, 0XD4, 0X44, 0X32, 0X68, 0XF7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 } + } + } +}; + +static const VIALCDPowerSeqRec powerOn[] = { + { 0, { 0XD4, 0XD4, 0, 0 }, { 0X91, 0X91, 0, 0 }, { 0X10, 0X8, 0, 0 }, { 0X10, 0X8, 0, 0 }, { 0X19, 0X64, 0, 0 }, 2 }, + { 1, { 0XD4, 0XD4, 0XD4, 0 }, { 0X91, 0X91, 0X91, 0 }, { 0X10, 0X8, 0X6, 0 }, { 0X10, 0X8, 0X6, 0 }, { 0X19, 0X1FE, 0X1, 0 }, 3 }, + { 2, { 0XC4, 0XD4, 0XC4, 0 }, { 0X3D, 0X91, 0X3D, 0 }, { 0X10, 0X8, 0X20, 0 }, { 0X10, 0X8, 0X20, 0 }, { 0X19, 0X1FE, 0X1, 0 }, 3 }, + { 0, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, 0 } +}; + +static const VIALCDPowerSeqRec powerOff[] = { + { 0, { 0XD4, 0, 0, 0 }, { 0X91, 0, 0, 0 }, { 0X18, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0X1, 0, 0, 0 }, 1 }, + { 1, { 0XD4, 0XD4, 0XD4, 0 }, { 0X91, 0X91, 0X91, 0 }, { 0X6, 0X8, 0X10, 0 }, { 0, 0, 0, 0 }, { 0XD2, 0X19, 0X1, 0 }, 3 }, + { 2, { 0XC4, 0XD4, 0XC4, 0 }, { 0X3D, 0X91, 0X3D, 0 }, { 0X20, 0X8, 0X10, 0 }, { 0, 0, 0, 0 }, { 0XD2, 0X19, 0X1, 0 }, 3 }, + { 0, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, 0 } +}; + +static const VIALCDModeFixRec modeFix = { + { 0X1, 0X3, 0X7, 0X5, 0X2E, 0X2F, 0X52, 0X53, 0X56, 0X57, 0X5A, 0X5B, 0X67, 0X68, 0X5D, 0X5E, 0X7D, 0X7E, 0X23, 0X24, 0X26, 0X27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0X2, 0X2, 0X4, 0X30, 0X30, 0X50, 0X50, 0X54, 0X54, 0X58, 0X58, 0X66, 0X66, 0X5C, 0X5C, 0X7C, 0X7C, 0X22, 0X22, 0X25, 0X25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 22 }; + + +#endif /* _VIA_MODE_H_ */ diff --git a/src/via_modeheaders.c b/src/via_modeheaders.c new file mode 100644 index 0000000..a022210 --- /dev/null +++ b/src/via_modeheaders.c @@ -0,0 +1,3609 @@ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/* + * Writes out registertables for the different modes for the different devices. + * Remnant from via development. Use at own risk. + * + * + */ + +#ifdef CREATE_MODETABLE_HEADERFILE +static Bool +VIACreateHeaderFile(VIAModeTablePtr pViaModeTable) +{ + int i, j, k, m; + int numMPatch; + VIALCDMPatchEntryPtr MPatch; + FILE *pFile; + + + if ((pFile = fopen("via_mode.h", "w+")) == NULL) { + ErrorF("Can't open \"via_mode.h\" file!!\n"); + return FALSE; + } + + fprintf(pFile, "#ifndef _VIA_MODETABLE_H\n"); + fprintf(pFile, "#define _VIA_MODETABLE_H\n"); + fprintf(pFile, "\n"); + + fprintf(pFile, "static const unsigned short BIOSVer = %#X;\n\n", pViaModeTable->BIOSVer); + fprintf(pFile, "static char BIOSDate[] = { "); + for (i = 0; i < 9; i++) { + if (i == 8) + fprintf(pFile, "%#X };\n\n", pViaModeTable->BIOSDate[i]); + else + fprintf(pFile, "%#X, ", pViaModeTable->BIOSDate[i]); + } + fprintf(pFile, "static const unsigned short NumModes = %d;\n\n", pViaModeTable->NumModes); + fprintf(pFile, "static const int NumPowerOn = %d;\n\n", pViaModeTable->NumPowerOn); + fprintf(pFile, "static const int NumPowerOff = %d;\n\n", pViaModeTable->NumPowerOff); + fprintf(pFile, "static VIAModeEntry Modes[] = {\n"); + for (i = 0; i < pViaModeTable->NumModes; i++) { + fprintf(pFile, " { %d, %d, %d, %#X, %d, %#X, %#X, ", + pViaModeTable->Modes[i].Width, + pViaModeTable->Modes[i].Height, + pViaModeTable->Modes[i].Bpp, + pViaModeTable->Modes[i].Mode, + pViaModeTable->Modes[i].MemNeed, + pViaModeTable->Modes[i].MClk, + pViaModeTable->Modes[i].VClk); + fprintf(pFile, "{ %d, %d, %d, %#X, ", /* stdVgaTable */ + pViaModeTable->Modes[i].stdVgaTable.columns, + pViaModeTable->Modes[i].stdVgaTable.rows, + pViaModeTable->Modes[i].stdVgaTable.fontHeight, + pViaModeTable->Modes[i].stdVgaTable.pageSize); + fprintf(pFile, "{ "); /* SR[] */ + for (j = 0; j < 5; j++) { + if (j == 4) + fprintf(pFile, "%#X }, ", /* SR[] */ + pViaModeTable->Modes[i].stdVgaTable.SR[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->Modes[i].stdVgaTable.SR[j]); + } + fprintf(pFile, "%#X, ", + pViaModeTable->Modes[i].stdVgaTable.misc); + fprintf(pFile, "{ "); /* CR[] */ + for (j = 0; j < 25; j++) { + if (j == 24) + fprintf(pFile, "%#X }, ", /* CR[] */ + pViaModeTable->Modes[i].stdVgaTable.CR[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->Modes[i].stdVgaTable.CR[j]); + } + fprintf(pFile, "{ "); /* AR[] */ + for (j = 0; j < 20; j++) { + if (j == 19) + fprintf(pFile, "%#X }, ", /* AR[] */ + pViaModeTable->Modes[i].stdVgaTable.AR[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->Modes[i].stdVgaTable.AR[j]); + } + fprintf(pFile, "{ "); /* GR[] */ + for (j = 0; j < 9; j++) { + if (j == 8) + fprintf(pFile, "%#X } ", /* GR[] */ + pViaModeTable->Modes[i].stdVgaTable.GR[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->Modes[i].stdVgaTable.GR[j]); + } + fprintf(pFile, "}, "); /* stdVgaTable */ + fprintf(pFile, "{ "); /* extModeExtTable */ + fprintf(pFile, "{ "); /* extModeExtTable.port[] */ + for (j = 0; j < VIA_BIOS_REG_TABLE_MAX_NUM; j++) { + if (j == (VIA_BIOS_REG_TABLE_MAX_NUM - 1)) + fprintf(pFile, "%#X }, ", /* extModeExtTable.port[] */ + pViaModeTable->Modes[i].extModeExtTable.port[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->Modes[i].extModeExtTable.port[j]); + } + fprintf(pFile, "{ "); /* extModeExtTable.offset[] */ + for (j = 0; j < VIA_BIOS_REG_TABLE_MAX_NUM; j++) { + if (j == (VIA_BIOS_REG_TABLE_MAX_NUM - 1)) + fprintf(pFile, "%#X }, ", /* extModeExtTable.offset[] */ + pViaModeTable->Modes[i].extModeExtTable.offset[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->Modes[i].extModeExtTable.offset[j]); + } + fprintf(pFile, "{ "); /* extModeExtTable.mask[] */ + for (j = 0; j < VIA_BIOS_REG_TABLE_MAX_NUM; j++) { + if (j == (VIA_BIOS_REG_TABLE_MAX_NUM - 1)) + fprintf(pFile, "%#X }, ", /* extModeExtTable.mask[] */ + pViaModeTable->Modes[i].extModeExtTable.mask[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->Modes[i].extModeExtTable.mask[j]); + } + fprintf(pFile, "{ "); /* extModeExtTable.data[] */ + for (j = 0; j < VIA_BIOS_REG_TABLE_MAX_NUM; j++) { + if (j == (VIA_BIOS_REG_TABLE_MAX_NUM - 1)) + fprintf(pFile, "%#X }, ", /* extModeExtTable.data[] */ + pViaModeTable->Modes[i].extModeExtTable.data[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->Modes[i].extModeExtTable.data[j]); + } + fprintf(pFile, "%d ", + pViaModeTable->Modes[i].extModeExtTable.numEntry); + fprintf(pFile, "} "); /* extModeExtTable */ + if (i == (pViaModeTable->NumModes - 1)) + fprintf(pFile, "}\n"); + else + fprintf(pFile, "},\n"); + } + fprintf(pFile, "};\n\n"); + + fprintf(pFile, "static const VIABIOSRegTableRec commExtTable = {\n"); /* commExtTable */ + fprintf(pFile, " { "); /* commExtTable.port[] */ + for (j = 0; j < VIA_BIOS_REG_TABLE_MAX_NUM; j++) { + if (j == (VIA_BIOS_REG_TABLE_MAX_NUM - 1)) + fprintf(pFile, "%#X }, ", /* commExtTable.port[] */ + pViaModeTable->commExtTable.port[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->commExtTable.port[j]); + } + fprintf(pFile, "{ "); /* commExtTable.offset[] */ + for (j = 0; j < VIA_BIOS_REG_TABLE_MAX_NUM; j++) { + if (j == (VIA_BIOS_REG_TABLE_MAX_NUM - 1)) + fprintf(pFile, "%#X }, ", /* commExtTable.offset[] */ + pViaModeTable->commExtTable.offset[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->commExtTable.offset[j]); + } + fprintf(pFile, "{ "); /* commExtTable.mask[] */ + for (j = 0; j < VIA_BIOS_REG_TABLE_MAX_NUM; j++) { + if (j == (VIA_BIOS_REG_TABLE_MAX_NUM - 1)) + fprintf(pFile, "%#X }, ", /* commExtTable.mask[] */ + pViaModeTable->commExtTable.mask[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->commExtTable.mask[j]); + } + fprintf(pFile, "{ "); /* commExtTable.data[] */ + for (j = 0; j < VIA_BIOS_REG_TABLE_MAX_NUM; j++) { + if (j == (VIA_BIOS_REG_TABLE_MAX_NUM - 1)) + fprintf(pFile, "%#X }, ", /* commExtTable.data[] */ + pViaModeTable->commExtTable.data[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->commExtTable.data[j]); + } + fprintf(pFile, "%d ", + pViaModeTable->commExtTable.numEntry); + fprintf(pFile, "};\n\n"); /* commExtTable */ + + fprintf(pFile, "static const VIABIOSRegTableRec stdModeExtTable = {\n"); /* stdModeExtTable */ + fprintf(pFile, " { "); /* stdModeExtTable.port[] */ + for (j = 0; j < VIA_BIOS_REG_TABLE_MAX_NUM; j++) { + if (j == (VIA_BIOS_REG_TABLE_MAX_NUM - 1)) + fprintf(pFile, "%#X }, ", /* stdModeExtTable.port[] */ + pViaModeTable->stdModeExtTable.port[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->stdModeExtTable.port[j]); + } + fprintf(pFile, "{ "); /* stdModeExtTable.offset[] */ + for (j = 0; j < VIA_BIOS_REG_TABLE_MAX_NUM; j++) { + if (j == (VIA_BIOS_REG_TABLE_MAX_NUM - 1)) + fprintf(pFile, "%#X }, ", /* stdModeExtTable.offset[] */ + pViaModeTable->stdModeExtTable.offset[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->stdModeExtTable.offset[j]); + } + fprintf(pFile, "{ "); /* stdModeExtTable.mask[] */ + for (j = 0; j < VIA_BIOS_REG_TABLE_MAX_NUM; j++) { + if (j == (VIA_BIOS_REG_TABLE_MAX_NUM - 1)) + fprintf(pFile, "%#X }, ", /* stdModeExtTable.mask[] */ + pViaModeTable->stdModeExtTable.mask[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->stdModeExtTable.mask[j]); + } + fprintf(pFile, "{ "); /* stdModeExtTable.data[] */ + for (j = 0; j < VIA_BIOS_REG_TABLE_MAX_NUM; j++) { + if (j == (VIA_BIOS_REG_TABLE_MAX_NUM - 1)) + fprintf(pFile, "%#X }, ", /* stdModeExtTable.data[] */ + pViaModeTable->stdModeExtTable.data[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->stdModeExtTable.data[j]); + } + fprintf(pFile, "%d ", + pViaModeTable->stdModeExtTable.numEntry); + fprintf(pFile, "};\n\n"); /* stdModeExtTable */ + + fprintf(pFile, "static const VIABIOSRefreshTableRec refreshTable[%d][%d] = {\n", + VIA_BIOS_NUM_RES, VIA_BIOS_NUM_REFRESH); /* refreshTable */ + for (i = 0; i < VIA_BIOS_NUM_RES; i++) { + fprintf(pFile, " {\n"); + for (j = 0; j < VIA_BIOS_NUM_REFRESH; j++) { + fprintf(pFile, " { %d, %#X, ", + pViaModeTable->refreshTable[i][j].refresh, + pViaModeTable->refreshTable[i][j].VClk); + fprintf(pFile, "{ "); /* refreshTable.CR[] */ + for (k = 0; k < 14; k++) { + if (k == 13) + fprintf(pFile, "%#X } ", /* refreshTable.CR[] */ + pViaModeTable->refreshTable[i][j].CR[k]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->refreshTable[i][j].CR[k]); + } + if (j == (VIA_BIOS_NUM_REFRESH - 1)) { + if (i == (VIA_BIOS_NUM_RES - 1)) + fprintf(pFile, "}\n"); + else + fprintf(pFile, "},\n"); + } + else + fprintf(pFile, "},\n"); + } + if (i == (VIA_BIOS_NUM_RES - 1)) { + fprintf(pFile, " }\n"); + fprintf(pFile, "};\n\n"); + } + else + fprintf(pFile, " },\n"); + } + + fprintf(pFile, "static const VIALCDModeTableRec lcdTable[] = {\n"); /* lcdTable */ + for (i = 0; i < VIA_BIOS_NUM_PANEL; i++) { + fprintf(pFile, " { %#X, %#X, %#X, %d, %d, %d, %d, \n", + pViaModeTable->lcdTable[i].fpIndex, + pViaModeTable->lcdTable[i].fpSize, + pViaModeTable->lcdTable[i].powerSeq, + pViaModeTable->lcdTable[i].numMPatchDP2Ctr, + pViaModeTable->lcdTable[i].numMPatchDP2Exp, + pViaModeTable->lcdTable[i].numMPatchDP1Ctr, + pViaModeTable->lcdTable[i].numMPatchDP1Exp); + + fprintf(pFile, " { "); /* SuptMode */ + for (j = 0; j < VIA_BIOS_NUM_LCD_SUPPORT_MASK; j++) { + if (j == (VIA_BIOS_NUM_LCD_SUPPORT_MASK - 1)) + fprintf(pFile, "%#X }, \n", /* SuptMode */ + pViaModeTable->lcdTable[i].SuptMode[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->lcdTable[i].SuptMode[j]); + } + + fprintf(pFile, " { %#X, %#X, %#X, %#X, ", /* FPconfigTb */ + pViaModeTable->lcdTable[i].FPconfigTb.LCDClk, + pViaModeTable->lcdTable[i].FPconfigTb.VClk, + pViaModeTable->lcdTable[i].FPconfigTb.LCDClk_12Bit, + pViaModeTable->lcdTable[i].FPconfigTb.VClk_12Bit); + fprintf(pFile, "{ "); /* FPconfigTb.port[] */ + for (j = 0; j < VIA_BIOS_REG_LCD_MAX_NUM; j++) { + if (j == (VIA_BIOS_REG_LCD_MAX_NUM - 1)) + fprintf(pFile, "%#X }, ", /* FPconfigTb.port[] */ + pViaModeTable->lcdTable[i].FPconfigTb.port[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->lcdTable[i].FPconfigTb.port[j]); + } + fprintf(pFile, "{ "); /* FPconfigTb.offset[] */ + for (j = 0; j < VIA_BIOS_REG_LCD_MAX_NUM; j++) { + if (j == (VIA_BIOS_REG_LCD_MAX_NUM - 1)) + fprintf(pFile, "%#X }, ", /* FPconfigTb.offset[] */ + pViaModeTable->lcdTable[i].FPconfigTb.offset[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->lcdTable[i].FPconfigTb.offset[j]); + } + fprintf(pFile, "{ "); /* FPconfigTb.data[] */ + for (j = 0; j < VIA_BIOS_REG_LCD_MAX_NUM; j++) { + if (j == (VIA_BIOS_REG_LCD_MAX_NUM - 1)) + fprintf(pFile, "%#X }, ", /* FPconfigTb.data[] */ + pViaModeTable->lcdTable[i].FPconfigTb.data[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->lcdTable[i].FPconfigTb.data[j]); + } + fprintf(pFile, "%d }, \n", /* FPconfigTb */ + pViaModeTable->lcdTable[i].FPconfigTb.numEntry); + + fprintf(pFile, " { %#X, %#X, %#X, %#X, ", /* InitTb */ + pViaModeTable->lcdTable[i].InitTb.LCDClk, + pViaModeTable->lcdTable[i].InitTb.VClk, + pViaModeTable->lcdTable[i].InitTb.LCDClk_12Bit, + pViaModeTable->lcdTable[i].InitTb.VClk_12Bit); + fprintf(pFile, "{ "); /* InitTb.port[] */ + for (j = 0; j < VIA_BIOS_REG_LCD_MAX_NUM; j++) { + if (j == (VIA_BIOS_REG_LCD_MAX_NUM - 1)) + fprintf(pFile, "%#X }, ", /* InitTb.port[] */ + pViaModeTable->lcdTable[i].InitTb.port[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->lcdTable[i].InitTb.port[j]); + } + fprintf(pFile, "{ "); /* InitTb.offset[] */ + for (j = 0; j < VIA_BIOS_REG_LCD_MAX_NUM; j++) { + if (j == (VIA_BIOS_REG_LCD_MAX_NUM - 1)) + fprintf(pFile, "%#X }, ", /* InitTb.offset[] */ + pViaModeTable->lcdTable[i].InitTb.offset[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->lcdTable[i].InitTb.offset[j]); + } + fprintf(pFile, "{ "); /* InitTb.data[] */ + for (j = 0; j < VIA_BIOS_REG_LCD_MAX_NUM; j++) { + if (j == (VIA_BIOS_REG_LCD_MAX_NUM - 1)) + fprintf(pFile, "%#X }, ", /* InitTb.data[] */ + pViaModeTable->lcdTable[i].InitTb.data[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->lcdTable[i].InitTb.data[j]); + } + fprintf(pFile, "%d }, \n", /* InitTb */ + pViaModeTable->lcdTable[i].InitTb.numEntry); + + /* MPatch Table */ + for (m = 0; m < 4; m++) { + switch (m) { + case 0: /* MPatchDP2Ctr */ + MPatch = pViaModeTable->lcdTable[i].MPatchDP2Ctr; + numMPatch = VIA_BIOS_MAX_NUM_MPATCH2; + break; + case 1: /* MPatchDP2Exp */ + MPatch = pViaModeTable->lcdTable[i].MPatchDP2Exp; + numMPatch = VIA_BIOS_MAX_NUM_MPATCH2; + break; + case 2: /* MPatchDP1Ctr */ + MPatch = pViaModeTable->lcdTable[i].MPatchDP1Ctr; + numMPatch = VIA_BIOS_MAX_NUM_MPATCH1; + break; + case 3: /* MPatchDP1Exp */ + MPatch = pViaModeTable->lcdTable[i].MPatchDP1Exp; + numMPatch = VIA_BIOS_MAX_NUM_MPATCH1; + break; + } + + fprintf(pFile, " { \n"); + for (k = 0; k < numMPatch; k++) { + fprintf(pFile, " { %#X, %#X, %#X, %#X, %#X, ", + MPatch[k].Mode, + MPatch[k].LCDClk, + MPatch[k].VClk, + MPatch[k].LCDClk_12Bit, + MPatch[k].VClk_12Bit); + fprintf(pFile, "{ "); /* port[] */ + for (j = 0; j < VIA_BIOS_REG_LCD_MAX_NUM; j++) { + if (j == (VIA_BIOS_REG_LCD_MAX_NUM - 1)) + fprintf(pFile, "%#X }, ", /* port[] */ + MPatch[k].port[j]); + else + fprintf(pFile, "%#X, ", + MPatch[k].port[j]); + } + fprintf(pFile, "{ "); /* offset[] */ + for (j = 0; j < VIA_BIOS_REG_LCD_MAX_NUM; j++) { + if (j == (VIA_BIOS_REG_LCD_MAX_NUM - 1)) + fprintf(pFile, "%#X }, ", /* offset[] */ + MPatch[k].offset[j]); + else + fprintf(pFile, "%#X, ", + MPatch[k].offset[j]); + } + fprintf(pFile, "{ "); /* data[] */ + for (j = 0; j < VIA_BIOS_REG_LCD_MAX_NUM; j++) { + if (j == (VIA_BIOS_REG_LCD_MAX_NUM - 1)) + fprintf(pFile, "%#X }, ", /* data[] */ + MPatch[k].data[j]); + else + fprintf(pFile, "%#X, ", + MPatch[k].data[j]); + } + if (k == (numMPatch - 1)) + fprintf(pFile, "%d }\n }, \n", + MPatch[k].numEntry); + else + fprintf(pFile, "%d }, \n", + MPatch[k].numEntry); + } + } + + fprintf(pFile, " { %#X, %#X, %#X, %#X, ", /* LowResCtr */ + pViaModeTable->lcdTable[i].LowResCtr.LCDClk, + pViaModeTable->lcdTable[i].LowResCtr.VClk, + pViaModeTable->lcdTable[i].LowResCtr.LCDClk_12Bit, + pViaModeTable->lcdTable[i].LowResCtr.VClk_12Bit); + fprintf(pFile, "{ "); /* LowResCtr.port[] */ + for (j = 0; j < VIA_BIOS_REG_LCD_MAX_NUM; j++) { + if (j == (VIA_BIOS_REG_LCD_MAX_NUM - 1)) + fprintf(pFile, "%#X }, ", /* LowResCtr.port[] */ + pViaModeTable->lcdTable[i].LowResCtr.port[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->lcdTable[i].LowResCtr.port[j]); + } + fprintf(pFile, "{ "); /* LowResCtr.offset[] */ + for (j = 0; j < VIA_BIOS_REG_LCD_MAX_NUM; j++) { + if (j == (VIA_BIOS_REG_LCD_MAX_NUM - 1)) + fprintf(pFile, "%#X }, ", /* LowResCtr.offset[] */ + pViaModeTable->lcdTable[i].LowResCtr.offset[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->lcdTable[i].LowResCtr.offset[j]); + } + fprintf(pFile, "{ "); /* LowResCtr.data[] */ + for (j = 0; j < VIA_BIOS_REG_LCD_MAX_NUM; j++) { + if (j == (VIA_BIOS_REG_LCD_MAX_NUM - 1)) + fprintf(pFile, "%#X }, ", /* LowResCtr.data[] */ + pViaModeTable->lcdTable[i].LowResCtr.data[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->lcdTable[i].LowResCtr.data[j]); + } + fprintf(pFile, "%d }, \n", /* LowResCtr */ + pViaModeTable->lcdTable[i].LowResCtr.numEntry); + + fprintf(pFile, " { %#X, %#X, %#X, %#X, ", /* LowResExp */ + pViaModeTable->lcdTable[i].LowResExp.LCDClk, + pViaModeTable->lcdTable[i].LowResExp.VClk, + pViaModeTable->lcdTable[i].LowResExp.LCDClk_12Bit, + pViaModeTable->lcdTable[i].LowResExp.VClk_12Bit); + fprintf(pFile, "{ "); /* LowResExp.port[] */ + for (j = 0; j < VIA_BIOS_REG_LCD_MAX_NUM; j++) { + if (j == (VIA_BIOS_REG_LCD_MAX_NUM - 1)) + fprintf(pFile, "%#X }, ", /* LowResExp.port[] */ + pViaModeTable->lcdTable[i].LowResExp.port[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->lcdTable[i].LowResExp.port[j]); + } + fprintf(pFile, "{ "); /* LowResExp.offset[] */ + for (j = 0; j < VIA_BIOS_REG_LCD_MAX_NUM; j++) { + if (j == (VIA_BIOS_REG_LCD_MAX_NUM - 1)) + fprintf(pFile, "%#X }, ", /* LowResExp.offset[] */ + pViaModeTable->lcdTable[i].LowResExp.offset[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->lcdTable[i].LowResExp.offset[j]); + } + fprintf(pFile, "{ "); /* LowResExp.data[] */ + for (j = 0; j < VIA_BIOS_REG_LCD_MAX_NUM; j++) { + if (j == (VIA_BIOS_REG_LCD_MAX_NUM - 1)) + fprintf(pFile, "%#X }, ", /* LowResExp.data[] */ + pViaModeTable->lcdTable[i].LowResExp.data[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->lcdTable[i].LowResExp.data[j]); + } + fprintf(pFile, "%d }, \n", /* LowResExp */ + pViaModeTable->lcdTable[i].LowResExp.numEntry); + + fprintf(pFile, " { \n"); /* MCtr */ + for (k = 0; k < VIA_BIOS_MAX_NUM_CTREXP; k++) { + fprintf(pFile, " { %#X, %#X, %#X, %#X, ", + pViaModeTable->lcdTable[i].MCtr[k].LCDClk, + pViaModeTable->lcdTable[i].MCtr[k].VClk, + pViaModeTable->lcdTable[i].MCtr[k].LCDClk_12Bit, + pViaModeTable->lcdTable[i].MCtr[k].VClk_12Bit); + fprintf(pFile, "{ "); /* port[] */ + for (j = 0; j < VIA_BIOS_REG_LCD_MAX_NUM; j++) { + if (j == (VIA_BIOS_REG_LCD_MAX_NUM - 1)) + fprintf(pFile, "%#X }, ", /* port[] */ + pViaModeTable->lcdTable[i].MCtr[k].port[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->lcdTable[i].MCtr[k].port[j]); + } + fprintf(pFile, "{ "); /* offset[] */ + for (j = 0; j < VIA_BIOS_REG_LCD_MAX_NUM; j++) { + if (j == (VIA_BIOS_REG_LCD_MAX_NUM - 1)) + fprintf(pFile, "%#X }, ", /* offset[] */ + pViaModeTable->lcdTable[i].MCtr[k].offset[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->lcdTable[i].MCtr[k].offset[j]); + } + fprintf(pFile, "{ "); /* data[] */ + for (j = 0; j < VIA_BIOS_REG_LCD_MAX_NUM; j++) { + if (j == (VIA_BIOS_REG_LCD_MAX_NUM - 1)) + fprintf(pFile, "%#X }, ", /* data[] */ + pViaModeTable->lcdTable[i].MCtr[k].data[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->lcdTable[i].MCtr[k].data[j]); + } + if (k == (VIA_BIOS_MAX_NUM_CTREXP - 1)) + fprintf(pFile, "%d }\n }, \n", + pViaModeTable->lcdTable[i].MCtr[k].numEntry); + else + fprintf(pFile, "%d }, \n", + pViaModeTable->lcdTable[i].MCtr[k].numEntry); + } + + fprintf(pFile, " { \n"); /* MExp */ + for (k = 0; k < VIA_BIOS_MAX_NUM_CTREXP; k++) { + fprintf(pFile, " { %#X, %#X, %#X, %#X, ", + pViaModeTable->lcdTable[i].MExp[k].LCDClk, + pViaModeTable->lcdTable[i].MExp[k].VClk, + pViaModeTable->lcdTable[i].MExp[k].LCDClk_12Bit, + pViaModeTable->lcdTable[i].MExp[k].VClk_12Bit); + fprintf(pFile, "{ "); /* port[] */ + for (j = 0; j < VIA_BIOS_REG_LCD_MAX_NUM; j++) { + if (j == (VIA_BIOS_REG_LCD_MAX_NUM - 1)) + fprintf(pFile, "%#X }, ", /* port[] */ + pViaModeTable->lcdTable[i].MExp[k].port[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->lcdTable[i].MExp[k].port[j]); + } + fprintf(pFile, "{ "); /* offset[] */ + for (j = 0; j < VIA_BIOS_REG_LCD_MAX_NUM; j++) { + if (j == (VIA_BIOS_REG_LCD_MAX_NUM - 1)) + fprintf(pFile, "%#X }, ", /* offset[] */ + pViaModeTable->lcdTable[i].MExp[k].offset[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->lcdTable[i].MExp[k].offset[j]); + } + fprintf(pFile, "{ "); /* data[] */ + for (j = 0; j < VIA_BIOS_REG_LCD_MAX_NUM; j++) { + if (j == (VIA_BIOS_REG_LCD_MAX_NUM - 1)) + fprintf(pFile, "%#X }, ", /* data[] */ + pViaModeTable->lcdTable[i].MExp[k].data[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->lcdTable[i].MExp[k].data[j]); + } + if (k == (VIA_BIOS_MAX_NUM_CTREXP - 1)) + fprintf(pFile, "%d }\n }\n", + pViaModeTable->lcdTable[i].MExp[k].numEntry); + else + fprintf(pFile, "%d }, \n", + pViaModeTable->lcdTable[i].MExp[k].numEntry); + } + if (i == (VIA_BIOS_NUM_PANEL - 1)) + fprintf(pFile, " }\n};\n\n"); + else + fprintf(pFile, " },\n"); + } + + /* powerOn */ + fprintf(pFile, "static const VIALCDPowerSeqRec powerOn[] = {\n"); + for (i = 0; i < VIA_BIOS_NUM_LCD_POWER_SEQ; i++) { + fprintf(pFile, " { %d, ", + pViaModeTable->powerOn[i].powerSeq); + fprintf(pFile, "{ "); /* port[] */ + for (j = 0; j < 4; j++) { + if (j == 3) + fprintf(pFile, "%#X }, ", /* port[] */ + pViaModeTable->powerOn[i].port[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->powerOn[i].port[j]); + } + fprintf(pFile, "{ "); /* offset[] */ + for (j = 0; j < 4; j++) { + if (j == 3) + fprintf(pFile, "%#X }, ", /* offset[] */ + pViaModeTable->powerOn[i].offset[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->powerOn[i].offset[j]); + } + fprintf(pFile, "{ "); /* mask[] */ + for (j = 0; j < 4; j++) { + if (j == 3) + fprintf(pFile, "%#X }, ", /* mask[] */ + pViaModeTable->powerOn[i].mask[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->powerOn[i].mask[j]); + } + fprintf(pFile, "{ "); /* data[] */ + for (j = 0; j < 4; j++) { + if (j == 3) + fprintf(pFile, "%#X }, ", /* data[] */ + pViaModeTable->powerOn[i].data[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->powerOn[i].data[j]); + } + fprintf(pFile, "{ "); /* delay[] */ + for (j = 0; j < 4; j++) { + if (j == 3) + fprintf(pFile, "%#X }, ", /* delay[] */ + pViaModeTable->powerOn[i].delay[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->powerOn[i].delay[j]); + } + if (i == (VIA_BIOS_NUM_LCD_POWER_SEQ - 1)) { + fprintf(pFile, "%d }\n}; \n\n", + pViaModeTable->powerOn[i].numEntry); + } + else + fprintf(pFile, "%d }, \n", + pViaModeTable->powerOn[i].numEntry); + } + + /* powerOff */ + fprintf(pFile, "static const VIALCDPowerSeqRec powerOff[] = {\n"); + for (i = 0; i < VIA_BIOS_NUM_LCD_POWER_SEQ; i++) { + fprintf(pFile, " { %d, ", + pViaModeTable->powerOff[i].powerSeq); + fprintf(pFile, "{ "); /* port[] */ + for (j = 0; j < 4; j++) { + if (j == 3) + fprintf(pFile, "%#X }, ", /* port[] */ + pViaModeTable->powerOff[i].port[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->powerOff[i].port[j]); + } + fprintf(pFile, "{ "); /* offset[] */ + for (j = 0; j < 4; j++) { + if (j == 3) + fprintf(pFile, "%#X }, ", /* offset[] */ + pViaModeTable->powerOff[i].offset[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->powerOff[i].offset[j]); + } + fprintf(pFile, "{ "); /* mask[] */ + for (j = 0; j < 4; j++) { + if (j == 3) + fprintf(pFile, "%#X }, ", /* mask[] */ + pViaModeTable->powerOff[i].mask[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->powerOff[i].mask[j]); + } + fprintf(pFile, "{ "); /* data[] */ + for (j = 0; j < 4; j++) { + if (j == 3) + fprintf(pFile, "%#X }, ", /* data[] */ + pViaModeTable->powerOff[i].data[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->powerOff[i].data[j]); + } + fprintf(pFile, "{ "); /* delay[] */ + for (j = 0; j < 4; j++) { + if (j == 3) + fprintf(pFile, "%#X }, ", /* delay[] */ + pViaModeTable->powerOff[i].delay[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->powerOff[i].delay[j]); + } + if (i == (VIA_BIOS_NUM_LCD_POWER_SEQ - 1)) { + fprintf(pFile, "%d }\n}; \n\n", + pViaModeTable->powerOff[i].numEntry); + } + else + fprintf(pFile, "%d }, \n", + pViaModeTable->powerOff[i].numEntry); + } + + /* ModeFix */ + fprintf(pFile, "static const VIALCDModeFixRec modeFix = {\n"); + fprintf(pFile, " { "); /* modeFix.reqMode[] */ + for (i = 0; i < 32; i++) { + if (i == 31) + fprintf(pFile, "%#X }, ", /* ModeFix.reqMode[] */ + pViaModeTable->modeFix.reqMode[i]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->modeFix.reqMode[i]); + } + fprintf(pFile, "{ "); /* modeFix.fixMode[] */ + for (i = 0; i < 32; i++) { + if (i == 31) + fprintf(pFile, "%#X }, ", /* modeFix.fixMode[] */ + pViaModeTable->modeFix.fixMode[i]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->modeFix.fixMode[i]); + } + fprintf(pFile, "%d }; \n\n", + pViaModeTable->modeFix.numEntry); + + fprintf(pFile, "\n"); + fprintf(pFile, "#endif\n"); + + if (fclose(pFile) != 0) { + ErrorF("Error closing file!!\n"); + return FALSE; + } + else + return TRUE; +} +#endif /* CREATE_MODETABLE_HEADERFILE */ + + +#ifdef CREATE_FS454_HEADERFILE +static Bool +VIACreateFS454(VIAModeTablePtr pViaModeTable) +{ + int i, j; + FILE *pFile; + + if ((pFile = fopen("via_fs454.h", "w+")) == NULL) { + ErrorF("Can't open \"via_fs454.h\" file!!\n"); + return FALSE; + } + + fprintf(pFile, "#ifndef _VIA_FS454MODETABLE_H\n"); + fprintf(pFile, "#define _VIA_FS454MODETABLE_H\n"); + fprintf(pFile, "\n"); + + /* fs454MaskTable */ + fprintf(pFile, "static const VIABIOSFS454TVMASKTableRec fs454MaskTable = {\n"); + fprintf(pFile, " { "); + for (i = 0; i < VIA_BIOS_MAX_NUM_TV_CRTC; i++) { + if (i == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* fs454MaskTable.CRTC1[] */ + pViaModeTable->fs454MaskTable.CRTC1[i]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->fs454MaskTable.CRTC1[i]); + } + + fprintf(pFile, " { "); /* fs454MaskTable.CRTC2[] */ + for (i = 0; i < VIA_BIOS_MAX_NUM_TV_CRTC; i++) { + if (i == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* fs454MaskTable.CRTC2[] */ + pViaModeTable->fs454MaskTable.CRTC2[i]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->fs454MaskTable.CRTC2[i]); + } + + fprintf(pFile, " %#X, %#X, %d, %d, %d \n};\n\n", + pViaModeTable->fs454MaskTable.misc1, + pViaModeTable->fs454MaskTable.misc2, + pViaModeTable->fs454MaskTable.numCRTC1, + pViaModeTable->fs454MaskTable.numCRTC2); + + /* fs454Table */ + fprintf(pFile, "static const VIABIOSFS454TableRec fs454Table[] = {\n"); + for (i = 0; i < VIA_BIOS_NUM_FS454; i++) { + fprintf(pFile, " {\n"); + + fprintf(pFile, " { "); /* fs454Table.TVNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_FS454_TV_REG; j++) { + if (j == (VIA_BIOS_NUM_FS454_TV_REG - 1)) + fprintf(pFile, "%#X },\n", /* fs454Table.TVNTSC[] */ + pViaModeTable->fs454Table[i].TVNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->fs454Table[i].TVNTSC[j]); + } + + fprintf(pFile, " { "); /* fs454Table.CRTCNTSC1[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* fs454Table.CRTCNTSC1[] */ + pViaModeTable->fs454Table[i].CRTCNTSC1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->fs454Table[i].CRTCNTSC1[j]); + } + + fprintf(pFile, " { "); /* fs454Table.MiscNTSC1[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* fs454Table.MiscNTSC1[] */ + pViaModeTable->fs454Table[i].MiscNTSC1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->fs454Table[i].MiscNTSC1[j]); + } + + fprintf(pFile, " { "); /* fs454Table.MiscNTSC2[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* fs454Table.MiscNTSC2[] */ + pViaModeTable->fs454Table[i].MiscNTSC2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->fs454Table[i].MiscNTSC2[j]); + } + + fprintf(pFile, " { "); /* fs454Table.CRTCNTSC2_8BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* fs454Table.CRTCNTSC2_8BPP[] */ + pViaModeTable->fs454Table[i].CRTCNTSC2_8BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->fs454Table[i].CRTCNTSC2_8BPP[j]); + } + + fprintf(pFile, " { "); /* fs454Table.CRTCNTSC2_16BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* fs454Table.CRTCNTSC2_16BPP[] */ + pViaModeTable->fs454Table[i].CRTCNTSC2_16BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->fs454Table[i].CRTCNTSC2_16BPP[j]); + } + + fprintf(pFile, " { "); /* fs454Table.CRTCNTSC2_32BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* fs454Table.CRTCNTSC2_32BPP[] */ + pViaModeTable->fs454Table[i].CRTCNTSC2_32BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->fs454Table[i].CRTCNTSC2_32BPP[j]); + } + + fprintf(pFile, " { "); /* fs454Table.RGBNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* fs454Table.RGBNTSC[] */ + pViaModeTable->fs454Table[i].RGBNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->fs454Table[i].RGBNTSC[j]); + } + + fprintf(pFile, " { "); /* fs454Table.YCbCrNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* fs454Table.YCbCrNTSC[] */ + pViaModeTable->fs454Table[i].YCbCrNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->fs454Table[i].YCbCrNTSC[j]); + } + + fprintf(pFile, " { "); /* fs454Table.DotCrawlNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* fs454Table.DotCrawlNTSC[] */ + pViaModeTable->fs454Table[i].DotCrawlNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->fs454Table[i].DotCrawlNTSC[j]); + } + + if (i == (VIA_BIOS_NUM_FS454 - 1)) + fprintf(pFile, " }\n};\n\n"); + else + fprintf(pFile, " }, \n"); + } + + /* fs454OverTable */ + fprintf(pFile, "static const VIABIOSFS454TableRec fs454OverTable[] = {\n"); + for (i = 0; i < VIA_BIOS_NUM_FS454; i++) { + fprintf(pFile, " {\n"); + + fprintf(pFile, " { "); + for (j = 0; j < VIA_BIOS_NUM_FS454_TV_REG; j++) { + if (j == (VIA_BIOS_NUM_FS454_TV_REG - 1)) + fprintf(pFile, "%#X },\n", /* fs454OverTable.TVNTSC[] */ + pViaModeTable->fs454OverTable[i].TVNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->fs454OverTable[i].TVNTSC[j]); + } + + fprintf(pFile, " { "); /* fs454OverTable.CRTCNTSC1[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* fs454OverTable.CRTCNTSC1[] */ + pViaModeTable->fs454OverTable[i].CRTCNTSC1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->fs454OverTable[i].CRTCNTSC1[j]); + } + + fprintf(pFile, " { "); /* fs454OverTable.MiscNTSC1[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* fs454OverTable.MiscNTSC1[] */ + pViaModeTable->fs454OverTable[i].MiscNTSC1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->fs454OverTable[i].MiscNTSC1[j]); + } + + fprintf(pFile, " { "); /* fs454OverTable.MiscNTSC2[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* fs454OverTable.MiscNTSC2[] */ + pViaModeTable->fs454OverTable[i].MiscNTSC2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->fs454OverTable[i].MiscNTSC2[j]); + } + + fprintf(pFile, " { "); /* fs454OverTable.CRTCNTSC2_8BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* fs454OverTable.CRTCNTSC2_8BPP[] */ + pViaModeTable->fs454OverTable[i].CRTCNTSC2_8BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->fs454OverTable[i].CRTCNTSC2_8BPP[j]); + } + + fprintf(pFile, " { "); /* fs454OverTable.CRTCNTSC2_16BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* fs454OverTable.CRTCNTSC2_16BPP[] */ + pViaModeTable->fs454OverTable[i].CRTCNTSC2_16BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->fs454OverTable[i].CRTCNTSC2_16BPP[j]); + } + + fprintf(pFile, " { "); /* fs454OverTable.CRTCNTSC2_32BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* fs454OverTable.CRTCNTSC2_32BPP[] */ + pViaModeTable->fs454OverTable[i].CRTCNTSC2_32BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->fs454OverTable[i].CRTCNTSC2_32BPP[j]); + } + + fprintf(pFile, " { "); /* fs454OverTable.RGBNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* fs454OverTable.RGBNTSC[] */ + pViaModeTable->fs454OverTable[i].RGBNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->fs454OverTable[i].RGBNTSC[j]); + } + + fprintf(pFile, " { "); /* fs454OverTable.YCbCrNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* fs454OverTable.YCbCrNTSC[] */ + pViaModeTable->fs454OverTable[i].YCbCrNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->fs454OverTable[i].YCbCrNTSC[j]); + } + + fprintf(pFile, " { "); /* fs454OverTable.DotCrawlNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* fs454OverTable.DotCrawlNTSC[] */ + pViaModeTable->fs454OverTable[i].DotCrawlNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->fs454OverTable[i].DotCrawlNTSC[j]); + } + + if (i == (VIA_BIOS_NUM_FS454 - 1)) + fprintf(pFile, " }\n};\n"); + else + fprintf(pFile, " }, \n"); + } + + fprintf(pFile, "\n"); + fprintf(pFile, "#endif\n"); + + return TRUE; +} +#endif /* CREATE_FS454_HEADERFILE */ + +#ifdef CREATE_TV2_HEADERFILE +static Bool +VIACreateTV2(VIAModeTablePtr pViaModeTable) +{ + int i, j; + FILE *pFile; + + + if ((pFile = fopen("via_tv2.h", "w+")) == NULL) { + ErrorF("Can't open \"via_tv2.h\" file!!\n"); + return FALSE; + } + + fprintf(pFile, "#ifndef _VIA_TV2MODETABLE_H\n"); + fprintf(pFile, "#define _VIA_TV2MODETABLE_H\n"); + fprintf(pFile, "\n"); + + /* tv2MaskTable */ + fprintf(pFile, "static const VIABIOSTVMASKTableRec tv2MaskTable = {\n"); + fprintf(pFile, " { "); /* tv2MaskTable.TV[] */ + for (i = 0; i < VIA_BIOS_MAX_NUM_TV_REG; i++) { + if (i == (VIA_BIOS_MAX_NUM_TV_REG - 1)) + fprintf(pFile, "%#X },\n", /* tv2MaskTable.TV[] */ + pViaModeTable->tv2MaskTable.TV[i]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2MaskTable.TV[i]); + } + + fprintf(pFile, " { "); /* tv2MaskTable.CRTC1[] */ + for (i = 0; i < VIA_BIOS_MAX_NUM_TV_CRTC; i++) { + if (i == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv2MaskTable.CRTC1[] */ + pViaModeTable->tv2MaskTable.CRTC1[i]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2MaskTable.CRTC1[i]); + } + + fprintf(pFile, " { "); /* tv2MaskTable.CRTC2[] */ + for (i = 0; i < VIA_BIOS_MAX_NUM_TV_CRTC; i++) { + if (i == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv2MaskTable.CRTC2[] */ + pViaModeTable->tv2MaskTable.CRTC2[i]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2MaskTable.CRTC2[i]); + } + + fprintf(pFile, " %#X, %#X, %d, %d, %d \n};\n\n", + pViaModeTable->tv2MaskTable.misc1, + pViaModeTable->tv2MaskTable.misc2, + pViaModeTable->tv2MaskTable.numTV, + pViaModeTable->tv2MaskTable.numCRTC1, + pViaModeTable->tv2MaskTable.numCRTC2); + + fprintf(pFile, "static const VIABIOSTV2TableRec tv2Table[] = {\n"); /* tv2Table */ + for (i = 0; i < VIA_BIOS_NUM_TV2; i++) { + fprintf(pFile, " {\n"); + fprintf(pFile, " { "); /* tv2Table.TVNTSCC[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_REG; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_REG - 1)) + fprintf(pFile, "%#X },\n", /* tv2Table.TVNTSCC[] */ + pViaModeTable->tv2Table[i].TVNTSCC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2Table[i].TVNTSCC[j]); + } + + fprintf(pFile, " { "); /* tv2Table.TVNTSCS[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_REG; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_REG - 1)) + fprintf(pFile, "%#X },\n", /* tv2Table.TVNTSCS[] */ + pViaModeTable->tv2Table[i].TVNTSCS[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2Table[i].TVNTSCS[j]); + } + + fprintf(pFile, " { "); /* tv2Table.CRTCNTSC1[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv2Table.CRTCNTSC1[] */ + pViaModeTable->tv2Table[i].CRTCNTSC1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2Table[i].CRTCNTSC1[j]); + } + + fprintf(pFile, " { "); /* tv2Table.MiscNTSC1[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* tv2Table.MiscNTSC1[] */ + pViaModeTable->tv2Table[i].MiscNTSC1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2Table[i].MiscNTSC1[j]); + } + + fprintf(pFile, " { "); /* tv2Table.MiscNTSC2[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* tv2Table.MiscNTSC2[] */ + pViaModeTable->tv2Table[i].MiscNTSC2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2Table[i].MiscNTSC2[j]); + } + + fprintf(pFile, " { "); /* tv2Table.CRTCNTSC2_8BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv2Table.CRTCNTSC2_8BPP[] */ + pViaModeTable->tv2Table[i].CRTCNTSC2_8BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2Table[i].CRTCNTSC2_8BPP[j]); + } + + fprintf(pFile, " { "); /* tv2Table.CRTCNTSC2_16BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv2Table.CRTCNTSC2_16BPP[] */ + pViaModeTable->tv2Table[i].CRTCNTSC2_16BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2Table[i].CRTCNTSC2_16BPP[j]); + } + + fprintf(pFile, " { "); /* tv2Table.CRTCNTSC2_32BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv2Table.CRTCNTSC2_32BPP[] */ + pViaModeTable->tv2Table[i].CRTCNTSC2_32BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2Table[i].CRTCNTSC2_32BPP[j]); + } + + fprintf(pFile, " { "); /* tv2Table.PatchNTSC2[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_PATCH; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_PATCH - 1)) + fprintf(pFile, "%#X },\n", /* tv2Table.PatchNTSC[] */ + pViaModeTable->tv2Table[i].PatchNTSC2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2Table[i].PatchNTSC2[j]); + } + + fprintf(pFile, " { "); /* tv2Table.DotCrawlNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* tv2Table.DotCrawlNTSC[] */ + pViaModeTable->tv2Table[i].DotCrawlNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2Table[i].DotCrawlNTSC[j]); + } + + fprintf(pFile, " { "); /* tv2Table.TVPALC[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_REG; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_REG - 1)) + fprintf(pFile, "%#X },\n", /* tv2Table.TVPALC[] */ + pViaModeTable->tv2Table[i].TVPALC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2Table[i].TVPALC[j]); + } + + fprintf(pFile, " { "); /* tv2Table.TVPALS[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_REG; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_REG - 1)) + fprintf(pFile, "%#X },\n", /* tv2Table.TVPALS[] */ + pViaModeTable->tv2Table[i].TVPALS[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2Table[i].TVPALS[j]); + } + + fprintf(pFile, " { "); /* tv2Table.CRTCPAL1[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv2Table.CRTCPAL1[] */ + pViaModeTable->tv2Table[i].CRTCPAL1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2Table[i].CRTCPAL1[j]); + } + + fprintf(pFile, " { "); /* tv2Table.MiscPAL1[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* tv2Table.MiscPAL1[] */ + pViaModeTable->tv2Table[i].MiscPAL1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2Table[i].MiscPAL1[j]); + } + + fprintf(pFile, " { "); /* tv2Table.MiscPAL2[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* tv2Table.MiscPAL2[] */ + pViaModeTable->tv2Table[i].MiscPAL2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2Table[i].MiscPAL2[j]); + } + + fprintf(pFile, " { "); /* tv2Table.CRTCPAL2_8BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv2Table.CRTCPAL2_8BPP[] */ + pViaModeTable->tv2Table[i].CRTCPAL2_8BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2Table[i].CRTCPAL2_8BPP[j]); + } + + fprintf(pFile, " { "); /* tv2Table.CRTCPAL2_16BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv2Table.CRTCPAL2_16BPP[] */ + pViaModeTable->tv2Table[i].CRTCPAL2_16BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2Table[i].CRTCPAL2_16BPP[j]); + } + + fprintf(pFile, " { "); /* tv2Table.CRTCPAL2_32BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv2Table.CRTCPAL2_32BPP[] */ + pViaModeTable->tv2Table[i].CRTCPAL2_32BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2Table[i].CRTCPAL2_32BPP[j]); + } + + fprintf(pFile, " { "); /* tv2Table.PatchPAL2[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_PATCH; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_PATCH - 1)) + fprintf(pFile, "%#X }\n", /* tv2Table.PatchPAL2[] */ + pViaModeTable->tv2Table[i].PatchPAL2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2Table[i].PatchPAL2[j]); + } + + if (i == (VIA_BIOS_NUM_TV2 - 1)) + fprintf(pFile, " }\n};\n\n"); + else + fprintf(pFile, " }, \n"); + } + + /* tv2OverTable */ + fprintf(pFile, "static const VIABIOSTV2TableRec tv2OverTable[] = {\n"); + for (i = 0; i < VIA_BIOS_NUM_TV2; i++) { + fprintf(pFile, " {\n"); + fprintf(pFile, " { "); /* tv2OverTable.TVNTSCC[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_REG; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_REG - 1)) + fprintf(pFile, "%#X },\n", /* tv2OverTable.TVNTSCC[] */ + pViaModeTable->tv2OverTable[i].TVNTSCC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2OverTable[i].TVNTSCC[j]); + } + + fprintf(pFile, " { "); /* tv2OverTable.TVNTSCS[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_REG; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_REG - 1)) + fprintf(pFile, "%#X },\n", /* tv2OverTable.TVNTSCS[] */ + pViaModeTable->tv2OverTable[i].TVNTSCS[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2OverTable[i].TVNTSCS[j]); + } + + fprintf(pFile, " { "); /* tv2OverTable.CRTCNTSC1[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv2OverTable.CRTCNTSC1[] */ + pViaModeTable->tv2OverTable[i].CRTCNTSC1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2OverTable[i].CRTCNTSC1[j]); + } + + fprintf(pFile, " { "); /* tv2OverTable.MiscNTSC1[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* tv2OverTable.MiscNTSC1[] */ + pViaModeTable->tv2OverTable[i].MiscNTSC1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2OverTable[i].MiscNTSC1[j]); + } + + fprintf(pFile, " { "); /* tv2OverTable.MiscNTSC2[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* tv2OverTable.MiscNTSC2[] */ + pViaModeTable->tv2OverTable[i].MiscNTSC2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2OverTable[i].MiscNTSC2[j]); + } + + fprintf(pFile, " { "); /* tv2OverTable.CRTCNTSC2_8BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv2OverTable.CRTCNTSC2_8BPP[] */ + pViaModeTable->tv2OverTable[i].CRTCNTSC2_8BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2OverTable[i].CRTCNTSC2_8BPP[j]); + } + + fprintf(pFile, " { "); /* tv2OverTable.CRTCNTSC2_16BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv2OverTable.CRTCNTSC2_16BPP[] */ + pViaModeTable->tv2OverTable[i].CRTCNTSC2_16BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2OverTable[i].CRTCNTSC2_16BPP[j]); + } + + fprintf(pFile, " { "); /* tv2OverTable.CRTCNTSC2_32BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv2OverTable.CRTCNTSC2_32BPP[] */ + pViaModeTable->tv2OverTable[i].CRTCNTSC2_32BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2OverTable[i].CRTCNTSC2_32BPP[j]); + } + + fprintf(pFile, " { "); /* tv2OverTable.PatchNTSC2[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_PATCH; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_PATCH - 1)) + fprintf(pFile, "%#X },\n", /* tv2OverTable.PatchNTSC[] */ + pViaModeTable->tv2OverTable[i].PatchNTSC2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2OverTable[i].PatchNTSC2[j]); + } + + fprintf(pFile, " { "); /* tv2OverTable.DotCrawlNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* tv2OverTable.DotCrawlNTSC[] */ + pViaModeTable->tv2OverTable[i].DotCrawlNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2OverTable[i].DotCrawlNTSC[j]); + } + + fprintf(pFile, " { "); /* tv2OverTable.TVPALC[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_REG; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_REG - 1)) + fprintf(pFile, "%#X },\n", /* tv2OverTable.TVPALC[] */ + pViaModeTable->tv2OverTable[i].TVPALC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2OverTable[i].TVPALC[j]); + } + + fprintf(pFile, " { "); /* tv2OverTable.TVPALS[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_REG; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_REG - 1)) + fprintf(pFile, "%#X },\n", /* tv2OverTable.TVPALS[] */ + pViaModeTable->tv2OverTable[i].TVPALS[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2OverTable[i].TVPALS[j]); + } + + fprintf(pFile, " { "); /* tv2OverTable.CRTCPAL1[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv2OverTable.CRTCPAL1[] */ + pViaModeTable->tv2OverTable[i].CRTCPAL1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2OverTable[i].CRTCPAL1[j]); + } + + fprintf(pFile, " { "); /* tv2OverTable.MiscPAL1[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* tv2OverTable.MiscPAL1[] */ + pViaModeTable->tv2OverTable[i].MiscPAL1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2OverTable[i].MiscPAL1[j]); + } + + fprintf(pFile, " { "); /* tv2OverTable.MiscPAL2[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* tv2OverTable.MiscPAL2[] */ + pViaModeTable->tv2OverTable[i].MiscPAL2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2OverTable[i].MiscPAL2[j]); + } + + fprintf(pFile, " { "); /* tv2OverTable.CRTCPAL2_8BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv2OverTable.CRTCPAL2_8BPP[] */ + pViaModeTable->tv2OverTable[i].CRTCPAL2_8BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2OverTable[i].CRTCPAL2_8BPP[j]); + } + + fprintf(pFile, " { "); /* tv2OverTable.CRTCPAL2_16BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv2OverTable.CRTCPAL2_16BPP[] */ + pViaModeTable->tv2OverTable[i].CRTCPAL2_16BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2OverTable[i].CRTCPAL2_16BPP[j]); + } + + fprintf(pFile, " { "); /* tv2OverTable.CRTCPAL2_32BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv2OverTable.CRTCPAL2_32BPP[] */ + pViaModeTable->tv2OverTable[i].CRTCPAL2_32BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2OverTable[i].CRTCPAL2_32BPP[j]); + } + + fprintf(pFile, " { "); /* tv2Table.PatchPAL2[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_PATCH; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_PATCH - 1)) + fprintf(pFile, "%#X }\n", /* tv2Table.PatchPAL2[] */ + pViaModeTable->tv2OverTable[i].PatchPAL2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv2OverTable[i].PatchPAL2[j]); + } + + if (i == (VIA_BIOS_NUM_TV2 - 1)) + fprintf(pFile, " }\n};\n"); + else + fprintf(pFile, " }, \n"); + } + + fprintf(pFile, "\n"); + fprintf(pFile, "#endif\n"); + + return TRUE; +} +#endif /* CREATE_TV2_HEADERFILE */ + +#ifdef CREATE_TV3_HEADERFILE +static Bool +VIACreateTV3(VIAModeTablePtr pViaModeTable) +{ + int i, j; + FILE *pFile; + + if ((pFile = fopen("via_tv3.h", "w+")) == NULL) { + ErrorF("Can't open \"via_tv3.h\" file!!\n"); + return FALSE; + } + + fprintf(pFile, "#ifndef _VIA_TV3MODETABLE_H\n"); + fprintf(pFile, "#define _VIA_TV3MODETABLE_H\n"); + fprintf(pFile, "\n"); + + /* tv3MaskTable */ + fprintf(pFile, "static const VIABIOSTVMASKTableRec tv3MaskTable = {\n"); + fprintf(pFile, " { "); /* tv3MaskTable.TV[] */ + for (i = 0; i < VIA_BIOS_MAX_NUM_TV_REG; i++) { + if (i == (VIA_BIOS_MAX_NUM_TV_REG - 1)) + fprintf(pFile, "%#X },\n", /* tv3MaskTable.TV[] */ + pViaModeTable->tv3MaskTable.TV[i]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3MaskTable.TV[i]); + } + + fprintf(pFile, " { "); /* tv3MaskTable.CRTC1[] */ + for (i = 0; i < VIA_BIOS_MAX_NUM_TV_CRTC; i++) { + if (i == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv3MaskTable.CRTC1[] */ + pViaModeTable->tv3MaskTable.CRTC1[i]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3MaskTable.CRTC1[i]); + } + + fprintf(pFile, " { "); /* tv3MaskTable.CRTC2[] */ + for (i = 0; i < VIA_BIOS_MAX_NUM_TV_CRTC; i++) { + if (i == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv3MaskTable.CRTC2[] */ + pViaModeTable->tv3MaskTable.CRTC2[i]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3MaskTable.CRTC2[i]); + } + + fprintf(pFile, " %#X, %#X, %d, %d, %d \n};\n\n", + pViaModeTable->tv3MaskTable.misc1, + pViaModeTable->tv3MaskTable.misc2, + pViaModeTable->tv3MaskTable.numTV, + pViaModeTable->tv3MaskTable.numCRTC1, + pViaModeTable->tv3MaskTable.numCRTC2); + + /* tv3Table */ + fprintf(pFile, "static const VIABIOSTV3TableRec tv3Table[] = {\n"); + for (i = 0; i < VIA_BIOS_NUM_TV3; i++) { + fprintf(pFile, " {\n"); + fprintf(pFile, " { "); /* tv3Table.TVNTSC[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_REG; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_REG - 1)) + fprintf(pFile, "%#X },\n", /* tv3Table.TVNTSC[] */ + pViaModeTable->tv3Table[i].TVNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3Table[i].TVNTSC[j]); + } + + fprintf(pFile, " { "); /* tv3Table.CRTCNTSC1[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv3Table.CRTCNTSC1[] */ + pViaModeTable->tv3Table[i].CRTCNTSC1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3Table[i].CRTCNTSC1[j]); + } + + fprintf(pFile, " { "); /* tv3Table.MiscNTSC1[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* tv3Table.MiscNTSC1[] */ + pViaModeTable->tv3Table[i].MiscNTSC1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3Table[i].MiscNTSC1[j]); + } + + fprintf(pFile, " { "); /* tv3Table.MiscNTSC2[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* tv3Table.MiscNTSC2[] */ + pViaModeTable->tv3Table[i].MiscNTSC2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3Table[i].MiscNTSC2[j]); + } + + fprintf(pFile, " { "); /* tv3Table.CRTCNTSC2_8BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv3Table.CRTCNTSC2_8BPP[] */ + pViaModeTable->tv3Table[i].CRTCNTSC2_8BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3Table[i].CRTCNTSC2_8BPP[j]); + } + + fprintf(pFile, " { "); /* tv3Table.CRTCNTSC2_16BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv3Table.CRTCNTSC2_16BPP[] */ + pViaModeTable->tv3Table[i].CRTCNTSC2_16BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3Table[i].CRTCNTSC2_16BPP[j]); + } + + fprintf(pFile, " { "); /* tv3Table.CRTCNTSC2_32BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv3Table.CRTCNTSC2_32BPP[] */ + pViaModeTable->tv3Table[i].CRTCNTSC2_32BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3Table[i].CRTCNTSC2_32BPP[j]); + } + + fprintf(pFile, " { "); /* tv3Table.PatchNTSC2[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_PATCH; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_PATCH - 1)) + fprintf(pFile, "%#X },\n", /* tv3Table.PatchNTSC2[] */ + pViaModeTable->tv3Table[i].PatchNTSC2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3Table[i].PatchNTSC2[j]); + } + + fprintf(pFile, " { "); /* tv3Table.RGBNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* tv3Table.RGBNTSC[] */ + pViaModeTable->tv3Table[i].RGBNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3Table[i].RGBNTSC[j]); + } + + fprintf(pFile, " { "); /* tv3Table.YCbCrNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* tv3Table.YCbCrNTSC[] */ + pViaModeTable->tv3Table[i].YCbCrNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3Table[i].YCbCrNTSC[j]); + } + + fprintf(pFile, " { "); /* tv3Table.SDTV_RGBNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* tv3Table.SDTV_RGBNTSC[] */ + pViaModeTable->tv3Table[i].SDTV_RGBNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3Table[i].SDTV_RGBNTSC[j]); + } + + fprintf(pFile, " { "); /* tv3Table.SDTV_YCbCrNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* tv3Table.SDTV_YCbCrNTSC[] */ + pViaModeTable->tv3Table[i].SDTV_YCbCrNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3Table[i].SDTV_YCbCrNTSC[j]); + } + + fprintf(pFile, " { "); /* tv3Table.DotCrawlNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* tv3Table.DotCrawlNTSC[] */ + pViaModeTable->tv3Table[i].DotCrawlNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3Table[i].DotCrawlNTSC[j]); + } + + fprintf(pFile, " { "); /* tv3Table.TVPAL[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_REG; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_REG - 1)) + fprintf(pFile, "%#X },\n", /* tv3Table.TVPAL[] */ + pViaModeTable->tv3Table[i].TVPAL[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3Table[i].TVPAL[j]); + } + + fprintf(pFile, " { "); /* tv3Table.CRTCPAL1[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv3Table.CRTCPAL1[] */ + pViaModeTable->tv3Table[i].CRTCPAL1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3Table[i].CRTCPAL1[j]); + } + + fprintf(pFile, " { "); /* tv3Table.MiscPAL1[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* tv3Table.MiscPAL1[] */ + pViaModeTable->tv3Table[i].MiscPAL1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3Table[i].MiscPAL1[j]); + } + + fprintf(pFile, " { "); /* tv3Table.MiscPAL2[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* tv3Table.MiscPAL2[] */ + pViaModeTable->tv3Table[i].MiscPAL2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3Table[i].MiscPAL2[j]); + } + + fprintf(pFile, " { "); /* tv3Table.CRTCPAL2_8BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv3Table.CRTCPAL2_8BPP[] */ + pViaModeTable->tv3Table[i].CRTCPAL2_8BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3Table[i].CRTCPAL2_8BPP[j]); + } + + fprintf(pFile, " { "); /* tv3Table.CRTCPAL2_16BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv3Table.CRTCPAL2_16BPP[] */ + pViaModeTable->tv3Table[i].CRTCPAL2_16BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3Table[i].CRTCPAL2_16BPP[j]); + } + + fprintf(pFile, " { "); /* tv3Table.CRTCPAL2_32BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv3Table.CRTCPAL2_32BPP[] */ + pViaModeTable->tv3Table[i].CRTCPAL2_32BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3Table[i].CRTCPAL2_32BPP[j]); + } + + fprintf(pFile, " { "); /* tv3Table.PatchPAL2[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_PATCH; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_PATCH - 1)) + fprintf(pFile, "%#X },\n", /* tv3Table.PatchPAL2[] */ + pViaModeTable->tv3Table[i].PatchPAL2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3Table[i].PatchPAL2[j]); + } + + fprintf(pFile, " { "); /* tv3Table.RGBPAL[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* tv3Table.RGBPAL[] */ + pViaModeTable->tv3Table[i].RGBPAL[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3Table[i].RGBPAL[j]); + } + + fprintf(pFile, " { "); /* tv3Table.YCbCrPAL[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* tv3Table.YCbCrPAL[] */ + pViaModeTable->tv3Table[i].YCbCrPAL[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3Table[i].YCbCrPAL[j]); + } + + fprintf(pFile, " { "); /* tv3Table.SDTV_RGBPAL[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* tv3Table.SDTV_RGBPAL[] */ + pViaModeTable->tv3Table[i].SDTV_RGBPAL[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3Table[i].SDTV_RGBPAL[j]); + } + + fprintf(pFile, " { "); /* tv3Table.SDTV_YCbCrPAL[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X }\n", /* tv3Table.SDTV_YCbCrPAL[] */ + pViaModeTable->tv3Table[i].SDTV_YCbCrPAL[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3Table[i].SDTV_YCbCrPAL[j]); + } + + if (i == (VIA_BIOS_NUM_TV3 - 1)) + fprintf(pFile, " }\n};\n\n"); + else + fprintf(pFile, " }, \n"); + } + + /* tv3OverTable */ + fprintf(pFile, "static const VIABIOSTV3TableRec tv3OverTable[] = {\n"); + for (i = 0; i < VIA_BIOS_NUM_TV3; i++) { + fprintf(pFile, " {\n"); + fprintf(pFile, " { "); /* tv3OverTable.TVNTSC[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_REG; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_REG - 1)) + fprintf(pFile, "%#X },\n", /* tv3OverTable.TVNTSC[] */ + pViaModeTable->tv3OverTable[i].TVNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3OverTable[i].TVNTSC[j]); + } + + fprintf(pFile, " { "); /* tv3OverTable.CRTCNTSC1[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv3OverTable.CRTCNTSC1[] */ + pViaModeTable->tv3OverTable[i].CRTCNTSC1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3OverTable[i].CRTCNTSC1[j]); + } + + fprintf(pFile, " { "); /* tv3OverTable.MiscNTSC1[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* tv3OverTable.MiscNTSC1[] */ + pViaModeTable->tv3OverTable[i].MiscNTSC1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3OverTable[i].MiscNTSC1[j]); + } + + fprintf(pFile, " { "); /* tv3OverTable.MiscNTSC2[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* tv3OverTable.MiscNTSC2[] */ + pViaModeTable->tv3OverTable[i].MiscNTSC2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3OverTable[i].MiscNTSC2[j]); + } + + fprintf(pFile, " { "); /* tv3OverTable.CRTCNTSC2_8BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv3OverTable.CRTCNTSC2_8BPP[] */ + pViaModeTable->tv3OverTable[i].CRTCNTSC2_8BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3OverTable[i].CRTCNTSC2_8BPP[j]); + } + + fprintf(pFile, " { "); /* tv3OverTable.CRTCNTSC2_16BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv3OverTable.CRTCNTSC2_16BPP[] */ + pViaModeTable->tv3OverTable[i].CRTCNTSC2_16BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3OverTable[i].CRTCNTSC2_16BPP[j]); + } + + fprintf(pFile, " { "); /* tv3OverTable.CRTCNTSC2_32BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv3OverTable.CRTCNTSC2_32BPP[] */ + pViaModeTable->tv3OverTable[i].CRTCNTSC2_32BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3OverTable[i].CRTCNTSC2_32BPP[j]); + } + + fprintf(pFile, " { "); /* tv3OverTable.PatchNTSC2[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_PATCH; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_PATCH - 1)) + fprintf(pFile, "%#X },\n", /* tv3OverTable.PatchNTSC2[] */ + pViaModeTable->tv3OverTable[i].PatchNTSC2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3OverTable[i].PatchNTSC2[j]); + } + + fprintf(pFile, " { "); /* tv3OverTable.RGBNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* tv3OverTable.RGBNTSC[] */ + pViaModeTable->tv3OverTable[i].RGBNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3OverTable[i].RGBNTSC[j]); + } + + fprintf(pFile, " { "); /* tv3OverTable.YCbCrNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* tv3OverTable.YCbCrNTSC[] */ + pViaModeTable->tv3OverTable[i].YCbCrNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3OverTable[i].YCbCrNTSC[j]); + } + + fprintf(pFile, " { "); /* tv3OverTable.SDTV_RGBNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* tv3OverTable.SDTV_RGBNTSC[] */ + pViaModeTable->tv3OverTable[i].SDTV_RGBNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3OverTable[i].SDTV_RGBNTSC[j]); + } + + fprintf(pFile, " { "); /* tv3OverTable.SDTV_YCbCrNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* tv3OverTable.SDTV_YCbCrNTSC[] */ + pViaModeTable->tv3OverTable[i].SDTV_YCbCrNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3OverTable[i].SDTV_YCbCrNTSC[j]); + } + + fprintf(pFile, " { "); /* tv3OverTable.DotCrawlNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* tv3OverTable.DotCrawlNTSC[] */ + pViaModeTable->tv3OverTable[i].DotCrawlNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3OverTable[i].DotCrawlNTSC[j]); + } + + fprintf(pFile, " { "); /* tv3OverTable.TVPAL[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_REG; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_REG - 1)) + fprintf(pFile, "%#X },\n", /* tv3OverTable.TVPAL[] */ + pViaModeTable->tv3OverTable[i].TVPAL[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3OverTable[i].TVPAL[j]); + } + + fprintf(pFile, " { "); /* tv3OverTable.CRTCPAL1[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv3OverTable.CRTCPAL1[] */ + pViaModeTable->tv3OverTable[i].CRTCPAL1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3OverTable[i].CRTCPAL1[j]); + } + + fprintf(pFile, " { "); /* tv3OverTable.MiscPAL1[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* tv3OverTable.MiscPAL1[] */ + pViaModeTable->tv3OverTable[i].MiscPAL1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3OverTable[i].MiscPAL1[j]); + } + + fprintf(pFile, " { "); /* tv3OverTable.MiscPAL2[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* tv3OverTable.MiscPAL2[] */ + pViaModeTable->tv3OverTable[i].MiscPAL2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3OverTable[i].MiscPAL2[j]); + } + + fprintf(pFile, " { "); /* tv3Over.CRTCPAL2_8BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv3OverTable.CRTCPAL2_8BPP[] */ + pViaModeTable->tv3OverTable[i].CRTCPAL2_8BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3OverTable[i].CRTCPAL2_8BPP[j]); + } + + fprintf(pFile, " { "); /* tv3OverTable.CRTCPAL2_16BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv3OverTable.CRTCPAL2_16BPP[] */ + pViaModeTable->tv3OverTable[i].CRTCPAL2_16BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3OverTable[i].CRTCPAL2_16BPP[j]); + } + + fprintf(pFile, " { "); /* tv3OverTable.CRTCPAL2_32BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* tv3OverTable.CRTCPAL2_32BPP[] */ + pViaModeTable->tv3OverTable[i].CRTCPAL2_32BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3OverTable[i].CRTCPAL2_32BPP[j]); + } + + fprintf(pFile, " { "); /* tv3OverTable.PatchPAL2[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_PATCH; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_PATCH - 1)) + fprintf(pFile, "%#X },\n", /* tv3OverTable.PatchPAL2[] */ + pViaModeTable->tv3OverTable[i].PatchPAL2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3OverTable[i].PatchPAL2[j]); + } + + fprintf(pFile, " { "); /* tv3OverTable.RGBPAL[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* tv3OverTable.RGBPAL[] */ + pViaModeTable->tv3OverTable[i].RGBPAL[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3OverTable[i].RGBPAL[j]); + } + + fprintf(pFile, " { "); /* tv3OverTable.YCbCrPAL[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* tv3OverTable.YCbCrPAL[] */ + pViaModeTable->tv3OverTable[i].YCbCrPAL[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3OverTable[i].YCbCrPAL[j]); + } + + fprintf(pFile, " { "); /* tv3OverTable.SDTV_RGBPAL[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* tv3OverTable.SDTV_RGBPAL[] */ + pViaModeTable->tv3OverTable[i].SDTV_RGBPAL[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3OverTable[i].SDTV_RGBPAL[j]); + } + + fprintf(pFile, " { "); /* tv3OverTable.SDTV_YCbCrPAL[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X }\n", /* tv3OverTable.SDTV_YCbCrPAL[] */ + pViaModeTable->tv3OverTable[i].SDTV_YCbCrPAL[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->tv3OverTable[i].SDTV_YCbCrPAL[j]); + } + + if (i == (VIA_BIOS_NUM_TV3 - 1)) + fprintf(pFile, " }\n};\n"); + else + fprintf(pFile, " }, \n"); + } + + fprintf(pFile, "\n"); + fprintf(pFile, "#endif\n"); + + return TRUE; +} +#endif /* CREATE_TV3_HEADERFILE */ + +#ifdef CREATE_VT1622A_HEADERFILE +static Bool +VIACreateVT1622A(VIAModeTablePtr pViaModeTable) +{ + int i, j; + FILE *pFile; + + if ((pFile = fopen("via_vt1622a.h", "w+")) == NULL) { + ErrorF("Can't open \"via_vt1622a.h\" file!!\n"); + return FALSE; + } + + fprintf(pFile, "#ifndef _VIA_VT1622AMODETABLE_H\n"); + fprintf(pFile, "#define _VIA_VT1622AMODETABLE_H\n"); + fprintf(pFile, "\n"); + + /* tv3MaskTable */ + fprintf(pFile, "static const VIABIOSTVMASKTableRec vt1622aMaskTable = {\n"); + fprintf(pFile, " { "); /* vt1622aMaskTable.TV[] */ + for (i = 0; i < VIA_BIOS_MAX_NUM_TV_REG; i++) { + if (i == (VIA_BIOS_MAX_NUM_TV_REG - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aMaskTable.TV[] */ + pViaModeTable->vt1622aMaskTable.TV[i]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aMaskTable.TV[i]); + } + + fprintf(pFile, " { "); /* vt1622aMaskTable.CRTC1[] */ + for (i = 0; i < VIA_BIOS_MAX_NUM_TV_CRTC; i++) { + if (i == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aMaskTable.CRTC1[] */ + pViaModeTable->vt1622aMaskTable.CRTC1[i]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aMaskTable.CRTC1[i]); + } + + fprintf(pFile, " { "); /* vt1622aMaskTable.CRTC2[] */ + for (i = 0; i < VIA_BIOS_MAX_NUM_TV_CRTC; i++) { + if (i == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aMaskTable.CRTC2[] */ + pViaModeTable->vt1622aMaskTable.CRTC2[i]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aMaskTable.CRTC2[i]); + } + + fprintf(pFile, " %#X, %#X, %d, %d, %d \n};\n\n", + pViaModeTable->vt1622aMaskTable.misc1, + pViaModeTable->vt1622aMaskTable.misc2, + pViaModeTable->vt1622aMaskTable.numTV, + pViaModeTable->vt1622aMaskTable.numCRTC1, + pViaModeTable->vt1622aMaskTable.numCRTC2); + + /* tv3Table */ + fprintf(pFile, "static const VIABIOSTV3TableRec vt1622aTable[] = {\n"); + for (i = 0; i < VIA_BIOS_NUM_TV3; i++) { + fprintf(pFile, " {\n"); + fprintf(pFile, " { "); /* vt1622aTable.TVNTSC[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_REG; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_REG - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aTable.TVNTSC[] */ + pViaModeTable->vt1622aTable[i].TVNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aTable[i].TVNTSC[j]); + } + + fprintf(pFile, " { "); /* vt1622aTable.CRTCNTSC1[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aTable.CRTCNTSC1[] */ + pViaModeTable->vt1622aTable[i].CRTCNTSC1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aTable[i].CRTCNTSC1[j]); + } + + fprintf(pFile, " { "); /* vt1622aTable.MiscNTSC1[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aTable.MiscNTSC1[] */ + pViaModeTable->vt1622aTable[i].MiscNTSC1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aTable[i].MiscNTSC1[j]); + } + + fprintf(pFile, " { "); /* vt1622aTable.MiscNTSC2[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aTable.MiscNTSC2[] */ + pViaModeTable->vt1622aTable[i].MiscNTSC2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aTable[i].MiscNTSC2[j]); + } + + fprintf(pFile, " { "); /* vt1622aTable.CRTCNTSC2_8BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aTable.CRTCNTSC2_8BPP[] */ + pViaModeTable->vt1622aTable[i].CRTCNTSC2_8BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aTable[i].CRTCNTSC2_8BPP[j]); + } + + fprintf(pFile, " { "); /* vt1622aTable.CRTCNTSC2_16BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aTable.CRTCNTSC2_16BPP[] */ + pViaModeTable->vt1622aTable[i].CRTCNTSC2_16BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aTable[i].CRTCNTSC2_16BPP[j]); + } + + fprintf(pFile, " { "); /* vt1622aTable.CRTCNTSC2_32BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aTable.CRTCNTSC2_32BPP[] */ + pViaModeTable->vt1622aTable[i].CRTCNTSC2_32BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aTable[i].CRTCNTSC2_32BPP[j]); + } + + fprintf(pFile, " { "); /* vt1622aTable.PatchNTSC2[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_PATCH; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_PATCH - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aTable.PatchNTSC2[] */ + pViaModeTable->vt1622aTable[i].PatchNTSC2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aTable[i].PatchNTSC2[j]); + } + + fprintf(pFile, " { "); /* vt1622aTable.RGBNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aTable.RGBNTSC[] */ + pViaModeTable->vt1622aTable[i].RGBNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aTable[i].RGBNTSC[j]); + } + + fprintf(pFile, " { "); /* vt1622aTable.YCbCrNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aTable.YCbCrNTSC[] */ + pViaModeTable->vt1622aTable[i].YCbCrNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aTable[i].YCbCrNTSC[j]); + } + + fprintf(pFile, " { "); /* vt1622aTable.SDTV_RGBNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aTable.SDTV_RGBNTSC[] */ + pViaModeTable->vt1622aTable[i].SDTV_RGBNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aTable[i].SDTV_RGBNTSC[j]); + } + + fprintf(pFile, " { "); /* vt1622aTable.SDTV_YCbCrNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aTable.SDTV_YCbCrNTSC[] */ + pViaModeTable->vt1622aTable[i].SDTV_YCbCrNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aTable[i].SDTV_YCbCrNTSC[j]); + } + + fprintf(pFile, " { "); /* vt1622aTable.DotCrawlNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aTable.DotCrawlNTSC[] */ + pViaModeTable->vt1622aTable[i].DotCrawlNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aTable[i].DotCrawlNTSC[j]); + } + + fprintf(pFile, " { "); /* vt1622aTable.TVPAL[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_REG; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_REG - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aTable.TVPAL[] */ + pViaModeTable->vt1622aTable[i].TVPAL[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aTable[i].TVPAL[j]); + } + + fprintf(pFile, " { "); /* vt1622aTable.CRTCPAL1[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aTable.CRTCPAL1[] */ + pViaModeTable->vt1622aTable[i].CRTCPAL1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aTable[i].CRTCPAL1[j]); + } + + fprintf(pFile, " { "); /* vt1622aTable.MiscPAL1[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aTable.MiscPAL1[] */ + pViaModeTable->vt1622aTable[i].MiscPAL1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aTable[i].MiscPAL1[j]); + } + + fprintf(pFile, " { "); /* vt1622aTable.MiscPAL2[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aTable.MiscPAL2[] */ + pViaModeTable->vt1622aTable[i].MiscPAL2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aTable[i].MiscPAL2[j]); + } + + fprintf(pFile, " { "); /* vt1622aTable.CRTCPAL2_8BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aTable.CRTCPAL2_8BPP[] */ + pViaModeTable->vt1622aTable[i].CRTCPAL2_8BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aTable[i].CRTCPAL2_8BPP[j]); + } + + fprintf(pFile, " { "); /* vt1622aTable.CRTCPAL2_16BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aTable.CRTCPAL2_16BPP[] */ + pViaModeTable->vt1622aTable[i].CRTCPAL2_16BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aTable[i].CRTCPAL2_16BPP[j]); + } + + fprintf(pFile, " { "); /* vt1622aTable.CRTCPAL2_32BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aTable.CRTCPAL2_32BPP[] */ + pViaModeTable->vt1622aTable[i].CRTCPAL2_32BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aTable[i].CRTCPAL2_32BPP[j]); + } + + fprintf(pFile, " { "); /* vt1622aTable.PatchPAL2[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_PATCH; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_PATCH - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aTable.PatchPAL2[] */ + pViaModeTable->vt1622aTable[i].PatchPAL2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aTable[i].PatchPAL2[j]); + } + + fprintf(pFile, " { "); /* vt1622aTable.RGBPAL[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aTable.RGBPAL[] */ + pViaModeTable->vt1622aTable[i].RGBPAL[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aTable[i].RGBPAL[j]); + } + + fprintf(pFile, " { "); /* vt1622aTable.YCbCrPAL[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aTable.YCbCrPAL[] */ + pViaModeTable->vt1622aTable[i].YCbCrPAL[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aTable[i].YCbCrPAL[j]); + } + + fprintf(pFile, " { "); /* vt1622aTable.SDTV_RGBPAL[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aTable.SDTV_RGBPAL[] */ + pViaModeTable->vt1622aTable[i].SDTV_RGBPAL[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aTable[i].SDTV_RGBPAL[j]); + } + + fprintf(pFile, " { "); /* vt1622aTable.SDTV_YCbCrPAL[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X }\n", /* vt1622aTable.SDTV_YCbCrPAL[] */ + pViaModeTable->vt1622aTable[i].SDTV_YCbCrPAL[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aTable[i].SDTV_YCbCrPAL[j]); + } + + if (i == (VIA_BIOS_NUM_TV3 - 1)) + fprintf(pFile, " }\n};\n\n"); + else + fprintf(pFile, " }, \n"); + } + + /* tv3OverTable */ + fprintf(pFile, "static const VIABIOSTV3TableRec vt1622aOverTable[] = {\n"); + for (i = 0; i < VIA_BIOS_NUM_TV3; i++) { + fprintf(pFile, " {\n"); + fprintf(pFile, " { "); /* vt1622aOverTable.TVNTSC[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_REG; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_REG - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aOverTable.TVNTSC[] */ + pViaModeTable->vt1622aOverTable[i].TVNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aOverTable[i].TVNTSC[j]); + } + + fprintf(pFile, " { "); /* vt1622aOverTable.CRTCNTSC1[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aOverTable.CRTCNTSC1[] */ + pViaModeTable->vt1622aOverTable[i].CRTCNTSC1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aOverTable[i].CRTCNTSC1[j]); + } + + fprintf(pFile, " { "); /* vt1622aOverTable.MiscNTSC1[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aOverTable.MiscNTSC1[] */ + pViaModeTable->vt1622aOverTable[i].MiscNTSC1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aOverTable[i].MiscNTSC1[j]); + } + + fprintf(pFile, " { "); /* vt1622aOverTable.MiscNTSC2[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aOverTable.MiscNTSC2[] */ + pViaModeTable->vt1622aOverTable[i].MiscNTSC2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aOverTable[i].MiscNTSC2[j]); + } + + fprintf(pFile, " { "); /* vt1622aOverTable.CRTCNTSC2_8BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aOverTable.CRTCNTSC2_8BPP[] */ + pViaModeTable->vt1622aOverTable[i].CRTCNTSC2_8BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aOverTable[i].CRTCNTSC2_8BPP[j]); + } + + fprintf(pFile, " { "); /* vt1622aOverTable.CRTCNTSC2_16BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aOverTable.CRTCNTSC2_16BPP[] */ + pViaModeTable->vt1622aOverTable[i].CRTCNTSC2_16BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aOverTable[i].CRTCNTSC2_16BPP[j]); + } + + fprintf(pFile, " { "); /* vt1622aOverTable.CRTCNTSC2_32BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aOverTable.CRTCNTSC2_32BPP[] */ + pViaModeTable->vt1622aOverTable[i].CRTCNTSC2_32BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aOverTable[i].CRTCNTSC2_32BPP[j]); + } + + fprintf(pFile, " { "); /* vt1622aOverTable.PatchNTSC2[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_PATCH; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_PATCH - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aOverTable.PatchNTSC2[] */ + pViaModeTable->vt1622aOverTable[i].PatchNTSC2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aOverTable[i].PatchNTSC2[j]); + } + + fprintf(pFile, " { "); /* vt1622aOverTable.RGBNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aOverTable.RGBNTSC[] */ + pViaModeTable->vt1622aOverTable[i].RGBNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aOverTable[i].RGBNTSC[j]); + } + + fprintf(pFile, " { "); /* vt1622aOverTable.YCbCrNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aOverTable.YCbCrNTSC[] */ + pViaModeTable->vt1622aOverTable[i].YCbCrNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aOverTable[i].YCbCrNTSC[j]); + } + + fprintf(pFile, " { "); /* vt1622aOverTable.SDTV_RGBNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aOverTable.SDTV_RGBNTSC[] */ + pViaModeTable->vt1622aOverTable[i].SDTV_RGBNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aOverTable[i].SDTV_RGBNTSC[j]); + } + + fprintf(pFile, " { "); /* vt1622aOverTable.SDTV_YCbCrNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aOverTable.SDTV_YCbCrNTSC[] */ + pViaModeTable->vt1622aOverTable[i].SDTV_YCbCrNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aOverTable[i].SDTV_YCbCrNTSC[j]); + } + + fprintf(pFile, " { "); /* vt1622aOverTable.DotCrawlNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aOverTable.DotCrawlNTSC[] */ + pViaModeTable->vt1622aOverTable[i].DotCrawlNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aOverTable[i].DotCrawlNTSC[j]); + } + + fprintf(pFile, " { "); /* vt1622aOverTable.TVPAL[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_REG; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_REG - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aOverTable.TVPAL[] */ + pViaModeTable->vt1622aOverTable[i].TVPAL[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aOverTable[i].TVPAL[j]); + } + + fprintf(pFile, " { "); /* vt1622aOverTable.CRTCPAL1[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aOverTable.CRTCPAL1[] */ + pViaModeTable->vt1622aOverTable[i].CRTCPAL1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aOverTable[i].CRTCPAL1[j]); + } + + fprintf(pFile, " { "); /* vt1622aOverTable.MiscPAL1[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aOverTable.MiscPAL1[] */ + pViaModeTable->vt1622aOverTable[i].MiscPAL1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aOverTable[i].MiscPAL1[j]); + } + + fprintf(pFile, " { "); /* vt1622aOverTable.MiscPAL2[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aOverTable.MiscPAL2[] */ + pViaModeTable->vt1622aOverTable[i].MiscPAL2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aOverTable[i].MiscPAL2[j]); + } + + fprintf(pFile, " { "); /* vt1622aOver.CRTCPAL2_8BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aOverTable.CRTCPAL2_8BPP[] */ + pViaModeTable->vt1622aOverTable[i].CRTCPAL2_8BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aOverTable[i].CRTCPAL2_8BPP[j]); + } + + fprintf(pFile, " { "); /* vt1622aOverTable.CRTCPAL2_16BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aOverTable.CRTCPAL2_16BPP[] */ + pViaModeTable->vt1622aOverTable[i].CRTCPAL2_16BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aOverTable[i].CRTCPAL2_16BPP[j]); + } + + fprintf(pFile, " { "); /* vt1622aOverTable.CRTCPAL2_32BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aOverTable.CRTCPAL2_32BPP[] */ + pViaModeTable->vt1622aOverTable[i].CRTCPAL2_32BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aOverTable[i].CRTCPAL2_32BPP[j]); + } + + fprintf(pFile, " { "); /* vt1622aOverTable.PatchPAL2[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_PATCH; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_PATCH - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aOverTable.PatchPAL2[] */ + pViaModeTable->vt1622aOverTable[i].PatchPAL2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aOverTable[i].PatchPAL2[j]); + } + + fprintf(pFile, " { "); /* vt1622aOverTable.RGBPAL[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aOverTable.RGBPAL[] */ + pViaModeTable->vt1622aOverTable[i].RGBPAL[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aOverTable[i].RGBPAL[j]); + } + + fprintf(pFile, " { "); /* vt1622aOverTable.YCbCrPAL[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aOverTable.YCbCrPAL[] */ + pViaModeTable->vt1622aOverTable[i].YCbCrPAL[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aOverTable[i].YCbCrPAL[j]); + } + + fprintf(pFile, " { "); /* vt1622aOverTable.SDTV_RGBPAL[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* vt1622aOverTable.SDTV_RGBPAL[] */ + pViaModeTable->vt1622aOverTable[i].SDTV_RGBPAL[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aOverTable[i].SDTV_RGBPAL[j]); + } + + fprintf(pFile, " { "); /* vt1622aOverTable.SDTV_YCbCrPAL[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X }\n", /* vt1622aOverTable.SDTV_YCbCrPAL[] */ + pViaModeTable->vt1622aOverTable[i].SDTV_YCbCrPAL[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->vt1622aOverTable[i].SDTV_YCbCrPAL[j]); + } + + if (i == (VIA_BIOS_NUM_TV3 - 1)) + fprintf(pFile, " }\n};\n"); + else + fprintf(pFile, " }, \n"); + } + + fprintf(pFile, "\n"); + fprintf(pFile, "#endif\n"); + + return TRUE; +} +#endif /* CREATE_VT1622A_HEADERFILE */ + +#ifdef CREATE_SAA7108_HEADERFILE +static Bool +VIACreateSAA7108(VIAModeTablePtr pViaModeTable) +{ + int i, j; + FILE *pFile; + + if ((pFile = fopen("via_saa7108.h", "w+")) == NULL) { + ErrorF("Can't open \"via_saa7108.h\" file!!\n"); + return FALSE; + } + + fprintf(pFile, "#ifndef _VIA_SAA7108MODETABLE_H\n"); + fprintf(pFile, "#define _VIA_SAA7108MODETABLE_H\n"); + fprintf(pFile, "\n"); + + /* saa7108MaskTable */ + fprintf(pFile, "static const VIABIOSSAA7108TVMASKTableRec saa7108MaskTable = {\n"); + fprintf(pFile, " { "); /* saa7108MaskTable.TV[] */ + for (i = 0; i < VIA_BIOS_MAX_NUM_SAA7108_TV_REG; i++) { + if (i == (VIA_BIOS_MAX_NUM_SAA7108_TV_REG - 1)) + fprintf(pFile, "%#X },\n", /* saa7108MaskTable.TV[] */ + pViaModeTable->saa7108MaskTable.TV[i]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108MaskTable.TV[i]); + } + + fprintf(pFile, " { "); /* saa7108MaskTable.CRTC1[] */ + for (i = 0; i < VIA_BIOS_MAX_NUM_TV_CRTC; i++) { + if (i == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* saa7108MaskTable.CRTC1[] */ + pViaModeTable->saa7108MaskTable.CRTC1[i]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108MaskTable.CRTC1[i]); + } + + fprintf(pFile, " { "); /* saa7108MaskTable.CRTC2[] */ + for (i = 0; i < VIA_BIOS_MAX_NUM_TV_CRTC; i++) { + if (i == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* saa7108MaskTable.CRTC2[] */ + pViaModeTable->saa7108MaskTable.CRTC2[i]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108MaskTable.CRTC2[i]); + } + + fprintf(pFile, " %#X, %#X, %d, %d, %d \n};\n\n", + pViaModeTable->saa7108MaskTable.misc1, + pViaModeTable->saa7108MaskTable.misc2, + pViaModeTable->saa7108MaskTable.numTV, + pViaModeTable->saa7108MaskTable.numCRTC1, + pViaModeTable->saa7108MaskTable.numCRTC2); + + /* saa7108Table */ + fprintf(pFile, "static const VIABIOSSAA7108TableRec saa7108Table[] = {\n"); + for (i = 0; i < VIA_BIOS_NUM_SAA7108; i++) { + fprintf(pFile, " {\n"); + fprintf(pFile, " { "); /* saa7108Table.TVNTSC[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_SAA7108_TV_REG; j++) { + if (j == (VIA_BIOS_MAX_NUM_SAA7108_TV_REG - 1)) + fprintf(pFile, "%#X },\n", /* saa7108Table.TVNTSC[] */ + pViaModeTable->saa7108Table[i].TVNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108Table[i].TVNTSC[j]); + } + + fprintf(pFile, " { "); /* saa7108Table.CRTCNTSC1[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* saa7108Table.CRTCNTSC1[] */ + pViaModeTable->saa7108Table[i].CRTCNTSC1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108Table[i].CRTCNTSC1[j]); + } + + fprintf(pFile, " { "); /* saa7108Table.MiscNTSC1[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* saa7108Table.MiscNTSC1[] */ + pViaModeTable->saa7108Table[i].MiscNTSC1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108Table[i].MiscNTSC1[j]); + } + + fprintf(pFile, " { "); /* saa7108Table.MiscNTSC2[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* saa7108Table.MiscNTSC2[] */ + pViaModeTable->saa7108Table[i].MiscNTSC2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108Table[i].MiscNTSC2[j]); + } + + fprintf(pFile, " { "); /* saa7108Table.CRTCNTSC2_8BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* saa7108Table.CRTCNTSC2_8BPP[] */ + pViaModeTable->saa7108Table[i].CRTCNTSC2_8BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108Table[i].CRTCNTSC2_8BPP[j]); + } + + fprintf(pFile, " { "); /* saa7108Table.CRTCNTSC2_16BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* saa7108Table.CRTCNTSC2_16BPP[] */ + pViaModeTable->saa7108Table[i].CRTCNTSC2_16BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108Table[i].CRTCNTSC2_16BPP[j]); + } + + fprintf(pFile, " { "); /* saa7108Table.CRTCNTSC2_32BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* saa7108Table.CRTCNTSC2_32BPP[] */ + pViaModeTable->saa7108Table[i].CRTCNTSC2_32BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108Table[i].CRTCNTSC2_32BPP[j]); + } + + fprintf(pFile, " { "); /* saa7108Table.PatchNTSC2[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_PATCH; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_PATCH - 1)) + fprintf(pFile, "%#X },\n", /* saa7108Table.PatchNTSC2[] */ + pViaModeTable->saa7108Table[i].PatchNTSC2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108Table[i].PatchNTSC2[j]); + } + + fprintf(pFile, " { "); /* saa7108Table.RGBNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* saa7108Table.RGBNTSC[] */ + pViaModeTable->saa7108Table[i].RGBNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108Table[i].RGBNTSC[j]); + } + + fprintf(pFile, " { "); /* saa7108Table.YCbCrNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* saa7108Table.YCbCrNTSC[] */ + pViaModeTable->saa7108Table[i].YCbCrNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108Table[i].YCbCrNTSC[j]); + } +#if 0 + fprintf(pFile, " { "); /* saa7108Table.DotCrawlNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* saa7108Table.DotCrawlNTSC[] */ + pViaModeTable->saa7108Table[i].DotCrawlNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108Table[i].DotCrawlNTSC[j]); + } +#endif + fprintf(pFile, " { "); /* saa7108Table.TVPAL[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_SAA7108_TV_REG; j++) { + if (j == (VIA_BIOS_MAX_NUM_SAA7108_TV_REG - 1)) + fprintf(pFile, "%#X },\n", /* saa7108Table.TVPAL[] */ + pViaModeTable->saa7108Table[i].TVPAL[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108Table[i].TVPAL[j]); + } + + fprintf(pFile, " { "); /* saa7108Table.CRTCPAL1[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* saa7108Table.CRTCPAL1[] */ + pViaModeTable->saa7108Table[i].CRTCPAL1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108Table[i].CRTCPAL1[j]); + } + + fprintf(pFile, " { "); /* saa7108Table.MiscPAL1[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* saa7108Table.MiscPAL1[] */ + pViaModeTable->saa7108Table[i].MiscPAL1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108Table[i].MiscPAL1[j]); + } + + fprintf(pFile, " { "); /* saa7108Table.MiscPAL2[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* saa7108Table.MiscPAL2[] */ + pViaModeTable->saa7108Table[i].MiscPAL2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108Table[i].MiscPAL2[j]); + } + + fprintf(pFile, " { "); /* saa7108Table.CRTCPAL2_8BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* saa7108Table.CRTCPAL2_8BPP[] */ + pViaModeTable->saa7108Table[i].CRTCPAL2_8BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108Table[i].CRTCPAL2_8BPP[j]); + } + + fprintf(pFile, " { "); /* saa7108Table.CRTCPAL2_16BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* saa7108Table.CRTCPAL2_16BPP[] */ + pViaModeTable->saa7108Table[i].CRTCPAL2_16BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108Table[i].CRTCPAL2_16BPP[j]); + } + + fprintf(pFile, " { "); /* saa7108Table.CRTCPAL2_32BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* saa7108Table.CRTCPAL2_32BPP[] */ + pViaModeTable->saa7108Table[i].CRTCPAL2_32BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108Table[i].CRTCPAL2_32BPP[j]); + } + + fprintf(pFile, " { "); /* saa7108Table.PatchPAL2[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_PATCH; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_PATCH - 1)) + fprintf(pFile, "%#X },\n", /* saa7108Table.PatchPAL2[] */ + pViaModeTable->saa7108Table[i].PatchPAL2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108Table[i].PatchPAL2[j]); + } + + fprintf(pFile, " { "); /* saa7108Table.RGBPAL[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* saa7108Table.RGBPAL[] */ + pViaModeTable->saa7108Table[i].RGBPAL[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108Table[i].RGBPAL[j]); + } + + fprintf(pFile, " { "); /* saa7108Table.YCbCrPAL[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* saa7108Table.YCbCrPAL[] */ + pViaModeTable->saa7108Table[i].YCbCrPAL[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108Table[i].YCbCrPAL[j]); + } + + if (i == (VIA_BIOS_NUM_SAA7108 - 1)) + fprintf(pFile, " }\n};\n\n"); + else + fprintf(pFile, " }, \n"); + } + + /* saa7108OverTable */ + fprintf(pFile, "static const VIABIOSSAA7108TableRec saa7108OverTable[] = {\n"); + for (i = 0; i < VIA_BIOS_NUM_SAA7108; i++) { + fprintf(pFile, " {\n"); + fprintf(pFile, " { "); /* saa7108OverTable.TVNTSC[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_SAA7108_TV_REG; j++) { + if (j == (VIA_BIOS_MAX_NUM_SAA7108_TV_REG - 1)) + fprintf(pFile, "%#X },\n", /* saa7108OverTable.TVNTSC[] */ + pViaModeTable->saa7108OverTable[i].TVNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108OverTable[i].TVNTSC[j]); + } + + fprintf(pFile, " { "); /* saa7108OverTable.CRTCNTSC1[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* saa7108OverTable.CRTCNTSC1[] */ + pViaModeTable->saa7108OverTable[i].CRTCNTSC1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108OverTable[i].CRTCNTSC1[j]); + } + + fprintf(pFile, " { "); /* saa7108OverTable.MiscNTSC1[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* saa7108OverTable.MiscNTSC1[] */ + pViaModeTable->saa7108OverTable[i].MiscNTSC1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108OverTable[i].MiscNTSC1[j]); + } + + fprintf(pFile, " { "); /* saa7108OverTable.MiscNTSC2[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* saa7108OverTable.MiscNTSC2[] */ + pViaModeTable->saa7108OverTable[i].MiscNTSC2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108OverTable[i].MiscNTSC2[j]); + } + + fprintf(pFile, " { "); /* saa7108OverTable.CRTCNTSC2_8BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* saa7108OverTable.CRTCNTSC2_8BPP[] */ + pViaModeTable->saa7108OverTable[i].CRTCNTSC2_8BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108OverTable[i].CRTCNTSC2_8BPP[j]); + } + + fprintf(pFile, " { "); /* saa7108OverTable.CRTCNTSC2_16BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* saa7108OverTable.CRTCNTSC2_16BPP[] */ + pViaModeTable->saa7108OverTable[i].CRTCNTSC2_16BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108OverTable[i].CRTCNTSC2_16BPP[j]); + } + + fprintf(pFile, " { "); /* saa7108OverTable.CRTCNTSC2_32BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* saa7108OverTable.CRTCNTSC2_32BPP[] */ + pViaModeTable->saa7108OverTable[i].CRTCNTSC2_32BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108OverTable[i].CRTCNTSC2_32BPP[j]); + } + + fprintf(pFile, " { "); /* saa7108OverTable.PatchNTSC2[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_PATCH; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_PATCH - 1)) + fprintf(pFile, "%#X },\n", /* saa7108OverTable.PatchNTSC2[] */ + pViaModeTable->saa7108OverTable[i].PatchNTSC2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108OverTable[i].PatchNTSC2[j]); + } + + fprintf(pFile, " { "); /* saa7108OverTable.RGBNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* saa7108OverTable.RGBNTSC[] */ + pViaModeTable->saa7108OverTable[i].RGBNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108OverTable[i].RGBNTSC[j]); + } + + fprintf(pFile, " { "); /* saa7108OverTable.YCbCrNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* saa7108OverTable.YCbCrNTSC[] */ + pViaModeTable->saa7108OverTable[i].YCbCrNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108OverTable[i].YCbCrNTSC[j]); + } +#if 0 + fprintf(pFile, " { "); /* saa7108OverTable.DotCrawlNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* saa7108OverTable.DotCrawlNTSC[] */ + pViaModeTable->saa7108OverTable[i].DotCrawlNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108OverTable[i].DotCrawlNTSC[j]); + } +#endif + fprintf(pFile, " { "); /* saa7108OverTable.TVPAL[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_SAA7108_TV_REG; j++) { + if (j == (VIA_BIOS_MAX_NUM_SAA7108_TV_REG - 1)) + fprintf(pFile, "%#X },\n", /* saa7108OverTable.TVPAL[] */ + pViaModeTable->saa7108OverTable[i].TVPAL[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108OverTable[i].TVPAL[j]); + } + + fprintf(pFile, " { "); /* saa7108OverTable.CRTCPAL1[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* saa7108OverTable.CRTCPAL1[] */ + pViaModeTable->saa7108OverTable[i].CRTCPAL1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108OverTable[i].CRTCPAL1[j]); + } + + fprintf(pFile, " { "); /* saa7108OverTable.MiscPAL1[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* saa7108OverTable.MiscPAL1[] */ + pViaModeTable->saa7108OverTable[i].MiscPAL1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108OverTable[i].MiscPAL1[j]); + } + + fprintf(pFile, " { "); /* saa7108OverTable.MiscPAL2[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* saa7108OverTable.MiscPAL2[] */ + pViaModeTable->saa7108OverTable[i].MiscPAL2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108OverTable[i].MiscPAL2[j]); + } + + fprintf(pFile, " { "); /* tv3Over.CRTCPAL2_8BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* saa7108OverTable.CRTCPAL2_8BPP[] */ + pViaModeTable->saa7108OverTable[i].CRTCPAL2_8BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108OverTable[i].CRTCPAL2_8BPP[j]); + } + + fprintf(pFile, " { "); /* saa7108OverTable.CRTCPAL2_16BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* saa7108OverTable.CRTCPAL2_16BPP[] */ + pViaModeTable->saa7108OverTable[i].CRTCPAL2_16BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108OverTable[i].CRTCPAL2_16BPP[j]); + } + + fprintf(pFile, " { "); /* saa7108OverTable.CRTCPAL2_32BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* saa7108OverTable.CRTCPAL2_32BPP[] */ + pViaModeTable->saa7108OverTable[i].CRTCPAL2_32BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108OverTable[i].CRTCPAL2_32BPP[j]); + } + + fprintf(pFile, " { "); /* saa7108OverTable.PatchPAL2[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_PATCH; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_PATCH - 1)) + fprintf(pFile, "%#X },\n", /* saa7108OverTable.PatchPAL2[] */ + pViaModeTable->saa7108OverTable[i].PatchPAL2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108OverTable[i].PatchPAL2[j]); + } + + fprintf(pFile, " { "); /* saa7108OverTable.RGBPAL[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* saa7108OverTable.RGBPAL[] */ + pViaModeTable->saa7108OverTable[i].RGBPAL[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108OverTable[i].RGBPAL[j]); + } + + fprintf(pFile, " { "); /* saa7108OverTable.YCbCrPAL[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* saa7108OverTable.YCbCrPAL[] */ + pViaModeTable->saa7108OverTable[i].YCbCrPAL[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->saa7108OverTable[i].YCbCrPAL[j]); + } + + if (i == (VIA_BIOS_NUM_SAA7108 - 1)) + fprintf(pFile, " }\n};\n"); + else + fprintf(pFile, " }, \n"); + } + + fprintf(pFile, "\n"); + fprintf(pFile, "#endif\n"); + + return TRUE; +} +#endif /* CREATE_SAA7108_HEADERFILE */ + +#ifdef CREATE_CH7019_HEADERFILE +static Bool +VIACreateCH7019(VIAModeTablePtr pViaModeTable) +{ + int i, j; + FILE *pFile; + + if ((pFile = fopen("via_ch7019.h", "w+")) == NULL) { + ErrorF("Can't open \"via_ch7019.h\" file!!\n"); + return FALSE; + } + + fprintf(pFile, "#ifndef _VIA_CH7019MODETABLE_H\n"); + fprintf(pFile, "#define _VIA_CH7019MODETABLE_H\n"); + fprintf(pFile, "\n"); + + /* ch7019MaskTable */ + fprintf(pFile, "static const VIABIOSTVMASKTableRec ch7019MaskTable = {\n"); + fprintf(pFile, " { "); /* ch7019MaskTable.TV[] */ + for (i = 0; i < VIA_BIOS_MAX_NUM_TV_REG; i++) { + if (i == (VIA_BIOS_MAX_NUM_TV_REG - 1)) + fprintf(pFile, "%#X },\n", /* ch7019MaskTable.TV[] */ + pViaModeTable->ch7019MaskTable.TV[i]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019MaskTable.TV[i]); + } + + fprintf(pFile, " { "); /* ch7019MaskTable.CRTC1[] */ + for (i = 0; i < VIA_BIOS_MAX_NUM_TV_CRTC; i++) { + if (i == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* ch7019MaskTable.CRTC1[] */ + pViaModeTable->ch7019MaskTable.CRTC1[i]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019MaskTable.CRTC1[i]); + } + + fprintf(pFile, " { "); /* ch7019MaskTable.CRTC2[] */ + for (i = 0; i < VIA_BIOS_MAX_NUM_TV_CRTC; i++) { + if (i == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* ch7019MaskTable.CRTC2[] */ + pViaModeTable->ch7019MaskTable.CRTC2[i]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019MaskTable.CRTC2[i]); + } + + fprintf(pFile, " %#X, %#X, %d, %d, %d \n};\n\n", + pViaModeTable->ch7019MaskTable.misc1, + pViaModeTable->ch7019MaskTable.misc2, + pViaModeTable->ch7019MaskTable.numTV, + pViaModeTable->ch7019MaskTable.numCRTC1, + pViaModeTable->ch7019MaskTable.numCRTC2); + + /* ch7019Table */ + fprintf(pFile, "static const VIABIOSCH7019TableRec ch7019Table[] = {\n"); + for (i = 0; i < VIA_BIOS_NUM_CH7019; i++) { + fprintf(pFile, " {\n"); + fprintf(pFile, " { "); /* ch7019Table.TVNTSC[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_REG; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_REG - 1)) + fprintf(pFile, "%#X },\n", /* ch7019Table.TVNTSC[] */ + pViaModeTable->ch7019Table[i].TVNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019Table[i].TVNTSC[j]); + } + + fprintf(pFile, " { "); /* ch7019Table.CRTCNTSC1[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* ch7019Table.CRTCNTSC1[] */ + pViaModeTable->ch7019Table[i].CRTCNTSC1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019Table[i].CRTCNTSC1[j]); + } + + fprintf(pFile, " { "); /* ch7019Table.MiscNTSC1[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* ch7019Table.MiscNTSC1[] */ + pViaModeTable->ch7019Table[i].MiscNTSC1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019Table[i].MiscNTSC1[j]); + } + + fprintf(pFile, " { "); /* ch7019Table.MiscNTSC2[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* ch7019Table.MiscNTSC2[] */ + pViaModeTable->ch7019Table[i].MiscNTSC2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019Table[i].MiscNTSC2[j]); + } + + fprintf(pFile, " { "); /* ch7019Table.CRTCNTSC2_8BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* ch7019Table.CRTCNTSC2_8BPP[] */ + pViaModeTable->ch7019Table[i].CRTCNTSC2_8BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019Table[i].CRTCNTSC2_8BPP[j]); + } + + fprintf(pFile, " { "); /* ch7019Table.CRTCNTSC2_16BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* ch7019Table.CRTCNTSC2_16BPP[] */ + pViaModeTable->ch7019Table[i].CRTCNTSC2_16BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019Table[i].CRTCNTSC2_16BPP[j]); + } + + fprintf(pFile, " { "); /* ch7019Table.CRTCNTSC2_32BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* ch7019Table.CRTCNTSC2_32BPP[] */ + pViaModeTable->ch7019Table[i].CRTCNTSC2_32BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019Table[i].CRTCNTSC2_32BPP[j]); + } + + fprintf(pFile, " { "); /* ch7019Table.PatchNTSC2[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_PATCH; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_PATCH - 1)) + fprintf(pFile, "%#X },\n", /* ch7019Table.PatchNTSC2[] */ + pViaModeTable->ch7019Table[i].PatchNTSC2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019Table[i].PatchNTSC2[j]); + } +#if 0 + fprintf(pFile, " { "); /* ch7019Table.RGBNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* ch7019Table.RGBNTSC[] */ + pViaModeTable->ch7019Table[i].RGBNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019Table[i].RGBNTSC[j]); + } +#endif + fprintf(pFile, " { "); /* ch7019Table.DotCrawlNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* ch7019Table.DotCrawlNTSC[] */ + pViaModeTable->ch7019Table[i].DotCrawlNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019Table[i].DotCrawlNTSC[j]); + } + + fprintf(pFile, " { "); /* ch7019Table.TVPAL[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_REG; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_REG - 1)) + fprintf(pFile, "%#X },\n", /* ch7019Table.TVPAL[] */ + pViaModeTable->ch7019Table[i].TVPAL[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019Table[i].TVPAL[j]); + } + + fprintf(pFile, " { "); /* ch7019Table.CRTCPAL1[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* ch7019Table.CRTCPAL1[] */ + pViaModeTable->ch7019Table[i].CRTCPAL1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019Table[i].CRTCPAL1[j]); + } + + fprintf(pFile, " { "); /* ch7019Table.MiscPAL1[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* ch7019Table.MiscPAL1[] */ + pViaModeTable->ch7019Table[i].MiscPAL1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019Table[i].MiscPAL1[j]); + } + + fprintf(pFile, " { "); /* ch7019Table.MiscPAL2[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* ch7019Table.MiscPAL2[] */ + pViaModeTable->ch7019Table[i].MiscPAL2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019Table[i].MiscPAL2[j]); + } + + fprintf(pFile, " { "); /* ch7019Table.CRTCPAL2_8BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* ch7019Table.CRTCPAL2_8BPP[] */ + pViaModeTable->ch7019Table[i].CRTCPAL2_8BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019Table[i].CRTCPAL2_8BPP[j]); + } + + fprintf(pFile, " { "); /* ch7019Table.CRTCPAL2_16BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* ch7019Table.CRTCPAL2_16BPP[] */ + pViaModeTable->ch7019Table[i].CRTCPAL2_16BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019Table[i].CRTCPAL2_16BPP[j]); + } + + fprintf(pFile, " { "); /* ch7019Table.CRTCPAL2_32BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* ch7019Table.CRTCPAL2_32BPP[] */ + pViaModeTable->ch7019Table[i].CRTCPAL2_32BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019Table[i].CRTCPAL2_32BPP[j]); + } + + fprintf(pFile, " { "); /* ch7019Table.PatchPAL2[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_PATCH; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_PATCH - 1)) + fprintf(pFile, "%#X },\n", /* ch7019Table.PatchPAL2[] */ + pViaModeTable->ch7019Table[i].PatchPAL2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019Table[i].PatchPAL2[j]); + } +#if 0 + fprintf(pFile, " { "); /* ch7019Table.RGBPAL[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* ch7019Table.RGBPAL[] */ + pViaModeTable->ch7019Table[i].RGBPAL[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019Table[i].RGBPAL[j]); + } +#endif + if (i == (VIA_BIOS_NUM_CH7019 - 1)) + fprintf(pFile, " }\n};\n\n"); + else + fprintf(pFile, " }, \n"); + } + + /* ch7019OverTable */ + fprintf(pFile, "static const VIABIOSCH7019TableRec ch7019OverTable[] = {\n"); + for (i = 0; i < VIA_BIOS_NUM_CH7019; i++) { + fprintf(pFile, " {\n"); + fprintf(pFile, " { "); /* ch7019OverTable.TVNTSC[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_REG; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_REG - 1)) + fprintf(pFile, "%#X },\n", /* ch7019OverTable.TVNTSC[] */ + pViaModeTable->ch7019OverTable[i].TVNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019OverTable[i].TVNTSC[j]); + } + + fprintf(pFile, " { "); /* ch7019OverTable.CRTCNTSC1[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* ch7019OverTable.CRTCNTSC1[] */ + pViaModeTable->ch7019OverTable[i].CRTCNTSC1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019OverTable[i].CRTCNTSC1[j]); + } + + fprintf(pFile, " { "); /* ch7019OverTable.MiscNTSC1[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* ch7019OverTable.MiscNTSC1[] */ + pViaModeTable->ch7019OverTable[i].MiscNTSC1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019OverTable[i].MiscNTSC1[j]); + } + + fprintf(pFile, " { "); /* ch7019OverTable.MiscNTSC2[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* ch7019OverTable.MiscNTSC2[] */ + pViaModeTable->ch7019OverTable[i].MiscNTSC2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019OverTable[i].MiscNTSC2[j]); + } + + fprintf(pFile, " { "); /* ch7019OverTable.CRTCNTSC2_8BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* ch7019OverTable.CRTCNTSC2_8BPP[] */ + pViaModeTable->ch7019OverTable[i].CRTCNTSC2_8BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019OverTable[i].CRTCNTSC2_8BPP[j]); + } + + fprintf(pFile, " { "); /* ch7019OverTable.CRTCNTSC2_16BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* ch7019OverTable.CRTCNTSC2_16BPP[] */ + pViaModeTable->ch7019OverTable[i].CRTCNTSC2_16BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019OverTable[i].CRTCNTSC2_16BPP[j]); + } + + fprintf(pFile, " { "); /* ch7019OverTable.CRTCNTSC2_32BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* ch7019OverTable.CRTCNTSC2_32BPP[] */ + pViaModeTable->ch7019OverTable[i].CRTCNTSC2_32BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019OverTable[i].CRTCNTSC2_32BPP[j]); + } + + fprintf(pFile, " { "); /* ch7019OverTable.PatchNTSC2[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_PATCH; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_PATCH - 1)) + fprintf(pFile, "%#X },\n", /* ch7019OverTable.PatchNTSC2[] */ + pViaModeTable->ch7019OverTable[i].PatchNTSC2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019OverTable[i].PatchNTSC2[j]); + } +#if 0 + fprintf(pFile, " { "); /* ch7019OverTable.RGBNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* ch7019OverTable.RGBNTSC[] */ + pViaModeTable->ch7019OverTable[i].RGBNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019OverTable[i].RGBNTSC[j]); + } +#endif + fprintf(pFile, " { "); /* ch7019OverTable.DotCrawlNTSC[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* ch7019OverTable.DotCrawlNTSC[] */ + pViaModeTable->ch7019OverTable[i].DotCrawlNTSC[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019OverTable[i].DotCrawlNTSC[j]); + } + + fprintf(pFile, " { "); /* ch7019OverTable.TVPAL[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_REG; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_REG - 1)) + fprintf(pFile, "%#X },\n", /* ch7019OverTable.TVPAL[] */ + pViaModeTable->ch7019OverTable[i].TVPAL[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019OverTable[i].TVPAL[j]); + } + + fprintf(pFile, " { "); /* ch7019OverTable.CRTCPAL1[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* ch7019OverTable.CRTCPAL1[] */ + pViaModeTable->ch7019OverTable[i].CRTCPAL1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019OverTable[i].CRTCPAL1[j]); + } + + fprintf(pFile, " { "); /* ch7019OverTable.MiscPAL1[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* ch7019OverTable.MiscPAL1[] */ + pViaModeTable->ch7019OverTable[i].MiscPAL1[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019OverTable[i].MiscPAL1[j]); + } + + fprintf(pFile, " { "); /* ch7019OverTable.MiscPAL2[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_SPECIAL_REG; j++) { + if (j == (VIA_BIOS_NUM_TV_SPECIAL_REG - 1)) + fprintf(pFile, "%#X },\n", /* ch7019OverTable.MiscPAL2[] */ + pViaModeTable->ch7019OverTable[i].MiscPAL2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019OverTable[i].MiscPAL2[j]); + } + + fprintf(pFile, " { "); /* tv3Over.CRTCPAL2_8BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* ch7019OverTable.CRTCPAL2_8BPP[] */ + pViaModeTable->ch7019OverTable[i].CRTCPAL2_8BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019OverTable[i].CRTCPAL2_8BPP[j]); + } + + fprintf(pFile, " { "); /* ch7019OverTable.CRTCPAL2_16BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* ch7019OverTable.CRTCPAL2_16BPP[] */ + pViaModeTable->ch7019OverTable[i].CRTCPAL2_16BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019OverTable[i].CRTCPAL2_16BPP[j]); + } + + fprintf(pFile, " { "); /* ch7019OverTable.CRTCPAL2_32BPP[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_CRTC; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_CRTC - 1)) + fprintf(pFile, "%#X },\n", /* ch7019OverTable.CRTCPAL2_32BPP[] */ + pViaModeTable->ch7019OverTable[i].CRTCPAL2_32BPP[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019OverTable[i].CRTCPAL2_32BPP[j]); + } + + fprintf(pFile, " { "); /* ch7019OverTable.PatchPAL2[] */ + for (j = 0; j < VIA_BIOS_MAX_NUM_TV_PATCH; j++) { + if (j == (VIA_BIOS_MAX_NUM_TV_PATCH - 1)) + fprintf(pFile, "%#X },\n", /* ch7019OverTable.PatchPAL2[] */ + pViaModeTable->ch7019OverTable[i].PatchPAL2[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019OverTable[i].PatchPAL2[j]); + } +#if 0 + fprintf(pFile, " { "); /* ch7019OverTable.RGBPAL[] */ + for (j = 0; j < VIA_BIOS_NUM_TV_OTHER; j++) { + if (j == (VIA_BIOS_NUM_TV_OTHER - 1)) + fprintf(pFile, "%#X },\n", /* ch7019OverTable.RGBPAL[] */ + pViaModeTable->ch7019OverTable[i].RGBPAL[j]); + else + fprintf(pFile, "%#X, ", + pViaModeTable->ch7019OverTable[i].RGBPAL[j]); + } +#endif + if (i == (VIA_BIOS_NUM_CH7019 - 1)) + fprintf(pFile, " }\n};\n"); + else + fprintf(pFile, " }, \n"); + } + + fprintf(pFile, "\n"); + fprintf(pFile, "#endif\n"); + + return TRUE; +} +#endif /* CREATE_CH7019_HEADERFILE */ diff --git a/src/via_overlay.c b/src/via_overlay.c new file mode 100644 index 0000000..928b5fb --- /dev/null +++ b/src/via_overlay.c @@ -0,0 +1,899 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_overlay.c,v 1.2 2003/08/27 15:16:11 tsi Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/* I N C L U D E S ---------------------------------------------------------*/ + +#include "xf86.h" + +#include "via.h" +#include "ddmpeg.h" +#include "via_overlay.h" +#include "via_driver.h" + + + +/* F U N C T I O N ----------------------------------------------------------*/ + +void viaOverlayGetV1Format(VIAPtr pVia, unsigned long dwVideoFlag,LPDDPIXELFORMAT lpDPF, unsigned long * lpdwVidCtl,unsigned long * lpdwHQVCtl ) +{ + + if (lpDPF->dwFlags & DDPF_FOURCC) + { + *lpdwVidCtl |= V1_COLORSPACE_SIGN; + switch (lpDPF->dwFourCC) { + case FOURCC_YV12: + if (dwVideoFlag&VIDEO_HQV_INUSE) + { + *lpdwVidCtl |= (V1_YUV422 | V1_SWAP_HW_HQV ); + *lpdwHQVCtl |= HQV_SRC_SW|HQV_YUV420|HQV_ENABLE|HQV_SW_FLIP; + } + else + { + *lpdwVidCtl |= V1_YCbCr420; + } + break; + case FOURCC_IYUV: + case FOURCC_VIA: + if (dwVideoFlag&VIDEO_HQV_INUSE) + { + if ((pVia->swov.overlayRecordV1.dwDisplayPictStruct == VIA_PICT_STRUCT_TOP)|| + (pVia->swov.overlayRecordV1.dwDisplayPictStruct == VIA_PICT_STRUCT_BOTTOM)|| + (pVia->swov.overlayRecordV1.dwMPEGDeinterlaceMode == VIA_DEINTERLACE_BOB)) + { + /*Field Display*/ + *lpdwVidCtl |= (V1_YUV422 | V1_SWAP_HW_HQV ); + if (dwVideoFlag&MPEG_USE_HW_FLIP) + { + *lpdwHQVCtl |= HQV_SRC_MC|HQV_YUV420|HQV_ENABLE |HQV_DEINTERLACE|HQV_FIELD_2_FRAME|HQV_FRAME_2_FIELD; + if (pVia->swov.overlayRecordV1.dwMPEGProgressiveMode == VIA_NON_PROGRESSIVE) + { + *lpdwHQVCtl |= HQV_FIELD_UV; + } + } + else + { + *lpdwHQVCtl |= HQV_SRC_SW|HQV_YUV420|HQV_ENABLE|HQV_SW_FLIP|HQV_DEINTERLACE|HQV_FIELD_2_FRAME|HQV_FRAME_2_FIELD; + if (pVia->swov.overlayRecordV1.dwMPEGProgressiveMode == VIA_NON_PROGRESSIVE) + { + *lpdwHQVCtl |= HQV_FIELD_UV; + } + } + } + else + { + /*Frame Display*/ + *lpdwVidCtl |= (V1_YUV422 | V1_SWAP_HW_HQV ); + if (dwVideoFlag&MPEG_USE_HW_FLIP) + { + *lpdwHQVCtl |= HQV_SRC_MC|HQV_YUV420|HQV_ENABLE; + } + else + { + *lpdwHQVCtl |= HQV_SRC_SW|HQV_YUV420|HQV_ENABLE|HQV_SW_FLIP; + } + } + } + else + { + /*Without HQV engine*/ + if (dwVideoFlag&MPEG_USE_HW_FLIP) + { + *lpdwVidCtl |= (V1_YCbCr420 | V1_SWAP_HW_MC ); + if (((pVia->swov.overlayRecordV1.dwDisplayPictStruct == VIA_PICT_STRUCT_TOP )|| + (pVia->swov.overlayRecordV1.dwDisplayPictStruct == VIA_PICT_STRUCT_BOTTOM)|| + (pVia->swov.overlayRecordV1.dwMPEGDeinterlaceMode == VIA_DEINTERLACE_BOB ))&& + (pVia->swov.overlayRecordV1.dwMPEGProgressiveMode == VIA_NON_PROGRESSIVE)) + { + /* CLE bug + *lpdwVidCtl |= V1_SRC_IS_FIELD_PIC;*/ + } + } + else + { + if ((pVia->swov.overlayRecordV1.dwDisplayPictStruct == VIA_PICT_STRUCT_TOP)|| + (pVia->swov.overlayRecordV1.dwDisplayPictStruct == VIA_PICT_STRUCT_BOTTOM)|| + (pVia->swov.overlayRecordV1.dwMPEGDeinterlaceMode == VIA_DEINTERLACE_BOB)) + { + *lpdwVidCtl |= (V1_YCbCr420 |V1_SWAP_SW | V1_BOB_ENABLE | V1_FRAME_BASE); + if (pVia->swov.overlayRecordV1.dwMPEGProgressiveMode == VIA_NON_PROGRESSIVE) + { + /* CLE bug + *lpdwVidCtl |= V1_SRC_IS_FIELD_PIC;*/ + } + } + else + { + *lpdwVidCtl |= (V1_YCbCr420 | V1_SWAP_SW ); + } + } + } + break; + + case FOURCC_YUY2: + DBG_DD(ErrorF("DDOver_GetV1Format : FOURCC_YUY2\n")); + if (dwVideoFlag&VIDEO_HQV_INUSE) + { + *lpdwVidCtl |= (V1_YUV422 | V1_SWAP_HW_HQV ); + *lpdwHQVCtl |= HQV_SRC_SW|HQV_YUV422|HQV_ENABLE|HQV_SW_FLIP; + } + else + { + *lpdwVidCtl |= V1_YUV422; + } + break; + + default : + DBG_DD(ErrorF("DDOver_GetV1Format : Invalid FOURCC format :(0x%lx)in V1!\n", lpDPF->dwFourCC)); + *lpdwVidCtl |= V1_YUV422; + break; + } + } + else if (lpDPF->dwFlags & DDPF_RGB) + { + switch (lpDPF->dwRGBBitCount) { + case 16: + if (dwVideoFlag&VIDEO_HQV_INUSE) + { + *lpdwVidCtl |= (V1_RGB16 | V1_SWAP_HW_HQV ); + *lpdwHQVCtl |= HQV_SRC_SW|HQV_ENABLE|HQV_SW_FLIP; + *lpdwHQVCtl |= (lpDPF->dwGBitMask==0x07E0 ? + HQV_RGB16 : HQV_RGB15); + } + else + { + *lpdwVidCtl |= (lpDPF->dwGBitMask==0x07E0 ? + V1_RGB16 : V1_RGB15); + } + break; + case 32: + if (dwVideoFlag&VIDEO_HQV_INUSE) + { + *lpdwVidCtl |= (V1_RGB32 | V1_SWAP_HW_HQV ); + *lpdwHQVCtl |= HQV_SRC_SW|HQV_RGB32|HQV_ENABLE|HQV_SW_FLIP; + } + else + { + *lpdwVidCtl |= V1_RGB32; + } + break; + + default : + DBG_DD(ErrorF("DDOver_GetV1Format : invalid RGB format %ld bits\n",lpDPF->dwRGBBitCount)); + break; + } + } +} + +void viaOverlayGetV3Format(VIAPtr pVia, unsigned long dwVideoFlag,LPDDPIXELFORMAT lpDPF, unsigned long * lpdwVidCtl,unsigned long * lpdwHQVCtl ) +{ + + if (lpDPF->dwFlags & DDPF_FOURCC) + { + *lpdwVidCtl |= V3_COLORSPACE_SIGN; + switch (lpDPF->dwFourCC) { + case FOURCC_YV12: + if (dwVideoFlag&VIDEO_HQV_INUSE) + { + *lpdwVidCtl |= (V3_YUV422 | V3_SWAP_HW_HQV ); + *lpdwHQVCtl |= HQV_SRC_SW|HQV_YUV420|HQV_ENABLE|HQV_SW_FLIP; + } + else + { + /* *lpdwVidCtl |= V3_YCbCr420;*/ + DBG_DD(ErrorF("DDOver_GetV3Format : Invalid FOURCC format :(0x%lx)in V3!\n", lpDPF->dwFourCC)); + } + break; + case FOURCC_IYUV: + case FOURCC_VIA: + if (dwVideoFlag&VIDEO_HQV_INUSE) + { + if ((pVia->swov.overlayRecordV1.dwDisplayPictStruct == VIA_PICT_STRUCT_TOP)|| + (pVia->swov.overlayRecordV1.dwDisplayPictStruct == VIA_PICT_STRUCT_BOTTOM)|| + (pVia->swov.overlayRecordV1.dwMPEGDeinterlaceMode == VIA_DEINTERLACE_BOB)) + { + /*Field Display*/ + *lpdwVidCtl |= (V3_YUV422 | V3_SWAP_HW_HQV ); + if (dwVideoFlag&MPEG_USE_HW_FLIP) + { + *lpdwHQVCtl |= HQV_SRC_MC|HQV_YUV420|HQV_ENABLE |HQV_DEINTERLACE|HQV_FIELD_2_FRAME|HQV_FRAME_2_FIELD; + if (pVia->swov.overlayRecordV1.dwMPEGProgressiveMode == VIA_NON_PROGRESSIVE) + { + *lpdwHQVCtl |= HQV_FIELD_UV; + } + } + else + { + *lpdwHQVCtl |= HQV_SRC_SW|HQV_YUV420|HQV_ENABLE|HQV_SW_FLIP; + if (pVia->swov.overlayRecordV1.dwMPEGProgressiveMode == VIA_NON_PROGRESSIVE) + { + *lpdwHQVCtl |= HQV_FIELD_UV; + } + } + } + else + { + /*Frame Display*/ + *lpdwVidCtl |= (V3_YUV422 | V3_SWAP_HW_HQV ); + if (dwVideoFlag&MPEG_USE_HW_FLIP) + { + *lpdwHQVCtl |= HQV_SRC_MC|HQV_YUV420|HQV_ENABLE; + } + else + { + *lpdwHQVCtl |= HQV_SRC_SW|HQV_YUV420|HQV_ENABLE|HQV_SW_FLIP; + } + } + } + else + { + DBG_DD(ErrorF("DDOver_GetV3Format : Invalid FOURCC format :(0x%lx)in V3!\n", lpDPF->dwFourCC)); + } + break; + + case FOURCC_YUY2: + if (dwVideoFlag&VIDEO_HQV_INUSE) + { + *lpdwVidCtl |= (V3_YUV422 | V3_SWAP_HW_HQV ); + *lpdwHQVCtl |= HQV_SRC_SW|HQV_YUV422|HQV_ENABLE|HQV_SW_FLIP; + } + else + { + *lpdwVidCtl |= V3_YUV422; + } + break; + + default : + DBG_DD(ErrorF("DDOver_GetV3Format : Invalid FOURCC format :(0x%lx)in V3!\n", lpDPF->dwFourCC)); + *lpdwVidCtl |= V3_YUV422; + break; + } + } + else if (lpDPF->dwFlags & DDPF_RGB) { + switch (lpDPF->dwRGBBitCount) { + case 16: + if (dwVideoFlag&VIDEO_HQV_INUSE) + { + *lpdwVidCtl |= (V3_RGB16 | V3_SWAP_HW_HQV ); + *lpdwHQVCtl |= HQV_SRC_SW|HQV_ENABLE|HQV_SW_FLIP; + *lpdwHQVCtl |= (lpDPF->dwGBitMask==0x07E0 ? + HQV_RGB16 : HQV_RGB15); + } + else + { + *lpdwVidCtl |= (lpDPF->dwGBitMask==0x07E0 ? + V3_RGB16 : V3_RGB15); + } + break; + case 32: + if (dwVideoFlag&VIDEO_HQV_INUSE) + { + *lpdwVidCtl |= (V3_RGB32 | V3_SWAP_HW_HQV ); + *lpdwHQVCtl |= HQV_SRC_SW|HQV_RGB32|HQV_ENABLE|HQV_SW_FLIP; + } + else + { + *lpdwVidCtl |= V3_RGB32; + } + break; + + default : + DBG_DD(ErrorF("DDOver_GetV3Format : invalid RGB format %ld bits\n",lpDPF->dwRGBBitCount)); + break; + } + } +} + +unsigned long viaOverlayGetSrcStartAddress(VIAPtr pVia, unsigned long dwVideoFlag,RECTL rSrc,RECTL rDest, unsigned long dwSrcPitch,LPDDPIXELFORMAT lpDPF,unsigned long * lpHQVoffset ) +{ + unsigned long dwOffset=0; + unsigned long dwHQVsrcWidth=0,dwHQVdstWidth=0; + unsigned long dwHQVsrcHeight=0,dwHQVdstHeight=0; + unsigned long dwHQVSrcTopOffset=0,dwHQVSrcLeftOffset=0; + + dwHQVsrcWidth = (unsigned long)(rSrc.right - rSrc.left); + dwHQVdstWidth = (unsigned long)(rDest.right - rDest.left); + dwHQVsrcHeight = (unsigned long)(rSrc.bottom - rSrc.top); + dwHQVdstHeight = (unsigned long)(rDest.bottom - rDest.top); + + if ( (rSrc.left != 0) || (rSrc.top != 0) ) + { + + if (lpDPF->dwFlags & DDPF_FOURCC) + { + switch (lpDPF->dwFourCC) + { + case FOURCC_YUY2: + case FOURCC_UYVY: + case FOURCC_YVYU: + DBG_DD(ErrorF("GetSrcStartAddress : FOURCC format :(0x%lx)\n", lpDPF->dwFourCC)); + if (dwVideoFlag&VIDEO_HQV_INUSE) + { + dwOffset = (((rSrc.top&~3) * (dwSrcPitch)) + + ((rSrc.left << 1)&~31)); + if (dwHQVsrcHeight>dwHQVdstHeight) + { + dwHQVSrcTopOffset = ((rSrc.top&~3) * dwHQVdstHeight / dwHQVsrcHeight)* dwSrcPitch; + } + else + { + dwHQVSrcTopOffset = (rSrc.top&~3) * (dwSrcPitch); + } + + if (dwHQVsrcWidth>dwHQVdstWidth) + { + dwHQVSrcLeftOffset = ((rSrc.left << 1)&~31) * dwHQVdstWidth / dwHQVsrcWidth; + } + else + { + dwHQVSrcLeftOffset = (rSrc.left << 1)&~31 ; + } + *lpHQVoffset = dwHQVSrcTopOffset+dwHQVSrcLeftOffset; + } + else + { + dwOffset = ((rSrc.top * dwSrcPitch) + + ((rSrc.left << 1)&~15)); + } + break; + + case FOURCC_IYUV: + case FOURCC_VIA: + if (dwVideoFlag&VIDEO_HQV_INUSE) + { + unsigned long dwDstTop=0, dwDstLeft=0; + + dwDstTop = ((rSrc.top * pVia->swov.MPGDevice.gdwMPGDstHeight) + (pVia->swov.MPGDevice.dwHeight>>1))/pVia->swov.MPGDevice.dwHeight; + dwDstLeft = ((rSrc.left * pVia->swov.MPGDevice.gdwMPGDstWidth) + (pVia->swov.MPGDevice.dwWidth>>1))/pVia->swov.MPGDevice.dwWidth; + + if (pVia->swov.MPGDevice.gdwMPGDstHeight < pVia->swov.MPGDevice.dwHeight) + dwOffset = dwDstTop * (pVia->swov.MPGDevice.dwPitch <<1); + else + dwOffset = rSrc.top * (pVia->swov.MPGDevice.dwPitch <<1); + + if (pVia->swov.MPGDevice.gdwMPGDstWidth < pVia->swov.MPGDevice.dwWidth) + dwOffset += (dwDstLeft<<1)&~31; + else + dwOffset += (rSrc.left<<1)&~31; + } + else + { + dwOffset = ((((rSrc.top&~3) * dwSrcPitch) + + rSrc.left)&~31) ; + if (rSrc.top >0) + { + pVia->swov.overlayRecordV1.dwUVoffset = (((((rSrc.top&~3)>>1) * dwSrcPitch) + + rSrc.left)&~31) >>1; + } + else + { + pVia->swov.overlayRecordV1.dwUVoffset = dwOffset >>1 ; + } + } + break; + case FOURCC_YV12: + if (dwVideoFlag&VIDEO_HQV_INUSE) + { + dwOffset = (((rSrc.top&~3) * (dwSrcPitch<<1)) + + ((rSrc.left << 1)&~31)); + } + else + { + dwOffset = ((((rSrc.top&~3) * dwSrcPitch) + + rSrc.left)&~31) ; + if (rSrc.top >0) + { + pVia->swov.overlayRecordV1.dwUVoffset = (((((rSrc.top&~3)>>1) * dwSrcPitch) + + rSrc.left)&~31) >>1; + } + else + { + pVia->swov.overlayRecordV1.dwUVoffset = dwOffset >>1 ; + } + } + break; + + default: + DBG_DD(ErrorF("DDOver_GetSrcStartAddress : Invalid FOURCC format :(0x%lx)in V3!\n", lpDPF->dwFourCC)); + break; + } + } + else if (lpDPF->dwFlags & DDPF_RGB) + { + if (dwVideoFlag&VIDEO_HQV_INUSE) + { + dwOffset = (((rSrc.top&~3) * (dwSrcPitch<<1)) + + ((rSrc.left << 1)&~31)); + + if (dwHQVsrcHeight>dwHQVdstHeight) + { + dwHQVSrcTopOffset = ((rSrc.top&~3) * dwHQVdstHeight / dwHQVsrcHeight)* dwSrcPitch; + } + else + { + dwHQVSrcTopOffset = (rSrc.top&~3) * (dwSrcPitch); + } + + if (dwHQVsrcWidth>dwHQVdstWidth) + { + dwHQVSrcLeftOffset = ((rSrc.left << 1)&~31) * dwHQVdstWidth / dwHQVsrcWidth; + } + else + { + dwHQVSrcLeftOffset = (rSrc.left << 1)&~31 ; + } + *lpHQVoffset = dwHQVSrcTopOffset+dwHQVSrcLeftOffset; + + } + else + { + dwOffset = (rSrc.top * dwSrcPitch) + + ((rSrc.left * lpDPF->dwRGBBitCount) >> 3); + } + } + } + else + { + pVia->swov.overlayRecordV1.dwUVoffset = dwOffset = 0; + } + + return dwOffset; +} + +YCBCRREC viaOverlayGetYCbCrStartAddress(unsigned long dwVideoFlag,unsigned long dwStartAddr, unsigned long dwOffset,unsigned long dwUVoffset,unsigned long dwSrcPitch/*lpGbl->lPitch*/,unsigned long dwSrcHeight/*lpGbl->wHeight*/) +{ + YCBCRREC YCbCr; + + /*dwStartAddr = (unsigned long)lpGbl->fpVidMem - VideoBase;*/ + if (dwVideoFlag&VIDEO_HQV_INUSE) + { + YCbCr.dwY = dwStartAddr; + YCbCr.dwCB = dwStartAddr + dwSrcPitch * dwSrcHeight ; + YCbCr.dwCR = dwStartAddr + dwSrcPitch * dwSrcHeight + + dwSrcPitch * (dwSrcHeight >>2); + } + else + { + YCbCr.dwY = dwStartAddr+dwOffset; + YCbCr.dwCB = dwStartAddr + dwSrcPitch * dwSrcHeight + + dwUVoffset; + YCbCr.dwCR = dwStartAddr + dwSrcPitch * dwSrcHeight + + dwSrcPitch * (dwSrcHeight >>2) + + dwUVoffset; + } + return YCbCr; +} + + +unsigned long viaOverlayHQVCalcZoomWidth(VIAPtr pVia, unsigned long dwVideoFlag, unsigned long srcWidth , unsigned long dstWidth, + unsigned long * lpzoomCtl, unsigned long * lpminiCtl, unsigned long * lpHQVfilterCtl, unsigned long * lpHQVminiCtl,unsigned long * lpHQVzoomflag) +{ + unsigned long dwTmp; + + if (srcWidth == dstWidth) + { + *lpHQVfilterCtl |= HQV_H_FILTER_DEFAULT; + } + else + { + + if (srcWidth < dstWidth) { + /* zoom in*/ + *lpzoomCtl = srcWidth*0x0800 / dstWidth; + *lpzoomCtl = (((*lpzoomCtl) & 0x7FF) << 16) | V1_X_ZOOM_ENABLE; + *lpminiCtl |= ( V1_X_INTERPOLY ); /* set up interpolation*/ + *lpHQVzoomflag = 1; + *lpHQVfilterCtl |= HQV_H_FILTER_DEFAULT ; + } else if (srcWidth > dstWidth) { + /* zoom out*/ + unsigned long srcWidth1; + + /*HQV rounding patch + //dwTmp = dstWidth*0x0800 / srcWidth;*/ + dwTmp = dstWidth*0x0800*0x400 / srcWidth; + dwTmp = dwTmp / 0x400 + ((dwTmp & 0x3ff)?1:0); + + *lpHQVminiCtl = (dwTmp & 0x7FF)| HQV_H_MINIFY_ENABLE; + + + srcWidth1 = srcWidth >> 1; + if (srcWidth1 <= dstWidth) { + *lpminiCtl |= V1_X_DIV_2+V1_X_INTERPOLY; + if (dwVideoFlag&VIDEO_1_INUSE) + { + pVia->swov.overlayRecordV1.dwFetchAlignment = 3; + pVia->swov.overlayRecordV1.dwminifyH = 2; + } + else + { + pVia->swov.overlayRecordV3.dwFetchAlignment = 3; + pVia->swov.overlayRecordV3.dwminifyH = 2; + } + *lpHQVfilterCtl |= HQV_H_TAP4_121; + /* *lpHQVminiCtl = 0x00000c00;*/ + } + else { + srcWidth1 >>= 1; + + if (srcWidth1 <= dstWidth) { + *lpminiCtl |= V1_X_DIV_4+V1_X_INTERPOLY; + if (dwVideoFlag&VIDEO_1_INUSE) + { + pVia->swov.overlayRecordV1.dwFetchAlignment = 7; + pVia->swov.overlayRecordV1.dwminifyH = 4; + } + else + { + pVia->swov.overlayRecordV3.dwFetchAlignment = 7; + pVia->swov.overlayRecordV3.dwminifyH = 4; + } + *lpHQVfilterCtl |= HQV_H_TAP4_121; + /* *lpHQVminiCtl = 0x00000a00;*/ + } + else { + srcWidth1 >>= 1; + + if (srcWidth1 <= dstWidth) { + *lpminiCtl |= V1_X_DIV_8+V1_X_INTERPOLY; + if (dwVideoFlag&VIDEO_1_INUSE) + { + pVia->swov.overlayRecordV1.dwFetchAlignment = 15; + pVia->swov.overlayRecordV1.dwminifyH = 8; + } + else + { + pVia->swov.overlayRecordV3.dwFetchAlignment = 15; + pVia->swov.overlayRecordV3.dwminifyH = 8; + } + *lpHQVfilterCtl |= HQV_H_TAP8_12221; + /* *lpHQVminiCtl = 0x00000900;*/ + } + else { + srcWidth1 >>= 1; + + if (srcWidth1 <= dstWidth) { + *lpminiCtl |= V1_X_DIV_16+V1_X_INTERPOLY; + if (dwVideoFlag&VIDEO_1_INUSE) + { + pVia->swov.overlayRecordV1.dwFetchAlignment = 15; + pVia->swov.overlayRecordV1.dwminifyH = 16; + } + else + { + pVia->swov.overlayRecordV3.dwFetchAlignment = 15; + pVia->swov.overlayRecordV3.dwminifyH = 16; + } + *lpHQVfilterCtl |= HQV_H_TAP8_12221; + /* *lpHQVminiCtl = 0x00000880;*/ + } + else { + /* too small to handle + //VIDOutD(V_COMPOSE_MODE, dwCompose); + //lpUO->ddRVal = PI_OK; + //return DDHAL_DRIVER_NOTHANDLED;*/ + *lpminiCtl |= V1_X_DIV_16+V1_X_INTERPOLY; + if (dwVideoFlag&VIDEO_1_INUSE) + { + pVia->swov.overlayRecordV1.dwFetchAlignment = 15; + pVia->swov.overlayRecordV1.dwminifyH = 16; + } + else + { + pVia->swov.overlayRecordV3.dwFetchAlignment = 15; + pVia->swov.overlayRecordV3.dwminifyH = 16; + } + *lpHQVfilterCtl |= HQV_H_TAP8_12221; + } + } + } + } + + *lpHQVminiCtl |= HQV_HDEBLOCK_FILTER; + + if (srcWidth1 < dstWidth) { + /* CLE bug + *lpzoomCtl = srcWidth1*0x0800 / dstWidth;*/ + *lpzoomCtl = (srcWidth1-2)*0x0800 / dstWidth; + *lpzoomCtl = ((*lpzoomCtl & 0x7FF) << 16) | V1_X_ZOOM_ENABLE; + } + } + } + + return ~PI_ERR; +} + +unsigned long viaOverlayHQVCalcZoomHeight (VIAPtr pVia, unsigned long srcHeight,unsigned long dstHeight, + unsigned long * lpzoomCtl, unsigned long * lpminiCtl, unsigned long * lpHQVfilterCtl, unsigned long * lpHQVminiCtl,unsigned long * lpHQVzoomflag) +{ + unsigned long dwTmp; + if (pVia->graphicInfo.dwExpand) + { + dstHeight = dstHeight + 1; + } + + if (srcHeight < dstHeight) + { + /* zoom in*/ + dwTmp = srcHeight * 0x0400 / dstHeight; + *lpzoomCtl |= ((dwTmp & 0x3FF) | V1_Y_ZOOM_ENABLE); + *lpminiCtl |= (V1_Y_INTERPOLY | V1_YCBCR_INTERPOLY); + *lpHQVzoomflag = 1; + *lpHQVfilterCtl |= HQV_V_TAP4_121; + } + else if (srcHeight == dstHeight) + { + *lpHQVfilterCtl |= HQV_V_TAP4_121; + } + else if (srcHeight > dstHeight) + { + /* zoom out*/ + unsigned long srcHeight1; + + /*HQV rounding patch + //dwTmp = dstHeight*0x0800 / srcHeight;*/ + dwTmp = dstHeight*0x0800*0x400 / srcHeight; + dwTmp = dwTmp / 0x400 + ((dwTmp & 0x3ff)?1:0); + + *lpHQVminiCtl |= ((dwTmp& 0x7FF)<<16)|HQV_V_MINIFY_ENABLE; + + srcHeight1 = srcHeight >> 1; + if (srcHeight1 <= dstHeight) + { + *lpminiCtl |= V1_Y_DIV_2; + *lpHQVfilterCtl |= HQV_V_TAP4_121 ; + /* *lpHQVminiCtl |= 0x0c000000;*/ + } + else + { + srcHeight1 >>= 1; + if (srcHeight1 <= dstHeight) + { + *lpminiCtl |= V1_Y_DIV_4; + *lpHQVfilterCtl |= HQV_V_TAP4_121 ; + /* *lpHQVminiCtl |= 0x0a000000;*/ + } + else + { + srcHeight1 >>= 1; + + if (srcHeight1 <= dstHeight) + { + *lpminiCtl |= V1_Y_DIV_8; + *lpHQVfilterCtl |= HQV_V_TAP8_12221; + /* *lpHQVminiCtl |= 0x09000000;*/ + } + else + { + srcHeight1 >>= 1; + + if (srcHeight1 <= dstHeight) + { + *lpminiCtl |= V1_Y_DIV_16; + *lpHQVfilterCtl |= HQV_V_TAP8_12221; + /* *lpHQVminiCtl |= 0x08800000;*/ + } + else + { + /* too small to handle + //VIDOutD(V_COMPOSE_MODE, dwCompose); + //lpUO->ddRVal = PI_OK; + //Fixed QAW91013 + //return DDHAL_DRIVER_NOTHANDLED;*/ + *lpminiCtl |= V1_Y_DIV_16; + *lpHQVfilterCtl |= HQV_V_TAP8_12221; + } + } + } + } + + *lpHQVminiCtl |= HQV_VDEBLOCK_FILTER; + + if (srcHeight1 < dstHeight) + { + dwTmp = srcHeight1 * 0x0400 / dstHeight; + *lpzoomCtl |= ((dwTmp & 0x3FF) | V1_Y_ZOOM_ENABLE); + *lpminiCtl |= ( V1_Y_INTERPOLY|V1_YCBCR_INTERPOLY); + } + } + + return ~PI_ERR; +} + + +unsigned long viaOverlayGetFetch(unsigned long dwVideoFlag,LPDDPIXELFORMAT lpDPF,unsigned long dwSrcWidth,unsigned long dwDstWidth,unsigned long dwOriSrcWidth,unsigned long * lpHQVsrcFetch) +{ + unsigned long dwFetch=0; + + if (lpDPF->dwFlags & DDPF_FOURCC) + { + DBG_DD(ErrorF("DDOver_GetFetch : FourCC= 0x%lx\n", lpDPF->dwFourCC)); + switch (lpDPF->dwFourCC) { + case FOURCC_YV12: + if (dwVideoFlag&VIDEO_HQV_INUSE) + { + *lpHQVsrcFetch = dwOriSrcWidth; + if (dwDstWidth >= dwSrcWidth) + dwFetch = ((((dwSrcWidth<<1)+V1_FETCHCOUNT_ALIGNMENT)&~V1_FETCHCOUNT_ALIGNMENT) >> V1_FETCHCOUNT_UNIT)+1; + else + dwFetch = ((((dwDstWidth<<1)+V1_FETCHCOUNT_ALIGNMENT)&~V1_FETCHCOUNT_ALIGNMENT) >> V1_FETCHCOUNT_UNIT)+1; + } + else + { + /* we fetch one more quadword to avoid get less video data + //dwFetch = (((dwSrcWidth +V1_FETCHCOUNT_ALIGNMENT)&~V1_FETCHCOUNT_ALIGNMENT)>> V1_FETCHCOUNT_UNIT) +1;*/ + dwFetch = (((dwSrcWidth + 0x1F)&~0x1f)>> V1_FETCHCOUNT_UNIT); + } + break; + case FOURCC_IYUV: + case FOURCC_VIA: + if (dwVideoFlag&VIDEO_HQV_INUSE) + { + if (dwDstWidth >= dwSrcWidth) + dwFetch = ((((dwSrcWidth<<1)+V1_FETCHCOUNT_ALIGNMENT)&~V1_FETCHCOUNT_ALIGNMENT) >> V1_FETCHCOUNT_UNIT)+1; + else + dwFetch = ((((dwDstWidth<<1)+V1_FETCHCOUNT_ALIGNMENT)&~V1_FETCHCOUNT_ALIGNMENT) >> V1_FETCHCOUNT_UNIT)+1; + + } + else + { + /*Comment by Vinecnt ,we fetch one more quadword to avoid get less video data*/ + dwFetch = (((dwSrcWidth +V1_FETCHCOUNT_ALIGNMENT)&~V1_FETCHCOUNT_ALIGNMENT)>> V1_FETCHCOUNT_UNIT) +1; + } + break; + case FOURCC_UYVY: + case FOURCC_YVYU: + case FOURCC_YUY2: + if (dwVideoFlag&VIDEO_HQV_INUSE) + { + *lpHQVsrcFetch = dwOriSrcWidth<<1; + if (dwDstWidth >= dwSrcWidth) + dwFetch = ((((dwSrcWidth<<1)+V1_FETCHCOUNT_ALIGNMENT)&~V1_FETCHCOUNT_ALIGNMENT) >> V1_FETCHCOUNT_UNIT)+1; + else + dwFetch = ((((dwDstWidth<<1)+V1_FETCHCOUNT_ALIGNMENT)&~V1_FETCHCOUNT_ALIGNMENT) >> V1_FETCHCOUNT_UNIT)+1; + } + else + { + /*Comment by Vinecnt ,we fetch one more quadword to avoid get less video data*/ + dwFetch = ((((dwSrcWidth<<1)+V1_FETCHCOUNT_ALIGNMENT)&~V1_FETCHCOUNT_ALIGNMENT) >> V1_FETCHCOUNT_UNIT)+1; + } + break; + default : + DBG_DD(ErrorF("DDOver_GetFetch : Invalid FOURCC format :(0x%lx)in V1!\n", lpDPF->dwFourCC)); + break; + } + } + else if (lpDPF->dwFlags & DDPF_RGB) { + switch (lpDPF->dwRGBBitCount) { + case 16: + if (dwVideoFlag&VIDEO_HQV_INUSE) + { + *lpHQVsrcFetch = dwOriSrcWidth<<1; + if (dwDstWidth >= dwSrcWidth) + dwFetch = ((((dwSrcWidth<<1)+V1_FETCHCOUNT_ALIGNMENT)&~V1_FETCHCOUNT_ALIGNMENT) >> V1_FETCHCOUNT_UNIT)+1; + else + dwFetch = ((((dwDstWidth<<1)+V1_FETCHCOUNT_ALIGNMENT)&~V1_FETCHCOUNT_ALIGNMENT) >> V1_FETCHCOUNT_UNIT)+1; + } + else + { + /*Comment by Vinecnt ,we fetch one more quadword to avoid get less video data*/ + dwFetch = ((((dwSrcWidth<<1)+V1_FETCHCOUNT_ALIGNMENT)&~V1_FETCHCOUNT_ALIGNMENT) >> V1_FETCHCOUNT_UNIT)+1; + } + break; + case 32: + if (dwVideoFlag&VIDEO_HQV_INUSE) + { + *lpHQVsrcFetch = dwOriSrcWidth<<2; + if (dwDstWidth >= dwSrcWidth) + dwFetch = ((((dwSrcWidth<<2)+V1_FETCHCOUNT_ALIGNMENT)&~V1_FETCHCOUNT_ALIGNMENT) >> V1_FETCHCOUNT_UNIT)+1; + else + dwFetch = ((((dwDstWidth<<2)+V1_FETCHCOUNT_ALIGNMENT)&~V1_FETCHCOUNT_ALIGNMENT) >> V1_FETCHCOUNT_UNIT)+1; + } + else + { + /*Comment by Vinecnt ,we fetch one more quadword to avoid get less video data*/ + dwFetch = ((((dwSrcWidth<<2)+V1_FETCHCOUNT_ALIGNMENT)&~V1_FETCHCOUNT_ALIGNMENT) >> V1_FETCHCOUNT_UNIT)+1; + } + break; + + default : + DBG_DD(ErrorF("DDOver_GetFetch : invalid RGB format %ld bits\n",lpDPF->dwRGBBitCount)); + break; + } + } + + /*Fix plannar mode problem*/ + if (dwFetch <4) + { + dwFetch = 4; + } + return dwFetch; +} + +void viaOverlayGetDisplayCount(VIAPtr pVia, unsigned long dwVideoFlag,LPDDPIXELFORMAT lpDPF,unsigned long dwSrcWidth,unsigned long * lpDisplayCountW) +{ + + /*unsigned long dwFetch=0;*/ + + if (lpDPF->dwFlags & DDPF_FOURCC) + { + switch (lpDPF->dwFourCC) { + case FOURCC_YV12: + case FOURCC_UYVY: + case FOURCC_YVYU: + case FOURCC_YUY2: + case FOURCC_IYUV: + case FOURCC_VIA: + if (dwVideoFlag&VIDEO_HQV_INUSE) + { + *lpDisplayCountW = dwSrcWidth - 1; + } + else + { + /* *lpDisplayCountW = dwSrcWidth - 2*pVia->swov.overlayRecordV1.dwminifyH;*/ + *lpDisplayCountW = dwSrcWidth - pVia->swov.overlayRecordV1.dwminifyH; + } + break; + default : + DBG_DD(ErrorF("DDOver_GetDisplayCount : Invalid FOURCC format :(0x%lx)in V1!\n", lpDPF->dwFourCC)); + if (dwVideoFlag&VIDEO_HQV_INUSE) + { + *lpDisplayCountW = dwSrcWidth - 1; + } + else + { + /* *lpDisplayCountW = dwSrcWidth - 2*pVia->swov.overlayRecordV1.dwminifyH;*/ + *lpDisplayCountW = dwSrcWidth - pVia->swov.overlayRecordV1.dwminifyH; + } + break; + } + } + else if (lpDPF->dwFlags & DDPF_RGB) { + switch (lpDPF->dwRGBBitCount) { + case 16: + case 32: + if (dwVideoFlag&VIDEO_HQV_INUSE) + { + *lpDisplayCountW = dwSrcWidth - 1; + } + else + { + *lpDisplayCountW = dwSrcWidth - pVia->swov.overlayRecordV1.dwminifyH; + } + break; + + default : + DBG_DD(ErrorF("DDOver_GetDisplayCount : invalid RGB format %ld bits\n",lpDPF->dwRGBBitCount)); + if (dwVideoFlag&VIDEO_HQV_INUSE) + { + *lpDisplayCountW = dwSrcWidth - 1; + } + else + { + *lpDisplayCountW = dwSrcWidth - pVia->swov.overlayRecordV1.dwminifyH; + } + break; + } + } +} + diff --git a/src/via_overlay.h b/src/via_overlay.h new file mode 100644 index 0000000..75beb9f --- /dev/null +++ b/src/via_overlay.h @@ -0,0 +1,49 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_overlay.h,v 1.2 2003/08/27 15:16:12 tsi Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef _VIA_OVERLAY_H_ +#define _VIA_OVERLAY_H_ 1 + +/*#define XV_DEBUG 1*/ /* write log msg to /var/log/XFree86.0.log */ + +#ifdef XV_DEBUG +# define DBG_DD(x) (x) +#else +# define DBG_DD(x) +#endif + +#define PLUS_HEIGHT 1 /*V003*/ + +typedef struct _YCBCRREC { + CARD32 dwY ; + CARD32 dwCB; + CARD32 dwCR; +} YCBCRREC; + +unsigned long viaOverlayHQVGetFormat(LPDDPIXELFORMAT lpDPF, unsigned long dwVidCtl,unsigned long * lpdwHQVCtl ); +YCBCRREC viaOverlayGetYCbCrStartAddress(unsigned long dwVideoFlag,unsigned long dwStartAddr, unsigned long dwOffset,unsigned long dwUVoffset,unsigned long dwSrcPitch/*lpGbl->lPitch*/,unsigned long dwSrcHeight/*lpGbl->wHeight*/); +unsigned long viaOverlayGetFetch(unsigned long dwVideoFlag,LPDDPIXELFORMAT lpDPF,unsigned long dwSrcWidth,unsigned long dwDstWidth,unsigned long dwOriSrcWidth,unsigned long * lpHQVsrcFetch); + +#endif /* _VIA_OVERLAY_H_ */ diff --git a/src/via_priv.h b/src/via_priv.h new file mode 100644 index 0000000..112daab --- /dev/null +++ b/src/via_priv.h @@ -0,0 +1,68 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_priv.h,v 1.4 2003/12/17 18:57:18 dawes Exp $ */ + +#ifndef _VIA_PRIV_H_ +#define _VIA_PRIV_H_ 1 + +#include "ddmpeg.h" +#include "via_common.h" + +#define MEM_BLOCKS 4 + +typedef struct { + unsigned long base; /* Offset into fb */ + int pool; /* Pool we drew from */ + int drm_fd; /* Fd in DRM mode */ + drmViaMem drm; /* DRM management object */ + int slot; /* Pool 3 slot */ + void *pVia; /* VIA driver pointer */ + FBLinearPtr linear; /* X linear pool info ptr */ +} VIAMem; + +typedef VIAMem *VIAMemPtr; + + + +typedef struct { + unsigned long gdwVideoFlagTV1; + unsigned long gdwVideoFlagSW; + unsigned long gdwVideoFlagMPEG; + unsigned long gdwAlphaEnabled; /* For Alpha blending use*/ + + VIAMem SWOVMem; + VIAMem HQVMem; + VIAMem SWfbMem; + + DDPIXELFORMAT DPFsrc; + DDUPDATEOVERLAY UpdateOverlayBackup; /* For HQVcontrol func use + // To save MPEG updateoverlay info.*/ + +/* device struct */ + SWDEVICE SWDevice; + SUBDEVICE SUBDevice; + MPGDEVICE MPGDevice; + OVERLAYRECORD overlayRecordV1; + OVERLAYRECORD overlayRecordV3; + + BoxRec AvailFBArea; + FBLinearPtr SWOVlinear; + + Bool MPEG_ON; + Bool SWVideo_ON; + +/*To solve the bandwidth issue */ + unsigned long gdwUseExtendedFIFO; + +/* For panning mode use */ + int panning_old_x; + int panning_old_y; + int panning_x; + int panning_y; + +/*To solve the bandwidth issue */ + unsigned char Save_3C4_16; + unsigned char Save_3C4_17; + unsigned char Save_3C4_18; + +} swovRec, *swovPtr; + +#endif /* _VIA_PRIV_H_ */ diff --git a/src/via_privioctl.h b/src/via_privioctl.h new file mode 100644 index 0000000..afc93bc --- /dev/null +++ b/src/via_privioctl.h @@ -0,0 +1,102 @@ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef __via_privIoctl_h +#define __via_privIoctl_h + +/* #include <linux/videodev.h> */ +#include <asm/ioctl.h> +/*#include "capture.h"*/ + +#define BASE_VIDIOCPRIVATE 192 /* 192-255 are private */ + +/*Added for SAMM*/ +typedef struct { + unsigned long dwWidth; /* On screen Width */ + unsigned long dwHeight; /* On screen Height */ + unsigned long dwSaveWidth; /* On screen Width for Panning */ + unsigned long dwSaveHeight; /* On screen Height for Panning */ + unsigned long dwBPP; /* Bits Per Pixel */ + unsigned long dwPitch; /* On screen pitch= width x BPP */ + unsigned long dwRefreshRate; /* Refresh rate of the mode */ + unsigned long TotalVRAM; /* Total Video RAM in unit of byte */ + unsigned long VideoHeapBase; /* Physical Start of video heap */ + unsigned long VideoHeapEnd; /* Physical End of video heap */ + unsigned long dwDVIOn; /* Is it DVI simultaneous mode ? */ + unsigned long dwLCDOn; /* Is it LCD simultaneous mode ? */ + unsigned long dwExpand; /* Is DVI in expand mode ? */ + unsigned long dwPanning; /* Is DVI in Pannig mode ? */ + unsigned long dwPanelWidth; /* Panel physical Width */ + unsigned long dwPanelHeight; /* Panel physical Height */ + unsigned long dwActiveDevice; /* Active Device; ex. CRT or LCD */ +}SCREENINFO, * LPSCREENINFO; + +typedef struct { + unsigned long HQVFilter_ManualSelect; /* HQV Filter_Manual Select */ + int MpegHQV_VFilterMode; /* MPEG HQV vertical filter mode */ + int MpegHQV_HFilterMode; /* MPEG HQV horizontal filter mode */ + int CapHQV_VFilterMode; /* Capture HQV vertical filter mode */ + int CapHQV_HFilterMode; /* Capture HQV horizontal filter mode */ + unsigned long SetMpeg_FBNumber; /* Set Mpeg decode frame buffer number */ + unsigned long Cap1_UseIRQ; /* Capture 1 use IRQ select, for S/W flip or H/W auto flip */ + unsigned long Cap0_SwitchToV3; /* Capture 0 use V3 engine, only for SAMSUNG project */ + unsigned long HQV_ManualSwitch; /* HQV engine manual switch select */ + Bool ColorSpaceChanged; /* The setting value of color space been changed by user */ + unsigned long ColorSpaceValue1; /* User set color value from utility , after driver convert */ + unsigned long ColorSpaceValue2; /* User set color value from utility , after driver convert */ + Bool DRMEnabled; /* kernel module DRM flag */ + Bool Screen1IsLeft; /* True: Screen1 LeftOf Screen0 ; False: Screen1 RightOf Screen0 */ + Bool Screen1IsAbove; /* True: Screen1 Above Screen0 ; False: Screen1 Below Screen0 */ + Bool SAMM; /* True: XServer in SAMM mode */ + int RevisionID; /* The chip revision ID */ + unsigned long dwDeviceID; /* The chip device ID */ + unsigned long dwActiveDevice; /* ActiveDevice; ex. SAMM: CRT+LCD */ + SCREENINFO Screen[2]; /* Information for Primary & Secondary Screens*/ + unsigned long NoMPEGAddOneLineOnBottom; /* Disable HQV bob-deinterlacing, 0x3D0[16] */ + Bool ReDrawColorkey; /* ReDrawColorKey at viaPutImageG everytime*/ + unsigned long Reserved[9]; /* For future use */ +}VIAGRAPHICINFO, * LPVIAGRAPHICINFO; + +/* via private ioctls */ + +#define VIAMGR_INFO_XSERVERON _IOW ('v', BASE_VIDIOCPRIVATE+1, VIAGRAPHICINFO) +#define VIAMGR_INFO_XSERVEROFF _IO ('v', BASE_VIDIOCPRIVATE+2 ) +#define VIA_VID_GET_2D_INFO _IOR ('v', BASE_VIDIOCPRIVATE+3, VIAGRAPHICINFO) +#define VIA_VID_SET_2D_INFO _IOW ('v', BASE_VIDIOCPRIVATE+4, VIAGRAPHICINFO) +#define VIA_VID_GET_VIDCTL _IOR ('v', BASE_VIDIOCPRIVATE+5, VIAVIDCTRL) +#define VIA_VID_SET_VIDCTL _IOW ('v', BASE_VIDIOCPRIVATE+6, VIAVIDCTRL) +#define VIA_VID_CREATESURFACE _IOW ('v', BASE_VIDIOCPRIVATE+7, DDSURFACEDESC) +#define VIA_VID_DESTROYSURFACE _IOW ('v', BASE_VIDIOCPRIVATE+8, DDSURFACEDESC) +#define VIA_VID_LOCKSURFACE _IOWR ('v', BASE_VIDIOCPRIVATE+9, DDLOCK) +#define VIA_VID_UPDATEOVERLAY _IOW ('v', BASE_VIDIOCPRIVATE+10, DDUPDATEOVERLAY) +#define VIA_VID_SETALPHAWIN _IOW ('v', BASE_VIDIOCPRIVATE+11, ALPHACTRL) +#define VIA_VID_UPDATEALPHA _IOW ('v', BASE_VIDIOCPRIVATE+12, RECTL) +#define VIA_VID_ADJUSTFRAME _IOW ('v', BASE_VIDIOCPRIVATE+13, ADJUSTFRAME) +#define VIA_VID_FLIP _IOW ('v', BASE_VIDIOCPRIVATE+14, unsigned long) + +#define VIA_VID_GET_CAP_INFO _IOR ('v', BASE_VIDIOCPRIVATE+18, VIACAPINFO) +#define VIA_VID_SET_CAP_INFO _IOW ('v', BASE_VIDIOCPRIVATE+19, VIACAPINFO) + + +#endif /* end of __via_privIoctl_h */ diff --git a/src/via_refresh.h b/src/via_refresh.h new file mode 100644 index 0000000..ace1811 --- /dev/null +++ b/src/via_refresh.h @@ -0,0 +1,486 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_refresh.h,v 1.3 2003/08/27 15:16:12 tsi Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef _VIA_REFRESH_H_ +#define _VIA_REFRESH_H_ 1 + +static const int supportRef[] = { 60, 75, 85, 100, 120 }; +static const int DDR266[3][17][5] = { + /* 8 bpp */ + { + /* 640x480 */ + { 1, 1, 1, 1, 1 }, + /* 800x600 */ + { 1, 1, 1, 1, 1 }, + /* 1024x768 */ + { 1, 1, 1, 1, 0 }, + /* 1152x864 */ + { 1, 1, 0, 0, 0 }, + /* 1280x1024 */ + { 1, 1, 1, 0, 0 }, + /* 1600x1200 */ + { 1, 1, 1, 0, 0 }, + /* 1440x1050 */ + { 1, 0, 0, 0, 0 }, + /* 1280x768 */ + { 1, 0, 0, 0, 0 }, + /* 1280x960 */ + { 1, 0, 0, 0, 0 }, + /* 1920x1440 */ + { 0, 0, 0, 0, 0 }, + /* 848x480 */ + { 1, 0, 0, 0, 0 }, + /* 1400x1050 */ + { 1, 0, 0, 0, 0 }, + /* 720x480 */ + { 1, 0, 0, 0, 0 }, + /* 720x576 */ + { 1, 0, 0, 0, 0 }, + /* 1024x512 */ + { 1, 0, 0, 0, 0 }, + /* 856x480 */ + { 1, 0, 0, 0, 0 }, + /* 1024x576 */ + { 1, 0, 0, 0, 0 } + }, + /* 16 bpp */ + { + /* 640x480 */ + { 1, 1, 1, 1, 1 }, + /* 800x600 */ + { 1, 1, 1, 1, 1 }, + /* 1024x768 */ + { 1, 1, 1, 1, 0 }, + /* 1152x864 */ + { 1, 1, 0, 0, 0 }, + /* 1280x1024 */ + { 1, 1, 1, 0, 0 }, + /* 1600x1200 */ + { 1, 1, 1, 0, 0 }, + /* 1440x1050 */ + { 1, 0, 0, 0, 0 }, + /* 1280x768 */ + { 1, 0, 0, 0, 0 }, + /* 1280x960 */ + { 1, 0, 0, 0, 0 }, + /* 1920x1440 */ + { 0, 0, 0, 0, 0 }, + /* 848x480 */ + { 1, 0, 0, 0, 0 }, + /* 1400x1050 */ + { 1, 0, 0, 0, 0 }, + /* 720x480 */ + { 1, 0, 0, 0, 0 }, + /* 720x576 */ + { 1, 0, 0, 0, 0 }, + /* 1024x512 */ + { 1, 0, 0, 0, 0 }, + /* 856x480 */ + { 1, 0, 0, 0, 0 }, + /* 1024x576 */ + { 1, 0, 0, 0, 0 } + }, + /* 24, 32 bpp */ + { + /* 640x480 */ + { 1, 1, 1, 1, 1 }, + /* 800x600 */ + { 1, 1, 1, 1, 0 }, + /* 1024x768 */ + { 1, 1, 1, 0, 0 }, + /* 1152x864 */ + { 1, 1, 0, 0, 0 }, + /* 1280x1024 */ + { 1, 1, 1, 0, 0 }, + /* 1600x1200 */ + { 1, 0, 0, 0, 0 }, + /* 1440x1050 */ + { 1, 0, 0, 0, 0 }, + /* 1280x768 */ + { 1, 0, 0, 0, 0 }, + /* 1280x960 */ + { 1, 0, 0, 0, 0 }, + /* 1920x1440 */ + { 0, 0, 0, 0, 0 }, + /* 848x480 */ + { 1, 0, 0, 0, 0 }, + /* 1400x1050 */ + { 1, 0, 0, 0, 0 }, + /* 720x480 */ + { 1, 0, 0, 0, 0 }, + /* 720x576 */ + { 1, 0, 0, 0, 0 }, + /* 1024x512 */ + { 1, 0, 0, 0, 0 }, + /* 856x480 */ + { 1, 0, 0, 0, 0 }, + /* 1024x576 */ + { 1, 0, 0, 0, 0 } + } + }; + +static const int DDR200[3][17][5] = { + /* 8 bpp */ + { + /* 640x480 */ + { 1, 1, 1, 1, 1 }, + /* 800x600 */ + { 1, 1, 1, 1, 1 }, + /* 1024x768 */ + { 1, 1, 1, 1, 0 }, + /* 1152x864 */ + { 1, 1, 0, 0, 0 }, + /* 1280x1024 */ + { 1, 1, 1, 0, 0 }, + /* 1600x1200 */ + { 1, 1, 1, 0, 0 }, + /* 1440x1050 */ + { 1, 0, 0, 0, 0 }, + /* 1280x768 */ + { 1, 0, 0, 0, 0 }, + /* 1280x960 */ + { 1, 0, 0, 0, 0 }, + /* 1920x1440 */ + { 0, 0, 0, 0, 0 }, + /* 848x480 */ + { 1, 0, 0, 0, 0 }, + /* 1400x1050 */ + { 1, 0, 0, 0, 0 }, + /* 720x480 */ + { 1, 0, 0, 0, 0 }, + /* 720x576 */ + { 1, 0, 0, 0, 0 }, + /* 1024x512 */ + { 1, 0, 0, 0, 0 }, + /* 856x480 */ + { 1, 0, 0, 0, 0 }, + /* 1024x576 */ + { 1, 0, 0, 0, 0 } + }, + /* 16 bpp */ + { + /* 640x480 */ + { 1, 1, 1, 1, 1 }, + /* 800x600 */ + { 1, 1, 1, 1, 1 }, + /* 1024x768 */ + { 1, 1, 1, 1, 0 }, + /* 1152x864 */ + { 1, 1, 0, 0, 0 }, + /* 1280x1024 */ + { 1, 1, 1, 0, 0 }, + /* 1600x1200 */ + { 1, 1, 1, 0, 0 }, + /* 1440x1050 */ + { 1, 0, 0, 0, 0 }, + /* 1280x768 */ + { 1, 0, 0, 0, 0 }, + /* 1280x960 */ + { 1, 0, 0, 0, 0 }, + /* 1920x1440 */ + { 0, 0, 0, 0, 0 }, + /* 848x480 */ + { 1, 0, 0, 0, 0 }, + /* 1400x1050 */ + { 1, 0, 0, 0, 0 }, + /* 720x480 */ + { 1, 0, 0, 0, 0 }, + /* 720x576 */ + { 1, 0, 0, 0, 0 }, + /* 1024x512 */ + { 1, 0, 0, 0, 0 }, + /* 856x480 */ + { 1, 0, 0, 0, 0 }, + /* 1024x576 */ + { 1, 0, 0, 0, 0 } + }, + /* 24, 32 bpp */ + { + /* 640x480 */ + { 1, 1, 1, 1, 1 }, + /* 800x600 */ + { 1, 1, 1, 1, 0 }, + /* 1024x768 */ + { 1, 1, 1, 0, 0 }, + /* 1152x864 */ + { 1, 1, 0, 0, 0 }, + /* 1280x1024 */ + { 1, 1, 0, 0, 0 }, + /* 1600x1200 */ + { 0, 0, 0, 0, 0 }, + /* 1440x1050 */ + { 1, 0, 0, 0, 0 }, + /* 1280x768 */ + { 1, 0, 0, 0, 0 }, + /* 1280x960 */ + { 1, 0, 0, 0, 0 }, + /* 1920x1440 */ + { 0, 0, 0, 0, 0 }, + /* 848x480 */ + { 1, 0, 0, 0, 0 }, + /* 1400x1050 */ + { 1, 0, 0, 0, 0 }, + /* 720x480 */ + { 1, 0, 0, 0, 0 }, + /* 720x576 */ + { 1, 0, 0, 0, 0 }, + /* 1024x512 */ + { 1, 0, 0, 0, 0 }, + /* 856x480 */ + { 1, 0, 0, 0, 0 }, + /* 1024x576 */ + { 1, 0, 0, 0, 0 } + } + }; + +static const int SDR133[3][17][5] = { + /* 8 bpp */ + { + /* 640x480 */ + { 1, 1, 1, 1, 1 }, + /* 800x600 */ + { 1, 1, 1, 1, 1 }, + /* 1024x768 */ + { 1, 1, 1, 1, 0 }, + /* 1152x864 */ + { 1, 1, 0, 0, 0 }, + /* 1280x1024 */ + { 1, 1, 1, 0, 0 }, + /* 1600x1200 */ + { 1, 1, 1, 0, 0 }, + /* 1440x1050 */ + { 1, 0, 0, 0, 0 }, + /* 1280x768 */ + { 1, 0, 0, 0, 0 }, + /* 1280x960 */ + { 1, 0, 0, 0, 0 }, + /* 1920x1440 */ + { 0, 0, 0, 0, 0 }, + /* 848x480 */ + { 1, 0, 0, 0, 0 }, + /* 1400x1050 */ + { 1, 0, 0, 0, 0 }, + /* 720x480 */ + { 1, 0, 0, 0, 0 }, + /* 720x576 */ + { 1, 0, 0, 0, 0 }, + /* 1024x512 */ + { 1, 0, 0, 0, 0 }, + /* 856x480 */ + { 1, 0, 0, 0, 0 }, + /* 1024x576 */ + { 1, 0, 0, 0, 0 } + }, + /* 16 bpp */ + { + /* 640x480 */ + { 1, 1, 1, 1, 1 }, + /* 800x600 */ + { 1, 1, 1, 1, 1 }, + /* 1024x768 */ + { 1, 1, 1, 1, 0 }, + /* 1152x864 */ + { 1, 1, 0, 0, 0 }, + /* 1280x1024 */ + { 1, 1, 1, 0, 0 }, + /* 1600x1200 */ + { 1, 1, 1, 0, 0 }, + /* 1440x1050 */ + { 1, 0, 0, 0, 0 }, + /* 1280x768 */ + { 1, 0, 0, 0, 0 }, + /* 1280x960 */ + { 1, 0, 0, 0, 0 }, + /* 1920x1440 */ + { 0, 0, 0, 0, 0 }, + /* 848x480 */ + { 1, 0, 0, 0, 0 }, + /* 1400x1050 */ + { 1, 0, 0, 0, 0 }, + /* 720x480 */ + { 1, 0, 0, 0, 0 }, + /* 720x576 */ + { 1, 0, 0, 0, 0 }, + /* 1024x512 */ + { 1, 0, 0, 0, 0 }, + /* 856x480 */ + { 1, 0, 0, 0, 0 }, + /* 1024x576 */ + { 1, 0, 0, 0, 0 } + }, + /* 24, 32 bpp */ + { + /* 640x480 */ + { 1, 1, 1, 1, 1 }, + /* 800x600 */ + { 1, 1, 1, 1, 0 }, + /* 1024x768 */ + { 1, 1, 1, 0, 0 }, + /* 1152x864 */ + { 1, 1, 0, 0, 0 }, + /* 1280x1024 */ + { 1, 1, 0, 0, 0 }, + /* 1600x1200 */ + { 0, 0, 0, 0, 0 }, + /* 1440x1050 */ + { 1, 0, 0, 0, 0 }, + /* 1280x768 */ + { 1, 0, 0, 0, 0 }, + /* 1280x960 */ + { 1, 0, 0, 0, 0 }, + /* 1920x1440 */ + { 0, 0, 0, 0, 0 }, + /* 848x480 */ + { 1, 0, 0, 0, 0 }, + /* 1400x1050 */ + { 1, 0, 0, 0, 0 }, + /* 720x480 */ + { 1, 0, 0, 0, 0 }, + /* 720x576 */ + { 1, 0, 0, 0, 0 }, + /* 1024x512 */ + { 1, 0, 0, 0, 0 }, + /* 856x480 */ + { 1, 0, 0, 0, 0 }, + /* 1024x576 */ + { 1, 0, 0, 0, 0 } + } + }; + +static const int SDR100[3][17][5] = { + /* 8 bpp */ + { + /* 640x480 */ + { 1, 1, 1, 1, 1 }, + /* 800x600 */ + { 1, 1, 1, 1, 1 }, + /* 1024x768 */ + { 1, 1, 1, 1, 0 }, + /* 1152x864 */ + { 1, 1, 0, 0, 0 }, + /* 1280x1024 */ + { 1, 1, 1, 0, 0 }, + /* 1600x1200 */ + { 1, 1, 1, 0, 0 }, + /* 1440x1050 */ + { 1, 0, 0, 0, 0 }, + /* 1280x768 */ + { 1, 0, 0, 0, 0 }, + /* 1280x960 */ + { 1, 0, 0, 0, 0 }, + /* 1920x1440 */ + { 0, 0, 0, 0, 0 }, + /* 848x480 */ + { 1, 0, 0, 0, 0 }, + /* 1400x1050 */ + { 1, 0, 0, 0, 0 }, + /* 720x480 */ + { 1, 0, 0, 0, 0 }, + /* 720x576 */ + { 1, 0, 0, 0, 0 }, + /* 1024x512 */ + { 1, 0, 0, 0, 0 }, + /* 856x480 */ + { 1, 0, 0, 0, 0 }, + /* 1024x576 */ + { 1, 0, 0, 0, 0 } + }, + /* 16 bpp */ + { + /* 640x480 */ + { 1, 1, 1, 1, 1 }, + /* 800x600 */ + { 1, 1, 1, 1, 1 }, + /* 1024x768 */ + { 1, 1, 1, 1, 0 }, + /* 1152x864 */ + { 1, 1, 0, 0, 0 }, + /* 1280x1024 */ + { 1, 1, 1, 0, 0 }, + /* 1600x1200 */ + { 1, 1, 1, 0, 0 }, + /* 1440x1050 */ + { 1, 0, 0, 0, 0 }, + /* 1280x768 */ + { 1, 0, 0, 0, 0 }, + /* 1280x960 */ + { 1, 0, 0, 0, 0 }, + /* 1920x1440 */ + { 0, 0, 0, 0, 0 }, + /* 848x480 */ + { 1, 0, 0, 0, 0 }, + /* 1400x1050 */ + { 1, 0, 0, 0, 0 }, + /* 720x480 */ + { 1, 0, 0, 0, 0 }, + /* 720x576 */ + { 1, 0, 0, 0, 0 }, + /* 1024x512 */ + { 1, 0, 0, 0, 0 }, + /* 856x480 */ + { 1, 0, 0, 0, 0 }, + /* 1024x576 */ + { 1, 0, 0, 0, 0 } + }, + /* 24, 32 bpp */ + { + /* 640x480 */ + { 1, 1, 1, 1, 1 }, + /* 800x600 */ + { 1, 1, 1, 1, 0 }, + /* 1024x768 */ + { 1, 1, 1, 0, 0 }, + /* 1152x864 */ + { 1, 1, 0, 0, 0 }, + /* 1280x1024 */ + { 1, 0, 0, 0, 0 }, + /* 1600x1200 */ + { 0, 0, 0, 0, 0 }, + /* 1440x1050 */ + { 1, 0, 0, 0, 0 }, + /* 1280x768 */ + { 1, 0, 0, 0, 0 }, + /* 1280x960 */ + { 1, 0, 0, 0, 0 }, + /* 1920x1440 */ + { 0, 0, 0, 0, 0 }, + /* 848x480 */ + { 1, 0, 0, 0, 0 }, + /* 1400x1050 */ + { 1, 0, 0, 0, 0 }, + /* 720x480 */ + { 1, 0, 0, 0, 0 }, + /* 720x576 */ + { 1, 0, 0, 0, 0 }, + /* 1024x512 */ + { 1, 0, 0, 0, 0 }, + /* 856x480 */ + { 1, 0, 0, 0, 0 }, + /* 1024x576 */ + { 1, 0, 0, 0, 0 } + } + }; + +#endif /* _VIA_REFRESH_H_ */ diff --git a/src/via_regrec.c b/src/via_regrec.c new file mode 100644 index 0000000..12443e7 --- /dev/null +++ b/src/via_regrec.c @@ -0,0 +1,177 @@ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_regrec.c,v 1.2 2003/09/11 10:08:38 eich Exp $ */ +/*#include <stdlib.h> +#include <string.h>*/ +#include "xf86.h" + +#include "via.h" +#include "via_driver.h" +#include "via_regrec.h" + + + +void viaWaitHQVIdle(VIAPtr pVia) +{ + while (!IN_HQV_FIRE); +} + +void viaWaitVideoCommandFire(VIAPtr pVia) +{ + /*while (IN_VIDEO_FIRE);*/ + CARD32 volatile *pdwState = (CARD32 volatile *) (pVia->VidMapBase+V_COMPOSE_MODE); + /*pdwState = (CARD32 volatile *) (pVia->VidMapBase+V_COMPOSE_MODE);*/ + while ((*pdwState & V1_COMMAND_FIRE)||(*pdwState & V3_COMMAND_FIRE)); +} + +void viaWaitHQVFlip(VIAPtr pVia) +{ + CARD32 volatile *pdwState = (CARD32 volatile *) pVia->VidMapBase; + pdwState = (CARD32 volatile *) (pVia->VidMapBase+HQV_CONTROL); + while (!(*pdwState & HQV_FLIP_STATUS) ); +/* + while (!((*pdwState & 0xc0)== 0xc0) ); + while (!((*pdwState & 0xc0)!= 0xc0) ); +*/ +} + +void viaWaitHQVFlipClear(VIAPtr pVia, unsigned long dwData) +{ + CARD32 volatile *pdwState = (CARD32 volatile *) (pVia->VidMapBase+HQV_CONTROL); + *pdwState =dwData; + + while ((*pdwState & HQV_FLIP_STATUS) ) + { + VIDOutD(HQV_CONTROL, *pdwState|HQV_FLIP_STATUS); + } +} + +void viaWaitVBI(VIAPtr pVia) +{ + while (IN_VIDEO_DISPLAY); +} + +void viaWaitHQVDone(VIAPtr pVia) +{ + CARD32 volatile *pdwState = (CARD32 volatile *) (pVia->VidMapBase+HQV_CONTROL); + /*pdwState = (CARD32 volatile *) (GEAddr+HQV_CONTROL);*/ + + /*if (*pdwState & HQV_ENABLE)*/ + if (pVia->swov.MPEG_ON) + { + while ((*pdwState & HQV_SW_FLIP) ); + } +} + +void viaMacro_VidREGFlush(VIAPtr pVia) +{ + unsigned long i; + VIDEOREGISTER *VidReg = (VIDEOREGISTER*) pVia->VidReg; + + viaWaitVideoCommandFire(pVia); + + for (i=0; i< pVia->gdwVidRegCounter; i++ ) + { + VIDOutD(VidReg[i].dwIndex, VidReg[i].dwData); + /*DBG_DD("viaMacro_VidREGFlush:%08lx %08lx\n",VidReg[i].dwIndex+0x200,VidReg[i].dwData);*/ + DBG_DD(ErrorF("viaMacro_VidREGFlush:%08lx %08lx\n",VidReg[i].dwIndex+0x200,VidReg[i].dwData)); + } +} + +void viaMacro_VidREGRec(VIAPtr pVia, unsigned long dwAction, unsigned long dwIndex, unsigned long dwData) +{ + VIDEOREGISTER *VidReg; + + switch (dwAction) + { + case VIDREGREC_RESET_COUNTER : + if (!pVia->VidReg) + pVia->VidReg = xnfcalloc(VIDEO_REG_NUM,sizeof(VIDEOREGISTER)); + pVia->gdwVidRegCounter = 0; + break; + + case VIDREGREC_SAVE_REGISTER: + VidReg = (VIDEOREGISTER*) pVia->VidReg; + VidReg[pVia->gdwVidRegCounter].dwIndex = dwIndex; + VidReg[pVia->gdwVidRegCounter].dwData = dwData; + pVia->gdwVidRegCounter++; + if ( pVia->gdwVidRegCounter > VIDEO_REG_NUM){ + /*DBG_DD("viaMacro_VidREGRec:Out of Video register space");*/ + DBG_DD(ErrorF("viaMacro_VidREGRec:Out of Video register space")); + } + + break; + + default : + /*DBG_DD("viaMacro_VidREGRec:Unknow action");*/ + DBG_DD(ErrorF("viaMacro_VidREGRec:Unknow action")); + break; + } +} + +void viaMacro_VidREGFlushVPE(VIAPtr pVia) +{ + VIDEOREGISTER *VidReg = (VIDEOREGISTER*) pVia->VidReg; + unsigned long i; + CARD32 volatile *pdwState = (CARD32 volatile *) pVia->VidMapBase; + pdwState = (CARD32 volatile *) (pVia->VidMapBase+V_COMPOSE_MODE); + + while ((*pdwState & V1_COMMAND_FIRE)||(*pdwState & V3_COMMAND_FIRE)); + + for (i=0; i< pVia->gdwVidRegCounter; i++ ) + { + VIDOutD(VidReg[i].dwIndex, VidReg[i].dwData); + /*DBG_DD("viaMacro_VidREGFlush V3:%08lx %08lx\n",VidReg[i].dwIndex+0x200,VidReg[i].dwData);*/ + DBG_DD(ErrorF("viaMacro_VidREGFlush V3:%08lx %08lx\n",VidReg[i].dwIndex+0x200,VidReg[i].dwData)); + } +} + +void viaMacro_VidREGRecVPE(VIAPtr pVia, unsigned long dwAction, unsigned long dwIndex, unsigned long dwData) +{ + VIDEOREGISTER *VidReg; + + switch (dwAction) + { + case VIDREGREC_RESET_COUNTER : + if (!pVia->VidReg) + pVia->VidReg = xnfcalloc(VIDEO_REG_NUM,sizeof(VIDEOREGISTER)); + pVia->gdwVidRegCounter = 0; + break; + + case VIDREGREC_SAVE_REGISTER: + VidReg = (VIDEOREGISTER*) pVia->VidReg; + VidReg[pVia->gdwVidRegCounter].dwIndex = dwIndex; + VidReg[pVia->gdwVidRegCounter].dwData = dwData; + pVia->gdwVidRegCounter++; + if ( pVia->gdwVidRegCounter > VIDEO_REG_NUM){ + /*TOINT3;*/ + } + + break; + + default : + /*TOINT3;*/ + break; + } +} diff --git a/src/via_regrec.h b/src/via_regrec.h new file mode 100644 index 0000000..d3115d9 --- /dev/null +++ b/src/via_regrec.h @@ -0,0 +1,67 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_regrec.h,v 1.2 2003/08/27 15:16:13 tsi Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef _VIA_REGREC_H_ +#define _VIA_REGREC_H_ 1 + +/*#define XV_DEBUG 1*/ /* write log msg to /var/log/XFree86.0.log */ + +#ifdef XV_DEBUG +# define DBG_DD(x) (x) +#else +# define DBG_DD(x) +#endif + +#define VIDREGREC_RESET_COUNTER 0 +#define VIDREGREC_SAVE_REGISTER VIDREGREC_RESET_COUNTER +1 +#define VIDREGREC_FLUSH_REGISTER VIDREGREC_RESET_COUNTER +2 +#define VIDEO_REG_NUM 100 + +#define IN_HQV_FIRE (*((unsigned long volatile *)(pVia->VidMapBase+HQV_CONTROL))&HQV_IDLE) +#define IN_VIDEO_FIRE (*((unsigned long volatile *)(pVia->VidMapBase+V_COMPOSE_MODE))&V1_COMMAND_FIRE) +#define IN_HQV_FLIP (*((unsigned long volatile *)(pVia->VidMapBase+HQV_CONTROL))&HQV_FLIP_STATUS) +#define IN_VIDEO_DISPLAY (*((unsigned long volatile *)(pVia->VidMapBase+V_FLAGS))&VBI_STATUS) + +/*#define IN_DISPLAY (VIDInD(V_FLAGS) & 0x200) +//#define IN_VBLANK (!IN_DISPLAY) +*/ +typedef struct +{ + unsigned long dwIndex; + unsigned long dwData; +}VIDEOREGISTER; + +void viaWaitHQVIdle(VIAPtr pVia); +void viaWaitVideoCommandFire(VIAPtr pVia); +void viaWaitHQVFlip(VIAPtr pVia); +void viaWaitHQVFlipClear(VIAPtr pVia, unsigned long dwData); +void viaWaitVBI(VIAPtr pVia); +void viaWaitHQVDone(VIAPtr pVia); +void viaMacro_VidREGFlush(VIAPtr pVia); +void viaMacro_VidREGRec(VIAPtr pVia, unsigned long dwAction, unsigned long dwIndex, unsigned long dwData); +void viaMacro_VidREGFlushVPE(VIAPtr pVia); +void viaMacro_VidREGRecVPE(VIAPtr pVia, unsigned long dwAction, unsigned long dwIndex, unsigned long dwData); + +#endif /* _VIA_REGREC_H_ */ diff --git a/src/via_regs.h b/src/via_regs.h new file mode 100644 index 0000000..3e2fb0a --- /dev/null +++ b/src/via_regs.h @@ -0,0 +1,212 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_regs.h,v 1.3 2003/08/27 15:16:13 tsi Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/************************************************************************* + * + * File: via_regs.c + * Content: The defines of Via registers + * + ************************************************************************/ + +#ifndef _VIA_REGS_H_ +#define _VIA_REGS_H_ 1 + +#include "via_driver.h" + +#define VIA_SERIES(chip) (chip == VIA_CLE266) + + +/* Chip tags. These are used to group the adapters into + * related families. + */ + +enum VIACHIPTAGS { + VIA_UNKNOWN = 0, + VIA_CLE266, + VIA_KM400, + VIA_K8M800, + VIA_LAST +}; + + +#define PCI_VIA_VENDOR_ID 0x1106 + +#define PCI_CHIP_CLE3122 0x3122 +#define PCI_CHIP_CLE3022 0x3022 +#define PCI_CHIP_VT3205 0x3205 +#define PCI_CHIP_VT7205 0x7205 +#define PCI_CHIP_VT3204 0x3204 +#define PCI_CHIP_VT7204 0x7204 + + +#define BIOS_BSIZE 1024 +#define BIOS_BASE 0xc0000 + + +#define VIA_MMIO_REGSIZE 0x9000 +#define VIA_MMIO_REGBASE 0x0 +#define VIA_MMIO_VGABASE 0x8000 +#define VIA_MMIO_BLTBASE 0x200000 +#define VIA_MMIO_BLTSIZE 0x10000 + + +/* defines for VIA 2D registers */ +#define VIA_REG_GECMD 0x000 +#define VIA_REG_GEMODE 0x004 +#define VIA_REG_GESTATUS 0x004 /* as same as VIA_REG_GEMODE */ +#define VIA_REG_SRCPOS 0x008 +#define VIA_REG_DSTPOS 0x00C +#define VIA_REG_LINE_K1K2 0x008 +#define VIA_REG_LINE_XY 0x00C +#define VIA_REG_DIMENSION 0x010 /* width and height */ +#define VIA_REG_PATADDR 0x014 +#define VIA_REG_FGCOLOR 0x018 +#define VIA_REG_DSTCOLORKEY 0x018 /* as same as VIA_REG_FG */ +#define VIA_REG_BGCOLOR 0x01C +#define VIA_REG_SRCCOLORKEY 0x01C /* as same as VIA_REG_BG */ +#define VIA_REG_CLIPTL 0x020 /* top and left of clipping */ +#define VIA_REG_CLIPBR 0x024 /* bottom and right of clipping */ +#define VIA_REG_OFFSET 0x028 +#define VIA_REG_LINE_ERROR 0x028 +#define VIA_REG_KEYCONTROL 0x02C /* color key control */ +#define VIA_REG_SRCBASE 0x030 +#define VIA_REG_DSTBASE 0x034 +#define VIA_REG_PITCH 0x038 /* pitch of src and dst */ +#define VIA_REG_MONOPAT0 0x03C +#define VIA_REG_MONOPAT1 0x040 +#define VIA_REG_COLORPAT 0x100 /* from 0x100 to 0x1ff */ + + + +/* defines for VIA video registers */ +#define VIA_REG_INTERRUPT 0x200 +#define VIA_REG_CRTCSTART 0x214 + + +/* defines for VIA HW cursor registers */ +#define VIA_REG_CURSOR_MODE 0x2D0 +#define VIA_REG_CURSOR_POS 0x2D4 +#define VIA_REG_CURSOR_ORG 0x2D8 +#define VIA_REG_CURSOR_BG 0x2DC +#define VIA_REG_CURSOR_FG 0x2E0 + + +/* defines for VIA 3D registers */ +#define VIA_REG_STATUS 0x400 +#define VIA_REG_TRANSET 0x43C +#define VIA_REG_TRANSPACE 0x440 + +/* VIA_REG_STATUS(0x400): Engine Status */ +#define VIA_CMD_RGTR_BUSY 0x00000080 /* Command Regulator is busy */ +#define VIA_2D_ENG_BUSY 0x00000001 /* 2D Engine is busy */ +#define VIA_3D_ENG_BUSY 0x00000002 /* 3D Engine is busy */ +#define VIA_VR_QUEUE_BUSY 0x00020000 /* Virtual Queue is busy */ + + +/* VIA_REG_GECMD(0x00): 2D Engine Command */ +#define VIA_GEC_NOOP 0x00000000 +#define VIA_GEC_BLT 0x00000001 +#define VIA_GEC_LINE 0x00000005 + +#define VIA_GEC_SRC_XY 0x00000000 +#define VIA_GEC_SRC_LINEAR 0x00000010 +#define VIA_GEC_DST_XY 0x00000000 +#define VIA_GEC_DST_LINRAT 0x00000020 + +#define VIA_GEC_SRC_FB 0x00000000 +#define VIA_GEC_SRC_SYS 0x00000040 +#define VIA_GEC_DST_FB 0x00000000 +#define VIA_GEC_DST_SYS 0x00000080 + +#define VIA_GEC_SRC_MONO 0x00000100 /* source is mono */ +#define VIA_GEC_PAT_MONO 0x00000200 /* pattern is mono */ + +#define VIA_GEC_MSRC_OPAQUE 0x00000000 /* mono src is opaque */ +#define VIA_GEC_MSRC_TRANS 0x00000400 /* mono src is transparent */ + +#define VIA_GEC_PAT_FB 0x00000000 /* pattern is in frame buffer */ +#define VIA_GEC_PAT_REG 0x00000800 /* pattern is from reg setting */ + +#define VIA_GEC_CLIP_DISABLE 0x00000000 +#define VIA_GEC_CLIP_ENABLE 0x00001000 + +#define VIA_GEC_FIXCOLOR_PAT 0x00002000 + +#define VIA_GEC_INCX 0x00000000 +#define VIA_GEC_DECY 0x00004000 +#define VIA_GEC_INCY 0x00000000 +#define VIA_GEC_DECX 0x00008000 + +#define VIA_GEC_MPAT_OPAQUE 0x00000000 /* mono pattern is opaque */ +#define VIA_GEC_MPAT_TRANS 0x00010000 /* mono pattern is transparent */ + +#define VIA_GEC_MONO_UNPACK 0x00000000 +#define VIA_GEC_MONO_PACK 0x00020000 +#define VIA_GEC_MONO_DWORD 0x00000000 +#define VIA_GEC_MONO_WORD 0x00040000 +#define VIA_GEC_MONO_BYTE 0x00080000 + +#define VIA_GEC_LASTPIXEL_ON 0x00000000 +#define VIA_GEC_LASTPIXEL_OFF 0x00100000 +#define VIA_GEC_X_MAJOR 0x00000000 +#define VIA_GEC_Y_MAJOR 0x00200000 +#define VIA_GEC_QUICK_START 0x00800000 + + +/* VIA_REG_GEMODE(0x04): GE mode */ +#define VIA_GEM_8bpp 0x00000000 +#define VIA_GEM_16bpp 0x00000100 +#define VIA_GEM_32bpp 0x00000300 + +#define VIA_GEM_640 0x00000000 /* 640*480 */ +#define VIA_GEM_800 0x00000400 /* 800*600 */ +#define VIA_GEM_1024 0x00000800 /* 1024*768 */ +#define VIA_GEM_1280 0x00000C00 /* 1280*1024 */ +#define VIA_GEM_1600 0x00001000 /* 1600*1200 */ +#define VIA_GEM_2048 0x00001400 /* 2048*1536 */ + +/* VIA_REG_PITCH(0x38): Pitch Setting */ +#define VIA_PITCH_ENABLE 0x80000000 + + +#define MAXLOOP 0xffffff + + +#define VerticalRetraceWait() \ +{ \ + VGAOUT8(vgaCRIndex, 0x17); \ + if (VGAIN8(vgaCRReg) & 0x80) { \ + while ((VGAIN8(vgaIOBase + 0x0a) & 0x08) == 0x00) ; \ + while ((VGAIN8(vgaIOBase + 0x0a) & 0x08) == 0x08) ; \ + while ((VGAIN8(vgaIOBase + 0x0a) & 0x08) == 0x00) ; \ + } \ +} + + +#define VIASETREG(addr, data) *(volatile unsigned int *)(pVia->MapBase + (addr)) = (data) +#define VIAGETREG(addr) *(volatile unsigned int *)(pVia->MapBase + (addr)) + + +#endif /* _VIA_REGS_H_ */ diff --git a/src/via_saa7108.h b/src/via_saa7108.h new file mode 100644 index 0000000..f0b7783 --- /dev/null +++ b/src/via_saa7108.h @@ -0,0 +1,218 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_saa7108.h,v 1.2 2003/08/27 15:16:13 tsi Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef _VIA_SAA7108_H_ +#define _VIA_SAA7108_H_ 1 + +static const VIABIOSSAA7108TVMASKTableRec saa7108MaskTable = { + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0, 0XFF, 0, 0, 0, 0, 0, 0, 0XFF, 0XFF, 0XFF, 0, 0, 0XFF, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0, 0, 0, 0, 0, 0XFF, 0XFF, 0XFF, 0, 0, 0XFF, 0XFF, 0XFF, 0, 0, 0 }, + 0X3F, 0X18, 66, 14, 22 +}; + +static const VIABIOSSAA7108TableRec saa7108Table[] = { + { + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X2, 0XF, 0XC3, 0, 0X2, 0X30, 0X25, 0X76, 0XAF, 0X30, 0X3C, 0X2E, 0X25, 0X11, 0X3F, 0X1F, 0X7C, 0XF0, 0X21, 0, 0, 0, 0, 0, 0X1, 0X26, 0, 0X6, 0X60, 0X28, 0X61, 0X90, 0X94, 0XB0, 0X78, 0XF9, 0X2A, 0XFA, 0X18, 0XFB, 0, 0, 0XC, 0XD, 0X2, 0XEA, 0X87, 0X21, 0XA5, 0X88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X81, 0X40, 0X28, 0X28, 0X4, 0X7D, 0X2A, 0X20, 0X2F, 0X94, 0X4F, 0X20, 0X7F, 0X90, 0X90, 0X3B, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X5F, 0X4F, 0X4F, 0X83, 0X52, 0X9F, 0X4C, 0XBA, 0, 0X40, 0, 0, 0, 0, 0, 0, 0X15, 0X83, 0XDF, 0, 0, 0XDF, 0X4D, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0X1F, 0X7F, 0X7F, 0X1F, 0X9A, 0X23, 0X90, 0X69, 0X4D, 0XDF, 0XDF, 0X4D, 0X11, 0XA, 0X4, 0X4B, 0, 0, 0, 0, 0, 0X28, 0X50, 0, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X1F, 0X7F, 0X7F, 0X1F, 0X9A, 0X23, 0X90, 0X69, 0X4D, 0XDF, 0XDF, 0X4D, 0X11, 0XA, 0X4, 0X4B, 0, 0, 0, 0, 0, 0X50, 0XA0, 0X40, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X1F, 0X7F, 0X7F, 0X1F, 0X9A, 0X23, 0X90, 0X69, 0X4D, 0XDF, 0XDF, 0X4D, 0X11, 0XA, 0X4, 0X4B, 0, 0, 0, 0, 0, 0XA0, 0X40, 0X81, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X7, 0X43A, 0XB17, 0XB18, 0XB19, 0X38, 0X39, 0X3254, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0XC3A, 0XB17, 0X1B18, 0XB19, 0X38, 0X39, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X2, 0XF, 0XC3, 0, 0X2, 0X30, 0, 0X7D, 0XAF, 0X33, 0X35, 0X35, 0, 0X2, 0X2F, 0XCB, 0X8A, 0X9, 0X2A, 0, 0, 0, 0, 0, 0X1, 0X25, 0X80, 0X2, 0X68, 0X44, 0X61, 0X90, 0X94, 0XB0, 0X78, 0XF9, 0X2A, 0XFA, 0X25, 0X25, 0X40, 0, 0XC, 0XD, 0X8, 0XAA, 0X84, 0X1D, 0XA4, 0X88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XB5, 0X80, 0X48, 0X48, 0X8, 0XE5, 0X29, 0X20, 0X8F, 0X6, 0XC7, 0X6E, 0X87, 0X32, 0X32, 0X4C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X64, 0X4F, 0X4F, 0X88, 0X52, 0X80, 0X4F, 0XBA, 0, 0X40, 0, 0, 0, 0, 0, 0, 0X2, 0X83, 0XDF, 0, 0, 0XDF, 0X50, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0X47, 0X7F, 0X7F, 0X47, 0X9A, 0X23, 0X95, 0X1A, 0X50, 0XDF, 0XDF, 0X50, 0X51, 0XA, 0X5, 0X4C, 0, 0, 0, 0, 0, 0X28, 0X50, 0, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X47, 0X7F, 0X7F, 0X47, 0X9A, 0X23, 0X95, 0X1A, 0X50, 0XDF, 0XDF, 0X50, 0X51, 0XA, 0X5, 0X4C, 0, 0, 0, 0, 0, 0X50, 0XA0, 0X40, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X47, 0X7F, 0X7F, 0X47, 0X9A, 0X23, 0X95, 0X1A, 0X50, 0XDF, 0XDF, 0X50, 0X51, 0XA, 0X5, 0X4C, 0, 0, 0, 0, 0, 0XA0, 0X40, 0X81, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X7, 0X43A, 0XB17, 0XB18, 0XB19, 0X38, 0X39, 0X3254, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0XC3A, 0XB17, 0X1B18, 0XB19, 0X38, 0X39, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + }, + { + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X2, 0XF, 0XC3, 0, 0X2, 0X30, 0, 0X76, 0XAF, 0X30, 0X3C, 0X2E, 0X25, 0X11, 0X3F, 0X1F, 0X7C, 0XF0, 0X21, 0, 0, 0, 0, 0, 0X1, 0X28, 0, 0X6, 0X5C, 0X28, 0X61, 0X90, 0X94, 0XB0, 0X78, 0XF9, 0X2A, 0XFA, 0X1B, 0XF8, 0, 0, 0XC, 0XD, 0, 0XA2, 0XB0, 0X38, 0XA5, 0X88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XCF, 0X95, 0X3D, 0X3D, 0X4, 0X7D, 0X2A, 0X20, 0X2F, 0X54, 0X2A, 0X98, 0X5C, 0XE9, 0XEA, 0X2A, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X80, 0X63, 0X63, 0X84, 0X69, 0X1A, 0XEC, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X9D, 0X8B, 0X57, 0, 0, 0X57, 0XED, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0X27, 0X1F, 0X1F, 0X27, 0XE3, 0X34, 0X48, 0XCC, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X93, 0X48, 0, 0, 0, 0, 0, 0X32, 0X64, 0, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X27, 0X1F, 0X1F, 0X27, 0XE3, 0X34, 0X48, 0XCC, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X93, 0X48, 0, 0, 0, 0, 0, 0X64, 0XC8, 0X40, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X27, 0X1F, 0X1F, 0X27, 0XE3, 0X34, 0X48, 0XCC, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X93, 0X48, 0, 0, 0, 0, 0, 0XC8, 0X90, 0X81, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X7, 0X43A, 0XB17, 0XB18, 0XB19, 0X38, 0X39, 0X3254, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0XC3A, 0XB17, 0X1B18, 0XB19, 0X38, 0X39, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X2, 0XF, 0XC3, 0, 0X2, 0X30, 0, 0X7D, 0XAF, 0X33, 0X35, 0X35, 0, 0X2, 0X2F, 0XCB, 0X8A, 0X9, 0X2A, 0, 0, 0, 0, 0, 0X1, 0X26, 0, 0X2, 0X68, 0X44, 0X61, 0X90, 0X94, 0XB0, 0X78, 0XF9, 0X2A, 0XFA, 0X25, 0X25, 0X40, 0, 0XC, 0XD, 0X2, 0X3F, 0XE9, 0X2B, 0XA5, 0X88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X89, 0X90, 0X49, 0X49, 0X4, 0XED, 0X2A, 0X24, 0XE7, 0X3, 0X71, 0XBA, 0X6C, 0X60, 0X60, 0X3B, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X78, 0X63, 0X63, 0X9C, 0X6B, 0X95, 0XE3, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X84, 0X82, 0X57, 0, 0, 0X57, 0XE4, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0XE7, 0X1F, 0X1F, 0XE7, 0XDB, 0X33, 0X5E, 0XC1, 0XE4, 0X57, 0X57, 0XE4, 0X52, 0X12, 0X77, 0X4B, 0, 0, 0, 0, 0, 0X32, 0X64, 0, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XE7, 0X1F, 0X1F, 0XE7, 0XDB, 0X33, 0X5E, 0XC1, 0XE4, 0X57, 0X57, 0XE4, 0X52, 0X12, 0X77, 0X4B, 0, 0, 0, 0, 0, 0X64, 0XC8, 0X40, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XE7, 0X1F, 0X1F, 0XE7, 0XDB, 0X33, 0X5E, 0XC1, 0XE4, 0X57, 0X57, 0XE4, 0X52, 0X12, 0X77, 0X4B, 0, 0, 0, 0, 0, 0XC8, 0X90, 0X81, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X7, 0X43A, 0XB17, 0XB18, 0XB19, 0X38, 0X39, 0X3254, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0XC3A, 0XB17, 0X1B18, 0XB19, 0X38, 0X39, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + }, + { + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X2, 0XF, 0XC3, 0, 0X2, 0X30, 0, 0X76, 0XA5, 0X3A, 0X2E, 0X2E, 0, 0X15, 0X3F, 0X1F, 0X7C, 0XF0, 0X21, 0, 0, 0, 0, 0, 0X1, 0X24, 0, 0X2, 0X58, 0X34, 0X61, 0X90, 0X94, 0XB0, 0X78, 0XF9, 0X2A, 0XFA, 0X18, 0XF5, 0, 0, 0XC, 0XD, 0X2, 0X85, 0XDF, 0X26, 0XA0, 0X88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X39, 0, 0X69, 0X69, 0X8, 0, 0X28, 0X21, 0X73, 0X4, 0XB8, 0X64, 0X49, 0X80, 0X80, 0X2A, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X8B, 0X7F, 0X7F, 0X8F, 0X81, 0X8, 0XB4, 0XF5, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X51, 0X83, 0XFF, 0, 0, 0XFF, 0XB5, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0X7F, 0XFF, 0XFF, 0X7F, 0X23, 0X34, 0X8, 0X3E, 0XB5, 0XFF, 0XFF, 0XB5, 0X9A, 0X13, 0X4B, 0X68, 0, 0, 0, 0, 0, 0X40, 0X80, 0, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X7F, 0XFF, 0XFF, 0X7F, 0X23, 0X34, 0X8, 0X3E, 0XB5, 0XFF, 0XFF, 0XB5, 0X9A, 0X13, 0X4B, 0X68, 0, 0, 0, 0, 0, 0X80, 0, 0X41, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X7F, 0XFF, 0XFF, 0X7F, 0X23, 0X34, 0X8, 0X3E, 0XB5, 0XFF, 0XFF, 0XB5, 0X9A, 0X13, 0X4B, 0X68, 0, 0, 0, 0, 0, 0, 0, 0X86, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X7, 0X43A, 0XB17, 0XB18, 0XB19, 0X38, 0X39, 0X3254, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0XC3A, 0XB17, 0X1B18, 0XB19, 0X38, 0X39, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X2, 0XF, 0XC3, 0, 0X2, 0X30, 0, 0X7D, 0XAF, 0X33, 0X35, 0X35, 0, 0X2, 0X2F, 0XCB, 0X8A, 0X9, 0X2A, 0, 0, 0, 0, 0, 0X1, 0X22, 0, 0X2, 0X68, 0X44, 0X61, 0X90, 0X94, 0XB0, 0X78, 0XF9, 0X2A, 0XFA, 0X25, 0X25, 0X40, 0, 0XC, 0XD, 0, 0X1B, 0XC7, 0X21, 0XA0, 0X88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X9A, 0, 0X66, 0X66, 0X8, 0, 0X28, 0X24, 0XAF, 0X4, 0XB8, 0X45, 0X59, 0XA1, 0XA1, 0X2A, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X91, 0X7F, 0X7F, 0X95, 0X82, 0XB, 0XB4, 0XF5, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X3B, 0X86, 0XFF, 0, 0, 0XFF, 0XB5, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0XAF, 0XFF, 0XFF, 0XAF, 0X23, 0X34, 0X16, 0X60, 0XB5, 0XFF, 0XFF, 0XB5, 0X9A, 0X13, 0X2B, 0X68, 0, 0, 0, 0, 0, 0X40, 0X80, 0, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XAF, 0XFF, 0XFF, 0XAF, 0X23, 0X34, 0X16, 0X60, 0XB5, 0XFF, 0XFF, 0XB5, 0X9A, 0X13, 0X2B, 0X68, 0, 0, 0, 0, 0, 0X80, 0, 0X41, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XAF, 0XFF, 0XFF, 0XAF, 0X23, 0X34, 0X16, 0X60, 0XB5, 0XFF, 0XFF, 0XB5, 0X9A, 0X13, 0X2B, 0X68, 0, 0, 0, 0, 0, 0, 0, 0X86, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X7, 0X43A, 0XB17, 0XB18, 0XB19, 0X38, 0X39, 0X3254, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0XC3A, 0XB17, 0X1B18, 0XB19, 0X38, 0X39, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + }, + { + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X2, 0XF, 0XC3, 0, 0X2, 0X30, 0X25, 0X76, 0XAF, 0X30, 0X3C, 0X2E, 0X25, 0X11, 0X3F, 0X1F, 0X7C, 0XF0, 0X21, 0, 0, 0, 0, 0, 0X1, 0X26, 0, 0X6, 0X60, 0X28, 0X61, 0X90, 0X94, 0XB0, 0X78, 0XF9, 0X2A, 0XFA, 0X18, 0XFB, 0, 0, 0XC, 0XD, 0X2, 0XDF, 0X4B, 0X32, 0XA5, 0X88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XBE, 0XA8, 0X28, 0X28, 0X4, 0X7D, 0X2A, 0X20, 0XAF, 0X94, 0X8D, 0X20, 0X7B, 0X90, 0X90, 0X3B, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X91, 0X69, 0X69, 0X95, 0X7C, 0X7, 0X4C, 0XBA, 0, 0X40, 0, 0, 0, 0, 0, 0, 0X15, 0X8D, 0XDF, 0, 0, 0XDF, 0X4D, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0XAF, 0X4F, 0X4F, 0XAF, 0XE3, 0X34, 0XE5, 0XA, 0X4D, 0XDF, 0XDF, 0X4D, 0X11, 0XA, 0X16, 0X4A, 0, 0, 0, 0, 0, 0X35, 0X6A, 0, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XAF, 0X4F, 0X4F, 0XAF, 0XE3, 0X34, 0XE5, 0XA, 0X4D, 0XDF, 0XDF, 0X4D, 0X11, 0XA, 0X16, 0X4A, 0, 0, 0, 0, 0, 0X6A, 0XD4, 0X40, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XAF, 0X4F, 0X4F, 0XAF, 0XE3, 0X34, 0XE5, 0XA, 0X4D, 0XDF, 0XDF, 0X4D, 0X11, 0XA, 0X16, 0X4A, 0, 0, 0, 0, 0, 0XD4, 0XA8, 0X81, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X7, 0X43A, 0XB17, 0XB18, 0XB19, 0X38, 0X39, 0X3254, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0XC3A, 0XB17, 0X1B18, 0XB19, 0X38, 0X39, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X2, 0XF, 0XC3, 0, 0X2, 0X30, 0, 0X7D, 0XAF, 0X33, 0X35, 0X35, 0, 0X2, 0X2F, 0XCB, 0X8A, 0X9, 0X2A, 0, 0, 0, 0, 0, 0X1, 0X25, 0X80, 0X2, 0X68, 0X44, 0X61, 0X90, 0X94, 0XB0, 0X78, 0XF9, 0X2A, 0XFA, 0X25, 0X25, 0X40, 0, 0XC, 0XD, 0, 0X3C, 0X2B, 0X2A, 0XA4, 0X88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XBD, 0X50, 0X48, 0X48, 0XC, 0XE5, 0X29, 0X20, 0XAF, 0X9, 0XDF, 0X6E, 0X85, 0X32, 0X32, 0X4C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X91, 0X69, 0X69, 0X95, 0X7E, 0X3, 0X4F, 0XBA, 0, 0X40, 0, 0, 0, 0, 0, 0, 0X2, 0X8D, 0XDF, 0, 0, 0XDF, 0X50, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0XAF, 0X4F, 0X4F, 0XAF, 0XE3, 0X34, 0XF6, 0XA, 0X50, 0XDF, 0XDF, 0X50, 0X11, 0XA, 0X4, 0X5B, 0, 0, 0, 0, 0, 0X35, 0X6A, 0, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XAF, 0X4F, 0X4F, 0XAF, 0XE3, 0X34, 0XF6, 0XA, 0X50, 0XDF, 0XDF, 0X50, 0X11, 0XA, 0X4, 0X5B, 0, 0, 0, 0, 0, 0X6A, 0XD4, 0X40, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XAF, 0X4F, 0X4F, 0XAF, 0XE3, 0X34, 0XF6, 0XA, 0X50, 0XDF, 0XDF, 0X50, 0X11, 0XA, 0X4, 0X5B, 0, 0, 0, 0, 0, 0XD4, 0XA8, 0X81, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X7, 0X43A, 0XB17, 0XB18, 0XB19, 0X38, 0X39, 0X3254, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0XC3A, 0XB17, 0X1B18, 0XB19, 0X38, 0X39, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + } +}; + +static const VIABIOSSAA7108TableRec saa7108OverTable[] = { + { + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X2, 0XF, 0XC3, 0, 0X2, 0X30, 0X88, 0X76, 0XA5, 0X3A, 0X2E, 0X2E, 0, 0X11, 0X3F, 0X1F, 0X7C, 0XF0, 0X21, 0, 0, 0, 0, 0, 0X1, 0X2A, 0, 0X6, 0, 0X8C, 0X61, 0X90, 0X94, 0XB0, 0X78, 0XF9, 0X2A, 0XFA, 0X13, 0X3, 0X40, 0, 0XC, 0XD, 0X9, 0X3B, 0XD6, 0X1D, 0XA4, 0X88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X9B, 0X80, 0X16, 0X16, 0X8, 0XE0, 0X29, 0X20, 0X3F, 0X6, 0XE0, 0, 0X88, 0, 0, 0X4C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X5F, 0X4F, 0X4F, 0X83, 0X52, 0X9F, 0XB, 0X3E, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XEE, 0X83, 0XDF, 0, 0, 0XDF, 0XC, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0X1F, 0X7F, 0X7F, 0X1F, 0X9A, 0X23, 0X90, 0XFA, 0XC, 0XDF, 0XDF, 0XC, 0X11, 0XA, 0XEE, 0X31, 0, 0, 0, 0, 0, 0X28, 0X50, 0, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X1F, 0X7F, 0X7F, 0X1F, 0X9A, 0X23, 0X90, 0XFA, 0XC, 0XDF, 0XDF, 0XC, 0X11, 0XA, 0XEE, 0X31, 0, 0, 0, 0, 0, 0X50, 0XA0, 0X40, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X1F, 0X7F, 0X7F, 0X1F, 0X9A, 0X23, 0X90, 0XFA, 0XC, 0XDF, 0XDF, 0XC, 0X11, 0XA, 0XEE, 0X31, 0, 0, 0, 0, 0, 0XA0, 0X40, 0X81, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X7, 0X43A, 0XB17, 0XB18, 0XB19, 0X38, 0X39, 0X3254, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0XC3A, 0XB17, 0X1B18, 0XB19, 0X38, 0X39, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X2, 0XF, 0XC3, 0, 0X2, 0X30, 0, 0X7D, 0XAF, 0X33, 0X35, 0X35, 0, 0X2, 0X2F, 0XCB, 0X8A, 0X9, 0X2A, 0, 0, 0, 0, 0, 0X1, 0X2E, 0, 0X2, 0X18, 0X94, 0X61, 0X90, 0X94, 0XB0, 0X78, 0XF9, 0X2A, 0XFA, 0X17, 0X35, 0X40, 0, 0XC, 0XD, 0, 0X22, 0X22, 0X1A, 0XA4, 0X88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XAB, 0X80, 0X16, 0X16, 0X8, 0XE0, 0X29, 0, 0X8F, 0X6, 0XC7, 0X89, 0X98, 0XC5, 0XC5, 0X4C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X64, 0X4F, 0X4F, 0X88, 0X53, 0X83, 0XB, 0X3E, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XEE, 0X83, 0XDF, 0, 0, 0XDF, 0XC, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0X47, 0X7F, 0X7F, 0X47, 0X9A, 0X23, 0X95, 0X1A, 0XC, 0XDF, 0XDF, 0XC, 0X51, 0XA, 0XEE, 0X31, 0, 0, 0, 0, 0, 0X28, 0X50, 0, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X47, 0X7F, 0X7F, 0X47, 0X9A, 0X23, 0X95, 0X1A, 0XC, 0XDF, 0XDF, 0XC, 0X51, 0XA, 0XEE, 0X31, 0, 0, 0, 0, 0, 0X50, 0XA0, 0X40, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X47, 0X7F, 0X7F, 0X47, 0X9A, 0X23, 0X95, 0X1A, 0XC, 0XDF, 0XDF, 0XC, 0X51, 0XA, 0XEE, 0X31, 0, 0, 0, 0, 0, 0XA0, 0X40, 0X81, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X7, 0X43A, 0XB17, 0XB18, 0XB19, 0X38, 0X39, 0X3254, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0XC3A, 0XB17, 0X1B18, 0XB19, 0X38, 0X39, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + }, + { + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X2, 0XF, 0XC3, 0, 0X2, 0X30, 0X88, 0X76, 0XA5, 0X3A, 0X2E, 0X2E, 0, 0X11, 0X3F, 0X1F, 0X7C, 0XF0, 0X21, 0, 0, 0, 0, 0, 0X1, 0X24, 0, 0X6, 0, 0X8C, 0X61, 0X90, 0X94, 0XB0, 0X78, 0XF9, 0X2A, 0XFA, 0X13, 0X3, 0X40, 0, 0XC, 0XD, 0, 0X65, 0X77, 0X30, 0XA5, 0X88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XC3, 0X90, 0X24, 0X24, 0X4, 0X58, 0X2A, 0X20, 0XF, 0X4, 0X34, 0X67, 0X6E, 0X33, 0X33, 0X3B, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X7D, 0X63, 0X63, 0X81, 0X69, 0X18, 0X8E, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X64, 0X8B, 0X57, 0, 0, 0X57, 0X8F, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0XF, 0X1F, 0X1F, 0XF, 0XE3, 0X34, 0X44, 0XBC, 0X8F, 0X57, 0X57, 0X8F, 0X52, 0X12, 0X59, 0X41, 0, 0, 0, 0, 0, 0X32, 0X64, 0, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XF, 0X1F, 0X1F, 0XF, 0XE3, 0X34, 0X44, 0XBC, 0X8F, 0X57, 0X57, 0X8F, 0X52, 0X12, 0X59, 0X41, 0, 0, 0, 0, 0, 0X64, 0XC8, 0X40, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XF, 0X1F, 0X1F, 0XF, 0XE3, 0X34, 0X44, 0XBC, 0X8F, 0X57, 0X57, 0X8F, 0X52, 0X12, 0X59, 0X41, 0, 0, 0, 0, 0, 0XC8, 0X90, 0X81, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X7, 0X43A, 0XB17, 0XB18, 0XB19, 0X38, 0X39, 0X3254, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0XC3A, 0XB17, 0X1B18, 0XB19, 0X38, 0X39, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X2, 0XF, 0XC3, 0, 0X2, 0X30, 0, 0X7D, 0XAF, 0X33, 0X35, 0X35, 0, 0X2, 0X2F, 0XCB, 0X8A, 0X9, 0X2A, 0, 0, 0, 0, 0, 0X1, 0X2C, 0, 0X2, 0X18, 0X94, 0X61, 0X90, 0X94, 0XB0, 0X78, 0XF9, 0X2A, 0XFA, 0X17, 0X35, 0X40, 0, 0XC, 0XD, 0, 0X5A, 0XD1, 0X28, 0XA5, 0X88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X82, 0X90, 0X20, 0X20, 0X4, 0X70, 0X2A, 0, 0X19, 0X4, 0XB, 0X23, 0X7E, 0XCD, 0XCD, 0X3B, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X76, 0X63, 0X63, 0X9A, 0X68, 0X93, 0XBA, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X83, 0X8B, 0X57, 0, 0, 0X57, 0XBB, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0XD7, 0X1F, 0X1F, 0XD7, 0XDB, 0X33, 0X3B, 0X97, 0XBB, 0X57, 0X57, 0XBB, 0X52, 0X12, 0X83, 0X51, 0, 0, 0, 0, 0, 0X32, 0X64, 0, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XD7, 0X1F, 0X1F, 0XD7, 0XDB, 0X33, 0X3B, 0X97, 0XBB, 0X57, 0X57, 0XBB, 0X52, 0X12, 0X83, 0X51, 0, 0, 0, 0, 0, 0X64, 0XC8, 0X40, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XD7, 0X1F, 0X1F, 0XD7, 0XDB, 0X33, 0X3B, 0X97, 0XBB, 0X57, 0X57, 0XBB, 0X52, 0X12, 0X83, 0X51, 0, 0, 0, 0, 0, 0XC8, 0X90, 0X81, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X7, 0X43A, 0XB17, 0XB18, 0XB19, 0X38, 0X39, 0X3254, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0XC3A, 0XB17, 0X1B18, 0XB19, 0X38, 0X39, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + }, + { + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X2, 0XF, 0XC3, 0, 0X2, 0X30, 0, 0X76, 0XA5, 0X3A, 0X2E, 0X2E, 0, 0X15, 0X3F, 0X1F, 0X7C, 0XF0, 0X21, 0, 0, 0, 0, 0, 0X1, 0X22, 0, 0X2, 0, 0X8C, 0X61, 0X90, 0X94, 0XB0, 0X78, 0XF9, 0X2A, 0XFA, 0X13, 0X3, 0X40, 0, 0XC, 0XD, 0XA, 0X76, 0XFF, 0X24, 0XA0, 0X88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XAE, 0, 0X31, 0X31, 0X8, 0, 0X28, 0X24, 0XD7, 0X4, 0X18, 0, 0X5B, 0X80, 0X80, 0X2A, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X96, 0X7F, 0X7F, 0X9A, 0X82, 0X12, 0X46, 0XF5, 0, 0X60, 0, 0, 0, 0, 0, 0, 0XF, 0X83, 0XFF, 0, 0, 0XFF, 0X47, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0XD7, 0XFF, 0XFF, 0XD7, 0X23, 0X34, 0XF, 0X6A, 0X47, 0XFF, 0XFF, 0X47, 0X9A, 0X13, 0X4, 0X6F, 0, 0, 0, 0, 0, 0X40, 0X80, 0, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XD7, 0XFF, 0XFF, 0XD7, 0X23, 0X34, 0XF, 0X6A, 0X47, 0XFF, 0XFF, 0X47, 0X9A, 0X13, 0X4, 0X6F, 0, 0, 0, 0, 0, 0X80, 0, 0X41, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XD7, 0XFF, 0XFF, 0XD7, 0X23, 0X34, 0XF, 0X6A, 0X47, 0XFF, 0XFF, 0X47, 0X9A, 0X13, 0X4, 0X6F, 0, 0, 0, 0, 0, 0, 0, 0X86, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X7, 0X43A, 0XB17, 0XB18, 0XB19, 0X38, 0X39, 0X3254, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0XC3A, 0XB17, 0X1B18, 0XB19, 0X38, 0X39, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X2, 0XF, 0XC3, 0, 0X2, 0X30, 0, 0X7D, 0XAF, 0X33, 0X35, 0X35, 0, 0X2, 0X2F, 0XCB, 0X8A, 0X9, 0X2A, 0, 0, 0, 0, 0, 0X1, 0X26, 0, 0X2, 0X18, 0X94, 0X61, 0X90, 0X94, 0XB0, 0X78, 0XF9, 0X2A, 0XFA, 0X17, 0X35, 0X40, 0, 0XC, 0XD, 0, 0XDE, 0XDD, 0X1D, 0XA0, 0X88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X99, 0, 0X2F, 0X2F, 0X8, 0, 0X28, 0X24, 0XAF, 0X4, 0XF8, 0XF6, 0X5A, 0XFB, 0XFB, 0X2A, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X91, 0X7F, 0X7F, 0X95, 0X82, 0XB, 0X46, 0XF5, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X11, 0X83, 0XFF, 0, 0, 0XFF, 0X47, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0XAF, 0XFF, 0XFF, 0XAF, 0X23, 0X34, 0XC, 0X56, 0X47, 0XFF, 0XFF, 0X47, 0X9A, 0X13, 0X4, 0X6F, 0, 0, 0, 0, 0, 0X40, 0X80, 0, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XAF, 0XFF, 0XFF, 0XAF, 0X23, 0X34, 0XC, 0X56, 0X47, 0XFF, 0XFF, 0X47, 0X9A, 0X13, 0X4, 0X6F, 0, 0, 0, 0, 0, 0X80, 0, 0X41, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XAF, 0XFF, 0XFF, 0XAF, 0X23, 0X34, 0XC, 0X56, 0X47, 0XFF, 0XFF, 0X47, 0X9A, 0X13, 0X4, 0X6F, 0, 0, 0, 0, 0, 0, 0, 0X86, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X7, 0X43A, 0XB17, 0XB18, 0XB19, 0X38, 0X39, 0X3254, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0XC3A, 0XB17, 0X1B18, 0XB19, 0X38, 0X39, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + }, + { + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X2, 0XF, 0XC3, 0, 0X2, 0X30, 0X88, 0X76, 0XA5, 0X3A, 0X2E, 0X2E, 0, 0X11, 0X3F, 0X1F, 0X7C, 0XF0, 0X21, 0, 0, 0, 0, 0, 0X1, 0X2A, 0, 0X6, 0, 0X8C, 0X61, 0X90, 0X94, 0XB0, 0X78, 0XF9, 0X2A, 0XFA, 0X13, 0X3, 0X40, 0, 0XC, 0XD, 0, 0X2B, 0X98, 0X25, 0XA4, 0X88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X9B, 0X50, 0X16, 0X16, 0XC, 0XE0, 0X29, 0X20, 0XEF, 0X7, 0XB3, 0, 0X86, 0, 0, 0X4C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X79, 0X69, 0X69, 0X9D, 0X6B, 0X9B, 0XB, 0X3E, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XE5, 0X8D, 0XDF, 0, 0, 0XDF, 0XC, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0XEF, 0X4F, 0X4F, 0XEF, 0XDB, 0X33, 0X59, 0XA3, 0XC, 0XDF, 0XDF, 0XC, 0X51, 0XA, 0XE6, 0X2F, 0, 0, 0, 0, 0, 0X35, 0X6A, 0, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XEF, 0X4F, 0X4F, 0XEF, 0XDB, 0X33, 0X59, 0XA3, 0XC, 0XDF, 0XDF, 0XC, 0X51, 0XA, 0XE6, 0X2F, 0, 0, 0, 0, 0, 0X6A, 0XD4, 0X40, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XEF, 0X4F, 0X4F, 0XEF, 0XDB, 0X33, 0X59, 0XA3, 0XC, 0XDF, 0XDF, 0XC, 0X51, 0XA, 0XE6, 0X2F, 0, 0, 0, 0, 0, 0XD4, 0XA8, 0X81, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X7, 0X43A, 0XB17, 0XB18, 0XB19, 0X38, 0X39, 0X3254, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0XC3A, 0XB17, 0X1B18, 0XB19, 0X38, 0X39, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X2, 0XF, 0XC3, 0, 0X2, 0X30, 0, 0X7D, 0XAF, 0X33, 0X35, 0X35, 0, 0X2, 0X2F, 0XCB, 0X8A, 0X9, 0X2A, 0, 0, 0, 0, 0, 0X1, 0X2E, 0, 0X2, 0X18, 0X94, 0X61, 0X90, 0X94, 0XB0, 0X78, 0XF9, 0X2A, 0XFA, 0X17, 0X35, 0X40, 0, 0XC, 0XD, 0, 0X55, 0X55, 0X25, 0XA4, 0X88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X44, 0X50, 0X16, 0X16, 0XD, 0XE0, 0X29, 0, 0XAF, 0X9, 0XA0, 0X89, 0X96, 0XC5, 0XC5, 0X4C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X91, 0X69, 0X69, 0X95, 0X6D, 0X1, 0XB, 0X3E, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XF7, 0X8D, 0XDF, 0, 0, 0XDF, 0XC, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0XAF, 0X4F, 0X4F, 0XAF, 0XE3, 0X34, 0X66, 0XA, 0XC, 0XDF, 0XDF, 0XC, 0X11, 0XA, 0XE6, 0X2F, 0, 0, 0, 0, 0, 0X35, 0X6A, 0, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XAF, 0X4F, 0X4F, 0XAF, 0XE3, 0X34, 0X66, 0XA, 0XC, 0XDF, 0XDF, 0XC, 0X11, 0XA, 0XE6, 0X2F, 0, 0, 0, 0, 0, 0X6A, 0XD4, 0X40, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XAF, 0X4F, 0X4F, 0XAF, 0XE3, 0X34, 0X66, 0XA, 0XC, 0XDF, 0XDF, 0XC, 0X11, 0XA, 0XE6, 0X2F, 0, 0, 0, 0, 0, 0XD4, 0XA8, 0X81, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X7, 0X43A, 0XB17, 0XB18, 0XB19, 0X38, 0X39, 0X3254, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0XC3A, 0XB17, 0X1B18, 0XB19, 0X38, 0X39, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + } +}; + +#endif /* _VIA_SAA7108_H_ */ diff --git a/src/via_shadow.c b/src/via_shadow.c new file mode 100644 index 0000000..5ad738f --- /dev/null +++ b/src/via_shadow.c @@ -0,0 +1,276 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_shadow.c,v 1.3 2003/08/27 15:16:13 tsi Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "via_driver.h" +#include "shadowfb.h" +#include "servermd.h" + + +void +VIARefreshArea(ScrnInfoPtr pScrn, int num, BoxPtr pbox) +{ + VIAPtr pVia = VIAPTR(pScrn); + int width, height, Bpp, FBPitch; + unsigned char *src, *dst; + + Bpp = pScrn->bitsPerPixel >> 3; + FBPitch = BitmapBytePad(pScrn->displayWidth * pScrn->bitsPerPixel); + + while (num--) { + width = (pbox->x2 - pbox->x1) * Bpp; + height = pbox->y2 - pbox->y1; + src = pVia->ShadowPtr + (pbox->y1 * pVia->ShadowPitch) + + (pbox->x1 * Bpp); + dst = pVia->FBStart + (pbox->y1 * FBPitch) + (pbox->x1 * Bpp); + + while (height--) { + memcpy(dst, src, width); + dst += FBPitch; + src += pVia->ShadowPitch; + } + + pbox++; + } +} + + +void +VIAPointerMoved(int index, int x, int y) +{ + ScrnInfoPtr pScrn = xf86Screens[index]; + VIAPtr pVia = VIAPTR(pScrn); + int newX, newY; + + if (pVia->rotate == 1) { + newX = pScrn->pScreen->height - y - 1; + newY = x; + } + else { + newX = y; + newY = pScrn->pScreen->width - x - 1; + + } + + (*pVia->PointerMoved)(index, newX, newY); +} + + +void +VIARefreshArea8(ScrnInfoPtr pScrn, int num, BoxPtr pbox) +{ + VIAPtr pVia = VIAPTR(pScrn); + int count, width, height, y1, y2, dstPitch, srcPitch; + CARD8 *dstPtr, *srcPtr, *src; + CARD32 *dst; + + dstPitch = pScrn->displayWidth; + srcPitch = -pVia->rotate * pVia->ShadowPitch; + + while (num--) { + width = pbox->x2 - pbox->x1; + y1 = pbox->y1 & ~3; + y2 = (pbox->y2 + 3) & ~3; + height = (y2 - y1) >> 2; /* in dwords */ + + if (pVia->rotate == 1) { + dstPtr = pVia->FBStart + (pbox->x1 * dstPitch) + + pScrn->virtualX - y2; + srcPtr = pVia->ShadowPtr + ((1 - y2) * srcPitch) + pbox->x1; + } + else { + dstPtr = pVia->FBStart + + ((pScrn->virtualY - pbox->x2) * dstPitch) + y1; + srcPtr = pVia->ShadowPtr + (y1 * srcPitch) + pbox->x2 - 1; + } + + while (width--) { + src = srcPtr; + dst = (CARD32*) dstPtr; + count = height; + + while (count--) { + *(dst++) = src[0] | (src[srcPitch] << 8) | + (src[srcPitch * 2] << 16) | + (src[srcPitch * 3] << 24); + src += srcPitch * 4; + } + + srcPtr += pVia->rotate; + dstPtr += dstPitch; + } + + pbox++; + } +} + + +void +VIARefreshArea16(ScrnInfoPtr pScrn, int num, BoxPtr pbox) +{ + VIAPtr pVia = VIAPTR(pScrn); + int count, width, height, y1, y2, dstPitch, srcPitch; + CARD16 *dstPtr, *srcPtr, *src; + CARD32 *dst; + + dstPitch = pScrn->displayWidth; + srcPitch = -pVia->rotate * pVia->ShadowPitch >> 1; + + while(num--) { + width = pbox->x2 - pbox->x1; + y1 = pbox->y1 & ~1; + y2 = (pbox->y2 + 1) & ~1; + height = (y2 - y1) >> 1; /* in dwords */ + + if (pVia->rotate == 1) { + dstPtr = (CARD16*)pVia->FBStart + + (pbox->x1 * dstPitch) + pScrn->virtualX - y2; + srcPtr = (CARD16*)pVia->ShadowPtr + + ((1 - y2) * srcPitch) + pbox->x1; + } + else { + dstPtr = (CARD16*)pVia->FBStart + + ((pScrn->virtualY - pbox->x2) * dstPitch) + y1; + srcPtr = (CARD16*)pVia->ShadowPtr + + (y1 * srcPitch) + pbox->x2 - 1; + } + + while (width--) { + src = srcPtr; + dst = (CARD32*)dstPtr; + count = height; + + while (count--) { + *(dst++) = src[0] | (src[srcPitch] << 16); + src += srcPitch * 2; + } + + srcPtr += pVia->rotate; + dstPtr += dstPitch; + } + + pbox++; + } +} + + +/* this one could be faster */ +void +VIARefreshArea24(ScrnInfoPtr pScrn, int num, BoxPtr pbox) +{ + VIAPtr pVia = VIAPTR(pScrn); + int count, width, height, y1, y2, dstPitch, srcPitch; + CARD8 *dstPtr, *srcPtr, *src; + CARD32 *dst; + + dstPitch = BitmapBytePad(pScrn->displayWidth * 24); + srcPitch = -pVia->rotate * pVia->ShadowPitch; + + while (num--) { + width = pbox->x2 - pbox->x1; + y1 = pbox->y1 & ~3; + y2 = (pbox->y2 + 3) & ~3; + height = (y2 - y1) >> 2; /* blocks of 3 dwords */ + + if (pVia->rotate == 1) { + dstPtr = pVia->FBStart + + (pbox->x1 * dstPitch) + ((pScrn->virtualX - y2) * 3); + srcPtr = pVia->ShadowPtr + ((1 - y2) * srcPitch) + (pbox->x1 * 3); + } + else { + dstPtr = pVia->FBStart + + ((pScrn->virtualY - pbox->x2) * dstPitch) + (y1 * 3); + srcPtr = pVia->ShadowPtr + (y1 * srcPitch) + (pbox->x2 * 3) - 3; + } + + while (width--) { + src = srcPtr; + dst = (CARD32*)dstPtr; + count = height; + while(count--) { + dst[0] = src[0] | (src[1] << 8) | (src[2] << 16) | + (src[srcPitch] << 24); + dst[1] = src[srcPitch + 1] | (src[srcPitch + 2] << 8) | + (src[srcPitch * 2] << 16) | + (src[(srcPitch * 2) + 1] << 24); + dst[2] = src[(srcPitch * 2) + 2] | (src[srcPitch * 3] << 8) | + (src[(srcPitch * 3) + 1] << 16) | + (src[(srcPitch * 3) + 2] << 24); + dst += 3; + src += srcPitch * 4; + } + + srcPtr += pVia->rotate * 3; + dstPtr += dstPitch; + } + + pbox++; + } +} + + +void +VIARefreshArea32(ScrnInfoPtr pScrn, int num, BoxPtr pbox) +{ + VIAPtr pVia = VIAPTR(pScrn); + int count, width, height, dstPitch, srcPitch; + CARD32 *dstPtr, *srcPtr, *src, *dst; + + dstPitch = pScrn->displayWidth; + srcPitch = -pVia->rotate * pVia->ShadowPitch >> 2; + + while (num--) { + width = pbox->x2 - pbox->x1; + height = pbox->y2 - pbox->y1; + + if (pVia->rotate == 1) { + dstPtr = (CARD32*)pVia->FBStart + + (pbox->x1 * dstPitch) + pScrn->virtualX - pbox->y2; + srcPtr = (CARD32*)pVia->ShadowPtr + + ((1 - pbox->y2) * srcPitch) + pbox->x1; + } + else { + dstPtr = (CARD32*)pVia->FBStart + + ((pScrn->virtualY - pbox->x2) * dstPitch) + pbox->y1; + srcPtr = (CARD32*)pVia->ShadowPtr + + (pbox->y1 * srcPitch) + pbox->x2 - 1; + } + + while(width--) { + src = srcPtr; + dst = dstPtr; + count = height; + + while(count--) { + *(dst++) = *src; + src += srcPitch; + } + + srcPtr += pVia->rotate; + dstPtr += dstPitch; + } + + pbox++; + } +} diff --git a/src/via_swov.c b/src/via_swov.c new file mode 100644 index 0000000..c0b7c2c --- /dev/null +++ b/src/via_swov.c @@ -0,0 +1,1802 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_swov.c,v 1.11 2004/02/04 04:15:09 dawes Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "xf86.h" +#include "xf86_OSproc.h" +#include "xf86_ansic.h" +#include "xf86fbman.h" + +#include "via_compose.h" +#include "via_capture.h" +#include "via.h" +#include "ddmpeg.h" +#include "xf86drm.h" + +#include "via_overlay.h" +#include "via_driver.h" +#include "via_regrec.h" +#include "via_priv.h" +#include "via_swov.h" +#include "via_common.h" + + + +/* E X T E R N G L O B A L S ----------------------------------------------*/ + +extern Bool XserverIsUp; /* If Xserver had run(register action) */ + +/* G L O B A L V A R I A B L E S ------------------------------------------*/ + +static unsigned long DispatchVGARevisionID(int rev) +{ + if (rev >= VIA_REVISION_CLECX ) + return VIA_REVISION_CLECX; + else + return rev; +} + +/************************************************************************* + Function : VIAVidCreateSurface + Create overlay surface depend on FOURCC +*************************************************************************/ +unsigned long VIAVidCreateSurface(ScrnInfoPtr pScrn, LPDDSURFACEDESC lpDDSurfaceDesc) +{ + VIAPtr pVia = VIAPTR(pScrn); + unsigned long dwWidth, dwHeight, dwPitch=0; + unsigned long size; + unsigned long dwAddr; + unsigned long HQVFBSIZE = 0, SWFBSIZE = 0; + int iCount; /* iCount for clean HQV FB use */ + unsigned char *lpTmpAddr; /* for clean HQV FB use */ + VIAHWRec *hwDiff = &pVia->ViaHW; + unsigned long retCode; + + DBG_DD(ErrorF("//VIAVidCreateSurface: \n")); + + if ( lpDDSurfaceDesc == NULL ) + return BadAccess; + + ErrorF("Creating %lu surface\n", lpDDSurfaceDesc->dwFourCC); + + switch (lpDDSurfaceDesc->dwFourCC) + { + case FOURCC_YUY2 : + pVia->swov.DPFsrc.dwFlags = DDPF_FOURCC; + pVia->swov.DPFsrc.dwFourCC = FOURCC_YUY2; + + /* init Video status flag*/ + pVia->swov.gdwVideoFlagSW = VIDEO_HQV_INUSE | SW_USE_HQV | VIDEO_1_INUSE; + + /*write Color Space Conversion param.*/ + switch ( DispatchVGARevisionID(pVia->graphicInfo.RevisionID)) + { + case VIA_REVISION_CLECX : + VIDOutD(V1_ColorSpaceReg_1, ColorSpaceValue_1_3123C0); + VIDOutD(V1_ColorSpaceReg_2, ColorSpaceValue_2_3123C0); + + DBG_DD(ErrorF("00000284 %08x\n",ColorSpaceValue_1_3123C0)); + DBG_DD(ErrorF("00000288 %08x\n",ColorSpaceValue_2_3123C0)); + break; + + default : + VIDOutD(V1_ColorSpaceReg_2, ColorSpaceValue_2); + VIDOutD(V1_ColorSpaceReg_1, ColorSpaceValue_1); + + DBG_DD(ErrorF("00000288 %08x\n",ColorSpaceValue_2)); + DBG_DD(ErrorF("00000284 %08x\n",ColorSpaceValue_1)); + break; + } + + + dwWidth = lpDDSurfaceDesc->dwWidth; + dwHeight = lpDDSurfaceDesc->dwHeight; + dwPitch = ALIGN_TO_32_BYTES(dwWidth)*2; + DBG_DD(ErrorF(" srcWidth= %ld \n", dwWidth)); + DBG_DD(ErrorF(" srcHeight= %ld \n", dwHeight)); + + SWFBSIZE = dwPitch*dwHeight; /*YUYV*/ + + VIAFreeLinear(&pVia->swov.SWOVMem); + if(Success != (retCode = VIAAllocLinear(&pVia->swov.SWOVMem, pScrn, SWFBSIZE * 2))) + return retCode; + + dwAddr = pVia->swov.SWOVMem.base; + /* fill in the SW buffer with 0x8000 (YUY2-black color) to clear FB buffer*/ + lpTmpAddr = pVia->FBBase + dwAddr; + + for(iCount=0;iCount<(SWFBSIZE*2);iCount++) + { + if((iCount%2) == 0) + *lpTmpAddr++=0x00; + else + *lpTmpAddr++=0x80; + } + + pVia->swov.SWDevice.dwSWPhysicalAddr[0] = dwAddr; + pVia->swov.SWDevice.lpSWOverlaySurface[0] = pVia->FBBase+dwAddr; + + pVia->swov.SWDevice.dwSWPhysicalAddr[1] = pVia->swov.SWDevice.dwSWPhysicalAddr[0] + SWFBSIZE; + pVia->swov.SWDevice.lpSWOverlaySurface[1] = pVia->swov.SWDevice.lpSWOverlaySurface[0] + SWFBSIZE; + + DBG_DD(ErrorF("pVia->swov.SWDevice.dwSWPhysicalAddr[0] %08lx\n", dwAddr)); + DBG_DD(ErrorF("pVia->swov.SWDevice.dwSWPhysicalAddr[1] %08lx\n", dwAddr + SWFBSIZE)); + + pVia->swov.SWDevice.gdwSWSrcWidth = dwWidth; + pVia->swov.SWDevice.gdwSWSrcHeight= dwHeight; + pVia->swov.SWDevice.dwPitch = dwPitch; + + /* Fill image data in overlay record*/ + pVia->swov.overlayRecordV1.dwV1OriWidth = dwWidth; + pVia->swov.overlayRecordV1.dwV1OriHeight = dwHeight; + pVia->swov.overlayRecordV1.dwV1OriPitch = dwPitch; + if (!(pVia->swov.gdwVideoFlagSW & SW_USE_HQV)) + break; + + case FOURCC_HQVSW : + DBG_DD(ErrorF("//Create HQV_SW Surface\n")); + dwWidth = pVia->swov.SWDevice.gdwSWSrcWidth; + dwHeight = pVia->swov.SWDevice.gdwSWSrcHeight; + dwPitch = pVia->swov.SWDevice.dwPitch; + + HQVFBSIZE = dwPitch * dwHeight; + + if(hwDiff->dwThreeHQVBuffer) /* CLE_C0 */ + size = HQVFBSIZE*3; + else + size = HQVFBSIZE*2; + + VIAFreeLinear(&pVia->swov.HQVMem); + if(Success != (retCode = VIAAllocLinear(&pVia->swov.HQVMem, pScrn, size))) + return retCode; + dwAddr = pVia->swov.HQVMem.base; +/* dwAddr = pVia->swov.SWOVlinear->offset * depth + SWOVFBSIZE; */ + + pVia->swov.overlayRecordV1.dwHQVAddr[0] = dwAddr; + pVia->swov.overlayRecordV1.dwHQVAddr[1] = dwAddr + HQVFBSIZE; + + if ( hwDiff->dwThreeHQVBuffer ) /*CLE_C0*/ + pVia->swov.overlayRecordV1.dwHQVAddr[2] = dwAddr + 2 * HQVFBSIZE; + + + /* fill in the HQV buffer with 0x8000 (YUY2-black color) to clear HQV buffers*/ + for(iCount=0;iCount<HQVFBSIZE*2;iCount++) + { + lpTmpAddr = pVia->FBBase + dwAddr + iCount; + if((iCount%2) == 0) + *(lpTmpAddr)=0x00; + else + *(lpTmpAddr)=0x80; + } + + VIDOutD(HQV_DST_STARTADDR1,pVia->swov.overlayRecordV1.dwHQVAddr[1]); + VIDOutD(HQV_DST_STARTADDR0,pVia->swov.overlayRecordV1.dwHQVAddr[0]); + + DBG_DD(ErrorF("000003F0 %08lx\n",VIDInD(HQV_DST_STARTADDR1) )); + DBG_DD(ErrorF("000003EC %08lx\n",VIDInD(HQV_DST_STARTADDR0) )); + + if ( hwDiff->dwThreeHQVBuffer ) /*CLE_C0*/ + { + VIDOutD(HQV_DST_STARTADDR2,pVia->swov.overlayRecordV1.dwHQVAddr[2]); + ErrorF("000003FC %08lx\n", (unsigned long)VIDInD(HQV_DST_STARTADDR2) ); + } + + break; + + case FOURCC_YV12 : + case FOURCC_VIA: + DBG_DD(ErrorF(" Create SW YV12 Surface: \n")); + pVia->swov.DPFsrc.dwFlags = DDPF_FOURCC; + pVia->swov.DPFsrc.dwFourCC = lpDDSurfaceDesc->dwFourCC; + + + /* init Video status flag */ + pVia->swov.gdwVideoFlagSW = VIDEO_HQV_INUSE | SW_USE_HQV | VIDEO_1_INUSE; + /* pVia->swov.gdwVideoFlagSW = VIDEO_1_INUSE; */ + + /* if (pVia->swov.gdwVideoFlagTV1 & VIDEO_HQV_INUSE) */ +/* + if (gdwVideoFlagTV0 & VIDEO_HQV_INUSE) + { + lpNewVidCtrl->dwHighQVDO = VW_HIGHQVDO_OFF; + VIADriverProc( HQVCONTROL , lpNewVidCtrl ); + } +*/ + /* write Color Space Conversion param. */ + switch ( DispatchVGARevisionID(pVia->graphicInfo.RevisionID)) + { + case VIA_REVISION_CLECX : + VIDOutD(V1_ColorSpaceReg_1, ColorSpaceValue_1_3123C0); + VIDOutD(V1_ColorSpaceReg_2, ColorSpaceValue_2_3123C0); + + DBG_DD(ErrorF("00000284 %08x\n",ColorSpaceValue_1_3123C0)); + DBG_DD(ErrorF("00000288 %08x\n",ColorSpaceValue_2_3123C0)); + break; + + default : + VIDOutD(V1_ColorSpaceReg_2, ColorSpaceValue_2); + VIDOutD(V1_ColorSpaceReg_1, ColorSpaceValue_1); + + DBG_DD(ErrorF("00000288 %08x\n",ColorSpaceValue_2)); + DBG_DD(ErrorF("00000284 %08x\n",ColorSpaceValue_1)); + break; + } + + + dwWidth = lpDDSurfaceDesc->dwWidth; + dwHeight = lpDDSurfaceDesc->dwHeight; + dwPitch = ALIGN_TO_32_BYTES(dwWidth); + DBG_DD(ErrorF(" srcWidth= %ld \n", dwWidth)); + DBG_DD(ErrorF(" srcHeight= %ld \n", dwHeight)); + + SWFBSIZE = dwPitch * dwHeight * 1.5; /* 1.5 bytes per pixel */ + + VIAFreeLinear(&pVia->swov.SWfbMem); + if (FOURCC_VIA != lpDDSurfaceDesc->dwFourCC) { + if(Success != (retCode = VIAAllocLinear(&pVia->swov.SWfbMem, pScrn, 2 * SWFBSIZE))) + return retCode; + + dwAddr = pVia->swov.SWfbMem.base; + + DEBUG(ErrorF("dwAddr for SWfbMem is %lu\n", dwAddr)); + /* fill in the SW buffer with 0x8000 (YUY2-black color) to clear FB buffer + */ + lpTmpAddr = pVia->FBBase + dwAddr; + for(iCount=0;iCount<(SWFBSIZE*2);iCount++) + { + if((iCount%2) == 0) + *lpTmpAddr++=0x00; + else + *lpTmpAddr++=0x80; + } + + pVia->swov.SWDevice.dwSWPhysicalAddr[0] = dwAddr; + pVia->swov.SWDevice.dwSWCrPhysicalAddr[0] = pVia->swov.SWDevice.dwSWPhysicalAddr[0] + + (dwPitch*dwHeight); + pVia->swov.SWDevice.dwSWCbPhysicalAddr[0] = pVia->swov.SWDevice.dwSWCrPhysicalAddr[0] + + ((dwPitch>>1)*(dwHeight>>1)); + pVia->swov.SWDevice.lpSWOverlaySurface[0] = pVia->FBBase+dwAddr; + + pVia->swov.SWDevice.dwSWPhysicalAddr[1] = dwAddr + SWFBSIZE; + pVia->swov.SWDevice.dwSWCrPhysicalAddr[1] = pVia->swov.SWDevice.dwSWPhysicalAddr[1] + + (dwPitch*dwHeight); + pVia->swov.SWDevice.dwSWCbPhysicalAddr[1] = pVia->swov.SWDevice.dwSWCrPhysicalAddr[1] + + ((dwPitch>>1)*(dwHeight>>1)); + pVia->swov.SWDevice.lpSWOverlaySurface[1] = pVia->swov.SWDevice.lpSWOverlaySurface[0] + SWFBSIZE; + + DBG_DD(ErrorF("pVia->swov.SWDevice.dwSWPhysicalAddr[0] %08lx\n", dwAddr)); + DBG_DD(ErrorF("pVia->swov.SWDevice.dwSWPhysicalAddr[1] %08lx\n", dwAddr + SWFBSIZE)); + } + pVia->swov.SWDevice.gdwSWSrcWidth = dwWidth; + pVia->swov.SWDevice.gdwSWSrcHeight= dwHeight; + pVia->swov.SWDevice.dwPitch = dwPitch; + + /* Fill image data in overlay record */ + pVia->swov.overlayRecordV1.dwV1OriWidth = dwWidth; + pVia->swov.overlayRecordV1.dwV1OriHeight = dwHeight; + pVia->swov.overlayRecordV1.dwV1OriPitch = dwPitch; +/* +if (!(pVia->swov.gdwVideoFlagSW & SW_USE_HQV)) + break; + case FOURCC_HQVSW : +*/ + /* + * if sw video use HQV dwpitch should changed + */ + DBG_DD(ErrorF("//Create HQV_SW Surface\n")); +/* pVia->swov.DPFsrc.dwFourCC = FOURCC_YUY2; */ + dwWidth = pVia->swov.SWDevice.gdwSWSrcWidth; + dwHeight = pVia->swov.SWDevice.gdwSWSrcHeight; + dwPitch = pVia->swov.SWDevice.dwPitch; + + HQVFBSIZE = dwPitch * dwHeight * 2; + + if ( hwDiff->dwThreeHQVBuffer ) /* CLE_C0 */ + size = HQVFBSIZE * 3; + else + size = HQVFBSIZE * 2; + + VIAFreeLinear(&pVia->swov.HQVMem); + if(Success != (retCode = VIAAllocLinear(&pVia->swov.HQVMem, pScrn, size))) + return retCode; + + dwAddr = pVia->swov.HQVMem.base; + DEBUG(ErrorF("dwAddr for HQV is %lu\n", dwAddr)); + DBG_DD(ErrorF("HQV dwAddr = 0x%x!!!! \n",dwAddr)); + + pVia->swov.overlayRecordV1.dwHQVAddr[0] = dwAddr; + pVia->swov.overlayRecordV1.dwHQVAddr[1] = dwAddr + HQVFBSIZE; + + if ( hwDiff->dwThreeHQVBuffer ) /*CLE_C0*/ + pVia->swov.overlayRecordV1.dwHQVAddr[2] = dwAddr + 2 * HQVFBSIZE; + + /* fill in the HQV buffer with 0x8000 (YUY2-black color) to clear HQV buffers + * FIXME: Check if should fill 3 on C0 + */ + for(iCount=0 ; iCount< HQVFBSIZE*2; iCount++) + { + lpTmpAddr = pVia->FBBase + dwAddr + iCount; + if(iCount%2 == 0) + *(lpTmpAddr)=0x00; + else + *(lpTmpAddr)=0x80; + } + + VIDOutD(HQV_DST_STARTADDR1,pVia->swov.overlayRecordV1.dwHQVAddr[1]); + VIDOutD(HQV_DST_STARTADDR0,pVia->swov.overlayRecordV1.dwHQVAddr[0]); + + DBG_DD(ErrorF("000003F0 %08lx\n",VIDInD(HQV_DST_STARTADDR1) )); + DBG_DD(ErrorF("000003EC %08lx\n",VIDInD(HQV_DST_STARTADDR0) )); + + if ( hwDiff->dwThreeHQVBuffer ) /*CLE_C0*/ + { + VIDOutD(HQV_DST_STARTADDR2,pVia->swov.overlayRecordV1.dwHQVAddr[2]); + ErrorF("000003FC %08lx\n", (unsigned long)VIDInD(HQV_DST_STARTADDR2) ); + } + + break; + + default : + break; + } + + return Success; + +} /*VIAVidCreateSurface*/ + +/************************************************************************* + Function : VIAVidLockSurface + Lock Surface +*************************************************************************/ +unsigned long VIAVidLockSurface(ScrnInfoPtr pScrn, LPDDLOCK lpLock) +{ + VIAPtr pVia = VIAPTR(pScrn); + + switch (lpLock->dwFourCC) + { + case FOURCC_YUY2 : + case FOURCC_YV12 : + case FOURCC_VIA : + lpLock->SWDevice = pVia->swov.SWDevice ; + lpLock->dwPhysicalBase = pVia->FrameBufferBase; + + } + + return PI_OK; + +} /*VIAVidLockSurface*/ + +/************************************************************************* + * Destroy Surface +*************************************************************************/ +unsigned long VIAVidDestroySurface(ScrnInfoPtr pScrn, LPDDSURFACEDESC lpDDSurfaceDesc) +{ + VIAPtr pVia = VIAPTR(pScrn); + + DBG_DD(ErrorF("//VIAVidDestroySurface: \n")); + + switch (lpDDSurfaceDesc->dwFourCC) + { + case FOURCC_YUY2 : + pVia->swov.DPFsrc.dwFlags = 0; + pVia->swov.DPFsrc.dwFourCC = 0; + + VIAFreeLinear(&pVia->swov.SWOVMem); + if (!(pVia->swov.gdwVideoFlagSW & SW_USE_HQV)) + { + pVia->swov.gdwVideoFlagSW = 0; + break; + } + + case FOURCC_HQVSW : + VIAFreeLinear(&pVia->swov.HQVMem); + pVia->swov.gdwVideoFlagSW = 0; +/* if (pVia->swov.gdwVideoFlagTV1 != 0) + { + DBG_DD(ErrorF(" Assign HQV to TV1 \n")); + lpNewVidCtrl->dwHighQVDO = VW_HIGHQVDO_TV1; + DriverProc( HQVCONTROL , lpNewVidCtrl ); + } +*/ + break; + + case FOURCC_YV12 : + case FOURCC_VIA: + pVia->swov.DPFsrc.dwFlags = 0; + pVia->swov.DPFsrc.dwFourCC = 0; + + VIAFreeLinear(&pVia->swov.SWfbMem); + VIAFreeLinear(&pVia->swov.HQVMem); + pVia->swov.gdwVideoFlagSW = 0; + break; + } + DBG_DD(ErrorF("\n//VIAVidDestroySurface : OK!!\n")); + return PI_OK; + +} /*VIAVidDestroySurface*/ + + +/**************************************************************************** + * + * Upd_Video() + * + ***************************************************************************/ +static unsigned long Upd_Video(ScrnInfoPtr pScrn, unsigned long dwVideoFlag,unsigned long dwStartAddr,RECTL rSrc,RECTL rDest,unsigned long dwSrcPitch, + unsigned long dwOriSrcWidth,unsigned long dwOriSrcHeight,LPDDPIXELFORMAT lpDPFsrc, + unsigned long dwDeinterlaceMode,unsigned long dwColorKey,unsigned long dwChromaKey, + unsigned long dwKeyLow,unsigned long dwKeyHigh,unsigned long dwChromaLow,unsigned long dwChromaHigh, unsigned long dwFlags) +{ + VIAPtr pVia = VIAPTR(pScrn); + unsigned long dwVidCtl=0, dwCompose=(VIDInD(V_COMPOSE_MODE)&~(SELECT_VIDEO_IF_COLOR_KEY|V1_COMMAND_FIRE|V3_COMMAND_FIRE))|V_COMMAND_LOAD_VBI; + unsigned long srcWidth, srcHeight,dstWidth,dstHeight; + unsigned long zoomCtl=0, miniCtl=0; + unsigned long dwHQVCtl=0; + unsigned long dwHQVfilterCtl=0,dwHQVminiCtl=0; + unsigned long dwHQVzoomflagH=0,dwHQVzoomflagV=0; + unsigned long dwHQVsrcWidth=0,dwHQVdstWidth=0; + unsigned long dwHQVsrcFetch = 0,dwHQVoffset=0; + unsigned long dwOffset=0,dwFetch=0,dwTmp=0; + unsigned long dwDisplayCountW=0; + VIAHWRec *hwDiff = &pVia->ViaHW; + + LPSCREENINFO Screen; + + DBG_DD(ErrorF("// Upd_Video:\n")); + DBG_DD(ErrorF("Modified rSrc X (%ld,%ld) Y (%ld,%ld)\n", + rSrc.left, rSrc.right,rSrc.top, rSrc.bottom)); + DBG_DD(ErrorF("Modified rDest X (%ld,%ld) Y (%ld,%ld)\n", + rDest.left, rDest.right,rDest.top, rDest.bottom)); + + if (dwVideoFlag & VIDEO_SHOW) + { + pVia->swov.overlayRecordV1.dwWidth=dstWidth = rDest.right - rDest.left; + pVia->swov.overlayRecordV1.dwHeight=dstHeight = rDest.bottom - rDest.top; + srcWidth = (unsigned long)rSrc.right - rSrc.left; + srcHeight = (unsigned long)rSrc.bottom - rSrc.top; + DBG_DD(ErrorF("===srcWidth= %ld \n", srcWidth)); + DBG_DD(ErrorF("===srcHeight= %ld \n", srcHeight)); + + if (dwVideoFlag & VIDEO_1_INUSE) + { + /*=* Modify for C1 FIFO *=*/ + switch ( DispatchVGARevisionID(pVia->graphicInfo.RevisionID) ) + { + case VIA_REVISION_CLECX : + dwVidCtl = (V1_ENABLE|V1_EXPIRE_NUM_F); + break; + + default: + /* Overlay source format for V1*/ + if (pVia->swov.gdwUseExtendedFIFO) + { + dwVidCtl = (V1_ENABLE|V1_EXPIRE_NUM_A|V1_FIFO_EXTENDED); + } + else + { + dwVidCtl = (V1_ENABLE|V1_EXPIRE_NUM); + } + break; + } + + viaOverlayGetV1Format(pVia, dwVideoFlag,lpDPFsrc,&dwVidCtl,&dwHQVCtl); + viaOverlayGetV1Format(pVia, dwVideoFlag,lpDPFsrc,&dwVidCtl,&dwHQVCtl); + } + else + { + /*=* Modify for C1 FIFO *=*/ + switch ( DispatchVGARevisionID(pVia->graphicInfo.RevisionID) ) + { + case VIA_REVISION_CLECX : + dwVidCtl = (V3_ENABLE|V3_EXPIRE_NUM_F); + break; + + default: + /* Overlay source format for V1*/ + dwVidCtl = (V3_ENABLE|V3_EXPIRE_NUM); + break; + } + + viaOverlayGetV3Format(pVia, dwVideoFlag,lpDPFsrc,&dwVidCtl,&dwHQVCtl); + } + + if ( hwDiff->dwThreeHQVBuffer ) /*CLE_C0*/ + { + /* HQV support 3 HQV buffer */ + dwHQVCtl &= ~HQV_SW_FLIP; + dwHQVCtl |= HQV_TRIPLE_BUFF | HQV_FLIP_STATUS; + } + + /* Starting address of source and Source offset*/ + dwOffset = viaOverlayGetSrcStartAddress (pVia, dwVideoFlag,rSrc,rDest,dwSrcPitch,lpDPFsrc,&dwHQVoffset ); + DBG_DD(ErrorF("===dwOffset= 0x%lx \n", dwOffset)); + + pVia->swov.overlayRecordV1.dwOffset = dwOffset; + + if (pVia->swov.DPFsrc.dwFourCC == FOURCC_YV12 + || pVia->swov.DPFsrc.dwFourCC == FOURCC_VIA) + { + YCBCRREC YCbCr; + if (dwVideoFlag & VIDEO_HQV_INUSE) + { + dwHQVsrcWidth=(unsigned long)rSrc.right - rSrc.left; + dwHQVdstWidth=(unsigned long)rDest.right - rDest.left; + if (dwHQVsrcWidth>dwHQVdstWidth) + { + dwOffset = dwOffset * dwHQVdstWidth / dwHQVsrcWidth; + } + + if (dwVideoFlag & VIDEO_1_INUSE) + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V1_STARTADDR_0, pVia->swov.overlayRecordV1.dwHQVAddr[0]+dwOffset); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V1_STARTADDR_1, pVia->swov.overlayRecordV1.dwHQVAddr[1]+dwOffset); + + if ( hwDiff->dwThreeHQVBuffer ) /*CLE_C0*/ + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V1_STARTADDR_2, pVia->swov.overlayRecordV1.dwHQVAddr[2]+dwOffset); + } + else + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V3_STARTADDR_0, pVia->swov.overlayRecordV1.dwHQVAddr[0]+dwOffset); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V3_STARTADDR_1, pVia->swov.overlayRecordV1.dwHQVAddr[1]+dwOffset); + + if ( hwDiff->dwThreeHQVBuffer ) /*CLE_C0*/ + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V3_STARTADDR_2, pVia->swov.overlayRecordV1.dwHQVAddr[2]+dwOffset); + } + YCbCr = viaOverlayGetYCbCrStartAddress(dwVideoFlag,dwStartAddr,pVia->swov.overlayRecordV1.dwOffset,pVia->swov.overlayRecordV1.dwUVoffset,dwSrcPitch,dwOriSrcHeight); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, HQV_SRC_STARTADDR_Y, YCbCr.dwY); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, HQV_SRC_STARTADDR_U, YCbCr.dwCR); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, HQV_SRC_STARTADDR_V, YCbCr.dwCB); + } + else + { + YCbCr = viaOverlayGetYCbCrStartAddress(dwVideoFlag,dwStartAddr,pVia->swov.overlayRecordV1.dwOffset,pVia->swov.overlayRecordV1.dwUVoffset,dwSrcPitch,dwOriSrcHeight); + if (dwVideoFlag & VIDEO_1_INUSE) + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V1_STARTADDR_0, YCbCr.dwY); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V1_STARTADDR_CB0, YCbCr.dwCR); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V1_STARTADDR_CR0, YCbCr.dwCB); + } + else + { + DBG_DD(ErrorF("Upd_Video() : We do not support YV12 with V3!\n")); + } + } + } + else + { + if (dwVideoFlag & VIDEO_HQV_INUSE) + { + dwHQVsrcWidth=(unsigned long)rSrc.right - rSrc.left; + dwHQVdstWidth=(unsigned long)rDest.right - rDest.left; + if (dwHQVsrcWidth>dwHQVdstWidth) + { + dwOffset = dwOffset * dwHQVdstWidth / dwHQVsrcWidth; + } + + if (dwVideoFlag & VIDEO_1_INUSE) + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V1_STARTADDR_0, pVia->swov.overlayRecordV1.dwHQVAddr[0]+dwHQVoffset); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V1_STARTADDR_1, pVia->swov.overlayRecordV1.dwHQVAddr[1]+dwHQVoffset); + + if ( hwDiff->dwThreeHQVBuffer ) /*CLE_C0*/ + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V1_STARTADDR_2, pVia->swov.overlayRecordV1.dwHQVAddr[2]+dwHQVoffset); + } + else + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V3_STARTADDR_0, pVia->swov.overlayRecordV1.dwHQVAddr[0]+dwHQVoffset); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V3_STARTADDR_1, pVia->swov.overlayRecordV1.dwHQVAddr[1]+dwHQVoffset); + + if ( hwDiff->dwThreeHQVBuffer ) /*CLE_C0*/ + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V3_STARTADDR_2, pVia->swov.overlayRecordV1.dwHQVAddr[2]+dwHQVoffset); + } + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, HQV_SRC_STARTADDR_Y, dwStartAddr); + } + else + { + dwStartAddr += dwOffset; + + if (dwVideoFlag & VIDEO_1_INUSE) + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V1_STARTADDR_0, dwStartAddr); + } + else + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V3_STARTADDR_0, dwStartAddr); + } + } + } + + dwFetch = viaOverlayGetFetch(dwVideoFlag,lpDPFsrc,srcWidth,dstWidth,dwOriSrcWidth,&dwHQVsrcFetch); + DBG_DD(ErrorF("===dwFetch= 0x%lx \n", dwFetch)); +/* + //For DCT450 test-BOB INTERLEAVE + if ( (dwDeinterlaceMode & DDOVER_INTERLEAVED) && (dwDeinterlaceMode & DDOVER_BOB ) ) + { + if (dwVideoFlag & VIDEO_HQV_INUSE) + { + dwHQVCtl |= HQV_FIELD_2_FRAME|HQV_FRAME_2_FIELD|HQV_DEINTERLACE; + } + else + { + dwVidCtl |= (V1_BOB_ENABLE | V1_FRAME_BASE); + } + } + else if (dwDeinterlaceMode & DDOVER_BOB ) + { + if (dwVideoFlag & VIDEO_HQV_INUSE) + { + //The HQV source data line count should be two times of the original line count + dwHQVCtl |= HQV_FIELD_2_FRAME|HQV_DEINTERLACE; + } + else + { + dwVidCtl |= V1_BOB_ENABLE; + } + } +*/ + if (dwVideoFlag & VIDEO_HQV_INUSE) + { + if ( !(dwDeinterlaceMode & DDOVER_INTERLEAVED) && (dwDeinterlaceMode & DDOVER_BOB ) ) + { + if ( hwDiff->dwHQVFetchByteUnit ) /* CLE_C0 */ + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, HQV_SRC_FETCH_LINE, (((dwHQVsrcFetch)-1)<<16)|((dwOriSrcHeight<<1)-1)); + else + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, HQV_SRC_FETCH_LINE, (((dwHQVsrcFetch>>3)-1)<<16)|((dwOriSrcHeight<<1)-1)); + } + else + { + if ( hwDiff->dwHQVFetchByteUnit ) /* CLE_C0 */ + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, HQV_SRC_FETCH_LINE, (((dwHQVsrcFetch)-1)<<16)|(dwOriSrcHeight-1)); + else + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, HQV_SRC_FETCH_LINE, (((dwHQVsrcFetch>>3)-1)<<16)|(dwOriSrcHeight-1)); + } + if (pVia->swov.DPFsrc.dwFourCC == FOURCC_YV12 + || pVia->swov.DPFsrc.dwFourCC == FOURCC_VIA) + { + if (dwVideoFlag & VIDEO_1_INUSE) + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V1_STRIDE, dwSrcPitch<<1); + } + else + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V3_STRIDE, dwSrcPitch<<1); + } + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, HQV_SRC_STRIDE, ((dwSrcPitch>>1)<<16)|dwSrcPitch); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, HQV_DST_STRIDE, (dwSrcPitch<<1)); + } + else + { + if (dwVideoFlag & VIDEO_1_INUSE) + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V1_STRIDE, dwSrcPitch); + } + else + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V3_STRIDE, dwSrcPitch); + } + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, HQV_SRC_STRIDE, dwSrcPitch); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, HQV_DST_STRIDE, dwSrcPitch); + } + + } + else + { + if (dwVideoFlag & VIDEO_1_INUSE) + { +/* viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V1_STRIDE, dwSrcPitch | (dwSrcPitch <<15) );*/ + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V1_STRIDE, dwSrcPitch ); + } + else + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V3_STRIDE, dwSrcPitch | (dwSrcPitch <<15) ); + } + } + + DBG_DD(ErrorF("rSrc X (%ld,%ld) Y (%ld,%ld)\n", + rSrc.left, rSrc.right,rSrc.top, rSrc.bottom)); + DBG_DD(ErrorF("rDest X (%ld,%ld) Y (%ld,%ld)\n", + rDest.left, rDest.right,rDest.top, rDest.bottom)); + + /* for use with graphicInfo -- ugly */ + if (pVia->IsSecondary) + Screen = &(pVia->graphicInfo.Screen[1]); + else + Screen = &(pVia->graphicInfo.Screen[0]); + + /* Destination window key*/ + + if (dwVideoFlag & VIDEO_1_INUSE) + { + /*modify for HW DVI limitation, + //When we enable the CRT and DVI both, then change resolution. + //If the resolution small than the panel physical size, the video display in Y direction will be cut. + //So, we need to adjust the Y top and bottom position. */ + if (Screen->dwDVIOn && Screen->dwExpand) + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V1_WIN_END_Y, + ((rDest.right-1)<<16) + (rDest.bottom * Screen->dwPanelHeight / Screen->dwHeight)); + if (rDest.top > 0) + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V1_WIN_START_Y, + (rDest.left<<16) + (rDest.top * Screen->dwPanelHeight / Screen->dwHeight)); + } + else + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V1_WIN_START_Y,(rDest.left<<16)); + } + } + else + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V1_WIN_END_Y, ((rDest.right-1)<<16) + (rDest.bottom-1)); + if (rDest.top > 0) + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V1_WIN_START_Y, (rDest.left<<16) + rDest.top ); + } + else + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V1_WIN_START_Y, (rDest.left<<16)); + } + } + } + else + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V3_WIN_END_Y, ((rDest.right-1)<<16) + (rDest.bottom-1)); + if (rDest.top > 0) + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V1_WIN_START_Y, (rDest.left<<16) + rDest.top ); + } + else + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V1_WIN_START_Y, (rDest.left<<16)); + } + } + + dwCompose |= ALWAYS_SELECT_VIDEO; + + + /* Setup X zoom factor*/ + pVia->swov.overlayRecordV1.dwFetchAlignment = 0; + + if ( viaOverlayHQVCalcZoomWidth(pVia, dwVideoFlag, srcWidth , dstWidth, + &zoomCtl, &miniCtl, &dwHQVfilterCtl, &dwHQVminiCtl,&dwHQVzoomflagH) == PI_ERR ) + { + /* too small to handle*/ + dwFetch <<= 20; + if (dwVideoFlag & VIDEO_1_INUSE) + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V12_QWORD_PER_LINE, dwFetch); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V_COMPOSE_MODE , dwCompose|V1_COMMAND_FIRE ); + } + else + { + dwFetch |=(VIDInD(V3_ALPHA_QWORD_PER_LINE)&(~V3_FETCH_COUNT)); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V3_ALPHA_QWORD_PER_LINE, dwFetch); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V_COMPOSE_MODE , dwCompose|V3_COMMAND_FIRE ); + + } + viaMacro_VidREGFlush(pVia); + return PI_ERR; + } + + dwFetch <<= 20; + if (dwVideoFlag & VIDEO_1_INUSE) + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V12_QWORD_PER_LINE, dwFetch); + } + else + { + dwFetch |=(VIDInD(V3_ALPHA_QWORD_PER_LINE)&(~V3_FETCH_COUNT)); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V3_ALPHA_QWORD_PER_LINE, dwFetch); + } + + /* + // Setup Y zoom factor + */ + + /*For DCT450 test-BOB INTERLEAVE*/ + if ( (dwDeinterlaceMode & DDOVER_INTERLEAVED) && (dwDeinterlaceMode & DDOVER_BOB)) + { + if (!(dwVideoFlag & VIDEO_HQV_INUSE)) + { + srcHeight /=2; + if (dwVideoFlag & VIDEO_1_INUSE) + { + dwVidCtl |= (V1_BOB_ENABLE | V1_FRAME_BASE); + } + else + { + dwVidCtl |= (V3_BOB_ENABLE | V3_FRAME_BASE); + } + } + else + { + dwHQVCtl |= HQV_FIELD_2_FRAME|HQV_FRAME_2_FIELD|HQV_DEINTERLACE; + } + } + else if (dwDeinterlaceMode & DDOVER_BOB ) + { + if (dwVideoFlag & VIDEO_HQV_INUSE) + { + srcHeight <<=1; + dwHQVCtl |= HQV_FIELD_2_FRAME|HQV_DEINTERLACE; + } + else + { + if (dwVideoFlag & VIDEO_1_INUSE) + { + dwVidCtl |= V1_BOB_ENABLE; + } + else + { + dwVidCtl |= V3_BOB_ENABLE; + } + } + } + + viaOverlayGetDisplayCount(pVia, dwVideoFlag,lpDPFsrc,srcWidth,&dwDisplayCountW); + + if (dwVideoFlag & VIDEO_1_INUSE) + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V1_SOURCE_HEIGHT, (srcHeight<<16)|dwDisplayCountW); + } + else + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V3_SOURCE_WIDTH, dwDisplayCountW); + } + + if ( viaOverlayHQVCalcZoomHeight(pVia, srcHeight,dstHeight,&zoomCtl,&miniCtl, &dwHQVfilterCtl, &dwHQVminiCtl ,&dwHQVzoomflagV) == PI_ERR ) + { + if (dwVideoFlag & VIDEO_1_INUSE) + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V_COMPOSE_MODE , dwCompose|V1_COMMAND_FIRE ); + } + else + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V_COMPOSE_MODE , dwCompose|V3_COMMAND_FIRE ); + } + + viaMacro_VidREGFlush(pVia); + return PI_ERR; + } + + if (miniCtl & V1_Y_INTERPOLY) + { + if (pVia->swov.DPFsrc.dwFourCC == FOURCC_YV12 + || pVia->swov.DPFsrc.dwFourCC == FOURCC_VIA) + { + if (dwVideoFlag & VIDEO_HQV_INUSE) + { + if (dwVideoFlag & VIDEO_1_INUSE) + { + /*=* Modify for C1 FIFO *=*/ + switch ( DispatchVGARevisionID(pVia->graphicInfo.RevisionID) ) + { + case VIA_REVISION_CLECX : + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V_FIFO_CONTROL, + V1_FIFO_DEPTH64 | V1_FIFO_PRETHRESHOLD56 | V1_FIFO_THRESHOLD56); + break; + + default: + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V_FIFO_CONTROL, + V1_FIFO_DEPTH32 | V1_FIFO_PRETHRESHOLD29 | V1_FIFO_THRESHOLD16); + break; + } + } + else + { + /*=* Modify for C1 FIFO *=*/ + switch ( DispatchVGARevisionID(pVia->graphicInfo.RevisionID) ) + { + case VIA_REVISION_CLECX : + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, ALPHA_V3_FIFO_CONTROL, + (VIDInD(ALPHA_V3_FIFO_CONTROL)&ALPHA_FIFO_MASK)|V3_FIFO_DEPTH64 | V3_FIFO_THRESHOLD56); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, ALPHA_V3_PREFIFO_CONTROL ,V3_FIFO_PRETHRESHOLD56 | + ( VIDInD(ALPHA_V3_PREFIFO_CONTROL)& (~V3_FIFO_MASK)) ); + break; + + default: + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, ALPHA_V3_FIFO_CONTROL, + (VIDInD(ALPHA_V3_FIFO_CONTROL)&ALPHA_FIFO_MASK)|V3_FIFO_DEPTH32 | V3_FIFO_THRESHOLD16); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, ALPHA_V3_PREFIFO_CONTROL ,(V3_FIFO_THRESHOLD16>>8) | + ( VIDInD(ALPHA_V3_PREFIFO_CONTROL)& (~V3_FIFO_MASK)) ); + break; + } + } + } + else + { + /*Minified Video will be skewed if not work around*/ + if (srcWidth <= 80) /*Fetch count <= 5*/ + { + if (dwVideoFlag & VIDEO_1_INUSE) + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V_FIFO_CONTROL,V1_FIFO_DEPTH16 ); + } + else + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, ALPHA_V3_FIFO_CONTROL, + (VIDInD(ALPHA_V3_FIFO_CONTROL)&ALPHA_FIFO_MASK)|V3_FIFO_DEPTH16 ); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, ALPHA_V3_PREFIFO_CONTROL ,(V3_FIFO_THRESHOLD16>>8) | + ( VIDInD(ALPHA_V3_PREFIFO_CONTROL)& (~V3_FIFO_MASK)) ); + } + } + else + { + if (dwVideoFlag & VIDEO_1_INUSE) + { + /*=* Modify for C1 FIFO *=*/ + switch ( DispatchVGARevisionID(pVia->graphicInfo.RevisionID) ) + { + case VIA_REVISION_CLECX : + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V_FIFO_CONTROL, + V1_FIFO_DEPTH64 | V1_FIFO_PRETHRESHOLD56 | V1_FIFO_THRESHOLD56); + break; + + default: + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V_FIFO_CONTROL, + V1_FIFO_DEPTH16 | V1_FIFO_PRETHRESHOLD12 | V1_FIFO_THRESHOLD8); + break; + } + } + else + { + /*=* Modify for C1 FIFO *=*/ + switch ( DispatchVGARevisionID(pVia->graphicInfo.RevisionID) ) + { + case VIA_REVISION_CLECX : + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, ALPHA_V3_FIFO_CONTROL, + (VIDInD(ALPHA_V3_FIFO_CONTROL)&ALPHA_FIFO_MASK)|V3_FIFO_DEPTH64 | V3_FIFO_THRESHOLD56); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, ALPHA_V3_PREFIFO_CONTROL ,V3_FIFO_PRETHRESHOLD56 | + ( VIDInD(ALPHA_V3_PREFIFO_CONTROL)& (~V3_FIFO_MASK)) ); + break; + + default: + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, ALPHA_V3_FIFO_CONTROL, + (VIDInD(ALPHA_V3_FIFO_CONTROL)&ALPHA_FIFO_MASK)|V3_FIFO_DEPTH16 | V3_FIFO_THRESHOLD8); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, ALPHA_V3_PREFIFO_CONTROL ,(V3_FIFO_THRESHOLD16>>8) | + ( VIDInD(ALPHA_V3_PREFIFO_CONTROL)& (~V3_FIFO_MASK)) ); + break; + } + } + } + } + } + else + { + if (dwVideoFlag & VIDEO_1_INUSE) + { + /*=* Modify for C1 FIFO *=*/ + switch ( DispatchVGARevisionID(pVia->graphicInfo.RevisionID) ) + { + case VIA_REVISION_CLECX : + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V_FIFO_CONTROL, + V1_FIFO_DEPTH64 | V1_FIFO_PRETHRESHOLD56 | V1_FIFO_THRESHOLD56); + break; + + default: + if (pVia->swov.gdwUseExtendedFIFO) + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V_FIFO_CONTROL, + V1_FIFO_DEPTH48 | V1_FIFO_PRETHRESHOLD40 | V1_FIFO_THRESHOLD40); + } + else + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V_FIFO_CONTROL, + V1_FIFO_DEPTH32 | V1_FIFO_PRETHRESHOLD29 | V1_FIFO_THRESHOLD16); + } + break; + } + } + else + { + /*Fix V3 bug*/ + if (srcWidth <= 8) + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, ALPHA_V3_FIFO_CONTROL, + (VIDInD(ALPHA_V3_FIFO_CONTROL)&ALPHA_FIFO_MASK)); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, ALPHA_V3_PREFIFO_CONTROL , + ( VIDInD(ALPHA_V3_PREFIFO_CONTROL)& (~V3_FIFO_MASK)) ); + } + else + { + /*=* Modify for C1 FIFO *=*/ + switch ( DispatchVGARevisionID(pVia->graphicInfo.RevisionID) ) + { + case VIA_REVISION_CLECX : + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, ALPHA_V3_FIFO_CONTROL, + (VIDInD(ALPHA_V3_FIFO_CONTROL)&ALPHA_FIFO_MASK)|V3_FIFO_DEPTH64 | V3_FIFO_THRESHOLD56); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, ALPHA_V3_PREFIFO_CONTROL ,V3_FIFO_PRETHRESHOLD56 | + ( VIDInD(ALPHA_V3_PREFIFO_CONTROL)& (~V3_FIFO_MASK)) ); + break; + + default: + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, ALPHA_V3_FIFO_CONTROL, + (VIDInD(ALPHA_V3_FIFO_CONTROL)&ALPHA_FIFO_MASK)|V3_FIFO_DEPTH32 | V3_FIFO_THRESHOLD16); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, ALPHA_V3_PREFIFO_CONTROL ,(V3_FIFO_THRESHOLD16>>8) | + ( VIDInD(ALPHA_V3_PREFIFO_CONTROL)& (~V3_FIFO_MASK)) ); + break; + } + } + } + } + } + else + { + if (pVia->swov.DPFsrc.dwFourCC == FOURCC_YV12 + || pVia->swov.DPFsrc.dwFourCC == FOURCC_VIA) + { + if (dwVideoFlag & VIDEO_HQV_INUSE) + { + if (dwVideoFlag & VIDEO_1_INUSE) + { + /*=* Modify for C1 FIFO *=*/ + switch ( DispatchVGARevisionID(pVia->graphicInfo.RevisionID) ) + { + case VIA_REVISION_CLECX : + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V_FIFO_CONTROL, + V1_FIFO_DEPTH64 | V1_FIFO_PRETHRESHOLD56 | V1_FIFO_THRESHOLD56); + break; + + default: + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V_FIFO_CONTROL, + V1_FIFO_DEPTH32 | V1_FIFO_PRETHRESHOLD29 | V1_FIFO_THRESHOLD16); + break; + } + } + else + { + /*=* Modify for C1 FIFO *=*/ + switch ( DispatchVGARevisionID(pVia->graphicInfo.RevisionID) ) + { + case VIA_REVISION_CLECX : + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, ALPHA_V3_FIFO_CONTROL, + (VIDInD(ALPHA_V3_FIFO_CONTROL)&ALPHA_FIFO_MASK)|V3_FIFO_DEPTH64 | V3_FIFO_THRESHOLD56); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, ALPHA_V3_PREFIFO_CONTROL ,V3_FIFO_PRETHRESHOLD56 | + ( VIDInD(ALPHA_V3_PREFIFO_CONTROL)& (~V3_FIFO_MASK)) ); + break; + + default: + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, ALPHA_V3_FIFO_CONTROL, + (VIDInD(ALPHA_V3_FIFO_CONTROL)&ALPHA_FIFO_MASK)|V3_FIFO_DEPTH32 | V3_FIFO_THRESHOLD16); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, ALPHA_V3_PREFIFO_CONTROL ,(V3_FIFO_THRESHOLD16>>8) | + ( VIDInD(ALPHA_V3_PREFIFO_CONTROL)& (~V3_FIFO_MASK)) ); + break; + } + } + } + else + { + /*Minified Video will be skewed if not work around*/ + if (srcWidth <= 80) /*Fetch count <= 5*/ + { + if (dwVideoFlag & VIDEO_1_INUSE) + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V_FIFO_CONTROL,V1_FIFO_DEPTH16 ); + } + else + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, ALPHA_V3_FIFO_CONTROL, + (VIDInD(ALPHA_V3_FIFO_CONTROL)&ALPHA_FIFO_MASK)|V3_FIFO_DEPTH16 ); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, ALPHA_V3_PREFIFO_CONTROL ,(V3_FIFO_THRESHOLD16>>8) | + ( VIDInD(ALPHA_V3_PREFIFO_CONTROL)& (~V3_FIFO_MASK)) ); + } + } + else + { + if (dwVideoFlag & VIDEO_1_INUSE) + { + /*=* Modify for C1 FIFO *=*/ + switch ( DispatchVGARevisionID(pVia->graphicInfo.RevisionID) ) + { + case VIA_REVISION_CLECX : + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V_FIFO_CONTROL, + V1_FIFO_DEPTH64 | V1_FIFO_PRETHRESHOLD56 | V1_FIFO_THRESHOLD56); + break; + + default: + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V_FIFO_CONTROL, + V1_FIFO_DEPTH16 | V1_FIFO_PRETHRESHOLD12 | V1_FIFO_THRESHOLD8); + break; + } + } + else + { + /*=* Modify for C1 FIFO *=*/ + switch ( DispatchVGARevisionID(pVia->graphicInfo.RevisionID) ) + { + case VIA_REVISION_CLECX : + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, ALPHA_V3_FIFO_CONTROL, + (VIDInD(ALPHA_V3_FIFO_CONTROL)&ALPHA_FIFO_MASK)|V3_FIFO_DEPTH64 | V3_FIFO_THRESHOLD56); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, ALPHA_V3_PREFIFO_CONTROL ,V3_FIFO_PRETHRESHOLD56 | + ( VIDInD(ALPHA_V3_PREFIFO_CONTROL)& (~V3_FIFO_MASK)) ); + break; + + default: + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, ALPHA_V3_FIFO_CONTROL, + (VIDInD(ALPHA_V3_FIFO_CONTROL)&ALPHA_FIFO_MASK)|V3_FIFO_DEPTH16 | V3_FIFO_THRESHOLD8); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, ALPHA_V3_PREFIFO_CONTROL ,(V3_FIFO_THRESHOLD16>>8) | + ( VIDInD(ALPHA_V3_PREFIFO_CONTROL)& (~V3_FIFO_MASK)) ); + break; + } + } + } + } + } + else + { + if (dwVideoFlag & VIDEO_1_INUSE) + { + /*=* Modify for C1 FIFO *=*/ + switch ( DispatchVGARevisionID(pVia->graphicInfo.RevisionID) ) + { + case VIA_REVISION_CLECX : + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V_FIFO_CONTROL, + V1_FIFO_DEPTH64 | V1_FIFO_PRETHRESHOLD56 | V1_FIFO_THRESHOLD56); + break; + + default: + if (pVia->swov.gdwUseExtendedFIFO) + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V_FIFO_CONTROL, + V1_FIFO_DEPTH48 | V1_FIFO_PRETHRESHOLD40 | V1_FIFO_THRESHOLD40); + } + else + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V_FIFO_CONTROL, + V1_FIFO_DEPTH32 | V1_FIFO_PRETHRESHOLD29 | V1_FIFO_THRESHOLD16); + } + break; + } + } + else + { + /*Fix V3 bug*/ + if (srcWidth <= 8) + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, ALPHA_V3_FIFO_CONTROL, + (VIDInD(ALPHA_V3_FIFO_CONTROL)&ALPHA_FIFO_MASK)); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, ALPHA_V3_PREFIFO_CONTROL , + ( VIDInD(ALPHA_V3_PREFIFO_CONTROL)& (~V3_FIFO_MASK)) ); + } + else + { + /*=* Modify for C1 FIFO *=*/ + switch ( DispatchVGARevisionID(pVia->graphicInfo.RevisionID) ) + { + case VIA_REVISION_CLECX : + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, ALPHA_V3_FIFO_CONTROL, + (VIDInD(ALPHA_V3_FIFO_CONTROL)&ALPHA_FIFO_MASK)|V3_FIFO_DEPTH64 | V3_FIFO_THRESHOLD56); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, ALPHA_V3_PREFIFO_CONTROL ,V3_FIFO_PRETHRESHOLD56 | + ( VIDInD(ALPHA_V3_PREFIFO_CONTROL)& (~V3_FIFO_MASK)) ); + break; + + default: + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, ALPHA_V3_FIFO_CONTROL, + (VIDInD(ALPHA_V3_FIFO_CONTROL)&ALPHA_FIFO_MASK)|V3_FIFO_DEPTH32 | V3_FIFO_THRESHOLD16); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, ALPHA_V3_PREFIFO_CONTROL ,(V3_FIFO_THRESHOLD16>>8) | + ( VIDInD(ALPHA_V3_PREFIFO_CONTROL)& (~V3_FIFO_MASK)) ); + break; + } + } + } + } + } + + if (dwVideoFlag & VIDEO_HQV_INUSE) + { + miniCtl=0; + if (dwHQVzoomflagH||dwHQVzoomflagV) + { + dwTmp = 0; + if (dwHQVzoomflagH) + { + miniCtl = V1_X_INTERPOLY; + dwTmp = (zoomCtl&0xffff0000); + } + + if (dwHQVzoomflagV) + { + miniCtl |= (V1_Y_INTERPOLY | V1_YCBCR_INTERPOLY); + dwTmp |= (zoomCtl&0x0000ffff); + dwHQVfilterCtl &= 0xfffdffff; + } + + /*Temporarily fix for 2D bandwidth problem. 2002/08/01*/ + if ((pVia->swov.gdwUseExtendedFIFO)) + { + miniCtl &= ~V1_Y_INTERPOLY; + } + + if (dwVideoFlag & VIDEO_1_INUSE) + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V1_MINI_CONTROL, miniCtl); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V1_ZOOM_CONTROL, dwTmp); + } + else + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V3_MINI_CONTROL, miniCtl); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V3_ZOOM_CONTROL, dwTmp); + } + } + else + { + if (srcHeight==dstHeight) + { + dwHQVfilterCtl &= 0xfffdffff; + } + if (dwVideoFlag & VIDEO_1_INUSE) + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V1_MINI_CONTROL, 0); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V1_ZOOM_CONTROL, 0); + } + else + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V3_MINI_CONTROL, 0); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V3_ZOOM_CONTROL, 0); + } + } + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,HQV_MINIFY_CONTROL, dwHQVminiCtl); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,HQV_FILTER_CONTROL, dwHQVfilterCtl); + } + else + { + if (dwVideoFlag & VIDEO_1_INUSE) + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V1_MINI_CONTROL, miniCtl); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V1_ZOOM_CONTROL, zoomCtl); + } + else + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V3_MINI_CONTROL, miniCtl); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V3_ZOOM_CONTROL, zoomCtl); + } + } + + + /* Colorkey*/ + if (dwColorKey) { + DBG_DD(ErrorF("Overlay colorkey= low:%08lx high:%08lx\n", dwKeyLow, dwKeyHigh)); + + dwKeyLow &= 0x00FFFFFF; + /*viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V_COLOR_KEY, dwKeyLow);*/ + + if (dwVideoFlag & VIDEO_1_INUSE) + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V_COLOR_KEY, dwKeyLow); + } + else + { + if ( hwDiff->dwSupportTwoColorKey ) /*CLE_C0*/ + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V3_COLOR_KEY, dwKeyLow); + } + + /*dwCompose = (dwCompose & ~0x0f) | SELECT_VIDEO_IF_COLOR_KEY;*/ + /*CLE_C0*/ + dwCompose = (dwCompose & ~0x0f) | SELECT_VIDEO_IF_COLOR_KEY | SELECT_VIDEO3_IF_COLOR_KEY; + /*dwCompose = (dwCompose & ~0x0f) ;*/ + } + + if (dwChromaKey) { + DBG_DD(ErrorF("Overlay Chromakey= low:%08lx high:%08lx\n", dwKeyLow, dwKeyHigh)); + + dwChromaLow &= CHROMA_KEY_LOW; + dwChromaHigh &= CHROMA_KEY_HIGH; + + dwChromaLow |= (VIDInD(V_CHROMAKEY_LOW)&(~CHROMA_KEY_LOW)); + dwChromaHigh |= (VIDInD(V_CHROMAKEY_HIGH)&(~CHROMA_KEY_HIGH)); + + /*Added by Scottie[2001.12.5] for Chroma Key*/ + if (pVia->swov.DPFsrc.dwFlags & DDPF_FOURCC) + { + switch (pVia->swov.DPFsrc.dwFourCC) { + case FOURCC_YV12: + case FOURCC_VIA: + /*to be continued...*/ + break; + case FOURCC_YUY2: + /*to be continued...*/ + break; + default: + /*TOINT3;*/ + break; + } + } + else if (pVia->swov.DPFsrc.dwFlags & DDPF_RGB) + { + unsigned long dwtmpLowR; + unsigned long dwtmpLowG; + unsigned long dwtmpLowB; + unsigned long dwtmpChromaLow; + unsigned long dwtmpHighR; + unsigned long dwtmpHighG; + unsigned long dwtmpHighB; + unsigned long dwtmpChromaHigh; + + switch (pVia->swov.DPFsrc.dwRGBBitCount) { + case 16: + if (pVia->swov.DPFsrc.dwGBitMask==0x07E0) /*RGB16(5:6:5)*/ + { + dwtmpLowR = (((dwChromaLow >> 11) << 3) | ((dwChromaLow >> 13) & 0x07)) & 0xFF; + dwtmpLowG = (((dwChromaLow >> 5) << 2) | ((dwChromaLow >> 9) & 0x03)) & 0xFF; + + dwtmpHighR = (((dwChromaHigh >> 11) << 3) | ((dwChromaHigh >> 13) & 0x07)) & 0xFF; + dwtmpHighG = (((dwChromaHigh >> 5) << 2) | ((dwChromaHigh >> 9) & 0x03)) & 0xFF; + } + else /*RGB15(5:5:5)*/ + { + dwtmpLowR = (((dwChromaLow >> 10) << 3) | ((dwChromaLow >> 12) & 0x07)) & 0xFF; + dwtmpLowG = (((dwChromaLow >> 5) << 3) | ((dwChromaLow >> 7) & 0x07)) & 0xFF; + + dwtmpHighR = (((dwChromaHigh >> 10) << 3) | ((dwChromaHigh >> 12) & 0x07)) & 0xFF; + dwtmpHighG = (((dwChromaHigh >> 5) << 3) | ((dwChromaHigh >> 7) & 0x07)) & 0xFF; + } + dwtmpLowB = (((dwChromaLow << 3) | (dwChromaLow >> 2)) & 0x07) & 0xFF; + dwtmpChromaLow = (dwtmpLowG << 16) | (dwtmpLowR << 8) | dwtmpLowB; + dwChromaLow = ((dwChromaLow >> 24) << 24) | dwtmpChromaLow; + + dwtmpHighB = (((dwChromaHigh << 3) | (dwChromaHigh >> 2)) & 0x07) & 0xFF; + dwtmpChromaHigh = (dwtmpHighG << 16) | (dwtmpHighR << 8) | dwtmpHighB; + dwChromaHigh = ((dwChromaHigh >> 24) << 24) | dwtmpChromaHigh; + break; + + case 32: /*32 bit RGB*/ + dwtmpLowR = (dwChromaLow >> 16) & 0xFF; + dwtmpLowG = (dwChromaLow >> 8) & 0xFF; + dwtmpLowB = dwChromaLow & 0xFF; + dwtmpChromaLow = (dwtmpLowG << 16) | (dwtmpLowR << 8) | dwtmpLowB; + dwChromaLow = ((dwChromaLow >> 24) << 24) | dwtmpChromaLow; + + dwtmpHighR = (dwChromaHigh >> 16) & 0xFF; + dwtmpHighG = (dwChromaHigh >> 8) & 0xFF; + dwtmpHighB = dwChromaHigh & 0xFF; + dwtmpChromaHigh = (dwtmpHighG << 16) | (dwtmpHighR << 8) | dwtmpHighB; + dwChromaHigh = ((dwChromaHigh >> 24) << 24) | dwtmpChromaHigh; + break; + + default: + /*TOINT3;*/ + break; + } + }/*End of DDPF_FOURCC*/ + + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V_CHROMAKEY_HIGH,dwChromaHigh); + if (dwVideoFlag & VIDEO_1_INUSE) + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V_CHROMAKEY_LOW, dwChromaLow); + /*Temporarily solve the H/W Interpolation error when using Chroma Key*/ + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V1_MINI_CONTROL, miniCtl & 0xFFFFFFF8); + } + else + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V_CHROMAKEY_LOW, dwChromaLow|V_CHROMAKEY_V3); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V3_MINI_CONTROL, miniCtl & 0xFFFFFFF8); + } + + /*Modified by Scottie[2001.12.5] for select video if (color key & chroma key)*/ + if (dwCompose==SELECT_VIDEO_IF_COLOR_KEY) + dwCompose = SELECT_VIDEO_IF_COLOR_KEY | SELECT_VIDEO_IF_CHROMA_KEY; + else + dwCompose = (dwCompose & ~0x0f) | SELECT_VIDEO_IF_CHROMA_KEY; + } + + /* determine which video stream is on top */ + /* + DBG_DD(ErrorF(" dwFlags= 0x%08lx\n", dwFlags)); + if (dwFlags & DDOVER_CLIP) + dwCompose |= COMPOSE_V3_TOP; + else + dwCompose |= COMPOSE_V1_TOP; + */ + DBG_DD(ErrorF(" pVia->Video.dwCompose 0x%lx\n", pVia->Video.dwCompose)); + + if (pVia->Video.dwCompose & (VW_TV1_TOP | VW_TV_TOP) ) + dwCompose |= COMPOSE_V3_TOP; + else if (pVia->Video.dwCompose & (VW_TV0_TOP | VW_DVD_TOP) ) + dwCompose &= ~COMPOSE_V3_TOP; + + DBG_DD(ErrorF(" dwCompose 0x%8lx\n", dwCompose)); + + /* Setup video control*/ + if (dwVideoFlag & VIDEO_HQV_INUSE) + { + if (!pVia->swov.SWVideo_ON) + /*if (0)*/ + { + DBG_DD(ErrorF(" First HQV\n")); + + viaMacro_VidREGFlush(pVia); + + DBG_DD(ErrorF(" Wait flips")); + if ( hwDiff->dwHQVInitPatch ) + { + DBG_DD(ErrorF(" Wait flips 1")); + viaWaitHQVFlipClear(pVia, ((dwHQVCtl&~HQV_SW_FLIP)|HQV_FLIP_STATUS)&~HQV_ENABLE); + VIDOutD(HQV_CONTROL, dwHQVCtl); + DBG_DD(ErrorF(" Wait flips2")); + viaWaitHQVFlip(pVia); + DBG_DD(ErrorF(" Wait flips 3")); + viaWaitHQVFlipClear(pVia, ((dwHQVCtl&~HQV_SW_FLIP)|HQV_FLIP_STATUS)&~HQV_ENABLE); + VIDOutD(HQV_CONTROL, dwHQVCtl); + DBG_DD(ErrorF(" Wait flips4")); + viaWaitHQVFlip(pVia); + } + else /* CLE_C0 */ + { + VIDOutD(HQV_CONTROL, dwHQVCtl & ~HQV_SW_FLIP); + VIDOutD(HQV_CONTROL, dwHQVCtl | HQV_SW_FLIP); + DBG_DD(ErrorF(" Wait flips5")); + viaWaitHQVFlip(pVia); + DBG_DD(ErrorF(" Wait flips6")); + } + + if (dwVideoFlag & VIDEO_1_INUSE) + { + VIDOutD(V1_CONTROL, dwVidCtl); + VIDOutD(V_COMPOSE_MODE, (dwCompose|V1_COMMAND_FIRE )); + if (pVia->swov.gdwUseExtendedFIFO) + { + /*Set Display FIFO*/ + DBG_DD(ErrorF(" Wait flips7")); + viaWaitVBI(pVia); + DBG_DD(ErrorF(" Wait flips 8")); + /*outb(0x17, 0x3C4); outb(0x2f, 0x3C5); + outb(0x16, 0x3C4); outb((pVia->swov.Save_3C4_16&0xf0)|0x14, 0x3C5); + outb(0x18, 0x3C4); outb(0x56, 0x3C5);*/ + + VGAOUT8(0x3C4, 0x17); VGAOUT8(0x3C5, 0x2f); + VGAOUT8(0x3C4, 0x16); VGAOUT8(0x3C5, (pVia->swov.Save_3C4_16&0xf0)|0x14); + VGAOUT8(0x3C4, 0x18); VGAOUT8(0x3C5, 0x56); + DBG_DD(ErrorF(" Wait flips 9")); + } + } + else + { + DBG_DD(ErrorF(" Wait flips 10")); + VIDOutD(V3_CONTROL, dwVidCtl); + VIDOutD(V_COMPOSE_MODE, (dwCompose|V3_COMMAND_FIRE )); + } + DBG_DD(ErrorF(" Done flips")); + } + else + { + DBG_DD(ErrorF(" Normal called\n")); + if (dwVideoFlag & VIDEO_1_INUSE) + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V1_CONTROL, dwVidCtl); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V_COMPOSE_MODE, (dwCompose|V1_COMMAND_FIRE )); + } + else + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V3_CONTROL, dwVidCtl); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V_COMPOSE_MODE, (dwCompose|V3_COMMAND_FIRE )); + } + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, HQV_CONTROL, dwHQVCtl|HQV_FLIP_STATUS); + viaWaitHQVDone(pVia); + viaMacro_VidREGFlush(pVia); + } + } + else + { + if (dwVideoFlag & VIDEO_1_INUSE) + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V1_CONTROL, dwVidCtl); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V_COMPOSE_MODE, (dwCompose|V1_COMMAND_FIRE )); + } + else + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V3_CONTROL, dwVidCtl); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V_COMPOSE_MODE, (dwCompose|V3_COMMAND_FIRE )); + } + viaWaitHQVDone(pVia); + viaMacro_VidREGFlush(pVia); + } + pVia->swov.SWVideo_ON = TRUE; + } + else + { + /*Hide overlay*/ + + if ( hwDiff->dwHQVDisablePatch ) /*CLE_C0*/ + { + VGAOUT8(0x3C4, 0x2E); + VGAOUT8(0x3C5, 0xEF); + } + + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V_FIFO_CONTROL,V1_FIFO_PRETHRESHOLD12 | + V1_FIFO_THRESHOLD8 |V1_FIFO_DEPTH16); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,ALPHA_V3_FIFO_CONTROL, ALPHA_FIFO_THRESHOLD4 + | ALPHA_FIFO_DEPTH8 | V3_FIFO_THRESHOLD24 | V3_FIFO_DEPTH32 ); + + if (dwVideoFlag&VIDEO_HQV_INUSE) + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,HQV_CONTROL, (VIDInD(HQV_CONTROL) & (~HQV_ENABLE))); + } + + if (dwVideoFlag&VIDEO_1_INUSE) + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V1_CONTROL, (VIDInD(V1_CONTROL) & (~V1_ENABLE))); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V_COMPOSE_MODE, (VIDInD(V_COMPOSE_MODE)|V1_COMMAND_FIRE)); + } + else + { + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V3_CONTROL, (VIDInD(V3_CONTROL) & (~V3_ENABLE))); + viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V_COMPOSE_MODE, (VIDInD(V_COMPOSE_MODE)|V3_COMMAND_FIRE)); + } + + viaMacro_VidREGFlush(pVia); + + if ( hwDiff->dwHQVDisablePatch ) /*CLE_C0*/ + { + VGAOUT8(0x3C4, 0x2E); + VGAOUT8(0x3C5, 0xFF); + } + + } + DBG_DD(ErrorF(" Done Upd_Video")); + + return PI_OK; + +} /* Upd_Video */ + +/************************************************************************* + * VIAVidUpdateOverlay + * Parameters: src rectangle, dst rectangle, colorkey... + * Return Value: unsigned long of state + * note: Update the overlay image param. +*************************************************************************/ +unsigned long VIAVidUpdateOverlay(ScrnInfoPtr pScrn, LPDDUPDATEOVERLAY lpUpdate) +{ + VIAPtr pVia = VIAPTR(pScrn); + unsigned long dwFlags = lpUpdate->dwFlags; + unsigned long dwKeyLow=0, dwKeyHigh=0; + unsigned long dwChromaLow=0, dwChromaHigh=0; + unsigned long dwVideoFlag=0; + unsigned long dwColorKey=0, dwChromaKey=0; + /*DDUPDATEOVERLAY UpdateOverlayTemp;*/ + int nDstTop, nDstBottom, nDstLeft, nDstRight; + int Screen; + + DBG_DD(ErrorF("// VIAVidUpdateOverlay: %08lx\n", dwFlags)); + + /* Adjust to fix panning mode bug */ + lpUpdate->rDest.left = lpUpdate->rDest.left - (pVia->swov.panning_x - pVia->swov.panning_old_x); + lpUpdate->rDest.top = lpUpdate->rDest.top - (pVia->swov.panning_y - pVia->swov.panning_old_y); + lpUpdate->rDest.right = lpUpdate->rDest.right - (pVia->swov.panning_x - pVia->swov.panning_old_x); + lpUpdate->rDest.bottom = lpUpdate->rDest.bottom - (pVia->swov.panning_y - pVia->swov.panning_old_y); + + DBG_DD(ErrorF("Raw rSrc X (%ld,%ld) Y (%ld,%ld)\n", + lpUpdate->rSrc.left, lpUpdate->rSrc.right, lpUpdate->rSrc.top, lpUpdate->rSrc.bottom)); + DBG_DD(ErrorF("Raw rDest X (%ld,%ld) Y (%ld,%ld)\n", + lpUpdate->rDest.left, lpUpdate->rDest.right, lpUpdate->rDest.top, lpUpdate->rDest.bottom)); + +/* if (pVia->swov.gdwVideoFlagTV1 && !gdwOverlaySupport) + return PI_OK; +*/ + if ( (pVia->swov.DPFsrc.dwFourCC == FOURCC_YUY2)||( pVia->swov.DPFsrc.dwFourCC == FOURCC_YV12 ) || ( pVia->swov.DPFsrc.dwFourCC == FOURCC_VIA)) + dwVideoFlag = pVia->swov.gdwVideoFlagSW; + + dwFlags |= DDOVER_INTERLEAVED; + + /* For Alpha windows setting */ + if (pVia->swov.gdwAlphaEnabled) + dwFlags &= ~DDOVER_KEYDEST; + + viaMacro_VidREGRec(pVia, VIDREGREC_RESET_COUNTER, 0,0); + + if ( dwFlags & DDOVER_HIDE ) + { + DBG_DD(ErrorF("// :DDOVER_HIDE \n")); + + dwVideoFlag &= ~VIDEO_SHOW; + if (Upd_Video(pScrn, dwVideoFlag,0,lpUpdate->rSrc,lpUpdate->rDest,0,0,0,&pVia->swov.DPFsrc,0, + 0,0,0,0,0,0, dwFlags)== PI_ERR) + { + return PI_ERR; + } + pVia->swov.SWVideo_ON = FALSE; + pVia->swov.UpdateOverlayBackup.rDest.left = 0; + pVia->swov.UpdateOverlayBackup.rDest.top = 0; + pVia->swov.UpdateOverlayBackup.rDest.right = 0; + pVia->swov.UpdateOverlayBackup.rDest.bottom = 0; + + if (pVia->swov.gdwUseExtendedFIFO) + { + /*Restore Display fifo*/ + /*outb(0x16, 0x3C4); outb(pVia->swov.Save_3C4_16, 0x3C5);*/ + VGAOUT8(0x3C4, 0x16); VGAOUT8(0x3C5, pVia->swov.Save_3C4_16); + DBG_DD(ErrorF("Restore 3c4.16 : %08x \n",VGAIN8(0x3C5))); + + /*outb(0x17, 0x3C4); outb(pVia->swov.Save_3C4_17, 0x3C5);*/ + VGAOUT8(0x3C4, 0x17); VGAOUT8(0x3C5, pVia->swov.Save_3C4_17); + DBG_DD(ErrorF(" 3c4.17 : %08x \n",VGAIN8(0x3C5))); + + /*outb(0x18, 0x3C4); outb(pVia->swov.Save_3C4_18, 0x3C5);*/ + VGAOUT8(0x3C4, 0x18); VGAOUT8(0x3C5, pVia->swov.Save_3C4_18); + DBG_DD(ErrorF(" 3c4.18 : %08x \n",VGAIN8(0x3C5))); + pVia->swov.gdwUseExtendedFIFO = 0; + } + return PI_OK; + } + + if ( (pVia->swov.UpdateOverlayBackup.rDest.left == lpUpdate->rDest.left) && + (pVia->swov.UpdateOverlayBackup.rDest.top == lpUpdate->rDest.top) && + (pVia->swov.UpdateOverlayBackup.rDest.right == lpUpdate->rDest.right) && + (pVia->swov.UpdateOverlayBackup.rDest.bottom == lpUpdate->rDest.bottom) ) + return PI_OK; + pVia->swov.UpdateOverlayBackup = * (LPDDUPDATEOVERLAY) lpUpdate; + + if ( dwFlags & DDOVER_KEYDEST ) + { + DBG_DD(ErrorF("// :DDOVER_KEYDEST \n")); + + dwColorKey = 1; + dwKeyLow = lpUpdate->dwColorSpaceLowValue; + } + + if (dwFlags & DDOVER_SHOW) + { + unsigned long dwStartAddr=0, dwDeinterlaceMode=0; + unsigned long dwScnWidth, dwScnHeight; + + DBG_DD(ErrorF("// :DDOVER_SHOW \n")); + + /*for SW decode HW overlay use*/ + dwStartAddr = VIDInD(HQV_SRC_STARTADDR_Y); + DBG_DD(ErrorF("dwStartAddr= 0x%lx\n", dwStartAddr)); + + if (dwFlags & DDOVER_INTERLEAVED) + { + dwDeinterlaceMode |= DDOVER_INTERLEAVED; + DBG_DD(ErrorF("DDOVER_INTERLEAVED\n")); + } + if (dwFlags & DDOVER_BOB) + { + dwDeinterlaceMode |= DDOVER_BOB; + DBG_DD(ErrorF("DDOVER_BOB\n")); + } + + /* for use with graphicInfo -- ugly */ + if (pVia->IsSecondary) + Screen = 1; + else + Screen = 0; + + if ((pVia->graphicInfo.Screen[Screen].dwWidth > 1024)) + { + DBG_DD(ErrorF("UseExtendedFIFO\n")); + pVia->swov.gdwUseExtendedFIFO = 1; + } + /* + else + { + //Set Display FIFO + outb(0x16, 0x3C4); outb((pVia->swov->Save_3C4_16&0xf0)|0x0c, 0x3C5); + DBG_DD(ErrorF("set 3c4.16 : %08x \n",inb(0x3C5))); + outb(0x18, 0x3C4); outb(0x4c, 0x3C5); + DBG_DD(ErrorF(" 3c4.18 : %08x \n",inb(0x3C5))); + } + */ + dwVideoFlag |= VIDEO_SHOW; + + /* + * Figure out actual rSrc rectangle + * Coz the Src rectangle AP sent is always original, ex:size(720,480) at (0,0) + * so the driver need to re-calc + * + * transfer unsigned long to signed int for calc + */ + nDstLeft = lpUpdate->rDest.left; + nDstTop = lpUpdate->rDest.top; + nDstRight= lpUpdate->rDest.right; + nDstBottom=lpUpdate->rDest.bottom; + + dwScnWidth = pVia->graphicInfo.Screen[Screen].dwWidth; + dwScnHeight = pVia->graphicInfo.Screen[Screen].dwHeight; + + if (nDstLeft<0) + lpUpdate->rSrc.left = (((-nDstLeft) * pVia->swov.overlayRecordV1.dwV1OriWidth) + ((nDstRight-nDstLeft)>>1)) / (nDstRight-nDstLeft); + else + lpUpdate->rSrc.left = 0; + + if (nDstRight>dwScnWidth) + lpUpdate->rSrc.right = (((dwScnWidth-nDstLeft) * pVia->swov.overlayRecordV1.dwV1OriWidth) + ((nDstRight-nDstLeft)>>1)) / (nDstRight-nDstLeft); + else + lpUpdate->rSrc.right = pVia->swov.overlayRecordV1.dwV1OriWidth; + + if (nDstTop<0) + lpUpdate->rSrc.top = (((-nDstTop) * pVia->swov.overlayRecordV1.dwV1OriHeight) + ((nDstBottom-nDstTop)>>1))/ (nDstBottom-nDstTop); + else + lpUpdate->rSrc.top = 0; + + if (nDstBottom >dwScnHeight) + lpUpdate->rSrc.bottom = (((dwScnHeight-nDstTop) * pVia->swov.overlayRecordV1.dwV1OriHeight) + ((nDstBottom-nDstTop)>>1)) / (nDstBottom-nDstTop); + else + lpUpdate->rSrc.bottom = pVia->swov.overlayRecordV1.dwV1OriHeight; + + /* save modified src & original dest rectangle param.*/ + if ( (pVia->swov.DPFsrc.dwFourCC == FOURCC_YUY2)||( pVia->swov.DPFsrc.dwFourCC == FOURCC_YV12 ) || ( pVia->swov.DPFsrc.dwFourCC == FOURCC_VIA)) + { + pVia->swov.SWDevice.gdwSWDstLeft = lpUpdate->rDest.left + (pVia->swov.panning_x - pVia->swov.panning_old_x); + pVia->swov.SWDevice.gdwSWDstTop = lpUpdate->rDest.top + (pVia->swov.panning_y - pVia->swov.panning_old_y); + pVia->swov.SWDevice.gdwSWDstWidth = lpUpdate->rDest.right - lpUpdate->rDest.left; + pVia->swov.SWDevice.gdwSWDstHeight = lpUpdate->rDest.bottom - lpUpdate->rDest.top; + + pVia->swov.SWDevice.gdwSWSrcWidth = pVia->swov.overlayRecordV1.dwV1SrcWidth = lpUpdate->rSrc.right - lpUpdate->rSrc.left; + pVia->swov.SWDevice.gdwSWSrcHeight = pVia->swov.overlayRecordV1.dwV1SrcHeight = lpUpdate->rSrc.bottom - lpUpdate->rSrc.top; + } + + pVia->swov.overlayRecordV1.dwV1SrcLeft = lpUpdate->rSrc.left; + pVia->swov.overlayRecordV1.dwV1SrcRight = lpUpdate->rSrc.right; + pVia->swov.overlayRecordV1.dwV1SrcTop = lpUpdate->rSrc.top; + pVia->swov.overlayRecordV1.dwV1SrcBot = lpUpdate->rSrc.bottom; + + /* + // Figure out actual rDest rectangle + */ + lpUpdate->rDest.left= nDstLeft<0 ? 0 : nDstLeft; + lpUpdate->rDest.top= nDstTop<0 ? 0 : nDstTop; + if ( lpUpdate->rDest.top >= dwScnHeight) + lpUpdate->rDest.top = dwScnHeight-1; + /*lpUpdate->rDest.top= top>=dwScnHeight ? dwScnHeight-1: top;*/ + lpUpdate->rDest.right= nDstRight>dwScnWidth ? dwScnWidth: nDstRight; + lpUpdate->rDest.bottom= nDstBottom>dwScnHeight ? dwScnHeight: nDstBottom; + + /* + * Check which update func. (upd_MPEG, upd_video, + * upd_capture) to call + */ + if (Upd_Video(pScrn, dwVideoFlag,dwStartAddr,lpUpdate->rSrc,lpUpdate->rDest,pVia->swov.SWDevice.dwPitch, + pVia->swov.overlayRecordV1.dwV1OriWidth,pVia->swov.overlayRecordV1.dwV1OriHeight,&pVia->swov.DPFsrc, + dwDeinterlaceMode,dwColorKey,dwChromaKey, + dwKeyLow,dwKeyHigh,dwChromaLow,dwChromaHigh, dwFlags)== PI_ERR) + { + return PI_ERR; + } + pVia->swov.SWVideo_ON = FALSE; + + return PI_OK; + + } /*end of DDOVER_SHOW*/ + + pVia->swov.panning_old_x = pVia->swov.panning_x; + pVia->swov.panning_old_y = pVia->swov.panning_y; + + return PI_OK; + +} /*VIAVidUpdateOverlay*/ + + + +/************************************************************************* + * ADJUST FRAME +*************************************************************************/ +unsigned long VIAVidAdjustFrame(ScrnInfoPtr pScrn, LPADJUSTFRAME lpAdjustFrame) +{ + VIAPtr pVia = VIAPTR(pScrn); + DBG_DD(ErrorF("//VIAVidAdjustFrame\n")); + + pVia->swov.panning_x = lpAdjustFrame->x; + pVia->swov.panning_y = lpAdjustFrame->y; + + return PI_OK; +} diff --git a/src/via_swov.h b/src/via_swov.h new file mode 100644 index 0000000..0195fcf --- /dev/null +++ b/src/via_swov.h @@ -0,0 +1,55 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_swov.h,v 1.4 2003/08/27 15:16:13 tsi Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef _VIA_SWOV_H_ +#define _VIA_SWOV_H_ 1 + +/*#define XV_DEBUG 1*/ /* write log msg to /var/log/XFree86.0.log */ + +#ifdef XV_DEBUG +# define DBG_DD(x) (x) +#else +# define DBG_DD(x) +#endif + +#include "ddmpeg.h" +#include "via_xvpriv.h" + +/* Definition for VideoStatus */ +#define VIDEO_NULL 0x00000000 + +unsigned long VIAVidCreateSurface(ScrnInfoPtr pScrn, LPDDSURFACEDESC lpDDSurfaceDesc); +unsigned long VIAVidLockSurface(ScrnInfoPtr pScrn, LPDDLOCK lpLock); +unsigned long VIAVidDestroySurface(ScrnInfoPtr pScrn, LPDDSURFACEDESC lpDDSurfaceDesc); + +unsigned long Upd_MPEG(ScrnInfoPtr pScrn, unsigned long dwVideoFlag,unsigned long dwStartAddr,RECTL rSrc,RECTL rDest,unsigned long dwSrcPitch, + unsigned long dwOriSrcWidth,unsigned long dwOriSrcHeight,LPDDPIXELFORMAT lpDPFsrc, + unsigned long dwDeinterlaceMode,unsigned long dwColorKey,unsigned long dwChromaKey, + unsigned long dwKeyLow,unsigned long dwKeyHigh,unsigned long dwChromaLow,unsigned long dwChromaHigh); + +unsigned long VIAVidUpdateOverlay(ScrnInfoPtr pScrn, LPDDUPDATEOVERLAY lpUpdate); +unsigned long VIAVidAdjustFrame(ScrnInfoPtr pScr, LPADJUSTFRAME lpAdjustFrame); + +#endif /* _VIA_SWOV_H_ */ diff --git a/src/via_tuner.c b/src/via_tuner.c new file mode 100644 index 0000000..7ae0144 --- /dev/null +++ b/src/via_tuner.c @@ -0,0 +1,670 @@ +/* + * Copyright 2003 Red Hat, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_tuner.c,v 1.2 2004/01/02 18:23:36 tsi Exp $ */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "xf86.h" +#include "xf86_OSproc.h" +#include "xf86_ansic.h" +#include "xf86fbman.h" + +#include "via_compose.h" +#include "via_capture.h" +#include "via.h" +#include "ddmpeg.h" +#include "xf86drm.h" + +#include "via_overlay.h" +#include "via_driver.h" +#include "via_regrec.h" +#include "via_priv.h" +#include "via_swov.h" +#include "via_common.h" + +/* + * Architecture independant implementation of the TV tuner interfaces + * on the VIA chipsets. VIA have a video4linux kernel module for Linux + * but that gives us i2c ownership clashes and lack of portability. + * Doing it in X means it should work cross platform + * + * The Overlay/TV input engines on the VIA are SAA7108/7113 or 7114 based. + */ + + +/* + * Wrap the ugly I2C functions from xf86 + */ + +static void WriteI2C(I2CDevPtr i2c, int sa, int v) +{ + unsigned char buf[2]; + buf[0] = sa; + buf[1] = v; + xf86I2CWriteRead(i2c, buf, 2, NULL, 0); +} + +static void WriteTuner(ViaTunerPtr tuner, int sa, int v) +{ + WriteI2C(tuner->I2C, sa, v); +} + +static void WriteTunerList(ViaTunerPtr tuner, unsigned char *p, int len) +{ + while(len >= 2) + { + WriteI2C(tuner->I2C, p[0], p[1]); + p += 2; + len -= 2; + } +} + +static int ReadI2C(I2CDevPtr i2c, int sa) +{ + unsigned char buf[2]; + buf[0] = sa; + xf86I2CWriteRead(i2c, buf, 1, buf+1, 1); + return buf[1]; +} + +#ifdef UNUSED +static int ReadTuner(ViaTunerPtr tuner, int sa) +{ + return ReadI2C(tuner->I2C, sa); +} +#endif + +/* + * I2C register tables to switch TV mode + */ + +static unsigned char sa7113_standard[3][4] = { + { 0xA8, 0x01, 0x0A, 0x07 }, /* PAL */ + { 0xE8, 0x01, 0x02, 0x0A }, /* NTSC */ + { 0xA8, 0x51, 0x0A, 0x07 } /* SECAM */ +}; + +static unsigned char sa7114_standard[3][3] = { + { 0x08, 0x30, 0x01 }, /* PAL - CHECK ME */ + { 0x0B, 0xFF, 0x00 }, /* NTSC */ + { 0x08, 0x30, 0x01 } /* SECAM*/ +}; + +void ViaTunerStandard(ViaTunerPtr pTuner, int mode) +{ + switch(pTuner->decoderType) + { + case SAA7113H: + { + unsigned char *ptr = sa7113_standard[mode]; + WriteTuner(pTuner, 0x08, ptr[0]); + WriteTuner(pTuner, 0x0E, ptr[1]); + WriteTuner(pTuner, 0x40, ptr[2]); + WriteTuner(pTuner, 0x5A, ptr[3]); + break; + } + case SAA7108H: + case SAA7114H: + { + unsigned char *ptr = sa7114_standard[mode]; + WriteTuner(pTuner, 0x8F, ptr[0]); + WriteTuner(pTuner, 0x9A, ptr[1]); + WriteTuner(pTuner, 0x9B, ptr[2]); + WriteTuner(pTuner, 0x9E, ptr[1]); + WriteTuner(pTuner, 0x9F, ptr[2]); + WriteTuner(pTuner, 0x88, 0xD0); + WriteTuner(pTuner, 0x88, 0xF0); + break; + } + } +} + +/* + * Set TV properties (0-255). Abstracted in case a non SAA tuner + * is added with different registers. + */ + +void ViaTunerBrightness(ViaTunerPtr pTuner, int value) +{ + WriteTuner(pTuner, 0x0A, value); +} + +void ViaTunerContrast(ViaTunerPtr pTuner, int value) +{ + WriteTuner(pTuner, 0x0B, value); +} + +void ViaTunerHue(ViaTunerPtr pTuner, int value) +{ + WriteTuner(pTuner, 0x0D, value); +} + +void ViaTunerLuminance(ViaTunerPtr pTuner, int value) +{ + WriteTuner(pTuner, 0x09, value); +} + +void ViaTunerSaturation(ViaTunerPtr pTuner, int value) +{ + WriteTuner(pTuner, 0x0C, value); +} + +/* + * Input Selection + */ + +void ViaTunerInput(ViaTunerPtr pTuner, int mode) +{ + switch(pTuner->decoderType) + { + case SAA7113H: + if(mode == MODE_TV) + { + if(pTuner->autoDetect) + WriteTuner(pTuner, 0x02, 0xC0); + else + WriteTuner(pTuner, 0x02, 0xC0|pTuner->tunerMode); + WriteTuner(pTuner, 0x09, 0x01); + break; + } + if(mode == MODE_SVIDEO) + { + if(pTuner->autoDetect) + WriteTuner(pTuner, 0x02, 0xC9); + else + WriteTuner(pTuner, 0x02, 0xC0|pTuner->tunerMode); + WriteTuner(pTuner, 0x09, 0x81); + break; + } + if(mode == MODE_COMPOSITE) + { + if(pTuner->autoDetect) + WriteTuner(pTuner, 0x02, 0xC2); + else + WriteTuner(pTuner, 0x02, 0xC0|pTuner->tunerMode); + WriteTuner(pTuner, 0x09, 0x01); + break; + } + break; + case SAA7108H: + if(mode == MODE_TV) + break; + if(mode == MODE_SVIDEO) + { + if(pTuner->autoDetect) + WriteTuner(pTuner, 0x02, 0xC6); + else + WriteTuner(pTuner, 0x02, 0xC0|pTuner->tunerMode); + WriteTuner(pTuner, 0x09, 0x80); + } + else if(mode == MODE_COMPOSITE) + { + if(pTuner->autoDetect) + WriteTuner(pTuner, 0x02, 0xC0); + else + WriteTuner(pTuner, 0x02, 0xC0|pTuner->tunerMode); + WriteTuner(pTuner, 0x09, 0x40); + } + WriteTuner(pTuner, 0x08, 0x58); + WriteTuner(pTuner, 0x08, 0xF8); + WriteTuner(pTuner, 0x88, 0xD0); + WriteTuner(pTuner, 0x88, 0xF0); + break; + case SAA7114H: + if(mode == MODE_TV) + { + if(pTuner->autoDetect) + WriteTuner(pTuner, 0x02, 0xC0); + else + WriteTuner(pTuner, 0x02, 0xC0|pTuner->tunerMode); + WriteTuner(pTuner, 0x09, 0x40); + } + else if(mode == MODE_SVIDEO) + { + if(pTuner->autoDetect) + WriteTuner(pTuner, 0x02, 0xC7); + else + WriteTuner(pTuner, 0x02, 0xC0|pTuner->tunerMode); + WriteTuner(pTuner, 0x09, 0x80); + } + else if(mode == MODE_COMPOSITE) + { + if(pTuner->autoDetect) + WriteTuner(pTuner, 0x02, 0xC2); + else + WriteTuner(pTuner, 0x02, 0xC0|pTuner->tunerMode); + WriteTuner(pTuner, 0x09, 0x40); + } + WriteTuner(pTuner, 0x08, 0x58); + WriteTuner(pTuner, 0x08, 0xF8); + WriteTuner(pTuner, 0x88, 0xD0); + WriteTuner(pTuner, 0x88, 0xF0); + break; + } +} + +/* + * Switch Channel + */ + +void ViaTunerChannel(ViaTunerPtr pTuner, int divider, int control) +{ + unsigned char buf[4]; + buf[0] = divider >> 8; + buf[1] = divider & 0xFF; + buf[2] = control >> 8; + buf[3] = control & 0xFF; + xf86I2CWriteRead(pTuner->FMI2C, buf, 4, NULL, 0); +} + +/* + * Set up + */ + +static void ViaTunerSetup(ViaTunerPtr pTuner) +{ + static unsigned char sa7108_boot[] = { + 0x03, 0x10, 0x04, 0x90, 0x05, 0x90, 0x06, 0xEB, + 0x07, 0xE0, 0x08, 0x98, 0x09, 0x80, 0x0A, 0x80, + 0x0B, 0x44, 0x0C, 0x40, 0x0D, 0x00, 0x0E, 0x89, + 0x0F, 0x2A, 0x10, 0x0E, 0x11, 0x00, 0x12, 0x00, + 0x13, 0x01, 0x14, 0x00, 0x15, 0x11, 0x16, 0xFE, + 0x17, 0x40, 0x18, 0x40, 0x19, 0x80, + + 0x80, 0x1C, 0x81, 0x00, 0x82, 0x00, 0x83, 0x00, /* Scaler present */ + 0x84, 0x00, 0x85, 0x00, 0x86, 0x45, 0x87, 0x01, + 0x88, 0xF0, + + 0x8F, 0x0B, 0x90, 0x00, 0x91, 0x08, 0x92, 0x09, + 0x93, 0x80, 0x94, 0x02, 0x95, 0x00, 0x96, 0xD0, + 0x97, 0x02, 0x98, 0x12, 0x99, 0x00, 0x9A, 0x00, + 0x9B, 0x00, 0x9C, 0xD0, 0x9D, 0x02, 0x9E, 0xFF, + 0x9F, 0x00, 0xA0, 0x01, 0xA1, 0x00, 0xA2, 0x00, + + 0xA4, 0x80, 0xA5, 0x40, 0xA6, 0x40, + + 0xA8, 0x00, 0xA9, 0x04, 0xAA, 0x00, + + 0xAC, 0x00, 0xAD, 0x02, 0xAE, 0x00, + + 0xB0, 0x00, 0xB1, 0x04, 0xB2, 0x00, 0xB3, 0x04, + 0xB4, 0x00, + + 0xB8, 0x00, 0xB9, 0x00, 0xBA, 0x00, 0xBB, 0x00, + 0xBC, 0x00, 0xBD, 0x00, 0xBE, 0x00, 0xBF, 0x00, + + 0x88, 0xD0, 0x88, 0xF0 + }; + + static unsigned char sa7113_boot[] = { + 0x03, 0x33, 0x04, 0x00, 0x05, 0x00, 0x06, 0xE9, + 0x07, 0x0D, 0x08, 0xF8, 0x09, 0x01, 0x0A, 0x80, + 0x0B, 0x47, 0x0C, 0x40, 0x0D, 0x00, 0x0E, 0x01, + 0x0F, 0x2A, 0x10, 0x40, 0x11, 0x08, 0x12, 0xB7, + 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, 0x00, + 0x17, 0x00, + 0x40, 0x02, 0x41, 0xFF, 0x42, 0xFF, 0x43, 0xFF, + 0x44, 0xFF, 0x45, 0xFF, 0x46, 0xFF, 0x47, 0xFF, + 0x48, 0xFF, 0x49, 0xFF, 0x4A, 0xFF, 0x4B, 0xFF, + 0x4C, 0xFF, 0x4D, 0xFF, 0x4E, 0xFF, 0x4F, 0xFF, + 0x50, 0xFF, 0x51, 0xFF, 0x52, 0xFF, 0x53, 0xFF, + 0x54, 0xFF, 0x55, 0xFF, 0x56, 0xFF, 0x57, 0xFF, + 0x58, 0x00, 0x59, 0x54,0x5A, 0x0A, 0x5B, 0x83 + }; + + static unsigned char sa7114_boot[] = { + 0x03, 0x10, 0x04, 0x90, 0x05, 0x90, 0x06, 0xEB, + 0x07, 0xE0, 0x08, 0x98, 0x09, 0x80, 0x0A, 0x80, + 0x0B, 0x44, 0x0C, 0x40, 0x0D, 0x00, 0x0E, 0x89, + 0x0F, 0x2A, 0x10, 0x0E, 0x11, 0x00, 0x12, 0x00, + 0x13, 0x01, 0x14, 0x00, 0x15, 0x11, 0x16, 0xFE, + 0x17, 0x40, 0x18, 0x40, 0x19, 0x80, + + 0x80, 0x1C, 0x81, 0x00, 0x82, 0x00, 0x83, 0x01, + 0x84, 0x00, 0x85, 0x00, 0x86, 0x45, 0x87, 0x01, + 0x88, 0xF0, 0x8F, 0x0B, + + 0x90, 0x00, 0x91, 0x08, 0x92, 0x09, 0x93, 0x80, + 0x94, 0x02, 0x95, 0x00, 0x96, 0xD0, 0x97, 0x02, + 0x98, 0x12, 0x99, 0x00, 0x9A, 0xFF, 0x9B, 0x00, + 0x9C, 0xD0, 0x9D, 0x02, 0x9E, 0xFF, 0xA0, 0x01, + 0xA1, 0x00, 0xA2, 0x00, 0xA4, 0x80, 0xA5, 0x40, + 0xA6, 0x40, + + 0xA8, 0x00, 0xA9, 0x04, 0xAA, 0x00, + + 0xAC, 0x00, 0xAD, 0x02, 0xAE, 0x00, + + 0xB0, 0x00, 0xB1, 0x04, 0xB2, 0x00, 0xB3, 0x04, + 0xB4, 0x00, 0xB8, 0x00, 0xB9, 0x00, 0xBA, 0x00, + 0xBB, 0x00, 0xBC, 0x00, 0xBD, 0x00, 0xBE, 0x00, + 0xBF, 0x00, + + 0x88, 0xD0, 0x88, 0xF0 + }; + switch(pTuner->decoderType) + { + case SAA7113H: + if(pTuner->autoDetect) + WriteTuner(pTuner, 0x02, 0xC9); + else + WriteTuner(pTuner, 0x02, 0xC0|pTuner->tunerMode); + WriteTunerList(pTuner, sa7113_boot, sizeof(sa7113_boot)); + break; + case SAA7108H: + if(pTuner->autoDetect) + WriteTuner(pTuner, 0x02, 0xC0); + else + WriteTuner(pTuner, 0x02, 0xC0|pTuner->tunerMode); + WriteTunerList(pTuner, sa7108_boot, sizeof(sa7108_boot)); + break; + case SAA7114H: + if(pTuner->autoDetect) + WriteTuner(pTuner, 0x02, 0xC2); + else + WriteTuner(pTuner, 0x02, 0xC0|pTuner->tunerMode); + WriteTunerList(pTuner, sa7114_boot, sizeof(sa7114_boot)); + break; + } +} + +/* + * Bit 7 of register 50 enables GPIO control for the audio + * Bit 5 then selects which tuner audio input is used + */ + +#define AUDIO_GPIO1_ENABLE 0x80 +#define AUDIO_GPIO_SELECT_TUNER1 0x20 + +void ViaAudioSelect(VIAPtr pVia, int tuner) +{ + int index = VGAIN8(0x3C4); + int data; + + if(!pVia->CXA2104S) + return; + + VGAOUT8(0x3C4, 0x50); /* Select audio control bit */ + + data = VGAIN8(0x3C5); + data |= AUDIO_GPIO1_ENABLE; + if(tuner == 0) + data &= ~AUDIO_GPIO_SELECT_TUNER1; + else + data |= AUDIO_GPIO_SELECT_TUNER1; + VGAOUT8(0x3C5, data); + + VGAOUT8(0x3C4, index); +} + +void ViaAudioInit(VIAPtr pVia) +{ + if(!pVia->CXA2104S) + return; + + WriteI2C(pVia->CXA2104S, 0, 0x01); + WriteI2C(pVia->CXA2104S, 1, 0x1F); + WriteI2C(pVia->CXA2104S, 2, 0x1F); + WriteI2C(pVia->CXA2104S, 3, 0x00); + WriteI2C(pVia->CXA2104S, 4, 0x00); +} + +void ViaAudioMode(VIAPtr pVia, int mode) +{ + if(!pVia->CXA2104S) + return; + + pVia->AudioMode = mode; + pVia->AudioMute = 0; + + switch(mode) + { + case AUDIO_STEREO: + WriteI2C(pVia->CXA2104S, 0, 0x01); + WriteI2C(pVia->CXA2104S, 1, 0x1F); + WriteI2C(pVia->CXA2104S, 2, 0x1F); + WriteI2C(pVia->CXA2104S, 3, 0x01); + WriteI2C(pVia->CXA2104S, 4, 0x00); + break; + case AUDIO_SAP: + WriteI2C(pVia->CXA2104S, 0, 0x0F); + WriteI2C(pVia->CXA2104S, 1, 0x1F); + WriteI2C(pVia->CXA2104S, 2, 0x1F); + WriteI2C(pVia->CXA2104S, 3, 0x0B); + WriteI2C(pVia->CXA2104S, 4, 0x20); + break; + case AUDIO_DUAL: + WriteI2C(pVia->CXA2104S, 0, 0x08); + WriteI2C(pVia->CXA2104S, 1, 0x1F); + WriteI2C(pVia->CXA2104S, 2, 0x1F); + WriteI2C(pVia->CXA2104S, 3, 0x0F); + WriteI2C(pVia->CXA2104S, 4, 0x20); + break; + } +} + +void ViaAudioMute(VIAPtr pVia, int mute) +{ + if(!pVia->CXA2104S) + return; + + switch(pVia->AudioMode) + { + case AUDIO_STEREO: + WriteI2C(pVia->CXA2104S, 3, 0x01 - mute); + break; + case AUDIO_SAP: + WriteI2C(pVia->CXA2104S, 3, 0x0B - mute); + break; + case AUDIO_DUAL: + WriteI2C(pVia->CXA2104S, 3, 0x0F - mute); + break; + } + pVia->AudioMute = mute; +} + +/* + * Check for philips tuners to go with the I2C devices + */ + +static void ViaProbeFMTuner(ViaTunerPtr pTuner, int slave) +{ + if(!xf86I2CProbeAddress(pTuner->I2C->pI2CBus, slave)) + return; + pTuner->FMI2C = xf86CreateI2CDevRec(); + pTuner->FMI2C->DevName = "FI1236"; + pTuner->FMI2C->SlaveAddr = slave; + pTuner->FMI2C->pI2CBus = pTuner->I2C->pI2CBus; + if(!xf86I2CDevInit(pTuner->FMI2C)) + { + xf86DestroyI2CDevRec(pTuner->FMI2C, TRUE); + pTuner->FMI2C = NULL; + } +} + +/* + * Helper for tuner creation + */ + +static ViaTunerPtr CreateTuner(int type, I2CDevPtr pI2C) +{ + ViaTunerPtr v = xnfcalloc(sizeof(ViaTunerRec), 1); + v->FMI2C = NULL; + v->I2C = pI2C; + v->decoderType = type; + return v; +} + +/* + * Probe and configure VIA tuner devices on the second I2C bus + */ + +void ViaTunerProbe(ScrnInfoPtr pScrn) +{ + VIAPtr pVia = VIAPTR(pScrn); + I2CDevPtr dev; + I2CDevPtr tdev; + + pVia->Tuner[0] = NULL; + pVia->Tuner[1] = NULL; + pVia->CXA2104S = NULL; + + /* The TV tuners if present live on I2C bus 2. There will be an + encoder/decoder chip or two and one or two tuner ICs. An additional + sound IC may also be present */ + + dev = xf86CreateI2CDevRec(); + dev->DevName = "TV Probe"; + dev->SlaveAddr = 0x88; + dev->pI2CBus = pVia->I2C_Port2; + if (!xf86I2CDevInit(dev)) + { + xf86DestroyI2CDevRec(dev, TRUE); + return; + } + + /* Ok so we have a TV processor for TV0 .. but what is it ? + Probe 0x88 register 0x1C */ + + /* Check for an SAA7108H on tuner 1 */ + if(ReadI2C(dev, 0x1C) == 0x04) + { + tdev = xf86CreateI2CDevRec(); + tdev->DevName = "SAA7108H"; + tdev->SlaveAddr = 0x40; + tdev->pI2CBus = pVia->I2C_Port2; + if (xf86I2CDevInit(dev) && (ReadI2C(tdev, 0x00) >> 4) == 0x00) /* 7108H */ + pVia->Tuner[0] = CreateTuner(SAA7108H, tdev); + else + xf86DestroyI2CDevRec(tdev, TRUE); + } + else + { + /* Check for an SAA7113H on tuner 0 */ + tdev = xf86CreateI2CDevRec(); + tdev->DevName = "SAA7113H"; + tdev->SlaveAddr = 0x48; + tdev->pI2CBus = pVia->I2C_Port2; + if (xf86I2CDevInit(dev) && (ReadI2C(tdev, 0x00) & 0xE0) == 0x00) /* 7113H */ + pVia->Tuner[0] = CreateTuner(SAA7113H, tdev); + else + xf86DestroyI2CDevRec(tdev, TRUE); + } + + /* Tuner 0 probe done. Look for tuner 1 */ + + /* Check for an SAA7108H on tuner 1 */ + if(ReadI2C(dev, 0x1C) == 0x04) + { + tdev = xf86CreateI2CDevRec(); + tdev->DevName = "SAA7108H"; + tdev->SlaveAddr = 0x42; + tdev->pI2CBus = pVia->I2C_Port2; + if (xf86I2CDevInit(dev) && (ReadI2C(tdev, 0x00) >> 4) == 0x00) /* 7108H */ + pVia->Tuner[1] = CreateTuner(SAA7108H, tdev); + else + xf86DestroyI2CDevRec(tdev, TRUE); + } + else + { + /* Check for an SAA7113H on tuner 1 */ + tdev = xf86CreateI2CDevRec(); + tdev->DevName = "SAA7113H"; + tdev->SlaveAddr = 0x4A; + tdev->pI2CBus = pVia->I2C_Port2; + if (xf86I2CDevInit(dev) && (ReadI2C(tdev, 0x00) & 0xE0) == 0x00) /* 7113H */ + pVia->Tuner[1] = CreateTuner(SAA7113H, tdev); + else + { + xf86DestroyI2CDevRec(tdev, TRUE); + /* Check for an SAA7114H on tuner 1 */ + tdev = xf86CreateI2CDevRec(); + tdev->DevName = "SAA7114H"; + tdev->SlaveAddr = 0x40; + tdev->pI2CBus = pVia->I2C_Port2; + if (xf86I2CDevInit(dev) && (ReadI2C(tdev, 0x00) & 0xE0) == 0x00) /* 7113H */ + pVia->Tuner[1] = CreateTuner(SAA7114H, tdev); + else + xf86DestroyI2CDevRec(tdev, TRUE); + } + } + xf86DestroyI2CDevRec(dev, TRUE); + + if(pVia->Tuner[0]) + { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Video decoder 0: %s.\n", + pVia->Tuner[0]->I2C->DevName); + ViaTunerSetup(pVia->Tuner[0]); + ViaProbeFMTuner(pVia->Tuner[0], 0xC6); + } + if(pVia->Tuner[1]) + { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Video decoder 1: %s.\n", + pVia->Tuner[1]->I2C->DevName); + ViaTunerSetup(pVia->Tuner[1]); + ViaProbeFMTuner(pVia->Tuner[1], 0xC0); + } + + /* Check for a CXA2104S audio controller */ + + if((pVia->Tuner[0] || pVia->Tuner[1]) && xf86I2CProbeAddress(pVia->I2C_Port2, 0x84)) + { + dev = xf86CreateI2CDevRec(); + dev->DevName = "CXA2104S"; + dev->SlaveAddr = 0x84; + dev->pI2CBus = pVia->I2C_Port2; + if(xf86I2CDevInit(dev)) + { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Video decoder 1: %s.\n", + pVia->Tuner[1]->I2C->DevName); + pVia->CXA2104S = dev; + } + else + xf86DestroyI2CDevRec(dev, TRUE); + } +} + +void ViaTunerDestroy(ScrnInfoPtr pScrn) +{ + VIAPtr pVia = VIAPTR(pScrn); + if(pVia->Tuner[0]) + { + if(pVia->Tuner[0]->FMI2C) + xf86DestroyI2CDevRec(pVia->Tuner[0]->FMI2C, TRUE); + xf86DestroyI2CDevRec(pVia->Tuner[0]->I2C, TRUE); + xfree(pVia->Tuner[0]); + pVia->Tuner[0] = NULL; + } + if(pVia->Tuner[1]) + { + if(pVia->Tuner[1]->FMI2C) + xf86DestroyI2CDevRec(pVia->Tuner[1]->FMI2C, TRUE); + xf86DestroyI2CDevRec(pVia->Tuner[1]->I2C, TRUE); + xfree(pVia->Tuner[1]); + pVia->Tuner[1] = NULL; + } + if(pVia->CXA2104S) + xf86DestroyI2CDevRec(pVia->CXA2104S, TRUE); +} diff --git a/src/via_tv2.h b/src/via_tv2.h new file mode 100644 index 0000000..5150430 --- /dev/null +++ b/src/via_tv2.h @@ -0,0 +1,126 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_tv2.h,v 1.3 2003/08/27 15:16:13 tsi Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef _VIA_TV2_H_ +#define _VIA_TV2_H_ 1 + +static const VIABIOSTVMASKTableRec tv2MaskTable = { + { 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0, 0XFF, 0, 0, 0, 0, 0, 0, 0XFF, 0, 0XFF, 0, 0, 0XFF, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0, 0, 0, 0, 0, 0XFF, 0XFF, 0XFF, 0, 0, 0XFF, 0XFF, 0XFF, 0, 0, 0 }, + 0X3F, 0X38, 61, 13, 22 +}; + +static const VIABIOSTV2TableRec tv2Table[] = { + { + { 0X64, 0X3, 0X22, 0X33, 0X43, 0, 0X10, 0X7D, 0XAC, 0X5, 0X99, 0X17, 0X93, 0XA5, 0X3, 0XBA, 0, 0, 0XA, 0XCD, 0X80, 0X28, 0XBE, 0XFF, 0X7F, 0X20, 0, 0X1, 0X2, 0X80, 0, 0, 0X75, 0XC, 0X4, 0X6D, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X1, 0X2, 0, 0XFC, 0XF9, 0XFF, 0X10, 0X23, 0X2C, 0X9, 0X8, 0XA, 0XC, 0XD, 0XD, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X64, 0X3, 0X22, 0X33, 0X43, 0, 0X10, 0X7D, 0XAC, 0X5, 0X99, 0X17, 0X93, 0XA5, 0X3, 0XBA, 0, 0, 0XA, 0XCD, 0X80, 0X28, 0XBE, 0XFF, 0X7F, 0X20, 0, 0X1, 0X2, 0X80, 0, 0, 0X75, 0XC, 0X4, 0X6D, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X2, 0X2, 0XFD, 0X6, 0XF8, 0XB, 0XF3, 0XF, 0X70, 0X5, 0XF9, 0XB, 0XF1, 0X11, 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X5D, 0X4F, 0X4F, 0X81, 0X52, 0X9E, 0X56, 0XBA, 0, 0X40, 0, 0, 0, 0, 0, 0, 0X8, 0, 0XDF, 0, 0, 0XDF, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0XF, 0X7F, 0X7F, 0XF, 0X9A, 0X23, 0X8F, 0XEF, 0X57, 0XDF, 0XDF, 0X57, 0X11, 0XA, 0X8, 0X50, 0, 0, 0, 0, 0, 0X28, 0X50, 0, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XF, 0X7F, 0X7F, 0XF, 0X9A, 0X23, 0X8F, 0XEF, 0X57, 0XDF, 0XDF, 0X57, 0X11, 0XA, 0X8, 0X50, 0, 0, 0, 0, 0, 0X50, 0XA0, 0X40, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XF, 0X7F, 0X7F, 0XF, 0X9A, 0X23, 0X8F, 0XEF, 0X57, 0XDF, 0XDF, 0X57, 0X11, 0XA, 0X8, 0X50, 0, 0, 0, 0, 0, 0XA0, 0X40, 0X81, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X7E07, 0, 0, 0, 0, 0, 0, 0 }, + { 0X2, 0X811, 0XF617, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X64, 0X1, 0X2, 0X33, 0X40, 0, 0X10, 0XAD, 0XD3, 0X37, 0XA3, 0, 0X94, 0XFF, 0X3, 0XBA, 0, 0, 0X7, 0X26, 0X2C, 0X20, 0X50, 0X63, 0XD5, 0X25, 0, 0X1, 0X2, 0X80, 0, 0, 0X75, 0XC, 0X4, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0, 0, 0XFE, 0XFC, 0XFD, 0X5, 0X12, 0X1F, 0X25, 0XB, 0X8, 0XA, 0XC, 0XD, 0XD, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X64, 0X1, 0X2, 0X33, 0X40, 0, 0X10, 0XAD, 0XD3, 0X37, 0XA3, 0, 0X94, 0XFF, 0X3, 0XBA, 0, 0, 0X7, 0X26, 0X2C, 0X20, 0X50, 0X63, 0XD5, 0X25, 0, 0X1, 0X2, 0X80, 0, 0, 0X75, 0XC, 0X4, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0XFE, 0X3, 0XFB, 0X6, 0XF8, 0XA, 0XF5, 0XC, 0X73, 0X6, 0XF8, 0XB, 0XF2, 0X10, 0X6F, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X64, 0X4F, 0X4F, 0X88, 0X53, 0X83, 0X6F, 0XBA, 0, 0X40, 0, 0, 0, 0, 0, 0, 0X11, 0, 0XDF, 0, 0, 0XDF, 0X70, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0X80, 0X4, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0X47, 0X7F, 0X7F, 0X47, 0X9A, 0X23, 0X95, 0X1A, 0X70, 0XDF, 0XDF, 0X70, 0X51, 0XA, 0X11, 0X5B, 0, 0, 0, 0, 0, 0X28, 0X50, 0, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X47, 0X7F, 0X7F, 0X47, 0X9A, 0X23, 0X95, 0X1A, 0X70, 0XDF, 0XDF, 0X70, 0X51, 0XA, 0X11, 0X5B, 0, 0, 0, 0, 0, 0X50, 0XA0, 0X40, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X47, 0X7F, 0X7F, 0X47, 0X9A, 0X23, 0X95, 0X1A, 0X70, 0XDF, 0XDF, 0X70, 0X51, 0XA, 0X11, 0X5B, 0, 0, 0, 0, 0, 0XA0, 0X40, 0X81, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XB607, 0, 0, 0, 0, 0, 0, 0 } + }, + { + { 0X84, 0X3, 0X2A, 0X33, 0X43, 0, 0X10, 0XDD, 0XB9, 0X15, 0X99, 0X17, 0X93, 0XA5, 0X3, 0XBA, 0, 0, 0XA, 0XED, 0X98, 0X1C, 0X96, 0X50, 0X5E, 0X1B, 0, 0X1, 0X2, 0X80, 0, 0, 0X75, 0XC, 0X4, 0X6D, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0, 0XFF, 0XFD, 0XFC, 0XFF, 0X7, 0X13, 0X1E, 0X22, 0XD, 0X8, 0X9, 0XA, 0XB, 0XC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X84, 0X3, 0X2A, 0X33, 0X43, 0, 0X10, 0XDD, 0XB9, 0X15, 0X99, 0X17, 0X93, 0XA5, 0X3, 0XBA, 0, 0, 0XA, 0XED, 0X98, 0X1C, 0X96, 0X50, 0X5E, 0X1B, 0, 0X1, 0X2, 0X80, 0, 0, 0X75, 0XC, 0X4, 0X6D, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X2, 0X2, 0XFD, 0X6, 0XF8, 0XB, 0XF3, 0XF, 0X70, 0X5, 0XF9, 0XB, 0XF1, 0X11, 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X80, 0X63, 0X63, 0X84, 0X69, 0X1A, 0XEC, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X5C, 0, 0X57, 0, 0, 0X57, 0XED, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0X80, 0X1E, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0X27, 0X1F, 0X1F, 0X27, 0XE3, 0X34, 0X48, 0X83, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X5C, 0X51, 0, 0, 0, 0, 0, 0X32, 0X64, 0, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X27, 0X1F, 0X1F, 0X27, 0XE3, 0X34, 0X48, 0X83, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X5C, 0X51, 0, 0, 0, 0, 0, 0X64, 0XC8, 0X40, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X27, 0X1F, 0X1F, 0X27, 0XE3, 0X34, 0X48, 0X83, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X5C, 0X51, 0, 0, 0, 0, 0, 0XC8, 0X90, 0X81, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XDE07, 0, 0, 0, 0, 0, 0, 0 }, + { 0X2, 0X811, 0X5717, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X84, 0X3, 0X1A, 0X33, 0X40, 0, 0X10, 0X85, 0XF1, 0X4B, 0XA3, 0, 0X94, 0XFF, 0X3, 0XBA, 0, 0, 0X7, 0X25, 0X2C, 0X1C, 0X18, 0X28, 0X87, 0X1F, 0, 0X1, 0X2, 0X80, 0, 0, 0X75, 0XC, 0X4, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0XFF, 0XFE, 0XFD, 0XFE, 0X2, 0XA, 0X13, 0X1A, 0X1D, 0XF, 0X8, 0X9, 0XA, 0XB, 0XB, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X84, 0X3, 0X1A, 0X33, 0X40, 0, 0X10, 0X85, 0XF1, 0X4B, 0XA3, 0, 0X94, 0XFF, 0X3, 0XBA, 0, 0, 0X7, 0X25, 0X2C, 0X1C, 0X18, 0X28, 0X87, 0X1F, 0, 0X1, 0X2, 0X80, 0, 0, 0X75, 0XC, 0X4, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0XFB, 0X4, 0XFB, 0X7, 0XF8, 0X9, 0XF6, 0XA, 0X74, 0X6, 0XF8, 0XB, 0XF2, 0X10, 0X6F, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X73, 0X63, 0X63, 0X97, 0X67, 0X91, 0XEC, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X5C, 0, 0X57, 0, 0, 0X57, 0XED, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0X80, 0X4, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0XBF, 0X1F, 0X1F, 0XBF, 0XDB, 0X33, 0X38, 0X88, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X5C, 0X51, 0, 0, 0, 0, 0, 0X32, 0X64, 0, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XBF, 0X1F, 0X1F, 0XBF, 0XDB, 0X33, 0X38, 0X88, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X5C, 0X51, 0, 0, 0, 0, 0, 0X64, 0XC8, 0X40, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XBF, 0X1F, 0X1F, 0XBF, 0XDB, 0X33, 0X38, 0X88, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X5C, 0X51, 0, 0, 0, 0, 0, 0XC8, 0X90, 0X81, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X8607, 0, 0, 0, 0, 0, 0, 0 } + } +}; + +static const VIABIOSTV2TableRec tv2OverTable[] = { + { + { 0X64, 0X3, 0X2, 0X33, 0X43, 0, 0X10, 0X7D, 0X72, 0X5, 0X99, 0X17, 0X93, 0XA5, 0X3, 0XBA, 0, 0, 0XD, 0X45, 0X38, 0X34, 0XF1, 0X91, 0X24, 0X25, 0, 0X1, 0X2, 0X80, 0, 0, 0X75, 0XC, 0X4, 0X6D, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0, 0X1, 0X2, 0XFF, 0XF9, 0XFA, 0XC, 0X26, 0X32, 0X7, 0X8, 0XA, 0XD, 0XE, 0XF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X64, 0X3, 0X2, 0X33, 0X43, 0, 0X10, 0X7D, 0X72, 0X5, 0X99, 0X17, 0X93, 0XA5, 0X3, 0XBA, 0, 0, 0XD, 0X45, 0X38, 0X34, 0XF1, 0X91, 0X24, 0X25, 0, 0X1, 0X2, 0X80, 0, 0, 0X75, 0XC, 0X4, 0X6D, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X2, 0X2, 0XFD, 0X6, 0XF8, 0XB, 0XF3, 0XF, 0X70, 0X5, 0XF9, 0XB, 0XF1, 0X11, 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X5D, 0X4F, 0X4F, 0X81, 0X52, 0X9E, 0XB, 0X3E, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XEE, 0, 0XDF, 0, 0, 0XDF, 0XC, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0X80, 0X1, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0XF, 0X7F, 0X7F, 0XF, 0X9A, 0X23, 0X8F, 0XEF, 0XC, 0XDF, 0XDF, 0XC, 0X11, 0XA, 0XEE, 0X31, 0, 0, 0, 0, 0, 0X28, 0X50, 0, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XF, 0X7F, 0X7F, 0XF, 0X9A, 0X23, 0X8F, 0XEF, 0XC, 0XDF, 0XDF, 0XC, 0X11, 0XA, 0XEE, 0X31, 0, 0, 0, 0, 0, 0X50, 0XA0, 0X40, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XF, 0X7F, 0X7F, 0XF, 0X9A, 0X23, 0X8F, 0XEF, 0XC, 0XDF, 0XDF, 0XC, 0X11, 0XA, 0XEE, 0X31, 0, 0, 0, 0, 0, 0XA0, 0X40, 0X81, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X7E07, 0, 0, 0, 0, 0, 0, 0 }, + { 0X2, 0X811, 0X9917, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X64, 0X1, 0X12, 0X33, 0X40, 0, 0X10, 0X1D, 0X68, 0X26, 0XA3, 0, 0X94, 0XFF, 0X3, 0XBA, 0, 0, 0XF, 0X67, 0X58, 0X3C, 0X24, 0XBC, 0X4A, 0X2F, 0, 0X1, 0XA, 0X80, 0, 0, 0X75, 0XC, 0X4, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0, 0X1, 0X1, 0XFE, 0XFA, 0XFD, 0XE, 0X24, 0X2E, 0X7, 0X7, 0XA, 0XD, 0XF, 0XF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X64, 0X1, 0X12, 0X33, 0X40, 0, 0X10, 0X1D, 0X68, 0X26, 0XA3, 0, 0X94, 0XFF, 0X3, 0XBA, 0, 0, 0XF, 0X67, 0X58, 0X3C, 0X24, 0XBC, 0X4A, 0X2F, 0, 0X1, 0XA, 0X80, 0, 0, 0X75, 0XC, 0X4, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0XFD, 0X3, 0XFB, 0X7, 0XF8, 0XA, 0XF5, 0XB, 0X74, 0X6, 0XF8, 0XB, 0XF2, 0X10, 0X6F, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X73, 0X4F, 0X4F, 0X97, 0X54, 0X8F, 0XF2, 0X1F, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XE5, 0, 0XDF, 0, 0, 0XDF, 0XF3, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0X80, 0X1, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0XBF, 0X7F, 0X7F, 0XBF, 0X9A, 0X23, 0X90, 0X65, 0XF3, 0XDF, 0XDF, 0XF3, 0X49, 0X9, 0XE5, 0X26, 0, 0, 0, 0, 0, 0X28, 0X50, 0, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XBF, 0X7F, 0X7F, 0XBF, 0X9A, 0X23, 0X90, 0X65, 0XF3, 0XDF, 0XDF, 0XF3, 0X49, 0X9, 0XE5, 0X26, 0, 0, 0, 0, 0, 0X50, 0XA0, 0X40, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XBF, 0X7F, 0X7F, 0XBF, 0X9A, 0X23, 0X90, 0X65, 0XF3, 0XDF, 0XDF, 0XF3, 0X49, 0X9, 0XE5, 0X26, 0, 0, 0, 0, 0, 0XA0, 0X40, 0X81, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X1E07, 0, 0, 0, 0, 0, 0, 0 } + }, + { + { 0X84, 0X3, 0XA, 0X33, 0X43, 0, 0X10, 0XC5, 0XAD, 0X10, 0X99, 0X17, 0X93, 0XA5, 0X3, 0XBA, 0, 0, 0X4, 0X7, 0X20, 0XC, 0X8, 0, 0, 0X1C, 0, 0X1, 0X2, 0X80, 0, 0, 0X75, 0XC, 0X4, 0X6D, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0, 0XFF, 0XFD, 0XFC, 0XFE, 0X6, 0X13, 0X1E, 0X23, 0XD, 0X8, 0XA, 0XB, 0XC, 0XC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X84, 0X3, 0XA, 0X33, 0X43, 0, 0X10, 0XC5, 0XAD, 0X10, 0X99, 0X17, 0X93, 0XA5, 0X3, 0XBA, 0, 0, 0X4, 0X7, 0X20, 0XC, 0X8, 0, 0, 0X1C, 0, 0X1, 0X2, 0X80, 0, 0, 0X75, 0XC, 0X4, 0X6D, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X2, 0X2, 0XFD, 0X6, 0XF8, 0XB, 0XF3, 0XF, 0X70, 0X5, 0XF9, 0XB, 0XF1, 0X11, 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X7D, 0X63, 0X63, 0X81, 0X69, 0X18, 0XBA, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X5A, 0, 0X57, 0, 0, 0X57, 0XBB, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0X80, 0X1, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0XF, 0X1F, 0X1F, 0XF, 0XE3, 0X34, 0X44, 0XBC, 0XBB, 0X57, 0X57, 0XBB, 0X52, 0X12, 0X5A, 0X48, 0, 0, 0, 0, 0, 0X32, 0X64, 0, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XF, 0X1F, 0X1F, 0XF, 0XE3, 0X34, 0X44, 0XBC, 0XBB, 0X57, 0X57, 0XBB, 0X52, 0X12, 0X5A, 0X48, 0, 0, 0, 0, 0, 0X64, 0XC8, 0X40, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XF, 0X1F, 0X1F, 0XF, 0XE3, 0X34, 0X44, 0XBC, 0XBB, 0X57, 0X57, 0XBB, 0X52, 0X12, 0X5A, 0X48, 0, 0, 0, 0, 0, 0XC8, 0X90, 0X81, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XCE07, 0, 0, 0, 0, 0, 0, 0 }, + { 0X2, 0X811, 0X817, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X84, 0X3, 0X2, 0X33, 0X40, 0, 0X10, 0X75, 0X7B, 0X34, 0XA3, 0, 0X94, 0XFF, 0X3, 0XBA, 0, 0, 0X8, 0XFD, 0XEF, 0X20, 0XC, 0X8C, 0X79, 0X26, 0, 0X1, 0X2, 0X80, 0, 0, 0X75, 0XC, 0X4, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0XFF, 0XFE, 0XFD, 0XFE, 0X2, 0XA, 0X13, 0X1A, 0X1D, 0XF, 0X8, 0X9, 0XA, 0XB, 0XB, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X84, 0X3, 0X2, 0X33, 0X40, 0, 0X10, 0X75, 0X7B, 0X34, 0XA3, 0, 0X94, 0XFF, 0X3, 0XBA, 0, 0, 0X8, 0XFD, 0XEF, 0X20, 0XC, 0X8C, 0X79, 0X26, 0, 0X1, 0X2, 0X80, 0, 0, 0X75, 0XC, 0X4, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0XFB, 0X4, 0XFB, 0X7, 0XF8, 0X9, 0XF6, 0XA, 0X74, 0X6, 0XF8, 0XB, 0XF2, 0X10, 0X6F, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X71, 0X63, 0X63, 0X95, 0X67, 0X90, 0X6F, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X57, 0, 0X57, 0, 0, 0X57, 0X70, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0X80, 0X1, 0X47, 0X1C, 0, 0 }, + { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, + { 0XAF, 0X1F, 0X1F, 0XAF, 0XDB, 0X33, 0X35, 0X7D, 0X70, 0X57, 0X57, 0X70, 0X52, 0X12, 0X58, 0X5B, 0, 0, 0, 0, 0, 0X32, 0X64, 0, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XAF, 0X1F, 0X1F, 0XAF, 0XDB, 0X33, 0X35, 0X7D, 0X70, 0X57, 0X57, 0X70, 0X52, 0X12, 0X58, 0X5B, 0, 0, 0, 0, 0, 0X64, 0XC8, 0X40, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0XAF, 0X1F, 0X1F, 0XAF, 0XDB, 0X33, 0X35, 0X7D, 0X70, 0X57, 0X57, 0X70, 0X52, 0X12, 0X58, 0X5B, 0, 0, 0, 0, 0, 0XC8, 0X90, 0X81, 0, 0, 0X80, 0X20, 0X80, 0, 0, 0 }, + { 0X7E07, 0, 0, 0, 0, 0, 0, 0 } + } +}; + +#endif /* _VIA_TV2_H_ */ diff --git a/src/via_tv3.h b/src/via_tv3.h new file mode 100644 index 0000000..8ccbd87 --- /dev/null +++ b/src/via_tv3.h @@ -0,0 +1,366 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_tv3.h,v 1.2 2003/08/27 15:16:13 tsi Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef _VIA_TV3_H_ +#define _VIA_TV3_H_ 1 + +static const VIABIOSTVMASKTableRec tv3MaskTable = { + { 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0, 0XFF, 0, 0, 0, 0, 0, 0, 0XFF, 0, 0XFF, 0, 0, 0XFF, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0, 0, 0, 0, 0, 0XFF, 0XFF, 0XFF, 0, 0, 0XFF, 0XFF, 0XFF, 0, 0, 0 }, + 0X3F, 0X38, 75, 13, 22 +}; + +static const VIABIOSTV3TableRec tv3Table[] = { + { + { 0X4, 0, 0, 0X2, 0X3, 0, 0X10, 0X7E, 0X9D, 0XD, 0X60, 0X17, 0X52, 0X45, 0XF, 0, 0, 0, 0XD0, 0X33, 0XBF, 0X3A, 0XF1, 0X91, 0X24, 0X25, 0XE9, 0X3, 0, 0X80, 0, 0X5, 0X12, 0XC, 0X4, 0X74, 0, 0X5A, 0X2F, 0X97, 0X50, 0, 0, 0XAA, 0X2B, 0X7A, 0XD8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XDC, 0X50, 0X4, 0, 0, 0X40, 0XF, 0X81, 0X23, 0X57, 0X2, 0XF, 0X29, 0X73, 0X23, 0X86, 0XC4, 0XEA, 0XDF, 0X5, 0X92, 0XA1, 0X4, 0, 0, 0X7F, 0X3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X5D, 0X4F, 0X4F, 0X81, 0X52, 0X9D, 0X56, 0X3E, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XE7, 0, 0XDF, 0, 0, 0XDF, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0XF, 0X7F, 0X7F, 0XF, 0X9A, 0X23, 0X8F, 0XE5, 0X57, 0XDF, 0XDF, 0X57, 0X11, 0XA, 0XE7, 0X21, 0, 0, 0, 0, 0, 0X28, 0X50, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XF, 0X7F, 0X7F, 0XF, 0X9A, 0X23, 0X8F, 0XE5, 0X57, 0XDF, 0XDF, 0X57, 0X11, 0XA, 0XE7, 0X21, 0, 0, 0, 0, 0, 0X50, 0XA0, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XF, 0X7F, 0X7F, 0XF, 0X9A, 0X23, 0X8F, 0XE5, 0X57, 0XDF, 0XDF, 0X57, 0X11, 0XA, 0XE7, 0X21, 0, 0, 0, 0, 0, 0XA0, 0X40, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X2A56, 0, 0, 0, 0, 0, 0, 0 }, + { 0X7, 0X2A02, 0XAF65, 0XAA66, 0XAA67, 0X9127, 0X9C2B, 0X272C, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X5065, 0X4B66, 0X4D67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X3, 0X811, 0XBE16, 0X8717, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0, 0, 0X82, 0, 0, 0X10, 0X3E, 0XA4, 0X37, 0X67, 0, 0X49, 0X49, 0XF, 0, 0, 0, 0XEC, 0X2A, 0XB8, 0X29, 0X2D, 0X77, 0X66, 0X2D, 0XED, 0X3, 0XA, 0X80, 0, 0X4, 0X12, 0XC, 0X4, 0X7B, 0, 0X64, 0X30, 0X93, 0X49, 0X5F, 0X15, 0XA5, 0X23, 0X7A, 0XCC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XF9, 0X50, 0X4, 0, 0, 0X45, 0XE7, 0X81, 0X23, 0X57, 0X2, 0X1F, 0X31, 0X75, 0X23, 0X8A, 0XC8, 0XF0, 0XFF, 0X5, 0XD7, 0X8E, 0X3, 0X7F, 0XCF, 0XBF, 0X3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X78, 0X4F, 0X4F, 0X9C, 0X55, 0X85, 0X56, 0XBA, 0, 0X40, 0, 0, 0, 0, 0, 0, 0X8, 0, 0XDF, 0, 0, 0XDF, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0XE7, 0X7F, 0X7F, 0XE7, 0X9A, 0X23, 0XA7, 0X97, 0X57, 0XDF, 0XDF, 0X57, 0X51, 0XA, 0X8, 0X50, 0, 0, 0, 0, 0, 0X28, 0X50, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XE7, 0X7F, 0X7F, 0XE7, 0X9A, 0X23, 0XA7, 0X97, 0X57, 0XDF, 0XDF, 0X57, 0X51, 0XA, 0X8, 0X50, 0, 0, 0, 0, 0, 0X50, 0XA0, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XE7, 0X7F, 0X7F, 0XE7, 0X9A, 0X23, 0XA7, 0X97, 0X57, 0XDF, 0XDF, 0X57, 0X51, 0XA, 0X8, 0X50, 0, 0, 0, 0, 0, 0XA0, 0X40, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X3256, 0, 0, 0, 0, 0, 0, 0 }, + { 0X7, 0X2A02, 0X8A65, 0X8666, 0X8667, 0X8D27, 0X962B, 0X202C, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X4265, 0X4966, 0X4967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + }, + { + { 0X84, 0, 0, 0X24, 0X3, 0, 0X10, 0XDE, 0XD4, 0XE, 0X59, 0X17, 0X46, 0X40, 0XF, 0, 0, 0, 0XEA, 0XD, 0X98, 0X1C, 0X96, 0X50, 0X5E, 0X1B, 0X3D, 0X3, 0X1, 0X80, 0, 0X85, 0XD, 0XA, 0X4, 0X74, 0, 0X5A, 0X41, 0X96, 0X6B, 0, 0, 0XAA, 0X2B, 0XA6, 0X1E, 0X10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XE4, 0X69, 0X4, 0, 0, 0X3F, 0X27, 0X21, 0X34, 0XED, 0X2, 0X27, 0XF5, 0X9D, 0X24, 0XB7, 0XD, 0X40, 0, 0X58, 0XB6, 0X3B, 0X5, 0, 0X1, 0XEF, 0X5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X80, 0X63, 0X63, 0X84, 0X69, 0X1A, 0XEC, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X5C, 0, 0X57, 0, 0, 0X57, 0XED, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0, 0X1E, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0X27, 0X1F, 0X1F, 0X27, 0XE3, 0X34, 0X49, 0XCD, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X5D, 0X55, 0, 0, 0, 0, 0, 0X32, 0X64, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X27, 0X1F, 0X1F, 0X27, 0XE3, 0X34, 0X49, 0XCD, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X5D, 0X55, 0, 0, 0, 0, 0, 0X64, 0XC8, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X27, 0X1F, 0X1F, 0X27, 0XE3, 0X34, 0X49, 0XCD, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X5D, 0X55, 0, 0, 0, 0, 0, 0XC8, 0X90, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XDE07, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0X2A02, 0X9365, 0X9066, 0X9067, 0X9127, 0X9C2B, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X4365, 0X4A66, 0X4967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X3, 0X811, 0X1216, 0X4917, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X84, 0, 0, 0XA4, 0, 0, 0X19, 0X66, 0XBF, 0X12, 0X60, 0, 0X56, 0X45, 0XF, 0, 0, 0, 0XEC, 0X15, 0XFD, 0X28, 0XE4, 0X7D, 0X7A, 0X27, 0X16, 0X3, 0X1, 0X80, 0, 0X85, 0X10, 0XC, 0X4, 0X7B, 0, 0X64, 0X37, 0X93, 0X54, 0X5F, 0X15, 0XA5, 0X23, 0X8F, 0XF4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XE7, 0X45, 0X4, 0, 0, 0X44, 0X97, 0X21, 0X33, 0XED, 0X2, 0X97, 0X87, 0X87, 0X23, 0X9F, 0XE7, 0X16, 0XE7, 0X16, 0XCC, 0XF3, 0X4, 0, 0X1, 0X4F, 0X4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6E, 0X63, 0X63, 0X92, 0X66, 0X8E, 0XEC, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X5C, 0, 0X57, 0, 0, 0X57, 0XED, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0X97, 0X1F, 0X1F, 0X97, 0XDB, 0X33, 0X36, 0X80, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X5D, 0X5C, 0, 0, 0, 0, 0, 0X32, 0X64, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X97, 0X1F, 0X1F, 0X97, 0XDB, 0X33, 0X36, 0X80, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X5D, 0X5C, 0, 0, 0, 0, 0, 0X64, 0XC8, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X97, 0X1F, 0X1F, 0X97, 0XDB, 0X33, 0X36, 0X80, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X5D, 0X5C, 0, 0, 0, 0, 0, 0XC8, 0X90, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X6607, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X2A02, 0XB865, 0XB466, 0XB467, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X5865, 0X5E66, 0X5E67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + }, + { + { 0X84, 0, 0, 0X44, 0X3, 0, 0X10, 0X80, 0X15, 0XA, 0X58, 0X17, 0X5B, 0X40, 0XF, 0, 0, 0, 0XE9, 0X1E, 0X9D, 0X19, 0XD6, 0X66, 0XEB, 0X14, 0X9C, 0X3, 0X5, 0X80, 0, 0X85, 0XA, 0X5, 0X4, 0X74, 0, 0X5A, 0X56, 0X96, 0X8B, 0, 0, 0XAA, 0X2B, 0XDA, 0X79, 0X10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XDA, 0X50, 0X4, 0, 0, 0X3F, 0X87, 0XFF, 0X34, 0XB0, 0X3, 0X6F, 0XDB, 0XCD, 0X35, 0XF1, 0X5E, 0XA5, 0X7E, 0X5A, 0X33, 0X26, 0X7, 0, 0X1, 0X27, 0X8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X8C, 0X7F, 0X7F, 0X90, 0X81, 0X8, 0XAF, 0XF5, 0, 0X60, 0, 0, 0, 0, 0, 0, 0XC, 0, 0XFF, 0, 0, 0XFF, 0XB0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0, 0X12, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0X87, 0XFF, 0XFF, 0X87, 0X23, 0X34, 0X9, 0X38, 0XB0, 0XFF, 0XFF, 0XB0, 0X9A, 0X13, 0X14, 0X7A, 0, 0, 0, 0, 0, 0X40, 0X80, 0, 0, 0, 0X80, 0, 0X9C, 0, 0, 0 }, + { 0X87, 0XFF, 0XFF, 0X87, 0X23, 0X34, 0X9, 0X38, 0XB0, 0XFF, 0XFF, 0XB0, 0X9A, 0X13, 0X14, 0X7A, 0, 0, 0, 0, 0, 0X80, 0, 0X41, 0, 0, 0X80, 0, 0X9C, 0, 0, 0 }, + { 0X87, 0XFF, 0XFF, 0X87, 0X23, 0X34, 0X9, 0X38, 0XB0, 0XFF, 0XFF, 0XB0, 0X9A, 0X13, 0X14, 0X7A, 0, 0, 0, 0, 0, 0, 0, 0X86, 0, 0, 0X80, 0, 0X9C, 0, 0, 0 }, + { 0X7F07, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0X2A02, 0XC265, 0XBE66, 0XBE67, 0X9127, 0X9C2B, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X5865, 0X4B66, 0X4A67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X3, 0X811, 0X1816, 0X6117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X84, 0, 0, 0XC0, 0, 0, 0X10, 0XA0, 0X2A, 0X38, 0X70, 0, 0X4E, 0X50, 0XF, 0, 0, 0, 0XE4, 0X23, 0XD1, 0XC, 0X72, 0XC3, 0X8C, 0X1A, 0X96, 0X3, 0X7, 0X80, 0, 0X85, 0XC, 0XC, 0X4, 0X7B, 0, 0X64, 0X53, 0X90, 0X7B, 0X5B, 0X15, 0XA0, 0X22, 0XD1, 0X71, 0X10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XDD, 0X60, 0X4, 0, 0, 0X45, 0XAF, 0XFF, 0X34, 0XB5, 0X3, 0X57, 0XA8, 0XC8, 0X35, 0XEC, 0X4C, 0XCC, 0X67, 0X5A, 0X14, 0X5C, 0X6, 0, 0X1, 0X1F, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X91, 0X7F, 0X7F, 0X95, 0X82, 0XB, 0XB4, 0XF5, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X3D, 0, 0XFF, 0, 0, 0XFF, 0XB5, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0, 0X1E, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0XAF, 0XFF, 0XFF, 0XAF, 0X23, 0X34, 0X58, 0X80, 0XB5, 0XFF, 0XFF, 0XB5, 0X9A, 0X13, 0X3C, 0X64, 0, 0, 0, 0, 0, 0X40, 0X80, 0, 0, 0, 0X80, 0, 0X81, 0, 0, 0 }, + { 0XAF, 0XFF, 0XFF, 0XAF, 0X23, 0X34, 0X58, 0X80, 0XB5, 0XFF, 0XFF, 0XB5, 0X9A, 0X13, 0X3C, 0X64, 0, 0, 0, 0, 0, 0X80, 0, 0X41, 0, 0, 0X80, 0, 0X81, 0, 0, 0 }, + { 0XAF, 0XFF, 0XFF, 0XAF, 0X23, 0X34, 0X58, 0X80, 0XB5, 0XFF, 0XFF, 0XB5, 0X9A, 0X13, 0X3C, 0X64, 0, 0, 0, 0, 0, 0, 0, 0X86, 0, 0, 0X80, 0, 0X81, 0, 0, 0 }, + { 0X5807, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0X2A02, 0XA965, 0XA666, 0XA667, 0X9027, 0X992B, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X5165, 0X4966, 0X4967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + }, + { + { 0X84, 0, 0, 0X24, 0X3, 0, 0X10, 0X46, 0XCC, 0XE, 0X56, 0X17, 0X43, 0X3E, 0XF, 0, 0, 0, 0XE8, 0X29, 0X67, 0X19, 0X63, 0XA8, 0X3C, 0X1D, 0X29, 0X3, 0XB, 0X80, 0, 0X85, 0XE, 0X8, 0X4, 0X74, 0, 0X5A, 0X3D, 0X96, 0X64, 0, 0, 0XAA, 0X2B, 0X9C, 0X17, 0X10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XDC, 0X50, 0, 0, 0, 0X40, 0XAF, 0X51, 0X34, 0X44, 0X2, 0XE3, 0XC1, 0X93, 0X23, 0XAD, 0XFD, 0X2B, 0X7C, 0X17, 0X6D, 0XCA, 0X4, 0, 0X1, 0X2F, 0X5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X91, 0X69, 0X69, 0X95, 0X6D, 0X1, 0X43, 0X3E, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XEF, 0, 0XDF, 0, 0, 0XDF, 0X44, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0XAF, 0X4F, 0X4F, 0XAF, 0XE3, 0X34, 0X67, 0XA4, 0X44, 0XDF, 0XDF, 0X44, 0X51, 0XA, 0XEF, 0X24, 0, 0, 0, 0, 0, 0X35, 0X6A, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XAF, 0X4F, 0X4F, 0XAF, 0XE3, 0X34, 0X67, 0XA4, 0X44, 0XDF, 0XDF, 0X44, 0X51, 0XA, 0XEF, 0X24, 0, 0, 0, 0, 0, 0X6A, 0XD4, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XAF, 0X4F, 0X4F, 0XAF, 0XE3, 0X34, 0X67, 0XA4, 0X44, 0XDF, 0XDF, 0X44, 0X51, 0XA, 0XEF, 0X24, 0, 0, 0, 0, 0, 0XD4, 0XA8, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XC556, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0X2A02, 0X9465, 0X9066, 0X9167, 0X9127, 0X9C2B, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X4465, 0X4566, 0X4567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X3, 0X811, 0X5B16, 0XA017, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0, 0, 0XC2, 0, 0, 0X10, 0X47, 0XE4, 0X9, 0X64, 0, 0X4F, 0X48, 0XF, 0, 0, 0, 0XE7, 0X5, 0X2C, 0X1C, 0X18, 0X28, 0X87, 0X1F, 0X5E, 0X3, 0X9, 0X80, 0, 0X84, 0XA, 0XC, 0X4, 0X7B, 0, 0X64, 0X46, 0X93, 0X68, 0X5F, 0X15, 0XA5, 0X23, 0XB4, 0X2A, 0X10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XE7, 0X45, 0X4, 0, 0, 0X43, 0XAF, 0X51, 0X34, 0X57, 0X2, 0X7F, 0X4F, 0XA9, 0X34, 0XD1, 0X2B, 0X5D, 0XAA, 0X58, 0XD7, 0X1, 0X3, 0, 0X1, 0X7F, 0X4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X91, 0X69, 0X69, 0X95, 0X6D, 0X1, 0X56, 0X3E, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XF2, 0, 0XDF, 0, 0, 0XDF, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0, 0X8, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0XAF, 0X4F, 0X4F, 0XAF, 0XE3, 0X34, 0X67, 0XA3, 0X57, 0XDF, 0XDF, 0X57, 0X51, 0XA, 0XF2, 0X2B, 0, 0, 0, 0, 0, 0X35, 0X6A, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XAF, 0X4F, 0X4F, 0XAF, 0XE3, 0X34, 0X67, 0XA3, 0X57, 0XDF, 0XDF, 0X57, 0X51, 0XA, 0XF2, 0X2B, 0, 0, 0, 0, 0, 0X6A, 0XD4, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XAF, 0X4F, 0X4F, 0XAF, 0XE3, 0X34, 0X67, 0XA3, 0X57, 0XDF, 0XDF, 0X57, 0X51, 0XA, 0XF2, 0X2B, 0, 0, 0, 0, 0, 0XD4, 0XA8, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X4707, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X2A02, 0XA465, 0XA066, 0XA167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X5065, 0X4966, 0X4967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + }, + { + { 0X4, 0, 0, 0X26, 0X3, 0, 0X10, 0X6D, 0XC3, 0X8, 0X56, 0X17, 0X43, 0X3E, 0XF, 0, 0, 0, 0XD, 0X7, 0X60, 0X34, 0X18, 0X55, 0X55, 0X1E, 0X1E, 0X3, 0X3, 0X80, 0, 0X85, 0XF, 0X8, 0X4, 0X74, 0, 0X5A, 0X39, 0X95, 0X5E, 0, 0, 0XAA, 0X2B, 0X92, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XE4, 0X69, 0X4, 0, 0, 0X40, 0X47, 0XD1, 0X23, 0X57, 0X2, 0XBF, 0XAF, 0X8D, 0X23, 0XA4, 0XF3, 0X20, 0X36, 0X17, 0X92, 0X33, 0X4, 0, 0, 0XBF, 0X3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X64, 0X59, 0X59, 0X88, 0X5B, 0X81, 0X56, 0X3E, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XFF, 0, 0XDF, 0, 0, 0XDF, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0, 0X4, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0X47, 0XCF, 0XCF, 0X47, 0X9A, 0X23, 0XD9, 0XA, 0X57, 0XDF, 0XDF, 0X57, 0X51, 0XA, 0XFF, 0X3B, 0, 0, 0, 0, 0, 0X2D, 0X5A, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X47, 0XCF, 0XCF, 0X47, 0X9A, 0X23, 0XD9, 0XA, 0X57, 0XDF, 0XDF, 0X57, 0X51, 0XA, 0XFF, 0X3B, 0, 0, 0, 0, 0, 0X5A, 0XB4, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X47, 0XCF, 0XCF, 0X47, 0X9A, 0X23, 0XD9, 0XA, 0X57, 0XDF, 0XDF, 0X57, 0X51, 0XA, 0XFF, 0X3B, 0, 0, 0, 0, 0, 0XB4, 0X68, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X6E07, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0X2A02, 0X9465, 0X9066, 0X9067, 0X9127, 0X9C2B, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X4265, 0X4966, 0X4867, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X3, 0X811, 0XC316, 0X4C17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + }, + { + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0, 0, 0XA2, 0, 0, 0X10, 0X1E, 0XAC, 0X38, 0X67, 0, 0X57, 0X49, 0XF, 0, 0, 0, 0XF0, 0XF, 0XD1, 0X38, 0X32, 0X98, 0X83, 0X2D, 0XF2, 0X3, 0X2, 0X80, 0, 0X84, 0X13, 0XC, 0X4, 0X7B, 0X48, 0X64, 0X30, 0X93, 0X49, 0X5F, 0X15, 0XA5, 0X23, 0X8B, 0XBD, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XE7, 0X45, 0X4, 0, 0, 0X45, 0XF7, 0XD1, 0X22, 0XED, 0X2, 0X1D, 0X29, 0X75, 0X23, 0X88, 0XC6, 0XF0, 0XFA, 0XF, 0XCC, 0X30, 0X14, 0, 0, 0X8F, 0X3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X5A, 0X59, 0X59, 0X9E, 0X5B, 0X1D, 0XEC, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X7B, 0, 0X3F, 0, 0, 0X3F, 0XED, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0XF7, 0XCF, 0XCF, 0XF7, 0X92, 0X22, 0XDE, 0XE4, 0XED, 0X3F, 0X3F, 0XED, 0X12, 0X12, 0X82, 0X5F, 0, 0, 0, 0, 0, 0X2D, 0X5A, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XF7, 0XCF, 0XCF, 0XF7, 0X92, 0X22, 0XDE, 0XE4, 0XED, 0X3F, 0X3F, 0XED, 0X12, 0X12, 0X82, 0X5F, 0, 0, 0, 0, 0, 0X5A, 0XB4, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XF7, 0XCF, 0XCF, 0XF7, 0X92, 0X22, 0XDE, 0XE4, 0XED, 0X3F, 0X3F, 0XED, 0X12, 0X12, 0X82, 0X5F, 0, 0, 0, 0, 0, 0XB4, 0X68, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X2B56, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X2A02, 0XB565, 0XB166, 0XB167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X5965, 0X4D66, 0X4A67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + } +}; + +static const VIABIOSTV3TableRec tv3OverTable[] = { + { + { 0X4, 0, 0, 0X2, 0X3, 0, 0X10, 0X48, 0X72, 0XA, 0X60, 0X17, 0X52, 0X45, 0XF, 0, 0, 0, 0XED, 0X23, 0X80, 0X35, 0X5E, 0XAA, 0XEA, 0X25, 0XE9, 0X3, 0X2, 0X80, 0, 0X5, 0X12, 0XC, 0X4, 0X75, 0, 0X5A, 0X2F, 0X97, 0X50, 0, 0, 0XAA, 0X2B, 0X7A, 0XD8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XC4, 0X50, 0X4, 0, 0, 0X41, 0XCF, 0X7F, 0X22, 0X2F, 0X2, 0XFF, 0X7F, 0X71, 0X22, 0X83, 0XC0, 0XE5, 0XC0, 0X5, 0X44, 0, 0X4, 0, 0, 0XFF, 0X2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X55, 0X4F, 0X4F, 0X99, 0X51, 0X18, 0X2E, 0X3E, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XE7, 0, 0XDF, 0, 0, 0XDF, 0X2F, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0XCF, 0X7F, 0X7F, 0XCF, 0X92, 0X22, 0X87, 0XBC, 0X2F, 0XDF, 0XDF, 0X2F, 0X11, 0XA, 0XFF, 0X24, 0, 0, 0, 0, 0, 0X28, 0X50, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XCF, 0X7F, 0X7F, 0XCF, 0X92, 0X22, 0X87, 0XBC, 0X2F, 0XDF, 0XDF, 0X2F, 0X11, 0XA, 0XFF, 0X24, 0, 0, 0, 0, 0, 0X50, 0XA0, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XCF, 0X7F, 0X7F, 0XCF, 0X92, 0X22, 0X87, 0XBC, 0X2F, 0XDF, 0XDF, 0X2F, 0X11, 0XA, 0XFF, 0X24, 0, 0, 0, 0, 0, 0XA0, 0X40, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X7107, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X2A02, 0XAD65, 0XA966, 0XA967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X4F65, 0X4966, 0X4967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X3, 0X811, 0XF416, 0X9F17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0, 0, 0X82, 0, 0, 0X10, 0XB0, 0X39, 0X39, 0X67, 0, 0X48, 0X4A, 0XF, 0, 0, 0, 0X2C, 0X5, 0X2C, 0X30, 0XBC, 0X44, 0XC, 0X36, 0XC8, 0X3, 0X2, 0X80, 0, 0X5, 0X15, 0XC, 0X4, 0X7B, 0, 0X64, 0X28, 0X93, 0X3E, 0X5F, 0X15, 0XA5, 0X23, 0X65, 0XCC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XF9, 0X50, 0X4, 0, 0, 0X45, 0X47, 0X7F, 0X23, 0XF3, 0X1, 0X9F, 0X7F, 0X62, 0X22, 0X72, 0XA7, 0XCB, 0X5, 0X5, 0X33, 0, 0X3, 0, 0, 0X9F, 0X2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X64, 0X4F, 0X4F, 0X88, 0X53, 0X83, 0XF2, 0X1F, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XE5, 0, 0XDF, 0, 0, 0XDF, 0XF3, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0X47, 0X7F, 0X7F, 0X47, 0X9A, 0X23, 0X95, 0X1A, 0XF3, 0XDF, 0XDF, 0XF3, 0X49, 0X9, 0XE2, 0X29, 0, 0, 0, 0, 0, 0X28, 0X50, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X47, 0X7F, 0X7F, 0X47, 0X9A, 0X23, 0X95, 0X1A, 0XF3, 0XDF, 0XDF, 0XF3, 0X49, 0X9, 0XE2, 0X29, 0, 0, 0, 0, 0, 0X50, 0XA0, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X47, 0X7F, 0X7F, 0X47, 0X9A, 0X23, 0X95, 0X1A, 0XF3, 0XDF, 0XDF, 0XF3, 0X49, 0X9, 0XE2, 0X29, 0, 0, 0, 0, 0, 0XA0, 0X40, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X8107, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0X2A02, 0X8A65, 0X8666, 0X8667, 0X9027, 0X992B, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X4265, 0X4966, 0X4967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + }, + { + { 0X84, 0, 0, 0X24, 0X3, 0, 0X10, 0XEF, 0XB0, 0XA, 0X5A, 0X17, 0X46, 0X40, 0XF, 0, 0, 0, 0XE8, 0X32, 0XC3, 0X19, 0XE0, 0XCE, 0X61, 0X1C, 0X33, 0X3, 0X1, 0X80, 0, 0X85, 0XD, 0XA, 0X4, 0X75, 0, 0X5A, 0X41, 0X96, 0X68, 0, 0, 0XAA, 0X2B, 0X9E, 0X1E, 0X10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XE4, 0X69, 0X4, 0, 0, 0X40, 0X37, 0X21, 0X34, 0X98, 0X2, 0X1, 0X21, 0X97, 0X34, 0XB1, 0XFF, 0X34, 0XB6, 0X17, 0X11, 0, 0X5, 0, 0X1, 0X57, 0X5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X82, 0X63, 0X63, 0X86, 0X69, 0X1B, 0X97, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X59, 0, 0X57, 0, 0, 0X57, 0X98, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0X37, 0X1F, 0X1F, 0X37, 0XE3, 0X34, 0X4A, 0X8B, 0X98, 0X57, 0X57, 0X98, 0X52, 0X12, 0X59, 0X48, 0, 0, 0, 0, 0, 0X32, 0X64, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X37, 0X1F, 0X1F, 0X37, 0XE3, 0X34, 0X4A, 0X8B, 0X98, 0X57, 0X57, 0X98, 0X52, 0X12, 0X59, 0X48, 0, 0, 0, 0, 0, 0X64, 0XC8, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X37, 0X1F, 0X1F, 0X37, 0XE3, 0X34, 0X4A, 0X8B, 0X98, 0X57, 0X57, 0X98, 0X52, 0X12, 0X59, 0X48, 0, 0, 0, 0, 0, 0XC8, 0X90, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XF107, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X2A02, 0X9365, 0X9066, 0X9067, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X4265, 0X4566, 0X4567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X3, 0X811, 0X1416, 0XC717, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X84, 0, 0, 0XA0, 0, 0, 0X19, 0XA6, 0X9F, 0X38, 0X60, 0, 0X57, 0X45, 0XF, 0, 0, 0, 0XC8, 0X12, 0X8F, 0X1C, 0X57, 0X8D, 0XE9, 0X27, 0XE, 0X3, 0X3, 0X80, 0, 0X85, 0X10, 0XC, 0X4, 0X7B, 0, 0X64, 0X37, 0X93, 0X54, 0X5F, 0X15, 0XA5, 0X23, 0X8B, 0XF4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XE9, 0X50, 0X4, 0, 0, 0X44, 0XE7, 0X1F, 0X33, 0X89, 0X2, 0X8D, 0XBC, 0X85, 0X23, 0X9C, 0XE4, 0X13, 0XD4, 0X16, 0X28, 0X90, 0X4, 0, 0X1, 0XF, 0X4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X78, 0X63, 0X63, 0X9C, 0X68, 0X94, 0X88, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X58, 0, 0X57, 0, 0, 0X57, 0X89, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0XE7, 0X1F, 0X1F, 0XE7, 0XDB, 0X33, 0X3E, 0XA2, 0X89, 0X57, 0X57, 0X89, 0X52, 0X12, 0X58, 0X46, 0, 0, 0, 0, 0, 0X32, 0X64, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XE7, 0X1F, 0X1F, 0XE7, 0XDB, 0X33, 0X3E, 0XA2, 0X89, 0X57, 0X57, 0X89, 0X52, 0X12, 0X58, 0X46, 0, 0, 0, 0, 0, 0X64, 0XC8, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XE7, 0X1F, 0X1F, 0XE7, 0XDB, 0X33, 0X3E, 0XA2, 0X89, 0X57, 0X57, 0X89, 0X52, 0X12, 0X58, 0X46, 0, 0, 0, 0, 0, 0XC8, 0X90, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XAF07, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0X2A02, 0XB865, 0XB466, 0XB467, 0X9027, 0X992B, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X5865, 0X4866, 0X4867, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + }, + { + { 0X84, 0, 0, 0X44, 0X3, 0, 0X10, 0XA0, 0XAA, 0X5, 0X57, 0X17, 0X5C, 0X3F, 0XF, 0, 0, 0, 0XE8, 0X33, 0X1A, 0X16, 0XE, 0X44, 0X44, 0X18, 0X66, 0X3, 0X1, 0X80, 0, 0X85, 0XA, 0X5, 0X4, 0X74, 0, 0X5A, 0X4B, 0X96, 0X79, 0, 0, 0XAA, 0X2B, 0XB9, 0X4B, 0X10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XE4, 0X50, 0X4, 0, 0, 0X40, 0XAF, 0XFF, 0X34, 0X47, 0X3, 0XAF, 0XFF, 0XB1, 0X34, 0XD1, 0X30, 0X68, 0XB, 0X59, 0X66, 0, 0X6, 0, 0X1, 0X7F, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X91, 0X7F, 0X7F, 0X95, 0X82, 0XB, 0X46, 0XF5, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X4, 0, 0XFF, 0, 0, 0XFF, 0X47, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0, 0X16, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0XAF, 0XFF, 0XFF, 0XAF, 0X23, 0X34, 0XC, 0X49, 0X47, 0XFF, 0XFF, 0X47, 0X9A, 0X13, 0X4, 0X7A, 0, 0, 0, 0, 0, 0X40, 0X80, 0, 0, 0, 0X80, 0, 0X9C, 0, 0, 0 }, + { 0XAF, 0XFF, 0XFF, 0XAF, 0X23, 0X34, 0XC, 0X49, 0X47, 0XFF, 0XFF, 0X47, 0X9A, 0X13, 0X4, 0X7A, 0, 0, 0, 0, 0, 0X80, 0, 0X41, 0, 0, 0X80, 0, 0X9C, 0, 0, 0 }, + { 0XAF, 0XFF, 0XFF, 0XAF, 0X23, 0X34, 0XC, 0X49, 0X47, 0XFF, 0XFF, 0X47, 0X9A, 0X13, 0X4, 0X7A, 0, 0, 0, 0, 0, 0, 0, 0X86, 0, 0, 0X80, 0, 0X9C, 0, 0, 0 }, + { 0XA807, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X2A02, 0XC265, 0XBE66, 0XBE67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X5765, 0X4566, 0X4567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X3, 0X811, 0X6316, 0X3D17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X84, 0, 0, 0XC0, 0, 0, 0X10, 0XA8, 0XC5, 0X36, 0X5D, 0, 0X4E, 0X43, 0XF, 0, 0, 0, 0XC9, 0XA, 0X79, 0X1C, 0X38, 0XE, 0X7B, 0X1D, 0X6E, 0X3, 0X3, 0X80, 0, 0X85, 0XC, 0XC, 0X4, 0X7B, 0, 0X64, 0X4B, 0X93, 0X6F, 0X5F, 0X15, 0XA5, 0X23, 0XBE, 0X5A, 0X10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XDD, 0X60, 0X4, 0, 0, 0X43, 0XAF, 0XFF, 0X34, 0X38, 0X3, 0XCF, 0XDF, 0XB4, 0X34, 0XD6, 0X35, 0X75, 0X47, 0X59, 0X47, 0X20, 0X5, 0, 0X1, 0X2F, 0X6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X91, 0X7F, 0X7F, 0X95, 0X81, 0XB, 0X37, 0XF5, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X3, 0, 0XFF, 0, 0, 0XFF, 0X38, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0, 0X1E, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0XAF, 0XFF, 0XFF, 0XAF, 0X23, 0X34, 0XC, 0X49, 0X38, 0XFF, 0XFF, 0X38, 0X9A, 0X13, 0X3, 0X6C, 0, 0, 0, 0, 0, 0X40, 0X80, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XAF, 0XFF, 0XFF, 0XAF, 0X23, 0X34, 0XC, 0X49, 0X38, 0XFF, 0XFF, 0X38, 0X9A, 0X13, 0X3, 0X6C, 0, 0, 0, 0, 0, 0X80, 0, 0X41, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XAF, 0XFF, 0XFF, 0XAF, 0X23, 0X34, 0XC, 0X49, 0X38, 0XFF, 0XFF, 0X38, 0X9A, 0X13, 0X3, 0X6C, 0, 0, 0, 0, 0, 0, 0, 0X86, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XAD07, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0X2A02, 0XA965, 0XA666, 0XA667, 0X9027, 0X992B, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X5165, 0X4966, 0X4967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + }, + { + { 0X84, 0, 0, 0X44, 0X3, 0, 0X10, 0X96, 0XA7, 0X8, 0X5B, 0X17, 0X46, 0X40, 0XF, 0, 0, 0, 0XE8, 0X3C, 0X2D, 0X22, 0XA1, 0X64, 0X93, 0X1B, 0X3D, 0X3, 0X1, 0X80, 0, 0X85, 0XD, 0X8, 0X4, 0X75, 0, 0X5A, 0X41, 0X96, 0X69, 0, 0, 0XAA, 0X2B, 0XA2, 0X24, 0X10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XDC, 0X50, 0, 0, 0, 0X40, 0XEF, 0X51, 0X33, 0X25, 0X2, 0X1F, 0X4D, 0X9C, 0X34, 0XB5, 0XC, 0X3D, 0XF1, 0X57, 0X30, 0X1, 0X4, 0, 0X1, 0X1F, 0X4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X79, 0X69, 0X69, 0X9D, 0X6B, 0X94, 0X24, 0X3E, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XEA, 0, 0XDF, 0, 0, 0XDF, 0X25, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0XEF, 0X4F, 0X4F, 0XEF, 0XDB, 0X33, 0X59, 0XA3, 0X25, 0XDF, 0XDF, 0X25, 0X51, 0XA, 0XEA, 0X39, 0, 0, 0, 0, 0, 0X35, 0X6A, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XEF, 0X4F, 0X4F, 0XEF, 0XDB, 0X33, 0X59, 0XA3, 0X25, 0XDF, 0XDF, 0X25, 0X51, 0XA, 0XEA, 0X39, 0, 0, 0, 0, 0, 0X6A, 0XD4, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XEF, 0X4F, 0X4F, 0XEF, 0XDB, 0X33, 0X59, 0XA3, 0X25, 0XDF, 0XDF, 0X25, 0X51, 0XA, 0XEA, 0X39, 0, 0, 0, 0, 0, 0XD4, 0XA8, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X9807, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X2A02, 0XC065, 0XBC66, 0XBC67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X5865, 0X4566, 0X4567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X3, 0X811, 0X6716, 0X3017, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X84, 0, 0, 0XC0, 0, 0, 0X10, 0X47, 0XA8, 0X39, 0X64, 0, 0X4E, 0X46, 0XF, 0, 0, 0, 0XEA, 0X15, 0XF2, 0X28, 0XEC, 0XE5, 0X64, 0X22, 0X39, 0X3, 0XB, 0X80, 0, 0X84, 0XF, 0XC, 0X4, 0X7B, 0, 0X64, 0X40, 0X93, 0X5F, 0X5F, 0X15, 0XA5, 0X23, 0XA3, 0X2A, 0X10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XE7, 0X45, 0X4, 0, 0, 0X43, 0XAF, 0X4F, 0X34, 0X25, 0X2, 0X1F, 0X4F, 0X9B, 0X34, 0XB7, 0XA, 0X3F, 0XF0, 0X57, 0X85, 0, 0X3, 0, 0X1, 0X1F, 0X4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X91, 0X69, 0X69, 0X95, 0X6D, 0X1, 0X24, 0X3E, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XEA, 0, 0XDF, 0, 0, 0XDF, 0X25, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0XAF, 0X4F, 0X4F, 0XAF, 0XE3, 0X34, 0X66, 0XA3, 0X25, 0XDF, 0XDF, 0X25, 0X51, 0XA, 0XEA, 0X39, 0, 0, 0, 0, 0, 0X35, 0X6A, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XAF, 0X4F, 0X4F, 0XAF, 0XE3, 0X34, 0X66, 0XA3, 0X25, 0XDF, 0XDF, 0X25, 0X51, 0XA, 0XEA, 0X39, 0, 0, 0, 0, 0, 0X6A, 0XD4, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XAF, 0X4F, 0X4F, 0XAF, 0XE3, 0X34, 0X66, 0XA3, 0X25, 0XDF, 0XDF, 0X25, 0X51, 0XA, 0XEA, 0X39, 0, 0, 0, 0, 0, 0XD4, 0XA8, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X4707, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0X2A02, 0XA465, 0XA166, 0XA167, 0X9027, 0X992B, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X4E65, 0X4966, 0X4967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + }, + { + { 0X4, 0, 0, 0X2, 0X3, 0, 0X10, 0X18, 0X28, 0X9, 0X5B, 0X17, 0X46, 0X41, 0XF, 0, 0, 0, 0XEE, 0XD, 0XA0, 0X38, 0X1D, 0X66, 0X66, 0X24, 0XEE, 0X3, 0X2, 0X80, 0, 0X85, 0X11, 0X8, 0X4, 0X75, 0, 0X5A, 0X31, 0X95, 0X51, 0, 0, 0XAA, 0X2B, 0X7A, 0XDB, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XE4, 0X69, 0X4, 0, 0, 0X40, 0X1F, 0XCF, 0X23, 0XC, 0X2, 0X1F, 0XCF, 0X76, 0X23, 0X88, 0XC9, 0XEF, 0XFF, 0X5, 0, 0, 0, 0, 0, 0X1F, 0X3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X5F, 0X59, 0X59, 0X83, 0X5B, 0X9F, 0XB, 0X3E, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XE0, 0, 0XDF, 0, 0, 0XDF, 0XC, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0X1F, 0XCF, 0XCF, 0X1F, 0X9A, 0X23, 0XD6, 0XF6, 0XC, 0XDF, 0XDF, 0XC, 0X11, 0XA, 0XE1, 0X28, 0, 0, 0, 0, 0, 0X2D, 0X5A, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X1F, 0XCF, 0XCF, 0X1F, 0X9A, 0X23, 0XD6, 0XF6, 0XC, 0XDF, 0XDF, 0XC, 0X11, 0XA, 0XE1, 0X28, 0, 0, 0, 0, 0, 0X5A, 0XB4, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X1F, 0XCF, 0XCF, 0X1F, 0X9A, 0X23, 0XD6, 0XF6, 0XC, 0XDF, 0XDF, 0XC, 0X11, 0XA, 0XE1, 0X28, 0, 0, 0, 0, 0, 0XB4, 0X68, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X4707, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X2A02, 0XAB65, 0XA766, 0XA767, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X4D65, 0X4966, 0X4967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X3, 0X811, 0X1E16, 0X5C17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + }, + { + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0, 0, 0XA6, 0, 0, 0X10, 0X10, 0X7D, 0X32, 0X60, 0, 0X57, 0X46, 0XF, 0, 0, 0, 0XEC, 0X15, 0XDC, 0X28, 0X2D, 0X77, 0X66, 0X2D, 0XEE, 0X3, 0XA, 0X80, 0, 0X84, 0X13, 0XC, 0X4, 0X7B, 0X48, 0X64, 0X30, 0X93, 0X49, 0X5F, 0X15, 0XA5, 0X23, 0X77, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XE7, 0X45, 0X4, 0, 0, 0X45, 0XE7, 0XCF, 0X23, 0X57, 0X2, 0X1F, 0X80, 0X75, 0X23, 0X89, 0XC7, 0XF1, 0XFF, 0X5, 0XD7, 0X80, 0X3, 0, 0, 0XBF, 0X3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X78, 0X59, 0X59, 0X9C, 0X5B, 0X8C, 0X56, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X40, 0, 0X3F, 0, 0, 0X3F, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0XE7, 0XCF, 0XCF, 0XE7, 0X9A, 0X23, 0XD7, 0XC, 0X57, 0X3F, 0X3F, 0X57, 0X52, 0X12, 0X40, 0X43, 0, 0, 0, 0, 0, 0X2D, 0X5A, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XE7, 0XCF, 0XCF, 0XE7, 0X9A, 0X23, 0XD7, 0XC, 0X57, 0X3F, 0X3F, 0X57, 0X52, 0X12, 0X40, 0X43, 0, 0, 0, 0, 0, 0X5A, 0XB4, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XE7, 0XCF, 0XCF, 0XE7, 0X9A, 0X23, 0XD7, 0XC, 0X57, 0X3F, 0X3F, 0X57, 0X52, 0X12, 0X40, 0X43, 0, 0, 0, 0, 0, 0XB4, 0X68, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XF07, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0X2A02, 0XBA65, 0XB866, 0XB867, 0X9027, 0X992B, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X5865, 0X4866, 0X4967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + } +}; + +#endif /* _VIA_TV3_H_ */ diff --git a/src/via_utility.c b/src/via_utility.c new file mode 100644 index 0000000..dfb50ae --- /dev/null +++ b/src/via_utility.c @@ -0,0 +1,2024 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_utility.c,v 1.5 2003/12/31 05:42:05 dawes Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/* + * I N C L U D E S + */ +#include "via_driver.h" +#include "via_utility.h" + + +void VIAXVUtilityProc(ScrnInfoPtr pScrn, unsigned char *buf) +{ + VIAPtr pVia = VIAPTR(pScrn); + VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; + VIAUserSettingPtr pUserSetting = pBIOSInfo->UserSetting; + VIAModeTablePtr pViaModeTable = pBIOSInfo->pModeTable; + CARD8 *TV = NULL; + int i, HPos, VPos, ADWHS, ADWHE; + unsigned int tvIndx = pBIOSInfo->resTVMode; + CARD32 dwFunc, dwAction = 0, dwInData = 0; + UTBIOSVERSION pUTBIOSVERSION; + UTBIOSDATE pUTBIOSDATE; + UTPANELINFO pUTPANELINFO; + UTXYVALUE MaxViewSizeValue, ViewSizeValue, MaxViewPosValue, ViewPosValue; + UTSETTVTUNINGINFO pUTSETTVTUNINGINFO; + UTSETTVITEMSTATE pUTSETTVITEMSTATE; + UTGAMMAINFO pUTGAMMAINFO; + CARD32 dwVideoRam, dwSupportState = 0, dwConnectState = 0, dwActiveState = 0; + CARD32 dwSAMMState, dwRotateState = 0, dwExpandState, dwStandard = 0; + CARD32 dwSignalType, dwMaxValue, dwItemID = 0, dwValue, dwState; + CARD32 value; + long dwUTRetOK = 1, dwUTRetFail = 0, dwUTRetNoFunc = -1; + unsigned char *InParam; + I2CDevPtr dev = NULL; + unsigned char W_Buffer[3]; + unsigned char R_Buffer[3]; + + WaitIdle(); + + if ((pBIOSInfo->ActiveDevice & VIA_DEVICE_TV) && (!pUserSetting->DefaultSetting)) { + VIAUTGetInfo(pBIOSInfo); + } + + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + if (pBIOSInfo->TVType == TVTYPE_PAL) { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + if (pBIOSInfo->TVOutput == TVOUTPUT_COMPOSITE) + TV = pViaModeTable->tv2Table[tvIndx].TVPALC; + else + TV = pViaModeTable->tv2Table[tvIndx].TVPALS; + break; + case VIA_TVOVER: + if (pBIOSInfo->TVOutput == TVOUTPUT_COMPOSITE) + TV = pViaModeTable->tv2OverTable[tvIndx].TVPALC; + else + TV = pViaModeTable->tv2OverTable[tvIndx].TVPALS; + break; + } + } else { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + if (pBIOSInfo->TVOutput == TVOUTPUT_COMPOSITE) + TV = pViaModeTable->tv2Table[tvIndx].TVNTSCC; + else + TV = pViaModeTable->tv2Table[tvIndx].TVNTSCS; + break; + case VIA_TVOVER: + if (pBIOSInfo->TVOutput == TVOUTPUT_COMPOSITE) + TV = pViaModeTable->tv2OverTable[tvIndx].TVNTSCC; + else + TV = pViaModeTable->tv2OverTable[tvIndx].TVNTSCS; + break; + } + } + break; + case VIA_TV3: + if (pBIOSInfo->TVType == TVTYPE_PAL) { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + TV = pViaModeTable->tv3Table[tvIndx].TVPAL; + break; + case VIA_TVOVER: + TV = pViaModeTable->tv3OverTable[tvIndx].TVPAL; + break; + } + } else { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + TV = pViaModeTable->tv3Table[tvIndx].TVNTSC; + break; + case VIA_TVOVER: + TV = pViaModeTable->tv3OverTable[tvIndx].TVNTSC; + break; + } + } + break; + case VIA_VT1622A: + case VIA_VT1623: + if (pBIOSInfo->TVType == TVTYPE_PAL) { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + TV = pViaModeTable->vt1622aTable[tvIndx].TVPAL; + break; + case VIA_TVOVER: + TV = pViaModeTable->vt1622aOverTable[tvIndx].TVPAL; + break; + } + } else { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + TV = pViaModeTable->vt1622aTable[tvIndx].TVNTSC; + break; + case VIA_TVOVER: + TV = pViaModeTable->vt1622aOverTable[tvIndx].TVNTSC; + break; + } + } + break; + case VIA_CH7009: + case VIA_CH7019: + if (pBIOSInfo->TVType == TVTYPE_PAL) { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + TV = pViaModeTable->ch7019Table[tvIndx].TVPAL; + break; + case VIA_TVOVER: + TV = pViaModeTable->ch7019OverTable[tvIndx].TVPAL; + break; + } + } else { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + TV = pViaModeTable->ch7019Table[tvIndx].TVNTSC; + break; + case VIA_TVOVER: + TV = pViaModeTable->ch7019OverTable[tvIndx].TVNTSC; + break; + } + } + break; + case VIA_SAA7108: + if (pBIOSInfo->TVType == TVTYPE_PAL) { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + TV = pViaModeTable->saa7108Table[tvIndx].TVPAL; + break; + case VIA_TVOVER: + TV = pViaModeTable->saa7108OverTable[tvIndx].TVPAL; + break; + } + } else { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + TV = pViaModeTable->saa7108Table[tvIndx].TVNTSC; + break; + case VIA_TVOVER: + TV = pViaModeTable->saa7108OverTable[tvIndx].TVNTSC; + break; + } + } + break; + /*case VIA_FS454: + if (pBIOSInfo->TVType == TVTYPE_PAL) { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + TV = pViaModeTable->fs454Table[tvIndx].TVPAL; + break; + case VIA_TVOVER: + TV = pViaModeTable->fs454OverTable[tvIndx].TVPAL; + break; + } + } + else { + switch (pBIOSInfo->TVVScan) { + case VIA_TVNORMAL: + TV = pViaModeTable->fs454Table[tvIndx].TVNTSC; + break; + case VIA_TVOVER: + TV = pViaModeTable->fs454OverTable[tvIndx].TVNTSC; + break; + } + } + break; */ + } + + InParam = buf; + dwFunc = *((CARD32 *) InParam); + InParam += 4; + + dwAction = *((CARD32 *) InParam); + InParam += 4; + + switch (dwFunc) { + case UT_XV_FUNC_BIOS: + switch (dwAction) { + case UT_XV_FUNC_BIOS_GetChipID: + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + InParam += 4; + memcpy((void *) InParam, &pVia->ChipId, sizeof(CARD32)); + InParam += 4; + break; + case UT_XV_FUNC_BIOS_GetVersion: + pUTBIOSVERSION.dwVersion = pBIOSInfo->BIOSMajorVersion; + pUTBIOSVERSION.dwRevision = pBIOSInfo->BIOSMinorVersion; + memcpy((void *) InParam, &dwUTRetOK, sizeof(long)); + InParam += 4; + memcpy((void *) InParam, &pUTBIOSVERSION, sizeof(UTBIOSVERSION)); + break; + case UT_XV_FUNC_BIOS_GetDate: + pUTBIOSDATE.dwYear = (CARD32) pBIOSInfo->BIOSDateYear + 2000; + pUTBIOSDATE.dwMonth = (CARD32) pBIOSInfo->BIOSDateMonth; + pUTBIOSDATE.dwDay = (CARD32) pBIOSInfo->BIOSDateDay; + memcpy((void *) InParam, &dwUTRetOK, sizeof(long)); + InParam += 4; + memcpy((void *) InParam, &pUTBIOSDATE, sizeof(UTBIOSDATE)); + break; + case UT_XV_FUNC_BIOS_GetVideoMemSizeMB: + dwVideoRam = pScrn->videoRam >> 10; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + InParam += 4; + memcpy((void *) InParam, &dwVideoRam, sizeof(CARD32)); + break; + default: + memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32)); + InParam += 4; + ErrorF(" via_utility.c : dwAction not supported\n"); + break; + } + break; + case UT_XV_FUNC_DEVICE: + switch (dwAction) { + case UT_XV_FUNC_DEVICE_GetSupportState: + dwSupportState = UT_DEVICE_CRT1; + if (pBIOSInfo->TVEncoder) + dwSupportState |= UT_DEVICE_TV; + if (pBIOSInfo->TMDS) { + dwSupportState |= UT_DEVICE_DFP; + } + if (pBIOSInfo->LVDS) { + dwSupportState |= UT_DEVICE_LCD; + } + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + InParam += 4; + memcpy((void *) InParam, &dwSupportState, sizeof(CARD32)); + break; + case UT_XV_FUNC_DEVICE_GetConnectState: + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + InParam += 4; + dwConnectState = VIAGetDeviceDetect(pBIOSInfo); + memcpy((void *) InParam, &dwConnectState, sizeof(CARD32)); + break; + case UT_XV_FUNC_DEVICE_GetActiveState: + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + InParam += 4; + if (pBIOSInfo->HasSecondary) /* if SAMM */ + dwActiveState = pVia->ActiveDevice; + else + dwActiveState = pBIOSInfo->ActiveDevice; + memcpy((void *) InParam, &dwActiveState, sizeof(CARD32)); + break; + case UT_XV_FUNC_DEVICE_SetActiveState: + InParam += 4; + dwInData = *((CARD32 *) InParam); + /* DuoView not implement yet, we do nothing */ + if ((dwInData == (VIA_DEVICE_TV | VIA_DEVICE_LCD)) || (dwInData == (VIA_DEVICE_TV | VIA_DEVICE_DFP))) { + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + break; + } + pBIOSInfo->ActiveDevice = (unsigned char) dwInData; + /* Avoid device switch in panning mode or expansion */ + pBIOSInfo->scaleY = FALSE; + pScrn->frameX1 = pBIOSInfo->SaveframeX1; + pScrn->frameY1 = pBIOSInfo->SaveframeY1; + pScrn->currentMode->HDisplay = pBIOSInfo->SaveHDisplay; + pScrn->currentMode->VDisplay = pBIOSInfo->SaveVDisplay; + pScrn->currentMode->CrtcHDisplay = pBIOSInfo->SaveCrtcHDisplay; + pScrn->currentMode->CrtcVDisplay = pBIOSInfo->SaveCrtcVDisplay; + + /*BIOS_SetActiveDevice(pScrn); */ + VIASwitchMode(0, pScrn->currentMode, 0); + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + break; + case UT_XV_FUNC_DEVICE_GetSAMMState: + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + InParam += 4; + if (!pBIOSInfo->HasSecondary) + dwSAMMState = UT_STATE_SAMM_OFF; + else + dwSAMMState = UT_STATE_SAMM_ON; + memcpy((void *) InParam, &dwSAMMState, sizeof(CARD32)); + break; + case UT_XV_FUNC_DEVICE_GetRoateState: + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + InParam += 4; + dwRotateState = UT_ROTATE_NONE; + memcpy((void *) InParam, &dwRotateState, sizeof(CARD32)); + break; + case UT_XV_FUNC_DEVICE_SetRoateState: + memcpy((void *) InParam, &dwUTRetNoFunc, sizeof(CARD32)); + break; + default: + memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32)); + ErrorF(" via_utility.c : dwAction not supported\n"); + break; + } + break; + case UT_XV_FUNC_PANEL: + switch (dwAction) { + case UT_XV_FUNC_DEVICE_SetTargetPanel: + memcpy((void *) InParam, &dwUTRetNoFunc, sizeof(CARD32)); + break; + case UT_XV_FUNC_DEVICE_GetPanelInfo: + pUTPANELINFO.dwType = UT_PANEL_TYPE_TFT; + pUTPANELINFO.dwResX = pBIOSInfo->panelX; + pUTPANELINFO.dwResY = pBIOSInfo->panelY; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + InParam += 4; + memcpy((void *) InParam, &pUTPANELINFO, sizeof(UTPANELINFO)); + break; + case UT_XV_FUNC_DEVICE_GetExpandState: + if (pBIOSInfo->Center) + dwExpandState = UT_STATE_EXPAND_OFF; + else + dwExpandState = UT_STATE_EXPAND_ON; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + InParam += 4; + memcpy((void *) InParam, &dwExpandState, sizeof(CARD32)); + break; + case UT_XV_FUNC_DEVICE_SetExpandState: + InParam += 4; + dwInData = *((CARD32 *) InParam); + if (dwInData == UT_STATE_EXPAND_OFF) { + pBIOSInfo->Center = TRUE; + VIASwitchMode(0, pScrn->currentMode, 0); + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + } else if (dwInData == UT_STATE_EXPAND_ON) { + pBIOSInfo->Center = FALSE; + VIASwitchMode(0, pScrn->currentMode, 0); + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + } else { + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32)); + } + break; + case UT_XV_FUNC_DEVICE_GetSupportExpand: + InParam += 4; + dwInData = *((CARD32 *) InParam); + if (pBIOSInfo->LVDS) { + switch (pBIOSInfo->PanelSize) { + case VIA_PANEL6X4: + if (pBIOSInfo->SaveHDisplay < 640 && pBIOSInfo->SaveVDisplay < 480) { + dwSupportState = UT_PANEL_SUPPORT_EXPAND_ON; + } else { + dwSupportState = UT_PANEL_SUPPORT_EXPAND_OFF; + } + break; + case VIA_PANEL8X6: + if (pBIOSInfo->SaveHDisplay < 800 && pBIOSInfo->SaveVDisplay < 600) { + dwSupportState = UT_PANEL_SUPPORT_EXPAND_ON; + } else { + dwSupportState = UT_PANEL_SUPPORT_EXPAND_OFF; + } + break; + case VIA_PANEL10X7: + if (pBIOSInfo->SaveHDisplay < 1024 && pBIOSInfo->SaveVDisplay < 768) { + dwSupportState = UT_PANEL_SUPPORT_EXPAND_ON; + } else { + dwSupportState = UT_PANEL_SUPPORT_EXPAND_OFF; + } + break; + case VIA_PANEL12X7: + if (pBIOSInfo->SaveHDisplay < 1280 && pBIOSInfo->SaveVDisplay < 768) { + dwSupportState = UT_PANEL_SUPPORT_EXPAND_ON; + } else { + dwSupportState = UT_PANEL_SUPPORT_EXPAND_OFF; + } + break; + case VIA_PANEL12X10: + if (pBIOSInfo->SaveHDisplay < 1280 && pBIOSInfo->SaveVDisplay < 1024) { + dwSupportState = UT_PANEL_SUPPORT_EXPAND_ON; + } else { + dwSupportState = UT_PANEL_SUPPORT_EXPAND_OFF; + } + break; + case VIA_PANEL14X10: + if (pBIOSInfo->SaveHDisplay < 1400 && pBIOSInfo->SaveVDisplay < 1050) { + dwSupportState = UT_PANEL_SUPPORT_EXPAND_ON; + } else { + dwSupportState = UT_PANEL_SUPPORT_EXPAND_OFF; + } + break; + case VIA_PANEL16X12: + if (pBIOSInfo->SaveHDisplay < 1600 && pBIOSInfo->SaveVDisplay < 1200) { + dwSupportState = UT_PANEL_SUPPORT_EXPAND_ON; + } else { + dwSupportState = UT_PANEL_SUPPORT_EXPAND_OFF; + } + break; + default: + dwSupportState = UT_PANEL_SUPPORT_EXPAND_OFF; + break; + } + } else { + dwSupportState = UT_PANEL_SUPPORT_EXPAND_OFF; + } + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + InParam += 4; + memcpy((void *) InParam, &dwSupportState, sizeof(CARD32)); + break; + default: + memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32)); + InParam += 4; + ErrorF(" via_utility.c : dwAction not supported\n"); + break; + } + break; + case UT_XV_FUNC_TV: + switch (dwAction) { + case UT_XV_FUNC_TV_GetSupportStandardState: + dwSupportState = UT_TV_STD_NTSC | UT_TV_STD_PAL; + if (pBIOSInfo->TVEncoder == VIA_FS454) + dwSupportState = UT_TV_STD_NTSC; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + InParam += 4; + memcpy((void *) InParam, &dwSupportState, sizeof(CARD32)); + break; + case UT_XV_FUNC_TV_GetStandard: + dwStandard = pBIOSInfo->TVType; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + InParam += 4; + memcpy((void *) InParam, &dwStandard, sizeof(CARD32)); + break; + case UT_XV_FUNC_TV_SetStandard: + InParam += 4; + dwInData = *((CARD32 *) InParam); + switch (dwInData) { + case UT_TV_STD_NTSC: + pBIOSInfo->TVType = TVTYPE_NTSC; + if (pBIOSInfo->ActiveDevice & VIA_DEVICE_TV) { + VIASwitchMode(0, pScrn->currentMode, 0); + } + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + break; + case UT_TV_STD_PAL: + pBIOSInfo->TVType = TVTYPE_PAL; + if (pBIOSInfo->ActiveDevice & VIA_DEVICE_TV) { + VIASwitchMode(0, pScrn->currentMode, 0); + } + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + break; + default: + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32)); + break; + } + break; + case UT_XV_FUNC_TV_GetSupportSignalTypeState: + VIAGetActiveDisplay(pBIOSInfo); + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + dwSupportState = UT_TV_SGNL_COMPOSITE | UT_TV_SGNL_S_VIDEO; + break; + case VIA_TV3: + case VIA_VT1622A: + dwSupportState = UT_TV_SGNL_COMPOSITE | UT_TV_SGNL_S_VIDEO | UT_TV_SGNL_SCART | UT_TV_SGNL_COMP_OUTPUT; + break; + case VIA_SAA7108: + dwSupportState = UT_TV_SGNL_COMPOSITE | UT_TV_SGNL_S_VIDEO | UT_TV_SGNL_SCART | UT_TV_SGNL_COMP_OUTPUT; + break; + case VIA_FS454: + dwSupportState = UT_TV_SGNL_COMPOSITE | UT_TV_SGNL_S_VIDEO | UT_TV_SGNL_SCART; + break; + case VIA_CH7009: + case VIA_CH7019: + dwSupportState = UT_TV_SGNL_COMPOSITE | UT_TV_SGNL_S_VIDEO; + break; + default: + dwSupportState = 0; + break; + } + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + InParam += 4; + memcpy((void *) InParam, &dwSupportState, sizeof(CARD32)); + break; + case UT_XV_FUNC_TV_GetSignalType: + dwSignalType = pBIOSInfo->TVOutput; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + InParam += 4; + memcpy((void *) InParam, &dwSignalType, sizeof(CARD32)); + break; + case UT_XV_FUNC_TV_SetSignalType: + InParam += 4; + dwInData = *((CARD32 *) InParam); + switch (dwInData) { + case UT_TV_SGNL_COMPOSITE: + pBIOSInfo->TVOutput = TVOUTPUT_COMPOSITE; + if (pBIOSInfo->ActiveDevice & VIA_DEVICE_TV) { + VIASwitchMode(0, pScrn->currentMode, 0); + } + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + break; + case UT_TV_SGNL_S_VIDEO: + pBIOSInfo->TVOutput = TVOUTPUT_SVIDEO; + if (pBIOSInfo->ActiveDevice & VIA_DEVICE_TV) { + VIASwitchMode(0, pScrn->currentMode, 0); + } + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + break; + case UT_TV_SGNL_SCART: + pBIOSInfo->TVOutput = TVOUTPUT_RGB; + if (pBIOSInfo->ActiveDevice & VIA_DEVICE_TV) { + VIASwitchMode(0, pScrn->currentMode, 0); + } + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + break; + case UT_TV_SGNL_COMP_OUTPUT: + pBIOSInfo->TVOutput = TVOUTPUT_YCBCR; + if (pBIOSInfo->ActiveDevice & VIA_DEVICE_TV) { + VIASwitchMode(0, pScrn->currentMode, 0); + } + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + break; + default: + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32)); + break; + } + break; + case UT_XV_FUNC_TV_GetMaxViewSizeValue: + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + case VIA_TV3: + case VIA_VT1622A: + case VIA_VT1623: + case VIA_SAA7108: + case VIA_FS454: + case VIA_CH7009: + case VIA_CH7019: + MaxViewSizeValue.dwX = 0; + MaxViewSizeValue.dwY = 2; + break; + default: + MaxViewSizeValue.dwX = 0; + MaxViewSizeValue.dwY = 0; + break; + } + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + InParam += 4; + memcpy((void *) InParam, &MaxViewSizeValue, sizeof(UTXYVALUE)); + break; + case UT_XV_FUNC_TV_GetViewSizeValue: + ViewSizeValue.dwX = 0; + ViewSizeValue.dwY = pBIOSInfo->TVVScan + 1; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + InParam += 4; + memcpy((void *) InParam, &ViewSizeValue, sizeof(UTXYVALUE)); + break; + case UT_XV_FUNC_TV_SetViewSizeValue: + InParam = buf + 12; + memcpy(&ViewSizeValue, (void *) InParam, sizeof(UTXYVALUE)); + if (ViewSizeValue.dwY == 0xFFFF) { + pBIOSInfo->TVVScan = VIA_TVNORMAL; + } else { + pBIOSInfo->TVVScan = (int) ViewSizeValue.dwY - 1; + } + VIASwitchMode(0, pScrn->currentMode, 0); + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + break; + + case UT_XV_FUNC_TV_GetMaxViewPositionValue: + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + MaxViewPosValue.dwX = 0; + MaxViewPosValue.dwY = 0; + break; + case VIA_TV3: + case VIA_VT1622A: + case VIA_VT1623: + MaxViewPosValue.dwX = 11; /* 9 bit, [0:7]08H, [2]1CH */ + MaxViewPosValue.dwY = 11; /* 9 bit, [0:7]09H, [1]1CH */ + break; + case VIA_SAA7108: + MaxViewPosValue.dwX = 11; + MaxViewPosValue.dwY = 11; + break; + case VIA_FS454: + case VIA_CH7009: + case VIA_CH7019: + default: + MaxViewPosValue.dwX = 0; + MaxViewPosValue.dwY = 0; + break; + } + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + InParam += 4; + memcpy((void *) InParam, &MaxViewPosValue, sizeof(UTXYVALUE)); + break; + case UT_XV_FUNC_TV_GetViewPositionValue: + InParam = buf + 12; + memcpy(&ViewPosValue, (void *) InParam, sizeof(UTXYVALUE)); + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + ViewPosValue.dwX = 0; + ViewPosValue.dwY = 0; + break; + case VIA_TV3: + case VIA_VT1622A: + case VIA_VT1623: + if (ViewPosValue.dwX == 0xFFFF && ViewPosValue.dwY == 0xFFFF) { + /*value = TV[0x1C]; + ViewPosValue.dwX = (CARD32)(TV[0x08] & 0xFF); + ViewPosValue.dwX |= (CARD32)((value & 0x04) << 6); + ViewPosValue.dwY = (CARD32)(TV[0x09] & 0xFF); + ViewPosValue.dwY |= (CARD32)((value & 0x02) << 7); */ + ViewPosValue.dwX = 6; + ViewPosValue.dwY = 6; + } else { + ViewPosValue.dwX = pUserSetting->tvHPosition; + ViewPosValue.dwY = pUserSetting->tvVPosition; + } + break; + case VIA_SAA7108: + if (ViewPosValue.dwX == 0xFFFF && ViewPosValue.dwY == 0xFFFF) { + ViewPosValue.dwX = 6; + ViewPosValue.dwY = 6; + } else { + ViewPosValue.dwX = pUserSetting->tvHPosition; + ViewPosValue.dwY = pUserSetting->tvVPosition; + } + break; + case VIA_FS454: + case VIA_CH7009: + case VIA_CH7019: + default: + ViewPosValue.dwX = 0; + ViewPosValue.dwY = 0; + break; + } + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + InParam += 4; + memcpy((void *) InParam, &ViewPosValue, sizeof(UTXYVALUE)); + break; + case UT_XV_FUNC_TV_SetViewPositionValue: + InParam = buf + 12; + memcpy(&ViewPosValue, (void *) InParam, sizeof(UTXYVALUE)); + if (xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, pBIOSInfo->TVI2CAdd)) { + dev = xf86CreateI2CDevRec(); + dev->DevName = "TV"; + dev->SlaveAddr = pBIOSInfo->TVI2CAdd; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + + if (xf86I2CDevInit(dev)) { + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + pUserSetting->tvHPosition = 0; + pUserSetting->tvVPosition = 0; + break; + case VIA_TV3: + case VIA_VT1622A: + if (ViewPosValue.dwX == 0xFFFF && ViewPosValue.dwX == 0xFFFF) { + W_Buffer[0] = 0x1C; + W_Buffer[1] = TV[0x1C]; + xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0); + W_Buffer[0] = 0x08; + W_Buffer[1] = TV[0x08]; + W_Buffer[2] = TV[0x09]; + xf86I2CWriteRead(dev, W_Buffer, 3, NULL, 0); + /*value = TV[0x1C]; + pUserSetting->tvHPosition = TV[0x08] & 0xFF; + pUserSetting->tvHPosition |= (value & 0x04) << 6; + pUserSetting->tvVPosition = TV[0x09] & 0xFF; + pUserSetting->tvVPosition |= (value & 0x02) << 7; */ + pUserSetting->tvHPosition = 6; + pUserSetting->tvVPosition = 6; + } else { + W_Buffer[0] = 0x08; + xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 2); + HPos = R_Buffer[0]; + VPos = R_Buffer[1]; + W_Buffer[0] = 0x1C; + xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1); + HPos |= (R_Buffer[0] & 0x04) << 6; + VPos |= (R_Buffer[0] & 0x02) << 7; + + HPos += ViewPosValue.dwX - pUserSetting->tvHPosition; + VPos += ViewPosValue.dwY - pUserSetting->tvVPosition; + + W_Buffer[0] = 0x08; + W_Buffer[1] = HPos & 0xFF; + W_Buffer[2] = VPos & 0xFF; + xf86I2CWriteRead(dev, W_Buffer, 3, NULL, 0); + + W_Buffer[0] = 0x1C; + W_Buffer[1] = R_Buffer[0] & ~0x06; /* [2]1CH, [1]1CH */ + W_Buffer[1] |= (HPos >> 6) & 0x04; + W_Buffer[1] |= (VPos >> 7) & 0x02; + xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0); + + pUserSetting->tvHPosition = ViewPosValue.dwX; + pUserSetting->tvVPosition = ViewPosValue.dwY; + } + break; + case VIA_SAA7108: + if (ViewPosValue.dwX == 0xFFFF && ViewPosValue.dwX == 0xFFFF) { + for (i = 0; i < 3; i++) { + W_Buffer[0] = VIASAA7108PostionOffset[i]; + if (pBIOSInfo->TVVScan == VIA_TVNORMAL) + W_Buffer[1] = VIASAA7108PostionNormalTabRec[pBIOSInfo->TVType - 1][tvIndx][5][i]; + else + W_Buffer[1] = VIASAA7108PostionOverTabRec[pBIOSInfo->TVType - 1][tvIndx][5][i]; + xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0); + } + W_Buffer[0] = 0x72; + W_Buffer[1] = TV[0x72]; + xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0); + W_Buffer[0] = 0x70; + W_Buffer[1] = TV[0x70]; + xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0); + W_Buffer[0] = 0x72; + W_Buffer[1] = TV[0x72]; + xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0); + W_Buffer[0] = 0x71; + W_Buffer[1] = TV[0x71]; + xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0); + pUserSetting->tvHPosition = 6; + pUserSetting->tvVPosition = 6; + } else { + for (i = 0; i < 3; i++) { + W_Buffer[0] = VIASAA7108PostionOffset[i]; + if (pBIOSInfo->TVVScan == VIA_TVNORMAL) + W_Buffer[1] = VIASAA7108PostionNormalTabRec[pBIOSInfo->TVType - 1][tvIndx][ViewPosValue.dwY][i]; + else + W_Buffer[1] = VIASAA7108PostionOverTabRec[pBIOSInfo->TVType - 1][tvIndx][ViewPosValue.dwY][i]; + xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0); + } + W_Buffer[0] = 0x70; + xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 3); + ADWHS = R_Buffer[0] | ((R_Buffer[2] & 0x07) << 8); + ADWHE = R_Buffer[1] | ((R_Buffer[2] & 0x70) << 4); + switch (ViewPosValue.dwX - pUserSetting->tvHPosition) { + case 1: /* Moving Right by 1 unit */ + ADWHS++; + ADWHE++; + W_Buffer[0] = 0x72; + W_Buffer[1] = (R_Buffer[2] & ~0x77) | ((ADWHS & 0x700) >> 8) | ((ADWHE & 0x700) >> 4); + xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0); + W_Buffer[0] = 0x70; + W_Buffer[1] = ADWHS & 0xFF; + xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0); + W_Buffer[0] = 0x72; + W_Buffer[1] = (R_Buffer[2] & ~0x77) | ((ADWHS & 0x700) >> 8) | ((ADWHE & 0x700) >> 4); + xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0); + W_Buffer[0] = 0x71; + W_Buffer[1] = ADWHE & 0xFF; + xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0); + break; + case -1: /* Moving Left by 1 unit */ + ADWHS--; + ADWHE--; + W_Buffer[0] = 0x72; + W_Buffer[1] = (R_Buffer[2] & ~0x77) | ((ADWHS & 0x700) >> 8) | ((ADWHE & 0x700) >> 4); + xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0); + W_Buffer[0] = 0x71; + W_Buffer[1] = ADWHE & 0xFF; + xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0); + W_Buffer[0] = 0x72; + W_Buffer[1] = (R_Buffer[2] & ~0x77) | ((ADWHS & 0x700) >> 8) | ((ADWHE & 0x700) >> 4); + xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0); + W_Buffer[0] = 0x70; + W_Buffer[1] = ADWHS & 0xFF; + xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0); + break; + default: + break; + } + pUserSetting->tvHPosition = ViewPosValue.dwX; + pUserSetting->tvVPosition = ViewPosValue.dwY; + } + break; + case VIA_FS454: + case VIA_CH7009: + case VIA_CH7019: + default: + pUserSetting->tvHPosition = 0; + pUserSetting->tvVPosition = 0; + break; + } + xf86DestroyI2CDevRec(dev, TRUE); + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + } else { + xf86DestroyI2CDevRec(dev, TRUE); + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32)); + } + } + break; + case UT_XV_FUNC_TV_GetSupportTuningState: + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + dwSupportState = UT_TV_TUNING_FFILTER | UT_TV_TUNING_BRIGHTNESS | UT_TV_TUNING_CONTRAST | UT_TV_TUNING_SATURATION | UT_TV_TUNING_TINT; + break; + case VIA_TV3: + case VIA_VT1622A: + case VIA_VT1623: + dwSupportState = UT_TV_TUNING_FFILTER | UT_TV_TUNING_ADAPTIVE_FFILTER | UT_TV_TUNING_BRIGHTNESS | UT_TV_TUNING_CONTRAST | UT_TV_TUNING_SATURATION | UT_TV_TUNING_TINT; + break; + case VIA_SAA7108: + dwSupportState = UT_TV_TUNING_FFILTER; + break; + case VIA_CH7009: + case VIA_CH7019: + dwSupportState = UT_TV_TUNING_FFILTER | UT_TV_TUNING_ADAPTIVE_FFILTER | UT_TV_TUNING_BRIGHTNESS | UT_TV_TUNING_CONTRAST; + break; + case VIA_FS454: + default: + dwSupportState = 0; + break; + } + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + InParam += 4; + memcpy((void *) InParam, &dwSupportState, sizeof(UTXYVALUE)); + break; + case UT_XV_FUNC_TV_GetTuningItemMaxValue: /* 0 BASE */ + InParam += 4; + dwInData = *((CARD32 *) InParam); + switch (dwInData) { + case UT_TV_TUNING_FFILTER: + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + dwMaxValue = 0; + break; + case VIA_TV3: + case VIA_VT1622A: + case VIA_VT1623: + dwMaxValue = 3; /* 2bit, [1:0]03H */ + break; + case VIA_CH7009: + case VIA_CH7019: + case VIA_SAA7108: + dwMaxValue = 3; + break; + case VIA_FS454: + default: + dwMaxValue = 0; + break; + } + break; + case UT_TV_TUNING_ADAPTIVE_FFILTER: + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + dwMaxValue = 0; /* TV2Plus No Adaptive Flicker */ + break; + case VIA_TV3: + case VIA_VT1622A: + case VIA_VT1623: + dwMaxValue = 255; /* 8bit, [7:0]61H */ + break; + case VIA_SAA7108: + case VIA_FS454: + case VIA_CH7009: + case VIA_CH7019: + default: + dwMaxValue = 0; + break; + } + break; + case UT_TV_TUNING_BRIGHTNESS: + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + dwMaxValue = 0; + break; + case VIA_TV3: + case VIA_VT1622A: + case VIA_VT1623: + dwMaxValue = 255; /* 8bit, [7:0]0BH */ + break; + case VIA_SAA7108: + case VIA_FS454: + case VIA_CH7009: + case VIA_CH7019: + default: + dwMaxValue = 0; + break; + } + break; + case UT_TV_TUNING_CONTRAST: + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + dwMaxValue = 0; + break; + case VIA_TV3: + case VIA_VT1622A: + case VIA_VT1623: + dwMaxValue = 255; /* 8bit, [7:0]0CH */ + break; + case VIA_SAA7108: + case VIA_FS454: + case VIA_CH7009: + case VIA_CH7019: + default: + dwMaxValue = 0; + break; + } + break; + case UT_TV_TUNING_SATURATION: + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + dwMaxValue = 0; + break; + case VIA_TV3: + case VIA_VT1622A: + case VIA_VT1623: + dwMaxValue = 65535; /* 16bit, [7:0]0AH, [7:0]0DH */ + break; + case VIA_SAA7108: + case VIA_FS454: + case VIA_CH7009: + case VIA_CH7019: + default: + dwMaxValue = 0; + break; + } + break; + case UT_TV_TUNING_TINT: + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + dwMaxValue = 2047; /* 11bit, [7:0]10H, [7:5]11H */ + break; + case VIA_TV3: + case VIA_VT1622A: + case VIA_VT1623: + dwMaxValue = 2047; /* 11bit, [7:0]10H, [2:0]11H */ + break; + case VIA_SAA7108: + case VIA_FS454: + case VIA_CH7009: + case VIA_CH7019: + default: + dwMaxValue = 0; + break; + } + break; + default: + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32)); + dwMaxValue = 0; + break; + } + InParam += 4; + memcpy((void *) InParam, &dwMaxValue, sizeof(CARD32)); + break; + case UT_XV_FUNC_TV_GetTuningItemValue: + InParam += 4; + dwInData = *((CARD32 *) InParam); + switch (dwInData) { + case UT_TV_TUNING_FFILTER: + dwValue = pUserSetting->tvFFilter; + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + break; + case UT_TV_TUNING_ADAPTIVE_FFILTER: + dwValue = pUserSetting->tvAdaptiveFFilter; + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + break; + case UT_TV_TUNING_BRIGHTNESS: + dwValue = pUserSetting->tvBrightness; + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + break; + case UT_TV_TUNING_CONTRAST: + dwValue = pUserSetting->tvContrast; + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + break; + case UT_TV_TUNING_SATURATION: + dwValue = pUserSetting->tvSaturation; + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + break; + case UT_TV_TUNING_TINT: + dwValue = pUserSetting->tvTint; + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + break; + default: + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32)); + dwValue = 0; + break; + } + InParam += 4; + memcpy((void *) InParam, &dwValue, sizeof(CARD32)); + break; + case UT_XV_FUNC_TV_SetTuningItemValue: + InParam = buf + 12; + memcpy(&pUTSETTVTUNINGINFO, (void *) InParam, sizeof(UTSETTVTUNINGINFO)); + switch (pUTSETTVTUNINGINFO.dwItemID) { + case UT_TV_TUNING_FFILTER: + if (xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, pBIOSInfo->TVI2CAdd)) { + dev = xf86CreateI2CDevRec(); + dev->DevName = "TV"; + dev->SlaveAddr = pBIOSInfo->TVI2CAdd; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + + if (xf86I2CDevInit(dev)) { + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + pUserSetting->tvFFilter = 0; + break; + case VIA_TV3: + case VIA_VT1622A: + case VIA_VT1623: + if (pUTSETTVTUNINGINFO.dwValue == 0xFFFF) { + W_Buffer[0] = 0x03; + W_Buffer[1] = TV[0x03]; + pUserSetting->tvFFilter = TV[0x03] & 0x03; + if (pUserSetting->tvFFilter == 0) + pUserSetting->AdaptiveFilterOn = TRUE; + } else { + W_Buffer[0] = 0x03; + xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1); + W_Buffer[1] = R_Buffer[0] & ~0x03; + W_Buffer[1] |= pUTSETTVTUNINGINFO.dwValue; + pUserSetting->tvFFilter = pUTSETTVTUNINGINFO.dwValue; + } + xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0); + break; + case VIA_SAA7108: + if (pUTSETTVTUNINGINFO.dwValue == 0xFFFF) { + W_Buffer[0] = 0x37; + W_Buffer[1] = TV[0x37]; + pUserSetting->tvFFilter = (TV[0x37] & 0x30) + 1; + } else { + W_Buffer[0] = 0x37; + xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1); + W_Buffer[1] = R_Buffer[0] & ~0x30; + W_Buffer[1] |= (unsigned char) (pUTSETTVTUNINGINFO.dwValue - 1); + pUserSetting->tvFFilter = pUTSETTVTUNINGINFO.dwValue; + } + break; + case VIA_CH7009: + case VIA_CH7019: + case VIA_FS454: + default: + pUserSetting->tvFFilter = 0; + break; + } + + xf86DestroyI2CDevRec(dev, TRUE); + } else { + xf86DestroyI2CDevRec(dev, TRUE); + } + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + } else { + xf86DestroyI2CDevRec(dev, TRUE); + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32)); + } + break; + case UT_TV_TUNING_ADAPTIVE_FFILTER: + if (xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, pBIOSInfo->TVI2CAdd)) { + dev = xf86CreateI2CDevRec(); + dev->DevName = "TV"; + dev->SlaveAddr = pBIOSInfo->TVI2CAdd; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + + if (xf86I2CDevInit(dev)) { + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + pUserSetting->tvAdaptiveFFilter = 0; + break; + case VIA_TV3: + case VIA_VT1622A: + case VIA_VT1623: + if (pUTSETTVTUNINGINFO.dwValue == 0xFFFF) { + W_Buffer[0] = 0x61; + W_Buffer[1] = TV[0x61]; + pUserSetting->tvAdaptiveFFilter = TV[0x61] & 0xFF; + } else { + W_Buffer[0] = 0x61; + W_Buffer[1] = (unsigned char) pUTSETTVTUNINGINFO.dwValue; + pUserSetting->tvAdaptiveFFilter = pUTSETTVTUNINGINFO.dwValue; + } + xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0); + break; + case VIA_SAA7108: + case VIA_FS454: + case VIA_CH7009: + case VIA_CH7019: + default: + pUserSetting->tvAdaptiveFFilter = 0; + break; + } + xf86DestroyI2CDevRec(dev, TRUE); + } else { + xf86DestroyI2CDevRec(dev, TRUE); + } + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + } else { + xf86DestroyI2CDevRec(dev, TRUE); + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32)); + } + break; + case UT_TV_TUNING_BRIGHTNESS: + if (xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, pBIOSInfo->TVI2CAdd)) { + dev = xf86CreateI2CDevRec(); + dev->DevName = "TV"; + dev->SlaveAddr = pBIOSInfo->TVI2CAdd; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + + if (xf86I2CDevInit(dev)) { + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + pUserSetting->tvBrightness = 0; + break; + case VIA_TV3: + case VIA_VT1622A: + case VIA_VT1623: + W_Buffer[0] = 0x0B; + if (pUTSETTVTUNINGINFO.dwValue == 0xFFFF) { + W_Buffer[1] = TV[0x0B]; + pUserSetting->tvBrightness = TV[0x0B] & 0xFF; + } else { + W_Buffer[1] = (unsigned char) pUTSETTVTUNINGINFO.dwValue; + pUserSetting->tvBrightness = pUTSETTVTUNINGINFO.dwValue; + } + xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0); + break; + case VIA_SAA7108: + case VIA_FS454: + case VIA_CH7009: + case VIA_CH7019: + default: + pUserSetting->tvBrightness = 0; + break; + } + + xf86DestroyI2CDevRec(dev, TRUE); + } else { + xf86DestroyI2CDevRec(dev, TRUE); + } + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + } else { + xf86DestroyI2CDevRec(dev, TRUE); + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32)); + } + break; + case UT_TV_TUNING_CONTRAST: + if (xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, pBIOSInfo->TVI2CAdd)) { + dev = xf86CreateI2CDevRec(); + dev->DevName = "TV"; + dev->SlaveAddr = pBIOSInfo->TVI2CAdd; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + + if (xf86I2CDevInit(dev)) { + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + pUserSetting->tvContrast = 0; + break; + case VIA_TV3: + case VIA_VT1622A: + case VIA_VT1623: + W_Buffer[0] = 0x0C; + if (pUTSETTVTUNINGINFO.dwValue == 0xFFFF) { + W_Buffer[1] = TV[0x0C]; + pUserSetting->tvContrast = TV[0x0C] & 0xFF; + } else { + W_Buffer[1] = (unsigned char) pUTSETTVTUNINGINFO.dwValue; + pUserSetting->tvContrast = pUTSETTVTUNINGINFO.dwValue; + } + xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0); + break; + case VIA_SAA7108: + case VIA_FS454: + case VIA_CH7009: + case VIA_CH7019: + default: + pUserSetting->tvContrast = 0; + break; + } + + xf86DestroyI2CDevRec(dev, TRUE); + } else { + xf86DestroyI2CDevRec(dev, TRUE); + } + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + } else { + xf86DestroyI2CDevRec(dev, TRUE); + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32)); + } + break; + case UT_TV_TUNING_SATURATION: + if (xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, pBIOSInfo->TVI2CAdd)) { + dev = xf86CreateI2CDevRec(); + dev->DevName = "TV"; + dev->SlaveAddr = pBIOSInfo->TVI2CAdd; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + + if (xf86I2CDevInit(dev)) { + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + pUserSetting->tvSaturation = 0; + break; + case VIA_TV3: + case VIA_VT1622A: + case VIA_VT1623: + if (pUTSETTVTUNINGINFO.dwValue == 0xFFFF) { + W_Buffer[0] = 0x0D; + W_Buffer[1] = TV[0x0D]; + xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0); + W_Buffer[0] = 0x0A; + W_Buffer[1] = TV[0x0A]; + value = TV[0x0D]; + pUserSetting->tvSaturation = TV[0x0A] & 0xFF; + pUserSetting->tvSaturation |= value << 8; + } else { + W_Buffer[0] = 0x0D; + W_Buffer[1] = (unsigned char) ((pUTSETTVTUNINGINFO.dwValue >> 8) & 0xFF); + xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0); + W_Buffer[0] = 0x0A; + W_Buffer[1] = (unsigned char) (pUTSETTVTUNINGINFO.dwValue & 0xFF); + pUserSetting->tvSaturation = pUTSETTVTUNINGINFO.dwValue; + } + xf86I2CWriteRead(dev, W_Buffer, 3, NULL, 0); + break; + case VIA_SAA7108: + case VIA_FS454: + case VIA_CH7009: + case VIA_CH7019: + default: + pUserSetting->tvSaturation = 0; + break; + } + + xf86DestroyI2CDevRec(dev, TRUE); + } else { + xf86DestroyI2CDevRec(dev, TRUE); + } + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + } else { + xf86DestroyI2CDevRec(dev, TRUE); + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32)); + } + break; + case UT_TV_TUNING_TINT: + if (xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, pBIOSInfo->TVI2CAdd)) { + dev = xf86CreateI2CDevRec(); + dev->DevName = "TV"; + dev->SlaveAddr = pBIOSInfo->TVI2CAdd; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + + if (xf86I2CDevInit(dev)) { + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + if (pUTSETTVTUNINGINFO.dwValue == 0xFFFF) { + W_Buffer[0] = 0x10; + W_Buffer[1] = TV[0x10]; + W_Buffer[2] = TV[0x11]; + pUserSetting->tvTint = TV[0x10] & 0xFF; + pUserSetting->tvTint |= (TV[0x11] & 0xE0) << 3; + } else { + W_Buffer[0] = 0x11; + xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1); + W_Buffer[2] = R_Buffer[0] & ~0xE0; + W_Buffer[2] |= (unsigned char) ((pUTSETTVTUNINGINFO.dwValue >> 3) & 0xFF); + W_Buffer[0] = 0x10; + W_Buffer[1] = (unsigned char) (pUTSETTVTUNINGINFO.dwValue & 0xFF); + pUserSetting->tvTint = pUTSETTVTUNINGINFO.dwValue; + } + xf86I2CWriteRead(dev, W_Buffer, 3, NULL, 0); + break; + case VIA_TV3: + case VIA_VT1622A: + case VIA_VT1623: + if (pUTSETTVTUNINGINFO.dwValue == 0xFFFF) { + W_Buffer[0] = 0x10; + W_Buffer[1] = TV[0x10]; + W_Buffer[2] = TV[0x11]; + value = TV[0x11]; + pUserSetting->tvTint = TV[0x10] & 0xFF; + pUserSetting->tvTint |= TV[0x11] << 8; + } else { + W_Buffer[0] = 0x11; + xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1); + W_Buffer[2] = R_Buffer[0] & ~0x07; + W_Buffer[2] |= (unsigned char) (pUTSETTVTUNINGINFO.dwValue >> 8) & 0xFF; + W_Buffer[0] = 0x10; + W_Buffer[1] = (unsigned char) (pUTSETTVTUNINGINFO.dwValue & 0xFF); + pUserSetting->tvTint = pUTSETTVTUNINGINFO.dwValue; + } + xf86I2CWriteRead(dev, W_Buffer, 3, NULL, 0); + break; + case VIA_SAA7108: + case VIA_FS454: + case VIA_CH7009: + case VIA_CH7019: + default: + pUserSetting->tvTint = 0; + break; + } + + xf86DestroyI2CDevRec(dev, TRUE); + } else { + xf86DestroyI2CDevRec(dev, TRUE); + } + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + } else { + xf86DestroyI2CDevRec(dev, TRUE); + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32)); + } + break; + default: + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32)); + break; + } + break; + case UT_XV_FUNC_TV_GetSupportSettingState: + dwItemID |= UT_TV_SETTING_FFILTER; + switch (pBIOSInfo->TVEncoder) { + case VIA_TV3: + case VIA_VT1622A: + case VIA_VT1623: + dwItemID |= UT_TV_SETTING_ADAPTIVE_FFILTER; + if (pBIOSInfo->TVType == TVTYPE_NTSC) + dwItemID |= UT_TV_SETTING_DOT_CRAWL; + break; + case VIA_FS454: + case VIA_CH7009: + case VIA_CH7019: + if (pBIOSInfo->TVType == TVTYPE_NTSC) + dwItemID |= UT_TV_SETTING_DOT_CRAWL; + break; + default: + break; + } + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + InParam += 4; + memcpy((void *) InParam, &dwItemID, sizeof(CARD32)); + break; + case UT_XV_FUNC_TV_GetSettingItemState: + InParam += 4; + dwInData = *((CARD32 *) InParam); + switch (dwInData) { + case UT_TV_SETTING_FFILTER: + if (pUserSetting->tvFFilter) + dwState = UT_STATE_ON; + else + dwState = UT_STATE_OFF; + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + break; + case UT_TV_SETTING_ADAPTIVE_FFILTER: + if (pUserSetting->tvFFilter) + dwState = UT_STATE_OFF; + else + dwState = UT_STATE_ON; + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + break; + case UT_TV_SETTING_DOT_CRAWL: + if (pBIOSInfo->TVDotCrawl) + dwState = UT_STATE_ON; + else + dwState = UT_STATE_OFF; + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + break; + case UT_TV_SETTING_LOCK_ASPECT_RATIO: + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetNoFunc, sizeof(CARD32)); + dwState = UT_STATE_OFF; + break; + default: + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32)); + dwState = UT_STATE_OFF; + break; + } + InParam += 4; + memcpy((void *) InParam, &dwState, sizeof(CARD32)); + break; + case UT_XV_FUNC_TV_SetSettingItemState: + InParam = buf + 12; + memcpy(&pUTSETTVITEMSTATE, (void *) InParam, sizeof(UTSETTVITEMSTATE)); + switch (pUTSETTVITEMSTATE.dwItemID) { + case UT_TV_SETTING_FFILTER: + if (pUTSETTVITEMSTATE.dwState == UT_STATE_OFF) { + if (xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, pBIOSInfo->TVI2CAdd)) { + dev = xf86CreateI2CDevRec(); + dev->DevName = "TV"; + dev->SlaveAddr = pBIOSInfo->TVI2CAdd; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + + if (xf86I2CDevInit(dev)) { + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + case VIA_TV3: + case VIA_VT1622A: + case VIA_VT1623: + W_Buffer[0] = 0x03; + xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1); + W_Buffer[1] = R_Buffer[0] & ~0x03; + break; + case VIA_SAA7108: + W_Buffer[0] = 0x37; + xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1); + W_Buffer[1] = R_Buffer[0] & ~0x30; + break; + } + xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0); + xf86DestroyI2CDevRec(dev, TRUE); + pUserSetting->AdaptiveFilterOn = TRUE; + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + + } else { + xf86DestroyI2CDevRec(dev, TRUE); + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32)); + } + } + } else if (pUTSETTVITEMSTATE.dwState == UT_STATE_ON) { + if (xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, pBIOSInfo->TVI2CAdd)) { + dev = xf86CreateI2CDevRec(); + dev->DevName = "TV"; + dev->SlaveAddr = pBIOSInfo->TVI2CAdd; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + + if (xf86I2CDevInit(dev)) { + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + case VIA_TV3: + case VIA_VT1622A: + case VIA_VT1623: + W_Buffer[0] = 0x03; + xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1); + W_Buffer[1] = R_Buffer[0] & ~0x03; + W_Buffer[1] |= (unsigned char) (pUserSetting->tvFFilter - 1); + break; + case VIA_SAA7108: + W_Buffer[0] = 0x37; + xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1); + W_Buffer[1] = R_Buffer[0] & ~0x30; + W_Buffer[1] |= (unsigned char) ((pUserSetting->tvFFilter - 1) << 4); + break; + } + xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0); + xf86DestroyI2CDevRec(dev, TRUE); + pUserSetting->AdaptiveFilterOn = FALSE; + } else { + xf86DestroyI2CDevRec(dev, TRUE); + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32)); + } + } + } else { + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32)); + } + break; + case UT_TV_SETTING_ADAPTIVE_FFILTER: + if (pUTSETTVITEMSTATE.dwState == UT_STATE_OFF) { + if (xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, pBIOSInfo->TVI2CAdd)) { + dev = xf86CreateI2CDevRec(); + dev->DevName = "TV"; + dev->SlaveAddr = pBIOSInfo->TVI2CAdd; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + + if (xf86I2CDevInit(dev)) { + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + pUserSetting->AdaptiveFilterOn = FALSE; + break; + case VIA_TV3: + case VIA_VT1622A: + case VIA_VT1623: + W_Buffer[0] = 0x61; + W_Buffer[1] = 0x00; + xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0); + xf86DestroyI2CDevRec(dev, TRUE); + pUserSetting->AdaptiveFilterOn = FALSE; + break; + case VIA_SAA7108: + case VIA_FS454: + case VIA_CH7009: + case VIA_CH7019: + default: + pUserSetting->AdaptiveFilterOn = FALSE; + break; + } + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + } else { + xf86DestroyI2CDevRec(dev, TRUE); + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32)); + } + } + } else if (pUTSETTVITEMSTATE.dwState == UT_STATE_ON) { + if (xf86I2CProbeAddress(pBIOSInfo->I2C_Port2, pBIOSInfo->TVI2CAdd)) { + dev = xf86CreateI2CDevRec(); + dev->DevName = "TV"; + dev->SlaveAddr = pBIOSInfo->TVI2CAdd; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + + if (xf86I2CDevInit(dev)) { + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + pUserSetting->AdaptiveFilterOn = FALSE; + pUserSetting->tvAdaptiveFFilter = 0; + break; + case VIA_TV3: + case VIA_VT1622A: + case VIA_VT1623: + W_Buffer[0] = 0x03; + xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1); + W_Buffer[1] = R_Buffer[0] & ~0x03; + xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0); + W_Buffer[0] = 0x61; + W_Buffer[1] = (unsigned char) pUserSetting->tvAdaptiveFFilter; + xf86DestroyI2CDevRec(dev, TRUE); + pUserSetting->AdaptiveFilterOn = TRUE; + break; + case VIA_SAA7108: + case VIA_FS454: + case VIA_CH7009: + case VIA_CH7019: + default: + pUserSetting->AdaptiveFilterOn = FALSE; + pUserSetting->tvAdaptiveFFilter = 0; + break; + } + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + } else { + xf86DestroyI2CDevRec(dev, TRUE); + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32)); + } + } + } else { + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32)); + } + break; + case UT_TV_SETTING_DOT_CRAWL: + if (pUTSETTVITEMSTATE.dwState == UT_STATE_OFF || pUTSETTVITEMSTATE.dwState == UT_STATE_DEFAULT) { + pBIOSInfo->TVDotCrawl = FALSE; + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + VIAPreSetTV2Mode(pBIOSInfo); + VIAPostSetTV2Mode(pBIOSInfo); + break; + case VIA_TV3: + case VIA_VT1622A: + VIAPreSetTV3Mode(pBIOSInfo); + VIAPostSetTV3Mode(pBIOSInfo); + break; + case VIA_FS454: + VIAPreSetFS454Mode(pBIOSInfo); + VIAPostSetFS454Mode(pBIOSInfo); + break; + case VIA_CH7009: + case VIA_CH7019: + VIAPreSetCH7019Mode(pBIOSInfo); + VIAPostSetCH7019Mode(pBIOSInfo); + break; + } + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + } else if (pUTSETTVITEMSTATE.dwState == UT_STATE_ON) { + pBIOSInfo->TVDotCrawl = TRUE; + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + VIAPreSetTV2Mode(pBIOSInfo); + VIAPostSetTV2Mode(pBIOSInfo); + break; + case VIA_TV3: + case VIA_VT1622A: + case VIA_VT1623: + VIAPreSetTV3Mode(pBIOSInfo); + VIAPostSetTV3Mode(pBIOSInfo); + break; + case VIA_FS454: + VIAPreSetFS454Mode(pBIOSInfo); + VIAPostSetFS454Mode(pBIOSInfo); + break; + case VIA_CH7009: + case VIA_CH7019: + VIAPreSetCH7019Mode(pBIOSInfo); + VIAPostSetCH7019Mode(pBIOSInfo); + break; + } + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + } else { + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32)); + } + break; + case UT_TV_SETTING_LOCK_ASPECT_RATIO: + if (pUTSETTVITEMSTATE.dwState == UT_STATE_OFF) { + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetNoFunc, sizeof(CARD32)); + } else if (pUTSETTVITEMSTATE.dwState == UT_STATE_ON) { + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetNoFunc, sizeof(CARD32)); + } else { + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32)); + } + break; + default: + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32)); + break; + } + break; + default: + memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32)); + InParam += 4; + ErrorF(" via_utility.c : dwAction not supported\n"); + break; + } + break; + case UT_XV_FUNC_GAMMA: + switch (dwAction) { + case UT_ESC_FUNC_GAMMA_GetDeviceSupportState: + if (pScrn->bitsPerPixel == 8) + dwSupportState = UT_DEVICE_NONE; + else + dwSupportState = UT_DEVICE_CRT1 | UT_DEVICE_TV | UT_DEVICE_DFP | UT_DEVICE_LCD; + /*dwSupportState = UT_DEVICE_NONE; */ + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + InParam += 4; + memcpy((void *) InParam, &dwSupportState, sizeof(CARD32)); + break; + case UT_ESC_FUNC_GAMMA_GetLookUpTable: + if (VIASavePalette(pScrn, pBIOSInfo->colors)) { + for (i = 0; i < 256; i++) { + pUTGAMMAINFO.LookUpTable[i] = ((CARD32) pBIOSInfo->colors[i].red) << 16; + pUTGAMMAINFO.LookUpTable[i] |= ((CARD32) pBIOSInfo->colors[i].green) << 8; + pUTGAMMAINFO.LookUpTable[i] |= (CARD32) pBIOSInfo->colors[i].blue; + } + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + InParam += 4; + memcpy((void *) InParam, pUTGAMMAINFO.LookUpTable, sizeof(pUTGAMMAINFO.LookUpTable)); + } else { + memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32)); + } + break; + case UT_ESC_FUNC_GAMMA_SetLookUpTable: + InParam = buf + 12; + memcpy(&pUTGAMMAINFO, (void *) InParam, sizeof(UTGAMMAINFO)); + if (pUTGAMMAINFO.LookUpTable[0] == 0xFFFFFFFF) { /* Set default gamma value */ + for (i = 0; i < 256; i++) { + pBIOSInfo->colors[i].red = i; + pBIOSInfo->colors[i].green = i; + pBIOSInfo->colors[i].blue = i; + } + } else { + for (i = 0; i < 256; i++) { + pBIOSInfo->colors[i].red = (unsigned short) (pUTGAMMAINFO.LookUpTable[i] >> 16); + pBIOSInfo->colors[i].green = (unsigned short) (pUTGAMMAINFO.LookUpTable[i] >> 8) & 0x00FF; + pBIOSInfo->colors[i].blue = (unsigned short) (pUTGAMMAINFO.LookUpTable[i] & 0x000000FF); + } + } + if (VIARestorePalette(pScrn, pBIOSInfo->colors)) { + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + } else { + InParam = buf + 8; + memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32)); + } + break; + case UT_ESC_FUNC_GAMMA_GetDefaultLookUpTable: + for (i = 0; i < 256; i++) { + pUTGAMMAINFO.LookUpTable[i] = (CARD32) i << 16; + pUTGAMMAINFO.LookUpTable[i] |= (CARD32) i << 8; + pUTGAMMAINFO.LookUpTable[i] |= (CARD32) i; + } + memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32)); + InParam += 4; + memcpy((void *) InParam, pUTGAMMAINFO.LookUpTable, sizeof(pUTGAMMAINFO.LookUpTable)); + break; + default: + memcpy((void *) InParam, &dwUTRetNoFunc, sizeof(CARD32)); + InParam += 4; + ErrorF(" via_utility.c : dwAction not supported\n"); + break; + } + break; + default: + ErrorF(" via_utility.c : dwFunc not supported\n"); + memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32)); + InParam += 4; + break; + } /* end of switch */ +} + +Bool VIAUTGetInfo(VIABIOSInfoPtr pBIOSInfo) +{ + VIAUserSettingPtr pUserSetting = pBIOSInfo->UserSetting; + I2CDevPtr dev; + unsigned char W_Buffer[3]; + unsigned char R_Buffer[2]; + + DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIAUTGetInfo\n")); + if (pBIOSInfo->TVEncoder) { + dev = xf86CreateI2CDevRec(); + dev->DevName = "TV"; + dev->SlaveAddr = pBIOSInfo->TVI2CAdd; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + + if (xf86I2CDevInit(dev)) { + switch (pBIOSInfo->TVEncoder) { + case VIA_TV2PLUS: + case VIA_TV3: + case VIA_VT1622A: + pUserSetting->tvHPosition = 6; + pUserSetting->tvVPosition = 6; + + W_Buffer[0] = 0x03; + xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1); + pUserSetting->tvFFilter = (R_Buffer[0] & 0x03) + 1; + + W_Buffer[0] = 0x0B; + xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1); + pUserSetting->tvBrightness = R_Buffer[0]; + + W_Buffer[0] = 0x0C; + xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1); + pUserSetting->tvContrast = R_Buffer[0]; + + W_Buffer[0] = 0x0D; + xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1); + pUserSetting->tvSaturation = R_Buffer[0] << 8; + W_Buffer[0] = 0x0A; + xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1); + pUserSetting->tvSaturation += R_Buffer[0]; + + break; + case VIA_VT1623: + VIAGPIOI2C_Initial(pBIOSInfo, 0x40); + pUserSetting->tvHPosition = 6; + pUserSetting->tvVPosition = 6; + + VIAGPIOI2C_Read(pBIOSInfo, 0x03, R_Buffer, 1); + pUserSetting->tvFFilter = (R_Buffer[0] & 0x03) + 1; + + VIAGPIOI2C_Read(pBIOSInfo, 0x0B, R_Buffer, 1); + pUserSetting->tvBrightness = R_Buffer[0]; + + VIAGPIOI2C_Read(pBIOSInfo, 0x0C, R_Buffer, 1); + pUserSetting->tvContrast = R_Buffer[0]; + + VIAGPIOI2C_Read(pBIOSInfo, 0x0D, R_Buffer, 1); + pUserSetting->tvSaturation = R_Buffer[0] << 8; + VIAGPIOI2C_Read(pBIOSInfo, 0x0A, R_Buffer, 1); + pUserSetting->tvSaturation += R_Buffer[0]; + + break; + case VIA_SAA7108: + pUserSetting->tvHPosition = 6; + pUserSetting->tvVPosition = 6; + + W_Buffer[0] = 0x37; + xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1); + pUserSetting->tvFFilter = ((R_Buffer[0] & 0x30) >> 4) + 1; + + pUserSetting->tvBrightness = 0; + pUserSetting->tvContrast = 0; + pUserSetting->tvSaturation = 0; + pUserSetting->tvAdaptiveFFilter = 0; + pUserSetting->tvTint = 0; + pUserSetting->AdaptiveFilterOn = FALSE; + break; + case VIA_CH7009: + case VIA_CH7019: + case VIA_FS454: + default: + pUserSetting->tvHPosition = 0; + pUserSetting->tvVPosition = 0; + pUserSetting->tvFFilter = 0; + pUserSetting->tvBrightness = 0; + pUserSetting->tvContrast = 0; + pUserSetting->tvSaturation = 0; + pUserSetting->tvAdaptiveFFilter = 0; + pUserSetting->tvTint = 0; + pUserSetting->AdaptiveFilterOn = FALSE; + break; + } + if (pBIOSInfo->TVEncoder == VIA_TV2PLUS) { + pUserSetting->tvAdaptiveFFilter = 0; + + W_Buffer[0] = 0x10; + xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1); + pUserSetting->tvTint = R_Buffer[0]; + W_Buffer[0] = 0x11; + xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1); + pUserSetting->tvTint += (R_Buffer[0] & 0xE0) << 8; + } else if (pBIOSInfo->TVEncoder == VIA_TV3 || pBIOSInfo->TVEncoder == VIA_VT1622A) { + W_Buffer[0] = 0x61; + xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1); + pUserSetting->tvAdaptiveFFilter = R_Buffer[0]; + W_Buffer[0] = 0x10; + xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1); + pUserSetting->tvTint = R_Buffer[0]; + W_Buffer[0] = 0x11; + xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1); + pUserSetting->tvTint += (R_Buffer[0] & 0x07) << 8; + if (pUserSetting->tvAdaptiveFFilter && !pUserSetting->tvFFilter) + pUserSetting->AdaptiveFilterOn = TRUE; + else + pUserSetting->AdaptiveFilterOn = FALSE; + } else if (pBIOSInfo->TVEncoder == VIA_VT1623) { + VIAGPIOI2C_Read(pBIOSInfo, 0x61, R_Buffer, 1); + pUserSetting->tvAdaptiveFFilter = R_Buffer[0]; + VIAGPIOI2C_Read(pBIOSInfo, 0x10, R_Buffer, 1); + pUserSetting->tvTint = R_Buffer[0]; + VIAGPIOI2C_Read(pBIOSInfo, 0x11, R_Buffer, 1); + pUserSetting->tvTint += (R_Buffer[0] & 0x07) << 8; + if (pUserSetting->tvAdaptiveFFilter && !pUserSetting->tvFFilter) + pUserSetting->AdaptiveFilterOn = TRUE; + else + pUserSetting->AdaptiveFilterOn = FALSE; + } + xf86DestroyI2CDevRec(dev, TRUE); + pUserSetting->DefaultSetting = TRUE; + } else { + xf86DestroyI2CDevRec(dev, TRUE); + DEBUG(xf86Msg(X_DEFAULT, "DevInit fail!\n")); + } + } else + DEBUG(xf86Msg(X_DEFAULT, "No TVEncoder Exist!\n")); + return TRUE; +} + + +Bool VIARestoreUserSetting(VIABIOSInfoPtr pBIOSInfo) +{ + VIAUserSettingPtr pUserSetting = pBIOSInfo->UserSetting; + I2CDevPtr dev; + int i, HPos, VPos, ADWHS, ADWHE; + unsigned char W_Buffer[4], R_Buffer[3]; + dev = xf86CreateI2CDevRec(); + dev->DevName = "TV"; + dev->SlaveAddr = pBIOSInfo->TVI2CAdd; + dev->pI2CBus = pBIOSInfo->I2C_Port2; + if (xf86I2CDevInit(dev)) { + + switch (pBIOSInfo->TVEncoder) { + case VIA_TV3: + case VIA_VT1622A: + if ((pUserSetting->tvHPosition != 6) + || (pUserSetting->tvVPosition != 6)) { + W_Buffer[0] = 0x08; + xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 2); + HPos = R_Buffer[0]; + VPos = R_Buffer[1]; + W_Buffer[0] = 0x1C; + xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1); + HPos |= (R_Buffer[0] & 0x04) << 6; + VPos |= (R_Buffer[0] & 0x02) << 7; + + HPos += pUserSetting->tvHPosition - 6; + VPos += pUserSetting->tvVPosition - 6; + + W_Buffer[0] = 0x08; + W_Buffer[1] = (unsigned char) (HPos & 0xFF); + W_Buffer[2] = (unsigned char) (VPos & 0xFF); + xf86I2CWriteRead(dev, W_Buffer, 3, NULL, 0); + + W_Buffer[1] = R_Buffer[0] & ~0x06; /* [2]1CH, [1]1CH */ + W_Buffer[1] |= (unsigned char) ((HPos >> 6) & 0x04); + W_Buffer[1] |= (unsigned char) ((VPos >> 7) & 0x02); + xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0); + } + + W_Buffer[0] = 0x03; /* Fflick */ + xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1); + if (pUserSetting->AdaptiveFilterOn) { + W_Buffer[1] = R_Buffer[0] & ~0x03; + } else { + W_Buffer[1] = R_Buffer[0] & ~0x03; + W_Buffer[1] |= (unsigned char) (pUserSetting->tvFFilter - 1); + } + xf86I2CWriteRead(dev, W_Buffer, 2, R_Buffer, 0); + + W_Buffer[0] = 0x61; /* Adaptive Fflick */ + W_Buffer[1] = (unsigned char) pUserSetting->tvAdaptiveFFilter; + xf86I2CWriteRead(dev, W_Buffer, 2, R_Buffer, 0); + + W_Buffer[0] = 0x0B; /* BRIGHTNESS */ + W_Buffer[1] = (unsigned char) pUserSetting->tvBrightness; + xf86I2CWriteRead(dev, W_Buffer, 2, R_Buffer, 0); + + W_Buffer[0] = 0x0C; /* CONTRAST */ + W_Buffer[1] = (unsigned char) pUserSetting->tvContrast; + xf86I2CWriteRead(dev, W_Buffer, 2, R_Buffer, 0); + + W_Buffer[0] = 0x0D; /* SATURATION highbyte */ + W_Buffer[1] = (unsigned char) (pUserSetting->tvSaturation >> 8); + xf86I2CWriteRead(dev, W_Buffer, 2, R_Buffer, 0); + W_Buffer[0] = 0x0A; /* SATURATION lowbyte */ + W_Buffer[1] = (unsigned char) pUserSetting->tvSaturation & 0xFF; + xf86I2CWriteRead(dev, W_Buffer, 2, R_Buffer, 0); + + W_Buffer[0] = 0x11; /* TINT highbyte */ + xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1); + W_Buffer[2] = R_Buffer[0] & ~0xE0; + W_Buffer[2] |= (unsigned char) (pUserSetting->tvTint >> 8); + W_Buffer[0] = 0x10; /* TINT lowbyte */ + W_Buffer[1] = (unsigned char) pUserSetting->tvTint & 0xFF; + xf86I2CWriteRead(dev, W_Buffer, 3, R_Buffer, 0); + break; + case VIA_SAA7108: + if ((pUserSetting->tvHPosition - 6) != 0) { + W_Buffer[0] = 0x70; + xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 3); + ADWHS = (R_Buffer[0] | ((R_Buffer[2] & 0x07) << 8)) + + (pUserSetting->tvHPosition - 6); + ADWHE = (R_Buffer[1] | ((R_Buffer[2] & 0x70) << 4)) + + (pUserSetting->tvHPosition - 6); + W_Buffer[0] = 0x70; + W_Buffer[1] = ADWHS & 0xFF; + W_Buffer[2] = ADWHE & 0xFF; + W_Buffer[3] = (R_Buffer[2] & ~0x77) | ((ADWHS & 0x700) >> 8) + | ((ADWHE & 0x700) >> 4); + xf86I2CWriteRead(dev, W_Buffer, 4, NULL, 0); + } + for (i = 0; i < 3; i++) { + W_Buffer[0] = VIASAA7108PostionOffset[i]; + if (pBIOSInfo->TVVScan == VIA_TVNORMAL) + W_Buffer[1] = VIASAA7108PostionNormalTabRec[pBIOSInfo->TVType - 1][pBIOSInfo->resTVMode][pUserSetting->tvVPosition][i]; + else + W_Buffer[1] = VIASAA7108PostionOverTabRec[pBIOSInfo->TVType - 1][pBIOSInfo->resTVMode][pUserSetting->tvVPosition][i]; + xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0); + } + W_Buffer[0] = 0x37; + W_Buffer[1] = R_Buffer[0] & ~0x30; + if (!pUserSetting->AdaptiveFilterOn) { + W_Buffer[1] |= (unsigned char) ((pUserSetting->tvFFilter - 1) << 4); + } + xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1); + break; + case VIA_VT1623: + case VIA_CH7009: + case VIA_CH7019: + case VIA_FS454: + default: + break; + } + + xf86DestroyI2CDevRec(dev, TRUE); + return TRUE; + } else { + xf86DestroyI2CDevRec(dev, TRUE); + return FALSE; + } +} diff --git a/src/via_utility.h b/src/via_utility.h new file mode 100644 index 0000000..79b8387 --- /dev/null +++ b/src/via_utility.h @@ -0,0 +1,459 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_utility.h,v 1.3 2003/08/27 15:16:14 tsi Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef _VIA_UTILITY_H_ +#define _VIA_UTILITY_H_ 1 + +/* + * Define for Utility functions using XvPutImage. + */ + +/* Primary ID */ +#define UT_XV_FUNC_BIOS 0x11 /* Primary ID */ +#define UT_XV_FUNC_DRIVER 0x12 +#define UT_XV_FUNC_DEVICE 0x13 +#define UT_XV_FUNC_PANEL 0x14 +#define UT_XV_FUNC_TV 0x15 +#define UT_XV_FUNC_GAMMA 0x16 + +/* Secondary ID */ +#define UT_XV_FUNC_BIOS_GetChipID 0x01 /* Get Chip ID */ +#define UT_XV_FUNC_BIOS_GetVersion 0x02 /* Get the version of the BIOS */ +#define UT_XV_FUNC_BIOS_GetDate 0x03 /* Get the date (year, month, day) of the BIOS. */ +#define UT_XV_FUNC_BIOS_GetVideoMemSizeMB 0x04 /* Get the video memory size, in MB */ + +#define UT_XV_FUNC_DRIVER_GetFileName 0x01 +#define UT_XV_FUNC_DRIVER_GetFileVersion 0x02 + +#define UT_XV_FUNC_DEVICE_GetSupportState 1 +#define UT_XV_FUNC_DEVICE_GetConnectState 2 +#define UT_XV_FUNC_DEVICE_GetActiveState 3 +#define UT_XV_FUNC_DEVICE_SetActiveState 4 +#define UT_XV_FUNC_DEVICE_GetSAMMState 5 +#define UT_XV_FUNC_DEVICE_GetRoateState 6 +#define UT_XV_FUNC_DEVICE_SetRoateState 7 + +#define UT_XV_FUNC_DEVICE_SetTargetPanel 1 +#define UT_XV_FUNC_DEVICE_GetPanelInfo 2 +#define UT_XV_FUNC_DEVICE_GetExpandState 3 +#define UT_XV_FUNC_DEVICE_SetExpandState 4 +#define UT_XV_FUNC_DEVICE_GetSupportExpand 5 + +#define UT_XV_FUNC_TV_GetSupportStandardState 1 +#define UT_XV_FUNC_TV_GetStandard 2 +#define UT_XV_FUNC_TV_SetStandard 3 +#define UT_XV_FUNC_TV_GetSupportSignalTypeState 4 +#define UT_XV_FUNC_TV_GetSignalType 5 +#define UT_XV_FUNC_TV_SetSignalType 6 +#define UT_XV_FUNC_TV_GetMaxViewSizeValue 7 +#define UT_XV_FUNC_TV_GetViewSizeValue 8 +#define UT_XV_FUNC_TV_SetViewSizeValue 9 +#define UT_XV_FUNC_TV_GetMaxViewPositionValue 10 +#define UT_XV_FUNC_TV_GetViewPositionValue 11 +#define UT_XV_FUNC_TV_SetViewPositionValue 12 +#define UT_XV_FUNC_TV_GetSupportTuningState 13 +#define UT_XV_FUNC_TV_GetTuningItemMaxValue 14 +#define UT_XV_FUNC_TV_GetTuningItemValue 15 +#define UT_XV_FUNC_TV_SetTuningItemValue 16 +#define UT_XV_FUNC_TV_GetSupportSettingState 17 +#define UT_XV_FUNC_TV_GetSettingItemState 18 +#define UT_XV_FUNC_TV_SetSettingItemState 19 + +#define UT_ESC_FUNC_GAMMA_GetDeviceSupportState 1 +#define UT_ESC_FUNC_GAMMA_GetLookUpTable 2 +#define UT_ESC_FUNC_GAMMA_SetLookUpTable 3 +#define UT_ESC_FUNC_GAMMA_GetDefaultLookUpTable 4 + +/* Input & Output Data */ +#define DISPLAY_DRIVER 1 +#define VIDEO_CAPTURE_DRIVER 2 +#define HWOVERLAY_DRIVER 3 +#define UT_DEVICE_NONE 0x00 +#define UT_DEVICE_CRT1 0x01 +#define UT_DEVICE_LCD 0x02 +#define UT_DEVICE_TV 0x04 +#define UT_DEVICE_DFP 0x08 +#define UT_DEVICE_CRT2 0x16 +#define UT_STATE_SAMM_OFF 0 /* Not in SAMM mode. */ +#define UT_STATE_SAMM_ON 1 /* In SAMM mode. */ +#define UT_ROTATE_NONE 0 /* Normal. */ +#define UT_ROTATE_90_DEG 1 /* Rotate 90 deg. clockwise. */ +#define UT_ROTATE_180_DEG 2 /* Rotate 180 deg. clockwise. */ +#define UT_ROTATE_270_DEG 3 /* Rotate 270 deg. clockwise. */ +#define UT_PANEL_TYPE_STN 0 /* STN. */ +#define UT_PANEL_TYPE_TFT 1 /* TFT. */ +#define UT_STATE_EXPAND_OFF 0 /* Not expanded; centered. */ +#define UT_STATE_EXPAND_ON 1 /* Expanded. */ +#define UT_PANEL_SUPPORT_EXPAND_OFF 0 +#define UT_PANEL_SUPPORT_EXPAND_ON 1 +#define UT_TV_STD_NTSC 0x0001 /* NTSC. */ +#define UT_TV_STD_PAL 0x0002 /* PAL. */ +#define UT_TV_STD_PAL_M 0x0004 /* PAL M. */ +#define UT_TV_STD_PAL_N 0x0008 /* PAL N. */ +#define UT_TV_STD_PAL_NC 0x0010 /* PAL N combination. */ +#define UT_TV_SGNL_COMPOSITE 0x0001 /* Composite. */ +#define UT_TV_SGNL_S_VIDEO 0x0002 /* S-Video. */ +#define UT_TV_SGNL_SCART 0x0004 /* SCART. */ +#define UT_TV_SGNL_COMP_OUTPUT 0x0008 /* Component Output. */ +#define UT_TV_TUNING_FFILTER 0x0001 /* Flicker Filter. */ +#define UT_TV_TUNING_ADAPTIVE_FFILTER 0x0002 /* Adaptive Flicker Filter. */ +#define UT_TV_TUNING_BRIGHTNESS 0x0004 /* Brightness. */ +#define UT_TV_TUNING_CONTRAST 0x0008 /* Contrast. */ +#define UT_TV_TUNING_SATURATION 0x0010 /* Saturation. */ +#define UT_TV_TUNING_TINT 0x0020 /* Tint. */ +#define UT_TV_SETTING_FFILTER 0x0001 +#define UT_TV_SETTING_ADAPTIVE_FFILTER 0x0002 +#define UT_TV_SETTING_DOT_CRAWL 0x0004 +#define UT_TV_SETTING_LOCK_ASPECT_RATIO 0x0008 +#define UT_STATE_OFF 0 +#define UT_STATE_ON 1 +#define UT_STATE_DEFAULT 0xFFFF + + +typedef struct _UTBIOSVERSION +{ + CARD32 dwVersion; /* The version. */ + CARD32 dwRevision; /* The revision. */ +} UTBIOSVERSION; + +typedef struct _UTBIOSDATE +{ + CARD32 dwYear; /* Year, like 2001. */ + CARD32 dwMonth; /* Month, like 5, 12. */ + CARD32 dwDay; /* Day, like 7, 30. */ +} UTBIOSDATE; + +typedef struct _UTDriverVersion +{ + CARD32 dwMajorNum; + CARD32 dwMinorNum; + CARD32 dwReversionNum; +} UTDriverVersion; + +typedef struct _UTXYVALUE +{ + CARD32 dwX; + CARD32 dwY; +} UTXYVALUE; + +typedef struct _UTDEVICEINFO +{ + CARD32 dwDeviceType; + CARD32 dwResX; + CARD32 dwResY; + CARD32 dwColorDepth; +} UTDEVICEINFO; + +typedef struct _UTPANELINFO +{ + CARD32 dwType; /* Panel type */ + CARD32 dwResX; /* X Resolution of the panel. */ + CARD32 dwResY; /* Y Resolution of the panel. */ +} UTPANELINFO; + +typedef struct _UTSETTVTUNINGINFO +{ + CARD32 dwItemID; + CARD32 dwValue; +} UTSETTVTUNINGINFO; + +typedef struct _UTSETTVITEMSTATE +{ + CARD32 dwItemID; + CARD32 dwState; /* Value defined in TV Setting state. */ +} UTSETTVITEMSTATE; + +typedef struct _UTGAMMAINFO +{ + UTDEVICEINFO DeviceInfo; /* E.g., if we want the table of CRT1, we should set */ + CARD32 LookUpTable[256]; /* the dwDeviceType as UT_DEVICE_CRT1. */ +} UTGAMMAINFO; + + +/* Functions protype */ +Bool VIASaveUserSetting(VIABIOSInfoPtr pBIOSInfo); +Bool VIASaveGammaSetting(VIABIOSInfoPtr pBIOSInfo); + +/* Philips SAA7108 TV Position Table Rec. */ +unsigned char VIASAA7108PostionOffset[3] = { 0x6D, 0x92, 0x93 }; +unsigned char VIASAA7108PostionNormalTabRec[2][4][11][3] = { + /* NTSC */ + { + /* 640x480 */ + { + { 0x30, 0x1E, 0x1E }, + { 0x2E, 0x20, 0x20 }, + { 0x2C, 0x22, 0x22 }, + { 0x2A, 0x24, 0x24 }, + { 0x28, 0x26, 0x26 }, + /* default BIOS setting */ + { 0x26, 0x28, 0x28 }, + { 0x24, 0x2A, 0x2A }, + { 0x22, 0x2C, 0x2C }, + { 0x22, 0x30, 0x30 }, + { 0x20, 0x32, 0x32 }, + { 0x20, 0x33, 0x33 } + }, + /* 800x600 */ + { + { 0x32, 0x2E, 0x2E }, + { 0x30, 0x31, 0x31 }, + { 0x2E, 0x34, 0x34 }, + { 0x2C, 0x37, 0x37 }, + { 0x2A, 0x3A, 0x3A }, + /* default BIOS setting */ + { 0x28, 0x3D, 0x3D }, + { 0x26, 0x40, 0x40 }, + { 0x24, 0x43, 0x43 }, + { 0x22, 0x46, 0x46 }, + { 0x20, 0x48, 0x48 }, + { 0x20, 0x49, 0x49 } + }, + /* 1024x768 */ + { + { 0x2E, 0x4F, 0x4F }, + { 0x2C, 0x55, 0x55 }, + { 0x2A, 0x5A, 0x5A }, + { 0x28, 0x60, 0x60 }, + { 0x26, 0x65, 0x65 }, + /* default BIOS setting */ + { 0x24, 0x69, 0x69 }, + { 0x22, 0x6D, 0x6D }, + { 0x20, 0x71, 0x71 }, + { 0x20, 0x73, 0x73 }, + { 0x20, 0x74, 0x74 }, + { 0x20, 0x76, 0x76 } + }, + /* 848x480 */ + { + { 0x30, 0x1E, 0x1E }, + { 0x2E, 0x20, 0x20 }, + { 0x2C, 0x22, 0x22 }, + { 0x2A, 0x24, 0x24 }, + { 0x28, 0x26, 0x26 }, + /* default BIOS setting */ + { 0x26, 0x28, 0x28 }, + { 0x24, 0x2A, 0x2A }, + { 0x22, 0x2C, 0x2C }, + { 0x22, 0x30, 0x30 }, + { 0x20, 0x32, 0x32 }, + { 0x20, 0x33, 0x33 } + } + }, + /* PAL */ + { + /* 640x480 */ + { + { 0x21, 0x42, 0x42 }, + { 0x23, 0x44, 0x44 }, + { 0x23, 0x45, 0x45 }, + { 0x23, 0x46, 0x46 }, + { 0x25, 0x47, 0x47 }, + /* default BIOS setting */ + { 0x25, 0x48, 0x48 }, + { 0x25, 0x49, 0x49 }, + { 0x27, 0x4B, 0x4B }, + { 0x2B, 0x4E, 0x4E }, + { 0x2D, 0x50, 0x50 }, + { 0x2F, 0x52, 0x52 } + }, + /* 800x600 */ + { + { 0x30, 0x3F, 0x3F }, + { 0x2E, 0x41, 0x41 }, + { 0x2C, 0x43, 0x43 }, + { 0x2A, 0x45, 0x45 }, + { 0x28, 0x47, 0x47 }, + /* default BIOS setting */ + { 0x26, 0x49, 0x49 }, + { 0x24, 0x4B, 0x4B }, + { 0x22, 0x4D, 0x4D }, + { 0x20, 0x51, 0x51 }, + { 0x20, 0x52, 0x52 }, + { 0x20, 0x53, 0x53 } + }, + /* 1024x768 */ + { + { 0x26, 0x5F, 0x5F }, + { 0x24, 0x61, 0x61 }, + { 0x24, 0x62, 0x62 }, + { 0x22, 0x64, 0x64 }, + { 0x22, 0x65, 0x65 }, + /* default BIOS setting */ + { 0x22, 0x66, 0x66 }, + { 0x22, 0x67, 0x67 }, + { 0x22, 0x68, 0x68 }, + { 0x22, 0x69, 0x69 }, + { 0x22, 0x6A, 0x6A }, + { 0x20, 0x6D, 0x6D } + }, + /* 848x480 */ + { + { 0x21, 0x42, 0x42 }, + { 0x23, 0x44, 0x44 }, + { 0x23, 0x45, 0x45 }, + { 0x23, 0x46, 0x46 }, + { 0x25, 0x47, 0x47 }, + /* default BIOS setting */ + { 0x25, 0x48, 0x48 }, + { 0x25, 0x49, 0x49 }, + { 0x27, 0x4B, 0x4B }, + { 0x2B, 0x4E, 0x4E }, + { 0x2D, 0x50, 0x50 }, + { 0x2F, 0x52, 0x52 } + } + } +}; + +unsigned char VIASAA7108PostionOverTabRec[2][4][11][3] = { + /* NTSC */ + { + /* 640x480 */ + { + { 0x34, 0x0C, 0x0C }, + { 0x32, 0x0E, 0x0E }, + { 0x30, 0x10, 0x10 }, + { 0x2E, 0x12, 0x12 }, + { 0x2C, 0x14, 0x14 }, + /* default BIOS setting */ + { 0x2A, 0x16, 0x16 }, + { 0x28, 0x18, 0x18 }, + { 0x26, 0x1A, 0x1A }, + { 0x24, 0x1C, 0x1C }, + { 0x24, 0x1D, 0x1D }, + { 0x22, 0x1F, 0x1F } + }, + /* 800x600 */ + { + { 0x2C, 0x1A, 0x1A }, + { 0x2A, 0x1C, 0x1C }, + { 0x28, 0x1E, 0x1E }, + { 0x28, 0x1F, 0x1F }, + { 0x26, 0x22, 0x22 }, + /* default BIOS setting */ + { 0x24, 0x24, 0x24 }, + { 0x24, 0x25, 0x25 }, + { 0x22, 0x27, 0x27 }, + { 0x22, 0x28, 0x28 }, + { 0x20, 0x2A, 0x2A }, + { 0x20, 0x2B, 0x2B } + }, + /* 1024x768 */ + { + { 0x2A, 0x24, 0x24 }, + { 0x28, 0x27, 0x27 }, + { 0x26, 0x2A, 0x2A }, + { 0x26, 0x2B, 0x2B }, + { 0x24, 0x2E, 0x2E }, + /* default BIOS setting */ + { 0x22, 0x31, 0x31 }, + { 0x22, 0x32, 0x32 }, + { 0x22, 0x33, 0x33 }, + { 0x22, 0x34, 0x34 }, + { 0x20, 0x37, 0x37 }, + { 0x20, 0x39, 0x39 } + }, + /* 848x480 */ + { + { 0x34, 0x0C, 0x0C }, + { 0x32, 0x0E, 0x0E }, + { 0x30, 0x10, 0x10 }, + { 0x2E, 0x12, 0x12 }, + { 0x2C, 0x14, 0x14 }, + /* default BIOS setting */ + { 0x2A, 0x16, 0x16 }, + { 0x28, 0x18, 0x18 }, + { 0x26, 0x1A, 0x1A }, + { 0x24, 0x1C, 0x1C }, + { 0x24, 0x1D, 0x1D }, + { 0x22, 0x1F, 0x1F } + } + }, + /* PAL */ + { + /* 640x480 */ + { + { 0x3C, 0x0B, 0x0B }, + { 0x3A, 0x0C, 0x0C }, + { 0x38, 0x0E, 0x0E }, + { 0x34, 0x11, 0x11 }, + { 0x32, 0x13, 0x13 }, + /* default BIOS setting */ + { 0x2E, 0x16, 0x16 }, + { 0x2C, 0x18, 0x18 }, + { 0x28, 0x1B, 0x1B }, + { 0x26, 0x1D, 0x1D }, + { 0x22, 0x20, 0x20 }, + { 0x22, 0x21, 0x21 } + }, + /* 800x600 */ + { + { 0x34, 0x17, 0x17 }, + { 0x32, 0x19, 0x19 }, + { 0x30, 0x1B, 0x1B }, + { 0x2E, 0x1D, 0x1D }, + { 0x2E, 0x1E, 0x1E }, + /* default BIOS setting */ + { 0x2C, 0x20, 0x20 }, + { 0x2C, 0x21, 0x21 }, + { 0x2C, 0x22, 0x22 }, + { 0x2A, 0x24, 0x24 }, + { 0x2A, 0x25, 0x25 }, + { 0x28, 0x27, 0x27 } + }, + /* 1024x768 */ + { + { 0x2C, 0x27, 0x27 }, + { 0x2C, 0x28, 0x28 }, + { 0x2A, 0x2A, 0x2A }, + { 0x28, 0x2C, 0x2C }, + { 0x28, 0x2D, 0x2D }, + /* default BIOS setting */ + { 0x26, 0x2F, 0x2F }, + { 0x26, 0x30, 0x30 }, + { 0x26, 0x31, 0x31 }, + { 0x26, 0x32, 0x32 }, + { 0x24, 0x35, 0x35 }, + { 0x22, 0x37, 0x37 } + }, + /* 848x480 */ + { + { 0x3C, 0x0B, 0x0B }, + { 0x3A, 0x0C, 0x0C }, + { 0x38, 0x0E, 0x0E }, + { 0x34, 0x11, 0x11 }, + { 0x32, 0x13, 0x13 }, + /* default BIOS setting */ + { 0x2E, 0x16, 0x16 }, + { 0x2C, 0x18, 0x18 }, + { 0x28, 0x1B, 0x1B }, + { 0x26, 0x1D, 0x1D }, + { 0x22, 0x20, 0x20 }, + { 0x22, 0x21, 0x21 } + } + } +}; + +#endif /* _VIA_UTILITY_H_ */ diff --git a/src/via_vbe.c b/src/via_vbe.c new file mode 100644 index 0000000..9e1751c --- /dev/null +++ b/src/via_vbe.c @@ -0,0 +1,833 @@ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/* + * VBE OEM Extensions + * + * Most of these are either not used or not working properly. + * Need information from via. + * + */ + +#include "via_driver.h" + +/* + * CARD8 ViaVBEGetActiveDevice(ScrnInfoPtr pScrn); + * + * - Determine which devices (CRT1, LCD, TV, DFP) are active + * + * Need more information: return does not match my biossetting -- luc + * + * + * VBE OEM subfunction 0x0103 (from via code) + * cx = 0x00 + * returns: + * cx = active device + * + */ +CARD8 +ViaVBEGetActiveDevice(ScrnInfoPtr pScrn) +{ + if (VIAPTR(pScrn)->pVbe) { + + xf86Int10InfoPtr pInt10 = VIAPTR(pScrn)->pVbe->pInt10; + CARD8 device = 0; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVBEGetActiveDevice\n")); + + pInt10->ax = 0x4F14; + pInt10->bx = 0x0103; + + pInt10->cx = 0x00; + + pInt10->num = 0x10; + xf86ExecX86int10(pInt10); + + if ((pInt10->ax & 0xFF) != 0x4F) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetActiveDevice: VBE call failed.\n"); + return 0xFF; + } + + if (pInt10->cx & 0x01) + device = VIA_DEVICE_CRT1; + if (pInt10->cx & 0x02) + device |= VIA_DEVICE_LCD; + if (pInt10->cx & 0x04) + device |= VIA_DEVICE_TV; + if (pInt10->cx & 0x20) + device |= VIA_DEVICE_DFP; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Active Device(s): %u\n", device)); + return device; + } + + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetActiveDevice: VBE not initialised.\n"); + return 0xFF; +} + +/* + * CARD16 ViaVBEGetDisplayDeviceInfo(pScrn, *numDevice); + * + * - Returns the maximal vertical resolution of the Display Device + * provided in numDevice (CRT (0), DVI (1), LCD/Panel (2)) + * + * + * VBE OEM subfunction 0x0806 (from via code) + * cx = *numDevice + * di = 0x00 + * returns: + * cx = *numDevice + * di = max. vertical resolution + * + */ +CARD16 +ViaVBEGetDisplayDeviceInfo(ScrnInfoPtr pScrn, CARD8 *numDevice) +{ + if (VIAPTR(pScrn)->pVbe) { + + xf86Int10InfoPtr pInt10 = VIAPTR(pScrn)->pVbe->pInt10; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVBEGetDisplayDeviceInfo\n")); + + pInt10->ax = 0x4F14; + pInt10->bx = 0x0806; + + pInt10->cx = *numDevice; + pInt10->di = 0x00; + + pInt10->num = 0x10; + xf86ExecX86int10(pInt10); + + if ((pInt10->ax & 0xFF) != 0x4F) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetDisplayDeviceInfo: VBE call failed.\n"); + return 0xFFFF; + } + + *numDevice = pInt10->cx; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Vertical Resolution: %u\n", pInt10->di & 0xFFFF)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Panel ID: %u\n", *numDevice)); + + return (pInt10->di & 0xFFFF); + } + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetDisplayDeviceInfo: VBE not initialised.\n"); + return 0xFFFF; +} + +#ifdef UNUSED +/* + * CARD8 ViaVBEGetDisplayDeviceAttached(pScrn); + * + * - Find out which display devices are being used. + * + * Why is CRT2 ignored? + * + * + * VBE OEM subfunction 0x0004 (from via code) + * cx = 0x00 + * returns: + * cx = display devices + * Bit[4] = CRT2 + * Bit[3] = DFP + * Bit[2] = TV + * Bit[1] = LCD + * Bit[0] = CRT + */ +static CARD8 +ViaVBEGetDisplayDeviceAttached(ScrnInfoPtr pScrn) +{ + if (VIAPTR(pScrn)->pVbe) { + + xf86Int10InfoPtr pInt10 = VIAPTR(pScrn)->pVbe->pInt10; + CARD8 device = 0; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVBEGetDisplayDeviceAttached\n")); + + pInt10->ax = 0x4F14; + pInt10->bx = 0x04; + + pInt10->cx = 0x00; + + pInt10->num = 0x10; + xf86ExecX86int10(pInt10); + + if ((pInt10->ax & 0xFF) != 0x4F) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetDisplayDeviceAttached: VBE call failed.\n"); + return 0xFF; + } + + if (pInt10->cx & 0x01) + device = VIA_DEVICE_CRT1; + if (pInt10->cx & 0x02) + device |= VIA_DEVICE_LCD; + if (pInt10->cx & 0x04) + device |= VIA_DEVICE_TV; + if (pInt10->cx & 0x20) + device |= VIA_DEVICE_DFP; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Attached Device(s): %d\n", device)); + return device; + } + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetDisplayDeviceAttached: VBE not initialised.\n"); + return 0xFF; +} +#endif /* UNUSED */ + +/* + * Bool ViaVBEGetBIOSDate(ScrnInfoPtr pScrn); + * + * - Get the BIOS release date and store it in the BIOSInfo. + * + * + * VBE OEM subfunction 0x0100 (from via code) + * cx = 0x00 + * dx = 0x00 + * si = 0x00 + * returns: + * bx = year + * cx = month + * dx = day + * + */ +Bool +ViaVBEGetBIOSDate(ScrnInfoPtr pScrn) +{ + if (VIAPTR(pScrn)->pVbe) { + + xf86Int10InfoPtr pInt10 = VIAPTR(pScrn)->pVbe->pInt10; + VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVBEGetBIOSDate\n")); + + pInt10->ax = 0x4F14; + pInt10->bx = 0x0100; + + pInt10->cx = 0x00; + pInt10->dx = 0x00; + pInt10->si = 0x00; + + pInt10->num = 0x10; + xf86ExecX86int10(pInt10); + + if ((pInt10->ax & 0xff) != 0x4f) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetBIOSDate: VBE call failed.\n"); + return FALSE; + } + + pBIOSInfo->BIOSDateYear = ((pInt10->bx >> 8) - 48) + ((pInt10->bx & 0xFF) - 48) * 10; + pBIOSInfo->BIOSDateMonth = ((pInt10->cx >> 8) - 48) + ((pInt10->cx & 0xFF) - 48) * 10; + pBIOSInfo->BIOSDateDay = ((pInt10->dx >> 8) - 48) + ((pInt10->dx & 0xFF) - 48) * 10; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "BIOS Release Date: %d/%d/%d\n", + pBIOSInfo->BIOSDateYear + 2000, pBIOSInfo->BIOSDateMonth, + pBIOSInfo->BIOSDateDay)); + return TRUE; + } + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetBIOSDate: VBE not initialised.\n"); + return FALSE; +} + +/* + * Bool ViaVBEGetBIOSVersion(ScrnInfoPtr pScrn); + * + * - Return the BIOS version. + * + * Calls VBE subfunction 00h (VBE supplemental specification information.) + * Not functional. + * + * VBE OEM subfunction 0x0000 (??? - from via code) + * cx = 0x00 + * returns: + * bx = version. + * + */ +Bool +ViaVBEGetBIOSVersion(ScrnInfoPtr pScrn) +{ + if (VIAPTR(pScrn)->pVbe) { + + xf86Int10InfoPtr pInt10 = VIAPTR(pScrn)->pVbe->pInt10; + VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVBEGetBIOSVersion\n")); + + pInt10->ax = 0x4F14; + pInt10->bx = 0x00; /* ??? */ + pInt10->cx = 0x00; + pInt10->num = 0x10; + xf86ExecX86int10(pInt10); + + if ((pInt10->ax & 0xff) != 0x4f) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetBIOSVersion: VBE call failed.\n"); + return FALSE; + } + + pBIOSInfo->BIOSMajorVersion = (pInt10->bx >> 8) & 0xFF; + pBIOSInfo->BIOSMinorVersion = pInt10->bx & 0xFF; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "BIOS Version: %d.%d\n", + pBIOSInfo->BIOSMajorVersion, pBIOSInfo->BIOSMinorVersion)); + return TRUE; + } + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetBIOSVersion: VBE not initialised.\n"); + return FALSE; +} + +#ifdef UNUSED +/* + * CARD8 ViaVBEGetFlatPanelInfo(ScrnInfoPtr pScrn); + * + * - Return the flat panel id + * + * + * VBE OEM subfunction 0x0006 (from via code) + * cx = 0x00 + * returns: + * cx = panel id. + * + */ +static CARD8 +ViaVBEGetFlatPanelInfo(ScrnInfoPtr pScrn) +{ + if (VIAPTR(pScrn)->pVbe) { + xf86Int10InfoPtr pInt10 = VIAPTR(pScrn)->pVbe->pInt10; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVBEGetFlatPanelInfo\n")); + + pInt10->ax = 0x4F14; + pInt10->bx = 0x06; + + pInt10->cx = 0x00; + + pInt10->num = 0x10; + xf86ExecX86int10(pInt10); + + if ((pInt10->ax & 0xFF) != 0x4F) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetFlatPanelInfo: VBE call failed!\n"); + return 0xFF; + } + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Panel ID: %u\n", pInt10->cx & 0x0F)); + return (pInt10->cx & 0x0F); + } + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetFlatPanelInfo: VBE not initialised.\n"); + return 0xFF; +} +#endif /* UNUSED */ + +#ifdef UNUSED +/* + * CARD16 ViaVBEGetTVConfiguration(ScrnInfoPtr pScrn, CARD16 dx); + * + * - ... + * + * will only return 0x0000 or 0xFFFF. + * + * VBE OEM subfunction 0x8107 (from via code) + * cx = 0x01 + * dx = ? + * returns: + * dx = tv configuration? + * + */ +static CARD16 +ViaVBEGetTVConfiguration(ScrnInfoPtr pScrn, CARD16 dx) +{ + if (VIAPTR(pScrn)->pVbe) { + xf86Int10InfoPtr pInt10 = VIAPTR(pScrn)->pVbe->pInt10; + CARD16 config = 0; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVBEGetTVConfiguration\n")); + + pInt10->ax = 0x4F14; + pInt10->bx = 0x8107; + pInt10->cx = 0x01; + pInt10->dx = dx; + pInt10->num = 0x10; + xf86ExecX86int10(pInt10); + + if ((pInt10->ax & 0xff) != 0x4f) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetTVConfiguration: VBE call failed.\n"); + return 0xFFFF; + } + + if (pInt10->dx) + config = ViaVBEGetTVConfiguration(pScrn, pInt10->dx); + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV Configuration: %u\n", config)); + return config; + } + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetTVConfiguration: VBE not initialised.\n"); + return 0xFFFF; +} +#endif /* UNUSED */ + +#ifdef UNUSED +/* + * CARD8 ViaVBEGetTVEncoderType(ScrnInfoPtr pScrn); + * + * - Return the type of tv encoder attached. + * + * Calls VBE subfunction 00h (VBE supplemental specification information.) + * Not functional. + * + * VBE OEM subfunction 0x0000 (??? - from via code) + * cx = 0x00 + * returns: + * cx = TV encoder type? + * + */ +static CARD8 +ViaVBEGetTVEncoderType(ScrnInfoPtr pScrn) +{ + if (VIAPTR(pScrn)->pVbe) { + xf86Int10InfoPtr pInt10 = VIAPTR(pScrn)->pVbe->pInt10; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVBEGetTVEncoderType\n")); + + pInt10->ax = 0x4F14; + pInt10->bx = 0x0000; /* ??? */ + + pInt10->cx = 0x00; + + pInt10->num = 0x10; + xf86ExecX86int10(pInt10); + + if ((pInt10->ax & 0xFF) != 0x4F) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetTVEncoderType: VBE call failed.\n"); + return 0xFF; + } + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV Encoder: %u\n", pInt10->cx >> 8)); + return (pInt10->cx >> 8); + } + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetTVEncoderType: VBE not initialised.\n"); + return 0xFF; +} +#endif /* UNUSED */ + +/* + * int ViaVBEGetVideoMemSize(ScrnInfoPtr pScrn); + * + * - Get the memory size from VBE OEM. + * + * Calls VBE subfunction 00h (VBE supplemental specification information.) + * Not functional. + * + * + * VBE OEM subfunction 0x0000 (??? - from via code) + * cx = 0x00 + * dx = 0x00 + * di = 0x00 + * si = 0x00 + * returns: + * si = memory size + * + */ +int +ViaVBEGetVideoMemSize(ScrnInfoPtr pScrn) +{ + if (VIAPTR(pScrn)->pVbe) { + xf86Int10InfoPtr pInt10 = VIAPTR(pScrn)->pVbe->pInt10; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVBEGetVideoMemSize\n")); + + pInt10->ax = 0x4F14; + pInt10->bx = 0x0000; /* ??? */ + + pInt10->cx = 0x00; + pInt10->dx = 0x00; + pInt10->di = 0x00; + pInt10->si = 0x00; + + pInt10->num = 0x10; + xf86ExecX86int10(pInt10); + + if ((pInt10->ax & 0xFF) != 0x4F) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetVideoMemSize: VBE call failed.\n"); + return 0; + } + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Memory Size: %d\n", pInt10->si)); + if (pInt10->si > 1) + return pInt10->si; + return 0; + } + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetVideoMemSize: VBE not initialised.\n"); + return 0; +} + +#ifdef UNUSED +/* + * Bool ViaVBESetActiveDevice(ScrnInfoPtr pScrn); + * + * - Set the active display device from pBIOSInfo + * + * + * VBE OEM subfunction 0x8003 (from via code) + * cx = ActiveDevice + * dx = Mode numbers + * di = Refreshrate + * + */ +static Bool +ViaVBESetActiveDevice(ScrnInfoPtr pScrn) +{ + if (VIAPTR(pScrn)->pVbe) { + xf86Int10InfoPtr pInt10 = VIAPTR(pScrn)->pVbe->pInt10; + VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIAModeTablePtr pViaModeTable = pBIOSInfo->pModeTable; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVBESetActiveDevice\n")); + + pInt10->ax = 0x4F14; + pInt10->bx = 0x8003; + + /* Set Active Device and Translate BIOS byte definition */ + pInt10->cx = 0x00; + if (pBIOSInfo->ActiveDevice & VIA_DEVICE_CRT1) + pInt10->cx = 0x01; + if (pBIOSInfo->ActiveDevice & VIA_DEVICE_LCD) + pInt10->cx |= 0x02; + if (pBIOSInfo->ActiveDevice & VIA_DEVICE_TV) + pInt10->cx |= 0x04; + if (pBIOSInfo->ActiveDevice & VIA_DEVICE_DFP) + pInt10->cx |= 0x20; + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Active Device: %d\n", pInt10->cx)); + + /* Set Current mode */ + pInt10->dx = pViaModeTable->Modes[pBIOSInfo->mode].Mode; + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Mode Number: %d\n", pInt10->dx)); + + /* Set Current Refresh rate */ + switch(pBIOSInfo->Refresh) { + case 60: + pInt10->di = 0; + break; + case 75: + pInt10->di = 5; + break; + case 85: + pInt10->di = 7; + break; + case 100: + pInt10->di = 9; + break; + case 120: + pInt10->di = 10; + break; + default: + pInt10->di = 0; + break; + } + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Refresh Rate Index: %d\n", pInt10->di)); + + pInt10->num = 0x10; + xf86ExecX86int10(pInt10); + + if ((pInt10->ax & 0xFF) != 0x4F) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBESetActiveDevice: VBE call failed.\n"); + return FALSE; + } + return TRUE; + } + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBESetActiveDevice: VBE not initialised.\n"); + return FALSE; +} +#endif /* UNUSED */ + +#ifdef UNUSED +/* + * Bool ViaVBEGetModeInfo(ScrnInfoPtr pScrn, int ModeNo, int *Xres, int *Yres, int *bpp); + * + * - Retrieve resolution and bitdepth from VESA OEM for a given modenumber. + * + * Introduced in CLEXF40037 + * + * VBE OEM subfunction 0x0302 (from via code) + * cx = ModeNo + * dx = 0x00 + * returns: + * bx = Vertical resolution + * cx = Horizontal resolution + * dx & 0xFF = bitdepth + * + */ +static Bool +ViaVBEGetModeInfo(ScrnInfoPtr pScrn, int ModeNo, int *Xres, int *Yres, int *bpp) +{ + if (VIAPTR(pScrn)->pVbe) { + xf86Int10InfoPtr pInt10 = VIAPTR(pScrn)->pVbe->pInt10; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVBEGetModeInfo\n")); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Retrieving info for Mode: %d\n", ModeNo)); + + pInt10->ax = 0x4F14; + pInt10->bx = 0x0302; + + pInt10->cx = ModeNo; + pInt10->dx = 0x00; + /* pInt10->di = 0x00; + pInt10->si = 0x00; */ + + pInt10->num = 0x10; + xf86ExecX86int10(pInt10); + + if ((pInt10->ax & 0xFF) != 0x4F) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetModeInfo: VBE call failed.\n"); + return FALSE; + } + + *Xres = pInt10->cx; + *Yres = pInt10->bx; + *bpp = pInt10->dx & 0xFF; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Retrieved Xres: %d; Yres: %d; bpp %d\n", + *Xres, *Yres, *bpp)); + return TRUE; + } + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetModeInfo: VBE not initialised.\n"); + return FALSE; +} +#endif /* UNUSED */ + +#ifdef UNUSED +/* + * int ViaVBEQueryModeList(ScrnInfoPtr pScrn, int serno, int* ModeNo); + * + * - ... + * + * Introduced in CLEXF40037 + * + * VBE OEM subfunction 0x0202 (from via code) + * cx = 0x00 + * dx = serno + * returns + * cx = Mode number + * dx = serno (next?) + */ +static int +ViaVBEQueryModeList(ScrnInfoPtr pScrn, int serno, int* ModeNo) +{ + if (VIAPTR(pScrn)->pVbe) { + xf86Int10InfoPtr pInt10 = VIAPTR(pScrn)->pVbe->pInt10; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVBEQueryModeList\n")); + + pInt10->ax = 0x4F14; + pInt10->bx = 0x0202; + + pInt10->cx = 0x00; + pInt10->dx = serno; + + pInt10->num = 0x10; + xf86ExecX86int10(pInt10); + + if ((pInt10->ax & 0xFF) != 0x4F) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEQueryModeList: VBE call failed.\n"); + return 0x00; + } + + *ModeNo = pInt10->cx; + + return pInt10->dx; + } + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEQueryModeList: VBE not initialised.\n"); + return 0x00; +} +#endif /* UNUSED */ + +#ifdef UNUSED +/* + * int ViaVBEQuerySupportedRefreshRate(ScrnInfoPtr pScrn, int ModeNo, + * int serno, int *refIndex); + * + * - ... + * + * Introduced in CLEXF40037 + * + * VBE OEM subfunction 0x0201 (from via code) + * cx = Mode Number + * dx = serial number + * returns + * bx = index to refresh rate table + * dx = serial number + */ +static int +ViaVBEQuerySupportedRefreshRate(ScrnInfoPtr pScrn, int ModeNo, int serno, int *refIndex) +{ + if (VIAPTR(pScrn)->pVbe) { + xf86Int10InfoPtr pInt10 = VIAPTR(pScrn)->pVbe->pInt10; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVBEQuerySupportRefreshRate\n")); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ModeNo:%x SerialNo:%d\n", ModeNo, serno)); + + pInt10->ax = 0x4F14; + pInt10->bx = 0x0201; + + pInt10->cx = ModeNo; + pInt10->dx = serno; + /* pInt10->di = 0x00; */ + + pInt10->num = 0x10; + xf86ExecX86int10(pInt10); + + if ((pInt10->ax & 0xFF) != 0x4F) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEQuerySupportedRefreshRate: VBE call failed.\n"); + return 0x00; + } + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "refIndex:%d SerialNo:%d\n", pInt10->bx, pInt10->dx)); + + *refIndex = pInt10->bx; + return pInt10->dx; + } + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEQuerySupportedRefreshRate: VBE not initialised.\n"); + return 0x00; +} +#endif /* UNUSED */ + +#ifdef UNUSED +/* + * Bool ViaVBESetDeviceRefreshRate(ScrnInfoPtr pScrn); + * + * - ... + * + * Introduced in CLEXF40037 + * + * VBE OEM subfunction 0x0001 (from via code) + * cx = active device + * dx = mode (set to 0 currently (by via)) + * di = refresh rate index + */ +static Bool +ViaVBESetDeviceRefreshRate(ScrnInfoPtr pScrn) +{ + if (VIAPTR(pScrn)->pVbe) { + xf86Int10InfoPtr pInt10 = VIAPTR(pScrn)->pVbe->pInt10; + VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVBESetDeviceRefreshRate\n")); + + pInt10->ax = 0x4F14; + pInt10->bx = 0x0001; + + /* Set Active Device and Translate BIOS byte definition */ + pInt10->cx = 0; + if (pBIOSInfo->ActiveDevice & VIA_DEVICE_CRT1) + pInt10->cx = 0x01; + if (pBIOSInfo->ActiveDevice & VIA_DEVICE_LCD) + pInt10->cx |= 0x02; + if (pBIOSInfo->ActiveDevice & VIA_DEVICE_TV) + pInt10->cx |= 0x04; + if (pBIOSInfo->ActiveDevice & VIA_DEVICE_DFP) + pInt10->cx |= 0x20; + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Active device: %d\n", pInt10->cx)); + + /* Set Current mode */ + pInt10->dx = 0; + /* + pInt10->dx = pViaModeTable->Modes[pBIOSInfo->mode].Mode; + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Mode number: %d\n", pInt10->dx)); + */ + + /* Set Current Refresh rate */ + switch(pBIOSInfo->Refresh) { + case 60: + pInt10->di = 0; + break; + case 75: + pInt10->di = 5; + break; + case 85: + pInt10->di = 7; + break; + case 100: + pInt10->di = 9; + break; + case 120: + pInt10->di = 10; + break; + default: + pInt10->di = 0; + break; + } + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Refresh rate index: %d\n", pInt10->di)); + + pInt10->num = 0x10; + xf86ExecX86int10(pInt10); + + if ((pInt10->ax & 0xFF) != 0x4F) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBESetDeviceRefreshRate: VBE call failed.\n"); + return FALSE; + } + return TRUE; + } + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBESetDeviceRefreshRate: VBE not initialised.\n"); + return FALSE; +} +#endif /* UNUSED */ + +#ifdef UNUSED +/* + * Bool ViaVBESetFlatPanelState(ScrnInfoPtr pScrn, Bool expand); + * + * - ... + * + * Introduced in CLEXF40037 + * + * VBE OEM subfunction 0x0306 (from via code) + * cx = expand + */ +static Bool +ViaVBESetFlatPanelState(ScrnInfoPtr pScrn, Bool expand) +{ + if (VIAPTR(pScrn)->pVbe) { + xf86Int10InfoPtr pInt10 = VIAPTR(pScrn)->pVbe->pInt10; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVBESetFlatPanelState\n")); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "expand: %d\n", expand)); + + pInt10->ax = 0x4F14; + pInt10->bx = 0x0306; + + if (expand) + pInt10->cx = 0x81; + else + pInt10->cx = 0x80; + + pInt10->num = 0x10; + xf86ExecX86int10(pInt10); + + if ((pInt10->ax & 0xFF) != 0x4F) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBESetFlatPanelState: VBE call failed.\n"); + return FALSE; + } + return TRUE; + } + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBESetFlatPanelState: VBE not initialised.\n"); + return FALSE; +} +#endif /* UNUSED */ diff --git a/src/via_video.c b/src/via_video.c new file mode 100644 index 0000000..162c319 --- /dev/null +++ b/src/via_video.c @@ -0,0 +1,1269 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_video.c,v 1.17 2004/02/04 04:15:09 dawes Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/* + * I N C L U D E S + */ +#include "xf86.h" +#include "xf86_OSproc.h" +#include "xf86Resources.h" +#include "xf86_ansic.h" +#include "compiler.h" +#include "xf86PciInfo.h" +#include "xf86Pci.h" +#include "xf86fbman.h" +#include "regionstr.h" +#include "via_driver.h" +#include "via_video.h" + +#include "ddmpeg.h" +#include "via_capture.h" +#include "via.h" + +#include "xf86xv.h" +#include "Xv.h" +#include "xaa.h" +#include "xaalocal.h" +#include "dixstruct.h" +#include "via_xvpriv.h" +#include "via_swov.h" +#include "via_memcpy.h" +#include "fourcc.h" + +/* + * D E F I N E + */ +#define OFF_DELAY 200 /* milliseconds */ +#define FREE_DELAY 60000 +#define PARAMSIZE 1024 +#define SLICESIZE 65536 +#define OFF_TIMER 0x01 +#define FREE_TIMER 0x02 +#define TIMER_MASK (OFF_TIMER | FREE_TIMER) + +#define LOW_BAND 0x0CB0 +#define MID_BAND 0x1f10 + +#define XV_IMAGE 0 +#define NTSC_COMPOSITE 1 +#define NTSC_TUNER 2 +#define NTSC_SVIDEO 3 +#define PAL_SVIDEO 4 +#define PAL_60_COMPOSITE 5 +#define PAL_60_TUNER 6 +#define PAL_60_SVIDEO 7 +#define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE) + +#define IN_FLIP ( viaVidEng->ramtab & 0x00000003) +#define IN_DISPLAY ( viaVidEng->interruptflag & 0x00000200) +#define IN_VBLANK ( !IN_DISPLAY ) + +#ifndef XvExtension +void viaInitVideo(ScreenPtr pScreen) {} +#else + +static vidCopyFunc viaFastVidCpy = NULL; + + +/* + * F U N C T I O N D E C L A R A T I O N + */ +XF86VideoAdaptorPtr viaSetupImageVideoG(ScreenPtr); +static void viaStopVideoG(ScrnInfoPtr, pointer, Bool); +static int viaSetPortAttributeG(ScrnInfoPtr, Atom, INT32, pointer); +static int viaGetPortAttributeG(ScrnInfoPtr, Atom ,INT32 *, pointer); +static void viaQueryBestSizeG(ScrnInfoPtr, Bool, + short, short, short, short, unsigned int *, unsigned int *, pointer); +static int viaPutImageG( ScrnInfoPtr, + short, short, short, short, short, short, short, short, + int, unsigned char*, short, short, Bool, RegionPtr, pointer); +static int viaPutVideo(ScrnInfoPtr , + short , short , short , short ,short , short , short , short , + RegionPtr , pointer ); + +static int viaQueryImageAttributesG(ScrnInfoPtr, + int, unsigned short *, unsigned short *, int *, int *); + +static Atom xvBrightness, xvContrast, xvColorKey, xvHue, xvSaturation, xvPort, + xvCompose, xvEncoding, xvMute, xvVolume, xvFreq, xvAudioCtrl, + xvHQV, xvBOB, xvExitTV; + +/* + * S T R U C T S + */ +/* client libraries expect an encoding */ +static XF86VideoEncodingRec DummyEncoding[8] = +{ + { XV_IMAGE , "XV_IMAGE",-1, -1,{1, 1}}, + { NTSC_COMPOSITE , "ntsc-composite",720, 480, { 1001, 60000 }}, + { NTSC_TUNER , "ntsc-tuner",720, 480, { 1001, 60000 }}, + { NTSC_SVIDEO , "ntsc-svideo",720, 480, { 1001, 60000 }}, + { PAL_SVIDEO , "pal-svideo",720, 576, { 1, 50 }}, + { PAL_60_COMPOSITE, "pal_60-composite", 704, 576, { 1, 50 }}, + { PAL_60_TUNER , "pal_60-tuner", 720, 576, { 1, 50 }}, + { PAL_60_SVIDEO , "pal_60-svideo",720, 576, { 1, 50 }} +}; + +#define NUM_FORMATS_G 9 + +static XF86VideoFormatRec FormatsG[NUM_FORMATS_G] = +{ + { 8, TrueColor }, /* Dithered */ + { 8, PseudoColor }, /* Using .. */ + { 8, StaticColor }, + { 8, GrayScale }, + { 8, StaticGray }, /* .. TexelLUT */ + {16, TrueColor}, + {24, TrueColor}, + {16, DirectColor}, + {24, DirectColor} +}; + +#define NUM_ATTRIBUTES_G 17 + +static XF86AttributeRec AttributesG[NUM_ATTRIBUTES_G] = +{ + {XvSettable | XvGettable, 0, (1 << 24) - 1, "XV_COLORKEY"}, + {XvSettable | XvGettable, -1000, 1000, "XV_BRIGHTNESS"}, + {XvSettable | XvGettable, -1000, 1000, "XV_CONTRAST"}, + {XvSettable | XvGettable,-1000,1000,"XV_SATURATION"}, + {XvSettable | XvGettable,-1000,1000,"XV_HUE"}, + {XvSettable | XvGettable,0,255,"XV_MUTE"}, + {XvSettable | XvGettable,0,255,"XV_VOLUME"}, + {XvSettable,0,2,"XV_PORT"}, + {XvSettable,0,2,"XV_COMPOSE"}, + {XvSettable,0,2,"XV_SVIDEO"}, + {XvSettable | XvGettable,0, 255,"XV_ENCODING"}, + {XvSettable | XvGettable,0, 255, "XV_CHANNEL"}, + {XvSettable,0,-1,"XV_FREQ"}, + {XvSettable,0,2,"XV_AUDIOCTRL"}, + {XvSettable,0,2,"XV_HIGHQVDO"}, + {XvSettable,0,2,"XV_BOB"}, + {XvSettable,0,2,"XV_EXITTV"}, +}; + +#define NUM_IMAGES_G 3 + +static XF86ImageRec ImagesG[NUM_IMAGES_G] = +{ + XVIMAGE_YUY2, + XVIMAGE_YV12, + { + /* + * Below, a dummy picture type that is used in XvPutImage only to do + * an overlay update. Introduced for the XvMC client lib. + * Defined to have a zero data size. + */ + + FOURCC_VIA, + XvYUV, + LSBFirst, + {'V','I','A',0x00, + 0x00,0x00,0x00,0x10,0x80,0x00,0x00,0xAA,0x00,0x38,0x9B,0x71}, + 12, + XvPlanar, + 1, + 0, 0, 0, 0 , + 8, 8, 8, + 1, 2, 2, + 1, 2, 2, + {'Y','V','U', + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + XvTopToBottom + } +}; + +static char * XVPORTNAME[5] = +{ + "XV_SWOV", + "XV_TV0" , + "XV_TV1" , + "XV_UTCTRL", + "XV_DUMMY" +}; + +/* + * F U N C T I O N + */ +static __inline void waitVBLANK(vmmtr viaVidEng) +{ + while (IN_DISPLAY); +} + +static __inline void waitIfFlip(vmmtr viaVidEng) +{ + while( IN_FLIP ); +} + + +static __inline void waitDISPLAYBEGIN(vmmtr viaVidEng) +{ + while (IN_VBLANK); +} + +/* + * Decide if the mode support video overlay. This depends on the bandwidth + * of the mode and the type of RAM available. + */ + +static Bool DecideOverlaySupport(ScrnInfoPtr pScrn) +{ + VIAPtr pVia = VIAPTR(pScrn); + LPSCREENINFO Screen; + unsigned long bandwidth; + + if (pVia->IsSecondary) + Screen = &(pVia->graphicInfo.Screen[1]); + else + Screen = &(pVia->graphicInfo.Screen[0]); + + /* Small trick here. We keep the height in 16's of lines and width in 32's + to avoid numeric overflow */ + + bandwidth = (Screen->dwHeight >> 4) * (Screen->dwWidth >> 5) * Screen->dwBPP * Screen->dwRefreshRate; + + VGAOUT8(0x3D4, 0x3D); + switch ((VGAIN8(0x3D5) & 0x70) >> 4) + { + case 0: /* No overlay without DDR */ + case SDR100: + case SDR133: + return FALSE; + case DDR100: + /* Basic limit for DDR100 is about this */ + if(bandwidth > 1800000) + return FALSE; + /* But we have constraints at higher than 800x600 */ + if (Screen->dwWidth > 800) + { + if(Screen->dwBPP != 8) + return FALSE; + if(Screen->dwHeight > 768) + return FALSE; + if(Screen->dwRefreshRate > 60) + return FALSE; + } + return TRUE; + + case DDR133: + if(bandwidth > 7901250) + return FALSE; + return TRUE; + } + return FALSE; +} + + +void viaResetVideo(ScrnInfoPtr pScrn) +{ + VIAPtr pVia = VIAPTR(pScrn); + vmmtr viaVidEng = (vmmtr) pVia->VidMapBase; + + DBG_DD(ErrorF(" via_video.c : viaResetVideo: \n")); + + waitVBLANK(viaVidEng); + + viaVidEng->compose = 0; + viaVidEng->video1_ctl = 0; + viaVidEng->video3_ctl = 0; + +} + +void viaSaveVideo(ScrnInfoPtr pScrn) +{ + VIAPtr pVia = VIAPTR(pScrn); + vmmtr viaVidEng = (vmmtr) pVia->VidMapBase; + + pVia->dwV1 = ((vmmtr)viaVidEng)->video1_ctl; + pVia->dwV3 = ((vmmtr)viaVidEng)->video3_ctl; + waitVBLANK(viaVidEng); + viaVidEng->video1_ctl = 0; + viaVidEng->video3_ctl = 0; +} + +void viaRestoreVideo(ScrnInfoPtr pScrn) +{ + VIAPtr pVia = VIAPTR(pScrn); + vmmtr viaVidEng = (vmmtr) pVia->VidMapBase; + + waitVBLANK(viaVidEng); + viaVidEng->video1_ctl = pVia->dwV1 ; + viaVidEng->video3_ctl = pVia->dwV3 ; +} + +void viaExitVideo(ScrnInfoPtr pScrn) +{ + VIAPtr pVia = VIAPTR(pScrn); + vmmtr viaVidEng = (vmmtr) pVia->VidMapBase; + + DBG_DD(ErrorF(" via_video.c : viaExitVideo : \n")); + + waitVBLANK(viaVidEng); + viaVidEng->video1_ctl = 0; + viaVidEng->video3_ctl = 0; +} + +XF86VideoAdaptorPtr adaptPtr[XV_PORT_NUM]; + +void viaInitVideo(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + VIAPtr pVia = VIAPTR(pScrn); + XF86VideoAdaptorPtr *adaptors, *newAdaptors = NULL; + XF86VideoAdaptorPtr newAdaptor = NULL; + int num_adaptors; + + DBG_DD(ErrorF(" via_video.c : viaInitVideo : \n")); + + if (!viaFastVidCpy) + viaFastVidCpy = viaVidCopyInit("video", pScreen); + + + /* + * We have no KM400 information.. + */ + if(pVia->Chipset == VIA_CLE266) + { + newAdaptor = viaSetupImageVideoG(pScreen); + } + + num_adaptors = xf86XVListGenericAdaptors(pScrn, &adaptors); + + DBG_DD(ErrorF(" via_video.c : num_adaptors : %d\n",num_adaptors)); + if(newAdaptor) { + if(!num_adaptors) { + num_adaptors = 1; + adaptors = &newAdaptor; /* Now ,useless */ + } else { + DBG_DD(ErrorF(" via_video.c : viaInitVideo : Warning !!! MDS not supported yet !\n")); + newAdaptors = /* need to free this someplace */ + xalloc((num_adaptors + 1) * sizeof(XF86VideoAdaptorPtr*)); + if(newAdaptors) { + memcpy(newAdaptors, adaptors, num_adaptors * + sizeof(XF86VideoAdaptorPtr)); + newAdaptors[num_adaptors] = newAdaptor; + adaptors = newAdaptors; + num_adaptors++; + } + } + } + + if(num_adaptors) + xf86XVScreenInit(pScreen, adaptPtr, XV_PORT_NUM); + + if(newAdaptors) + xfree(newAdaptors); +} + + +XF86VideoAdaptorPtr +viaSetupImageVideoG(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + /* XF86VideoAdaptorPtr adaptPtr[XV_PORT_NUM]; */ + viaPortPrivRec *gviaPortPriv[XV_PORT_NUM]; + DevUnion * pdevUnion[XV_PORT_NUM]; + int i; + + DBG_DD(ErrorF(" via_video.c : viaSetupImageVideoG: \n")); + + /* Look for available devices */ + ViaTunerProbe(pScrn); + + xvBrightness = MAKE_ATOM("XV_BRIGHTNESS"); + xvContrast = MAKE_ATOM("XV_CONTRAST"); + xvColorKey = MAKE_ATOM("XV_COLORKEY"); + xvHue = MAKE_ATOM("XV_HUE"); + xvSaturation = MAKE_ATOM("XV_SATURATION"); + xvMute = MAKE_ATOM("XV_MUTE"); + xvVolume = MAKE_ATOM("XV_VOLUME"); + xvPort = MAKE_ATOM("XV_PORT"); + xvCompose = MAKE_ATOM("XV_COMPOSE"); + xvEncoding = MAKE_ATOM("XV_ENCODING"); + xvFreq = MAKE_ATOM("XV_FREQ"); + xvAudioCtrl = MAKE_ATOM("XV_AUDIOCTRL"); + xvHQV = MAKE_ATOM("XV_HIGHQVDO"); + xvBOB = MAKE_ATOM("XV_BOB"); + xvExitTV = MAKE_ATOM("XV_EXITTV"); + + /* AllocatePortPriv();*/ + for ( i = 0; i< XV_PORT_NUM; i ++ ) { + if(!(adaptPtr[i] = xf86XVAllocateVideoAdaptorRec(pScrn))) + return NULL; + + gviaPortPriv[i] = (viaPortPrivPtr)xnfcalloc(1, sizeof(viaPortPrivRec) ); + pdevUnion[i] = (DevUnion *)xnfcalloc(1, sizeof(DevUnion)); + + if(i == 0) /* Overlay engine */ + { + adaptPtr[i]->type = XvInputMask | XvWindowMask | XvImageMask | XvVideoMask | XvStillMask; + adaptPtr[i]->flags = VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT; + } + else + { + adaptPtr[i]->type = XvInputMask | XvWindowMask | XvVideoMask; + adaptPtr[i]->flags = VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT; + } + adaptPtr[i]->name = XVPORTNAME[i]; + adaptPtr[i]->nEncodings = 8; + adaptPtr[i]->pEncodings = DummyEncoding; + adaptPtr[i]->nFormats = sizeof(FormatsG) / sizeof(FormatsG[0]); + adaptPtr[i]->pFormats = FormatsG; + + /* The adapter can handle 1 port simultaneously */ + adaptPtr[i]->nPorts = 1; + adaptPtr[i]->pPortPrivates = pdevUnion[i]; + adaptPtr[i]->pPortPrivates->ptr = (pointer) gviaPortPriv[i]; + if (i == 3) /* Utility port doesn't need attribute */ + { + adaptPtr[i]->nAttributes = 0; + adaptPtr[i]->pAttributes = NULL; + } + else + { + adaptPtr[i]->nAttributes = NUM_ATTRIBUTES_G; + adaptPtr[i]->pAttributes = AttributesG; + } + adaptPtr[i]->nImages = NUM_IMAGES_G; + adaptPtr[i]->pImages = ImagesG; + adaptPtr[i]->PutVideo = viaPutVideo; + adaptPtr[i]->StopVideo = viaStopVideoG; + adaptPtr[i]->SetPortAttribute = viaSetPortAttributeG; + adaptPtr[i]->GetPortAttribute = viaGetPortAttributeG; + adaptPtr[i]->QueryBestSize = viaQueryBestSizeG; + adaptPtr[i]->PutImage = viaPutImageG; + adaptPtr[i]->QueryImageAttributes = viaQueryImageAttributesG; + +#ifdef COLOR_KEY + gviaPortPriv[i]->colorKey = 0x0821; +#endif + gviaPortPriv[i]->brightness = 0; + gviaPortPriv[i]->saturation = 0; + gviaPortPriv[i]->contrast = 0; + gviaPortPriv[i]->hue = 0; + gviaPortPriv[i]->xv_portnum = i; + + /* gotta uninit this someplace */ +#ifdef XFREE86_44 + REGION_NULL(pScreen, &gviaPortPriv[i]->clip); +#else + REGION_INIT(pScreen, &gviaPortPriv[i]->clip, NullBox, 1); +#endif + } /* End of for */ + viaResetVideo(pScrn); + return adaptPtr[0]; +} + + +static Bool +RegionsEqual(RegionPtr A, RegionPtr B) +{ + int *dataA, *dataB; + int num; + + num = REGION_NUM_RECTS(A); + if(num != REGION_NUM_RECTS(B)) + return FALSE; + + if((A->extents.x1 != B->extents.x1) || + (A->extents.x2 != B->extents.x2) || + (A->extents.y1 != B->extents.y1) || + (A->extents.y2 != B->extents.y2)) + return FALSE; + + dataA = (int*)REGION_RECTS(A); + dataB = (int*)REGION_RECTS(B); + + while(num--) { + if((dataA[0] != dataB[0]) || (dataA[1] != dataB[1])) + return FALSE; + dataA += 2; + dataB += 2; + } + + return TRUE; +} + + +static int CreateSWOVSurface(ScrnInfoPtr pScrn, viaPortPrivPtr pPriv, int fourcc, short width, short height) +{ + VIAPtr pVia = VIAPTR(pScrn); + LPDDSURFACEDESC lpSurfaceDesc = &pPriv->SurfaceDesc; + unsigned long retCode; + + if (pVia->Video.VideoStatus & SWOV_SURFACE_CREATED) + return Success; + + lpSurfaceDesc->dwWidth = (unsigned long)width; + lpSurfaceDesc->dwHeight = (unsigned long)height; + lpSurfaceDesc->dwBackBufferCount =1; + + lpSurfaceDesc->dwFourCC = (unsigned long)fourcc; + + if (Success != (retCode = VIAVidCreateSurface(pScrn, lpSurfaceDesc))) + return retCode; + + pPriv->ddLock.dwFourCC = (unsigned long)fourcc; + + VIAVidLockSurface(pScrn, &pPriv->ddLock); + + pPriv->ddLock.SWDevice.lpSWOverlaySurface[0] = pVia->FBBase + pPriv->ddLock.SWDevice.dwSWPhysicalAddr[0]; + pPriv->ddLock.SWDevice.lpSWOverlaySurface[1] = pVia->FBBase + pPriv->ddLock.SWDevice.dwSWPhysicalAddr[1]; + + DBG_DD(ErrorF(" lpSWOverlaySurface[0]: %p\n", pPriv->ddLock.SWDevice.lpSWOverlaySurface[0])); + DBG_DD(ErrorF(" lpSWOverlaySurface[1]: %p\n", pPriv->ddLock.SWDevice.lpSWOverlaySurface[1])); + + pVia->Video.VideoStatus |= SWOV_SURFACE_CREATED|SW_VIDEO_ON; + pVia->Video.dwAction = ACTION_SET_VIDEOSTATUS; + return Success; +} + + +static void DestroySWOVSurface(ScrnInfoPtr pScrn, viaPortPrivPtr pPriv) +{ + VIAPtr pVia = VIAPTR(pScrn); + LPDDSURFACEDESC lpSurfaceDesc = &pPriv->SurfaceDesc; + DBG_DD(ErrorF(" via_video.c : Destroy SW Overlay Surface, fourcc =0x%08x : \n", + lpSurfaceDesc->dwFourCC)); + + if (pVia->Video.VideoStatus & SWOV_SURFACE_CREATED) + { + DBG_DD(ErrorF(" via_video.c : Destroy SW Overlay Surface, VideoStatus =0x%08x : \n", + pVia->Video.VideoStatus)); + } + else + { + DBG_DD(ErrorF(" via_video.c : No SW Overlay Surface Destroyed, VideoStatus =0x%08x : \n", + pVia->Video.VideoStatus)); + return; + } + + VIAVidDestroySurface(pScrn, lpSurfaceDesc); + + pVia->Video.VideoStatus &= ~SWOV_SURFACE_CREATED; + pVia->Video.dwAction = ACTION_SET_VIDEOSTATUS; +} + + +static void StopSWOVerlay(ScrnInfoPtr pScrn) +{ + DDUPDATEOVERLAY UpdateOverlay_Video; + LPDDUPDATEOVERLAY lpUpdateOverlay = &UpdateOverlay_Video; + VIAPtr pVia = VIAPTR(pScrn); + + pVia->Video.VideoStatus &= ~SW_VIDEO_ON; + pVia->Video.dwAction = ACTION_SET_VIDEOSTATUS; + + lpUpdateOverlay->dwFlags = DDOVER_HIDE; + VIAVidUpdateOverlay(pScrn, lpUpdateOverlay); +} + + +static void +viaStopVideoG(ScrnInfoPtr pScrn, pointer data, Bool exit) +{ + VIAPtr pVia = VIAPTR(pScrn); + viaPortPrivPtr pPriv = (viaPortPrivPtr)data; + + DBG_DD(ErrorF(" via_video.c : viaStopVideoG: exit=%d\n", exit)); + + REGION_EMPTY(pScrn->pScreen, &pPriv->clip); + if(exit) { + StopSWOVerlay(pScrn); + DestroySWOVSurface(pScrn, pPriv); + pVia->dwFrameNum = 0; + pPriv->old_drw_x= 0; + pPriv->old_drw_y= 0; + pPriv->old_drw_w= 0; + pPriv->old_drw_h= 0; + } else { + StopSWOVerlay(pScrn); + } +} + +/* App "xawtv" attribute from -1000 to 1000 */ +/* But SAA7113H needs 0 to 255 */ +#define Attr_Mapping(x) x = ( (x + 1000) >> 3 ) + + +/**************************************************************************** + * SetTunerChannel * + * Function: Sets the tuner to a requested channel * + * Inputs: CARD16 channel - the tuner channel to be set. * + * Outputs: NONE * + ****************************************************************************/ +static void SetTunerChannel (ViaTunerPtr pTuner, viaPortPrivPtr pChanPriv, INT32 frequency) +{ + int control; + short divider = 0; + + switch(pChanPriv->dwEncoding) + { + case PAL_60_COMPOSITE : + case PAL_60_TUNER : + case PAL_60_SVIDEO : + divider = 633 + (short)frequency; + break; + case NTSC_COMPOSITE : + case NTSC_TUNER : + case NTSC_SVIDEO : + divider = 733 + (short)frequency; + break; + default: + divider = frequency; + } + + control = 0x8E00; + + if ( divider <= LOW_BAND ) + control |= 0xA0; + else if ( divider <= MID_BAND ) + control |= 0x90; + else + control |= 0x30; + + DBG_DD(ErrorF(" via_video.c : SetTunerChannel : Divider = 0x%08x, Control= 0x%08x, \n", divider,control)); + + if(pTuner) + ViaTunerChannel(pTuner, divider, control); + +} /* SetTunerChannel ()... */ + +/* v4l uses range 0 - 65535; Xv uses -1000 - 1000 */ +static int +v4l_to_xv(int val) { + val = val * 2000 / 65536 - 1000; + if (val < -1000) val = -1000; + if (val > 1000) val = 1000; + return val; +} +static int +xv_to_v4l(int val) { + val = val * 65536 / 2000 + 32768; + if (val < -0) val = 0; + if (val > 65535) val = 65535; + return val; +} + + +static int +viaSetPortAttributeG( + ScrnInfoPtr pScrn, + Atom attribute, + INT32 value, + pointer data +){ + VIAPtr pVia = VIAPTR(pScrn); + vmmtr viaVidEng = (vmmtr) pVia->VidMapBase; + viaPortPrivPtr pPriv = (viaPortPrivPtr)data; + int attr, avalue; + ViaTunerPtr pTuner = NULL; + + if(pPriv->xv_portnum == COMMAND_FOR_TV0) + pTuner = pVia->Tuner[0]; + else if(pPriv->xv_portnum == COMMAND_FOR_TV1) + pTuner = pVia->Tuner[1]; + ; + DBG_DD(ErrorF(" via_video.c : viaSetPortAttributeG : \n")); + + pVia->OverlaySupported = DecideOverlaySupport(pScrn); + + + /* Color Key */ + if(attribute == xvColorKey) { + DBG_DD(ErrorF(" V4L Disable xvColorKey = %08x\n",value)); + + pPriv->colorKey = value; + /* All assume color depth is 16 */ + value &= 0x00FFFFFF; + viaVidEng->color_key = value; + viaVidEng->snd_color_key = value; + REGION_EMPTY(pScrn->pScreen, &pPriv->clip); + DBG_DD(ErrorF(" V4L Disable done xvColorKey = %08x\n",value)); + + /* Color Control */ + } else if (attribute == xvBrightness || + attribute == xvContrast || + attribute == xvSaturation || + attribute == xvHue) { + if (attribute == xvBrightness) + { + DBG_DD(ErrorF(" xvBrightness = %08d\n",value)); + pPriv->pict.brightness = xv_to_v4l(value); + if(pTuner) + ViaTunerBrightness(pTuner, value); + } + if (attribute == xvContrast) + { + DBG_DD(ErrorF(" xvContrast = %08d\n",value)); + pPriv->pict.contrast = xv_to_v4l(value); + if(pTuner) + ViaTunerContrast(pTuner, value); + } + if (attribute == xvSaturation) + { + DBG_DD(ErrorF(" xvSaturation = %08d\n",value)); + pPriv->pict.colour = xv_to_v4l(value); + if(pTuner) + ViaTunerSaturation(pTuner, value); + } + if (attribute == xvHue) + { + DBG_DD(ErrorF(" xvHue = %08d\n",value)); + pPriv->pict.hue = xv_to_v4l(value); + if(pTuner) + ViaTunerHue(pTuner, value); + } + + /* Audio control */ + } else if (attribute == xvMute){ + DBG_DD(ErrorF(" via_video.c : viaSetPortAttributeG : xvMute = %08d\n",value)); + if(value) + value = 1; + ViaAudioMute(pVia, value); + } else if (attribute == xvVolume){ + DBG_DD(ErrorF(" via_video.c : viaSetPortAttributeG : xvVolume = %08d\n",value)); + pPriv->Volume = value; + attr = ATTR_VOLUME; + avalue = value; + /* FIXME */ + /* Tuner control. Channel switch */ + } else if (attribute == xvFreq){ + DBG_DD(ErrorF(" via_video.c : viaSetPortAttributeG : xvFreq = %08x\n",value)); + SetTunerChannel(pTuner, pPriv, value ); + /* Video decoder control. NTSC/PAL, SVIDEO/COMPOSITIVE/TV */ + } else if (attribute == xvEncoding){ + DBG_DD(ErrorF(" xvEncoding = %d. \n",value)); + pPriv->dwEncoding = value; + if(pTuner) + ViaTunerStandard(pTuner, value); + /* VIA Proprietary Attribute for Video control */ + } else if (attribute == xvPort ){ + DBG_DD(ErrorF(" via_video.c : viaSetPortAttributeG : xvPort=%d\n", value)); + + } else if (attribute == xvCompose){ + DBG_DD(ErrorF(" via_video.c : viaSetPortAttributeG : xvCompose=%08x\n",value)); + + } else if (attribute == xvHQV){ + DBG_DD(ErrorF(" via_video.c : viaSetPortAttributeG : xvHQV=%08x\n",value)); + + } else if (attribute == xvBOB){ + DBG_DD(ErrorF(" via_video.c : viaSetPortAttributeG : xvBOB=%08x\n",value)); + + } else if (attribute == xvExitTV){ + DBG_DD(ErrorF(" via_video.c : viaSetPortAttributeG : xvExitTV=%08x\n",value)); + + /* VIA Proprietary Attribute for AUDIO control */ + } else if (attribute == xvAudioCtrl ){ + DBG_DD(ErrorF(" via_video.c : viaSetPortAttributeG : xvAudioSwitch=%d\n", value)); + if(pTuner) + { + ViaAudioMode(pVia, value); + if(pPriv->xv_portnum == COMMAND_FOR_TV0) + ViaAudioSelect(pVia,0); + else + ViaAudioSelect(pVia, 1); + } + }else{ + DBG_DD(ErrorF(" via_video.c : viaSetPortAttributeG : is not supported the attribute")); + return BadMatch; + } + + /* attr,avalue hardware processing goes here */ + (void)attr; + (void)avalue; + + return Success; +} + +static int +viaGetPortAttributeG( + ScrnInfoPtr pScrn, + Atom attribute, + INT32 *value, + pointer data +){ + viaPortPrivPtr pPriv = (viaPortPrivPtr)data; + + DBG_DD(ErrorF(" via_video.c : viaGetPortAttributeG : port %d\n",pPriv->xv_portnum)); + + *value = 0; + + + if (attribute == xvColorKey ) { + *value =(INT32) pPriv->colorKey; + DBG_DD(ErrorF(" via_video.c : ColorKey 0x%x\n",pPriv->colorKey)); + + /* Color Control */ + } else if (attribute == xvBrightness || + attribute == xvContrast || + attribute == xvSaturation || + attribute == xvHue) { + if (attribute == xvBrightness) + { + *value = v4l_to_xv(pPriv->pict.brightness); + DBG_DD(ErrorF(" xvBrightness = %08d\n", *value)); + } + if (attribute == xvContrast) + { + *value = v4l_to_xv(pPriv->pict.contrast); + DBG_DD(ErrorF(" xvContrast = %08d\n", *value)); + } + if (attribute == xvSaturation) + { + *value = v4l_to_xv(pPriv->pict.colour); + DBG_DD(ErrorF(" xvSaturation = %08d\n", *value)); + } + if (attribute == xvHue) + { + *value = v4l_to_xv(pPriv->pict.hue); + DBG_DD(ErrorF(" xvHue = %08d\n", *value)); + } + + }else { + /*return BadMatch*/ ; + } + return Success; +} + +static void +viaQueryBestSizeG( + ScrnInfoPtr pScrn, + Bool motion, + short vid_w, short vid_h, + short drw_w, short drw_h, + unsigned int *p_w, unsigned int *p_h, + pointer data +){ + DBG_DD(ErrorF(" via_video.c : viaQueryBestSizeG :\n")); + *p_w = drw_w; + *p_h = drw_h; + + if(*p_w > 2048 ) + *p_w = 2048; +} + +/* + * To do SW Flip + */ +static void Flip(VIAPtr pVia, viaPortPrivPtr pPriv, int fourcc, unsigned long DisplayBufferIndex) +{ + switch(fourcc) + { + case FOURCC_UYVY: + case FOURCC_YUY2: + while ((VIDInD(HQV_CONTROL) & HQV_SW_FLIP) ); + VIDOutD(HQV_SRC_STARTADDR_Y, pPriv->ddLock.SWDevice.dwSWPhysicalAddr[DisplayBufferIndex]); + VIDOutD(HQV_CONTROL,( VIDInD(HQV_CONTROL)&~HQV_FLIP_ODD) |HQV_SW_FLIP|HQV_FLIP_STATUS); + break; + + case FOURCC_YV12: + default: + while ((VIDInD(HQV_CONTROL) & HQV_SW_FLIP) ); + VIDOutD(HQV_SRC_STARTADDR_Y, pPriv->ddLock.SWDevice.dwSWPhysicalAddr[DisplayBufferIndex]); + VIDOutD(HQV_SRC_STARTADDR_U, pPriv->ddLock.SWDevice.dwSWCbPhysicalAddr[DisplayBufferIndex]); + VIDOutD(HQV_SRC_STARTADDR_V, pPriv->ddLock.SWDevice.dwSWCrPhysicalAddr[DisplayBufferIndex]); + VIDOutD(HQV_CONTROL,( VIDInD(HQV_CONTROL)&~HQV_FLIP_ODD) |HQV_SW_FLIP|HQV_FLIP_STATUS); + break; + } +} + +#ifdef UNUSED +static void CopyDataYUV422( + ScrnInfoPtr pScrn, + VIAPtr pVia, + unsigned char * src, + unsigned char * dst, + int srcPitch, + int dstPitch, + int h, + int w ) +{ + int count; + + /* copy YUY2 data to video memory, + * do 32 bits alignment. + */ + + w <<= 1; /* Each pixel is YU or YV - 16 bits */ + srcPitch <<= 1; + + count = h; + while(count--) { + memcpy(dst, src, w); + src += srcPitch; + dst += dstPitch; + } +} +#endif /* UNUSED */ + +#ifdef UNUSED +static void +CopyDataYUV420( + ScrnInfoPtr pScrn, + VIAPtr pVia, + unsigned char *src1, + unsigned char *src2, + unsigned char *src3, + unsigned char *dst1, + unsigned char *dst2, + unsigned char *dst3, + int srcPitch, + int dstPitch, + int h, + int w +){ + int count; + + /* copy Y component to video memory */ + count = h; + while(count--) { + memcpy(dst1, src1, w); + src1 += srcPitch; + dst1 += dstPitch; + } + + /* UV component is 1/4 of Y */ + w >>= 1; + h >>= 1; + srcPitch >>= 1; + dstPitch >>= 1; + + /* copy V(Cr) component to video memory */ + count = h; + while(count--) { + memcpy(dst2, src2, w); + src2 += srcPitch; + dst2 += dstPitch; + } + + /* copy U(Cb) component to video memory */ + count = h; + while(count--) { + memcpy(dst3, src3, w); + src3 += srcPitch; + dst3 += dstPitch; + } +} +#endif /* UNUSED */ + +static int +viaPutImageG( + ScrnInfoPtr pScrn, + short src_x, short src_y, + short drw_x, short drw_y, + short src_w, short src_h, + short drw_w, short drw_h, + int id, unsigned char* buf, + short width, short height, + Bool sync, + RegionPtr clipBoxes, pointer data +){ + VIAPtr pVia = VIAPTR(pScrn); + viaPortPrivPtr pPriv = (viaPortPrivPtr)data; + vmmtr viaVidEng = (vmmtr) pVia->VidMapBase; + unsigned long retCode; +/* int i; + BoxPtr pbox; */ + +# ifdef XV_DEBUG + ErrorF(" via_video.c : viaPutImageG : called\n"); + ErrorF(" via_video.c : FourCC=0x%x width=%d height=%d sync=%d\n",id,width,height,sync); + ErrorF(" via_video.c : src_x=%d src_y=%d src_w=%d src_h=%d colorkey=0x%x\n",src_x, src_y, src_w, src_h, pPriv->colorKey); + ErrorF(" via_video.c : drw_x=%d drw_y=%d drw_w=%d drw_h=%d\n",drw_x,drw_y,drw_w,drw_h); +# endif + + switch ( pPriv->xv_portnum ) + { + case COMMAND_FOR_TV0 : + case COMMAND_FOR_TV1 : + DBG_DD(ErrorF(" via_video.c : : Shall not happen! \n")); + break; + + case COMMAND_FOR_SWOV : + case COMMAND_FOR_DUMMY : + { + DDUPDATEOVERLAY UpdateOverlay_Video; + LPDDUPDATEOVERLAY lpUpdateOverlay = &UpdateOverlay_Video; + + int dstPitch; + unsigned long dwUseExtendedFIFO=0; + + DBG_DD(ErrorF(" via_video.c : : S/W Overlay! \n")); + + /* Allocate video memory(CreateSurface), + * add codes to judge if need to re-create surface + */ + if ( (pPriv->old_src_w != src_w) || (pPriv->old_src_h != src_h) ) + DestroySWOVSurface(pScrn, pPriv); + + if (Success != ( retCode = CreateSWOVSurface(pScrn, pPriv, id, width, height) )) + { + DBG_DD(ErrorF(" : Fail to Create SW Video Surface\n")); + return retCode; + } + + + /* Copy image data from system memory to video memory + * TODO: use DRM's DMA feature to accelerate data copy + */ + if (FOURCC_VIA != id) { + dstPitch = pPriv->ddLock.SWDevice.dwPitch; + + switch(id) { + case FOURCC_YV12: + (*viaFastVidCpy)(pPriv->ddLock.SWDevice.lpSWOverlaySurface[pVia->dwFrameNum&1],buf,dstPitch,width,height,0); + break; + case FOURCC_UYVY: + case FOURCC_YUY2: + default: + (*viaFastVidCpy)(pPriv->ddLock.SWDevice.lpSWOverlaySurface[pVia->dwFrameNum&1],buf,dstPitch,width,height,1); break; + } + } + /* If there is bandwidth issue, block the H/W overlay */ + if ((viaVidEng->video3_ctl & 0x00000001) && !pVia->OverlaySupported) + return BadAlloc; + + /* + * fill video overlay parameter + */ + lpUpdateOverlay->rSrc.left = src_x; + lpUpdateOverlay->rSrc.top = src_y; + lpUpdateOverlay->rSrc.right = src_x + width; + lpUpdateOverlay->rSrc.bottom = src_y + height; + + lpUpdateOverlay->rDest.left = drw_x; + lpUpdateOverlay->rDest.top = drw_y; + lpUpdateOverlay->rDest.right = lpUpdateOverlay->rDest.left + drw_w; + lpUpdateOverlay->rDest.bottom = drw_y + drw_h; + + lpUpdateOverlay->dwFlags = DDOVER_SHOW | DDOVER_KEYDEST; + if (pScrn->bitsPerPixel == 8) + { + lpUpdateOverlay->dwColorSpaceLowValue = pPriv->colorKey & 0xff; + } + else + { + lpUpdateOverlay->dwColorSpaceLowValue = pPriv->colorKey; + } + lpUpdateOverlay->dwFourcc = id; + + /* If use extend FIFO mode */ + if ((pVia->IsSecondary && (pVia->graphicInfo.Screen[1].dwWidth > 1024)) || + (!pVia->IsSecondary && (pVia->graphicInfo.Screen[0].dwWidth > 1024))) + { + dwUseExtendedFIFO = 1; + } + + if (FOURCC_VIA != id) { + + /* + * XvMC flipping is done in the client lib. + */ + + DBG_DD(ErrorF(" : Flip\n")); + Flip(pVia, pPriv, id, pVia->dwFrameNum&1); + } + + pVia->dwFrameNum ++; + + /* If the dest rec. & extendFIFO doesn't change, don't do UpdateOverlay + unless the surface clipping has changed */ + if ( (pPriv->old_drw_x == drw_x) && (pPriv->old_drw_y == drw_y) + && (pPriv->old_drw_w == drw_w) && (pPriv->old_drw_h == drw_h) + && (pPriv->old_src_w == src_w) && (pPriv->old_src_h == src_h) + && (pVia->old_dwUseExtendedFIFO == dwUseExtendedFIFO) + && (pVia->Video.VideoStatus & SW_VIDEO_ON) && + RegionsEqual(&pPriv->clip, clipBoxes)) + { + return Success; + } + + pPriv->old_drw_x = drw_x; + pPriv->old_drw_y = drw_y; + pPriv->old_drw_w = drw_w; + pPriv->old_drw_h = drw_h; + pVia->old_dwUseExtendedFIFO = dwUseExtendedFIFO; + pVia->Video.VideoStatus |= SW_VIDEO_ON; + + /* add to judge if need to re-create surface */ + pPriv->old_src_w = src_w; + pPriv->old_src_h = src_h; + + /* BitBlt: Draw the colorkey rectangle */ + if(!RegionsEqual(&pPriv->clip, clipBoxes)) { + REGION_COPY(pScrn->pScreen, &pPriv->clip, clipBoxes); + + xf86XVFillKeyHelper(pScrn->pScreen, pPriv->colorKey, clipBoxes); + } + + /* + * Call v4l to do update video overlay + */ + if ( -1 == VIAVidUpdateOverlay(pScrn, lpUpdateOverlay)) + { + DBG_DD(ErrorF(" via_video.c : : call v4l updateoverlay fail. \n")); + } + else + { + DBG_DD(ErrorF(" via_video.c : PutImageG done OK\n")); + return Success; + } + } + break; + + case COMMAND_FOR_UTCTRL :{ + VIAXVUtilityProc(pScrn, buf); + break; + } + default: + DBG_DD(ErrorF(" via_video.c : XVPort not supported\n")); + break; + } + DBG_DD(ErrorF(" via_video.c : PutImageG done OK\n")); + return Success; +} + + +static int +viaQueryImageAttributesG( + ScrnInfoPtr pScrn, + int id, + unsigned short *w, unsigned short *h, + int *pitches, int *offsets +){ + int size, tmp; + + DBG_DD(ErrorF(" via_video.c : viaQueryImageAttributesG : FourCC=0x%x, ", id)); + + if ( (!w) || (!h) ) + return 0; + + if(*w > 1024) *w = 1024; + if(*h > 1024) *h = 1024; + + *w = (*w + 1) & ~1; + if(offsets) + offsets[0] = 0; + + switch(id) { + case FOURCC_YV12: /*Planar format : YV12 -4:2:0*/ + *h = (*h + 1) & ~1; + size = (*w + 3) & ~3; + if(pitches) pitches[0] = size; + size *= *h; + if(offsets) offsets[1] = size; + tmp = ((*w >> 1) + 3) & ~3; + if(pitches) pitches[1] = pitches[2] = tmp; + tmp *= (*h >> 1); + size += tmp; + if(offsets) offsets[2] = size; + size += tmp; + break; + case FOURCC_VIA: + *h = (*h + 1) & ~1; + /* + * Avoid copying any image data here. In the future, this could + * be used to pass parameters to the X server. + */ + size = 0; + if (pitches) pitches[0] = size; + break; + case FOURCC_UYVY: /*Packed format : UYVY -4:2:2*/ + case FOURCC_YUY2: /*Packed format : YUY2 -4:2:2*/ + default: + size = *w << 1; + if(pitches) + pitches[0] = size; + size *= *h; + break; + } + + if ( pitches ) + DBG_DD(ErrorF(" pitches[0]=%d, pitches[1]=%d, pitches[2]=%d, ", pitches[0], pitches[1], pitches[2])); + if ( offsets ) + DBG_DD(ErrorF(" offsets[0]=%d, offsets[1]=%d, offsets[2]=%d, ", offsets[0], offsets[1], offsets[2])); + DBG_DD(ErrorF(" width=%d, height=%d \n", *w, *h)); + + return size; +} + + +static int +viaPutVideo(ScrnInfoPtr pScrn, + short src_x, short src_y, short drw_x, short drw_y, + short src_w, short src_h, short drw_w, short drw_h, + RegionPtr clipBoxes, pointer data) +{ + + viaPortPrivPtr pPriv=(viaPortPrivPtr)data; + +#ifdef XV_DEBUG + ErrorF(" via_video.c : viaPutVideo : Src %dx%d, %d, %d, %p\n",src_w,src_h,src_x,src_y,clipBoxes); + ErrorF(" via_video.c : Dst %dx%d, %d, %d \n",drw_w,drw_h,drw_x,drw_y); + ErrorF(" via_video.c : colorkey : 0x%x \n",pPriv->colorKey); +#endif + + + /* BitBlt: Color fill */ + if(!RegionsEqual(&pPriv->clip, clipBoxes)) { + REGION_COPY(pScrn->pScreen, &pPriv->clip, clipBoxes); + XAAFillSolidRects(pScrn,pPriv->colorKey,GXcopy, ~0, + REGION_NUM_RECTS(clipBoxes), + REGION_RECTS(clipBoxes)); + } + + switch ( pPriv->xv_portnum ) + { + case COMMAND_FOR_TV0 : + pPriv->yuv_win.x = drw_x; + pPriv->yuv_win.y = drw_y; + pPriv->yuv_win.width = drw_w; + pPriv->yuv_win.height = drw_h; + pPriv->yuv_win.chromakey = pPriv->colorKey; + break; + + case COMMAND_FOR_TV1 : + pPriv->yuv_win.x = drw_x; + pPriv->yuv_win.y = drw_y; + pPriv->yuv_win.width = drw_w; + pPriv->yuv_win.height = drw_h; + pPriv->yuv_win.chromakey = pPriv->colorKey; + break; + + case COMMAND_FOR_SWOV : + case COMMAND_FOR_DUMMY : + case COMMAND_FOR_UTCTRL : + DBG_DD(ErrorF(" via_video.c : This port doesn't support PutVideo.\n")); + return XvBadAlloc; + default: + DBG_DD(ErrorF(" via_video.c : Error port access.\n")); + return XvBadAlloc; + } + + return Success; +} + +#endif /* !XvExtension */ diff --git a/src/via_video.h b/src/via_video.h new file mode 100644 index 0000000..b08524a --- /dev/null +++ b/src/via_video.h @@ -0,0 +1,135 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_video.h,v 1.3 2003/08/27 15:16:14 tsi Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef _VIA_VIDEO_H_ +#define _VIA_VIDEO_H_ 1 + +/* + * I N C L U D E S + */ + +/* #define XV_DEBUG 1 */ /* write log msg to /var/log/XFree86.0.log */ +#define COLOR_KEY 1 /* set color key value from driver layer*/ + +#ifdef XV_DEBUG +# define DBG_DD(x) (x) +#else +# define DBG_DD(x) +#endif + +#define HW_3123 + +#define TRUE 1 +#define FALSE 0 + +/* Definition for VideoStatus */ +#define VIDEO_NULL 0x00000000 +#define TV0SURFACE_CREATED 0x00000001 +#define TV1SURFACE_CREATED 0x00000002 +#define SWOV_SURFACE_CREATED 0x00000004 +#define HW_MPEG_ON 0x00000010 +#define TV0_VIDEO_ON 0x00000020 +#define TV1_VIDEO_ON 0x00000040 +#define SW_VIDEO_ON 0x00000080 + +typedef struct { + unsigned long dwWidth; /* On screen Width */ + unsigned long dwHeight; /* On screen Height */ + unsigned long dwBPP; /* Bits Per Pixel */ + unsigned long dwRefreshRate; /* Refresh rate of the mode */ +}MODEINFO, * LPMODEINFO; + +#define SDR100 1 +#define SDR133 2 +#define DDR100 3 +#define DDR133 4 + + +typedef struct{ + unsigned long interruptflag; /* 200 */ + unsigned long ramtab; /* 204 */ + unsigned long alphawin_hvstart; /* 208 */ + unsigned long alphawin_size; /* 20c */ + unsigned long alphawin_ctl; /* 210 */ + unsigned long crt_startaddr; /* 214 */ + unsigned long crt_startaddr_2; /* 218 */ + unsigned long alphafb_stride ; /* 21c */ + unsigned long color_key; /* 220 */ + unsigned long alphafb_addr; /* 224 */ + unsigned long chroma_low; /* 228 */ + unsigned long chroma_up; /* 22c */ + unsigned long video1_ctl; /* 230 */ + unsigned long video1_fetch; /* 234 */ + unsigned long video1y_addr1; /* 238 */ + unsigned long video1_stride; /* 23c */ + unsigned long video1_hvstart; /* 240 */ + unsigned long video1_size; /* 244 */ + unsigned long video1y_addr2; /* 248 */ + unsigned long video1_zoom; /* 24c */ + unsigned long video1_mictl; /* 250 */ + unsigned long video1y_addr0; /* 254 */ + unsigned long video1_fifo; /* 258 */ + unsigned long video1y_addr3; /* 25c */ + unsigned long hi_control; /* 260 */ + unsigned long snd_color_key; /* 264 */ + unsigned long v3alpha_prefifo; /* 268 */ + unsigned long v1_source_w_h; /* 26c */ + unsigned long hi_transparent_color; /* 270 */ + unsigned long v_display_temp; /* 274 :No use */ + unsigned long v3alpha_fifo; /* 278 */ + unsigned long v3_source_width; /* 27c */ + unsigned long dummy1; /* 280 */ + unsigned long video1_CSC1; /* 284 */ + unsigned long video1_CSC2; /* 288 */ + unsigned long video1u_addr0; /* 28c */ + unsigned long video1_opqctl; /* 290 */ + unsigned long video3_opqctl; /* 294 */ + unsigned long compose; /* 298 */ + unsigned long dummy2; /* 29c */ + unsigned long video3_ctl; /* 2a0 */ + unsigned long video3_addr0; /* 2a4 */ + unsigned long video3_addr1; /* 2a8 */ + unsigned long video3_stribe; /* 2ac */ + unsigned long video3_hvstart; /* 2b0 */ + unsigned long video3_size; /* 2b4 */ + unsigned long v3alpha_fetch; /* 2b8 */ + unsigned long video3_zoom; /* 2bc */ + unsigned long video3_mictl; /* 2c0 */ + unsigned long video3_CSC1; /* 2c4 */ + unsigned long video3_CSC2; /* 2c8 */ + unsigned long v3_display_temp; /* 2cc */ + unsigned long reserved[5]; /* 2d0 */ + unsigned long video1u_addr1; /* 2e4 */ + unsigned long video1u_addr2; /* 2e8 */ + unsigned long video1u_addr3; /* 2ec */ + unsigned long video1v_addr0; /* 2f0 */ + unsigned long video1v_addr1; /* 2f4 */ + unsigned long video1v_addr2; /* 2f8 */ + unsigned long video1v_addr3; /* 2fc */ +} video_via_regs; + +#define vmmtr volatile video_via_regs * + +#endif /* _VIA_VIDEO_H_ */ diff --git a/src/via_vt1622a.h b/src/via_vt1622a.h new file mode 100644 index 0000000..e9fcf63 --- /dev/null +++ b/src/via_vt1622a.h @@ -0,0 +1,366 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_vt1622a.h,v 1.2 2003/08/27 15:16:14 tsi Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef _VIA_VT1622A_H_ +#define _VIA_VT1622A_H_ 1 + +static const VIABIOSTVMASKTableRec vt1622aMaskTable = { + { 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0, 0XFF, 0, 0, 0, 0, 0, 0, 0XFF, 0, 0XFF, 0, 0, 0XFF, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0, 0, 0, 0, 0, 0XFF, 0XFF, 0XFF, 0, 0, 0XFF, 0XFF, 0XFF, 0, 0, 0 }, + 0X3F, 0X18, 75, 13, 22 +}; + +static const VIABIOSTV3TableRec vt1622aTable[] = { + { + { 0X4, 0, 0, 0X6, 0X3, 0, 0X20, 0X28, 0X9A, 0XC, 0X55, 0, 0X52, 0X3B, 0XF, 0, 0, 0, 0XF8, 0X3E, 0X81, 0X56, 0XF1, 0X91, 0X24, 0X25, 0XEA, 0X10, 0, 0X80, 0, 0X11, 0X15, 0XC, 0X5F, 0X75, 0X8, 0X56, 0X2F, 0X90, 0X50, 0, 0, 0XA3, 0X29, 0X5B, 0XBF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X3B, 0XF, 0X7F, 0X23, 0X57, 0X2, 0XF, 0X26, 0X73, 0X63, 0X86, 0XC4, 0XEA, 0XDF, 0X5, 0X92, 0XA1, 0X84, 0, 0, 0X7F, 0X3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X5D, 0X4F, 0X4F, 0X81, 0X52, 0X9D, 0X56, 0X3E, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XE7, 0, 0XDF, 0, 0, 0XDF, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0XF, 0X7F, 0X7F, 0XF, 0X9A, 0X23, 0XB2, 0XEE, 0X57, 0XDF, 0XDF, 0X57, 0X11, 0XA, 0XE7, 0X2E, 0, 0, 0, 0, 0, 0X28, 0X50, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XF, 0X7F, 0X7F, 0XF, 0X9A, 0X23, 0XB2, 0XEE, 0X57, 0XDF, 0XDF, 0X57, 0X11, 0XA, 0XE7, 0X2E, 0, 0, 0, 0, 0, 0X50, 0XA0, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XF, 0X7F, 0X7F, 0XF, 0X9A, 0X23, 0XB2, 0XEE, 0X57, 0XDF, 0XDF, 0X57, 0X11, 0XA, 0XE7, 0X2E, 0, 0, 0, 0, 0, 0XA0, 0X40, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X7, 0X2A02, 0X6A65, 0X6266, 0X6567, 0X9127, 0X9C2B, 0X272C, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X5065, 0X4B66, 0X4D67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X3, 0X811, 0XBE16, 0X8717, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0, 0, 0X6, 0, 0, 0X20, 0XBF, 0X9F, 0X37, 0X5D, 0, 0X4F, 0X42, 0XF, 0, 0, 0, 0XAC, 0X15, 0X6E, 0X28, 0X2D, 0X77, 0X66, 0X2D, 0XED, 0X10, 0X2, 0X80, 0, 0X99, 0X17, 0XC, 0X31, 0X7A, 0X4, 0X62, 0X30, 0X8E, 0X4A, 0X5B, 0X15, 0XA0, 0X22, 0X5C, 0XCC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X43, 0XE7, 0X7F, 0X23, 0X57, 0X2, 0X1F, 0X2F, 0X75, 0X63, 0X8A, 0XC8, 0XF0, 0XFF, 0X5, 0XD7, 0X8E, 0X83, 0X7F, 0XCF, 0XBF, 0X3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X78, 0X4F, 0X4F, 0X9C, 0X55, 0X85, 0X56, 0XBA, 0, 0X40, 0, 0, 0, 0, 0, 0, 0X8, 0, 0XDF, 0, 0, 0XDF, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0XE7, 0X7F, 0X7F, 0XE7, 0X9A, 0X23, 0XE2, 0X28, 0X57, 0XDF, 0XDF, 0X57, 0X51, 0XA, 0X8, 0X4D, 0, 0, 0, 0, 0, 0X28, 0X50, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XE7, 0X7F, 0X7F, 0XE7, 0X9A, 0X23, 0XE2, 0X28, 0X57, 0XDF, 0XDF, 0X57, 0X51, 0XA, 0X8, 0X4D, 0, 0, 0, 0, 0, 0X50, 0XA0, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XE7, 0X7F, 0X7F, 0XE7, 0X9A, 0X23, 0XE2, 0X28, 0X57, 0XDF, 0XDF, 0X57, 0X51, 0XA, 0X8, 0X4D, 0, 0, 0, 0, 0, 0XA0, 0X40, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X7, 0X2A02, 0X6A65, 0X6266, 0X6567, 0X8D27, 0X962B, 0X202C, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X4265, 0X4966, 0X4967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + }, + { + { 0X84, 0, 0, 0X4, 0X3, 0, 0X20, 0X58, 0XD4, 0X9, 0X52, 0, 0X51, 0X3B, 0XF, 0, 0, 0, 0X6A, 0XD, 0X4C, 0X1C, 0X96, 0X50, 0X5E, 0X1B, 0X3E, 0X10, 0X1, 0X80, 0, 0X44, 0X10, 0XA, 0X9C, 0X75, 0X4, 0X56, 0X41, 0X90, 0X6B, 0, 0, 0XA3, 0X29, 0X86, 0X10, 0X10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X3A, 0X27, 0X1F, 0X34, 0XED, 0X2, 0X27, 0XF5, 0X9D, 0X64, 0XB7, 0XD, 0X40, 0, 0X58, 0XB6, 0X3B, 0X85, 0, 0X1, 0XEF, 0X5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X80, 0X63, 0X63, 0X84, 0X69, 0X1A, 0XEC, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X5C, 0, 0X57, 0, 0, 0X57, 0XED, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0X27, 0X1F, 0X1F, 0X27, 0XE3, 0X34, 0X49, 0XD6, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X5D, 0X4D, 0, 0, 0, 0, 0, 0X32, 0X64, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X27, 0X1F, 0X1F, 0X27, 0XE3, 0X34, 0X49, 0XD6, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X5D, 0X4D, 0, 0, 0, 0, 0, 0X64, 0XC8, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X27, 0X1F, 0X1F, 0X27, 0XE3, 0X34, 0X49, 0XD6, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X5D, 0X4D, 0, 0, 0, 0, 0, 0XC8, 0X90, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0X2A02, 0X6A65, 0X6266, 0X6567, 0X9127, 0X9C2B, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X4365, 0X4A66, 0X4967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X3, 0X811, 0X1216, 0X4917, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X84, 0, 0, 0X4, 0, 0, 0X20, 0X27, 0XB8, 0XD, 0X5C, 0, 0X4E, 0X40, 0XF, 0, 0, 0, 0XEC, 0X2A, 0XFD, 0X28, 0XE4, 0X7D, 0X7A, 0X27, 0X11, 0X10, 0X1, 0X80, 0, 0XAA, 0X13, 0XC, 0X9F, 0X79, 0XC, 0X62, 0X37, 0X8E, 0X54, 0X5B, 0X15, 0XA0, 0X22, 0X70, 0XF4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X41, 0X97, 0X1F, 0X33, 0XED, 0X2, 0X97, 0X87, 0X87, 0X63, 0X9F, 0XE7, 0X16, 0XE7, 0X16, 0XCC, 0XF3, 0X84, 0, 0X1, 0X4F, 0X4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6E, 0X63, 0X63, 0X92, 0X66, 0X8E, 0XEC, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X5C, 0, 0X57, 0, 0, 0X57, 0XED, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0X97, 0X1F, 0X1F, 0X97, 0XDB, 0X33, 0X36, 0X72, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X5D, 0X4D, 0, 0, 0, 0, 0, 0X32, 0X64, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X97, 0X1F, 0X1F, 0X97, 0XDB, 0X33, 0X36, 0X72, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X5D, 0X4D, 0, 0, 0, 0, 0, 0X64, 0XC8, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X97, 0X1F, 0X1F, 0X97, 0XDB, 0X33, 0X36, 0X72, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X5D, 0X4D, 0, 0, 0, 0, 0, 0XC8, 0X90, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X2A02, 0X6A65, 0X6266, 0X6567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X5865, 0X5E66, 0X5E67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + }, + { + { 0X84, 0, 0, 0X4, 0X3, 0, 0X20, 0X47, 0X12, 0X8, 0X50, 0, 0X50, 0X3A, 0XF, 0, 0, 0, 0XEF, 0X37, 0X77, 0X2A, 0XD6, 0X66, 0XEB, 0X14, 0XA1, 0X10, 0X5, 0X80, 0, 0X77, 0XD, 0X5, 0XEF, 0X73, 0XC, 0X56, 0X56, 0X90, 0X8B, 0, 0, 0XA3, 0X29, 0XB9, 0X6A, 0X10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X39, 0X87, 0XFF, 0X34, 0XB0, 0X3, 0X6F, 0XDC, 0XCD, 0X35, 0XF1, 0X5E, 0XA5, 0X7E, 0X5A, 0X33, 0X26, 0X87, 0, 0X1, 0X27, 0X8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X8C, 0X7F, 0X7F, 0X90, 0X81, 0X8, 0XAF, 0XF5, 0, 0X60, 0, 0, 0, 0, 0, 0, 0XC, 0, 0XFF, 0, 0, 0XFF, 0XB0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0X87, 0XFF, 0XFF, 0X87, 0X23, 0X34, 0X9, 0X46, 0XB0, 0XFF, 0XFF, 0XB0, 0X9A, 0X13, 0X14, 0X7A, 0, 0, 0, 0, 0, 0X40, 0X80, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X87, 0XFF, 0XFF, 0X87, 0X23, 0X34, 0X9, 0X46, 0XB0, 0XFF, 0XFF, 0XB0, 0X9A, 0X13, 0X14, 0X7A, 0, 0, 0, 0, 0, 0X80, 0, 0X41, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X87, 0XFF, 0XFF, 0X87, 0X23, 0X34, 0X9, 0X46, 0XB0, 0XFF, 0XFF, 0XB0, 0X9A, 0X13, 0X14, 0X7A, 0, 0, 0, 0, 0, 0, 0, 0X86, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0X2A02, 0X6A65, 0X6266, 0X6567, 0X9127, 0X9C2B, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X5865, 0X4B66, 0X4A67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X3, 0X811, 0X1816, 0X6117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X84, 0, 0, 0X4, 0, 0, 0X20, 0X57, 0X25, 0X35, 0X5A, 0, 0X4D, 0X40, 0XF, 0, 0, 0, 0XE8, 0X23, 0XD1, 0X18, 0X72, 0XC3, 0X8C, 0X1A, 0X96, 0X10, 0X7, 0X80, 0, 0XFF, 0XF, 0XC, 0X87, 0X79, 0, 0X62, 0X53, 0X8E, 0X7B, 0X5B, 0X15, 0XA0, 0X22, 0XB6, 0X5A, 0X10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X40, 0XAF, 0XFF, 0X34, 0XB5, 0X3, 0X57, 0XA8, 0XC8, 0X35, 0XEC, 0X4C, 0XCC, 0X67, 0X5A, 0X14, 0X5C, 0X6, 0, 0X1, 0X1F, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X91, 0X7F, 0X7F, 0X95, 0X82, 0XB, 0XB4, 0XF5, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X3D, 0, 0XFF, 0, 0, 0XFF, 0XB5, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0XAF, 0XFF, 0XFF, 0XAF, 0X23, 0X34, 0X8, 0X5C, 0XB5, 0XFF, 0XFF, 0XB5, 0X9A, 0X13, 0X3C, 0X64, 0, 0, 0, 0, 0, 0X40, 0X80, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XAF, 0XFF, 0XFF, 0XAF, 0X23, 0X34, 0X8, 0X5C, 0XB5, 0XFF, 0XFF, 0XB5, 0X9A, 0X13, 0X3C, 0X64, 0, 0, 0, 0, 0, 0X80, 0, 0X41, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XAF, 0XFF, 0XFF, 0XAF, 0X23, 0X34, 0X8, 0X5C, 0XB5, 0XFF, 0XFF, 0XB5, 0X9A, 0X13, 0X3C, 0X64, 0, 0, 0, 0, 0, 0, 0, 0X86, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X2A02, 0X6A65, 0X6266, 0X6567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X5065, 0X6966, 0X6967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + }, + { + { 0X84, 0, 0, 0X4, 0X3, 0, 0X20, 0XA7, 0XC1, 0X7, 0X50, 0, 0X50, 0X39, 0XF, 0, 0, 0, 0XF0, 0X29, 0X67, 0X31, 0X63, 0XA8, 0X3C, 0X1D, 0X2A, 0X10, 0X3, 0X80, 0, 0X33, 0X11, 0X8, 0X47, 0X73, 0XC, 0X56, 0X3C, 0X90, 0X65, 0, 0, 0XA3, 0X29, 0X7C, 0, 0X10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X39, 0XAF, 0X4F, 0X34, 0X44, 0X2, 0XE3, 0XC2, 0X93, 0X63, 0XAD, 0XFD, 0X2B, 0X7C, 0X17, 0X6D, 0XCA, 0X84, 0, 0X1, 0X2F, 0X5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X91, 0X69, 0X69, 0X95, 0X6D, 0X1, 0X43, 0X3E, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XEF, 0, 0XDF, 0, 0, 0XDF, 0X44, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0XAF, 0X4F, 0X4F, 0XAF, 0XE3, 0X34, 0XCE, 0XE, 0X44, 0XDF, 0XDF, 0X44, 0X11, 0XA, 0XEF, 0X3C, 0, 0, 0, 0, 0, 0X35, 0X6A, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XAF, 0X4F, 0X4F, 0XAF, 0XE3, 0X34, 0XCE, 0XE, 0X44, 0XDF, 0XDF, 0X44, 0X11, 0XA, 0XEF, 0X3C, 0, 0, 0, 0, 0, 0X6A, 0XD4, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XAF, 0X4F, 0X4F, 0XAF, 0XE3, 0X34, 0XCE, 0XE, 0X44, 0XDF, 0XDF, 0X44, 0X11, 0XA, 0XEF, 0X3C, 0, 0, 0, 0, 0, 0XD4, 0XA8, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0X2A02, 0X6A65, 0X6266, 0X6567, 0X9127, 0X9C2B, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X4465, 0X4566, 0X4567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X3, 0X811, 0X5B16, 0XA017, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0, 0, 0X6, 0, 0, 0X20, 0XA7, 0XE6, 0X6, 0X5C, 0, 0X4E, 0X41, 0XF, 0, 0, 0, 0XE6, 0X23, 0X84, 0X18, 0X18, 0X28, 0X87, 0X1F, 0X56, 0X10, 0X1, 0X80, 0, 0XCC, 0XF, 0XC, 0X60, 0X79, 0, 0X62, 0X46, 0X8E, 0X68, 0X5B, 0X15, 0XA0, 0X22, 0X94, 0X2A, 0X10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X40, 0XAF, 0X4F, 0X34, 0X57, 0X2, 0X7F, 0X31, 0XA9, 0X74, 0XD1, 0X2B, 0X5D, 0XAA, 0X58, 0XD7, 0X26, 0X83, 0, 0X1, 0X7F, 0X4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X91, 0X69, 0X69, 0X95, 0X6D, 0X1, 0X56, 0X3E, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XF2, 0, 0XDF, 0, 0, 0XDF, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0XAF, 0X4F, 0X4F, 0XAF, 0XE3, 0X34, 0XD1, 0XE, 0X57, 0XDF, 0XDF, 0X57, 0X11, 0XA, 0XF2, 0X3D, 0, 0, 0, 0, 0, 0X35, 0X6A, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XAF, 0X4F, 0X4F, 0XAF, 0XE3, 0X34, 0XD1, 0XE, 0X57, 0XDF, 0XDF, 0X57, 0X11, 0XA, 0XF2, 0X3D, 0, 0, 0, 0, 0, 0X6A, 0XD4, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XAF, 0X4F, 0X4F, 0XAF, 0XE3, 0X34, 0XD1, 0XE, 0X57, 0XDF, 0XDF, 0X57, 0X11, 0XA, 0XF2, 0X3D, 0, 0, 0, 0, 0, 0XD4, 0XA8, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X2A02, 0X6A65, 0X6266, 0X6567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X5065, 0X4966, 0X4967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + }, + { + { 0X4, 0, 0, 0X6, 0X3, 0, 0X20, 0X3F, 0XB6, 0X7, 0X52, 0, 0X51, 0X3A, 0XF, 0, 0, 0, 0XED, 0X31, 0X50, 0X35, 0X18, 0X55, 0X55, 0X1E, 0X1E, 0X10, 0X3, 0X80, 0, 0X33, 0X12, 0X8, 0X57, 0X75, 0, 0X56, 0X3A, 0X90, 0X61, 0, 0, 0XA3, 0X29, 0X76, 0XF1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X3A, 0X47, 0XCF, 0X23, 0X57, 0X2, 0XBF, 0XAD, 0X8D, 0X63, 0XA4, 0XF3, 0X20, 0X36, 0X17, 0X92, 0X33, 0X84, 0, 0, 0XBF, 0X3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X64, 0X59, 0X59, 0X88, 0X5B, 0X81, 0X56, 0X3E, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XFF, 0, 0XDF, 0, 0, 0XDF, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0X47, 0XCF, 0XCF, 0X47, 0X9A, 0X23, 0XD9, 0XA, 0X57, 0XDF, 0XDF, 0X57, 0X51, 0XA, 0XFF, 0X26, 0, 0, 0, 0, 0, 0X2D, 0X5A, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X47, 0XCF, 0XCF, 0X47, 0X9A, 0X23, 0XD9, 0XA, 0X57, 0XDF, 0XDF, 0X57, 0X51, 0XA, 0XFF, 0X26, 0, 0, 0, 0, 0, 0X5A, 0XB4, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X47, 0XCF, 0XCF, 0X47, 0X9A, 0X23, 0XD9, 0XA, 0X57, 0XDF, 0XDF, 0X57, 0X51, 0XA, 0XFF, 0X26, 0, 0, 0, 0, 0, 0XB4, 0X68, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0X2A02, 0X6A65, 0X6266, 0X6567, 0X9127, 0X9C2B, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X4265, 0X4966, 0X4867, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X3, 0X811, 0XC316, 0X4C17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + }, + { + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0, 0, 0X6, 0, 0, 0X20, 0XF, 0XAF, 0X35, 0X5D, 0, 0X4F, 0X41, 0XF, 0, 0, 0, 0XF8, 0X3C, 0X73, 0X56, 0X32, 0X98, 0X83, 0X2D, 0XED, 0X10, 0X2, 0X80, 0, 0X99, 0X18, 0XC, 0X76, 0X7A, 0X44, 0X62, 0X30, 0X8E, 0X49, 0X5B, 0X15, 0XA0, 0X22, 0X5C, 0XBD, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X43, 0XF7, 0XCF, 0X22, 0XED, 0X2, 0X1D, 0X29, 0X75, 0X63, 0X88, 0XC6, 0XF0, 0XFA, 0XF, 0XCC, 0X30, 0X94, 0, 0, 0X8F, 0X3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X5A, 0X59, 0X59, 0X9E, 0X5B, 0X1D, 0XEC, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X7B, 0, 0X3F, 0, 0, 0X3F, 0XED, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0XF7, 0XCF, 0XCF, 0XF7, 0X92, 0X22, 0XDE, 0XE8, 0XED, 0X3F, 0X3F, 0XED, 0X12, 0X12, 0X7F, 0X47, 0, 0, 0, 0, 0, 0X2D, 0X5A, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XF7, 0XCF, 0XCF, 0XF7, 0X92, 0X22, 0XDE, 0XE8, 0XED, 0X3F, 0X3F, 0XED, 0X12, 0X12, 0X7F, 0X47, 0, 0, 0, 0, 0, 0X5A, 0XB4, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XF7, 0XCF, 0XCF, 0XF7, 0X92, 0X22, 0XDE, 0XE8, 0XED, 0X3F, 0X3F, 0XED, 0X12, 0X12, 0X7F, 0X47, 0, 0, 0, 0, 0, 0XB4, 0X68, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X2A02, 0X6A65, 0X6266, 0X6567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X5965, 0X4D66, 0X4A67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + } +}; + +static const VIABIOSTV3TableRec vt1622aOverTable[] = { + { + { 0X4, 0, 0, 0X6, 0X3, 0, 0X20, 0X10, 0X76, 0XA, 0X56, 0X5, 0X50, 0X3B, 0XF, 0, 0, 0, 0XED, 0X23, 0XC0, 0X34, 0X5E, 0XAA, 0XEA, 0X25, 0XE5, 0X10, 0X2, 0X80, 0, 0X11, 0X17, 0XC, 0X46, 0X73, 0XC, 0X56, 0X2E, 0X90, 0X4E, 0, 0, 0XA3, 0X29, 0X59, 0XBA, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X3A, 0XCF, 0X7F, 0X22, 0X2F, 0X2, 0XFF, 0X59, 0X71, 0X62, 0X83, 0XC0, 0XE5, 0XC0, 0X5, 0X44, 0X44, 0X84, 0, 0, 0XFF, 0X2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X55, 0X4F, 0X4F, 0X99, 0X51, 0X18, 0X2E, 0X3E, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XEA, 0, 0XDF, 0, 0, 0XDF, 0X2F, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0XCF, 0X7F, 0X7F, 0XCF, 0X92, 0X22, 0X9B, 0XC0, 0X2F, 0XDF, 0XDF, 0X2F, 0X11, 0XA, 0XE5, 0X27, 0, 0, 0, 0, 0, 0X28, 0X50, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XCF, 0X7F, 0X7F, 0XCF, 0X92, 0X22, 0X9B, 0XC0, 0X2F, 0XDF, 0XDF, 0X2F, 0X11, 0XA, 0XE5, 0X27, 0, 0, 0, 0, 0, 0X50, 0XA0, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XCF, 0X7F, 0X7F, 0XCF, 0X92, 0X22, 0X9B, 0XC0, 0X2F, 0XDF, 0XDF, 0X2F, 0X11, 0XA, 0XE5, 0X27, 0, 0, 0, 0, 0, 0XA0, 0X40, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X2A02, 0X6A65, 0X6266, 0X6567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X4F65, 0X4966, 0X4967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X3, 0X811, 0XF416, 0X9F17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0, 0, 0X6, 0, 0, 0X20, 0X23, 0X4E, 0X2A, 0X61, 0, 0X4D, 0X47, 0XF, 0, 0, 0, 0X4A, 0XF, 0X37, 0X28, 0XBC, 0X44, 0XC, 0X36, 0XC7, 0X10, 0X2, 0X80, 0, 0X88, 0X1B, 0XC, 0XFF, 0X79, 0, 0X62, 0X28, 0X8E, 0X3E, 0X5B, 0X15, 0XA0, 0X22, 0X49, 0XCC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X44, 0X47, 0X7F, 0X23, 0XF3, 0X1, 0X9F, 0X3F, 0X62, 0X62, 0X72, 0XA7, 0XCB, 0X5, 0X5, 0X33, 0X70, 0X83, 0, 0, 0X9F, 0X2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X64, 0X4F, 0X4F, 0X88, 0X53, 0X83, 0XF2, 0X1F, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XE5, 0, 0XDF, 0, 0, 0XDF, 0XF3, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0X47, 0X7F, 0X7F, 0X47, 0X9A, 0X23, 0X95, 0X27, 0XF3, 0XDF, 0XDF, 0XF3, 0X49, 0X9, 0XE2, 0X24, 0, 0, 0, 0, 0, 0X28, 0X50, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X47, 0X7F, 0X7F, 0X47, 0X9A, 0X23, 0X95, 0X27, 0XF3, 0XDF, 0XDF, 0XF3, 0X49, 0X9, 0XE2, 0X24, 0, 0, 0, 0, 0, 0X50, 0XA0, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X47, 0X7F, 0X7F, 0X47, 0X9A, 0X23, 0X95, 0X27, 0XF3, 0XDF, 0XDF, 0XF3, 0X49, 0X9, 0XE2, 0X24, 0, 0, 0, 0, 0, 0XA0, 0X40, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0X2A02, 0X6A65, 0X6266, 0X6567, 0X9027, 0X992B, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X4265, 0X4966, 0X4967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + }, + { + { 0X84, 0, 0, 0X4, 0X3, 0, 0X20, 0X5F, 0XA4, 0X8, 0X51, 0, 0X50, 0X39, 0XF, 0, 0, 0, 0XE8, 0X33, 0XE6, 0X18, 0XE0, 0XCE, 0X61, 0X1C, 0X32, 0X10, 0X3, 0X80, 0, 0X33, 0X11, 0XA, 0X9B, 0X73, 0X8, 0X56, 0X3F, 0X90, 0X68, 0, 0, 0XA3, 0X29, 0X82, 0X2, 0X10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X39, 0X37, 0X21, 0X34, 0X98, 0X2, 0X1, 0X21, 0X97, 0X74, 0XB1, 0XFF, 0X34, 0XB6, 0X17, 0X11, 0, 0X85, 0, 0X1, 0X57, 0X5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X82, 0X63, 0X63, 0X86, 0X69, 0X1B, 0X97, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X59, 0, 0X57, 0, 0, 0X57, 0X98, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0X37, 0X1F, 0X1F, 0X37, 0XE3, 0X34, 0X4A, 0XD7, 0X98, 0X57, 0X57, 0X98, 0X52, 0X12, 0X59, 0X5B, 0, 0, 0, 0, 0, 0X32, 0X64, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X37, 0X1F, 0X1F, 0X37, 0XE3, 0X34, 0X4A, 0XD7, 0X98, 0X57, 0X57, 0X98, 0X52, 0X12, 0X59, 0X5B, 0, 0, 0, 0, 0, 0X64, 0XC8, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X37, 0X1F, 0X1F, 0X37, 0XE3, 0X34, 0X4A, 0XD7, 0X98, 0X57, 0X57, 0X98, 0X52, 0X12, 0X59, 0X5B, 0, 0, 0, 0, 0, 0XC8, 0X90, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X2A02, 0X6A65, 0X6266, 0X6567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X4265, 0X4566, 0X4567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X3, 0X811, 0X1416, 0XC717, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X84, 0, 0, 0X4, 0, 0, 0X20, 0X47, 0X90, 0X3B, 0X5A, 0, 0X4D, 0X3F, 0XF, 0, 0, 0, 0XE8, 0X24, 0X8F, 0X1C, 0X57, 0X8D, 0XE9, 0X27, 0XE, 0X10, 0X3, 0X80, 0, 0XAA, 0X14, 0XC, 0X2F, 0X79, 0, 0X62, 0X37, 0X8E, 0X54, 0X5B, 0X15, 0XA0, 0X22, 0X6E, 0XF4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X41, 0XE7, 0X1F, 0X33, 0X89, 0X2, 0X8D, 0XCD, 0X85, 0X63, 0X9C, 0XE4, 0X13, 0XD4, 0X16, 0X28, 0X60, 0X84, 0, 0X1, 0XF, 0X4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X78, 0X63, 0X63, 0X9C, 0X68, 0X94, 0X88, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X58, 0, 0X57, 0, 0, 0X57, 0X89, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0XE7, 0X1F, 0X1F, 0XE7, 0XDB, 0X33, 0X73, 0XAF, 0X89, 0X57, 0X57, 0X89, 0X52, 0X12, 0X58, 0X5A, 0, 0, 0, 0, 0, 0X32, 0X64, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XE7, 0X1F, 0X1F, 0XE7, 0XDB, 0X33, 0X73, 0XAF, 0X89, 0X57, 0X57, 0X89, 0X52, 0X12, 0X58, 0X5A, 0, 0, 0, 0, 0, 0X64, 0XC8, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XE7, 0X1F, 0X1F, 0XE7, 0XDB, 0X33, 0X73, 0XAF, 0X89, 0X57, 0X57, 0X89, 0X52, 0X12, 0X58, 0X5A, 0, 0, 0, 0, 0, 0XC8, 0X90, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0X2A02, 0X6A65, 0X6266, 0X6567, 0X9027, 0X992B, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X5865, 0X4866, 0X4867, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + }, + { + { 0X84, 0, 0, 0X4, 0X3, 0, 0X20, 0X52, 0XAE, 0X9, 0X50, 0, 0X50, 0X39, 0XF, 0, 0, 0, 0XE8, 0X33, 0XD, 0X15, 0XE, 0X44, 0X44, 0X18, 0X66, 0X10, 0X3, 0X80, 0, 0X55, 0XF, 0X5, 0XF1, 0X73, 0X8, 0X56, 0X4A, 0X90, 0X79, 0, 0, 0XA3, 0X29, 0X9B, 0X33, 0X10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X39, 0XAF, 0XFF, 0X34, 0X47, 0X3, 0XAF, 0XC3, 0XB1, 0X34, 0XD1, 0X30, 0X68, 0XB, 0X59, 0X66, 0X40, 0X86, 0, 0X1, 0X7F, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X91, 0X7F, 0X7F, 0X95, 0X82, 0XB, 0X46, 0XF5, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X4, 0, 0XFF, 0, 0, 0XFF, 0X47, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0XAF, 0XFF, 0XFF, 0XAF, 0X23, 0X34, 0XC, 0X57, 0X47, 0XFF, 0XFF, 0X47, 0X9A, 0X13, 0X2, 0X64, 0, 0, 0, 0, 0, 0X40, 0X80, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XAF, 0XFF, 0XFF, 0XAF, 0X23, 0X34, 0XC, 0X57, 0X47, 0XFF, 0XFF, 0X47, 0X9A, 0X13, 0X2, 0X64, 0, 0, 0, 0, 0, 0X80, 0, 0X41, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XAF, 0XFF, 0XFF, 0XAF, 0X23, 0X34, 0XC, 0X57, 0X47, 0XFF, 0XFF, 0X47, 0X9A, 0X13, 0X2, 0X64, 0, 0, 0, 0, 0, 0, 0, 0X86, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X2A02, 0X6A65, 0X6266, 0X6567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X5765, 0X4566, 0X4567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X3, 0X811, 0X6316, 0X3D17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X84, 0, 0, 0X4, 0, 0, 0X20, 0X56, 0XC0, 0X32, 0X5A, 0, 0X4D, 0X40, 0XF, 0, 0, 0, 0XC9, 0X14, 0X79, 0X1C, 0X38, 0XE, 0X7B, 0X1D, 0X6D, 0X10, 0X3, 0X80, 0, 0XDD, 0XF, 0XC, 0XCA, 0X79, 0X8, 0X62, 0X4B, 0X8E, 0X6F, 0X5B, 0X15, 0XA0, 0X22, 0XA1, 0X5A, 0X10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X40, 0XAF, 0XFF, 0X34, 0X38, 0X3, 0XCF, 0XDF, 0XB4, 0X34, 0XD6, 0X35, 0X75, 0X47, 0X59, 0X47, 0X20, 0X5, 0, 0X1, 0X2F, 0X6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X91, 0X7F, 0X7F, 0X95, 0X81, 0XB, 0X37, 0XF5, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X3, 0, 0XFF, 0, 0, 0XFF, 0X38, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0XAF, 0XFF, 0XFF, 0XAF, 0X23, 0X34, 0XC, 0X57, 0X38, 0XFF, 0XFF, 0X38, 0X9A, 0X13, 0X1, 0X62, 0, 0, 0, 0, 0, 0X40, 0X80, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XAF, 0XFF, 0XFF, 0XAF, 0X23, 0X34, 0XC, 0X57, 0X38, 0XFF, 0XFF, 0X38, 0X9A, 0X13, 0X1, 0X62, 0, 0, 0, 0, 0, 0X80, 0, 0X41, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XAF, 0XFF, 0XFF, 0XAF, 0X23, 0X34, 0XC, 0X57, 0X38, 0XFF, 0XFF, 0X38, 0X9A, 0X13, 0X1, 0X62, 0, 0, 0, 0, 0, 0, 0, 0X86, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0X2A02, 0X6A65, 0X6266, 0X6567, 0X9027, 0X992B, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X5165, 0X4966, 0X4967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + }, + { + { 0X84, 0, 0, 0X4, 0X3, 0, 0X20, 0X4E, 0X9E, 0X7, 0X51, 0, 0X50, 0X3A, 0XF, 0, 0, 0, 0XED, 0X23, 0X8, 0X35, 0XA1, 0X64, 0X93, 0X1B, 0X3C, 0X10, 0X3, 0X80, 0, 0X44, 0X11, 0XA, 0XF0, 0X73, 0X4, 0X56, 0X41, 0X90, 0X6A, 0, 0, 0XA3, 0X29, 0X87, 0XA, 0X10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X39, 0XEF, 0X51, 0X33, 0X25, 0X2, 0X1F, 0X47, 0X9C, 0X74, 0XB5, 0XC, 0X3D, 0XF1, 0X57, 0X30, 0XC, 0X84, 0, 0X1, 0X1F, 0X4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X79, 0X69, 0X69, 0X9D, 0X6B, 0X94, 0X24, 0X3E, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XEA, 0, 0XDF, 0, 0, 0XDF, 0X25, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0XEF, 0X4F, 0X4F, 0XEF, 0XDB, 0X33, 0X59, 0XA3, 0X25, 0XDF, 0XDF, 0X25, 0X51, 0XA, 0XEA, 0X2F, 0, 0, 0, 0, 0, 0X35, 0X6A, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XEF, 0X4F, 0X4F, 0XEF, 0XDB, 0X33, 0X59, 0XA3, 0X25, 0XDF, 0XDF, 0X25, 0X51, 0XA, 0XEA, 0X2F, 0, 0, 0, 0, 0, 0X6A, 0XD4, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XEF, 0X4F, 0X4F, 0XEF, 0XDB, 0X33, 0X59, 0XA3, 0X25, 0XDF, 0XDF, 0X25, 0X51, 0XA, 0XEA, 0X2F, 0, 0, 0, 0, 0, 0XD4, 0XA8, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X2A02, 0X6A65, 0X6266, 0X6567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X5865, 0X4566, 0X4567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X3, 0X811, 0X6716, 0X3017, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X84, 0, 0, 0X4, 0, 0, 0X20, 0XA5, 0XA1, 0X38, 0X5E, 0, 0X4D, 0X41, 0XF, 0, 0, 0, 0XC7, 0X1E, 0X79, 0X1C, 0XEC, 0XE5, 0X64, 0X22, 0X39, 0X10, 0X3, 0X80, 0, 0XBB, 0X12, 0XC, 0X5A, 0X79, 0XC, 0X62, 0X40, 0X8E, 0X5F, 0X5B, 0X15, 0XA0, 0X22, 0X88, 0X2A, 0X10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X3A, 0XAF, 0X4F, 0X34, 0X25, 0X2, 0X1F, 0X4F, 0X9B, 0X74, 0XB7, 0XA, 0X3F, 0XF0, 0X58, 0X85, 0, 0X83, 0, 0X1, 0X1F, 0X4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X91, 0X69, 0X69, 0X95, 0X6D, 0X1, 0X24, 0X3E, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XEA, 0, 0XDF, 0, 0, 0XDF, 0X25, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0XAF, 0X4F, 0X4F, 0XAF, 0XE3, 0X34, 0X66, 0XF, 0X25, 0XDF, 0XDF, 0X25, 0X11, 0XA, 0XEA, 0X2F, 0, 0, 0, 0, 0, 0X35, 0X6A, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XAF, 0X4F, 0X4F, 0XAF, 0XE3, 0X34, 0X66, 0XF, 0X25, 0XDF, 0XDF, 0X25, 0X11, 0XA, 0XEA, 0X2F, 0, 0, 0, 0, 0, 0X6A, 0XD4, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0XAF, 0X4F, 0X4F, 0XAF, 0XE3, 0X34, 0X66, 0XF, 0X25, 0XDF, 0XDF, 0X25, 0X11, 0XA, 0XEA, 0X2F, 0, 0, 0, 0, 0, 0XD4, 0XA8, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0X2A02, 0X6A65, 0X6266, 0X6567, 0X9027, 0X992B, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X4E65, 0X4966, 0X4967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + }, + { + { 0X4, 0, 0, 0, 0X3, 0, 0X20, 0X28, 0X52, 0X8, 0X50, 0, 0X4E, 0X2F, 0XF, 0, 0, 0, 0X2D, 0X7, 0X28, 0X34, 0X1D, 0X66, 0X66, 0X24, 0XEE, 0X10, 0X2, 0X80, 0, 0X11, 0X16, 0X8, 0XDF, 0X76, 0X4, 0X56, 0X31, 0X90, 0X51, 0, 0, 0XA3, 0X29, 0X5D, 0XC3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X8, 0X3A, 0X1F, 0XCF, 0X23, 0XC, 0X2, 0X1F, 0XCE, 0X76, 0X23, 0X88, 0XC9, 0XEF, 0XFF, 0X5, 0, 0, 0, 0, 0, 0X1F, 0X3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X5F, 0X59, 0X59, 0X83, 0X5B, 0X9F, 0XB, 0X3E, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XE0, 0, 0XDF, 0, 0, 0XDF, 0XC, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0X1F, 0XCF, 0XCF, 0X1F, 0X9A, 0X23, 0XD6, 0XF8, 0XC, 0XDF, 0XDF, 0XC, 0X11, 0XA, 0XE1, 0X22, 0, 0, 0, 0, 0, 0X2D, 0X5A, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X1F, 0XCF, 0XCF, 0X1F, 0X9A, 0X23, 0XD6, 0XF8, 0XC, 0XDF, 0XDF, 0XC, 0X11, 0XA, 0XE1, 0X22, 0, 0, 0, 0, 0, 0X5A, 0XB4, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X1F, 0XCF, 0XCF, 0X1F, 0X9A, 0X23, 0XD6, 0XF8, 0XC, 0XDF, 0XDF, 0XC, 0X11, 0XA, 0XE1, 0X22, 0, 0, 0, 0, 0, 0XB4, 0X68, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X2A02, 0X6A65, 0X6266, 0X6567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X4D65, 0X4966, 0X4967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X3, 0X811, 0X1E16, 0X5C17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + }, + { + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0, 0, 0, 0, 0, 0X20, 0X3F, 0X89, 0X35, 0X50, 0, 0X43, 0X2E, 0XF, 0, 0, 0, 0XE8, 0X23, 0X84, 0X20, 0XCB, 0X8A, 0X9, 0X2A, 0XFF, 0X10, 0X2, 0X80, 0, 0X99, 0X17, 0XC, 0X6F, 0X79, 0X48, 0X62, 0X34, 0X8E, 0X4F, 0X5B, 0X15, 0XA0, 0X22, 0X67, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X3A, 0X5F, 0XCF, 0X23, 0X70, 0X2, 0X5F, 0XBF, 0X7E, 0X23, 0X94, 0XD0, 0X27, 0X8F, 0X16, 0, 0, 0X4, 0, 0, 0X5F, 0X3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X67, 0X59, 0X59, 0X8B, 0X60, 0X84, 0X6F, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X41, 0, 0X3F, 0, 0, 0X3F, 0X70, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X20, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, + { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, + { 0X5F, 0XCF, 0XCF, 0X5F, 0X9A, 0X23, 0XF8, 0X20, 0X70, 0X3F, 0X3F, 0X70, 0X52, 0X12, 0X41, 0X48, 0, 0, 0, 0, 0, 0X2D, 0X5A, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X5F, 0XCF, 0XCF, 0X5F, 0X9A, 0X23, 0XF8, 0X20, 0X70, 0X3F, 0X3F, 0X70, 0X52, 0X12, 0X41, 0X48, 0, 0, 0, 0, 0, 0X5A, 0XB4, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0X5F, 0XCF, 0XCF, 0X5F, 0X9A, 0X23, 0XF8, 0X20, 0X70, 0X3F, 0X3F, 0X70, 0X52, 0X12, 0X41, 0X48, 0, 0, 0, 0, 0, 0XB4, 0X68, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X6, 0X2A02, 0X6A65, 0X6266, 0X6567, 0X9027, 0X992B, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0X4, 0X302, 0X5865, 0X4866, 0X4967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + } +}; + +#endif /* _VIA_VT1622A_H_ */ diff --git a/src/via_xvmc.c b/src/via_xvmc.c new file mode 100644 index 0000000..d084812 --- /dev/null +++ b/src/via_xvmc.c @@ -0,0 +1,765 @@ +/*************************************************************************** +Copyright 2004 Thomas Hellström. All Rights Reserved. + +Substantial portions of this code was taken from the i810 XvMC driver. +Therefore the following copyright note is included. + +Copyright 2000 Intel Corporation. All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sub license, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice (including the +next paragraph) shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS / COPYRIGHT HOLDERS AND / OR THEIR SUPPLIERS +BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +**************************************************************************/ + +/* + * via_xwmc.c: VIA XvMC subset Driver + * + * Authors: + * Thomas Hellström <unichrome@shipmail.org> + * Matt Sottek <matthew.j.sottek@intel.com> + * + * + */ + +#include "xf86.h" +#include "xf86_OSproc.h" +#include "xf86Resources.h" +#include "xf86_ansic.h" +#include "compiler.h" +#include "xf86PciInfo.h" +#include "xf86Pci.h" +#include "xf86fbman.h" +#include "regionstr.h" + +#ifdef XF86DRI + +#include "via.h" +#include "via_dri.h" +#include "via_driver.h" + +#include "xf86xv.h" +#include "xf86xvmc.h" +#include "Xv.h" +#include "XvMC.h" +#include "xaa.h" +#include "xaalocal.h" +#include "dixstruct.h" +#include "fourcc.h" +#include "via_xvmc.h" +#include "dristruct.h" +#include "dri.h" + +/* + * Proposed XvMC via driver extension: + */ + +#define XVMC_SLICE 0x0020000 + +static int ViaXvMCCreateContext (ScrnInfoPtr pScrn, XvMCContextPtr pContext, + int *num_priv, long **priv ); +static void ViaXvMCDestroyContext (ScrnInfoPtr pScrn, XvMCContextPtr pContext); + +static int ViaXvMCCreateSurface (ScrnInfoPtr pScrn, XvMCSurfacePtr pSurf, + int *num_priv, long **priv ); +static void ViaXvMCDestroySurface (ScrnInfoPtr pScrn, XvMCSurfacePtr pSurf); + +static int ViaXvMCCreateSubpicture (ScrnInfoPtr pScrn, XvMCSubpicturePtr pSurf, + int *num_priv, long **priv ); +static void ViaXvMCDestroySubpicture (ScrnInfoPtr pScrn, XvMCSubpicturePtr pSubp); + +static void initViaXvMC(ViaXvMCPtr vXvMC) { + unsigned i; + + for (i=0; i < VIA_XVMC_MAX_CONTEXTS; ++i) { + vXvMC->contexts[i] = 0; + vXvMC->cPrivs[i] = 0; + } + + for (i=0; i < VIA_XVMC_MAX_SURFACES; ++i) { + vXvMC->surfaces[i] = 0; + vXvMC->sPrivs[i] = 0; + } + +} + +static void cleanupViaXvMC(ViaXvMCPtr vXvMC) { + unsigned i; + + for (i=0; i < VIA_XVMC_MAX_CONTEXTS; ++i) { + vXvMC->contexts[i] = 0; + if (vXvMC->cPrivs[i]) { + xfree(vXvMC->cPrivs[i]); + vXvMC->cPrivs[i] = 0; + } + } + + for (i=0; i < VIA_XVMC_MAX_SURFACES; ++i) { + vXvMC->surfaces[i] = 0; + if (vXvMC->sPrivs[i]) { + xfree(vXvMC->sPrivs[i]); + vXvMC->sPrivs[i] = 0; + } + } +} + + +/* + * A number of short utility functions to access the buffers of a surface + * and also their components in the YUV420 case. YUV420 surfaces are aligned + * on 32 byte boundaries and have a pitch that is a multiple of 32 bytes for + * the Y component. 16 bytes for the uv components. + */ + + +static unsigned stride(int w) {return (w + 31) & ~31;} + +static unsigned long size_yuv420(int w, int h) { + unsigned yPitch = stride(w); + return h* (yPitch + (yPitch >> 1)); +} + +static unsigned long size_xx44(int w, int h) { + return h * stride(w); +} + + +static int yv12_subpicture_index_list[2] = +{ + FOURCC_IA44, + FOURCC_AI44 +}; + +static XF86MCImageIDList yv12_subpicture_list = +{ + 2, + yv12_subpicture_index_list +}; + +static XF86MCSurfaceInfoRec Via_YV12_mpg2_surface = +{ + FOURCC_YV12, + XVMC_CHROMA_FORMAT_420, + 0, + 1024, + 1024, + 1024, + 1024, + XVMC_MPEG_2 | XVMC_SLICE, + XVMC_OVERLAID_SURFACE, + &yv12_subpicture_list +}; + +/* + * FIXME: It remains to be checked whether the hardware can really do mpeg1. + */ + +static XF86MCSurfaceInfoRec Via_YV12_mpg1_surface = +{ + FOURCC_YV12, + XVMC_CHROMA_FORMAT_420, + 0, + 1024, + 1024, + 1024, + 1024, + XVMC_MPEG_1 | XVMC_SLICE, + XVMC_OVERLAID_SURFACE, + &yv12_subpicture_list +}; + +static XF86MCSurfaceInfoPtr ppSI[2] = +{ + (XF86MCSurfaceInfoPtr)&Via_YV12_mpg2_surface, + (XF86MCSurfaceInfoPtr)&Via_YV12_mpg1_surface +}; + +/* List of subpicture types that we support */ +static XF86ImageRec ia44_subpicture = XVIMAGE_IA44; +static XF86ImageRec ai44_subpicture = XVIMAGE_AI44; + +static XF86ImagePtr Via_subpicture_list[2] = +{ + (XF86ImagePtr)&ia44_subpicture, + (XF86ImagePtr)&ai44_subpicture +}; + +/* Fill in the device dependent adaptor record. + * This is named "VIA Video Overlay" because this code falls under the + * XV extenstion, the name must match or it won't be used. + * + * Surface and Subpicture - see above + * Function pointers to functions below + */ + +static XF86MCAdaptorRec pAdapt = +{ + "XV_SWOV", /* name */ + 2, /* num_surfaces */ + ppSI, /* surfaces */ + 2, /* num_subpictures */ + Via_subpicture_list, /* subpictures */ + (xf86XvMCCreateContextProcPtr)ViaXvMCCreateContext, + (xf86XvMCDestroyContextProcPtr)ViaXvMCDestroyContext, + (xf86XvMCCreateSurfaceProcPtr)ViaXvMCCreateSurface, + (xf86XvMCDestroySurfaceProcPtr)ViaXvMCDestroySurface, + (xf86XvMCCreateSubpictureProcPtr)ViaXvMCCreateSubpicture, + (xf86XvMCDestroySubpictureProcPtr)ViaXvMCDestroySubpicture +}; + +static XF86MCAdaptorPtr ppAdapt[1] = +{ + (XF86MCAdaptorPtr)&pAdapt +}; + +static void mpegDisable(VIAPtr pVia,CARD32 val) + +{ + MPGOutD(0x0c, MPGInD(0x0c) & (val ^ 0xffffffff)); +} + + + + +/************************************************************************** + * + * VIAInitXVMC + * + * Initialize the hardware motion compenstation extention for this + * hardware. The initialization routines want the address of the pointers + * to the structures, not the address of the structures. This means we + * allocate (or create static?) the pointer memory and pass that + * address. This seems a little convoluted. + * + * We need to allocate memory for the device depended adaptor record. + * This is what holds the pointers to all our device functions. + * + * We need to map the mmio registers into the drm. + * + * We need to map the framebuffer into the drm. + * + * Inputs: + * Screen pointer + * + * Outputs: + * None, this calls the device independent screen initialization + * function. + * + * Revisions: + * + **************************************************************************/ + +void ViaInitXVMC(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + VIAPtr pVia = VIAPTR(pScrn); + ViaXvMCPtr vXvMC = &(pVia->xvmc); + volatile ViaXvMCSAreaPriv *saPriv; + char *bID; + + pVia->XvMCEnabled = 0; + if(!pVia->directRenderingEnabled) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[XvMC] Cannot use XvMC without DRI!\n"); + return; + } + + /* + * FIXME: Get the DRI SAREA handle in a clumsy way. + * Make sure DRICloseConnection doesn't do something unwanted! + */ + + if (!DRIOpenConnection(pScreen,&vXvMC->sAreaBase,&bID)) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[XvMC] DRIOpenConnection failed.\n"); + return; + } + DRICloseConnection(pScreen); + + + if (drmAddMap(pVia->drmFD, (drmHandle)pVia->MmioBase, + VIA_MMIO_REGSIZE, DRM_REGISTERS, 0, &(vXvMC->mmioBase)) < 0) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[XvMC] drmAddMap(MMIO) failed.\n"); + return; + } + if (drmAddMap(pVia->drmFD, + (drmHandle)pVia->FrameBufferBase, + pVia->videoRambytes, DRM_FRAME_BUFFER, + 0 , &(vXvMC->fbBase)) < 0) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[XvMC] drmAddMap(FB) failed.\n"); + drmRmMap(pVia->drmFD,vXvMC->mmioBase); + return; + } + + initViaXvMC(vXvMC); + + if (! xf86XvMCScreenInit(pScreen, 1, ppAdapt)) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[XvMC] XvMCScreenInit failed.\n"); + drmRmMap(pVia->drmFD,vXvMC->mmioBase); + drmRmMap(pVia->drmFD,vXvMC->fbBase); + return; + } + + saPriv=(ViaXvMCSAreaPriv *) DRIGetSAREAPrivate(pScreen); + saPriv->XvMCSubPicOn = 0; + saPriv->XvMCCtxNoGrabbed = ~0; + + XVMC_DECODER_FUTEX(saPriv)->lock = 0; + XVMC_SAREA_SPINLOCK(saPriv)->lock = 0; + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[XvMC] Initialized XvMC extension.\n"); + pVia->XvMCEnabled = 1; +} + +void ViaCleanupXVMC(ScreenPtr pScreen) { + + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + VIAPtr pVia = VIAPTR(pScrn); + ViaXvMCPtr vXvMC = &(pVia->xvmc); + + if (pVia->XvMCEnabled) { + mpegDisable(pVia,0); + drmRmMap(pVia->drmFD,vXvMC->mmioBase); + drmRmMap(pVia->drmFD,vXvMC->fbBase); + cleanupViaXvMC(vXvMC); + } + pVia->XvMCEnabled = 0; +} + +/************************************************************************** + * + * VIAXvMCCreateContext + * + * Some info about the private data: + * + * Set *num_priv to the number of 32bit words that make up the size of + * of the data that priv will point to. + * + * *priv = (long *) xcalloc (elements, sizeof(element)) + * *num_priv = (elements * sizeof(element)) >> 2; + * + **************************************************************************/ + +int ViaXvMCCreateContext (ScrnInfoPtr pScrn, XvMCContextPtr pContext, + int *num_priv, long **priv ) +{ + VIAPtr pVia = VIAPTR(pScrn); + ViaXvMCPtr vXvMC = &(pVia->xvmc); + DRIInfoPtr pDRIInfo = pVia->pDRIInfo; + ViaXvMCCreateContextRec *contextRec; + unsigned ctxNo; + ViaXvMCContextPriv *cPriv; + + if(vXvMC->nContexts >= VIA_XVMC_MAX_CONTEXTS) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[XvMC] ViaXvMCCreateContext: Out of contexts.\n"); + return BadAlloc; + } + + *priv = xcalloc(1,sizeof(ViaXvMCCreateContextRec)); + contextRec = (ViaXvMCCreateContextRec *)*priv; + + if(!*priv) { + *num_priv = 0; + return BadAlloc; + } + + *num_priv = sizeof(ViaXvMCCreateContextRec) >> 2; + + for (ctxNo = 0; ctxNo < VIA_XVMC_MAX_CONTEXTS; ++ctxNo) { + if (0 == vXvMC->contexts[ctxNo] ) break; + } + + cPriv = (ViaXvMCContextPriv *) xcalloc(1,sizeof(ViaXvMCContextPriv)); + + if(!cPriv) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[XvMC] ViaXvMCCreateContext: Unable to allocate memory!\n"); + xfree(*priv); + *num_priv = 0; + return BadAlloc; + } + + if(drmCreateContext(pVia->drmFD, &(contextRec->drmcontext) ) < 0) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[XvMC] ViaXvMCCreateContext: Unable to create DRMContext!\n"); + xfree(*priv); + xfree(cPriv); + return BadAlloc; + } + drmSetContextFlags(pVia->drmFD, contextRec->drmcontext, + DRM_CONTEXT_2DONLY); + cPriv->drmCtx = contextRec->drmcontext; + + drmAuthMagic(pVia->drmFD, pContext->flags); + contextRec->fbBase = (CARD8 *)pVia->FrameBufferBase; + + /* + * Export framebuffer and mmio to non-root clients. + */ + + contextRec->ctxNo = ctxNo; + contextRec->fbOffset = vXvMC->fbBase; + contextRec->fbSize = pVia->videoRambytes; + contextRec->mmioOffset = vXvMC->mmioBase; + contextRec->mmioSize = VIA_MMIO_REGSIZE; + contextRec->sAreaOffset = vXvMC->sAreaBase; + contextRec->sAreaSize = pDRIInfo->SAREASize; + contextRec->sAreaPrivOffset = sizeof(XF86DRISAREARec); + contextRec->major = VIAXVMC_MAJOR; + contextRec->minor = VIAXVMC_MINOR; + contextRec->pl = VIAXVMC_PL; + strncpy (contextRec->busIdString, pDRIInfo->busIdString, 9); + vXvMC->nContexts++; + vXvMC->contexts[ctxNo] = pContext->context_id; + vXvMC->cPrivs[ctxNo] = cPriv; + return Success; +} + + +int ViaXvMCCreateSurface (ScrnInfoPtr pScrn, XvMCSurfacePtr pSurf, + int *num_priv, long **priv ) +{ + VIAPtr pVia = VIAPTR(pScrn); + ViaXvMCPtr vXvMC = &(pVia->xvmc); + unsigned srfNo,numBuffers,i; + ViaXvMCSurfacePriv *sPriv; + XvMCContextPtr ctx; + unsigned bufSize,yBufSize; + + if (VIA_XVMC_MAX_SURFACES == vXvMC->nSurfaces) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[XvMC] ViaXvMCCreateSurface: Too many surfaces !\n"); + return BadAlloc; + } + + sPriv = (ViaXvMCSurfacePriv *) xcalloc(1,sizeof(ViaXvMCSurfacePriv)); + + if(!sPriv) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[XvMC] ViaXvMCCreateSurface: Unable to allocate memory!\n"); + *num_priv = 0; + return BadAlloc; + } + + numBuffers = 1; + + /* + * Some chips require more than one buffer per surface (and a special + * flipping procedure; See Ivor Hewitt's ddmpeg.c version 1.6). The client + * lib will detect the number of buffers allocated and determine the + * flipping method from that. + */ +#if 0 /* Not enabled yet. */ + switch(pVia->ChipId) { + case PCI_CHIP_CLE3022: + case PCI_CHIP_CLE3122: + switch(pVia->ChipRev) { + case VIA_REVISION_CLEC0: + numBuffers = 2; + break; + default: + break; + } + break; + default: + break; + } +#endif + *num_priv = numBuffers + 2; + + *priv = (long *)xcalloc(*num_priv,sizeof(long)); + + if(!*priv) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[XvMC] ViaXvMCCreateSurface: Unable to allocate memory!\n"); + *num_priv = 0; + xfree(sPriv); + return BadAlloc; + } + + for (srfNo = 0; srfNo < VIA_XVMC_MAX_SURFACES; ++srfNo) { + if (0 == vXvMC->sPrivs[srfNo] ) break; + } + + (*priv)[0] = srfNo; + + /* + * Allocate buffers; + */ + + ctx = pSurf->context; + bufSize = size_yuv420(ctx->width, ctx->height); + sPriv->memory_ref.pool = 0; + if (VIAAllocLinear(&(sPriv->memory_ref), pScrn, numBuffers * bufSize + 32)) { + xfree(*priv); + xfree(sPriv); + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[XvMC] ViaXvMCCreateSurface: " + "Unable to allocate frambuffer memory!\n"); + return BadAlloc; + } + + (*priv)[1] = numBuffers; + (*priv)[2] = sPriv->offsets[0] = ALIGN_TO_32_BYTES(sPriv->memory_ref.base); + for (i = 1; i < numBuffers; ++i) { + (*priv)[i+2] = sPriv->offsets[i] = sPriv->offsets[i-1] + bufSize; + } + + /* + * Clear buffers. FIXME: Clear to YV12 black. This is green. + */ + + yBufSize = stride(ctx->width)*ctx->height; + for (i = 0; i < numBuffers; ++i) { + memset((CARD8 *)(pVia->FBBase) + sPriv->offsets[i], 0, yBufSize); + memset((CARD8 *)(pVia->FBBase) + sPriv->offsets[i] + yBufSize, 0x80, + yBufSize >> 1); + } + + vXvMC->sPrivs[srfNo] = sPriv; + vXvMC->surfaces[srfNo] = pSurf->surface_id; + vXvMC->nSurfaces++; + return Success; +} + +int ViaXvMCCreateSubpicture (ScrnInfoPtr pScrn, XvMCSubpicturePtr pSubp, + int *num_priv, long **priv ) +{ + VIAPtr pVia = VIAPTR(pScrn); + ViaXvMCPtr vXvMC = &(pVia->xvmc); + unsigned srfNo; + ViaXvMCSurfacePriv *sPriv; + XvMCContextPtr ctx; + unsigned bufSize; + + if (VIA_XVMC_MAX_SURFACES == vXvMC->nSurfaces) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[XvMC] ViaXvMCCreateSubpicture: Too many surfaces !\n"); + return BadAlloc; + } + + sPriv = (ViaXvMCSurfacePriv *) xcalloc(1,sizeof(ViaXvMCSurfacePriv)); + + if(!sPriv) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[XvMC] ViaXvMCCreateSubpicture: Unable to allocate memory!\n"); + *num_priv = 0; + return BadAlloc; + } + + *priv = (long *)xcalloc(3,sizeof(long)); + + if(!*priv) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[XvMC] ViaXvMCCreateSubpicture: Unable to allocate memory!\n"); + *num_priv = 0; + xfree(sPriv); + return BadAlloc; + } + + *num_priv = 2; + + for (srfNo = 0; srfNo < VIA_XVMC_MAX_SURFACES; ++srfNo) { + if (0 == vXvMC->sPrivs[srfNo] ) break; + } + + (*priv)[0] = srfNo; + + /* + * Allocate buffers; + */ + + ctx = pSubp->context; + bufSize = size_xx44(ctx->width,ctx->height); + sPriv->memory_ref.pool = 0; + if (VIAAllocLinear(&(sPriv->memory_ref), pScrn, + 1 * bufSize + 32)) { + xfree(*priv); + xfree(sPriv); + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[XvMC] ViaXvMCCreateSubpicture: Unable to allocate " + "framebuffer memory!\n"); + return BadAlloc; + } + (*priv)[1] = sPriv->offsets[0] = ALIGN_TO_32_BYTES(sPriv->memory_ref.base); + + vXvMC->sPrivs[srfNo] = sPriv; + vXvMC->surfaces[srfNo] = pSubp->subpicture_id; + vXvMC->nSurfaces++; + + return Success; +} + +static void ViaXvMCDestroyContext (ScrnInfoPtr pScrn, XvMCContextPtr pContext) +{ + VIAPtr pVia = VIAPTR(pScrn); + ViaXvMCPtr vXvMC = &(pVia->xvmc); + int i; + volatile ViaXvMCSAreaPriv *sAPriv; + drmContext context; + + for(i=0; i < VIA_XVMC_MAX_CONTEXTS; i++) { + if(vXvMC->contexts[i] == pContext->context_id) { + + /* + * Check if the context to be destroyed currently holds the decoder. + * In that case, release the decoder. + */ + + context = vXvMC->cPrivs[i]->drmCtx; + sAPriv=(ViaXvMCSAreaPriv *) DRIGetSAREAPrivate(pScrn->pScreen); + + + if ((XVMC_DECODER_FUTEX(sAPriv)->lock & ~DRM_LOCK_CONT) == + (context | DRM_LOCK_HELD)) { + DRM_CAS_RESULT(__ret); + sAPriv->XvMCCtxNoGrabbed = ~0; + DRM_CAS( XVMC_DECODER_FUTEX(sAPriv), context | DRM_LOCK_HELD, + 0, __ret); + if (__ret) { + + /* + * There were waiters for the decoder. Wake them up. + */ + + drm_via_futex_t fx; + fx.op = VIA_FUTEX_WAKE; + fx.lock = 0; + XVMC_DECODER_FUTEX(sAPriv)->lock = 0; + drmCommandWrite(pVia->drmFD, DRM_VIA_DEC_FUTEX, + &fx,sizeof(fx)); + + } + } + + /* + * Destroy the DRM context. + */ + + drmDestroyContext(pVia->drmFD,vXvMC->cPrivs[i]->drmCtx); + xfree(vXvMC->cPrivs[i]); + vXvMC->cPrivs[i] = 0; + vXvMC->nContexts--; + vXvMC->contexts[i] = 0; + return; + } + } + return; +} + +static void ViaXvMCDestroySurface (ScrnInfoPtr pScrn, XvMCSurfacePtr pSurf) +{ + VIAPtr pVia = VIAPTR(pScrn); + ViaXvMCPtr vXvMC = &(pVia->xvmc); + int i; + volatile ViaXvMCSAreaPriv *sAPriv; + + for(i=0; i < VIA_XVMC_MAX_SURFACES; i++) { + if(vXvMC->surfaces[i] == pSurf->surface_id) { + + /* + * Turn off overlay if it is on as a result of process dying. + * Forcefully take the SAREA spinlock, but go easy on other + * processes that might think they have it. + */ + + sAPriv=(ViaXvMCSAreaPriv*) DRIGetSAREAPrivate(pScrn->pScreen); + DRM_SPINLOCK_TAKE( XVMC_SAREA_SPINLOCK( sAPriv ), ~0 ); + + do { + DRM_CAS_RESULT(__ret); + DRM_CAS(&sAPriv->XvMCDisplaying,i|XVMC_DISPLAYING,0,__ret); + if (__ret) { + + /* FIXME: + * We might want to turn off overlay here, but at this stage, + * the user may have used Xv to present her own picture, + * which we of course don't want to destroy. Therefore, + * leave the overlay on for until we've made Xv XvMC-AWARE + */ + + } + }while(0); + + DRM_SPINUNLOCK( XVMC_SAREA_SPINLOCK( sAPriv ), ~0 ); + + VIAFreeLinear(&(vXvMC->sPrivs[i]->memory_ref)); + xfree(vXvMC->sPrivs[i]); + vXvMC->nSurfaces--; + vXvMC->sPrivs[i] = 0; + vXvMC->surfaces[i] = 0; + return; + } + } + return; +} + +static void ViaXvMCDestroySubpicture (ScrnInfoPtr pScrn, XvMCSubpicturePtr pSubp) +{ + VIAPtr pVia = VIAPTR(pScrn); + ViaXvMCPtr vXvMC = &(pVia->xvmc); + int i; + volatile ViaXvMCSAreaPriv *sAPriv; + + + for(i=0; i < VIA_XVMC_MAX_SURFACES; i++) { + if(vXvMC->surfaces[i] == pSubp->subpicture_id) { + + /* + * Turn off subpicture if it is on as a result of process dying. + * Forcefully take the SAREA spinlock, but go easy on other + * processes that still might think they have it. + */ + + sAPriv=(ViaXvMCSAreaPriv*) DRIGetSAREAPrivate(pScrn->pScreen); + DRM_SPINLOCK_TAKE( XVMC_SAREA_SPINLOCK( sAPriv ), ~0 ); + + { + DRM_CAS_RESULT(__ret); + + DRM_CAS(&sAPriv->XvMCSubPicOn,i|XVMC_DISPLAYING,0,__ret); + if (__ret) { + + /* + * Turn subpicture off. + */ + + while (VIDInD(V_COMPOSE_MODE) & + (V1_COMMAND_FIRE | V3_COMMAND_FIRE)); + VIDOutD(SUBP_CONTROL_STRIDE, VIDInD(SUBP_CONTROL_STRIDE) & + ~SUBP_HQV_ENABLE); + + } + } + + DRM_SPINUNLOCK( XVMC_SAREA_SPINLOCK( sAPriv ), ~0 ); + + VIAFreeLinear(&(vXvMC->sPrivs[i]->memory_ref)); + xfree(vXvMC->sPrivs[i]); + vXvMC->nSurfaces--; + vXvMC->sPrivs[i] = 0; + vXvMC->surfaces[i] = 0; + + return; + } + } + return; +} + +#endif diff --git a/src/via_xvmc.h b/src/via_xvmc.h new file mode 100644 index 0000000..a5dedce --- /dev/null +++ b/src/via_xvmc.h @@ -0,0 +1,61 @@ +/*************************************************************************** +Copyright 2004 Thomas Hellström. All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sub license, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice (including the +next paragraph) shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS / COPYRIGHT HOLDERS AND / OR THEIR SUPPLIERS +BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +**************************************************************************/ +#ifndef _VIA_XVMC_H +#define _VIA_XVMC_H 1 + +#include "via_dri.h" + +/* + * This file contains the common definitions between the XvMC lib and the X server + * side. It is referenced also by the XvMC lib through softlinks. Make sure any + * structure change is reflected also in a change in version number!! + */ + +#define DRM_VIA_DEC_FUTEX 5 + +#define VIAXVMC_MAJOR 0 +#define VIAXVMC_MINOR 2 +#define VIAXVMC_PL 0 + +typedef drm_via_sarea_t ViaXvMCSAreaPriv; + +typedef struct { + unsigned ctxNo; + drmContext drmcontext; + CARD8 *fbBase; + unsigned int fbOffset; + unsigned int fbSize; + unsigned int mmioOffset; + unsigned int mmioSize; + unsigned int sAreaOffset; + unsigned int sAreaSize; + unsigned int sAreaPrivOffset; + char busIdString[10]; + unsigned major,minor,pl; + unsigned pad; +} ViaXvMCCreateContextRec; + +#endif diff --git a/src/via_xvpriv.h b/src/via_xvpriv.h new file mode 100644 index 0000000..bf302e3 --- /dev/null +++ b/src/via_xvpriv.h @@ -0,0 +1,98 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_xvpriv.h,v 1.5 2003/08/27 15:16:14 tsi Exp $ */ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef _VIA_XVPRIV_H_ +#define _VIA_XVPRIV_H_ 1 + +#include "videodev.h" + +#define XV_PORT_NUM 5 +#define XV_SWOV_PORTID 0 +#define XV_TV0_PORTID 1 +#define XV_TV1_PORTID 2 +#define XV_UTCTRL_PORTID 3 +#define XV_DUMMY_PORTID 4 + +#define COMMAND_FOR_SWOV XV_SWOV_PORTID +#define COMMAND_FOR_TV0 XV_TV0_PORTID +#define COMMAND_FOR_TV1 XV_TV1_PORTID +#define COMMAND_FOR_UTCTRL XV_UTCTRL_PORTID +#define COMMAND_FOR_DUMMY XV_DUMMY_PORTID + +typedef struct { + unsigned char xv_portnum; + unsigned char brightness; + unsigned char saturation; + unsigned char contrast; + unsigned char hue; + unsigned long dwEncoding; + RegionRec clip; + CARD32 colorKey; + Time offTime; + Time freeTime; + VIACapRec CapInfo; + CARD32 AudioMode; + int Volume; + + /* Surface structure */ + DDSURFACEDESC SurfaceDesc; + DDLOCK ddLock; + + /* file handle */ + int nr; + struct video_capability cap; + + /* attributes */ + struct video_picture pict; + struct video_audio audio; + + int *input; + int *norm; + int nenc,cenc; + + /* yuv to offscreen */ + struct video_window yuv_win; + + /* store old video source & dst data */ + short old_src_w; + short old_src_h; + + short old_drw_x; + short old_drw_y; + short old_drw_w; + short old_drw_h; + +} viaPortPrivRec, *viaPortPrivPtr; + +#if 0 +__inline void AllocatePortPriv(); +__inline void FreePortPriv(); +__inline void ClearPortPriv(int); +viaPortPrivPtr GetPortPriv(int); +void SetPortPriv(int nIndex, unsigned long dwAction, unsigned long dwValue); +unsigned long IdentifyPort(viaPortPrivPtr); +#endif + +#endif /* _VIA_XVPRIV_H_ */ diff --git a/src/videodev.h b/src/videodev.h new file mode 100644 index 0000000..72bd20f --- /dev/null +++ b/src/videodev.h @@ -0,0 +1,128 @@ +#ifndef __LINUX_VIDEODEV_H +#define __LINUX_VIDEODEV_H + +/* Linux V4L API, Version 1 + * videodev.h from v4l driver in Linux 2.2.3 + * + * Used here with the explicit permission of the original author, Alan Cox. + * <alan@lxorguk.ukuu.org.uk> + */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/videodev.h,v 1.1 2003/08/04 10:32:28 eich Exp $ */ + +#include "Xmd.h" + +#define VID_TYPE_CAPTURE 1 /* Can capture */ +#define VID_TYPE_TUNER 2 /* Can tune */ +#define VID_TYPE_TELETEXT 4 /* Does teletext */ +#define VID_TYPE_OVERLAY 8 /* Overlay onto frame buffer */ +#define VID_TYPE_CHROMAKEY 16 /* Overlay by chromakey */ +#define VID_TYPE_CLIPPING 32 /* Can clip */ +#define VID_TYPE_FRAMERAM 64 /* Uses the frame buffer memory */ +#define VID_TYPE_SCALES 128 /* Scalable */ +#define VID_TYPE_MONOCHROME 256 /* Monochrome only */ +#define VID_TYPE_SUBCAPTURE 512 /* Can capture subareas of the image */ + +struct video_capability +{ + char name[32]; + int type; + int channels; /* Num channels */ + int audios; /* Num audio devices */ + int maxwidth; /* Supported width */ + int maxheight; /* And height */ + int minwidth; /* Supported width */ + int minheight; /* And height */ +}; + + +struct video_picture +{ + CARD16 brightness; + CARD16 hue; + CARD16 colour; + CARD16 contrast; + CARD16 whiteness; /* Black and white only */ + CARD16 depth; /* Capture depth */ + CARD16 palette; /* Palette in use */ +#define VIDEO_PALETTE_GREY 1 /* Linear greyscale */ +#define VIDEO_PALETTE_HI240 2 /* High 240 cube (BT848) */ +#define VIDEO_PALETTE_RGB565 3 /* 565 16 bit RGB */ +#define VIDEO_PALETTE_RGB24 4 /* 24bit RGB */ +#define VIDEO_PALETTE_RGB32 5 /* 32bit RGB */ +#define VIDEO_PALETTE_RGB555 6 /* 555 15bit RGB */ +#define VIDEO_PALETTE_YUV422 7 /* YUV422 capture */ +#define VIDEO_PALETTE_YUYV 8 +#define VIDEO_PALETTE_UYVY 9 /* The great thing about standards is ... */ +#define VIDEO_PALETTE_YUV420 10 +#define VIDEO_PALETTE_YUV411 11 /* YUV411 capture */ +#define VIDEO_PALETTE_RAW 12 /* RAW capture (BT848) */ +#define VIDEO_PALETTE_YUV422P 13 /* YUV 4:2:2 Planar */ +#define VIDEO_PALETTE_YUV411P 14 /* YUV 4:1:1 Planar */ +#define VIDEO_PALETTE_YUV420P 15 /* YUV 4:2:0 Planar */ +#define VIDEO_PALETTE_YUV410P 16 /* YUV 4:1:0 Planar */ +#define VIDEO_PALETTE_PLANAR 13 /* start of planar entries */ +#define VIDEO_PALETTE_COMPONENT 7 /* start of component entries */ +}; + +struct video_audio +{ + int audio; /* Audio channel */ + CARD16 volume; /* If settable */ + CARD16 bass, treble; + CARD32 flags; +#define VIDEO_AUDIO_MUTE 1 +#define VIDEO_AUDIO_MUTABLE 2 +#define VIDEO_AUDIO_VOLUME 4 +#define VIDEO_AUDIO_BASS 8 +#define VIDEO_AUDIO_TREBLE 16 + char name[16]; +#define VIDEO_SOUND_MONO 1 +#define VIDEO_SOUND_STEREO 2 +#define VIDEO_SOUND_LANG1 4 +#define VIDEO_SOUND_LANG2 8 + CARD16 mode; + CARD16 balance; /* Stereo balance */ + CARD16 step; /* Step actual volume uses */ +}; + +struct video_clip +{ + INT32 x,y; + INT32 width, height; + struct video_clip *next; /* For user use/driver use only */ +}; + +struct video_window +{ + CARD32 x,y; /* Position of window */ + CARD32 width,height; /* Its size */ + CARD32 chromakey; + CARD32 flags; + struct video_clip *clips; /* Set only */ + int clipcount; +#define VIDEO_WINDOW_INTERLACE 1 +#define VIDEO_CLIP_BITMAP -1 +/* bitmap is 1024x625, a '1' bit represents a clipped pixel */ +#define VIDEO_CLIPMAP_SIZE (128 * 625) +}; + +struct video_channel +{ + int channel; + char name[32]; + int tuners; + CARD32 flags; +#define VIDEO_VC_TUNER 1 /* Channel has a tuner */ +#define VIDEO_VC_AUDIO 2 /* Channel has audio */ + CARD16 type; +#define VIDEO_TYPE_TV 1 +#define VIDEO_TYPE_CAMERA 2 + CARD16 norm; /* Norm set by channel */ +}; + +#define VIDEO_MODE_PAL 0 +#define VIDEO_MODE_NTSC 1 +#define VIDEO_MODE_SECAM 2 +#define VIDEO_MODE_AUTO 3 + +#endif |