先日探し物をしていたら,子供の頃にゴミ捨て場から拾って集めていたジャンクボードから intel 8088 が出てきました。
それを機に,久しぶりにマイコンのボードでも作ろうか?と思い,ちょっと調べ事を始めました。
今回はそんな日記半分な記事,そんじゃしょうがないとx86の歴史をざっと駆け足で。
intel 8088 って何?(4004から8086までの話)
さて,日記だけではあまり役に立たないので,intel 8088 についても幾らか。
恐らくのCPUの名前を知っている人は・・・あ,いやその前に。
まず intel 8088 ってCPUの名前です。
何だかやたら ”8” だらけな名前のCPUですが,これ,有名なCPUの派生形です。
intel 8088 は intel 8086 のデータバスを8bitにしたものです。
intel 8086 は後のi386等の祖先の16bitのCPUです。
・・・と,下手をするとこの段階で若い人は知らないかもしれませんね。(この記事書いてる時,私,既に42歳です)
なので,まずは少しintelのアーキテクチャの歴史(?)の話でも。
intelのCPUの歴史ですが,intel 4004 辺りからがCPUらしい歴史となります。
今度は4だらけの名前ですが,名前の通り4bitのCPUとなります。(なお,正確にはCPUと呼べるかはちょっと怪しい)
4bit?0~Fまでしか扱えないの?と思うかもしれませんが,0~Fまで扱える以上0~9も扱うことができ,私たちが使う10進数は何とか扱えるんですね。
なので,4bitというのは一つ実用なビット数なんですね。
その後,intelは ”8008" というCPUを作ります。
もうなんとなく想像つきますね?そう,今度は8bitです。
ファミコンが8bitですから,ここまでくると何となくコンピュータっぽい感じですね。
が,まだアドレスは14bitしかなく,16KiB(16kbyte)のメモリーしか扱えませんでした。
かつ,CPUとして付いてないと困る機能だけ何とか入ってるといった感じのCPUで,大きなプログラムを実行するのは難しく,機械語の命令も物足りず使い道は限定的でした。
そのため,intelは更に ”8080” というCPUを作ります。
最後の0と8ひっくり返したような型番ですね。けど中身は大違いです。
ここでやっと今私たちが知ってるCPUに近い物になります。
アドレスは16bitとなり64KiB(当時としては超大容量)のメモリーを扱え,レジスタも増えて近代化。
機械語の命令も増え,かつ近代的な物になり,非常に扱いやすくなったため一気に普及しました。
その後,intelは8080を改良した8085というCPUを作ります。
幾つか命令が追加され,割り込みコントローラーも簡単なものを内蔵(8080は8259という外付けの割り込みの制御を行うICが必要),そして何より・・・
5V単一電源で動作するようになりました。
え?これ当たり前じゃないの?って?
いや,逆か。コア電源は?って?
コア電源はありません。その代わりに内部の回路の構造上,8080の動作のために+5Vに加え ”-5V” と+12Vが必要でした。
何と,3種類も電源が必要だったんですね。8085はそれを改善しました。
と,8085も登場し,ライバルのモトローラはMC6809も発売,さらにはZilogのZ-80も登場,使いやすく家庭にも普及,一般個人もコンピュータを使う時代,マイコンピュータ(今でいえばパーソナルコンピュータ)の時代が始まります。
さて,8bitが普及しコンピュータをどんどん活用するようになると,次にほしいのは16bitのCPUですよね?
と,生まれてきたのが冒頭の "8086" です。
この際に扱えるメモリーも16倍の1MiB(1Mbyte)に増えます。
そして,なんと・・・
掛け算・割り算命令が使えるようになります。
再び,です・・・よね。「「 それ当たり前じゃないの? 」」
実は,8086まで掛け算・割り算の命令が機械語にありませんでした。
やっと「四」則演算になります。そういった意味でもやっと「計算機としての機能がすべて搭載された」とも言えます。
・・・と,ココで一つ決定的な仕組みが搭載されます。「セグメント」という考え方です。
先ほど「16倍の1MiB」と書きましたが,実は8086って64KiBが16ブロックといった感じでメモリーが管理されています。
1MiBを扱う20ビットのアドレス,CPUの中では「16bit + 4bit」という風に扱われています。
コレは過去の64KiBが上限だった8bitのシステムとの互換性の確保の問題です。
これにより,8bitの頃のICがそのまま使えたりします。
が,CPUが16bitになったものでデータバスは16bitになりました。
過去の回路を無修正でそのまま使う事はできません。
で,一緒に登場したのが 8088 ってわけ。
8088は内部は8086のまま,データバスを8bitにしたものです。
データバスは8bit,64KiBも考慮されていますから,既存のシステムにそのまま接続できます。
(正確にはバスの動作の違いがあり少しCPUの周辺に回路が必要,DMAも1MiBの空間では少し改造が必要)
余談ですが,8086と8088の間にはコプロセッサとして "8087"(浮動小数点の演算を扱うIC)が,8088の次には "8089"(IO版DMAみたいなIC)があったりします。
で,この記事書いてる人,中学生の頃だったか?に8088を使ってみたくてしょうがなく。
既存の8bitの回路で16bitのCPUが使えるわけですから,そりゃ便利で。
実際,回路が簡単なもので,8086より8088で,という電子工作ファンもそこそこいました。
からの,冒頭の言いかけた言葉。
初期の IBM PC も同様の理由で8088を使っていました。
それを知っている人は,私よりずっとベテランのエンジニアたちでしょう。
intel 8088 って何?(8086のその後,i386へ)
さて,せっかくなので8086のその後の話も。
16bitの次は32bit?という感じですが,その間に80186と80286というCPUをIntelは作っており,いずれも16bitです。
この2つのうち,80186は8086とそう大きくは変わりません。
DMACなどをワンチップ化したもので,どちらかというと組み込み向け要素もあったCPUです。
が,大きく変わってしまったのが80286です。
(いや,Intelの狙いはちょっと違ったんだけど・・・)
こちらは一線を画す変更が行われました。
MMUが搭載され,保護仮想アドレスモード,いわゆる「プロテクトモード」が搭載されました。
私感ですが,扱えるメモリーが増えた,とかよりこちらの方が影響大きいと感じます。
・・・って,これも組み込みやOSいじる人じゃないと意味わからないですね。
C言語のポインターで配列の範囲外のメモリーにアクセスした際に例外が発生しますよね?
あの例外を出しているのって,MMUなんです。
MMUの ”保護”仮想アドレスモード,プロテクトモードを使います。
マルチタスクのOS,Windowsもプロテクトモードで動いています。
MMUとは ”Memory Management Unit" で,メモリーの管理に関するいろいろな機能を提供します。
搭載メモリー以上のメモリーを使える,スワップファイルってありますが,あれもMMUがかかわります。
そう,80286でMMUが搭載されたことにより,OSの当たり前な機能の実現や,高度な言語の安全なメモリーへのアクセスができるようになったんです。
が,これがお初物故にチョット使いづらく(苦笑
真に使いやすいMMUの登場は,80286の後継,32bitの "intel i386" にてとなります。
そして,このi386がその先に続く長い32bitの時代の礎となります。”IA-32” ってやつです。
これらの機能をフルに活用し,WindowsNTやPC-UNIX等の現代的なOSが生まれることになります。
余談ですが,Linux等でポインターの操作を誤った際に「Segmentation Fault」ってメッセージが出ますが,あの ”Segmentation” は8086のセグメントが元といえば元です。
で,さっきにおわせた「セグメント」,この考え方もちょっと使ってるのですよ,MMU。
ある大きさでメモリーを「ページ」という風に分けて,何ページ目のメモリーと管理してます。(最も,”ページ” って呼び名は別のシステムを参考にしたせいですが)
と,よく ”x86” と言いますが,文字通り,8086,「86」がすべての始祖になっていたりします。
このような互換性を優先し16bitはおろか8bitを引きずった構造は "x64" や "AMD64" と呼んでいる64bitまで続くことになります。
64bitになった際にある程度切り捨ててはいますが,いまだに名残が残ってたりします。
で?どんな8088のマシン作るのさ?
さて,ここからは最近作ろうと思い始まった8088のボードのお話。
まだ何か明確に決めているわけではないのですが,大雑把には以下のような構成にしようかと思います。
うん。大雑把。
一応後々のことを考えDMACも搭載しようかと考えています。
で,いくら16bit,今まで遊んでた8bitとは違う,昔はれっきとしたパソコンだったといえども,現代の64bitのCPUのようなパワーには恐らく4~5桁足りません。
そのため使用用途は考える必要があり,いろいろ検討し趣味の電子工作に使おうと思っています。
コンピュータの応用の回路を作りたい日もあるのですが,WindowsやPC-UNIXのような立派なOSに管理された環境ではI/O等に自由にアクセスするわけにはいきません。
なので,「16bitのデッカいポケコン」位の物を作ってみようかと思います。
そのため,細かい話ですが,図中のCTC(・・・はZ-80だけの呼び名だっけ?)は複数あるかのような表記になっています。
タイマーなんてなんぼあってもいいですからね!
タイマー多ければ三相誘導電動機(工場や電車に使うでっかいモーター)すら回りますわ!
その他・・・RTCも欲しいですかね?
画面への表示はどうしようか?とも思いましたが,モノクロの小型液晶モジュールで最初は行こうかと。
CRTCやグラフィクスのコントローラーなんて作るの大変ですから。
今はメモリー(ある種VRAM)を積んでモジュール化されている液晶が安価に手に入りますから,それで一旦は何がしの表示を出そうと思います。
ただ,後々やってみたいこととして80286まではアップグレードしてみたく。
(実は・・・調べ事してた際に買っちゃった)
先に書いた通り,80286からはMMUを搭載します。
i386まではご遠慮するとして,80286でMMUを少し触ってみたいな,と思っています。
アカウントの自己紹介にもある通り,私は制御や電子回路の畑で育ってきており,エンベデッド系の人間です。
お恥ずかしながら資格もエンベデッド系しか持っていません。
(・・・と第二種電気工事士やら,無線やら,建設災害防止協会の免許やらも,な。SEとは?)
その資格に恥じないよう,MMUを息吸ってる内に弄っておきたいですネ!
かつ,80286もこれまた中学生ぐらいの頃にいじってみたかったCPUでもあります。ぜひ,80286にアップグレードしてみたいですね。
そのためにも,8088で16bitのシステムに,周辺回路としてはその先につながるI/Oに慣れる,慣れることができるボードにしようかと考えています。
といってもこの青焼きっぷり。どうなる事やら?
