R800命令を追加する

「R800命令を追加する」の編集履歴(バックアップ)一覧はこちら

R800命令を追加する」(2015/09/09 (水) 01:09:37) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

アセンブラであるsdasz80はZ80/64180の命令はサポートされているがR800はサポート されていないため独自に命令を追加する必要がある。 R800の追加命令をSDCCでサポートする場合はアセンブラsdasz80の コードにバイト命令を埋め込んで使うことになる。 命令を追加する場合は.dbディレクティブを使いアセンブラコードに追加された命令のバイナリビットを埋め込む。 この方法でsdasz80でサポートされていないさまざまなアーキテクチャの8080/Z80互換CPUの追加命令を埋め込むことが可能だ。 拡張命令(inc ixl)を使う例 ld ix,0x0 inc ixl ret アセンブラ未定義命令を埋め込む ld ix,0x0 .db 0xDD ;inc ixl .db 0x2C ret .dwディレクティブなどを使うと一行で書けるのでマクロ定義することで もっと見やすくなるかもしれない。 R800の追加的命令はインデックスレジスタX,Yの8bit単位のアクセスと符号なし掛け算命令。 追加インデクス命令はアドレッシング用で限定的であった機能を汎用的に使えるよう 8bit単位のロードストアと各種演算を定義したもので従来隠し命令として知られていたもの。 掛け算命令は符号なし整数なので使える場面は限られるだろう。8*8->16bit 16*16->32bitのサイズで、レジスタの組み合わせが固定なので注意。 (サポート外のソースレジスタを指定すると計算結果が正しくないらしい) 8080/Z80のC言語では8080の影響で関数パラメータのレジスタ渡しにはA,HLがポインタとして HLが頻繁に使われるのでクロック数が小さくなった分インデクスレジスタを汎用として使うとよい。 (HLレジスタは8080など古くからありコンパイラが対応していることと、コードサイズや 命令機能などもあって汎用レジスタのHLがポインタとして多用されている。X,Yはインデクス と呼ぶがポインタとしてはあまり使われていないためX,Yは汎用的に使う方が良い。 レジスタ名もAF,BC,DE,インデクスIHL,拡張EX,EYと呼ぶほうが現実的だ) 追加命令は無理をして全ての命令を使う必要はなく、時と場所によって 使える場所で使うことが効果的なので追加命令があるからといって劇的な変化はない。 符号なし整数(unsigned byte)の掛け算命令の埋め込み 必要な命令を一つ選択してアセンブラコード中に埋め込む ;multiply unsigned byte ;hl <= a*reg .db 0xED .db 0xC1 ;mulub a,b .db 0xED .db 0xC9 ;mulub a,c .db 0xED .db 0xD1 ;mulub a,d .db 0xED .db 0xD9 ;mulub a,e 符号なし整数(unsigned int)同士の掛け算命令。結果は32bitレジスタ(DE,HL) SDCCのULONGはDE,HLを使うようなので関数では値をレジスタやスタック経由する ;multiply unsigned word ;de:hl <= hl*reg .db 0xED .db 0xC3 ;muluw hl,bc .db 0xED .db 0xF3 ;muluw hl,sp

表示オプション

横に並べて表示:
変化行の前後のみ表示:
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。