rnes 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|