Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Ricoh2A03 = function () {}
- Ricoh2A03.prototype.newCartridgeInstance = function () {
- this.startup();
- this.initializeMemoryJumps();
- }
- Ricoh2A03.prototype.startup = function () {
- //CPU Registers:
- this.programCounter = 0; //Program Counter (The current address of the executing instruction.)
- this.stackPointer = 0xFF; //Stack Pointer (We take care of the 0x100 paging.)
- this.accumulator = 0; //The accumulator (The variable on the CPU that's used as the main target for math operations.)
- this.registerX = 0; //Index register X (Used as an offset to some operations.)
- this.registerY = 0; //Index register Y (Used as an offset to some operations.)
- //Program Status Register Flags:
- this.FlagNegative = false; //Was bit 7 of the last number worked on set?
- this.FlagOverflow = false; //Did bit 6 of the last number worked on carry over to bit 7?
- this.FlagBRK = false; //Was the BRK instruction executed?
- this.FlagDecimal = 0x20; //Unused decimal flag bit + bit 5.
- this.FlagIRQ = false; //Are IRQs disabled?
- this.FlagZero = false; //Was the last number worked on equal to 0?
- this.FlagCarry = false; //Did bit 7 overflow or bit 0 underflow in the last number worked on?
- //memory arrays:
- this.memory = this.getUInt8Array(0x800, 0);
- }
- Ricoh2A03.prototype.hardwareReset = function () {
- //CPU Registers:
- this.programCounter = 0; //Program Counter (The current address of the executing instruction.)
- this.stackPointer = 0xFF; //Stack Pointer (We take care of the 0x100 paging.)
- this.accumulator = 0; //The accumulator (The variable on the CPU that's used as the main target for math operations.)
- this.registerX = 0; //Index register X (Used as an offset to some operations.)
- this.registerY = 0; //Index register Y (Used as an offset to some operations.)
- //Program Status Register Flags:
- this.FlagNegative = false; //Was bit 7 of the last number worked on set?
- this.FlagOverflow = false; //Did bit 6 of the last number worked on carry over to bit 7?
- this.FlagBRK = false; //Was the BRK instruction executed?
- this.FlagDecimal = 0x20; //Unused decimal flag bit + bit 5.
- this.FlagIRQ = false; //Are IRQs disabled?
- this.FlagZero = false; //Was the last number worked on equal to 0?
- this.FlagCarry = false; //Did bit 7 overflow or bit 0 underflow in the last number worked on?
- //memory arrays:
- this.memory = this.getUInt8Array(0x800, 0);
- }
- Ricoh2A03.prototype.initializeMemoryJumps() = function () {
- //memory jump arrays:
- this.memoryWriter = [];
- this.memoryReader = [];
- this.writePPU = [];
- this.memoryWriteCompiler();
- }
- Ricoh2A03.prototype.OPCODES = [
- //BRK impl:
- //0x00:
- function (parentObj) {
- parentObj.memory[0x100 | parentObj.stackPointer] = parentObj.programCounter >> 8;
- parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFF;
- parentObj.memory[0x100 | parentObj.stackPointer] = parentObj.programCounter & 0xFF;
- parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFF;
- parentObj.programCounter = (parentObj.memoryReader[0xFFFE](parentObj, 0xFFFE) << 8) | parentObj.memoryReader[0xFFFF](parentObj, 0xFFFF);
- parentObj.FlagBRK = true;
- parentObj.CPUTicks += 7;
- },
- //ORA (Indirect, X):
- //0x01:
- function (parentObj) {
- var address = (parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) + parentObj.registerX) & 0xFF;
- address = (0x100 + (address * 0x101)) & 0xFFFF;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.accumulator |= parentObj.memoryReader[address](parentObj, address);
- parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
- parentObj.FlagZero = (parentObj.accumulator == 0);
- parentObj.CPUTicks += 6;
- },
- //KIL:
- //0x02:
- function (parentObj) {
- parentObj.opcodeKILCalled(0x02);
- },
- //SLO (Indirect, X):
- //0x03:
- function (parentObj) {
- //TODO
- throw(new Error("Unimplemented opcode #0x03 executed."));
- parentObj.CPUTicks += 8;
- },
- //DOP Zero Page:
- //#0x04:
- function (parentObj) {
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += 3;
- },
- //ASL Zero Page:
- //0x06:
- function (parentObj) {
- var address = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- var temp_var = parentObj.memory[address];
- parentObj.FlagCarry = (temp_var > 0x7F);
- parentObj.memory[address] = temp_var = (temp_var << 1) & 0xFF;
- parentObj.FlagNegative = (temp_var > 0x7F);
- parentObj.FlagZero = (temp_var == 0);
- parentObj.CPUTicks += 5;
- },
- //PHP:
- //0x08:
- function (parentObj) {
- parentObj.memory[0x100 | parentObj.stackPointer] = ((parentObj.FlagNegative) ? 0x80: 0) | ((parentObj.FlagOverflow) ? 0x40: 0) | ((parentObj.FlagBRK) ? 0x10: 0) | parentObj.FlagDecimal | ((parentObj.FlagIRQ) ? 0x04: 0) | ((parentObj.FlagZero) ? 0x02: 0) | ((parentObj.FlagCarry) ? 0x01: 0);
- parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFF;
- parentObj.CPUTicks += 3;
- },
- //ASL Accumulator:
- //0x0A:
- function (parentObj) {
- parentObj.FlagCarry = (parentObj.accumulator > 0x7F);
- parentObj.accumulator = (parentObj.accumulator << 1) & 0xFF;
- parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
- parentObj.FlagZero = (parentObj.accumulator == 0);
- parentObj.CPUTicks += 2;
- },
- //BPL:
- //0x10:
- function (parentObj) {
- if (!parentObj.FlagNegative) {
- parentObj.programCounter = (parentObj.programCounter + ((parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 24) >> 24) + 1) & 0xFFFF;
- parentObj.CPUTicks += ((temp_var ^ parentObj.programCounter) > 0xFF) ? 4 : 3;
- }
- else {
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += 2;
- }
- },
- //KIL:
- //0x12:
- function (parentObj) {
- parentObj.opcodeKILCalled(0x12);
- },
- //DOP Zero Page, X:
- //#0x14:
- function (parentObj) {
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += 4;
- },
- //CLC:
- //0x18:
- function (parentObj) {
- parentObj.FlagCarry = false;
- parentObj.CPUTicks += 2;
- },
- //JSR:
- //0x20:
- function (parentObj) {
- var temp_var = (parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.memory[0x100 | parentObj.stackPointer] = parentObj.programCounter >> 8;
- parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFF;
- parentObj.memory[0x100 | parentObj.stackPointer] = parentObj.programCounter & 0xFF;
- parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFF;
- parentObj.programCounter = temp_var;
- parentObj.CPUTicks += 6;
- },
- //AND (Indirect, X):
- //0x21:
- function (parentObj) {
- var address = (parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) + parentObj.registerX) & 0xFF;
- address = (0x100 + (address * 0x101)) & 0xFFFF;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.accumulator &= parentObj.memoryReader[address](parentObj, address);
- parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
- parentObj.FlagZero = (parentObj.accumulator == 0);
- parentObj.CPUTicks += 6;
- },
- //KIL:
- //0x22:
- function (parentObj) {
- parentObj.opcodeKILCalled(0x22);
- },
- //BIT Zero Page:
- //0x24:
- function (parentObj) {
- parentObj.accumulator &= parentObj.memory[parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter)];
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.FlagZero = (parentObj.accumulator == 0);
- parentObj.FlagOverflow = ((parentObj.accumulator & 0x40) == 0x40);
- parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
- parentObj.CPUTicks += 3;
- },
- //AND Zero Page:
- //0x25:
- function (parentObj) {
- parentObj.accumulator &= parentObj.memory[parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter)];
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
- parentObj.FlagZero = (parentObj.accumulator == 0);
- parentObj.CPUTicks += 3;
- },
- //PLP:
- //0x28:
- function (parentObj) {
- parentObj.stackPointer = (parentObj.stackPointer + 1) & 0xFF;
- var status = parentObj.memory[0x100 | parentObj.stackPointer];
- parentObj.FlagNegative = (status > 0x7F);
- parentObj.FlagOverflow = ((status & 0x40) == 0x40);
- parentObj.FlagBRK = ((status & 0x10) == 0x10);
- parentObj.FlagDecimal = ((status & 0x08) == 0x08) ? 0x28 : 0x20;
- parentObj.FlagIRQ = ((status & 0x04) == 0x04);
- parentObj.FlagZero = ((status & 0x02) == 0x02);
- parentObj.FlagCarry = ((status & 0x01) == 0x01);
- parentObj.CPUTicks += 4;
- },
- //AND Immediate:
- //0x29:
- function (parentObj) {
- parentObj.accumulator &= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
- parentObj.FlagZero = (parentObj.accumulator == 0);
- parentObj.CPUTicks += 2;
- },
- //BIT Absolute:
- //0x2C:
- function (parentObj) {
- parentObj.accumulator &= (parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
- parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
- parentObj.FlagZero = (parentObj.accumulator == 0);
- parentObj.FlagOverflow = ((parentObj.accumulator & 0x40) == 0x40);
- parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
- parentObj.CPUTicks += 4;
- },
- //AND Absolute:
- //0x2D:
- function (parentObj) {
- var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.accumulator &= parentObj.memoryReader[temp_var](parentObj, temp_var);
- parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
- parentObj.FlagZero = (parentObj.accumulator == 0);
- parentObj.CPUTicks += 2;
- },
- //BMI:
- //0x30:
- function (parentObj) {
- if (parentObj.FlagNegative) {
- parentObj.programCounter = (parentObj.programCounter + ((parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 24) >> 24) + 1) & 0xFFFF;
- parentObj.CPUTicks += ((temp_var ^ parentObj.programCounter) > 0xFF) ? 4 : 3;
- }
- else {
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += 2;
- }
- },
- //AND (Indirect), Y:
- //0x31:
- function (parentObj) {
- var address = (0x100 + (parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) * 0x101)) & 0xFFFF;
- var address2 = (address + parentObj.registerY) & 0xFFFF;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.accumulator &= parentObj.memoryReader[address2](parentObj, address2);
- parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
- parentObj.FlagZero = (parentObj.accumulator == 0);
- parentObj.CPUTicks += ((address ^ address2) > 0xFF) ? 6 : 5;
- },
- //KIL:
- //0x32:
- function (parentObj) {
- parentObj.opcodeKILCalled(0x32);
- },
- //DOP Zero Page, X:
- //#0x34:
- function (parentObj) {
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += 4;
- },
- //AND Zero Page, X:
- //0x35:
- function (parentObj) {
- parentObj.accumulator &= parentObj.memory[(parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) + parentObj.registerX) & 0xFF];
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
- parentObj.FlagZero = (parentObj.accumulator == 0);
- parentObj.CPUTicks += 4;
- },
- //SEC:
- //0x38:
- function (parentObj) {
- parentObj.FlagCarry = true;
- parentObj.CPUTicks += 2;
- },
- //AND Absolute, Y:
- //0x39:
- function (parentObj) {
- var address = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- address |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += (((address & 0xFF) + parentObj.registerY) > 0xFF) ? 5 : 4;
- address = (address + parentObj.registerY) & 0xFFFF;
- parentObj.accumulator &= parentObj.memoryReader[address](parentObj, address);
- parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
- parentObj.FlagZero = (parentObj.accumulator == 0);
- },
- //AND Absolute, X:
- //0x3D:
- function (parentObj) {
- var address = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- address |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += (((address & 0xFF) + parentObj.registerX) > 0xFF) ? 5 : 4;
- address = (address + parentObj.registerX) & 0xFFFF;
- parentObj.accumulator &= parentObj.memoryReader[address](parentObj, address);
- parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
- parentObj.FlagZero = (parentObj.accumulator == 0);
- },
- //RTI:
- //0x40:
- function (parentObj) {
- parentObj.stackPointer = (parentObj.stackPointer + 1) & 0xFF;
- var status = parentObj.memory[0x100 | parentObj.stackPointer];
- parentObj.FlagNegative = (status > 0x7F);
- parentObj.FlagOverflow = ((status & 0x40) == 0x40);
- parentObj.FlagBRK = ((status & 0x10) == 0x10);
- parentObj.FlagDecimal = ((status & 0x08) == 0x08) ? 0x28 : 0x20;
- parentObj.FlagIRQ = ((status & 0x04) == 0x04);
- parentObj.FlagZero = ((status & 0x02) == 0x02);
- parentObj.FlagCarry = ((status & 0x01) == 0x01);
- parentObj.stackPointer = (parentObj.stackPointer + 1) & 0xFF;
- parentObj.programCounter = parentObj.memory[0x100 | parentObj.stackPointer];
- parentObj.stackPointer = (parentObj.stackPointer + 1) & 0xFF;
- parentObj.programCounter |= parentObj.memory[0x100 | parentObj.stackPointer] << 8;
- parentObj.CPUTicks += 6;
- },
- //KIL:
- //0x42:
- function (parentObj) {
- parentObj.opcodeKILCalled(0x42);
- },
- //DOP Zero Page:
- //#0x44:
- function (parentObj) {
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += 3;
- },
- //LSR Zero Page:
- //0x46:
- function (parentObj) {
- var address = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- var temp_var = parentObj.memory[address];
- parentObj.memory[address] = temp_var >> 1;
- parentObj.FlagCarry = ((temp_var & 0x01) == 0x01);
- parentObj.FlagZero = (temp_var < 2);
- parentObj.FlagNegative = false;
- parentObj.CPUTicks += 5;
- },
- //PHA
- //0x48:
- function (parentObj) {
- parentObj.memory[0x100 | parentObj.stackPointer] = parentObj.accumulator;
- parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFF;
- parentObj.CPUTicks += 3;
- },
- //LSR Accumulator:
- //0x4A:
- function (parentObj) {
- parentObj.FlagCarry = ((parentObj.accumulator & 0x01) == 0x01);
- parentObj.accumulator >>= 1;
- parentObj.FlagZero = (parentObj.accumulator == 0);
- parentObj.FlagNegative = false;
- parentObj.CPUTicks += 2;
- },
- //JMP Absolute:
- //0x4C:
- function (parentObj) {
- parentObj.programCounter = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) | (parentObj.memoryRead(parentObj, (parentObj.programCounter + 1) & 0xFFFF) << 8);
- parentObj.CPUTicks += 3;
- },
- //LSR Absolute:
- //0x4E:
- function (parentObj) {
- var address = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- address |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- var temp_var = parentObj.memoryReader[address](parentObj, address);
- parentObj.memoryWriter[address](parentObj, address, temp_var >> 1);
- parentObj.FlagCarry = ((temp_var & 0x01) == 0x01);
- parentObj.FlagZero = (temp_var < 2);
- parentObj.FlagNegative = false;
- parentObj.CPUTicks += 6;
- },
- //BVC:
- //0x50:
- function (parentObj) {
- if (!parentObj.FlagOverflow) {
- parentObj.programCounter = (parentObj.programCounter + ((parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 24) >> 24) + 1) & 0xFFFF;
- parentObj.CPUTicks += ((temp_var ^ parentObj.programCounter) > 0xFF) ? 4 : 3;
- }
- else {
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += 2;
- }
- },
- //KIL:
- //0x52:
- function (parentObj) {
- parentObj.opcodeKILCalled(0x52);
- },
- //DOP Zero Page, X:
- //#0x54:
- function (parentObj) {
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += 4;
- },
- //LSR Zero Page, X:
- //0x56:
- function (parentObj) {
- var address = (parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) + parentObj.registerX) & 0xFF;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- var temp_var = parentObj.memory[address];
- parentObj.memory[address] = temp_var >> 1;
- parentObj.FlagCarry = ((temp_var & 0x01) == 0x01);
- parentObj.FlagZero = (temp_var < 2);
- parentObj.FlagNegative = false;
- parentObj.CPUTicks += 6;
- },
- //CLI:
- //0x58:
- function (parentObj) {
- parentObj.FlagIRQ = false;
- parentObj.CPUTicks += 2;
- },
- //LSR Absolute, X:
- //0x5E:
- function (parentObj) {
- var address = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- address |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- address = (address + parentObj.registerX) & 0xFFFF;
- var temp_var = parentObj.memoryReader[address](parentObj, address);
- parentObj.memoryWriter[address](parentObj, address, temp_var >> 1);
- parentObj.FlagCarry = ((temp_var & 0x01) == 0x01);
- parentObj.FlagZero = (temp_var < 2);
- parentObj.FlagNegative = false;
- parentObj.CPUTicks += 7;
- },
- //RTS:
- //0x60:
- function (parentObj) {
- parentObj.stackPointer = (parentObj.stackPointer + 1) & 0xFF;
- parentObj.programCounter = parentObj.memory[0x100 | parentObj.stackPointer];
- parentObj.stackPointer = (parentObj.stackPointer + 1) & 0xFF;
- parentObj.programCounter |= parentObj.memory[0x100 | parentObj.stackPointer] << 8;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += 6;
- },
- //ADC (Indirect, X):
- //0x61:
- function (parentObj) {
- var address = (parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) + parentObj.registerX) & 0xFF;
- address = (0x100 + (address * 0x101)) & 0xFFFF;
- var temp_var = parentObj.accumulator + parentObj.memoryReader[address](parentObj, address) + ((parentObj.FlagCarry) ? 1 : 0);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.FlagCarry = (temp_var > 0xFF);
- parentObj.FlagOverflow = (((temp_var ^ parentObj.accumulator) & 0x80) == 0x80);
- parentObj.accumulator = temp_var & 0xFF;
- parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
- parentObj.FlagZero = (parentObj.accumulator == 0);
- parentObj.CPUTicks += 6;
- },
- //KIL:
- //0x62:
- function (parentObj) {
- parentObj.opcodeKILCalled(0x62);
- },
- //DOP Zero Page:
- //#0x64:
- function (parentObj) {
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += 3;
- },
- //ADC Zero Page:
- //0x65:
- function (parentObj) {
- var temp_var = parentObj.accumulator + parentObj.memory[parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter)] + ((parentObj.FlagCarry) ? 1 : 0);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.FlagCarry = (temp_var > 0xFF);
- parentObj.FlagOverflow = (((temp_var ^ parentObj.accumulator) & 0x80) == 0x80);
- parentObj.accumulator = temp_var & 0xFF;
- parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
- parentObj.FlagZero = (parentObj.accumulator == 0);
- parentObj.CPUTicks += 3;
- },
- //PLA
- //0x68:
- function (parentObj) {
- parentObj.stackPointer = (parentObj.stackPointer + 1) & 0xFF;
- parentObj.accumulator = parentObj.memory[0x100 | parentObj.stackPointer];
- parentObj.FlagZero = (parentObj.accumulator == 0);
- parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
- parentObj.CPUTicks += 4;
- },
- //ADC Immediate:
- //0x69:
- function (parentObj) {
- var temp_var = parentObj.accumulator + parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) + ((parentObj.FlagCarry) ? 1 : 0);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.FlagCarry = (temp_var > 0xFF);
- parentObj.FlagOverflow = (((temp_var ^ parentObj.accumulator) & 0x80) == 0x80);
- parentObj.accumulator = temp_var & 0xFF;
- parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
- parentObj.FlagZero = (parentObj.accumulator == 0);
- parentObj.CPUTicks += 2;
- },
- //ADC Absolute:
- //0x6D:
- function (parentObj) {
- var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- temp_var = parentObj.accumulator + parentObj.memoryReader[temp_var](parentObj, temp_var) + ((parentObj.FlagCarry) ? 1 : 0);
- parentObj.FlagCarry = (temp_var > 0xFF);
- parentObj.FlagOverflow = (((temp_var ^ parentObj.accumulator) & 0x80) == 0x80);
- parentObj.accumulator = temp_var & 0xFF;
- parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
- parentObj.FlagZero = (parentObj.accumulator == 0);
- parentObj.CPUTicks += 4;
- },
- //BVS:
- //0x70:
- function (parentObj) {
- if (parentObj.FlagOverflow) {
- parentObj.programCounter = (parentObj.programCounter + ((parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 24) >> 24) + 1) & 0xFFFF;
- parentObj.CPUTicks += ((temp_var ^ parentObj.programCounter) > 0xFF) ? 4 : 3;
- }
- else {
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += 2;
- }
- },
- //ADC (Indirect), Y:
- //0x71:
- function (parentObj) {
- var address = (0x100 + (parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) * 0x101)) & 0xFFFF;
- var address2 = (address + parentObj.registerY) & 0xFFFF;
- var temp_var = parentObj.accumulator + parentObj.memoryReader[address2](parentObj, address2) + ((parentObj.FlagCarry) ? 1 : 0);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.FlagCarry = (temp_var > 0xFF);
- parentObj.FlagOverflow = (((temp_var ^ parentObj.accumulator) & 0x80) == 0x80);
- parentObj.accumulator = temp_var & 0xFF;
- parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
- parentObj.FlagZero = (parentObj.accumulator == 0);
- parentObj.CPUTicks += ((address ^ address2) > 0xFF) ? 6 : 5;
- },
- //KIL:
- //0x72:
- function (parentObj) {
- parentObj.opcodeKILCalled(0x72);
- },
- //DOP Zero Page, X:
- //#0x74:
- function (parentObj) {
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += 4;
- },
- //ADC Zero Page, X:
- //0x75:
- function (parentObj) {
- var temp_var = parentObj.accumulator + parentObj.memory[(parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) + parentObj.registerX) & 0xFF] + ((parentObj.FlagCarry) ? 1 : 0);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.FlagCarry = (temp_var > 0xFF);
- parentObj.FlagOverflow = (((temp_var ^ parentObj.accumulator) & 0x80) == 0x80);
- parentObj.accumulator = temp_var & 0xFF;
- parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
- parentObj.FlagZero = (parentObj.accumulator == 0);
- parentObj.CPUTicks += 4;
- },
- //SEI:
- //0x78:
- function (parentObj) {
- parentObj.FlagIRQ = true;
- parentObj.CPUTicks += 2;
- },
- //ADC Absolute, Y:
- //0x79:
- function (parentObj) {
- var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += (((temp_var & 0xFF) + parentObj.registerY) > 0xFF) ? 5 : 4;
- temp_var = parentObj.accumulator + parentObj.memoryRead((temp_var + parentObj.registerY) & 0xFFFF) + ((parentObj.FlagCarry) ? 1 : 0);
- parentObj.FlagCarry = (temp_var > 0xFF);
- parentObj.FlagOverflow = (((temp_var ^ parentObj.accumulator) & 0x80) == 0x80);
- parentObj.accumulator = temp_var & 0xFF;
- parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
- parentObj.FlagZero = (parentObj.accumulator == 0);
- },
- //ADC Absolute, X:
- //0x7D:
- function (parentObj) {
- var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += (((temp_var & 0xFF) + parentObj.registerX) > 0xFF) ? 5 : 4;
- temp_var = parentObj.accumulator + parentObj.memoryRead((temp_var + parentObj.registerX) & 0xFFFF) + ((parentObj.FlagCarry) ? 1 : 0);
- parentObj.FlagCarry = (temp_var > 0xFF);
- parentObj.FlagOverflow = (((temp_var ^ parentObj.accumulator) & 0x80) == 0x80);
- parentObj.accumulator = temp_var & 0xFF;
- parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
- parentObj.FlagZero = (parentObj.accumulator == 0);
- },
- //DOP Immediate:
- //#0x80:
- function (parentObj) {
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += 2;
- },
- //STA (Indirect, X):
- //0x81:
- function (parentObj) {
- var address = (parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) + parentObj.registerX) & 0xFF;
- address = (0x100 + (address * 0x101)) & 0xFFFF;
- parentObj.memoryWriter[address](parentObj, address, parentObj.accumulator);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += 6;
- },
- //DOP Immediate:
- //#0x82:
- function (parentObj) {
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += 2;
- },
- //STY Zero Page:
- //0x84:
- function (parentObj) {
- parentObj.memory[parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter)] = parentObj.registerY;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += 3;
- },
- //STA Zero Page:
- //0x85:
- function (parentObj) {
- parentObj.memory[parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter)] = parentObj.accumulator;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += 3;
- },
- //STX Zero Page:
- //0x86:
- function (parentObj) {
- parentObj.memory[parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter)] = parentObj.registerX;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += 3;
- },
- //DEY:
- //0x88:
- function (parentObj) {
- parentObj.registerY = (parentObj.registerY - 1) & 0xFF;
- parentObj.FlagNegative = (parentObj.registerY > 0x7F);
- parentObj.FlagZero = (parentObj.registerY == 0);
- parentObj.CPUTicks += 2;
- },
- //DOP Immediate:
- //#0x89:
- function (parentObj) {
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += 2;
- },
- //TXA:
- //0x8A:
- function (parentObj) {
- parentObj.accumulator = parentObj.registerX;
- parentObj.FlagZero = (parentObj.accumulator == 0);
- parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
- parentObj.CPUTicks += 2;
- },
- //STY Absolute:
- //0x8C:
- function (parentObj) {
- var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.memoryWriter[temp_var](parentObj, temp_var, parentObj.registerY);
- parentObj.CPUTicks += 4;
- },
- //STA Absolute:
- //0x8D:
- function (parentObj) {
- var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.memoryWriter[temp_var](parentObj, temp_var, parentObj.accumulator);
- parentObj.CPUTicks += 4;
- },
- //STX Absolute:
- //0x8E:
- function (parentObj) {
- var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.memoryWriter[temp_var](parentObj, temp_var, parentObj.registerX);
- parentObj.CPUTicks += 4;
- },
- //BCC:
- //0x90:
- function (parentObj) {
- if (!parentObj.FlagCarry) {
- parentObj.programCounter = (parentObj.programCounter + ((parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 24) >> 24) + 1) & 0xFFFF;
- parentObj.CPUTicks += ((temp_var ^ parentObj.programCounter) > 0xFF) ? 4 : 3;
- }
- else {
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += 2;
- }
- },
- //STA (Indirect), Y:
- //0x91:
- function (parentObj) {
- var address = (0x100 + (parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) * 0x101)) & 0xFFFF;
- var address2 = (address + parentObj.registerY) & 0xFFFF;
- parentObj.memoryWriter[address2](parentObj, address2, parentObj.accumulator);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += ((address ^ address2) > 0xFF) ? 6 : 5;
- },
- //KIL:
- //0x92:
- function (parentObj) {
- parentObj.opcodeKILCalled(0x92);
- },
- //STY Zero Page, X:
- //0x94:
- function (parentObj) {
- parentObj.memory[(parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) + parentObj.registerX) & 0xFF] = parentObj.registerY;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += 4;
- },
- //STA Zero Page, X:
- //0x95:
- function (parentObj) {
- parentObj.memory[(parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) + parentObj.registerX) & 0xFF] = parentObj.accumulator;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += 4;
- },
- //STX Zero Page, Y:
- //0x96:
- function (parentObj) {
- parentObj.memory[(parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) + parentObj.registerY) & 0xFF] = parentObj.registerX;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += 4;
- },
- //TYA:
- //0x98:
- function (parentObj) {
- parentObj.accumulator = parentObj.registerY;
- parentObj.FlagZero = (parentObj.accumulator == 0);
- parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
- parentObj.CPUTicks += 2;
- },
- //STA Absolute, Y:
- //0x99:
- function (parentObj) {
- var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.registerY = parentObj.memoryWrite((temp_var + parentObj.registerY) & 0xFFFF, parentObj.accumulator);
- parentObj.CPUTicks += (((temp_var & 0xFF) + parentObj.registerY) > 0xFF) ? 5 : 4;
- },
- //TXS:
- //0x9A:
- function (parentObj) {
- parentObj.stackPointer = parentObj.registerX;
- parentObj.CPUTicks += 2;
- },
- //STA Absolute, X:
- //0x9D:
- function (parentObj) {
- var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.registerY = parentObj.memoryWrite((temp_var + parentObj.registerX) & 0xFFFF, parentObj.accumulator);
- parentObj.CPUTicks += (((temp_var & 0xFF) + parentObj.registerX) > 0xFF) ? 5 : 4;
- },
- //LDY Immediate:
- //0xA0:
- function (parentObj) {
- parentObj.registerY = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.FlagNegative = (parentObj.registerY > 0x7F);
- parentObj.FlagZero = (parentObj.registerY == 0);
- parentObj.CPUTicks += 2;
- },
- //LDA (Indirect, X):
- //0xA1:
- function (parentObj) {
- var address = (parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) + parentObj.registerX) & 0xFF;
- address = (0x100 + (address * 0x101)) & 0xFFFF;
- parentObj.accumulator = parentObj.memoryReader[address](parentObj, address);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
- parentObj.FlagZero = (parentObj.accumulator == 0);
- parentObj.CPUTicks += 6;
- },
- //LDX Immediate:
- //0xA2:
- function (parentObj) {
- parentObj.registerX = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.FlagNegative = (parentObj.registerX > 0x7F);
- parentObj.FlagZero = (parentObj.registerX == 0);
- parentObj.CPUTicks += 2;
- },
- //LDY Zero Page:
- //0xA4:
- function (parentObj) {
- parentObj.registerY = parentObj.memory[parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter)];
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.FlagNegative = (parentObj.registerY > 0x7F);
- parentObj.FlagZero = (parentObj.registerY == 0);
- parentObj.CPUTicks += 3;
- },
- //LDA Zero Page:
- //0xA5:
- function (parentObj) {
- parentObj.accumulator = parentObj.memory[parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter)];
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
- parentObj.FlagZero = (parentObj.accumulator == 0);
- parentObj.CPUTicks += 3;
- },
- //LDX Zero Page:
- //0xA6:
- function (parentObj) {
- parentObj.registerX = parentObj.memory[parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter)];
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.FlagNegative = (parentObj.registerX > 0x7F);
- parentObj.FlagZero = (parentObj.registerX == 0);
- parentObj.CPUTicks += 3;
- },
- //TAY:
- //0xA8:
- function (parentObj) {
- parentObj.registerY = parentObj.accumulator;
- parentObj.FlagZero = (parentObj.registerY == 0);
- parentObj.FlagNegative = (parentObj.registerY > 0x7F);
- parentObj.CPUTicks += 2;
- },
- //LDA Immediate:
- //0xA9:
- function (parentObj) {
- parentObj.accumulator = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
- parentObj.FlagZero = (parentObj.accumulator == 0);
- parentObj.CPUTicks += 2;
- },
- //TAX:
- //0xAA:
- function (parentObj) {
- parentObj.registerX = parentObj.accumulator;
- parentObj.FlagZero = (parentObj.registerX == 0);
- parentObj.FlagNegative = (parentObj.registerX > 0x7F);
- parentObj.CPUTicks += 2;
- },
- //LDY Absolute:
- //0xAC:
- function (parentObj) {
- var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.registerY = parentObj.memoryReader[temp_var](parentObj, temp_var);
- parentObj.FlagNegative = (parentObj.registerY > 0x7F);
- parentObj.FlagZero = (parentObj.registerY == 0);
- parentObj.CPUTicks += 4;
- },
- //LDA Absolute:
- //0xAD:
- function (parentObj) {
- var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.accumulator = parentObj.memoryRead(temp_var);
- parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
- parentObj.FlagZero = (parentObj.accumulator == 0);
- parentObj.CPUTicks += 4;
- },
- //LDX Absolute:
- //0xAE:
- function (parentObj) {
- var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.registerX = parentObj.memoryRead(temp_var);
- parentObj.FlagNegative = (parentObj.registerX > 0x7F);
- parentObj.FlagZero = (parentObj.registerX == 0);
- parentObj.CPUTicks += 4;
- },
- //LAX Absolute (Undocumented LDA + LDX Absolute in one):
- //0xAF:
- function (parentObj) {
- var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.registerX = parentObj.accumulator = parentObj.memoryRead(temp_var);
- parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
- parentObj.FlagZero = (parentObj.accumulator == 0);
- parentObj.CPUTicks += 4;
- },
- //BCS:
- //0xB0:
- function (parentObj) {
- if (parentObj.FlagCarry) {
- parentObj.programCounter = (parentObj.programCounter + ((parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 24) >> 24) + 1) & 0xFFFF;
- parentObj.CPUTicks += ((temp_var ^ parentObj.programCounter) > 0xFF) ? 4 : 3;
- }
- else {
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += 2;
- }
- },
- //LDA (Indirect), Y:
- //0xB1:
- function (parentObj) {
- var address = (0x100 + (parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) * 0x101)) & 0xFFFF;
- var address2 = (address + parentObj.registerY) & 0xFFFF;
- var temp_var = parentObj.memoryReader[address2](parentObj, address2);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.accumulator = temp_var;
- parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
- parentObj.FlagZero = (parentObj.accumulator == 0);
- parentObj.CPUTicks += ((address ^ address2) > 0xFF) ? 6 : 5;
- },
- //KIL:
- //0xB2:
- function (parentObj) {
- parentObj.opcodeKILCalled(0xB2);
- },
- //LDA Zero Page, X:
- //0xB5:
- function (parentObj) {
- parentObj.accumulator = parentObj.memory[(parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) + parentObj.registerX) & 0xFF];
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
- parentObj.FlagZero = (parentObj.accumulator == 0);
- parentObj.CPUTicks += 4;
- },
- //LDX Zero Page, Y:
- //0xB6:
- function (parentObj) {
- parentObj.registerX = parentObj.memory[(parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) + parentObj.registerY) & 0xFF];
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.FlagNegative = (parentObj.registerX > 0x7F);
- parentObj.FlagZero = (parentObj.registerX == 0);
- parentObj.CPUTicks += 4;
- },
- //CLV:
- //0xB8:
- function (parentObj) {
- parentObj.FlagOverflow = false;
- parentObj.CPUTicks += 2;
- },
- //LDA Absolute, Y:
- //0xB9:
- function (parentObj) {
- var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += (((temp_var & 0xFF) + parentObj.registerY) > 0xFF) ? 5 : 4;
- parentObj.accumulator = parentObj.memoryRead((temp_var + parentObj.registerY) & 0xFFFF);
- parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
- parentObj.FlagZero = (parentObj.accumulator == 0);
- },
- //TSX:
- //0xBA:
- function (parentObj) {
- parentObj.registerX = parentObj.stackPointer;
- parentObj.FlagZero = (parentObj.registerX == 0);
- parentObj.FlagNegative = (parentObj.registerX > 0x7F);
- parentObj.CPUTicks += 2;
- },
- //LDY Absolute, X:
- //0xBC:
- function (parentObj) {
- var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += (((temp_var & 0xFF) + parentObj.registerX) > 0xFF) ? 5 : 4;
- parentObj.registerY = parentObj.memoryRead((temp_var + parentObj.registerX) & 0xFFFF);
- parentObj.FlagNegative = (parentObj.registerY > 0x7F);
- parentObj.FlagZero = (parentObj.registerY == 0);
- },
- //LDA Absolute, X:
- //0xBD:
- function (parentObj) {
- var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += (((temp_var & 0xFF) + parentObj.registerX) > 0xFF) ? 5 : 4;
- parentObj.accumulator = parentObj.memoryRead((temp_var + parentObj.registerX) & 0xFFFF);
- parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
- parentObj.FlagZero = (parentObj.accumulator == 0);
- },
- //LDX Absolute, Y:
- //0xBE:
- function (parentObj) {
- var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += (((temp_var & 0xFF) + parentObj.registerY) > 0xFF) ? 5 : 4;
- parentObj.registerX = parentObj.memoryRead((temp_var + parentObj.registerY) & 0xFFFF);
- parentObj.FlagNegative = (parentObj.registerX > 0x7F);
- parentObj.FlagZero = (parentObj.registerX == 0);
- },
- //CPY Immediate:
- //0xC0:
- function (parentObj) {
- var temp_var = parentObj.registerY - parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.FlagCarry = (temp_var > 0xFF);
- parentObj.FlagNegative = (temp_var > 0x7F);
- parentObj.FlagZero = (temp_var == 0);
- parentObj.CPUTicks += 2;
- },
- //DOP Immediate:
- //#0xC2:
- function (parentObj) {
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += 2;
- },
- //CPY Zero Page:
- //0xC4:
- function (parentObj) {
- var temp_var = parentObj.registerY - parentObj.memory[parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter)];
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.FlagCarry = (temp_var > 0xFF);
- parentObj.FlagNegative = (temp_var > 0x7F);
- parentObj.FlagZero = (temp_var == 0);
- parentObj.CPUTicks += 3;
- },
- //INY:
- //0xC8:
- function (parentObj) {
- parentObj.registerY = (parentObj.registerY + 1) & 0xFF;
- parentObj.FlagNegative = (parentObj.registerY > 0x7F);
- parentObj.FlagZero = (parentObj.registerY == 0);
- parentObj.CPUTicks += 2;
- },
- //DEX:
- //0xCA:
- function (parentObj) {
- parentObj.registerX = (parentObj.registerX - 1) & 0xFF;
- parentObj.FlagNegative = (parentObj.registerX > 0x7F);
- parentObj.FlagZero = (parentObj.registerX == 0);
- parentObj.CPUTicks += 2;
- },
- //CPY Absolute:
- //0xCC:
- function (parentObj) {
- var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- temp_var = parentObj.registerY - temp_var;
- parentObj.FlagCarry = (temp_var > 0xFF);
- parentObj.FlagNegative = (temp_var > 0x7F);
- parentObj.FlagZero = (temp_var == 0);
- parentObj.CPUTicks += 4;
- },
- //BNE:
- //0xD0:
- function (parentObj) {
- if (!parentObj.FlagZero) {
- parentObj.programCounter = (parentObj.programCounter + ((parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 24) >> 24) + 1) & 0xFFFF;
- parentObj.CPUTicks += ((temp_var ^ parentObj.programCounter) > 0xFF) ? 4 : 3;
- }
- else {
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += 2;
- }
- },
- //KIL:
- //0xD2:
- function (parentObj) {
- parentObj.opcodeKILCalled(0xD2);
- },
- //DOP Zero Page, X:
- //#0xD4:
- function (parentObj) {
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += 4;
- },
- //CLD:
- //0xD8:
- function (parentObj) {
- parentObj.FlagDecimal = 0x20;
- parentObj.CPUTicks += 2;
- },
- //CPX Immediate:
- //0xE0:
- function (parentObj) {
- var temp_var = parentObj.registerX - parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.FlagCarry = (temp_var > 0xFF);
- parentObj.FlagNegative = (temp_var > 0x7F);
- parentObj.FlagZero = (temp_var == 0);
- parentObj.CPUTicks += 2;
- },
- //DOP Immediate:
- //#0xE2:
- function (parentObj) {
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += 2;
- },
- //CPX Zero Page:
- //0xE4:
- function (parentObj) {
- var temp_var = parentObj.registerX - parentObj.memory[parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter)];
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.FlagCarry = (temp_var > 0xFF);
- parentObj.FlagNegative = (temp_var > 0x7F);
- parentObj.FlagZero = (temp_var == 0);
- parentObj.CPUTicks += 3;
- },
- //INX:
- //0xE8:
- function (parentObj) {
- parentObj.registerX = (parentObj.registerX + 1) & 0xFF;
- parentObj.FlagNegative = (parentObj.registerX > 0x7F);
- parentObj.FlagZero = (parentObj.registerX == 0);
- parentObj.CPUTicks += 2;
- },
- //CPX Absolute:
- //0xEC:
- function (parentObj) {
- var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- temp_var = parentObj.registerX - temp_var;
- parentObj.FlagCarry = (temp_var > 0xFF);
- parentObj.FlagNegative = (temp_var > 0x7F);
- parentObj.FlagZero = (temp_var == 0);
- parentObj.CPUTicks += 4;
- },
- //NOP:
- //0xEA:
- function (parentObj) {
- parentObj.CPUTicks += 2;
- },
- //BEQ:
- //0xF0:
- function (parentObj) {
- if (parentObj.FlagZero) {
- parentObj.programCounter = (parentObj.programCounter + ((parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 24) >> 24) + 1) & 0xFFFF;
- parentObj.CPUTicks += ((temp_var ^ parentObj.programCounter) > 0xFF) ? 4 : 3;
- }
- else {
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += 2;
- }
- },
- //KIL:
- //0xF2:
- function (parentObj) {
- parentObj.opcodeKILCalled(0xF2);
- },
- //DOP Zero Page, X:
- //#0xF4:
- function (parentObj) {
- parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
- parentObj.CPUTicks += 4;
- },
- //SED:
- //0xF8:
- function (parentObj) {
- parentObj.FlagDecimal = 0x28;
- parentObj.CPUTicks += 2;
- },
- ];
- Ricoh2A03.prototype.opcodeKILCalled = function (parentObj, opcode) {
- cout("KIL op code "+ opcode + " called, pausing emulation.", 2);
- parentObj.pause();
- }
- Ricoh2A03.prototype.memoryWriteCompiler = function () {
- //0-0x1FFF;
- this.compileRAMWriteHandler();
- //0x2000-0x3FFF;
- this.compilePPUWriteHandler();
- }
- Ricoh2A03.prototype.compileRAMWriteHandler = function () {
- var index = 0;
- //Zero Page RAM:
- //Stack RAM:
- //RAM:
- do {
- this.memoryWriter[index++] = this.memoryWriteNormal;
- } while (index < 0x7FF);
- //Populating the 0x800-0x1FFF echo RAM:
- do {
- this.memoryWriter[index++] = this.memoryWriteEcho1;
- } while (index < 0x2000);
- }
- Ricoh2A03.prototype.compilePPUWriteHandler = function () {
- var index = 0x2000
- while (index < 0x4000) {
- //PPU Control Register 1:
- //0x2000:
- this.memoryWrite[index++] = function (parentObj, address, data) {
- //Bit 7: Vblank IRQ Enable:
- parentObj.PPUVblankIRQ = (data > 0x7F);
- //Bit 6: Not Used?
- //Bit 5: 8x8 - 8x16 Sprite Size Selection:
- parentObj.PPUSpriteDoubleSize = ((data & 0x20) == 0x20);
- //Bit 4: Screen Pattern Table:
- parentObj.PPUBGPatternTablePosition = (data & 0x10) << 8;
- //Bit 3: Screen Pattern Table:
- parentObj.PPUSPRPatternTablePosition = (data & 0x08) << 8;
- //Bit 2: PPU Write Incrementation:
- parentObj.PPUWriteIncrementAmount = ((data & 0x04) == 0x04) ? 0x20 : 1;
- //Bit 1: Name Table Y Scroll:
- parentObj.PPUNameTableYScroll = (data & 0x02) * 120;
- //Bit 0: Name Table X Scroll:
- parentObj.PPUNameTableXScroll = (data & 0x01) << 8;
- };
- //PPU Control Register 2:
- //0x2001:
- this.memoryWrite[index++] = function (parentObj, address, data) {
- //Bits 5-7:
- parentObj.PPUIntensity = data >> 5; //Bit 5=R, Bit 6=B, Bit 7=G
- //Bit 4: Sprite Display (All SPR Pixels):
- parentObj.PPUSPRDisplay = ((data & 0x10) == 0x10);
- //Bit 3: Background Display (All BG Pixels):
- parentObj.PPUBGDisplay = ((data & 0x08) == 0x08);
- //Bit 2: Sprite Mask (8 Left-Most Pixels):
- parentObj.PPUSpriteMask = ((data & 0x04) < 0x04);
- //Bit 1: Image Mask (8 Left-Most Pixels):
- parentObj.PPUImageMask = ((data & 0x02) < 0x02);
- //Bit 0: Disable Composite Colorburst:
- parentObj.PPUNoColor = ((data & 0x01) == 0x01);
- };
- //PPU Status Register:
- //0x2002:
- this.memoryWrite[index++] = this.memoryWriteIgnore;
- //SPR-RAM Address Register:
- //0x2003:
- this.memoryWrite[index++] = function (parentOj, address, data) {
- parentOj.PPUCurrentSpriteAddress = data;
- };
- //SPR-RAM Data Register:
- //0x2004:
- this.memoryWrite[index++] = function (parentOj, address, data) {
- parentOj.SPRRAM[parentOj.PPUCurrentSpriteAddress++] = data;
- parentOj.PPUCurrentSpriteAddress &= 0xFF;
- };
- //PPU Background Scrolling Offset:
- //0x2005:
- this.memoryWrite[index++] = function (parentOj, address, data) {
- if (parentOj.PPUFirstWriteScroll == -1) {
- //Documents say that the first write is not used until the second write:
- parentObj.PPUFirstWriteScroll = data;
- parentOj.PPUFirstWriteVRAM = -1; //Reset register 0x2006 write buffering.
- }
- else if (data < 240) {
- //Update the internal scrolling variables and reset the buffer:
- parentObj.PPUXScroll = parentObj.PPUFirstWriteScroll;
- parentObj.PPUYScroll = data;
- parentOj.PPUFirstWriteScroll = -1;
- }
- };
- //PPU Memory Address:
- //0x2006:
- this.memoryWrite[index++] = function (parentOj, address, data) {
- if (parentOj.PPUFirstWriteVRAM == -1) {
- //Documents say that the first write is not used until the second write:
- parentObj.PPUFirstWriteVRAM = data;
- parentOj.PPUFirstWriteScroll = -1; //Reset register 0x2005 write buffering.
- }
- else {
- //Update the internal address variable and reset the buffer:
- parentObj.PPUVRAMAddress = ((parentObj.PPUFirstWriteVRAM & 0x20) << 8) | data;
- parentOj.PPUFirstWriteVRAM = -1;
- }
- };
- //PPU Memory Data:
- //0x2007:
- this.memoryWrite[index++] = function (parentOj, address, data) {
- //Attempt a VRAM write to the PPU:
- parentObj.writePPU[parentObj.PPUVRAMAddress](parentObj, parentObj.PPUVRAMAddress, data);
- parentObj.PPUVRAMAddress = (parentObj.PPUVRAMAddress + parentObj.PPUWriteIncrementAmount) & 0x3FFF;
- };
- }
- }
- Ricoh2A03.prototype.memoryWriteNormal = function (parentObj, address, data) {
- parentObj.memory[address] = data;
- }
- Ricoh2A03.prototype.memoryWriteStack = function (parentObj, address, data) {
- parentObj.memory[0x100 | address] = data;
- }
- Ricoh2A03.prototype.memoryWriteEcho1 = function (parentObj, address, data) {
- parentObj.memory[address & 0x7FF] = data;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement