Home | History | Annotate | Download | only in VideoDxe
      1 /** @file
      2 
      3 Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
      4 
      5 This program and the accompanying materials
      6 are licensed and made available under the terms and conditions
      7 of the BSD License which accompanies this distribution.  The
      8 full text of the license may be found at
      9 http://opensource.org/licenses/bsd-license.php
     10 
     11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     13 
     14 **/
     15 
     16 #ifndef _VESA_BIOS_EXTENSIONS_H_
     17 #define _VESA_BIOS_EXTENSIONS_H_
     18 
     19 //
     20 // Turn on byte packing of data structures
     21 //
     22 #pragma pack(1)
     23 //
     24 // VESA BIOS Extensions status codes
     25 //
     26 #define VESA_BIOS_EXTENSIONS_STATUS_SUCCESS 0x004f
     27 
     28 //
     29 // VESA BIOS Extensions Services
     30 //
     31 #define VESA_BIOS_EXTENSIONS_RETURN_CONTROLLER_INFORMATION  0x4f00
     32 
     33 /*++
     34 
     35   Routine Description:
     36     Function 00 : Return Controller Information
     37 
     38   Arguments:
     39     Inputs:
     40       AX    = 0x4f00
     41       ES:DI = Pointer to buffer to place VESA_BIOS_EXTENSIONS_INFORMATION_BLOCK structure
     42     Outputs:
     43       AX    = Return Status
     44 
     45 --*/
     46 #define VESA_BIOS_EXTENSIONS_RETURN_MODE_INFORMATION  0x4f01
     47 
     48 /*++
     49 
     50   Routine Description:
     51     Function 01 : Return Mode Information
     52 
     53   Arguments:
     54     Inputs:
     55       AX    = 0x4f01
     56       CX    = Mode Number
     57       ES:DI = Pointer to buffer to place VESA_BIOS_EXTENSIONS_MODE_INFORMATION_BLOCK structure
     58     Outputs:
     59       AX    = Return Status
     60 
     61 --*/
     62 #define VESA_BIOS_EXTENSIONS_SET_MODE 0x4f02
     63 
     64 /*++
     65 
     66   Routine Description:
     67     Function 02 : Set Mode
     68 
     69   Arguments:
     70     Inputs:
     71       AX    = 0x4f02
     72       BX    = Desired mode to set
     73         D0-D8   = Mode Number
     74         D9-D10  = Reserved (must be 0)
     75         D11     = 0 - Use current default refresh rate
     76                 = 1 - Use user specfieid CRTC values for refresh rate
     77         D12-D13 = Reserved (must be 0)
     78         D14     = 0 - Use windowed frame buffer model
     79                 = 1 - Use linear/flat frame buffer model
     80         D15     = 0 - Clear display memory
     81                 = 1 - Don't clear display memory
     82       ES:DI = Pointer to buffer to the VESA_BIOS_EXTENSIONS_CRTC_INFORMATION_BLOCK structure
     83     Outputs:
     84       AX    = Return Status
     85 
     86 --*/
     87 #define VESA_BIOS_EXTENSIONS_RETURN_CURRENT_MODE  0x4f03
     88 
     89 /*++
     90 
     91   Routine Description:
     92     Function 03 : Return Current Mode
     93 
     94   Arguments:
     95     Inputs:
     96       AX    = 0x4f03
     97     Outputs:
     98       AX    = Return Status
     99       BX    = Current mode
    100         D0-D13  = Mode Number
    101         D14     = 0 - Windowed frame buffer model
    102                 = 1 - Linear/flat frame buffer model
    103         D15     = 0 - Memory cleared at last mode set
    104                 = 1 - Memory not cleared at last mode set
    105 
    106 --*/
    107 #define VESA_BIOS_EXTENSIONS_SAVE_RESTORE_STATE 0x4f04
    108 
    109 /*++
    110 
    111   Routine Description:
    112     Function 04 : Save/Restore State
    113 
    114   Arguments:
    115     Inputs:
    116       AX    = 0x4f03
    117       DL    = 0x00 - Return Save/Restore State buffer size
    118             = 0x01 - Save State
    119             = 0x02 - Restore State
    120       CX    = Requested Status
    121         D0  = Save/Restore controller hardware state
    122         D1  = Save/Restore BIOS data state
    123         D2  = Save/Restore DAC state
    124         D3  = Save/Restore Regsiter state
    125       ES:BX = Pointer to buffer if DL=1 or DL=2
    126     Outputs:
    127       AX    = Return Status
    128       BX    = Number of 64 byte blocks to hold the state buffer if DL=0
    129 
    130 --*/
    131 #define VESA_BIOS_EXTENSIONS_EDID  0x4f15
    132 
    133 /*++
    134 
    135   Routine Description:
    136     Function 15 : implement VBE/DDC service
    137 
    138   Arguments:
    139     Inputs:
    140       AX    = 0x4f15
    141       BL    = 0x00 - Report VBE/DDC Capabilities
    142       CX    = 0x00 - Controller unit number (00 = primary controller)
    143       ES:DI = Null pointer, must be 0:0 in version 1.0
    144     Outputs:
    145       AX    = Return Status
    146       BH    = Approx. time in seconds, rounded up, to transfer one EDID block(128 bytes)
    147       BL    = DDC level supported
    148         D0  = 0 DDC1 not supported
    149             = 1 DDC1 supported
    150         D1  = 0 DDC2 not supported
    151             = 1 DDC2 supported
    152         D2  = 0 Screen not blanked during data transfer
    153             = 1 Screen blanked during data transfer
    154 
    155     Inputs:
    156       AX    = 0x4f15
    157       BL    = 0x01 - Read EDID
    158       CX    = 0x00 - Controller unit number (00 = primary controller)
    159       DX    = 0x00 - EDID block number
    160       ES:DI = Pointer to buffer in which the EDID block is returned
    161     Outputs:
    162       AX    = Return Status
    163 --*/
    164 
    165 //
    166 // Timing data from EDID data block
    167 //
    168 #define VESA_BIOS_EXTENSIONS_EDID_BLOCK_SIZE                    128
    169 #define VESA_BIOS_EXTENSIONS_EDID_ESTABLISHED_TIMING_MAX_NUMBER 17
    170 
    171 //
    172 // Established Timings: 24 possible resolutions
    173 // Standard Timings: 8 possible resolutions
    174 // Detailed Timings: 4 possible resolutions
    175 //
    176 #define VESA_BIOS_EXTENSIONS_EDID_TIMING_MAX_NUMBER             36
    177 
    178 //
    179 // Timing data size for Established Timings, Standard Timings and Detailed Timings
    180 //
    181 #define VESA_BIOS_EXTENSIONS_ESTABLISHED_TIMING_SIZE                  3
    182 #define VESA_BIOS_EXTENSIONS_STANDARD_TIMING_SIZE                     16
    183 #define VESA_BIOS_EXTENSIONS_DETAILED_TIMING_EACH_DESCRIPTOR_SIZE     18
    184 #define VESA_BIOS_EXTENSIONS_DETAILED_TIMING_DESCRIPTOR_MAX_SIZE      72
    185 
    186 typedef struct {
    187   UINT16  HorizontalResolution;
    188   UINT16  VerticalResolution;
    189   UINT16  RefreshRate;
    190 } VESA_BIOS_EXTENSIONS_EDID_TIMING;
    191 
    192 typedef struct {
    193   UINT32  ValidNumber;
    194   UINT32  Key[VESA_BIOS_EXTENSIONS_EDID_TIMING_MAX_NUMBER];
    195 } VESA_BIOS_EXTENSIONS_VALID_EDID_TIMING;
    196 
    197 typedef struct {
    198   UINT8   Header[8];                        //EDID header "00 FF FF FF FF FF FF 00"
    199   UINT16  ManufactureName;                  //EISA 3-character ID
    200   UINT16  ProductCode;                      //Vendor assigned code
    201   UINT32  SerialNumber;                     //32-bit serial number
    202   UINT8   WeekOfManufacture;                //Week number
    203   UINT8   YearOfManufacture;                //Year
    204   UINT8   EdidVersion;                      //EDID Structure Version
    205   UINT8   EdidRevision;                     //EDID Structure Revision
    206   UINT8   VideoInputDefinition;
    207   UINT8   MaxHorizontalImageSize;           //cm
    208   UINT8   MaxVerticalImageSize;             //cm
    209   UINT8   DisplayTransferCharacteristic;
    210   UINT8   FeatureSupport;
    211   UINT8   RedGreenLowBits;                  //Rx1 Rx0 Ry1 Ry0 Gx1 Gx0 Gy1Gy0
    212   UINT8   BlueWhiteLowBits;                 //Bx1 Bx0 By1 By0 Wx1 Wx0 Wy1 Wy0
    213   UINT8   RedX;                             //Red-x Bits 9 - 2
    214   UINT8   RedY;                             //Red-y Bits 9 - 2
    215   UINT8   GreenX;                           //Green-x Bits 9 - 2
    216   UINT8   GreenY;                           //Green-y Bits 9 - 2
    217   UINT8   BlueX;                            //Blue-x Bits 9 - 2
    218   UINT8   BlueY;                            //Blue-y Bits 9 - 2
    219   UINT8   WhiteX;                           //White-x Bits 9 - 2
    220   UINT8   WhiteY;                           //White-x Bits 9 - 2
    221   UINT8   EstablishedTimings[VESA_BIOS_EXTENSIONS_ESTABLISHED_TIMING_SIZE];
    222   UINT8   StandardTimingIdentification[VESA_BIOS_EXTENSIONS_STANDARD_TIMING_SIZE];
    223   UINT8   DetailedTimingDescriptions[VESA_BIOS_EXTENSIONS_DETAILED_TIMING_DESCRIPTOR_MAX_SIZE];
    224   UINT8   ExtensionFlag;                    //Number of (optional) 128-byte EDID extension blocks to follow
    225   UINT8   Checksum;
    226 } VESA_BIOS_EXTENSIONS_EDID_DATA_BLOCK;
    227 
    228 //
    229 // Super VGA Information Block
    230 //
    231 typedef struct {
    232   UINT32  VESASignature;      // 'VESA' 4 byte signature
    233   UINT16  VESAVersion;        // VBE version number
    234   UINT32  OEMStringPtr;      // Pointer to OEM string
    235   UINT32  Capabilities;       // Capabilities of video card
    236   UINT32  VideoModePtr;      // Pointer to an array of 16-bit supported modes values terminated by 0xFFFF
    237   UINT16  TotalMemory;        // Number of 64kb memory blocks
    238   UINT16  OemSoftwareRev;     // VBE implementation Software revision
    239   UINT32  OemVendorNamePtr;  // VbeFarPtr to Vendor Name String
    240   UINT32  OemProductNamePtr; // VbeFarPtr to Product Name String
    241   UINT32  OemProductRevPtr;  // VbeFarPtr to Product Revision String
    242   UINT8   Reserved[222];      // Reserved for VBE implementation scratch area
    243   UINT8   OemData[256];       // Data area for OEM strings.  Pad to 512 byte block size
    244 } VESA_BIOS_EXTENSIONS_INFORMATION_BLOCK;
    245 
    246 //
    247 // Super VGA Information Block VESASignature values
    248 //
    249 #define VESA_BIOS_EXTENSIONS_VESA_SIGNATURE SIGNATURE_32 ('V', 'E', 'S', 'A')
    250 #define VESA_BIOS_EXTENSIONS_VBE2_SIGNATURE SIGNATURE_32 ('V', 'B', 'E', '2')
    251 
    252 //
    253 // Super VGA Information Block VESAVersion values
    254 //
    255 #define VESA_BIOS_EXTENSIONS_VERSION_1_2  0x0102
    256 #define VESA_BIOS_EXTENSIONS_VERSION_2_0  0x0200
    257 #define VESA_BIOS_EXTENSIONS_VERSION_3_0  0x0300
    258 
    259 //
    260 // Super VGA Information Block Capabilities field bit defintions
    261 //
    262 #define VESA_BIOS_EXTENSIONS_CAPABILITY_8_BIT_DAC 0x01  // 0: DAC width is fixed at 6 bits/color
    263 // 1: DAC width switchable to 8 bits/color
    264 //
    265 #define VESA_BIOS_EXTENSIONS_CAPABILITY_NOT_VGA 0x02  // 0: Controller is VGA compatible
    266 // 1: Controller is not VGA compatible
    267 //
    268 #define VESA_BIOS_EXTENSIONS_CAPABILITY_NOT_NORMAL_RAMDAC 0x04  // 0: Normal RAMDAC operation
    269 // 1: Use blank bit in function 9 to program RAMDAC
    270 //
    271 #define VESA_BIOS_EXTENSIONS_CAPABILITY_STEREOSCOPIC  0x08  // 0: No hardware stereoscopic signal support
    272 // 1: Hardware stereoscopic signal support
    273 //
    274 #define VESA_BIOS_EXTENSIONS_CAPABILITY_VESA_EVC  0x10  // 0: Stero signaling supported via external VESA stereo connector
    275 // 1: Stero signaling supported via VESA EVC connector
    276 //
    277 // Super VGA mode number bite field definitions
    278 //
    279 #define VESA_BIOS_EXTENSIONS_MODE_NUMBER_VESA 0x0100  // 0: Not a VESA defined VBE mode
    280 // 1: A VESA defined VBE mode
    281 //
    282 #define VESA_BIOS_EXTENSIONS_MODE_NUMBER_REFRESH_CONTROL_USER 0x0800  // 0: Use current BIOS default referesh rate
    283 // 1: Use the user specified CRTC values for refresh rate
    284 //
    285 #define VESA_BIOS_EXTENSIONS_MODE_NUMBER_LINEAR_FRAME_BUFFER  0x4000  // 0: Use a banked/windowed frame buffer
    286 // 1: Use a linear/flat frame buffer
    287 //
    288 #define VESA_BIOS_EXTENSIONS_MODE_NUMBER_PRESERVE_MEMORY  0x8000  // 0: Clear display memory
    289 // 1: Preseve display memory
    290 //
    291 // Super VGA Information Block mode list terminator value
    292 //
    293 #define VESA_BIOS_EXTENSIONS_END_OF_MODE_LIST 0xffff
    294 
    295 //
    296 // Window Function
    297 //
    298 typedef
    299 VOID
    300 (*VESA_BIOS_EXTENSIONS_WINDOW_FUNCTION) (
    301   VOID
    302   );
    303 
    304 //
    305 // Super VGA Mode Information Block
    306 //
    307 typedef struct {
    308   //
    309   // Manadory fields for all VESA Bios Extensions revisions
    310   //
    311   UINT16                                ModeAttributes;   // Mode attributes
    312   UINT8                                 WinAAttributes;   // Window A attributes
    313   UINT8                                 WinBAttributes;   // Window B attributes
    314   UINT16                                WinGranularity;   // Window granularity in k
    315   UINT16                                WinSize;          // Window size in k
    316   UINT16                                WinASegment;      // Window A segment
    317   UINT16                                WinBSegment;      // Window B segment
    318   UINT32                                WindowFunction;   // Pointer to window function
    319   UINT16                                BytesPerScanLine; // Bytes per scanline
    320   //
    321   // Manadory fields for VESA Bios Extensions 1.2 and above
    322   //
    323   UINT16                                XResolution;          // Horizontal resolution
    324   UINT16                                YResolution;          // Vertical resolution
    325   UINT8                                 XCharSize;            // Character cell width
    326   UINT8                                 YCharSize;            // Character cell height
    327   UINT8                                 NumberOfPlanes;       // Number of memory planes
    328   UINT8                                 BitsPerPixel;         // Bits per pixel
    329   UINT8                                 NumberOfBanks;        // Number of CGA style banks
    330   UINT8                                 MemoryModel;          // Memory model type
    331   UINT8                                 BankSize;             // Size of CGA style banks
    332   UINT8                                 NumberOfImagePages;   // Number of images pages
    333   UINT8                                 Reserved1;            // Reserved
    334   UINT8                                 RedMaskSize;          // Size of direct color red mask
    335   UINT8                                 RedFieldPosition;     // Bit posn of lsb of red mask
    336   UINT8                                 GreenMaskSize;        // Size of direct color green mask
    337   UINT8                                 GreenFieldPosition;   // Bit posn of lsb of green mask
    338   UINT8                                 BlueMaskSize;         // Size of direct color blue mask
    339   UINT8                                 BlueFieldPosition;    // Bit posn of lsb of blue mask
    340   UINT8                                 RsvdMaskSize;         // Size of direct color res mask
    341   UINT8                                 RsvdFieldPosition;    // Bit posn of lsb of res mask
    342   UINT8                                 DirectColorModeInfo;  // Direct color mode attributes
    343   //
    344   // Manadory fields for VESA Bios Extensions 2.0 and above
    345   //
    346   UINT32                                PhysBasePtr;  // Physical Address for flat memory frame buffer
    347   UINT32                                Reserved2;    // Reserved
    348   UINT16                                Reserved3;    // Reserved
    349   //
    350   // Manadory fields for VESA Bios Extensions 3.0 and above
    351   //
    352   UINT16                                LinBytesPerScanLine;    // Bytes/scan line for linear modes
    353   UINT8                                 BnkNumberOfImagePages;  // Number of images for banked modes
    354   UINT8                                 LinNumberOfImagePages;  // Number of images for linear modes
    355   UINT8                                 LinRedMaskSize;         // Size of direct color red mask (linear mode)
    356   UINT8                                 LinRedFieldPosition;    // Bit posiiton of lsb of red mask (linear modes)
    357   UINT8                                 LinGreenMaskSize;       // Size of direct color green mask (linear mode)
    358   UINT8                                 LinGreenFieldPosition;  // Bit posiiton of lsb of green mask (linear modes)
    359   UINT8                                 LinBlueMaskSize;        // Size of direct color blue mask (linear mode)
    360   UINT8                                 LinBlueFieldPosition;   // Bit posiiton of lsb of blue mask (linear modes)
    361   UINT8                                 LinRsvdMaskSize;        // Size of direct color reserved mask (linear mode)
    362   UINT8                                 LinRsvdFieldPosition;   // Bit posiiton of lsb of reserved mask (linear modes)
    363   UINT32                                MaxPixelClock;          // Maximum pixel clock (in Hz) for graphics mode
    364   UINT8                                 Pad[190];               // Pad to 256 byte block size
    365 } VESA_BIOS_EXTENSIONS_MODE_INFORMATION_BLOCK;
    366 
    367 //
    368 // Super VGA Mode Information Block ModeAttributes field bit defintions
    369 //
    370 #define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_HARDWARE  0x0001  // 0: Mode not supported in handware
    371 // 1: Mode supported in handware
    372 //
    373 #define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_TTY 0x0004  // 0: TTY Output functions not supported by BIOS
    374 // 1: TTY Output functions supported by BIOS
    375 //
    376 #define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_COLOR 0x0008  // 0: Monochrome mode
    377 // 1: Color mode
    378 //
    379 #define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_GRAPHICS  0x0010  // 0: Text mode
    380 // 1: Graphics mode
    381 //
    382 #define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_NOT_VGA 0x0020  // 0: VGA compatible mode
    383 // 1: Not a VGA compatible mode
    384 //
    385 #define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_NOT_WINDOWED  0x0040  // 0: VGA compatible windowed memory mode
    386 // 1: Not a VGA compatible windowed memory mode
    387 //
    388 #define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_LINEAR_FRAME_BUFFER 0x0080  // 0: No linear fram buffer mode available
    389 // 1: Linear frame buffer mode available
    390 //
    391 #define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_DOUBLE_SCAN 0x0100  // 0: No double scan mode available
    392 // 1: Double scan mode available
    393 //
    394 #define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_INTERLACED  0x0200  // 0: No interlaced mode is available
    395 // 1: Interlaced mode is available
    396 //
    397 #define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_NO_TRIPPLE_BUFFER 0x0400  // 0: No hardware triple buffer mode support available
    398 // 1: Hardware triple buffer mode support available
    399 //
    400 #define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_STEREOSCOPIC  0x0800  // 0: No hardware steroscopic display support
    401 // 1: Hardware steroscopic display support
    402 //
    403 #define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_DUAL_DISPLAY  0x1000  // 0: No dual display start address support
    404 // 1: Dual display start address support
    405 //
    406 // Super VGA Mode Information Block WinAAttribite/WinBAttributes field bit defintions
    407 //
    408 #define VESA_BIOS_EXTENSIONS_WINX_ATTRIBUTE_RELOCATABLE 0x01  // 0: Single non-relocatable window only
    409 // 1: Relocatable window(s) are supported
    410 //
    411 #define VESA_BIOS_EXTENSIONS_WINX_ATTRIBUTE_READABLE  0x02  // 0: Window is not readable
    412 // 1: Window is readable
    413 //
    414 #define VESA_BIOS_EXTENSIONS_WINX_ATTRIBUTE_WRITABLE  0x04  // 0: Window is not writable
    415 // 1: Window is writable
    416 //
    417 // Super VGA Mode Information Block DirectColorMode field bit defintions
    418 //
    419 #define VESA_BIOS_EXTENSIONS_DIRECT_COLOR_MODE_PROG_COLOR_RAMP  0x01  // 0: Color ram is fixed
    420 // 1: Color ramp is programmable
    421 //
    422 #define VESA_BIOS_EXTENSIONS_DIRECT_COLOR_MODE_RSVD_USABLE  0x02  // 0: Bits in Rsvd field are reserved
    423 // 1: Bits in Rsdv field are usable
    424 //
    425 // Super VGA Memory Models
    426 //
    427 typedef enum {
    428   MemPL = 3,  // Planar memory model
    429   MemPK = 4,  // Packed pixel memory model
    430   MemRGB= 6,  // Direct color RGB memory model
    431   MemYUV= 7   // Direct color YUV memory model
    432 } VESA_BIOS_EXTENSIONS_MEMORY_MODELS;
    433 
    434 //
    435 // Super VGA CRTC Information Block
    436 //
    437 typedef struct {
    438   UINT16  HorizontalTotal;      // Horizontal total in pixels
    439   UINT16  HorizontalSyncStart;  // Horizontal sync start in pixels
    440   UINT16  HorizontalSyncEnd;    // Horizontal sync end in pixels
    441   UINT16  VericalTotal;         // Vertical total in pixels
    442   UINT16  VericalSyncStart;     // Vertical sync start in pixels
    443   UINT16  VericalSyncEnd;       // Vertical sync end in pixels
    444   UINT8   Flags;                // Flags (Interlaced/DoubleScan/etc).
    445   UINT32  PixelClock;           // Pixel clock in units of Hz
    446   UINT16  RefreshRate;          // Refresh rate in units of 0.01 Hz
    447   UINT8   Reserved[40];         // Pad
    448 } VESA_BIOS_EXTENSIONS_CRTC_INFORMATION_BLOCK;
    449 
    450 #define VESA_BIOS_EXTENSIONS_CRTC_FLAGS_DOUBLE_SCAN 0x01  // 0: Graphics mode is not souble scanned
    451 // 1: Graphics mode is double scanned
    452 //
    453 #define VESA_BIOS_EXTENSIONS_CRTC_FLAGSINTERLACED 0x02  // 0: Graphics mode is not interlaced
    454 // 1: Graphics mode is interlaced
    455 //
    456 #define VESA_BIOS_EXTENSIONS_CRTC_HORIZONTAL_SYNC_NEGATIVE  0x04  // 0: Horizontal sync polarity is positive(+)
    457 // 0: Horizontal sync polarity is negative(-)
    458 //
    459 #define VESA_BIOS_EXTENSIONS_CRTC_VERITICAL_SYNC_NEGATIVE 0x08  // 0: Verical sync polarity is positive(+)
    460 // 0: Verical sync polarity is negative(-)
    461 //
    462 // Turn off byte packing of data structures
    463 //
    464 #pragma pack()
    465 
    466 #endif
    467