z80_disassembler 0.2.5 → 0.3.2
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 +37 -8
- 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: 32244bf0d6dba7c4803d9e2eb5877108f38f54b8beee841ca975afe10cdefdcd
|
4
|
+
data.tar.gz: 655e5e7d776633635dd35045ea7f93523712ca07b0e8a361c67e862f06f2262b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 57a38e4cd87ede79eb82cda138ac0337149575796cc1a1e2ff033de2beccd8b583fd59d5eddc2ab535f46907cadf8c69d2b3e9ad952950daf946291dc06261a2
|
7
|
+
data.tar.gz: 7e78cf72592390ecae2fd6d72173b10d87badad9586d6ea224d46fc92b970e27cbc4d1197d8ae3d14351ebcdedada8579d66f8578c8ff697cd3bef45168fb1b5
|
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
|
@@ -26,7 +26,7 @@ module Z80Disassembler
|
|
26
26
|
].freeze
|
27
27
|
|
28
28
|
def initialize(file, org = 32_768)
|
29
|
-
@file = file; @org =
|
29
|
+
@file = file; @org = org.to_i
|
30
30
|
if file.original_filename[-3..-1] == '.$C'
|
31
31
|
File.open(@file) do |f|
|
32
32
|
z = f.read(17)
|
@@ -88,7 +88,8 @@ module Z80Disassembler
|
|
88
88
|
end
|
89
89
|
string = hash_links.keys.include?(adr) ? str.sub(substr, hash_links[adr]) : str
|
90
90
|
|
91
|
-
|
91
|
+
defb = bytes.split(" ").map { |x| "##{x}"}.join(",")
|
92
|
+
"#{link} #{string.ljust(16, ' ')}; #{addr16.ljust(5, ' ')} / #{addr.to_s.ljust(5, ' ')} ; #{ascii.ljust(4, ' ')} ; #{defb}"
|
92
93
|
end.join("\n")
|
93
94
|
|
94
95
|
header = [
|
@@ -108,8 +109,36 @@ module Z80Disassembler
|
|
108
109
|
'begin:',
|
109
110
|
code,
|
110
111
|
'end:',
|
112
|
+
'length equ end - begin',
|
113
|
+
'CODE = #AF',
|
114
|
+
'USR = #C0',
|
115
|
+
'LOAD = #EF',
|
116
|
+
'CLEAR = #FD',
|
117
|
+
'RANDOMIZE = #F9',
|
118
|
+
' org #5C00',
|
119
|
+
'baszac db 0, 1', # Line number
|
120
|
+
' dw linlen', # Line length
|
121
|
+
'linzac',
|
122
|
+
' db CLEAR, "8", #0E, 0, 0',
|
123
|
+
' dw begin - 1',
|
124
|
+
' db 0, ":"',
|
125
|
+
' db LOAD, "\""',
|
126
|
+
'codnam ds 10, 32',
|
127
|
+
' org codnam',
|
128
|
+
' db "disasm"',
|
129
|
+
' org codnam + 10',
|
130
|
+
' db "\"", CODE, ":"',
|
131
|
+
' db RANDOMIZE, USR, "8", #0E, 0, 0',
|
132
|
+
' dw begin', # call address
|
133
|
+
' db 0, #0D',
|
134
|
+
'linlen = $ - linzac',
|
135
|
+
'baslen = $ - baszac',
|
136
|
+
' emptytap "disasm.tap"',
|
137
|
+
' savetap "disasm.tap", BASIC, "disasm", baszac, baslen, 1',
|
138
|
+
' savetap "disasm.tap", CODE, "disasm", begin, length, begin',
|
111
139
|
' savesna "disasm.sna", begin',
|
112
|
-
' savebin "disasm.C",
|
140
|
+
' savebin "disasm.C", begin, length',
|
141
|
+
' savehob "disasm.$C", "disasm.C", begin, length',
|
113
142
|
''
|
114
143
|
].join("\n")
|
115
144
|
end
|
@@ -132,9 +161,9 @@ module Z80Disassembler
|
|
132
161
|
resp = @lambda.call(@arg, byte.to_s(16).rjust(2, '0').upcase)
|
133
162
|
@prefix = nil; temp = @temp; @temp = nil
|
134
163
|
if temp && resp.include?('(HL)')
|
135
|
-
resp += temp
|
164
|
+
@xx ? resp = displacement(temp.hex, resp) : resp += temp
|
136
165
|
elsif temp && resp.include?(')')
|
137
|
-
# resp =
|
166
|
+
# resp = displacement(temp.hex, resp) if @xx
|
138
167
|
resp = resp.sub(')', "#{temp})").sub('(', '(#')
|
139
168
|
elsif temp
|
140
169
|
resp += temp
|
@@ -170,7 +199,7 @@ module Z80Disassembler
|
|
170
199
|
def displacement(byte, temp)
|
171
200
|
@prefix = nil
|
172
201
|
byte -= 256 if byte > 127
|
173
|
-
des = ['', "+#{byte
|
202
|
+
des = ['+0', "+#{byte}", byte.to_s][byte <=> 0]
|
174
203
|
temp.sub('HL', @xx + des)
|
175
204
|
end
|
176
205
|
|
@@ -216,7 +245,7 @@ module Z80Disassembler
|
|
216
245
|
case @z
|
217
246
|
when 0 then "RET #{T_CC[@y]}"
|
218
247
|
when 1 then @q ? ['RET','EXX','JP HL','LD SP, HL'][@p] : "POP #{T_RP2[@p]}"
|
219
|
-
when 2 then calc_bytes(->(a, b){ "JP #{a}
|
248
|
+
when 2 then calc_bytes(->(a, b){ "JP #{a},##{b}" }, T_CC[@y], 2)
|
220
249
|
when 3
|
221
250
|
case @y
|
222
251
|
when 0 then calc_bytes(->(a, b){ "JP ##{b}" }, nil, 2)
|
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
|
4
|
+
version: 0.3.2
|
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-18 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|