z80_disassembler 0.2.7 → 0.3.4

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