c8dasm 0.99.0

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