▼ 2015/05/19(火) サイト更新 - ハイドライド
【お知らせ】
本日の更新は「ハイドライド」の紹介です。
先日「鍵穴殺人事件」を入力したときにPCマガジンを見ていたらリストが掲載されているのに気がついたのでこちらも入力してみました。
PCマガジンは他にもTHE BLACK ONYX(BPS)や夢幻の心臓(XTAL SOFT)などがリスト掲載されており,リストを入力する根性さえあれば安価でこれらの名作を楽しむことができます。
残念ながら私はこの辺の掲載号は未所持ですが,「ELECI LAND(富士音響)」や「CHOBIN(BOTHTEC)」はPCマガジン掲載版を移植してPC-8001mkIIで遊んでおりました。
今回の「ハイドライド」は,私にとって初めてのPC-8001mkIISRへの移植となります。
本作はオールマシン語で作成されている上にROM内ルーチンを一切使用していないので,移植はかなり簡単な部類に入ります。
とはいえ,全く問題がなかったという訳でもなく,以下のような点で悩みました。
(1) トラック0以外のデータを正常に読み込まない。
IPLやローダーが格納されているトラック0は正常に読み込むのですが,それ以外のトラックを正常に読み込まないという現象に出会って苦労しました。
知っている人には当然の話なのですが,PC-8801は起動時にFDDを両面ドライブとして初期化しているのに対して,PC-8001は片面ドライブとして初期化しているのが原因でした。
この仕様はSRになってもまだ変わっておらず,片面ドライブのつもりで全然違う位置のデータを読んでしまいます。
起動時にコマンド23(Set surface mode)で両面モードを指定したら解決しました。
(2) GVRAMの位置が違う
PC-8801のGVRAMが0C000~0FFFFHに配置されているのに対して,PC-8001mkIISRのGVRAMは8000H~0BFFFHに配置されています。
この辺りにグラフィックデータやグラフィック描画を行うコードがなければ問題ないのですが,本作はその両方があるので,これを7FFFH以前か0C000H以降に移動しなければなりません。
今回は,メモリ後半に配置されているマップデータをRLE圧縮することで空きメモリを確保して解決しました。
今回実装したRLE圧縮ではワーストケースにおいてデータサイズがオリジナルの2倍になる可能性があるのですが,幸い本作のマップデータは横に同じデータが並んでいることが多く,例えば以下のようなマップの場合は1/10以下のサイズとなります。
結果としてデータ量を半分以下に減らすことができ,約6KBの空きメモリが確保できたので,ここに8000H~0BFFFHにあるグラフィックデータ/コードを転送しました。
(3) 自己書き換えへの対応
本作は,高速化/省メモリ化のために自己書き換えを各所で使用しています。以下はその一例です。
結局,移動したルーチンを呼び出している部分まで全部確認して対応しています。
上でも書いたとおり本作はROM内ルーチンを使用していないので,80SRのPC-8001mkIIモードでもGVRAMの青プレーン部分のみ表示してそのまま動いてしまいます。
青プレーンを描画しない箇所は表示が抜けています。
機械的に4色変換したら,こんな感じで動くようになりました。
水路の水色や砂漠の黄色が出ていないので違和感があります。
もう少し手動でグラフィックを修正して,PC-8001mkII版を作成してみる予定です。
先日「鍵穴殺人事件」を入力したときにPCマガジンを見ていたらリストが掲載されているのに気がついたのでこちらも入力してみました。
PCマガジンは他にもTHE BLACK ONYX(BPS)や夢幻の心臓(XTAL SOFT)などがリスト掲載されており,リストを入力する根性さえあれば安価でこれらの名作を楽しむことができます。
残念ながら私はこの辺の掲載号は未所持ですが,「ELECI LAND(富士音響)」や「CHOBIN(BOTHTEC)」はPCマガジン掲載版を移植してPC-8001mkIIで遊んでおりました。
今回の「ハイドライド」は,私にとって初めてのPC-8001mkIISRへの移植となります。
本作はオールマシン語で作成されている上にROM内ルーチンを一切使用していないので,移植はかなり簡単な部類に入ります。
とはいえ,全く問題がなかったという訳でもなく,以下のような点で悩みました。
(1) トラック0以外のデータを正常に読み込まない。
IPLやローダーが格納されているトラック0は正常に読み込むのですが,それ以外のトラックを正常に読み込まないという現象に出会って苦労しました。
知っている人には当然の話なのですが,PC-8801は起動時にFDDを両面ドライブとして初期化しているのに対して,PC-8001は片面ドライブとして初期化しているのが原因でした。
この仕様はSRになってもまだ変わっておらず,片面ドライブのつもりで全然違う位置のデータを読んでしまいます。
起動時にコマンド23(Set surface mode)で両面モードを指定したら解決しました。
(2) GVRAMの位置が違う
PC-8801のGVRAMが0C000~0FFFFHに配置されているのに対して,PC-8001mkIISRのGVRAMは8000H~0BFFFHに配置されています。
この辺りにグラフィックデータやグラフィック描画を行うコードがなければ問題ないのですが,本作はその両方があるので,これを7FFFH以前か0C000H以降に移動しなければなりません。
今回は,メモリ後半に配置されているマップデータをRLE圧縮することで空きメモリを確保して解決しました。
今回実装したRLE圧縮ではワーストケースにおいてデータサイズがオリジナルの2倍になる可能性があるのですが,幸い本作のマップデータは横に同じデータが並んでいることが多く,例えば以下のようなマップの場合は1/10以下のサイズとなります。
結果としてデータ量を半分以下に減らすことができ,約6KBの空きメモリが確保できたので,ここに8000H~0BFFFHにあるグラフィックデータ/コードを転送しました。
(3) 自己書き換えへの対応
本作は,高速化/省メモリ化のために自己書き換えを各所で使用しています。以下はその一例です。
abb1 21428e LD HL,8E42H abb4 36c9 LD (HL),0C9H abb6 cd208e CALL 8E20H abb9 21428e LD HL,8E42H abbc 3601 LD (HL),1そのため,(2)で移動した描画ルーチンが想定外の動作をしてしまい,悩まされました。
結局,移動したルーチンを呼び出している部分まで全部確認して対応しています。
上でも書いたとおり本作はROM内ルーチンを使用していないので,80SRのPC-8001mkIIモードでもGVRAMの青プレーン部分のみ表示してそのまま動いてしまいます。
青プレーンを描画しない箇所は表示が抜けています。
機械的に4色変換したら,こんな感じで動くようになりました。
水路の水色や砂漠の黄色が出ていないので違和感があります。
もう少し手動でグラフィックを修正して,PC-8001mkII版を作成してみる予定です。
- TB-URL(確認後に公開) http://www5f.biglobe.ne.jp/~apaslothy/cgi_bin/adiary/adiary.cgi/039/tb/
1: CD-R 2015年05月20日(水) 午前2時19分
こんばんは、改造のポイントがいろいろあるんですねえ。初期のドライブモードまで設定する必要あるとは、秀和のフロッピイディスク活用ハンドブック等の資料が必要ですね。8001シリーズで動いているのはすごいですね。発売、当初から対応機種に入っていれば、続編も期待出来たかもしれませんね。mk2の移植は、色合いも見やすい感じでいいですね。
2: apaslothy 2015年05月21日(木) 午前1時56分
80mkIIを現役で使っていたころはドライブモードの設定なんて知らなかったので,当時に移植作業をしていたらここで投げ出してしまったかもしれません。今回はPC88マスターバイブルを見て対応しました。
発売当初から対応機種に入れて欲しかったというのは同感です。80SRで出すならテープ版も必要だと思いますが,600baudの80SRではロード時間が滅茶苦茶かかりそうですね。