8080/Z80 リロケータブルコードの実験 [Z80]
Z80は8080には無かった相対ジャンプ命令が追加されましたが、6809と違い相対コールができません。なのでOS9のようなポジションインディペンデントコード(PIC)なモジュールが書きづらいです。
昔から議論されていることではありますが、PICは面白いのか?wちょっと考えてみました。
PICなコール(相対コール)をソフトで実現するためにはプログラムカウンタ(PC)の値を参照する必要があります。
Z80の命令セット上、コール時のスタックからPCの値を拾えます(それ以外にPCの値を参照する方法はないと思う)
PCの値さえ参照できれば相対値をコール時のコードに埋め込めば相対コールが実現できます。下記が相対コールのコード例です。'+'が付いている行はマクロ展開で生成された命令です。
Z80 relocatable call
机上検討段階でほとんど動作検証ができてしまっているようなものですが実機での確認結果が下記です。ZSIDDはZSIDに小文字シンボル対応と1行ダンプ表示のパッチを適用したものです。
参照)
3チップ構成Pic24CPMマイコン(その4)ZSIDで小文字のシンボルを使う方法その2
下記のダンプ表示のようにZSIDがRST 38Hを使っているので上のソースから生成したHEXファイルをZSIDではロードできないためSコマンドで手入力しています。
relocatable call code test
想定通り動作することが実機で確認できました(すぐに動かせるCP/Mマシンがあると便利ですね^^)。
DEとHLレジスタを破壊してしまうし、コール命令が4バイトになってしまいますが、リロケータブルなコールが実現できます(必要な場面があまり思い浮かびませんがw)
また、上記の例ではRST命令を使っていますが、固定番地へのコール命令でも同様なことが可能です(この場合rcallは6バイト長になるけど)
★追記 2022/12/10
「8080/Z80 リロケータブルコードの実験(その2)」の記事に DE/HL レジスタ非破壊のリロケータブルコールについて書きました。
下記の [ 次へ ] からも飛べます。
[TOP] [ 前へ ] 連載記事 [ 次へ ]
昔から議論されていることではありますが、PICは面白いのか?wちょっと考えてみました。
PICなコール(相対コール)をソフトで実現するためにはプログラムカウンタ(PC)の値を参照する必要があります。
Z80の命令セット上、コール時のスタックからPCの値を拾えます(それ以外にPCの値を参照する方法はないと思う)
PCの値さえ参照できれば相対値をコール時のコードに埋め込めば相対コールが実現できます。下記が相対コールのコード例です。'+'が付いている行はマクロ展開で生成された命令です。
|
机上検討段階でほとんど動作検証ができてしまっているようなものですが実機での確認結果が下記です。ZSIDDはZSIDに小文字シンボル対応と1行ダンプ表示のパッチを適用したものです。
参照)
3チップ構成Pic24CPMマイコン(その4)ZSIDで小文字のシンボルを使う方法その2
下記のダンプ表示のようにZSIDがRST 38Hを使っているので上のソースから生成したHEXファイルをZSIDではロードできないためSコマンドで手入力しています。
|
想定通り動作することが実機で確認できました(すぐに動かせるCP/Mマシンがあると便利ですね^^)。
DEとHLレジスタを破壊してしまうし、コール命令が4バイトになってしまいますが、リロケータブルなコールが実現できます(必要な場面があまり思い浮かびませんがw)
また、上記の例ではRST命令を使っていますが、固定番地へのコール命令でも同様なことが可能です(この場合rcallは6バイト長になるけど)
★追記 2022/12/10
「8080/Z80 リロケータブルコードの実験(その2)」の記事に DE/HL レジスタ非破壊のリロケータブルコールについて書きました。
下記の [ 次へ ] からも飛べます。
[TOP] [ 前へ ] 連載記事 [ 次へ ]