FPGAで6809を作ってFLEXを動かすぞ

# 目的
　ＦＰＧＡ上にＺ８０を構築し、ＣＰ／ＭっていうＯＳを動かした。
　公開されている通りに、やっただけですけどね。
　そうすると、今度は６８ｘｘでもＯＳを動かしたい。
　なぜなのか、実は今は無きモトローラ派なんですね。
　あの、ごてごてと増改築した８０系の命令は余り好みじゃ無い。
　◆◆◆　そうだ、究極の８ビットＭＰＵでＯＳを動かそう　◆◆◆
　というわけで、究極の８ビットＭＰＵと言われた６８０９で取り合えずＦＬＥＸを動かすぞ。
　と言っても、とっくの昔に市販品が存在したますが。
　6809がもう少し早く世に出ていれば、世界は変わったかもしれないけど、其れは夢だな。

# 経緯
　自分で一から構築も頑張れば可能かも知れないが、取り合えず市場調査。
　　1.ＯＳの情報は入手でけた
　　2.シミュレーターは複数存在する（２０年以上前から有る）
　　3.ＦＰＧＡ上に６８０９を構築するのも既出
　情報はそれなりに有るのだが、既に成熟、腐敗して交錯いるような状況。
　そこで、とっつきやすいと思われたＦＬＥＸをターゲットに選定。
　シミュレーターで動作確認後、ＦＰＧＡ実機に持っていく手順を取る事にする。
　但し、既にＦＬＥＸが動作しているシミュレーターでは弄りにくいので、
　素（６８０９として動作）のシミュレーターを動かし、ＦＬＥＸを移植する。

# シミュレーター（ＳＩＭ６８０９）
　シミュレーターとして、こんなのを見つけた。
  　「[ＳＩＭ６８０９元ネタのある場所](https://github.com/gordonjcp/sim6809)」
　ソースの日付が１９９８年には、ちとびっくり。
　記述に稚拙な部分がみられるが、シミュレーターとしては良く出来ていると思う。
　これに下記を追加。
　　1.デバッグに便利な機能。（HELPの更進出来てないけど）
　　2.ＦＬＥＸの入出力に必要なハードウェア。

　ハード追加はシミュレーターの機能の一部として増設している。具体的処理として、
　6809がSWIを発行するとシミュレーターに制御が移るので、ここで要求された処理を実行する。
　　※シミュレーターにはこの機能をが最初から内在。
　　※実機上ではこのやり方は出来ないので、別の方法を選択。

　ＳＩＭ６８０９のコンパイルはMINGW32で行っている。
  　「[ＳＩＭ６８０９改造版はここ](https://github.com/hi631/FLEX09/tree/master/sim6809)」
　MINGW32を起動して、「cd /C/....../sim6809」でソースディレクトリに移動、
　make一発でコンパイル、「./sim6809」で起動しプロンプトが出る筈。
　　※コンパイル時に一部warningが出るが対策が良く判らないので放置、問題無いだろう。
　　※FLEXのブート方法は、別途下記に記述。
　　※Motorola系なのにロードがHEXなのは元仕様、拘りが不足かも。

# ＦＬＥＸ
　このＯＳは殆ど使った事無いので、細かい事は良く知らない。
　　1.ＯＳはソースとして見つかった。アセンブルすれば使える。
　　2.ソースは、INIT,FMS,CCP,DRIVER等に区分され、アドレス決め打ちで呼びだす。
　　　※アドレスの定義を誤ると悲惨なことが起こるな。
　　3.DRIVER(ファイルはCONSOLE)に、シリアルとＳＤのドライバを追加すれば、移植可能。
　　4.ＯＳは\$C000-\$FFFFに定位し、移動は不可なのだろう。ユーザーエリアは４８ＫＢ。
　　　※\$E000はかなり空いている。古いハードに引きずられているのかな。
　必要な処理（入出力）を追加してアセンブルし出来たHEXをシミュレーターで動作確認する。
　![Image2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/7c75402f-bf07-3757-a9c0-0a0f8d45fff9.jpeg)
　ＳＤカードへのアクセスは、「[MULTICOMP6809](https://github.com/nealcrook/multicomp6809)」に見本が存在。
　但し、ＦＬＥＸは２５６バイト／セクターに対し、ＳＤカードは５１２バイト／セクター。
　見本は512バイトの内、半分使わない方式だったが、バッファを使った分割Ｒ／Ｗとした。
　この方が処理速度的には不利だが、ディスク内容を変更せずにそのまま扱える。

　バッチジョブ「_flex_SIM.bat 」はシミュレーター用のHEXを作成。
　　※ドライブはWindows上のファイルにＲ／Ｗ。
　バッチジョブ「_flex_FPGA.bat」はFPGA用のHEXを作成。
　　※ドライブはＳＤカードを分割してＲ／Ｗ。

　6809用のアセンブラは多々あったが、仕様が微妙に違う。エラーのすくない奴をチョイス。
　使用したのは多分Motorola製だろうが、出所は不明。嫌なら自分で探してね。

　更に、既にwindows下では動作しないので、msdos.exeというエクステンダーを使用。
　「[MS-DOS Player for Win32-x64](http://takeda-toshiya.my.coocan.jp/msdos/)」
　
　mot2hex.exeは名前通りの動作をする簡単な自作プログラム、
　bin2hexw.exeも名前通りの動作だが、quartuskのROMに格納可能な形で出力する。
　EXEが気に入らなきゃソースから作り直してね。
  
　　「[ＦＬＥＸ移植版](https://github.com/hi631/FLEX09/tree/master/flex09)」

　パソコン側に存在するソースを実機で使用する場合、再打ち込みは不要。
　パソコンのターミナル画面へコピペすれば、入力が出来る。
　但し、FLEXが改行時にバッファデータを数バイトずつ喰喰うようなので、調整が必要。
　SIMでは不要だが、FPGAではダミーキャラクタが必要となる。
　'_ICC_TEST_01.C'に見本が有るが、エディット、コンパイル、実行を一発で実行する。
　実機によったは調整が必要かも。

# ＦＰＧＡ６８０９ハード
　構成なんかは、「[Grant's MULTICOMP](http://searle.x10host.com/Multicomp/index.html)」を見たほうが分かり易いかな。
　　※ほぼそのままです。但し、VHDLをverilogに変換しているのは趣味。
　FPGAはMULTICOMPで使用しているEP2C5搭載のボード。
　千円位で入手、国内でも二千円位から入手できるかな。
　FPGAの書込みにはＵＳＢブラスターが必要、500円位から入手可能だろう。
　
　EP2C5は4600LUT,13KBRAMと、底辺レベルのスペックだが8ビット程度になら取り合えず十分。
　FPGA内に6809に8KBのROMと2KBRAMを構築、更に64KBの外部RAMとＳＤカードを外付けした構成。
　6809は30MHzで動作している。
　ＳＤカードはドライバーに20MHzを与えてるので、10MHzで動いているのだろう。
　
　8KBのROMは動作確認用のBASIC若しくはMONITORを格納する。
　2KBRAMは本来は不要。でも、外部RAMが不動作の場合、
　外部を切り離せば、障害の切り分けが簡単になる。
　64KBの外部RAMは6809が30MHz程度で動作するので、30ns程度のスピードが有ればいい。
　追加の外部RAM(IS61LV5128AL)は容量512KB、アクセス10nsとオーバースペック、
　でも300円位で入手できたから別に構わないだろう。
　
　追加基板部分はいつも通り、ＣＮＣで製作。※最近は完動確率が高くなって、今回は一発動作。
　特に説明しないが、通信用にUSB to Serial(例えばFTD1232)の接続が別途必要です。
![Image1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/349804fc-e164-1811-e8b5-367e0770675c.jpeg)
　緑色がEP2C5搭載ボード、黒くてデカいのがFPGA
　その上の基板がＣＮＣで作った、ＲＡＭとＳＤ搭載のボード
　右下が、シリアルボード(市販品FTD1232)
　右上は、ＶＧＡ出力とＰＳ２入力基板(今回のソフトでは未接続)

　「[ＦＰＧＡ６８０９外付けハード(EAGLEで製図)はここ](https://github.com/hi631/FLEX09/tree/master/EAGLE_ram%26sd)」
　※※すみません、訂正がまず一件。このパターンを使用する場合、EP2C5搭載ボードの変更が必要。
　具体的には基板背面の R1, R2, R9, R10の削除が必要。何故か0Ω抵抗で電源に繋がっている。
　何か理由が有るのかも知れないが、取り合えず外しても動作は正常。
![Image4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/6c469c9b-fc09-c1a5-ffa4-b7f798262ee1.jpeg)


# ＦＰＧＡ６８０９ソフト
　ソフトはquartus IIにてコンパイル可能。
　EP2C5は旧世代のCyclone II であり、13.0sp1以前でないとコンパイルできないので要注意。
　　※今でもダウンロード可能。
　注意点としては、動作環境の選択が出来るって事、
　　1.BASICを動かしたい場合は、basic.asmをアセンブルしておく。
　　2,monitorを動かしたい場合は、monitor.asmをアセンブルしておく。
　　※どちらもbasic.hexを生成するので、verilog側は変更不要。
　再コンパイルすれば、プログラムが実機に反映される。

　コンパイルは一分少々で完了して、結構早いと思う。
　この程度ならターンアラウンドとして許容範囲かな。
　既に４年落ちのパソコン(Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz)だが、
　ＳＳＤに換装したら倍ぐらい早くなった(ような気がする)。

　「[ＦＰＧＡ６８０９ソフトはここ](https://github.com/hi631/FLEX09/tree/master/f6809)」

#モニタープログラム
　ＦＬＥＸの起動及び、ＦＬＥＸが起動しなかった場合のデバッグに使う。
　6809アセンブラで書いている。
　　※久々だが、意外に書きやすいが、今となってはレジスタが少ない、すぐ壊れる。

　ＦＬＥＸの起動は、
　　1.モニター起動後に、'B'+'Ret'押下で起動。（事前設定が必要）
　　2.BASICからの起動も可能、'Ctrl'+'L'で'%'が表示されるので、FLEXのHEXファイルを画面にコピペ、
　　　%%%%...って表示された後で自動起動する
　　　　※moni09ディレクトリ下のbasic.asm(改変版)の使用が前提。\$C400からの起動となる。
　モニターは\$E000と\$A000の二ヵ所に定位しており、リセット時には\$A000として起動する。
　自分自身を\$A000のRAMにコピー後にROMを無効化し、FLEXのロードエリアを空ける。

　モニターを\$9000でアセンブルすれば、別アドレスにモニターをロードすることが出来、
　FPGAの再コンパイル無しで、モニターのデバッグが可能。

　モニターコマンド一覧
　B
　　FLEXをブートする。
　D AAAA BBBB
　　AAAA番地からBBBB番地迄をメモリダンプ、長さは128に固定。
　F AAAA BBBB DD
　　AAAA番地からBBBB番地迄をDDで埋める。
　G AAAA
　　PCをAAAAに設定して実行開始。
　L
　　HEXファイルフォーマットで入力されたデータをメモリに格納。
　Q
　　モニターを終了して、呼び出し元に戻る。
　R TTSS AAAA LL
　　SDカードのTTSSセクターからDD回、AAAA番地以降に格納。
　　　※TTがトラック、SSがセクター
　S XX
　　システムレジスタにXXを格納(\$81でROM切り離し、\$00で復旧)
　U X
　　Xでドライブユニット(0-3)選択
　W TTSS AAAA LL
　　SDカードのTTSSセクターからDD回、AAAA番地以降を書込む。

　「[ＦＬＥＸ０９モニターはここ](https://github.com/hi631/FLEX09/tree/master/moni09)」
　※※訂正がもう一件。RAMの有無により動作を変えているが、Write後にReadすると誤動作するので処理を追加。


#ＳＤカード上のドライブ配置
　0000 - 059F ドライブ０
　05A0 - 05CF ブートローダ
　0800 - 0D9F ドライブ１
　1000 - 159F ドライブ２
　1800 - 1D9F ドライブ３
　　※512B/Sとして記述
　　※4台選択可能だが、４台目は使えない。(FLEXの中で3になっているような気がする)
　カードデーは下記のようにコマンドを使いディスクを結合し、win32diskimagerなんかでSDに書き込む。
　copy /b FLEX9SYS.DSK+DUMY_4CKFF.bin+BLANK.DSK+DUMY_4CKFF.bin+BLANK.DSK+DUMY_4CKFF.bin SD4M.img
　　※FLEX9SYS.DSKは「[SWTPC](http://www.evenson-consulting.com/swtpc/)」より入手。特に使用上の制約は無かったと思う。
　　　なんか一杯入っていてお値打ち感が有るな。
![Image3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/d2ff437a-967f-e79b-c445-35f715b8c79c.jpeg)

#ブートローダの設定
　ブートローダと言うよりは、ＯＳ本体。この方が起動処理が簡単なもので。
　1.リセットによりモニターが起動。
　2.'L'コマンドを発行。'%'表示を確認。
　3.flex9.hexeをターミナルにコピペして、メモリにロード。(\$C000-\$FFFFに書き込まれる)
　4.'W 5001 C000 3F'と書き込みコマンドを発行。
　　※5001はカード上では\$800セクター(512B/S換算)に相当。
　5.'B'コマンドで動作を確認。

# 動作保証について(2022/07/19追記)
　この記載を見られた方で、記載の通りにやったが動作しない、ハードは正常なので公開しているソフトがおかしい。無駄な時間を費やしたと、ブログに公開されている方がおりました。
　本記載では6809は30MHzで動作しており、拡張RAMには配線遅延等も含めアクセスが33ns以下の物が必要です。
　しかし、その方のハード構成を見ると55nsアクセスのRAMを使用しており、之では正常動作する訳が有りません。
　　※本例ではアクセス10nsのRAMを使用。
　　※CPUクロックを下げれば動くだろうが、SDへのアクセスを遅くする必要が有るかも。
　環境に合わせハード等を変更するのであれば、それがどの様な結果を及ぼすのか理解してください。
　それが理解出来ないのなら誤ったクレームを付けないで頂きたい、無知の恥をさらすだけですよ。
　本記載は完全な動作を保証している訳では有りませんが、少なくとも動作確認が得られたものをソースと共に公開しております。
　これは、追試を行う方への最低限の利便性を提供するためであり、自分なりの未来へのささやかな投資と考えています。
　また、記載が説明不足な事は承知していますが、此処は学校では無く、更に一から説明したら此処には書ききれないでしょう。
　詳細な動作はプログラム、回路図から読み取って下さい。不明な点は文句を言う前にググって調べるべきでしょう。

# 総括
　ソースの大部分は、20～30年前に既に公開されている代物。
　良く出来ていると昔を称賛するか、其れとも今頃こんな事やって何になるのと呆れるべきか。
　でも、この追試もそれなりに手間がかかったけど、其れなりに面白いものですよ。
　今でも6809に未練が有り、やる気のある方は挑戦してみたら如何でしょうか。
　多分滅多に居ないでしょうが。
　なお、使用しているソースには、出所の確認できないものが含まれております。
　又、本来はソースの紹介にとどめるべきかも知れない所を、コピーして格納しています。
　これは、参照元は年季が入ってるので、万一消滅した時等のことも考慮の上で、
　このようにしておりますが、可能であれば配布元から拝領するのが礼儀だと思います。
　当然ですが、上記記載内容は全て無保証であり、各自の責任においてご利用願います。