rnes 0.1.1 → 0.2.0
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/.circleci/config.yml +6 -0
- data/CHANGELOG.md +18 -3
- data/Gemfile +4 -0
- data/Gemfile.lock +3 -3
- data/README.md +1 -1
- data/exe/rnes +16 -2
- data/lib/rnes/emulator.rb +5 -4
- data/lib/rnes/ppu.rb +129 -57
- data/lib/rnes/ppu_bus.rb +0 -1
- data/lib/rnes/ppu_registers.rb +15 -11
- data/lib/rnes/version.rb +1 -1
- data/rnes.gemspec +0 -3
- metadata +2 -44
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6d3d1d154a09065286af7ca812325aa2b1685cbf
|
4
|
+
data.tar.gz: cfa99900503dd5d59f6553f7ee3c81f4fd292dc3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 859089e4d81fb3888ea5e52b95de2695f48acf3346b219a5e579ebcdd6516ff92ce709a798334afc60e2adf76c078898d6d79fb866c8cb6659fff149360f983e
|
7
|
+
data.tar.gz: 3e69abecdf78153e5ceca5090fbf8b6202fb936f710eb49a659a6b3d25756d4e52d245c93bbad73b4ca7ed8a55419b329276a6d97cf490ec4e1387be0b5ab187
|
data/.circleci/config.yml
CHANGED
@@ -3,6 +3,9 @@ jobs:
|
|
3
3
|
machine: true
|
4
4
|
steps:
|
5
5
|
- checkout
|
6
|
+
- run:
|
7
|
+
command: gem install bundler -v 1.17.1
|
8
|
+
name: gem install bundler -v 1.17.1
|
6
9
|
- run:
|
7
10
|
command: bundle install
|
8
11
|
name: bundle install
|
@@ -13,6 +16,9 @@ jobs:
|
|
13
16
|
machine: true
|
14
17
|
steps:
|
15
18
|
- checkout
|
19
|
+
- run:
|
20
|
+
command: gem install bundler -v 1.17.1
|
21
|
+
name: gem install bundler -v 1.17.1
|
16
22
|
- run:
|
17
23
|
command: bundle install
|
18
24
|
name: bundle install
|
data/CHANGELOG.md
CHANGED
@@ -1,13 +1,28 @@
|
|
1
|
-
##
|
1
|
+
## Unreleased
|
2
2
|
|
3
|
-
|
3
|
+
## 0.2.0 - 2018-11-17
|
4
4
|
|
5
|
-
|
5
|
+
### Added
|
6
|
+
|
7
|
+
- Add CLI options and help message.
|
8
|
+
- Add PPU sprite reverse.
|
9
|
+
|
10
|
+
### Fixed
|
11
|
+
|
12
|
+
- Fix PPU sprites rendering.
|
13
|
+
- Fix PPU sprite pattern addressing.
|
14
|
+
- Fix PPU background pattern attribute addressing.
|
15
|
+
|
16
|
+
## 0.1.1 - 2018-11-12
|
6
17
|
|
7
18
|
### Added
|
8
19
|
|
9
20
|
- Allow break-less input on key input.
|
10
21
|
|
22
|
+
### Changed
|
23
|
+
|
24
|
+
- Improve logger format for compatibility with nestest.log.
|
25
|
+
|
11
26
|
### Fixed
|
12
27
|
|
13
28
|
- Fix CPU ADC instruction.
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
rnes (0.1.
|
4
|
+
rnes (0.1.1)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
@@ -52,8 +52,8 @@ DEPENDENCIES
|
|
52
52
|
pry
|
53
53
|
rake (~> 10.0)
|
54
54
|
rnes!
|
55
|
-
rspec
|
56
|
-
rubocop
|
55
|
+
rspec
|
56
|
+
rubocop
|
57
57
|
|
58
58
|
BUNDLED WITH
|
59
59
|
1.17.1
|
data/README.md
CHANGED
data/exe/rnes
CHANGED
@@ -1,10 +1,24 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
$LOAD_PATH.unshift File.expand_path('../lib', __dir__)
|
3
|
+
require 'optparse'
|
3
4
|
require 'rnes'
|
4
5
|
|
5
|
-
|
6
|
+
options = ARGV.getopts('h', 'help', 'log:')
|
7
|
+
log_file_path = options['log']
|
8
|
+
args = ARGV.parse!
|
9
|
+
help_message = "Usage: #{$PROGRAM_NAME} [options] <FILE>"
|
10
|
+
if options['h'] || options['help']
|
11
|
+
puts help_message
|
12
|
+
exit
|
13
|
+
end
|
14
|
+
|
15
|
+
path = args.first
|
16
|
+
unless path
|
17
|
+
abort help_message
|
18
|
+
end
|
19
|
+
|
6
20
|
io = File.binread(path)
|
7
21
|
bytes = io.bytes
|
8
|
-
emulator = Rnes::Emulator.new
|
22
|
+
emulator = Rnes::Emulator.new(log_file_path: log_file_path)
|
9
23
|
emulator.load_rom(bytes)
|
10
24
|
emulator.run
|
data/lib/rnes/emulator.rb
CHANGED
@@ -5,9 +5,8 @@ require 'rnes/rom_loader'
|
|
5
5
|
|
6
6
|
module Rnes
|
7
7
|
class Emulator
|
8
|
-
|
9
|
-
|
10
|
-
def initialize
|
8
|
+
# @param [String] log_file_path
|
9
|
+
def initialize(log_file_path: nil)
|
11
10
|
parts_factory = ::Rnes::PartsFactory.new
|
12
11
|
@cpu = parts_factory.cpu
|
13
12
|
@cpu_bus = parts_factory.cpu_bus
|
@@ -16,7 +15,9 @@ module Rnes
|
|
16
15
|
@keypad2 = parts_factory.keypad2
|
17
16
|
@ppu = parts_factory.ppu
|
18
17
|
@ppu_bus = parts_factory.ppu_bus
|
19
|
-
|
18
|
+
if log_file_path
|
19
|
+
@logger = ::Rnes::Logger.new(cpu: @cpu, path: log_file_path, ppu: @ppu)
|
20
|
+
end
|
20
21
|
end
|
21
22
|
|
22
23
|
# @param [Array<Integer>] rom_bytes
|
data/lib/rnes/ppu.rb
CHANGED
@@ -6,6 +6,8 @@ require 'rnes/ram'
|
|
6
6
|
|
7
7
|
module Rnes
|
8
8
|
class Ppu
|
9
|
+
ADDRESS_TO_FINISH_SPRITE_PALETTE_TABLE = 0x3F1F
|
10
|
+
|
9
11
|
ADDRESS_TO_START_ATTRIBUTE_TABLE = 0x23C0
|
10
12
|
|
11
13
|
ADDRESS_TO_START_NAME_TABLE = 0x2000
|
@@ -20,6 +22,8 @@ module Rnes
|
|
20
22
|
|
21
23
|
CYCLES_PER_LINE = 341
|
22
24
|
|
25
|
+
PALETTE_ADDRESS_RANGE = (ADDRESS_TO_START_BACKGROUND_PALETTE_TABLE..ADDRESS_TO_FINISH_SPRITE_PALETTE_TABLE).freeze
|
26
|
+
|
23
27
|
SPRITE_RAM_BYTESIZE = 2**8
|
24
28
|
|
25
29
|
SPRITES_COUNT = 64
|
@@ -34,6 +38,14 @@ module Rnes
|
|
34
38
|
|
35
39
|
WINDOW_WIDTH = 256
|
36
40
|
|
41
|
+
ENCODED_ATTRIBUTES_HEIGHT = BLOCK_HEIGHT * 2
|
42
|
+
|
43
|
+
ENCODED_ATTRIBUTES_WIDTH = BLOCK_WIDTH * 2
|
44
|
+
|
45
|
+
ENCODED_ATTRIBUTES_COUNT_IN_HORIZONTAL_LINE = WINDOW_WIDTH / ENCODED_ATTRIBUTES_WIDTH
|
46
|
+
|
47
|
+
ENCODED_ATTRIBUTES_COUNT_IN_VERTICAL_LINE = 256 / ENCODED_ATTRIBUTES_HEIGHT
|
48
|
+
|
37
49
|
TILES_COUNT_IN_HORIZONTAL_LINE = WINDOW_WIDTH / TILE_WIDTH
|
38
50
|
|
39
51
|
TILES_COUNT_IN_VERTICAL_LINE = WINDOW_HEIGHT / TILE_HEIGHT
|
@@ -180,6 +192,23 @@ module Rnes
|
|
180
192
|
end
|
181
193
|
end
|
182
194
|
|
195
|
+
# +---+---+
|
196
|
+
# | 0 | 1 |
|
197
|
+
# +---+---+
|
198
|
+
# | 2 | 3 |
|
199
|
+
# +---+---+
|
200
|
+
# @return [Integer] Integer from 0 to 3.
|
201
|
+
def block_id_in_encoded_attributes
|
202
|
+
(x_of_block.even? ? 0 : 1) + (y_of_block.even? ? 0 : 2)
|
203
|
+
end
|
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
|
+
|
183
212
|
def check_sprite_hit
|
184
213
|
if read_from_sprite_ram(0) == y && @registers.background_enabled? && @registers.sprite_enabled?
|
185
214
|
registers.sprite_hit = true
|
@@ -199,25 +228,21 @@ module Rnes
|
|
199
228
|
end
|
200
229
|
|
201
230
|
def draw_background_8pixels
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
TILE_WIDTH.times do |x_in_character|
|
215
|
-
index_in_character_line_byte = TILE_WIDTH - 1 - x_in_character
|
216
|
-
background_palette_index = character_line_low_byte[index_in_character_line_byte] | character_line_high_byte[index_in_character_line_byte] << 1 | mini_palette_id << 2
|
231
|
+
pattern_index = read_pattern_index(background_pattern_index)
|
232
|
+
pattern_line_low_byte_address = TILE_HEIGHT * 2 * pattern_index + y_in_tile
|
233
|
+
pattern_line_low_byte = read_background_pattern_line(pattern_line_low_byte_address)
|
234
|
+
pattern_line_high_byte = read_background_pattern_line(pattern_line_low_byte_address + TILE_HEIGHT)
|
235
|
+
|
236
|
+
mini_palette_ids_byte = read_object_attribute(object_attribute_index)
|
237
|
+
mini_palette_id = (mini_palette_ids_byte >> (block_id_in_encoded_attributes * 2)) & 0b11
|
238
|
+
|
239
|
+
TILE_WIDTH.times do |x_in_pattern|
|
240
|
+
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) | (mini_palette_id << 2)
|
217
242
|
color_id = read_color_id(background_palette_index)
|
218
243
|
@image.write(
|
219
244
|
value: ::Rnes::Ppu::COLORS[color_id],
|
220
|
-
x: x +
|
245
|
+
x: x + x_in_pattern,
|
221
246
|
y: y,
|
222
247
|
)
|
223
248
|
end
|
@@ -237,31 +262,31 @@ module Rnes
|
|
237
262
|
# |`------- horizontal flip
|
238
263
|
# `-------- vertical flip
|
239
264
|
def draw_sprites
|
240
|
-
|
241
|
-
SPRITES_COUNT.times do |i|
|
242
|
-
base_sprite_ram_address = i * 4
|
265
|
+
0.step(SPRITES_COUNT - 1, 4) do |base_sprite_ram_address|
|
243
266
|
y_for_sprite = (read_from_sprite_ram(base_sprite_ram_address) - TILE_HEIGHT)
|
244
267
|
next if y_for_sprite.negative?
|
245
|
-
|
268
|
+
pattern_index = read_from_sprite_ram(base_sprite_ram_address + 1)
|
246
269
|
sprite_attribute_byte = read_from_sprite_ram(base_sprite_ram_address + 2)
|
247
270
|
x_for_sprite = read_from_sprite_ram(base_sprite_ram_address + 3)
|
248
271
|
|
249
|
-
character_index = read_character_index(name_table_index)
|
250
|
-
|
251
272
|
mini_palette_id = sprite_attribute_byte & 0b11
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
273
|
+
reversed_horizontally = sprite_attribute_byte[6] == 1
|
274
|
+
reversed_vertically = sprite_attribute_byte[7] == 1
|
275
|
+
|
276
|
+
TILE_HEIGHT.times do |y_in_pattern|
|
277
|
+
pattern_line_low_byte_address = TILE_HEIGHT * 2 * pattern_index + y_in_pattern
|
278
|
+
pattern_line_low_byte = read_sprite_pattern_line(pattern_line_low_byte_address)
|
279
|
+
pattern_line_high_byte = read_sprite_pattern_line(pattern_line_low_byte_address + TILE_HEIGHT)
|
280
|
+
TILE_WIDTH.times do |x_in_pattern|
|
281
|
+
index_in_pattern_line_byte = TILE_WIDTH - 1 - x_in_pattern
|
282
|
+
background_palette_index = pattern_line_low_byte[index_in_pattern_line_byte] | pattern_line_high_byte[index_in_pattern_line_byte] << 1 | mini_palette_id << 2
|
260
283
|
color_id = read_color_id(background_palette_index)
|
284
|
+
y_in_pattern = TILE_HEIGHT - 1 - y_in_pattern if reversed_vertically
|
285
|
+
x_in_pattern = TILE_WIDTH - 1 - x_in_pattern if reversed_horizontally
|
261
286
|
@image.write(
|
262
287
|
value: ::Rnes::Ppu::COLORS[color_id],
|
263
|
-
x: x_for_sprite +
|
264
|
-
y: y_for_sprite +
|
288
|
+
x: x_for_sprite + x_in_pattern,
|
289
|
+
y: y_for_sprite + y_in_pattern,
|
265
290
|
)
|
266
291
|
end
|
267
292
|
end
|
@@ -288,16 +313,15 @@ module Rnes
|
|
288
313
|
(0...WINDOW_WIDTH).cover?(x) && (0...WINDOW_HEIGHT).cover?(y)
|
289
314
|
end
|
290
315
|
|
291
|
-
# @
|
292
|
-
|
293
|
-
|
294
|
-
@bus.read(index)
|
316
|
+
# @return [Boolean]
|
317
|
+
def palette_data_requested?
|
318
|
+
PALETTE_ADDRESS_RANGE.cover?(@registers.video_ram_address % 0x4000)
|
295
319
|
end
|
296
320
|
|
297
|
-
# @param [Integer] index
|
321
|
+
# @param [Integer] index.
|
298
322
|
# @return [Integer]
|
299
|
-
def
|
300
|
-
|
323
|
+
def read_background_pattern_line(index)
|
324
|
+
read_pattern_line(base_background_pattern_table_address + index)
|
301
325
|
end
|
302
326
|
|
303
327
|
# @param [Integer] index
|
@@ -312,15 +336,9 @@ module Rnes
|
|
312
336
|
@sprite_ram.read(address)
|
313
337
|
end
|
314
338
|
|
315
|
-
# @param [Integer] index
|
316
|
-
# @return [Integer] 4-color-palette IDs of 4 blocks, as 8 bit data.
|
317
|
-
def read_object_attribute(index)
|
318
|
-
@bus.read(ADDRESS_TO_START_ATTRIBUTE_TABLE + index)
|
319
|
-
end
|
320
|
-
|
321
339
|
# @return [Integer]
|
322
340
|
def read_from_video_ram_for_cpu
|
323
|
-
if
|
341
|
+
if palette_data_requested?
|
324
342
|
value = @bus.read(@registers.video_ram_address)
|
325
343
|
@video_ram_reading_buffer = @bus.read(@registers.video_ram_address - 0x1000)
|
326
344
|
else
|
@@ -331,6 +349,30 @@ module Rnes
|
|
331
349
|
value
|
332
350
|
end
|
333
351
|
|
352
|
+
# @param [Integer] index
|
353
|
+
# @return [Integer] 4-color-palette IDs of 4 blocks, as 8 bit data.
|
354
|
+
def read_object_attribute(index)
|
355
|
+
@bus.read(ADDRESS_TO_START_ATTRIBUTE_TABLE + index)
|
356
|
+
end
|
357
|
+
|
358
|
+
# @param [Integer] index
|
359
|
+
# @return [Integer]
|
360
|
+
def read_pattern_line(index)
|
361
|
+
@bus.read(index)
|
362
|
+
end
|
363
|
+
|
364
|
+
# @param [Integer] index.
|
365
|
+
# @return [Integer]
|
366
|
+
def read_sprite_pattern_line(index)
|
367
|
+
read_pattern_line(base_sprite_pattern_table_address + index)
|
368
|
+
end
|
369
|
+
|
370
|
+
# @param [Integer] index
|
371
|
+
# @return [Integer]
|
372
|
+
def read_pattern_index(index)
|
373
|
+
@bus.read(base_name_table_address + index)
|
374
|
+
end
|
375
|
+
|
334
376
|
def render_image
|
335
377
|
@renderer.render(@image)
|
336
378
|
end
|
@@ -345,23 +387,23 @@ module Rnes
|
|
345
387
|
# | 2(0x0800) | 3(0x0C00) |
|
346
388
|
# +-----------+-----------+
|
347
389
|
# @return [Integer] Integer from 0x0000 to 0x0FC0.
|
348
|
-
def
|
349
|
-
|
390
|
+
def background_pattern_index
|
391
|
+
background_pattern_index_in_window + background_pattern_index_paging_offset
|
350
392
|
end
|
351
393
|
|
352
394
|
# @return [Integer] Integer from 0x0000 to 0x03C0.
|
353
|
-
def
|
395
|
+
def background_pattern_index_in_window
|
354
396
|
(y_of_tile % TILES_COUNT_IN_VERTICAL_LINE) * TILES_COUNT_IN_HORIZONTAL_LINE + x_of_tile % TILES_COUNT_IN_HORIZONTAL_LINE
|
355
397
|
end
|
356
398
|
|
357
399
|
# @return [Integer] Integer from 0 to 3.
|
358
|
-
def
|
400
|
+
def background_pattern_index_page
|
359
401
|
x_of_tile / TILES_COUNT_IN_HORIZONTAL_LINE + y_of_tile / TILES_COUNT_IN_VERTICAL_LINE * 2
|
360
402
|
end
|
361
403
|
|
362
404
|
# @return [Integer] 0x0000, 0x0400, 0x0800, or 0x0C00.
|
363
|
-
def
|
364
|
-
|
405
|
+
def background_pattern_index_paging_offset
|
406
|
+
background_pattern_index_page * 0x0400
|
365
407
|
end
|
366
408
|
|
367
409
|
# @return [Boolean]
|
@@ -381,7 +423,7 @@ module Rnes
|
|
381
423
|
# @param [Integer] value
|
382
424
|
def write_to_sprite_ram_for_cpu(value)
|
383
425
|
@sprite_ram.write(@registers.sprite_ram_address, value)
|
384
|
-
@registers.sprite_ram_address
|
426
|
+
@registers.sprite_ram_address = (@registers.sprite_ram_address + 1) & 0xFF
|
385
427
|
end
|
386
428
|
|
387
429
|
# @param [Integer] value
|
@@ -397,12 +439,27 @@ module Rnes
|
|
397
439
|
|
398
440
|
# @return [Integer]
|
399
441
|
def x_in_tile
|
400
|
-
|
442
|
+
x_with_scroll % TILE_WIDTH
|
443
|
+
end
|
444
|
+
|
445
|
+
# @return [Integer]
|
446
|
+
def x_of_block
|
447
|
+
x_with_scroll / BLOCK_WIDTH
|
448
|
+
end
|
449
|
+
|
450
|
+
# @return [Integer]
|
451
|
+
def x_of_encoded_attributes
|
452
|
+
x_with_scroll / ENCODED_ATTRIBUTES_WIDTH
|
401
453
|
end
|
402
454
|
|
403
455
|
# @return [Integer]
|
404
456
|
def x_of_tile
|
405
|
-
|
457
|
+
x_with_scroll / TILE_WIDTH
|
458
|
+
end
|
459
|
+
|
460
|
+
# @return [Integer]
|
461
|
+
def x_with_scroll
|
462
|
+
x + @registers.scroll_x
|
406
463
|
end
|
407
464
|
|
408
465
|
# @return [Integer]
|
@@ -412,12 +469,27 @@ module Rnes
|
|
412
469
|
|
413
470
|
# @return [Integer]
|
414
471
|
def y_in_tile
|
415
|
-
|
472
|
+
y_with_scroll % TILE_HEIGHT
|
473
|
+
end
|
474
|
+
|
475
|
+
# @return [Integer]
|
476
|
+
def y_of_block
|
477
|
+
y_with_scroll / BLOCK_HEIGHT
|
478
|
+
end
|
479
|
+
|
480
|
+
# @return [Integer]
|
481
|
+
def y_of_encoded_attributes
|
482
|
+
y_with_scroll / ENCODED_ATTRIBUTES_HEIGHT
|
416
483
|
end
|
417
484
|
|
418
485
|
# @return [Integer]
|
419
486
|
def y_of_tile
|
420
|
-
|
487
|
+
y_with_scroll / TILE_HEIGHT
|
488
|
+
end
|
489
|
+
|
490
|
+
# @return [Integer]
|
491
|
+
def y_with_scroll
|
492
|
+
y + @registers.scroll_y
|
421
493
|
end
|
422
494
|
end
|
423
495
|
end
|
data/lib/rnes/ppu_bus.rb
CHANGED
data/lib/rnes/ppu_registers.rb
CHANGED
@@ -38,8 +38,8 @@ module Rnes
|
|
38
38
|
@sprite_ram_address = 0x00
|
39
39
|
@video_ram_address = 0x0000
|
40
40
|
|
41
|
-
@
|
42
|
-
@
|
41
|
+
@buffer = 0x00
|
42
|
+
@latch = false
|
43
43
|
end
|
44
44
|
|
45
45
|
# @return [Boolean]
|
@@ -124,12 +124,13 @@ module Rnes
|
|
124
124
|
|
125
125
|
# @param [Integer] value
|
126
126
|
def scroll=(value)
|
127
|
-
if @
|
127
|
+
if @latch
|
128
|
+
@scroll_x = @buffer
|
128
129
|
@scroll_y = value
|
129
130
|
else
|
130
|
-
@
|
131
|
+
@buffer = value
|
131
132
|
end
|
132
|
-
|
133
|
+
toggle_latch
|
133
134
|
end
|
134
135
|
|
135
136
|
# @return [Boolean]
|
@@ -161,23 +162,26 @@ module Rnes
|
|
161
162
|
def status
|
162
163
|
value = @status
|
163
164
|
self.in_v_blank = false
|
164
|
-
@
|
165
|
-
@scroll_latch = false
|
165
|
+
@latch = false
|
166
166
|
value
|
167
167
|
end
|
168
168
|
|
169
169
|
# @param [Integer] value
|
170
170
|
def video_ram_address=(value)
|
171
|
-
if @
|
172
|
-
@video_ram_address
|
171
|
+
if @latch
|
172
|
+
@video_ram_address = value + (@buffer << 8)
|
173
173
|
else
|
174
|
-
@
|
174
|
+
@buffer = value
|
175
175
|
end
|
176
|
-
|
176
|
+
toggle_latch
|
177
177
|
end
|
178
178
|
|
179
179
|
private
|
180
180
|
|
181
|
+
def toggle_latch
|
182
|
+
@latch = !@latch
|
183
|
+
end
|
184
|
+
|
181
185
|
# @param [Integer] index
|
182
186
|
# @param [Boolean] boolean
|
183
187
|
def toggle_status_bit(index, boolean)
|
data/lib/rnes/version.rb
CHANGED
data/rnes.gemspec
CHANGED
@@ -24,8 +24,5 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.required_ruby_version = '>= 2.2'
|
25
25
|
|
26
26
|
spec.add_development_dependency 'bundler', '~> 1.17'
|
27
|
-
spec.add_development_dependency 'pry'
|
28
27
|
spec.add_development_dependency 'rake', '~> 10.0'
|
29
|
-
spec.add_development_dependency 'rspec', '3.7.0'
|
30
|
-
spec.add_development_dependency 'rubocop', '0.60.0'
|
31
28
|
end
|
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.
|
4
|
+
version: 0.2.0
|
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-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -24,20 +24,6 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.17'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: pry
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
28
|
name: rake
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,34 +38,6 @@ dependencies:
|
|
52
38
|
- - "~>"
|
53
39
|
- !ruby/object:Gem::Version
|
54
40
|
version: '10.0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: rspec
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - '='
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: 3.7.0
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - '='
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: 3.7.0
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: rubocop
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - '='
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: 0.60.0
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - '='
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: 0.60.0
|
83
41
|
description:
|
84
42
|
email:
|
85
43
|
- r7kamura@gmail.com
|