├── .gitignore ├── .vercelignore ├── README.md ├── api ├── info.js └── run.js ├── lib ├── gameboy.js ├── yellow.gb └── z80.js ├── package.json ├── public └── index.html └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .env 3 | 4 | .vercel -------------------------------------------------------------------------------- /.vercelignore: -------------------------------------------------------------------------------- 1 | README.md -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Pokeless 2 | 3 | https://pokeless.vercel.app 4 | 5 | ## Development 6 | 7 | ``` 8 | vercel dev 9 | ``` 10 | -------------------------------------------------------------------------------- /api/info.js: -------------------------------------------------------------------------------- 1 | const Redis = require("ioredis"); 2 | 3 | module.exports = async (req, res) => { 4 | const r = new Redis(process.env.REDIS_URL); 5 | const info = await r.info(); 6 | res.end(info); 7 | console.time("disconnect"); 8 | await r.disconnect(); 9 | console.timeEnd("disconnect"); 10 | }; 11 | -------------------------------------------------------------------------------- /api/run.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const GameBoy = require("../lib/gameboy"); 3 | const { createCanvas } = require("canvas"); 4 | const rom = fs.readFileSync(__dirname + "/../lib/yellow.gb"); 5 | const { createHash } = require("crypto"); 6 | const Redis = require("ioredis"); 7 | const { promisify } = require("util"); 8 | const zlib = require("zlib"); 9 | const sleep = require("then-sleep"); 10 | const Mutex = require("redis-semaphore").Mutex; 11 | 12 | // how many frames to emulate each invocation 13 | const FRAMES = 50; 14 | 15 | module.exports = async (req, res) => { 16 | let key = req.headers["x-key"]; 17 | if (key != null) { 18 | key = Number(key); 19 | if (key >= 0 && key < 8) { 20 | // valid key 21 | } else { 22 | key = null; 23 | } 24 | } 25 | 26 | const r = new Redis(process.env.REDIS_URL); 27 | let latestEtag = await r.get("latest_etag"); 28 | let latestState = null; 29 | 30 | if (!latestEtag || latestEtag === req.headers["if-none-match"]) { 31 | try { 32 | await run(); 33 | } catch (err) { 34 | console.error(err.stack); 35 | await read(); 36 | } 37 | } else { 38 | await read(); 39 | } 40 | 41 | await r.disconnect(); 42 | 43 | async function run() { 44 | console.log('running'); 45 | const mutex = new Mutex(r, "run", { 46 | lockTimeout: 5000, 47 | acquireTimeout: 50 48 | }); 49 | 50 | // we make the key be "last one wins", if any, 51 | // so that everyone gets a chance at deciding 52 | // the next command 53 | if (key != null) { 54 | console.time("save key"); 55 | await r.set("key", key); 56 | console.timeEnd("save key"); 57 | } 58 | 59 | console.time("mutex acquire"); 60 | await mutex.acquire(); 61 | console.timeEnd("mutex acquire"); 62 | 63 | try { 64 | console.time("gb init"); 65 | const canvas = createCanvas(160 * 2, 144 * 2); 66 | const toBuffer = promisify(canvas.toBuffer.bind(canvas)); 67 | const gb = new GameBoy(canvas, rom); 68 | console.timeEnd("gb init"); 69 | 70 | if (latestEtag) { 71 | console.time("read state"); 72 | [[e1, latestEtag], [e2, latestState]] = await r 73 | .multi() 74 | .get("latest_etag") 75 | .getBuffer("latest_state") 76 | .exec(); 77 | console.timeEnd("read state"); 78 | 79 | if (e1 !== null || e2 !== null) { 80 | throw new Error(`Database read error ${e1} ${e2}`); 81 | } 82 | 83 | if (latestState) { 84 | console.time("init state"); 85 | gb.returnFromState(JSON.parse(latestState)); 86 | console.timeEnd("init state"); 87 | } else { 88 | console.time("gb start"); 89 | gb.start(); 90 | console.timeEnd("gb start"); 91 | } 92 | } else { 93 | console.time("gb start"); 94 | gb.start(); 95 | console.timeEnd("gb start"); 96 | } 97 | 98 | gb.stopEmulator = 1; 99 | 100 | // press and release a key 101 | console.time("fetch key"); 102 | let key = await r.get("key"); 103 | console.timeEnd("fetch key"); 104 | if (key != null) { 105 | key = Number(key); 106 | } 107 | 108 | if (key != null) { 109 | console.log("executing key", key); 110 | gb.JoyPadEvent(key, true); 111 | } 112 | 113 | // run through several frames to speed up execution 114 | console.time("emulate"); 115 | for (let i = 0; i < FRAMES; i++) { 116 | if (key != null) { 117 | if (i === Math.round(FRAMES / 2)) { 118 | gb.JoyPadEvent(key, false); 119 | } 120 | } 121 | gb.run(); 122 | } 123 | console.timeEnd("emulate"); 124 | 125 | console.time("serialize state"); 126 | const state = JSON.stringify(gb.saveState()); 127 | console.timeEnd("serialize state"); 128 | 129 | console.time("hash state"); 130 | const etag = createHash("sha256") 131 | .update(state) 132 | .digest("hex"); 133 | console.timeEnd("hash state"); 134 | 135 | console.time("render"); 136 | const buf = await toBuffer(); 137 | console.timeEnd("render"); 138 | 139 | console.time("snap"); 140 | await r.mset({ 141 | latest_etag: etag, 142 | latest_image: buf, 143 | latest_state: state, 144 | key: -1 145 | }); 146 | console.timeEnd("snap"); 147 | 148 | res.writeHead(200, { 149 | "Content-Type": "image/png", 150 | etag 151 | }); 152 | res.end(buf); 153 | } finally { 154 | await mutex.release(); 155 | } 156 | } 157 | 158 | async function read() { 159 | console.log("reading"); 160 | const [[e1, etag], [e2, image]] = await r 161 | .multi() 162 | .get("latest_etag") 163 | .getBuffer("latest_image") 164 | .exec(); 165 | 166 | if (e1 || e2) { 167 | throw new Error(`Database read error ${e1} ${e2}`); 168 | } 169 | 170 | res.writeHead(200, { "Content-Type": "image/png", etag }); 171 | res.end(image); 172 | } 173 | }; 174 | -------------------------------------------------------------------------------- /lib/yellow.gb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rauchg/pokeless/0c0be013776332d6e36bad86baaee67e5a718531/lib/yellow.gb -------------------------------------------------------------------------------- /lib/z80.js: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | JS GameBoy Emulator v.1.0 4 | Copyright (C) 2013 Alejandro Aladrén 5 | 6 | This program is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | This program is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with this program. If not, see . 18 | 19 | */ 20 | 21 | var Z80 = (module.exports = function(foreign) { 22 | "use asm"; 23 | 24 | var getAddress = foreign.getAddress; 25 | var putAddress = foreign.putAddress; 26 | var executeInt = foreign.executeInt; 27 | 28 | var PC = foreign.start | 0; 29 | var RA = 1; 30 | var RB = 0; 31 | var RC = 0x13; 32 | var RD = 0; 33 | var RE = 0xd8; 34 | var RHL = 0x014d; 35 | var RSP = 0xfffe; 36 | 37 | var FZ = 0; 38 | var FN = 0; 39 | var FH = 0; 40 | var FC = 0; 41 | 42 | var IME = 0; 43 | var stopped = 0; 44 | 45 | function stop() { 46 | stopped = 1; 47 | } 48 | 49 | function resume() { 50 | stopped = 0; 51 | } 52 | 53 | function interrupt(address) { 54 | address = address | 0; 55 | if (IME) { 56 | //foreign.log("Interrupcion", address); 57 | IME = 0; 58 | call(address); 59 | resume(); 60 | return 1; 61 | } 62 | return 0; 63 | } 64 | 65 | function getAddress16(address) { 66 | address = address | 0; 67 | return ( 68 | (((getAddress((address + 1) | 0) | 0) << 8) + 69 | (getAddress(address | 0) | 0)) | 70 | 0 71 | ); 72 | } 73 | 74 | function putAddress16(address, data) { 75 | address = address | 0; 76 | data = data | 0; 77 | putAddress((address + 1) | 0, ((data >>> 0) / (256 >>> 0)) | 0); 78 | putAddress(address | 0, (data >>> 0) % (256 >>> 0) | 0); 79 | } 80 | 81 | function immediate16() { 82 | return ( 83 | (((getAddress((PC + 1) | 0) | 0) << 8) + (getAddress(PC | 0) | 0)) | 0 84 | ); 85 | } 86 | 87 | function immediate8() { 88 | return getAddress(PC | 0) | 0; 89 | } 90 | 91 | function signImmediate8() { 92 | var val = 0; 93 | val = getAddress(PC | 0) | 0; 94 | if ((val | 0) >= 128) { 95 | return ((val | 0) - 256) | 0; 96 | } 97 | return val | 0; 98 | } 99 | 100 | function increment8(a) { 101 | a = a | 0; 102 | FN = 0; 103 | FH = 0; 104 | if ((a | 0) >= 255) { 105 | FZ = 1; 106 | FH = 1; 107 | return 0; 108 | } 109 | FZ = 0; 110 | if (((a | 0) % 16 | 0) == 15) { 111 | FH = 1; 112 | } 113 | return (a + 1) | 0; 114 | } 115 | 116 | function decrement8(a) { 117 | a = a | 0; 118 | FN = 1; 119 | FH = 0; 120 | if ((a | 0) == 0) { 121 | FZ = 0; 122 | FH = 1; 123 | return 255; 124 | } else if ((a | 0) == 1) { 125 | FZ = 1; 126 | return 0; 127 | } 128 | FZ = 0; 129 | if (((a | 0) % 16 | 0) == 0) { 130 | FH = 1; 131 | } 132 | return (a - 1) | 0; 133 | } 134 | 135 | function add8(a, b) { 136 | a = a | 0; 137 | b = b | 0; 138 | FN = 0; 139 | if (((a + b) | 0) >= 256) { 140 | FC = 1; 141 | } else { 142 | FC = 0; 143 | } 144 | if ((((a + b) | 0) % 256 | 0) == 0) { 145 | FZ = 1; 146 | } else { 147 | FZ = 0; 148 | } 149 | if (((((a | 0) % 16 | 0) + ((b | 0) % 16 | 0)) | 0) >= 16) { 150 | FH = 1; 151 | } else { 152 | FH = 0; 153 | } 154 | return ((a + b) | 0) % 256 | 0; 155 | } 156 | 157 | function adc8(a, b) { 158 | a = a | 0; 159 | b = b | 0; 160 | if (FC) { 161 | return add8(a, (b + 1) | 0) | 0; 162 | } 163 | return add8(a, b) | 0; 164 | } 165 | 166 | function add16(a, b) { 167 | a = a | 0; 168 | b = b | 0; 169 | if ((b | 0) < 0) b = (b + 65536) | 0; 170 | FN = 0; 171 | if (((a + b) | 0) >= 65536) { 172 | FC = 1; 173 | } else { 174 | FC = 0; 175 | } 176 | if (((((a | 0) % 4096 | 0) + ((b | 0) % 4096 | 0)) | 0) >= 4096) { 177 | FH = 1; 178 | } else { 179 | FH = 0; 180 | } 181 | return ((a + b) | 0) % 65536 | 0; 182 | } 183 | 184 | function sub8(a, b) { 185 | a = a | 0; 186 | b = b | 0; 187 | FN = 1; 188 | if (((a - b) | 0) < 0) { 189 | FC = 1; 190 | } else { 191 | FC = 0; 192 | } 193 | if (((a - b) | 0) == 0) { 194 | FZ = 1; 195 | } else { 196 | FZ = 0; 197 | } 198 | if (((((a | 0) % 16 | 0) - ((b | 0) % 16 | 0)) | 0) < 0) { 199 | FH = 1; 200 | } else { 201 | FH = 0; 202 | } 203 | return ((a - b + 256) | 0) % 256 | 0; 204 | } 205 | 206 | function sbc8(a, b) { 207 | a = a | 0; 208 | b = b | 0; 209 | if (FC) { 210 | return sub8(a, (b + 1) | 0) | 0; 211 | } 212 | return sub8(a, b) | 0; 213 | } 214 | 215 | function and8(a, b) { 216 | a = a | 0; 217 | b = b | 0; 218 | FN = 0; 219 | FH = 1; 220 | FC = 0; 221 | if (((a & b) | 0) == 0) { 222 | FZ = 1; 223 | } else { 224 | FZ = 0; 225 | } 226 | return a & b; 227 | } 228 | 229 | function xor8(a, b) { 230 | a = a | 0; 231 | b = b | 0; 232 | FN = 0; 233 | FH = 0; 234 | FC = 0; 235 | if (((a ^ b) | 0) == 0) { 236 | FZ = 1; 237 | } else { 238 | FZ = 0; 239 | } 240 | return a ^ b; 241 | } 242 | 243 | function or8(a, b) { 244 | a = a | 0; 245 | b = b | 0; 246 | FN = 0; 247 | FH = 0; 248 | FC = 0; 249 | if ((a | b | 0) == 0) { 250 | FZ = 1; 251 | } else { 252 | FZ = 0; 253 | } 254 | return a | b; 255 | } 256 | 257 | function call(address) { 258 | //foreign.log("Llamada a", address,"desde",PC); 259 | address = address | 0; 260 | RSP = (RSP - 2) | 0; 261 | putAddress16(RSP, PC); 262 | PC = address; 263 | RSP = ((RSP + 0x10000) | 0) % 0x10000 | 0; 264 | } 265 | 266 | function ret() { 267 | PC = getAddress16(RSP) | 0; 268 | //console.log("Retorno", PC); 269 | RSP = (RSP + 2) | 0; 270 | RSP = (RSP | 0) % 0x10000 | 0; 271 | } 272 | 273 | function setH(val) { 274 | val = val | 0; 275 | RHL = (RHL & 0xff) | (val << 8); 276 | } 277 | 278 | function setL(val) { 279 | val = val | 0; 280 | RHL = (RHL & 0xff00) | val; 281 | } 282 | 283 | // http://www.pastraiser.com/cpu/gameboy/gameboy_opcodes.html 284 | // 00 - NOP 285 | function inst00() { 286 | PC = (PC + 1) | 0; 287 | return 4; 288 | } 289 | // 01 - LD BC,d16 290 | function inst01() { 291 | var data = 0; 292 | PC = (PC + 1) | 0; 293 | data = immediate16() | 0; 294 | RB = data >> 8; 295 | RC = data & 0xff; 296 | PC = (PC + 2) | 0; 297 | return 12; 298 | } 299 | // 02 - LD (BC),A 300 | function inst02() { 301 | putAddress((RB << 8) | RC, RA | 0); 302 | PC = (PC + 1) | 0; 303 | return 8; 304 | } 305 | // 03 - INC BC 306 | function inst03() { 307 | RC = (RC + 1) | 0; 308 | if ((RC | 0) == 256) { 309 | RC = 0; 310 | RB = (RB + 1) | 0; 311 | if ((RB | 0) == 256) RB = 0; 312 | } 313 | PC = (PC + 1) | 0; 314 | return 8; 315 | } 316 | // 04 - INC B 317 | function inst04() { 318 | RB = increment8(RB) | 0; 319 | PC = (PC + 1) | 0; 320 | return 4; 321 | } 322 | // 05 - DEC B 323 | function inst05() { 324 | RB = decrement8(RB) | 0; 325 | PC = (PC + 1) | 0; 326 | return 4; 327 | } 328 | // 06 - LD B,d8 329 | function inst06() { 330 | PC = (PC + 1) | 0; 331 | RB = immediate8() | 0; 332 | PC = (PC + 1) | 0; 333 | return 8; 334 | } 335 | // 07 - RLCA 336 | function inst07() { 337 | PC = (PC + 1) | 0; 338 | cbinstruction(7); 339 | return 4; 340 | } 341 | // 08 - LD (a16),SP 342 | function inst08() { 343 | PC = (PC + 1) | 0; 344 | putAddress16(immediate16() | 0, RSP); 345 | PC = (PC + 2) | 0; 346 | return 20; 347 | } 348 | // 09 - ADD HL,BC 349 | function inst09() { 350 | RHL = add16(RHL, (RB << 8) | RC) | 0; 351 | PC = (PC + 1) | 0; 352 | return 8; 353 | } 354 | // 0A - LD A,(BC) 355 | function inst0A() { 356 | RA = getAddress((RB << 8) | RC) | 0; 357 | PC = (PC + 1) | 0; 358 | return 8; 359 | } 360 | // 0B - DEC BC 361 | function inst0B() { 362 | RC = (RC - 1) | 0; 363 | if ((RC | 0) == -1) { 364 | RC = 255; 365 | RB = (RB - 1) | 0; 366 | if ((RB | 0) == -1) RB = 255; 367 | } 368 | PC = (PC + 1) | 0; 369 | return 8; 370 | } 371 | // 0C - INC C 372 | function inst0C() { 373 | RC = increment8(RC) | 0; 374 | PC = (PC + 1) | 0; 375 | return 4; 376 | } 377 | // 0D - DEC C 378 | function inst0D() { 379 | RC = decrement8(RC) | 0; 380 | PC = (PC + 1) | 0; 381 | return 4; 382 | } 383 | // 0E - LD C,d8 384 | function inst0E() { 385 | PC = (PC + 1) | 0; 386 | RC = immediate8() | 0; 387 | PC = (PC + 1) | 0; 388 | return 8; 389 | } 390 | // 0F - RRCA 391 | function inst0F() { 392 | PC = (PC + 1) | 0; 393 | cbinstruction(15); 394 | return 4; 395 | } 396 | // 10 - STOP 397 | function inst10() { 398 | stop(); 399 | PC = (PC + 1) | 0; 400 | return 4; 401 | } 402 | // 11 - LD DE,d16 403 | function inst11() { 404 | var data = 0; 405 | PC = (PC + 1) | 0; 406 | data = immediate16() | 0; 407 | RD = data >> 8; 408 | RE = data & 0xff; 409 | PC = (PC + 2) | 0; 410 | return 12; 411 | } 412 | // 12 - LD (DE),A 413 | function inst12() { 414 | putAddress((RD << 8) | RE, RA | 0); 415 | PC = (PC + 1) | 0; 416 | return 8; 417 | } 418 | // 13 - INC DE 419 | function inst13() { 420 | RE = (RE + 1) | 0; 421 | if ((RE | 0) == 256) { 422 | RE = 0; 423 | RD = (RD + 1) | 0; 424 | if ((RD | 0) == 256) RD = 0; 425 | } 426 | PC = (PC + 1) | 0; 427 | return 8; 428 | } 429 | // 14 - INC D 430 | function inst14() { 431 | RD = increment8(RD) | 0; 432 | PC = (PC + 1) | 0; 433 | return 4; 434 | } 435 | // 15 - DEC D 436 | function inst15() { 437 | RD = decrement8(RD) | 0; 438 | PC = (PC + 1) | 0; 439 | return 4; 440 | } 441 | // 16 - LD D,d8 442 | function inst16() { 443 | PC = (PC + 1) | 0; 444 | RD = immediate8() | 0; 445 | PC = (PC + 1) | 0; 446 | return 8; 447 | } 448 | // 17 - RLA 449 | function inst17() { 450 | PC = (PC + 1) | 0; 451 | cbinstruction(23); 452 | return 4; 453 | } 454 | // 18 - JR r8 455 | function inst18() { 456 | PC = (PC + 1) | 0; 457 | PC = (PC + (signImmediate8() | 0) + 1) | 0; 458 | return 12; 459 | } 460 | // 19 - ADD HL,DE 461 | function inst19() { 462 | RHL = add16(RHL, (RD << 8) | RE) | 0; 463 | PC = (PC + 1) | 0; 464 | return 8; 465 | } 466 | // 1A - LD A,(DE) 467 | function inst1A() { 468 | RA = getAddress((RD << 8) | RE) | 0; 469 | PC = (PC + 1) | 0; 470 | return 8; 471 | } 472 | // 1B - DEC DE 473 | function inst1B() { 474 | RE = (RE - 1) | 0; 475 | if ((RE | 0) == -1) { 476 | RE = 255; 477 | RD = (RD - 1) | 0; 478 | if ((RD | 0) == -1) RD = 255; 479 | } 480 | PC = (PC + 1) | 0; 481 | return 8; 482 | } 483 | // 1C - INC E 484 | function inst1C() { 485 | RE = increment8(RE) | 0; 486 | PC = (PC + 1) | 0; 487 | return 4; 488 | } 489 | // 1D - DEC E 490 | function inst1D() { 491 | RE = decrement8(RE) | 0; 492 | PC = (PC + 1) | 0; 493 | return 4; 494 | } 495 | // 1E - LD E,d8 496 | function inst1E() { 497 | PC = (PC + 1) | 0; 498 | RE = immediate8() | 0; 499 | PC = (PC + 1) | 0; 500 | return 8; 501 | } 502 | // 1F - RRA 503 | function inst1F() { 504 | PC = (PC + 1) | 0; 505 | cbinstruction(31); 506 | return 4; 507 | } 508 | // 20 - JR NZ,r8 509 | function inst20() { 510 | if (!FZ) { 511 | PC = (PC + 1) | 0; 512 | PC = (PC + (signImmediate8() | 0) + 1) | 0; 513 | return 12; 514 | } 515 | PC = (PC + 2) | 0; 516 | return 8; 517 | } 518 | // 21 - LD HL,d16 519 | function inst21() { 520 | PC = (PC + 1) | 0; 521 | RHL = immediate16() | 0; 522 | PC = (PC + 2) | 0; 523 | return 12; 524 | } 525 | // 22 - LD (HL+),A 526 | function inst22() { 527 | putAddress(RHL | 0, RA | 0); 528 | RHL = (RHL + 1) | 0; 529 | if ((RHL | 0) > 0xffff) RHL = 0; 530 | PC = (PC + 1) | 0; 531 | return 8; 532 | } 533 | // 23 - INC HL 534 | function inst23() { 535 | RHL = (RHL + 1) | 0; 536 | if ((RHL | 0) > 0xffff) RHL = 0; 537 | PC = (PC + 1) | 0; 538 | return 8; 539 | } 540 | // 24 - INC H 541 | function inst24() { 542 | setH(increment8(RHL >> 8) | 0); 543 | PC = (PC + 1) | 0; 544 | return 4; 545 | } 546 | // 25 - DEC H 547 | function inst25() { 548 | setH(decrement8(RHL >> 8) | 0); 549 | PC = (PC + 1) | 0; 550 | return 4; 551 | } 552 | // 26 - LD H,d8 553 | function inst26() { 554 | PC = (PC + 1) | 0; 555 | setH(immediate8() | 0); 556 | PC = (PC + 1) | 0; 557 | return 8; 558 | } 559 | // 27 - DAA 560 | function inst27() { 561 | var upper = 0; 562 | var lower = 0; 563 | PC = (PC + 1) | 0; 564 | upper = RA >> 4; 565 | lower = (RA | 0) % 16 | 0; 566 | if (!FN) { 567 | if (!FC & !FH & ((upper | 0) <= 9) & ((lower | 0) <= 9)) { 568 | FC = 0; 569 | } else if (!FC & !FH & ((upper | 0) <= 8) & ((lower | 0) >= 10)) { 570 | FC = 0; 571 | RA = (RA + 0x06) | 0; 572 | } else if (!FC & FH & ((upper | 0) <= 9) & ((lower | 0) <= 3)) { 573 | FC = 0; 574 | RA = (RA + 0x06) | 0; 575 | } else if (!FC & !FH & ((upper | 0) >= 10) & ((lower | 0) <= 9)) { 576 | FC = 1; 577 | RA = (RA + 0x60) | 0; 578 | } else if (!FC & !FH & ((upper | 0) >= 9) & ((lower | 0) >= 10)) { 579 | FC = 1; 580 | RA = (RA + 0x66) | 0; 581 | } else if (!FC & FH & ((upper | 0) >= 10) & ((lower | 0) <= 3)) { 582 | FC = 1; 583 | RA = (RA + 0x66) | 0; 584 | } else if (FC & !FH & ((upper | 0) <= 2) & ((lower | 0) <= 9)) { 585 | FC = 1; 586 | RA = (RA + 0x60) | 0; 587 | } else if (FC & !FH & ((upper | 0) <= 2) & ((lower | 0) >= 10)) { 588 | FC = 1; 589 | RA = (RA + 0x66) | 0; 590 | } else if (FC & FH & ((upper | 0) <= 3) & ((lower | 0) <= 3)) { 591 | FC = 1; 592 | RA = (RA + 0x66) | 0; 593 | } 594 | } else { 595 | if (!FC & !FH & ((upper | 0) <= 9) & ((lower | 0) <= 9)) { 596 | FC = 0; 597 | } else if (!FC & FH & ((upper | 0) <= 8) & ((lower | 0) >= 6)) { 598 | FC = 0; 599 | RA = (RA + 0xfa) | 0; 600 | } else if (FC & !FH & ((upper | 0) >= 7) & ((lower | 0) <= 9)) { 601 | FC = 1; 602 | RA = (RA + 0xa0) | 0; 603 | } else if (FC & FH & ((upper | 0) >= 6) & ((lower | 0) >= 6)) { 604 | FC = 1; 605 | RA = (RA + 0x9a) | 0; 606 | } 607 | } 608 | RA = (RA | 0) % 256 | 0; 609 | return 4; 610 | } 611 | // 28 - JR Z,r8 612 | function inst28() { 613 | if (FZ) { 614 | PC = (PC + 1) | 0; 615 | PC = (PC + (signImmediate8() | 0) + 1) | 0; 616 | return 12; 617 | } 618 | PC = (PC + 2) | 0; 619 | return 8; 620 | } 621 | // 29 - ADD HL,HL 622 | function inst29() { 623 | RHL = add16(RHL, RHL) | 0; 624 | PC = (PC + 1) | 0; 625 | return 8; 626 | } 627 | // 2A - LD A,(HL+) 628 | function inst2A() { 629 | RA = getAddress(RHL | 0) | 0; 630 | RHL = (RHL + 1) | 0; 631 | if ((RHL | 0) > 0xffff) RHL = 0; 632 | PC = (PC + 1) | 0; 633 | return 8; 634 | } 635 | // 2B - DEC HL 636 | function inst2B() { 637 | RHL = (RHL - 1) | 0; 638 | if ((RHL | 0) < 0) RHL = 0xffff; 639 | PC = (PC + 1) | 0; 640 | return 8; 641 | } 642 | // 2C - INC L 643 | function inst2C() { 644 | setL(increment8(RHL & 0xff) | 0); 645 | PC = (PC + 1) | 0; 646 | return 4; 647 | } 648 | // 2D - DEC L 649 | function inst2D() { 650 | setL(decrement8(RHL & 0xff) | 0); 651 | PC = (PC + 1) | 0; 652 | return 4; 653 | } 654 | // 2E - LD L,d8 655 | function inst2E() { 656 | PC = (PC + 1) | 0; 657 | setL(immediate8() | 0); 658 | PC = (PC + 1) | 0; 659 | return 8; 660 | } 661 | // 2F - CPL 662 | function inst2F() { 663 | RA = RA ^ 255; 664 | FN = 1; 665 | FH = 1; 666 | PC = (PC + 1) | 0; 667 | return 4; 668 | } 669 | // 30 - JR NC,r8 670 | function inst30() { 671 | if (!FC) { 672 | PC = (PC + 1) | 0; 673 | PC = (PC + (signImmediate8() | 0) + 1) | 0; 674 | return 12; 675 | } 676 | PC = (PC + 2) | 0; 677 | return 8; 678 | } 679 | // 31 - LD SP,d16 680 | function inst31() { 681 | PC = (PC + 1) | 0; 682 | RSP = immediate16() | 0; 683 | PC = (PC + 2) | 0; 684 | return 12; 685 | } 686 | // 32 - LD (HL-),A 687 | function inst32() { 688 | putAddress(RHL | 0, RA | 0); 689 | RHL = (RHL - 1) | 0; 690 | if ((RHL | 0) < 0) RHL = 0xffff; 691 | PC = (PC + 1) | 0; 692 | return 8; 693 | } 694 | // 33 - INC SP 695 | function inst33() { 696 | RSP = (RSP + 1) | 0; 697 | if ((RSP | 0) > 0xffff) RSP = 0; 698 | PC = (PC + 1) | 0; 699 | return 8; 700 | } 701 | // 34 - INC (HL) 702 | function inst34() { 703 | putAddress(RHL | 0, increment8(getAddress(RHL | 0) | 0) | 0); 704 | PC = (PC + 1) | 0; 705 | return 12; 706 | } 707 | // 35 - DEC (HL) 708 | function inst35() { 709 | putAddress(RHL | 0, decrement8(getAddress(RHL | 0) | 0) | 0); 710 | PC = (PC + 1) | 0; 711 | return 12; 712 | } 713 | // 36 - LD (HL),d8 714 | function inst36() { 715 | PC = (PC + 1) | 0; 716 | putAddress(RHL | 0, immediate8() | 0); 717 | PC = (PC + 1) | 0; 718 | return 12; 719 | } 720 | // 37 - SCF 721 | function inst37() { 722 | FC = 1; 723 | FN = 0; 724 | FH = 0; 725 | PC = (PC + 1) | 0; 726 | return 4; 727 | } 728 | // 38 - JR C,r8 729 | function inst38() { 730 | if (FC) { 731 | PC = (PC + 1) | 0; 732 | PC = (PC + (signImmediate8() | 0) + 1) | 0; 733 | return 12; 734 | } 735 | PC = (PC + 2) | 0; 736 | return 8; 737 | } 738 | // 39 - ADD HL,SP 739 | function inst39() { 740 | RHL = add16(RHL | 0, RSP | 0) | 0; 741 | PC = (PC + 1) | 0; 742 | return 8; 743 | } 744 | // 3A - LD A,(HL-) 745 | function inst3A() { 746 | RA = getAddress(RHL | 0) | 0; 747 | RHL = (RHL - 1) | 0; 748 | if ((RHL | 0) < 0) RHL = 0xffff; 749 | PC = (PC + 1) | 0; 750 | return 8; 751 | } 752 | // 3B - DEC SP 753 | function inst3B() { 754 | RSP = (RSP - 1) | 0; 755 | if ((RSP | 0) < 0) RSP = 0xffff; 756 | PC = (PC + 1) | 0; 757 | return 8; 758 | } 759 | // 3C - INC A 760 | function inst3C() { 761 | RA = increment8(RA | 0) | 0; 762 | PC = (PC + 1) | 0; 763 | return 4; 764 | } 765 | // 3D - DEC L 766 | function inst3D() { 767 | RA = decrement8(RA | 0) | 0; 768 | PC = (PC + 1) | 0; 769 | return 4; 770 | } 771 | // 3E - LD A,d8 772 | function inst3E() { 773 | PC = (PC + 1) | 0; 774 | RA = immediate8() | 0; 775 | PC = (PC + 1) | 0; 776 | return 8; 777 | } 778 | // 3F - CCF 779 | function inst3F() { 780 | if (FC) FC = 0; 781 | else FC = 1; 782 | FN = 0; 783 | FH = 0; 784 | PC = (PC + 1) | 0; 785 | return 4; 786 | } 787 | // 40 - LD B,B 788 | function inst40() { 789 | RB = RB; 790 | PC = (PC + 1) | 0; 791 | return 4; 792 | } 793 | // 41 - LD B,C 794 | function inst41() { 795 | RB = RC; 796 | PC = (PC + 1) | 0; 797 | return 4; 798 | } 799 | // 42 - LD B,D 800 | function inst42() { 801 | RB = RD; 802 | PC = (PC + 1) | 0; 803 | return 4; 804 | } 805 | // 43 - LD B,E 806 | function inst43() { 807 | RB = RE; 808 | PC = (PC + 1) | 0; 809 | return 4; 810 | } 811 | // 44 - LD B,H 812 | function inst44() { 813 | RB = RHL >> 8; 814 | PC = (PC + 1) | 0; 815 | return 4; 816 | } 817 | // 45 - LD B,L 818 | function inst45() { 819 | RB = RHL & 0xff; 820 | PC = (PC + 1) | 0; 821 | return 4; 822 | } 823 | // 46 - LD B,(HL) 824 | function inst46() { 825 | RB = getAddress(RHL | 0) | 0; 826 | PC = (PC + 1) | 0; 827 | return 8; 828 | } 829 | // 47 - LD B,A 830 | function inst47() { 831 | RB = RA; 832 | PC = (PC + 1) | 0; 833 | return 4; 834 | } 835 | // 48 - LD C,B 836 | function inst48() { 837 | RC = RB; 838 | PC = (PC + 1) | 0; 839 | return 4; 840 | } 841 | // 49 - LD C,C 842 | function inst49() { 843 | RC = RC; 844 | PC = (PC + 1) | 0; 845 | return 4; 846 | } 847 | // 4A - LD C,D 848 | function inst4A() { 849 | RC = RD; 850 | PC = (PC + 1) | 0; 851 | return 4; 852 | } 853 | // 4B - LD C,E 854 | function inst4B() { 855 | RC = RE; 856 | PC = (PC + 1) | 0; 857 | return 4; 858 | } 859 | // 4C - LD C,H 860 | function inst4C() { 861 | RC = RHL >> 8; 862 | PC = (PC + 1) | 0; 863 | return 4; 864 | } 865 | // 4D - LD C,L 866 | function inst4D() { 867 | RC = RHL & 0xff; 868 | PC = (PC + 1) | 0; 869 | return 4; 870 | } 871 | // 4E - LD C,(HL) 872 | function inst4E() { 873 | RC = getAddress(RHL | 0) | 0; 874 | PC = (PC + 1) | 0; 875 | return 8; 876 | } 877 | // 4F - LD C,A 878 | function inst4F() { 879 | RC = RA; 880 | PC = (PC + 1) | 0; 881 | return 4; 882 | } 883 | // 50 - LD D,B 884 | function inst50() { 885 | RD = RB; 886 | PC = (PC + 1) | 0; 887 | return 4; 888 | } 889 | // 51 - LD D,C 890 | function inst51() { 891 | RD = RC; 892 | PC = (PC + 1) | 0; 893 | return 4; 894 | } 895 | // 52 - LD D,D 896 | function inst52() { 897 | RD = RD; 898 | PC = (PC + 1) | 0; 899 | return 4; 900 | } 901 | // 53 - LD D,E 902 | function inst53() { 903 | RD = RE; 904 | PC = (PC + 1) | 0; 905 | return 4; 906 | } 907 | // 54 - LD D,H 908 | function inst54() { 909 | RD = RHL >> 8; 910 | PC = (PC + 1) | 0; 911 | return 4; 912 | } 913 | // 55 - LD D,L 914 | function inst55() { 915 | RD = RHL & 0xff; 916 | PC = (PC + 1) | 0; 917 | return 4; 918 | } 919 | // 56 - LD D,(HL) 920 | function inst56() { 921 | RD = getAddress(RHL | 0) | 0; 922 | PC = (PC + 1) | 0; 923 | return 8; 924 | } 925 | // 57 - LD D,A 926 | function inst57() { 927 | RD = RA; 928 | PC = (PC + 1) | 0; 929 | return 4; 930 | } 931 | // 58 - LD E,B 932 | function inst58() { 933 | RE = RB; 934 | PC = (PC + 1) | 0; 935 | return 4; 936 | } 937 | // 59 - LD E,C 938 | function inst59() { 939 | RE = RC; 940 | PC = (PC + 1) | 0; 941 | return 4; 942 | } 943 | // 5A - LD E,D 944 | function inst5A() { 945 | RE = RD; 946 | PC = (PC + 1) | 0; 947 | return 4; 948 | } 949 | // 5B - LD E,E 950 | function inst5B() { 951 | RE = RE; 952 | PC = (PC + 1) | 0; 953 | return 4; 954 | } 955 | // 5C - LD E,H 956 | function inst5C() { 957 | RE = RHL >> 8; 958 | PC = (PC + 1) | 0; 959 | return 4; 960 | } 961 | // 5D - LD E,L 962 | function inst5D() { 963 | RE = RHL & 0xff; 964 | PC = (PC + 1) | 0; 965 | return 4; 966 | } 967 | // 5E - LD E,(HL) 968 | function inst5E() { 969 | RE = getAddress(RHL | 0) | 0; 970 | PC = (PC + 1) | 0; 971 | return 8; 972 | } 973 | // 5F - LD E,A 974 | function inst5F() { 975 | RE = RA; 976 | PC = (PC + 1) | 0; 977 | return 4; 978 | } 979 | // 60 - LD H,B 980 | function inst60() { 981 | setH(RB); 982 | PC = (PC + 1) | 0; 983 | return 4; 984 | } 985 | // 61 - LD H,C 986 | function inst61() { 987 | setH(RC); 988 | PC = (PC + 1) | 0; 989 | return 4; 990 | } 991 | // 62 - LD H,D 992 | function inst62() { 993 | setH(RD); 994 | PC = (PC + 1) | 0; 995 | return 4; 996 | } 997 | // 63 - LD H,E 998 | function inst63() { 999 | setH(RE); 1000 | PC = (PC + 1) | 0; 1001 | return 4; 1002 | } 1003 | // 64 - LD H,H 1004 | function inst64() { 1005 | setH(RHL >> 8); 1006 | PC = (PC + 1) | 0; 1007 | return 4; 1008 | } 1009 | // 65 - LD H,L 1010 | function inst65() { 1011 | setH(RHL & 0xff); 1012 | PC = (PC + 1) | 0; 1013 | return 4; 1014 | } 1015 | // 66 - LD H,(HL) 1016 | function inst66() { 1017 | setH(getAddress(RHL | 0) | 0); 1018 | PC = (PC + 1) | 0; 1019 | return 8; 1020 | } 1021 | // 67 - LD H,A 1022 | function inst67() { 1023 | setH(RA); 1024 | PC = (PC + 1) | 0; 1025 | return 4; 1026 | } 1027 | // 68 - LD L,B 1028 | function inst68() { 1029 | setL(RB); 1030 | PC = (PC + 1) | 0; 1031 | return 4; 1032 | } 1033 | // 69 - LD L,C 1034 | function inst69() { 1035 | setL(RC); 1036 | PC = (PC + 1) | 0; 1037 | return 4; 1038 | } 1039 | // 6A - LD L,D 1040 | function inst6A() { 1041 | setL(RD); 1042 | PC = (PC + 1) | 0; 1043 | return 4; 1044 | } 1045 | // 6B - LD L,E 1046 | function inst6B() { 1047 | setL(RE); 1048 | PC = (PC + 1) | 0; 1049 | return 4; 1050 | } 1051 | // 6C - LD L,H 1052 | function inst6C() { 1053 | setL(RHL >> 8); 1054 | PC = (PC + 1) | 0; 1055 | return 4; 1056 | } 1057 | // 6D - LD L,L 1058 | function inst6D() { 1059 | setL(RHL & 0xff); 1060 | PC = (PC + 1) | 0; 1061 | return 4; 1062 | } 1063 | // 6E - LD L,(HL) 1064 | function inst6E() { 1065 | setL(getAddress(RHL | 0) | 0); 1066 | PC = (PC + 1) | 0; 1067 | return 8; 1068 | } 1069 | // 6F - LD L,A 1070 | function inst6F() { 1071 | setL(RA); 1072 | PC = (PC + 1) | 0; 1073 | return 4; 1074 | } 1075 | // 70 - LD (HL),B 1076 | function inst70() { 1077 | putAddress(RHL | 0, RB | 0); 1078 | PC = (PC + 1) | 0; 1079 | return 8; 1080 | } 1081 | // 71 - LD (HL),C 1082 | function inst71() { 1083 | putAddress(RHL | 0, RC | 0); 1084 | PC = (PC + 1) | 0; 1085 | return 8; 1086 | } 1087 | // 72 - LD (HL),D 1088 | function inst72() { 1089 | putAddress(RHL | 0, RD | 0); 1090 | PC = (PC + 1) | 0; 1091 | return 8; 1092 | } 1093 | // 73 - LD (HL),E 1094 | function inst73() { 1095 | putAddress(RHL | 0, RE | 0); 1096 | PC = (PC + 1) | 0; 1097 | return 8; 1098 | } 1099 | // 74 - LD (HL),H 1100 | function inst74() { 1101 | putAddress(RHL | 0, RHL >> 8); 1102 | PC = (PC + 1) | 0; 1103 | return 8; 1104 | } 1105 | // 75 - LD (HL),L 1106 | function inst75() { 1107 | putAddress(RHL | 0, RHL & 0xff); 1108 | PC = (PC + 1) | 0; 1109 | return 8; 1110 | } 1111 | // 76 - HALT 1112 | function inst76() { 1113 | if ((IME | 0) == 1) stop(); 1114 | PC = (PC + 1) | 0; 1115 | return 4; 1116 | } 1117 | // 77 - LD (HL),A 1118 | function inst77() { 1119 | putAddress(RHL | 0, RA | 0); 1120 | PC = (PC + 1) | 0; 1121 | return 8; 1122 | } 1123 | // 78 - LD A,B 1124 | function inst78() { 1125 | RA = RB; 1126 | PC = (PC + 1) | 0; 1127 | return 4; 1128 | } 1129 | // 79 - LD A,C 1130 | function inst79() { 1131 | RA = RC; 1132 | PC = (PC + 1) | 0; 1133 | return 4; 1134 | } 1135 | // 7A - LD A,D 1136 | function inst7A() { 1137 | RA = RD; 1138 | PC = (PC + 1) | 0; 1139 | return 4; 1140 | } 1141 | // 7B - LD A,E 1142 | function inst7B() { 1143 | RA = RE; 1144 | PC = (PC + 1) | 0; 1145 | return 4; 1146 | } 1147 | // 7C - LD A,H 1148 | function inst7C() { 1149 | RA = RHL >> 8; 1150 | PC = (PC + 1) | 0; 1151 | return 4; 1152 | } 1153 | // 7D - LD A,L 1154 | function inst7D() { 1155 | RA = RHL & 0xff; 1156 | PC = (PC + 1) | 0; 1157 | return 4; 1158 | } 1159 | // 7E - LD A,(HL) 1160 | function inst7E() { 1161 | RA = getAddress(RHL | 0) | 0; 1162 | PC = (PC + 1) | 0; 1163 | return 8; 1164 | } 1165 | // 7F - LD A,A 1166 | function inst7F() { 1167 | RA = RA; 1168 | PC = (PC + 1) | 0; 1169 | return 4; 1170 | } 1171 | // 80 - ADD A,B 1172 | function inst80() { 1173 | RA = add8(RA | 0, RB | 0) | 0; 1174 | PC = (PC + 1) | 0; 1175 | return 4; 1176 | } 1177 | // 81 - ADD A,C 1178 | function inst81() { 1179 | RA = add8(RA | 0, RC | 0) | 0; 1180 | PC = (PC + 1) | 0; 1181 | return 4; 1182 | } 1183 | // 82 - ADD A,D 1184 | function inst82() { 1185 | RA = add8(RA | 0, RD | 0) | 0; 1186 | PC = (PC + 1) | 0; 1187 | return 4; 1188 | } 1189 | // 83 - ADD A,E 1190 | function inst83() { 1191 | RA = add8(RA | 0, RE | 0) | 0; 1192 | PC = (PC + 1) | 0; 1193 | return 4; 1194 | } 1195 | // 84 - ADD A,H 1196 | function inst84() { 1197 | RA = add8(RA | 0, RHL >> 8) | 0; 1198 | PC = (PC + 1) | 0; 1199 | return 4; 1200 | } 1201 | // 85 - ADD A,L 1202 | function inst85() { 1203 | RA = add8(RA | 0, RHL & 0xff) | 0; 1204 | PC = (PC + 1) | 0; 1205 | return 4; 1206 | } 1207 | // 86 - ADD A,(HL) 1208 | function inst86() { 1209 | RA = add8(RA | 0, getAddress(RHL | 0) | 0) | 0; 1210 | PC = (PC + 1) | 0; 1211 | return 8; 1212 | } 1213 | // 87 - ADD A,A 1214 | function inst87() { 1215 | RA = add8(RA | 0, RA | 0) | 0; 1216 | PC = (PC + 1) | 0; 1217 | return 4; 1218 | } 1219 | // 88 - ADC A,B 1220 | function inst88() { 1221 | RA = adc8(RA | 0, RB | 0) | 0; 1222 | PC = (PC + 1) | 0; 1223 | return 4; 1224 | } 1225 | // 89 - ADC A,C 1226 | function inst89() { 1227 | RA = adc8(RA | 0, RC | 0) | 0; 1228 | PC = (PC + 1) | 0; 1229 | return 4; 1230 | } 1231 | // 8A - ADC A,D 1232 | function inst8A() { 1233 | RA = adc8(RA | 0, RD | 0) | 0; 1234 | PC = (PC + 1) | 0; 1235 | return 4; 1236 | } 1237 | // 8B - ADC A,E 1238 | function inst8B() { 1239 | RA = adc8(RA | 0, RE | 0) | 0; 1240 | PC = (PC + 1) | 0; 1241 | return 4; 1242 | } 1243 | // 8C - ADC A,H 1244 | function inst8C() { 1245 | RA = adc8(RA | 0, RHL >> 8) | 0; 1246 | PC = (PC + 1) | 0; 1247 | return 4; 1248 | } 1249 | // 8D - ADC A,L 1250 | function inst8D() { 1251 | RA = adc8(RA | 0, RHL & 0xff) | 0; 1252 | PC = (PC + 1) | 0; 1253 | return 4; 1254 | } 1255 | // 8E - ADC A,(HL) 1256 | function inst8E() { 1257 | RA = adc8(RA | 0, getAddress(RHL | 0) | 0) | 0; 1258 | PC = (PC + 1) | 0; 1259 | return 8; 1260 | } 1261 | // 8F - ADC A,A 1262 | function inst8F() { 1263 | RA = adc8(RA | 0, RA | 0) | 0; 1264 | PC = (PC + 1) | 0; 1265 | return 4; 1266 | } 1267 | // 90 - SUB B 1268 | function inst90() { 1269 | RA = sub8(RA | 0, RB | 0) | 0; 1270 | PC = (PC + 1) | 0; 1271 | return 4; 1272 | } 1273 | // 91 - SUB C 1274 | function inst91() { 1275 | RA = sub8(RA | 0, RC | 0) | 0; 1276 | PC = (PC + 1) | 0; 1277 | return 4; 1278 | } 1279 | // 92 - SUB D 1280 | function inst92() { 1281 | RA = sub8(RA | 0, RD | 0) | 0; 1282 | PC = (PC + 1) | 0; 1283 | return 4; 1284 | } 1285 | // 93 - SUB E 1286 | function inst93() { 1287 | RA = sub8(RA | 0, RE | 0) | 0; 1288 | PC = (PC + 1) | 0; 1289 | return 4; 1290 | } 1291 | // 94 - SUB H 1292 | function inst94() { 1293 | RA = sub8(RA | 0, RHL >> 8) | 0; 1294 | PC = (PC + 1) | 0; 1295 | return 4; 1296 | } 1297 | // 95 - SUB L 1298 | function inst95() { 1299 | RA = sub8(RA | 0, RHL & 0xff) | 0; 1300 | PC = (PC + 1) | 0; 1301 | return 4; 1302 | } 1303 | // 96 - SUB (HL) 1304 | function inst96() { 1305 | RA = sub8(RA | 0, getAddress(RHL | 0) | 0) | 0; 1306 | PC = (PC + 1) | 0; 1307 | return 8; 1308 | } 1309 | // 97 - SUB A 1310 | function inst97() { 1311 | RA = sub8(RA | 0, RA | 0) | 0; 1312 | PC = (PC + 1) | 0; 1313 | return 4; 1314 | } 1315 | // 98 - SBC A,B 1316 | function inst98() { 1317 | RA = sbc8(RA | 0, RB | 0) | 0; 1318 | PC = (PC + 1) | 0; 1319 | return 4; 1320 | } 1321 | // 99 - SBC A,C 1322 | function inst99() { 1323 | RA = sbc8(RA | 0, RC | 0) | 0; 1324 | PC = (PC + 1) | 0; 1325 | return 4; 1326 | } 1327 | // 9A - SBC A,D 1328 | function inst9A() { 1329 | RA = sbc8(RA | 0, RD | 0) | 0; 1330 | PC = (PC + 1) | 0; 1331 | return 4; 1332 | } 1333 | // 9B - SBC A,E 1334 | function inst9B() { 1335 | RA = sbc8(RA | 0, RE | 0) | 0; 1336 | PC = (PC + 1) | 0; 1337 | return 4; 1338 | } 1339 | // 9C - SBC A,H 1340 | function inst9C() { 1341 | RA = sbc8(RA | 0, RHL >> 8) | 0; 1342 | PC = (PC + 1) | 0; 1343 | return 4; 1344 | } 1345 | // 9D - SBC A,L 1346 | function inst9D() { 1347 | RA = sbc8(RA | 0, RHL & 0xff) | 0; 1348 | PC = (PC + 1) | 0; 1349 | return 4; 1350 | } 1351 | // 9E - SBC A,(HL) 1352 | function inst9E() { 1353 | RA = sbc8(RA | 0, getAddress(RHL | 0) | 0) | 0; 1354 | PC = (PC + 1) | 0; 1355 | return 8; 1356 | } 1357 | // 9F - SBC A,A 1358 | function inst9F() { 1359 | RA = sbc8(RA | 0, RA | 0) | 0; 1360 | PC = (PC + 1) | 0; 1361 | return 4; 1362 | } 1363 | // A0 - AND B 1364 | function instA0() { 1365 | RA = and8(RA | 0, RB | 0) | 0; 1366 | PC = (PC + 1) | 0; 1367 | return 4; 1368 | } 1369 | // A1 - AND C 1370 | function instA1() { 1371 | RA = and8(RA | 0, RC | 0) | 0; 1372 | PC = (PC + 1) | 0; 1373 | return 4; 1374 | } 1375 | // A2 - AND D 1376 | function instA2() { 1377 | RA = and8(RA | 0, RD | 0) | 0; 1378 | PC = (PC + 1) | 0; 1379 | return 4; 1380 | } 1381 | // A3 - AND E 1382 | function instA3() { 1383 | RA = and8(RA | 0, RE | 0) | 0; 1384 | PC = (PC + 1) | 0; 1385 | return 4; 1386 | } 1387 | // A4 - AND H 1388 | function instA4() { 1389 | RA = and8(RA | 0, RHL >> 8) | 0; 1390 | PC = (PC + 1) | 0; 1391 | return 4; 1392 | } 1393 | // A5 - AND L 1394 | function instA5() { 1395 | RA = and8(RA | 0, RHL & 0xff) | 0; 1396 | PC = (PC + 1) | 0; 1397 | return 4; 1398 | } 1399 | // A6 - AND (HL) 1400 | function instA6() { 1401 | RA = and8(RA | 0, getAddress(RHL | 0) | 0) | 0; 1402 | PC = (PC + 1) | 0; 1403 | return 8; 1404 | } 1405 | // A7 - AND A 1406 | function instA7() { 1407 | RA = and8(RA | 0, RA | 0) | 0; 1408 | PC = (PC + 1) | 0; 1409 | return 4; 1410 | } 1411 | // A8 - XOR B 1412 | function instA8() { 1413 | RA = xor8(RA | 0, RB | 0) | 0; 1414 | PC = (PC + 1) | 0; 1415 | return 4; 1416 | } 1417 | // A9 - XOR C 1418 | function instA9() { 1419 | RA = xor8(RA | 0, RC | 0) | 0; 1420 | PC = (PC + 1) | 0; 1421 | return 4; 1422 | } 1423 | // AA - XOR D 1424 | function instAA() { 1425 | RA = xor8(RA | 0, RD | 0) | 0; 1426 | PC = (PC + 1) | 0; 1427 | return 4; 1428 | } 1429 | // AB - XOR E 1430 | function instAB() { 1431 | RA = xor8(RA | 0, RE | 0) | 0; 1432 | PC = (PC + 1) | 0; 1433 | return 4; 1434 | } 1435 | // AC - XOR H 1436 | function instAC() { 1437 | RA = xor8(RA | 0, RHL >> 8) | 0; 1438 | PC = (PC + 1) | 0; 1439 | return 4; 1440 | } 1441 | // AD - XOR L 1442 | function instAD() { 1443 | RA = xor8(RA | 0, RHL & 0xff) | 0; 1444 | PC = (PC + 1) | 0; 1445 | return 4; 1446 | } 1447 | // AE - XOR (HL) 1448 | function instAE() { 1449 | RA = xor8(RA | 0, getAddress(RHL | 0) | 0) | 0; 1450 | PC = (PC + 1) | 0; 1451 | return 8; 1452 | } 1453 | // AF - XOR A 1454 | function instAF() { 1455 | RA = xor8(RA | 0, RA | 0) | 0; 1456 | PC = (PC + 1) | 0; 1457 | return 4; 1458 | } 1459 | // B0 - OR B 1460 | function instB0() { 1461 | RA = or8(RA | 0, RB | 0) | 0; 1462 | PC = (PC + 1) | 0; 1463 | return 4; 1464 | } 1465 | // B1 - OR C 1466 | function instB1() { 1467 | RA = or8(RA | 0, RC | 0) | 0; 1468 | PC = (PC + 1) | 0; 1469 | return 4; 1470 | } 1471 | // B2 - OR D 1472 | function instB2() { 1473 | RA = or8(RA | 0, RD | 0) | 0; 1474 | PC = (PC + 1) | 0; 1475 | return 4; 1476 | } 1477 | // B3 - OR E 1478 | function instB3() { 1479 | RA = or8(RA | 0, RE | 0) | 0; 1480 | PC = (PC + 1) | 0; 1481 | return 4; 1482 | } 1483 | // B4 - OR H 1484 | function instB4() { 1485 | RA = or8(RA | 0, RHL >> 8) | 0; 1486 | PC = (PC + 1) | 0; 1487 | return 4; 1488 | } 1489 | // B5 - OR L 1490 | function instB5() { 1491 | RA = or8(RA | 0, RHL & 0xff) | 0; 1492 | PC = (PC + 1) | 0; 1493 | return 4; 1494 | } 1495 | // B6 - OR (HL) 1496 | function instB6() { 1497 | RA = or8(RA | 0, getAddress(RHL | 0) | 0) | 0; 1498 | PC = (PC + 1) | 0; 1499 | return 8; 1500 | } 1501 | // B7 - OR A 1502 | function instB7() { 1503 | RA = or8(RA | 0, RA | 0) | 0; 1504 | PC = (PC + 1) | 0; 1505 | return 4; 1506 | } 1507 | // B8 - CP B 1508 | function instB8() { 1509 | sub8(RA | 0, RB | 0) | 0; 1510 | PC = (PC + 1) | 0; 1511 | return 4; 1512 | } 1513 | // B9 - CP C 1514 | function instB9() { 1515 | sub8(RA | 0, RC | 0) | 0; 1516 | PC = (PC + 1) | 0; 1517 | return 4; 1518 | } 1519 | // BA - CP D 1520 | function instBA() { 1521 | sub8(RA | 0, RD | 0) | 0; 1522 | PC = (PC + 1) | 0; 1523 | return 4; 1524 | } 1525 | // BB - CP E 1526 | function instBB() { 1527 | sub8(RA | 0, RE | 0) | 0; 1528 | PC = (PC + 1) | 0; 1529 | return 4; 1530 | } 1531 | // BC - CP H 1532 | function instBC() { 1533 | sub8(RA | 0, RHL >> 8) | 0; 1534 | PC = (PC + 1) | 0; 1535 | return 4; 1536 | } 1537 | // BD - CP L 1538 | function instBD() { 1539 | sub8(RA | 0, RHL & 0xff) | 0; 1540 | PC = (PC + 1) | 0; 1541 | return 4; 1542 | } 1543 | // BE - CP (HL) 1544 | function instBE() { 1545 | sub8(RA | 0, getAddress(RHL | 0) | 0) | 0; 1546 | PC = (PC + 1) | 0; 1547 | return 8; 1548 | } 1549 | // BF - CP A 1550 | function instBF() { 1551 | sub8(RA | 0, RA | 0) | 0; 1552 | PC = (PC + 1) | 0; 1553 | return 4; 1554 | } 1555 | // C0 - RET NZ 1556 | function instC0() { 1557 | if (!FZ) { 1558 | ret(); 1559 | return 20; 1560 | } else PC = (PC + 1) | 0; 1561 | return 8; 1562 | } 1563 | // C1 - POP BC 1564 | function instC1() { 1565 | var data = 0; 1566 | data = getAddress16(RSP | 0) | 0; 1567 | RB = data >> 8; 1568 | RC = data & 0xff; 1569 | RSP = (RSP + 2) | 0; 1570 | PC = (PC + 1) | 0; 1571 | return 12; 1572 | } 1573 | // C2 - JP NZ,a16 1574 | function instC2() { 1575 | if (!FZ) { 1576 | PC = (PC + 1) | 0; 1577 | PC = immediate16() | 0; 1578 | return 16; 1579 | } 1580 | PC = (PC + 3) | 0; 1581 | return 12; 1582 | } 1583 | // C3 - JP a16 1584 | function instC3() { 1585 | PC = (PC + 1) | 0; 1586 | PC = immediate16() | 0; 1587 | return 16; 1588 | } 1589 | // C4 - CALL NZ,a16 1590 | function instC4() { 1591 | var ad = 0; 1592 | if (!FZ) { 1593 | PC = (PC + 1) | 0; 1594 | ad = immediate16() | 0; 1595 | PC = (PC + 2) | 0; 1596 | call(ad); 1597 | return 24; 1598 | } 1599 | PC = (PC + 3) | 0; 1600 | return 12; 1601 | } 1602 | // C5 - PUSH BC 1603 | function instC5() { 1604 | RSP = (RSP - 2) | 0; 1605 | putAddress16(RSP | 0, (RB << 8) | RC); 1606 | PC = (PC + 1) | 0; 1607 | return 16; 1608 | } 1609 | // C6 - ADD A,d8 1610 | function instC6() { 1611 | PC = (PC + 1) | 0; 1612 | RA = add8(RA | 0, immediate8() | 0) | 0; 1613 | PC = (PC + 1) | 0; 1614 | return 8; 1615 | } 1616 | // C7 - RST 00H 1617 | function instC7() { 1618 | PC = (PC + 1) | 0; 1619 | call(0); 1620 | return 16; 1621 | } 1622 | // C8 - RET Z 1623 | function instC8() { 1624 | if (FZ) { 1625 | ret(); 1626 | return 20; 1627 | } else PC = (PC + 1) | 0; 1628 | return 8; 1629 | } 1630 | // C9 - RET 1631 | function instC9() { 1632 | ret(); 1633 | return 16; 1634 | } 1635 | // CA - JP Z,a16 1636 | function instCA() { 1637 | if (FZ) { 1638 | PC = (PC + 1) | 0; 1639 | PC = immediate16() | 0; 1640 | return 16; 1641 | } 1642 | PC = (PC + 3) | 0; 1643 | return 12; 1644 | } 1645 | // CB - PREFIX CB 1646 | function instCB() { 1647 | PC = (PC + 1) | 0; 1648 | cbinstruction(immediate8() | 0); 1649 | PC = (PC + 1) | 0; 1650 | return 8; 1651 | } 1652 | // CC - CALL Z,a16 1653 | function instCC() { 1654 | var ad = 0; 1655 | if (FZ) { 1656 | PC = (PC + 1) | 0; 1657 | ad = immediate16() | 0; 1658 | PC = (PC + 2) | 0; 1659 | call(ad); 1660 | return 24; 1661 | } 1662 | PC = (PC + 3) | 0; 1663 | return 12; 1664 | } 1665 | // CD - CALL a16 1666 | function instCD() { 1667 | var ad = 0; 1668 | PC = (PC + 1) | 0; 1669 | ad = immediate16() | 0; 1670 | PC = (PC + 2) | 0; 1671 | call(ad); 1672 | return 24; 1673 | } 1674 | // CE - ADC A,d8 1675 | function instCE() { 1676 | PC = (PC + 1) | 0; 1677 | RA = adc8(RA | 0, immediate8() | 0) | 0; 1678 | PC = (PC + 1) | 0; 1679 | return 8; 1680 | } 1681 | // CF - RST 08H 1682 | function instCF() { 1683 | PC = (PC + 1) | 0; 1684 | call(8); 1685 | return 16; 1686 | } 1687 | // D0 - RET NC 1688 | function instD0() { 1689 | if (!FC) { 1690 | ret(); 1691 | return 20; 1692 | } else PC = (PC + 1) | 0; 1693 | return 8; 1694 | } 1695 | // D1 - POP DE 1696 | function instD1() { 1697 | var data = 0; 1698 | data = getAddress16(RSP | 0) | 0; 1699 | RD = data >> 8; 1700 | RE = data & 0xff; 1701 | RSP = (RSP + 2) | 0; 1702 | PC = (PC + 1) | 0; 1703 | return 12; 1704 | } 1705 | // D2 - JP NC,a16 1706 | function instD2() { 1707 | if (!FC) { 1708 | PC = (PC + 1) | 0; 1709 | PC = immediate16() | 0; 1710 | return 16; 1711 | } 1712 | PC = (PC + 3) | 0; 1713 | return 12; 1714 | } 1715 | // D3 - 1716 | function instD3() { 1717 | return 0; 1718 | } 1719 | // D4 - CALL NC,a16 1720 | function instD4() { 1721 | var ad = 0; 1722 | if (!FC) { 1723 | PC = (PC + 1) | 0; 1724 | ad = immediate16() | 0; 1725 | PC = (PC + 2) | 0; 1726 | call(ad); 1727 | return 24; 1728 | } 1729 | PC = (PC + 3) | 0; 1730 | return 12; 1731 | } 1732 | // D5 - PUSH DE 1733 | function instD5() { 1734 | RSP = (RSP - 2) | 0; 1735 | putAddress16(RSP | 0, (RD << 8) | RE); 1736 | PC = (PC + 1) | 0; 1737 | return 16; 1738 | } 1739 | // D6 - SUB d8 1740 | function instD6() { 1741 | PC = (PC + 1) | 0; 1742 | RA = sub8(RA | 0, immediate8() | 0) | 0; 1743 | PC = (PC + 1) | 0; 1744 | return 8; 1745 | } 1746 | // D7 - RST 10H 1747 | function instD7() { 1748 | PC = (PC + 1) | 0; 1749 | call(16); 1750 | return 16; 1751 | } 1752 | // D8 - RET C 1753 | function instD8() { 1754 | if (FC) { 1755 | ret(); 1756 | return 20; 1757 | } else PC = (PC + 1) | 0; 1758 | return 8; 1759 | } 1760 | // D9 - RETI 1761 | function instD9() { 1762 | IME = 1; 1763 | ret(); 1764 | return 16; 1765 | } 1766 | // DA - JP C,a16 1767 | function instDA() { 1768 | if (FC) { 1769 | PC = (PC + 1) | 0; 1770 | PC = immediate16() | 0; 1771 | return 16; 1772 | } 1773 | PC = (PC + 3) | 0; 1774 | return 12; 1775 | } 1776 | // DB - 1777 | function instDB() { 1778 | return 0; 1779 | } 1780 | // DC - CALL C,a16 1781 | function instDC() { 1782 | var ad = 0; 1783 | if (FC) { 1784 | PC = (PC + 1) | 0; 1785 | ad = immediate16() | 0; 1786 | PC = (PC + 2) | 0; 1787 | call(ad); 1788 | return 24; 1789 | } 1790 | PC = (PC + 3) | 0; 1791 | return 12; 1792 | } 1793 | // DD - 1794 | function instDD() { 1795 | return 0; 1796 | } 1797 | // DE - SBC A,d8 1798 | function instDE() { 1799 | PC = (PC + 1) | 0; 1800 | RA = sbc8(RA | 0, immediate8() | 0) | 0; 1801 | PC = (PC + 1) | 0; 1802 | return 8; 1803 | } 1804 | // DF - RST 18H 1805 | function instDF() { 1806 | PC = (PC + 1) | 0; 1807 | call(24); 1808 | return 16; 1809 | } 1810 | // E0 - LDH (a8),A 1811 | function instE0() { 1812 | PC = (PC + 1) | 0; 1813 | putAddress(((255 << 8) + (immediate8() | 0)) | 0, RA | 0); 1814 | PC = (PC + 1) | 0; 1815 | return 12; 1816 | } 1817 | // E1 - POP HL 1818 | function instE1() { 1819 | RHL = getAddress16(RSP | 0) | 0; 1820 | RSP = (RSP + 2) | 0; 1821 | PC = (PC + 1) | 0; 1822 | return 12; 1823 | } 1824 | // E2 - LD (C),A 1825 | function instE2() { 1826 | putAddress(((255 << 8) + RC) | 0, RA | 0); 1827 | PC = (PC + 1) | 0; 1828 | return 8; 1829 | } 1830 | // E3 - 1831 | function instE3() { 1832 | return 0; 1833 | } 1834 | // E4 - 1835 | function instE4() { 1836 | return 0; 1837 | } 1838 | // E5 - PUSH HL 1839 | function instE5() { 1840 | RSP = (RSP - 2) | 0; 1841 | putAddress16(RSP | 0, RHL | 0); 1842 | PC = (PC + 1) | 0; 1843 | return 16; 1844 | } 1845 | // E6 - AND d8 1846 | function instE6() { 1847 | PC = (PC + 1) | 0; 1848 | RA = and8(RA | 0, immediate8() | 0) | 0; 1849 | PC = (PC + 1) | 0; 1850 | return 8; 1851 | } 1852 | // E7 - RST 20H 1853 | function instE7() { 1854 | PC = (PC + 1) | 0; 1855 | call(32); 1856 | return 16; 1857 | } 1858 | // E8 - ADD SP,r8 1859 | function instE8() { 1860 | PC = (PC + 1) | 0; 1861 | RSP = add16(RSP | 0, signImmediate8() | 0) | 0; 1862 | FZ = 0; 1863 | PC = (PC + 1) | 0; 1864 | return 16; 1865 | } 1866 | // E9 - JP (HL) 1867 | function instE9() { 1868 | PC = RHL; 1869 | return 4; 1870 | } 1871 | // EA - LD (a16),A 1872 | function instEA() { 1873 | PC = (PC + 1) | 0; 1874 | putAddress(immediate16() | 0, RA | 0) | 0; 1875 | PC = (PC + 2) | 0; 1876 | return 16; 1877 | } 1878 | // EB - 1879 | function instEB() { 1880 | return 0; 1881 | } 1882 | // EC - 1883 | function instEC() { 1884 | return 0; 1885 | } 1886 | // ED - 1887 | function instED() { 1888 | return 0; 1889 | } 1890 | // EE - XOR A,d8 1891 | function instEE() { 1892 | PC = (PC + 1) | 0; 1893 | RA = xor8(RA | 0, immediate8() | 0) | 0; 1894 | PC = (PC + 1) | 0; 1895 | return 8; 1896 | } 1897 | // EF - RST 28H 1898 | function instEF() { 1899 | PC = (PC + 1) | 0; 1900 | call(40); 1901 | return 16; 1902 | } 1903 | // F0 - LDH A,(a8) 1904 | function instF0() { 1905 | PC = (PC + 1) | 0; 1906 | RA = getAddress((0xff00 + (immediate8() | 0)) | 0) | 0; 1907 | PC = (PC + 1) | 0; 1908 | return 12; 1909 | } 1910 | // F1 - POP AF 1911 | function instF1() { 1912 | var data = 0; 1913 | data = getAddress16(RSP | 0) | 0; 1914 | RA = data >> 8; 1915 | FZ = ((data & 0x80) / 0x80) | 0; 1916 | FN = ((data & 0x40) / 0x40) | 0; 1917 | FH = ((data & 0x20) / 0x20) | 0; 1918 | FC = ((data & 0x10) / 0x10) | 0; 1919 | RSP = (RSP + 2) | 0; 1920 | PC = (PC + 1) | 0; 1921 | return 12; 1922 | } 1923 | // F2 - LD A,(C) 1924 | function instF2() { 1925 | RA = getAddress((0xff00 + RC) | 0) | 0; 1926 | PC = (PC + 1) | 0; 1927 | return 8; 1928 | } 1929 | // F3 - DI 1930 | function instF3() { 1931 | IME = 0; 1932 | PC = (PC + 1) | 0; 1933 | return 4; 1934 | } 1935 | // F4 - 1936 | function instF4() { 1937 | return 0; 1938 | } 1939 | // F5 - PUSH AF 1940 | function instF5() { 1941 | RSP = (RSP - 2) | 0; 1942 | putAddress16( 1943 | RSP | 0, 1944 | (RA << 8) | (FZ << 7) | (FN << 6) | (FH << 5) | (FC << 4) 1945 | ); 1946 | PC = (PC + 1) | 0; 1947 | return 16; 1948 | } 1949 | // F6 - OR d8 1950 | function instF6() { 1951 | PC = (PC + 1) | 0; 1952 | RA = or8(RA | 0, immediate8() | 0) | 0; 1953 | PC = (PC + 1) | 0; 1954 | return 8; 1955 | } 1956 | // F7 - RST 30H 1957 | function instF7() { 1958 | PC = (PC + 1) | 0; 1959 | call(48); 1960 | return 16; 1961 | } 1962 | // F8 - LD HL,SP+r8 1963 | function instF8() { 1964 | PC = (PC + 1) | 0; 1965 | RHL = add16(RSP | 0, signImmediate8() | 0) | 0; 1966 | FZ = 0; 1967 | PC = (PC + 1) | 0; 1968 | return 12; 1969 | } 1970 | // F9 - LD SP,HL 1971 | function instF9() { 1972 | RSP = RHL; 1973 | PC = (PC + 1) | 0; 1974 | return 8; 1975 | } 1976 | // FA - LD A,(a16) 1977 | function instFA() { 1978 | PC = (PC + 1) | 0; 1979 | RA = getAddress(immediate16() | 0) | 0; 1980 | PC = (PC + 2) | 0; 1981 | return 16; 1982 | } 1983 | // FB - EI 1984 | function instFB() { 1985 | IME = 1; 1986 | PC = (PC + 1) | 0; 1987 | executeInt(); 1988 | return 4; 1989 | } 1990 | // FC - 1991 | function instFC() { 1992 | return 0; 1993 | } 1994 | // FD - 1995 | function instFD() { 1996 | return 0; 1997 | } 1998 | // FE - CP d8 1999 | function instFE() { 2000 | PC = (PC + 1) | 0; 2001 | sub8(RA | 0, immediate8() | 0) | 0; 2002 | PC = (PC + 1) | 0; 2003 | return 8; 2004 | } 2005 | // FF - RST 38H 2006 | function instFF() { 2007 | PC = (PC + 1) | 0; 2008 | call(56); 2009 | return 16; 2010 | } 2011 | 2012 | function cbinstruction(code) { 2013 | code = code | 0; 2014 | var data = 0; 2015 | var data0 = 0; 2016 | var op = 0; 2017 | 2018 | switch ((code | 0) % 8 | 0) { 2019 | case 0: 2020 | data = RB; 2021 | break; 2022 | case 1: 2023 | data = RC; 2024 | break; 2025 | case 2: 2026 | data = RD; 2027 | break; 2028 | case 3: 2029 | data = RE; 2030 | break; 2031 | case 4: 2032 | data = RHL >> 8; 2033 | break; 2034 | case 5: 2035 | data = RHL & 0xff; 2036 | break; 2037 | case 6: 2038 | data = getAddress(RHL | 0) | 0; 2039 | break; 2040 | case 7: 2041 | data = RA; 2042 | break; 2043 | } 2044 | data0 = data; 2045 | 2046 | op = ((code | 0) / 8) | 0; 2047 | if (((op | 0) >= 0) & ((op | 0) <= 7)) { 2048 | if ((op | 0) == 0) { 2049 | // RLC - Rotate left 2050 | if ((data | 0) >= 128) { 2051 | data = (((data << 1) % 256 | 0) + 1) | 0; 2052 | FC = 1; 2053 | } else { 2054 | data = (data << 1) % 256 | 0; 2055 | FC = 0; 2056 | } 2057 | } else if ((op | 0) == 1) { 2058 | // RRC - Rotate right 2059 | if ((data | 0) & 1) { 2060 | data = ((data >> 1) + 128) | 0; 2061 | FC = 1; 2062 | } else { 2063 | data = data >> 1; 2064 | FC = 0; 2065 | } 2066 | } else if ((op | 0) == 2) { 2067 | // RL - Rotate left through carry 2068 | if ((data | 0) >= 128) { 2069 | data = (((data << 1) % 256 | 0) + FC) | 0; 2070 | FC = 1; 2071 | } else { 2072 | data = (((data << 1) % 256 | 0) + FC) | 0; 2073 | FC = 0; 2074 | } 2075 | } else if ((op | 0) == 3) { 2076 | // RR - Rotate right through carry 2077 | if ((data | 0) & 1) { 2078 | data = ((data >> 1) + ((FC * 128) | 0)) | 0; 2079 | FC = 1; 2080 | } else { 2081 | data = ((data >> 1) + ((FC * 128) | 0)) | 0; 2082 | FC = 0; 2083 | } 2084 | } else if ((op | 0) == 4) { 2085 | // SLA - Shift left arithmetic 2086 | if ((data | 0) >= 128) FC = 1; 2087 | else FC = 0; 2088 | data = (data << 1) % 256 | 0; 2089 | } else if ((op | 0) == 5) { 2090 | // SRA - Shift right arithmetic 2091 | if ((data | 0) & 1) { 2092 | FC = 1; 2093 | } else { 2094 | FC = 0; 2095 | } 2096 | data = ((data >> 1) + ((data | 0) >= 128 ? 128 : 0)) | 0; 2097 | } else if ((op | 0) == 6) { 2098 | // SWAP - Exchange low/hi-nibble 2099 | FC = 0; 2100 | data = (((data | 0) % 16 | 0) * 16) | (0 + (((data | 0) / 16) | 0)); 2101 | } else if ((op | 0) == 7) { 2102 | // SRL - Shift right logical 2103 | if (data & 1) { 2104 | FC = 1; 2105 | } else { 2106 | FC = 0; 2107 | } 2108 | data = data >> 1; 2109 | } 2110 | if ((data | 0) == 0) FZ = 1; 2111 | else FZ = 0; 2112 | FN = 0; 2113 | FH = 0; 2114 | } 2115 | if (((op | 0) >= 8) & ((op | 0) <= 15)) { 2116 | FN = 0; 2117 | FH = 1; 2118 | if ((data & (1 << (op - 8))) == 0) FZ = 1; 2119 | else FZ = 0; 2120 | } 2121 | if (((op | 0) >= 16) & ((op | 0) <= 23)) { 2122 | data = (data & ~(1 << (op - 16))) | 0; 2123 | } 2124 | if (((op | 0) >= 24) & ((op | 0) <= 31)) { 2125 | data = data | (1 << (op - 24)); 2126 | } 2127 | 2128 | if ((data0 | 0) != (data | 0)) { 2129 | switch ((code | 0) % 8 | 0) { 2130 | case 0: 2131 | RB = (data | 0) % 256 | 0; 2132 | break; 2133 | case 1: 2134 | RC = (data | 0) % 256 | 0; 2135 | break; 2136 | case 2: 2137 | RD = (data | 0) % 256 | 0; 2138 | break; 2139 | case 3: 2140 | RE = (data | 0) % 256 | 0; 2141 | break; 2142 | case 4: 2143 | setH((data | 0) % 256 | 0); 2144 | break; 2145 | case 5: 2146 | setL((data | 0) % 256 | 0); 2147 | break; 2148 | case 6: 2149 | putAddress(RHL | 0, (data | 0) % 256 | 0); 2150 | break; 2151 | case 7: 2152 | RA = (data | 0) % 256 | 0; 2153 | break; 2154 | } 2155 | } 2156 | } 2157 | 2158 | function execute(n) { 2159 | n = n | 0; 2160 | var inst = 0; 2161 | while (!stopped & ((n | 0) > 0)) { 2162 | inst = getAddress(PC | 0) | 0; 2163 | n = (n - (instructions[inst & 0xff]() | 0)) | 0; 2164 | } 2165 | } 2166 | 2167 | var instructions = [ 2168 | inst00, 2169 | inst01, 2170 | inst02, 2171 | inst03, 2172 | inst04, 2173 | inst05, 2174 | inst06, 2175 | inst07, 2176 | inst08, 2177 | inst09, 2178 | inst0A, 2179 | inst0B, 2180 | inst0C, 2181 | inst0D, 2182 | inst0E, 2183 | inst0F, 2184 | inst10, 2185 | inst11, 2186 | inst12, 2187 | inst13, 2188 | inst14, 2189 | inst15, 2190 | inst16, 2191 | inst17, 2192 | inst18, 2193 | inst19, 2194 | inst1A, 2195 | inst1B, 2196 | inst1C, 2197 | inst1D, 2198 | inst1E, 2199 | inst1F, 2200 | inst20, 2201 | inst21, 2202 | inst22, 2203 | inst23, 2204 | inst24, 2205 | inst25, 2206 | inst26, 2207 | inst27, 2208 | inst28, 2209 | inst29, 2210 | inst2A, 2211 | inst2B, 2212 | inst2C, 2213 | inst2D, 2214 | inst2E, 2215 | inst2F, 2216 | inst30, 2217 | inst31, 2218 | inst32, 2219 | inst33, 2220 | inst34, 2221 | inst35, 2222 | inst36, 2223 | inst37, 2224 | inst38, 2225 | inst39, 2226 | inst3A, 2227 | inst3B, 2228 | inst3C, 2229 | inst3D, 2230 | inst3E, 2231 | inst3F, 2232 | inst40, 2233 | inst41, 2234 | inst42, 2235 | inst43, 2236 | inst44, 2237 | inst45, 2238 | inst46, 2239 | inst47, 2240 | inst48, 2241 | inst49, 2242 | inst4A, 2243 | inst4B, 2244 | inst4C, 2245 | inst4D, 2246 | inst4E, 2247 | inst4F, 2248 | inst50, 2249 | inst51, 2250 | inst52, 2251 | inst53, 2252 | inst54, 2253 | inst55, 2254 | inst56, 2255 | inst57, 2256 | inst58, 2257 | inst59, 2258 | inst5A, 2259 | inst5B, 2260 | inst5C, 2261 | inst5D, 2262 | inst5E, 2263 | inst5F, 2264 | inst60, 2265 | inst61, 2266 | inst62, 2267 | inst63, 2268 | inst64, 2269 | inst65, 2270 | inst66, 2271 | inst67, 2272 | inst68, 2273 | inst69, 2274 | inst6A, 2275 | inst6B, 2276 | inst6C, 2277 | inst6D, 2278 | inst6E, 2279 | inst6F, 2280 | inst70, 2281 | inst71, 2282 | inst72, 2283 | inst73, 2284 | inst74, 2285 | inst75, 2286 | inst76, 2287 | inst77, 2288 | inst78, 2289 | inst79, 2290 | inst7A, 2291 | inst7B, 2292 | inst7C, 2293 | inst7D, 2294 | inst7E, 2295 | inst7F, 2296 | inst80, 2297 | inst81, 2298 | inst82, 2299 | inst83, 2300 | inst84, 2301 | inst85, 2302 | inst86, 2303 | inst87, 2304 | inst88, 2305 | inst89, 2306 | inst8A, 2307 | inst8B, 2308 | inst8C, 2309 | inst8D, 2310 | inst8E, 2311 | inst8F, 2312 | inst90, 2313 | inst91, 2314 | inst92, 2315 | inst93, 2316 | inst94, 2317 | inst95, 2318 | inst96, 2319 | inst97, 2320 | inst98, 2321 | inst99, 2322 | inst9A, 2323 | inst9B, 2324 | inst9C, 2325 | inst9D, 2326 | inst9E, 2327 | inst9F, 2328 | instA0, 2329 | instA1, 2330 | instA2, 2331 | instA3, 2332 | instA4, 2333 | instA5, 2334 | instA6, 2335 | instA7, 2336 | instA8, 2337 | instA9, 2338 | instAA, 2339 | instAB, 2340 | instAC, 2341 | instAD, 2342 | instAE, 2343 | instAF, 2344 | instB0, 2345 | instB1, 2346 | instB2, 2347 | instB3, 2348 | instB4, 2349 | instB5, 2350 | instB6, 2351 | instB7, 2352 | instB8, 2353 | instB9, 2354 | instBA, 2355 | instBB, 2356 | instBC, 2357 | instBD, 2358 | instBE, 2359 | instBF, 2360 | instC0, 2361 | instC1, 2362 | instC2, 2363 | instC3, 2364 | instC4, 2365 | instC5, 2366 | instC6, 2367 | instC7, 2368 | instC8, 2369 | instC9, 2370 | instCA, 2371 | instCB, 2372 | instCC, 2373 | instCD, 2374 | instCE, 2375 | instCF, 2376 | instD0, 2377 | instD1, 2378 | instD2, 2379 | instD3, 2380 | instD4, 2381 | instD5, 2382 | instD6, 2383 | instD7, 2384 | instD8, 2385 | instD9, 2386 | instDA, 2387 | instDB, 2388 | instDC, 2389 | instDD, 2390 | instDE, 2391 | instDF, 2392 | instE0, 2393 | instE1, 2394 | instE2, 2395 | instE3, 2396 | instE4, 2397 | instE5, 2398 | instE6, 2399 | instE7, 2400 | instE8, 2401 | instE9, 2402 | instEA, 2403 | instEB, 2404 | instEC, 2405 | instED, 2406 | instEE, 2407 | instEF, 2408 | instF0, 2409 | instF1, 2410 | instF2, 2411 | instF3, 2412 | instF4, 2413 | instF5, 2414 | instF6, 2415 | instF7, 2416 | instF8, 2417 | instF9, 2418 | instFA, 2419 | instFB, 2420 | instFC, 2421 | instFD, 2422 | instFE, 2423 | instFF 2424 | ]; 2425 | 2426 | return { 2427 | execute: execute, 2428 | stop: stop, 2429 | resume: resume, 2430 | interrupt: interrupt 2431 | }; 2432 | }); 2433 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "canvas": "^2.6.1", 4 | "ioredis": "^4.17.3", 5 | "redis-semaphore": "^2.1.1", 6 | "then-sleep": "^1.0.1" 7 | }, 8 | "scripts": { 9 | "vercel-build": "yum install libuuid-devel libmount-devel && cp /lib64/{libuuid,libmount,libblkid}.so.1 node_modules/canvas/build/Release/" 10 | }, 11 | "resolutions": { 12 | "**/needle": "^2.5.2" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 20 | 21 | 22 |
23 |

Pokeless: λ plays pokemon

24 | 25 | 35 |
36 | 37 | 133 | 134 | 135 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | abbrev@1: 6 | version "1.1.1" 7 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 8 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 9 | 10 | ansi-regex@^2.0.0: 11 | version "2.1.1" 12 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 13 | integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= 14 | 15 | ansi-regex@^3.0.0: 16 | version "3.0.0" 17 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 18 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 19 | 20 | aproba@^1.0.3: 21 | version "1.2.0" 22 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 23 | integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== 24 | 25 | are-we-there-yet@~1.1.2: 26 | version "1.1.5" 27 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" 28 | integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== 29 | dependencies: 30 | delegates "^1.0.0" 31 | readable-stream "^2.0.6" 32 | 33 | balanced-match@^1.0.0: 34 | version "1.0.0" 35 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 36 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 37 | 38 | brace-expansion@^1.1.7: 39 | version "1.1.11" 40 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 41 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 42 | dependencies: 43 | balanced-match "^1.0.0" 44 | concat-map "0.0.1" 45 | 46 | canvas@^2.6.1: 47 | version "2.6.1" 48 | resolved "https://registry.yarnpkg.com/canvas/-/canvas-2.6.1.tgz#0d087dd4d60f5a5a9efa202757270abea8bef89e" 49 | integrity sha512-S98rKsPcuhfTcYbtF53UIJhcbgIAK533d1kJKMwsMwAIFgfd58MOyxRud3kktlzWiEkFliaJtvyZCBtud/XVEA== 50 | dependencies: 51 | nan "^2.14.0" 52 | node-pre-gyp "^0.11.0" 53 | simple-get "^3.0.3" 54 | 55 | chownr@^1.1.1: 56 | version "1.1.4" 57 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" 58 | integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== 59 | 60 | cluster-key-slot@^1.1.0: 61 | version "1.1.0" 62 | resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz#30474b2a981fb12172695833052bc0d01336d10d" 63 | integrity sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw== 64 | 65 | code-point-at@^1.0.0: 66 | version "1.1.0" 67 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 68 | integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= 69 | 70 | concat-map@0.0.1: 71 | version "0.0.1" 72 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 73 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 74 | 75 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 76 | version "1.1.0" 77 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 78 | integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= 79 | 80 | core-util-is@~1.0.0: 81 | version "1.0.2" 82 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 83 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 84 | 85 | debug@^3.2.6: 86 | version "3.2.6" 87 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 88 | integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== 89 | dependencies: 90 | ms "^2.1.1" 91 | 92 | debug@^4.1.1: 93 | version "4.2.0" 94 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" 95 | integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== 96 | dependencies: 97 | ms "2.1.2" 98 | 99 | decompress-response@^4.2.0: 100 | version "4.2.1" 101 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986" 102 | integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== 103 | dependencies: 104 | mimic-response "^2.0.0" 105 | 106 | deep-extend@^0.6.0: 107 | version "0.6.0" 108 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 109 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 110 | 111 | delegates@^1.0.0: 112 | version "1.0.0" 113 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 114 | integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= 115 | 116 | denque@^1.1.0: 117 | version "1.4.1" 118 | resolved "https://registry.yarnpkg.com/denque/-/denque-1.4.1.tgz#6744ff7641c148c3f8a69c307e51235c1f4a37cf" 119 | integrity sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ== 120 | 121 | detect-libc@^1.0.2: 122 | version "1.0.3" 123 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" 124 | integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= 125 | 126 | fs-minipass@^1.2.5: 127 | version "1.2.7" 128 | resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" 129 | integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== 130 | dependencies: 131 | minipass "^2.6.0" 132 | 133 | fs.realpath@^1.0.0: 134 | version "1.0.0" 135 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 136 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 137 | 138 | gauge@~2.7.3: 139 | version "2.7.4" 140 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 141 | integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= 142 | dependencies: 143 | aproba "^1.0.3" 144 | console-control-strings "^1.0.0" 145 | has-unicode "^2.0.0" 146 | object-assign "^4.1.0" 147 | signal-exit "^3.0.0" 148 | string-width "^1.0.1" 149 | strip-ansi "^3.0.1" 150 | wide-align "^1.1.0" 151 | 152 | glob@^7.1.3: 153 | version "7.1.6" 154 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 155 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 156 | dependencies: 157 | fs.realpath "^1.0.0" 158 | inflight "^1.0.4" 159 | inherits "2" 160 | minimatch "^3.0.4" 161 | once "^1.3.0" 162 | path-is-absolute "^1.0.0" 163 | 164 | has-unicode@^2.0.0: 165 | version "2.0.1" 166 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 167 | integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= 168 | 169 | iconv-lite@^0.4.4: 170 | version "0.4.24" 171 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 172 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 173 | dependencies: 174 | safer-buffer ">= 2.1.2 < 3" 175 | 176 | ignore-walk@^3.0.1: 177 | version "3.0.3" 178 | resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" 179 | integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== 180 | dependencies: 181 | minimatch "^3.0.4" 182 | 183 | inflight@^1.0.4: 184 | version "1.0.6" 185 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 186 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 187 | dependencies: 188 | once "^1.3.0" 189 | wrappy "1" 190 | 191 | inherits@2, inherits@~2.0.3: 192 | version "2.0.4" 193 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 194 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 195 | 196 | ini@~1.3.0: 197 | version "1.3.7" 198 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" 199 | integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== 200 | 201 | ioredis@^4.17.3: 202 | version "4.17.3" 203 | resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-4.17.3.tgz#9938c60e4ca685f75326337177bdc2e73ae9c9dc" 204 | integrity sha512-iRvq4BOYzNFkDnSyhx7cmJNOi1x/HWYe+A4VXHBu4qpwJaGT1Mp+D2bVGJntH9K/Z/GeOM/Nprb8gB3bmitz1Q== 205 | dependencies: 206 | cluster-key-slot "^1.1.0" 207 | debug "^4.1.1" 208 | denque "^1.1.0" 209 | lodash.defaults "^4.2.0" 210 | lodash.flatten "^4.4.0" 211 | redis-commands "1.5.0" 212 | redis-errors "^1.2.0" 213 | redis-parser "^3.0.0" 214 | standard-as-callback "^2.0.1" 215 | 216 | is-fullwidth-code-point@^1.0.0: 217 | version "1.0.0" 218 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 219 | integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= 220 | dependencies: 221 | number-is-nan "^1.0.0" 222 | 223 | is-fullwidth-code-point@^2.0.0: 224 | version "2.0.0" 225 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 226 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 227 | 228 | isarray@~1.0.0: 229 | version "1.0.0" 230 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 231 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 232 | 233 | lodash.defaults@^4.2.0: 234 | version "4.2.0" 235 | resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" 236 | integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= 237 | 238 | lodash.flatten@^4.4.0: 239 | version "4.4.0" 240 | resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" 241 | integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= 242 | 243 | mimic-response@^2.0.0: 244 | version "2.1.0" 245 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" 246 | integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== 247 | 248 | minimatch@^3.0.4: 249 | version "3.0.4" 250 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 251 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 252 | dependencies: 253 | brace-expansion "^1.1.7" 254 | 255 | minimist@^1.2.0, minimist@^1.2.5: 256 | version "1.2.5" 257 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 258 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 259 | 260 | minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: 261 | version "2.9.0" 262 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" 263 | integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== 264 | dependencies: 265 | safe-buffer "^5.1.2" 266 | yallist "^3.0.0" 267 | 268 | minizlib@^1.2.1: 269 | version "1.3.3" 270 | resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" 271 | integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== 272 | dependencies: 273 | minipass "^2.9.0" 274 | 275 | mkdirp@^0.5.0, mkdirp@^0.5.1: 276 | version "0.5.5" 277 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" 278 | integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== 279 | dependencies: 280 | minimist "^1.2.5" 281 | 282 | ms@2.1.2, ms@^2.1.1: 283 | version "2.1.2" 284 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 285 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 286 | 287 | nan@^2.14.0: 288 | version "2.14.1" 289 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" 290 | integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== 291 | 292 | native-or-bluebird@^1.2.0: 293 | version "1.2.0" 294 | resolved "https://registry.yarnpkg.com/native-or-bluebird/-/native-or-bluebird-1.2.0.tgz#39c47bfd7825d1fb9ffad32210ae25daadf101c9" 295 | integrity sha1-OcR7/Xgl0fuf+tMiEK4l2q3xAck= 296 | 297 | needle@^2.2.1, needle@^2.5.2: 298 | version "2.5.2" 299 | resolved "https://registry.yarnpkg.com/needle/-/needle-2.5.2.tgz#cf1a8fce382b5a280108bba90a14993c00e4010a" 300 | integrity sha512-LbRIwS9BfkPvNwNHlsA41Q29kL2L/6VaOJ0qisM5lLWsTV3nP15abO5ITL6L81zqFhzjRKDAYjpcBcwM0AVvLQ== 301 | dependencies: 302 | debug "^3.2.6" 303 | iconv-lite "^0.4.4" 304 | sax "^1.2.4" 305 | 306 | node-pre-gyp@^0.11.0: 307 | version "0.11.0" 308 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz#db1f33215272f692cd38f03238e3e9b47c5dd054" 309 | integrity sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q== 310 | dependencies: 311 | detect-libc "^1.0.2" 312 | mkdirp "^0.5.1" 313 | needle "^2.2.1" 314 | nopt "^4.0.1" 315 | npm-packlist "^1.1.6" 316 | npmlog "^4.0.2" 317 | rc "^1.2.7" 318 | rimraf "^2.6.1" 319 | semver "^5.3.0" 320 | tar "^4" 321 | 322 | nopt@^4.0.1: 323 | version "4.0.3" 324 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" 325 | integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== 326 | dependencies: 327 | abbrev "1" 328 | osenv "^0.1.4" 329 | 330 | npm-bundled@^1.0.1: 331 | version "1.1.1" 332 | resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" 333 | integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== 334 | dependencies: 335 | npm-normalize-package-bin "^1.0.1" 336 | 337 | npm-normalize-package-bin@^1.0.1: 338 | version "1.0.1" 339 | resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" 340 | integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== 341 | 342 | npm-packlist@^1.1.6: 343 | version "1.4.8" 344 | resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" 345 | integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== 346 | dependencies: 347 | ignore-walk "^3.0.1" 348 | npm-bundled "^1.0.1" 349 | npm-normalize-package-bin "^1.0.1" 350 | 351 | npmlog@^4.0.2: 352 | version "4.1.2" 353 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 354 | integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== 355 | dependencies: 356 | are-we-there-yet "~1.1.2" 357 | console-control-strings "~1.1.0" 358 | gauge "~2.7.3" 359 | set-blocking "~2.0.0" 360 | 361 | number-is-nan@^1.0.0: 362 | version "1.0.1" 363 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 364 | integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= 365 | 366 | object-assign@^4.1.0: 367 | version "4.1.1" 368 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 369 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 370 | 371 | once@^1.3.0, once@^1.3.1: 372 | version "1.4.0" 373 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 374 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 375 | dependencies: 376 | wrappy "1" 377 | 378 | os-homedir@^1.0.0: 379 | version "1.0.2" 380 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 381 | integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= 382 | 383 | os-tmpdir@^1.0.0: 384 | version "1.0.2" 385 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 386 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 387 | 388 | osenv@^0.1.4: 389 | version "0.1.5" 390 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" 391 | integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== 392 | dependencies: 393 | os-homedir "^1.0.0" 394 | os-tmpdir "^1.0.0" 395 | 396 | path-is-absolute@^1.0.0: 397 | version "1.0.1" 398 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 399 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 400 | 401 | process-nextick-args@~2.0.0: 402 | version "2.0.1" 403 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 404 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 405 | 406 | rc@^1.2.7: 407 | version "1.2.8" 408 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 409 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 410 | dependencies: 411 | deep-extend "^0.6.0" 412 | ini "~1.3.0" 413 | minimist "^1.2.0" 414 | strip-json-comments "~2.0.1" 415 | 416 | readable-stream@^2.0.6: 417 | version "2.3.7" 418 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" 419 | integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== 420 | dependencies: 421 | core-util-is "~1.0.0" 422 | inherits "~2.0.3" 423 | isarray "~1.0.0" 424 | process-nextick-args "~2.0.0" 425 | safe-buffer "~5.1.1" 426 | string_decoder "~1.1.1" 427 | util-deprecate "~1.0.1" 428 | 429 | redis-commands@1.5.0: 430 | version "1.5.0" 431 | resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.5.0.tgz#80d2e20698fe688f227127ff9e5164a7dd17e785" 432 | integrity sha512-6KxamqpZ468MeQC3bkWmCB1fp56XL64D4Kf0zJSwDZbVLLm7KFkoIcHrgRvQ+sk8dnhySs7+yBg94yIkAK7aJg== 433 | 434 | redis-errors@^1.0.0, redis-errors@^1.2.0: 435 | version "1.2.0" 436 | resolved "https://registry.yarnpkg.com/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad" 437 | integrity sha1-62LSrbFeTq9GEMBK/hUpOEJQq60= 438 | 439 | redis-parser@^3.0.0: 440 | version "3.0.0" 441 | resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-3.0.0.tgz#b66d828cdcafe6b4b8a428a7def4c6bcac31c8b4" 442 | integrity sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ= 443 | dependencies: 444 | redis-errors "^1.0.0" 445 | 446 | redis-semaphore@^2.1.1: 447 | version "2.2.0" 448 | resolved "https://registry.yarnpkg.com/redis-semaphore/-/redis-semaphore-2.2.0.tgz#5e7769b457a75230b28ed61e9b8ba6b779804d2e" 449 | integrity sha512-kZMozCF+lra4GidPxsy1q+JmuZAF2Uhbsi82r7ez2cTOCpwZb88BBzrK2AMhnAWKKZfkO4X7VGLH3/7VYqYksg== 450 | dependencies: 451 | debug "^4.1.1" 452 | uuid "^8.3.0" 453 | 454 | rimraf@^2.6.1: 455 | version "2.7.1" 456 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" 457 | integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== 458 | dependencies: 459 | glob "^7.1.3" 460 | 461 | safe-buffer@^5.1.2: 462 | version "5.2.1" 463 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 464 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 465 | 466 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 467 | version "5.1.2" 468 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 469 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 470 | 471 | "safer-buffer@>= 2.1.2 < 3": 472 | version "2.1.2" 473 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 474 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 475 | 476 | sax@^1.2.4: 477 | version "1.2.4" 478 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 479 | integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== 480 | 481 | semver@^5.3.0: 482 | version "5.7.1" 483 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 484 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 485 | 486 | set-blocking@~2.0.0: 487 | version "2.0.0" 488 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 489 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 490 | 491 | signal-exit@^3.0.0: 492 | version "3.0.3" 493 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" 494 | integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== 495 | 496 | simple-concat@^1.0.0: 497 | version "1.0.1" 498 | resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" 499 | integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== 500 | 501 | simple-get@^3.0.3: 502 | version "3.1.0" 503 | resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3" 504 | integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA== 505 | dependencies: 506 | decompress-response "^4.2.0" 507 | once "^1.3.1" 508 | simple-concat "^1.0.0" 509 | 510 | standard-as-callback@^2.0.1: 511 | version "2.0.1" 512 | resolved "https://registry.yarnpkg.com/standard-as-callback/-/standard-as-callback-2.0.1.tgz#ed8bb25648e15831759b6023bdb87e6b60b38126" 513 | integrity sha512-NQOxSeB8gOI5WjSaxjBgog2QFw55FV8TkS6Y07BiB3VJ8xNTvUYm0wl0s8ObgQ5NhdpnNfigMIKjgPESzgr4tg== 514 | 515 | string-width@^1.0.1: 516 | version "1.0.2" 517 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 518 | integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= 519 | dependencies: 520 | code-point-at "^1.0.0" 521 | is-fullwidth-code-point "^1.0.0" 522 | strip-ansi "^3.0.0" 523 | 524 | "string-width@^1.0.2 || 2": 525 | version "2.1.1" 526 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 527 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 528 | dependencies: 529 | is-fullwidth-code-point "^2.0.0" 530 | strip-ansi "^4.0.0" 531 | 532 | string_decoder@~1.1.1: 533 | version "1.1.1" 534 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 535 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 536 | dependencies: 537 | safe-buffer "~5.1.0" 538 | 539 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 540 | version "3.0.1" 541 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 542 | integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= 543 | dependencies: 544 | ansi-regex "^2.0.0" 545 | 546 | strip-ansi@^4.0.0: 547 | version "4.0.0" 548 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 549 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 550 | dependencies: 551 | ansi-regex "^3.0.0" 552 | 553 | strip-json-comments@~2.0.1: 554 | version "2.0.1" 555 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 556 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 557 | 558 | tar@^4: 559 | version "4.4.13" 560 | resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" 561 | integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== 562 | dependencies: 563 | chownr "^1.1.1" 564 | fs-minipass "^1.2.5" 565 | minipass "^2.8.6" 566 | minizlib "^1.2.1" 567 | mkdirp "^0.5.0" 568 | safe-buffer "^5.1.2" 569 | yallist "^3.0.3" 570 | 571 | then-sleep@^1.0.1: 572 | version "1.0.1" 573 | resolved "https://registry.yarnpkg.com/then-sleep/-/then-sleep-1.0.1.tgz#759823bdc4de56ba2a20812868eb872a803ed1f9" 574 | integrity sha1-dZgjvcTeVroqIIEoaOuHKoA+0fk= 575 | dependencies: 576 | native-or-bluebird "^1.2.0" 577 | 578 | util-deprecate@~1.0.1: 579 | version "1.0.2" 580 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 581 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 582 | 583 | uuid@^8.3.0: 584 | version "8.3.0" 585 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.0.tgz#ab738085ca22dc9a8c92725e459b1d507df5d6ea" 586 | integrity sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ== 587 | 588 | wide-align@^1.1.0: 589 | version "1.1.3" 590 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 591 | integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== 592 | dependencies: 593 | string-width "^1.0.2 || 2" 594 | 595 | wrappy@1: 596 | version "1.0.2" 597 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 598 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 599 | 600 | yallist@^3.0.0, yallist@^3.0.3: 601 | version "3.1.1" 602 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" 603 | integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== 604 | --------------------------------------------------------------------------------