標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第93回]

●SPHL命令

SPHLはSP(スタックポインタ)にHLレジスタの値を転送する命令です。
OPコードは”F9”です。
SP(スタックポインタ)に値を設定する命令には、LXI SPがありました。
LXI SP命令は[第65回]で説明しました。

LXI SPはプログラム作成時に決めた定数をSP(スタックポインタ)に書き込みますから、プログラムを実行中に、任意の値をSP(スタックポインタ)に書き込むことはできません。
つまりスタックはあらかじめ決められたメモリアドレスに置かれます(これが一般的です)。

しかし高度なテクニックとしてスタックを任意のメモリアドレスに置いたり、SP(スタックポインタ)の現在の位置を自由に変更させるという使い方をする場合があります。
SPHLは汎用レジスタであるHLの値をそのままSP(スタックポインタ)に送ることができますから、そのような高度なテクニックのために利用することができます。
まあ、しかし、普通のプログラムではまず使うことはないと思います。
そういう意味では、無くても普通は困らない命令なのですが、簡単な回路で実現できてしまいますから、ここで説明することにいたします。

●PCHL命令

SPHL命令と良く似た命令にPCHLがあります。回路もほとんど同じなので、PCHL命令と一緒に説明をします。
PCHLはPC(プログラムカウンタ)にHLレジスタの値を送る命令です。
OPコードは”E9”です。
PC(プログラムカウンタ)はプログラムの実行順序をコントロールしているカウンタですから、その値をプログラムで変更することは普通はできません。
そんなことをすると、いきなりCPUが暴走してしまいます。

では、なぜそんな危険な命令があるのか?という疑問が出てきます。
じつは、その答えは、Z80ニーモニックを見れば、なるほど、と納得できます。
PCHLはZ80ニーモニックでは、次のように書きます。

JP (HL)

そうです。PCHLはレジスタMOV命令のように考えてしまいますが、実はJMP命令なのです。
確かにレジスタMOV命令ではあります。HLレジスタの値をPC(プログラムカウンタ)に入れるのですから。

しかしその結果はどうなるか、というと、ただ値をMOVしただけでは済まなくて、その結果PC(プログラムカウンタ)の値が書きかえられてしまうのですから、その次にCPUが実行する命令は、HLレジスタで示されたメモリアドレスにある命令、ということになってしまいます。
PCHLはHLレジスタの値で示すメモリアドレスにジャンプする、間接アドレスジャンプ命令なのです。
レジスタの働きについて、基本的なことが理解できていれば、PCHL命令はMOV命令ではなくて、間接ジャンプ命令なのだ、ということが納得できるはずですけれど、そうはいっても、やっぱり、これはZ80ニーモニックに文句無しに軍配をあげたいところです。

ちなみに、Z80ニーモニックのマニュアル(本家Zilog社のものではなくて、シャープのものなのですが)では、SPHLは、
LD SP,HL
というニーモニックで「16ビットデータ転送命令」として分類されていますが、PCHLは
JP (HL)
のニーモニックで、「JMP命令」に分類されています。

すると、8080のマニュアルではどのように扱われているのか、調べてみたくなりました。
8080のデータシートは[第77回]で紹介しました。
さっそく調べてみると、
PCHLはちゃんと”Branch Group”に分類されていました。
では、SPHLは?
”Stack Group”に有りました。なるほどね。

●SPHL命令とPCHL命令のタイミングチャートです



レジスタLからSPLへ(またはPCLへ)、レジスタHからSPHへ(またはPCHへ)、値を送っているだけですから、動作としては「MOV」命令と変わりません。

s3−s0、d3−d0とレジスタの関係については、「レジスタコード表」([第27回])を参照してください。

●SPHL命令とPCHL命令の回路図です


これだけ?
これだけ、です。
MVreg16([第66回]STAX、LDAXの回路図の中にあります)で全部片付いてしまいます。

2008.10.11upload

前へ
次へ
ホームページトップへ戻る