diff --git a/src/crab/gb/apu.cr b/src/crab/gb/apu.cr index 6735f6d..8b772a6 100644 --- a/src/crab/gb/apu.cr +++ b/src/crab/gb/apu.cr @@ -1,5 +1,5 @@ -require "./audio/abstract_channels" # so that channels don't need to all import -require "./audio/*" +require "./apu/abstract_channels" # so that channels don't need to all import +require "./apu/*" module GB class APU diff --git a/src/crab/gb/audio/abstract_channels.cr b/src/crab/gb/apu/abstract_channels.cr similarity index 100% rename from src/crab/gb/audio/abstract_channels.cr rename to src/crab/gb/apu/abstract_channels.cr diff --git a/src/crab/gb/audio/channel1.cr b/src/crab/gb/apu/channel1.cr similarity index 100% rename from src/crab/gb/audio/channel1.cr rename to src/crab/gb/apu/channel1.cr diff --git a/src/crab/gb/audio/channel2.cr b/src/crab/gb/apu/channel2.cr similarity index 100% rename from src/crab/gb/audio/channel2.cr rename to src/crab/gb/apu/channel2.cr diff --git a/src/crab/gb/audio/channel3.cr b/src/crab/gb/apu/channel3.cr similarity index 100% rename from src/crab/gb/audio/channel3.cr rename to src/crab/gb/apu/channel3.cr diff --git a/src/crab/gb/audio/channel4.cr b/src/crab/gb/apu/channel4.cr similarity index 100% rename from src/crab/gb/audio/channel4.cr rename to src/crab/gb/apu/channel4.cr diff --git a/src/crab/gba/apu.cr b/src/crab/gba/apu.cr index 4f51388..8830ccc 100644 --- a/src/crab/gba/apu.cr +++ b/src/crab/gba/apu.cr @@ -136,13 +136,13 @@ module GBA @dma_channels.timer_overflow timer end - def read_io(io_addr : Int) : UInt8 + def [](io_addr : Int) : UInt8 case io_addr - when @channel1 then @channel1.read_io io_addr - when @channel2 then @channel2.read_io io_addr - when @channel3 then @channel3.read_io io_addr - when @channel4 then @channel4.read_io io_addr - when @dma_channels then @dma_channels.read_io io_addr + when @channel1 then @channel1[io_addr] + when @channel2 then @channel2[io_addr] + when @channel3 then @channel3[io_addr] + when @channel4 then @channel4[io_addr] + when @dma_channels then @dma_channels[io_addr] when 0x80 then @soundcnt_l.value.to_u8! when 0x81 then (@soundcnt_l.value >> 8).to_u8! when 0x82 then @soundcnt_h.value.to_u8! @@ -162,21 +162,21 @@ module GBA end # write to apu memory - def write_io(io_addr : Int, value : UInt8) : Nil + def []=(io_addr : Int, value : UInt8) : Nil return unless @sound_enabled || 0x82 <= io_addr <= 0x89 || Channel3::WAVE_RAM_RANGE.includes?(io_addr) case io_addr - when @channel1 then @channel1.write_io io_addr, value - when @channel2 then @channel2.write_io io_addr, value - when @channel3 then @channel3.write_io io_addr, value - when @channel4 then @channel4.write_io io_addr, value - when @dma_channels then @dma_channels.write_io io_addr, value + when @channel1 then @channel1[io_addr] = value + when @channel2 then @channel2[io_addr] = value + when @channel3 then @channel3[io_addr] = value + when @channel4 then @channel4[io_addr] = value + when @dma_channels then @dma_channels[io_addr] = value when 0x80 then @soundcnt_l.value = (@soundcnt_l.value & 0xFF00) | value when 0x81 then @soundcnt_l.value = (@soundcnt_l.value & 0x00FF) | value.to_u16 << 8 when 0x82 then @soundcnt_h.value = (@soundcnt_h.value & 0xFF00) | value when 0x83 then @soundcnt_h.value = (@soundcnt_h.value & 0x00FF) | value.to_u16 << 8 when 0x84 if value & 0x80 == 0 && @sound_enabled - (0x60..0x81).each { |addr| self.write_io addr, 0x00 } + (0x60..0x81).each { |addr| self[addr] = 0x00 } @sound_enabled = false elsif value & 0x80 > 0 && !@sound_enabled @sound_enabled = true diff --git a/src/crab/gba/apu/abstract_channels.cr b/src/crab/gba/apu/abstract_channels.cr index 491fd02..ff96f5b 100644 --- a/src/crab/gba/apu/abstract_channels.cr +++ b/src/crab/gba/apu/abstract_channels.cr @@ -42,8 +42,8 @@ module GBA abstract def get_amplitude : Int16 - abstract def read_io(index : Int) : UInt8 - abstract def write_io(index : Int, value : UInt8) : Nil + abstract def [](index : Int) : UInt8 + abstract def []=(index : Int, value : UInt8) : Nil end abstract class VolumeEnvelopeChannel < SoundChannel diff --git a/src/crab/gba/apu/channel1.cr b/src/crab/gba/apu/channel1.cr index 3ead9b7..d8097c5 100644 --- a/src/crab/gba/apu/channel1.cr +++ b/src/crab/gba/apu/channel1.cr @@ -77,7 +77,7 @@ module GBA calculated end - def read_io(index : Int) : UInt8 + def [](index : Int) : UInt8 case index when 0x60 then 0x80_u8 | @sweep_period << 4 | (@negate ? 0x08 : 0) | @shift when 0x62 then 0x3F_u8 | @duty << 6 @@ -88,7 +88,7 @@ module GBA end end - def write_io(index : Int, value : UInt8) : Nil + def []=(index : Int, value : UInt8) : Nil case index when 0x60 @sweep_period = (value & 0x70) >> 4 diff --git a/src/crab/gba/apu/channel2.cr b/src/crab/gba/apu/channel2.cr index d467931..8ca9fa4 100644 --- a/src/crab/gba/apu/channel2.cr +++ b/src/crab/gba/apu/channel2.cr @@ -43,7 +43,7 @@ module GBA end end - def read_io(index : Int) : UInt8 + def [](index : Int) : UInt8 case index when 0x68 then 0x3F_u8 | @duty << 6 when 0x69 then read_NRx2 @@ -53,7 +53,7 @@ module GBA end end - def write_io(index : Int, value : UInt8) : Nil + def []=(index : Int, value : UInt8) : Nil case index when 0x68 @duty = (value & 0xC0) >> 6 diff --git a/src/crab/gba/apu/channel3.cr b/src/crab/gba/apu/channel3.cr index d0f353c..379cc7a 100644 --- a/src/crab/gba/apu/channel3.cr +++ b/src/crab/gba/apu/channel3.cr @@ -49,7 +49,7 @@ module GBA end end - def read_io(index : Int) : UInt8 + def [](index : Int) : UInt8 case index when 0x70 then 0x7F_u8 | (@dac_enabled ? 0x80 : 0) when 0x72 then 0xFF_u8 @@ -66,7 +66,7 @@ module GBA end end - def write_io(index : Int, value : UInt8) : Nil + def []=(index : Int, value : UInt8) : Nil case index when 0x70 @dac_enabled = value & 0x80 > 0 diff --git a/src/crab/gba/apu/channel4.cr b/src/crab/gba/apu/channel4.cr index c6b6681..89ebe07 100644 --- a/src/crab/gba/apu/channel4.cr +++ b/src/crab/gba/apu/channel4.cr @@ -43,7 +43,7 @@ module GBA end end - def read_io(index : Int) : UInt8 + def [](index : Int) : UInt8 case index when 0x78 then 0xFF_u8 when 0x79 then read_NRx2 @@ -53,7 +53,7 @@ module GBA end end - def write_io(index : Int, value : UInt8) : Nil + def []=(index : Int, value : UInt8) : Nil case index when 0x78 @length_load = value & 0x3F diff --git a/src/crab/gba/apu/dma_channels.cr b/src/crab/gba/apu/dma_channels.cr index 156769d..46434aa 100644 --- a/src/crab/gba/apu/dma_channels.cr +++ b/src/crab/gba/apu/dma_channels.cr @@ -19,11 +19,11 @@ module GBA ] end - def read_io(index : Int) : UInt8 + def [](index : Int) : UInt8 0_u8 end - def write_io(index : Int, value : Byte) : Nil + def []=(index : Int, value : Byte) : Nil channel = bit?(index, 2).to_unsafe if @sizes[channel] < 32 @fifos[channel][(@positions[channel] + @sizes[channel]) % 32] = value.to_i8! diff --git a/src/crab/gba/dma.cr b/src/crab/gba/dma.cr index 8c58285..98aabe3 100644 --- a/src/crab/gba/dma.cr +++ b/src/crab/gba/dma.cr @@ -41,7 +41,7 @@ module GBA ->{ @gba.interrupts.reg_if.dma2 = true }, ->{ @gba.interrupts.reg_if.dma3 = true }] end - def read_io(io_addr : Int) : UInt8 + def [](io_addr : Int) : UInt8 return 0_u8 if io_addr >= 0xE0 # todo: OOB read channel = (io_addr - 0xB0) // 12 reg = (io_addr - 0xB0) % 12 @@ -58,7 +58,7 @@ module GBA end end - def write_io(io_addr : Int, value : UInt8) : Nil + def []=(io_addr : Int, value : UInt8) : Nil return if io_addr >= 0xE0 # todo: OOB write channel = (io_addr - 0xB0) // 12 reg = (io_addr - 0xB0) % 12 diff --git a/src/crab/gba/interrupts.cr b/src/crab/gba/interrupts.cr index 8fb54bd..4a0f048 100644 --- a/src/crab/gba/interrupts.cr +++ b/src/crab/gba/interrupts.cr @@ -25,7 +25,7 @@ module GBA def initialize(@gba : GBA) end - def read_io(io_addr : Int) : Byte + def [](io_addr : Int) : Byte case io_addr when 0x200 then 0xFF_u8 & @reg_ie.value when 0x201 then 0xFF_u8 & @reg_ie.value >> 8 @@ -37,7 +37,7 @@ module GBA end end - def write_io(io_addr : Int, value : Byte) : Nil + def []=(io_addr : Int, value : Byte) : Nil case io_addr when 0x200 then @reg_ie.value = (@reg_ie.value & 0xFF00) | value when 0x201 then @reg_ie.value = (@reg_ie.value & 0x00FF) | value.to_u16 << 8 diff --git a/src/crab/gba/keypad.cr b/src/crab/gba/keypad.cr index 4c2268e..b2ef53d 100644 --- a/src/crab/gba/keypad.cr +++ b/src/crab/gba/keypad.cr @@ -36,7 +36,7 @@ module GBA def initialize(@gba : GBA) end - def read_io(io_addr : Int) : Byte + def [](io_addr : Int) : Byte case io_addr when 0x130 then 0xFF_u8 & @keyinput.value when 0x131 then 0xFF_u8 & @keyinput.value >> 8 @@ -46,7 +46,7 @@ module GBA end end - def write_io(io_addr : Int, value : Byte) : Nil + def []=(io_addr : Int, value : Byte) : Nil case io_addr when 0x130 then nil when 0x131 then nil diff --git a/src/crab/gba/mmio.cr b/src/crab/gba/mmio.cr index 3430a29..3340e9d 100644 --- a/src/crab/gba/mmio.cr +++ b/src/crab/gba/mmio.cr @@ -22,15 +22,15 @@ module GBA def [](index : Int) : Byte io_addr = 0xFFFFFF_u32 & index if io_addr <= 0x05F - @gba.ppu.read_io io_addr + @gba.ppu[io_addr] elsif io_addr <= 0xAF - @gba.apu.read_io io_addr + @gba.apu[io_addr] elsif io_addr <= 0xFF - @gba.dma.read_io io_addr + @gba.dma[io_addr] elsif 0x100 <= io_addr <= 0x10F - @gba.timer.read_io io_addr + @gba.timer[io_addr] elsif 0x130 <= io_addr <= 0x133 - @gba.keypad.read_io io_addr + @gba.keypad[io_addr] elsif 0x120 <= io_addr <= 0x12F || 0x134 <= io_addr <= 0x1FF # todo: serial if io_addr == 0x135 @@ -39,7 +39,7 @@ module GBA 0_u8 end elsif 0x200 <= io_addr <= 0x203 || 0x208 <= io_addr <= 0x209 - @gba.interrupts.read_io io_addr + @gba.interrupts[io_addr] elsif 0x204 <= io_addr <= 0x205 (@waitcnt.value >> (8 * (io_addr & 1))).to_u8! else @@ -50,19 +50,19 @@ module GBA def []=(index : Int, value : Byte) : Nil io_addr = 0xFFFFFF_u32 & index if io_addr <= 0x05F - @gba.ppu.write_io io_addr, value + @gba.ppu[io_addr] = value elsif io_addr <= 0xAF - @gba.apu.write_io io_addr, value + @gba.apu[io_addr] = value elsif io_addr <= 0xFF - @gba.dma.write_io io_addr, value + @gba.dma[io_addr] = value elsif 0x100 <= io_addr <= 0x10F - @gba.timer.write_io io_addr, value + @gba.timer[io_addr] = value elsif 0x130 <= io_addr <= 0x133 - @gba.keypad.read_io io_addr + @gba.keypad[io_addr] elsif 0x120 <= io_addr <= 0x12F || 0x134 <= io_addr <= 0x1FF # todo: serial elsif 0x200 <= io_addr <= 0x203 || 0x208 <= io_addr <= 0x209 - @gba.interrupts.write_io io_addr, value + @gba.interrupts[io_addr] = value elsif 0x204 <= io_addr <= 0x205 shift = 8 * (io_addr & 1) mask = 0xFF00_u16 >> shift diff --git a/src/crab/gba/ppu.cr b/src/crab/gba/ppu.cr index bb2fb63..688e699 100644 --- a/src/crab/gba/ppu.cr +++ b/src/crab/gba/ppu.cr @@ -385,7 +385,7 @@ module GBA end end - def read_io(io_addr : Int) : Byte + def [](io_addr : Int) : Byte case io_addr when 0x000..0x001 then @dispcnt.read_byte(io_addr & 1) when 0x002..0x003 then 0_u8 # todo green swap @@ -422,7 +422,7 @@ module GBA end end - def write_io(io_addr : Int, value : Byte) : Nil + def []=(io_addr : Int, value : Byte) : Nil case io_addr when 0x000..0x001 then @dispcnt.write_byte(io_addr & 1, value) when 0x002..0x003 # undocumented - green swap diff --git a/src/crab/gba/timer.cr b/src/crab/gba/timer.cr index 906048b..158338d 100644 --- a/src/crab/gba/timer.cr +++ b/src/crab/gba/timer.cr @@ -51,7 +51,7 @@ module GBA @cycle_enabled[num] = @gba.scheduler.cycles end - def read_io(io_addr : Int) : UInt8 + def [](io_addr : Int) : UInt8 num = (io_addr & 0xF) // 4 value = if bit?(io_addr, 1) @tmcnt[num].value @@ -62,7 +62,7 @@ module GBA value.to_u8! end - def write_io(io_addr : Int, value : UInt8) : Nil + def []=(io_addr : Int, value : UInt8) : Nil num = (io_addr & 0xF) // 4 high = bit?(io_addr, 0) mask = 0xFF00_u16