アンティーク・アセンブラ~Antique Assembler
号外 4ビットマイコンでアセンブラプログラミング
これまで 32ビット Intel x86 アーキテクチャのサンプルを元に,アセンブラプログラミングについて説明してきた本連載ですが,今回は少々趣向を変えて,4ビットマイコンという制約の中で,プログラミングに工夫を凝らしてみようと思います。
FXマイコンとは?
学研から発売されていた電子ブロックという製品をご存知でしょうか?
この電子ブロックのラインナップの中に,4ビットマイコンユニットがパッケージされているFXシリーズと呼ばれるものがあり,80ワード(1ワード=4ビット ※1)分のプログラムを組むことができます(http://www.wizforest.com/OldGood/MiCom/にも詳しく書かれています)。
今回はこのFXシリーズの4ビットマイコン(以下「FXマイコン」)を稼動環境として使ってみようと思うのですが,当時のものを完動品で入手するのは勿論困難ですし,「4ビットマイコンのプログラミングとはどんなものだろう?」ぐらいの軽い気持ちであれば,復刻版であったとしても現物を入手するのは少々大げさすぎます。
しかし,ありがたいことに,FXマイコンのシミュレータソフトを公開されている方がいらっしゃいました。
また,学研の『大人の科学マガジン』から,FXマイコンと同等機能のワンボードマイコンが付録として付属する4ビットマイコン特集号(Vol.24)が2009年6月30日 付けで刊行されていますので,こちらを入手されても良いでしょう。
シミュレータソフトを使用した場合:
- 持ち運びの手間がない
- プログラム保存/呼び出しが可能
- 実行中のレジスタ/メモリ内容を確認可能
といった利便性が得られますが,『大人の科学マガジン』の付録マイコンも,TK-80に通じる剥き身のフォルムにノスタルジックな魅力があって,なかなか捨て難いものがあります。
- ※1)
- 4ビット単位のデータを「ニブル」(nible)とも呼びますが,FX マイコンの扱う「基本単位」ということで,本稿では「ワード」(word)という呼称を使用します。
FX マイコン向けアセンブラ
4ビットという非常に制約の厳しいアーキテクチャですので,FXマイコンの命令体系は非常に独特です。
文献やウェブ上の紹介記事等では,この独特な体系の命令をそのまま使用していますが,個人的な印象としては,あまりにも命令体系/名前が独特すぎて,ロジックを考えるよりも,命令表をいちいち調べる方に労力が割かれるように思われます。
そこで,本連載で採用している AT&T ニーモニックっぽい記述のソースから,FXマイコン用のマシン語コードを生成するアセンブラ(※2)を用意しました。
以下の方法で,ツール一式をダウンロードしてください。
- 上記URLのページを表示
- ページ中から“Download”タブを選択
- “Tags & snapshots”の“tip”(※3)から,アーカイブファイルの形式(zip/gz/bz2)を選択してクリック
- ブラウザの指示に従い,ファイルに保存
- ダウンロードしたアーカイブを展開
なお,上記のFXマイコン用アセンブラはPythonで実装されているため,実行にはPython処理系が必要ですからご注意ください。
アーカイブ展開先に格納されているgmc4as.pyがアセンブラを実装しているPythonソースです。アセンブルしたいプログラムがsource.sに記述されている場合,以下の要領で実行してください。
図1 FXマイコン用アセンブラの実行
$ python gmc4as.py source.s
00 A | TIY | 1| movw $0x0E, %y
01 E | E | |
02 5 | MA | 2| movw (%y), %a
03 3 | CY | 3| swap
| | | | |
| | | | +---- オリジナルソースの内容
| | | +-------- オリジナルソースでの行番号
| | +--------------- 固有ニーモニックでの表記
| +--------------------- 16進プログラムデータ
+----------------------- 16進アドレス
ソースコード中に文法上の問題がなければ,上記のような形式でアセンブル結果が表示されますので,「16進アドレス」に対応する「16進プログラムデータ」を FXマイコンに入力してください。
gmc4as.pyが解釈可能なニーモニック等に関しては,アーカイブ中に含まれるドキュメントを参照してください。以下の記述では文法やニーモニックに関しては特に触れません。
ちなみに「FXマイコン独特の命令体系の方が良い」という方は,FXマイコン固有ニーモニックを用いるアセンブラを公開されている方がいますので,こちらを使用するのが良いでしょう(ただし,ネットワーク経由での使用が前提です)。
- ※2)
- 厳密にはバイナリを生成するわけではないので,「リスティングツール」という名称の方が正しいのかも知れませんが…。
- ※3)
- “tip”は「最新版」の意味を持っています。
実装対象の仕様決め
今回は FX マイコンを使用して,第3回でも取り上げた多倍長演算処理を実装してみようと思います。
FXマイコン添付のサンプルプログラムや,『大人の科学マガジン』のマイコン特集号に掲載されているサンプルに比べると,なんだか地味な感じがするかもしれませんが,限られた資源/機能を如何に遣り繰りするか,というアセンブラの醍醐味に溢れる題材と言えます。
とりあえず,演算は「加算」限定で,ソース(source)データをデスティネーション(destination)データに加算した結果を,デスティネーション領域に上書きする処理を,7ワード分の多倍長データに対して行う仕様とします。多倍長データはそれぞれ:
- デスティネーションデータ領域: 0x50 ~ 0x56
- ソースデータ領域: 0x57 ~ 0x5D
上記の各7ワードの領域に,MSB First(上位桁をアドレス低位に配置)で行うものとします。
なお,デスティネーション領域は加算結果によって上書きされますので,処理そのものは不可逆なものとなります。


