abstract common keyboard input between emus

This commit is contained in:
Matthew Berry 2021-05-08 01:08:16 -07:00
parent fceb5ee988
commit f6fdd071d1
8 changed files with 72 additions and 47 deletions

View file

@ -47,14 +47,12 @@ module Crab
end end
if rom.not_nil!.ends_with?(".gba") if rom.not_nil!.ends_with?(".gba")
gba = GBA::GBA.new bios.not_nil!, rom.not_nil! emu = GBA::GBA.new bios.not_nil!, rom.not_nil!
gba.post_init
gba.run
else else
gb = GB::GB.new bios, rom.not_nil!, fifo, sync, headless emu = GB::GB.new bios, rom.not_nil!, fifo, sync, headless
gb.post_init
gb.run
end end
emu.post_init
emu.run
end end
end end

29
src/crab/common/emu.cr Normal file
View file

@ -0,0 +1,29 @@
abstract class Emu
def post_init : Nil
end
abstract def scheduler : Scheduler
abstract def run : Nil
abstract def handle_event(event : SDL::Event) : Nil
abstract def toggle_sync : Nil
abstract def toggle_blending : Nil
def handle_events(interval : Int) : Nil
scheduler.schedule interval, Proc(Nil).new { handle_events interval }
while event = SDL::Event.poll
case event
when SDL::Event::Quit then exit 0
when SDL::Event::JoyHat,
SDL::Event::JoyButton then handle_event(event)
when SDL::Event::Keyboard
case event.sym
when .tab? then toggle_sync if event.pressed?
when .m? then toggle_blending if event.pressed?
when .q? then exit 0
else handle_event(event)
end
else nil
end
end
end
end

View file

@ -29,7 +29,7 @@ module GB
@audiospec : LibSDL::AudioSpec @audiospec : LibSDL::AudioSpec
@obtained_spec : LibSDL::AudioSpec @obtained_spec : LibSDL::AudioSpec
setter sync : Bool @sync : Bool = true
def initialize(@gb : GB, headless : Bool, @sync : Bool) def initialize(@gb : GB, headless : Bool, @sync : Bool)
@sync = false if headless @sync = false if headless
@ -57,6 +57,10 @@ module GB
LibSDL.pause_audio 0 unless headless LibSDL.pause_audio 0 unless headless
end end
def toggle_sync : Nil
@sync = !@sync
end
def tick_frame_sequencer : Nil def tick_frame_sequencer : Nil
@first_half_of_length_period = @frame_sequencer_stage & 1 == 0 @first_half_of_length_period = @frame_sequencer_stage & 1 == 0
case @frame_sequencer_stage case @frame_sequencer_stage

View file

@ -16,7 +16,7 @@ require "./timer"
DISPLAY_SCALE = {% unless flag? :graphics_test %} 4 {% else %} 1 {% end %} DISPLAY_SCALE = {% unless flag? :graphics_test %} 4 {% else %} 1 {% end %}
module GB module GB
class GB class GB < Emu
getter bootrom : String? getter bootrom : String?
getter cgb_ptr : Pointer(Bool) { pointerof(@cgb_enabled) } getter cgb_ptr : Pointer(Bool) { pointerof(@cgb_enabled) }
getter cartridge : Cartridge getter cartridge : Cartridge
@ -60,24 +60,23 @@ module GB
timer.skip_boot timer.skip_boot
end end
def handle_events : Nil
while event = SDL::Event.poll
case event
when SDL::Event::Quit then exit 0
when SDL::Event::Keyboard,
SDL::Event::JoyHat,
SDL::Event::JoyButton then joypad.handle_joypad_event event
else nil
end
end
scheduler.schedule_gb 70224, ->handle_events, Scheduler::EventType::HandleInput
end
def run : Nil def run : Nil
handle_events handle_events(70224)
loop do loop do
cpu.tick cpu.tick
end end
end end
def handle_event(event : SDL::Event) : Nil
joypad.handle_joypad_event event
end
def toggle_sync : Nil
apu.toggle_sync
end
def toggle_blending : Nil
puts "Blending not implemented for gb/gbc"
end
end end
end end

View file

@ -47,7 +47,6 @@ module GB
when .l? then @select = event.pressed? when .l? then @select = event.pressed?
when .b?, .j? then @b = event.pressed? when .b?, .j? then @b = event.pressed?
when .a?, .k? then @a = event.pressed? when .a?, .k? then @a = event.pressed?
when .tab? then @gb.apu.sync = !event.pressed?
else nil else nil
end end
when SDL::Event::JoyHat when SDL::Event::JoyHat

View file

@ -51,7 +51,7 @@ module GBA
LibSDL.pause_audio 0 LibSDL.pause_audio 0
end end
def toggle_sync def toggle_sync : Nil
@sync = !@sync @sync = !@sync
end end

View file

@ -16,7 +16,7 @@ require "./dma"
require "./debugger" require "./debugger"
module GBA module GBA
class GBA class GBA < Emu
getter! scheduler : Scheduler getter! scheduler : Scheduler
getter! cartridge : Cartridge getter! cartridge : Cartridge
getter! storage : Storage getter! storage : Storage
@ -36,7 +36,6 @@ module GBA
@scheduler = Scheduler.new @scheduler = Scheduler.new
@cartridge = Cartridge.new rom_path @cartridge = Cartridge.new rom_path
@storage = Storage.new rom_path @storage = Storage.new rom_path
handle_events
handle_saves handle_saves
SDL.init(SDL::Init::VIDEO | SDL::Init::AUDIO | SDL::Init::JOYSTICK) SDL.init(SDL::Init::VIDEO | SDL::Init::AUDIO | SDL::Init::JOYSTICK)
@ -58,29 +57,29 @@ module GBA
@debugger = Debugger.new self @debugger = Debugger.new self
end end
def handle_events : Nil def run : Nil
scheduler.schedule 280896, ->handle_events handle_events(280896)
while event = SDL::Event.poll loop do
case event {% if flag? :debugger %} debugger.check_debug {% end %}
when SDL::Event::Quit then exit 0 cpu.tick
when SDL::Event::Keyboard,
SDL::Event::JoyHat,
SDL::Event::JoyButton then keypad.handle_keypad_event event
else nil
end
end end
end end
def handle_event(event : SDL::Event) : Nil
keypad.handle_keypad_event event
end
def toggle_sync : Nil
apu.toggle_sync
end
def toggle_blending : Nil
display.toggle_blending
end
def handle_saves : Nil def handle_saves : Nil
scheduler.schedule 280896, ->handle_saves scheduler.schedule 280896, ->handle_saves
storage.write_save storage.write_save
end end
def run : Nil
loop do
{% if flag? :debugger %} debugger.check_debug {% end %}
cpu.tick
end
end
end end
end end

View file

@ -69,10 +69,7 @@ module GBA
when .a?, .k? then @keyinput.a = bit when .a?, .k? then @keyinput.a = bit
when .w? then @keyinput.l = bit when .w? then @keyinput.l = bit
when .r? then @keyinput.r = bit when .r? then @keyinput.r = bit
# Extras else nil
when .tab? then @gba.apu.toggle_sync if event.pressed?
when .m? then @gba.display.toggle_blending if event.pressed?
else nil
end end
when SDL::Event::JoyHat when SDL::Event::JoyHat
@keyinput.value |= 0x00F0 @keyinput.value |= 0x00F0