目次

ログイン版ドラゴンスレイヤーの抽出ツール

概要

PC-8801用のログイン版ドラゴンスレイヤーにパッチを当てて、PC-6001シリーズで動くようにしてしまった剛の者がいます。 こちらのツールを使えばPC-6001版が作成できるのですが、そのためには、PC-8801版からプログラムとデータを引き抜く必要があります。

ここでは、D88形式のディスク版より、データを引き抜くツールを公開します。

バイナリエディタなどで、切り貼りすることなく、一発で抽出します。

実行には Ruby が必要になります。 P6版ドラゴンスレイヤー PC88用ログイン版ドラゴンスレイヤー

ツール

以下のコードを適当な名前で保存し、rubyで実行するだけです。extract.rbという名前で保存したならば、 $ ruby extract.rb dragonslayer.d88のように、ログイン版ドラゴンスレイヤーのディスクイメージを与えて呼び出してください。 少し待つと、pr0.bin,pr1.bin,および map01.binmap20.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