c8dasm 0.99.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.
Files changed (75) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +16 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +3 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +15 -0
  7. data/README.md +109 -0
  8. data/Rakefile +7 -0
  9. data/bin/c8dasm +13 -0
  10. data/c8dasm.gemspec +24 -0
  11. data/lib/c8dasm.rb +11 -0
  12. data/lib/c8dasm/assemblies.rb +18 -0
  13. data/lib/c8dasm/assemblies/asm0.rb +15 -0
  14. data/lib/c8dasm/assemblies/asm1.rb +10 -0
  15. data/lib/c8dasm/assemblies/asm2.rb +10 -0
  16. data/lib/c8dasm/assemblies/asm3.rb +10 -0
  17. data/lib/c8dasm/assemblies/asm4.rb +9 -0
  18. data/lib/c8dasm/assemblies/asm5.rb +12 -0
  19. data/lib/c8dasm/assemblies/asm6.rb +9 -0
  20. data/lib/c8dasm/assemblies/asm7.rb +9 -0
  21. data/lib/c8dasm/assemblies/asm8.rb +23 -0
  22. data/lib/c8dasm/assemblies/asm9.rb +11 -0
  23. data/lib/c8dasm/assemblies/asm_base.rb +26 -0
  24. data/lib/c8dasm/assemblies/asma.rb +11 -0
  25. data/lib/c8dasm/assemblies/asmb.rb +12 -0
  26. data/lib/c8dasm/assemblies/asmc.rb +11 -0
  27. data/lib/c8dasm/assemblies/asmd.rb +11 -0
  28. data/lib/c8dasm/assemblies/asme.rb +16 -0
  29. data/lib/c8dasm/assemblies/asmf.rb +20 -0
  30. data/lib/c8dasm/assembly.rb +22 -0
  31. data/lib/c8dasm/chip8_reader.rb +38 -0
  32. data/lib/c8dasm/comment.rb +23 -0
  33. data/lib/c8dasm/comments.rb +17 -0
  34. data/lib/c8dasm/comments/comment0.rb +14 -0
  35. data/lib/c8dasm/comments/comment1.rb +10 -0
  36. data/lib/c8dasm/comments/comment2.rb +11 -0
  37. data/lib/c8dasm/comments/comment3.rb +11 -0
  38. data/lib/c8dasm/comments/comment4.rb +11 -0
  39. data/lib/c8dasm/comments/comment5.rb +12 -0
  40. data/lib/c8dasm/comments/comment6.rb +11 -0
  41. data/lib/c8dasm/comments/comment7.rb +11 -0
  42. data/lib/c8dasm/comments/comment8.rb +25 -0
  43. data/lib/c8dasm/comments/comment9.rb +11 -0
  44. data/lib/c8dasm/comments/comment_base.rb +26 -0
  45. data/lib/c8dasm/comments/commenta.rb +11 -0
  46. data/lib/c8dasm/comments/commentb.rb +12 -0
  47. data/lib/c8dasm/comments/commentc.rb +11 -0
  48. data/lib/c8dasm/comments/commentd.rb +11 -0
  49. data/lib/c8dasm/comments/commente.rb +15 -0
  50. data/lib/c8dasm/comments/commentf.rb +30 -0
  51. data/lib/c8dasm/opcode.rb +34 -0
  52. data/lib/c8dasm/version.rb +3 -0
  53. data/spec/15-puzzle.ch8 +0 -0
  54. data/spec/MAZE +0 -0
  55. data/spec/c8dasm_spec.rb +7 -0
  56. data/spec/chip8_reader_spec.rb +27 -0
  57. data/spec/opcode_0_spec.rb +39 -0
  58. data/spec/opcode_1_spec.rb +23 -0
  59. data/spec/opcode_2_spec.rb +23 -0
  60. data/spec/opcode_3_spec.rb +23 -0
  61. data/spec/opcode_4_spec.rb +23 -0
  62. data/spec/opcode_5_spec.rb +25 -0
  63. data/spec/opcode_6_spec.rb +23 -0
  64. data/spec/opcode_7_spec.rb +23 -0
  65. data/spec/opcode_8_spec.rb +119 -0
  66. data/spec/opcode_9_spec.rb +24 -0
  67. data/spec/opcode_a_spec.rb +23 -0
  68. data/spec/opcode_b_spec.rb +24 -0
  69. data/spec/opcode_c_spec.rb +23 -0
  70. data/spec/opcode_d_spec.rb +23 -0
  71. data/spec/opcode_e_spec.rb +39 -0
  72. data/spec/opcode_f_spec.rb +151 -0
  73. data/spec/opcode_spec.rb +45 -0
  74. data/spec/spec_helper.rb +2 -0
  75. metadata +183 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 960ec7c6a8d76ad08c1b481f63e40788d3b2547c
4
+ data.tar.gz: f1a9a569beebd417784cc90c04513762d691d769
5
+ SHA512:
6
+ metadata.gz: d1f105e12fe48146e976436b1c68208698d9f8d536af64e2841a5fc70c78144d280e80951fdcf1eff4586454e15817cfe50bcef36f17a5797169df04150a2fb6
7
+ data.tar.gz: acd3e8a7b88ab659522d057494aa704905018d8238a3f80840896da7c78db34e871747055c0dd5a03189eee28ec7c161bea1c36055101c62a5aafe84f1d05c7d
@@ -0,0 +1,16 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
15
+ TODO
16
+ sidenotes.md
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.0
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in c8dasm.gemspec
4
+ gemspec
@@ -0,0 +1,15 @@
1
+ c8dasm - a disassembler for chip8
2
+ Copyright (C) 2015 Xavier Nayrac
3
+
4
+ This program is free software: you can redistribute it and/or modify
5
+ it under the terms of the GNU General Public License as published by
6
+ the Free Software Foundation, either version 3 of the License, or
7
+ (at your option) any later version.
8
+
9
+ This program is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ GNU General Public License for more details.
13
+
14
+ You should have received a copy of the GNU General Public License
15
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
@@ -0,0 +1,109 @@
1
+ # C8dasm
2
+
3
+ `c8dasm` is a utility to disassemble a Chip8 binary file.
4
+
5
+ ## Installation
6
+
7
+ Install it as:
8
+
9
+ $ gem install c8dasm
10
+
11
+ ## Usage
12
+
13
+ $ c8dasm chip8file
14
+
15
+ ### Example
16
+
17
+ $ c8dasm MAZE
18
+ 200:a21e LD I, 21e ;Puts 21e into register I.
19
+ 202:c201 RND V2, 01 ;Puts random byte AND 01 into register V2.
20
+ 204:3201 SE V2, 01 ;Skip next instruction if V2 = 01.
21
+ 206:a21a LD I, 21a ;Puts 21a into register I.
22
+ 208:d014 DRW V0, V1, 4 ;Draws 4-byte sprite from I at (V0, V1)
23
+ 20a:7004 ADD V0, 04 ;V0 = V0 + 04.
24
+ 20c:3040 SE V0, 40 ;Skip next instruction if V0 = 40.
25
+ 20e:1200 JP 200 ;Jump to location 200.
26
+ 210:6000 LD V0, 00 ;Puts the value 00 into register V0.
27
+ 212:7104 ADD V1, 04 ;V1 = V1 + 04.
28
+ ...
29
+
30
+ ## License
31
+
32
+ GPLv3
33
+
34
+ ## Standard Chip-8 Instructions (What's remain to do)
35
+
36
+ - [x] 00E0 - CLS
37
+ - [x] 00EE - RET
38
+ - [ ] 0nnn - SYS addr
39
+ - [x] 1nnn - JP addr
40
+ - [x] 2nnn - CALL addr
41
+ - [x] 3xkk - SE Vx, byte
42
+ - [x] 4xkk - SNE Vx, byte
43
+ - [x] 5xy0 - SE Vx, Vy
44
+ - [x] 6xkk - LD Vx, byte
45
+ - [x] 7xkk - ADD Vx, byte
46
+ - [x] 8xy0 - LD Vx, Vy
47
+ - [ ] 8xy1 - OR Vx, Vy
48
+ - [x] 8xy2 - AND Vx, Vy
49
+ - [x] 8xy3 - XOR Vx, Vy
50
+ - [x] 8xy4 - ADD Vx, Vy
51
+ - [x] 8xy5 - SUB Vx, Vy
52
+ - [x] 8xy6 - SHR Vx {, Vy}
53
+ - [ ] 8xy7 - SUBN Vx, Vy
54
+ - [x] 8xyE - SHL Vx {, Vy}
55
+ - [x] 9xy0 - SNE Vx, Vy
56
+ - [x] Annn - LD I, addr
57
+ - [x] Bnnn - JP V0, addr
58
+ - [x] Cxkk - RND Vx, byte
59
+ - [x] Dxyn - DRW Vx, Vy, nibble
60
+ - [x] Ex9E - SKP Vx
61
+ - [x] ExA1 - SKNP Vx
62
+ - [x] Fx07 - LD Vx, DT
63
+ - [x] Fx0A - LD Vx, KEY
64
+ - [x] Fx15 - LD DT, Vx
65
+ - [x] Fx18 - LD ST, Vx
66
+ - [x] Fx1E - ADD I, Vx
67
+ - [x] Fx29 - LD F, Vx
68
+ - [x] Fx33 - LD B, Vx
69
+ - [x] Fx55 - LD [I], Vx
70
+ - [x] Fx65 - LD Vx, [I]
71
+
72
+ ## TODO
73
+
74
+ Check input file.
75
+
76
+ Option --help and --version.
77
+
78
+ Data range display option, for instance:
79
+
80
+ $ c8dasm --data=21a,221 MAZE
81
+ 200:a21e LD I, 21e ;Puts 21e into register I.
82
+ 202:c201 RND V2, 01 ;Puts random byte AND 01 into register V2.
83
+ 204:3201 SE V2, 01 ;Skip next instruction if V2 = 01.
84
+ 206:a21a LD I, 21a ;Puts 21a into register I.
85
+ 208:d014 DRW V0, V1, 4 ;Draws 4-byte sprite from I at (V0, V1)
86
+ 20a:7004 ADD V0, 04 ;V0 = V0 + 04.
87
+ 20c:3040 SE V0, 40 ;Skip next instruction if V0 = 40.
88
+ 20e:1200 JP 200 ;Jump to location 200.
89
+ 210:6000 LD V0, 00 ;Puts the value 00 into register V0.
90
+ 212:7104 ADD V1, 04 ;V1 = V1 + 04.
91
+ 214:3120 SE V1, 20 ;Skip next instruction if V1 = 20.
92
+ 216:1200 JP 200 ;Jump to location 200.
93
+ 218:1218 JP 218 ;Jump to location 218.
94
+ 21a:80 @.......
95
+ 21b:40 .@......
96
+ 21c:20 ..@.....
97
+ 21d:10 ...@....
98
+ 21e:20 ..@.....
99
+ 21f:40 .@......
100
+ 220:80 @.......
101
+ 221:10 ...@....
102
+
103
+ ## Contributing
104
+
105
+ 1. Fork it ( https://github.com/[my-github-username]/c8dasm/fork )
106
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
107
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
108
+ 4. Push to the branch (`git push origin my-new-feature`)
109
+ 5. Create a new Pull Request
@@ -0,0 +1,7 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
7
+
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'c8dasm'
4
+
5
+ reader = C8dasm::Chip8Reader.new(ARGV[0])
6
+
7
+ counter_base = 0x200
8
+
9
+ opcodes = reader.opcodes.map.with_index do |item, index|
10
+ C8dasm::Opcode.new(item, address: counter_base + 2 * index)
11
+ end
12
+
13
+ opcodes.each {|opcode| puts opcode.line }
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'c8dasm/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "c8dasm"
8
+ spec.version = C8dasm::VERSION
9
+ spec.authors = ["lkdjiin"]
10
+ spec.email = ["xavier.nayrac@gmail.com"]
11
+ spec.summary = %q{Disassembler for Chip8 binaries.}
12
+ spec.description = %q{c8dasm is a utility to disassemble a Chip8 binary file.}
13
+ spec.homepage = ""
14
+ spec.license = "GPLv3"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.7"
22
+ spec.add_development_dependency "rake", "~> 10.0"
23
+ spec.add_development_dependency "rspec"
24
+ end
@@ -0,0 +1,11 @@
1
+ require "c8dasm/version"
2
+ require "c8dasm/chip8_reader"
3
+ require "c8dasm/opcode"
4
+ require "c8dasm/assembly"
5
+ require "c8dasm/assemblies"
6
+ require "c8dasm/comment"
7
+ require "c8dasm/comments"
8
+
9
+ # A desassembly utility for Chip-8.
10
+ module C8dasm
11
+ end
@@ -0,0 +1,18 @@
1
+ require "c8dasm/assemblies/asm_base"
2
+ require "c8dasm/assemblies/asm0"
3
+ require "c8dasm/assemblies/asm1"
4
+ require "c8dasm/assemblies/asm2"
5
+ require "c8dasm/assemblies/asm3"
6
+ require "c8dasm/assemblies/asm4"
7
+ require "c8dasm/assemblies/asm5"
8
+ require "c8dasm/assemblies/asm6"
9
+ require "c8dasm/assemblies/asm7"
10
+ require "c8dasm/assemblies/asm8"
11
+ require "c8dasm/assemblies/asm9"
12
+ require "c8dasm/assemblies/asma"
13
+ require "c8dasm/assemblies/asmb"
14
+ require "c8dasm/assemblies/asmc"
15
+ require "c8dasm/assemblies/asmd"
16
+ require "c8dasm/assemblies/asme"
17
+ require "c8dasm/assemblies/asmf"
18
+
@@ -0,0 +1,15 @@
1
+ module C8dasm
2
+
3
+ class Asm0 < AsmBase
4
+
5
+ def to_s
6
+ if @opcode == '00ee'
7
+ "RET"
8
+ elsif @opcode == '00e0'
9
+ "CLS"
10
+ end
11
+ end
12
+
13
+ end
14
+ end
15
+
@@ -0,0 +1,10 @@
1
+ module C8dasm
2
+
3
+ class Asm1 < AsmBase
4
+
5
+ def to_s
6
+ "JP #{nnn}"
7
+ end
8
+
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module C8dasm
2
+
3
+ class Asm2 < AsmBase
4
+
5
+ def to_s
6
+ "CALL #{nnn}"
7
+ end
8
+
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module C8dasm
2
+
3
+ class Asm3 < AsmBase
4
+
5
+ def to_s
6
+ "SE V#{x}, #{kk}"
7
+ end
8
+
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+ module C8dasm
2
+
3
+ class Asm4 < AsmBase
4
+
5
+ def to_s
6
+ "SNE V#{x}, #{kk}"
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,12 @@
1
+ module C8dasm
2
+
3
+ class Asm5 < AsmBase
4
+
5
+ def to_s
6
+ "SE V#{x}, V#{y}"
7
+ end
8
+
9
+ end
10
+
11
+ end
12
+
@@ -0,0 +1,9 @@
1
+ module C8dasm
2
+
3
+ class Asm6 < AsmBase
4
+
5
+ def to_s
6
+ "LD V#{x}, #{kk}"
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module C8dasm
2
+
3
+ class Asm7 < AsmBase
4
+
5
+ def to_s
6
+ "ADD V#{x}, #{kk}"
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,23 @@
1
+ module C8dasm
2
+
3
+ class Asm8 < AsmBase
4
+
5
+ def to_s
6
+ case last_opcode
7
+ when '0' then "LD V#{x}, V#{y}"
8
+ when '2' then "AND V#{x}, V#{y}"
9
+ when '3' then "XOR V#{x}, V#{y}"
10
+ when '4' then "ADD V#{x}, V#{y}"
11
+ when '5' then "SUB V#{x}, V#{y}"
12
+ when '6' then "SHR V#{x}, V#{y}"
13
+ when 'e' then "SHL V#{x}, V#{y}"
14
+ end
15
+ end
16
+
17
+ def last_opcode
18
+ @opcode[3]
19
+ end
20
+
21
+ end
22
+ end
23
+
@@ -0,0 +1,11 @@
1
+ module C8dasm
2
+
3
+ class Asm9 < AsmBase
4
+
5
+ def to_s
6
+ "SNE V#{x}, V#{y}"
7
+ end
8
+
9
+ end
10
+
11
+ end
@@ -0,0 +1,26 @@
1
+ module C8dasm
2
+
3
+ class AsmBase
4
+
5
+ def initialize(opcode)
6
+ @opcode = opcode
7
+ end
8
+
9
+ def nnn
10
+ @opcode[1, 3]
11
+ end
12
+
13
+ def kk
14
+ @opcode[2, 2]
15
+ end
16
+
17
+ def x
18
+ @opcode[1]
19
+ end
20
+
21
+ def y
22
+ @opcode[2]
23
+ end
24
+
25
+ end
26
+ end
@@ -0,0 +1,11 @@
1
+ module C8dasm
2
+
3
+ class Asma < AsmBase
4
+
5
+ def to_s
6
+ "LD I, #{nnn}"
7
+ end
8
+
9
+ end
10
+ end
11
+
@@ -0,0 +1,12 @@
1
+ module C8dasm
2
+
3
+ class Asmb < AsmBase
4
+
5
+ def to_s
6
+ "JP V0, #{nnn}"
7
+ end
8
+
9
+ end
10
+
11
+ end
12
+
@@ -0,0 +1,11 @@
1
+ module C8dasm
2
+
3
+ class Asmc < AsmBase
4
+
5
+ def to_s
6
+ "RND V#{x}, #{kk}"
7
+ end
8
+
9
+ end
10
+ end
11
+