aki_iic’s blog

己の欲せざる処人に施す事無かれ、狂人の真似するは即ち狂人なり

MC68HC11F1でFuzix 0.5

 Motorola(後のFreescale,今のNXPですね)のMC6800直系のMCUであるMC68HC11ファミリのMC68HC11F1でFuzix 0.5が動く様になりました。一部重複する事柄もありますが情報を纏めておいた方が後々面倒が無い(多分、未来の自分の為にも)ので以下に記します。

1.ハードウェア関連

aki-iic.hatenablog.com

 自己引用(以下同様)になりますがMC68HC11F1を使用したSBC(以下hc11f_v1と呼称)のハードウェアに関する情報です。MC68HC11系はretroマイコン界隈では知名度は高くは無い(一時期のH8マイコンに比べたら・・・一部業界向けと申しますか)と思われるのでご参照頂けると幸いです。

 とはいえ端折りすぎかもしれないので概略、ブロック図、マップを掲示

 資料を書こうの再掲になるのですがお粗末ですが作成した資料を参照しつつ、

・基本的な考え方

hc11f_v1基本的な考え方(抜粋)

・ブロック図

hc11f_v1 ブロック図

・概略仕様とメモリマップ

hc11f_v1概略仕様とメモリマップ

・回路図

hc11f_v1回路図

・パターン図(全レイヤ合成)

hc11f_v1パタン図(全レイヤ合成)

2.Fuzixについて

www.fuzix.org

 真にシンプルな本家サイトですが必要な情報は揃っています(凄い)。本案件では参照させて頂いたオリジナルモデル(以下Mini11)のリンクも提示されています↓

github.com

 もしMCUが68HC11A/Eをご所望でSDカードイメージも提供されており、基板のGerberデータも提供されている(面倒が無い)環境をご所望であればこれを参照される事をお勧めします(ちょっとクセはありますが実績があり、Fuzix本家でリンク貼られているので公式になるかと)。

 これで済めば本件終了なのですが・・・いやHC11F1とかhc11f_v1とかいう代物を見てやろうかという奇特な方は(最近の引用ですみませんが)↓

aki-iic.hatenablog.com

 1.は別件なので2.からご参照下さい(だらだら書かれていてすみません)。

 そんな感じですがとりあえず起動時のスクショでも貼っておこう↓

hc11_v1(mc68hc11f1)でfuzix 0.5 起動画面

 ここに至る迄の顛末は上記「師走」の2.以降のダラダラテキストをご参照下さい(最後の方から見た方が時間の無駄にならない気がします:)。

 あと、実機(実装基板)の写真も貼っておこう↓

hc11f_v1でfuzix 0.5 実装基板と開発環境

 図左下の緑のLEDはTickでトグル(点滅)する様にしてあります。本機では20ms毎に点滅する態様でAlive checkの代用というか・・・ファイルアクセス時に一瞬点滅が止まったり、shutdownでLEDが消灯(トグルなので点灯もあるかもしれない)等でシステムの状態を間接的に知る参考になると思われます。

3.MC68HC11Fへの移植に関して

 今回はオリジナルのMini11が68HC11Aから元祖秋葉原さんで購入したMC68HC11Fに移植した際の修正内容とそれとは別次元?のいくつかの課題に遭遇しました。順に述べると

3.1 68HC11A ⇒ 68HC11Fへの変更点

  fuzix移植で重要なのはメモリマップでhc11aとhc11fはハードウェア的に、

 ・io領域が異なる、hc11aはx000-x03f(64byte)、ram領域はx000-x0ff(256byte)に対して、hc11f1ではio領域がx000-x05f(96byte)、ram領域はx000-x3ff(1024byte)に拡張されている。

 これらの違いをmemory.x に記述されたマップに反映させる必要があります(極めて重要):

platform-mini11/memory.x の hc11a ⇒ hc11fの変更内容

 上記16〜18行が変更対象になります。ioはhc11fの内蔵ioの事でiramはhc11fの内蔵ramの事です。このマップで0xff00-ff7fが未使用になっておりますが、当方のハードウェア(hc11f_v1)の個別仕様で同空間にpsd834f2j90のio(csiop空間)とae-ft245rlを配置している為、fuzixの管理対象外としております。それらが無い場合は0xff00,length=00e0にすればhighpage(実際には使用されていない様だが)を広げる事が出来ます。尚、hc11ファミリは地味に拡張続けているのでhc11aとhc11eとhc11fはそれぞれio,iramの領域、サイズが異なるので注意が必要です(こことても重要です)。

 次が機種依存部分のMini11.Sについて。実はhc11a向けにハードコーディングされている部分がありまして(組込み業界ではよくある話ですが)、上記io,iramのマップの違いをそのハードコーディング部分に反映させる必要があります(ここもとても重要)↓

platform-mini11/Mini11.S の hc11a ⇒ hc11fの変更内容

 何か怪しげなコードですが、本機(事実上のfuzixの8ビット機の必須要件)ではramバンク切り替えを行うのですがbank間のコピーを行う為にコピールーチンをiram領域にコピーしてそれを割込禁止状態でサブルーチンコールするという荒業をやっている様です(236〜251行)なのでiramの開始番地を0xf040⇒0xf060に変更し、bank ram領域を0xf200⇒0xf400に変更する必要があります。これはhc11のio,iramは最優先にマッピングされる為、必須であり他の対処方法は無いと思われます(チップ内部の話なので)。

 そして254〜276行がそのコピーされるコピールーチンの実体でキャッシュもパイプラインも無いレトロマイコンならではの黒魔術的な実装でありました(画像系ではもっと酷い実装もあるのかもしれませんが:自己変更コードとか:気質だった当方としてはこれでも黒魔術風に見えます(未熟者かもしれませんね:)。

 次がgcc依存かどうか分かりませんが ldd 2,x とコード生成すべきを clra;ldab 2,xと1番地づれたロードをした為に破綻した部分についての対応ですが、これは共通部分の

FUZIX/Kernel/devio.c の修正部分(コンパイラにより異なる?)

 の366、373行が相当します。368〜370行をコメントアウトしたのはどうしてもillegal instructionが出るので所詮はチェックルーチンで必ず正常になるから外してしまいました(場当たり的な対応です:)。

 そして最後はeeprom領域の削除でこれにはSpecial bootstrap modeで処理します。具体的にはdip-swでmodea=modb='L'としてリセットするとMCUSBM:Special Bootstrap Mode、以下同様、に入るのでターミナルからbaudrateを7812bpsに設定してから以下のコードをMCUのSCIに転送します↓

68hc11のsbmコード(configを0f⇒0eに変更:eeprom無効化)

 sbmmcuのリソースだけを使用するので外部ramやromがあっても無くても動作します。このコードはマニュアルのeepromのbyte erase,byte writeルーチンそのもので対象アドレスがconfig($103f)になってるだけです。最初の$FFはMCUSBMがbaud rate逆算用の同期コードですが7812.5bps以外で当方成功した試しが無い(9600bpsも逆算可能と書かれてはいるのだが・・・)のでusb-serialでは柔軟に対応可能なので大丈夫かと思います(変態ですね)。

 とここまで書いてくると組込み系MCUMC6800/MC6809と異なり各MCU特有の黒魔術領域がある気がしないでもない。

 とまあ、そんなこんなを潜り抜けてhc11f_v1(mc68hc11f1)でのfuzix起動に辿り着いたのでありました。

おしまい

 ああそうだ、最後にこのフレーズを復唱しておこう・・・

 そもそもfuzixで何するの?何出来るの? に対する当方の返答は、

 それはretro sbc を愛でる為ですよ(どやっ:)

 と申しておきましょうか(あはは)。

 Old and New (2014年をnewと言えるかは別にして)と申しますか40年前のマイコン(それもMC6800の直系)でfuzixが動くというのは何度申しても愉しい嬉しいとニヤニヤしている変なおっさんでありました(お解りですよね?)。

 

20251228 02:18追記:折角マルチタスクOSなのだからls -l / >l & で試してみる↓

MC68HC11F1でfuzix ls -l / >l & を試す

 idle時は180KBが ls -l / >l & で180⇒240KBと60KB増加し、ls がプロセスに登場、その後バックグラウンド終了後、メモリ消費が240⇒180KBに戻る、と。何かちゃんとfuzix(というか見た感じはlinux風)してるよ(あたりまえだけどびっくり:)。

 もうfuzix開発者の方々には感謝の言葉しかありません(深く感謝を、心から)。

 機種依存部(platform-mini11/)のコード(Cとasm)の分量を見るに、

MC68HC11F1でfuzix platform-mini11/ のCとSの行数

 .S(asm)が1534行、.cが390行、合計1924行でありました。

 この程度のステップ数なら読み込んで行けば・・・というのは素人の浅はかさなのでしょうけど linuxの膨大なコードで迷子になっているのに比べるとfuzixはコア部分を凝縮というか簡素化というかした実装であるから気長に読み込んで行けば、多少なりとも理解が深まる筈・・・

 ハードウェアもソフトウェアもソースコード(回路図含む)を手元で自分なりに参照・改変出来るのはOSSの大いなる魅力であります(仮に教育用、啓蒙用であっても・・・その意味ではMinixに近い側面もあるのかもしれないがfuzixはずっと現実的でコードもコンパクトでわかりやすい(これは当方の印象或いは偏見:)。

 所謂痘痕も笑窪状態(浮かれポンチとも?)であります(あはは)・・・

 

20251228 21:52追記:シェルスクリプトを試す。fuzixは昔懐かしsh(bsh)なので常用しているbashとは異なっております。cshkshが最新!とか言われていた頃が・・・

fuzixでshellscript(bsh)

 いや、別段、どうといふことは無いのかもしれませんがクドいかもしれませんがこれが40年前の8bitマイコン(それもどちらかといえばマイナーなmc68hc11)で動くというのが個人的には感動的。

 8bitマイコンunix風・・・といえば当方の世代ではos-9/6809を想起される方が多いと思いますが(FM-8/7やMB-S1とか)当時os-9/6809をpoorman's unixとか気取った皮肉を言ってた勢力(意識高い系?まあ、IT詐欺師予備軍、メディアってそんなもんだよね、口先だけは百人力:)からするとfuzixはpoorman's(or μP) linux なのでしょうか(これじゃない感も)?

 正直そんな事どうでも良くてハードウェア含めたOSS風な物を自分の手を動かして学ぶ・動かす・気持ちイイ(これは蛇足)で堪能しております。

#あな、楽しからずや(反芻)

 

20251230 13:27追記:稼働3日(72時間)経過・・・だから何ではありますが。

fuzix 0.5 mc68hc11f1(hc11f_v1)@4Mhz(16Mhz) 3days・・・

 人畜無害なsleepを複数起動してメモリ消費を見る。180⇒240⇒300KBと60KB単位で増えるのは本機が64KB/bank(正確には60KB)の為でつまり/init含めて7プロセスという制限(仕様です)となる。rc2014の512KB bankded memory では16KB/32KB pageのbank memory の様で68hc11でもrc2014系ではそれを使用しているらしい。

 要するに本機はハードウェアを簡略化する為にメモリ効率を犠牲(トレードオフとも)した仕様という意味でもある。

 そういえばFM-11やMB-S1ではos9/6809のMMUレジスタファイルや高速SRAMでページサイズを数KB程度にしていた記憶が(Microwareの要求仕様だったのかは知りませんが)・・・それだけメモリが高価だったのでページを小さくしてメモリ効率を上げたかったという背景もあったのかもしれません。そういえばMC6829という6809専用のMMUがラインナップとして用意されていた様な(搭載製品は存じませぬが)・・・

#昔の事はよく思い出せる不思議(ジジババ症候群とも:)

 

20251231 15:08追記:アプリケーションを試してみる。ffrothなるforthインタプリタ(懐かし)が唯一使えるセルフ言語処理系(FORTHです)らしい(サイズ16KB)↓

fuzix0.5 fforth mc68hc11f1@4Mhz(16Mhz)

 上図中の65285(0xFF05)はpb7 ledの番地で0x80(128)がoff,0x00がonとなる。既報の通り、tickでpb7をトグルするコードを埋め込んでいるので fforthでその番地を読むと異なるデータが読み出せる(0だったり128だったりしている)。

 1980年代にForthが流行った時にはRPNに馴染めず敬遠していたのだが・・・必要に迫られると人間やるものでありまして・・・こりゃ飽きないな:)

fforthについてのgemini3(fast)からのご神託

#魅惑的だ(スポックの口調で:)!

 

20260104 21:34追記:fforthのテストプログラムを実行してみた。実装レベル確認でしょうか。

mc68hc11でfuzix 0.5 fforthのtest

 エラーにはなっていないので正常終了と思われる。最後の方で基数の範囲(普通の16ビット変数)の様です。あと、16進数の使い方ですがHEXワードで基数を設定した上であればFF05(大文字)等で16進数で使える様です↓

mc68hc11でfuzix 0.5 ffrothで16進数でアクセス

 上記は0xff05を読んで0x80 or 0x00と表示している図であります(FF05:PB7です)。

 fuzix開発者様の狙い通り、ハードウェアのチェックや簡単なTPには充分使えそうな印象(Forthなんて懐かしい、頭をRPNに・・・修行だな:)。