/*++

Copyright (c) 1997  Microsoft Corporation

Module Name:

    data.c

Abstract:

    This file contains all of the data required by the unassembler

Author:

    Based on code by Mike Tsang (MikeTs)
    Stephane Plante (Splante)

Environment:

    User mode only

Revision History:

--*/

#ifndef _DATA_H
#define _DATA_H

    //
    // Constants
    //

    // String constants
    #define STR_PROGDESC            "ACPI Source Language Assembler"
    #define STR_COPYRIGHT           "Copyright (c) 1996,1997 Microsoft Corporation"
    #define STR_MS                  "MSFT"

    // Misc. constants
    #define NAMESEG_BLANK           0x5f5f5f5f      // "____"
    #define NAMESEG_ROOT            0x5f5f5f5c      // "\___"
    #define NAMESEG                 ULONG
    #define SUPERNAME               NAMESEG
    #define NSF_LOCAL_SCOPE         0x00000001


    // Implementation constants
    #define MAX_STRING_LEN          199
    #define MAX_NAMECODE_LEN        1300    //approx. 255*4 + 2 + 255
    #define MAX_MSG_LEN             127
    #define MAX_ARGS                7
    #define MAX_PACKAGE_LEN         0x0fffffff

    // Term classes
    #define UTC_PNP_MACRO           0x00100000
    #define UTC_REF_OBJECT          0x00200000
    #define UTC_FIELD_MACRO         0x00400000
    #define UTC_DATA_OBJECT         0x00800000
    #define UTC_NAMED_OBJECT        0x01000000
    #define UTC_NAMESPACE_MODIFIER  0x02000000
    #define UTC_OPCODE_TYPE1        0x04000000
    #define UTC_OPCODE_TYPE2        0x08000000
    #define UTC_CONST_NAME          0x10000000
    #define UTC_SHORT_NAME          0x20000000
    #define UTC_COMPILER_DIRECTIVE  0x40000000
    #define UTC_KEYWORD             0x80000000
    #define UTC_OPCODE              (UTC_OPCODE_TYPE1 | UTC_OPCODE_TYPE2 | \
                                     UTC_SHORT_NAME | UTC_CONST_NAME | \
                                     UTC_DATA_OBJECT)
    #define UTC_OPCODE_TERM         (UTC_CONST_NAME | UTC_SHORT_NAME | \
                                     UTC_DATA_OBJECT | UTC_NAMED_OBJECT | \
                                     UTC_OPCODE_TYPE1 | UTC_OPCODE_TYPE2 | \
                                     UTC_NAMESPACE_MODIFIER)

    // Term flags
    #define TF_ACTION_FLIST         0x00000001
    #define TF_ACTION_VLIST         0x00000002
    #define TF_PACKAGE_LEN          0x00000004
    #define TF_CHANGE_CHILDSCOPE    0x00000008
    #define TF_DELAY_UNASM          0x00000010
    #define TF_FIELD_MACRO          UTC_FIELD_MACRO
    #define TF_DATA_OBJECT          UTC_DATA_OBJECT
    #define TF_NAMED_OBJECT         UTC_NAMED_OBJECT
    #define TF_NAMESPACE_MODIFIER   UTC_NAMESPACE_MODIFIER
    #define TF_OPCODE_TYPE1         UTC_OPCODE_TYPE1
    #define TF_OPCODE_TYPE2         UTC_OPCODE_TYPE2
    #define TF_CONST_NAME           UTC_CONST_NAME
    #define TF_SHORT_NAME           UTC_SHORT_NAME
    #define TF_COMPILER_DIRECTIVE   UTC_COMPILER_DIRECTIVE
    #define TF_KEYWORD              UTC_KEYWORD
    #define TF_PNP_MACRO            UTC_PNP_MACRO
    #define TF_OBJECT_LIST          (UTC_NAMED_OBJECT | UTC_NAMESPACE_MODIFIER)
    #define TF_CODE_LIST            (UTC_OPCODE_TYPE1 | UTC_OPCODE_TYPE2)
    #define TF_DATA_LIST            0x00010000
    #define TF_FIELD_LIST           0x00020000
    #define TF_BYTE_LIST            0x00040000
    #define TF_DWORD_LIST           0x00080000
    #define TF_PACKAGE_LIST         (UTC_DATA_OBJECT | UTC_SHORT_NAME | \
                                     UTC_CONST_NAME)
    #define TF_ALL_LISTS            (TF_DATA_OBJECT | TF_NAMED_OBJECT | \
                                     TF_NAMESPACE_MODIFIER | TF_OPCODE_TYPE1 | \
                                     TF_OPCODE_TYPE2 | TF_SHORT_NAME | \
                                     TF_CONST_NAME | TF_COMPILER_DIRECTIVE | \
                                     TF_DATA_LIST | TF_PACKAGE_LIST | \
                                     TF_FIELD_LIST | TF_PNP_MACRO | TF_BYTE_LIST |\
                                     TF_DWORD_LIST)

    // Code flags
    #define CF_MISSING_ARG          0x00000001
    #define CF_PARSING_FIXEDLIST    0x00000002
    #define CF_PARSING_VARLIST      0x00000004

    // NS flags
    #define NSF_EXIST_OK            0x00010000
    #define NSF_EXIST_ERR           0x00020000

    // Data types
    #define CODETYPE_UNKNOWN        0
    #define CODETYPE_ASLTERM        1
    #define CODETYPE_NAME           2
    #define CODETYPE_DATAOBJ        3
    #define CODETYPE_FIELDOBJ       4
    #define CODETYPE_INTEGER        5
    #define CODETYPE_STRING         6
    #define CODETYPE_KEYWORD        7
    #define CODETYPE_USERTERM       8
    #define CODETYPE_QWORD          9

    // NameSpace object types
    #define NSTYPE_UNKNOWN          'U'
    #define NSTYPE_SCOPE            'S'
    #define NSTYPE_FIELDUNIT        'F'
    #define NSTYPE_DEVICE           'D'
    #define NSTYPE_EVENT            'E'
    #define NSTYPE_METHOD           'M'
    #define NSTYPE_MUTEX            'X'
    #define NSTYPE_OPREGION         'O'
    #define NSTYPE_POWERRES         'P'
    #define NSTYPE_PROCESSOR        'C'
    #define NSTYPE_THERMALZONE      'T'
    #define NSTYPE_OBJALIAS         'A'
    #define NSTYPE_BUFFFIELD        'B'

    #define OBJTYPE_PRIVATE         0xf0
    #define OBJTYPE_PNP_RES         (OBJTYPE_PRIVATE + 0x00)
    #define OBJTYPE_RES_FIELD       (OBJTYPE_PRIVATE + 0x01)

    // Opcode classes
    #define OPCLASS_INVALID         0
    #define OPCLASS_DATA_OBJ        1
    #define OPCLASS_NAME_OBJ        2
    #define OPCLASS_CONST_OBJ       3
    #define OPCLASS_CODE_OBJ        4
    #define OPCLASS_ARG_OBJ         5
    #define OPCLASS_LOCAL_OBJ       6

    //dwfData flags
    #define DATAF_BUFF_ALIAS        0x00000001
    #define DATAF_GLOBAL_LOCK       0x00000002

    //dwDataType values
    #define OBJTYPE_UNKNOWN         0x00
    #define OBJTYPE_INTDATA         0x01
    #define OBJTYPE_STRDATA         0x02
    #define OBJTYPE_BUFFDATA        0x03
    #define OBJTYPE_PKGDATA         0x04
    #define OBJTYPE_FIELDUNIT       0x05
    #define OBJTYPE_DEVICE          0x06
    #define OBJTYPE_EVENT           0x07
    #define OBJTYPE_METHOD          0x08
    #define OBJTYPE_MUTEX           0x09
    #define OBJTYPE_OPREGION        0x0a
    #define OBJTYPE_POWERRES        0x0b
    #define OBJTYPE_PROCESSOR       0x0c
    #define OBJTYPE_THERMALZONE     0x0d
    #define OBJTYPE_BUFFFIELD       0x0e
    #define OBJTYPE_DDBHANDLE       0x0f

    //These are internal object types (not to be exported to the ASL code)
    #define OBJTYPE_INTERNAL        0x80

    //Predefined data values (dwDataValue)
    #define DATAVALUE_ZERO          0
    #define DATAVALUE_ONE           1
    #define DATAVALUE_ONES          0xffffffff

    //
    // Macros
    //
    #define MEMALLOC(n)           malloc(n)
    #define MEMFREE(p)            free(p)

    //
    // Type definitions
    //
    typedef int (LOCAL *PFNTERM)(PUCHAR, BOOL);

    typedef struct _aslterm
    {
        PUCHAR  ID;
        ULONG   TermClass;
        ULONG   TermData;
        ULONG   OpCode;
        PUCHAR  UnAsmArgTypes;
        PUCHAR  ArgActions;
        ULONG   Flags;
    } ASLTERM, *PASLTERM;

    typedef struct _opmap
    {
        UCHAR   ExtendedOpCode;
        UCHAR   OpCodeClass;
    } OPMAP, *POPMAP;

    extern ASLTERM  TermTable[];
    extern UCHAR    OpClassTable[];
    extern OPMAP    ExOpClassTable[];

#endif  //ifndef _DATA_H