目的
FPGA上にZ80を構築し、CP/MっていうOSを動かした。
公開されている通りに、やっただけですけどね。
そうすると、今度は68xxでもOSを動かしたい。
なぜなのか、実は今は無きモトローラ派なんですね。
あの、ごてごてと増改築した80系の命令は余り好みじゃ無い。
◆◆◆ そうだ、究極の8ビットMPUでOSを動かそう ◆◆◆
というわけで、究極の8ビットMPUと言われた6809で取り合えずFLEXを動かすぞ。
と言っても、とっくの昔に市販品が存在したますが。
6809がもう少し早く世に出ていれば、世界は変わったかもしれないけど、其れは夢だな。
経緯
自分で一から構築も頑張れば可能かも知れないが、取り合えず市場調査。
1.OSの情報は入手でけた
2.シミュレーターは複数存在する(20年以上前から有る)
3.FPGA上に6809を構築するのも既出
情報はそれなりに有るのだが、既に成熟、腐敗して交錯いるような状況。
そこで、とっつきやすいと思われたFLEXをターゲットに選定。
シミュレーターで動作確認後、FPGA実機に持っていく手順を取る事にする。
但し、既にFLEXが動作しているシミュレーターでは弄りにくいので、
素(6809として動作)のシミュレーターを動かし、FLEXを移植する。
シミュレーター(SIM6809)
シミュレーターとして、こんなのを見つけた。
「SIM6809元ネタのある場所」
ソースの日付が1998年には、ちとびっくり。
記述に稚拙な部分がみられるが、シミュレーターとしては良く出来ていると思う。
これに下記を追加。
1.デバッグに便利な機能。(HELPの更進出来てないけど)
2.FLEXの入出力に必要なハードウェア。
ハード追加はシミュレーターの機能の一部として増設している。具体的処理として、
6809がSWIを発行するとシミュレーターに制御が移るので、ここで要求された処理を実行する。
※シミュレーターにはこの機能をが最初から内在。
※実機上ではこのやり方は出来ないので、別の方法を選択。
SIM6809のコンパイルはMINGW32で行っている。
「SIM6809改造版はここ」
MINGW32を起動して、「cd /C/....../sim6809」でソースディレクトリに移動、
make一発でコンパイル、「./sim6809」で起動しプロンプトが出る筈。
※コンパイル時に一部warningが出るが対策が良く判らないので放置、問題無いだろう。
※FLEXのブート方法は、別途下記に記述。
※Motorola系なのにロードがHEXなのは元仕様、拘りが不足かも。
FLEX
このOSは殆ど使った事無いので、細かい事は良く知らない。
1.OSはソースとして見つかった。アセンブルすれば使える。
2.ソースは、INIT,FMS,CCP,DRIVER等に区分され、アドレス決め打ちで呼びだす。
※アドレスの定義を誤ると悲惨なことが起こるな。
3.DRIVER(ファイルはCONSOLE)に、シリアルとSDのドライバを追加すれば、移植可能。
4.OSは$C000-$FFFFに定位し、移動は不可なのだろう。ユーザーエリアは48KB。
※$E000はかなり空いている。古いハードに引きずられているのかな。
必要な処理(入出力)を追加してアセンブルし出来たHEXをシミュレーターで動作確認する。
SDカードへのアクセスは、「MULTICOMP6809」に見本が存在。
但し、FLEXは256バイト/セクターに対し、SDカードは512バイト/セクター。
見本は512バイトの内、半分使わない方式だったが、バッファを使った分割R/Wとした。
この方が処理速度的には不利だが、ディスク内容を変更せずにそのまま扱える。
バッチジョブ「_flex_SIM.bat 」はシミュレーター用のHEXを作成。
※ドライブはWindows上のファイルにR/W。
バッチジョブ「_flex_FPGA.bat」はFPGA用のHEXを作成。
※ドライブはSDカードを分割してR/W。
6809用のアセンブラは多々あったが、仕様が微妙に違う。エラーのすくない奴をチョイス。
使用したのは多分Motorola製だろうが、出所は不明。嫌なら自分で探してね。
更に、既にwindows下では動作しないので、msdos.exeというエクステンダーを使用。
「MS-DOS Player for Win32-x64」
mot2hex.exeは名前通りの動作をする簡単な自作プログラム、
bin2hexw.exeも名前通りの動作だが、quartuskのROMに格納可能な形で出力する。
EXEが気に入らなきゃソースから作り直してね。
「FLEX移植版」
パソコン側に存在するソースを実機で使用する場合、再打ち込みは不要。
パソコンのターミナル画面へコピペすれば、入力が出来る。
但し、FLEXが改行時にバッファデータを数バイトずつ喰喰うようなので、調整が必要。
SIMでは不要だが、FPGAではダミーキャラクタが必要となる。
'_ICC_TEST_01.C'に見本が有るが、エディット、コンパイル、実行を一発で実行する。
実機によったは調整が必要かも。
FPGA6809ハード
構成なんかは、「Grant's MULTICOMP」を見たほうが分かり易いかな。
※ほぼそのままです。但し、VHDLをverilogに変換しているのは趣味。
FPGAはMULTICOMPで使用しているEP2C5搭載のボード。
千円位で入手、国内でも二千円位から入手できるかな。
FPGAの書込みにはUSBブラスターが必要、500円位から入手可能だろう。
EP2C5は4600LUT,13KBRAMと、底辺レベルのスペックだが8ビット程度になら取り合えず十分。
FPGA内に6809に8KBのROMと2KBRAMを構築、更に64KBの外部RAMとSDカードを外付けした構成。
6809は30MHzで動作している。
SDカードはドライバーに20MHzを与えてるので、10MHzで動いているのだろう。
8KBのROMは動作確認用のBASIC若しくはMONITORを格納する。
2KBRAMは本来は不要。でも、外部RAMが不動作の場合、
外部を切り離せば、障害の切り分けが簡単になる。
64KBの外部RAMは6809が30MHz程度で動作するので、30ns程度のスピードが有ればいい。
追加の外部RAM(IS61LV5128AL)は容量512KB、アクセス10nsとオーバースペック、
でも300円位で入手できたから別に構わないだろう。
追加基板部分はいつも通り、CNCで製作。※最近は完動確率が高くなって、今回は一発動作。
特に説明しないが、通信用にUSB to Serial(例えばFTD1232)の接続が別途必要です。
緑色がEP2C5搭載ボード、黒くてデカいのがFPGA
その上の基板がCNCで作った、RAMとSD搭載のボード
右下が、シリアルボード(市販品FTD1232)
右上は、VGA出力とPS2入力基板(今回のソフトでは未接続)
「FPGA6809外付けハード(EAGLEで製図)はここ」
※※すみません、訂正がまず一件。このパターンを使用する場合、EP2C5搭載ボードの変更が必要。
具体的には基板背面の R1, R2, R9, R10の削除が必要。何故か0Ω抵抗で電源に繋がっている。
何か理由が有るのかも知れないが、取り合えず外しても動作は正常。
FPGA6809ソフト
ソフトはquartus IIにてコンパイル可能。
EP2C5は旧世代のCyclone II であり、13.0sp1以前でないとコンパイルできないので要注意。
※今でもダウンロード可能。
注意点としては、動作環境の選択が出来るって事、
1.BASICを動かしたい場合は、basic.asmをアセンブルしておく。
2,monitorを動かしたい場合は、monitor.asmをアセンブルしておく。
※どちらもbasic.hexを生成するので、verilog側は変更不要。
再コンパイルすれば、プログラムが実機に反映される。
コンパイルは一分少々で完了して、結構早いと思う。
この程度ならターンアラウンドとして許容範囲かな。
既に4年落ちのパソコン(Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz)だが、
SSDに換装したら倍ぐらい早くなった(ような気がする)。
#モニタープログラム
FLEXの起動及び、FLEXが起動しなかった場合のデバッグに使う。
6809アセンブラで書いている。
※久々だが、意外に書きやすいが、今となってはレジスタが少ない、すぐ壊れる。
FLEXの起動は、
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番地以降を書込む。
「FLEX09モニターはここ」
※※訂正がもう一件。RAMの有無により動作を変えているが、Write後にReadすると誤動作するので処理を追加。
#SDカード上のドライブ配置
0000 - 059F ドライブ0
05A0 - 05CF ブートローダ
0800 - 0D9F ドライブ1
1000 - 159F ドライブ2
1800 - 1D9F ドライブ3
※512B/Sとして記述
※4台選択可能だが、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」より入手。特に使用上の制約は無かったと思う。
なんか一杯入っていてお値打ち感が有るな。
#ブートローダの設定
ブートローダと言うよりは、OS本体。この方が起動処理が簡単なもので。
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に未練が有り、やる気のある方は挑戦してみたら如何でしょうか。
多分滅多に居ないでしょうが。
なお、使用しているソースには、出所の確認できないものが含まれております。
又、本来はソースの紹介にとどめるべきかも知れない所を、コピーして格納しています。
これは、参照元は年季が入ってるので、万一消滅した時等のことも考慮の上で、
このようにしておりますが、可能であれば配布元から拝領するのが礼儀だと思います。
当然ですが、上記記載内容は全て無保証であり、各自の責任においてご利用願います。