c7bd6febd2f834aa7eb5b3dc3154e63186402ae9
[rmac] / amode.h
1 ////////////////////////////////////////////////////////////////////////////////////////////////////
2 // RMAC - Reboot's Macro Assembler for the Atari Jaguar Console System
3 // AMODE.H - Addressing Modes
4 // Copyright (C) 199x Landon Dyer, 2011 Reboot and Friends
5 // RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986
6 // Source Utilised with the Kind Permission of Landon Dyer
7
8 #ifndef __AMODE_H__
9 #define __AMODE_H__
10
11 #include "rmac.h"
12
13 // 68000 and 68020 addressing modes
14 #define DREG         000                                    // Dn
15 #define AREG         010                                    // An
16 #define AIND         020                                    // (An)
17 #define APOSTINC     030                                    // (An)+
18 #define APREDEC      040                                    // -(An)
19 #define ADISP        050                                    // (d16,An) d16(An)
20 #define AINDEXED     060                                    // (d8,An,Xn) d8(An,Xn)
21 #define ABSW         070                                    // xxx.W
22 #define ABSL         071                                    // xxx or xxx.L
23 #define PCDISP       072                                    // (d16,PC) d16(PC)
24 #define PCINDEXED    073                                    // (d16,PC,Xn) d16(PC,Xn)
25 #define IMMED        074                                    // #data
26 #define ABASE        0100                                   // (bd,An,Xn)
27 #define MEMPOST      0101                                   // ([bd,An],Xn,od)
28 #define MEMPRE       0102                                   // ([bc,An,Xn],od)
29 #define PCBASE       0103                                   // (bd,PC,Xn)
30 #define PCMPOST      0104                                   // ([bd,PC],Xn,od)
31 #define PCMPRE       0105                                   // ([bc,PC,Xn],od)
32 #define AM_USP       0106
33 #define AM_SR        0107
34 #define AM_CCR       0110
35 #define AM_NONE      0111                                   // Nothing
36
37 // Addressing-mode masks
38 #define M_DREG       0x00000001L                            // Dn
39 #define M_AREG       0x00000002L                            // An
40 #define M_AIND       0x00000004L                            // (An)
41 #define M_APOSTINC   0x00000008L                            // (An)+ 
42 #define M_APREDEC    0x00000010L                            // -(An)
43 #define M_ADISP      0x00000020L                            // (d16,An) d16(An)
44 #define M_AINDEXED   0x00000040L                            // (d8,An,Xn) d8(An,Xn)
45 #define M_ABSW       0x00000080L                            // xxx.W
46 #define M_ABSL       0x00000100L                            // xxx or xxx.L
47 #define M_PCDISP     0x00000200L                            // (d16,PC) d16(PC)
48 #define M_PCINDEXED  0x00000400L                            // (d16,PC,Xn) d16(PC,Xn)
49 #define M_IMMED      0x00000800L                            // #data
50 #define M_ABASE      0x00001000L                            // (bd,An,Xn)
51 #define M_MEMPOST    0x00002000L                            // ([bd,An],Xn,od)
52 #define M_MEMPRE     0x00004000L                            // ([bc,An,Xn],od)
53 #define M_PCBASE     0x00008000L                            // (bd,PC,Xn)
54 #define M_PCMPOST    0x00010000L                            // ([bd,PC],Xn,od)
55 #define M_PCMPRE     0x00020000L                            // ([bc,PC,Xn],od)
56 #define M_AM_USP     0x00040000L                            // USP
57 #define M_AM_SR      0x00080000L                            // SR
58 #define M_AM_CCR     0x00100000L                            // CCR
59 #define M_AM_NONE    0x00200000L                            // (nothing)
60
61 // Addr mode categories
62 #define C_ALL        0x00000fffL
63 #define C_DATA       0x00000ffdL
64 #define C_MEM        0x00000ffcL
65 #define C_CTRL       0x000007e4L
66 #define C_ALT        0x000001ffL
67
68 #define C_ALTDATA    (C_DATA&C_ALT)
69 #define C_ALTMEM     (C_MEM&C_ALT)
70 #define C_ALTCTRL    (C_CTRL&C_ALT)
71 #define C_LABEL      (M_ABSW|M_ABSL)
72 #define C_NONE       M_AM_NONE
73
74 // Scales
75 #define TIMES1       00000                                  // (empty or *1)
76 #define TIMES2       01000                                  // *2
77 #define TIMES4       02000                                  // *4
78 #define TIMES8       03000                                  // *8
79
80 #define EXPRSIZE     128                                    // Maximum #tokens in an expression
81
82 // Addressing mode variables, output of amode()
83 extern int nmodes;
84 extern int am0, am1;
85 extern int a0reg, a1reg;
86 extern TOKEN a0expr[], a1expr[];
87 extern VALUE a0exval, a1exval;
88 extern WORD a0exattr, a1exattr;
89 extern int a0ixreg, a1ixreg;
90 extern int a0ixsiz, a1ixsiz;
91 extern TOKEN a0oexpr[], a1oexpr[];
92 extern VALUE a0oexval, a1oexval;
93 extern WORD a0oexattr, a1oexattr;
94 extern SYM *a0esym, *a1esym;
95
96 // Mnemonic table structure
97 #define MNTAB  struct _mntab
98 MNTAB {
99    WORD mnattr;                                             // Attributes (CGSPECIAL, SIZN, ...)
100    LONG mn0, mn1;                                           // Addressing modes
101    WORD mninst;                                             // Instruction mask
102    WORD mncont;                                             // Continuation (or -1)
103    int (*mnfunc)();                                         // Mnemonic builder
104 };
105
106 // mnattr:
107 #define CGSPECIAL    0x8000                                 // Special (don't parse addr modes)
108
109 // Prototypes
110 int amode(int);
111 int reglist(WORD *);
112
113 #endif // __AMODE_H__