1 ////////////////////////////////////////////////////////////////////////////////////////////////////
2 // RMAC - Reboot's Macro Assembler for the Atari Jaguar Console System
3 // AMODE.C - 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
19 // Address-mode information
20 int nmodes; // Number of addr'ing modes found
21 int am0; // Addressing mode
22 int a0reg; // Register
23 TOKEN a0expr[EXPRSIZE]; // Expression
24 VALUE a0exval; // Expression's value
25 WORD a0exattr; // Expression's attribute
26 int a0ixreg; // Index register
27 int a0ixsiz; // Index register size (and scale)
28 TOKEN a0oexpr[EXPRSIZE]; // Outer displacement expression
29 VALUE a0oexval; // Outer displacement value
30 WORD a0oexattr; // Outer displacement attribute
31 SYM *a0esym; // External symbol involved in expr
33 int am1; // Addressing mode
34 int a1reg; // Register
35 TOKEN a1expr[EXPRSIZE]; // Expression
36 VALUE a1exval; // Expression's value
37 WORD a1exattr; // Expression's attribute
38 int a1ixreg; // Index register
39 int a1ixsiz; // Index register size (and scale)
40 TOKEN a1oexpr[EXPRSIZE]; // Outer displacement expression
41 VALUE a1oexval; // Outer displacement value
42 WORD a1oexattr; // Outer displacement attribute
43 SYM *a1esym; // External symbol involved in expr
46 // --- Parse Addressing Mode -----------------------------------------------------------------------
49 int amode(int acount) {
50 // Initialize global return values
51 nmodes = a0reg = a1reg = 0;
53 a0expr[0] = a0oexpr[0] = a1expr[0] = a1oexpr[0] = ENDEXPR;
54 a0exattr = a0oexattr = a1exattr = a1oexattr = 0;
55 a0esym = a1esym = (SYM *)NULL;
57 // If at EOL, then no addr modes at all
61 // Parse first addressing mode
65 #define AnIXREG a0ixreg
66 #define AnIXSIZ a0ixsiz
68 #define AnEXVAL a0exval
69 #define AnEXATTR a0exattr
70 #define AnOEXPR a0oexpr
71 #define AnOEXVAL a0oexval
72 #define AnOEXATTR a0oexattr
74 #define AMn_IX0 am0_ix0
75 #define AMn_IXN am0_ixn
78 // If caller wants only one mode, return just one (ignore comma);
79 // If there is no second addressing mode (no comma), then return just one anyway.
81 if(acount == 0 || *tok != ',')
85 // Parse second addressing mode
89 #define AnIXREG a1ixreg
90 #define AnIXSIZ a1ixsiz
92 #define AnEXVAL a1exval
93 #define AnEXATTR a1exattr
94 #define AnOEXPR a1oexpr
95 #define AnOEXVAL a1oexval
96 #define AnOEXATTR a1oexattr
98 #define AMn_IX0 am1_ix0
99 #define AMn_IXN am1_ixn
108 return(error("addressing mode syntax"));
112 return(error("unimplemented addressing mode"));
116 // --- Parse Register List -------------------------------------------------------------------------
119 int reglist(WORD *a_rmask) {
120 static WORD msktab[] = {
121 0x0001, 0x0002, 0x0004, 0x0008,
122 0x0010, 0x0020, 0x0040, 0x0080,
123 0x0100, 0x0200, 0x0400, 0x0800,
124 0x1000, 0x2000, 0x4000, 0x8000
131 if(*tok >= KW_D0 && *tok <= KW_A7)
137 if(*tok >= KW_D0 && *tok <= KW_A7)
140 return(error("register list syntax"));
143 return(error("register list order"));
149 rmask |= msktab[r++];