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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1978d7b54f457019351da2f76221d0f10d2670af3daef7584fe0b5ed1b2fbca1
4
- data.tar.gz: bdfb0bd39eb724dbffd4958bfe27ccf814e472ebcbab22376cca2c09fedda7af
3
+ metadata.gz: 390347df84d8651faf44793baf078879528723e14e7f3be3b72c7f560d539a25
4
+ data.tar.gz: 93339825ed0af95a9119436e1e2f3655639296f7e68b95f081c1d29aa7e083e7
5
5
  SHA512:
6
- metadata.gz: c843df467fc7bbc7bdc8a58806ea8eebbef00aad80e1ec5901d07c0ea0b2aaf7c7c7353a22b406e1a1fe3c74a057ba75529bf7dda114e4fe96003023d352dbde
7
- data.tar.gz: 609ada4bff4bb488015456b9134693c8d5426db2e575e6166bbb7ff9d72b820d086b3eac98ddc642b3dc3479c4c889fadc3de815805207a09efa6c25020e497a
6
+ metadata.gz: 5c0f3af21beb421b8ae5c7f10397694531190f74024c07b576ade321eb2c0539cad1df4da916bfaf02f71a52246ca77478556969733138c097291370a91ea346
7
+ data.tar.gz: 825e0e83814ac331543db23eb02e7faaa06eb94fcdc6a4df4d4c355785fbb93fa900f1ea7ad902c200fc582692e3a4146f18565720f370862815fb57e801e6cb
@@ -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; @result = []
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
- @result << [addr, "##{addr.to_s(16)}".upcase, str, bytes.join(' '), ascii.join]
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
- @result.select { |z| z[2] =~ /#[0-F]{4}/ && int_addrs.include?(z[2].split('#').last[0..3].hex) }.each do |x|
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
- @result.select { |z| z[2] =~ /\$/ }.each do |x|
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 = @result.map do |addr, addr16, str, bytes, ascii|
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}", "##{(addr + str.split('$').last.to_i).to_s(16).upcase}"]
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
- "#{link} #{string.ljust(16, ' ')}; #{addr16.ljust(5, ' ')} / #{addr.to_s.ljust(5, ' ')} ; #{bytes.ljust(14, ' ')} ; #{ascii.ljust(4, ' ')} ;"
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
- header = [
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
- *header,
105
- ' device zxspectrum48',
106
- ' ORG #' + @org.to_s(16),
107
- hash_links.map { |key, val| "#{val.ljust(16, ' ')} equ #{key}" unless del_links.include?(val) }.compact.join("\n"),
108
- 'begin:',
109
- code,
110
- 'end:',
111
- ' savesna "disasm.sna", begin',
112
- ' savebin "disasm.C", begin, end - begin',
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, "0") }.join.hex
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
- 'NOP'
317
+ "#{'DB #ED'}, ##{byte.to_s(16).rjust(2, '0').upcase}"
287
318
  end
288
319
  end
289
320
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Z80Disassembler
4
- VERSION = '0.2.7'
4
+ VERSION = '0.3.4'
5
5
  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.2.7
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-06-16 00:00:00.000000000 Z
11
+ date: 2021-07-07 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email: