From 21af1f0bf6f443f28fb414ee0137f7093d6970fb Mon Sep 17 00:00:00 2001 From: Safiire Date: Fri, 22 Sep 2017 03:00:54 -0700 Subject: [PATCH] Added Bank switching code --- lib/n65/directives/ines_header.rb | 62 ++++++++++++++++++++++++++----- lib/n65/version.rb | 2 +- 2 files changed, 54 insertions(+), 10 deletions(-) diff --git a/lib/n65/directives/ines_header.rb b/lib/n65/directives/ines_header.rb index f0ed189..5d7a990 100644 --- a/lib/n65/directives/ines_header.rb +++ b/lib/n65/directives/ines_header.rb @@ -3,12 +3,12 @@ require_relative '../instruction_base' module N65 - #### - ## This directive instruction can setup an ines header + ## This directive instruction can setup an iNES header class INESHeader < InstructionBase - attr_reader :prog, :char, :mapper, :mirror + attr_reader :prog, :char, :mapper, :mirror, :battery_backed, :fourscreen_vram, :prog_ram, :tv + Defaults = {prog: 1, char: 0, mapper: 0, mirror: 0, battery_backed: 0, fourscreen_vram: 0, prog_ram: 0, tv: 0} #### ## Implementation of the parser for this directive @@ -17,14 +17,36 @@ module N65 return nil if match_data.nil? header = JSON.parse(match_data[1]) - INESHeader.new(header['prog'], header['char'], header['mapper'], header['mirror']) + header = header.inject({}) do |hash, (key, val)| + hash[key.to_sym] = val + hash + end + + header = Defaults.merge(header) + + INESHeader.new( + header[:prog], + header[:char], + header[:mapper], + header[:mirror], + header[:battery_backed], + header[:fourscreen_vram], + header[:prog_ram], + header[:tv]) end #### ## Construct a header - def initialize(prog, char, mapper, mirror) - @prog, @char, @mapper, @mirror = prog, char, mapper, mirror + def initialize(prog, char, mapper, mirror, battery_backed, fourscreen_vram, prog_ram, tv) + @prog = prog + @char = char + @mapper = mapper + @mirror = mirror + @battery_backed = battery_backed + @fourscreen_vram = fourscreen_vram + @prog_ram = prog_ram + @tv = tv end @@ -36,16 +58,38 @@ module N65 #### - ## Emit the header bytes, this is not exactly right, but it works for now. + ## Emit the header bytes def emit_bytes - [0x4E, 0x45, 0x53, 0x1a, @prog, @char, @mapper, @mirror, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0] + + mapper_lo_nybble = (@mapper & 0x0f) + mapper_hi_nybble = (@mapper & 0xf0) >> 4 + + flag6 = 0 + flag6 |= 0x1 if @mirror == 1 + flag6 |= 0x2 if @battery_backed == 1 + flag6 |= 0x8 if @fourscreen_vram == 1 + flag6 |= (mapper_lo_nybble << 4) + + flag7 = 0 + flag7 |= (mapper_hi_nybble << 4) + + [0x4E, 0x45, 0x53, 0x1a, + @prog & 0xff, + @char & 0xff, + flag6 & 0xff, + flag7 & 0xff, + @prog_ram & 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0] end #### ## Display def to_s - ".ines {\"prog\": #{@prog}, \"char\": #{@char}, \"mapper\": #{@mapper}, \"mirror\": #{@mirror}}" + [".ines {\"prog\": #{@prog}, \"char\": #{@char}, \"mapper\": #{@mapper}, ", + "\"mirror\": #{@mirror}}, \"battery_backed\": #{@battery_backed}, ", + "\"fourscreen_vram\": #{@fourscreen_vram}, \"prog_ram\": #{@prog_ram}, ", + "\"tv\": #{@tv}"].join end end diff --git a/lib/n65/version.rb b/lib/n65/version.rb index 02c9b57..af41b19 100644 --- a/lib/n65/version.rb +++ b/lib/n65/version.rb @@ -1,3 +1,3 @@ module N65 - VERSION ||= "1.0.0" + VERSION ||= "1.1.0" end