moss

ひっそりと書き綴る俺のチラ裏

PC-9801 エミュレータ xnp2

2017-03-12 21:32:58 | PC

自宅には古いPCがいくつかある。・・・いや、全部古いかも。
取り分け古い物として、かつての国民機PC-9801が物置部屋に保管してある。正確にはPC-9801ES2というIntel 80386SX 16MHzを搭載した3.5FDD仕様の98。
はじめはN88DISK Basicで訳も分からずピポピポやってたが、ゲームやDOSの世界に首を突っ込むようになってパソコンの使い方が一変した。太平洋の嵐DXやシュバルツシルドで無敵になるためにmasmやsymdebを駆使してFDDから吸い上げたデータの解析から修正ユーティリティの作成などを通してパソコンの使い方を覚えていった。このスキルは後にIBM PS/55+3270+MS-Networks環境でのコンベンションメモリ確保ややDOS/V時代のIRQ/IO portの把握に大いに役立った。

という経緯もあり、時々ふとPC-9801を思い出す。
で、ふと思い出して九十九でPC-9821Xsの在庫処分品を買ったこともあるが、今回は「C言語でロボットを制御してビルを建てるゲームあったよな?」と余計なことも思い出した。こうなるともう止まらない。ゲーム名はアートディングから発売されていたHR2ということは比較的すぐ判明した。しかし中古店やYahooオークションを探しても全然売ってるの見つからない。半年くらいしつこく覚えていた甲斐も有って最近になってリサイクル店で販売されているのを見つけて即座に購入した。

しかし普段は名古屋ではなく川崎に居る。そこにはPC-9801は無い。ということで持ってくるのも面倒なのでUbuntuにPC-9801エミュレータを導入する。覚書ということでたまにはPCネタを書いてみよう。

普段使用しているPCのOSはUbuntu 12.04.5 LTSと、これまた古い物使ってる。
linux版ではxnp2というエミュレータが利用できるようだ。しかしUbuntuの公式パッケージでは
ないので自分でビルドする必要が有る。ソースからのビルドはSlackwareやRedHatで散々やったがUbuntuを使うようになってからはそんなことした記憶が殆ど無い。ただのmake installじゃ管理上マズいがdebパッケージの作り方も知らないのでrpmを作成してalienで変換して導入することにした。

まずは以下サイトからソースをDLする。
https://www.nonakap.org/np2

今回DLしたソースは xnp2-0.86.tar.bz2 というファイル。
ビルドに必要なのはgccとGTK+2.6以降とあるが、SDLやXFree86-VidModeExtension、libusb-1.0も事前にapt-getで入れておく。

手順としては、
1)動作するまで仮導入先でコンパイル手順やソース、Makefileの修正を繰り返す。
2)動作するようになったらオリジナルソースとのdiffを取る。
3)rpmのビルドデイレクトリにソースとspecファイルを配置してrpmbuildが通るまでspecファイルを修正する。
4)alienを使ってrpmファイルをdebファイルへ変換する。


1)仮導入
作業用ディレクトリにソースを展開する。

    tar xvf xnp2-0.86.tar.bz2

展開されたディレクトリ名称をxnp2-0.86からxnp2-0.86.orgに変更し、もう一度ソースを展開して2つのソース展開ディレクトリを用意する。

作業ディレクトリ配下にこの2つの展開デイレクトリを用意する。
    xnp2-0.86   ←作業するのはこのデイレクトリ
    xnp2-0.86.org

xnp2-0.86の下のx11というデイレクトリでビルド作業を行う。
    cd xnp2-0.86/x11
    ビルドに当たってのオプションを確認する。
    ./configure --help

~~~~~~~~~~中略~~~~~~~~~~~~~~~~~~~~~~~~~   
  --enable-gtk3           Use GTK+-3 library [default=no]
  --enable-sdl            Use SDL 1.2 library [default=yes]
  --enable-sdl2           Use SDL 2.0 library [default=yes]
  --enable-sdlmixer       Use SDL_mixer library [default=yes]
  --enable-libusb1        Use libusb-1.0 library [default=yes]
  --enable-xf86vidmode    Use XF86VidMode extension [default=yes]
  --enable-ia32           Use IA-32 emulation [default=no]
  --enable-build-all      Build xnp2(i286 emulation) and xnp21(IA-32
                          emulation) programs [default=no]
  --enable-debug          Enable debugging [default=no]
  --enable-warning        Enable warning [default=no]
  --enable-gtk-deprecated-api
                          Enable GTK+ deprecated API [default=yes]
  --disable-sdltest       Do not try to compile and run a test SDL program
~~~~~~~~~~中略~~~~~~~~~~~~~~~~~~~~~~~~~


--enable-build-all というオプションを選択すればPC-9801とPC-9821のバイナリがコンパイルされることがわかった。今回はこれを採用する。

    CFLAGS="-Ofast"  ./configure --prefix=/usr --enable-build-all

これによりMakefileが生成されるのでmakeを実行する。
    make -j3 2>ERR.log    (エラーを確認したいのでエラーだけリダイレクトさせておく)


すると案の定「cc1plus: エラー: 認識できないコマンドラインオプション ‘-std=c++11’ です」というエラー発生。
c++のオプションに -std=c++11 は無効なようだ。使っているgccのバージョンは4.6.4のため-std=c++11 ではなく-std=c++0x を指定する。機能上ダメかもしれないが通ればラッキーといことでMakefileの該当個所2ヶ所を修正して再度コンパイル。

    make clean; make -j3 2>ERR.log

OKだった。生成されたバイナリを実行するとちゃんと画面が表示されたのでよしとする。
-std=c++0xはパラメータ引き渡しがうまくいかなかったのでMakefile.amとMakefile.inの2つのファイルの該当個所を修正してconfigureを実行してMakefileに反映されるようにした。

2)diff作成
修正箇所をパッチファイルにするため、オリジナルディレクトリと作業ディレクトリの差分を取る。

xnp2-0.86とxnp2-0.86.orgを配下にもつ作業ディレクトリから
    diff -urpN xnp2-0.86.org xnp2-0.86 > xnp2.patch

というようにパッチファイル作成する。

3)作業記録を兼ねてrpmbuildでビルド作業を自動化。
rpm作業ディレクトリ配下のSOURCESにDLしたxnp2-0.86.tar.bz2と上記で作成しxnp2.patchを置く。

SPECディレクトリで普通にspecファイルを書いて
    rpmbuild -ba xnp2.spec
として実行バイナリパッケージとソースパッケージを作成する。
するとxnp2-0.86-1k1.x86_64.rpmとxnp2-0.86-1k1.src.rpmが作成される。
このsrpmをとっておけばどんな作業したか一目瞭然。

4)debパッケージへ変換
 作成した実行バイナリのrpmファイルをdeb形式へ変換する。

 alien xnp2-0.86-1k1.x86_64.rpm

するとxnp2_0.86-2_amd64.debというパッケージが生成される。
これをdpkgコマンドでUbuntuへインストールする。akienに-i オプションを付けて変換と同時にインストールも可能だがdebパッケージが導入後に消えてしまう。

若干記憶を頼りに書いているところもあるので不正確かもしれないけどこんな感じでxnp2を導入できる。

98用のDOSは2.11から5.0までかろうじて何本か取ってあった。IBM PC-DOSを加えると何本あることやら。98用はこれ以外にWindows3.1とWindows95もある。メディアはFDだけど。

DOSを起動したところ。

 HR2も起動OK。

けど、ゲームやってる時間が無い。orz

Comment
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする