ログイン版ドラゴンスレイヤーの抽出ツール
ログイン版ドラゴンスレイヤーの抽出ツール
概要
PC-8801用のログイン版ドラゴンスレイヤーにパッチを当てて、PC-6001シリーズで動くようにしてしまった剛の者がいます。 こちらのツールを使えばPC-6001版が作成できるのですが、そのためには、PC-8801版からプログラムとデータを引き抜く必要があります。
ここでは、D88形式のディスク版より、データを引き抜くツールを公開します。
バイナリエディタなどで、切り貼りすることなく、一発で抽出します。
ツール
以下のコードを適当な名前で保存し、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
ログイン版ドラゴンスレイヤーの抽出ツール.txt · 最終更新: 2020/12/12 01:54 by araki