summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
daeae41)
I was able to throw away a bunch of code in m6502cg(); things should be
much clearer vis-a-vis how things are parsed and code flow through that
function. Plus it's always nice to be able to throw away code. :-)
Now at v2.0.9.
void m6502cg(int op)
{
register int amode; // (Parsed) addressing mode
void m6502cg(int op)
{
register int amode; // (Parsed) addressing mode
- register int i;
- uint64_t eval; // Expression value
- WORD eattr; // Expression attributes
- int zpreq; // 1, optimize instr to zero-page form
- register char * p; // (Temp) string usage
+ uint64_t eval = -1; // Expression value
+ WORD eattr = 0; // Expression attributes
+ int zpreq = 0; // 1 = optimize instr to zero-page form
ch_size = 0; // Reset chunk size on every instruction
//
// Parse 6502 addressing mode
//
ch_size = 0; // Reset chunk size on every instruction
//
// Parse 6502 addressing mode
//
switch (tok[0])
{
case EOL:
switch (tok[0])
{
case EOL:
if (tok[1] != EOL)
goto badmode;
if (tok[1] != EOL)
goto badmode;
if (*tok == '>')
{
tok++;
if (*tok == '>')
{
tok++;
-
- if (expr(exprbuf, &eval, &eattr, NULL) < 0)
- return;
-
}
else if (*tok == '<')
{
tok++;
}
else if (*tok == '<')
{
tok++;
-
- if (expr(exprbuf, &eval, &eattr, NULL) < 0)
- return;
-
+ else
+ amode = A65_IMMED;
if (expr(exprbuf, &eval, &eattr, NULL) < 0)
return;
if (expr(exprbuf, &eval, &eattr, NULL) < 0)
return;
-#if 0
- p = string[tok[1]];
-
- // Sleazo tolower() -----------------vvvvvvvvvvv
- if (*tok != SYMBOL || p[1] != EOS || (*p | 0x20) != 'y')
- goto badmode;
-
- tok += 2;
-#else
- if (tok[0] == KW_Y)
- amode = A65_INDY;
}
else
amode = A65_IND;
}
}
else
amode = A65_IND;
}
+ else if ((tok[0] == ',') && (tok[1] == KW_X) && (tok[2] == ')'))
- tok++;
-#if 0
- p = string[tok[1]];
-
- // Sleazo tolower() -----------------vvvvvvvvvvv
- if (*tok != SYMBOL || p[1] != EOS || (*p | 0x20) != 'x')
- goto badmode;
-
- tok += 2;
- if (*tok++ != ')')
- goto badmode;
-
-#else
- if (tok[0] == KW_X)
- amode = A65_INDX;
-
- if ((tok[1] != ')') || (tok[2] != EOL))
- goto badmode;
-
- tok += 2;
-#endif
if (*tok == '(')
{
tok++;
if (*tok == '(')
{
tok++;
-#if 0
- p = string[tok[1]];
-
- if (*tok != SYMBOL || p[1] != EOS || tok[2] != ')' || tok[3] != EOL)
- goto badmode;
-
- i = (*p | 0x20); // Sleazo tolower()
-
- if (i == 'x')
- amode = A65_INDX;
- else if (i == 'y')
- amode = A65_INDY;
- else
- goto badmode;
- tok += 3; // Past SYMBOL <string> ')' EOL
-#else
if ((tok[1] != ')') || (tok[2] != EOL))
goto badmode;
if ((tok[1] != ')') || (tok[2] != EOL))
goto badmode;
zpreq = 1; // Request zeropage optimization
}
else if (*tok == EOL)
zpreq = 1; // Request zeropage optimization
}
else if (*tok == EOL)
- //
- // Short-circuit
- // x,foo
- // y,foo
- //
- p = string[tok[1]];
- // ggn: the following code is effectively disabled as it would make
- // single letter labels not work correctly (would not identify the
- // label properly). And from what I understand it's something to
- // keep compatibility with the coinop assembler which is probably
- // something we don't care about much :D
-#if 0
- if (*tok == SYMBOL && p[1] == EOS && tok[2] == ',')
- {
- tok += 3; // Past: SYMBOL <string> ','
- i = (*p | 0x20);
-
- if (i == 'x')
- amode = A65_ABSX;
- else if (i == 'y')
- amode = A65_ABSY;
- else
- goto not_coinop;
-
- if (expr(exprbuf, &eval, &eattr, NULL) < 0)
- return;
-
- if (*tok != EOL)
- goto badmode;
-
- zpreq = 1;
- break;
- }
-
-not_coinop:
-#endif
+ // <expr>
+ // <expr>,x
+ // <expr>,y
if (expr(exprbuf, &eval, &eattr, NULL) < 0)
return;
if (expr(exprbuf, &eval, &eattr, NULL) < 0)
return;
+ zpreq = 1; // Request zeropage optimization
+ else if (tok[0] == ',')
-#if 0
- p = string[tok[1]];
-
- if (*tok != SYMBOL || p[1] != EOS)
- goto badmode;
-
- tok += 2;
- //
- // Check for X or Y index register;
- // the OR with 0x20 is a sleazo conversion
- // to lower-case that actually works.
- //
- i = *p | 0x20; // Oooh, this is slimey (but fast!)
-
- if (i == 'x')
- amode = A65_ABSX;
- else if (i == 'y')
- amode = A65_ABSY;
- else
- goto badmode;
-#else
}
else if (tok[0] == KW_Y)
{
}
else if (tok[0] == KW_Y)
{
-
- if (tok[0] != EOL)
- goto badmode;
-#endif
// o ZPX or ZPY is illegal, or
// o expr is zeropage && zeropageRequest && expression is defined
//
// o ZPX or ZPY is illegal, or
// o expr is zeropage && zeropageRequest && expression is defined
//
- if (inf[op][amode] == ILLEGAL // If current op is illegal,
- || (eval < 0x100 // or expr must be zero-page
- && zpreq != 0 // amode must request zero-page opt.
- && (eattr & DEFINED))) // and the expression must be defined
+ if ((inf[op][amode] == ILLEGAL) // If current op is illegal OR
+ || (zpreq // amode requested a zero-page optimize
+ && (eval < 0x100) // and expr is zero-page
+ && (eattr & DEFINED))) // and the expression is defined
- i = abs2zp[amode]; // i = zero-page translation of amode
+ int i = abs2zp[amode]; // Get zero-page translation of amode
#ifdef DO_DEBUG
DEBUG printf(" OPT: op=%d amode=%d i=%d inf[op][i]=%d\n",
op, amode, i, inf[op][i]);
#endif
#ifdef DO_DEBUG
DEBUG printf(" OPT: op=%d amode=%d i=%d inf[op][i]=%d\n",
op, amode, i, inf[op][i]);
#endif
- if (i >= 0 && (inf[op][i] & 0xFF) != ILLEGAL) // Use it if it's legal
+ if (i >= 0 && (inf[op][i] & 0xFF) != ILLEGAL) // & use it if it's legal
//
default:
case ILLEGAL:
//
default:
case ILLEGAL:
- for(i=0; i<3; i++)
- D_byte(NOP);
+ D_byte(NOP);
+ D_byte(NOP);
+ D_byte(NOP);
error("illegal 6502 addressing mode");
}
error("illegal 6502 addressing mode");
}
#define MAJOR 2 // Major version number
#define MINOR 0 // Minor version number
#define MAJOR 2 // Major version number
#define MINOR 0 // Minor version number
-#define PATCH 8 // Patch release number
+#define PATCH 9 // Patch release number