X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcc65%2Fcodeent.c;h=3868a353103f7e0b14d80dac9f66ba7441019a1f;hb=3f4096d3030095605f28b4cfa73563c53a563df6;hp=259cea5a5d5b1e9fe1ad9bad387da080e2a048f3;hpb=70755921a959d71bbf94f4fc0425cdb3ba26d71c;p=cc65 diff --git a/src/cc65/codeent.c b/src/cc65/codeent.c index 259cea5a5..3868a3531 100644 --- a/src/cc65/codeent.c +++ b/src/cc65/codeent.c @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 2001-2002 Ullrich von Bassewitz */ -/* Wacholderweg 14 */ -/* D-70597 Stuttgart */ -/* EMail: uz@musoftware.de */ +/* (C) 2001-2003 Ullrich von Bassewitz */ +/* Römerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -39,6 +39,7 @@ /* common */ #include "chartype.h" #include "check.h" +#include "debugflag.h" #include "xmalloc.h" #include "xsprintf.h" @@ -243,10 +244,10 @@ CodeEntry* NewCodeEntry (opc_t OPC, am_t AM, const char* Arg, /* Initialize the fields */ E->OPC = D->OPC; E->AM = AM; + E->Size = GetInsnSize (E->OPC, E->AM); E->Arg = GetArgCopy (Arg); - E->Flags = NumArg (E->Arg, &E->Num)? CEF_NUMARG : 0; + E->Flags = NumArg (E->Arg, &E->Num)? CEF_NUMARG : 0; /* Needs E->Arg */ E->Info = D->Info; - E->Size = GetInsnSize (E->OPC, E->AM); E->JumpTo = JumpTo; E->LI = UseLineInfo (LI); E->RI = 0; @@ -469,10 +470,16 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) if (CE_KnownImm (E)) { Out->RegA = In->RegA & (short) E->Num; } else if (E->AM == AM65_ZP) { - switch (GetKnownReg (E->Use, In)) { + switch (GetKnownReg (E->Use & REG_ZP, In)) { case REG_TMP1: Out->RegA = In->RegA & In->Tmp1; break; + case REG_PTR1_LO: + Out->RegA = In->RegA & In->Ptr1Lo; + break; + case REG_PTR1_HI: + Out->RegA = In->RegA & In->Ptr1Hi; + break; case REG_SREG_LO: Out->RegA = In->RegA & In->SRegLo; break; @@ -481,7 +488,7 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) break; default: Out->RegA = UNKNOWN_REGVAL; - break; + break; } } else { Out->RegA = UNKNOWN_REGVAL; @@ -490,13 +497,19 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) break; case OP65_ASL: - if (E->AM == AM65_ACC && In->RegA >= 0) { + if (E->AM == AM65_ACC && RegValIsKnown (In->RegA)) { Out->RegA = (In->RegA << 1) & 0xFF; } else if (E->AM == AM65_ZP) { - switch (GetKnownReg (E->Chg, In)) { + switch (GetKnownReg (E->Chg & REG_ZP, In)) { case REG_TMP1: Out->Tmp1 = (In->Tmp1 << 1) & 0xFF; break; + case REG_PTR1_LO: + Out->Ptr1Lo = (In->Ptr1Lo << 1) & 0xFF; + break; + case REG_PTR1_HI: + Out->Ptr1Hi = (In->Ptr1Hi << 1) & 0xFF; + break; case REG_SREG_LO: Out->SRegLo = (In->SRegLo << 1) & 0xFF; break; @@ -571,13 +584,19 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) break; case OP65_DEC: - if (E->AM == AM65_ACC && In->RegA >= 0) { + if (E->AM == AM65_ACC && RegValIsKnown (In->RegA)) { Out->RegA = (In->RegA - 1) & 0xFF; } else if (E->AM == AM65_ZP) { - switch (GetKnownReg (E->Chg, In)) { + switch (GetKnownReg (E->Chg & REG_ZP, In)) { case REG_TMP1: Out->Tmp1 = (In->Tmp1 - 1) & 0xFF; break; + case REG_PTR1_LO: + Out->Ptr1Lo = (In->Ptr1Lo - 1) & 0xFF; + break; + case REG_PTR1_HI: + Out->Ptr1Hi = (In->Ptr1Hi - 1) & 0xFF; + break; case REG_SREG_LO: Out->SRegLo = (In->SRegLo - 1) & 0xFF; break; @@ -608,10 +627,16 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) if (CE_KnownImm (E)) { Out->RegA = In->RegA ^ (short) E->Num; } else if (E->AM == AM65_ZP) { - switch (GetKnownReg (E->Use, In)) { + switch (GetKnownReg (E->Use & REG_ZP, In)) { case REG_TMP1: Out->RegA = In->RegA ^ In->Tmp1; break; + case REG_PTR1_LO: + Out->RegA = In->RegA ^ In->Ptr1Lo; + break; + case REG_PTR1_HI: + Out->RegA = In->RegA ^ In->Ptr1Hi; + break; case REG_SREG_LO: Out->RegA = In->RegA ^ In->SRegLo; break; @@ -635,13 +660,19 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) break; case OP65_INC: - if (E->AM == AM65_ACC && In->RegA >= 0) { + if (E->AM == AM65_ACC && RegValIsKnown (In->RegA)) { Out->RegA = (In->RegA + 1) & 0xFF; } else if (E->AM == AM65_ZP) { - switch (GetKnownReg (E->Chg, In)) { + switch (GetKnownReg (E->Chg & REG_ZP, In)) { case REG_TMP1: Out->Tmp1 = (In->Tmp1 + 1) & 0xFF; break; + case REG_PTR1_LO: + Out->Ptr1Lo = (In->Ptr1Lo + 1) & 0xFF; + break; + case REG_PTR1_HI: + Out->Ptr1Hi = (In->Ptr1Hi + 1) & 0xFF; + break; case REG_SREG_LO: Out->SRegLo = (In->SRegLo + 1) & 0xFF; break; @@ -703,6 +734,12 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) if (Chg & REG_TMP1) { Out->Tmp1 = UNKNOWN_REGVAL; } + if (Chg & REG_PTR1_LO) { + Out->Ptr1Lo = UNKNOWN_REGVAL; + } + if (Chg & REG_PTR1_HI) { + Out->Ptr1Hi = UNKNOWN_REGVAL; + } if (Chg & REG_SREG_LO) { Out->SRegLo = UNKNOWN_REGVAL; } @@ -739,10 +776,16 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) if (CE_KnownImm (E)) { Out->RegA = (unsigned char) E->Num; } else if (E->AM == AM65_ZP) { - switch (GetKnownReg (E->Use, In)) { + switch (GetKnownReg (E->Use & REG_ZP, In)) { case REG_TMP1: Out->RegA = In->Tmp1; break; + case REG_PTR1_LO: + Out->RegA = In->Ptr1Lo; + break; + case REG_PTR1_HI: + Out->RegA = In->Ptr1Hi; + break; case REG_SREG_LO: Out->RegA = In->SRegLo; break; @@ -763,10 +806,16 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) if (CE_KnownImm (E)) { Out->RegX = (unsigned char) E->Num; } else if (E->AM == AM65_ZP) { - switch (GetKnownReg (E->Use, In)) { + switch (GetKnownReg (E->Use & REG_ZP, In)) { case REG_TMP1: Out->RegX = In->Tmp1; break; + case REG_PTR1_LO: + Out->RegX = In->Ptr1Lo; + break; + case REG_PTR1_HI: + Out->RegX = In->Ptr1Hi; + break; case REG_SREG_LO: Out->RegX = In->SRegLo; break; @@ -787,10 +836,16 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) if (CE_KnownImm (E)) { Out->RegY = (unsigned char) E->Num; } else if (E->AM == AM65_ZP) { - switch (GetKnownReg (E->Use, In)) { + switch (GetKnownReg (E->Use & REG_ZP, In)) { case REG_TMP1: Out->RegY = In->Tmp1; break; + case REG_PTR1_LO: + Out->RegY = In->Ptr1Lo; + break; + case REG_PTR1_HI: + Out->RegY = In->Ptr1Hi; + break; case REG_SREG_LO: Out->RegY = In->SRegLo; break; @@ -808,13 +863,19 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) break; case OP65_LSR: - if (E->AM == AM65_ACC && In->RegA >= 0) { + if (E->AM == AM65_ACC && RegValIsKnown (In->RegA)) { Out->RegA = (In->RegA >> 1) & 0xFF; } else if (E->AM == AM65_ZP) { - switch (GetKnownReg (E->Chg, In)) { + switch (GetKnownReg (E->Chg & REG_ZP, In)) { case REG_TMP1: Out->Tmp1 = (In->Tmp1 >> 1) & 0xFF; break; + case REG_PTR1_LO: + Out->Ptr1Lo = (In->Ptr1Lo >> 1) & 0xFF; + break; + case REG_PTR1_HI: + Out->Ptr1Hi = (In->Ptr1Hi >> 1) & 0xFF; + break; case REG_SREG_LO: Out->SRegLo = (In->SRegLo >> 1) & 0xFF; break; @@ -833,27 +894,33 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) case OP65_ORA: if (RegValIsKnown (In->RegA)) { - if (CE_KnownImm (E)) { - Out->RegA = In->RegA | (short) E->Num; - } else if (E->AM == AM65_ZP) { - switch (GetKnownReg (E->Use, In)) { - case REG_TMP1: - Out->RegA = In->RegA | In->Tmp1; - break; - case REG_SREG_LO: - Out->RegA = In->RegA | In->SRegLo; - break; - case REG_SREG_HI: - Out->RegA = In->RegA | In->SRegHi; - break; - default: - Out->RegA = UNKNOWN_REGVAL; - break; - } - } else { - /* A is now unknown */ - Out->RegA = UNKNOWN_REGVAL; - } + if (CE_KnownImm (E)) { + Out->RegA = In->RegA | (short) E->Num; + } else if (E->AM == AM65_ZP) { + switch (GetKnownReg (E->Use & REG_ZP, In)) { + case REG_TMP1: + Out->RegA = In->RegA | In->Tmp1; + break; + case REG_PTR1_LO: + Out->RegA = In->RegA | In->Ptr1Lo; + break; + case REG_PTR1_HI: + Out->RegA = In->RegA | In->Ptr1Hi; + break; + case REG_SREG_LO: + Out->RegA = In->RegA | In->SRegLo; + break; + case REG_SREG_HI: + Out->RegA = In->RegA | In->SRegHi; + break; + default: + Out->RegA = UNKNOWN_REGVAL; + break; + } + } else { + /* A is now unknown */ + Out->RegA = UNKNOWN_REGVAL; + } } break; @@ -870,18 +937,18 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) break; case OP65_PLA: - Out->RegA = -1; + Out->RegA = UNKNOWN_REGVAL; break; case OP65_PLP: break; case OP65_PLX: - Out->RegX = -1; + Out->RegX = UNKNOWN_REGVAL; break; case OP65_PLY: - Out->RegY = -1; + Out->RegY = UNKNOWN_REGVAL; break; case OP65_ROL: @@ -889,9 +956,15 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) if (E->AM == AM65_ACC) { Out->RegA = UNKNOWN_REGVAL; } else if (E->AM == AM65_ZP) { - switch (GetKnownReg (E->Chg, In)) { + switch (GetKnownReg (E->Chg & REG_ZP, In)) { case REG_TMP1: - Out->Tmp1 = UNKNOWN_REGVAL; + Out->Tmp1 = UNKNOWN_REGVAL; + break; + case REG_PTR1_LO: + Out->Ptr1Lo = UNKNOWN_REGVAL; + break; + case REG_PTR1_HI: + Out->Ptr1Hi = UNKNOWN_REGVAL; break; case REG_SREG_LO: Out->SRegLo = UNKNOWN_REGVAL; @@ -911,10 +984,16 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) if (E->AM == AM65_ACC) { Out->RegA = UNKNOWN_REGVAL; } else if (E->AM == AM65_ZP) { - switch (GetKnownReg (E->Chg, In)) { + switch (GetKnownReg (E->Chg & REG_ZP, In)) { case REG_TMP1: Out->Tmp1 = UNKNOWN_REGVAL; break; + case REG_PTR1_LO: + Out->Ptr1Lo = UNKNOWN_REGVAL; + break; + case REG_PTR1_HI: + Out->Ptr1Hi = UNKNOWN_REGVAL; + break; case REG_SREG_LO: Out->SRegLo = UNKNOWN_REGVAL; break; @@ -936,7 +1015,7 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) case OP65_SBC: /* We don't know the value of the carry bit */ - Out->RegA = -1; + Out->RegA = UNKNOWN_REGVAL; break; case OP65_SEC: @@ -950,16 +1029,22 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) case OP65_STA: if (E->AM == AM65_ZP) { - switch (GetKnownReg (E->Chg, 0)) { + switch (GetKnownReg (E->Chg & REG_ZP, 0)) { case REG_TMP1: Out->Tmp1 = In->RegA; break; + case REG_PTR1_LO: + Out->Ptr1Lo = In->RegA; + break; + case REG_PTR1_HI: + Out->Ptr1Hi = In->RegA; + break; case REG_SREG_LO: Out->SRegLo = In->RegA; break; case REG_SREG_HI: Out->SRegHi = In->RegA; - break; + break; } } else if (E->AM == AM65_ZPX) { /* Invalidates all ZP registers */ @@ -969,10 +1054,16 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) case OP65_STX: if (E->AM == AM65_ZP) { - switch (GetKnownReg (E->Chg, 0)) { + switch (GetKnownReg (E->Chg & REG_ZP, 0)) { case REG_TMP1: Out->Tmp1 = In->RegX; break; + case REG_PTR1_LO: + Out->Ptr1Lo = In->RegX; + break; + case REG_PTR1_HI: + Out->Ptr1Hi = In->RegX; + break; case REG_SREG_LO: Out->SRegLo = In->RegX; break; @@ -988,10 +1079,16 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) case OP65_STY: if (E->AM == AM65_ZP) { - switch (GetKnownReg (E->Chg, 0)) { + switch (GetKnownReg (E->Chg & REG_ZP, 0)) { case REG_TMP1: Out->Tmp1 = In->RegY; break; + case REG_PTR1_LO: + Out->Ptr1Lo = In->RegY; + break; + case REG_PTR1_HI: + Out->Ptr1Hi = In->RegY; + break; case REG_SREG_LO: Out->SRegLo = In->RegY; break; @@ -1007,9 +1104,15 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) case OP65_STZ: if (E->AM == AM65_ZP) { - switch (GetKnownReg (E->Chg, 0)) { + switch (GetKnownReg (E->Chg & REG_ZP, 0)) { case REG_TMP1: - Out->Tmp1 = 0; + Out->Tmp1 = 0; + break; + case REG_PTR1_LO: + Out->Ptr1Lo = 0; + break; + case REG_PTR1_HI: + Out->Ptr1Hi = 0; break; case REG_SREG_LO: Out->SRegLo = 0; @@ -1037,11 +1140,17 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) /* Invalidates all ZP registers */ RC_InvalidateZP (Out); } else if (E->AM == AM65_ZP) { - if (In->RegA >= 0) { - switch (GetKnownReg (E->Chg, In)) { + if (RegValIsKnown (In->RegA)) { + switch (GetKnownReg (E->Chg & REG_ZP, In)) { case REG_TMP1: Out->Tmp1 &= ~In->RegA; break; + case REG_PTR1_LO: + Out->Ptr1Lo &= ~In->RegA; + break; + case REG_PTR1_HI: + Out->Ptr1Hi &= ~In->RegA; + break; case REG_SREG_LO: Out->SRegLo &= ~In->RegA; break; @@ -1050,14 +1159,20 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) break; } } else { - switch (GetKnownReg (E->Chg, In)) { + switch (GetKnownReg (E->Chg & REG_ZP, In)) { case REG_TMP1: Out->Tmp1 = UNKNOWN_REGVAL; break; + case REG_PTR1_LO: + Out->Ptr1Lo = UNKNOWN_REGVAL; + break; + case REG_PTR1_HI: + Out->Ptr1Hi = UNKNOWN_REGVAL; + break; case REG_SREG_LO: Out->SRegLo = UNKNOWN_REGVAL; break; - case REG_SREG_HI: + case REG_SREG_HI: Out->SRegHi = UNKNOWN_REGVAL; break; } @@ -1070,11 +1185,17 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) /* Invalidates all ZP registers */ RC_InvalidateZP (Out); } else if (E->AM == AM65_ZP) { - if (In->RegA >= 0) { - switch (GetKnownReg (E->Chg, In)) { + if (RegValIsKnown (In->RegA)) { + switch (GetKnownReg (E->Chg & REG_ZP, In)) { case REG_TMP1: Out->Tmp1 |= In->RegA; break; + case REG_PTR1_LO: + Out->Ptr1Lo |= In->RegA; + break; + case REG_PTR1_HI: + Out->Ptr1Hi |= In->RegA; + break; case REG_SREG_LO: Out->SRegLo |= In->RegA; break; @@ -1083,12 +1204,18 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) break; } } else { - switch (GetKnownReg (E->Chg, In)) { + switch (GetKnownReg (E->Chg & REG_ZP, In)) { case REG_TMP1: Out->Tmp1 = UNKNOWN_REGVAL; break; + case REG_PTR1_LO: + Out->Ptr1Lo = UNKNOWN_REGVAL; + break; + case REG_PTR1_HI: + Out->Ptr1Hi = UNKNOWN_REGVAL; + break; case REG_SREG_LO: - Out->SRegLo = UNKNOWN_REGVAL; + Out->SRegLo = UNKNOWN_REGVAL; break; case REG_SREG_HI: Out->SRegHi = UNKNOWN_REGVAL; @@ -1135,6 +1262,7 @@ static char* RegInfoDesc (unsigned U, char* Buf) strcat (Buf, U & REG_PTR1? "1" : "_"); strcat (Buf, U & REG_PTR2? "2" : "_"); strcat (Buf, U & REG_SAVE? "V" : "_"); + strcat (Buf, U & REG_SP? "S" : "_"); return Buf; }