Advertisement
TheFastFish

longest switch statement

Sep 4th, 2015
447
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.         switch (hh) {
  2.             case "0":
  3.                 ll = opcode.charAt(3);
  4.                 switch (ll) {
  5.                     case "0":
  6.                         draw.fillStyle = "#000";
  7.                         draw.fillRect(0, 0, display.width, display.height);
  8.                         break;
  9.                     case "E":
  10.                         this.pc = this.callstack[this.callpointer];
  11.                         this.callpointer--;
  12.                         break;
  13.                     default:
  14.                         throw {
  15.                             name: "opcodeDecodeError",
  16.                             message: "unknown error decoding opcode " + opcode
  17.                         };
  18.                 }
  19.                 break;
  20.             case "1":
  21.                 addr = parseInt(opcode.substring(1, 4), 16);
  22.                 this.pc = addr;
  23.                 jumpflag = true;
  24.                 break;
  25.             case "2":
  26.                 addr = parseInt(opcode.substring(1, 4), 16);
  27.                 this.callpointer++;
  28.                 this.callstack[this.callpointer] = this.pc;
  29.                 this.pc = addr;
  30.                 jumpflag = true;
  31.                 break;
  32.             case "3":
  33.                 vx = parseInt(opcode.charAt(1), 16);
  34.                 l = parseInt(opcode.substring(2, 4), 16);
  35.                 if (this.register[vx] == l) {
  36.                     this.pc += 2;
  37.                 }
  38.                 break;
  39.             case "4":
  40.                 vx = parseInt(opcode.charAt(1), 16);
  41.                 l = parseInt(opcode.substring(2, 4), 16);
  42.                 if (this.register[vx] != l) {
  43.                     this.pc += 2;
  44.                 }
  45.                 break;
  46.             case "5":
  47.                 vx = parseInt(opcode.charAt(1), 16);
  48.                 vy = parseInt(opcode.charAt(2), 16);
  49.                 if (this.register[vx] == this.register[vy]) {
  50.                     this.pc += 2;
  51.                 }
  52.                 break;
  53.             case "6":
  54.                 vx = parseInt(opcode.charAt(1), 16);
  55.                 l = parseInt(opcode.substring(2, 4), 16);
  56.                 this.register[vx] = l;
  57.                 break;
  58.             case "7":
  59.                 vx = parseInt(opcode.charAt(1), 16);
  60.                 l = parseInt(opcode.substring(2, 4), 16);
  61.                 this.register[vx] += l;
  62.                 break;
  63.             case "8":
  64.                 ll = opcode.charAt(3);
  65.                 vx = parseInt(opcode.charAt(1), 16);
  66.                 vy = parseInt(opcode.charAt(2), 16);
  67.                 switch (ll) {
  68.                     case "0":
  69.                         this.register[vx] = this.register[vy];
  70.                         break;
  71.                     case "1":
  72.                         this.register[vx] = this.register[vx] | this.register[vy];
  73.                         break;
  74.                     case "2":
  75.                         this.register[vx] = this.register[vx] & this.register[vy];
  76.                         break;
  77.                     case "3":
  78.                         this.register[vx] = this.register[vx] ^ this.register[vy];
  79.                         break;
  80.                     case "4":
  81.                         this.register[vx] = this.register[vx] + this.register[vy];
  82.                         break;
  83.                     case "5":
  84.                         this.register[vx] = this.register[vx] - this.register[vy];
  85.                         if (vx > vy) {
  86.                             this.register[15] = 1;
  87.                         } else {
  88.                             this.register[15] = 0;
  89.                         }
  90.                         break;
  91.                     case "6":
  92.                         this.register[15] = this.register[vy] & 0xFFFE;
  93.                         this.register[vx] = this.register[vy] >>> 1;
  94.                         break;
  95.                     case "7":
  96.                         this.register[vx] = this.register[vy] - this.register[vx];
  97.                         if (vy > vx) {
  98.                             this.register[15] = 1;
  99.                         } else {
  100.                             this.register[15] = 0;
  101.                         }
  102.                         break;
  103.                     case "E":
  104.                         this.register[15] = (this.register[vy] >> 7) & 0xFFFE;
  105.                         this.register[vx] = this.register[vy] << 1;
  106.                         break;
  107.                     default:
  108.                         throw {
  109.                             name: "opcodeDecodeError",
  110.                             message: "unknown error decoding opcode " + opcode
  111.                         };
  112.                 }
  113.                 break;
  114.             case "9":
  115.                 vx = parseInt(opcode.charAt(1), 16);
  116.                 vy = parseInt(opcode.charAt(2), 16);
  117.                 if (this.register[vx] != this.register[vy]) {
  118.                     this.pc += 2;
  119.                 }
  120.                 break;
  121.             case "A":
  122.                 addr = parseInt(opcode.substring(1, 4), 16);
  123.                 this.i = addr;
  124.                 break;
  125.             case "B":
  126.                 addr = parseInt(opcode.substring(1, 4), 16);
  127.                 this.pc = addr + this.register[0];
  128.                 jumpflag = true;
  129.                 break;
  130.             case "C":
  131.                 vx = parseInt(opcode.charAt(1), 16);
  132.                 l = parseInt(opcode.substring(2, 4), 16);
  133.                 this.register[vx] = getRandomInt(0, 256) & l;
  134.                 break;
  135.             case "D":
  136.                 vx = parseInt(opcode.charAt(1), 16);
  137.                 vy = parseInt(opcode.charAt(2), 16);
  138.                 ll = parseInt(opcode.charAt(3), 16);
  139.                 image = draw.getImageData(0, 0, display.width, display.height);
  140.                 for (i = 0; i < ll; i++) {
  141.                     linebyte = this.memory[this.i + i];
  142.                     for (j = 0; j < 8; j++) {
  143.                         bit = linebyte & (0x80 >>> j);
  144.                         cx = this.register[vx] * this.displayscale;
  145.                         cy = this.register[vy] * this.displayscale;
  146.                         data = imageDataReadPixel(cx, cy, image);
  147.                         if (bit){
  148.                             if (JSON.stringify(data) == JSON.stringify([0, 0, 0, 255])) {
  149.                                 draw.fillStyle = "#FFF";
  150.                             } else if (JSON.stringify(data) == JSON.stringify([255, 255, 255, 255])) {
  151.                                 drawColor = 0;
  152.                                 draw.fillStyle = "#000";
  153.                             } else {
  154.                                 throw {
  155.                                     name: "imageDataError",
  156.                                     message: "encountered error proccessing image data"
  157.                                 };
  158.                             }
  159.                             draw.fillRect(cx + j * this.displayscale, cy + i * this.displayscale, this.displayscale, this.displayscale);
  160.                         }
  161.                     }
  162.                 }
  163.                 break;
  164.             case "E":
  165.                 vx = parseInt(opcode.charAt(1), 16);
  166.                 l = parseInt(opcode.substring(2, 4), 16);
  167.                 switch (l) {
  168.                     case "9E":
  169.                         //EX9E
  170.                         //skip next instruction if key value in VX is pressed
  171.                         break;
  172.                     case "A1":
  173.                         //EXA1
  174.                         //skip next instruction if key value in VX is not pressed
  175.                         break;
  176.                     default:
  177.                         throw {
  178.                             name: "opcodeDecodeError",
  179.                             message: "unknown error decoding opcode " + opcode
  180.                         };
  181.                 }
  182.                 break;
  183.             case "F":
  184.                 vx = parseInt(opcode.charAt(1), 16);
  185.                 l = opcode.substring(2, 4);
  186.                 switch (l) {
  187.                     case "07":
  188.                         this.register[vx] = this.delaytimer;
  189.                         break;
  190.                     case "0A":
  191.                         if (keypress) {
  192.                             this.register[vx] = keypress;
  193.                         } else {
  194.                             jumpflag = true;
  195.                         }
  196.                         break;
  197.                     case "15":
  198.                         this.delaytimer = this.register[vx];
  199.                         break;
  200.                     case "18":
  201.                         this.soundtimer = this.register[vx];
  202.                         break;
  203.                     case "1E":
  204.                         this.i += this.register[vx];
  205.                         break;
  206.                     case "29":
  207.                         if ((this.register[vx] > 15) | (this.register[vx]) < 0) {
  208.                             throw {
  209.                                 name: "characterFetchError",
  210.                                 message: "Character code out of range"
  211.                             };
  212.                         }
  213.                         this.i = 5 * this.register[vx];
  214.                         break;
  215.                     case "33":
  216.                         num = this.register[vx].toString(10);
  217.                         if (num.length < 3) {
  218.                             num = "0".repeat(3 - num.length) + num;
  219.                         }
  220.                         for (i = 0; i < 3; i++) {
  221.                             this.memory[this.i + i] = parseInt(num.charAt(i), 10);
  222.                         }
  223.                         break;
  224.                     case "55":
  225.                         for (i = 0; i <= vx; i++) {
  226.                             this.memory[this.i + i] = this.register[i];
  227.                         }
  228.                         this.i += i;
  229.                         break;
  230.                     case "65":
  231.                         for (i = 0; i <= vx; i++) {
  232.                             this.register[i] = this.memory[this.i + i];
  233.                         }
  234.                         this.i += i;
  235.                         break;
  236.                     default:
  237.                         throw {
  238.                             name: "opcodeDecodeError",
  239.                             message: "unknown error decoding opcode " + opcode
  240.                         };
  241.                 }
  242.                 break;
  243.             default:
  244.                 throw {
  245.                     name: "opcodeDecodeError",
  246.                     message: "unknown error decoding opcode " + opcode
  247.                 };
  248.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement