Tang-Nano-9Kで(今更)CP/M-68Kを動かす

# 目的
　Tang-Nano-9KでCP/M-80が動いたので、次は何に手を付けるかなと。
　インテルをやったから、次はモトローラだろうかな。
　6809を動かしてFLEXとかOS9でも良かったけど、16ビットに挑戦して見るか。
　◆◆◆　そうだＣＰ／Ｍ－６８Ｋを動かしてみよう　◆◆◆
　出来上がったシステムはtn9-68Kとでも言っておこう。
　しかし、Tang-Nano-9K基板と68000がほぼ同一サイズ。68000ってデカかったんだね。
![cpm68k_tn9k_68k.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/04bb533a-64a9-0db2-2c0f-77b1332238f6.jpeg)

# 経緯
　前回も書いたが、ＣＰ／Ｍ－６８Ｋは、８０８０系列では著名なＣＰＭの６８０００バージョン。
　BIOSと呼称されるソースに、ハード特有部分としてシリアル入出力とディスクＩ／Ｏを書き加えれば動作する。
　CP/M-68Kシステム上でシステムを再構成すれば、ターゲットシステムが出来上がる。
　つまりCP/M-68Kを作る為には、動作するCP/M-68Kシステムが必要、卵とニワトリの関係みたいだが。
　今回は動作しているCP/M-68Kが有るので、OSの再構成自体は非常に簡単。
　後はTang-Nano-9Kに68000をインプリメントして、簡単なI/Oを作るだけのお仕事。
　　※の筈だったが、意外に手こずり時間を要した。
	※以下ではTang-Nano-9KをTN9K、CPMが搭載した状態をTN9-68Kと略す。
　TN9-68K上で、別システム用のOS再構成も可能。
  　※凄く時間がかかるから敢えてお勧めはしない、sim68Kでやった方が楽。


# 必要な開発環境とLicense
　□Tang-Nano-9K
　　2K円位で入手可能(売ってれば)。
　□開発ライセンス
　　「[Tang Nano、Nano4KのIDEであるGowin EDAインストール(Winのみ)](https://qiita.com/yosiaki/items/2e635e115ecedabecc35)」に詳しく書かれています。
　□microSDカード
　　OS(約20MB)をSDカードに書込む。書き込みソフトも必要。
　□ターミナルソフト　
　　入出力を行う、例えばTeraTrem。

　以下は動作確認のみで改変無しなら不要。
　□sim68K(シミュレーター)
　　パソコンで動作するCP/M-68Kシミュレーター、ＯＳのディスクイメージを作成可。モニタ機能を搭載。
　□Linux
　　シミュレーターのコンパイル、実行を行う。Windows上に構築可能。
　□mon68K(モニター)
　　Tang-Nano-9Kで動作するデバッグモニター、プログラムのブレークなどが可能。
　□sozobon2
　　モニターソフトをコンパイルするための開発環境。
　□オプションツール
　　モニターの機械語をTang-Nano-9K用に変換する為の一寸したツール。
　□Mingw32
　　オプションツールのコンパイル環境。※コンパイル出来れば何でも良い。


# TN9-68Kの動作確認
　手っ取り早く動作を確認したい場合
　◇FPGA書き込み
　　TN9Kを購入する。
　　Gowin開発環境をインストール、ライセンス認証を行う。
　　「[TN9-68K](https://github.com/hi631/tang-nano-9K/tree/master/cpm68k)」をダウンロードする。
　　cpm68k.gprjを開いて、ソースをコンパイル、USBで接続し、TN9Kに書き込む。
　　　※取り合えず、Gowin_V1.9.8.03を使っている。Flash書き込みできないバージョン(V1.9.8.07)も有ったような。
　◇OSイメージの入ったSDカードの作成
　　「[cpm68k_sim68k](https://github.com/hi631/tang-nano-9K/tree/master/cpm68k_sim68k)」のdiskc.cpm.zipを解凍。
　　diskc.cpm.fsをSDカードに書き込み、TN9Kのスロットに挿入。
　◇動作
　　端末ソフト(TeraTerm等)を立ち上げ、TN9Kに接続する。
　　リセット(TN9KのS2釦)を押す。
　　ターミナルに起動メッセージが表示されれば大成功。
　　　※元のVerは1.2だが、Ver1.3にVerUPしている。
　　Ctrl+Q(Ctrl釦を押したままでQ釦を押下)で、ブレークが動作しモニタが起動。
![Image2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/ff26e75b-a2c7-96b1-a79f-c0a3e1f35949.jpeg)




# TN9-68Kの各部解説
　◇68000(CPU)
　　ソフトと言うか、68000コアは「[j68_cpu](https://github.com/fredrequin/j68_cpu)」なるものをチョイス。
　　こじんまりしているが遅いと書かれている。※動かすと確かに遅いような。
　　動作クロックの1/3の性能になるとかで、40MHzで動作させて13MHzの68000相当。
　　　※DRAアクセスが遅いので、更に足を引っ張っているし。

　◇SRAM
　　BLOCKRAMを適用。
　　　※但し、byte_ena端子が無い(様な)ので、8bitRAMを並列に接続。
　　　　この位はGowinで用意して呉れても良いのでは。

　◇DRAM
　　容量は8MB、TN9K内のDRAM(4MBx2)を適用。
　　バースト(16サイクル)によるブロック単位のアクセスとなり、RWには10(cpu)クロック程度が必要。
　　同一ブロック(32Byte)からの読出しはキャッシュが動作し、3(cpu)クロックでアクセス。

　◇ROM
　　容量は8KW(16KB)、モニタの開発環境でコンパイルしたバイナリを書込む。

　◇ACIA
　　M6850相当。
　　デバッグポートとして、acia_b(FF10xx)を使用。※acia_a(FF11xx)は未使用。

　◇動作クロック
　　TN9Kのベース(水晶)クロックは27MHz。
　　DRAMは18/3分周した、162MHzで動作。
　　CPUはこれを1/4分周し、40.5MHzで動作。
　　SDカードは更に1/2分周し、20.25MHzで動作。

　◇バグ
　　j68_cpuにはバグがあると思われる。(多分)
　　　※当方のインプリメントに問題が有る可能性も有るが。
　　バグの内容は、move.b xx,-(a7) 実行時に、スタックにデータが書き込まれない。
　　　※68000のスタック(a7)は常にワード(2Byte)動作、byteを操作してもアドレスは2byte分進む。
　　　　この時、Byteデータは上位に出て来るが、byte_enaストローブを下位に出ている。
　　この状態でも動作に殆ど影響は出なかったが、EDが起動しない現象が発現。
　　パッチ(j68_mem_io.vの483行近辺)を当てる事により、EDの起動及びテキスト作成は可能となったが、Eコマンドで書込み後に即終了しないので、完治した訳ではない模様。
　　　※Ctrl+Cで終了すれば、書き込まれ操作は終了する。
　　コンパイル及び実行は問題無く動作しているようなので、これはこのまま放置。


# sim68K(シミュレーター)
　前回の記載内容の書き写しに近いが、
　「[ＰＩＣマイコンは面白い](https://piclabo.blog.ss-blog.jp/2018-07-22)」に書かれているCP/M-68K Simulatorが良さげだが、既にリンク切れを起こしているので下記からダウンロード。
　　◇ [Musashi](https://github.com/kstenerud/Musashi)
　　◇ [CP/M-68K Simulator](http://davesrocketworks.com/electronics/cpm68/simulator.html)
　　　※Musashiはgame用として開発されたらしい。
　　　※CP/M-68K Simulatorはシステムディスク(Ver1.2)を含め、起動に必要なものが一切合切入っている。
　インストールは上記ブログを参照すればいいといっても、同一ディレクトリに解凍するだけ。
　ファイルがダブっているのでSimulatorのファイルで上書き。
　後はmake一発でcpmsimが出来上がるので、之を実行すればよい。
　　※システムディスク(diskc.cpm.fs)は圧縮しているので、実行前に予め解凍しておく事。

　インストール、実行にはLinux環境が必要。
　　※頑張ればMingwでも動かせるらしい。
　しかしこれだけではデバックができないので、モニタ機能を追加した。
　モニタはcpmsim.cのメインルーチン中に記載している。
　モニタ追加後のソースを「[cpm68k_sim68k](https://github.com/hi631/tang-nano-9K/tree/master/cpm68k_sim68k)」に上げている。
![Image3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/7fd36195-a914-6c8a-82ac-6049ffbb7f52.jpeg)

# モニタ
　sim68K及びTN9K双方の環境で、デバッグ用のモニタが動作する。
  　※各々別々のソフトなので、似たようなコマンドでも動きが異なるので注意が必要。
　CPM動作中に、Ctrl+Qの押下でモニタが起動する。(Q0で起動禁止が可能)
　モニタ操作後、G(Ent)押下で元のプログラムに復帰する。
　デバッグ機能の中から、使いそうな機能を簡単に説明する。
　　G　　　　　　現在のPCから実行(Gxx PCをxxにして実行)
　　Gxx,yy　　　　xxから実行後、yy番地でブレーク停止。
　　　※ブレーク時に、sim68kでは実行前のpcを、TN9Kでは実行後のpcを表示。
　　Txx　　　　　pcの位置よりxxステップ、レジスタを表示しながら実行。
　　R　　　　　　現在のレジスタを表示
　　RP,RD,RAxx　　レジスタの値を変更(RP:pc RD:D0-7 RA:A0-7)
　　RMppwwaadd　ブレーク時等で表示するレジスタを選択(pp:pc類,aa:a7-a0,dd:d7-d0)
　　Axxxx　　　　　xxxxから逆アセンブル(Axxxx yyとか、A,なんてのも可)
　　Dxxxx　　　　　xxxxからメモリダンプ(Dxxxx yyも可)
　　Mxx,MWxx　　　xxからメモリ参照/変更、.(ピリオド)入力で終了。MWは2byte単位の動作。
　　Q　　　　　　　モニタを終了、Linuxに戻る(sim68Kのみ)


# モニタの開発環境
　TN9Kモニタ(mon68k)の主要部はCで書いたので、TN9K用のCコンパイラが必要となる。
　コンパイラは、sozobon2を利用。
　　◇「 [ＳＯＺＯＢＯＮ](https://sourceforge.net/projects/sozobon/)」コンパイラ
　　　　※From the old ATARI ST days, is Sozobon 2.0 the 68000 compiler.なんて書いてる。
　　　mon68kのフォルダをsozobon2のexamplesディレクトリ下に格納すればコンパイル可能となる。
　　◇ 「[cpm68k_mon68k](https://github.com/hi631/tang-nano-9K/tree/master/cpm68k_mon68k)」
　　　　モニタのソースリスト
　　◇ 「[cpm68k_optiontools](https://github.com/hi631/tang-nano-9K/tree/master/cpm68k_opttools)」
　　　　ツールに少し足りないものが有るので、追加のツール。
　　　　sozobonのbinディレクトリ下に下記toolのexeを追加。
　　　　　※追加しないと当然エラーになる。
　　mon68kのフォルダで'mmake_mon.cmd'一発でmon68kh.miが出来上がるので、src/gowin_prom下にコピーして置く。
　　　※モニタは$FF4000番地からなのに、リンカーが0番地から作ってしまうので、後ろの方だけを切り出して使用。
　tools/IP Core Generatorを起動し、Hard Module/Memory/Block Memory/pROMをダブルクリック。
　Assress Depth:に8192、Data Width:は16を記入。
　Memory initialization Files:に、先ほどのsrc/gowin_prom/mon68kh.miを選択する。
　OKを選択する事により、モニタがROMに取り込まれる。


# オプションツール
　bin2bin.exe　　　バイナリファイルの不要部分をカット。
　bin2mi.exe 　　　バイナリファイルを、TN9Kが読める形に変換。

　ソースと実行ファイルを[cpm68k_optiontools](https://github.com/hi631/tang-nano-9K/tree/master/cpm68k_opttools)に置いておく。
　怪しいバイナリファイルが嫌な場合は、ソースをMingw等でコンパイルして下さい。

# to16,to16w(ファイル転送補助ツール)
　オプションツールの一部だが、パソコン環境と68K環境とのデータ交換に使用。
  　※cpmtoolsで可能なはずだが、ファイルを頻繁に壊したので使用を断念。
　　　後から考えてみると、sim68k稼働中に書き換えたような気もする。
　to16(to16.68k)はCPMでコンパイル可能でありCPM上で動作させる。
　to16w(to16e.exe)はMingwでコンパイルしており、dos上で動作させる。
　何方もデーターを16進文字に変換、再変換を行う。これによりバイナリデータの相互転送を行う。
　双方の機能はほぼ同じだが主に、to16w -t -> to16 -i -> to16 -f のようにDOS -> CPMに使う事を想定。

　to16    -i file1 file2
　　操作画面上にコピペした文字を、file2に格納する。(file1はダミー)
　　入力文字はコピペ時に、RAMバッファ(1MB)に一端取り込まれ、Ctrl+Z押下でファイルに掃き出される。
　　　※これにより、TN9-68K上で115200bpsでの入力が可能。sim68K上では使う必要は無いだろう。
　to16(w) -t file1 file2
　　file1内のByteデータを16進2文字に変換し、file2に書き込む。
　to16(w) -f file1 file2
　　file1の16進2文字をByteデータに変換し、file2に書き込む。


# Ｃ
　TN9-68K上ではＣコンパイラを使うことが出来る。(当たり前の事だが)
　エディタなどを使いソースファイルを作成し、cc xxxx.c -o xxxx とやれば、xxxx.relが出来上がる。
　　※エディタとしてMicroEMACSが使えるが、スクロール中に矢印キーを押すと、ゴミを書込むので要注意。
![Image4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/ed95a42b-d48f-f317-5d9f-7ce338a48dde.jpeg)


# BASIC68K
　[ＰＩＣマイコンは面白い](https://piclabo.blog.ss-blog.jp/EnhancedBASIC) のサイトに Enhanced BASICについての記述が有る。
　CPMへインプリメントが記載されており、面白そうなので導入して見た。
　当初は動作不良となったが、TN9-68K側の不具合訂正で現在は正常動作する。

　不具合確認の過程で、調査の為にソース修正を行う必要が有った。
　しかし筆者が書かれて居るように、このままではエラーとなりアセンブル不可。
　エラー回避の方法も示してくれているが、当方環境ではエラーコードも異なり上手く行かなかった。
　そこで、ソースに下記訂正を加える事により、アセンブルが可能とした。
　Basic68k.s　84行　コメントアウト
　　削除　　　OFFSET	$400			* start of RAM
　　追加　*　　OFFSET	$400			* start of RAM
　Basic68k.s　352行　コメントを削除
　　削除　*　　ORG　　　$000400			* past the vectors in a real system
　　追加 　　　ORG　　　$000400
　　　※必ず一端削除してから、新規入力の事。コメント印削除だけではなぜかエラーに？。
　Basic68k.s　3768,3769行　コメントアウト
　　削除　　　CMPA.l　　(sp),a2　　　* compare the return address with expected
　　削除　　　BNE　　　LAB_UVER　　* if not create go do error or return null
　　追加　**　CMPA.l　　(sp),a2　　　　* compare the return address with expected
　　追加　**　BNE　　　LAB_UVER　　　* if not create go do error or return null
　　　※飛び先(LAB_UVER)がなぜか見えない？ので

　上記訂正を加えたソースをb68k.sだとすると、下記操作で実行可能なb68k.68kが出来上がる。
　C>to16 -i con b68k.s　　※ソースの読み込み(コピペ後Ctrl+Z押下の事)
　C>as68 b68k.s
　C>link68 b68k.o

　但し、b68k.68kはワークエリアがプログラムの想定とは異なる位置に定位しており、別の不具合が発生している可能性あり。
　正常な動作例として、ASCIIART.txtの実行結果を下記に示す。
　　※TN9-68Kのbasic上では115200bpsでの受信は無理なので、1ms程度のwaitを入れる事。
　実行時間は89Sec要しており、やっぱりあんまり早く無いな。
![Image4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/06fdbc4c-7e42-9fd2-3e2d-235e54d8059b.jpeg)

# CP/M-68Kの再構成
　CP/M-68KをTN9K等の実機にフィッテングするには、BIOSとBOOTプログラムの移行が必要となる。
　CP/M-68Kではシステムとしてサポートしており、下記のプログラムの変更を行えばよい。
　　1.simbios.s　BIOSで使用。
　　2.ldrbios.s　BOOTで使用。
　何れもCP/M-68Kディスクの'user 5'に存在するので、これをEMACS等で編集する。
　　※当方はEDを起動して、パソコンからコピペで流し込んだ。
　CPM.SYSの更進は'MAKECPM'を起動すれば、'user 5'のCPM.SYSが更新される。
　エラーが無ければ'CPCPM'を起動すれば、ディスクが更新される。
　ブートローダーの更新は'MAKELDR'の起動で行われる。
　　※システムディスクを書き換えるので要注意だが、正常に起動できない場合は、ディスク(ファイル)を元に戻せは回復できる。
　システムメモリ容量の変更は、'MAKECPM(MAKECPM.SUB)''CPCPM(CPCPM.SUB)'内の、-bオプションを変更する。
![Image6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/23d5705b-0d50-739b-2f88-c6edac2eac3e.jpeg)


# TN9-68Kが動作しなかった場合
　この場合、回路の動作波形を確認し、動作を検証するば自ずと原因は判明する。
　GowinにはAnalyzer Oscilloscopeという優れたツールが有り、ソフト操作で波形確認が可能。
　機能単位に各部の波形を確認する事により、障害部位を切り分け、不具合の原因を追究する。
　　※他社ツールでは、コンパイル後の信号の取り扱いが主眼の様で、信号選択できない事が多々ある。
　　　Gowinでは、コンパイル前の信号を選択するモードが有り、記載されている信号は常に使用可能。
　　　デバッグにはすこぶる便利であるが、コンパイル結果に与える遅延等の影響がちと心配。
　　※機能は万能では無く、信号が多く(50点位)なるとトリガが反応しなくなる気がする。
　　　デバッグのキーとなる信号を、見出す能力が必要。
　　　2K円程度の素子に、ハイスペックを求めるのはお門違いだと思う。

　◇68000としての動作を確認
　　w_cpu_addr、w_cpu_rdataをキャプチャ信号とし、U_j68/rstの立下りでトリガ。
　　68000及びROMが動作していれば、0番地からsp、4番地からpcの読出しが確認できる。
　　0-7番地からの読出しデータが、設定したROMデータと異なる場合は、ROMの設定不良。
　　　※之は外部にROMを置いた場合も同様に確認可能。
　　　※RAMのチェックの場合は、簡単なRWプログラムを走らせれば可能。
![reset1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/67c336a9-83d1-f76b-de62-94de9d089bcb.jpeg)

　◇microcodeの動作確認
  　0-7番地にアクセスしていない場合、microcodeの設定誤りか、リセット不良が考えられる。
　　pc_nxt、w_inst_in、cpu_addr、cpu_rdenをキャプチャし、U_j68/rstの立下りでトリガ。
　　microcodeのアドレスとデータが想定どおりか確認する。
![reset2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/7e37e764-f40b-1320-67bd-ac7154915fef.jpeg)

　こんな事を書かなくてもバッグのやり方位判っている方が大部分とは思うが。
　しかし外部に低速RAMを付けておいて動作しないのを、有用なツールが有るのに確認もせずに、一方的に当方の不良と言い張ってた方がおられたので、念のために簡単なデバッグ方法の例として明記しておきます。
　勿論、当方が完璧だなんて事も有り得ないので、不良にはオウンリスクで対処願います。


# 感想
　CP/M-68Kの稼働そのものは、比較的早く簡単に仕上がった。
　しかし簡単だっただけに、前回の積み残しが目に付き手直しに着手、そこからが長かった。
　まさか、68000coreが動作不良を起こしているとは思わなかったから。
　不具合箇所の発見の為の、デバック機能の強化等々の日々。納期が無いので気楽では有りますが。
　結局は完治に至って無いが、其処は素人細工と言う事でご容赦の程。何かの参考になれば幸いです。
　なお、上記記載内容は全て無保証であり、各自の責任においてご利用願います。