見出し画像

伝説の8ビットCPU「Z80」のアセンブラ(ザイログ・ニーモニック)の魅力をまとめてみる

さて、Z80の紹介としては以下の記事でひと通りお話しできたと思います。

【レトロPC】ついに50周年!伝説の8ビットCPU「Z80」の魅力をいま改めて紐解く

今回は、そのアセンブラ(ザイログ・ニーモニック)について詳しくまとめてみます。

「Z80は8080の上位互換だから、アセンブラもそのままイケるのでは?」と思われるかもしれませんが、実はそんなことはありません。大部分の「8080と同じ命令」については同じように書きたいところですが、残念ながらザイログ社は独自のニーモニックを用意したのです。

ハンドアセンブル - 8080の場合 ※8080のハンドアセンブルについては、こちらの記事もどうぞ

ザイログ・ニーモニック最大の特徴:徹底的な規則化とシンプル化

ザイログ・ニーモニック(Zilog Mnemonic)は、ザイログ社がZ80 CPUのために定めたアセンブリ言語の命令表記法(記述ルール)です。インテル8080のニーモニックが「処理ごとに異なる単語」を使っていたのに対し、ザイログは「データ転送はすべてLDに統一する」など、徹底的な規則化とシンプル化を図ったのが最大の特徴です。

具体的に整理してみましょう。ザイログ表記の基本ルールである「左が変更される側(移動先/対象)」「右が参照される側(移動元)」を意識すると、非常にすっきりと理解できます。

「LD」命令への統一(直感的で分かりやすい)

インテル8080では、データの移動元と移動先(レジスタ、メモリ、即値)によって、全く異なる単語(命令語)を使い分ける必要がありました。ザイログはこれをLD 移動先, 移動元という1つの形式に統一しました。

「かっこ ( )」の意味:ザイログでは、数値やレジスタを ( ) で囲むと「そのアドレスの中身(メモリポインタ)」を意味します。これにより、一目でメモリへのアクセスだと分かるようになっています(他のCPU経験者だとここが大事)。

算術・論理演算の主語(アキュムレータ)の省略

8080の演算命令は、計算結果が必ずAレジスタ(アキュムレータ)に入ることを前提として、Aの記述を省略していました。ザイログも基本はこの思想を踏襲していますが、より英語として自然でスッキリした表記になっています。

  • 加算(足し算)

    • Intel 8080: ADD B (AにBを足してAに格納)

    • Zilog: ADD A, B (明示的に「AにBを足す」と書く)

  • 引数つき加算(キャリー付き足し算)

    • Intel 8080: ADC B

    • Zilog: ADC A, B

  • 1を足す(インクリメント)

    • Intel 8080: INR B

    • Zilog: INC B (単語が直感的になった)

フラグ変化や条件分岐の規則化

条件付きジャンプ(もし〜ならジャンプする)などの表記も、ザイログはルールを統一して覚えやすくしました。

  • ゼロフラグ(結果がゼロか否か)によるジャンプ

    • Intel 8080: JZ(ゼロなら), JNZ(ゼロでないなら)

    • Zilog: JP Z, アドレス, JP NZ, アドレス (JP に条件を添える形式に統一)

  • キャリーフラグ(桁あふれ)によるジャンプ

    • Intel 8080: JC, JNC

    • Zilog: JP C, アドレス, JP NC, アドレス

Z80固有の強力な拡張命令の表記

Z80で追加された強力な機能も、ザイログ・ニーモニックなら非常にシンプルに表現できます。

  • 裏レジスタとの一括入れ替え

    • EX AF, AF' (AFレジスタを表裏で交換)

    • EXX (BC, DE, HLレジスタを一括で表裏交換)

  • ビット操作

    • SET 5, A (Aレジスタのビット5を「1」にする)

    • BIT 0, (HL) (HLが指すメモリのビット0が「0」か「1」かテストする)

  • ブロック転送

    • LDIR (Load, Increment, Repeat:HLからDEへ、BCで指定したバイト数分を自動で連続コピーする)

人間ファーストでデザインされた優れた設計

インテルの8080ニーモニックは「CPUの内部回路(ハードウェア)の都合」で命令名が決まっていました。それに対してザイログ・ニーモニックは、「人間(プログラマー)の読みやすさ・書きやすさ」を最優先してデザインされています。

この「覚えやすく、間違いにくい」優れたニーモニックの設計思想は、その後の多くのCPU(シャープの独自CPUや、ゲーム機のカスタムチップなど)のアセンブリ言語の模範となりました。

Z80命令の分類(クイックリファレンス)

ザイログ・ニーモニックで記述されるZ80の命令は、主に以下のように分類されます。

データ転送命令 (LD, EX など)
算術演算命令 (ADD, SUB, INC, DEC など)
論理演算・比較命令 (AND, OR, CP など)
ビット操作命令 (BIT, SET, RES)
プログラム制御命令 (JP, JR, CALL, RET など)

補足:条件の表し方(フラグ指定)
JP, JR, CALL, RET の後ろにつける条件(ステータス)の一覧です。

  • Z (Zero) :計算結果が0のとき

  • NZ (Not Zero) :計算結果が0ではないとき

  • C (Carry) :繰り上がり・繰り下がりがあったとき

  • NC (Not Carry) :繰り上がり・繰り下がりがないとき

ブロック転送・検索命令 (LDIR, CPIR など) ※Z80固有
I/O(入出力)・CPU制御命令 (IN, OUT, NOP など)

ローテート・シフト命令 (RLCA, SRL など)

ビットを左右にずらす命令です。掛け算・割り算の代わりや、グラフィック処理で多用されます。

  • RLCA / RRCA:Aレジスタのビットを左 / 右に循環(ローテート)させる。

  • SLA / SRL:レジスタのビットを左 / 右にずらし、空いた場所に0を入れる(シフト)。

直感的な表記と、引き換えにした「罠」

個人的には、このようなザイログ表記の方が(他のCPUのアセンブラを扱っている身としては)直感的でわかりやすく、こちらを使うことが殆どでした。

ただ、アセンブラとして考えた場合、特にハンドアセンブルする際には「ニーモニックを見ただけでOPコード(機械語の数値)がいくつなのか」というのが、少しだけわかりにくくなったかもしれません。Z80は8080と比べても多くの命令を追加したために、一部の命令に対しては「プレフィックス(接頭辞)」と呼ばれるバイトを追加して命令を区別しています。このため、命令によっては4バイト必要になるケースも出てくるのです。

……ということで、それぞれのニーモニックがどんな値のバイト列に変換されるのかという「ハンドアセンブルの実践」については、次回のお楽しみとしましょう。

NotebookLMによるインフォグラフィック

NotebookLMによるスライド資料

NotebookLMによるまとめ記事

ショート動画

NotebookLMによる解説動画

NotebookLMによる音声解説

ヘッダ画像はザイログ表記のわかりやすさを示すように Gemini に描いてもらいました。

#Z80 #アセンブラ #アセンブリ言語 #CPU #プログラミング #レトロPC #マイコン #機械語 #技術記事

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

kzn 頂いたチップは記事を書くための資料を揃えるために使わせていただきます!