Class: Z80Disassembler::Disassembler
- Inherits:
-
Object
- Object
- Z80Disassembler::Disassembler
- Defined in:
- lib/z80_disassembler.rb
Constant Summary collapse
- T_R =
0 1 2 3 4 5 6 7
[ 'B', 'C', 'D', 'E', 'H', 'L', '(HL)', 'A'].freeze
- T_CC =
[ 'NZ', 'Z', 'NC', 'C', 'PO', 'PE', 'P', 'M'].freeze
- T_ALU =
[ 'ADD', 'ADC', 'SUB', 'SBC', 'AND', 'XOR', 'OR', 'CP'].freeze
- T_ROT =
[ 'RLC', 'RRC', 'RL', 'RR', 'SLA', 'SRA', 'SLL', 'SRL'].freeze
- T_IM =
[ '0', '0/1', '1', '2', '0', '0/1', '1', '2'].freeze
- T_RP =
[ 'BC', 'DE', 'HL', 'SP'].freeze
- T_RP2 =
[ 'BC', 'DE', 'HL', 'AF'].freeze
- ASCII =
[ ' ', '!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\',']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~' ].freeze
Instance Method Summary collapse
-
#initialize(file_name, addr = 32_768) ⇒ Disassembler
constructor
A new instance of Disassembler.
- #start ⇒ Object
- #text ⇒ Object
Constructor Details
#initialize(file_name, addr = 32_768) ⇒ Disassembler
Returns a new instance of Disassembler.
27 28 29 30 31 32 |
# File 'lib/z80_disassembler.rb', line 27 def initialize(file_name, addr = 32_768) @file_name = file_name; @addr = addr.to_i @x = 0; @y = 0; @z = 0; @p = 0; @q = 0; @xx = nil @lambda = nil; @prefix = nil; @prev = nil @bytes = []; @ascii = []; @result = [] end |
Instance Method Details
#start ⇒ Object
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# File 'lib/z80_disassembler.rb', line 34 def start File.open(@file_name).each_byte do |byte| load_vars(byte) str = command_from_byte(byte) @prev = byte.to_s(16) @ascii << ((32..126).include?(byte) ? ASCII[byte - 32] : ' ') @bytes << @prev.rjust(2, '0').upcase next unless str @result << [@addr, "##{@addr.to_s(16)}".upcase, str, @bytes.join(' '), @ascii.join] @addr += @bytes.size @bytes = [] @ascii = [] end @result end |
#text ⇒ Object
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/z80_disassembler.rb', line 51 def text org = @addr - @file_name.size hash_links = {} link_num = 0 int_addrs = org..@addr with_links = @result.select { |z| z[2] =~ /#[0-F]{4}/ && int_addrs.include?(z[2].split('#').last[0..3].hex) } with_links.each { |x| hash_links["##{x[2].split('#').last[0..3]}"] = "link_#{link_num += 1}" } [ " device zxspectrum48", " ORG #{org}", "begin_file:\n" ].join("\n") + @result.map do |addr, addr16, str, bytes, ascii| link = (hash_links[addr16] || '').ljust(16, ' ') adr = '#' + str.split('#').last[0..3] string = hash_links.keys.include?(adr) ? str.sub(adr, hash_links[adr]) : str "#{link} #{string.ljust(16, ' ')}; #{addr16.ljust(5, ' ')} / #{addr.to_s.ljust(5, ' ')} ; #{bytes.ljust(14, ' ')} ; #{ascii.ljust(4, ' ')} ;" end.join("\n") end |