2021-11-21 21:36 — asano
カテゴリー:
ちょうど2年前にASのMN1613対応を行ないましたが、セグメント関係と浮動小数点関係が積み残しになっていました。
今MN1613が話題になっていることでもあり対応方法を考えていたのですが...
先日のUniversal Monitorの拡張を行なう中で他にも機能不足を感じる点が出てきました。
29/ 80F : 5374 7269 6E67 DC "String",CR,LF,0
812 : 000D 000A 0000
これは意図した結果ではありません。STROUT
ルーチンはバイト単位で取り出して処理するのでこのように途中に"00"が入るとそこで終了してしまいます。
31/ 815 : 5374 7269 6E67 DC "String\r\n\0"
818 : 0D0A 0000
これまではこのように書いて回避してきたのですがやはり不便です。AVRと同様にPACKING ON
が欲しいところです。
どう修正しようかソースを調べていたらさらにCHARSET
指定が無視される、長い文字列使用時などにメモリオーバランの可能性があるなどの問題も出てきました。
まずDC
擬似命令周りはAVR版と比較することで解決できそうです。そもそもAVRを参考にして書いたものなのですが、当時よくわからなかった部分を省略してしまったようです。
浮動小数点が積み残しになっていた理由は純正アセンブラでの書式が良くわからなかったことと、形式が特殊で変換が大変そうだったことでした。
書式については2年たっても新たな情報が見つからないので諦めることにしました。よく考えたらDC
擬似命令のパラメータが整数だったら16ビット整数として・小数だったら32ビット浮動小数点数として扱えばすむことです。将来公式の書式が判明したら追加するつもりです。
形式も特殊だと思っていたら汎用機の世界では見られる形式のようで、ASの最新版には変換ルーチンが存在します。
ここまでは比較的簡単に進んだのですが、セグメントに関しては正直頭を抱えたままの状況です。2つの方式を思いついているのですが...
- 64kWに分割
64kWのメモリ空間が複数あるモデル。ASは例えば8051のプログラム空間とデータ空間のように複数の空間を管理できるのですが、任意の個数持てるようにはできていません。ちなみに8086はこっちの方式のようです。 - 単一のリニアな空間
メモリ全体を一つの空間としておき、必要に応じてセグメント・オフセットを計算する方法。ただ一つのアドレスに対してセグメントとオフセットの組み合わせは一つに定まらないのでこれをどう解決するのかが問題。
純正アセンブラはどうしているのか、どこかにマニュアルか何か無いかなぁ。
ASで同じことができるかはわかりませんが。
セグメント対応はまだまだかかりそうなのでasl-1.42bld212に対する浮動小数点とPACKINGに対応するパッチを置いておきます。
コメントを追加