xref: /reactos/subsystems/mvdm/dos/asmxtras.inc (revision 8540ab04)
1/*
2 * PROJECT:     ReactOS Virtual DOS Machine
3 * LICENSE:     GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE:     Extended ASM macros for GAS and MASM/ML64
5 * COPYRIGHT:   Copyright 2015-2018 Hermes Belusca-Maito
6 *
7 * NOTE: This file is an extension to our well-known asm.inc that defines
8 *       a set of macros allowing us to assemble specially-crafted ASM files
9 *       with both GAS and MASM/ML.
10 *
11 *       The additions introduced here are:
12 *       - a 'long' define for MASM/ML that aliases to DWORD, and a 'dword'
13 *         and 'DWORD' defines for GAS that alias to long.
14 *       - an OFF(...) macro that is used for initializing global symbols with
15 *         the offset value of another symbol.
16 *       - a set of macros for defining and using structures.
17 */
18
19#ifndef __ASMXTRAS_INC__
20#define __ASMXTRAS_INC__
21
22/* 'long' / 'dword'|'DWORD' macros for MASM/ML and GAS */
23#ifdef _USE_ML
24    #define long dword
25#else
26    #define dword long
27    #define DWORD long
28#endif
29
30/* OFFset macro */
31#ifdef _USE_ML
32    #define OFF(x) offset x
33#else
34    #define OFF(x) x
35#endif
36
37/*
38 * Set of macros for defining and using structures:
39 * - STRUCT(name, ...) defines a structure of name 'name'.
40 * - FIELD_DECL(field, type, value) adds a new structure member 'field'
41 *   of type 'type', with the default value 'value'.
42 * - ENDS(name) terminates the definition of the structure 'name'.
43 * - A symbol 'name' of type 'struct' is declared with VAR_STRUCT(name, struct).
44 * - Referencing a member 'field' of a symbol 'name' is done with FIELD(name, field).
45 */
46#ifdef _USE_ML
47
48#define STRUCT(name, ...) \
49    name STRUCT __VA_ARGS__
50
51#define FIELD_DECL(field, type, value) \
52    field   type   value
53
54#define ENDS(name) \
55    name ENDS
56
57#define VAR_STRUCT(name, struct) \
58    name struct <>
59
60#define FIELD(name, field) \
61    name##.##field
62
63#else
64
65#define STRUCT(name, ...) \
66    MACRO(name, VarName)
67
68#define FIELD_DECL(field, type, value) \
69    VarName\()_\()field:   .type   value
70
71#define ENDS(...) ENDM
72
73#define VAR_STRUCT(name, struct) \
74    name: struct name
75
76#define FIELD(name, field) \
77    name##_##field
78
79#endif
80
81#endif /* __ASMXTRAS_INC__ */
82