UNPKG

@soapbox.pub/wasmboy

Version:

Soapbox fork of Wasmboy.

1,231 lines (1,216 loc) 451 kB
// Banner placed by rollup to mock out some items on our esm build // This is useful for things like wasmmemory const wasmboyMemorySize = 0x8b0000; // Simply initialized to the size we need const wasmByteMemory = new Uint8ClampedArray(wasmboyMemorySize); // Memory mock export const memory = { size: () => { return wasmboyMemorySize; }, grow: () => {}, wasmByteMemory: wasmByteMemory }; const load = offset => { return wasmByteMemory[offset]; }; const store = (offset, value) => { wasmByteMemory[offset] = value; }; const abs = value => { return Math.abs(value); }; const ceil = value => { return Math.ceil(value); }; // Constants that will be shared by the wasm core of the emulator // And libraries built around the wasm (such as the official JS), or @CryZe wasmboy-rs // ---------------------------------- // Wasmboy Memory Map // https://docs.google.com/spreadsheets/d/17xrEzJk5-sCB9J2mMJcVnzhbE-XH_NvczVSQH9OHvRk/edit?usp=sharing // ---------------------------------- // AssemblyScript var ASSEMBLYSCRIPT_MEMORY_LOCATION = 0x000000; var ASSEMBLYSCRIPT_MEMORY_SIZE = 0x000400; // WasmBoy States var WASMBOY_STATE_LOCATION = ASSEMBLYSCRIPT_MEMORY_LOCATION + ASSEMBLYSCRIPT_MEMORY_SIZE; var WASMBOY_STATE_SIZE = 0x000400; // Gameboy Internal Memory var VIDEO_RAM_LOCATION = WASMBOY_STATE_LOCATION + WASMBOY_STATE_SIZE; var VIDEO_RAM_SIZE = 0x004000; var WORK_RAM_LOCATION = VIDEO_RAM_LOCATION + VIDEO_RAM_SIZE; var WORK_RAM_SIZE = 0x008000; var OTHER_GAMEBOY_INTERNAL_MEMORY_LOCATION = WORK_RAM_LOCATION + WORK_RAM_SIZE; var OTHER_GAMEBOY_INTERNAL_MEMORY_SIZE = 0x004000; // General Gameboy Internal Memory var GAMEBOY_INTERNAL_MEMORY_LOCATION = VIDEO_RAM_LOCATION; var GAMEBOY_INTERNAL_MEMORY_SIZE = OTHER_GAMEBOY_INTERNAL_MEMORY_LOCATION - VIDEO_RAM_LOCATION + OTHER_GAMEBOY_INTERNAL_MEMORY_SIZE; // Graphics Output var GBC_PALETTE_LOCATION = OTHER_GAMEBOY_INTERNAL_MEMORY_LOCATION + OTHER_GAMEBOY_INTERNAL_MEMORY_SIZE; var GBC_PALETTE_SIZE = 0x000080; var BG_PRIORITY_MAP_LOCATION = GBC_PALETTE_LOCATION + GBC_PALETTE_SIZE; var BG_PRIORITY_MAP_SIZE = 0x005c00; var FRAME_LOCATION = BG_PRIORITY_MAP_LOCATION + BG_PRIORITY_MAP_SIZE; var FRAME_SIZE = 0x016c00; var BACKGROUND_MAP_LOCATION = FRAME_LOCATION + FRAME_SIZE; var BACKGROUND_MAP_SIZE = 0x030000; var TILE_DATA_LOCATION = BACKGROUND_MAP_LOCATION + BACKGROUND_MAP_SIZE; var TILE_DATA_SIZE = 0x024000; var OAM_TILES_LOCATION = TILE_DATA_LOCATION + TILE_DATA_SIZE; var OAM_TILES_SIZE = 0x003c00; // General Graphics Output var GRAPHICS_OUTPUT_LOCATION = GBC_PALETTE_LOCATION; var GRAPHICS_OUTPUT_SIZE = OAM_TILES_LOCATION - GBC_PALETTE_LOCATION + OAM_TILES_SIZE; // Audio Output var CHANNEL_1_BUFFER_LOCATION = OAM_TILES_LOCATION + OAM_TILES_SIZE; var CHANNEL_1_BUFFER_SIZE = 0x020000; var CHANNEL_2_BUFFER_LOCATION = CHANNEL_1_BUFFER_LOCATION + CHANNEL_1_BUFFER_SIZE; var CHANNEL_2_BUFFER_SIZE = 0x020000; var CHANNEL_3_BUFFER_LOCATION = CHANNEL_2_BUFFER_LOCATION + CHANNEL_2_BUFFER_SIZE; var CHANNEL_3_BUFFER_SIZE = 0x020000; var CHANNEL_4_BUFFER_LOCATION = CHANNEL_3_BUFFER_LOCATION + CHANNEL_3_BUFFER_SIZE; var CHANNEL_4_BUFFER_SIZE = 0x020000; var AUDIO_BUFFER_LOCATION = CHANNEL_4_BUFFER_LOCATION + CHANNEL_4_BUFFER_SIZE; var AUDIO_BUFFER_SIZE = 0x020000; // Catridge Ram var CARTRIDGE_RAM_LOCATION = AUDIO_BUFFER_LOCATION + AUDIO_BUFFER_SIZE; var CARTRIDGE_RAM_SIZE = 0x020000; // Boot ROM // http://gbdev.gg8.se/files/roms/bootroms/ // Largest Boot rom is GBC, at 2.5KB var BOOT_ROM_LOCATION = CARTRIDGE_RAM_LOCATION + CARTRIDGE_RAM_SIZE; var BOOT_ROM_SIZE = 0x000a00; // Cartridge ROM var CARTRIDGE_ROM_LOCATION = BOOT_ROM_LOCATION + BOOT_ROM_SIZE; var CARTRIDGE_ROM_SIZE = 0x7e0400; // Debug Memory var DEBUG_GAMEBOY_MEMORY_LOCATION = CARTRIDGE_ROM_LOCATION + CARTRIDGE_ROM_SIZE; var DEBUG_GAMEBOY_MEMORY_SIZE = 0xffff; // Final General Size var WASMBOY_MEMORY_LOCATION = 0x000000; var WASMBOY_MEMORY_SIZE = DEBUG_GAMEBOY_MEMORY_LOCATION + DEBUG_GAMEBOY_MEMORY_SIZE + 1; var WASMBOY_WASM_PAGES = ceil(WASMBOY_MEMORY_SIZE / 1024 / 64) + 1; var Config = /** @class */ (function () { function Config() { } // Boot Rom Config.enableBootRom = false; // GBC Options Config.useGbcWhenAvailable = true; // Batch Processing Config.audioBatchProcessing = false; Config.graphicsBatchProcessing = false; Config.timersBatchProcessing = false; // Scanline Rendering Config.graphicsDisableScanlineRendering = false; // Acumulate Sound Samples Config.audioAccumulateSamples = false; // Tile Rednering Config.tileRendering = false; Config.tileCaching = false; // Audio Debugging Config.enableAudioDebugging = false; return Config; }()); // Portable Code for JS Wasm Benchmarking // https://github.com/AssemblyScript/assemblyscript/wiki/Writing-portable-code // https://github.com/AssemblyScript/assemblyscript/blob/master/std/portable/index.js function u8Portable(param) { return param & 0xff; } function u16Portable(param) { return param & 0xffff; } function i8Portable(param) { return (param << 24) >> 24; } function i32Portable(param) { return param | 0; } // Set flag bit on on register F. For instance set zero flag to zero -> (7, 0) function setFlagBit(flagBit, flagValue) { var bitwiseOperand = u8Portable(1 << flagBit); if (flagValue > 0) { Cpu.registerF = Cpu.registerF | bitwiseOperand; } else { // XOR out the two ones bitwiseOperand = 0xff ^ bitwiseOperand; Cpu.registerF = Cpu.registerF & bitwiseOperand; } return Cpu.registerF; } // Overload the set flag bit for ease of use function setZeroFlag$$1(value) { setFlagBit(7, value); } function setSubtractFlag(value) { setFlagBit(6, value); } function setHalfCarryFlag(value) { setFlagBit(5, value); } function setCarryFlag(value) { setFlagBit(4, value); } // Getters for flags function getZeroFlag$$1() { return (Cpu.registerF >> 7) & 0x01; } function getSubtractFlag() { return (Cpu.registerF >> 6) & 0x01; } function getHalfCarryFlag() { return (Cpu.registerF >> 5) & 0x01; } function getCarryFlag$$1() { return (Cpu.registerF >> 4) & 0x01; } // Must be run before the register actually performs the add // amountToAdd i16, since max number can be an u8 function checkAndSetEightBitHalfCarryFlag(value, amountToAdd) { if (amountToAdd >= 0) { // https://robdor.com/2016/08/10/gameboy-emulator-half-carry-flag/ var result = u8Portable((value & 0x0f) + (amountToAdd & 0x0f)) & 0x10; setHalfCarryFlag((result !== 0x00)); } else { // From: https://github.com/djhworld/gomeboycolor/blob/master/src/cpu/index.go // CTRL+F "subBytes(a, b byte)" setHalfCarryFlag(((abs(amountToAdd) & 0x0f) > (value & 0x0f))); } } function checkAndSetEightBitCarryFlag(value, amountToAdd) { if (amountToAdd >= 0) { var result = u8Portable(value + amountToAdd); setCarryFlag((value > result)); } else { setCarryFlag((abs(amountToAdd) > value)); } } // Function to handle 16 bit addition overflow, and set the carry flags accordingly // i32 on valueTwo to support passing signed immedaite values function checkAndSetSixteenBitFlagsAddOverflow(valueOne, valueTwo, useStackPointerBits) { // need to differentiate between HL and SP // HL carries are at 11 and 15, SP carries are at 3 and 7 :p if (useStackPointerBits) { // Logic from : https://github.com/nakardo/node-gameboy/blob/master/lib/cpu/opcodes.js // CTRL+F add_sp_n // using the stack pointer bits means we can safely assume the value is signed var signedValueOne = valueOne; var result = signedValueOne + valueTwo; var flagXor = signedValueOne ^ valueTwo ^ result; setHalfCarryFlag(((flagXor & 0x10) !== 0)); setCarryFlag(((flagXor & 0x100) !== 0)); } else { // Logic from: https://github.com/djhworld/gomeboycolor/blob/master/src/cpu/index.go // CTRL+F addWords // Value two is not signed var result = u16Portable(valueOne + valueTwo); // Check the carry flag by allowing the overflow setCarryFlag((result < valueOne)); // To check for half carry flag (bit 15), by XOR'ing valyes, and and'ing the bit in question var halfCarryXor = valueOne ^ valueTwo ^ result; var halfCarryAnd = u16Portable(halfCarryXor & 0x1000); setHalfCarryFlag((halfCarryAnd !== 0x00)); } } // File for all of the colors for different GB Palletes // https://i.imgur.com/HupBY.png // https://www.libretro.com/index.php/gambatte-progress-report/ // https://tcrf.net/Notes:Game_Boy_Color_Bootstrap_ROM // Our default wasmboy gb colors var WasmBoyGBColors = /** @class */ (function () { function WasmBoyGBColors() { } //Bg WasmBoyGBColors.bgWhite = 0xf2f2f2; WasmBoyGBColors.bgLightGrey = 0xa0a0a0; WasmBoyGBColors.bgDarkGrey = 0x585858; WasmBoyGBColors.bgBlack = 0x080808; // Obj 0 WasmBoyGBColors.obj0White = 0xf2f2f2; WasmBoyGBColors.obj0LightGrey = 0xa0a0a0; WasmBoyGBColors.obj0DarkGrey = 0x585858; WasmBoyGBColors.obj0Black = 0x080808; // Obj1 WasmBoyGBColors.obj1White = 0xf2f2f2; WasmBoyGBColors.obj1LightGrey = 0xa0a0a0; WasmBoyGBColors.obj1DarkGrey = 0x585858; WasmBoyGBColors.obj1Black = 0x080808; return WasmBoyGBColors; }()); // Action Button: Right var GreenColors = /** @class */ (function () { function GreenColors() { } //Bg GreenColors.bgWhite = 0xffffff; GreenColors.bgLightGrey = 0x52ff00; GreenColors.bgDarkGrey = 0xff4200; GreenColors.bgBlack = 0x000000; // Obj 0 GreenColors.obj0White = 0xffffff; GreenColors.obj0LightGrey = 0x52ff00; GreenColors.obj0DarkGrey = 0xff4200; GreenColors.obj0Black = 0x000000; // Obj1 GreenColors.obj1White = 0xffffff; GreenColors.obj1LightGrey = 0x52ff00; GreenColors.obj1DarkGrey = 0xff4200; GreenColors.obj1Black = 0x000000; return GreenColors; }()); // Action Button: A + Down var OrangeColors = /** @class */ (function () { function OrangeColors() { } //Bg OrangeColors.bgWhite = 0xffffff; OrangeColors.bgLightGrey = 0xffff00; OrangeColors.bgDarkGrey = 0xff0000; OrangeColors.bgBlack = 0x000000; // Obj 0 OrangeColors.obj0White = 0xffffff; OrangeColors.obj0LightGrey = 0xffff00; OrangeColors.obj0DarkGrey = 0xff0000; OrangeColors.obj0Black = 0x000000; // Obj1 OrangeColors.obj1White = 0xffffff; OrangeColors.obj1LightGrey = 0xffff00; OrangeColors.obj1DarkGrey = 0xff0000; OrangeColors.obj1Black = 0x000000; return OrangeColors; }()); // Action Button: Up var BrownColors = /** @class */ (function () { function BrownColors() { } //Bg BrownColors.bgWhite = 0xffffff; BrownColors.bgLightGrey = 0xffad63; BrownColors.bgDarkGrey = 0x843100; BrownColors.bgBlack = 0x000000; // Obj 0 BrownColors.obj0White = 0xffffff; BrownColors.obj0LightGrey = 0xffad63; BrownColors.obj0DarkGrey = 0x843100; BrownColors.obj0Black = 0x000000; // Obj1 BrownColors.obj1White = 0xffffff; BrownColors.obj1LightGrey = 0xffad63; BrownColors.obj1DarkGrey = 0x843100; BrownColors.obj1Black = 0x000000; return BrownColors; }()); // Action Button: B + Right var InvertedColors = /** @class */ (function () { function InvertedColors() { } //Bg InvertedColors.bgWhite = 0x000000; InvertedColors.bgLightGrey = 0x008484; InvertedColors.bgDarkGrey = 0xffde00; InvertedColors.bgBlack = 0xffffff; // Obj 0 InvertedColors.obj0White = 0x000000; InvertedColors.obj0LightGrey = 0x008484; InvertedColors.obj0DarkGrey = 0xffde00; InvertedColors.obj0Black = 0xffffff; // Obj1 InvertedColors.obj1White = 0x000000; InvertedColors.obj1LightGrey = 0x008484; InvertedColors.obj1DarkGrey = 0xffde00; InvertedColors.obj1Black = 0xffffff; return InvertedColors; }()); // Action Button: B + Left var GrayscaleColors = /** @class */ (function () { function GrayscaleColors() { } //Bg GrayscaleColors.bgWhite = 0xffffff; GrayscaleColors.bgLightGrey = 0xa5a5a5; GrayscaleColors.bgDarkGrey = 0x525252; GrayscaleColors.bgBlack = 0x000000; // Obj 0 GrayscaleColors.obj0White = 0xffffff; GrayscaleColors.obj0LightGrey = 0xa5a5a5; GrayscaleColors.obj0DarkGrey = 0x525252; GrayscaleColors.obj0Black = 0x000000; // Obj1 GrayscaleColors.obj1White = 0xffffff; GrayscaleColors.obj1LightGrey = 0xa5a5a5; GrayscaleColors.obj1DarkGrey = 0x525252; GrayscaleColors.obj1Black = 0x000000; return GrayscaleColors; }()); // Action Button: Down var PastelMixColors = /** @class */ (function () { function PastelMixColors() { } //Bg PastelMixColors.bgWhite = 0xffffa5; PastelMixColors.bgLightGrey = 0xff9494; PastelMixColors.bgDarkGrey = 0x9494ff; PastelMixColors.bgBlack = 0x000000; // Obj 0 PastelMixColors.obj0White = 0xffffa5; PastelMixColors.obj0LightGrey = 0xff9494; PastelMixColors.obj0DarkGrey = 0x9494ff; PastelMixColors.obj0Black = 0x000000; // Obj1 PastelMixColors.obj1White = 0xffffa5; PastelMixColors.obj1LightGrey = 0xff9494; PastelMixColors.obj1DarkGrey = 0x9494ff; PastelMixColors.obj1Black = 0x000000; return PastelMixColors; }()); // Action Button: B + Up var DarkBrownColors = /** @class */ (function () { function DarkBrownColors() { } //Bg DarkBrownColors.bgWhite = 0xffe6c5; DarkBrownColors.bgLightGrey = 0xce9c84; DarkBrownColors.bgDarkGrey = 0x846b29; DarkBrownColors.bgBlack = 0x5a3108; // Obj 0 DarkBrownColors.obj0White = 0xffffff; DarkBrownColors.obj0LightGrey = 0xffad63; DarkBrownColors.obj0DarkGrey = 0x843100; DarkBrownColors.obj0Black = 0x000000; // Obj1 DarkBrownColors.obj1White = 0xffffff; DarkBrownColors.obj1LightGrey = 0xffad63; DarkBrownColors.obj1DarkGrey = 0x843100; DarkBrownColors.obj1Black = 0x000000; return DarkBrownColors; }()); // Action Button: A + Right var DarkGreenColors = /** @class */ (function () { function DarkGreenColors() { } //Bg DarkGreenColors.bgWhite = 0xffffff; DarkGreenColors.bgLightGrey = 0x7bff31; DarkGreenColors.bgDarkGrey = 0x0063c5; DarkGreenColors.bgBlack = 0x000000; // Obj 0 DarkGreenColors.obj0White = 0xffffff; DarkGreenColors.obj0LightGrey = 0xff8484; DarkGreenColors.obj0DarkGrey = 0x943a3a; DarkGreenColors.obj0Black = 0x000000; // Obj1 DarkGreenColors.obj1White = 0xffffff; DarkGreenColors.obj1LightGrey = 0xff8484; DarkGreenColors.obj1DarkGrey = 0x943a3a; DarkGreenColors.obj1Black = 0x000000; return DarkGreenColors; }()); // Action Button: A + Left var DarkBlueColors = /** @class */ (function () { function DarkBlueColors() { } //Bg DarkBlueColors.bgWhite = 0xffffff; DarkBlueColors.bgLightGrey = 0x8c8cde; DarkBlueColors.bgDarkGrey = 0x52528c; DarkBlueColors.bgBlack = 0x000000; // Obj 0 DarkBlueColors.obj0White = 0xffffff; DarkBlueColors.obj0LightGrey = 0xff8484; DarkBlueColors.obj0DarkGrey = 0x943a3a; DarkBlueColors.obj0Black = 0x000000; // Obj1 DarkBlueColors.obj1White = 0xffffff; DarkBlueColors.obj1LightGrey = 0xffad63; DarkBlueColors.obj1DarkGrey = 0x843100; DarkBlueColors.obj1Black = 0x000000; return DarkBlueColors; }()); // Action Button: A + Up var RedColors = /** @class */ (function () { function RedColors() { } //Bg RedColors.bgWhite = 0xffffff; RedColors.bgLightGrey = 0xff8484; RedColors.bgDarkGrey = 0x943a3a; RedColors.bgBlack = 0x000000; // Obj 0 RedColors.obj0White = 0xffffff; RedColors.obj0LightGrey = 0x7bff31; RedColors.obj0DarkGrey = 0x008400; RedColors.obj0Black = 0x000000; // Obj1 RedColors.obj1White = 0xffffff; RedColors.obj1LightGrey = 0x63a5ff; RedColors.obj1DarkGrey = 0x0000ff; RedColors.obj1Black = 0x000000; return RedColors; }()); // Action Button: Left var BlueColors = /** @class */ (function () { function BlueColors() { } //Bg BlueColors.bgWhite = 0xffffff; BlueColors.bgLightGrey = 0x63a5ff; BlueColors.bgDarkGrey = 0x0000ff; BlueColors.bgBlack = 0x000000; // Obj 0 BlueColors.obj0White = 0xffffff; BlueColors.obj0LightGrey = 0xff8484; BlueColors.obj0DarkGrey = 0x943a3a; BlueColors.obj0Black = 0x000000; // Obj1 BlueColors.obj1White = 0xffffff; BlueColors.obj1LightGrey = 0x7bff31; BlueColors.obj1DarkGrey = 0x008400; BlueColors.obj1Black = 0x000000; return BlueColors; }()); // Action Button: B + Down var YellowColors = /** @class */ (function () { function YellowColors() { } //Bg YellowColors.bgWhite = 0xffffff; YellowColors.bgLightGrey = 0xffff00; YellowColors.bgDarkGrey = 0x7b4a00; YellowColors.bgBlack = 0x000000; // Obj 0 YellowColors.obj0White = 0xffffff; YellowColors.obj0LightGrey = 0x63a5ff; YellowColors.obj0DarkGrey = 0x0000ff; YellowColors.obj0Black = 0x000000; // Obj1 YellowColors.obj1White = 0xffffff; YellowColors.obj1LightGrey = 0x7bff31; YellowColors.obj1DarkGrey = 0x008400; YellowColors.obj1Black = 0x000000; return YellowColors; }()); // Assigned Color Palettes // Alleyway var Table00Entry08Colors = /** @class */ (function () { function Table00Entry08Colors() { } //Bg Table00Entry08Colors.bgWhite = 0xa59cff; Table00Entry08Colors.bgLightGrey = 0xffff00; Table00Entry08Colors.bgDarkGrey = 0x006300; Table00Entry08Colors.bgBlack = 0x000000; // Obj 0 Table00Entry08Colors.obj0White = 0xa59cff; Table00Entry08Colors.obj0LightGrey = 0xffff00; Table00Entry08Colors.obj0DarkGrey = 0x006300; Table00Entry08Colors.obj0Black = 0x000000; // Obj1 Table00Entry08Colors.obj1White = 0xa59cff; Table00Entry08Colors.obj1LightGrey = 0xffff00; Table00Entry08Colors.obj1DarkGrey = 0x006300; Table00Entry08Colors.obj1Black = 0x000000; return Table00Entry08Colors; }()); // Pokemon Blue var Table01Entry0BColors = /** @class */ (function () { function Table01Entry0BColors() { } //Bg Table01Entry0BColors.bgWhite = 0xffffff; Table01Entry0BColors.bgLightGrey = 0x63a5ff; Table01Entry0BColors.bgDarkGrey = 0x0000ff; Table01Entry0BColors.bgBlack = 0x000000; // Obj 0 Table01Entry0BColors.obj0White = 0xffffff; Table01Entry0BColors.obj0LightGrey = 0xff8484; Table01Entry0BColors.obj0DarkGrey = 0x943a3a; Table01Entry0BColors.obj0Black = 0x000000; // Obj1 Table01Entry0BColors.obj1White = 0xffffff; Table01Entry0BColors.obj1LightGrey = 0x63a5ff; Table01Entry0BColors.obj1DarkGrey = 0x0000ff; Table01Entry0BColors.obj1Black = 0x000000; return Table01Entry0BColors; }()); // Pokemon Red var Table01Entry10Colors = /** @class */ (function () { function Table01Entry10Colors() { } //Bg Table01Entry10Colors.bgWhite = 0xffffff; Table01Entry10Colors.bgLightGrey = 0xff8484; Table01Entry10Colors.bgDarkGrey = 0x943a3a; Table01Entry10Colors.bgBlack = 0x000000; // Obj 0 Table01Entry10Colors.obj0White = 0xffffff; Table01Entry10Colors.obj0LightGrey = 0x7bff31; Table01Entry10Colors.obj0DarkGrey = 0x008400; Table01Entry10Colors.obj0Black = 0x000000; // Obj1 Table01Entry10Colors.obj1White = 0xffffff; Table01Entry10Colors.obj1LightGrey = 0xff8484; Table01Entry10Colors.obj1DarkGrey = 0x943a3a; Table01Entry10Colors.obj1Black = 0x000000; return Table01Entry10Colors; }()); // Super Mario Land var Table03Entry0AColors = /** @class */ (function () { function Table03Entry0AColors() { } //Bg Table03Entry0AColors.bgWhite = 0xb5b5ff; Table03Entry0AColors.bgLightGrey = 0xffff94; Table03Entry0AColors.bgDarkGrey = 0xad5a42; Table03Entry0AColors.bgBlack = 0x000000; // Obj 0 Table03Entry0AColors.obj0White = 0x000000; Table03Entry0AColors.obj0LightGrey = 0xffffff; Table03Entry0AColors.obj0DarkGrey = 0xff8484; Table03Entry0AColors.obj0Black = 0x943a3a; // Obj1 Table03Entry0AColors.obj1White = 0x000000; Table03Entry0AColors.obj1LightGrey = 0xffffff; Table03Entry0AColors.obj1DarkGrey = 0xff8484; Table03Entry0AColors.obj1Black = 0x943a3a; return Table03Entry0AColors; }()); // Super Mario Land 3 - WarioLand var Table05Entry00Colors = /** @class */ (function () { function Table05Entry00Colors() { } //Bg Table05Entry00Colors.bgWhite = 0xffffff; Table05Entry00Colors.bgLightGrey = 0xadad84; Table05Entry00Colors.bgDarkGrey = 0x42737b; Table05Entry00Colors.bgBlack = 0x000000; // Obj 0 Table05Entry00Colors.obj0White = 0xffffff; Table05Entry00Colors.obj0LightGrey = 0xff7300; Table05Entry00Colors.obj0DarkGrey = 0x944200; Table05Entry00Colors.obj0Black = 0x000000; // Obj1 Table05Entry00Colors.obj1White = 0xffffff; Table05Entry00Colors.obj1LightGrey = 0x5abdff; Table05Entry00Colors.obj1DarkGrey = 0xff0000; Table05Entry00Colors.obj1Black = 0x0000ff; return Table05Entry00Colors; }()); // Donkey Kong var Table05Entry01Colors = /** @class */ (function () { function Table05Entry01Colors() { } //Bg Table05Entry01Colors.bgWhite = 0xffff9c; Table05Entry01Colors.bgLightGrey = 0x94b5ff; Table05Entry01Colors.bgDarkGrey = 0x639473; Table05Entry01Colors.bgBlack = 0x003a3a; // Obj 0 Table05Entry01Colors.obj0White = 0xffc542; Table05Entry01Colors.obj0LightGrey = 0xffd600; Table05Entry01Colors.obj0DarkGrey = 0x943a00; Table05Entry01Colors.obj0Black = 0x4a0000; // Obj1 Table05Entry01Colors.obj1White = 0xffffff; Table05Entry01Colors.obj1LightGrey = 0xff8484; Table05Entry01Colors.obj1DarkGrey = 0x943a3a; Table05Entry01Colors.obj1Black = 0x000000; return Table05Entry01Colors; }()); // Tennis var Table05Entry02Colors = /** @class */ (function () { function Table05Entry02Colors() { } //Bg Table05Entry02Colors.bgWhite = 0x6bff00; Table05Entry02Colors.bgLightGrey = 0xffffff; Table05Entry02Colors.bgDarkGrey = 0xff524a; Table05Entry02Colors.bgBlack = 0x000000; // Obj 0 Table05Entry02Colors.obj0White = 0xffffff; Table05Entry02Colors.obj0LightGrey = 0xffffff; Table05Entry02Colors.obj0DarkGrey = 0x63a5ff; Table05Entry02Colors.obj0Black = 0x0000ff; // Obj1 Table05Entry02Colors.obj1White = 0xffffff; Table05Entry02Colors.obj1LightGrey = 0xffad63; Table05Entry02Colors.obj1DarkGrey = 0x843100; Table05Entry02Colors.obj1Black = 0x000000; return Table05Entry02Colors; }()); // Kirby's Dream Land var Table05Entry08Colors = /** @class */ (function () { function Table05Entry08Colors() { } //Bg Table05Entry08Colors.bgWhite = 0xa59cff; Table05Entry08Colors.bgLightGrey = 0xffff00; Table05Entry08Colors.bgDarkGrey = 0x006300; Table05Entry08Colors.bgBlack = 0x000000; // Obj 0 Table05Entry08Colors.obj0White = 0xff6352; Table05Entry08Colors.obj0LightGrey = 0xd60000; Table05Entry08Colors.obj0DarkGrey = 0x630000; Table05Entry08Colors.obj0Black = 0x000000; // Obj1 Table05Entry08Colors.obj1White = 0x0000ff; Table05Entry08Colors.obj1LightGrey = 0xffffff; Table05Entry08Colors.obj1DarkGrey = 0xffff7b; Table05Entry08Colors.obj1Black = 0x0084ff; return Table05Entry08Colors; }()); // Super Mario Land 2 BAYYYBEEE var Table05Entry09Colors = /** @class */ (function () { function Table05Entry09Colors() { } //Bg Table05Entry09Colors.bgWhite = 0xffffce; Table05Entry09Colors.bgLightGrey = 0x63efef; Table05Entry09Colors.bgDarkGrey = 0x9c8431; Table05Entry09Colors.bgBlack = 0x5a5a5a; // Obj 0 Table05Entry09Colors.obj0White = 0xffffff; Table05Entry09Colors.obj0LightGrey = 0xff7300; Table05Entry09Colors.obj0DarkGrey = 0x944200; Table05Entry09Colors.obj0Black = 0x000000; // Obj1 Table05Entry09Colors.obj1White = 0xffffff; Table05Entry09Colors.obj1LightGrey = 0x63a5ff; Table05Entry09Colors.obj1DarkGrey = 0x0000ff; Table05Entry09Colors.obj1Black = 0x000000; return Table05Entry09Colors; }()); // Link's Awakening var Table05Entry11Colors = /** @class */ (function () { function Table05Entry11Colors() { } // Bg Table05Entry11Colors.bgWhite = 0xffffff; Table05Entry11Colors.bgLightGrey = 0xff8484; Table05Entry11Colors.bgDarkGrey = 0x943a3a; Table05Entry11Colors.bgBlack = 0x000000; // Obj 0 Table05Entry11Colors.obj0White = 0xffffff; Table05Entry11Colors.obj0LightGrey = 0x00ff00; Table05Entry11Colors.obj0DarkGrey = 0x318400; Table05Entry11Colors.obj0Black = 0x004a00; // Obj1 Table05Entry11Colors.obj1White = 0xffffff; Table05Entry11Colors.obj1LightGrey = 0x63a5ff; Table05Entry11Colors.obj1DarkGrey = 0x0000ff; Table05Entry11Colors.obj1Black = 0x000000; return Table05Entry11Colors; }()); // Metroid 2 var Table05Entry14Colors = /** @class */ (function () { function Table05Entry14Colors() { } //Bg Table05Entry14Colors.bgWhite = 0xffffff; Table05Entry14Colors.bgLightGrey = 0x63a5ff; Table05Entry14Colors.bgDarkGrey = 0x0000ff; Table05Entry14Colors.bgBlack = 0x000000; // Obj 0 Table05Entry14Colors.obj0White = 0xffff00; Table05Entry14Colors.obj0LightGrey = 0xff0000; Table05Entry14Colors.obj0DarkGrey = 0x630000; Table05Entry14Colors.obj0Black = 0x000000; // Obj1 Table05Entry14Colors.obj1White = 0xffffff; Table05Entry14Colors.obj1LightGrey = 0x7bff31; Table05Entry14Colors.obj1DarkGrey = 0x008400; Table05Entry14Colors.obj1Black = 0x000000; return Table05Entry14Colors; }()); // WarioLand 2 var Table05Entry15Colors = /** @class */ (function () { function Table05Entry15Colors() { } //Bg Table05Entry15Colors.bgWhite = 0xffffff; Table05Entry15Colors.bgLightGrey = 0xadad84; Table05Entry15Colors.bgDarkGrey = 0x42737b; Table05Entry15Colors.bgBlack = 0x000000; // Obj 0 Table05Entry15Colors.obj0White = 0xffffff; Table05Entry15Colors.obj0LightGrey = 0xffad63; Table05Entry15Colors.obj0DarkGrey = 0xffad63; Table05Entry15Colors.obj0Black = 0x000000; // Obj1 Table05Entry15Colors.obj1White = 0xffffff; Table05Entry15Colors.obj1LightGrey = 0x63a5ff; Table05Entry15Colors.obj1DarkGrey = 0x0000ff; Table05Entry15Colors.obj1Black = 0x000000; return Table05Entry15Colors; }()); // File for all of the logic of setting gameboy color plaettes // Current / exported color var Colors = /** @class */ (function () { function Colors() { } //Bg Colors.bgWhite = WasmBoyGBColors.bgWhite; Colors.bgLightGrey = WasmBoyGBColors.bgLightGrey; Colors.bgDarkGrey = WasmBoyGBColors.bgDarkGrey; Colors.bgBlack = WasmBoyGBColors.bgBlack; // Obj 0 Colors.obj0White = WasmBoyGBColors.obj0White; Colors.obj0LightGrey = WasmBoyGBColors.obj0LightGrey; Colors.obj0DarkGrey = WasmBoyGBColors.obj0DarkGrey; Colors.obj0Black = WasmBoyGBColors.obj0Black; // Obj1 Colors.obj1White = WasmBoyGBColors.obj1White; Colors.obj1LightGrey = WasmBoyGBColors.obj1LightGrey; Colors.obj1DarkGrey = WasmBoyGBColors.obj1DarkGrey; Colors.obj1Black = WasmBoyGBColors.obj1Black; return Colors; }()); // Inlined because closure compiler inlines function initializeColors() { setManualColorizationPalette(0); if (Cpu.GBCEnabled) { // Don't need to continue this if a GBC game return; } if (Cpu.BootROMEnabled) { if (!Cpu.GBCEnabled) { // GB return; } } // Do some automatic color palette swapping if we have a loaded ROM var titleChecksum = 0x00; for (var i = 0x0134; i <= 0x0143; i++) { titleChecksum += eightBitLoadFromGBMemory(i); } // Set the colorization for the game automatically if assigned // https://tcrf.net/Notes:Game_Boy_Color_Bootstrap_ROM var hash = titleChecksum & 0xff; setHashColorizationPalette(hash); } function getRedFromHexColor(color) { return (color & 0xff0000) >> 16; } function getGreenFromHexColor(color) { return (color & 0x00ff00) >> 8; } function getBlueFromHexColor(color) { return color & 0x0000ff; } // Function to set the colorization // By manually pressing buttons function setManualColorizationPalette(colorizationId) { // Set the colorizationId clockwise according to: // https://en.wikipedia.org/wiki/Game_Boy_Color switch (colorizationId) { case 0: Colors.bgWhite = WasmBoyGBColors.bgWhite; Colors.bgLightGrey = WasmBoyGBColors.bgLightGrey; Colors.bgDarkGrey = WasmBoyGBColors.bgDarkGrey; Colors.bgBlack = WasmBoyGBColors.bgBlack; Colors.obj0White = WasmBoyGBColors.obj0White; Colors.obj0LightGrey = WasmBoyGBColors.obj0LightGrey; Colors.obj0DarkGrey = WasmBoyGBColors.obj0DarkGrey; Colors.obj0Black = WasmBoyGBColors.obj0Black; Colors.obj1White = WasmBoyGBColors.obj1White; Colors.obj1LightGrey = WasmBoyGBColors.obj1LightGrey; Colors.obj1DarkGrey = WasmBoyGBColors.obj1DarkGrey; Colors.obj1Black = WasmBoyGBColors.obj1Black; break; case 1: // Up, Brown Colors.bgWhite = BrownColors.bgWhite; Colors.bgLightGrey = BrownColors.bgLightGrey; Colors.bgDarkGrey = BrownColors.bgDarkGrey; Colors.bgBlack = BrownColors.bgBlack; Colors.obj0White = BrownColors.obj0White; Colors.obj0LightGrey = BrownColors.obj0LightGrey; Colors.obj0DarkGrey = BrownColors.obj0DarkGrey; Colors.obj0Black = BrownColors.obj0Black; Colors.obj1White = BrownColors.obj1White; Colors.obj1LightGrey = BrownColors.obj1LightGrey; Colors.obj1DarkGrey = BrownColors.obj1DarkGrey; Colors.obj1Black = BrownColors.obj1Black; break; case 2: // Up + A, Red Colors.bgWhite = RedColors.bgWhite; Colors.bgLightGrey = RedColors.bgLightGrey; Colors.bgDarkGrey = RedColors.bgDarkGrey; Colors.bgBlack = RedColors.bgBlack; Colors.obj0White = RedColors.obj0White; Colors.obj0LightGrey = RedColors.obj0LightGrey; Colors.obj0DarkGrey = RedColors.obj0DarkGrey; Colors.obj0Black = RedColors.obj0Black; Colors.obj1White = RedColors.obj1White; Colors.obj1LightGrey = RedColors.obj1LightGrey; Colors.obj1DarkGrey = RedColors.obj1DarkGrey; Colors.obj1Black = RedColors.obj1Black; break; case 3: // Up + B, DarkBrown Colors.bgWhite = DarkBrownColors.bgWhite; Colors.bgLightGrey = DarkBrownColors.bgLightGrey; Colors.bgDarkGrey = DarkBrownColors.bgDarkGrey; Colors.bgBlack = DarkBrownColors.bgBlack; Colors.obj0White = DarkBrownColors.obj0White; Colors.obj0LightGrey = DarkBrownColors.obj0LightGrey; Colors.obj0DarkGrey = DarkBrownColors.obj0DarkGrey; Colors.obj0Black = DarkBrownColors.obj0Black; Colors.obj1White = DarkBrownColors.obj1White; Colors.obj1LightGrey = DarkBrownColors.obj1LightGrey; Colors.obj1DarkGrey = DarkBrownColors.obj1DarkGrey; Colors.obj1Black = DarkBrownColors.obj1Black; break; case 4: // Right, Green Colors.bgWhite = GreenColors.bgWhite; Colors.bgLightGrey = GreenColors.bgLightGrey; Colors.bgDarkGrey = GreenColors.bgDarkGrey; Colors.bgBlack = GreenColors.bgBlack; Colors.obj0White = GreenColors.obj0White; Colors.obj0LightGrey = GreenColors.obj0LightGrey; Colors.obj0DarkGrey = GreenColors.obj0DarkGrey; Colors.obj0Black = GreenColors.obj0Black; Colors.obj1White = GreenColors.obj1White; Colors.obj1LightGrey = GreenColors.obj1LightGrey; Colors.obj1DarkGrey = GreenColors.obj1DarkGrey; Colors.obj1Black = GreenColors.obj1Black; break; case 5: // Right + A, DarkGreenColors Colors.bgWhite = DarkGreenColors.bgWhite; Colors.bgLightGrey = DarkGreenColors.bgLightGrey; Colors.bgDarkGrey = DarkGreenColors.bgDarkGrey; Colors.bgBlack = DarkGreenColors.bgBlack; Colors.obj0White = DarkGreenColors.obj0White; Colors.obj0LightGrey = DarkGreenColors.obj0LightGrey; Colors.obj0DarkGrey = DarkGreenColors.obj0DarkGrey; Colors.obj0Black = DarkGreenColors.obj0Black; Colors.obj1White = DarkGreenColors.obj1White; Colors.obj1LightGrey = DarkGreenColors.obj1LightGrey; Colors.obj1DarkGrey = DarkGreenColors.obj1DarkGrey; Colors.obj1Black = DarkGreenColors.obj1Black; break; case 6: // Right + B, InvertedColors Colors.bgWhite = InvertedColors.bgWhite; Colors.bgLightGrey = InvertedColors.bgLightGrey; Colors.bgDarkGrey = InvertedColors.bgDarkGrey; Colors.bgBlack = InvertedColors.bgBlack; Colors.obj0White = InvertedColors.obj0White; Colors.obj0LightGrey = InvertedColors.obj0LightGrey; Colors.obj0DarkGrey = InvertedColors.obj0DarkGrey; Colors.obj0Black = InvertedColors.obj0Black; Colors.obj1White = InvertedColors.obj1White; Colors.obj1LightGrey = InvertedColors.obj1LightGrey; Colors.obj1DarkGrey = InvertedColors.obj1DarkGrey; Colors.obj1Black = InvertedColors.obj1Black; break; case 7: // Down, PastelMixColors Colors.bgWhite = PastelMixColors.bgWhite; Colors.bgLightGrey = PastelMixColors.bgLightGrey; Colors.bgDarkGrey = PastelMixColors.bgDarkGrey; Colors.bgBlack = PastelMixColors.bgBlack; Colors.obj0White = PastelMixColors.obj0White; Colors.obj0LightGrey = PastelMixColors.obj0LightGrey; Colors.obj0DarkGrey = PastelMixColors.obj0DarkGrey; Colors.obj0Black = PastelMixColors.obj0Black; Colors.obj1White = PastelMixColors.obj1White; Colors.obj1LightGrey = PastelMixColors.obj1LightGrey; Colors.obj1DarkGrey = PastelMixColors.obj1DarkGrey; Colors.obj1Black = PastelMixColors.obj1Black; break; case 8: // Down + A, Orange Colors.bgWhite = OrangeColors.bgWhite; Colors.bgLightGrey = OrangeColors.bgLightGrey; Colors.bgDarkGrey = OrangeColors.bgDarkGrey; Colors.bgBlack = OrangeColors.bgBlack; Colors.obj0White = OrangeColors.obj0White; Colors.obj0LightGrey = OrangeColors.obj0LightGrey; Colors.obj0DarkGrey = OrangeColors.obj0DarkGrey; Colors.obj0Black = OrangeColors.obj0Black; Colors.obj1White = OrangeColors.obj1White; Colors.obj1LightGrey = OrangeColors.obj1LightGrey; Colors.obj1DarkGrey = OrangeColors.obj1DarkGrey; Colors.obj1Black = OrangeColors.obj1Black; break; case 9: // Down + B, Yellow Colors.bgWhite = YellowColors.bgWhite; Colors.bgLightGrey = YellowColors.bgLightGrey; Colors.bgDarkGrey = YellowColors.bgDarkGrey; Colors.bgBlack = YellowColors.bgBlack; Colors.obj0White = YellowColors.obj0White; Colors.obj0LightGrey = YellowColors.obj0LightGrey; Colors.obj0DarkGrey = YellowColors.obj0DarkGrey; Colors.obj0Black = YellowColors.obj0Black; Colors.obj1White = YellowColors.obj1White; Colors.obj1LightGrey = YellowColors.obj1LightGrey; Colors.obj1DarkGrey = YellowColors.obj1DarkGrey; Colors.obj1Black = YellowColors.obj1Black; break; case 10: // Left, Blue Colors.bgWhite = BlueColors.bgWhite; Colors.bgLightGrey = BlueColors.bgLightGrey; Colors.bgDarkGrey = BlueColors.bgDarkGrey; Colors.bgBlack = BlueColors.bgBlack; Colors.obj0White = BlueColors.obj0White; Colors.obj0LightGrey = BlueColors.obj0LightGrey; Colors.obj0DarkGrey = BlueColors.obj0DarkGrey; Colors.obj0Black = BlueColors.obj0Black; Colors.obj1White = BlueColors.obj1White; Colors.obj1LightGrey = BlueColors.obj1LightGrey; Colors.obj1DarkGrey = BlueColors.obj1DarkGrey; Colors.obj1Black = BlueColors.obj1Black; break; case 11: // Left + A, Dark Blue Colors.bgWhite = DarkBlueColors.bgWhite; Colors.bgLightGrey = DarkBlueColors.bgLightGrey; Colors.bgDarkGrey = DarkBlueColors.bgDarkGrey; Colors.bgBlack = DarkBlueColors.bgBlack; Colors.obj0White = DarkBlueColors.obj0White; Colors.obj0LightGrey = DarkBlueColors.obj0LightGrey; Colors.obj0DarkGrey = DarkBlueColors.obj0DarkGrey; Colors.obj0Black = DarkBlueColors.obj0Black; Colors.obj1White = DarkBlueColors.obj1White; Colors.obj1LightGrey = DarkBlueColors.obj1LightGrey; Colors.obj1DarkGrey = DarkBlueColors.obj1DarkGrey; Colors.obj1Black = DarkBlueColors.obj1Black; break; case 12: // Left + B, GrayScale Colors.bgWhite = GrayscaleColors.bgWhite; Colors.bgLightGrey = GrayscaleColors.bgLightGrey; Colors.bgDarkGrey = GrayscaleColors.bgDarkGrey; Colors.bgBlack = GrayscaleColors.bgBlack; Colors.obj0White = GrayscaleColors.obj0White; Colors.obj0LightGrey = GrayscaleColors.obj0LightGrey; Colors.obj0DarkGrey = GrayscaleColors.obj0DarkGrey; Colors.obj0Black = GrayscaleColors.obj0Black; Colors.obj1White = GrayscaleColors.obj1White; Colors.obj1LightGrey = GrayscaleColors.obj1LightGrey; Colors.obj1DarkGrey = GrayscaleColors.obj1DarkGrey; Colors.obj1Black = GrayscaleColors.obj1Black; break; } } // Function to set the colorization // By checksum of the title // https://forums.nesdev.com/viewtopic.php?f=20&t=10226 // TODO: torch2424 need to find how to get the "disambiguation" // Inlined because closure compiler inlines function setHashColorizationPalette(hash) { switch (hash) { case 0x88: Colors.bgWhite = Table00Entry08Colors.bgWhite; Colors.bgLightGrey = Table00Entry08Colors.bgLightGrey; Colors.bgDarkGrey = Table00Entry08Colors.bgDarkGrey; Colors.bgBlack = Table00Entry08Colors.bgBlack; Colors.obj0White = Table00Entry08Colors.obj0White; Colors.obj0LightGrey = Table00Entry08Colors.obj0LightGrey; Colors.obj0DarkGrey = Table00Entry08Colors.obj0DarkGrey; Colors.obj0Black = Table00Entry08Colors.obj0Black; Colors.obj1White = Table00Entry08Colors.obj1White; Colors.obj1LightGrey = Table00Entry08Colors.obj1LightGrey; Colors.obj1DarkGrey = Table00Entry08Colors.obj1DarkGrey; Colors.obj1Black = Table00Entry08Colors.obj1Black; break; case 0x61: Colors.bgWhite = Table01Entry0BColors.bgWhite; Colors.bgLightGrey = Table01Entry0BColors.bgLightGrey; Colors.bgDarkGrey = Table01Entry0BColors.bgDarkGrey; Colors.bgBlack = Table01Entry0BColors.bgBlack; Colors.obj0White = Table01Entry0BColors.obj0White; Colors.obj0LightGrey = Table01Entry0BColors.obj0LightGrey; Colors.obj0DarkGrey = Table01Entry0BColors.obj0DarkGrey; Colors.obj0Black = Table01Entry0BColors.obj0Black; Colors.obj1White = Table01Entry0BColors.obj1White; Colors.obj1LightGrey = Table01Entry0BColors.obj1LightGrey; Colors.obj1DarkGrey = Table01Entry0BColors.obj1DarkGrey; Colors.obj1Black = Table01Entry0BColors.obj1Black; break; case 0x14: Colors.bgWhite = Table01Entry10Colors.bgWhite; Colors.bgLightGrey = Table01Entry10Colors.bgLightGrey; Colors.bgDarkGrey = Table01Entry10Colors.bgDarkGrey; Colors.bgBlack = Table01Entry10Colors.bgBlack; Colors.obj0White = Table01Entry10Colors.obj0White; Colors.obj0LightGrey = Table01Entry10Colors.obj0LightGrey; Colors.obj0DarkGrey = Table01Entry10Colors.obj0DarkGrey; Colors.obj0Black = Table01Entry10Colors.obj0Black; Colors.obj1White = Table01Entry10Colors.obj1White; Colors.obj1LightGrey = Table01Entry10Colors.obj1LightGrey; Colors.obj1DarkGrey = Table01Entry10Colors.obj1DarkGrey; Colors.obj1Black = Table01Entry10Colors.obj1Black; break; case 0x46: Colors.bgWhite = Table03Entry0AColors.bgWhite; Colors.bgLightGrey = Table03Entry0AColors.bgLightGrey; Colors.bgDarkGrey = Table03Entry0AColors.bgDarkGrey; Colors.bgBlack = Table03Entry0AColors.bgBlack; Colors.obj0White = Table03Entry0AColors.obj0White; Colors.obj0LightGrey = Table03Entry0AColors.obj0LightGrey; Colors.obj0DarkGrey = Table03Entry0AColors.obj0DarkGrey; Colors.obj0Black = Table03Entry0AColors.obj0Black; Colors.obj1White = Table03Entry0AColors.obj1White; Colors.obj1LightGrey = Table03Entry0AColors.obj1LightGrey; Colors.obj1DarkGrey = Table03Entry0AColors.obj1DarkGrey; Colors.obj1Black = Table03Entry0AColors.obj1Black; break; case 0x59: case 0xc6: Colors.bgWhite = Table05Entry00Colors.bgWhite; Colors.bgLightGrey = Table05Entry00Colors.bgLightGrey; Colors.bgDarkGrey = Table05Entry00Colors.bgDarkGrey; Colors.bgBlack = Table05Entry00Colors.bgBlack; Colors.obj0White = Table05Entry00Colors.obj0White; Colors.obj0LightGrey = Table05Entry00Colors.obj0LightGrey; Colors.obj0DarkGrey = Table05Entry00Colors.obj0DarkGrey; Colors.obj0Black = Table05Entry00Colors.obj0Black; Colors.obj1White = Table05Entry00Colors.obj1White; Colors.obj1LightGrey = Table05Entry00Colors.obj1LightGrey; Colors.obj1DarkGrey = Table05Entry00Colors.obj1DarkGrey; Colors.obj1Black = Table05Entry00Colors.obj1Black; break; case 0x86: case 0xa8: Colors.bgWhite = Table05Entry01Colors.bgWhite; Colors.bgLightGrey = Table05Entry01Colors.bgLightGrey; Colors.bgDarkGrey = Table05Entry01Colors.bgDarkGrey; Colors.bgBlack = Table05Entry01Colors.bgBlack; Colors.obj0White = Table05Entry01Colors.obj0White; Colors.obj0LightGrey = Table05Entry01Colors.obj0LightGrey; Colors.obj0DarkGrey = Table05Entry01Colors.obj0DarkGrey; Colors.obj0Black = Table05Entry01Colors.obj0Black; Colors.obj1White = Table05Entry01Colors.obj1White; Colors.obj1LightGrey = Table05Entry01Colors.obj1LightGrey; Colors.obj1DarkGrey = Table05Entry01Colors.obj1DarkGrey; Colors.obj1Black = Table05Entry01Colors.obj1Black; break; case 0xbf: case 0xce: case 0xd1: case 0xf0: Colors.bgWhite = Table05Entry02Colors.bgWhite; Colors.bgLightGrey = Table05Entry02Colors.bgLightGrey; Colors.bgDarkGrey = Table05Entry02Colors.bgDarkGrey; Colors.bgBlack = Table05Entry02Colors.bgBlack; Colors.obj0White = Table05Entry02Colors.obj0White; Colors.obj0LightGrey = Table05Entry02Colors.obj0LightGrey; Colors.obj0DarkGrey = Table05Entry02Colors.obj0DarkGrey; Colors.obj0Black = Table05Entry02Colors.obj0Black; Colors.obj1White = Table05Entry02Colors.obj1White; Colors.obj1LightGrey = Table05Entry02Colors.obj1LightGrey; Colors.obj1DarkGrey = Table05Entry02Colors.obj1DarkGrey; Colors.obj1Black = Table05Entry02Colors.obj1Black; break; case 0x27: case 0x49: case 0x5c: case 0xb3: Colors.bgWhite = Table05Entry08Colors.bgWhite; Colors.bgLightGrey = Table05Entry08Colors.bgLightGrey; Colors.bgDarkGrey = Table05Entry08Colors.bgDarkGrey; Colors.bgBlack = Table05Entry08Colors.bgBlack; Colors.obj0White = Table05Entry08Colors.obj0White; Colors.obj0LightGrey = Table05Entry08Colors.obj0LightGrey; Colors.obj0DarkGrey = Table05Entry08Colors.obj0DarkGrey; Colors.obj0Black = Table05Entry08Colors.obj0Black; Colors.obj1White = Table05Entry08Colors.obj1White; Colors.obj1LightGrey = Table05Entry08Colors.obj1LightGrey; Colors.obj1DarkGrey = Table05Entry08Colors.obj1DarkGrey; Colors.obj1Black = Table05Entry08Colors.obj1Black; break; case 0xc9: Colors.bgWhite = Table05Entry09Colors.bgWhite; Colors.bgLightGrey = Table05Entry09Colors.bgLightGrey; Colors.bgDarkGrey = Table05Entry09Colors.bgDarkGrey; Colors.bgBlack = Table05Entry09Colors.bgBlack; Colors.obj0White = Table05Entry09Colors.obj0White; Colors.obj0LightGrey = Table05Entry09Colors.obj0LightGrey; Colors.obj0DarkGrey = Table05Entry09Colors.obj0DarkGrey; Colors.obj0Black = Table05Entry09Colors.obj0Black; Colors.obj1White = Table05Entry09Colors.obj1White; Colors.obj1LightGrey = Table05Entry09Colors.obj1LightGrey; Colors.obj1DarkGrey = Table05Entry09Colors.obj1DarkGrey; Colors.obj1Black = Table05Entry09Colors.obj1Black; break; case 0x70: Colors.bgWhite = Table05Entry11Colors.bgWhite; Colors.bgLightGrey = Table05Entry11Colors.bgLightGrey; Colors.bgDarkGrey = Table05Entry11Colors.bgDarkGrey; Colors.bgBlack = Table05Entry11Colors.bgBlack; Colors.obj0White = Table05Entry11Colors.obj0White; Colors.obj0LightGrey = Table05Entry11Colors.obj0LightGrey; Colors.obj0DarkGrey = Table05Entry11Colors.obj0DarkGrey; Colors.obj0Black = Table05Entry11Colors.obj0Black; Colors.obj1White = Table05Entry11Colors.obj1White; Colors.obj1LightGrey = Table05Entry11Colors.obj1LightGrey; Colors.obj1DarkGrey = Table05Entry11Colors.obj1DarkGrey; Colors.obj1Black = Table05Entry11Colors.obj1Black; break; case 0x46: Colors.bgWhite = Table05Entry14Colors.bgWhite; Colors.bgLightGrey = Table05Entry14Colors.bgLightGrey; Colors.bgDarkGrey = Table05Entry14Colors.bgDarkGrey; Colors.bgBlack = Table05Entry14Colors.bgBlack; Colors.obj0White = Table05Entry14Colors.obj0White; Colors.obj0LightGrey = Table05Entry14Colors.obj0LightGrey; Colors.obj0DarkGrey = Table05Entry14Colors.obj0DarkGrey; Colors.obj0Black = Table05Entry14Colors.obj0Black; Colors.obj1White = Table05Entry14Colors.obj1White; Colors.obj1LightGrey = Table05Entry14Colors.obj1LightGrey; Colors.obj1DarkGrey = Table05Entry14Colors.obj1DarkGrey; Colors.obj1Black = Table05Entry14Colors.obj1Black; break; case 0xd3: Colors.bgWhite = Table05Entry15Colors.bgWhite; Colors.bgLightGrey = Table05Entry15Colors.bgLightGrey; Colors.bgDarkGrey = Table05Entry15Colors.bgDarkGrey; Colors.bgBlack = Table05Entry15Colors.bgBlack; Colors.obj0White = Table05Entry15Colors.obj0White; Colors.obj0LightGrey = Table05Entry15Colors.obj0LightGrey; Colors.obj0DarkGrey = Table05Entry15Colors.obj0DarkGrey; Colors.obj0Black = Table05Entry15Colors.obj0Black; Colors.obj1White = Table05Entry15Colors.obj1White; Colors.obj1LightGrey = Table05Entry15Colors.obj1LightGrey; Colors.obj1DarkGrey = Table05Entry15Colors.obj1DarkGrey; Colors.obj1Black = Table05Entry15Colors.obj1Black; break; } } // Grouped registers // possible overload these later to performace actions // AF, BC, DE, HL function concatenateBytes(highByte, lowByte) { //https://stackoverflow.com/questions/38298412/convert-two-bytes-into-signed-16-bit-integer-in-javascript return ((highByte & 0xff) << 8) | (lowByte & 0xff); } function splitHighByte(groupedByte) { return (groupedByte & 0xff00) >> 8; } function splitLowByte(groupedByte) { return groupedByte & 0x00ff; } function rotateByteLeft(value) { // Rotate left // https://stackoverflow.com/questions/19204750/how-do-i-perform-a-circular-rotation-of-a-byte // 4-bit example: // 1010 -> 0100 | 0001 return u8Portable((value << 1) | (value >> 7)); } function rotateByteLeftThroughCarry(value) { // Example: https://github.com/nakardo/node-gameboy/blob/master/lib/cpu/opcodes.js // Through carry meaning, instead of raotating the bit that gets dropped off, but the carry there instead return u8Portable((value << 1) | getCarryFlag$$1()); } function rotateByteRight(value) {