現在地

ASに新CPU対応を(その4)


モニタも動いてこれまでに実装済みのMN1610命令に問題無いことがわかり、時間にも余裕が出てきたので、残りのMN1613拡張命令も一気に実装してしまいました。

MN1613で追加された命令にはパースの面倒なアドレッシングなどは無く、命令の数が多いだけの単純作業に近かったですね。

一段落したので現時点のファイル(asl-patch-20191120.tar_.gz)を添付しておきます。

ビルド方法

  1. 本家サイトから AS 1.42 bld150 を取得して展開する。
  2. 展開したディレクトリ(code****.cが並んでいるところ)に移動する。
  3. asl-patch-20191120.tar.gz を展開する。新規ファイルが作成される。
  4. patch < patches で既存ファイルにパッチを当てる。
  5. 通常通りビルドする。
  6. make testでMN1610/1613を含むテストが行なえる。

修正・追加したファイル

  • patches
    以下の既存ファイルに対するパッチ
    • as.c
    • asmpars.c
    • headids.c
    • makedefs.src
  • codemn1610.c
  • codemn1610.h
  • tests/t_mn1610/asflags
  • tests/t_mn1610/inst_mn1610.asm : MN1610命令テスト用ソース
  • tests/t_mn1610/inst_mn1613.asm : MN1613命令テスト用ソース
  • tests/t_mn1610/t_mn1610.asm : テスト用ソース
  • tests/t_mn1610/t_mn1610.doc
  • tests/t_mn1610/t_mn1610.ori : テスト期待値ファイル(バイナリ)

書式について
MN1610については公式な資料が不足しているので書式は以下のように定めています。

  • ニーモニック
    「半導体コレクション展示会場」および「16ビット高速マイクロプロセッサMN1613」を参考にしています。
  • レジスタ名
    「半導体コレクション展示会場」を参考にしています。
  • アドレッシング
    入手できたソースコードから推定しています。
    「半導体コレクション展示会場」の (IC) + d, (X1) + [D]などは入手したソースコードと食い違っており、実効論理アドレスの計算式であってアセンブリ言語で記述するときの書式ではないと考えています。
    MN1613の間接レジスタについては参考になるソースコードが見つかりません。「半導体コレクション展示会場」の(Ri), -(Ri), (Ri)+ をそのまま採用しました。
    アドレッシング指定として単に と書いた場合、0 ≤ 式 ≤ 255 の範囲のときはゼロページ直接とみなし、それ以外のときはIC相対直接とみなします。もちろんIC相対直接で届かないときはエラーになります。(式) と書いた場合も同様にゼロページ間接あるいはIC相対間接とみなします。
    現状パースが不完全なので式を (LABEL+8)*(SIZE+1) のように両端が括弧になるよう書くと間接と誤認されエラーになるのでこのような書き方は避けてください。
  • 16進定数
    上と同様にソースコードから推定しています。
  • 擬似命令
    基本 AS の標準をそのまま採用しています。
    DCがソースコードに使用されていましたので、モトローラ式のDC, DSを採用しました。

具体的な書き方については asl-patch-20191120.tar.gz に含まれるテスト用ソースを参考にしてください。

今後...
以下の点について改善の余地があります。

  1. MN1610命令のアドレッシングに関し、上記のように括弧の使い方によっては誤認してエラーになる場合がある問題を修正する。
  2. DCで8ビット定数をパックする機能を追加する。
  3. DCでMN1613の浮動小数点数を扱う機能を追加する。
  4. I/Oセグメントを区別する。

2019年11月23日 追記:
IsIndirect()という便利な関数がありました。文字列を渡すと先頭と末尾の括弧が対応しているか判別してくれるというもので、「(A+B)」のようなものはTrueを「(A)+(B)」のようなものはFalseを返します。
これでDecodeAdr()を全面的に書き換えて1.は修正できました。
コメントに書いたように4.も対応済みです。

また最新のソースコードはhttps://electrelic.com/asl-patch/に置いています。

添付ファイル: 
参考文献・関連図書: 
廉田浩ほか(1983)「16ビット高速マイクロプロセッサMN1613」『National Technical Report』1983年4月号.
LKIT-16組立マニュアル, パナファコム.
LKIT-16テレビ・インターフェース組立・使用説明書

コメント

現行版を https://osdn.net/projects/software-for-losttechnology/releases/71967 に置きました。
AS 1.42 bld150 を展開したディレクトリ中で patch -p1 < 展開した diff とすれば通常通りビルドできるはずです。

(1) 書式は 「半導体コレクション展示会場」 のとおりです。なんとなれば、手元に既存の MN1613 のアセンブラソースコードはないから。asano 版の
書式も見ましたが、式のパースがこれだとしんどい。
(2) 数値表現は C に合わせました。インライン組み込みのときに数値書式を変えたくない。このため、疑似命令の書式を合わせる気もないです。
(3) 疑似命令は TI のものを流用しました。 string 疑似命令をつかうと8ビット定数が普通にパックされます。浮動小数点も一応いじった。
(4) セグメントベースってこのアセンブラで何に使っています? まだこのあたりは把握できていません。

純正の書式を可能な限り受け入れつつ、便利な機能も必要に応じて追加するというのが私の方針です。オリジナルの asl もそんな雰囲気が感じられます。

(1) 最初は "[", "]" と "(", ")" を併用した書式で作り始めたのですが、やはり最近MN1613を入手された方からサンプルソースを見せられて方針転換しました。確かに式のパースは厄介で、今のコードには不満足です。パーサは他CPUでも必要なはずなので探せばどこかにあるのではないかと思っていますが...

(2) C等へインラインで埋め込むならそうですね。あるいはRELAXED擬似命令を使う手も。

(3) 最初68Kを流用しようとしましたがワードアドレスに未対応で、結局AVRのものを参考に書きました。
8ビットのパックは純正もできないようなので無くても良いのですが、あまりに不便なので文字列だけ実装しました。
浮動小数点は純正の書き方が不明なので未着手です。

(4) 「セグメントベース」とは SegCode, SegIO,... の意味ですか、それとも CSBR, SSBR,... の意味ですか?

前者のSegCode, SegIO,...の場合ですと、ラベルが属するセグメントと参照箇所が矛盾するときに警告が出ます。対応したので https://electrelic.com/temp/segment.lst にサンプル置いてみました。

後者のCSBR, SSBR, TSR0, TSR1の意味ですと、現状は何もしていません。単なる独立したレジスタの扱いです。

こんにちは
公式資料と呼べるもので持っているのは8ページほどのデータシートのみです。あとはWWW上の情報や当時の雑誌記事などを探して何とか動かせたという状況です。

連絡先は以前のメールアドレスでよろしいですか?

コメントを追加

Plain text

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