mirror of
https://github.com/colby-swandale/waterfoul
synced 2024-12-27 21:58:55 +01:00
67 lines
3.1 KiB
Ruby
67 lines
3.1 KiB
Ruby
module Waterfoul
|
|
# The bootrom is a special program that is stored internally on the device
|
|
# and is executed when the device is first turned on.
|
|
#
|
|
# The main purpose of the program is to bootstrap the device into a state
|
|
# that is ready to run the game program. Some of the notable tasks the
|
|
# program will perform are:
|
|
# - zero all vram
|
|
# - print and scroll a "nintendo" logo to the middle of the screen
|
|
# - 2 notable sounds are made
|
|
# - perform integrity check of the game program, basic form of DRM
|
|
#
|
|
# A video of the display showing the bootstrap process can be found here:
|
|
# https://www.youtube.com/watch?v=-Fh9SpWFdn0
|
|
#
|
|
# This program is mapped to memory at 0x00 to 0xFF when the device is turned on.
|
|
# The last instruction in the program will unmap the boot rom, making any read/write
|
|
# between 0x00 and 0xFF be sent to the game program instead.
|
|
#
|
|
# A detailed blog post of the gameboy's boostrap process can be found here:
|
|
# https://realboyemulator.wordpress.com/2013/01/03/a-look-at-the-game-boy-bootstrap-let-the-fun-begin/
|
|
#
|
|
# The source code of the Gameboy's boot rom can be found here:
|
|
# http://gbdev.gg8.se/wiki/articles/Gameboy_Bootstrap_ROM
|
|
class BootROM
|
|
|
|
ROM = [
|
|
0x31, 0xFE, 0xFF, 0xAF, 0x21, 0xFF, 0x9F, 0x32, 0xCB, 0x7C, 0x20, 0xFB,
|
|
0x21, 0x26, 0xFF, 0x0E, 0x11, 0x3E, 0x80, 0x32, 0xE2, 0x0C, 0x3E, 0xF3,
|
|
0xE2, 0x32, 0x3E, 0x77, 0x77, 0x3E, 0xFC, 0xE0, 0x47, 0x11, 0x04, 0x01,
|
|
0x21, 0x10, 0x80, 0x1A, 0xCD, 0x95, 0x00, 0xCD, 0x96, 0x00, 0x13, 0x7B,
|
|
0xFE, 0x34, 0x20, 0xF3, 0x11, 0xD8, 0x00, 0x06, 0x08, 0x1A, 0x13, 0x22,
|
|
0x23, 0x05, 0x20, 0xF9, 0x3E, 0x19, 0xEA, 0x10, 0x99, 0x21, 0x2F, 0x99,
|
|
0x0E, 0x0C, 0x3D, 0x28, 0x08, 0x32, 0x0D, 0x20, 0xF9, 0x2E, 0x0F, 0x18,
|
|
0xF3, 0x67, 0x3E, 0x64, 0x57, 0xE0, 0x42, 0x3E, 0x91, 0xE0, 0x40, 0x04,
|
|
0x1E, 0x02, 0x0E, 0x0C, 0xF0, 0x44, 0xFE, 0x90, 0x20, 0xFA, 0x0D, 0x20,
|
|
0xF7, 0x1D, 0x20, 0xF2, 0x0E, 0x13, 0x24, 0x7C, 0x1E, 0x83, 0xFE, 0x62,
|
|
0x28, 0x06, 0x1E, 0xC1, 0xFE, 0x64, 0x20, 0x06, 0x7B, 0xE2, 0x0C, 0x3E,
|
|
0x87, 0xF2, 0xF0, 0x42, 0x90, 0xE0, 0x42, 0x15, 0x20, 0xD2, 0x05, 0x20,
|
|
0x4F, 0x16, 0x20, 0x18, 0xCB, 0x4F, 0x06, 0x04, 0xC5, 0xCB, 0x11, 0x17,
|
|
0xC1, 0xCB, 0x11, 0x17, 0x05, 0x20, 0xF5, 0x22, 0x23, 0x22, 0x23, 0xC9,
|
|
0xCE, 0xED, 0x66, 0x66, 0xCC, 0x0D, 0x00, 0x0B, 0x03, 0x73, 0x00, 0x83,
|
|
0x00, 0x0C, 0x00, 0x0D, 0x00, 0x08, 0x11, 0x1F, 0x88, 0x89, 0x00, 0x0E,
|
|
0xDC, 0xCC, 0x6E, 0xE6, 0xDD, 0xDD, 0xD9, 0x99, 0xBB, 0xBB, 0x67, 0x63,
|
|
0x6E, 0x0E, 0xEC, 0xCC, 0xDD, 0xDC, 0x99, 0x9F, 0xBB, 0xB9, 0x33, 0x3E,
|
|
0x3c, 0x42, 0xB9, 0xA5, 0xB9, 0xA5, 0x42, 0x4C, 0x21, 0x04, 0x01, 0x11,
|
|
0xA8, 0x00, 0x1A, 0x13, 0xBE, 0x20, 0xFE, 0x23, 0x7D, 0xFE, 0x34, 0x20,
|
|
0xF5, 0x06, 0x19, 0x78, 0x86, 0x23, 0x05, 0x20, 0xFB, 0x86, 0x20, 0xFE,
|
|
0x3E, 0x01, 0xE0, 0x50
|
|
].freeze
|
|
|
|
attr_reader :cartridge
|
|
|
|
def initialize(cartridge)
|
|
@cartridge = cartridge
|
|
end
|
|
|
|
# Read bootstrap instruction given an index (memory location)
|
|
def [](i)
|
|
ROM[i] || @cartridge[i]
|
|
end
|
|
|
|
def []=(i, v)
|
|
@cartridge[i] = v
|
|
end
|
|
end
|
|
end
|