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