summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--man/via.man121
-rw-r--r--src/Imakefile148
-rw-r--r--src/ddmpeg.h466
-rw-r--r--src/via.h635
-rw-r--r--src/via_accel.c1225
-rw-r--r--src/via_bandwidth.c385
-rw-r--r--src/via_bandwidth.h58
-rw-r--r--src/via_bios.c8625
-rw-r--r--src/via_bios.h633
-rw-r--r--src/via_capture.h77
-rw-r--r--src/via_ch7019.h156
-rw-r--r--src/via_common.h55
-rw-r--r--src/via_compose.h67
-rw-r--r--src/via_cursor.c191
-rw-r--r--src/via_dga.c355
-rw-r--r--src/via_dri.c676
-rw-r--r--src/via_dri.h169
-rw-r--r--src/via_driver.c3399
-rw-r--r--src/via_driver.h530
-rw-r--r--src/via_fs454.h161
-rw-r--r--src/via_gpioi2c.c490
-rw-r--r--src/via_gpioi2c.h61
-rw-r--r--src/via_hwdiff.c128
-rw-r--r--src/via_i2c.c414
-rw-r--r--src/via_i2c.h28
-rw-r--r--src/via_memcpy.c669
-rw-r--r--src/via_memcpy.h31
-rw-r--r--src/via_memory.c211
-rw-r--r--src/via_mode.h870
-rw-r--r--src/via_modeheaders.c3609
-rw-r--r--src/via_overlay.c899
-rw-r--r--src/via_overlay.h49
-rw-r--r--src/via_priv.h68
-rw-r--r--src/via_privioctl.h102
-rw-r--r--src/via_refresh.h486
-rw-r--r--src/via_regrec.c177
-rw-r--r--src/via_regrec.h67
-rw-r--r--src/via_regs.h212
-rw-r--r--src/via_saa7108.h218
-rw-r--r--src/via_shadow.c276
-rw-r--r--src/via_swov.c1802
-rw-r--r--src/via_swov.h55
-rw-r--r--src/via_tuner.c670
-rw-r--r--src/via_tv2.h126
-rw-r--r--src/via_tv3.h366
-rw-r--r--src/via_utility.c2024
-rw-r--r--src/via_utility.h459
-rw-r--r--src/via_vbe.c833
-rw-r--r--src/via_video.c1269
-rw-r--r--src/via_video.h135
-rw-r--r--src/via_vt1622a.h366
-rw-r--r--src/via_xvmc.c765
-rw-r--r--src/via_xvmc.h61
-rw-r--r--src/via_xvpriv.h98
-rw-r--r--src/videodev.h128
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