1 ////////////////////////////////////////////////////////////////////////////////////////////////////
2 // RMAC - Reboot's Macro Assembler for the Atari Jaguar Console System
3 // PARMODE.C - Addressing Modes Parser Include
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
8 // This file is included (twice) to parse two addressing modes, into slightly different var names
13 if((*tok >= KW_D0) && (*tok <= KW_D7)) {
16 } else if((*tok >= KW_A0) && (*tok <= KW_A7)) {
19 } else if(*tok == '#') {
21 if(expr(AnEXPR, &AnEXVAL, &AnEXATTR, &AnESYM) != OK)
27 // (An,Xn[.siz][*scale])
28 // (PC,Xn[.siz][*scale])
30 // (d8,An,Xn[.siz][*scale])
32 // (d8,PC,Xn[.siz][*scale])
37 else if(*tok == '(') {
39 if((*tok >= KW_A0) && (*tok <= KW_A7)) {
50 goto AMn_IX0; // Handle ",Xn[.siz][*scale])"
51 } else if(*tok == KW_PC) { // (PC,Xn[.siz][*scale])
55 // Common index handler; enter here with `tok' pointing at the comma.
57 AMn_IX0: // Handle indexed with missing expr
60 AnEXATTR = ABS | DEFINED;
62 AMn_IXN: // Handle any indexed (tok -> a comma)
66 if(*tok < KW_D0 || *tok > KW_A7)
68 AnIXREG = *tok++ & 15;
70 switch((int)*tok) { // Index reg size: <empty> | .W | .L
80 case DOTB: // .B not allowed here...
84 if(*tok == '*') { // scale: *1, *2, *4, *8
86 if(*tok++ != CONST || *tok > 8)
106 if(*tok++ != ')') // final ")"
109 } else if(*tok == '[') { // ([...
112 if(expr(AnEXPR, &AnEXVAL, &AnEXATTR, &AnESYM) != OK)
117 if((*tok >= KW_A0) && (*tok <= KW_A7)) {
123 } else if(*tok == ')') {
128 } else if(*tok == KW_PC) {
129 if(*++tok == ',') { // expr(PC,Xn...)
132 } else if(*tok == ')') {
133 AMn = PCDISP; // expr(PC)
139 } else if(*tok=='-' && tok[1]=='(' && ((tok[2]>=KW_A0) && (tok[2]<=KW_A7)) && tok[3]==')') {
143 } else if(*tok == KW_CCR) {
147 } else if(*tok == KW_SR) {
151 } else if(*tok == KW_USP) {
164 if(expr(AnEXPR, &AnEXVAL, &AnEXATTR, &AnESYM) != OK)
167 if(*tok == DOTW) { // expr.W
171 } else if(*tok != '(') { // expr[.L]
173 // Defined, absolute values from $FFFF8000..$00007FFF get optimized to absolute short
174 if((AnEXATTR & (TDB|DEFINED)) == DEFINED && (AnEXVAL + 0x8000) < 0x10000)
177 if(*tok == DOTL) { // force .L
185 if((*tok >= KW_A0) && (*tok <= KW_A7)) {
194 } else if(*tok == KW_PC) {
206 // Addressing mode OK
212 // Cleanup dirty little macros