rnes 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +3 -0
- data/CHANGELOG.md +19 -0
- data/Gemfile.lock +1 -1
- data/lib/rnes/cpu.rb +10 -4
- data/lib/rnes/ppu.rb +23 -22
- data/lib/rnes/ppu_bus.rb +2 -0
- data/lib/rnes/terminal_renderer.rb +1 -1
- data/lib/rnes/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cf2afd8224c221333be85c60dddbdf47a355ca99
|
4
|
+
data.tar.gz: e8ff4cd2fe43280b24f9132a132eea289813f9bd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4e19a94ab96f907994766631a5c9143998eb12e3b697c6ba9e728c2369dbd9d87838cc33f7b83d783b36215d52b5efacee20f6f473e9d5c25d5d0410279fb95c
|
7
|
+
data.tar.gz: 3bc697a23906996906f7a3ba7f697547a1280544105597aac986969687d29ea2c5166c962080dd62ab92aeee49669b31d96368ac34e5b2857eba16cf80c09a04
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,24 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
All notable changes to this project will be documented in this file.
|
4
|
+
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
7
|
+
|
1
8
|
## Unreleased
|
2
9
|
|
10
|
+
## 0.2.1 - 2018-11-24
|
11
|
+
|
12
|
+
### Added
|
13
|
+
|
14
|
+
- Decrease terminal renderer brightness threshold for better visibility.
|
15
|
+
|
16
|
+
### Fixed
|
17
|
+
|
18
|
+
- Fix PPU unnecessary vertical offset on rendering sprites.
|
19
|
+
- Fix PPU background unused palette address redirection.
|
20
|
+
- Fix PPU sprite rendering about transparent color.
|
21
|
+
|
3
22
|
## 0.2.0 - 2018-11-17
|
4
23
|
|
5
24
|
### Added
|
data/Gemfile.lock
CHANGED
data/lib/rnes/cpu.rb
CHANGED
@@ -5,6 +5,12 @@ require 'rnes/operation'
|
|
5
5
|
|
6
6
|
module Rnes
|
7
7
|
class Cpu
|
8
|
+
INTERRUPTION_VECTOR_FOR_IRQ_OR_BRK = 0xFFFE
|
9
|
+
|
10
|
+
INTERRUPTION_VECTOR_FOR_NMI = 0xFFFA
|
11
|
+
|
12
|
+
INTERRUPTION_VECTOR_FOR_RESET = 0xFFFC
|
13
|
+
|
8
14
|
# @return [Rnes::CpuBus] bus
|
9
15
|
attr_reader :bus
|
10
16
|
|
@@ -31,7 +37,7 @@ module Rnes
|
|
31
37
|
|
32
38
|
def reset
|
33
39
|
@registers.reset
|
34
|
-
@registers.program_counter = read_word(
|
40
|
+
@registers.program_counter = read_word(INTERRUPTION_VECTOR_FOR_RESET)
|
35
41
|
end
|
36
42
|
|
37
43
|
# @return [Integer]
|
@@ -369,7 +375,7 @@ module Rnes
|
|
369
375
|
push(@registers.status)
|
370
376
|
unless @registers.interrupt?
|
371
377
|
@registers.interrupt = true
|
372
|
-
@registers.program_counter = read_word(
|
378
|
+
@registers.program_counter = read_word(INTERRUPTION_VECTOR_FOR_IRQ_OR_BRK)
|
373
379
|
end
|
374
380
|
@registers.program_counter -= 1
|
375
381
|
end
|
@@ -1011,7 +1017,7 @@ module Rnes
|
|
1011
1017
|
push_word(@registers.program_counter)
|
1012
1018
|
push(@registers.status)
|
1013
1019
|
@registers.interrupt = true
|
1014
|
-
@registers.program_counter = read_word(
|
1020
|
+
@registers.program_counter = read_word(INTERRUPTION_VECTOR_FOR_IRQ_OR_BRK)
|
1015
1021
|
end
|
1016
1022
|
|
1017
1023
|
def handle_nmi
|
@@ -1020,7 +1026,7 @@ module Rnes
|
|
1020
1026
|
push_word(@registers.program_counter)
|
1021
1027
|
push(@registers.status)
|
1022
1028
|
@registers.interrupt = true
|
1023
|
-
@registers.program_counter = read_word(
|
1029
|
+
@registers.program_counter = read_word(INTERRUPTION_VECTOR_FOR_NMI)
|
1024
1030
|
end
|
1025
1031
|
|
1026
1032
|
# @return [Integer]
|
data/lib/rnes/ppu.rb
CHANGED
@@ -202,13 +202,6 @@ module Rnes
|
|
202
202
|
(x_of_block.even? ? 0 : 1) + (y_of_block.even? ? 0 : 2)
|
203
203
|
end
|
204
204
|
|
205
|
-
# @return [Integer] Integer from 0 to 63.
|
206
|
-
def object_attribute_index
|
207
|
-
(y_of_encoded_attributes % ENCODED_ATTRIBUTES_COUNT_IN_VERTICAL_LINE) * ENCODED_ATTRIBUTES_COUNT_IN_HORIZONTAL_LINE +
|
208
|
-
x_of_encoded_attributes % ENCODED_ATTRIBUTES_COUNT_IN_HORIZONTAL_LINE +
|
209
|
-
background_pattern_index_paging_offset
|
210
|
-
end
|
211
|
-
|
212
205
|
def check_sprite_hit
|
213
206
|
if read_from_sprite_ram(0) == y && @registers.background_enabled? && @registers.sprite_enabled?
|
214
207
|
registers.sprite_hit = true
|
@@ -233,12 +226,12 @@ module Rnes
|
|
233
226
|
pattern_line_low_byte = read_background_pattern_line(pattern_line_low_byte_address)
|
234
227
|
pattern_line_high_byte = read_background_pattern_line(pattern_line_low_byte_address + TILE_HEIGHT)
|
235
228
|
|
236
|
-
|
237
|
-
|
229
|
+
palette_ids_byte = read_object_attribute(object_attribute_index)
|
230
|
+
palette_id = (palette_ids_byte >> (block_id_in_encoded_attributes * 2)) & 0b11
|
238
231
|
|
239
232
|
TILE_WIDTH.times do |x_in_pattern|
|
240
233
|
index_in_pattern_line_byte = TILE_WIDTH - 1 - x_in_pattern
|
241
|
-
background_palette_index = pattern_line_low_byte[index_in_pattern_line_byte] | (pattern_line_high_byte[index_in_pattern_line_byte] << 1) | (
|
234
|
+
background_palette_index = pattern_line_low_byte[index_in_pattern_line_byte] | (pattern_line_high_byte[index_in_pattern_line_byte] << 1) | (palette_id << 2)
|
242
235
|
color_id = read_color_id(background_palette_index)
|
243
236
|
@image.write(
|
244
237
|
value: ::Rnes::Ppu::COLORS[color_id],
|
@@ -263,13 +256,12 @@ module Rnes
|
|
263
256
|
# `-------- vertical flip
|
264
257
|
def draw_sprites
|
265
258
|
0.step(SPRITES_COUNT - 1, 4) do |base_sprite_ram_address|
|
266
|
-
y_for_sprite =
|
267
|
-
next if y_for_sprite.negative?
|
259
|
+
y_for_sprite = read_from_sprite_ram(base_sprite_ram_address)
|
268
260
|
pattern_index = read_from_sprite_ram(base_sprite_ram_address + 1)
|
269
261
|
sprite_attribute_byte = read_from_sprite_ram(base_sprite_ram_address + 2)
|
270
262
|
x_for_sprite = read_from_sprite_ram(base_sprite_ram_address + 3)
|
271
263
|
|
272
|
-
|
264
|
+
palette_id = sprite_attribute_byte & 0b11
|
273
265
|
reversed_horizontally = sprite_attribute_byte[6] == 1
|
274
266
|
reversed_vertically = sprite_attribute_byte[7] == 1
|
275
267
|
|
@@ -279,20 +271,29 @@ module Rnes
|
|
279
271
|
pattern_line_high_byte = read_sprite_pattern_line(pattern_line_low_byte_address + TILE_HEIGHT)
|
280
272
|
TILE_WIDTH.times do |x_in_pattern|
|
281
273
|
index_in_pattern_line_byte = TILE_WIDTH - 1 - x_in_pattern
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
274
|
+
sprite_palette_index = pattern_line_low_byte[index_in_pattern_line_byte] | (pattern_line_high_byte[index_in_pattern_line_byte] << 1) | (palette_id << 2)
|
275
|
+
if sprite_palette_index % 4 != 0
|
276
|
+
color_id = read_color_id(sprite_palette_index)
|
277
|
+
y_in_pattern = TILE_HEIGHT - 1 - y_in_pattern if reversed_vertically
|
278
|
+
x_in_pattern = TILE_WIDTH - 1 - x_in_pattern if reversed_horizontally
|
279
|
+
@image.write(
|
280
|
+
value: ::Rnes::Ppu::COLORS[color_id],
|
281
|
+
x: x_for_sprite + x_in_pattern,
|
282
|
+
y: y_for_sprite + y_in_pattern,
|
283
|
+
)
|
284
|
+
end
|
291
285
|
end
|
292
286
|
end
|
293
287
|
end
|
294
288
|
end
|
295
289
|
|
290
|
+
# @return [Integer] Integer from 0 to 63.
|
291
|
+
def object_attribute_index
|
292
|
+
(y_of_encoded_attributes % ENCODED_ATTRIBUTES_COUNT_IN_VERTICAL_LINE) * ENCODED_ATTRIBUTES_COUNT_IN_HORIZONTAL_LINE +
|
293
|
+
x_of_encoded_attributes % ENCODED_ATTRIBUTES_COUNT_IN_HORIZONTAL_LINE +
|
294
|
+
background_pattern_index_paging_offset
|
295
|
+
end
|
296
|
+
|
296
297
|
# @return [Boolean]
|
297
298
|
def on_bottom_end_line?
|
298
299
|
line == WINDOW_HEIGHT + V_BLANK_HEIGHT
|
data/lib/rnes/ppu_bus.rb
CHANGED
data/lib/rnes/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rnes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryo Nakamura
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-11-
|
11
|
+
date: 2018-11-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|