プチコンで遊ぼう! (はてなブログ版)

任天堂3DSのプチコンで遊ぼう! [twitter:@eida_s]

はてなダイアリーから移行しました。 はてなダイアリーのURLを開いても自動的にこちらにリダイレクトされますのでご了承ください。

Z80についてわかったこと何点か

Z80についてわかったことを何点か。
これはZ80初心者からの視点で、Z80熟練者からすると「当たり前」のことに思えるかもしれないけど、同様にゼロから学習する人が読むことを考えて情報を残しておく。

■PCについて

●PCの初期値は何か?
Z80のPC(プログラムカウンタ)は、起動時やリセットを行った時、&H0000になる。
リセットした時には、PCを&H0000にする以外には付随する動作はないようだ。
(まだ割り込み関係については勉強してないのでこの辺りはまだわからない。後でわかったら付け足す。)
もちろん、メモリ等に対しては何も行われない。
昔、リセットするとメモリが消去されるのだと勝手に思っていたが、これは&H0000からはじまる処理にそのように書かれているだけだろう。
起動時やリセット時に&H0000から実行が始まるので、普通、&H0000から初期化ルーチンを書いておく。これは普通、ROMに書かれている。「普通」と書いたのは、Z80で最初の命令が実行される前に&H0000のアドレス位置に初期化ルーチンさえあれば、別にRAMに書いてあってもいいということ。

とにかく、Z80へのリセット信号はPCを&H0000にセットするだけ。(もしかすると、リセットボタンを押すとRAMが全て初期化されるような回路をそれぞれのパソコンで持っているかもしれないけど、それはZ80の外側の話。あくまでZ80へのリセット信号では関係ない、ということ。)
自分みたいな初心者は案外こういうことでわからなくなって悩みがちなので、自分でも理解したことだし、明確に書いておいた。


●PCが&HFFFFまで行ってしまったらどうなるのか?
これは単に&H0000に戻る、というかPCが&H0000にセットされるだけ。
(以前は例外の信号みたいなのを出して止まってしまうのかとおもったけど、そうではないようだ。)
資料の中でその旨の記述を読んだけど、どれで読んだかわからなくなってしまった。判明したら追加する。


■SPについて

SP(スタックポインタ)については、結構疑問に思っていたことがあった。

●起動時はSPはどうなっているのか?
これはどうも、不定ということのようだ。SPは初期化ルーチンの中で明確に初期化してやらないといけない。
(「パチスロに電気を入れた時Z80はどう動く? 2006/7/30」 http://www18.ocn.ne.jp/~jgm_comp/newpage3.htm参照 )

●SPはどう進むか?
PUSH/POP時にSPはどちらが+方向でどちらが−方向に進むのか、だけど、PUSH時にSP-2、POP時にSP+2される。
Z80アセンブラ入門」の命令表に記載されている。
また、インターネット上のURLで明確に記載されている箇所としては、Z80 Users Manual(http://www.z80.info/zip/z80cpu_um.pdf)のP.53に、PUSH AF は以下と等価だと記載されている。

Decrement SP
LD (SP), A
Decrement SP
LD (SP), F

●SPが&H0001以下を指している時にPUSHするとどうなるか?
これは回答がみつからないが、PCの場合と同様に、単にSP=&H0001の時にPUSHすると&HFFFFに、SP=&H0000の時にPUSHすると&HFFFEになるだけと思われる。
(明確な資料なし。後で判明したら追加する。)


■メモリについて

●もし、メモリが存在しないアドレスをアクセスしてしまった場合にはどうなるのか?
これはまだ回答がみつかっていないけど、おそらく、「どうにもならない」。
もしかすると、メモリ管理ユニットがZ80の割り込みを呼び出して、専用の処理に移行するかもしれないが、Z80自体には、メモリ例外を検知する仕組みはないようなので、完全にZ80の外部の仕組みまかせだと思う。
(「Z80 Users Manual」Figure 3. Z80 I/O Pin Configuration http://www.z80.info/zip/z80cpu_um.pdf参照)
Z80自体は淡淡と処理を続ける、ということだろう。


■ALUについて

●ALUの構成
Z80のALU(Arithmetic Logic Unit)は、加算器、ビットシフター、論理演算器のいずれかで演算を行う。
(「CPU Z80の設計そのI」2.ALU http://www.ne.jp/asahi/yikai/class/schools/verilog/Z80_2.pdf

ちなみに加算器の仕組みは「CPUの作り方」(http://www.amazon.co.jp/CPU%E3%81%AE%E5%89%B5%E3%82%8A%E3%81%8B%E3%81%9F-%E6%B8%A1%E6%B3%A2-%E9%83%81/dp/4839909865/ref=sr_1_1?s=books&ie=UTF8&qid=1362922085&sr=1-1)という本で勉強した。
キャリーは桁上がりを示すフラグになるが、入力にキャリーを含まない場合は半加算器、入力にキャリーを含まないむ場合には全加算器という。
この本によると、加算は実際には1ビットの論理演算を行っているだけだという。
半加算器(キャリーがない場合)を考えると、その入力と出力の対応は以下のようになる。

入力A 入力B 出力キャリー 出力S
0 0 0 0
0 1 0 1
1 0 0 1
1 1 1 0

これに入力のキャリーを付け加えると、1ビットの全加算器になる。
1ビットの全加算器を4つつなげると、4ビットの全加算器になる。
wikipediaZ80の項(http://ja.wikipedia.org/wiki/Z80)によると、Z80のALUの加算器は4ビット加算器だとある。4ビットの加算器を2個つないで8ビット加算器として使っていると思われる。
4ビット加算器だとすると、ハーフキャリーフラグが存在することも納得いく。


●A、B〜L以外のレジスタはALUで処理されるのか?
Z80 CPU architecture http://www.z80.info/z80arki.htm にわかりやすくブロック図が描かれている。
これを見ると、直接バスがつながっているのは、8ビットレジスタだけで、IX、IY、PC、SPは直接バスがつながっていない。
従って、直接ALUでは演算を行わない。
PC、SPについては、INC、DECの回路がある。
IX、IYについては、8ビット数値との加算を行ってアドレスバスに送る回路がある。
だとすると、IX、IY、SPに対する16ビット演算は、TMPレジスタに即値を入れて間接的に計算していると思われる。
(これに関しても具体的な資料はなし)


とりあえず以上。