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