z80_disassembler 0.2.4 → 0.3.1
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 +40 -9
- 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: 02a2e2d32e438dfeec508dbb3d7c2d9346144a401398a5d1d512352c59750b89
|
4
|
+
data.tar.gz: 6b502bcf23a6d7fcb77468b18be19bc8bcd679a8382896d9468afee8a21b3b11
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 07a73a8a7504f85f2c91e952d249a4521e16e567b45387f011d0821d24d941aaa7faa1f1e3eedac1a621e234e139cb6feef413ebd548bf7ca0b9526bae24ee83
|
7
|
+
data.tar.gz: 482d90cf0c3e6b5938e9323319c086e93435178bbcd3c4c38be33b0871b932a8b99e016dce7546253be39be99a3a36d216ab8e14635488df046f7c01dc2a2816
|
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
|
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
|
@@ -108,8 +108,36 @@ module Z80Disassembler
|
|
108
108
|
'begin:',
|
109
109
|
code,
|
110
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',
|
111
138
|
' savesna "disasm.sna", begin',
|
112
|
-
' savebin "disasm.C",
|
139
|
+
' savebin "disasm.C", begin, length',
|
140
|
+
' savehob "disasm.$C", "disasm.C", begin, length',
|
113
141
|
''
|
114
142
|
].join("\n")
|
115
143
|
end
|
@@ -131,13 +159,15 @@ module Z80Disassembler
|
|
131
159
|
when 1
|
132
160
|
resp = @lambda.call(@arg, byte.to_s(16).rjust(2, '0').upcase)
|
133
161
|
@prefix = nil; temp = @temp; @temp = nil
|
134
|
-
if temp && resp.include?(')')
|
135
|
-
|
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('(', '(#')
|
136
167
|
elsif temp
|
137
168
|
resp += temp
|
138
169
|
end
|
139
170
|
resp = hl_to_xx(resp, @xx) unless @xx.nil?
|
140
|
-
@xx = nil
|
141
171
|
if resp.include?('JR') || resp.include?('DJNZ')
|
142
172
|
z = resp.split('#')
|
143
173
|
z[1] = z[1].hex < 127 ? "$+#{z[1].hex + 2}" : "$-#{255 - z[1].hex - 1}"
|
@@ -149,6 +179,7 @@ module Z80Disassembler
|
|
149
179
|
end
|
150
180
|
|
151
181
|
def hl_to_xx(temp, reg)
|
182
|
+
@xx = nil
|
152
183
|
if temp.include?('HL')
|
153
184
|
temp.sub('HL', reg)
|
154
185
|
elsif temp.include?(' L')
|
@@ -167,7 +198,7 @@ module Z80Disassembler
|
|
167
198
|
def displacement(byte, temp)
|
168
199
|
@prefix = nil
|
169
200
|
byte -= 256 if byte > 127
|
170
|
-
des = ['', "+#{byte
|
201
|
+
des = ['+0', "+#{byte}", byte.to_s][byte <=> 0]
|
171
202
|
temp.sub('HL', @xx + des)
|
172
203
|
end
|
173
204
|
|
@@ -213,7 +244,7 @@ module Z80Disassembler
|
|
213
244
|
case @z
|
214
245
|
when 0 then "RET #{T_CC[@y]}"
|
215
246
|
when 1 then @q ? ['RET','EXX','JP HL','LD SP, HL'][@p] : "POP #{T_RP2[@p]}"
|
216
|
-
when 2 then calc_bytes(->(a, b){ "JP #{a}
|
247
|
+
when 2 then calc_bytes(->(a, b){ "JP #{a},##{b}" }, T_CC[@y], 2)
|
217
248
|
when 3
|
218
249
|
case @y
|
219
250
|
when 0 then calc_bytes(->(a, b){ "JP ##{b}" }, nil, 2)
|
@@ -252,8 +283,8 @@ module Z80Disassembler
|
|
252
283
|
if @temp&.include?('(')
|
253
284
|
@prefix = 'xx'; nil
|
254
285
|
elsif ['dd', 'fd'].include?(@prev) && @temp
|
255
|
-
temp = @temp; @temp = nil; @prefix = nil
|
256
|
-
hl_to_xx(temp, xx)
|
286
|
+
temp = @temp; @temp = nil; @prefix = nil
|
287
|
+
hl_to_xx(temp, @xx)
|
257
288
|
elsif @lambda && !@arg&.include?('HL')
|
258
289
|
@prefix = 1; @temp
|
259
290
|
else
|
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.1
|
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-
|
11
|
+
date: 2021-06-17 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|