2009年11月03日

as-z80 を使ってアセンブルする前に

SDCC で Z80 のアセンブルを行うのは、as-z80 というファイルです。

この as-z80、当時のアセンブラなどとは少々記述方法などが異なりますので、そのあたりをメモです。

  • Z80 マシン語命令の記述はほぼいっしょですが、インデックスレジスタによる参照が
        LD      A,(IX+1)
    と、いままでしていたところを
        LD      A,1(IX)
    というように記述します。
  • レジスタへ代入する直値の記述は、頭に # をつけます。
        LD      A,#16
        LD      A,#0x10
        LD      A,#0b00010000
    上から 10 進、16 進、2 進で 16 を A レジスタに代入する記述です。
    アドレスのレジスタへの代入も
        LD      HL,#address
    と、# を頭につけます。
    また、
        LD      A,#'A
    と、' に続けて文字を書くと、その文字コードが直値となります。
    (#'A なので A の文字コード 0x41 が A レジスタに代入されます)
  • 逆に直接アドレスを参照するような場合は、# をつけません。
        LD      A,(address)
  • 擬似命令はおおまか、頭に . をつけます。
        .ORG    0x0100
        .DB      0x10
        .DW      0x03FF
        .DS      16
        .ASCII  "Hello, World.$"
  • 定数マクロなどの宣言は = で行います。
    CHGMOD      =   0x005F
  • 外部アドレスの参照宣言は、.global ではなく .globl です。
    a がありません。
  • 0$ ~ 255$ といった、数字を使った局所的なラベルの定義ができます。
        XOR     A
        LD      B,#10
    1$:
        INC     A
        DJNZ   1$
    同一のソースファイル内に同じラベルを複数宣言できますが、同時に参照できてしまう(距離が近いなどの)場合などはコンパイルエラーになるので注意です。

また、アセンブラオンリーならばあまり必要ないのですが、一応 SDCC という C 言語開発環境を利用するので、そのあたりについてのいくつかの知識も得ておきます。

  • C で書いた関数はアセンブラから見るとすべて、頭に _ がつきます。
    main() は _main で参照できます。
  • C で書いた関数の引数は、すべてスタックにつまれます。
  • C で書いた関数の返り値は、1 バイトなら L レジスタ、
    2 バイトなら HL レジスタ、4 バイトなら DEHL レジスタで渡されます。
  • プログラムはいくつかの領域にわかれて管理され、
    いまいる場所がどの領域かは、.area 命令で定義します。
    おおまか、プログラムは _CODE 領域、変数は _DATA 領域、
    と覚えておけばよいかと思います。

あとは一般的な Z80 のアセンブラ開発の知識でよいはずです。



cobinee at 09:00コメント(0)トラックバック(0)MSX  

トラックバックURL

コメントする

名前
 
  絵文字
 
 

れとろげ。
記事検索
プロフィール

こびにぃ

QRコード
QRコード
  • ライブドアブログ