FORTHをZYNQで(どこまでできるやら)
タイトルにあることを始めようと思ったきっかけの話ですけど、私は社会人の最初の仕事はアセンブラでのMS-DOSパソコン(その当時の主流はラップトップパソコンで、私はデスクトップパソコンのIBM互換機グループに配属されました)のファームウェア課のディスプレイBIOS開発でした。そのころはIBM互換機が売れ出したころで、まだ漢字を扱えるIBM互換機がないから日本語版MS-DOSのIBM互換機を出そうとしていました。ディスプレイBIOSを漢字が表示できるように仕様変更を行うには、当時はアセンブラ(機械語)での開発しかありませんでした。CPUを直接機械語で動かすのは誤ったコーディングをしてもそれを発見するのが難しく、デバッグに要する時間もかなり必要で、よく「1KBの開発には1人月必要」と言われていました。新人の私が初めての経験では必死になってコーディングした後には、デスクトップパソコン本体のテスト部門から返ってきたクレームの嵐に、修正にコーディングの2、3倍ぐらいの時間をかけながら、深夜までコツコツとやってた記憶があります。それも、だれも手伝う人がいないので、周りの人に聞きまわっては一人で考える日々でした。
あれがあったから、その後転々と担当する仕事を変えながらも、30年以上パソコン屋としての経験を詰めたんでしょうけどね。
でも、今はそんな昔と状況は違い、もっと安全で効率のいいプログラミング言語が開発され、アセンブラはコーディングしたとしても、普通の人はそれを動作させることができない環境になっていると思います。無理やりねじ込めばできるんでしょうけど、そんなコードは危険で、作っても楽しくないでしょう。ただ、CPUコアの開発会社によって命令セットが全く違いますが、すべてのプログラミング言語はコンパイル/リンクされた最後はアセンブラに落とされます。アセンブラをかじっていると、案外プログラムの変な挙動も、別のプログラミング言語に移行して開発をするときも理解しやすいでしょう。初心者は無理としても、入門者には(開発するシステムのCPUコアの命令全部じゃなくて、MOVでの様々な転送モードや、割り込みや例外処理での異常処理の部分とかだけでもと思うのですが)教えてあげたほうがいいと感じています。
実はアセンブラも最初の5年間ほどやった後はいろいろ違う仕事をしていたので、雑誌やネットで記事を探して調べたりはするのですが、RUBYやCとかでまとまったコーディングはできずじまいでした。いまだに、何かあったときはコンパイルやリンクなんかしないで、直接メモリの16進数を読んではパッチを当てて書き込んでしまうコーデの修正を思い浮かべてしまいます。山のように出力したダンプリストに見つけたJMPやCALL命令に赤ペンで印をつけて次のとび先を探して、バグの追っかけっこしてました。そんなわけで、どうせ今からやるなら、安全にコア部分をいじってみたいと思って、FPGAやSoCで遊んでみようと思いました。できれば、学生時代にアメリカの天文台のマシンで本格的に生まれた、当時の限られたメモリをうまく使って、単純化した(と私は感じたけど)FORTHをハードウェア記述言語で書いてみたいと思ったわけです。まともにやっても全く歯が立たない気がしていますけど。
で、あれこれと考えるのが好きなんですが、私はとにかく時間がかかってしまうもので、試行錯誤して遊ぶ前にやった準備のあれこれを書いてみました。これから試行錯誤したことはメモにする予定です。FPGAいじったことのある人なら、あっという間に先を越されてしまうんでしょうけど。要は楽しけりゃぁ誰がやったっていいんだと思っています。自分もそうなんですが、初めてやって、ツボにはまりまくって、人からなんでか知らないけどいろいろ教えてもらったりして、気が付いてみたら楽しくなっていた、なんて最高ですよね。山登りと一緒で、やってるときは大変ですけどね。
「今までやったこと、考えたこと、これからやりたいこと」を最後にまとめました。
<今までやったこと>
1)まず秋月電子でZYBO Zynq-7010評価ボード Z7-10 開発環境ソフトライセンス付を買ってきた。
http://akizukidenshi.com/catalog/g/gM-12552/
2)秀和システム「FPGAプログラミング大全 Xilinx編 小林優[著]」を買った。
https://www.shuwasystem.co.jp/book/9784798047539.html
3)参考資料
・「標準FORTH 井上外志雄[著](絶版)」
(学生時代(8ビットパソコンの全盛期)に何回も読み返していた本)
・FORTH PROGRAMMER’S HANDBOOK 3rd edition
Edward K. Conklin, Elizabeth D. Rather [著]
(Elizabeth D. Ratherさんは最初のFORTHのプログラミングガイドを書いたことと、FORTHの会社に携わった女性で、今も活躍している(2006年現在とウィキペディアにあった)。著書が現在でもUS版アマゾンで購入できる)
・「DARK FORTH prologue Kodai[著]
(技術書典7(2019/9/22 東京池袋サンシャインシティ文化会館)で購入。
GFORTHのことが簡単にまとめられていて、読みやすいと思った。FORTH
は個人個人が好きにデザインできるから、あんまりWORDというか、関数名
に当たるものが統一してないので、これから始めるなら当分はGFORTHから
調べたほうが無難かなぁと思ってます。)
・Intel 8086およびCP/M-86版のFig FORTH 8086/88のソースリスト
http://forth.org/fig-forth/fig-forth_8086-8088_ver_10.pdf
(ただし、紙にプリンターで印刷したものをPDF化しているので、ここからアセン
ブラソースを手でパソコンに打ち込もうとしたが挫折した。文字認識ソフトを何
種類か試してみたけど、ASCIIコードなのに日本語で出力されるので、どういじ
ってもうまくいかず、自分の技量のなさに呆れた。)
<考えたこと>
1)「今現在でもFPGAでFORTH言語を書いてみたい人はいるんじゃないか?」でググ
ってみた(「FPGA FORTH」で検索)
例1)A VHDL Forth Core for FPGAs Richard E. Haskell and Darrin M. Hanna[著]
http://richardhaskell.com/files/ForthCoreMM.pdf
(今はこのペーパーを見ながらFPGAの勉強をやっています。別の機会にその時に
感じたこと、わかったことのメモをつれずれに書く予定。)
例2)J1: asmallForth CPU Core for FPGAs
https://excamera.com/files/j1.pdf
(J1という、FPGAでFORTHを実行するためのコア部分を記述したもの
で、その仕様メモ)
例2-1)
https://github.com/jamesbowman/j1
FPGA(Xilinx)をVerilog言語で記述したソースコード。J1の実動作例。
例2-2)
https://github.com/samawati/j1eforth
J1を設定したFPGAを使って、GFORTHを動かすためのJ1シミュレーター
のソースコード。J1 eFORTH。
(結局、J1-eFORTHとは、GFORTHを動かすために、C言語とVelilog言語とで役割分担しているシステムということなのかなと思いました。利点は実行速度の短縮かな?)
<これからやりたいこと>
1)本当にシンプルなワードやデータ長だけでいいから、MRUBYのバイトコードみ
たいに、FORTHのワードを16ビット長ぐらいのバイトコードに変換して、直
接FPGAかSoCに叩き込んで、Velilogで実行できないかなぁ。ただし、そのバ
イトコードがどんな動作をするかは元のFORTHのワード辞書や実行中のワードの
登録内容を見てみないとわからないだろうけど(それでいいかなぁ?)。