z80_disassembler 0.3.3 → 0.3.4
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/lib/z80_disassembler.rb +50 -48
- data/lib/z80_disassembler/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 390347df84d8651faf44793baf078879528723e14e7f3be3b72c7f560d539a25
|
4
|
+
data.tar.gz: 93339825ed0af95a9119436e1e2f3655639296f7e68b95f081c1d29aa7e083e7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5c0f3af21beb421b8ae5c7f10397694531190f74024c07b576ade321eb2c0539cad1df4da916bfaf02f71a52246ca77478556969733138c097291370a91ea346
|
7
|
+
data.tar.gz: 825e0e83814ac331543db23eb02e7faaa06eb94fcdc6a4df4d4c355785fbb93fa900f1ea7ad902c200fc582692e3a4146f18565720f370862815fb57e801e6cb
|
data/lib/z80_disassembler.rb
CHANGED
@@ -6,7 +6,7 @@ module Z80Disassembler
|
|
6
6
|
class Error < StandardError; end
|
7
7
|
|
8
8
|
class Disassembler
|
9
|
-
attr_reader :org, :file_size
|
9
|
+
attr_reader :org, :file_size, :rmda
|
10
10
|
|
11
11
|
# 0 1 2 3 4 5 6 7
|
12
12
|
T_R = [ 'B', 'C', 'D', 'E', 'H', 'L', '(HL)', 'A'].freeze
|
@@ -42,10 +42,22 @@ module Z80Disassembler
|
|
42
42
|
@code ||= File.open(@file).read.bytes
|
43
43
|
@file_size ||= @file.size
|
44
44
|
@x = 0; @y = 0; @z = 0; @p = 0; @q = 0; @xx = nil
|
45
|
-
@lambda = nil; @prefix = nil; @prev = nil
|
45
|
+
@lambda = nil; @prefix = nil; @prev = nil
|
46
|
+
@hash_links = {}; @del_links = []
|
47
|
+
@rmda = """
|
48
|
+
;--- #{Date.today} --- https://rmda.su
|
49
|
+
; _______ _/| __ ______ ____
|
50
|
+
; / __ // |/ \\\\ _ \\ / \\
|
51
|
+
; / _/ _// \\\\ \\\\ \\\\ \\ \\
|
52
|
+
; \\___\\ \\\\___\\/___//______//__/\\__\\
|
53
|
+
; \\__/
|
54
|
+
;--- size: #{@file_size}b --- filename: #{@file_name}
|
55
|
+
|
56
|
+
"""
|
46
57
|
end
|
47
58
|
|
48
59
|
def start
|
60
|
+
result = []
|
49
61
|
addr = @org
|
50
62
|
bytes = []; ascii = []
|
51
63
|
@code.each do |byte|
|
@@ -56,59 +68,50 @@ module Z80Disassembler
|
|
56
68
|
bytes << @prev.rjust(2, '0').upcase
|
57
69
|
next unless str
|
58
70
|
|
59
|
-
|
71
|
+
result << [addr, "##{addr.to_s(16)}".upcase, str, bytes.join(' '), ascii.join]
|
60
72
|
addr += bytes.size
|
61
73
|
bytes = []
|
62
74
|
ascii = []
|
63
75
|
end
|
64
|
-
@result
|
65
|
-
end
|
66
76
|
|
67
|
-
def text
|
68
|
-
hash_links = {}
|
69
|
-
del_links = []
|
70
77
|
link_num = 0
|
71
78
|
int_addrs = @org..(@org + @file_size)
|
72
|
-
|
79
|
+
result.select { |z| z[2] =~ /#[0-F]{4}/ && int_addrs.include?(z[2].split('#').last[0..3].hex) }.each do |x|
|
73
80
|
z = "##{x[2].split('#').last[0..3]}"
|
74
|
-
hash_links[z] = "link_#{link_num += 1}" unless hash_links[z]
|
81
|
+
@hash_links[z] = "link_#{link_num += 1}" unless @hash_links[z]
|
75
82
|
end
|
76
|
-
|
83
|
+
result.select { |z| z[2] =~ /\$/ }.each do |x|
|
77
84
|
z = "##{ (x[0] + x[2].split('$').last.to_i).to_s(16).upcase }"
|
78
|
-
hash_links[z] = "link_#{link_num += 1}" unless hash_links[z]
|
85
|
+
@hash_links[z] = "link_#{link_num += 1}" unless @hash_links[z]
|
79
86
|
end
|
80
|
-
code =
|
81
|
-
del_links << hash_links[addr16] if hash_links[addr16]
|
82
|
-
link = (hash_links[addr16] ? (hash_links[addr16] + ':') : '').ljust(16, ' ')
|
87
|
+
code = result.map do |addr_, addr16, str, bytes_, ascii_|
|
88
|
+
@del_links << @hash_links[addr16] if @hash_links[addr16]
|
89
|
+
link = (@hash_links[addr16] ? (@hash_links[addr16] + ':') : '').ljust(16, ' ')
|
83
90
|
substr, adr = if str.include?('$')
|
84
|
-
["$#{str.split('$').last}", "##{(
|
91
|
+
["$#{str.split('$').last}", "##{(addr_ + str.split('$').last.to_i).to_s(16).upcase}"]
|
85
92
|
else
|
86
93
|
adr = "##{str.split('#').last[0..3]}"
|
87
94
|
[adr, adr]
|
88
95
|
end
|
89
|
-
string = hash_links.keys.include?(adr) ? str.sub(substr, hash_links[adr]) : str
|
96
|
+
string = @hash_links.keys.include?(adr) ? str.sub(substr, @hash_links[adr]) : str
|
90
97
|
|
91
|
-
defb =
|
92
|
-
"#{link} #{string.ljust(16, ' ')}; #{addr16.ljust(5, ' ')} / #{
|
98
|
+
defb = bytes_.split(" ").map { |x| "##{x}"}.join(",")
|
99
|
+
"#{link} #{string.ljust(16, ' ')}; #{addr16.ljust(5, ' ')} / #{addr_.to_s.ljust(5, ' ')} ; #{ascii_.ljust(4, ' ')} ; #{defb}"
|
93
100
|
end.join("\n")
|
101
|
+
[
|
102
|
+
*@rmda,
|
103
|
+
' device zxspectrum128',
|
104
|
+
' ORG #' + @org.to_s(16),
|
105
|
+
@hash_links.map { |key, val| "#{(val + ':').ljust(16, ' ')} EQU #{key}" unless @del_links.include?(val) }.compact.join("\n"),
|
106
|
+
'begin:',
|
107
|
+
code,
|
108
|
+
'end:',
|
109
|
+
''
|
110
|
+
].join("\n")
|
111
|
+
end
|
94
112
|
|
95
|
-
|
96
|
-
";--- #{Date.today} --- https://rmda.su ",
|
97
|
-
'; _______ _/| __ ______ ____ ',
|
98
|
-
'; / __ // |/ \\\\ _ \ / \ ',
|
99
|
-
'; / _/ _// \\\\ \\\\ \\\\ \ \ ',
|
100
|
-
'; \___\ \\\\___\/___//______//__/\__\ ',
|
101
|
-
'; \__/ ',
|
102
|
-
";--- size: #{@file_size} --- filename: #{@file_name} "
|
103
|
-
]
|
113
|
+
def self.compile_text(file_name)
|
104
114
|
[
|
105
|
-
*header,
|
106
|
-
' device zxspectrum48',
|
107
|
-
' ORG #' + @org.to_s(16),
|
108
|
-
hash_links.map { |key, val| "#{val.ljust(16, ' ')} equ #{key}" unless del_links.include?(val) }.compact.join("\n"),
|
109
|
-
'begin:',
|
110
|
-
code,
|
111
|
-
'end:',
|
112
115
|
'length equ end - begin',
|
113
116
|
'CODE = #AF',
|
114
117
|
'USR = #C0',
|
@@ -116,29 +119,28 @@ module Z80Disassembler
|
|
116
119
|
'CLEAR = #FD',
|
117
120
|
'RANDOMIZE = #F9',
|
118
121
|
' org #5C00',
|
119
|
-
'baszac
|
120
|
-
' dw linlen',
|
121
|
-
'linzac',
|
122
|
-
' db CLEAR, "8", #0E, 0, 0',
|
122
|
+
'baszac db 0,1', # Line number
|
123
|
+
' dw linlen', # Line length
|
124
|
+
'linzac db CLEAR, "8", #0E, 0, 0',
|
123
125
|
' dw begin - 1',
|
124
126
|
' db 0, ":"',
|
125
127
|
' db LOAD, "\""',
|
126
|
-
'codnam
|
128
|
+
'codnam ds 10, 32',
|
127
129
|
' org codnam',
|
128
130
|
' db "disasm"',
|
129
131
|
' org codnam + 10',
|
130
132
|
' db "\"", CODE, ":"',
|
131
133
|
' db RANDOMIZE, USR, "8", #0E, 0, 0',
|
132
|
-
' dw begin',
|
134
|
+
' dw begin', # call address
|
133
135
|
' db 0, #0D',
|
134
136
|
'linlen = $ - linzac',
|
135
137
|
'baslen = $ - baszac',
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
138
|
+
" emptytap '#{file_name}.tap'",
|
139
|
+
" savetap '#{file_name}.tap', BASIC, '#{file_name}', baszac, baslen, 1",
|
140
|
+
" savetap '#{file_name}.tap', CODE, '#{file_name}', begin, length, begin",
|
141
|
+
" savesna '#{file_name}.sna', begin",
|
142
|
+
" savebin '#{file_name}.C', begin, length",
|
143
|
+
" savehob '#{file_name}.$C', '#{file_name}.C', begin, length",
|
142
144
|
''
|
143
145
|
].join("\n")
|
144
146
|
end
|
@@ -146,7 +148,7 @@ module Z80Disassembler
|
|
146
148
|
private
|
147
149
|
|
148
150
|
def bytes_to_int(array)
|
149
|
-
array.bytes.reverse.map { |x| x.to_s(16).rjust(2,
|
151
|
+
array.bytes.reverse.map { |x| x.to_s(16).rjust(2, '0') }.join.hex
|
150
152
|
end
|
151
153
|
|
152
154
|
def command_from_byte(byte)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: z80_disassembler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- dvitvitskiy
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-07-
|
11
|
+
date: 2021-07-07 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|