====== ログイン版ドラゴンスレイヤーの抽出ツール ====== ===== 概要 ===== PC-8801用のログイン版ドラゴンスレイヤーにパッチを当てて、PC-6001シリーズで動くようにしてしまった剛の者がいます。 [[http://sbeach.seesaa.net/article/387861589.html|こちら]]のツールを使えばPC-6001版が作成できるのですが、そのためには、PC-8801版からプログラムとデータを引き抜く必要があります。 ここでは、D88形式のディスク版より、データを引き抜くツールを公開します。 バイナリエディタなどで、切り貼りすることなく、一発で抽出します。 実行には Ruby が必要になります。 {{:p6:p6版ドラゴンスレイヤー.png?600|P6版ドラゴンスレイヤー}} {{:pc88:ログイン版ドラゴンスレイヤー.png?600|PC88用ログイン版ドラゴンスレイヤー}} ===== ツール ===== 以下のコードを適当な名前で保存し、''ruby''で実行するだけです。''extract.rb''という名前で保存したならば、 ''$ ruby extract.rb dragonslayer.d88''のように、ログイン版ドラゴンスレイヤーのディスクイメージを与えて呼び出してください。 少し待つと、''pr0.bin'',''pr1.bin'',および ''map01.bin''~''map20.bin''が生成されますので、あとは、''gen_dragonp6.exe''を実行するだけです。 class DragonSlayerD88 @buf = nil @trk = nil def initialize(f) @trk = [] @buf = f.read print "Read: #{@buf.bytes.size} bytes\n" p = 0x20 0.upto(163) do |s| str = @buf.bytes[p,4].pack("C4") v = str.unpack("V")[0] p += 4 @trk[s] = v end end def get_track(t) dat = nil sp = @trk[t] while true secn = @buf.bytes[sp+2].ord nsec = @buf.bytes[sp+4].ord len = (@buf.bytes[sp+0xe].chr+@buf.bytes[sp+0xf].chr).unpack("v")[0] d = @buf.bytes[sp+0x10,len].pack("C*") if dat.nil? dat = d else dat += d end print "Track: #{t} Sector: #{secn}/#{nsec} (offset: #{sp}) Length: #{len}\n" sp += len + 0x10 break if secn == 4 end return dat end def get_pr0 fname = 'pr0.bin' pr0 = get_track(3) File.rename(fname, fname + '.bak') if File.exists?(fname) open(fname,'w') do |f| f.write pr0 end end def get_pr1 fname = 'pr1.bin' pr1 = get_track(4) + get_track(5) File.rename(fname, fname + '.bak') if File.exists?(fname) open(fname,'w') do |f| f.write pr1 end end def get_maps 1.upto(20) do |m| map = get_track(20 + m * 2) + get_track(20 + m * 2 + 1) fname = "map#{sprintf('%02d',m)}.bin" File.rename(fname, fname + '.bak') if File.exists?(fname) open(fname,'w') do |f| f.write map end end end end ds88 = DragonSlayerD88.new(ARGF) ds88.get_pr0 ds88.get_pr1 ds88.get_maps