少ないリソースを酷使する

低レイヤーとレトロPC(PC98,MSX)が好きな情報学生

farポインタを理解する(目指せガンダムエンジニア)

この記事は岩手県立大学 Advent Calendar 2020の4日目です.(遅刻)

今日,私のTwitterのタイムラインで「ガンダムのプログラムがC言語で書かれている」という話題で盛り上がっていました.


その中で,「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以上のメモリアクセスを可能とします.

f:id:T-takeda:20201206210848p:plain

アセンブラで書くなら

アセンブラなら

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で埋められます!
f:id:T-takeda:20201206221944p:plain

まとめ

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必携化によって学生用の据置マシンが全席から撤去されたため,課題をやるのに研究室のマシンが必要ということもなくなり,クラスルームにも研究室にも人はいなくすっからかんという感じです.
研究室に意味もなく集まって,だらだら喋りながら課題をやって,気付いたらゲームや麻雀の大会になっているとか,テスト前には床や椅子で寝ながら泊まり込みで勉強するとか,そんな雰囲気は今は微塵もなくなりました...悲しいなぁ...(老害)
まぁ,色々ありますが今日の昔話はここまで.

f:id:T-takeda:20201201182615j:plain (私が所属していた研究室の今の風景(今はクラスルームになった).写真には数台パソコンが写っているがこれらも今月中には撤去され机と椅子だけになる.もちろん冷蔵庫や電子レンジ,ソファ,テレビ,ゲーム機,雀卓など学生が置いていた私物は全て撤去された.)

最後に

ぜひ,「岩手県立大学な人たちやその近くの人たち。 岩手な人も。 岩手好きな人も。 」アドベントカレンダーに参加してくださいな.
今日は岩手県立大学,ソフトウェア情報学部の紹介とちょっとした昔話をしましたが.
ぜひ,「うちの学部はこんな雰囲気だよ!」とか「昔より今のソフトウェア情報学部の方がいいでしょ!」とか「俺が入学したときの岩手県立大学はこうだった」とか色々アドベントカレンダーに追加してくれたら嬉しいです.

以上!

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環境特化.
詳しい話は以下の記事によくまとめられています!

ということでCコンパイラgcc-ia16を使いましょう!

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.comPC-98エミュレータ上で実行してみる.
f:id:T-takeda:20201027224008p:plain

やったね!

気をつけるべきこと(メモリーモデル)

プログラムサイズがデカくなると以下のエラーが出るかもしれない.

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で動かしてみたがしっかり動作した!
すごい!!
f:id:T-takeda:20201027230600j:plain f:id:T-takeda:20201027230608j:plain

まとめ

コンパイラの使い方に困ったら.

$ 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...]を選択します.
f:id:T-takeda:20201022212100p:plain

出てきたウィンドウで,共有フォルダのパスと権限を設定します.
f:id:T-takeda:20201022212117p:plain

設定ファイルを直接書き換えて設定する

~/.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

で,エミュを起動して画像のような手順でFDDnp2tool.d88をセットします.
f:id:T-takeda:20201022212040p:plain f:id:T-takeda:20201022212204p:plain

セットしたら,DOS上で以下のような手順を踏みます.
1. Bドライブ(np2tool.d88をセットしたドライブ)に移動.
2. [HOSTDRV D]コマンドを実行.オプションの英字で設定したドライブにフォルダがマウントされます.
3. Dドライブ(共有フォルダをマウントしたドライブ)に移動.
4. ヤッタァ!
実際のコマンドの流れ以下のようになりますね.

A:¥> B:
B:¥> HOSTDRV D
B:¥> D:
D:¥> DIR

f:id:T-takeda:20201022212254p:plain

ソフトを起動する

共有フォルダに起動したいソフトをぶち込んで,.EXEか.COMを起動します.

D:¥> cd HOSOP150
D:¥> HOSOP

やったー!
f:id:T-takeda:20201022212232p:plain

まとめ

これで簡単にいろんなソフトを楽しめますね.
次回?はPC-98向けのソフトを作成するC言語開発環境を整えます.

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、SCSIIDE接続のハードディスクのうち、いずれか1基以上(PC-9801初代/E/F/Mの2D(320KFD)は未対応)

PC-9801初代のHDインターフェースには対応していない可能性がありますが、未確認です…)

推奨環境は以下のようになります。

  • 80286以上のCPUを持つPC-9801シリーズおよびその互換機(i386以上を推奨)
  • 640Kバイト以上のメモリ(1.6Mバイト以上を強く推奨)
  • SASI、SCSIIDE接続のハードディスク

1Mバイト超のメモリが存在しない場合、FreeCOMがXMSを使ったメモリスワップを利用できないため、基本メモリの空き容量が少なくなるかもしれません。 (ディスクイメージに入っているMEMコマンドで、空きメモリ容量が確認できます)

ディスクイメージはFD,HD共にエミュレータでの動作を想定している,
よって,実機で動作させるには一手間必要かもしれない.

ダウンロードから起動まで(めっちゃ簡単)

ダウンロード

というわけでPC-98エミュでFreeDOSを使ってみましょう.
先ほど示した公開ページから,

FreeDOS(98)各種PC-98エミュレータ用ハードディスクイメージ(HDI形式)

の項目にあるzipをダウンロードしましょう.
んで,zipを解凍します.

$ unzip -d FreeDOS_98 fd98_hd_250m_20200709.zip

起動

今回は前回の記事でセットアップしたNP2kaiエミュでFreeDOSを使ってみます.
まずはNP2kai起動.

$ ./xnp2kai

f:id:T-takeda:20201013233035p:plain

メニューバーから,[HardDisk]→[IDE0-0]→[Open]を選択する. f:id:T-takeda:20201021221631p:plain

先ほど解凍したFreeDOSフォルダの中にある****.hdiを選択して開く. f:id:T-takeda:20201021221700p:plain

[Emulate]→[Reset]でエミュレータをリセットする. f:id:T-takeda:20201021222334p:plain

そうして,少し待つとFreeDOSが起動します!!簡単!!
f:id:T-takeda:20201021222410p:plain

ちょっとしたテスト

dirコマンドでフォルダの中身をみれます.
verDOSのバージョンを表示したり,timeでシステム時刻を確認したりして動作を確認します.
f:id:T-takeda:20201021222433p:plain

まとめ

とりあえず,今日はここまで!
次回は実際にFreeDOS(98)上でMS-DOS向けのアプリ何か試しに起動してみます.

令和の時代に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を吸い出す方法は記事の後半を参照してね.
f:id:T-takeda:20201013232932p:plain

ソースからBuildする方法

「wineで動かすと不安定...」「ちゃんと互換性があるか不安...」という人はソースからエミュレータ をBuildしましょう.

NP2kai

ソースからLinuxの実行ファイルを生成するならこれが一番.
数あるnp2の派生をだいぶ吸収しているので機能充実.

install

インストール手法は以下に詳しく書いてある.
https://github.com/AZO234/NP2kai

Linux意外にも,WindowsmacOSAndroidiOSなど多くのプラットフォームに対応しています.

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

xnp2kaixnp21kai という実行ファイルが生成されていればOK
xnp2kaiは Neko Project Ⅱ 相当,つまりはIntel 80286相当のエミュレートアプリ.
xnp21kaiは Neko Project 21/W 相当,つまりはIntel 80486以上のエミュレートアプリです.
...多分.

$ ./xnp2kai

で,起動すればOK

$ sudo make install

でinstallできます.

f:id:T-takeda:20201013233035p:plain

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ライフで楽しみましょう.
f:id:T-takeda:20201013233016p:plain

次回は,MS-DOSがなくてもPC-98エミュレータが楽しめる,FreeDOS(98)の導入について書きます.