farポインタを理解する(目指せガンダムエンジニア)
この記事は岩手県立大学 Advent Calendar 2020の4日目です.(遅刻)
今日,私のTwitterのタイムラインで「ガンダムのプログラムがC言語で書かれている」という話題で盛り上がっていました.
C言語って30年以上前から現在も現役ってすごくね?
— 京 (@shatiku_master) 2020年12月5日
C書ければ流行り廃りに関係なくずっと仕事あるって事じゃん
コーティングに慣れちゃえば別に休日に勉強しなくてもご飯は食べれる🍜
ちなガンダムもC言語で動いている模様 pic.twitter.com/jnWX17LgWN
その中で,「farポインタ使ってるwww」とか「プログラムに
far
って書いてあるのはなんぞや」とかfarポインタ に関する発言がちらほらあったので,この機会にfarポインタについてまとめてみました.まとめてみましたって言うか,偶然にも最近 某Hack365でPC-98プログラミングについて解説したときに触れたばっかりでした.
farポインタって?
結論
セグメント方式でメモリアクセスする場合に使われるポインタ形式です.
有名なところだとintel8086チップなど16bitチップ,またはその互換であるリアルモードのプログラムをC言語で書こうとすると必要になってきます.
セグメント方式って?
例えば32bitマシンなら,レジスタは32bitでポインタを宣言してメモリアクセスできるのはそのレジスタで表せるアドレスの限界4GBまでですね.
では,i8086やリアルモードなど16bit環境ではどうでしょう? 使えるレジスタは16bitです.
よって単純に考えると,表現できるアドレスは64KB(65,535Byte)と言うことになりますが,実際に扱えるアドレス空間は1MBであったりします.
なんで?
16bitでどうやって64KB以上のメモリ空間を扱うのか.
そこで登場するのがセグメント方式です.
セグメント方式は例えばi8086チップなら16バイトごとにメモリを区切って,その区切り位置をセグメントベースアドレス
とします.
んで,セグメントベースアドレスから最大64KBの範囲をセグメント
とし,セグメント内の相対的な位置をオフセットアドレス
とします.
セグメントベースアドレス
,オフセットアドレス
をレジスタ2つ使ってうまいことこういい感じにすることで,64KB以上のメモリアクセスを可能とします.
アセンブラで書くなら
アセンブラなら
mov AX, 0xa000 mov ES, AX mov BX, 0x1234 mov [ES:BX], AL
と書けば(ES*16+BX)の物理アドレスにALを書き込めます.
「30日でできる! OS自作入門」の3日目 pp.52あたりに似たような説明があります.私はこの本で初めてセグメント方式を知った気がする.
C言語で書くならfarポインタ
上記のコードをC言語で書く場合,ついにfarポインタを使います.
char __far *addr; addr = (char __far *)0xa0001234L;
修飾子__far
をつけると,下位16bitをオフセット,上位16bitをセグメントとして扱ってくれるようです.
ページ最初のガンダムのプログラムではMK_FP
と言うマクロが使われてますね.
これはセグメントアドレスとオフセットアドレスからfarポインタを生成するマクロですね.
よって上記のコードを以下のように書いても同じです.
char __far *addr; addr = (char __far *)MK_FP(0xa000, 0x1234);
MK_FP
の中身は簡単なビット演算ですね.
#define MK_FP(seg, off) (((long)seg << 0x10) | (long)off)
サンプルコード
i8086, i80286が載ってるPC-9801は16bitマシンなので,このエミュレータでfarポインタを使ったプログラムを試しに書いてみましょう.
PC-98+MS-DOS環境でC言語でアプリ開発をする方法はこのブログの過去の記事で解説しています.
t-takeda.hatenablog.com
テキストVRAMに文字を書き込んでみる
PC-98にはテキストVRAMと言うメモリ空間があって,そこに文字コードを書き込むと画面に文字を表示できます.
テキストVRAMのアドレス空間は0x0A0000 - 0x0A4FFF
です.
よって,テキストVRAMの先頭アドレスをセグメント方式で表すと,
[0xa000 : 0x0000]
計算すると
(0xa000 * 16)+0x0000 = 0x0A0000
となりますね.
これを頭に入れて次のコードを書きます.
#include <stdio.h> #define MK_FP(seg, off) (((long)seg << 0x10) | (long)off) int main(void) { printf("Hello TEXT!\n"); wchar_t __far *a; a = (wchar_t __far *)MK_FP(0xa000, 0x0000); // 0xa0000000L; printf("addr = 0x%lx\n", a); a += (80 * 10); // 10行目から // 1面=80x25 for(int i=0; i<80; i++){ *a = (wchar_t)0x41; a++; } return 0; }
PC-98のテキストVRAMでは1文字2バイトで表されるのでwchar_t
を使います.
(wchar_t __far *)MK_FP(0xa000, 0x0000)
でwchar_t
型のfarポインタ
を生成します.
テキストは1画面 横80文字,縦25行表示可能となっていて,それとテキストVRAMがそのまま対応しているので,
a += (80 * 10);
で画面上10行目の位置までポインタを進めます.
んで,その後に以下のforでポインタを加算しながら文字コード0x41
(ASCIIコードで`A`を表す)を書き込むことで画面上10行目を全て同じ文字で埋めます.
for(int i=0; i<80; i++){ *a = (wchar_t)0x41; a++; }
色々説明はいいからとにかく動かしてみましょう.
以下のようにコンパイルします.
$ ia16-elf-gcc -mcmodel=medium -march=i286 -o TextVRAM.EXE TextVRAM.c
できたEXEをエミュレータ や実機で実行すると画面上10行目が綺麗にAで埋められます!
まとめ
farポインタとっても便利.本の中では何度かみたことあるがPC-98でプログラミングする以外であんまり使ったことはない. 大体このレベルだとアセンブラで書くので出会う機会がなかった気もする. これがわかればガンダムのプログラムのメンテナンスもバッチリですね!
参考
↓私よりわかりやすい解説記事 mcommit.hatenadiary.com
・初めて読む8086 www.amazon.co.jp
・30日でできる! OS自作入門 www.amazon.co.jp
記事投稿サービスは統合した方がいい?それとも上手に使い分ける?
この記事は岩手県立大学 Advent Calendar 2020の2日目です.(遅刻)
2日目にして,早速中身のない話をします.ネタ切れではナイデスヨ.
結論
noteからはてなブログに記事を統合します.
記事が分散していて見る側も書く側も面倒
一時期,何を思ったか興味本位でnoteというサービスを使って記事を書いていたことがありますが.
はてなブログとnoteで記事が分散するとめんどくさい.
というか,私が2つもサービスを使い分ける理由もないので,記事投稿は基本的にはてなブログに統一することにしました.
はてなブログ側に統一しようと思った理由は,
「noteで技術的記事を書くのは厳しいのであんまり使っていなかった」という消去法的な選択です.
noteの記事をはてなブログに移行して,noteのアカウントは多分一旦消します.
もし,エッセイとかを書くようになったらアカウントをまた作るかもしれませんね.
本当はQiitaに記事が分散しているのもなんとなく嫌ですし,良い使い分けも特に思いつかないのですが,とりあえずそっちは放っておきます.
良い使い分けないですかね...?
みんなはどうしてる?
岩手県立大学アドベントカレンダーなので,関係者が見ている想定で書きますが(読んでる人本当にいるんか...?)皆さんは記事投稿サイト何をお使いでしょう?
投稿内容によって使い分けなどされていますか?
そもそも,アウトプットの習慣がありますか.............?
岩手県立大学のブロガー・アウトプッター
私の観測範囲の話ですし,偏見もあるかもしれませんが,現在のところ岩手県立大学でブログや記事投稿を積極的にされている方はそんなに知りません.
なので,憧れとか参考がないんですよね....
もし,岩手県立大学のブロガーや記事執筆者がいたら是非教えていただきたいですし,この機会にみんなで拡散しましょう!
もし,岩手県立大学のブロガーや記事執筆者が少ないなら,もっと積極的にアウトプットする習慣というか風土ができたら嬉しいですね.
アウトプットはいいぞ,みんなも有名人を目指そう(適当)
最後に
話はそれましたが,ブログ運用というか,自分のアウトプットをスマートにするのは難しいねという雑談でした.
以上.
2020年 岩手県立大学 Advent Calendarを立てました!
この記事は岩手県立大学 Advent Calendar 2020の1日目です.
要約すると,
岩手の奥地に存在するらしい岩手県立大学に関係すること・人たちでワイワイするAdvent Calendarを立てたよ!
という話.
んで,1日目は"今の"岩手県立大学(主にソフトウェア情報学部)の紹介をします.
岩手県立大学 Advent Calendar
2014年から? 岩手県立大学のOBである @n0bisukeさんによって立てられてきたアドベントカレンダーです.
最初は「岩手県立大学ソフトウェア情報学部に関連のある人達で埋めましょう!笑」というような呼びかけで始まったようですが,
現在掲げている対象は
岩手県立大学な人たちやその近くの人たち。
岩手な人も。
岩手好きな人も。
です.
なんとなくエモいですね!
岩手県立大学って?
概要
岩手県立大学を知らないけど,何かの偶然でこのアドベントカレンダーを見てくださった方のために岩手県立大学を簡単に紹介します.
岩手県立大学は,岩手県の滝沢・宮古・盛岡にキャンパスがある1998年設置のわりかし新しめの公立大学です.
大半の学部が滝沢キャンパスに集まっていて,短期大学部も2つ併設されていてます.私も滝沢キャンパスの学生です.
よって,滝沢キャンパスを中心に説明すると,
学部は4学部,分野がみんなバラバラなのが面白いですね.
それぞれ大学院(研究科)も用意されています.
私はソフトウェア情報学部-ソフトウェア情報学研究科所属なので大学院生ですね.
ソフトウェア情報学部
私が所属していた学部についてもう少しご紹介します.
ソフトウェア情報学部は4年間でコンピュータとその応用に関する様々なことを学ぶのですが,雰囲気は「実学・実践」であり,社会実装を中心に勉強・研究している人が多いです.
基礎研究はあまりなく,「コンピュータというツールを使って,具体的な社会の問題を解決する」という感じで,研究に入るまでの2~3年間はそのための勉強ですね.
入学時にノートPC必携であり,入学したら"クラスルーム"と呼ばれるとりあえず机と椅子だけある部屋に割り当てられます.
で,授業を受けながら,課題をやるときは"クラスルーム"で友達と集まってワイワイみたいな感じですかね.
3年生あたりから研究を考え始めて,3年の末あたりに正式に研究室に所属します.
研究室に所属すると,4年生以上の学年の先輩がいるいわゆる講座研究室に席ができるわけですね.
そして,就活・進学受験・研究などに追われ,なんとか卒論提出して卒業!
というのが"今の"学部の4年間です.
昔の話
若い大学でありながら(だからこそ?)カリキュラムや環境の変化が激しく,創立20周年を境に完全にソフトウェア情報学部はそれまでの環境と別物になってしまいました.
よって,私は大学院1年生でありながら上記で紹介したような環境を全く知りません.
まず大きな違いは何よりも,研究室の所属時期でしょう.
私が入学するあたりまでは,岩手県立大学のソフトウェア情報学部は入学したらすぐ研究室に所属するというのが大きな特徴でした.
私もそれに憧れて入学した気がします.
先輩の研究している姿を見ながら,たまに課題を教えてもらったり,教科書のおさがりをもらったり,研究室単位でのグループワークや飲み会も1年生から院生まで集まっていました.
今ではクラスルームにいる学生はどこの研究室にも所属していないことになるので交流や面識は全くなく,飲み会にも呼べず寂しいものです.
となると「課題を教えてもらいに」「グループワークをしに」研究室にくる必要はなくなり,追い討ちをかけるようにノートPC必携化によって学生用の据置マシンが全席から撤去されたため,課題をやるのに研究室のマシンが必要ということもなくなり,クラスルームにも研究室にも人はいなくすっからかんという感じです.
研究室に意味もなく集まって,だらだら喋りながら課題をやって,気付いたらゲームや麻雀の大会になっているとか,テスト前には床や椅子で寝ながら泊まり込みで勉強するとか,そんな雰囲気は今は微塵もなくなりました...悲しいなぁ...(老害)
まぁ,色々ありますが今日の昔話はここまで.
(私が所属していた研究室の今の風景(今はクラスルームになった).写真には数台パソコンが写っているがこれらも今月中には撤去され机と椅子だけになる.もちろん冷蔵庫や電子レンジ,ソファ,テレビ,ゲーム機,雀卓など学生が置いていた私物は全て撤去された.)
最後に
ぜひ,「岩手県立大学な人たちやその近くの人たち。 岩手な人も。 岩手好きな人も。 」アドベントカレンダーに参加してくださいな.
今日は岩手県立大学,ソフトウェア情報学部の紹介とちょっとした昔話をしましたが.
ぜひ,「うちの学部はこんな雰囲気だよ!」とか「昔より今のソフトウェア情報学部の方がいいでしょ!」とか「俺が入学したときの岩手県立大学はこうだった」とか色々アドベントカレンダーに追加してくれたら嬉しいです.
以上!
MS-DOS(PC-98)のアプリケーションをC言語で作る
前回の記事でPC-98エミュ+FreeDOSの環境でMS-DOSアプリが動くことを確認した.
となると,あと思うことは1つ.
MS-DOSのアプリケーションを自作したい!
ということです.
今回はC言語でMS-DOSのアプリケーションを作ってみましょう.
環境
OS:Ubuntu 20.04
PC-98エミュ:xnp2kai rev.22 d3fe02a
FreeDOS(98):20200709更新のHDI形式
Cコンパイラのinstall
i8086版GCC
フリーのCコンパイラと言えばGCC.便利ですよね.
しかし,少し前までGCCは32bit || 64bitのアーキテクチャしかターゲットにしてきませんでした.
なので16bitのPC-98x1向けのバイナリは生成できなかったわけなんですよね.
それが最近,ついに16ビット版GCCが登場しました.しかもDOS環境特化.
詳しい話は以下の記事によくまとめられています!
gcc-ia16 を install
嬉しいことにaptでインストールできる.
https://launchpad.net/~tkchia/+archive/ubuntu/build-ia16/
$ sudo add-apt-repository ppa:tkchia/build-ia16 $ sudo apt-get update $ sudo apt-get install gcc-ia16-elf
Hello world!
以下のhello.c
をコンパイル→実行してみる.
#include <stdio.h> int main(void) { printf("Hello world!\n"); return 0; }
コンパイルする.
-march
オプションでターゲットマシンのCPUアーキテクチャを指定する.
$ ia16-elf-gcc -march=i286 -o hello.com hello.c
ちゃんとMS-DOSの実行ファイルになっているか確認しよう.
$ file hello.com hello.com: COM executable for DOS
hello.com
をPC-98エミュレータ上で実行してみる.
やったね!
気をつけるべきこと(メモリーモデル)
プログラムサイズがデカくなると以下のエラーが出るかもしれない.
Error: too large for a .com file.
これは,COM実行ファイルが64KB以下でないといけない仕様のため.
参考wikipedia: https://ja.wikipedia.org/wiki/COM%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB
これは-mcmodel
を調整することで解決できる.
コンパイルできない場合オプションの値をtiny
small
medium
と上げていこう.
tiny
で生成されるのがCOMファイル.small
medium
で生成されるのがEXEファイルなので,-o
オプションでの拡張子名には気をつけよう.
オプションの値の説明は以下の通りだ.
-mcmodel=medium Generate code for the medium code model, with one data segment and multiple text segments. -mcmodel=small Generate code for the small code model, with one data and one text segment. -mcmodel=tiny Generate code for the tiny code model (default), with one combined data and text segment.
なぜこの設定が必要なのかはx86 16ビットモード特有のメモリーモデルの話になるのだが...今回は割愛する.
以下のリンクを参照されたし.
https://www.wdic.org/w/TECH/%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%BC%E3%83%A2%E3%83%87%E3%83%AB
アセンブル出力を見てみる
動きが怪しいなと思ったり,デバッグをしたいときはアセンブル出力を見てみよう.
$ ia16-elf-gcc -march=i286 -S hello.c $ cat hello.s
.arch i286,jumps .code16 .att_syntax prefix #NO_APP .section .rodata .LC0: .string "Hello world!" .text .global main .type main, @function main: pushw %bp movw %sp, %bp pushw $.LC0 pushw %ss popw %ds call puts addw $2, %sp movw $0, %ax movw %ax, %ax movw %ax, %ax leavew pushw %ss popw %ds ret .size main, .-main .ident "GCC: (GNU) 6.3.0"
うん,ちゃんとintel 80286向けのハロワアセンブラが生成されている.
ちなみにアセンブラの記法はAT&T記法.
Intel記法のアセンブラが見たい場合オプションに-masm=intel
を加えるといい.
だが,Intel記法の出力は実験的機能らしいので正確性は注意されたし.
よくわからんところ
ia16-elf-g++でC++コードもコンパイルできるようだが,なかなかうまくいかない.
具体的には,以下のコードのコンパイルにまだ1度も成功していない.
#include <iostream> int main(int argc, char *argv[]) { std::cout << "Hello World!" << std::endl; return 0; }
基本的に以下の記事と全く同じような状況にハマってしまっている.
https://flaterco.com/kb/gcc-i16.html
まだC++でのMS-DOSアプリの開発は無理なんだろうか...
おまけ(実機テスト)
PC-9801DX実機+MS-DOSで動かしてみたがしっかり動作した!
すごい!!
まとめ
コンパイラの使い方に困ったら.
$ ia16-elf-gcc --help $ ia16-elf-gcc --target-help $ man ia16-elf-gcc
あたりを見てみよう.
次は機会があれば,C言語でDOS(PC-98)のアプリケーションをいろいろ作ってみたいと思いますー
それでは!
Linux上のPC-98エミュでFreeDOS環境を整える(2)
前回の記事でPC-98x1エミュレータでFreeDOSを起動してみました.
さて,MS-DOS向けのソフト何か試しに起動してみたいですね.
私は試しに機動警察パトレイバーに出てくるレイバー用OS「HOS」の起動画面を再現するフリーソフトを起動してみたいと思います.
以下からダウンロードできます.
https://www.vector.co.jp/soft/dos/amuse/se003159.html
仮想イメージエディタなどで先ほどの仮想HDイメージ.hdi
にファイルを注入することでエミュレータにファイルを渡すことができるんですが,毎回それをやるのはちょっと面倒...
エミュ内からホスト側のフォルダにアクセスできるようにしたいですね.
それ,できます
ということでやっていきます.
ホスト側のフォルダをエミュにマウントする
共有するフォルダを作る
エミュレータと共有したいフォルダを作ります.
$ mkdir PC-98_Folder
共有フォルダのパスと権限を設定
エミュレータで設定する方法と,設定ファイルを直接書き換える方法があります.
エミュレータで設定する方が簡単ですね.
エミュレータで設定する
エミュレータを起動して,メニューから[Device]→[Hostdrv option...]を選択します.
出てきたウィンドウで,共有フォルダのパスと権限を設定します.
設定ファイルを直接書き換えて設定する
~/.config
フォルダの中にnp2kaiのフォルダがあります.
その中のxnp2kairc
がエミュの設定ファイルです.
$ ~/.config/xnp2kai $ nvim xnp2kairc
適当なエディタで開いて,以下のように設定しましょう.
hdrvroot = ~/PC-98_Folder hdrv_acc = 3
hdrvroot
が共有フォルダのパス.
hdrv_acc
がフォルダへのアクセス権限設定です.
bit0
が読み込み権,bit1
が書き込み権の設定フラグらしいので,3
を指定すると「読み込み書き込み可」になります.
設定ファイルのその他の設定項目が気になる人は,以下に設定項目がまとまってます.
https://www.nonakap.org/np2/html/help/ja/othercfg.html
共有フォルダのマウント
前々回の記事でnp2kaiをソースからbuildした人は,
そのソースのフォルダの中にnp2toolというのがあると思います.
(無い人||ソースからbuildしてない人)は以下のページにダウンロードリンクがあります.
https://sites.google.com/site/np21win/download
まずはnp2tool.zipを解凍します.
$ cd ~/NP2kai/np2tool $ unzip np2tool.zip
で,エミュを起動して画像のような手順でFDDにnp2tool.d88
をセットします.
セットしたら,DOS上で以下のような手順を踏みます.
1. Bドライブ(np2tool.d88をセットしたドライブ)に移動.
2. [HOSTDRV D]コマンドを実行.オプションの英字で設定したドライブにフォルダがマウントされます.
3. Dドライブ(共有フォルダをマウントしたドライブ)に移動.
4. ヤッタァ!
実際のコマンドの流れ以下のようになりますね.
A:¥> B: B:¥> HOSTDRV D B:¥> D: D:¥> DIR
ソフトを起動する
共有フォルダに起動したいソフトをぶち込んで,.EXEか.COMを起動します.
D:¥> cd HOSOP150 D:¥> HOSOP
やったー!
まとめ
Linux上のPC-98エミュでFreeDOS環境を整える(1)
前回の記事でLinuxにPC-98x1エミュレータを入れてみました.
しかし,「PC-98エミュを入れたところでOSがないと既存のアプリが動かせんやん!!!」
と,なってしまいますよね.
かと言って,当時のPC-98用OSは手に入りづらい・・・
そんな貴方のために,今日はお金をかけず簡単にPC-98エミュレータ上にDOS環境を構築する流れを備忘録的に書いていきます.
FreeDOSとは
世の中には無料で配布されているDOSがあります,その一つがFreeDOSです.
FreeDOSは、PC/AT互換機のためのオペレーティングシステム (OS) である。 MS-DOS互換の自由な代替環境などを目的として作られた。
(引用:https://ja.wikipedia.org/wiki/FreeDOS)
要するに,MS-DOSを持ってなくてもこれを使えばMS-DOSプログラムが動かせるってことですね.
「MS-DOS互換」とは言ってますが,実際はMS-DOS以上に高機能なDOSになってます.
PC-98向けFreeDOS
FreeDOS(98)
元々のFreeDOSは上記にもある通りPC/AT互換機のためのオペレーティングシステム (OS) ですが,
これをPC-98にも移植したFreeDOS(98)という神プロジェクトがあります.
現在の最新版(機能的に最新)な物は以下で公開・配布されています.
http://bauxite.sakura.ne.jp/software/dos/freedos.htm
最終更新は2020年07月09日(記事執筆時点)と,つい最近更新されました,神.
動作条件
READMEから引用すると,以下のようなスペックが求められるようです.
FreeDOS(98)の動作に必須となる環境は以下の通りです。
- NEC PC-9801シリーズおよびその互換機 (ハイレゾモード、PC-98LT、PC-98HAは未対応)
- 256Kバイト以上の基本メモリ
- 2DD(640K)もしくは2HD(1M)のフロッピーディスクドライブ、SASI、SCSI、IDE接続のハードディスクのうち、いずれか1基以上(PC-9801初代/E/F/Mの2D(320KFD)は未対応)
(PC-9801初代のHDインターフェースには対応していない可能性がありますが、未確認です…)
推奨環境は以下のようになります。
1Mバイト超のメモリが存在しない場合、FreeCOMがXMSを使ったメモリスワップを利用できないため、基本メモリの空き容量が少なくなるかもしれません。 (ディスクイメージに入っているMEMコマンドで、空きメモリ容量が確認できます)
ディスクイメージはFD,HD共にエミュレータでの動作を想定している,
よって,実機で動作させるには一手間必要かもしれない.
ダウンロードから起動まで(めっちゃ簡単)
ダウンロード
というわけでPC-98エミュでFreeDOSを使ってみましょう.
先ほど示した公開ページから,
の項目にあるzipをダウンロードしましょう.
んで,zipを解凍します.
$ unzip -d FreeDOS_98 fd98_hd_250m_20200709.zip
起動
今回は前回の記事でセットアップしたNP2kaiエミュでFreeDOSを使ってみます.
まずはNP2kai起動.
$ ./xnp2kai
メニューバーから,[HardDisk]→[IDE0-0]→[Open]を選択する.
先ほど解凍したFreeDOSフォルダの中にある****.hdi
を選択して開く.
[Emulate]→[Reset]でエミュレータをリセットする.
そうして,少し待つとFreeDOSが起動します!!簡単!!
ちょっとしたテスト
dir
コマンドでフォルダの中身をみれます.
ver
でDOSのバージョンを表示したり,time
でシステム時刻を確認したりして動作を確認します.
まとめ
令和の時代にLinuxにPC-98x1エミュレータを入れる
時代は令和,PC-9801が発売されたのは1982年であるから,もう30年以上前.(今日で38周年)
何なら40年の時が経とうとしているが...
そんなことはどうでもいい.ユーザーはPC-98x1が使いたいのだ.
よって,LinuxにPC-98x1エミュレータを導入する方法を備忘録的に書いていく.
めっちゃ簡単な方法
WindowsバイナリをWineで動かすと簡単
大体動くのは確認したけど完全に互換性があるかはわからん
Wine をいれる
$ sudo apt install wine-development
使い方としては以下のようにexeファイルが実行できる.
$ wine ~/hoge.exe
以下,配布されているWindows実行バイナリとして主なものを2つ紹介する.
Neko Project Ⅱ
Intel 80286相当のエミュレートができる.
80286相当なので,アーキテクチャはIA-32(現在一般的にx86と呼ばれているもの)より前のx86-16bit.
リアルモードのみのエミュレートをサポートする.
以下から実行ファイルがダウンロードできる
https://www.yui.ne.jp/np2
Neko Project 21/W
Intel 80486以上のエミュレートができる.
具体的には以下のチップ
Intel i486SX , i486DX , Pentium, MMX Pentium, Pentium Pro, Pentium II, Pentium III, Pentium M, Pentium 4 プロセッサ AMD K6-2, K6-III, K7 Athlon プロセッサ選択可能(一部機能未実装)
個人的に嬉しいのはFPUが使えるところ.
i486あたりだとFPUはもうSoCに内蔵されているから,内蔵FPUのエミュレートなんだろうか.
コプロセッサだった頃のFPUとの互換性は未知数.(後で確かめてみよう)
以下から実行ファイルがダウンロードできる
https://sites.google.com/site/np21win/download
BIOSとフォントファイルについて
実機のBIOS.ROMとFONT.ROMはexeと同じ場所に置けばとりあえずOK
実機からBIOS.ROMとFONT.ROMを吸い出す方法は記事の後半を参照してね.
ソースからBuildする方法
「wineで動かすと不安定...」「ちゃんと互換性があるか不安...」という人はソースからエミュレータ をBuildしましょう.
NP2kai
ソースからLinuxの実行ファイルを生成するならこれが一番.
数あるnp2の派生をだいぶ吸収しているので機能充実.
install
インストール手法は以下に詳しく書いてある.
https://github.com/AZO234/NP2kai
Linux意外にも,Windows,macOS,Android,iOSなど多くのプラットフォームに対応しています.
X11ポート install
今回はLinux + X Window System 11 ポートでBuildしてみます.
個人的にはこれが簡単だった.
私が試した環境はUbuntu20.04
手順書
詳しい手順は以下に詳しく書いてある.
https://github.com/AZO234/NP2kai#x-with-gtk2-and-sdl
ツールinstall
Buildに必要なツールをinstallします.
$ sudo apt install git cmake ninja-build build-essential libx11-dev libglib2.0-dev libgtk2.0-dev libsdl2-dev libsdl2-mixer-dev libsdl2-ttf-dev libsdl1.2-dev libsdl-mixer1.2-dev libsdl-ttf2.0-dev libusb-1.0-0-dev libfreetype-dev libfontconfig1-dev libssl-dev
build
githubからリポジトリをクローンして,CMakeの基本的な下準備をします.
$ git clone https://github.com/AZO234/NP2kai.git $ cd NP2kai $ mkdir build $ cd build $ cmake .. -D BUILD_X=ON -D BUILD_I286=ON
成功すると最終的に以下のようなログになる.参考までに.
とにかくエラーが出ていなければOKでしょう.
・・・ -- Checking for module 'glib-2.0' -- Found glib-2.0, version 2.64.3 -- Found glib2.0 -- Found GTK2_GTK: /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so -- Found OpenSSL: /usr/lib/x86_64-linux-gnu/libcrypto.so (found version "1.1.1f") -- Configuring done -- Generating done -- Build files have been written to: /home/hiro/NP2kai/build
ビルドする.
-j
オプションの引数は各自の環境に合わせて書き換えてください.
$ make -j3
xnp2kai
と xnp21kai
という実行ファイルが生成されていればOK
xnp2kai
は Neko Project Ⅱ 相当,つまりはIntel 80286相当のエミュレートアプリ.
xnp21kai
は Neko Project 21/W 相当,つまりはIntel 80486以上のエミュレートアプリです.
...多分.
$ ./xnp2kai
で,起動すればOK
$ sudo make install
でinstallできます.
BIOSとフォントファイルについて
~/.config/
の中に xnp2kai/
と xnp21kai/
があるのでここに入れればOK
$ cd .config/ dconf/ gnome-session/ ibus/ update-notifier/ enchant/ goa-1.0/ menus/ xnp21kai/ evolution/ gtk-2.0/ nautilus/ xnp2kai/ gedit/ gtk-3.0/ pulse/
$ ls xnp2kai/ BIOS.ROM FONT.ROM debugss font.tmp sav xnp2kairc
実機からBIOSとフォントファイルを吸い出す方法
以下から,getbios.lzh
をダウンロードします.
(公式ページにもツール配布リンクがあったんですが,リンク切れのよう)
http://retropc.net/yui/np2tool/index.html
解凍して出てきた,GETBIOS.COM
を実機のMS-DOS上で実行すれば吸い出せます.
最後に
令和の時代もよいPC-98ライフで楽しみましょう.