rubyboy 0.3.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -0
- data/README.md +7 -15
- data/exe/rubyboy +7 -0
- data/lib/rubyboy/bus.rb +5 -13
- data/lib/rubyboy/cpu.rb +1018 -1503
- data/lib/rubyboy/interrupt.rb +12 -4
- data/lib/rubyboy/joypad.rb +41 -0
- data/lib/rubyboy/lcd.rb +0 -20
- data/lib/rubyboy/operand/direct16.rb +13 -0
- data/lib/rubyboy/operand/direct8.rb +13 -0
- data/lib/rubyboy/operand/hl_dec.rb +11 -0
- data/lib/rubyboy/operand/hl_inc.rb +11 -0
- data/lib/rubyboy/operand/immediate16.rb +13 -0
- data/lib/rubyboy/operand/immediate8.rb +13 -0
- data/lib/rubyboy/operand/indirect.rb +13 -0
- data/lib/rubyboy/operand/register16.rb +13 -0
- data/lib/rubyboy/operand/register8.rb +13 -0
- data/lib/rubyboy/operand.rb +12 -0
- data/lib/rubyboy/ppu.rb +56 -24
- data/lib/rubyboy/register.rb +0 -2
- data/lib/rubyboy/registers.rb +80 -0
- data/lib/rubyboy/rom.rb +1 -30
- data/lib/rubyboy/timer.rb +3 -4
- data/lib/rubyboy/version.rb +1 -1
- data/lib/rubyboy.rb +41 -9
- metadata +17 -3
data/lib/rubyboy.rb
CHANGED
@@ -1,23 +1,29 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require '
|
4
|
-
require_relative 'rubyboy/version'
|
3
|
+
require 'raylib'
|
5
4
|
require_relative 'rubyboy/bus'
|
6
5
|
require_relative 'rubyboy/cpu'
|
7
6
|
require_relative 'rubyboy/ppu'
|
8
7
|
require_relative 'rubyboy/rom'
|
9
8
|
require_relative 'rubyboy/timer'
|
10
9
|
require_relative 'rubyboy/lcd'
|
10
|
+
require_relative 'rubyboy/joypad'
|
11
|
+
require_relative 'rubyboy/interrupt'
|
11
12
|
|
12
13
|
module Rubyboy
|
13
14
|
class Console
|
14
|
-
|
15
|
+
include Raylib
|
16
|
+
|
17
|
+
def initialize(rom_path)
|
18
|
+
load_raylib
|
19
|
+
rom_data = File.open(rom_path, 'r') { _1.read.bytes }
|
15
20
|
rom = Rom.new(rom_data)
|
16
21
|
interrupt = Interrupt.new
|
17
22
|
@ppu = Ppu.new(interrupt)
|
18
23
|
@timer = Timer.new(interrupt)
|
19
|
-
@
|
20
|
-
@
|
24
|
+
@joypad = Joypad.new(interrupt)
|
25
|
+
@bus = Bus.new(@ppu, rom, @timer, interrupt, @joypad)
|
26
|
+
@cpu = Cpu.new(@bus, interrupt)
|
21
27
|
@lcd = Lcd.new
|
22
28
|
end
|
23
29
|
|
@@ -25,7 +31,10 @@ module Rubyboy
|
|
25
31
|
until @lcd.window_should_close?
|
26
32
|
cycles = @cpu.exec
|
27
33
|
@timer.step(cycles)
|
28
|
-
|
34
|
+
if @ppu.step(cycles)
|
35
|
+
draw
|
36
|
+
key_input_check
|
37
|
+
end
|
29
38
|
end
|
30
39
|
@lcd.close_window
|
31
40
|
rescue StandardError => e
|
@@ -33,6 +42,8 @@ module Rubyboy
|
|
33
42
|
raise e
|
34
43
|
end
|
35
44
|
|
45
|
+
private
|
46
|
+
|
36
47
|
def draw
|
37
48
|
pixel_data = buffer_to_pixel_data(@ppu.buffer)
|
38
49
|
@lcd.draw(pixel_data)
|
@@ -43,8 +54,29 @@ module Rubyboy
|
|
43
54
|
[row, row, row]
|
44
55
|
end.flatten.pack('C*')
|
45
56
|
end
|
57
|
+
|
58
|
+
def key_input_check
|
59
|
+
direction = (IsKeyUp(KEY_D) && 1 || 0) | ((IsKeyUp(KEY_A) && 1 || 0) << 1) | ((IsKeyUp(KEY_W) && 1 || 0) << 2) | ((IsKeyUp(KEY_S) && 1 || 0) << 3)
|
60
|
+
action = (IsKeyUp(KEY_K) && 1 || 0) | ((IsKeyUp(KEY_J) && 1 || 0) << 1) | ((IsKeyUp(KEY_U) && 1 || 0) << 2) | ((IsKeyUp(KEY_I) && 1 || 0) << 3)
|
61
|
+
@joypad.direction_button(direction)
|
62
|
+
@joypad.action_button(action)
|
63
|
+
end
|
64
|
+
|
65
|
+
def load_raylib
|
66
|
+
shared_lib_path = "#{Gem::Specification.find_by_name('raylib-bindings').full_gem_path}/lib/"
|
67
|
+
case RUBY_PLATFORM
|
68
|
+
when /mswin|msys|mingw/ # Windows
|
69
|
+
Raylib.load_lib("#{shared_lib_path}libraylib.dll")
|
70
|
+
when /darwin/ # macOS
|
71
|
+
Raylib.load_lib("#{shared_lib_path}libraylib.dylib")
|
72
|
+
when /linux/ # Ubuntu Linux (x86_64 or aarch64)
|
73
|
+
arch = RUBY_PLATFORM.split('-')[0]
|
74
|
+
Raylib.load_lib(shared_lib_path + "libraylib.#{arch}.so")
|
75
|
+
else
|
76
|
+
raise "Unknown system: #{RUBY_PLATFORM}"
|
77
|
+
end
|
78
|
+
|
79
|
+
SetTraceLogLevel(LOG_ERROR)
|
80
|
+
end
|
46
81
|
end
|
47
82
|
end
|
48
|
-
|
49
|
-
rom_data = File.open(File.expand_path('roms/cpu_instrs/cpu_instrs.gb', __dir__), 'r') { _1.read.bytes }
|
50
|
-
Rubyboy::Console.new(rom_data).start
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubyboy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- sacckey
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-12-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: raylib-bindings
|
@@ -26,7 +26,8 @@ dependencies:
|
|
26
26
|
version: 0.5.7
|
27
27
|
description:
|
28
28
|
email:
|
29
|
-
executables:
|
29
|
+
executables:
|
30
|
+
- rubyboy
|
30
31
|
extensions: []
|
31
32
|
extra_rdoc_files: []
|
32
33
|
files:
|
@@ -37,6 +38,7 @@ files:
|
|
37
38
|
- LICENSE.txt
|
38
39
|
- README.md
|
39
40
|
- Rakefile
|
41
|
+
- exe/rubyboy
|
40
42
|
- lib/opcodes.json
|
41
43
|
- lib/roms/bgbtest.gb
|
42
44
|
- lib/roms/cpu_instrs/cpu_instrs.gb
|
@@ -64,10 +66,22 @@ files:
|
|
64
66
|
- lib/rubyboy/cartridge/nombc.rb
|
65
67
|
- lib/rubyboy/cpu.rb
|
66
68
|
- lib/rubyboy/interrupt.rb
|
69
|
+
- lib/rubyboy/joypad.rb
|
67
70
|
- lib/rubyboy/lcd.rb
|
71
|
+
- lib/rubyboy/operand.rb
|
72
|
+
- lib/rubyboy/operand/direct16.rb
|
73
|
+
- lib/rubyboy/operand/direct8.rb
|
74
|
+
- lib/rubyboy/operand/hl_dec.rb
|
75
|
+
- lib/rubyboy/operand/hl_inc.rb
|
76
|
+
- lib/rubyboy/operand/immediate16.rb
|
77
|
+
- lib/rubyboy/operand/immediate8.rb
|
78
|
+
- lib/rubyboy/operand/indirect.rb
|
79
|
+
- lib/rubyboy/operand/register16.rb
|
80
|
+
- lib/rubyboy/operand/register8.rb
|
68
81
|
- lib/rubyboy/ppu.rb
|
69
82
|
- lib/rubyboy/ram.rb
|
70
83
|
- lib/rubyboy/register.rb
|
84
|
+
- lib/rubyboy/registers.rb
|
71
85
|
- lib/rubyboy/rom.rb
|
72
86
|
- lib/rubyboy/timer.rb
|
73
87
|
- lib/rubyboy/version.rb
|