PC98版の☆ぽろりす☆のY2K問題対応版をリリースしました(Version 1.57)
はじめに
少し遅くなってしまいましたが、PC-9801版のアクションパズルゲーム「☆ぽろりす☆」は2000年問題に対応してなく、折角ハイスコアを取ってもファイルに記録されないという致命的な問題が残っていました。
今回、こちらの問題を修正したVersion 1.57をリリースしましたのでご報告致します。
無駄にこの後のコンテンツが長いので、お急ぎの方は以下からダウンロードしてください(PC98 MS-DOS版ですよ、Windows 10では動きませんからね)
https://github.com/katakura/porolith-pc98/releases/download/1.57/PORO157p.zip
☆ぽろりす☆とは
1989年~1990年頃に公開されたMS-DOS上で動作するテトリスライクなアクションパズルゲームです。
当時は16ビット版のMS-DOS全盛期で、C言語を触り始めた私が会社の業務の合間に作成しました。
ゲームのアイディアは突然思いついたのですが、当時参加していたパソコン通信のASCII NET上の無法地帯掲示板「junk.test」でアイデア出しをして、自分で実装できない部分(面積計算、ブロック回転、各機種依存処理)については賛同してくれた有志の方から提供してもらって完成しました。
動作環境
☆ぽろりす☆は以下のPC環境で動作します。
- NEC PC-9800シリーズ及びEpson互換機 MS-DOS 3.1以降
エミュレータ環境(T98-NEXT + FreeDOSでの動作確認済み) - Fujitsu FM-R50~(ハイレゾ対応) MS-DOS 3.1以降
- Toshiba Dynabook J-3100SS MS-DOS 3.1以降
- その他MS-DOSが動作するPC
- SHARP X68000(有志の方が移植してくれた)
他に、NTT DoCoMoのiアプリで動作するものもあります(こちらはJavaで再開発)
また、GAMEデザインさんが「ぽろりすフラッシュ」というものを2019年くらいまで公開していました。こちらはAdobe Flash上で楽しめるぽろりすです。ちょっと見た目とかルールが異なりますが、こちらも楽しんで頂けた方が比較的居たようです。
Version 1.56までの問題点
スコアファイル(porolith.scr)の書き出し時に、西暦の下2桁だけを書き込んでいるが、2000年になってから以下の処理が正常に動作しなくなり、次回porolith.exe起動時に不正なスコアファイルと判定されて起動できなかった模様です。
high_score[i].score = score;
strcpy(high_score[i].name, nam);
lotim = time(NULL);
timpt = localtime(&lotim);
sprintf(dat, "%02d/%02d/%02d", timpt->tm_year, timpt->tm_mon + 1, timpt->tm_mday);
strcpy(high_score[i].date, dat);
sprintf(dat, "%02d:%02d:%02d", timpt->tm_hour, timpt->tm_min, timpt->tm_sec);
strcpy(high_score[i].time, dat);
起動前にporolith.scrファイルを削除して引き続き楽しんでくれている奇特な方がいらっしゃるみたいなので、修正します。
開発環境の構築
PC98環境はエミュレータとFreeDOSでなんとか準備は出来ましたが、Cコンパイラ及びアセンブラが必要です。
PC98依存ライブラリも使用して画面描画を行っているため、2021年現在も入手可能な「LSI C-86 Ver. 3.30c試食版」や「gcc-ia16」だけを使ってもダメそう。
Vectorにあった「共同製作 Graphic Library」をエミュレータ上のFreeDOSからLSIC試食版を使ってビルドを試す。
MAKEFILEがそのままではうまく動かなかったのと、MATH関連の関数が実行するとハングアップしてしまうが、無理やりLIBを作成してみた。一応デモプログラムは動いたっぽい(MATH関連以外は)。
結局元のプログラム全般でグラフィック関連の関数をすべてこちらのライブラリに置き換える作業を続けてみたけど、fread()でfarポインタのアドレス格納がどうしても出来なかったり(_dos_read()で代用)、_split_path()の代用を探したりと色々していましたが、結局はFreeDOSが要件に合わないのか、LSICが試食版では64KB以内のソース、オブジェクトの制限の関係からか、コンパイル中にout of memoryが出てしまい断念しました。
gcc-ia16で再度頑張るという選択はありませんでした。疲れた。
俺は一体なにをしているんだろう
こんなに2000年問題の対応が大変だとは思いませんでした(違
次の方策として、どうやらVisual C++ 1.52には16ビットの実行ファイルが出力できるコンパイラ、アセンブラも付属しているらしいことが判明しました。
ここで、私のVisual Studio Subscriptionが火を吹きます。
Visual C++ 1.52の日本語版にはライブラリ周りにNECフォルダがあって、PC98向けのグラフィック周りも対応できそうです。ただし、パッケージ全体のサイズが大きくてエミュレータ環境上で動かすのか厳しいです。
とりあえず、手元のWindows 10環境で動作させるために、「DOSVAXJ3」をダウンロードしてきてDOS/V環境を作ります。
c:\workにコンパイラ関連、glib関連、ぽろりすのソース関連を突っ込んで、「mount c: c:\work」でcドライブをマウント。環境変数周りを設定します。
マクロアセンブラは同梱されていないので、「Light Macro Assembler 2.35F」の試用版を落としてきてアセンブルして、なんとかリンクまでは通したのですが、エミュレータ環境にexeファイルをコピーして実行しても、うまく動きませんでした。
もういやになってきた
多分、もうちょっと本気出してglib周りのソースから必要なものだけを絞り込んでライブラリ化して、MASM関連も使わないようにすることで解決できそうな気はしますけど、面倒くさくなってしまいましたw
気軽にツイートしたことを今頃後悔する。
最後の綱となる電子パーツマニアで当時の先輩であり、また☆ぽろりす☆のブロック回転ルーチンの作者である量子氏のことを思い出して連絡したところ、まだフロッピーでMSC(PC98版)とMASMを持っているとのこと。
今回はライセンス関連は完全にクリアにしておきたかったので、修正したソース・ファイル一式とPC98エミュレータ関連の情報を渡して、先輩のところで代わりにビルドしてもらいました。(彼は正規ユーザです)
そして完成
こうして、Y2K対応版の☆ぽろりす☆が完成しました。
ダウンロードリンクはこちらです。
https://github.com/katakura/porolith-pc98/releases/download/1.57/PORO157p.zip
ちゃんと、スコアファイルが2桁表示のままですが、2000年以降に対応して正常に開くことが出来ました。
引き続きゲームを楽しんで己の限界に挑戦できます。(porolith.scrファイルを毎回消す必要がありません)
今回はついでに、PC98版でもキーバインドを修正して、テンキーの無いキーボードでも「J」「K」「L」「N」をそれぞれ、「4」「5」「6」「0」と同じ動作をするようにしました。
修正箇所
かなり適当に修正しました。開発環境の構築で土日が完全に潰れました。
time.hにあるstruct tm型内の年フィールドは1900年からのオフセット値となっており、色々ダメなのでちゃんと修正すべきなのですが、以下の感じで2100年まで延命させました。
/* fix for Y2K */
if (timpt->tm_year >= 100) {
timpt->tm_year -= 100;
}
おわりに
なんだかエイプリルフールネタっぽい記事ですが、30年ぶりくらいにMS-DOS環境を触ったりと大変でしたが、なかなか楽しかったです。
最後になりましたが、FreeDOS(98)は以下のサイトのHDDイメージを利用させていただきました。
http://bauxite.sakura.ne.jp/software/dos/freedos.htm
エミュレータは以下サイトの最新版(20100525版)を利用させていただきました。
http://akiyuki.boy.jp/t98next/
大変助かりました。ありがとうございました。