S−OS講座「Z80で計算する〜ん」  前回は,Z80CPUのメモリ,アキュームレータ(Aレジスタ),そしてS−OS のサブルーチンについて学びました.忘れてしまった人は,もう一度「Vol.1」を 読み返してください. さて,今回はZ80の演算命令について解説します.まずは,足し算から. ラベル ニモニック コメント --------+-------+---------------+----------------------- ORG 8000H ; 8000H より 始めよ START: LD A,12 ; Aレジスタ←12 ADD A,34 ; Aレジに34を足す LD (8010H),A ; (8010H)←Aレジスタ RET ; 終わり(モニタへ戻る) Z80では,足し算にはADD命令を使います.BASICなどと違うのは,足し算 の仕方が「A=A+○」となっていることです.このようにAレジスタに足し込んで計 算するので,Aレジスタのことを累算器(アキュームレータ)ということがあります. さて,上記のプログラムを実行しましょう.ダンプしてみると,8010H番地に, 計算結果が残っています. A>J8000 A>D8000 :8000 3E 0C C6 22 32 10 80 C9 .. .. ... :8010 2E .. .. .. .. .. .. .. .. .. ... 10進数の12は,16進数では0CH,同じく34は22Hです.計算結果は2EH で,10進数に直すと46ですから合っています. つぎに数値を代えて実行してみましょう.次のようにダンプリストを変更し<CR> キーを押してください.それからJ8000です. :8000 3E 41 C6 BF A>J8000 A>D8010 :8010 00 .. .. ... 41H=65,BFH=191.65+191は256です.あれ,8010Hの中身 は00Hになっていますね.そうです,8ビットでは00〜255までの数値しか表現 することはできません.したがって41H+BFH=100Hですが,CPUはとりあ えず,結果のうちの下8ビット,すなわち00Hを8010H番地に入れてくれている のです. それでは,あふれてしまった「1」はどこへ行ってしまったのでしょうか? 実は, それはCPUの中に残っています.それが「キャリー・フラグ」です.キャリーとは桁 上がり,フラグとは旗のことですから,分かりやすく言えば,「桁上がりの目印」とい うことになります.以後は省略して,「Cフラグ」ということにします. Cフラグには1ビットの入れ物ですから,0か1しか入れることはできません.しか し8ビットの最大数の和は,FFH(255)+FFH=1FEH(510)ですから  ̄ 1ビットで事足りるわけです. さて,このCフラグを利用して,2バイト(16進数4桁)の足し算をやってみまし ょう.そのためには,まず下位1バイトの計算をADD命令で行ない,その後上位1バ イトの和にCフラグの1ビットを加える,ADC命令を実行します.これにより,Z8 0で,0〜65535までの計算ができるようになります.  次のプログラムは1234H+5678Hの結果を8010H番地(下位)と801 1H番地(上位)に格納するものです. ラベル ニモニック コメント --------+-------+---------------+----------------------- ORG 8000H ; 8000Hから始めよ LD A,34H ; Aレジに34Hを入れる ADD A,78H ;  〃  78Hを加える LD (8010H),A ; 結果を8010H番地に格納 LD A,12H ; Aレジに12Hを入れる ADC A,56H ;  〃  56H+Cフラグを加える LD (8011H),A ; 結果を8011H番地に格納 RET ; 終わり  アセンブル後,8000H番地から実行し,ダンプしてみると,答えの68ACHが 格納されていることがわかります. A>J8000 A>D8000 :8000 3E 34 C6 78 32 10 80 3E :8008 12 CE 56 32 11 80 C9 .. :8010 AC 68 .. .. ... 最後に,引き算の命令について述べておきます.Aレジスタから値を引く命令は SUB 値 です.「SUB A,値」でないことに注意してください(何故そうなのかは後々出て きます).ADD命令の時と同様に,引き過ぎで桁借り(ボローという)が生じたとき は,Cフラグがセットされます.引き算と同時にCフラグも一緒に引くのが, SBC A,値 (「SBC 値」ではない) 命令で,ADC命令と対応しています. −−−−−−−−−−−−−−−−−−  次回は,Z80のAレジスタ以外のレジスタと,「アドレッシング・モード」,それ からジャンプ命令について述べたいと思います. このコーナーに関する質問・要望等は,同封はがきかまたは「S−OSネット大阪」 のSOS001まで. (EOF)