内容へ移動
WildTree Wiki
ユーザ用ツール
ログイン
サイト用ツール
検索
ツール
文書の表示
以前のリビジョン
バックリンク
最近の変更
メディアマネージャー
サイトマップ
ログイン
>
最近の変更
メディアマネージャー
サイトマップ
トレース:
ログイン版ドラゴンスレイヤーの抽出ツール
この文書は読取専用です。文書のソースを閲覧することは可能ですが、変更はできません。もし変更したい場合は管理者に連絡してください。
====== ログイン版ドラゴンスレイヤーの抽出ツール ====== ===== 概要 ===== 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''を実行するだけです。 <code> 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 </code>
ログイン版ドラゴンスレイヤーの抽出ツール.txt
· 最終更新:
2020/12/12 01:54
by
araki
ページ用ツール
文書の表示
以前のリビジョン
バックリンク
文書の先頭へ