z80_disassembler 0.2.3 → 0.3.0

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: 7fda0599a6e835b5063fc6115dcdc364cfc895b2a7cbf1dba8f57965698526a5
4
- data.tar.gz: 705361c3aa8d088e967411643e9774a1d1cbc169a9e7ce57d8ffa8087a833f68
3
+ metadata.gz: 56e8580f70e53450065ba78d68f19758e0072a28f1eec1c67ac4cff7d825e464
4
+ data.tar.gz: 62f84332480a3e3cd218f41db288e9050d908e05fccb550a288823b23193a9e3
5
5
  SHA512:
6
- metadata.gz: 6b2b887c58d4bf48e32094f9753e71520ff3b1c12d7d7ab46870c0179628005b3e13be8c191c0fd305e78004c3b2b630833536fceb77ff49f004ed19cb17b59e
7
- data.tar.gz: cfd8680fc373ed1031ffd89af3ad8ff7c1cdb67f6fa5e5aa53f15b9f1d4e172c7c5983f14d62914f2baa3e0d49249472f744cb851b69770c546205e51f3c4b5e
6
+ metadata.gz: 6ea0700062335768dbf0d6fe916f1b3c318a8312c018c6a84519d95a6c9d218fb0fe7277ed93dfc9ddcdbecc7d62c37a1eed15110bc2501ecde3b9870245f147
7
+ data.tar.gz: 173aa895338469e982c9f82f41a8d1b458eb7bfd5cf357ba0c0dd81db56d555754597b266ce6cae83d6d327bb04d39026bd320f0b9d34b6703a7e0f605fa60a7
@@ -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
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
@@ -69,29 +69,75 @@ module Z80Disassembler
69
69
  del_links = []
70
70
  link_num = 0
71
71
  int_addrs = @org..(@org + @file_size)
72
- with_links = @result.select { |z| z[2] =~ /#[0-F]{4}/ && int_addrs.include?(z[2].split('#').last[0..3].hex) }
73
- with_links.each do |x|
72
+ @result.select { |z| z[2] =~ /#[0-F]{4}/ && int_addrs.include?(z[2].split('#').last[0..3].hex) }.each do |x|
74
73
  z = "##{x[2].split('#').last[0..3]}"
75
74
  hash_links[z] = "link_#{link_num += 1}" unless hash_links[z]
76
75
  end
77
-
76
+ @result.select { |z| z[2] =~ /\$/ }.each do |x|
77
+ 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]
79
+ end
78
80
  code = @result.map do |addr, addr16, str, bytes, ascii|
79
81
  del_links << hash_links[addr16] if hash_links[addr16]
80
- link = (hash_links[addr16] || '').ljust(16, ' ')
81
- adr = '#' + str.split('#').last[0..3]
82
- string = hash_links.keys.include?(adr) ? str.sub(adr, hash_links[adr]) : str
82
+ link = (hash_links[addr16] ? (hash_links[addr16] + ':') : '').ljust(16, ' ')
83
+ substr, adr = if str.include?('$')
84
+ ["$#{str.split('$').last}", "##{(addr + str.split('$').last.to_i).to_s(16).upcase}"]
85
+ else
86
+ adr = "##{str.split('#').last[0..3]}"
87
+ [adr, adr]
88
+ end
89
+ string = hash_links.keys.include?(adr) ? str.sub(substr, hash_links[adr]) : str
90
+
83
91
  "#{link} #{string.ljust(16, ' ')}; #{addr16.ljust(5, ' ')} / #{addr.to_s.ljust(5, ' ')} ; #{bytes.ljust(14, ' ')} ; #{ascii.ljust(4, ' ')} ;"
84
92
  end.join("\n")
85
93
 
94
+ header = [
95
+ ";--- #{Date.today} --- https://rmda.su ",
96
+ '; _______ _/| __ ______ ____ ',
97
+ '; / __ // |/ \\\\ _ \ / \ ',
98
+ '; / _/ _// \\\\ \\\\ \\\\ \ \ ',
99
+ '; \___\ \\\\___\/___//______//__/\__\ ',
100
+ '; \__/ ',
101
+ ";--- size: #{@file_size} --- filename: #{@file_name} "
102
+ ]
86
103
  [
104
+ *header,
87
105
  ' device zxspectrum48',
88
106
  ' ORG #' + @org.to_s(16),
89
107
  hash_links.map { |key, val| "#{val.ljust(16, ' ')} equ #{key}" unless del_links.include?(val) }.compact.join("\n"),
90
108
  'begin:',
91
109
  code,
92
110
  'end:',
111
+ 'length equ end - begin',
112
+ 'CODE = #AF',
113
+ 'USR = #C0',
114
+ 'LOAD = #EF',
115
+ 'CLEAR = #FD',
116
+ 'RANDOMIZE = #F9',
117
+ ' org #5C00',
118
+ ' baszac db 0, 1', # Line number
119
+ ' dw linlen', # Line length
120
+ ' linzac',
121
+ ' db CLEAR, "8", #0E, 0, 0',
122
+ ' dw begin - 1',
123
+ ' db 0, ":"',
124
+ ' db LOAD, "\""',
125
+ ' codnam ds 10, 32',
126
+ ' org codnam',
127
+ ' db "disasm"',
128
+ ' org codnam + 10',
129
+ ' db "\"", CODE, ":"',
130
+ ' db RANDOMIZE, USR, "8", #0E, 0, 0',
131
+ ' dw begin', # call address
132
+ ' db 0, #0D',
133
+ ' linlen = $ - linzac',
134
+ ' baslen = $ - baszac',
135
+ ' emptytap "disasm.tap"',
136
+ ' savetap "disasm.tap", BASIC, "disasm", baszac, baslen, 1',
137
+ ' savetap "disasm.tap", CODE, "disasm", begin, length, begin',
93
138
  ' savesna "disasm.sna", begin',
94
- ' savebin "disasm.C", begin, end - begin',
139
+ ' savebin "disasm.C", begin, length',
140
+ ' savehob "disasm.$C", "disasm.C", begin, length',
95
141
  ''
96
142
  ].join("\n")
97
143
  end
@@ -113,16 +159,18 @@ module Z80Disassembler
113
159
  when 1
114
160
  resp = @lambda.call(@arg, byte.to_s(16).rjust(2, '0').upcase)
115
161
  @prefix = nil; temp = @temp; @temp = nil
116
- if temp && resp.include?(')')
117
- resp = @xx ? displacement(temp.hex, resp) : resp.sub(')', "#{temp})").sub('(', '(#')
162
+ if temp && resp.include?('(HL)')
163
+ @xx ? resp = displacement(temp.hex, resp) : resp += temp
164
+ elsif temp && resp.include?(')')
165
+ # resp = displacement(temp.hex, resp) if @xx
166
+ resp = resp.sub(')', "#{temp})").sub('(', '(#')
118
167
  elsif temp
119
168
  resp += temp
120
169
  end
121
170
  resp = hl_to_xx(resp, @xx) unless @xx.nil?
122
- @xx = nil
123
171
  if resp.include?('JR') || resp.include?('DJNZ')
124
172
  z = resp.split('#')
125
- z[1] = z[1].hex < 127 ? "$+#{z[1].hex}" : "$-#{255 - z[1].hex}"
173
+ z[1] = z[1].hex < 127 ? "$+#{z[1].hex + 2}" : "$-#{255 - z[1].hex - 1}"
126
174
  resp = z.join
127
175
  end
128
176
  resp
@@ -131,6 +179,7 @@ module Z80Disassembler
131
179
  end
132
180
 
133
181
  def hl_to_xx(temp, reg)
182
+ @xx = nil
134
183
  if temp.include?('HL')
135
184
  temp.sub('HL', reg)
136
185
  elsif temp.include?(' L')
@@ -149,7 +198,7 @@ module Z80Disassembler
149
198
  def displacement(byte, temp)
150
199
  @prefix = nil
151
200
  byte -= 256 if byte > 127
152
- des = ['', "+#{byte.to_s(16)}", byte.to_s(16)][byte <=> 0]
201
+ des = ['+0', "+#{byte}", byte.to_s][byte <=> 0]
153
202
  temp.sub('HL', @xx + des)
154
203
  end
155
204
 
@@ -195,7 +244,7 @@ module Z80Disassembler
195
244
  case @z
196
245
  when 0 then "RET #{T_CC[@y]}"
197
246
  when 1 then @q ? ['RET','EXX','JP HL','LD SP, HL'][@p] : "POP #{T_RP2[@p]}"
198
- when 2 then calc_bytes(->(a, b){ "JP #{a},#{b}" }, T_CC[@y], 2)
247
+ when 2 then calc_bytes(->(a, b){ "JP #{a},##{b}" }, T_CC[@y], 2)
199
248
  when 3
200
249
  case @y
201
250
  when 0 then calc_bytes(->(a, b){ "JP ##{b}" }, nil, 2)
@@ -234,8 +283,8 @@ module Z80Disassembler
234
283
  if @temp&.include?('(')
235
284
  @prefix = 'xx'; nil
236
285
  elsif ['dd', 'fd'].include?(@prev) && @temp
237
- temp = @temp; @temp = nil; @prefix = nil; xx = @xx; @xx = nil
238
- hl_to_xx(temp, xx)
286
+ temp = @temp; @temp = nil; @prefix = nil
287
+ hl_to_xx(temp, @xx)
239
288
  elsif @lambda && !@arg&.include?('HL')
240
289
  @prefix = 1; @temp
241
290
  else
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Z80Disassembler
4
- VERSION = '0.2.3'
4
+ VERSION = '0.3.0'
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.3
4
+ version: 0.3.0
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-07 00:00:00.000000000 Z
11
+ date: 2021-06-17 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email: