PC-A801の仮想ハードウェアについて熱く語る

仮想ハードウェアのすすめ

月刊アスキー1978年9月号のTINY BASIC NEWS LETTERに掲載された、斜説 マイ・ランゲージのすすめという記事を覚えているでしょうか。当時のマイコン(パソコンという言葉はまだなかった)ユーザの間では、BASICというプログラミング言語が全盛でした。今と違って市場にはさまざまなアーキテクチャのマイコンがありましたが、ほとんどどれもがBASIC言語のインタプリタを標準装備し、電源を入れればすぐにBASIC言語が使える「パワー・オン・BASIC」の時代の始まりでした。BASICには手軽に書けるという長所がありましたが、グローバル変数しか使えないなど欠点も多いものでした。この記事は、BASICの上で各自が、自分の好きなだけ欲しいだけの機能を盛り込んだ自分だけのプログラミング言語MPL(My Programming Language)を作ってしまうことを勧めるものでした。

現在は、パソコンといえばIBM PCに由来するPCアーキテクチャ(以下IBM PC)が全盛となっています。IBM PCはスケールメリットにより、安価で比較的高性能です。しかし、何度も拡張を重ねてきた歴史のために、複雑怪奇なアーキテクチャとなっています。オペレーティングシステムの上で高級言語を使ってプログラムを書いていても、少し細かいことをやろうとすると、その歴史的経緯に関する知識が必要になってきます。まして、新しいオペレーティングシステムを作ったり、オペレーティングシステムなしで動くプログラムを作ったりするためには、この知識は不可欠で、プログラミング上の壁となっています。

欲しいものがなければ作ってしまうのが、パソコンの文化です。こんなアーキテクチャは捨てて、自分だけのPCアーキテクチャを作ってしまいませんか。自分の好きなCPU(存在しなくても可)、メモリマップ、ビデオ出力、音源などを持ち、自分の好きな方法で制御できる、仮想ハードウェアを作り、それを使って新しいオペレーティングシステムや、ゲームなどを作るのです。現在のIBM PCの性能と利用技術を活用すれば、たいていの用途には十分な性能のエミュレータを実現できるはずです。あなたも自分の仮想ハードウェアを考えて、エミュレータを作ってみませんか。命令セットのエミュレート(x86以外の場合)、特権命令のエミュレート(x86の場合)、I/Oポートをトラップして周辺機器のエミュレート……うまくいけば、これが厄介なIBM PCによる最後のプログラミングになるのです。

タイマの歴史

初代IBM PCには、時刻や時間の取得に使えるタイマは、システムタイマ一つしかなかった。BIOSでは毎秒約18.2回(65536/1193180秒間隔)の割り込みを発生させて利用していた。経過時間は割り込みの回数を数えることで計算できたが、時刻の初期値はユーザが入力する必要があった。DOSが起動のたびにユーザに現在の日付と時刻を入力させていたのは、このためである。

1984年のPC/AT以後の機種では、別にリアルタイムクロック(PC-9800シリーズのカレンダ時計とほぼ同じで、電源を切っても動作し続ける)を装備し、起動時にそれを読んで、時刻を初期化するようになった。しかし互換性のため、初期化時以外はリアルタイムクロックを読み出さず、システムタイマによる割り込み回数のカウンタを、経過時間と時刻の計算の両方に使っている。これには次のような欠点がある。

一方、PC-9800シリーズには最初から、カレンダ時計とシステムタイマの二つが備わっていた。システムタイマには固定された役割はなく、プログラムで自由に使うことができる。カレンダ時計には最初は、年がなかったが、1986年のPC-9801VX以降の機種では、年も扱え閏年にも対応するようになった。ただし、年は下二桁のみなので、PC-9800シリーズのMS-DOSでは、1980年から2079年までと解釈することになっている。

IBM PCも、PC-9800シリーズも、Pentium以降のCPUを持つ機種では、このほかにタイムスタンプカウンタを使うことができる。

PC-A800シリーズは、カレンダ時計、システムタイマ、そして、タイムスタンプカウンタを最初からすべて持ち、役割を分けることで混乱を避けている。

#1: タイマの入力クロックは、仕様上は14.31818MHzを12分周した1.193182MHzのはずだが、DOSの計算では1.193180MHzが使われている。前者で計算すると1日は23時間59分59.877秒と、後者より0.121秒短くなるが、現在のパソコンの精度ではどちらが正しいか判別できない。いずれにしても、1日の長さの仕様は変である。

フロッピーディスクコントローラについて

(準備中)