rubyboy 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/rubyboy/lcd.rb CHANGED
@@ -1,38 +1,48 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'raylib'
3
+ require 'rubyboy/sdl'
4
4
 
5
5
  module Rubyboy
6
6
  class Lcd
7
- include Raylib
8
-
9
- WIDTH = 160
10
- HEIGHT = 144
11
- SCALE = 4
7
+ SCREEN_WIDTH = 160
8
+ SCREEN_HEIGHT = 144
9
+ SCALE = 3
12
10
 
13
11
  def initialize
14
- InitWindow(WIDTH * SCALE, HEIGHT * SCALE, 'RUBY BOY')
15
- image = GenImageColor(WIDTH, HEIGHT, BLACK)
16
- image.format = PIXELFORMAT_UNCOMPRESSED_R8G8B8
17
- @texture = LoadTextureFromImage(image)
18
- @vector = Vector2.create(0, 0)
19
- end
12
+ raise SDL.GetError() if SDL.InitSubSystem(SDL::INIT_VIDEO) != 0
13
+
14
+ @buffer = FFI::MemoryPointer.new(:uint8, SCREEN_WIDTH * SCREEN_HEIGHT * 3)
15
+ @window = SDL.CreateWindow('RUBY BOY', 0, 0, SCREEN_WIDTH * SCALE, SCREEN_HEIGHT * SCALE, SDL::SDL_WINDOW_RESIZABLE)
20
16
 
21
- def draw(pixel_data)
22
- UpdateTexture(@texture, pixel_data)
17
+ raise SDL.GetError() if @window.null?
23
18
 
24
- BeginDrawing()
25
- ClearBackground(BLACK)
26
- DrawTextureEx(@texture, @vector, 0.0, SCALE, WHITE)
27
- EndDrawing()
19
+ @renderer = SDL.CreateRenderer(@window, -1, 0)
20
+ SDL.SetHint('SDL_HINT_RENDER_SCALE_QUALITY', '2')
21
+ SDL.RenderSetLogicalSize(@renderer, SCREEN_WIDTH * SCALE, SCREEN_HEIGHT * SCALE)
22
+ @texture = SDL.CreateTexture(@renderer, SDL::PIXELFORMAT_RGB24, 1, SCREEN_WIDTH, SCREEN_HEIGHT)
23
+ @event = FFI::MemoryPointer.new(:pointer)
24
+ end
25
+
26
+ def draw(framebuffer)
27
+ @buffer.write_array_of_uint8(framebuffer)
28
+ SDL.UpdateTexture(@texture, nil, @buffer, SCREEN_WIDTH * 3)
29
+ SDL.RenderClear(@renderer)
30
+ SDL.RenderCopy(@renderer, @texture, nil, nil)
31
+ SDL.RenderPresent(@renderer)
28
32
  end
29
33
 
30
34
  def window_should_close?
31
- WindowShouldClose()
35
+ while SDL.PollEvent(@event) != 0
36
+ event_type = @event.read_int
37
+ return true if event_type == SDL::QUIT
38
+ end
39
+
40
+ false
32
41
  end
33
42
 
34
43
  def close_window
35
- CloseWindow()
44
+ SDL.DestroyWindow(@window)
45
+ SDL.Quit
36
46
  end
37
47
  end
38
48
  end
data/lib/rubyboy/ppu.rb CHANGED
@@ -64,7 +64,7 @@ module Rubyboy
64
64
  @wly = 0x00
65
65
  @cycles = 0
66
66
  @interrupt = interrupt
67
- @buffer = Array.new(144 * 160, 0x00)
67
+ @buffer = Array.new(144 * 160 * 3, 0x00)
68
68
  @bg_pixels = Array.new(LCD_WIDTH, 0x00)
69
69
  end
70
70
 
@@ -196,7 +196,11 @@ module Rubyboy
196
196
  x = (i + @scx) % 256
197
197
  tile_index = get_tile_index(tile_map_addr + (x / 8))
198
198
  pixel = get_pixel(tile_index << 4, 7 - (x % 8), (y % 8) * 2)
199
- @buffer[@ly * LCD_WIDTH + i] = get_color(@bgp, pixel)
199
+ color = get_color(@bgp, pixel)
200
+ base = @ly * LCD_WIDTH * 3 + i * 3
201
+ @buffer[base] = color
202
+ @buffer[base + 1] = color
203
+ @buffer[base + 2] = color
200
204
  @bg_pixels[i] = pixel
201
205
  end
202
206
  end
@@ -215,7 +219,11 @@ module Rubyboy
215
219
  x = i - (@wx - 7)
216
220
  tile_index = get_tile_index(tile_map_addr + (x / 8))
217
221
  pixel = get_pixel(tile_index << 4, 7 - (x % 8), (y % 8) * 2)
218
- @buffer[@ly * LCD_WIDTH + i] = get_color(@bgp, pixel)
222
+ color = get_color(@bgp, pixel)
223
+ base = @ly * LCD_WIDTH * 3 + i * 3
224
+ @buffer[base] = color
225
+ @buffer[base + 1] = color
226
+ @buffer[base + 2] = color
219
227
  @bg_pixels[i] = pixel
220
228
  end
221
229
  @wly += 1 if rendered
@@ -258,7 +266,11 @@ module Rubyboy
258
266
  next if pixel == 0 || i >= LCD_WIDTH
259
267
  next if flags[SPRITE_FLAGS[:priority]] == 1 && @bg_pixels[i] != 0
260
268
 
261
- @buffer[@ly * LCD_WIDTH + i] = get_color(pallet, pixel)
269
+ color = get_color(pallet, pixel)
270
+ base = @ly * LCD_WIDTH * 3 + i * 3
271
+ @buffer[base] = color
272
+ @buffer[base + 1] = color
273
+ @buffer[base + 2] = color
262
274
  end
263
275
  end
264
276
  end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'raylib'
4
+
5
+ module Rubyboy
6
+ module Raylib
7
+ class Audio
8
+ include Raylib
9
+
10
+ MAX_SAMPLES = 512
11
+
12
+ def initialize
13
+ InitAudioDevice()
14
+ SetAudioStreamBufferSizeDefault(MAX_SAMPLES * 2)
15
+ @stream = LoadAudioStream(48000, 32, 2)
16
+ PlayAudioStream(@stream)
17
+ end
18
+
19
+ def play(samples)
20
+ samples_pointer = FFI::MemoryPointer.new(:float, samples.size)
21
+ samples_pointer.put_array_of_float(0, samples)
22
+
23
+ UpdateAudioStream(@stream, samples_pointer, samples.size)
24
+ end
25
+
26
+ def close
27
+ UnloadAudioStream(@stream)
28
+ CloseAudioDevice()
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'raylib'
4
+
5
+ module Rubyboy
6
+ module Raylib
7
+ class Lcd
8
+ include Raylib
9
+
10
+ WIDTH = 160
11
+ HEIGHT = 144
12
+ SCALE = 4
13
+
14
+ def initialize
15
+ InitWindow(WIDTH * SCALE, HEIGHT * SCALE, 'RUBY BOY')
16
+ image = GenImageColor(WIDTH, HEIGHT, BLACK)
17
+ image.format = PIXELFORMAT_UNCOMPRESSED_R8G8B8
18
+ @texture = LoadTextureFromImage(image)
19
+ @vector = Vector2.create(0, 0)
20
+ end
21
+
22
+ def draw(pixel_data)
23
+ UpdateTexture(@texture, pixel_data.pack('C*'))
24
+
25
+ BeginDrawing()
26
+ ClearBackground(BLACK)
27
+ DrawTextureEx(@texture, @vector, 0.0, SCALE, WHITE)
28
+ EndDrawing()
29
+ end
30
+
31
+ def window_should_close?
32
+ WindowShouldClose()
33
+ end
34
+
35
+ def close_window
36
+ CloseWindow()
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'raylib'
4
+
5
+ module Rubyboy
6
+ module Raylib
7
+ class RaylibLoader
8
+ include Raylib
9
+
10
+ def load_raylib
11
+ shared_lib_path = "#{Gem::Specification.find_by_name('raylib-bindings').full_gem_path}/lib/"
12
+ case RUBY_PLATFORM
13
+ when /mswin|msys|mingw/ # Windows
14
+ Raylib.load_lib("#{shared_lib_path}libraylib.dll")
15
+ when /darwin/ # macOS
16
+ arch = RUBY_PLATFORM.split('-')[0]
17
+ Raylib.load_lib(shared_lib_path + "libraylib.#{arch}.dylib")
18
+ when /linux/ # Ubuntu Linux (x86_64 or aarch64)
19
+ arch = RUBY_PLATFORM.split('-')[0]
20
+ Raylib.load_lib(shared_lib_path + "libraylib.#{arch}.so")
21
+ else
22
+ raise "Unknown system: #{RUBY_PLATFORM}"
23
+ end
24
+
25
+ SetTraceLogLevel(LOG_ERROR)
26
+ end
27
+
28
+ def key_input_check
29
+ direction = (IsKeyUp(KEY_D) && 1 || 0) | ((IsKeyUp(KEY_A) && 1 || 0) << 1) | ((IsKeyUp(KEY_W) && 1 || 0) << 2) | ((IsKeyUp(KEY_S) && 1 || 0) << 3)
30
+ action = (IsKeyUp(KEY_K) && 1 || 0) | ((IsKeyUp(KEY_J) && 1 || 0) << 1) | ((IsKeyUp(KEY_U) && 1 || 0) << 2) | ((IsKeyUp(KEY_I) && 1 || 0) << 3)
31
+ @joypad.direction_button(direction)
32
+ @joypad.action_button(action)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Rubyboy
4
4
  class Registers
5
- attr_reader :value
5
+ attr_reader :a, :b, :c, :d, :e, :h, :l, :f
6
6
 
7
7
  def initialize
8
8
  @a = 0x01
@@ -15,66 +15,72 @@ module Rubyboy
15
15
  @f = 0xb0
16
16
  end
17
17
 
18
- def read8(register)
19
- case register
20
- when :a then @a
21
- when :b then @b
22
- when :c then @c
23
- when :d then @d
24
- when :e then @e
25
- when :h then @h
26
- when :l then @l
27
- when :f then @f
28
- end
29
- end
30
-
31
- def write8(register, value)
32
- value &= 0xff
33
- case register
34
- when :a then @a = value
35
- when :b then @b = value
36
- when :c then @c = value
37
- when :d then @d = value
38
- when :e then @e = value
39
- when :h then @h = value
40
- when :l then @l = value
41
- when :f then @f = value & 0xf0
42
- end
43
- end
44
-
45
- def read16(register)
46
- case register
47
- when :af then (@a << 8) | @f
48
- when :bc then (@b << 8) | @c
49
- when :de then (@d << 8) | @e
50
- when :hl then (@h << 8) | @l
51
- end
52
- end
53
-
54
- def write16(register, value)
55
- value &= 0xffff
56
- case register
57
- when :af
58
- @a = (value >> 8) & 0xff
59
- @f = value & 0xf0
60
- when :bc
61
- @b = (value >> 8) & 0xff
62
- @c = value & 0xff
63
- when :de
64
- @d = (value >> 8) & 0xff
65
- @e = value & 0xff
66
- when :hl
67
- @h = (value >> 8) & 0xff
68
- @l = value & 0xff
69
- end
70
- end
71
-
72
- def increment16(register)
73
- write16(register, read16(register) + 1)
74
- end
75
-
76
- def decrement16(register)
77
- write16(register, read16(register) - 1)
18
+ def a=(value)
19
+ @a = value & 0xff
20
+ end
21
+
22
+ def b=(value)
23
+ @b = value & 0xff
24
+ end
25
+
26
+ def c=(value)
27
+ @c = value & 0xff
28
+ end
29
+
30
+ def d=(value)
31
+ @d = value & 0xff
32
+ end
33
+
34
+ def e=(value)
35
+ @e = value & 0xff
36
+ end
37
+
38
+ def h=(value)
39
+ @h = value & 0xff
40
+ end
41
+
42
+ def l=(value)
43
+ @l = value & 0xff
44
+ end
45
+
46
+ def f=(value)
47
+ @f = value & 0xf0
48
+ end
49
+
50
+ def af
51
+ (@a << 8) | @f
52
+ end
53
+
54
+ def bc
55
+ (@b << 8) | @c
56
+ end
57
+
58
+ def de
59
+ (@d << 8) | @e
60
+ end
61
+
62
+ def hl
63
+ (@h << 8) | @l
64
+ end
65
+
66
+ def af=(value)
67
+ @a = (value >> 8) & 0xff
68
+ @f = value & 0xf0
69
+ end
70
+
71
+ def bc=(value)
72
+ @b = (value >> 8) & 0xff
73
+ @c = value & 0xff
74
+ end
75
+
76
+ def de=(value)
77
+ @d = (value >> 8) & 0xff
78
+ @e = value & 0xff
79
+ end
80
+
81
+ def hl=(value)
82
+ @h = (value >> 8) & 0xff
83
+ @l = value & 0xff
78
84
  end
79
85
  end
80
86
  end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ffi'
4
+
5
+ module Rubyboy
6
+ module SDL
7
+ extend FFI::Library
8
+ ffi_lib 'SDL2'
9
+
10
+ INIT_TIMER = 0x01
11
+ INIT_AUDIO = 0x10
12
+ INIT_VIDEO = 0x20
13
+ INIT_KEYBOARD = 0x200
14
+ WINDOW_RESIZABLE = 0x20
15
+ PIXELFORMAT_RGB24 = 386930691
16
+ SDL_WINDOW_RESIZABLE = 0x20
17
+ QUIT = 0x100
18
+
19
+ SDL_SCANCODE_W = 26
20
+ SDL_SCANCODE_A = 4
21
+ SDL_SCANCODE_S = 22
22
+ SDL_SCANCODE_D = 7
23
+ SDL_SCANCODE_J = 13
24
+ SDL_SCANCODE_K = 14
25
+ SDL_SCANCODE_U = 24
26
+ SDL_SCANCODE_I = 12
27
+
28
+ attach_function :Init, 'SDL_Init', [:uint32], :int
29
+ attach_function :InitSubSystem, 'SDL_InitSubSystem', [:uint32], :int
30
+ attach_function :CreateWindow, 'SDL_CreateWindow', %i[string int int int int uint32], :pointer
31
+ attach_function :DestroyWindow, 'SDL_DestroyWindow', [:pointer], :void
32
+ attach_function :CreateRenderer, 'SDL_CreateRenderer', %i[pointer int uint32], :pointer
33
+ attach_function :CreateTexture, 'SDL_CreateTexture', %i[pointer uint32 int int int], :pointer
34
+ attach_function :UpdateTexture, 'SDL_UpdateTexture', %i[pointer pointer pointer int], :int
35
+ attach_function :LockTexture, 'SDL_LockTexture', %i[pointer pointer pointer int], :int
36
+ attach_function :UnlockTexture, 'SDL_UnlockTexture', [:pointer], :void
37
+ attach_function :RenderClear, 'SDL_RenderClear', [:pointer], :int
38
+ attach_function :RenderCopy, 'SDL_RenderCopy', %i[pointer pointer pointer pointer], :int
39
+ attach_function :RenderPresent, 'SDL_RenderPresent', [:pointer], :int
40
+ attach_function :PumpEvents, 'SDL_PumpEvents', [], :void
41
+ attach_function :GetKeyboardState, 'SDL_GetKeyboardState', [:pointer], :pointer
42
+ attach_function :SetHint, 'SDL_SetHint', %i[string string], :int
43
+ attach_function :RenderSetLogicalSize, 'SDL_RenderSetLogicalSize', %i[pointer int int], :int
44
+ attach_function :SetWindowTitle, 'SDL_SetWindowTitle', %i[pointer string], :void
45
+ attach_function :RaiseWindow, 'SDL_RaiseWindow', [:pointer], :void
46
+ attach_function :GetError, 'SDL_GetError', [], :string
47
+ attach_function :SetRenderDrawColor, 'SDL_SetRenderDrawColor', %i[pointer uint8 uint8 uint8 uint8], :int
48
+ attach_function :PollEvent, 'SDL_PollEvent', [:pointer], :int
49
+ attach_function :Quit, 'SDL_Quit', [], :void
50
+
51
+ AUDIO_F32SYS = 0x8120
52
+ attach_function :OpenAudioDevice, 'SDL_OpenAudioDevice', %i[string int pointer pointer int], :uint32
53
+ attach_function :PauseAudioDevice, 'SDL_PauseAudioDevice', %i[uint32 int], :void
54
+ attach_function :GetQueuedAudioSize, 'SDL_GetQueuedAudioSize', [:uint32], :uint32
55
+ attach_function :QueueAudio, 'SDL_QueueAudio', %i[uint32 pointer uint32], :int
56
+
57
+ class AudioSpec < FFI::Struct
58
+ layout(
59
+ :freq, :int,
60
+ :format, :ushort,
61
+ :channels, :uchar,
62
+ :silence, :uchar,
63
+ :samples, :ushort,
64
+ :padding, :ushort,
65
+ :size, :uint,
66
+ :callback, :pointer,
67
+ :userdata, :pointer
68
+ )
69
+ end
70
+ end
71
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Rubyboy
4
- VERSION = '1.2.0'
4
+ VERSION = '1.3.0'
5
5
  end
data/lib/rubyboy.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'raylib'
3
+ require 'rubyboy/sdl'
4
+ require_relative 'rubyboy/apu'
4
5
  require_relative 'rubyboy/bus'
5
6
  require_relative 'rubyboy/cpu'
6
7
  require_relative 'rubyboy/ppu'
@@ -14,10 +15,7 @@ require_relative 'rubyboy/cartridge/factory'
14
15
 
15
16
  module Rubyboy
16
17
  class Console
17
- include Raylib
18
-
19
18
  def initialize(rom_path)
20
- load_raylib
21
19
  rom_data = File.open(rom_path, 'r') { _1.read.bytes }
22
20
  rom = Rom.new(rom_data)
23
21
  ram = Ram.new
@@ -26,19 +24,23 @@ module Rubyboy
26
24
  @ppu = Ppu.new(interrupt)
27
25
  @timer = Timer.new(interrupt)
28
26
  @joypad = Joypad.new(interrupt)
29
- @bus = Bus.new(@ppu, rom, ram, mbc, @timer, interrupt, @joypad)
27
+ @apu = Apu.new
28
+ @bus = Bus.new(@ppu, rom, ram, mbc, @timer, interrupt, @joypad, @apu)
30
29
  @cpu = Cpu.new(@bus, interrupt)
31
30
  @lcd = Lcd.new
32
31
  end
33
32
 
34
33
  def start
35
- until @lcd.window_should_close?
34
+ SDL.InitSubSystem(SDL::INIT_KEYBOARD)
35
+ loop do
36
36
  cycles = @cpu.exec
37
37
  @timer.step(cycles)
38
- if @ppu.step(cycles)
39
- draw
40
- key_input_check
41
- end
38
+ @apu.step(cycles)
39
+ next unless @ppu.step(cycles)
40
+
41
+ @lcd.draw(@ppu.buffer)
42
+ key_input_check
43
+ break if @lcd.window_should_close?
42
44
  end
43
45
  @lcd.close_window
44
46
  rescue StandardError => e
@@ -63,40 +65,15 @@ module Rubyboy
63
65
 
64
66
  private
65
67
 
66
- def draw
67
- pixel_data = buffer_to_pixel_data(@ppu.buffer)
68
- @lcd.draw(pixel_data)
69
- end
70
-
71
- def buffer_to_pixel_data(buffer)
72
- buffer.flat_map do |row|
73
- [row, row, row]
74
- end.pack('C*')
75
- end
76
-
77
68
  def key_input_check
78
- direction = (IsKeyUp(KEY_D) && 1 || 0) | ((IsKeyUp(KEY_A) && 1 || 0) << 1) | ((IsKeyUp(KEY_W) && 1 || 0) << 2) | ((IsKeyUp(KEY_S) && 1 || 0) << 3)
79
- action = (IsKeyUp(KEY_K) && 1 || 0) | ((IsKeyUp(KEY_J) && 1 || 0) << 1) | ((IsKeyUp(KEY_U) && 1 || 0) << 2) | ((IsKeyUp(KEY_I) && 1 || 0) << 3)
80
- @joypad.direction_button(direction)
81
- @joypad.action_button(action)
82
- end
83
-
84
- def load_raylib
85
- shared_lib_path = "#{Gem::Specification.find_by_name('raylib-bindings').full_gem_path}/lib/"
86
- case RUBY_PLATFORM
87
- when /mswin|msys|mingw/ # Windows
88
- Raylib.load_lib("#{shared_lib_path}libraylib.dll")
89
- when /darwin/ # macOS
90
- arch = RUBY_PLATFORM.split('-')[0]
91
- Raylib.load_lib(shared_lib_path + "libraylib.#{arch}.dylib")
92
- when /linux/ # Ubuntu Linux (x86_64 or aarch64)
93
- arch = RUBY_PLATFORM.split('-')[0]
94
- Raylib.load_lib(shared_lib_path + "libraylib.#{arch}.so")
95
- else
96
- raise "Unknown system: #{RUBY_PLATFORM}"
97
- end
69
+ SDL.PumpEvents
70
+ keyboard = SDL.GetKeyboardState(nil)
71
+ keyboard_state = keyboard.read_array_of_uint8(229)
98
72
 
99
- SetTraceLogLevel(LOG_ERROR)
73
+ direction = (keyboard_state[SDL::SDL_SCANCODE_D]) | (keyboard_state[SDL::SDL_SCANCODE_A] << 1) | (keyboard_state[SDL::SDL_SCANCODE_W] << 2) | (keyboard_state[SDL::SDL_SCANCODE_S] << 3)
74
+ action = (keyboard_state[SDL::SDL_SCANCODE_K]) | (keyboard_state[SDL::SDL_SCANCODE_J] << 1) | (keyboard_state[SDL::SDL_SCANCODE_U] << 2) | (keyboard_state[SDL::SDL_SCANCODE_I] << 3)
75
+ @joypad.direction_button(15 - direction)
76
+ @joypad.action_button(15 - action)
100
77
  end
101
78
  end
102
79
  end
metadata CHANGED
@@ -1,29 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubyboy
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - sacckey
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-01-09 00:00:00.000000000 Z
11
+ date: 2024-03-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: raylib-bindings
14
+ name: ffi
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.6.0
19
+ version: '1.16'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.16.3
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
27
  - - "~>"
25
28
  - !ruby/object:Gem::Version
26
- version: 0.6.0
29
+ version: '1.16'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.16.3
27
33
  description:
28
34
  email:
29
35
  executables:
@@ -61,6 +67,12 @@ files:
61
67
  - lib/roms/instr_timing/readme.txt
62
68
  - lib/roms/tobu.gb
63
69
  - lib/rubyboy.rb
70
+ - lib/rubyboy/apu.rb
71
+ - lib/rubyboy/apu_channels/channel1.rb
72
+ - lib/rubyboy/apu_channels/channel2.rb
73
+ - lib/rubyboy/apu_channels/channel3.rb
74
+ - lib/rubyboy/apu_channels/channel4.rb
75
+ - lib/rubyboy/audio.rb
64
76
  - lib/rubyboy/bus.rb
65
77
  - lib/rubyboy/cartridge/factory.rb
66
78
  - lib/rubyboy/cartridge/mbc1.rb
@@ -71,8 +83,12 @@ files:
71
83
  - lib/rubyboy/lcd.rb
72
84
  - lib/rubyboy/ppu.rb
73
85
  - lib/rubyboy/ram.rb
86
+ - lib/rubyboy/raylib/audio.rb
87
+ - lib/rubyboy/raylib/lcd.rb
88
+ - lib/rubyboy/raylib/raylib_loader.rb
74
89
  - lib/rubyboy/registers.rb
75
90
  - lib/rubyboy/rom.rb
91
+ - lib/rubyboy/sdl.rb
76
92
  - lib/rubyboy/timer.rb
77
93
  - lib/rubyboy/version.rb
78
94
  - resource/logo/logo.png