@soapbox.pub/wasmboy
Version:
Soapbox fork of Wasmboy.
1,231 lines (1,216 loc) • 451 kB
JavaScript
// 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) {