mirror of
https://github.com/edmccard/twoapple-reboot.git
synced 2024-06-10 00:29:52 +00:00
1610 lines
38 KiB
Plaintext
1610 lines
38 KiB
Plaintext
override void opcode18()
|
|
{
|
|
peek(programCounter);
|
|
flag.carry = false;
|
|
}
|
|
|
|
override void opcode38()
|
|
{
|
|
peek(programCounter);
|
|
flag.carry = true;
|
|
}
|
|
|
|
override void opcode58()
|
|
{
|
|
peek(programCounter);
|
|
flag.interrupt = false;
|
|
}
|
|
|
|
override void opcode78()
|
|
{
|
|
peek(programCounter);
|
|
flag.interrupt = true;
|
|
}
|
|
|
|
override void opcodeB8()
|
|
{
|
|
peek(programCounter);
|
|
flag.overflow = false;
|
|
}
|
|
|
|
override void opcodeD8()
|
|
{
|
|
peek(programCounter);
|
|
flag.decimal = false;
|
|
}
|
|
|
|
override void opcodeF8()
|
|
{
|
|
peek(programCounter);
|
|
flag.decimal = true;
|
|
}
|
|
|
|
override void opcodeEA()
|
|
{
|
|
peek(programCounter);
|
|
|
|
}
|
|
|
|
override void opcode08()
|
|
{
|
|
peek(programCounter);
|
|
push(flag.toByte());
|
|
}
|
|
|
|
override void opcode28()
|
|
{
|
|
peek(programCounter);
|
|
flag.fromByte(pull());
|
|
}
|
|
|
|
override void opcode48()
|
|
{
|
|
peek(programCounter);
|
|
push(accumulator);
|
|
}
|
|
|
|
override void opcode9A()
|
|
{
|
|
peek(programCounter);
|
|
stackPointer = xIndex;
|
|
}
|
|
|
|
override void opcode68()
|
|
{
|
|
peek(programCounter);
|
|
flag.zero_ = flag.negative_ = (accumulator = pull());
|
|
}
|
|
|
|
override void opcodeBA()
|
|
{
|
|
peek(programCounter);
|
|
flag.zero_ = flag.negative_ = (xIndex = stackPointer);
|
|
}
|
|
|
|
override void opcodeAA()
|
|
{
|
|
peek(programCounter);
|
|
flag.zero_ = flag.negative_ = (xIndex = accumulator);
|
|
}
|
|
|
|
override void opcode8A()
|
|
{
|
|
peek(programCounter);
|
|
flag.zero_ = flag.negative_ = (accumulator = xIndex);
|
|
}
|
|
|
|
override void opcodeCA()
|
|
{
|
|
peek(programCounter);
|
|
flag.zero_ = flag.negative_ = (xIndex -= 1);
|
|
}
|
|
|
|
override void opcodeE8()
|
|
{
|
|
peek(programCounter);
|
|
flag.zero_ = flag.negative_ = (xIndex += 1);
|
|
}
|
|
|
|
override void opcodeA8()
|
|
{
|
|
peek(programCounter);
|
|
flag.zero_ = flag.negative_ = (yIndex = accumulator);
|
|
}
|
|
|
|
override void opcode98()
|
|
{
|
|
peek(programCounter);
|
|
flag.zero_ = flag.negative_ = (accumulator = yIndex);
|
|
}
|
|
|
|
override void opcode88()
|
|
{
|
|
peek(programCounter);
|
|
flag.zero_ = flag.negative_ = (yIndex -= 1);
|
|
}
|
|
|
|
override void opcodeC8()
|
|
{
|
|
peek(programCounter);
|
|
flag.zero_ = flag.negative_ = (yIndex += 1);
|
|
}
|
|
|
|
override void opcode10()
|
|
{
|
|
readByteOperand();
|
|
if (flag.negative_ < 0x80) addrRelative(cast(byte)operand1);
|
|
}
|
|
|
|
override void opcode30()
|
|
{
|
|
readByteOperand();
|
|
if (flag.negative_ > 0x7F) addrRelative(cast(byte)operand1);
|
|
}
|
|
|
|
override void opcode50()
|
|
{
|
|
readByteOperand();
|
|
if (!flag.overflow) addrRelative(cast(byte)operand1);
|
|
}
|
|
|
|
override void opcode70()
|
|
{
|
|
readByteOperand();
|
|
if (flag.overflow) addrRelative(cast(byte)operand1);
|
|
}
|
|
|
|
override void opcode90()
|
|
{
|
|
readByteOperand();
|
|
if (!flag.carry) addrRelative(cast(byte)operand1);
|
|
}
|
|
|
|
override void opcodeB0()
|
|
{
|
|
readByteOperand();
|
|
if (flag.carry) addrRelative(cast(byte)operand1);
|
|
}
|
|
|
|
override void opcodeD0()
|
|
{
|
|
readByteOperand();
|
|
if (flag.zero_ != 0) addrRelative(cast(byte)operand1);
|
|
}
|
|
|
|
override void opcodeF0()
|
|
{
|
|
readByteOperand();
|
|
if (flag.zero_ == 0) addrRelative(cast(byte)operand1);
|
|
}
|
|
|
|
override void opcode0A()
|
|
{
|
|
peek(programCounter);
|
|
flag.zero_ = flag.negative_ = (accumulator = shiftLeft(accumulator));
|
|
}
|
|
|
|
override void opcode2A()
|
|
{
|
|
peek(programCounter);
|
|
flag.zero_ = flag.negative_ = (accumulator = rotateLeft(accumulator));
|
|
}
|
|
|
|
override void opcode4A()
|
|
{
|
|
peek(programCounter);
|
|
flag.zero_ = flag.negative_ = (accumulator = shiftRight(accumulator));
|
|
}
|
|
|
|
override void opcode6A()
|
|
{
|
|
peek(programCounter);
|
|
flag.zero_ = flag.negative_ = (accumulator = rotateRight(accumulator));
|
|
}
|
|
|
|
override void opcodeA1()
|
|
{
|
|
addrIndirectX();
|
|
flag.zero_ = flag.negative_ = (accumulator = (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcodeA5()
|
|
{
|
|
addrZeropage();
|
|
flag.zero_ = flag.negative_ = (accumulator = (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcodeA9()
|
|
{
|
|
primaryAddress = programCounter++;
|
|
flag.zero_ = flag.negative_ = (accumulator = (readVal = readFinal(primaryAddress)));
|
|
operand1 = readVal;
|
|
}
|
|
override void opcodeAD()
|
|
{
|
|
addrAbsolute();
|
|
flag.zero_ = flag.negative_ = (accumulator = (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcodeB1()
|
|
{
|
|
addrIndirectY(false);
|
|
flag.zero_ = flag.negative_ = (accumulator = (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcodeB5()
|
|
{
|
|
addrZeropageX();
|
|
flag.zero_ = flag.negative_ = (accumulator = (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcodeB9()
|
|
{
|
|
addrAbsoluteY(false);
|
|
flag.zero_ = flag.negative_ = (accumulator = (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcodeBD()
|
|
{
|
|
addrAbsoluteX(false);
|
|
flag.zero_ = flag.negative_ = (accumulator = (readVal = readFinal(primaryAddress)));
|
|
}
|
|
|
|
override void opcode01()
|
|
{
|
|
addrIndirectX();
|
|
flag.zero_ = flag.negative_ = (accumulator |= (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcode05()
|
|
{
|
|
addrZeropage();
|
|
flag.zero_ = flag.negative_ = (accumulator |= (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcode09()
|
|
{
|
|
primaryAddress = programCounter++;
|
|
flag.zero_ = flag.negative_ = (accumulator |= (readVal = readFinal(primaryAddress)));
|
|
operand1 = readVal;
|
|
}
|
|
override void opcode0D()
|
|
{
|
|
addrAbsolute();
|
|
flag.zero_ = flag.negative_ = (accumulator |= (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcode11()
|
|
{
|
|
addrIndirectY(false);
|
|
flag.zero_ = flag.negative_ = (accumulator |= (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcode15()
|
|
{
|
|
addrZeropageX();
|
|
flag.zero_ = flag.negative_ = (accumulator |= (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcode19()
|
|
{
|
|
addrAbsoluteY(false);
|
|
flag.zero_ = flag.negative_ = (accumulator |= (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcode1D()
|
|
{
|
|
addrAbsoluteX(false);
|
|
flag.zero_ = flag.negative_ = (accumulator |= (readVal = readFinal(primaryAddress)));
|
|
}
|
|
|
|
override void opcode21()
|
|
{
|
|
addrIndirectX();
|
|
flag.zero_ = flag.negative_ = (accumulator &= (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcode25()
|
|
{
|
|
addrZeropage();
|
|
flag.zero_ = flag.negative_ = (accumulator &= (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcode29()
|
|
{
|
|
primaryAddress = programCounter++;
|
|
flag.zero_ = flag.negative_ = (accumulator &= (readVal = readFinal(primaryAddress)));
|
|
operand1 = readVal;
|
|
}
|
|
override void opcode2D()
|
|
{
|
|
addrAbsolute();
|
|
flag.zero_ = flag.negative_ = (accumulator &= (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcode31()
|
|
{
|
|
addrIndirectY(false);
|
|
flag.zero_ = flag.negative_ = (accumulator &= (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcode35()
|
|
{
|
|
addrZeropageX();
|
|
flag.zero_ = flag.negative_ = (accumulator &= (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcode39()
|
|
{
|
|
addrAbsoluteY(false);
|
|
flag.zero_ = flag.negative_ = (accumulator &= (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcode3D()
|
|
{
|
|
addrAbsoluteX(false);
|
|
flag.zero_ = flag.negative_ = (accumulator &= (readVal = readFinal(primaryAddress)));
|
|
}
|
|
|
|
override void opcode41()
|
|
{
|
|
addrIndirectX();
|
|
flag.zero_ = flag.negative_ = (accumulator ^= (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcode45()
|
|
{
|
|
addrZeropage();
|
|
flag.zero_ = flag.negative_ = (accumulator ^= (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcode49()
|
|
{
|
|
primaryAddress = programCounter++;
|
|
flag.zero_ = flag.negative_ = (accumulator ^= (readVal = readFinal(primaryAddress)));
|
|
operand1 = readVal;
|
|
}
|
|
override void opcode4D()
|
|
{
|
|
addrAbsolute();
|
|
flag.zero_ = flag.negative_ = (accumulator ^= (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcode51()
|
|
{
|
|
addrIndirectY(false);
|
|
flag.zero_ = flag.negative_ = (accumulator ^= (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcode55()
|
|
{
|
|
addrZeropageX();
|
|
flag.zero_ = flag.negative_ = (accumulator ^= (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcode59()
|
|
{
|
|
addrAbsoluteY(false);
|
|
flag.zero_ = flag.negative_ = (accumulator ^= (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcode5D()
|
|
{
|
|
addrAbsoluteX(false);
|
|
flag.zero_ = flag.negative_ = (accumulator ^= (readVal = readFinal(primaryAddress)));
|
|
}
|
|
|
|
override void opcode61()
|
|
{
|
|
addrIndirectX();
|
|
if (flag.decimal) dec_addWithCarry(readVal = readFinal(primaryAddress));
|
|
else hex_addWithCarry(readVal = readFinal(primaryAddress));
|
|
}
|
|
override void opcode65()
|
|
{
|
|
addrZeropage();
|
|
if (flag.decimal) dec_addWithCarry(readVal = readFinal(primaryAddress));
|
|
else hex_addWithCarry(readVal = readFinal(primaryAddress));
|
|
}
|
|
override void opcode69()
|
|
{
|
|
primaryAddress = programCounter++;
|
|
if (flag.decimal) dec_addWithCarry(readVal = readFinal(primaryAddress));
|
|
else hex_addWithCarry(readVal = readFinal(primaryAddress));
|
|
operand1 = readVal;
|
|
}
|
|
override void opcode6D()
|
|
{
|
|
addrAbsolute();
|
|
if (flag.decimal) dec_addWithCarry(readVal = readFinal(primaryAddress));
|
|
else hex_addWithCarry(readVal = readFinal(primaryAddress));
|
|
}
|
|
override void opcode71()
|
|
{
|
|
addrIndirectY(false);
|
|
if (flag.decimal) dec_addWithCarry(readVal = readFinal(primaryAddress));
|
|
else hex_addWithCarry(readVal = readFinal(primaryAddress));
|
|
}
|
|
override void opcode75()
|
|
{
|
|
addrZeropageX();
|
|
if (flag.decimal) dec_addWithCarry(readVal = readFinal(primaryAddress));
|
|
else hex_addWithCarry(readVal = readFinal(primaryAddress));
|
|
}
|
|
override void opcode79()
|
|
{
|
|
addrAbsoluteY(false);
|
|
if (flag.decimal) dec_addWithCarry(readVal = readFinal(primaryAddress));
|
|
else hex_addWithCarry(readVal = readFinal(primaryAddress));
|
|
}
|
|
override void opcode7D()
|
|
{
|
|
addrAbsoluteX(false);
|
|
if (flag.decimal) dec_addWithCarry(readVal = readFinal(primaryAddress));
|
|
else hex_addWithCarry(readVal = readFinal(primaryAddress));
|
|
}
|
|
|
|
override void opcodeE1()
|
|
{
|
|
addrIndirectX();
|
|
if (flag.decimal) dec_subWithCarry(readVal = readFinal(primaryAddress));
|
|
else hex_subWithCarry(readVal = readFinal(primaryAddress));
|
|
}
|
|
override void opcodeE5()
|
|
{
|
|
addrZeropage();
|
|
if (flag.decimal) dec_subWithCarry(readVal = readFinal(primaryAddress));
|
|
else hex_subWithCarry(readVal = readFinal(primaryAddress));
|
|
}
|
|
override void opcodeE9()
|
|
{
|
|
primaryAddress = programCounter++;
|
|
if (flag.decimal) dec_subWithCarry(readVal = readFinal(primaryAddress));
|
|
else hex_subWithCarry(readVal = readFinal(primaryAddress));
|
|
operand1 = readVal;
|
|
}
|
|
override void opcodeED()
|
|
{
|
|
addrAbsolute();
|
|
if (flag.decimal) dec_subWithCarry(readVal = readFinal(primaryAddress));
|
|
else hex_subWithCarry(readVal = readFinal(primaryAddress));
|
|
}
|
|
override void opcodeF1()
|
|
{
|
|
addrIndirectY(false);
|
|
if (flag.decimal) dec_subWithCarry(readVal = readFinal(primaryAddress));
|
|
else hex_subWithCarry(readVal = readFinal(primaryAddress));
|
|
}
|
|
override void opcodeF5()
|
|
{
|
|
addrZeropageX();
|
|
if (flag.decimal) dec_subWithCarry(readVal = readFinal(primaryAddress));
|
|
else hex_subWithCarry(readVal = readFinal(primaryAddress));
|
|
}
|
|
override void opcodeF9()
|
|
{
|
|
addrAbsoluteY(false);
|
|
if (flag.decimal) dec_subWithCarry(readVal = readFinal(primaryAddress));
|
|
else hex_subWithCarry(readVal = readFinal(primaryAddress));
|
|
}
|
|
override void opcodeFD()
|
|
{
|
|
addrAbsoluteX(false);
|
|
if (flag.decimal) dec_subWithCarry(readVal = readFinal(primaryAddress));
|
|
else hex_subWithCarry(readVal = readFinal(primaryAddress));
|
|
}
|
|
|
|
override void opcodeC1()
|
|
{
|
|
addrIndirectX();
|
|
flag.zero_ = flag.negative_ = (compare(accumulator, (readVal = readFinal(primaryAddress))));
|
|
}
|
|
override void opcodeC5()
|
|
{
|
|
addrZeropage();
|
|
flag.zero_ = flag.negative_ = (compare(accumulator, (readVal = readFinal(primaryAddress))));
|
|
}
|
|
override void opcodeC9()
|
|
{
|
|
primaryAddress = programCounter++;
|
|
flag.zero_ = flag.negative_ = (compare(accumulator, (readVal = readFinal(primaryAddress))));
|
|
operand1 = readVal;
|
|
}
|
|
override void opcodeCD()
|
|
{
|
|
addrAbsolute();
|
|
flag.zero_ = flag.negative_ = (compare(accumulator, (readVal = readFinal(primaryAddress))));
|
|
}
|
|
override void opcodeD1()
|
|
{
|
|
addrIndirectY(false);
|
|
flag.zero_ = flag.negative_ = (compare(accumulator, (readVal = readFinal(primaryAddress))));
|
|
}
|
|
override void opcodeD5()
|
|
{
|
|
addrZeropageX();
|
|
flag.zero_ = flag.negative_ = (compare(accumulator, (readVal = readFinal(primaryAddress))));
|
|
}
|
|
override void opcodeD9()
|
|
{
|
|
addrAbsoluteY(false);
|
|
flag.zero_ = flag.negative_ = (compare(accumulator, (readVal = readFinal(primaryAddress))));
|
|
}
|
|
override void opcodeDD()
|
|
{
|
|
addrAbsoluteX(false);
|
|
flag.zero_ = flag.negative_ = (compare(accumulator, (readVal = readFinal(primaryAddress))));
|
|
}
|
|
|
|
override void opcode81()
|
|
{
|
|
addrIndirectX();
|
|
writeFinal(primaryAddress, accumulator);
|
|
}
|
|
override void opcode85()
|
|
{
|
|
addrZeropage();
|
|
writeFinal(primaryAddress, accumulator);
|
|
}
|
|
override void opcode8D()
|
|
{
|
|
addrAbsolute();
|
|
writeFinal(primaryAddress, accumulator);
|
|
}
|
|
override void opcode91()
|
|
{
|
|
addrIndirectY(true);
|
|
writeFinal(primaryAddress, accumulator);
|
|
}
|
|
override void opcode95()
|
|
{
|
|
addrZeropageX();
|
|
writeFinal(primaryAddress, accumulator);
|
|
}
|
|
override void opcode99()
|
|
{
|
|
addrAbsoluteY(true);
|
|
writeFinal(primaryAddress, accumulator);
|
|
}
|
|
override void opcode9D()
|
|
{
|
|
addrAbsoluteX(true);
|
|
writeFinal(primaryAddress, accumulator);
|
|
}
|
|
|
|
override void opcodeA2()
|
|
{
|
|
primaryAddress = programCounter++;
|
|
flag.zero_ = flag.negative_ = (xIndex = (readVal = readFinal(primaryAddress)));
|
|
operand1 = readVal;
|
|
}
|
|
override void opcodeA6()
|
|
{
|
|
addrZeropage();
|
|
flag.zero_ = flag.negative_ = (xIndex = (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcodeAE()
|
|
{
|
|
addrAbsolute();
|
|
flag.zero_ = flag.negative_ = (xIndex = (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcodeB6()
|
|
{
|
|
addrZeropageY();
|
|
flag.zero_ = flag.negative_ = (xIndex = (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcodeBE()
|
|
{
|
|
addrAbsoluteY(false);
|
|
flag.zero_ = flag.negative_ = (xIndex = (readVal = readFinal(primaryAddress)));
|
|
}
|
|
|
|
override void opcodeA0()
|
|
{
|
|
primaryAddress = programCounter++;
|
|
flag.zero_ = flag.negative_ = (yIndex = (readVal = readFinal(primaryAddress)));
|
|
operand1 = readVal;
|
|
}
|
|
override void opcodeA4()
|
|
{
|
|
addrZeropage();
|
|
flag.zero_ = flag.negative_ = (yIndex = (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcodeAC()
|
|
{
|
|
addrAbsolute();
|
|
flag.zero_ = flag.negative_ = (yIndex = (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcodeB4()
|
|
{
|
|
addrZeropageX();
|
|
flag.zero_ = flag.negative_ = (yIndex = (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcodeBC()
|
|
{
|
|
addrAbsoluteX(false);
|
|
flag.zero_ = flag.negative_ = (yIndex = (readVal = readFinal(primaryAddress)));
|
|
}
|
|
|
|
override void opcodeE0()
|
|
{
|
|
primaryAddress = programCounter++;
|
|
flag.zero_ = flag.negative_ = (compare(xIndex, (readVal = readFinal(primaryAddress))));
|
|
operand1 = readVal;
|
|
}
|
|
override void opcodeE4()
|
|
{
|
|
addrZeropage();
|
|
flag.zero_ = flag.negative_ = (compare(xIndex, (readVal = readFinal(primaryAddress))));
|
|
}
|
|
override void opcodeEC()
|
|
{
|
|
addrAbsolute();
|
|
flag.zero_ = flag.negative_ = (compare(xIndex, (readVal = readFinal(primaryAddress))));
|
|
}
|
|
|
|
override void opcodeC0()
|
|
{
|
|
primaryAddress = programCounter++;
|
|
flag.zero_ = flag.negative_ = (compare(yIndex, (readVal = readFinal(primaryAddress))));
|
|
operand1 = readVal;
|
|
}
|
|
override void opcodeC4()
|
|
{
|
|
addrZeropage();
|
|
flag.zero_ = flag.negative_ = (compare(yIndex, (readVal = readFinal(primaryAddress))));
|
|
}
|
|
override void opcodeCC()
|
|
{
|
|
addrAbsolute();
|
|
flag.zero_ = flag.negative_ = (compare(yIndex, (readVal = readFinal(primaryAddress))));
|
|
}
|
|
|
|
override void opcode86()
|
|
{
|
|
addrZeropage();
|
|
writeFinal(primaryAddress, xIndex);
|
|
}
|
|
override void opcode8E()
|
|
{
|
|
addrAbsolute();
|
|
writeFinal(primaryAddress, xIndex);
|
|
}
|
|
override void opcode96()
|
|
{
|
|
addrZeropageY();
|
|
writeFinal(primaryAddress, xIndex);
|
|
}
|
|
|
|
override void opcode84()
|
|
{
|
|
addrZeropage();
|
|
writeFinal(primaryAddress, yIndex);
|
|
}
|
|
override void opcode8C()
|
|
{
|
|
addrAbsolute();
|
|
writeFinal(primaryAddress, yIndex);
|
|
}
|
|
override void opcode94()
|
|
{
|
|
addrZeropageX();
|
|
writeFinal(primaryAddress, yIndex);
|
|
}
|
|
|
|
override void opcode24()
|
|
{
|
|
addrZeropage();
|
|
bitTest(readVal = readFinal(primaryAddress));
|
|
}
|
|
override void opcode2C()
|
|
{
|
|
addrAbsolute();
|
|
bitTest(readVal = readFinal(primaryAddress));
|
|
}
|
|
|
|
override void opcode06()
|
|
{
|
|
addrZeropage();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = shiftLeft(readVal));
|
|
}
|
|
override void opcode0E()
|
|
{
|
|
addrAbsolute();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = shiftLeft(readVal));
|
|
}
|
|
override void opcode16()
|
|
{
|
|
addrZeropageX();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = shiftLeft(readVal));
|
|
}
|
|
override void opcode1E()
|
|
{
|
|
addrAbsoluteX(true);
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = shiftLeft(readVal));
|
|
}
|
|
|
|
override void opcode46()
|
|
{
|
|
addrZeropage();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = shiftRight(readVal));
|
|
}
|
|
override void opcode4E()
|
|
{
|
|
addrAbsolute();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = shiftRight(readVal));
|
|
}
|
|
override void opcode56()
|
|
{
|
|
addrZeropageX();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = shiftRight(readVal));
|
|
}
|
|
override void opcode5E()
|
|
{
|
|
addrAbsoluteX(true);
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = shiftRight(readVal));
|
|
}
|
|
|
|
override void opcode26()
|
|
{
|
|
addrZeropage();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = rotateLeft(readVal));
|
|
}
|
|
override void opcode2E()
|
|
{
|
|
addrAbsolute();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = rotateLeft(readVal));
|
|
}
|
|
override void opcode36()
|
|
{
|
|
addrZeropageX();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = rotateLeft(readVal));
|
|
}
|
|
override void opcode3E()
|
|
{
|
|
addrAbsoluteX(true);
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = rotateLeft(readVal));
|
|
}
|
|
|
|
override void opcode66()
|
|
{
|
|
addrZeropage();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = rotateRight(readVal));
|
|
}
|
|
override void opcode6E()
|
|
{
|
|
addrAbsolute();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = rotateRight(readVal));
|
|
}
|
|
override void opcode76()
|
|
{
|
|
addrZeropageX();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = rotateRight(readVal));
|
|
}
|
|
override void opcode7E()
|
|
{
|
|
addrAbsoluteX(true);
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = rotateRight(readVal));
|
|
}
|
|
|
|
override void opcodeE6()
|
|
{
|
|
addrZeropage();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = increment(readVal));
|
|
}
|
|
override void opcodeEE()
|
|
{
|
|
addrAbsolute();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = increment(readVal));
|
|
}
|
|
override void opcodeF6()
|
|
{
|
|
addrZeropageX();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = increment(readVal));
|
|
}
|
|
override void opcodeFE()
|
|
{
|
|
addrAbsoluteX(true);
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = increment(readVal));
|
|
}
|
|
|
|
override void opcodeC6()
|
|
{
|
|
addrZeropage();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = decrement(readVal));
|
|
}
|
|
override void opcodeCE()
|
|
{
|
|
addrAbsolute();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = decrement(readVal));
|
|
}
|
|
override void opcodeD6()
|
|
{
|
|
addrZeropageX();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = decrement(readVal));
|
|
}
|
|
override void opcodeDE()
|
|
{
|
|
addrAbsoluteX(true);
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = decrement(readVal));
|
|
}
|
|
|
|
override void opcode02()
|
|
{
|
|
addrHalt();
|
|
|
|
}
|
|
override void opcode12()
|
|
{
|
|
addrHalt();
|
|
|
|
}
|
|
override void opcode22()
|
|
{
|
|
addrHalt();
|
|
|
|
}
|
|
override void opcode32()
|
|
{
|
|
addrHalt();
|
|
|
|
}
|
|
override void opcode42()
|
|
{
|
|
addrHalt();
|
|
|
|
}
|
|
override void opcode52()
|
|
{
|
|
addrHalt();
|
|
|
|
}
|
|
override void opcode62()
|
|
{
|
|
addrHalt();
|
|
|
|
}
|
|
override void opcode72()
|
|
{
|
|
addrHalt();
|
|
|
|
}
|
|
override void opcode92()
|
|
{
|
|
addrHalt();
|
|
|
|
}
|
|
override void opcodeB2()
|
|
{
|
|
addrHalt();
|
|
|
|
}
|
|
override void opcodeD2()
|
|
{
|
|
addrHalt();
|
|
|
|
}
|
|
override void opcodeF2()
|
|
{
|
|
addrHalt();
|
|
|
|
}
|
|
|
|
override void opcode1A()
|
|
{
|
|
addrImplied();
|
|
}
|
|
override void opcode3A()
|
|
{
|
|
addrImplied();
|
|
}
|
|
override void opcode5A()
|
|
{
|
|
addrImplied();
|
|
}
|
|
override void opcode7A()
|
|
{
|
|
addrImplied();
|
|
}
|
|
override void opcodeDA()
|
|
{
|
|
addrImplied();
|
|
}
|
|
override void opcodeFA()
|
|
{
|
|
addrImplied();
|
|
}
|
|
|
|
override void opcode0C()
|
|
{
|
|
addrAbsolute();
|
|
readVal = readFinal(primaryAddress);
|
|
}
|
|
|
|
override void opcode1C()
|
|
{
|
|
addrAbsoluteX(false);
|
|
readVal = readFinal(primaryAddress);
|
|
}
|
|
override void opcode3C()
|
|
{
|
|
addrAbsoluteX(false);
|
|
readVal = readFinal(primaryAddress);
|
|
}
|
|
override void opcode5C()
|
|
{
|
|
addrAbsoluteX(false);
|
|
readVal = readFinal(primaryAddress);
|
|
}
|
|
override void opcode7C()
|
|
{
|
|
addrAbsoluteX(false);
|
|
readVal = readFinal(primaryAddress);
|
|
}
|
|
override void opcodeDC()
|
|
{
|
|
addrAbsoluteX(false);
|
|
readVal = readFinal(primaryAddress);
|
|
}
|
|
override void opcodeFC()
|
|
{
|
|
addrAbsoluteX(false);
|
|
readVal = readFinal(primaryAddress);
|
|
}
|
|
|
|
override void opcode80()
|
|
{
|
|
primaryAddress = programCounter++;
|
|
readVal = readFinal(primaryAddress);
|
|
operand1 = readVal;
|
|
}
|
|
override void opcode82()
|
|
{
|
|
primaryAddress = programCounter++;
|
|
readVal = readFinal(primaryAddress);
|
|
operand1 = readVal;
|
|
}
|
|
override void opcode89()
|
|
{
|
|
primaryAddress = programCounter++;
|
|
readVal = readFinal(primaryAddress);
|
|
operand1 = readVal;
|
|
}
|
|
override void opcodeC2()
|
|
{
|
|
primaryAddress = programCounter++;
|
|
readVal = readFinal(primaryAddress);
|
|
operand1 = readVal;
|
|
}
|
|
override void opcodeE2()
|
|
{
|
|
primaryAddress = programCounter++;
|
|
readVal = readFinal(primaryAddress);
|
|
operand1 = readVal;
|
|
}
|
|
|
|
override void opcode04()
|
|
{
|
|
addrZeropage();
|
|
readVal = readFinal(primaryAddress);
|
|
}
|
|
override void opcode44()
|
|
{
|
|
addrZeropage();
|
|
readVal = readFinal(primaryAddress);
|
|
}
|
|
override void opcode64()
|
|
{
|
|
addrZeropage();
|
|
readVal = readFinal(primaryAddress);
|
|
}
|
|
|
|
override void opcode14()
|
|
{
|
|
addrZeropageX();
|
|
readVal = readFinal(primaryAddress);
|
|
}
|
|
override void opcode34()
|
|
{
|
|
addrZeropageX();
|
|
readVal = readFinal(primaryAddress);
|
|
}
|
|
override void opcode54()
|
|
{
|
|
addrZeropageX();
|
|
readVal = readFinal(primaryAddress);
|
|
}
|
|
override void opcode74()
|
|
{
|
|
addrZeropageX();
|
|
readVal = readFinal(primaryAddress);
|
|
}
|
|
override void opcodeD4()
|
|
{
|
|
addrZeropageX();
|
|
readVal = readFinal(primaryAddress);
|
|
}
|
|
override void opcodeF4()
|
|
{
|
|
addrZeropageX();
|
|
readVal = readFinal(primaryAddress);
|
|
}
|
|
|
|
override void opcodeA3()
|
|
{
|
|
addrIndirectX();
|
|
flag.zero_ = flag.negative_ = (accumulator = xIndex = (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcodeA7()
|
|
{
|
|
addrZeropage();
|
|
flag.zero_ = flag.negative_ = (accumulator = xIndex = (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcodeAF()
|
|
{
|
|
addrAbsolute();
|
|
flag.zero_ = flag.negative_ = (accumulator = xIndex = (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcodeB3()
|
|
{
|
|
addrIndirectY(false);
|
|
flag.zero_ = flag.negative_ = (accumulator = xIndex = (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcodeB7()
|
|
{
|
|
addrZeropageY();
|
|
flag.zero_ = flag.negative_ = (accumulator = xIndex = (readVal = readFinal(primaryAddress)));
|
|
}
|
|
override void opcodeBF()
|
|
{
|
|
addrAbsoluteY(false);
|
|
flag.zero_ = flag.negative_ = (accumulator = xIndex = (readVal = readFinal(primaryAddress)));
|
|
}
|
|
|
|
override void opcode83()
|
|
{
|
|
addrIndirectX();
|
|
writeFinal(primaryAddress, accumulator & xIndex);
|
|
}
|
|
override void opcode87()
|
|
{
|
|
addrZeropage();
|
|
writeFinal(primaryAddress, accumulator & xIndex);
|
|
}
|
|
override void opcode97()
|
|
{
|
|
addrZeropageY();
|
|
writeFinal(primaryAddress, accumulator & xIndex);
|
|
}
|
|
override void opcode8F()
|
|
{
|
|
addrAbsolute();
|
|
writeFinal(primaryAddress, accumulator & xIndex);
|
|
}
|
|
|
|
override void opcode03()
|
|
{
|
|
addrIndirectX();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = shiftLeft(readVal)));
|
|
accumulator |= writeVal;
|
|
}
|
|
override void opcode07()
|
|
{
|
|
addrZeropage();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = shiftLeft(readVal)));
|
|
accumulator |= writeVal;
|
|
}
|
|
override void opcode0F()
|
|
{
|
|
addrAbsolute();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = shiftLeft(readVal)));
|
|
accumulator |= writeVal;
|
|
}
|
|
override void opcode13()
|
|
{
|
|
addrIndirectY(true);
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = shiftLeft(readVal)));
|
|
accumulator |= writeVal;
|
|
}
|
|
override void opcode17()
|
|
{
|
|
addrZeropageX();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = shiftLeft(readVal)));
|
|
accumulator |= writeVal;
|
|
}
|
|
override void opcode1B()
|
|
{
|
|
addrAbsoluteY(true);
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = shiftLeft(readVal)));
|
|
accumulator |= writeVal;
|
|
}
|
|
override void opcode1F()
|
|
{
|
|
addrAbsoluteX(true);
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = shiftLeft(readVal)));
|
|
accumulator |= writeVal;
|
|
}
|
|
|
|
override void opcode23()
|
|
{
|
|
addrIndirectX();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = rotateLeft(readVal)));
|
|
accumulator &= writeVal;
|
|
}
|
|
override void opcode27()
|
|
{
|
|
addrZeropage();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = rotateLeft(readVal)));
|
|
accumulator &= writeVal;
|
|
}
|
|
override void opcode2F()
|
|
{
|
|
addrAbsolute();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = rotateLeft(readVal)));
|
|
accumulator &= writeVal;
|
|
}
|
|
override void opcode33()
|
|
{
|
|
addrIndirectY(true);
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = rotateLeft(readVal)));
|
|
accumulator &= writeVal;
|
|
}
|
|
override void opcode37()
|
|
{
|
|
addrZeropageX();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = rotateLeft(readVal)));
|
|
accumulator &= writeVal;
|
|
}
|
|
override void opcode3B()
|
|
{
|
|
addrAbsoluteY(true);
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = rotateLeft(readVal)));
|
|
accumulator &= writeVal;
|
|
}
|
|
override void opcode3F()
|
|
{
|
|
addrAbsoluteX(true);
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = rotateLeft(readVal)));
|
|
accumulator &= writeVal;
|
|
}
|
|
|
|
override void opcode43()
|
|
{
|
|
addrIndirectX();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = shiftRight(readVal)));
|
|
accumulator ^= writeVal;
|
|
}
|
|
override void opcode47()
|
|
{
|
|
addrZeropage();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = shiftRight(readVal)));
|
|
accumulator ^= writeVal;
|
|
}
|
|
override void opcode4F()
|
|
{
|
|
addrAbsolute();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = shiftRight(readVal)));
|
|
accumulator ^= writeVal;
|
|
}
|
|
override void opcode53()
|
|
{
|
|
addrIndirectY(true);
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = shiftRight(readVal)));
|
|
accumulator ^= writeVal;
|
|
}
|
|
override void opcode57()
|
|
{
|
|
addrZeropageX();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = shiftRight(readVal)));
|
|
accumulator ^= writeVal;
|
|
}
|
|
override void opcode5B()
|
|
{
|
|
addrAbsoluteY(true);
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = shiftRight(readVal)));
|
|
accumulator ^= writeVal;
|
|
}
|
|
override void opcode5F()
|
|
{
|
|
addrAbsoluteX(true);
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = shiftRight(readVal)));
|
|
accumulator ^= writeVal;
|
|
}
|
|
|
|
override void opcodeC3()
|
|
{
|
|
addrIndirectX();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, (writeVal = decrement(readVal)));
|
|
flag.zero_ = flag.negative_ = compare(accumulator, writeVal);
|
|
}
|
|
override void opcodeC7()
|
|
{
|
|
addrZeropage();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, (writeVal = decrement(readVal)));
|
|
flag.zero_ = flag.negative_ = compare(accumulator, writeVal);
|
|
}
|
|
override void opcodeCF()
|
|
{
|
|
addrAbsolute();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, (writeVal = decrement(readVal)));
|
|
flag.zero_ = flag.negative_ = compare(accumulator, writeVal);
|
|
}
|
|
override void opcodeD3()
|
|
{
|
|
addrIndirectY(true);
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, (writeVal = decrement(readVal)));
|
|
flag.zero_ = flag.negative_ = compare(accumulator, writeVal);
|
|
}
|
|
override void opcodeD7()
|
|
{
|
|
addrZeropageX();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, (writeVal = decrement(readVal)));
|
|
flag.zero_ = flag.negative_ = compare(accumulator, writeVal);
|
|
}
|
|
override void opcodeDB()
|
|
{
|
|
addrAbsoluteY(true);
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, (writeVal = decrement(readVal)));
|
|
flag.zero_ = flag.negative_ = compare(accumulator, writeVal);
|
|
}
|
|
override void opcodeDF()
|
|
{
|
|
addrAbsoluteX(true);
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, (writeVal = decrement(readVal)));
|
|
flag.zero_ = flag.negative_ = compare(accumulator, writeVal);
|
|
}
|
|
|
|
override void opcode63()
|
|
{
|
|
addrIndirectX();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = rotateRight(readVal)));
|
|
if (flag.decimal) dec_addWithCarry(writeVal);
|
|
else hex_addWithCarry(writeVal);
|
|
}
|
|
override void opcode67()
|
|
{
|
|
addrZeropage();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = rotateRight(readVal)));
|
|
if (flag.decimal) dec_addWithCarry(writeVal);
|
|
else hex_addWithCarry(writeVal);
|
|
}
|
|
override void opcode6F()
|
|
{
|
|
addrAbsolute();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = rotateRight(readVal)));
|
|
if (flag.decimal) dec_addWithCarry(writeVal);
|
|
else hex_addWithCarry(writeVal);
|
|
}
|
|
override void opcode73()
|
|
{
|
|
addrIndirectY(true);
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = rotateRight(readVal)));
|
|
if (flag.decimal) dec_addWithCarry(writeVal);
|
|
else hex_addWithCarry(writeVal);
|
|
}
|
|
override void opcode77()
|
|
{
|
|
addrZeropageX();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = rotateRight(readVal)));
|
|
if (flag.decimal) dec_addWithCarry(writeVal);
|
|
else hex_addWithCarry(writeVal);
|
|
}
|
|
override void opcode7B()
|
|
{
|
|
addrAbsoluteY(true);
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = rotateRight(readVal)));
|
|
if (flag.decimal) dec_addWithCarry(writeVal);
|
|
else hex_addWithCarry(writeVal);
|
|
}
|
|
override void opcode7F()
|
|
{
|
|
addrAbsoluteX(true);
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = rotateRight(readVal)));
|
|
if (flag.decimal) dec_addWithCarry(writeVal);
|
|
else hex_addWithCarry(writeVal);
|
|
}
|
|
|
|
override void opcodeE3()
|
|
{
|
|
addrIndirectX();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = increment(readVal)));
|
|
if (flag.decimal) dec_subWithCarry(writeVal);
|
|
else hex_subWithCarry(writeVal);
|
|
}
|
|
override void opcodeE7()
|
|
{
|
|
addrZeropage();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = increment(readVal)));
|
|
if (flag.decimal) dec_subWithCarry(writeVal);
|
|
else hex_subWithCarry(writeVal);
|
|
}
|
|
override void opcodeEF()
|
|
{
|
|
addrAbsolute();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = increment(readVal)));
|
|
if (flag.decimal) dec_subWithCarry(writeVal);
|
|
else hex_subWithCarry(writeVal);
|
|
}
|
|
override void opcodeF3()
|
|
{
|
|
addrIndirectY(true);
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = increment(readVal)));
|
|
if (flag.decimal) dec_subWithCarry(writeVal);
|
|
else hex_subWithCarry(writeVal);
|
|
}
|
|
override void opcodeF7()
|
|
{
|
|
addrZeropageX();
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = increment(readVal)));
|
|
if (flag.decimal) dec_subWithCarry(writeVal);
|
|
else hex_subWithCarry(writeVal);
|
|
}
|
|
override void opcodeFB()
|
|
{
|
|
addrAbsoluteY(true);
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = increment(readVal)));
|
|
if (flag.decimal) dec_subWithCarry(writeVal);
|
|
else hex_subWithCarry(writeVal);
|
|
}
|
|
override void opcodeFF()
|
|
{
|
|
addrAbsoluteX(true);
|
|
poke(primaryAddress, (readVal = read(primaryAddress)));
|
|
writeFinal(primaryAddress, flag.zero_ = flag.negative_ = (writeVal = increment(readVal)));
|
|
if (flag.decimal) dec_subWithCarry(writeVal);
|
|
else hex_subWithCarry(writeVal);
|
|
}
|
|
|
|
/* BRK */
|
|
final override void opcode00()
|
|
{
|
|
peek(programCounter);
|
|
++programCounter;
|
|
doInterrupt(IRQ_VECTOR, flag.toByte());
|
|
}
|
|
|
|
/* JSR */
|
|
final override void opcode20()
|
|
{
|
|
ushort finalAddress = (operand1 = read(programCounter++));
|
|
|
|
peek(STACK_BASE + stackPointer);
|
|
pushWord(programCounter);
|
|
|
|
finalAddress |= ((operand2 = read(programCounter)) << 8);
|
|
static if (cumulative) tick(totalCycles);
|
|
programCounter = finalAddress;
|
|
}
|
|
|
|
/* RTI */
|
|
final override void opcode40()
|
|
{
|
|
peek(programCounter);
|
|
flag.fromByte(pull());
|
|
programCounter = readStack() | (readStack() << 8);
|
|
static if (cumulative) tick(totalCycles);
|
|
}
|
|
|
|
/* JMP $$$$ */
|
|
final override void opcode4C()
|
|
{
|
|
programCounter = readWordOperand();
|
|
static if (cumulative) tick(totalCycles);
|
|
}
|
|
|
|
/* RTS */
|
|
final override void opcode60()
|
|
{
|
|
peek(programCounter);
|
|
programCounter = pullWord();
|
|
peek(programCounter);
|
|
static if (cumulative) tick(totalCycles);
|
|
++programCounter;
|
|
}
|
|
|
|
/* JMP ($$$$) */
|
|
override void opcode6C()
|
|
{
|
|
ushort vector = readWordOperand();
|
|
programCounter = readWord(vector,
|
|
(vector & 0xFF00) | cast(ubyte)(vector + 1));
|
|
static if (cumulative) tick(totalCycles);
|
|
}
|
|
/* ANC #$$ */
|
|
override void opcode0B()
|
|
{
|
|
readVal = operand1 = readFinal(programCounter);
|
|
flag.zero_ = flag.negative_ = (accumulator = readVal);
|
|
flag.carry = (flag.negative_ > 0x7F);
|
|
}
|
|
|
|
/* ANC #$$ */
|
|
override void opcode2B()
|
|
{
|
|
readVal = operand1 = readFinal(programCounter);
|
|
flag.zero_ = flag.negative_ = (accumulator = readVal);
|
|
flag.carry = (flag.negative_ > 0x7F);
|
|
}
|
|
|
|
/* ALR #$$ */
|
|
override void opcode4B()
|
|
{
|
|
readVal = operand1 = readFinal(programCounter);
|
|
flag.zero_ = flag.negative_ =
|
|
(accumulator = shiftRight(accumulator & readVal));
|
|
}
|
|
|
|
/* ARR #$$ */
|
|
override void opcode6B()
|
|
{
|
|
readVal = operand1 = readFinal(programCounter);
|
|
ubyte val = readVal & accumulator;
|
|
if (flag.decimal) {
|
|
ubyte temp = cast(ubyte)((val >> 1) + (flag.carry ? 0x80 : 0));
|
|
flag.zero_ = flag.negative_ = temp;
|
|
flag.overflow = (((temp ^ val) & 0x40) != 0);
|
|
if ((readVal & 0x0F) + (val & 0x01) > 5)
|
|
temp = (temp & 0xF0) + ((temp + 0x6) & 0x0F);
|
|
if (val + (val & 0x10) >= 0x60)
|
|
{
|
|
temp += 0x60;
|
|
flag.carry = true;
|
|
}
|
|
else
|
|
flag.carry = false;
|
|
accumulator = temp;
|
|
}
|
|
else {
|
|
accumulator = cast(ubyte)((val >> 1) + (flag.carry ? 0x80 : 0));
|
|
flag.zero_ = flag.negative_ = accumulator;
|
|
val >>= 7;
|
|
flag.carry = (val != 0);
|
|
flag.overflow = ((val ^ ((accumulator >> 5) & 1)) != 0);
|
|
}
|
|
}
|
|
|
|
/* ANE #$$ */
|
|
override void opcode8B()
|
|
{
|
|
// unstable
|
|
readVal = operand1 = readFinal(programCounter++);
|
|
|
|
version(Atari8Bit)
|
|
{
|
|
flag.zero_ = flag.negative_ =
|
|
(accumulator & xIndex & readVal);
|
|
accumulator &= xIndex & (operand1 | 0xEF);
|
|
}
|
|
else
|
|
{
|
|
flag.zero_ = flag.negative_ =
|
|
(accumulator &= (xIndex & readVal));
|
|
}
|
|
}
|
|
|
|
/* SHA ($$),Y */
|
|
void opcode93()
|
|
{
|
|
addrIndirectY(true);
|
|
strange(accumulator & xIndex);
|
|
}
|
|
|
|
/* SHA $$$$,Y */
|
|
void opcode9F()
|
|
{
|
|
addrAbsoluteY(true);
|
|
strange(accumulator & xIndex);
|
|
}
|
|
|
|
/* SHS $$$$,Y */
|
|
void opcode9B()
|
|
{
|
|
addrAbsoluteY(true);
|
|
strange(stackPointer = (accumulator & xIndex));
|
|
}
|
|
|
|
/* SHY $$$$,X */
|
|
void opcode9C()
|
|
{
|
|
addrAbsoluteX(true);
|
|
strange(yIndex);
|
|
}
|
|
|
|
/* SHX $$$$,Y */
|
|
void opcode9E()
|
|
{
|
|
addrAbsoluteY(true);
|
|
strange(xIndex);
|
|
}
|
|
|
|
/* LAX #$$ */
|
|
override void opcodeAB()
|
|
{
|
|
readVal = operand1 = readFinal(programCounter);
|
|
|
|
version(Commodore128)
|
|
{
|
|
// not unstable?
|
|
flag.zero_ = flag.negative_ =
|
|
(accumulator = readVal);
|
|
}
|
|
else
|
|
{
|
|
// unstable
|
|
version(Commodore64)
|
|
{
|
|
accumulator |= 0xEE;
|
|
}
|
|
flag.zero_ = flag.negative_ =
|
|
(accumulator &= readVal);
|
|
}
|
|
xIndex = accumulator;
|
|
}
|
|
|
|
/* LAS $$$$,Y */
|
|
override void opcodeBB()
|
|
{
|
|
addrAbsoluteY(false);
|
|
readVal = readFinal(primaryAddress);
|
|
|
|
flag.zero_ = flag.negative_ =
|
|
(xIndex = accumulator = (stackPointer & readVal));
|
|
}
|
|
|
|
/* SBX #$$ */
|
|
override void opcodeCB()
|
|
{
|
|
readVal = operand1 = readFinal(programCounter++);
|
|
xIndex &= accumulator;
|
|
flag.zero_ = flag.negative_ = compare(xIndex, readVal);
|
|
}
|
|
|
|
/* SBC #$$ */
|
|
override void opcodeEB()
|
|
{
|
|
readVal = operand1 = readFinal(programCounter++);
|
|
if (flag.decimal) dec_subWithCarry(readVal);
|
|
else hex_subWithCarry(readVal);
|
|
}
|