zobjinspect 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt ADDED
@@ -0,0 +1,6 @@
1
+ === 1.0.0 / 2009-07-09
2
+
3
+ * 1 major enhancement
4
+
5
+ * Birthday!
6
+
data/Manifest.txt ADDED
@@ -0,0 +1,13 @@
1
+ History.txt
2
+ Manifest.txt
3
+ README.txt
4
+ Rakefile
5
+ bin/zlibinspect
6
+ bin/zobjinspect
7
+ lib/library_file.rb
8
+ lib/object_file.rb
9
+ lib/zobjinspect.rb
10
+ test/block_device.lib.bin
11
+ test/read_block.o.bin
12
+ test/test_library_file.rb
13
+ test/test_object_file.rb
data/README.txt ADDED
@@ -0,0 +1,42 @@
1
+ = zobjinspect
2
+
3
+ * http://zobjinspect.rubyforge.org
4
+
5
+ == DESCRIPTION:
6
+
7
+ * A set of utilities for inspecting object and library files generated
8
+ by z80asm, the assembler from z88dk - http://www.z88dk.org/
9
+
10
+ == SYNOPSIS:
11
+
12
+ zobjinspect something.o
13
+ zlibinspect something_else.lib
14
+
15
+ == INSTALL:
16
+
17
+ * sudo gem install zobjinspect
18
+
19
+ == LICENSE:
20
+
21
+ (The MIT License)
22
+
23
+ Copyright (c) 2009 Matthew Westcott
24
+
25
+ Permission is hereby granted, free of charge, to any person obtaining
26
+ a copy of this software and associated documentation files (the
27
+ 'Software'), to deal in the Software without restriction, including
28
+ without limitation the rights to use, copy, modify, merge, publish,
29
+ distribute, sublicense, and/or sell copies of the Software, and to
30
+ permit persons to whom the Software is furnished to do so, subject to
31
+ the following conditions:
32
+
33
+ The above copyright notice and this permission notice shall be
34
+ included in all copies or substantial portions of the Software.
35
+
36
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
37
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
38
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
39
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
40
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
41
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
42
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'hoe'
5
+ require './lib/zobjinspect.rb'
6
+
7
+ Hoe.new('zobjinspect', Zobjinspect::VERSION) do |p|
8
+ p.developer('Matt Westcott', 'matt@west.co.tt')
9
+ end
10
+
11
+ # vim: syntax=Ruby
data/bin/zlibinspect ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
4
+ require 'library_file'
5
+
6
+ io = File.open(ARGV[0])
7
+ LibraryFile.read(io).each do |mod|
8
+ puts mod.describe
9
+ puts "---------------\n\n"
10
+ end
data/bin/zobjinspect ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
4
+ require 'object_file'
5
+
6
+ io = File.open(ARGV[0])
7
+ puts ObjectFile.read(io).describe
@@ -0,0 +1,21 @@
1
+ require 'object_file'
2
+
3
+ module LibraryFile
4
+ def self.read(io)
5
+ if io.read(8) != 'Z80LMF01'
6
+ raise "not a Z80asm library file"
7
+ end
8
+
9
+ next_object_file_ptr = 8
10
+
11
+ objects = []
12
+
13
+ while next_object_file_ptr != 0xffffffff
14
+ io.seek(next_object_file_ptr)
15
+ next_object_file_ptr, next_object_file_length = io.read(8).unpack('VV')
16
+ objects << ObjectFile.read(io)
17
+ end
18
+
19
+ objects
20
+ end
21
+ end
@@ -0,0 +1,81 @@
1
+ class ObjectFile < Struct.new(
2
+ :name, :org_address, :expression_declarations, :name_declarations, :library_name_declarations)
3
+
4
+ class ExpressionDeclaration < Struct.new(:type, :patchptr, :expression)
5
+ end
6
+
7
+ class NameDeclaration < Struct.new(:scope, :type, :value, :name)
8
+ end
9
+
10
+ def self.read(io)
11
+ if io.read(8) != 'Z80RMF01'
12
+ raise "not a Z80asm object file"
13
+ end
14
+ org_address, module_name_ptr, expression_declarations_ptr,
15
+ name_declarations_ptr, library_name_declarations_ptr,
16
+ machine_code_block_ptr = io.read(22).unpack('vVVVVV')
17
+
18
+ expression_declarations = []
19
+ if expression_declarations_ptr != 0xffffffff
20
+ expression_declarations_length = [name_declarations_ptr, library_name_declarations_ptr, module_name_ptr].min - expression_declarations_ptr
21
+ expression_declarations_bin =
22
+ io.read(expression_declarations_length)
23
+ until expression_declarations_bin == ''
24
+ type, patchptr, length =
25
+ expression_declarations_bin.slice!(0...4).unpack('a1vc')
26
+ expression = expression_declarations_bin.slice!(0...length)
27
+ expression_declarations_bin.slice!(0) # strip off null
28
+ expression_declarations << ExpressionDeclaration.new(type, patchptr, expression)
29
+ end
30
+ end
31
+
32
+ name_declarations = []
33
+ if name_declarations_ptr != 0xffffffff
34
+ name_declarations_length = [library_name_declarations_ptr, module_name_ptr].min - name_declarations_ptr
35
+ name_declarations_bin =
36
+ io.read(name_declarations_length)
37
+ until name_declarations_bin == ''
38
+ scope, type, value, length =
39
+ name_declarations_bin.slice!(0...7).unpack('a1a1Vc')
40
+ name = name_declarations_bin.slice!(0...length)
41
+ name_declarations << NameDeclaration.new(scope, type, value, name)
42
+ end
43
+ end
44
+
45
+ library_name_declarations = []
46
+ if library_name_declarations_ptr != 0xffffffff
47
+ library_name_declarations_bin =
48
+ io.read(module_name_ptr - library_name_declarations_ptr)
49
+ until library_name_declarations_bin == ''
50
+ length = library_name_declarations_bin.slice!(0)
51
+ library_name_declarations << library_name_declarations_bin.slice!(0...length)
52
+ end
53
+ end
54
+
55
+ module_name_length, = io.read(1).unpack('c')
56
+ module_name = io.read(module_name_length)
57
+
58
+ new(module_name, org_address, expression_declarations, name_declarations,
59
+ library_name_declarations)
60
+ end
61
+
62
+ def describe
63
+ out = ''
64
+ out << "#{name}, org #{org_address}\n===============\n"
65
+ out << "Expression declarations:\n"
66
+ for expr in expression_declarations
67
+ out << "#{expr.type == 'C' ? 'Constant' : 'Relocatable address'} at #{expr.patchptr} = #{expr.expression}\n"
68
+ end
69
+
70
+ out << "\nName declarations:\n"
71
+ for name in name_declarations
72
+ out << "#{name.scope} #{name.type} #{name.name} = #{name.value}\n"
73
+ end
74
+
75
+ out << "\nLibrary name declarations:\n"
76
+ for name in library_name_declarations
77
+ out << "#{name}\n"
78
+ end
79
+ out
80
+ end
81
+ end
@@ -0,0 +1,3 @@
1
+ class Zobjinspect
2
+ VERSION = '1.0.0'
3
+ end
Binary file
Binary file
@@ -0,0 +1,14 @@
1
+ require "test/unit"
2
+
3
+ $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
4
+ require "library_file"
5
+
6
+ class TestLibraryFile < Test::Unit::TestCase
7
+ def test_library_file
8
+ io = File.open "#{File.dirname(__FILE__)}/block_device.lib.bin"
9
+ library_file = LibraryFile.read(io)
10
+ assert_equal 2, library_file.size
11
+ assert_equal "READ_BLOCK", library_file[0].name
12
+ assert_equal "READ_BLOCK_CALLEE", library_file[1].name
13
+ end
14
+ end
@@ -0,0 +1,28 @@
1
+ require "test/unit"
2
+
3
+ $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
4
+ require "object_file"
5
+
6
+ class TestObjectFile < Test::Unit::TestCase
7
+ def test_object_file
8
+ io = File.open "#{File.dirname(__FILE__)}/read_block.o.bin"
9
+ obj = ObjectFile.read(io)
10
+ assert_equal "READ_BLOCK", obj.name
11
+ assert_equal 0xffff, obj.org_address
12
+
13
+ assert_equal 1, obj.expression_declarations.size
14
+ expr = obj.expression_declarations[0]
15
+ assert_equal "C", expr.type
16
+ assert_equal 13, expr.patchptr
17
+ assert_equal "READ_BLOCK_CALLEE+ASMDISP_READ_BLOCK_CALLEE", expr.expression
18
+
19
+ assert_equal 1, obj.name_declarations.size
20
+ name = obj.name_declarations[0]
21
+ assert_equal "X", name.scope
22
+ assert_equal "A", name.type
23
+ assert_equal 0, name.value
24
+ assert_equal "READ_BLOCK", name.name
25
+
26
+ assert_equal ["READ_BLOCK_CALLEE"], obj.library_name_declarations
27
+ end
28
+ end
metadata ADDED
@@ -0,0 +1,80 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: zobjinspect
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Matt Westcott
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-07-09 00:00:00 +02:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: hoe
17
+ type: :development
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 2.3.2
24
+ version:
25
+ description: "* A set of utilities for inspecting object and library files generated by z80asm, the assembler from z88dk - http://www.z88dk.org/"
26
+ email:
27
+ - matt@west.co.tt
28
+ executables:
29
+ - zlibinspect
30
+ - zobjinspect
31
+ extensions: []
32
+
33
+ extra_rdoc_files:
34
+ - History.txt
35
+ - Manifest.txt
36
+ - README.txt
37
+ files:
38
+ - History.txt
39
+ - Manifest.txt
40
+ - README.txt
41
+ - Rakefile
42
+ - bin/zlibinspect
43
+ - bin/zobjinspect
44
+ - lib/library_file.rb
45
+ - lib/object_file.rb
46
+ - lib/zobjinspect.rb
47
+ - test/block_device.lib.bin
48
+ - test/read_block.o.bin
49
+ - test/test_library_file.rb
50
+ - test/test_object_file.rb
51
+ has_rdoc: true
52
+ homepage: http://zobjinspect.rubyforge.org
53
+ post_install_message:
54
+ rdoc_options:
55
+ - --main
56
+ - README.txt
57
+ require_paths:
58
+ - lib
59
+ required_ruby_version: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: "0"
64
+ version:
65
+ required_rubygems_version: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: "0"
70
+ version:
71
+ requirements: []
72
+
73
+ rubyforge_project: zobjinspect
74
+ rubygems_version: 1.3.1
75
+ signing_key:
76
+ specification_version: 2
77
+ summary: "* A set of utilities for inspecting object and library files generated by z80asm, the assembler from z88dk - http://www.z88dk.org/"
78
+ test_files:
79
+ - test/test_library_file.rb
80
+ - test/test_object_file.rb