XilinxのコンフィギュレーションROM用のファイルフォーマットとしてよく用いられるMCSファイル.このファイル,Intel MCS-86 Hexadecimal Objectというフォーマットです.
というわけで(?),パーザを書いてみました.
ファイルフォーマットの説明はいろんなところにありましたが,Wikipediaを参考にしました.http://en.wikipedia.org/wiki/Intel_HEX
Rubyだと,こんな感じのコードで解析できます.
def usage_and_exit(str) puts str exit end def validate(a, c) # puts "checksum = #{c}" return false unless a.size % 2 == 0 # length of the data must be even. sum = 0 (a.size/2).times{|x| sum = sum + (a[(2*x)..(2*x+1)].join.to_i(16)) } result = ((~sum) + 1) & 0x0ff # puts "result = #{result}" return result == c end @ext_addr = 0 def put_data(addr, data) printf("%08x: ", addr + (@ext_addr << 16)) sep = "" (data.size/2).times{|x| printf("%s0x%02x", sep, data[(2*x)..(2*x+1)].join.to_i(16)) sep = ", " } puts "" end def parse_line(line) a = line.split("") usage_and_exit("Illegal line: #{line}") unless a[0] == ":" count = a[1..2].join.to_i(16) offset = a[3..6].join.to_i(16) type = a[7..8].join.to_i(16) data = a[9..-3] checksum = a[-2..-1].join.to_i(16) usage_ane_exit("Checksum missmatch: #{line}") unless validate(a[1..-3], checksum) case(type) when 0x00 #puts "DATA" put_data(offset, data) when 0x01 #puts "END" when 0x02 #puts "EXTENDED SEGMENT ADDRESS" when 0x03 #puts "SEGMENT ADDRESS" when 0x04 #puts "EXTENDED LINEAR ADDRESS: #{data}" @ext_addr = data.join.to_i(16) when 0x05 #puts "LINEAR ADDRESS BEGIN" else #puts "Unknown type: #{type}" end end def parse(src) src.read.split("\n").each{|l| # p l.strip parse_line(l.strip) } end parse($stdin)
これで,オリジナルのROMライタが作れそうですね(違.
コメント