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
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)
35 #define AM_NONE 0111 // Nothing
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)
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
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
75 #define TIMES1 00000 // (empty or *1)
76 #define TIMES2 01000 // *2
77 #define TIMES4 02000 // *4
78 #define TIMES8 03000 // *8
80 #define EXPRSIZE 128 // Maximum #tokens in an expression
82 // Addressing mode variables, output of amode()
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;
96 // Mnemonic table structure
97 #define MNTAB struct _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
107 #define CGSPECIAL 0x8000 // Special (don't parse addr modes)
113 #endif // __AMODE_H__