Added handling of new expression opcodes.

git-svn-id: svn://svn.cc65.org/cc65/trunk@5411 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
uz
2012-01-19 11:55:36 +00:00
parent 75b83260c6
commit 772d51aa5e
2 changed files with 14 additions and 5 deletions

View File

@@ -408,6 +408,12 @@ long GetExprVal (ExprNode* Expr)
case EXPR_WORD1: case EXPR_WORD1:
return (GetExprVal (Expr->Left) >> 16) & 0xFFFF; return (GetExprVal (Expr->Left) >> 16) & 0xFFFF;
case EXPR_FARADDR:
return GetExprVal (Expr->Left) & 0xFFFFFF;
case EXPR_DWORD:
return GetExprVal (Expr->Left) & 0xFFFFFFFF;
default: default:
Internal ("Unknown expression Op type: %u", Expr->Op); Internal ("Unknown expression Op type: %u", Expr->Op);

View File

@@ -6,7 +6,7 @@
/* */ /* */
/* */ /* */
/* */ /* */
/* (C) 1999-2011, Ullrich von Bassewitz */ /* (C) 1999-2012, Ullrich von Bassewitz */
/* Roemerstrasse 52 */ /* Roemerstrasse 52 */
/* D-70794 Filderstadt */ /* D-70794 Filderstadt */
/* EMail: uz@cc65.org */ /* EMail: uz@cc65.org */
@@ -629,9 +629,10 @@ static unsigned O65WriteExpr (ExprNode* E, int Signed, unsigned Size,
/* Determine the expression to relocate */ /* Determine the expression to relocate */
Expr = E; Expr = E;
if (E->Op == EXPR_BYTE0 || E->Op == EXPR_BYTE1 || if (E->Op == EXPR_BYTE0 || E->Op == EXPR_BYTE1 ||
E->Op == EXPR_BYTE2 || E->Op == EXPR_BYTE3 || E->Op == EXPR_BYTE2 || E->Op == EXPR_BYTE3 ||
E->Op == EXPR_WORD0 || E->Op == EXPR_WORD1) { E->Op == EXPR_WORD0 || E->Op == EXPR_WORD1 ||
E->Op == EXPR_FARADDR || E->Op == EXPR_DWORD) {
/* Use the real expression */ /* Use the real expression */
Expr = E->Left; Expr = E->Left;
} }
@@ -674,6 +675,8 @@ static unsigned O65WriteExpr (ExprNode* E, int Signed, unsigned Size,
case EXPR_BYTE3: BinVal = (BinVal >> 24) & 0xFF; break; case EXPR_BYTE3: BinVal = (BinVal >> 24) & 0xFF; break;
case EXPR_WORD0: BinVal &= 0xFFFF; break; case EXPR_WORD0: BinVal &= 0xFFFF; break;
case EXPR_WORD1: BinVal = (BinVal >> 16) & 0xFFFF; break; case EXPR_WORD1: BinVal = (BinVal >> 16) & 0xFFFF; break;
case EXPR_FARADDR: BinVal &= 0xFFFFFFUL; break;
case EXPR_DWORD: BinVal &= 0xFFFFFFFFUL; break;
} }
WriteVal (D->F, BinVal, Size); WriteVal (D->F, BinVal, Size);
@@ -846,7 +849,7 @@ static void O65WriteBssSeg (O65Desc* D)
/* Initialize variables */ /* Initialize variables */
D->CurReloc = 0; D->CurReloc = 0;
/* Dump all bss segments */ /* Dump all bss segments */
O65WriteSeg (D, D->BssSeg, D->BssCount, 0); O65WriteSeg (D, D->BssSeg, D->BssCount, 0);
/* Set the size of the segment */ /* Set the size of the segment */