見出し画像

CPUはどうやって動くのか

昔のパソコンはBASICが使えるようになっていることが殆でしたが、自分でゲームなどを作るようになると、そのあまりの遅さにマシン語を覚えて使うようになることが多かったです。そして少しでも処理を早くするために命令を実行するのに必要なクロック数を指折り数えて、プログラムを組んでいました。

メモリを節約するためには命令長の短い命令を使うように注意することはもちろんです。同じような処理であっても使うレジスタによっては命令が長くなるものもあったりします。同じ命令長であっても命令によっては実行に必要なクロック数は大きく異なり、複雑な処理をする命令は結構なクロック数が必要なものもあります。

このあたりはCPUによって大きく異なるので、同じテクニックが他のCPUでも使えるかというとなかなか難しいものがありました。特にフラグの挙動の違いは影響が大きかったですね。

6502 は遅かったのか?

そもそもCPUが、どのように命令を読み込んで実行するかに関しては、ソフトを書いている限り、そんなに詳しくなくても大丈夫なのですが、ボードを設計する人にとっては、これこそが命です。CPUから出ている各信号線を解釈して、メモリや入出力に接続しなければなりません。そしてリセット信号を与えて最初の命令を読み込ませ処理が始まるのです。

CPUの命令実行の流れを理解しよう!(プログラムカウンタ、レジスタ、ALUなど)

まず命令を読み込み解釈し、必要ならばメモリのアドレスを計算し処理を続けます。そして処理に応じてレジスタの値を変えたり、メモリにデータを格納するのです。これを繰り返すことでCPUはプログラムを実行していきます。この処理の進め方はCPUによって癖があって、よく使われたZ-80であれば、以下のような手順になります。

8ビット CPU Z80タイミング

このように手順をひとつひとつ進めるのが一般的だったのですが、この時代のCPUである6502は「パイプライン処理」を行っているので命令の実行が高速であるという記述を見つけることがあります。パイプラインというのは、複数の手順の一部を前の手順が終了する前に先回りして実行することで、これがうまく機能すれば命令を実行するクロック数を減らすことが出来るわけです、

パイプライン処理とは

パイプライン処理

実は6502の設計は、いわゆる正式なパイプラインではなく、前にアドレス計算に使った値が使い回せる場合に限り、手順を一つ飛ばせるという機能だったようですが、これでも処理の高速化には大きく貢献しており、6502は速い!とゲームで愛用された理由のひとつになっていました。もっともページ境界をまたぐ場合には実行クロックが変わるというのは、決まった時間で処理を行いたい場合には、かなり注意が必要になることになりましたが。

MCS6502

dev CPU (6502カスタム)

ここまでのリンク先の記事で、実は割り込みに関する記述が多く含まれていたことに気づいた人もいるかもしれません。一般的なアプリケーションを書くだけの人には割り込みの意味がわかりづらいかもしれませんが、ハードウェアを相手にしたり、複数のプログラムを同時に実行するには無くてはならないもので、この話はいずれまとめてみたいと思います。

8ビットな時代のCPUは、だいたいこのあたりまでがわかっていれば十分だったのですが、時代が進むに連れキャッシュメモリが搭載されMMUを使うようになり、CPU自身も複数持つようになり、だんだん複雑になっていきます。CPUの説明をするには、これらの話がよく出てくるようになるので、出来る範囲で少しずつまとめておきたいなとは考えています。

#CPU #マシンステート #パイプライン #6502 #Z -80

いいなと思ったら応援しよう!