Advertisement
kgkotzamanidis

SM83.cpp

Mar 23rd, 2025
363
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 45.29 KB | Gaming | 0 0
  1. /*
  2.  *An Gameboy and GameboyColor emulation with project name GkotzamBoyGR
  3.  *Copyright (C) <Fri Mar 21 2025>  <KGkotzamanidis>
  4.  *
  5.  *This program is free software: you can redistribute it and/or modify
  6.  *it under the terms of the GNU General Public License as published by
  7.  *the Free Software Foundation, either version 3 of the License, or
  8.  *(at your option) any later version.
  9.  *
  10.  *This program is distributed in the hope that it will be useful,
  11.  *but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  *GNU General Public License for more details.
  14.  *
  15.  *You should have received a copy of the GNU General Public License
  16.  *along with this program.  If not, see <https://www.gnu.org/licenses/>.
  17.  */
  18. #include "SM83.h"
  19. SM83::SM83(Motherboard &mem) : mem(&mem)
  20. {
  21.     std::printf("Initiallize CPU Sector\n");
  22.     EIDIFlag = false;
  23.     IME = false;
  24.     IMEhold = false;
  25.     ishalt = false;
  26. }
  27. const int SM83::instructionCount[] = {
  28.     4,12,8,8,4,4,8,4,20,8,8,8,4,4,8,4,
  29.     4,12,8,8,4,4,8,4,12,8,8,8,4,4,8,4,
  30.     8,12,8,8,4,4,8,4,8,8,8,8,4,4,8,4,
  31.     8,12,8,8,12,12,12,4,8,8,8,8,4,4,8,4,
  32.     4,4,4,4,4,4,8,4,4,4,4,4,4,4,8,4,
  33.     4,4,4,4,4,4,8,4,4,4,4,4,4,4,8,4,
  34.     4,4,4,4,4,4,8,4,4,4,4,4,4,4,8,4,
  35.     8,8,8,8,8,8,4,8,4,4,4,4,4,4,8,4,
  36.     4,4,4,4,4,4,8,4,4,4,4,4,4,4,8,4,
  37.     4,4,4,4,4,4,8,4,4,4,4,4,4,4,8,4,
  38.     4,4,4,4,4,4,8,4,4,4,4,4,4,4,8,4,
  39.     4,4,4,4,4,4,8,4,4,4,4,4,4,4,8,4,
  40.     8,12,12,16,12,16,8,16,8,16,12,4,12,24,8,16,
  41.     8,12,12,0,12,16,8,16,8,16,12,0,12,0,8,16,
  42.     12,12,8,0,0,16,8,16,16,4,16,0,0,0,8,16,
  43.     12,12,8,4,0,16,8,16,12,8,16,4,0,0,8,16,
  44. };
  45.  
  46. const int SM83::prefixedinstructionCount[] = {
  47.     8,8,8,8,8,8,16,8,8,8,8,8,8,8,16,8,
  48.     8,8,8,8,8,8,16,8,8,8,8,8,8,8,16,8,
  49.     8,8,8,8,8,8,16,8,8,8,8,8,8,8,16,8,
  50.     8,8,8,8,8,8,16,8,8,8,8,8,8,8,16,8,
  51.     8,8,8,8,8,8,12,8,8,8,8,8,8,8,12,8,
  52.     8,8,8,8,8,8,12,8,8,8,8,8,8,8,12,8,
  53.     8,8,8,8,8,8,12,8,8,8,8,8,8,8,12,8,
  54.     8,8,8,8,8,8,12,8,8,8,8,8,8,8,12,8,
  55.     8,8,8,8,8,8,16,8,8,8,8,8,8,8,16,8,
  56.     8,8,8,8,8,8,16,8,8,8,8,8,8,8,16,8,
  57.     8,8,8,8,8,8,16,8,8,8,8,8,8,8,16,8,
  58.     8,8,8,8,8,8,16,8,8,8,8,8,8,8,16,8,
  59.     8,8,8,8,8,8,16,8,8,8,8,8,8,8,16,8,
  60.     8,8,8,8,8,8,16,8,8,8,8,8,8,8,16,8,
  61.     8,8,8,8,8,8,16,8,8,8,8,8,8,8,16,8,
  62.     8,8,8,8,8,8,16,8,8,8,8,8,8,8,16,8,
  63. };
  64.  
  65. void SM83::reset(void)
  66. {
  67.     EIDIFlag = false;
  68.     IME = false;
  69.     IMEhold = false;
  70.     ishalt = false;
  71.  
  72.     PC = 0x0000;
  73.     SP = 0x0000;
  74.     A = B = C = D = E = H = L = F = 0x00;
  75. }
  76.  
  77. void SM83::step(void)
  78. {
  79.     IME = EIDIFlag ? IME : IMEhold;
  80.     EIDIFlag = false;
  81.  
  82.     uint8_t iflags = mem->readByte(IFaddress);
  83.     uint8_t ieflags = mem->readByte(IEaddress);
  84.     uint8_t activeInterrupts = iflags & ieflags;
  85.  
  86.     if (activeInterrupts != 0)
  87.     {
  88.         ishalt = false;
  89.  
  90.         if (IME)
  91.         {
  92.             IMEhold = false;
  93.             IME = false;
  94.  
  95.             if (activeInterrupts & VBlankInterrupt)
  96.             {
  97.                 mem->writeByte(IFaddress, iflags & ~VBlankInterrupt);
  98.                 rst(0x40);
  99.             }
  100.             else if (activeInterrupts & LCDCInterrupt)
  101.             {
  102.                 mem->writeByte(IFaddress, iflags & ~LCDCInterrupt);
  103.                 rst(0x48);
  104.             }
  105.             else if (activeInterrupts & timerOverflow)
  106.             {
  107.                 mem->writeByte(IFaddress, iflags & ~timerOverflow);
  108.                 rst(0x50);
  109.             }
  110.             else if (activeInterrupts & buttonOverflow)
  111.             {
  112.                 mem->writeByte(IFaddress, iflags & ~buttonOverflow);
  113.                 rst(0x60);
  114.             }
  115.         }
  116.     }
  117.  
  118.     if (!ishalt)
  119.     {
  120.         executeInstruction(mem->readByte(PC));
  121.     }
  122.     else
  123.     {
  124.         lastCycleCount = 4;
  125.     }
  126. }
  127.  
  128. bool SM83::getDoubleSpeed()
  129. {
  130.     return DoubleSpeed;
  131. }
  132.  
  133. int SM83::getlastCycleCount()
  134. {
  135.     return lastCycleCount;
  136. }
  137.  
  138. /* For more information about the SM83 Instruction read this
  139.    https://gbdev.io/gb-opcodes/optables/
  140. */
  141. void SM83::executeInstruction(uint8_t opcode)
  142. {
  143.     PC++;
  144.     lastCycleCount = instructionCount[opcode];
  145.  
  146.     switch (opcode)
  147.     {
  148.     case 0x00:
  149.         nop();
  150.         break;
  151.     case 0x01:
  152.         setBC(mem->readWord(PC));
  153.         PC += 2;
  154.         break;
  155.     case 0x02:
  156.         mem->writeByte(BC(), A);
  157.         break;
  158.     case 0x03:
  159.         setBC(BC() + 1);
  160.         break;
  161.     case 0x04:
  162.         B = alu8bitINC(B);
  163.         break;
  164.     case 0x05:
  165.         B = alu8bitDEC(B);
  166.         break;
  167.     case 0x06:
  168.         B = mem->readByte(PC);
  169.         PC++;
  170.         break;
  171.     case 0x07:
  172.     {
  173.         /*
  174.          *A = RLC(A);
  175.          */
  176.         bool carry = (A & 0x80) != 0;
  177.         A = (A << 1) | (uint8_t)carry;
  178.         setFlag(Flag_Z, false);
  179.         setFlag(Flag_N, false);
  180.         setFlag(Flag_H, false);
  181.         setFlag(Flag_C, carry);
  182.         break;
  183.     }
  184.     case 0x08:
  185.         mem->writeWord(mem->readWord(PC), SP);
  186.         PC += 2;
  187.         break;
  188.     case 0x09:
  189.         alu16bitADD(BC());
  190.         break;
  191.     case 0x0A:
  192.         A = mem->readByte(BC());
  193.         break;
  194.     case 0x0B:
  195.         setBC(BC() - 1);
  196.         break;
  197.     case 0x0C:
  198.         C = alu8bitINC(C);
  199.         break;
  200.     case 0x0D:
  201.         C = alu8bitDEC(C);
  202.         break;
  203.     case 0x0E:
  204.         C = mem->readByte(PC);
  205.         PC++;
  206.         break;
  207.     case 0x0F:
  208.     {
  209.         /*
  210.          *A = RRC(A);
  211.          */
  212.         bool carry = (A & 0x1) != 0;
  213.         A = (A >> 1) | (carry << 7);
  214.         setFlag(Flag_Z, false);
  215.         setFlag(Flag_N, false);
  216.         setFlag(Flag_H, false);
  217.         setFlag(Flag_C, carry);
  218.         break;
  219.     }
  220.     case 0x10:
  221.         stop();
  222.         PC++;
  223.         break;
  224.     case 0x11:
  225.         setDE(mem->readWord(PC));
  226.         PC += 2;
  227.         break;
  228.     case 0x12:
  229.         mem->writeByte(DE(), A);
  230.         break;
  231.     case 0x13:
  232.         setDE(DE() + 1);
  233.         break;
  234.     case 0x14:
  235.         D = alu8bitINC(D);
  236.         break;
  237.     case 0x15:
  238.         D = alu8bitDEC(D);
  239.         break;
  240.     case 0x16:
  241.         D = mem->readByte(PC);
  242.         PC++;
  243.         break;
  244.     case 0x17:
  245.     {
  246.         /*
  247.          *A = RL(A);
  248.          */
  249.         bool carryFlagBit = getFlagC();
  250.         bool carry = (A & 0x80) != 0;
  251.         A = (A << 1) | (uint8_t)carryFlagBit;
  252.         setFlag(Flag_Z, false);
  253.         setFlag(Flag_N, false);
  254.         setFlag(Flag_H, false);
  255.         setFlag(Flag_C, carry);
  256.         break;
  257.     }
  258.     case 0x18:
  259.         jr(true);
  260.         break;
  261.     case 0x19:
  262.         alu16bitADD(DE());
  263.         break;
  264.     case 0x1A:
  265.         A = mem->readByte(DE());
  266.         break;
  267.     case 0x1B:
  268.         setDE(DE() - 1);
  269.         break;
  270.     case 0x1C:
  271.         E = alu8bitINC(E);
  272.         break;
  273.     case 0x1D:
  274.         E = alu8bitDEC(E);
  275.         break;
  276.     case 0x1E:
  277.         E = mem->readByte(PC);
  278.         PC++;
  279.         break;
  280.     case 0x1F:
  281.     {
  282.         /*
  283.          * A = RR(A);
  284.          */
  285.         bool carryFlagBit = getFlagC();
  286.         bool carry = (A & 0x1) != 0;
  287.         A = (A >> 1) | (carryFlagBit << 7);
  288.         setFlag(Flag_Z, false);
  289.         setFlag(Flag_N, false);
  290.         setFlag(Flag_H, false);
  291.         setFlag(Flag_C, carry);
  292.         break;
  293.     }
  294.     case 0x20:
  295.         jr(!getFlagZ());
  296.         break;
  297.     case 0x21:
  298.         setHL(mem->readWord(PC));
  299.         PC += 2;
  300.         break;
  301.     case 0x22:
  302.         mem->writeByte(HL(), A);
  303.         setHL(HL() + 1);
  304.         break;
  305.     case 0x23:
  306.         setHL(HL() + 1);
  307.         break;
  308.     case 0x24:
  309.         H = alu8bitINC(H);
  310.         break;
  311.     case 0x25:
  312.         H = alu8bitDEC(H);
  313.         break;
  314.     case 0x26:
  315.         H = mem->readByte(PC);
  316.         PC++;
  317.         break;
  318.     case 0x27:
  319.         logic8bitDAA();
  320.         break;
  321.     case 0x28:
  322.         jr(getFlagZ());
  323.         break;
  324.     case 0x29:
  325.         alu16bitADD(HL());
  326.         break;
  327.     case 0x2A:
  328.         A = mem->readByte(HL());
  329.         setHL(HL() + 1);
  330.         break;
  331.     case 0x2B:
  332.         setHL(HL() - 1);
  333.         break;
  334.     case 0x2C:
  335.         L = alu8bitINC(L);
  336.         break;
  337.     case 0x2D:
  338.         L = alu8bitDEC(L);
  339.         break;
  340.     case 0x2E:
  341.         L = mem->readByte(PC);
  342.         PC++;
  343.         break;
  344.     case 0x2F:
  345.         logic8bitCPL();
  346.         break;
  347.     case 0x30:
  348.         jr(!getFlagC());
  349.         break;
  350.     case 0x31:
  351.         SP = mem->readWord(PC);
  352.         PC += 2;
  353.         break;
  354.     case 0x32:
  355.         mem->writeByte(HL(), A);
  356.         setHL(HL() - 1);
  357.         break;
  358.     case 0x33:
  359.         SP++;
  360.         break;
  361.     case 0x34:
  362.         mem->writeByte(HL(), alu8bitINC(mem->readByte(HL())));
  363.         break;
  364.     case 0x35:
  365.         mem->writeByte(HL(), alu8bitDEC(mem->readByte(HL())));
  366.         break;
  367.     case 0x36:
  368.         mem->writeWord(HL(), mem->readByte(PC));
  369.         PC++;
  370.         break;
  371.     case 0x37:
  372.         scf();
  373.         break;
  374.     case 0x38:
  375.         jr(getFlagC());
  376.         break;
  377.     case 0x39:
  378.         alu16bitADD(SP);
  379.         break;
  380.     case 0x3A:
  381.         A = mem->readByte(HL());
  382.         setHL(HL() - 1);
  383.         break;
  384.     case 0x3B:
  385.         SP--;
  386.         break;
  387.     case 0x3C:
  388.         A = alu8bitINC(A);
  389.         break;
  390.     case 0x3D:
  391.         A = alu8bitDEC(A);
  392.         break;
  393.     case 0x3E:
  394.         A = mem->readByte(PC);
  395.         PC++;
  396.         break;
  397.     case 0x3F:
  398.         ccf();
  399.         break;
  400.     case 0x40:
  401.         B = B;
  402.         break;
  403.     case 0x41:
  404.         B = C;
  405.         break;
  406.     case 0x42:
  407.         B = D;
  408.         break;
  409.     case 0x43:
  410.         B = E;
  411.         break;
  412.     case 0x44:
  413.         B = H;
  414.         break;
  415.     case 0x45:
  416.         B = L;
  417.         break;
  418.     case 0x46:
  419.         B = mem->readByte(HL());
  420.         break;
  421.     case 0x47:
  422.         B = A;
  423.         break;
  424.     case 0x48:
  425.         C = B;
  426.         break;
  427.     case 0x49:
  428.         C = C;
  429.         break;
  430.     case 0x4A:
  431.         C = D;
  432.         break;
  433.     case 0x4B:
  434.         C = E;
  435.         break;
  436.     case 0x4C:
  437.         C = H;
  438.         break;
  439.     case 0x4D:
  440.         C = L;
  441.         break;
  442.     case 0x4E:
  443.         C = mem->readByte(HL());
  444.         break;
  445.     case 0x4F:
  446.         C = A;
  447.         break;
  448.     case 0x50:
  449.         D = B;
  450.         break;
  451.     case 0x51:
  452.         D = C;
  453.         break;
  454.     case 0x52:
  455.         D = D;
  456.         break;
  457.     case 0x53:
  458.         D = E;
  459.         break;
  460.     case 0x54:
  461.         D = H;
  462.         break;
  463.     case 0x55:
  464.         D = L;
  465.         break;
  466.     case 0x56:
  467.         D = mem->readByte(HL());
  468.         break;
  469.     case 0x57:
  470.         D = A;
  471.         break;
  472.     case 0x58:
  473.         E = B;
  474.         break;
  475.     case 0x59:
  476.         E = C;
  477.         break;
  478.     case 0x5A:
  479.         E = D;
  480.         break;
  481.     case 0x5B:
  482.         E = E;
  483.         break;
  484.     case 0x5C:
  485.         E = H;
  486.         break;
  487.     case 0x5D:
  488.         E = L;
  489.         break;
  490.     case 0x5E:
  491.         E = mem->readByte(HL());
  492.         break;
  493.     case 0x5F:
  494.         E = A;
  495.         break;
  496.     case 0x60:
  497.         H = B;
  498.         break;
  499.     case 0x61:
  500.         H = C;
  501.         break;
  502.     case 0x62:
  503.         H = D;
  504.         break;
  505.     case 0x63:
  506.         H = E;
  507.         break;
  508.     case 0x64:
  509.         H = H;
  510.         break;
  511.     case 0x65:
  512.         H = L;
  513.         break;
  514.     case 0x66:
  515.         H = mem->readByte(HL());
  516.         break;
  517.     case 0x67:
  518.         H = A;
  519.         break;
  520.     case 0x68:
  521.         L = B;
  522.         break;
  523.     case 0x69:
  524.         L = C;
  525.         break;
  526.     case 0x6A:
  527.         L = D;
  528.         break;
  529.     case 0x6B:
  530.         L = E;
  531.         break;
  532.     case 0x6C:
  533.         L = H;
  534.         break;
  535.     case 0x6D:
  536.         L = L;
  537.         break;
  538.     case 0x6E:
  539.         L = mem->readByte(HL());
  540.         break;
  541.     case 0x6F:
  542.         L = A;
  543.         break;
  544.     case 0x70:
  545.         mem->writeByte(HL(), B);
  546.         break;
  547.     case 0x71:
  548.         mem->writeByte(HL(), C);
  549.         break;
  550.     case 0x72:
  551.         mem->writeByte(HL(), D);
  552.         break;
  553.     case 0x73:
  554.         mem->writeByte(HL(), E);
  555.         break;
  556.     case 0x74:
  557.         mem->writeByte(HL(), H);
  558.         break;
  559.     case 0x75:
  560.         mem->writeByte(HL(), L);
  561.         break;
  562.     case 0x76:
  563.         halt();
  564.         break;
  565.     case 0x77:
  566.         mem->writeByte(HL(), A);
  567.         break;
  568.     case 0x78:
  569.         A = B;
  570.         break;
  571.     case 0x79:
  572.         A = C;
  573.         break;
  574.     case 0x7A:
  575.         A = D;
  576.         break;
  577.     case 0x7B:
  578.         A = E;
  579.         break;
  580.     case 0x7C:
  581.         A = H;
  582.         break;
  583.     case 0x7D:
  584.         A = L;
  585.         break;
  586.     case 0x7E:
  587.         A = mem->readByte(HL());
  588.         break;
  589.     case 0x7F:
  590.         A = A;
  591.         break;
  592.     case 0x80:
  593.         alu8bitADD(B);
  594.         break;
  595.     case 0x81:
  596.         alu8bitADD(C);
  597.         break;
  598.     case 0x82:
  599.         alu8bitADD(D);
  600.         break;
  601.     case 0x83:
  602.         alu8bitADD(E);
  603.         break;
  604.     case 0x84:
  605.         alu8bitADD(H);
  606.         break;
  607.     case 0x85:
  608.         alu8bitADD(L);
  609.         break;
  610.     case 0x86:
  611.         alu8bitADD(mem->readByte(HL()));
  612.         break;
  613.     case 0x87:
  614.         alu8bitADD(A);
  615.         break;
  616.     case 0x88:
  617.         alu8bitADC(B, getFlagC());
  618.         break;
  619.     case 0x89:
  620.         alu8bitADC(C, getFlagC());
  621.         break;
  622.     case 0x8A:
  623.         alu8bitADC(D, getFlagC());
  624.         break;
  625.     case 0x8B:
  626.         alu8bitADC(E, getFlagC());
  627.         break;
  628.     case 0x8C:
  629.         alu8bitADC(H, getFlagC());
  630.         break;
  631.     case 0x8D:
  632.         alu8bitADC(L, getFlagC());
  633.         break;
  634.     case 0x8E:
  635.         alu8bitADC(mem->readByte(HL()), getFlagC());
  636.         break;
  637.     case 0x8F:
  638.         alu8bitADC(A, getFlagC());
  639.         break;
  640.     case 0x90:
  641.         alu8bitSUB(B);
  642.         break;
  643.     case 0x91:
  644.         alu8bitSUB(C);
  645.         break;
  646.     case 0x92:
  647.         alu8bitSUB(D);
  648.         break;
  649.     case 0x93:
  650.         alu8bitSUB(E);
  651.         break;
  652.     case 0x94:
  653.         alu8bitSUB(H);
  654.         break;
  655.     case 0x95:
  656.         alu8bitSUB(L);
  657.         break;
  658.     case 0x96:
  659.         alu8bitSUB(mem->readByte(HL()));
  660.         break;
  661.     case 0x97:
  662.         alu8bitSUB(A);
  663.         break;
  664.     case 0x98:
  665.         alu8bitSBC(B, getFlagC());
  666.         break;
  667.     case 0x99:
  668.         alu8bitSBC(C, getFlagC());
  669.         break;
  670.     case 0x9A:
  671.         alu8bitSBC(D, getFlagC());
  672.         break;
  673.     case 0x9B:
  674.         alu8bitSBC(E, getFlagC());
  675.         break;
  676.     case 0x9C:
  677.         alu8bitSBC(H, getFlagC());
  678.         break;
  679.     case 0x9D:
  680.         alu8bitSBC(L, getFlagC());
  681.         break;
  682.     case 0x9E:
  683.         alu8bitSBC(mem->readByte(HL()), getFlagC());
  684.         break;
  685.     case 0x9F:
  686.         alu8bitSBC(A, getFlagC());
  687.         break;
  688.     case 0xA0:
  689.         logic8bitAND(B);
  690.         break;
  691.     case 0xA1:
  692.         logic8bitAND(C);
  693.         break;
  694.     case 0xA2:
  695.         logic8bitAND(D);
  696.         break;
  697.     case 0xA3:
  698.         logic8bitAND(E);
  699.         break;
  700.     case 0xA4:
  701.         logic8bitAND(H);
  702.         break;
  703.     case 0xA5:
  704.         logic8bitAND(L);
  705.         break;
  706.     case 0xA6:
  707.         logic8bitAND(mem->readByte(HL()));
  708.         break;
  709.     case 0xA7:
  710.         logic8bitAND(A);
  711.         break;
  712.     case 0xA8:
  713.         logic8bitXOR(B);
  714.         break;
  715.     case 0xA9:
  716.         logic8bitXOR(C);
  717.         break;
  718.     case 0xAA:
  719.         logic8bitXOR(D);
  720.         break;
  721.     case 0xAB:
  722.         logic8bitXOR(E);
  723.         break;
  724.     case 0xAC:
  725.         logic8bitXOR(H);
  726.         break;
  727.     case 0xAD:
  728.         logic8bitXOR(L);
  729.         break;
  730.     case 0xAE:
  731.         logic8bitXOR(mem->readByte(HL()));
  732.         break;
  733.     case 0xAF:
  734.         logic8bitXOR(A);
  735.         break;
  736.     case 0xB0:
  737.         logic8bitOR(B);
  738.         break;
  739.     case 0xB1:
  740.         logic8bitOR(C);
  741.         break;
  742.     case 0xB2:
  743.         logic8bitOR(D);
  744.         break;
  745.     case 0xB3:
  746.         logic8bitOR(E);
  747.         break;
  748.     case 0xB4:
  749.         logic8bitOR(H);
  750.         break;
  751.     case 0xB5:
  752.         logic8bitOR(L);
  753.         break;
  754.     case 0xB6:
  755.         logic8bitOR(mem->readByte(HL()));
  756.         break;
  757.     case 0xB7:
  758.         logic8bitOR(A);
  759.         break;
  760.     case 0xB8:
  761.         logic8bitCP(B);
  762.         break;
  763.     case 0xB9:
  764.         logic8bitCP(C);
  765.         break;
  766.     case 0xBA:
  767.         logic8bitCP(D);
  768.         break;
  769.     case 0xBB:
  770.         logic8bitCP(E);
  771.         break;
  772.     case 0xBC:
  773.         logic8bitCP(H);
  774.         break;
  775.     case 0xBD:
  776.         logic8bitCP(L);
  777.         break;
  778.     case 0xBE:
  779.         logic8bitCP(mem->readByte(HL()));
  780.         break;
  781.     case 0xBF:
  782.         logic8bitCP(A);
  783.         break;
  784.     case 0xC0:
  785.         ret(!getFlagZ());
  786.         break;
  787.     case 0xC1:
  788.         setBC(mem->readWord(SP));
  789.         SP += 2;
  790.         break;
  791.     case 0xC2:
  792.         jp(!getFlagZ());
  793.         break;
  794.     case 0xC3:
  795.         jp(true);
  796.         break;
  797.     case 0xC4:
  798.         call(!getFlagZ());
  799.         break;
  800.     case 0xC5:
  801.         SP -= 2;
  802.         mem->writeWord(SP, BC());
  803.         break;
  804.     case 0xC6:
  805.         alu8bitADD(mem->readByte(PC));
  806.         PC++;
  807.         break;
  808.     case 0xC7:
  809.         rst(0x00);
  810.         break;
  811.     case 0xC8:
  812.         ret(getFlagZ());
  813.         break;
  814.     case 0xC9:
  815.         ret(true);
  816.         break;
  817.     case 0xCA:
  818.         jp(getFlagZ());
  819.         break;
  820.     case 0xCB:
  821.         executePrefixedInstruction(mem->readByte(PC));
  822.         break;
  823.     case 0xCC:
  824.         call(getFlagZ());
  825.         break;
  826.     case 0xCD:
  827.         call(true);
  828.         break;
  829.     case 0xCE:
  830.         alu8bitADC(mem->readByte(PC), getFlagC());
  831.         PC++;
  832.         break;
  833.     case 0xCF:
  834.         rst(0x08);
  835.         break;
  836.     case 0xD0:
  837.         ret(!getFlagC());
  838.         break;
  839.     case 0xD1:
  840.         setDE(mem->readWord(SP));
  841.         SP += 2;
  842.         break;
  843.     case 0xD2:
  844.         jp(!getFlagC());
  845.         break;
  846.     case 0xD3:
  847.         /* Empty Instruction */
  848.         std::cout << "Empty Instruction" << std::endl;
  849.         break;
  850.     case 0xD4:
  851.         call(!getFlagC());
  852.         break;
  853.     case 0xD5:
  854.         SP -= 2;
  855.         mem->writeWord(SP, DE());
  856.         break;
  857.     case 0xD6:
  858.         alu8bitSUB(mem->readByte(PC));
  859.         PC++;
  860.         break;
  861.     case 0xD7:
  862.         rst(0x10);
  863.         break;
  864.     case 0xD8:
  865.         ret(getFlagC());
  866.         break;
  867.     case 0xD9:
  868.         reti();
  869.         break;
  870.     case 0xDA:
  871.         jp(getFlagC());
  872.         break;
  873.     case 0xDB:
  874.         /* Empty Instruction */
  875.         std::cout << "Empty Instruction" << std::endl;
  876.         break;
  877.     case 0xDC:
  878.         call(getFlagC());
  879.         break;
  880.     case 0xDD:
  881.         /* Empty Instruction */
  882.         std::cout << "Empty Instruction" << std::endl;
  883.         break;
  884.     case 0xDE:
  885.         alu8bitSBC(mem->readByte(PC), getFlagC());
  886.         PC++;
  887.         break;
  888.     case 0xDF:
  889.         rst(0x18);
  890.         break;
  891.     case 0xE0:
  892.         mem->writeByte(0xFF00 + mem->readByte(PC), A);
  893.         PC++;
  894.         break;
  895.     case 0xE1:
  896.         setHL(mem->readWord(SP));
  897.         SP += 2;
  898.         break;
  899.     case 0xE2:
  900.         mem->writeByte(0xFF00 + C, A);
  901.         break;
  902.     case 0xE3:
  903.         /* Empty Instruction */
  904.         std::cout << "Empty Instruction" << std::endl;
  905.         break;
  906.     case 0xE4:
  907.         /* Empty Instruction */
  908.         std::cout << "Empty Instruction" << std::endl;
  909.         break;
  910.     case 0xE5:
  911.         SP -= 2;
  912.         mem->writeWord(SP, HL());
  913.         break;
  914.     case 0xE6:
  915.         logic8bitAND(mem->readByte(PC));
  916.         PC++;
  917.         break;
  918.     case 0xE7:
  919.         rst(0x20);
  920.         break;
  921.     case 0xE8:
  922.         alu16bitSPADD();
  923.         break;
  924.     case 0xE9:
  925.         PC = HL();
  926.         PC += 2;
  927.         break;
  928.     case 0xEA:
  929.         mem->writeByte(mem->readWord(PC), A);
  930.         PC += 2;
  931.         break;
  932.     case 0xEB:
  933.         /* Empty Instruction */
  934.         std::cout << "Empty Instruction" << std::endl;
  935.         break;
  936.     case 0xEC:
  937.         /* Empty Instruction */
  938.         std::cout << "Empty Instruction" << std::endl;
  939.         break;
  940.     case 0xED:
  941.         /* Empty Instruction */
  942.         std::cout << "Empty Instruction" << std::endl;
  943.         break;
  944.     case 0xEE:
  945.         logic8bitXOR(mem->readByte(PC));
  946.         PC++;
  947.         break;
  948.     case 0xEF:
  949.         rst(0x28);
  950.         break;
  951.     case 0xF0:
  952.         A = mem->readByte(0xFF00 + mem->readByte(PC));
  953.         PC++;
  954.         break;
  955.     case 0xF1:
  956.         setAF(mem->readWord(SP));
  957.         SP += 2;
  958.         break;
  959.     case 0xF2:
  960.         A = mem->readByte(0xFF00 + C);
  961.         break;
  962.     case 0xF3:
  963.         di();
  964.         break;
  965.     case 0xF4:
  966.         /* Empty Instruction */
  967.         std::cout << "Empty Instruction" << std::endl;
  968.     case 0xF5:
  969.         SP -= 2;
  970.         mem->writeWord(SP, AF());
  971.         break;
  972.     case 0xF6:
  973.         logic8bitOR(mem->readByte(PC));
  974.         PC++;
  975.         break;
  976.     case 0xF7:
  977.         rst(0x30);
  978.         break;
  979.     case 0xF8:
  980.     {
  981.         int8_t data = mem->readByte(PC);
  982.         uint16_t result = SP + data;
  983.         setFlag(Flag_Z, false);
  984.         setFlag(Flag_N, false);
  985.         setFlag(Flag_H, ((SP & 0x0F) + (data & 0x0F)) > 0x0F);
  986.         setFlag(Flag_C, result > 0xFFFF);
  987.         setHL(result);
  988.         PC++;
  989.         break;
  990.     }
  991.     case 0xF9:
  992.         SP = HL();
  993.         break;
  994.     case 0xFA:
  995.         A = mem->readByte(mem->readWord(PC));
  996.         PC += 2;
  997.         break;
  998.     case 0xFB:
  999.         ei();
  1000.         break;
  1001.     case 0xFC:
  1002.         /* Empty Instruction */
  1003.         std::printf("Empty Instruction");
  1004.         break;
  1005.     case 0xFD:
  1006.         /* Empty Instruction */
  1007.         std::printf("Empty Instruction");
  1008.         break;
  1009.     case 0xFE:
  1010.         logic8bitCP(mem->readByte(PC));
  1011.         PC++;
  1012.         break;
  1013.     case 0xFF:
  1014.         rst(0x38);
  1015.         break;
  1016.     }
  1017. }
  1018.  
  1019. void SM83::executePrefixedInstruction(uint8_t opcode)
  1020. {
  1021.     PC++;
  1022.     lastCycleCount = prefixedinstructionCount[opcode];
  1023.     switch (opcode)
  1024.     {
  1025.     case 0x0:
  1026.         B = RLC(B);
  1027.         break;
  1028.     case 0x1:
  1029.         C = RLC(C);
  1030.         break;
  1031.     case 0x2:
  1032.         D = RLC(D);
  1033.         break;
  1034.     case 0x3:
  1035.         E = RLC(E);
  1036.         break;
  1037.     case 0x4:
  1038.         H = RLC(H);
  1039.         break;
  1040.     case 0x5:
  1041.         L = RLC(L);
  1042.         break;
  1043.     case 0x6:
  1044.         mem->writeByte(HL(), RLC(mem->readByte(HL())));
  1045.         break;
  1046.     case 0x7:
  1047.         A = RLC(A);
  1048.         break;
  1049.     case 0x8:
  1050.         B = RRC(B);
  1051.         break;
  1052.     case 0x9:
  1053.         C = RRC(C);
  1054.         break;
  1055.     case 0xA:
  1056.         D = RRC(D);
  1057.         break;
  1058.     case 0xB:
  1059.         E = RRC(E);
  1060.         break;
  1061.     case 0xC:
  1062.         H = RRC(H);
  1063.         break;
  1064.     case 0xD:
  1065.         L = RRC(L);
  1066.         break;
  1067.     case 0xE:
  1068.         mem->writeByte(HL(), RRC(mem->readByte(HL())));
  1069.         break;
  1070.     case 0xF:
  1071.         A = RRC(A);
  1072.         break;
  1073.     case 0x10:
  1074.         B = RL(B);
  1075.         break;
  1076.     case 0x11:
  1077.         C = RL(C);
  1078.         break;
  1079.     case 0x12:
  1080.         D = RL(D);
  1081.         break;
  1082.     case 0x13:
  1083.         E = RL(E);
  1084.         break;
  1085.     case 0x14:
  1086.         H = RL(H);
  1087.         break;
  1088.     case 0x15:
  1089.         L = RL(L);
  1090.         break;
  1091.     case 0x16:
  1092.         mem->writeByte(HL(), RL(mem->readByte(HL())));
  1093.         break;
  1094.     case 0x17:
  1095.         A = RL(A);
  1096.         break;
  1097.     case 0x18:
  1098.         B = RR(B);
  1099.         break;
  1100.     case 0x19:
  1101.         C = RR(C);
  1102.         break;
  1103.     case 0x1A:
  1104.         D = RR(D);
  1105.         break;
  1106.     case 0x1B:
  1107.         E = RR(E);
  1108.         break;
  1109.     case 0x1C:
  1110.         H = RR(H);
  1111.         break;
  1112.     case 0x1D:
  1113.         L = RR(L);
  1114.         break;
  1115.     case 0x1E:
  1116.         mem->writeByte(HL(), RR(mem->readByte(HL())));
  1117.         break;
  1118.     case 0x1F:
  1119.         A = RR(A);
  1120.         break;
  1121.     case 0x20:
  1122.         B = SLA(B);
  1123.         break;
  1124.     case 0x21:
  1125.         C = SLA(C);
  1126.         break;
  1127.     case 0x22:
  1128.         D = SLA(D);
  1129.         break;
  1130.     case 0x23:
  1131.         E = SLA(E);
  1132.         break;
  1133.     case 0x24:
  1134.         H = SLA(H);
  1135.         break;
  1136.     case 0x25:
  1137.         L = SLA(L);
  1138.         break;
  1139.     case 0x26:
  1140.         mem->writeByte(HL(), SLA(mem->readByte(HL())));
  1141.         break;
  1142.     case 0x27:
  1143.         A = SLA(A);
  1144.         break;
  1145.     case 0x28:
  1146.         B = SRA(B);
  1147.         break;
  1148.     case 0x29:
  1149.         C = SRA(C);
  1150.         break;
  1151.     case 0x2A:
  1152.         D = SRA(D);
  1153.         break;
  1154.     case 0x2B:
  1155.         E = SRA(E);
  1156.         break;
  1157.     case 0x2C:
  1158.         H = SRA(H);
  1159.         break;
  1160.     case 0x2D:
  1161.         L = SRA(L);
  1162.         break;
  1163.     case 0x2E:
  1164.         mem->writeByte(HL(), SRA(mem->readByte(HL())));
  1165.         break;
  1166.     case 0x2F:
  1167.         A = SRA(A);
  1168.         break;
  1169.     case 0x30:
  1170.         B = SWAP(B);
  1171.         break;
  1172.     case 0x31:
  1173.         C = SWAP(C);
  1174.         break;
  1175.     case 0x32:
  1176.         D = SWAP(D);
  1177.         break;
  1178.     case 0x33:
  1179.         E = SWAP(E);
  1180.         break;
  1181.     case 0x34:
  1182.         H = SWAP(H);
  1183.         break;
  1184.     case 0x35:
  1185.         L = SWAP(L);
  1186.         break;
  1187.     case 0x36:
  1188.         mem->writeByte(HL(), SWAP(mem->readByte(HL())));
  1189.         break;
  1190.     case 0x37:
  1191.         A = SWAP(A);
  1192.         break;
  1193.     case 0x38:
  1194.         B = SRL(B);
  1195.         break;
  1196.     case 0x39:
  1197.         C = SRL(C);
  1198.         break;
  1199.     case 0x3A:
  1200.         D = SRL(D);
  1201.         break;
  1202.     case 0x3B:
  1203.         E = SRL(E);
  1204.         break;
  1205.     case 0x3C:
  1206.         H = SRL(H);
  1207.         break;
  1208.     case 0x3D:
  1209.         L = SRL(L);
  1210.         break;
  1211.     case 0x3E:
  1212.         mem->writeByte(HL(), mem->readByte(HL()));
  1213.         break;
  1214.     case 0x3F:
  1215.         A = SRL(A);
  1216.         break;
  1217.     case 0x40:
  1218.         BIT(0, B);
  1219.         break;
  1220.     case 0x41:
  1221.         BIT(0, C);
  1222.         break;
  1223.     case 0x42:
  1224.         BIT(0, D);
  1225.         break;
  1226.     case 0x43:
  1227.         BIT(0, E);
  1228.         break;
  1229.     case 0x44:
  1230.         BIT(0, H);
  1231.         break;
  1232.     case 0x45:
  1233.         BIT(0, L);
  1234.         break;
  1235.     case 0x46:
  1236.         BIT(0, mem->readByte(HL()));
  1237.         break;
  1238.     case 0x47:
  1239.         BIT(0, A);
  1240.         break;
  1241.     case 0x48:
  1242.         BIT(1, B);
  1243.         break;
  1244.     case 0x49:
  1245.         BIT(1, C);
  1246.         break;
  1247.     case 0x4A:
  1248.         BIT(1, D);
  1249.         break;
  1250.     case 0x4B:
  1251.         BIT(1, E);
  1252.         break;
  1253.     case 0x4C:
  1254.         BIT(1, H);
  1255.         break;
  1256.     case 0x4D:
  1257.         BIT(1, L);
  1258.         break;
  1259.     case 0x4E:
  1260.         BIT(1, mem->readByte(HL()));
  1261.         break;
  1262.     case 0x4F:
  1263.         BIT(1, A);
  1264.         break;
  1265.     case 0x50:
  1266.         BIT(2, B);
  1267.         break;
  1268.     case 0x51:
  1269.         BIT(2, C);
  1270.         break;
  1271.     case 0x52:
  1272.         BIT(2, D);
  1273.         break;
  1274.     case 0x53:
  1275.         BIT(2, E);
  1276.         break;
  1277.     case 0x54:
  1278.         BIT(2, H);
  1279.         break;
  1280.     case 0x55:
  1281.         BIT(2, L);
  1282.         break;
  1283.     case 0x56:
  1284.         BIT(2, mem->readByte(HL()));
  1285.         break;
  1286.     case 0x57:
  1287.         BIT(2, A);
  1288.         break;
  1289.     case 0x58:
  1290.         BIT(3, B);
  1291.         break;
  1292.     case 0x59:
  1293.         BIT(3, C);
  1294.         break;
  1295.     case 0x5A:
  1296.         BIT(3, D);
  1297.         break;
  1298.     case 0x5B:
  1299.         BIT(3, E);
  1300.         break;
  1301.     case 0x5C:
  1302.         BIT(3, H);
  1303.         break;
  1304.     case 0x5D:
  1305.         BIT(3, L);
  1306.         break;
  1307.     case 0x5E:
  1308.         BIT(3, mem->readByte(HL()));
  1309.         break;
  1310.     case 0x5F:
  1311.         BIT(3, A);
  1312.         break;
  1313.     case 0x60:
  1314.         BIT(4, B);
  1315.         break;
  1316.     case 0x61:
  1317.         BIT(4, C);
  1318.         break;
  1319.     case 0x62:
  1320.         BIT(4, D);
  1321.         break;
  1322.     case 0x63:
  1323.         BIT(4, E);
  1324.         break;
  1325.     case 0x64:
  1326.         BIT(4, H);
  1327.         break;
  1328.     case 0x65:
  1329.         BIT(4, L);
  1330.         break;
  1331.     case 0x66:
  1332.         BIT(4, mem->readByte(HL()));
  1333.         break;
  1334.     case 0x67:
  1335.         BIT(4, A);
  1336.         break;
  1337.     case 0x68:
  1338.         BIT(5, B);
  1339.         break;
  1340.     case 0x69:
  1341.         BIT(5, C);
  1342.         break;
  1343.     case 0x6A:
  1344.         BIT(5, D);
  1345.         break;
  1346.     case 0x6B:
  1347.         BIT(5, E);
  1348.         break;
  1349.     case 0x6C:
  1350.         BIT(5, H);
  1351.         break;
  1352.     case 0x6D:
  1353.         BIT(5, L);
  1354.         break;
  1355.     case 0x6E:
  1356.         BIT(5, mem->readByte(HL()));
  1357.         break;
  1358.     case 0x6F:
  1359.         BIT(5, A);
  1360.         break;
  1361.     case 0x70:
  1362.         BIT(6, B);
  1363.         break;
  1364.     case 0x71:
  1365.         BIT(6, C);
  1366.         break;
  1367.     case 0x72:
  1368.         BIT(6, D);
  1369.         break;
  1370.     case 0x73:
  1371.         BIT(6, E);
  1372.         break;
  1373.     case 0x74:
  1374.         BIT(6, H);
  1375.         break;
  1376.     case 0x75:
  1377.         BIT(6, L);
  1378.         break;
  1379.     case 0x76:
  1380.         BIT(6, mem->readByte(HL()));
  1381.         break;
  1382.     case 0x77:
  1383.         BIT(6, A);
  1384.         break;
  1385.     case 0x78:
  1386.         BIT(7, B);
  1387.         break;
  1388.     case 0x79:
  1389.         BIT(7, C);
  1390.         break;
  1391.     case 0x7A:
  1392.         BIT(7, D);
  1393.         break;
  1394.     case 0x7B:
  1395.         BIT(7, E);
  1396.         break;
  1397.     case 0x7C:
  1398.         BIT(7, H);
  1399.         break;
  1400.     case 0x7D:
  1401.         BIT(7, L);
  1402.         break;
  1403.     case 0x7E:
  1404.         BIT(7, mem->readByte(HL()));
  1405.         break;
  1406.     case 0x7F:
  1407.         BIT(7, A);
  1408.         break;
  1409.     case 0x80:
  1410.         B = RES(0, B);
  1411.         break;
  1412.     case 0x81:
  1413.         C = RES(0, C);
  1414.         break;
  1415.     case 0x82:
  1416.         D = RES(0, D);
  1417.         break;
  1418.     case 0x83:
  1419.         E = RES(0, E);
  1420.         break;
  1421.     case 0x84:
  1422.         H = RES(0, H);
  1423.         break;
  1424.     case 0x85:
  1425.         L = RES(0, L);
  1426.         break;
  1427.     case 0x86:
  1428.         mem->writeByte(HL(), RES(mem->readByte(HL()), 0));
  1429.         break;
  1430.     case 0x87:
  1431.         A = RES(0, A);
  1432.         break;
  1433.     case 0x88:
  1434.         B = RES(1, B);
  1435.         break;
  1436.     case 0x89:
  1437.         C = RES(1, C);
  1438.         break;
  1439.     case 0x8A:
  1440.         D = RES(1, D);
  1441.         break;
  1442.     case 0x8B:
  1443.         E = RES(1, E);
  1444.         break;
  1445.     case 0x8C:
  1446.         H = RES(1, H);
  1447.         break;
  1448.     case 0x8D:
  1449.         L = RES(1, L);
  1450.         break;
  1451.     case 0x8E:
  1452.         mem->writeByte(HL(), RES(mem->readByte(HL()), 1));
  1453.         break;
  1454.     case 0x8F:
  1455.         A = RES(1, A);
  1456.         break;
  1457.     case 0x90:
  1458.         B = RES(2, B);
  1459.         break;
  1460.     case 0x91:
  1461.         C = RES(2, C);
  1462.         break;
  1463.     case 0x92:
  1464.         D = RES(2, D);
  1465.         break;
  1466.     case 0x93:
  1467.         E = RES(2, E);
  1468.         break;
  1469.     case 0x94:
  1470.         H = RES(2, H);
  1471.         break;
  1472.     case 0x95:
  1473.         L = RES(2, L);
  1474.         break;
  1475.     case 0x96:
  1476.         mem->writeByte(HL(), RES(mem->readByte(HL()), 2));
  1477.         break;
  1478.     case 0x97:
  1479.         A = RES(2, A);
  1480.         break;
  1481.     case 0x98:
  1482.         B = RES(3, B);
  1483.         break;
  1484.     case 0x99:
  1485.         C = RES(3, C);
  1486.         break;
  1487.     case 0x9A:
  1488.         D = RES(3, D);
  1489.         break;
  1490.     case 0x9B:
  1491.         E = RES(3, E);
  1492.         break;
  1493.     case 0x9C:
  1494.         H = RES(3, H);
  1495.         break;
  1496.     case 0x9D:
  1497.         L = RES(3, L);
  1498.         break;
  1499.     case 0x9E:
  1500.         mem->writeByte(HL(), RES(mem->readByte(HL()), 3));
  1501.         break;
  1502.     case 0x9F:
  1503.         A = RES(3, A);
  1504.         break;
  1505.     case 0xA0:
  1506.         B = RES(4, B);
  1507.         break;
  1508.     case 0xA1:
  1509.         C = RES(4, C);
  1510.         break;
  1511.     case 0xA2:
  1512.         D = RES(4, D);
  1513.         break;
  1514.     case 0xA3:
  1515.         E = RES(4, E);
  1516.         break;
  1517.     case 0xA4:
  1518.         H = RES(4, H);
  1519.         break;
  1520.     case 0xA5:
  1521.         L = RES(4, L);
  1522.         break;
  1523.     case 0xA6:
  1524.         mem->writeByte(HL(), RES(mem->readByte(HL()), 4));
  1525.         break;
  1526.     case 0xA7:
  1527.         A = RES(4, A);
  1528.         break;
  1529.     case 0xA8:
  1530.         B = RES(5, B);
  1531.         break;
  1532.     case 0xA9:
  1533.         C = RES(5, C);
  1534.         break;
  1535.     case 0xAA:
  1536.         D = RES(5, D);
  1537.         break;
  1538.     case 0xAB:
  1539.         E = RES(5, E);
  1540.         break;
  1541.     case 0xAC:
  1542.         H = RES(5, H);
  1543.         break;
  1544.     case 0xAD:
  1545.         L = RES(5, L);
  1546.         break;
  1547.     case 0xAE:
  1548.         mem->writeByte(HL(), RES(mem->readByte(HL()), 5));
  1549.         break;
  1550.     case 0xAF:
  1551.         A = RES(5, A);
  1552.         break;
  1553.     case 0xB0:
  1554.         B = RES(6, B);
  1555.         break;
  1556.     case 0xB1:
  1557.         C = RES(6, C);
  1558.         break;
  1559.     case 0xB2:
  1560.         D = RES(6, D);
  1561.         break;
  1562.     case 0xB3:
  1563.         E = RES(6, E);
  1564.         break;
  1565.     case 0xB4:
  1566.         H = RES(6, H);
  1567.         break;
  1568.     case 0xB5:
  1569.         L = RES(6, L);
  1570.         break;
  1571.     case 0xB6:
  1572.         mem->writeByte(HL(), RES(mem->readByte(HL()), 6));
  1573.         break;
  1574.     case 0xB7:
  1575.         A = RES(6, A);
  1576.         break;
  1577.     case 0xB8:
  1578.         B = RES(7, B);
  1579.         break;
  1580.     case 0xB9:
  1581.         C = RES(7, C);
  1582.         break;
  1583.     case 0xBA:
  1584.         D = RES(7, D);
  1585.         break;
  1586.     case 0xBB:
  1587.         E = RES(7, E);
  1588.         break;
  1589.     case 0xBC:
  1590.         H = RES(7, H);
  1591.         break;
  1592.     case 0xBD:
  1593.         L = RES(7, L);
  1594.         break;
  1595.     case 0xBE:
  1596.         mem->writeByte(HL(), RES(mem->readByte(HL()), 7));
  1597.         break;
  1598.     case 0xBF:
  1599.         A = RES(7, A);
  1600.         break;
  1601.     case 0xC0:
  1602.         B = SET(0, B);
  1603.         break;
  1604.     case 0xC1:
  1605.         C = SET(0, C);
  1606.         break;
  1607.     case 0xC2:
  1608.         D = SET(0, D);
  1609.         break;
  1610.     case 0xC3:
  1611.         E = SET(0, E);
  1612.         break;
  1613.     case 0xC4:
  1614.         H = SET(0, H);
  1615.         break;
  1616.     case 0xC5:
  1617.         L = SET(0, L);
  1618.         break;
  1619.     case 0xC6:
  1620.         mem->writeByte(HL(), SET(mem->readByte(HL()), 0));
  1621.         break;
  1622.     case 0xC7:
  1623.         A = SET(0, A);
  1624.         break;
  1625.     case 0xC8:
  1626.         B = SET(1, B);
  1627.         break;
  1628.     case 0xC9:
  1629.         C = SET(1, C);
  1630.         break;
  1631.     case 0xCA:
  1632.         D = SET(1, D);
  1633.         break;
  1634.     case 0xCB:
  1635.         E = SET(1, E);
  1636.         break;
  1637.     case 0xCC:
  1638.         H = SET(1, H);
  1639.         break;
  1640.     case 0xCD:
  1641.         L = SET(1, L);
  1642.         break;
  1643.     case 0xCE:
  1644.         mem->writeByte(HL(), SET(mem->readByte(HL()), 1));
  1645.         break;
  1646.     case 0xCF:
  1647.         A = SET(1, A);
  1648.         break;
  1649.     case 0xD0:
  1650.         B = SET(2, B);
  1651.         break;
  1652.     case 0xD1:
  1653.         C = SET(2, C);
  1654.         break;
  1655.     case 0xD2:
  1656.         D = SET(2, D);
  1657.         break;
  1658.     case 0xD3:
  1659.         E = SET(2, E);
  1660.         break;
  1661.     case 0xD4:
  1662.         H = SET(2, H);
  1663.         break;
  1664.     case 0xD5:
  1665.         L = SET(2, L);
  1666.         break;
  1667.     case 0xD6:
  1668.         mem->writeByte(HL(), SET(mem->readByte(HL()), 2));
  1669.         break;
  1670.     case 0xD7:
  1671.         A = SET(2, A);
  1672.         break;
  1673.     case 0xD8:
  1674.         B = SET(3, B);
  1675.         break;
  1676.     case 0xD9:
  1677.         C = SET(3, C);
  1678.         break;
  1679.     case 0xDA:
  1680.         D = SET(3, D);
  1681.         break;
  1682.     case 0xDB:
  1683.         E = SET(3, E);
  1684.         break;
  1685.     case 0xDC:
  1686.         H = SET(3, H);
  1687.         break;
  1688.     case 0xDD:
  1689.         L = SET(3, L);
  1690.         break;
  1691.     case 0xDE:
  1692.         mem->writeByte(HL(), SET(mem->readByte(HL()), 3));
  1693.         break;
  1694.     case 0xDF:
  1695.         A = SET(3, A);
  1696.         break;
  1697.     case 0xE0:
  1698.         B = SET(4, B);
  1699.         break;
  1700.     case 0xE1:
  1701.         C = SET(4, C);
  1702.         break;
  1703.     case 0xE2:
  1704.         D = SET(4, D);
  1705.         break;
  1706.     case 0xE3:
  1707.         E = SET(4, E);
  1708.         break;
  1709.     case 0xE4:
  1710.         H = SET(4, H);
  1711.         break;
  1712.     case 0xE5:
  1713.         L = SET(4, L);
  1714.         break;
  1715.     case 0xE6:
  1716.         mem->writeByte(HL(), SET(mem->readByte(HL()), 4));
  1717.         break;
  1718.     case 0xE7:
  1719.         A = SET(4, A);
  1720.         break;
  1721.     case 0xE8:
  1722.         B = SET(5, B);
  1723.         break;
  1724.     case 0xE9:
  1725.         C = SET(5, C);
  1726.         break;
  1727.     case 0xEA:
  1728.         D = SET(5, D);
  1729.         break;
  1730.     case 0xEB:
  1731.         E = SET(5, E);
  1732.         break;
  1733.     case 0xEC:
  1734.         H = SET(5, H);
  1735.         break;
  1736.     case 0xED:
  1737.         L = SET(5, L);
  1738.         break;
  1739.     case 0xEE:
  1740.         mem->writeByte(HL(), SET(mem->readByte(HL()), 5));
  1741.         break;
  1742.     case 0xEF:
  1743.         A = SET(5, A);
  1744.         break;
  1745.     case 0xF0:
  1746.         B = SET(6, B);
  1747.         break;
  1748.     case 0xF1:
  1749.         C = SET(6, C);
  1750.         break;
  1751.     case 0xF2:
  1752.         D = SET(6, D);
  1753.         break;
  1754.     case 0xF3:
  1755.         E = SET(6, E);
  1756.         break;
  1757.     case 0xF4:
  1758.         H = SET(6, H);
  1759.         break;
  1760.     case 0xF5:
  1761.         L = SET(6, L);
  1762.         break;
  1763.     case 0xF6:
  1764.         mem->writeByte(HL(), SET(mem->readByte(HL()), 6));
  1765.         break;
  1766.     case 0xF7:
  1767.         A = SET(6, A);
  1768.         break;
  1769.     case 0xF8:
  1770.         B = SET(7, B);
  1771.         break;
  1772.     case 0xF9:
  1773.         C = SET(7, C);
  1774.         break;
  1775.     case 0xFA:
  1776.         D = SET(7, D);
  1777.         break;
  1778.     case 0xFB:
  1779.         E = SET(7, E);
  1780.         break;
  1781.     case 0xFC:
  1782.         H = SET(7, H);
  1783.         break;
  1784.     case 0xFD:
  1785.         L = SET(7, L);
  1786.         break;
  1787.     case 0xFE:
  1788.         mem->writeByte(HL(), SET(mem->readByte(HL()), 7));
  1789.         break;
  1790.     case 0xFF:
  1791.         A = SET(7, A);
  1792.         break;
  1793.     default:
  1794.         break;
  1795.     }
  1796. }
  1797.  
  1798. uint16_t SM83::AF()
  1799. {
  1800.     return (A << 8) | (F & 0xF0);
  1801. }
  1802.  
  1803. uint16_t SM83::BC()
  1804. {
  1805.     return (B << 8) | C;
  1806. }
  1807.  
  1808. uint16_t SM83::DE()
  1809. {
  1810.     return (D << 8) | E;
  1811. }
  1812.  
  1813. uint16_t SM83::HL()
  1814. {
  1815.     return (H << 8) | L;
  1816. }
  1817.  
  1818. void SM83::setAF(uint16_t data)
  1819. {
  1820.     A = (data >> 8) & 0xFF;
  1821.     F = data & 0xF0;
  1822. }
  1823.  
  1824. void SM83::setBC(uint16_t data)
  1825. {
  1826.     B = (data >> 8) & 0xFF;
  1827.     C = data & 0xFF;
  1828. }
  1829.  
  1830. void SM83::setDE(uint16_t data)
  1831. {
  1832.     D = (data >> 8) & 0xFF;
  1833.     E = data & 0xFF;
  1834. }
  1835.  
  1836. void SM83::setHL(uint16_t data)
  1837. {
  1838.     H = (data >> 8) & 0xFF;
  1839.     L = data & 0xFF;
  1840. }
  1841.  
  1842. void SM83::setFlag(uint8_t flag, bool state)
  1843. {
  1844.     if (state)
  1845.     {
  1846.         F |= (1 << flag);
  1847.     }
  1848.     else
  1849.     {
  1850.         F &= ~(1 << flag);
  1851.     }
  1852. }
  1853.  
  1854. bool SM83::getFlag(uint8_t flag)
  1855. {
  1856.     return (F & (1 << flag)) != 0;
  1857. }
  1858.  
  1859. bool SM83::getFlagZ()
  1860. {
  1861.     return (F & Flag_Z) != 0;
  1862. }
  1863.  
  1864. bool SM83::getFlagC()
  1865. {
  1866.     return (F & Flag_C) != 0;
  1867. }
  1868.  
  1869. void SM83::alu16bitADD(uint16_t data)
  1870. {
  1871.     uint16_t hl = HL();
  1872.     uint32_t result = hl + data;
  1873.     setHL(result & 0xFFFF);
  1874.     setFlag(Flag_N, false);
  1875.     setFlag(Flag_H, ((hl & 0x0FFF) + (data & 0x0FFF)) > 0x0FFF);
  1876.     setFlag(Flag_C, result > 0xFFFF);
  1877. }
  1878.  
  1879. void SM83::alu16bitSPADD()
  1880. {
  1881.     int8_t data = (int8_t)mem->readByte(PC++);
  1882.     uint16_t tmp = SP;
  1883.     uint16_t result = SP + data;
  1884.     setFlag(Flag_Z, false);
  1885.     setFlag(Flag_N, false);
  1886.     setFlag(Flag_H, ((tmp & 0x0F) + (data & 0x0F)) > 0x0F);
  1887.     setFlag(Flag_C, ((tmp & 0xFF) + (data & 0xFF)) > 0xFF);
  1888.     SP = result;
  1889. }
  1890.  
  1891. void SM83::alu8bitADD(uint8_t data)
  1892. {
  1893.     uint8_t tmp = A;
  1894.     A += data;
  1895.     setFlag(Flag_Z, (A == 0));
  1896.     setFlag(Flag_N, false);
  1897.     setFlag(Flag_H, ((tmp & 0x0F) + (data & 0x0F)) > 0x0F);
  1898.     setFlag(Flag_C, (tmp + data > 0xFF));
  1899. }
  1900.  
  1901. void SM83::alu8bitADC(uint8_t data, bool carry)
  1902. {
  1903.     uint8_t tmp = A;
  1904.     uint8_t carryValue = carry ? 1 : 0;
  1905.     A += data + carryValue;
  1906.     setFlag(Flag_Z, (A == 0));
  1907.     setFlag(Flag_N, false);
  1908.     setFlag(Flag_H, ((tmp & 0x0F) + (data & 0x0F) + carryValue) > 0x0F);
  1909.     setFlag(Flag_C, (tmp + data + carryValue) > 0xFF);
  1910. }
  1911.  
  1912. void SM83::alu8bitSUB(uint8_t data)
  1913. {
  1914.     uint8_t tmp = A;
  1915.     A -= data;
  1916.     setFlag(Flag_Z, (A == 0));
  1917.     setFlag(Flag_N, true);
  1918.     setFlag(Flag_H, (tmp & 0x0F) < (data & 0x0F));
  1919.     setFlag(Flag_C, (A > tmp));
  1920. }
  1921.  
  1922. void SM83::alu8bitSBC(uint8_t data, bool carry)
  1923. {
  1924.     uint8_t tmp = A;
  1925.     uint8_t carryValue = carry ? 1 : 0;
  1926.     A -= (data + carryValue);
  1927.     setFlag(Flag_Z, (A == 0));
  1928.     setFlag(Flag_N, true);
  1929.     setFlag(Flag_H, ((tmp & 0x0F) < ((data & 0x0F) + carryValue)));
  1930.     setFlag(Flag_C, (tmp < (data + carryValue)));
  1931. }
  1932.  
  1933. uint8_t SM83::alu8bitINC(uint8_t data)
  1934. {
  1935.     uint8_t tmp = data;
  1936.     data++;
  1937.     setFlag(Flag_Z, (data == 0));
  1938.     setFlag(Flag_N, false);
  1939.     setFlag(Flag_H, (tmp & 0x0F) == 0x0F);
  1940.     return data;
  1941. }
  1942.  
  1943. uint8_t SM83::alu8bitDEC(uint8_t data)
  1944. {
  1945.     uint8_t tmp = data;
  1946.     data--;
  1947.     setFlag(Flag_Z, (data == 0));
  1948.     setFlag(Flag_N, true);
  1949.     setFlag(Flag_H, (tmp & 0x0F) == 0);
  1950.     return data;
  1951. }
  1952.  
  1953. void SM83::logic8bitAND(uint8_t data)
  1954. {
  1955.     A &= data;
  1956.     setFlag(Flag_Z, (A == 0));
  1957.     setFlag(Flag_N, false);
  1958.     setFlag(Flag_H, true);
  1959.     setFlag(Flag_C, false);
  1960. }
  1961.  
  1962. void SM83::logic8bitOR(uint8_t data)
  1963. {
  1964.     A |= data;
  1965.     setFlag(Flag_Z, (A == 0));
  1966.     setFlag(Flag_N, false);
  1967.     setFlag(Flag_H, false);
  1968.     setFlag(Flag_C, false);
  1969. }
  1970.  
  1971. void SM83::logic8bitXOR(uint8_t data)
  1972. {
  1973.     A ^= data;
  1974.     setFlag(Flag_Z, (A == 0));
  1975.     setFlag(Flag_N, false);
  1976.     setFlag(Flag_H, true);
  1977.     setFlag(Flag_C, false);
  1978. }
  1979.  
  1980. void SM83::logic8bitCP(uint8_t data)
  1981. {
  1982.     uint8_t result = A - data;
  1983.     setFlag(Flag_Z, (result == 0));
  1984.     setFlag(Flag_N, true);
  1985.     setFlag(Flag_H, ((A & 0x0F) < (data & 0x0F)));
  1986.     setFlag(Flag_C, (A < data));
  1987. }
  1988.  
  1989. void SM83::logic8bitDAA()
  1990. {
  1991.     uint8_t correction = 0;
  1992.     bool carry = false;
  1993.     if (getFlag(Flag_H) || (!getFlag(Flag_N) && (A & 0x0F) > 9))
  1994.     {
  1995.         correction |= 0x06;
  1996.     }
  1997.     if (getFlag(Flag_C) || (!getFlag(Flag_N) && A > 0x99))
  1998.     {
  1999.         correction |= 0x60;
  2000.         carry = true;
  2001.     }
  2002.     if (getFlag(Flag_N))
  2003.     {
  2004.         A -= correction;
  2005.     }
  2006.     else
  2007.     {
  2008.         A += correction;
  2009.     }
  2010.     setFlag(Flag_Z, (A == 0));
  2011.     setFlag(Flag_H, false);
  2012.     setFlag(Flag_C, carry);
  2013. }
  2014.  
  2015. void SM83::logic8bitCPL()
  2016. {
  2017.     A = ~A;
  2018.     setFlag(Flag_N, true);
  2019.     setFlag(Flag_H, true);
  2020. }
  2021.  
  2022. uint8_t SM83::RLC(uint8_t data)
  2023. {
  2024.     uint8_t result = data;
  2025.     bool carry = (result & 0x80) != 0;
  2026.     result = (result << 1) | (uint8_t)carry;
  2027.     setFlag(Flag_Z, (result == 0));
  2028.     setFlag(Flag_N, false);
  2029.     setFlag(Flag_H, false);
  2030.     setFlag(Flag_C, carry);
  2031.     return result;
  2032. }
  2033.  
  2034. uint8_t SM83::RL(uint8_t data)
  2035. {
  2036.     uint8_t result = data;
  2037.     bool carryFlagBit = getFlagC();
  2038.     bool carry = (result & 0x80) != 0;
  2039.     result = (result << 1) | (carryFlagBit);
  2040.     setFlag(Flag_Z, (result == 0));
  2041.     setFlag(Flag_N, false);
  2042.     setFlag(Flag_H, false);
  2043.     setFlag(Flag_C, carry);
  2044.     return result;
  2045. }
  2046.  
  2047. uint8_t SM83::RRC(uint8_t data)
  2048. {
  2049.     uint8_t result = data;
  2050.     bool carry = (result & 0x1) != 0;
  2051.     result = (result >> 1) | (carry << 7);
  2052.     setFlag(Flag_Z, (result == 0));
  2053.     setFlag(Flag_N, false);
  2054.     setFlag(Flag_H, false);
  2055.     setFlag(Flag_C, carry);
  2056.     return result;
  2057. }
  2058.  
  2059. uint8_t SM83::RR(uint8_t data)
  2060. {
  2061.     uint8_t result = data;
  2062.     bool carryFlagBit = getFlagC();
  2063.     bool carry = (result & 0x01) != 0;
  2064.     result = (result >> 1) | (carryFlagBit << 7);
  2065.     setFlag(Flag_Z, (result == 0));
  2066.     setFlag(Flag_N, false);
  2067.     setFlag(Flag_H, false);
  2068.     setFlag(Flag_C, carry);
  2069.     return result;
  2070. }
  2071.  
  2072. uint8_t SM83::SLA(uint8_t data)
  2073. {
  2074.     uint8_t result = data;
  2075.     bool carry = (result & 0x80) != 0;
  2076.     result = result << 1;
  2077.     setFlag(Flag_Z, (result == 0));
  2078.     setFlag(Flag_N, false);
  2079.     setFlag(Flag_H, false);
  2080.     setFlag(Flag_C, carry);
  2081.     return result;
  2082. }
  2083.  
  2084. uint8_t SM83::SRA(uint8_t data)
  2085. {
  2086.     int8_t result = (int8_t)data;
  2087.     bool carry = (result & 0x01) != 0;
  2088.     result = result >> 1;
  2089.     setFlag(Flag_Z, (result == 0));
  2090.     setFlag(Flag_N, false);
  2091.     setFlag(Flag_H, false);
  2092.     setFlag(Flag_C, carry);
  2093.     return (uint8_t)result;
  2094. }
  2095.  
  2096. uint8_t SM83::SRL(uint8_t data)
  2097. {
  2098.     uint8_t result = data;
  2099.     bool carry = (result & 0x01) != 0;
  2100.     result = result >> 1;
  2101.     setFlag(Flag_Z, (result == 0));
  2102.     setFlag(Flag_N, false);
  2103.     setFlag(Flag_H, false);
  2104.     setFlag(Flag_C, carry);
  2105.     return (uint8_t)result;
  2106. }
  2107.  
  2108. uint8_t SM83::SWAP(uint8_t data)
  2109. {
  2110.     uint8_t result = (data & 0xF0) >> 4;
  2111.     result |= data << 4;
  2112.     setFlag(Flag_Z, (result == 0));
  2113.     setFlag(Flag_N, false);
  2114.     setFlag(Flag_H, false);
  2115.     setFlag(Flag_C, false);
  2116.     return result;
  2117. }
  2118.  
  2119. void SM83::BIT(int bit, uint8_t data)
  2120. {
  2121.     bool result = (data & (1 << bit)) == 0;
  2122.     setFlag(Flag_Z, result);
  2123.     setFlag(Flag_N, false);
  2124.     setFlag(Flag_H, true);
  2125. }
  2126.  
  2127. uint8_t SM83::SET(int bit, uint8_t data)
  2128. {
  2129.     uint8_t setBit = 1 << bit;
  2130.     uint8_t result = data | setBit;
  2131.     return result;
  2132. }
  2133.  
  2134. uint8_t SM83::RES(int bit, uint8_t data)
  2135. {
  2136.     uint8_t resetBit = ~(1 << bit);
  2137.     uint8_t result = data & resetBit;
  2138.     return result;
  2139. }
  2140.  
  2141. void SM83::jp(bool state)
  2142. {
  2143.     if (state)
  2144.     {
  2145.         lastCycleCount = 16;
  2146.         PC = mem->readWord(PC);
  2147.     }
  2148.     else
  2149.     {
  2150.         PC += 2;
  2151.     }
  2152. }
  2153.  
  2154. void SM83::jr(bool state)
  2155. {
  2156.     if (state)
  2157.     {
  2158.         lastCycleCount = 12;
  2159.         int8_t offset = (int8_t)mem->readByte(PC++);
  2160.         PC += offset;
  2161.     }
  2162.     else
  2163.     {
  2164.         PC++;
  2165.     }
  2166. }
  2167.  
  2168. void SM83::call(bool state)
  2169. {
  2170.     if (state)
  2171.     {
  2172.         uint16_t returnAddress = PC + 2;
  2173.         SP -= 2;
  2174.         mem->writeWord(SP, returnAddress);
  2175.         PC = mem->readWord(PC);
  2176.         lastCycleCount = 24;
  2177.     }
  2178.     else
  2179.     {
  2180.         PC += 2;
  2181.     }
  2182. }
  2183.  
  2184. void SM83::ret(bool state)
  2185. {
  2186.     if (state)
  2187.     {
  2188.         lastCycleCount = 20;
  2189.         uint16_t address = mem->readWord(SP);
  2190.         SP += 2;
  2191.         PC = address;
  2192.     }
  2193. }
  2194.  
  2195. void SM83::reti(void)
  2196. {
  2197.     ret(true);
  2198.     IME = true;
  2199.     IMEhold = true;
  2200.     lastCycleCount = 16;
  2201. }
  2202.  
  2203. void SM83::rst(uint8_t data)
  2204. {
  2205.     SP -= 2;
  2206.     mem->writeWord(SP, PC);
  2207.     PC = data;
  2208. }
  2209.  
  2210. void SM83::ccf(void)
  2211. {
  2212.     setFlag(Flag_C, !getFlagC());
  2213.     setFlag(Flag_N, false);
  2214.     setFlag(Flag_H, false);
  2215. }
  2216.  
  2217. void SM83::scf(void)
  2218. {
  2219.     setFlag(Flag_N, false);
  2220.     setFlag(Flag_H, false);
  2221.     setFlag(Flag_C, true);
  2222. }
  2223.  
  2224. void SM83::nop(void)
  2225. {
  2226. }
  2227.  
  2228. void SM83::halt(void)
  2229. {
  2230.     ishalt = true;
  2231.     if (!IME && ((mem->readByte(IFaddress) & mem->readByte(IEaddress)) != 0))
  2232.     {
  2233.         ishalt = false;
  2234.         PC--;
  2235.     }
  2236. }
  2237.  
  2238. void SM83::stop(void)
  2239. {
  2240.     uint8_t key1 = mem->readByte(0xFF4D);
  2241.  
  2242.     if ((key1 & 0x1) == 0x1)
  2243.     {
  2244.         DoubleSpeed = !DoubleSpeed;
  2245.     }
  2246.  
  2247.     mem->writeByte(0xFF4D, (key1 & 0x7E) | ((DoubleSpeed ? 1 : 0) << 7));
  2248. }
  2249.  
  2250. void SM83::di(void)
  2251. {
  2252.     IMEhold = false;
  2253.     EIDIFlag = true;
  2254. }
  2255.  
  2256. void SM83::ei(void)
  2257. {
  2258.     IMEhold = true;
  2259.     EIDIFlag = true;
  2260. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement