Advertisement
Guest User

Untitled

a guest
Dec 2nd, 2011
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Ricoh2A03 = function () {}
  2. Ricoh2A03.prototype.newCartridgeInstance = function () {
  3.     this.startup();
  4.     this.initializeMemoryJumps();
  5. }
  6. Ricoh2A03.prototype.startup = function () {
  7.     //CPU Registers:
  8.     this.programCounter = 0;    //Program Counter (The current address of the executing instruction.)
  9.     this.stackPointer = 0xFF;   //Stack Pointer (We take care of the 0x100 paging.)
  10.     this.accumulator = 0;       //The accumulator (The variable on the CPU that's used as the main target for math operations.)
  11.     this.registerX = 0;         //Index register X (Used as an offset to some operations.)
  12.     this.registerY = 0;         //Index register Y (Used as an offset to some operations.)
  13.     //Program Status Register Flags:
  14.     this.FlagNegative = false;  //Was bit 7 of the last number worked on set?
  15.     this.FlagOverflow = false;  //Did bit 6 of the last number worked on carry over to bit 7?
  16.     this.FlagBRK = false;       //Was the BRK instruction executed?
  17.     this.FlagDecimal = 0x20;    //Unused decimal flag bit + bit 5.
  18.     this.FlagIRQ = false;       //Are IRQs disabled?
  19.     this.FlagZero = false;      //Was the last number worked on equal to 0?
  20.     this.FlagCarry = false;     //Did bit 7 overflow or bit 0 underflow in the last number worked on?
  21.     //memory arrays:
  22.     this.memory = this.getUInt8Array(0x800, 0);
  23. }
  24. Ricoh2A03.prototype.hardwareReset = function () {
  25.     //CPU Registers:
  26.     this.programCounter = 0;    //Program Counter (The current address of the executing instruction.)
  27.     this.stackPointer = 0xFF;   //Stack Pointer (We take care of the 0x100 paging.)
  28.     this.accumulator = 0;       //The accumulator (The variable on the CPU that's used as the main target for math operations.)
  29.     this.registerX = 0;         //Index register X (Used as an offset to some operations.)
  30.     this.registerY = 0;         //Index register Y (Used as an offset to some operations.)
  31.     //Program Status Register Flags:
  32.     this.FlagNegative = false;  //Was bit 7 of the last number worked on set?
  33.     this.FlagOverflow = false;  //Did bit 6 of the last number worked on carry over to bit 7?
  34.     this.FlagBRK = false;       //Was the BRK instruction executed?
  35.     this.FlagDecimal = 0x20;    //Unused decimal flag bit + bit 5.
  36.     this.FlagIRQ = false;       //Are IRQs disabled?
  37.     this.FlagZero = false;      //Was the last number worked on equal to 0?
  38.     this.FlagCarry = false;     //Did bit 7 overflow or bit 0 underflow in the last number worked on?
  39.     //memory arrays:
  40.     this.memory = this.getUInt8Array(0x800, 0);
  41. }
  42. Ricoh2A03.prototype.initializeMemoryJumps() = function () {
  43.     //memory jump arrays:
  44.     this.memoryWriter = [];
  45.     this.memoryReader = [];
  46.     this.writePPU = [];
  47.     this.memoryWriteCompiler();
  48. }
  49. Ricoh2A03.prototype.OPCODES = [
  50.     //BRK impl:
  51.     //0x00:
  52.     function (parentObj) {
  53.         parentObj.memory[0x100 | parentObj.stackPointer] = parentObj.programCounter >> 8;
  54.         parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFF;
  55.         parentObj.memory[0x100 | parentObj.stackPointer] = parentObj.programCounter & 0xFF;
  56.         parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFF;
  57.         parentObj.programCounter = (parentObj.memoryReader[0xFFFE](parentObj, 0xFFFE) << 8) | parentObj.memoryReader[0xFFFF](parentObj, 0xFFFF);
  58.         parentObj.FlagBRK = true;
  59.         parentObj.CPUTicks += 7;
  60.     },
  61.     //ORA (Indirect, X):
  62.     //0x01:
  63.     function (parentObj) {
  64.         var address = (parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) + parentObj.registerX) & 0xFF;
  65.         address = (0x100 + (address * 0x101)) & 0xFFFF;
  66.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  67.         parentObj.accumulator |= parentObj.memoryReader[address](parentObj, address);
  68.         parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
  69.         parentObj.FlagZero = (parentObj.accumulator == 0);
  70.         parentObj.CPUTicks += 6;
  71.     },
  72.     //KIL:
  73.     //0x02:
  74.     function (parentObj) {
  75.         parentObj.opcodeKILCalled(0x02);
  76.     },
  77.     //SLO (Indirect, X):
  78.     //0x03:
  79.     function (parentObj) {
  80.         //TODO
  81.         throw(new Error("Unimplemented opcode #0x03 executed."));
  82.         parentObj.CPUTicks += 8;
  83.     },
  84.     //DOP Zero Page:
  85.     //#0x04:
  86.     function (parentObj) {
  87.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  88.         parentObj.CPUTicks += 3;
  89.     },
  90.     //ASL Zero Page:
  91.     //0x06:
  92.     function (parentObj) {
  93.         var address = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
  94.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  95.         var temp_var = parentObj.memory[address];
  96.         parentObj.FlagCarry = (temp_var > 0x7F);
  97.         parentObj.memory[address] = temp_var = (temp_var << 1) & 0xFF;
  98.         parentObj.FlagNegative = (temp_var > 0x7F);
  99.         parentObj.FlagZero = (temp_var == 0);
  100.         parentObj.CPUTicks += 5;
  101.     },
  102.     //PHP:
  103.     //0x08:
  104.     function (parentObj) {
  105.         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);
  106.         parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFF;
  107.         parentObj.CPUTicks += 3;
  108.     },
  109.     //ASL Accumulator:
  110.     //0x0A:
  111.     function (parentObj) {
  112.         parentObj.FlagCarry = (parentObj.accumulator > 0x7F);
  113.         parentObj.accumulator = (parentObj.accumulator << 1) & 0xFF;
  114.         parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
  115.         parentObj.FlagZero = (parentObj.accumulator == 0);
  116.         parentObj.CPUTicks += 2;
  117.     },
  118.     //BPL:
  119.     //0x10:
  120.     function (parentObj) {
  121.         if (!parentObj.FlagNegative) {
  122.             parentObj.programCounter = (parentObj.programCounter + ((parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 24) >> 24) + 1) & 0xFFFF;
  123.             parentObj.CPUTicks += ((temp_var ^ parentObj.programCounter) > 0xFF) ? 4 : 3;
  124.         }
  125.         else {
  126.             parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  127.             parentObj.CPUTicks += 2;
  128.         }
  129.     },
  130.     //KIL:
  131.     //0x12:
  132.     function (parentObj) {
  133.         parentObj.opcodeKILCalled(0x12);
  134.     },
  135.     //DOP Zero Page, X:
  136.     //#0x14:
  137.     function (parentObj) {
  138.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  139.         parentObj.CPUTicks += 4;
  140.     },
  141.     //CLC:
  142.     //0x18:
  143.     function (parentObj) {
  144.         parentObj.FlagCarry = false;
  145.         parentObj.CPUTicks += 2;
  146.     },
  147.     //JSR:
  148.     //0x20:
  149.     function (parentObj) {
  150.         var temp_var = (parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
  151.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  152.         parentObj.memory[0x100 | parentObj.stackPointer] = parentObj.programCounter >> 8;
  153.         parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFF;
  154.         parentObj.memory[0x100 | parentObj.stackPointer] = parentObj.programCounter & 0xFF;
  155.         parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFF;
  156.         parentObj.programCounter = temp_var;
  157.         parentObj.CPUTicks += 6;
  158.     },
  159.     //AND (Indirect, X):
  160.     //0x21:
  161.     function (parentObj) {
  162.         var address = (parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) + parentObj.registerX) & 0xFF;
  163.         address = (0x100 + (address * 0x101)) & 0xFFFF;
  164.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  165.         parentObj.accumulator &= parentObj.memoryReader[address](parentObj, address);
  166.         parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
  167.         parentObj.FlagZero = (parentObj.accumulator == 0);
  168.         parentObj.CPUTicks += 6;
  169.     },
  170.     //KIL:
  171.     //0x22:
  172.     function (parentObj) {
  173.         parentObj.opcodeKILCalled(0x22);
  174.     },
  175.     //BIT Zero Page:
  176.     //0x24:
  177.     function (parentObj) {
  178.         parentObj.accumulator &= parentObj.memory[parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter)];
  179.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  180.         parentObj.FlagZero = (parentObj.accumulator == 0);
  181.         parentObj.FlagOverflow = ((parentObj.accumulator & 0x40) == 0x40);
  182.         parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
  183.         parentObj.CPUTicks += 3;
  184.     },
  185.     //AND Zero Page:
  186.     //0x25:
  187.     function (parentObj) {
  188.         parentObj.accumulator &= parentObj.memory[parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter)];
  189.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  190.         parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
  191.         parentObj.FlagZero = (parentObj.accumulator == 0);
  192.         parentObj.CPUTicks += 3;
  193.     },
  194.     //PLP:
  195.     //0x28:
  196.     function (parentObj) {
  197.         parentObj.stackPointer = (parentObj.stackPointer + 1) & 0xFF;
  198.         var status = parentObj.memory[0x100 | parentObj.stackPointer];
  199.         parentObj.FlagNegative = (status > 0x7F);
  200.         parentObj.FlagOverflow = ((status & 0x40) == 0x40);
  201.         parentObj.FlagBRK = ((status & 0x10) == 0x10);
  202.         parentObj.FlagDecimal = ((status & 0x08) == 0x08) ? 0x28 : 0x20;
  203.         parentObj.FlagIRQ = ((status & 0x04) == 0x04);
  204.         parentObj.FlagZero = ((status & 0x02) == 0x02);
  205.         parentObj.FlagCarry = ((status & 0x01) == 0x01);
  206.         parentObj.CPUTicks += 4;
  207.     },
  208.     //AND Immediate:
  209.     //0x29:
  210.     function (parentObj) {
  211.         parentObj.accumulator &= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
  212.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  213.         parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
  214.         parentObj.FlagZero = (parentObj.accumulator == 0);
  215.         parentObj.CPUTicks += 2;
  216.     },
  217.     //BIT Absolute:
  218.     //0x2C:
  219.     function (parentObj) {
  220.         parentObj.accumulator &= (parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
  221.         parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
  222.         parentObj.FlagZero = (parentObj.accumulator == 0);
  223.         parentObj.FlagOverflow = ((parentObj.accumulator & 0x40) == 0x40);
  224.         parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
  225.         parentObj.CPUTicks += 4;
  226.     },
  227.     //AND Absolute:
  228.     //0x2D:
  229.     function (parentObj) {
  230.         var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
  231.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  232.         temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
  233.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  234.         parentObj.accumulator &= parentObj.memoryReader[temp_var](parentObj, temp_var);
  235.         parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
  236.         parentObj.FlagZero = (parentObj.accumulator == 0);
  237.         parentObj.CPUTicks += 2;
  238.     },
  239.     //BMI:
  240.     //0x30:
  241.     function (parentObj) {
  242.         if (parentObj.FlagNegative) {
  243.             parentObj.programCounter = (parentObj.programCounter + ((parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 24) >> 24) + 1) & 0xFFFF;
  244.             parentObj.CPUTicks += ((temp_var ^ parentObj.programCounter) > 0xFF) ? 4 : 3;
  245.         }
  246.         else {
  247.             parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  248.             parentObj.CPUTicks += 2;
  249.         }
  250.     },
  251.     //AND (Indirect), Y:
  252.     //0x31:
  253.     function (parentObj) {
  254.         var address = (0x100 + (parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) * 0x101)) & 0xFFFF;
  255.         var address2 = (address + parentObj.registerY) & 0xFFFF;
  256.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  257.         parentObj.accumulator &= parentObj.memoryReader[address2](parentObj, address2);
  258.         parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
  259.         parentObj.FlagZero = (parentObj.accumulator == 0);
  260.         parentObj.CPUTicks += ((address ^ address2) > 0xFF) ? 6 : 5;
  261.     },
  262.     //KIL:
  263.     //0x32:
  264.     function (parentObj) {
  265.         parentObj.opcodeKILCalled(0x32);
  266.     },
  267.     //DOP Zero Page, X:
  268.     //#0x34:
  269.     function (parentObj) {
  270.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  271.         parentObj.CPUTicks += 4;
  272.     },
  273.     //AND Zero Page, X:
  274.     //0x35:
  275.     function (parentObj) {
  276.         parentObj.accumulator &= parentObj.memory[(parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) + parentObj.registerX) & 0xFF];
  277.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  278.         parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
  279.         parentObj.FlagZero = (parentObj.accumulator == 0);
  280.         parentObj.CPUTicks += 4;
  281.     },
  282.     //SEC:
  283.     //0x38:
  284.     function (parentObj) {
  285.         parentObj.FlagCarry = true;
  286.         parentObj.CPUTicks += 2;
  287.     },
  288.     //AND Absolute, Y:
  289.     //0x39:
  290.     function (parentObj) {
  291.         var address = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
  292.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  293.         address |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
  294.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  295.         parentObj.CPUTicks += (((address & 0xFF) + parentObj.registerY) > 0xFF) ? 5 : 4;
  296.         address = (address + parentObj.registerY) & 0xFFFF;
  297.         parentObj.accumulator &= parentObj.memoryReader[address](parentObj, address);
  298.         parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
  299.         parentObj.FlagZero = (parentObj.accumulator == 0);
  300.     },
  301.     //AND Absolute, X:
  302.     //0x3D:
  303.     function (parentObj) {
  304.         var address = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
  305.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  306.         address |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
  307.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  308.         parentObj.CPUTicks += (((address & 0xFF) + parentObj.registerX) > 0xFF) ? 5 : 4;
  309.         address = (address + parentObj.registerX) & 0xFFFF;
  310.         parentObj.accumulator &= parentObj.memoryReader[address](parentObj, address);
  311.         parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
  312.         parentObj.FlagZero = (parentObj.accumulator == 0);
  313.     },
  314.     //RTI:
  315.     //0x40:
  316.     function (parentObj) {
  317.         parentObj.stackPointer = (parentObj.stackPointer + 1) & 0xFF;
  318.         var status = parentObj.memory[0x100 | parentObj.stackPointer];
  319.         parentObj.FlagNegative = (status > 0x7F);
  320.         parentObj.FlagOverflow = ((status & 0x40) == 0x40);
  321.         parentObj.FlagBRK = ((status & 0x10) == 0x10);
  322.         parentObj.FlagDecimal = ((status & 0x08) == 0x08) ? 0x28 : 0x20;
  323.         parentObj.FlagIRQ = ((status & 0x04) == 0x04);
  324.         parentObj.FlagZero = ((status & 0x02) == 0x02);
  325.         parentObj.FlagCarry = ((status & 0x01) == 0x01);
  326.         parentObj.stackPointer = (parentObj.stackPointer + 1) & 0xFF;
  327.         parentObj.programCounter = parentObj.memory[0x100 | parentObj.stackPointer];
  328.         parentObj.stackPointer = (parentObj.stackPointer + 1) & 0xFF;
  329.         parentObj.programCounter |= parentObj.memory[0x100 | parentObj.stackPointer] << 8;
  330.         parentObj.CPUTicks += 6;
  331.     },
  332.     //KIL:
  333.     //0x42:
  334.     function (parentObj) {
  335.         parentObj.opcodeKILCalled(0x42);
  336.     },
  337.     //DOP Zero Page:
  338.     //#0x44:
  339.     function (parentObj) {
  340.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  341.         parentObj.CPUTicks += 3;
  342.     },
  343.     //LSR Zero Page:
  344.     //0x46:
  345.     function (parentObj) {
  346.         var address = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
  347.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  348.         var temp_var = parentObj.memory[address];
  349.         parentObj.memory[address] = temp_var >> 1;
  350.         parentObj.FlagCarry = ((temp_var & 0x01) == 0x01);
  351.         parentObj.FlagZero = (temp_var < 2);
  352.         parentObj.FlagNegative = false;
  353.         parentObj.CPUTicks += 5;
  354.     },
  355.     //PHA
  356.     //0x48:
  357.     function (parentObj) {
  358.         parentObj.memory[0x100 | parentObj.stackPointer] = parentObj.accumulator;
  359.         parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFF;
  360.         parentObj.CPUTicks += 3;
  361.     },
  362.     //LSR Accumulator:
  363.     //0x4A:
  364.     function (parentObj) {
  365.         parentObj.FlagCarry = ((parentObj.accumulator & 0x01) == 0x01);
  366.         parentObj.accumulator >>= 1;
  367.         parentObj.FlagZero = (parentObj.accumulator == 0);
  368.         parentObj.FlagNegative = false;
  369.         parentObj.CPUTicks += 2;
  370.     },
  371.     //JMP Absolute:
  372.     //0x4C:
  373.     function (parentObj) {
  374.         parentObj.programCounter = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) | (parentObj.memoryRead(parentObj, (parentObj.programCounter + 1) & 0xFFFF) << 8);
  375.         parentObj.CPUTicks += 3;
  376.     },
  377.     //LSR Absolute:
  378.     //0x4E:
  379.     function (parentObj) {
  380.         var address = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
  381.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  382.         address |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
  383.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  384.         var temp_var = parentObj.memoryReader[address](parentObj, address);
  385.         parentObj.memoryWriter[address](parentObj, address, temp_var >> 1);
  386.         parentObj.FlagCarry = ((temp_var & 0x01) == 0x01);
  387.         parentObj.FlagZero = (temp_var < 2);
  388.         parentObj.FlagNegative = false;
  389.         parentObj.CPUTicks += 6;
  390.     },
  391.     //BVC:
  392.     //0x50:
  393.     function (parentObj) {
  394.         if (!parentObj.FlagOverflow) {
  395.             parentObj.programCounter = (parentObj.programCounter + ((parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 24) >> 24) + 1) & 0xFFFF;
  396.             parentObj.CPUTicks += ((temp_var ^ parentObj.programCounter) > 0xFF) ? 4 : 3;
  397.         }
  398.         else {
  399.             parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  400.             parentObj.CPUTicks += 2;
  401.         }
  402.     },
  403.     //KIL:
  404.     //0x52:
  405.     function (parentObj) {
  406.         parentObj.opcodeKILCalled(0x52);
  407.     },
  408.     //DOP Zero Page, X:
  409.     //#0x54:
  410.     function (parentObj) {
  411.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  412.         parentObj.CPUTicks += 4;
  413.     },
  414.     //LSR Zero Page, X:
  415.     //0x56:
  416.     function (parentObj) {
  417.         var address = (parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) + parentObj.registerX) & 0xFF;
  418.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  419.         var temp_var = parentObj.memory[address];
  420.         parentObj.memory[address] = temp_var >> 1;
  421.         parentObj.FlagCarry = ((temp_var & 0x01) == 0x01);
  422.         parentObj.FlagZero = (temp_var < 2);
  423.         parentObj.FlagNegative = false;
  424.         parentObj.CPUTicks += 6;
  425.     },
  426.     //CLI:
  427.     //0x58:
  428.     function (parentObj) {
  429.         parentObj.FlagIRQ = false;
  430.         parentObj.CPUTicks += 2;
  431.     },
  432.     //LSR Absolute, X:
  433.     //0x5E:
  434.     function (parentObj) {
  435.         var address = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
  436.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  437.         address |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
  438.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  439.         address = (address + parentObj.registerX) & 0xFFFF;
  440.         var temp_var = parentObj.memoryReader[address](parentObj, address);
  441.         parentObj.memoryWriter[address](parentObj, address, temp_var >> 1);
  442.         parentObj.FlagCarry = ((temp_var & 0x01) == 0x01);
  443.         parentObj.FlagZero = (temp_var < 2);
  444.         parentObj.FlagNegative = false;
  445.         parentObj.CPUTicks += 7;
  446.     },
  447.     //RTS:
  448.     //0x60:
  449.     function (parentObj) {
  450.         parentObj.stackPointer = (parentObj.stackPointer + 1) & 0xFF;
  451.         parentObj.programCounter = parentObj.memory[0x100 | parentObj.stackPointer];
  452.         parentObj.stackPointer = (parentObj.stackPointer + 1) & 0xFF;
  453.         parentObj.programCounter |= parentObj.memory[0x100 | parentObj.stackPointer] << 8;
  454.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  455.         parentObj.CPUTicks += 6;
  456.     },
  457.     //ADC (Indirect, X):
  458.     //0x61:
  459.     function (parentObj) {
  460.         var address = (parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) + parentObj.registerX) & 0xFF;
  461.         address = (0x100 + (address * 0x101)) & 0xFFFF;
  462.         var temp_var = parentObj.accumulator + parentObj.memoryReader[address](parentObj, address) + ((parentObj.FlagCarry) ? 1 : 0);
  463.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  464.         parentObj.FlagCarry = (temp_var > 0xFF);
  465.         parentObj.FlagOverflow = (((temp_var ^ parentObj.accumulator) & 0x80) == 0x80);
  466.         parentObj.accumulator = temp_var & 0xFF;
  467.         parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
  468.         parentObj.FlagZero = (parentObj.accumulator == 0);
  469.         parentObj.CPUTicks += 6;
  470.     },
  471.     //KIL:
  472.     //0x62:
  473.     function (parentObj) {
  474.         parentObj.opcodeKILCalled(0x62);
  475.     },
  476.     //DOP Zero Page:
  477.     //#0x64:
  478.     function (parentObj) {
  479.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  480.         parentObj.CPUTicks += 3;
  481.     },
  482.     //ADC Zero Page:
  483.     //0x65:
  484.     function (parentObj) {
  485.         var temp_var = parentObj.accumulator + parentObj.memory[parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter)] + ((parentObj.FlagCarry) ? 1 : 0);
  486.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  487.         parentObj.FlagCarry = (temp_var > 0xFF);
  488.         parentObj.FlagOverflow = (((temp_var ^ parentObj.accumulator) & 0x80) == 0x80);
  489.         parentObj.accumulator = temp_var & 0xFF;
  490.         parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
  491.         parentObj.FlagZero = (parentObj.accumulator == 0);
  492.         parentObj.CPUTicks += 3;
  493.     },
  494.     //PLA
  495.     //0x68:
  496.     function (parentObj) {
  497.         parentObj.stackPointer = (parentObj.stackPointer + 1) & 0xFF;
  498.         parentObj.accumulator = parentObj.memory[0x100 | parentObj.stackPointer];
  499.         parentObj.FlagZero = (parentObj.accumulator == 0);
  500.         parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
  501.         parentObj.CPUTicks += 4;
  502.     },
  503.     //ADC Immediate:
  504.     //0x69:
  505.     function (parentObj) {
  506.         var temp_var = parentObj.accumulator + parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) + ((parentObj.FlagCarry) ? 1 : 0);
  507.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  508.         parentObj.FlagCarry = (temp_var > 0xFF);
  509.         parentObj.FlagOverflow = (((temp_var ^ parentObj.accumulator) & 0x80) == 0x80);
  510.         parentObj.accumulator = temp_var & 0xFF;
  511.         parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
  512.         parentObj.FlagZero = (parentObj.accumulator == 0);
  513.         parentObj.CPUTicks += 2;
  514.     },
  515.     //ADC Absolute:
  516.     //0x6D:
  517.     function (parentObj) {
  518.         var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
  519.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  520.         temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
  521.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  522.         temp_var = parentObj.accumulator + parentObj.memoryReader[temp_var](parentObj, temp_var) + ((parentObj.FlagCarry) ? 1 : 0);
  523.         parentObj.FlagCarry = (temp_var > 0xFF);
  524.         parentObj.FlagOverflow = (((temp_var ^ parentObj.accumulator) & 0x80) == 0x80);
  525.         parentObj.accumulator = temp_var & 0xFF;
  526.         parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
  527.         parentObj.FlagZero = (parentObj.accumulator == 0);
  528.         parentObj.CPUTicks += 4;
  529.     },
  530.     //BVS:
  531.     //0x70:
  532.     function (parentObj) {
  533.         if (parentObj.FlagOverflow) {
  534.             parentObj.programCounter = (parentObj.programCounter + ((parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 24) >> 24) + 1) & 0xFFFF;
  535.             parentObj.CPUTicks += ((temp_var ^ parentObj.programCounter) > 0xFF) ? 4 : 3;
  536.         }
  537.         else {
  538.             parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  539.             parentObj.CPUTicks += 2;
  540.         }
  541.     },
  542.     //ADC (Indirect), Y:
  543.     //0x71:
  544.     function (parentObj) {
  545.         var address = (0x100 + (parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) * 0x101)) & 0xFFFF;
  546.         var address2 = (address + parentObj.registerY) & 0xFFFF;
  547.         var temp_var = parentObj.accumulator + parentObj.memoryReader[address2](parentObj, address2) + ((parentObj.FlagCarry) ? 1 : 0);
  548.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  549.         parentObj.FlagCarry = (temp_var > 0xFF);
  550.         parentObj.FlagOverflow = (((temp_var ^ parentObj.accumulator) & 0x80) == 0x80);
  551.         parentObj.accumulator = temp_var & 0xFF;
  552.         parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
  553.         parentObj.FlagZero = (parentObj.accumulator == 0);
  554.         parentObj.CPUTicks += ((address ^ address2) > 0xFF) ? 6 : 5;
  555.     },
  556.     //KIL:
  557.     //0x72:
  558.     function (parentObj) {
  559.         parentObj.opcodeKILCalled(0x72);
  560.     },
  561.     //DOP Zero Page, X:
  562.     //#0x74:
  563.     function (parentObj) {
  564.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  565.         parentObj.CPUTicks += 4;
  566.     },
  567.     //ADC Zero Page, X:
  568.     //0x75:
  569.     function (parentObj) {
  570.         var temp_var = parentObj.accumulator + parentObj.memory[(parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) + parentObj.registerX) & 0xFF] + ((parentObj.FlagCarry) ? 1 : 0);
  571.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  572.         parentObj.FlagCarry = (temp_var > 0xFF);
  573.         parentObj.FlagOverflow = (((temp_var ^ parentObj.accumulator) & 0x80) == 0x80);
  574.         parentObj.accumulator = temp_var & 0xFF;
  575.         parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
  576.         parentObj.FlagZero = (parentObj.accumulator == 0);
  577.         parentObj.CPUTicks += 4;
  578.     },
  579.     //SEI:
  580.     //0x78:
  581.     function (parentObj) {
  582.         parentObj.FlagIRQ = true;
  583.         parentObj.CPUTicks += 2;
  584.     },
  585.     //ADC Absolute, Y:
  586.     //0x79:
  587.     function (parentObj) {
  588.         var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
  589.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  590.         temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
  591.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  592.         parentObj.CPUTicks += (((temp_var & 0xFF) + parentObj.registerY) > 0xFF) ? 5 : 4;
  593.         temp_var = parentObj.accumulator + parentObj.memoryRead((temp_var + parentObj.registerY) & 0xFFFF) + ((parentObj.FlagCarry) ? 1 : 0);
  594.         parentObj.FlagCarry = (temp_var > 0xFF);
  595.         parentObj.FlagOverflow = (((temp_var ^ parentObj.accumulator) & 0x80) == 0x80);
  596.         parentObj.accumulator = temp_var & 0xFF;
  597.         parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
  598.         parentObj.FlagZero = (parentObj.accumulator == 0);
  599.     },
  600.     //ADC Absolute, X:
  601.     //0x7D:
  602.     function (parentObj) {
  603.         var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
  604.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  605.         temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
  606.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  607.         parentObj.CPUTicks += (((temp_var & 0xFF) + parentObj.registerX) > 0xFF) ? 5 : 4;
  608.         temp_var = parentObj.accumulator + parentObj.memoryRead((temp_var + parentObj.registerX) & 0xFFFF) + ((parentObj.FlagCarry) ? 1 : 0);
  609.         parentObj.FlagCarry = (temp_var > 0xFF);
  610.         parentObj.FlagOverflow = (((temp_var ^ parentObj.accumulator) & 0x80) == 0x80);
  611.         parentObj.accumulator = temp_var & 0xFF;
  612.         parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
  613.         parentObj.FlagZero = (parentObj.accumulator == 0);
  614.     },
  615.     //DOP Immediate:
  616.     //#0x80:
  617.     function (parentObj) {
  618.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  619.         parentObj.CPUTicks += 2;
  620.     },
  621.     //STA (Indirect, X):
  622.     //0x81:
  623.     function (parentObj) {
  624.         var address = (parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) + parentObj.registerX) & 0xFF;
  625.         address = (0x100 + (address * 0x101)) & 0xFFFF;
  626.         parentObj.memoryWriter[address](parentObj, address, parentObj.accumulator);
  627.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  628.         parentObj.CPUTicks += 6;
  629.     },
  630.     //DOP Immediate:
  631.     //#0x82:
  632.     function (parentObj) {
  633.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  634.         parentObj.CPUTicks += 2;
  635.     },
  636.     //STY Zero Page:
  637.     //0x84:
  638.     function (parentObj) {
  639.         parentObj.memory[parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter)] = parentObj.registerY;
  640.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  641.         parentObj.CPUTicks += 3;
  642.     },
  643.     //STA Zero Page:
  644.     //0x85:
  645.     function (parentObj) {
  646.         parentObj.memory[parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter)] = parentObj.accumulator;
  647.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  648.         parentObj.CPUTicks += 3;
  649.     },
  650.     //STX Zero Page:
  651.     //0x86:
  652.     function (parentObj) {
  653.         parentObj.memory[parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter)] = parentObj.registerX;
  654.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  655.         parentObj.CPUTicks += 3;
  656.     },
  657.     //DEY:
  658.     //0x88:
  659.     function (parentObj) {
  660.         parentObj.registerY = (parentObj.registerY - 1) & 0xFF;
  661.         parentObj.FlagNegative = (parentObj.registerY > 0x7F);
  662.         parentObj.FlagZero = (parentObj.registerY == 0);
  663.         parentObj.CPUTicks += 2;
  664.     },
  665.     //DOP Immediate:
  666.     //#0x89:
  667.     function (parentObj) {
  668.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  669.         parentObj.CPUTicks += 2;
  670.     },
  671.     //TXA:
  672.     //0x8A:
  673.     function (parentObj) {
  674.         parentObj.accumulator = parentObj.registerX;
  675.         parentObj.FlagZero = (parentObj.accumulator == 0);
  676.         parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
  677.         parentObj.CPUTicks += 2;
  678.     },
  679.     //STY Absolute:
  680.     //0x8C:
  681.     function (parentObj) {
  682.         var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
  683.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  684.         temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
  685.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  686.         parentObj.memoryWriter[temp_var](parentObj, temp_var, parentObj.registerY);
  687.         parentObj.CPUTicks += 4;
  688.     },
  689.     //STA Absolute:
  690.     //0x8D:
  691.     function (parentObj) {
  692.         var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
  693.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  694.         temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
  695.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  696.         parentObj.memoryWriter[temp_var](parentObj, temp_var, parentObj.accumulator);
  697.         parentObj.CPUTicks += 4;
  698.     },
  699.     //STX Absolute:
  700.     //0x8E:
  701.     function (parentObj) {
  702.         var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
  703.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  704.         temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
  705.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  706.         parentObj.memoryWriter[temp_var](parentObj, temp_var, parentObj.registerX);
  707.         parentObj.CPUTicks += 4;
  708.     },
  709.     //BCC:
  710.     //0x90:
  711.     function (parentObj) {
  712.         if (!parentObj.FlagCarry) {
  713.             parentObj.programCounter = (parentObj.programCounter + ((parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 24) >> 24) + 1) & 0xFFFF;
  714.             parentObj.CPUTicks += ((temp_var ^ parentObj.programCounter) > 0xFF) ? 4 : 3;
  715.         }
  716.         else {
  717.             parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  718.             parentObj.CPUTicks += 2;
  719.         }
  720.     },
  721.     //STA (Indirect), Y:
  722.     //0x91:
  723.     function (parentObj) {
  724.         var address = (0x100 + (parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) * 0x101)) & 0xFFFF;
  725.         var address2 = (address + parentObj.registerY) & 0xFFFF;
  726.         parentObj.memoryWriter[address2](parentObj, address2, parentObj.accumulator);
  727.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  728.         parentObj.CPUTicks += ((address ^ address2) > 0xFF) ? 6 : 5;
  729.     },
  730.     //KIL:
  731.     //0x92:
  732.     function (parentObj) {
  733.         parentObj.opcodeKILCalled(0x92);
  734.     },
  735.     //STY Zero Page, X:
  736.     //0x94:
  737.     function (parentObj) {
  738.         parentObj.memory[(parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) + parentObj.registerX) & 0xFF] = parentObj.registerY;
  739.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  740.         parentObj.CPUTicks += 4;
  741.     },
  742.     //STA Zero Page, X:
  743.     //0x95:
  744.     function (parentObj) {
  745.         parentObj.memory[(parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) + parentObj.registerX) & 0xFF] = parentObj.accumulator;
  746.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  747.         parentObj.CPUTicks += 4;
  748.     },
  749.     //STX Zero Page, Y:
  750.     //0x96:
  751.     function (parentObj) {
  752.         parentObj.memory[(parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) + parentObj.registerY) & 0xFF] = parentObj.registerX;
  753.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  754.         parentObj.CPUTicks += 4;
  755.     },
  756.     //TYA:
  757.     //0x98:
  758.     function (parentObj) {
  759.         parentObj.accumulator = parentObj.registerY;
  760.         parentObj.FlagZero = (parentObj.accumulator == 0);
  761.         parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
  762.         parentObj.CPUTicks += 2;
  763.     },
  764.     //STA Absolute, Y:
  765.     //0x99:
  766.     function (parentObj) {
  767.         var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
  768.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  769.         temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
  770.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  771.         parentObj.registerY = parentObj.memoryWrite((temp_var + parentObj.registerY) & 0xFFFF, parentObj.accumulator);
  772.         parentObj.CPUTicks += (((temp_var & 0xFF) + parentObj.registerY) > 0xFF) ? 5 : 4;
  773.     },
  774.     //TXS:
  775.     //0x9A:
  776.     function (parentObj) {
  777.         parentObj.stackPointer = parentObj.registerX;
  778.         parentObj.CPUTicks += 2;
  779.     },
  780.     //STA Absolute, X:
  781.     //0x9D:
  782.     function (parentObj) {
  783.         var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
  784.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  785.         temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
  786.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  787.         parentObj.registerY = parentObj.memoryWrite((temp_var + parentObj.registerX) & 0xFFFF, parentObj.accumulator);
  788.         parentObj.CPUTicks += (((temp_var & 0xFF) + parentObj.registerX) > 0xFF) ? 5 : 4;
  789.     },
  790.     //LDY Immediate:
  791.     //0xA0:
  792.     function (parentObj) {
  793.         parentObj.registerY = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
  794.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  795.         parentObj.FlagNegative = (parentObj.registerY > 0x7F);
  796.         parentObj.FlagZero = (parentObj.registerY == 0);
  797.         parentObj.CPUTicks += 2;
  798.     },
  799.     //LDA (Indirect, X):
  800.     //0xA1:
  801.     function (parentObj) {
  802.         var address = (parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) + parentObj.registerX) & 0xFF;
  803.         address = (0x100 + (address * 0x101)) & 0xFFFF;
  804.         parentObj.accumulator = parentObj.memoryReader[address](parentObj, address);
  805.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  806.         parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
  807.         parentObj.FlagZero = (parentObj.accumulator == 0);
  808.         parentObj.CPUTicks += 6;
  809.     },
  810.     //LDX Immediate:
  811.     //0xA2:
  812.     function (parentObj) {
  813.         parentObj.registerX = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
  814.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  815.         parentObj.FlagNegative = (parentObj.registerX > 0x7F);
  816.         parentObj.FlagZero = (parentObj.registerX == 0);
  817.         parentObj.CPUTicks += 2;
  818.     },
  819.     //LDY Zero Page:
  820.     //0xA4:
  821.     function (parentObj) {
  822.         parentObj.registerY = parentObj.memory[parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter)];
  823.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  824.         parentObj.FlagNegative = (parentObj.registerY > 0x7F);
  825.         parentObj.FlagZero = (parentObj.registerY == 0);
  826.         parentObj.CPUTicks += 3;
  827.     },
  828.     //LDA Zero Page:
  829.     //0xA5:
  830.     function (parentObj) {
  831.         parentObj.accumulator = parentObj.memory[parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter)];
  832.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  833.         parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
  834.         parentObj.FlagZero = (parentObj.accumulator == 0);
  835.         parentObj.CPUTicks += 3;
  836.     },
  837.     //LDX Zero Page:
  838.     //0xA6:
  839.     function (parentObj) {
  840.         parentObj.registerX = parentObj.memory[parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter)];
  841.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  842.         parentObj.FlagNegative = (parentObj.registerX > 0x7F);
  843.         parentObj.FlagZero = (parentObj.registerX == 0);
  844.         parentObj.CPUTicks += 3;
  845.     },
  846.     //TAY:
  847.     //0xA8:
  848.     function (parentObj) {
  849.         parentObj.registerY = parentObj.accumulator;
  850.         parentObj.FlagZero = (parentObj.registerY == 0);
  851.         parentObj.FlagNegative = (parentObj.registerY > 0x7F);
  852.         parentObj.CPUTicks += 2;
  853.     },
  854.     //LDA Immediate:
  855.     //0xA9:
  856.     function (parentObj) {
  857.         parentObj.accumulator = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
  858.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  859.         parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
  860.         parentObj.FlagZero = (parentObj.accumulator == 0);
  861.         parentObj.CPUTicks += 2;
  862.     },
  863.     //TAX:
  864.     //0xAA:
  865.     function (parentObj) {
  866.         parentObj.registerX = parentObj.accumulator;
  867.         parentObj.FlagZero = (parentObj.registerX == 0);
  868.         parentObj.FlagNegative = (parentObj.registerX > 0x7F);
  869.         parentObj.CPUTicks += 2;
  870.     },
  871.     //LDY Absolute:
  872.     //0xAC:
  873.     function (parentObj) {
  874.         var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
  875.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  876.         temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
  877.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  878.         parentObj.registerY = parentObj.memoryReader[temp_var](parentObj, temp_var);
  879.         parentObj.FlagNegative = (parentObj.registerY > 0x7F);
  880.         parentObj.FlagZero = (parentObj.registerY == 0);
  881.         parentObj.CPUTicks += 4;
  882.     },
  883.     //LDA Absolute:
  884.     //0xAD:
  885.     function (parentObj) {
  886.         var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
  887.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  888.         temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
  889.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  890.         parentObj.accumulator = parentObj.memoryRead(temp_var);
  891.         parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
  892.         parentObj.FlagZero = (parentObj.accumulator == 0);
  893.         parentObj.CPUTicks += 4;
  894.     },
  895.     //LDX Absolute:
  896.     //0xAE:
  897.     function (parentObj) {
  898.         var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
  899.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  900.         temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
  901.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  902.         parentObj.registerX = parentObj.memoryRead(temp_var);
  903.         parentObj.FlagNegative = (parentObj.registerX > 0x7F);
  904.         parentObj.FlagZero = (parentObj.registerX == 0);
  905.         parentObj.CPUTicks += 4;
  906.     },
  907.     //LAX Absolute (Undocumented LDA + LDX Absolute in one):
  908.     //0xAF:
  909.     function (parentObj) {
  910.         var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
  911.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  912.         temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
  913.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  914.         parentObj.registerX = parentObj.accumulator = parentObj.memoryRead(temp_var);
  915.         parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
  916.         parentObj.FlagZero = (parentObj.accumulator == 0);
  917.         parentObj.CPUTicks += 4;
  918.     },
  919.     //BCS:
  920.     //0xB0:
  921.     function (parentObj) {
  922.         if (parentObj.FlagCarry) {
  923.             parentObj.programCounter = (parentObj.programCounter + ((parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 24) >> 24) + 1) & 0xFFFF;
  924.             parentObj.CPUTicks += ((temp_var ^ parentObj.programCounter) > 0xFF) ? 4 : 3;
  925.         }
  926.         else {
  927.             parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  928.             parentObj.CPUTicks += 2;
  929.         }
  930.     },
  931.     //LDA (Indirect), Y:
  932.     //0xB1:
  933.     function (parentObj) {
  934.         var address = (0x100 + (parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) * 0x101)) & 0xFFFF;
  935.         var address2 = (address + parentObj.registerY) & 0xFFFF;
  936.         var temp_var = parentObj.memoryReader[address2](parentObj, address2);
  937.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  938.         parentObj.accumulator = temp_var;
  939.         parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
  940.         parentObj.FlagZero = (parentObj.accumulator == 0);
  941.         parentObj.CPUTicks += ((address ^ address2) > 0xFF) ? 6 : 5;
  942.     },
  943.     //KIL:
  944.     //0xB2:
  945.     function (parentObj) {
  946.         parentObj.opcodeKILCalled(0xB2);
  947.     },
  948.     //LDA Zero Page, X:
  949.     //0xB5:
  950.     function (parentObj) {
  951.         parentObj.accumulator = parentObj.memory[(parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) + parentObj.registerX) & 0xFF];
  952.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  953.         parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
  954.         parentObj.FlagZero = (parentObj.accumulator == 0);
  955.         parentObj.CPUTicks += 4;
  956.     },
  957.     //LDX Zero Page, Y:
  958.     //0xB6:
  959.     function (parentObj) {
  960.         parentObj.registerX = parentObj.memory[(parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) + parentObj.registerY) & 0xFF];
  961.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  962.         parentObj.FlagNegative = (parentObj.registerX > 0x7F);
  963.         parentObj.FlagZero = (parentObj.registerX == 0);
  964.         parentObj.CPUTicks += 4;
  965.     },
  966.     //CLV:
  967.     //0xB8:
  968.     function (parentObj) {
  969.         parentObj.FlagOverflow = false;
  970.         parentObj.CPUTicks += 2;
  971.     },
  972.     //LDA Absolute, Y:
  973.     //0xB9:
  974.     function (parentObj) {
  975.         var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
  976.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  977.         temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
  978.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  979.         parentObj.CPUTicks += (((temp_var & 0xFF) + parentObj.registerY) > 0xFF) ? 5 : 4;
  980.         parentObj.accumulator = parentObj.memoryRead((temp_var + parentObj.registerY) & 0xFFFF);
  981.         parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
  982.         parentObj.FlagZero = (parentObj.accumulator == 0);
  983.     },
  984.     //TSX:
  985.     //0xBA:
  986.     function (parentObj) {
  987.         parentObj.registerX = parentObj.stackPointer;
  988.         parentObj.FlagZero = (parentObj.registerX == 0);
  989.         parentObj.FlagNegative = (parentObj.registerX > 0x7F);
  990.         parentObj.CPUTicks += 2;
  991.     },
  992.     //LDY Absolute, X:
  993.     //0xBC:
  994.     function (parentObj) {
  995.         var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
  996.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  997.         temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
  998.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  999.         parentObj.CPUTicks += (((temp_var & 0xFF) + parentObj.registerX) > 0xFF) ? 5 : 4;
  1000.         parentObj.registerY = parentObj.memoryRead((temp_var + parentObj.registerX) & 0xFFFF);
  1001.         parentObj.FlagNegative = (parentObj.registerY > 0x7F);
  1002.         parentObj.FlagZero = (parentObj.registerY == 0);
  1003.     },
  1004.     //LDA Absolute, X:
  1005.     //0xBD:
  1006.     function (parentObj) {
  1007.         var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
  1008.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  1009.         temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
  1010.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  1011.         parentObj.CPUTicks += (((temp_var & 0xFF) + parentObj.registerX) > 0xFF) ? 5 : 4;
  1012.         parentObj.accumulator = parentObj.memoryRead((temp_var + parentObj.registerX) & 0xFFFF);
  1013.         parentObj.FlagNegative = (parentObj.accumulator > 0x7F);
  1014.         parentObj.FlagZero = (parentObj.accumulator == 0);
  1015.     },
  1016.     //LDX Absolute, Y:
  1017.     //0xBE:
  1018.     function (parentObj) {
  1019.         var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
  1020.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  1021.         temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
  1022.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  1023.         parentObj.CPUTicks += (((temp_var & 0xFF) + parentObj.registerY) > 0xFF) ? 5 : 4;
  1024.         parentObj.registerX = parentObj.memoryRead((temp_var + parentObj.registerY) & 0xFFFF);
  1025.         parentObj.FlagNegative = (parentObj.registerX > 0x7F);
  1026.         parentObj.FlagZero = (parentObj.registerX == 0);
  1027.     },
  1028.     //CPY Immediate:
  1029.     //0xC0:
  1030.     function (parentObj) {
  1031.         var temp_var = parentObj.registerY - parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
  1032.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  1033.         parentObj.FlagCarry = (temp_var > 0xFF);
  1034.         parentObj.FlagNegative = (temp_var > 0x7F);
  1035.         parentObj.FlagZero = (temp_var == 0);
  1036.         parentObj.CPUTicks += 2;
  1037.     },
  1038.     //DOP Immediate:
  1039.     //#0xC2:
  1040.     function (parentObj) {
  1041.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  1042.         parentObj.CPUTicks += 2;
  1043.     },
  1044.     //CPY Zero Page:
  1045.     //0xC4:
  1046.     function (parentObj) {
  1047.         var temp_var = parentObj.registerY - parentObj.memory[parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter)];
  1048.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  1049.         parentObj.FlagCarry = (temp_var > 0xFF);
  1050.         parentObj.FlagNegative = (temp_var > 0x7F);
  1051.         parentObj.FlagZero = (temp_var == 0);
  1052.         parentObj.CPUTicks += 3;
  1053.     },
  1054.     //INY:
  1055.     //0xC8:
  1056.     function (parentObj) {
  1057.         parentObj.registerY = (parentObj.registerY + 1) & 0xFF;
  1058.         parentObj.FlagNegative = (parentObj.registerY > 0x7F);
  1059.         parentObj.FlagZero = (parentObj.registerY == 0);
  1060.         parentObj.CPUTicks += 2;
  1061.     },
  1062.     //DEX:
  1063.     //0xCA:
  1064.     function (parentObj) {
  1065.         parentObj.registerX = (parentObj.registerX - 1) & 0xFF;
  1066.         parentObj.FlagNegative = (parentObj.registerX > 0x7F);
  1067.         parentObj.FlagZero = (parentObj.registerX == 0);
  1068.         parentObj.CPUTicks += 2;
  1069.     },
  1070.     //CPY Absolute:
  1071.     //0xCC:
  1072.     function (parentObj) {
  1073.         var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
  1074.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  1075.         temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
  1076.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  1077.         temp_var = parentObj.registerY - temp_var;
  1078.         parentObj.FlagCarry = (temp_var > 0xFF);
  1079.         parentObj.FlagNegative = (temp_var > 0x7F);
  1080.         parentObj.FlagZero = (temp_var == 0);
  1081.         parentObj.CPUTicks += 4;
  1082.     },
  1083.     //BNE:
  1084.     //0xD0:
  1085.     function (parentObj) {
  1086.         if (!parentObj.FlagZero) {
  1087.             parentObj.programCounter = (parentObj.programCounter + ((parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 24) >> 24) + 1) & 0xFFFF;
  1088.             parentObj.CPUTicks += ((temp_var ^ parentObj.programCounter) > 0xFF) ? 4 : 3;
  1089.         }
  1090.         else {
  1091.             parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  1092.             parentObj.CPUTicks += 2;
  1093.         }
  1094.     },
  1095.     //KIL:
  1096.     //0xD2:
  1097.     function (parentObj) {
  1098.         parentObj.opcodeKILCalled(0xD2);
  1099.     },
  1100.     //DOP Zero Page, X:
  1101.     //#0xD4:
  1102.     function (parentObj) {
  1103.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  1104.         parentObj.CPUTicks += 4;
  1105.     },
  1106.     //CLD:
  1107.     //0xD8:
  1108.     function (parentObj) {
  1109.         parentObj.FlagDecimal = 0x20;
  1110.         parentObj.CPUTicks += 2;
  1111.     },
  1112.     //CPX Immediate:
  1113.     //0xE0:
  1114.     function (parentObj) {
  1115.         var temp_var = parentObj.registerX - parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
  1116.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  1117.         parentObj.FlagCarry = (temp_var > 0xFF);
  1118.         parentObj.FlagNegative = (temp_var > 0x7F);
  1119.         parentObj.FlagZero = (temp_var == 0);
  1120.         parentObj.CPUTicks += 2;
  1121.     },
  1122.     //DOP Immediate:
  1123.     //#0xE2:
  1124.     function (parentObj) {
  1125.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  1126.         parentObj.CPUTicks += 2;
  1127.     },
  1128.     //CPX Zero Page:
  1129.     //0xE4:
  1130.     function (parentObj) {
  1131.         var temp_var = parentObj.registerX - parentObj.memory[parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter)];
  1132.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  1133.         parentObj.FlagCarry = (temp_var > 0xFF);
  1134.         parentObj.FlagNegative = (temp_var > 0x7F);
  1135.         parentObj.FlagZero = (temp_var == 0);
  1136.         parentObj.CPUTicks += 3;
  1137.     },
  1138.     //INX:
  1139.     //0xE8:
  1140.     function (parentObj) {
  1141.         parentObj.registerX = (parentObj.registerX + 1) & 0xFF;
  1142.         parentObj.FlagNegative = (parentObj.registerX > 0x7F);
  1143.         parentObj.FlagZero = (parentObj.registerX == 0);
  1144.         parentObj.CPUTicks += 2;
  1145.     },
  1146.     //CPX Absolute:
  1147.     //0xEC:
  1148.     function (parentObj) {
  1149.         var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
  1150.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  1151.         temp_var |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8;
  1152.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  1153.         temp_var = parentObj.registerX - temp_var;
  1154.         parentObj.FlagCarry = (temp_var > 0xFF);
  1155.         parentObj.FlagNegative = (temp_var > 0x7F);
  1156.         parentObj.FlagZero = (temp_var == 0);
  1157.         parentObj.CPUTicks += 4;
  1158.     },
  1159.     //NOP:
  1160.     //0xEA:
  1161.     function (parentObj) {
  1162.         parentObj.CPUTicks += 2;
  1163.     },
  1164.     //BEQ:
  1165.     //0xF0:
  1166.     function (parentObj) {
  1167.         if (parentObj.FlagZero) {
  1168.             parentObj.programCounter = (parentObj.programCounter + ((parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 24) >> 24) + 1) & 0xFFFF;
  1169.             parentObj.CPUTicks += ((temp_var ^ parentObj.programCounter) > 0xFF) ? 4 : 3;
  1170.         }
  1171.         else {
  1172.             parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  1173.             parentObj.CPUTicks += 2;
  1174.         }
  1175.     },
  1176.     //KIL:
  1177.     //0xF2:
  1178.     function (parentObj) {
  1179.         parentObj.opcodeKILCalled(0xF2);
  1180.     },
  1181.     //DOP Zero Page, X:
  1182.     //#0xF4:
  1183.     function (parentObj) {
  1184.         parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
  1185.         parentObj.CPUTicks += 4;
  1186.     },
  1187.     //SED:
  1188.     //0xF8:
  1189.     function (parentObj) {
  1190.         parentObj.FlagDecimal = 0x28;
  1191.         parentObj.CPUTicks += 2;
  1192.     },
  1193. ];
  1194. Ricoh2A03.prototype.opcodeKILCalled = function (parentObj, opcode) {
  1195.     cout("KIL op code "+ opcode + " called, pausing emulation.", 2);
  1196.     parentObj.pause();
  1197. }
  1198. Ricoh2A03.prototype.memoryWriteCompiler = function () {
  1199.     //0-0x1FFF;
  1200.     this.compileRAMWriteHandler();
  1201.     //0x2000-0x3FFF;
  1202.     this.compilePPUWriteHandler();
  1203. }
  1204. Ricoh2A03.prototype.compileRAMWriteHandler = function () {
  1205.     var index = 0;
  1206.     //Zero Page RAM:
  1207.     //Stack RAM:
  1208.     //RAM:
  1209.     do {
  1210.         this.memoryWriter[index++] = this.memoryWriteNormal;
  1211.     } while (index < 0x7FF);
  1212.     //Populating the 0x800-0x1FFF echo RAM:
  1213.     do {
  1214.         this.memoryWriter[index++] = this.memoryWriteEcho1;
  1215.     } while (index < 0x2000);
  1216. }
  1217. Ricoh2A03.prototype.compilePPUWriteHandler = function () {
  1218.     var index = 0x2000
  1219.     while (index < 0x4000) {
  1220.         //PPU Control Register 1:
  1221.         //0x2000:
  1222.         this.memoryWrite[index++] = function (parentObj, address, data) {
  1223.             //Bit 7: Vblank IRQ Enable:
  1224.             parentObj.PPUVblankIRQ = (data > 0x7F);
  1225.             //Bit 6: Not Used?
  1226.             //Bit 5: 8x8 - 8x16 Sprite Size Selection:
  1227.             parentObj.PPUSpriteDoubleSize = ((data & 0x20) == 0x20);
  1228.             //Bit 4: Screen Pattern Table:
  1229.             parentObj.PPUBGPatternTablePosition = (data & 0x10) << 8;
  1230.             //Bit 3: Screen Pattern Table:
  1231.             parentObj.PPUSPRPatternTablePosition = (data & 0x08) << 8;
  1232.             //Bit 2: PPU Write Incrementation:
  1233.             parentObj.PPUWriteIncrementAmount = ((data & 0x04) == 0x04) ? 0x20 : 1;
  1234.             //Bit 1: Name Table Y Scroll:
  1235.             parentObj.PPUNameTableYScroll = (data & 0x02) * 120;
  1236.             //Bit 0: Name Table X Scroll:
  1237.             parentObj.PPUNameTableXScroll = (data & 0x01) << 8;
  1238.         };
  1239.         //PPU Control Register 2:
  1240.         //0x2001:
  1241.         this.memoryWrite[index++] = function (parentObj, address, data) {
  1242.             //Bits 5-7:
  1243.             parentObj.PPUIntensity = data >> 5; //Bit 5=R, Bit 6=B, Bit 7=G
  1244.             //Bit 4: Sprite Display (All SPR Pixels):
  1245.             parentObj.PPUSPRDisplay = ((data & 0x10) == 0x10);
  1246.             //Bit 3: Background Display (All BG Pixels):
  1247.             parentObj.PPUBGDisplay = ((data & 0x08) == 0x08);
  1248.             //Bit 2: Sprite Mask (8 Left-Most Pixels):
  1249.             parentObj.PPUSpriteMask = ((data & 0x04) < 0x04);
  1250.             //Bit 1: Image Mask (8 Left-Most Pixels):
  1251.             parentObj.PPUImageMask = ((data & 0x02) < 0x02);
  1252.             //Bit 0: Disable Composite Colorburst:
  1253.             parentObj.PPUNoColor = ((data & 0x01) == 0x01);
  1254.         };
  1255.         //PPU Status Register:
  1256.         //0x2002:
  1257.         this.memoryWrite[index++] = this.memoryWriteIgnore;
  1258.         //SPR-RAM Address Register:
  1259.         //0x2003:
  1260.         this.memoryWrite[index++] = function (parentOj, address, data) {
  1261.             parentOj.PPUCurrentSpriteAddress = data;
  1262.         };
  1263.         //SPR-RAM Data Register:
  1264.         //0x2004:
  1265.         this.memoryWrite[index++] = function (parentOj, address, data) {
  1266.             parentOj.SPRRAM[parentOj.PPUCurrentSpriteAddress++] = data;
  1267.             parentOj.PPUCurrentSpriteAddress &= 0xFF;
  1268.         };
  1269.         //PPU Background Scrolling Offset:
  1270.         //0x2005:
  1271.         this.memoryWrite[index++] = function (parentOj, address, data) {
  1272.             if (parentOj.PPUFirstWriteScroll == -1) {
  1273.                 //Documents say that the first write is not used until the second write:
  1274.                 parentObj.PPUFirstWriteScroll = data;
  1275.                 parentOj.PPUFirstWriteVRAM = -1;    //Reset register 0x2006 write buffering.
  1276.             }
  1277.             else if (data < 240) {
  1278.                 //Update the internal scrolling variables and reset the buffer:
  1279.                 parentObj.PPUXScroll = parentObj.PPUFirstWriteScroll;
  1280.                 parentObj.PPUYScroll = data;
  1281.                 parentOj.PPUFirstWriteScroll = -1;
  1282.             }
  1283.         };
  1284.         //PPU Memory Address:
  1285.         //0x2006:
  1286.         this.memoryWrite[index++] = function (parentOj, address, data) {
  1287.             if (parentOj.PPUFirstWriteVRAM == -1) {
  1288.                 //Documents say that the first write is not used until the second write:
  1289.                 parentObj.PPUFirstWriteVRAM = data;
  1290.                 parentOj.PPUFirstWriteScroll = -1;  //Reset register 0x2005 write buffering.
  1291.             }
  1292.             else {
  1293.                 //Update the internal address variable and reset the buffer:
  1294.                 parentObj.PPUVRAMAddress = ((parentObj.PPUFirstWriteVRAM & 0x20) << 8) | data;
  1295.                 parentOj.PPUFirstWriteVRAM = -1;
  1296.             }
  1297.         };
  1298.         //PPU Memory Data:
  1299.         //0x2007:
  1300.         this.memoryWrite[index++] = function (parentOj, address, data) {
  1301.             //Attempt a VRAM write to the PPU:
  1302.             parentObj.writePPU[parentObj.PPUVRAMAddress](parentObj, parentObj.PPUVRAMAddress, data);
  1303.             parentObj.PPUVRAMAddress = (parentObj.PPUVRAMAddress + parentObj.PPUWriteIncrementAmount) & 0x3FFF;
  1304.         };
  1305.     }
  1306. }
  1307. Ricoh2A03.prototype.memoryWriteNormal = function (parentObj, address, data) {
  1308.     parentObj.memory[address] = data;
  1309. }
  1310. Ricoh2A03.prototype.memoryWriteStack = function (parentObj, address, data) {
  1311.     parentObj.memory[0x100 | address] = data;
  1312. }
  1313. Ricoh2A03.prototype.memoryWriteEcho1 = function (parentObj, address, data) {
  1314.     parentObj.memory[address & 0x7FF] = data;
  1315. }
  1316.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement