現在地

ASに新CPU対応を(続編)


ちょうど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つの方式を思いついているのですが...

  1. 64kWに分割
    64kWのメモリ空間が複数あるモデル。ASは例えば8051のプログラム空間とデータ空間のように複数の空間を管理できるのですが、任意の個数持てるようにはできていません。ちなみに8086はこっちの方式のようです。
  2. 単一のリニアな空間
    メモリ全体を一つの空間としておき、必要に応じてセグメント・オフセットを計算する方法。ただ一つのアドレスに対してセグメントとオフセットの組み合わせは一つに定まらないのでこれをどう解決するのかが問題。

純正アセンブラはどうしているのか、どこかにマニュアルか何か無いかなぁ。
ASで同じことができるかはわかりませんが。

セグメント対応はまだまだかかりそうなのでasl-1.42bld212に対する浮動小数点とPACKINGに対応するパッチを置いておきます。


コメントを追加

Plain text

  • HTMLタグは利用できません。
  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。
  • 行と段落は自動的に折り返されます。
※ コメントは原則公開です。個別のご相談などは「ご意見・ご要望」からお願いします。