「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