z80_disassembler 0.2.7 → 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 +71 -40
- 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
|
|
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,60 +68,79 @@ 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
|
-
|
|
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}"
|
|
92
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
|
|
93
112
|
|
|
94
|
-
|
|
95
|
-
";--- #{Date.today} --- https://rmda.su ",
|
|
96
|
-
'; _______ _/| __ ______ ____ ',
|
|
97
|
-
'; / __ // |/ \\\\ _ \ / \ ',
|
|
98
|
-
'; / _/ _// \\\\ \\\\ \\\\ \ \ ',
|
|
99
|
-
'; \___\ \\\\___\/___//______//__/\__\ ',
|
|
100
|
-
'; \__/ ',
|
|
101
|
-
";--- size: #{@file_size} --- filename: #{@file_name} "
|
|
102
|
-
]
|
|
113
|
+
def self.compile_text(file_name)
|
|
103
114
|
[
|
|
104
|
-
|
|
105
|
-
'
|
|
106
|
-
'
|
|
107
|
-
|
|
108
|
-
'
|
|
109
|
-
|
|
110
|
-
'
|
|
111
|
-
'
|
|
112
|
-
'
|
|
115
|
+
'length equ end - begin',
|
|
116
|
+
'CODE = #AF',
|
|
117
|
+
'USR = #C0',
|
|
118
|
+
'LOAD = #EF',
|
|
119
|
+
'CLEAR = #FD',
|
|
120
|
+
'RANDOMIZE = #F9',
|
|
121
|
+
' org #5C00',
|
|
122
|
+
'baszac db 0,1', # Line number
|
|
123
|
+
' dw linlen', # Line length
|
|
124
|
+
'linzac db CLEAR, "8", #0E, 0, 0',
|
|
125
|
+
' dw begin - 1',
|
|
126
|
+
' db 0, ":"',
|
|
127
|
+
' db LOAD, "\""',
|
|
128
|
+
'codnam ds 10, 32',
|
|
129
|
+
' org codnam',
|
|
130
|
+
' db "disasm"',
|
|
131
|
+
' org codnam + 10',
|
|
132
|
+
' db "\"", CODE, ":"',
|
|
133
|
+
' db RANDOMIZE, USR, "8", #0E, 0, 0',
|
|
134
|
+
' dw begin', # call address
|
|
135
|
+
' db 0, #0D',
|
|
136
|
+
'linlen = $ - linzac',
|
|
137
|
+
'baslen = $ - baszac',
|
|
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",
|
|
113
144
|
''
|
|
114
145
|
].join("\n")
|
|
115
146
|
end
|
|
@@ -117,13 +148,13 @@ module Z80Disassembler
|
|
|
117
148
|
private
|
|
118
149
|
|
|
119
150
|
def bytes_to_int(array)
|
|
120
|
-
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
|
|
121
152
|
end
|
|
122
153
|
|
|
123
154
|
def command_from_byte(byte)
|
|
124
155
|
case @prefix
|
|
125
156
|
when 'cb' then @prefix = nil; cb_prefix
|
|
126
|
-
when 'ed' then @prefix = nil; ed_prefix
|
|
157
|
+
when 'ed' then @prefix = nil; ed_prefix(byte)
|
|
127
158
|
when 'dd' then @xx = 'IX'; xx_prefix(byte)
|
|
128
159
|
when 'fd' then @xx = 'IY'; xx_prefix(byte)
|
|
129
160
|
when 'xx' then temp = @temp; @temp = nil; displacement(byte, temp)
|
|
@@ -268,7 +299,7 @@ module Z80Disassembler
|
|
|
268
299
|
["#{T_ROT[@y]} ", "BIT #{@y},", "RES #{@y},", "SET #{@y},"][@x] + T_R[@z]
|
|
269
300
|
end
|
|
270
301
|
|
|
271
|
-
def ed_prefix
|
|
302
|
+
def ed_prefix(byte)
|
|
272
303
|
if @x == 1
|
|
273
304
|
case @z
|
|
274
305
|
when 0 then "IN #{"#{T_R[@y]}," if @y != 6}(C)"
|
|
@@ -283,7 +314,7 @@ module Z80Disassembler
|
|
|
283
314
|
elsif @x == 2 && @z <= 3 && @y >= 4
|
|
284
315
|
[['LDI','CPI','INI','OUTI'],['LDD','CPD','IND','OUTD'],['LDIR','CPIR','INIR','OTIR'],['LDDR','CPDR','INDR','OTDR']][@y - 4][@z]
|
|
285
316
|
else
|
|
286
|
-
'
|
|
317
|
+
"#{'DB #ED'}, ##{byte.to_s(16).rjust(2, '0').upcase}"
|
|
287
318
|
end
|
|
288
319
|
end
|
|
289
320
|
end
|
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.
|
|
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-
|
|
11
|
+
date: 2021-07-07 00:00:00.000000000 Z
|
|
12
12
|
dependencies: []
|
|
13
13
|
description:
|
|
14
14
|
email:
|