- Tots els opcodes legals del 6502 implementats
This commit is contained in:
340
6502.cpp
340
6502.cpp
@@ -310,6 +310,89 @@ namespace cpu6502
|
|||||||
rP = ( (result ^ rA) & (result ^ value) & 0x80 ) ? rP | fV : rP & ~fV;
|
rP = ( (result ^ rA) & (result ^ value) & 0x80 ) ? rP | fV : rP & ~fV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SBC(uint8_t addr_mode)
|
||||||
|
{
|
||||||
|
uint8_t value = loadValue(addr_mode);
|
||||||
|
uint16_t result = rA + ~value + fC;
|
||||||
|
rA = result & 0xff;
|
||||||
|
rP = ( rP & ~fC ) | ( (result>>8) & fC );
|
||||||
|
rP = ( rP & ~fN ) | ( rA & fN );
|
||||||
|
rP = ( rA ? rP & ~fZ : rP | fZ );
|
||||||
|
rP = ( (result ^ rA) & (result ^ value) & 0x80 ) ? rP | fV : rP & ~fV;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CMP(uint8_t addr_mode)
|
||||||
|
{
|
||||||
|
uint8_t value = loadValue(addr_mode);
|
||||||
|
uint8_t result = rA + ~value;
|
||||||
|
rP = ( rP & ~fC ) | ( (result>>8) & fC );
|
||||||
|
rP = ( rP & ~fN ) | ( result & fN );
|
||||||
|
rP = ( result ? rP & ~fZ : rP | fZ );
|
||||||
|
}
|
||||||
|
|
||||||
|
void CPX(uint8_t addr_mode)
|
||||||
|
{
|
||||||
|
uint8_t value = loadValue(addr_mode);
|
||||||
|
uint8_t result = rX + ~value;
|
||||||
|
rP = ( rP & ~fC ) | ( (result>>8) & fC );
|
||||||
|
rP = ( rP & ~fN ) | ( result & fN );
|
||||||
|
rP = ( result ? rP & ~fZ : rP | fZ );
|
||||||
|
}
|
||||||
|
|
||||||
|
void CPY(uint8_t addr_mode)
|
||||||
|
{
|
||||||
|
uint8_t value = loadValue(addr_mode);
|
||||||
|
uint8_t result = rY + ~value;
|
||||||
|
rP = ( rP & ~fC ) | ( (result>>8) & fC );
|
||||||
|
rP = ( rP & ~fN ) | ( result & fN );
|
||||||
|
rP = ( result ? rP & ~fZ : rP | fZ );
|
||||||
|
}
|
||||||
|
|
||||||
|
void INC(uint8_t addr_mode)
|
||||||
|
{
|
||||||
|
uint8_t value = loadValue(addr_mode);
|
||||||
|
value++;
|
||||||
|
rP = ( rP & ~fN ) | ( value & fN );
|
||||||
|
rP = ( value ? rP & ~fZ : rP | fZ );
|
||||||
|
storeValue(value, addr_mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DEC(uint8_t addr_mode)
|
||||||
|
{
|
||||||
|
uint8_t value = loadValue(addr_mode);
|
||||||
|
value--;
|
||||||
|
rP = ( rP & ~fN ) | ( value & fN );
|
||||||
|
rP = ( value ? rP & ~fZ : rP | fZ );
|
||||||
|
storeValue(value, addr_mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
void INY()
|
||||||
|
{
|
||||||
|
rY++;
|
||||||
|
rP = ( rP & ~fN ) | ( rY & fN );
|
||||||
|
rP = ( rY ? rP & ~fZ : rP | fZ );
|
||||||
|
}
|
||||||
|
void DEY()
|
||||||
|
{
|
||||||
|
rY--;
|
||||||
|
rP = ( rP & ~fN ) | ( rY & fN );
|
||||||
|
rP = ( rY ? rP & ~fZ : rP | fZ );
|
||||||
|
}
|
||||||
|
|
||||||
|
void INX()
|
||||||
|
{
|
||||||
|
rX++;
|
||||||
|
rP = ( rP & ~fN ) | ( rX & fN );
|
||||||
|
rP = ( rX ? rP & ~fZ : rP | fZ );
|
||||||
|
}
|
||||||
|
|
||||||
|
void DEX()
|
||||||
|
{
|
||||||
|
rX--;
|
||||||
|
rP = ( rP & ~fN ) | ( rX & fN );
|
||||||
|
rP = ( rX ? rP & ~fZ : rP | fZ );
|
||||||
|
}
|
||||||
|
|
||||||
void ORA(uint8_t addr_mode)
|
void ORA(uint8_t addr_mode)
|
||||||
{
|
{
|
||||||
uint8_t value = loadValue(addr_mode);
|
uint8_t value = loadValue(addr_mode);
|
||||||
@@ -445,6 +528,103 @@ namespace cpu6502
|
|||||||
void CLI() { CLEAR_FLAG(fI); }
|
void CLI() { CLEAR_FLAG(fI); }
|
||||||
void CLV() { CLEAR_FLAG(fV); }
|
void CLV() { CLEAR_FLAG(fV); }
|
||||||
|
|
||||||
|
void STA(uint8_t addr_mode)
|
||||||
|
{
|
||||||
|
loadValue(addr_mode);
|
||||||
|
if (!page_crossed) t++;
|
||||||
|
storeValue(rA, addr_mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
void STX(uint8_t addr_mode)
|
||||||
|
{
|
||||||
|
loadValue(addr_mode);
|
||||||
|
storeValue(rX, addr_mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
void STY(uint8_t addr_mode)
|
||||||
|
{
|
||||||
|
loadValue(addr_mode);
|
||||||
|
storeValue(rY, addr_mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LDA(uint8_t addr_mode)
|
||||||
|
{
|
||||||
|
uint8_t value = loadValue(addr_mode);
|
||||||
|
if (!page_crossed) t++;
|
||||||
|
rA = value;
|
||||||
|
rP = ( rP & ~fN ) | ( rA & fN );
|
||||||
|
rP = ( rA ? rP & ~fZ : rP | fZ );
|
||||||
|
}
|
||||||
|
|
||||||
|
void LDX(uint8_t addr_mode)
|
||||||
|
{
|
||||||
|
uint8_t value = loadValue(addr_mode);
|
||||||
|
if (!page_crossed) t++;
|
||||||
|
rX = value;
|
||||||
|
rP = ( rP & ~fN ) | ( rX & fN );
|
||||||
|
rP = ( rX ? rP & ~fZ : rP | fZ );
|
||||||
|
}
|
||||||
|
|
||||||
|
void LDY(uint8_t addr_mode)
|
||||||
|
{
|
||||||
|
uint8_t value = loadValue(addr_mode);
|
||||||
|
if (!page_crossed) t++;
|
||||||
|
rY = value;
|
||||||
|
rP = ( rP & ~fN ) | ( rY & fN );
|
||||||
|
rP = ( rY ? rP & ~fZ : rP | fZ );
|
||||||
|
}
|
||||||
|
|
||||||
|
void TAX()
|
||||||
|
{
|
||||||
|
t += 2;
|
||||||
|
rX = rA;
|
||||||
|
rP = ( rP & ~fN ) | ( rA & fN );
|
||||||
|
rP = ( rA ? rP & ~fZ : rP | fZ );
|
||||||
|
}
|
||||||
|
|
||||||
|
void TAY()
|
||||||
|
{
|
||||||
|
t += 2;
|
||||||
|
rY = rA;
|
||||||
|
rP = ( rP & ~fN ) | ( rA & fN );
|
||||||
|
rP = ( rA ? rP & ~fZ : rP | fZ );
|
||||||
|
}
|
||||||
|
|
||||||
|
void TSX()
|
||||||
|
{
|
||||||
|
t += 2;
|
||||||
|
rX = rS;
|
||||||
|
rP = ( rP & ~fN ) | ( rA & fN );
|
||||||
|
rP = ( rX ? rP & ~fZ : rP | fZ );
|
||||||
|
}
|
||||||
|
|
||||||
|
void TXA()
|
||||||
|
{
|
||||||
|
t += 2;
|
||||||
|
rA = rX;
|
||||||
|
rP = ( rP & ~fN ) | ( rA & fN );
|
||||||
|
rP = ( rA ? rP & ~fZ : rP | fZ );
|
||||||
|
}
|
||||||
|
|
||||||
|
void TXS()
|
||||||
|
{
|
||||||
|
t += 2;
|
||||||
|
rS = rX;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TYA()
|
||||||
|
{
|
||||||
|
t += 2;
|
||||||
|
rA = rY;
|
||||||
|
rP = ( rP & ~fN ) | ( rA & fN );
|
||||||
|
rP = ( rA ? rP & ~fZ : rP | fZ );
|
||||||
|
}
|
||||||
|
|
||||||
|
void NOP()
|
||||||
|
{
|
||||||
|
t+=2;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t step()
|
uint32_t step()
|
||||||
{
|
{
|
||||||
t = 0;
|
t = 0;
|
||||||
@@ -597,139 +777,139 @@ namespace cpu6502
|
|||||||
case 0x7f: notImplemented(); break;
|
case 0x7f: notImplemented(); break;
|
||||||
|
|
||||||
case 0x80: notImplemented(); break;
|
case 0x80: notImplemented(); break;
|
||||||
case 0x81: break;
|
case 0x81: STA(aIndirectX); break;
|
||||||
case 0x82: break;
|
case 0x82: notImplemented(); break;
|
||||||
case 0x83: notImplemented(); break;
|
case 0x83: notImplemented(); break;
|
||||||
case 0x84: notImplemented(); break;
|
case 0x84: STY(aZeroPage); break;
|
||||||
case 0x85: break;
|
case 0x85: STA(aZeroPage); break;
|
||||||
case 0x86: break;
|
case 0x86: STX(aZeroPage); break;
|
||||||
case 0x87: notImplemented(); break;
|
case 0x87: notImplemented(); break;
|
||||||
case 0x88: break;
|
case 0x88: DEY(); break;
|
||||||
case 0x89: notImplemented(); break;
|
case 0x89: notImplemented(); break;
|
||||||
case 0x8a: break;
|
case 0x8a: TXA(); break;
|
||||||
case 0x8b: notImplemented(); break;
|
case 0x8b: notImplemented(); break;
|
||||||
case 0x8c: break;
|
case 0x8c: STY(aAbsolute); break;
|
||||||
case 0x8d: break;
|
case 0x8d: STA(aAbsolute); break;
|
||||||
case 0x8e: break;
|
case 0x8e: STX(aAbsolute); break;
|
||||||
case 0x8f: notImplemented(); break;
|
case 0x8f: notImplemented(); break;
|
||||||
|
|
||||||
case 0x90: break;
|
case 0x90: BCC(); break;
|
||||||
case 0x91: break;
|
case 0x91: STA(aIndirectY); break;
|
||||||
case 0x92: notImplemented(); break;
|
case 0x92: notImplemented(); break;
|
||||||
case 0x93: notImplemented(); break;
|
case 0x93: notImplemented(); break;
|
||||||
case 0x94: break;
|
case 0x94: STY(aZeroPageX); break;
|
||||||
case 0x95: break;
|
case 0x95: STA(aZeroPageX); break;
|
||||||
case 0x96: break;
|
case 0x96: STX(aZeroPageY); break;
|
||||||
case 0x97: notImplemented(); break;
|
case 0x97: notImplemented(); break;
|
||||||
case 0x98: break;
|
case 0x98: TYA(); break;
|
||||||
case 0x99: break;
|
case 0x99: STA(aAbsoluteY); break;
|
||||||
case 0x9a: break;
|
case 0x9a: TXS(); break;
|
||||||
case 0x9b: notImplemented(); break;
|
case 0x9b: notImplemented(); break;
|
||||||
case 0x9c: notImplemented(); break;
|
case 0x9c: notImplemented(); break;
|
||||||
case 0x9d: break;
|
case 0x9d: STA(aAbsolute); break;
|
||||||
case 0x9e: notImplemented(); break;
|
case 0x9e: notImplemented(); break;
|
||||||
case 0x9f: notImplemented(); break;
|
case 0x9f: notImplemented(); break;
|
||||||
|
|
||||||
case 0xa0: break;
|
case 0xa0: LDY(aImmediate); break;
|
||||||
case 0xa1: break;
|
case 0xa1: LDA(aIndirectX); break;
|
||||||
case 0xa2: break;
|
case 0xa2: LDX(aImmediate); break;
|
||||||
case 0xa3: notImplemented(); break;
|
case 0xa3: notImplemented(); break;
|
||||||
case 0xa4: break;
|
case 0xa4: LDY(aZeroPage); break;
|
||||||
case 0xa5: break;
|
case 0xa5: LDA(aZeroPage); break;
|
||||||
case 0xa6: break;
|
case 0xa6: LDX(aZeroPage); break;
|
||||||
case 0xa7: notImplemented(); break;
|
case 0xa7: notImplemented(); break;
|
||||||
case 0xa8: break;
|
case 0xa8: TAY(); break;
|
||||||
case 0xa9: break;
|
case 0xa9: LDA(aImmediate); break;
|
||||||
case 0xaa: break;
|
case 0xaa: TAX(); break;
|
||||||
case 0xab: notImplemented(); break;
|
case 0xab: notImplemented(); break;
|
||||||
case 0xac: break;
|
case 0xac: LDY(aAbsolute); break;
|
||||||
case 0xad: break;
|
case 0xad: LDA(aAbsolute); break;
|
||||||
case 0xae: break;
|
case 0xae: LDX(aAbsolute); break;
|
||||||
case 0xaf: notImplemented(); break;
|
case 0xaf: notImplemented(); break;
|
||||||
|
|
||||||
case 0xb0: break;
|
case 0xb0: BCS(); break;
|
||||||
case 0xb1: break;
|
case 0xb1: LDA(aIndirectY); break;
|
||||||
case 0xb2: notImplemented(); break;
|
case 0xb2: notImplemented(); break;
|
||||||
case 0xb3: notImplemented(); break;
|
case 0xb3: notImplemented(); break;
|
||||||
case 0xb4: break;
|
case 0xb4: LDY(aZeroPageX); break;
|
||||||
case 0xb5: break;
|
case 0xb5: LDA(aZeroPageX); break;
|
||||||
case 0xb6: break;
|
case 0xb6: LDX(aZeroPageY); break;
|
||||||
case 0xb7: notImplemented(); break;
|
case 0xb7: notImplemented(); break;
|
||||||
case 0xb8: break;
|
case 0xb8: CLV(); break;
|
||||||
case 0xb9: break;
|
case 0xb9: LDA(aAbsoluteY); break;
|
||||||
case 0xba: break;
|
case 0xba: TSX(); break;
|
||||||
case 0xbb: notImplemented(); break;
|
case 0xbb: notImplemented(); break;
|
||||||
case 0xbc: break;
|
case 0xbc: LDY(aAbsoluteX); break;
|
||||||
case 0xbd: break;
|
case 0xbd: LDA(aAbsoluteX); break;
|
||||||
case 0xbe: break;
|
case 0xbe: LDX(aAbsoluteY); break;
|
||||||
case 0xbf: notImplemented(); break;
|
case 0xbf: notImplemented(); break;
|
||||||
|
|
||||||
case 0xc0: break;
|
case 0xc0: CPY(aImmediate); break;
|
||||||
case 0xc1: break;
|
case 0xc1: CMP(aIndirectX); break;
|
||||||
case 0xc2: notImplemented(); break;
|
case 0xc2: notImplemented(); break;
|
||||||
case 0xc3: notImplemented(); break;
|
case 0xc3: notImplemented(); break;
|
||||||
case 0xc4: break;
|
case 0xc4: CPY(aZeroPage); break;
|
||||||
case 0xc5: break;
|
case 0xc5: CMP(aZeroPage); break;
|
||||||
case 0xc6: break;
|
case 0xc6: DEC(aZeroPage); break;
|
||||||
case 0xc7: notImplemented(); break;
|
case 0xc7: notImplemented(); break;
|
||||||
case 0xc8: break;
|
case 0xc8: INY(); break;
|
||||||
case 0xc9: break;
|
case 0xc9: CMP(aImmediate); break;
|
||||||
case 0xca: break;
|
case 0xca: DEX(); break;
|
||||||
case 0xcb: notImplemented(); break;
|
case 0xcb: notImplemented(); break;
|
||||||
case 0xcc: break;
|
case 0xcc: CPY(aAbsolute); break;
|
||||||
case 0xcd: break;
|
case 0xcd: CMP(aAbsolute); break;
|
||||||
case 0xce: break;
|
case 0xce: DEC(aAbsolute); break;
|
||||||
case 0xcf: notImplemented(); break;
|
case 0xcf: notImplemented(); break;
|
||||||
|
|
||||||
case 0xd0: break;
|
case 0xd0: BNE(); break;
|
||||||
case 0xd1: break;
|
case 0xd1: CMP(aIndirectY); break;
|
||||||
case 0xd2: notImplemented(); break;
|
case 0xd2: notImplemented(); break;
|
||||||
case 0xd3: notImplemented(); break;
|
case 0xd3: notImplemented(); break;
|
||||||
case 0xd4: notImplemented(); break;
|
case 0xd4: notImplemented(); break;
|
||||||
case 0xd5: break;
|
case 0xd5: CMP(aZeroPageX); break;
|
||||||
case 0xd6: break;
|
case 0xd6: DEC(aZeroPageX); break;
|
||||||
case 0xd7: notImplemented(); break;
|
case 0xd7: notImplemented(); break;
|
||||||
case 0xd8: break;
|
case 0xd8: CLD(); break;
|
||||||
case 0xd9: break;
|
case 0xd9: CMP(aAbsoluteY); break;
|
||||||
case 0xda: notImplemented(); break;
|
case 0xda: notImplemented(); break;
|
||||||
case 0xdb: notImplemented(); break;
|
case 0xdb: notImplemented(); break;
|
||||||
case 0xdc: notImplemented(); break;
|
case 0xdc: notImplemented(); break;
|
||||||
case 0xdd: break;
|
case 0xdd: CMP(aAbsoluteX); break;
|
||||||
case 0xde: break;
|
case 0xde: DEC(aAbsoluteX); break;
|
||||||
case 0xdf: notImplemented(); break;
|
case 0xdf: notImplemented(); break;
|
||||||
|
|
||||||
case 0xe0: break;
|
case 0xe0: CPX(aImmediate); break;
|
||||||
case 0xe1: break;
|
case 0xe1: SBC(aIndirectX); break;
|
||||||
case 0xe2: notImplemented(); break;
|
case 0xe2: notImplemented(); break;
|
||||||
case 0xe3: notImplemented(); break;
|
case 0xe3: notImplemented(); break;
|
||||||
case 0xe4: break;
|
case 0xe4: CPX(aZeroPage); break;
|
||||||
case 0xe5: break;
|
case 0xe5: SBC(aZeroPage); break;
|
||||||
case 0xe6: break;
|
case 0xe6: INC(aZeroPage); break;
|
||||||
case 0xe7: notImplemented(); break;
|
case 0xe7: notImplemented(); break;
|
||||||
case 0xe8: break;
|
case 0xe8: INX(); break;
|
||||||
case 0xe9: break;
|
case 0xe9: SBC(aImmediate); break;
|
||||||
case 0xea: break;
|
case 0xea: NOP(); break;
|
||||||
case 0xeb: notImplemented(); break;
|
case 0xeb: notImplemented(); break;
|
||||||
case 0xec: break;
|
case 0xec: CPX(aAbsolute); break;
|
||||||
case 0xed: break;
|
case 0xed: SBC(aAbsolute); break;
|
||||||
case 0xee: break;
|
case 0xee: INC(aAbsolute); break;
|
||||||
case 0xef: notImplemented(); break;
|
case 0xef: notImplemented(); break;
|
||||||
|
|
||||||
case 0xf0: break;
|
case 0xf0: BEQ(); break;
|
||||||
case 0xf1: break;
|
case 0xf1: SBC(aIndirectY); break;
|
||||||
case 0xf2: notImplemented(); break;
|
case 0xf2: notImplemented(); break;
|
||||||
case 0xf3: notImplemented(); break;
|
case 0xf3: notImplemented(); break;
|
||||||
case 0xf4: notImplemented(); break;
|
case 0xf4: notImplemented(); break;
|
||||||
case 0xf5: break;
|
case 0xf5: SBC(aZeroPageX); break;
|
||||||
case 0xf6: break;
|
case 0xf6: INC(aZeroPageX); break;
|
||||||
case 0xf7: notImplemented(); break;
|
case 0xf7: notImplemented(); break;
|
||||||
case 0xf8: break;
|
case 0xf8: SED(); break;
|
||||||
case 0xf9: break;
|
case 0xf9: SBC(aAbsoluteY); break;
|
||||||
case 0xfa: notImplemented(); break;
|
case 0xfa: notImplemented(); break;
|
||||||
case 0xfb: notImplemented(); break;
|
case 0xfb: notImplemented(); break;
|
||||||
case 0xfc: notImplemented(); break;
|
case 0xfc: notImplemented(); break;
|
||||||
case 0xfd: break;
|
case 0xfd: SBC(aAbsoluteX); break;
|
||||||
case 0xfe: break;
|
case 0xfe: INC(aAbsoluteX); break;
|
||||||
case 0xff: notImplemented(); break;
|
case 0xff: notImplemented(); break;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user