[CONSRV]
[reactos.git] / include / asm / asm.inc
index 4274221..97c4f89 100644 (file)
 /* Allow ".name" identifiers */\r
 OPTION DOTNAME\r
 \r
+#ifdef _M_IX86\r
 .686P\r
 .XMM\r
 .MODEL FLAT\r
 ASSUME CS:NOTHING, DS:NOTHING, ES:NOTHING, FS:NOTHING, GS:NOTHING\r
+#endif\r
 \r
 /* Hex numbers need to be in 01ABh format */\r
 #define HEX(x) 0##x##h\r
@@ -30,30 +32,42 @@ rip = 0
 \r
 /* To avoid reverse syntax we provide a new macro .PROC, replacing PROC... */\r
 .PROC MACRO name\r
-    name PROC FRAME\r
-    _name:\r
+__current_function_name EQU %name\r
+#ifdef _M_IX86\r
+    %name PROC\r
+#else\r
+    %name PROC FRAME\r
+#endif\r
 ENDM\r
+#define FUNC .PROC\r
 \r
 /* ... and .ENDP, replacing ENDP */\r
-.ENDP MACRO name\r
-    name ENDP\r
+.ENDP MACRO\r
+    %__current_function_name ENDP\r
+ENDM\r
+#define ENDFUNC .ENDP\r
+\r
+/* check http://msdn.microsoft.com/en-us/library/9c9k076y%28VS.80%29.aspx\r
+   and http://msdn.microsoft.com/en-us/library/ms679352%28VS.85%29.aspx */\r
+FPO MACRO cdwLocals, cdwParams, cbProlog, cbRegs, fUseBP, cbFrame\r
+    .FPO (cdwLocals, cdwParams, cbProlog, cbRegs, fUseBP, cbFrame)\r
 ENDM\r
 \r
 /* MASM doesn't have an ASCII macro */\r
-.ASCII MACRO text\r
+.ASCII MACRO text:VARARG\r
+    DB text\r
+ENDM\r
+.ascii MACRO text:VARARG\r
     DB text\r
 ENDM\r
 \r
 /* MASM doesn't have an ASCIZ macro */\r
-.ASCIZ MACRO text\r
-    DB text, 0\r
+.ASCIZ MACRO text:VARARG\r
+    DB text\r
+    DB 0\r
 ENDM\r
-\r
-#define lgdt lgdt fword ptr ds:\r
-\r
-#define lidt lidt fword ptr ds:\r
-\r
-ljmp MACRO segment, offset\r
+.asciz MACRO text:VARARG\r
+    DB text\r
     DB 0\r
 ENDM\r
 \r
@@ -69,6 +83,7 @@ ENDM
 .code16 MACRO\r
     ASSUME nothing\r
     .text SEGMENT use16\r
+    .586P\r
 ENDM\r
 \r
 .endcode16 MACRO\r
@@ -111,20 +126,59 @@ ENDM
     ORG value\r
 ENDM\r
 \r
-.fill MACRO repeat, size, value\r
-// FIXME\r
+.fill MACRO count, size, value\r
+    REPEAT count\r
+        if (size EQ 1)\r
+            DB value\r
+        elseif (size EQ 2)\r
+            DW value\r
+        elseif (size EQ 4)\r
+            DD value\r
+        endif\r
+    ENDM\r
+ENDM\r
+\r
+.space MACRO count\r
+    DB 0 DUP (count)\r
 ENDM\r
 \r
 ljmp MACRO segment, offset\r
-// FIXME\r
+    DB 0EAh\r
+    DD offset\r
+    DW segment\r
+ENDM\r
+\r
+ljmp16 MACRO segment, offset\r
+    DB 0EAh\r
+    DW offset\r
+    DW segment\r
+ENDM\r
+\r
+data32 MACRO opcode:VARARG\r
+    DB 66h\r
+    opcode\r
 ENDM\r
 \r
 UNIMPLEMENTED MACRO name\r
 ENDM\r
 \r
+absolute MACRO address\r
+    __absolute__address__ = address\r
+ENDM\r
+\r
+resb MACRO name, size\r
+    name = __absolute__address__\r
+    __absolute__address__ = __absolute__address__ + size\r
+ENDM\r
+\r
+\r
 /* We need this to distinguish repeat from macros */\r
 #define ENDR ENDM\r
 \r
+#define CR 13\r
+#define LF 10\r
+#define NUL 0\r
+\r
 #else /***********************************************************************/\r
 \r
 /* Force intel syntax */\r
@@ -145,16 +199,22 @@ ENDM
 /* To avoid reverse syntax we provide a new macro .PROC, replacing PROC... */\r
 .macro .PROC name\r
     .func \name\r
+#ifdef _X86_\r
+    /* x86 gas expects a label with _ prefix */\r
+    _\name:\r
+#endif\r
     \name:\r
     .cfi_startproc\r
     .equ cfa_current_offset, -8\r
 .endm\r
+#define FUNC .PROC\r
 \r
 /* ... and .ENDP, replacing ENDP */\r
-.macro .ENDP name\r
+.macro .ENDP\r
     .cfi_endproc\r
     .endfunc\r
 .endm\r
+#define ENDFUNC .ENDP\r
 \r
 /* MASM compatible PUBLIC */\r
 .macro PUBLIC symbol\r
@@ -180,6 +240,10 @@ ENDM
     jmp far ptr \segment:\offset\r
 .endm\r
 \r
+.macro ljmp16 segment, offset\r
+    jmp far ptr \segment:\offset\r
+.endm\r
+\r
 /* MASM compatible EXTERN */\r
 .macro EXTERN name\r
 .endm\r
@@ -194,6 +258,12 @@ ENDM
     .text\r
 .endm\r
 \r
+/* check http://msdn.microsoft.com/en-us/library/9c9k076y%28VS.80%29.aspx\r
+   and http://msdn.microsoft.com/en-us/library/ms679352%28VS.85%29.aspx */\r
+.macro FPO cdwLocals, cdwParams, cbProlog, cbRegs, fUseBP, cbFrame\r
+    /* dummy */\r
+.endm\r
+\r
 /* Macros for x64 stack unwind OPs */\r
 \r
 .macro .allocstack size\r
@@ -236,6 +306,15 @@ code = 1
 .macro .endprolog\r
 .endm\r
 \r
+.macro absolute address\r
+    __absolute__address__ = \address\r
+ENDM\r
+\r
+.macro resb name, size\r
+    \name = __absolute__address__\r
+    __absolute__address__ = __absolute__address__ + \size\r
+ENDM\r
+\r
 .macro UNIMPLEMENTED2 file, line, func\r
 \r
     jmp 3f\r
@@ -259,4 +338,15 @@ code = 1
 #define else .else\r
 #define elseif .elseif\r
 \r
+#define CR "\r"\r
+#define LF "\n"\r
+#define NUL "\0"\r
+\r
 #endif\r
+\r
+/* Common definitions for FPO macro\r
+   see http://msdn.microsoft.com/en-us/library/ms679352%28VS.85%29.aspx */\r
+#define FRAME_FPO 0\r
+#define FRAME_TRAP 1\r
+#define FRAME_TSS 2\r
+#define FRAME_NONFPO 3\r