class Rnes::Emulator

Public Class Methods

new(log_file_path: nil) click to toggle source

@param [String] log_file_path

# File lib/rnes/emulator.rb, line 9
def initialize(log_file_path: nil)
  parts_factory = ::Rnes::PartsFactory.new
  @cpu = parts_factory.cpu
  @cpu_bus = parts_factory.cpu_bus
  @dma_controller = parts_factory.dma_controller
  @keypad1 = parts_factory.keypad1
  @keypad2 = parts_factory.keypad2
  @ppu = parts_factory.ppu
  @ppu_bus = parts_factory.ppu_bus
  if log_file_path
    @logger = ::Rnes::Logger.new(cpu: @cpu, path: log_file_path, ppu: @ppu)
  end
end

Public Instance Methods

load_rom(rom_bytes) click to toggle source

@param [Array<Integer>] rom_bytes

# File lib/rnes/emulator.rb, line 24
def load_rom(rom_bytes)
  rom_loader = ::Rnes::RomLoader.new(rom_bytes)
  copy(from: rom_loader.character_rom, to: @ppu_bus.character_ram)
  @cpu_bus.program_rom = rom_loader.program_rom
  @cpu.reset
end
run() click to toggle source
# File lib/rnes/emulator.rb, line 31
def run
  allow_break_less_input
  $stdin.noecho do
    loop do
      if @logger
        @logger.puts
      end
      step
    end
  end
ensure
  disallow_break_less_input
end
step() click to toggle source
# File lib/rnes/emulator.rb, line 45
def step
  @dma_controller.transfer_if_requested
  (@cpu.step * 3).times do
    @ppu.step
  end
  @keypad1.check
  @keypad2.check
end

Private Instance Methods

allow_break_less_input() click to toggle source
# File lib/rnes/emulator.rb, line 56
def allow_break_less_input
  `stty -icanon min 1 time 0`
end
copy(from:, to:) click to toggle source

@param [Rnes::Rom] from @param [Rnes::Ram] to

# File lib/rnes/emulator.rb, line 66
def copy(from:, to:)
  from.bytesize.times do |address|
    value = from.read(address)
    to.write(address, value)
  end
end
disallow_break_less_input() click to toggle source
# File lib/rnes/emulator.rb, line 60
def disallow_break_less_input
  `stty icanon`
end