So-net無料ブログ作成
English Version

3チップ構成Pic24CPM68Kマイコン(CP/M-68K起動までの作業まとめ) [68K]

 今回作成した3チップ構成のワンボードマイコン(下の写真)でCP/M-68Kが動作しているようなのでCP/M-68Kを立ち上げるまでに必要な作業を整理しました。

 使用しているチップは下記のとおり、3チップ構成で汎用ロジックICやPLD等は使っていません。
  • MC68008P10
    10MHz版のバスが8bit幅の68Kチップ。PICからクロックを供給する関係で8MHzで動作。
  • K6T4008C1B-DB70
    512KBのSRAM。アクセスタイムは70ns。
  • PIC24FJ64GA004
    16bitPICマイコン。セルフコンパイラの独自言語picleを使って制御

Pic24CPM68K

  1. 事前にダウンロードするもの

    1. 今回作成したPic24CPM68K用のファイル
       PICファーム全体のhexファイル(これを書込めばPIC側の準備は完了)とIPL、bios等のCP/M関連のソース等をアーカイブした下記のファイルをダウンロードする。

    2. cpmtools
       the Wonderfully Ancient World of CP/Mのサイトでhttp://www.cpm8680.com/cpmtools/cpmtoolsWin32.zipのリンクからダウンロード

    3. CP/M-68K関連ファイル
      CP/M-68K Ver1.3のファイルは下記から入手しました。
    4. DD for Windows
       作成したCP/MディスクイメージをSDカードに書込むユーティリティ
       DD for Windowsからダウンロード。
      ※2018/05/12現在での最新版はVer.0.9.9.8です(これを使用しています)


  2. PIC24FJ64GA004側の準備
    • ワンボードマイコン基板
       回路図は下記のとおりです。詳細は「3チップ構成68Kマイコンの構想(その11)回路図整理とパターン設計」の記事を参照してください。
       SDカードホルダはebayで購入したものを使っていますが、秋月電子通商さんで販売している「SDカードコネクタ SD381200-S304」も使えると思います。

       今回作成したプリント基板のガーバーデータをseeedさんの「Fusion gallery」の「Geek product」コーナーで公開しました。
      CP/M-68K board consisting three chips

      3チップ構成の68Kマイコンボードの回路図
      ※R3は+5Vにプルアップするつもりでしたが3.3Vへのプルアップでも動作することを確認しました^^;

    • PICのファーム
       上記でダウンロードしたファイルのPICディレクトリ直下のhexファイルをPIC24FJ64GA004に書き込めば準備完了です。

      1. PICにPICKIT3等で書込みを行う場合はPL2コネクタに接続してください。
         書込み時に使用するピンはSDカードと兼用しているので、SDカードを抜いた状態で書込んでください(68Kやメモリは挿した状態でOKです)。
         書込み器を接続した状態ではSDカードのアクセスエラーが発生するので、書込み器を外してからCP/Mを起動してください。

      2. 68Kとの連携処理等はpicle言語で記述していて、自動起動状態にしているので電源ONでCP/Mが起動します。

      3. cpmディレクトリに入っている「EXIT.68K」をCP/M上で起動するとCP/Mから抜けてpicleコンパイラの世界に戻ります(runコマンドでCP/M再起動)

      4. picleのソースもpic用hexファイルに入れてあるのでセルフコンパイル環境で機能変更が可能です。
         picleソースの表示方法やpicleの使用方法については「独自言語 picle on PIC24FJ」や「独自言語 picle compiler on PIC24FJ」を参照してください。

      5. TeraTermのシリアル設定は38400bps、8bit、Parity無しです。

      6. SDカードの抜き差しをPICが監視しています。抜いた状態ではERSDのLEDが点滅します。SDカードを抜いてから挿入するとSDカードを再度イニシャライズ(保存データは消えない)するので継続してSDカードのアクセスが可能です。

      7. 「OPE」スイッチでコンソールのエスケープシーケンスの有効/無効を切り替えられます。
         無効にした場合、PIC側の処理でコンソールデータの書換えが発生しないのでコンソール用シリアル通信でバイナリデータの透過性が保証できるようになります(バイナリデータ転送時に利用)。


  3. ディスクイメージの作成
     ダウンロードしたcpmtoolsを展開したフォルダにPic24CPM68K用アーカイブ内にあるdiskdefs、cpmboot.img及びsysgen68.batファイルを置きます。
     上記でダウンロードしたCP/M-68K Ver1.3のアーカイブ内にある「DISK1」~「DISK9」のフォルダをcpmtoolsを展開したフォルダ直下にコピーします。
     DISK1フォルダにはPic24CPM68K用アーカイブ内にあるCPM.SYSを上書きでコピーします。
     sysgen68.bat内を見れば判るように「DISK10」(Jドライブ)までのファイルイメージを作成するようになっているのでDISK10のフォルダを作成し、Pic24CPM68K用アーカイブ内にあるSKED.RELやEXIT.68K(その他、CP/MのJドライブに入れたいファイル)を「DISK10」フォルダに入れます。
     DISK1~DISK10までのフォルダの準備ができたら、sysgen68を実行すると「diskimage」というファイルが生成されます。


  4. SDカードへの書込み
     SDHCタイプ(2GBより大きく32GB以下)のSDカードに、上記操作で作成した diskimage を DD for Windows で書き込みます。
     SD書込みソフトは実行ファイルを右クリックして表示されるポップアップメニュで「管理者として起動」を選択して起動する必要があります。


  5. CP/Mの起動
     上記で作成したSDカードを入れた状態で電源を入れれば、自動的にCP/Mが立ち上がります。
     ダウンロードしたPic24CPM68Kファイルに入っている「EXIT.68K」を実行することで、CP/M-68Kから抜け、PIC上のpicleコンパイラの環境に戻ります。


★2019/07/07 追記 {
 Pic24CPM68Kのアーカイブファイルに入れた方が良かったかもと後で思いましたが、CP/M-68Kとパソコン間でファイル送受信したい場合には「3チップ構成68Kマイコンの構想(その10)XMODEMアプリの作成」の記事に書いた拙作のCP/M-68K用のxmodemアプリを使用するとメチャ便利です。パソコン側ではTeraTermのxmodem機能を使います。
 コンソール出力はPIC側でCP/M時代のエスケープシーケンスの一部をANSIエスケープシーケンスに変換しているのでTeraTermのディフォルトターミナルであるVT100でもWordMasterやWordStarが動きます。
 しかし、このためにコンソール出力データがPICの変換処理で変更されてしまい、バイナリデータの透過性が保証されません。

 Pic24CPM68KではBIOSの汎用入出力(CP/M-80で言うPUN/RDRデバイス)をコンソール用のシリアルを使い、バイナリデータの透過性を保証できるように実装しているので xmodem 使用時に /p のオプションを付けることでファイル送受信をバイナリ透過性のある汎用入出力で行えます。
 また、Pic24CPM68KのOPEスイッチを押すことで上記のPIC側でのエスケープシーケンス変換を有効/無効に切り換えれるのでxmodem使用時に変換処理を無効状態にして /p オプション無しで使うことも可能です。
}

★2019/07/08 追記
 上記の「WordMasterやWordStarが動きます」はCP/M-80(Pic24CPM)での話です^^;
 Pic24CPM68Kでも同様にエスケープシーケンスの変換処理が実装されています。


【参考リンク】
 下記のwebサイトを参考にさせて頂きました。



[TOP] [ 前へ ] 連載記事 [ 次へ ]

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

3チップ構成68Kマイコンの構想(その15)ケース作成 [68K]

 CP/M-68Kが動く3チップ構成のプリント基板が完成してからかなり時間が経ってしまいましたがケースを作りました。
 構造的にはZ-80版の時に「3チップ構成Pic24CPMマイコン(その2)ケース作成」の記事で書いたものと同様ですが、基板のサイズが小さくなっているのでケース自体も少し小さくなりました。
 トップパネルは前回同様に百均で購入したスチロール製のディスプレイスタンドから平板を切出して CNC で加工しています。

 設計はDesignSparkMechanicalを使っています。

Pic24CPM-68Kのケース設計


 バックパネルは黒のアクリル板をレーザーカッターで切り出しました(レーザーカッターは静かでカット中は待つだけなので楽)。

レーザーカッターでアクリル板を切り出し中

★2019/06/08 追記
 レーザーカッター加工写真追加

 側面部品は3Dプリンタで出力しました。

ケース側面部品とバックパネル


 トップパネルは前述したようにCNCで切削しています。DesignSparkMechanicalからDXFファイルをexportし、Estlcamで読込みNCファイルを作成しています。

CNCで切削中の画面


 CNCでの切削は1時間15分程度かかり、切削中は適宜潤滑油「切削」を供給する必要があり、音も出るので大変です。
 切削したトップパネルが下の写真です。

トップパネル


 Pic24CPM68Kのプリント基板を収めた完成写真が下の写真です。Pic24CPMの時は赤色基板で側面の黒とマッチしていると思っていましたが、今回の基板は青色ですがこれもまた中々いい感じですね^^

Pic24CPM68Kケース完成写真



[TOP] [ 前へ ] 連載記事 [ 次へ ]

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

3チップ構成68Kマイコンの構想(その14)スクリーンエディタの開発 [68K]

 ソフトが豊富なCP/M-80とは違いCP/M-68Kはインターネットからダウンロードできるソフトはそれ程豊富ではありません。
 CP/Mのラインエディタ(ED)はあまり使い勝手が良くないので使い易いエディタが欲しくなります。

 CP/M-68K用のマイクロEmacsが入手可能ですがWordStar系のエディタが欲しいところです。ZDEもCP/M-68Kには対応していないようです・・・

 ネットで探すとCP/M-68K用のエディタのソースがいくつか見つかりますが、ソースファイル数が多くてCP/Mのコマンドライン内でリンクできなかったり(ライブラリアンを使ってリンクしたという記事もあった)、ビルドはできてもうまく動かなかったりでソースを解析して動くようにするよりは、エディタを作ってみようという結論に達しました^^

 ということでCP/M-68K Ver1.3のCコンパイラ環境を使ってスクラッチでスクリーンエディタを作り、sked(Simple Kitten EDitor)と命名しました^^
 ターミナルはTeraTermを想定し、VT100のエスケープシーケンスの一部を使い制御しています。
 エディタ内のデータ構造や処理方法について書いておこうかとも思いましたが、あまり興味をひかない内容と思われるので割愛しますw

 今時、TeraTermで接続したCP/M-68Kボードを動かす人はほとんどいないと思うので必要とする人は少ないでしょうが、シンボル情報が含まれるリロケータブル形式のものを公開します。

 reloc sked.rel sked.68k

の操作でシンボル情報を取り除いたコンパクトな実行ファイルに変換できます。
 typeコマンドの代わりにviewerとしても使えるのでコンソール接続のCP/M-68Kが動く環境を持っている人にとってはそれなりに便利だと思います。

 現時点で実装しているコマンドに関しては下のヘルプを表示中の画面キャプチャを参照してください。

help表示状態の画面


 ダウンロードはこちらからどうぞ(商用利用以外であれば自由に使用できます)
  • sked68k_v001f.zip
    ★2019/04/08 V0.01f 新規ファイル中断時に新規ファイルが残らないようにした ★2019/04/06 v0.01d ファイル内のコントロールコードを表示
    ★2017/12/19 v0.01b help表示の誤記修正
    ★2017/12/17 v0.01a ステータス表示部分を改善

★2018/12/14 追記
 twitterにアップした操作動画付きツイートを貼っておきます。
 Win10の画面録画機能?で保存していますが、ウィンド内表示の上下がカットされるため、TeraTermを26行に設定して録画したので表示中の最下端の行の表示はゴミです。(skedは 80文字x24行 の画面で動作します)


★2019/01/12 追記
 WordStarのコマンドライクなスクリーンエディタがCP/M-68K上で使えるようになったのでライフゲームを動かしてみました。
 実行ファイルとソースは下記からダウンロードできます。(★2019/01/13 定常状態の検出ロジックを強化しました)

 実行ファイルはシンボル情報の入ったリロケータブル形式(rel形式)になっているので

reloc life68.rel life68.68k

でシンボル情報のないコンパクトな実行ファイルに変換できます。

LifeGame on CP/M-68K


★2019/02/11 追記
 CP/M-68K用に開発したxmodemアプリを下記のURLで公開しています。
 TeraTermのxmodem機能を使ってファイルの送受信が可能になります。
3チップ構成68Kマイコンの構想(その10)XMODEMアプリの作成


[TOP] [ 前へ ] 連載記事 [ 次へ ]
nice!(0)  コメント(3) 
共通テーマ:趣味・カルチャー

3チップ構成68Kマイコンの構想(その13)プリント基板完成 [68K]

3チップ構成68Kマイコンの構想(その11)回路図整理とパターン設計」の記事に書いたように今回は最初からCNCでのプリント基板製造は諦め、プリント基板製造業者に製造を依頼することにしました。

 10/8にポチリ、10/24に到着しました。
 仕上がり具合は特に問題なく、綺麗に作って貰っています。
 今回は青色のソルダレジストにしてみました。トラック幅はCNCで切削し易い設定のままなので太めですw

PCB Top side



PCB Bottom side


 早々に部品を実装してみましたが、CP/Mが立ち上がりません・・orz
 「3チップ構成68Kマイコンの構想」の記事で書いたような簡単なプログラムは動作しましたが、メモリの末尾(0x0007fc00)を使ったPICと68Kとのデータの受け渡しができていないようです・・
 簡易的なモニタプログラムを作成して確認してみようかとも思いましたが、PICと68Kとのパラメータ渡しが出来ていない(メモリの先頭ではokのようですが、どの範囲がNGなのか不明)ので68Kからコンソール入出力ができないため、メモリ編集機能を実装することもできません・・・

 そこでこんなプログラムを作成してみました。
  1. 0x001000~0X07FF00の範囲で0x0100毎にメモリアドレスを書込む。(例 0x001800には0x00001800が書き込まれる)
  2. 次に0x001000~0X07F000の範囲で0x1000毎にメモリに書き込まれたアドレス値を拾い、0x0100からのメモリ領域に書き込む。
  3. 0x0100からのメモリ内容を調べることで68Kのメモリアクセス状況を確認する。また、PIC側からメモリダンプを調べることで68Kとのアクセスアドレスが一致しているかを確認する。(※確認は人手で行う)


 68K側のプログラムはこんな感じです。EASy68Kを使用しています。

メモリ確認用68Kプログラム
00000380 Starting Address Assembler used: EASy68K Editor/Assembler v5.16.01 Created On: 2018/10/28 0:31:53 00000000 1 * as68 -P -S c: SrcFile -O ObjFile 00000000 2 * lo68 [-S] -Ztext_address -Ddata_addressObjFile -O OutFile 00000000 3 00000000 4 * text 00000000 5 00000380 6 org $0380 00000380 7 00000380 203C 00001000 8 START: move.l #$1000,d0 * start adr 00000386 2600 9 move.l d0,d3 * save para 00000388 223C 00000100 10 move.l #$00000100,d1 * inc width 0000038E 243C 00080000 11 move.l #$00080000,d2 * end adr 00000394 2040 12 loop: move.l d0,a0 00000396 2080 13 move.l d0,(a0) 00000398 D081 14 add.l d1,d0 0000039A B082 15 cmp.l d2,d0 0000039C 66F6 16 bne loop 0000039E 17 0000039E 227C 00000100 18 move.l #$0100,a1 * result save area 000003A4 2003 19 move.l d3,d0 000003A6 2203 20 move.l d3,d1 * inc:$1000 000003A8 2040 21 loop2: move.l d0,a0 000003AA 22D0 22 move.l (a0),(a1)+ 000003AC D081 23 add.l d1,d0 000003AE B082 24 cmp.l d2,d0 000003B0 66F6 25 bne loop2 000003B2 26 000003B2 60FE 27 bra * 000003B4 28 000003B4 29 end START No errors detected No warnings generated SYMBOL TABLE INFORMATION Symbol-name Value ------------------------- LOOP 394 LOOP2 3A8 START 380


 アセンブルしてできたSレコードファイルをバイナリ変換し、picleのステートメントに自動変換後、picleソースに埋め込み、実行した結果は次のとおりでした。


picleソースに埋め込み実行した結果
:l 1:# 3chips MC68008 OneBoard test 2018/10/27 2:# by skyriver 3: 4:use LibCpm; 5:use LibSpi; 6: 7: 8:proc main() { 9: var adr; 10: init(); 11: initPmp(); 12: initSpi(); 13:# initSd(); 14: 15: LATA[-2]=LATA[-2]&$fffc; # on reset:a0 halt:a1 16: 17: PmpOn(); 18: PmpSetAdr(0); 19: MemWr($00); # stack 20: MemWr($02); 21: MemWr($00); 22: MemWr($00); 23: MemWr($00); # PC 24: MemWr($00); 25: MemWr($03); 26: MemWr($80); 27: 28: adr = $0380; # 68K's ADR:00000380 29: PmpSetAdr(adr); 30: 31: MemWr($20); 32: MemWr($3c); 33: MemWr($00); 34: MemWr($00); 35: MemWr($10); 36: MemWr($00); 37: MemWr($26); 38: MemWr($00); 39: MemWr($22); 40: MemWr($3c); 41: MemWr($00); 42: MemWr($00); 43: MemWr($01); 44: MemWr($00); 45: MemWr($24); 46: MemWr($3c); 47: MemWr($00); 48: MemWr($08); 49: MemWr($00); 50: MemWr($00); 51: MemWr($20); 52: MemWr($40); 53: MemWr($20); 54: MemWr($80); 55: MemWr($d0); 56: MemWr($81); 57: MemWr($b0); 58: MemWr($82); 59: MemWr($66); 60: MemWr($f6); 61: MemWr($22); 62: MemWr($7c); 63: MemWr($00); 64: MemWr($00); 65: MemWr($01); 66: MemWr($00); 67: MemWr($20); 68: MemWr($03); 69: MemWr($22); 70: MemWr($03); 71: MemWr($20); 72: MemWr($40); 73: MemWr($22); 74: MemWr($d0); 75: MemWr($d0); 76: MemWr($81); 77: MemWr($b0); 78: MemWr($82); 79: MemWr($66); 80: MemWr($f6); 81: MemWr($60); 82: MemWr($fe); 83: 84: PmpOff(); 85: dump(0); 86:# dump(adr); 87: 88: BusRelease(); 89: LATA[-2]=LATA[-2]|$3; # off reset:a0 halt:a1 90: 91: Timer_=10; 92: while (Timer_) {} # 100ms wait 93: 94: LATA[-2]=LATA[-2]&$fffc; # on reset:a0 halt:a1 95: PrnStr_( "\n-------" ); 96: dump(adr); 97: PrnStr_( "\n-------" ); 98: dump($0100); 99: dump($0180); 100: dump($0200); 101: dump($0280); 102: PrnStr_( "\n-------" ); 103: dump($0400); # 68K's adr:0007fc00 104:} :run 0000 : 00 02 00 00 00 00 03 80 00 00 4D E0 00 00 4D E4 0010 : 00 00 4D E8 00 00 4D EC 00 00 4D F0 00 00 4D F4 0020 : 00 00 4D F8 00 00 4D FC 00 00 4E 00 00 00 4E 04 0030 : 00 00 4E 08 00 00 4E 0C 00 00 4E 10 00 00 4E 14 0040 : 00 00 4E 18 00 00 4E 1C 00 00 4E 20 00 00 4E 24 0050 : 00 00 4E 28 00 00 4E 2C 00 00 4E 30 00 00 4E 34 0060 : EE 28 41 85 9E 4D AA 06 BA 69 2F 1D D6 1B 03 AE 0070 : F7 2B AC FB 37 6A 10 BE 0B 03 1F 12 17 FC 3C 6C ------- 0380 : 20 3C 00 00 10 00 26 00 22 3C 00 00 01 00 24 3C 0390 : 00 08 00 00 20 40 20 80 D0 81 B0 82 66 F6 22 7C 03A0 : 00 00 01 00 20 03 22 03 20 40 22 D0 D0 81 B0 82 03B0 : 66 F6 60 FE FE 00 72 7F 24 D8 51 C9 FF FC 52 40 03C0 : 51 CA FF E8 4E D3 0D 2E 2E 2E 20 6C 6F 61 64 69 03D0 : 6E 67 20 00 02 41 00 FF 00 41 03 00 32 81 4E 70 03E0 : 4E 75 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03F0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ------- 0100 : 00 00 10 00 00 00 20 00 00 00 30 00 00 00 40 00 0110 : 00 00 50 00 00 00 60 00 00 00 70 00 00 00 80 00 0120 : 00 00 90 00 00 00 A0 00 00 00 B0 00 00 00 C0 00 0130 : 00 00 D0 00 00 00 E0 00 00 00 F0 00 00 01 00 00 0140 : 00 01 10 00 00 01 20 00 00 01 30 00 00 01 40 00 0150 : 00 01 50 00 00 01 60 00 00 01 70 00 00 01 80 00 0160 : 00 01 90 00 00 01 A0 00 00 01 B0 00 00 01 C0 00 0170 : 00 01 D0 00 00 01 E0 00 00 01 F0 00 00 02 00 00 0180 : 00 02 10 00 00 02 20 00 00 02 30 00 00 02 40 00 0190 : 00 02 50 00 00 02 60 00 00 02 70 00 00 02 80 00 01A0 : 00 02 90 00 00 02 A0 00 00 02 B0 00 00 02 C0 00 01B0 : 00 02 D0 00 00 02 E0 00 00 02 F0 00 00 03 00 00 01C0 : 00 03 10 00 00 03 20 00 00 03 30 00 00 03 40 00 01D0 : 00 03 50 00 00 03 60 00 00 03 70 00 00 03 80 00 01E0 : 00 03 90 00 00 03 A0 00 00 03 B0 00 00 03 C0 00 01F0 : 00 03 D0 00 00 03 E0 00 00 03 F0 00 00 04 00 00 0200 : 00 04 10 00 00 04 20 00 00 04 30 00 00 04 40 00 0210 : 00 04 50 00 00 04 60 00 00 04 70 00 00 04 80 00 0220 : 00 04 90 00 00 04 A0 00 00 04 B0 00 00 04 C0 00 0230 : 00 04 D0 00 00 04 E0 00 00 04 F0 00 00 05 00 00 0240 : 00 05 10 00 00 05 20 00 00 05 30 00 00 05 40 00 0250 : 00 05 50 00 00 05 60 00 00 05 70 00 00 05 80 00 0260 : 00 05 90 00 00 05 A0 00 00 05 B0 00 00 05 C0 00 0270 : 00 05 D0 00 00 05 E0 00 00 05 F0 00 00 06 00 00 0280 : 00 06 10 00 00 06 20 00 00 06 30 00 00 06 40 00 0290 : 00 06 50 00 00 06 60 00 00 06 70 00 00 06 80 00 02A0 : 00 06 90 00 00 06 A0 00 00 06 B0 00 00 06 C0 00 02B0 : 00 06 D0 00 00 06 E0 00 00 06 F0 00 00 07 00 00 02C0 : 00 07 10 00 00 07 20 00 00 07 30 00 00 07 40 00 02D0 : 00 07 50 00 00 07 60 00 00 07 70 00 00 07 80 00 02E0 : 00 07 90 00 00 07 A0 00 00 07 B0 00 00 07 C0 00 02F0 : 00 07 D0 00 00 07 E0 00 00 07 F0 00 97 54 9F D4 ------- 0400 : 00 03 FC 00 00 00 00 00 00 07 FC 22 00 01 27 E8 0410 : 00 00 00 00 60 36 00 00 00 00 00 00 00 00 00 01 0420 : 00 01 00 07 FC 58 00 01 09 58 FF F7 00 01 00 00 0430 : 00 07 FC 4A 00 01 27 E8 00 00 00 00 60 36 00 00 0440 : 00 00 00 00 00 00 00 01 00 01 2E F0 00 01 44 70 0450 : FF F7 17 72 FF FF 00 00 00 01 63 BA 00 01 4C F7 0460 : 00 07 FC 98 00 01 2D B2 00 07 FC 78 00 01 63 BB 0470 : 00 08 00 00 00 01 4C F0 61 36 58 58 00 01 2E F0 :


 上の0x0100部のダンプリスト内容から68K側からのメモリアクセスは特に問題無いようです。
 0x0400部(実メモリ上のアドレスは0X0007fc00)のダンプ結果からPICからの0X07fc00のアクセスはA18がhighにならずlowの状態(結果0x0003fc00が読める)のようです。

 だいぶ状況が判ってきました^^
 次にシンクロでA18がhighになった状態の電圧レベルを確認しました(リファレンスとしてA16と比較)
 黄色がアドレス信号で紫色はトリガを取るためのBG/信号です。

A16の信号波形 A18の信号波形


 A16ももう少し高い電圧の方がいいのですが(今回は回路を限界的に簡略化しているのでこれでOKとします・・LEDの数は多めだけどw)、A18は明らかに電圧が低くなっています・・・・

 ボードから電源を抜いた状態でA18とGND間の抵抗を計ってみると2.6Kほどでした(他のアドレス線は15K程度)
 一応、半田付け状態も確認しましたが、問題なさそうだったのでメモリを抜いてみると抵抗が他のアドレス線と同じ15K程度になりました。

 このことからメモリチップが原因である可能性大です。今回使用している512KBのメモリは2個しか持っていないのでブレッドボードで使っているメモリを抜いてPCBに付けてみたところ無事にCP/M-68Kが立ち上がりました(^^)/

 消費電流を計ってみたところ、CP/M起動状態での通常時は170mA、SDカードアクセス時に190mA程度でした。
 通常時(キー入力待ち状態)は68KはバスをPICに引き渡して何もしていない状態ですが、使用しているMC68008P10はHMOSプロセスで製造されてるので消費電流はスイッチング速度によらず一定です。

 最後にCP/M-68Kが動作中のボード写真を貼っておきます^^
 メモリはブレッドボードで使用していたものに交換したのでピン番号と信号名の書かれた紙が貼ってありますw

CP/M-68K動作中の写真


★2018/11/03 追記
 「3チップ構成68Kマイコンの構想(その11)回路図整理とパターン設計」の回路図で
  • PL3
    1-2 の接続を解除
  • PL4
    1-2 -> 2-3 にジャンパピン変更

にジャンパピンを変え、PICの31ピンから16MHzが出力されるようにconfigを変更、更にバスリクエスト(BR/:low)時にBG/チェックをしなようにPIC側のソフトを変更することで、MC68008P10(10MHz版)への供給クロックを16MHzにしてみました。

 この状態でCP/M-68Kを起動したところ、Cold Boot Loaderが出力している「...booting」が表示された後、「ERAC」のLEDが点灯(メモリ実装外のアドレスをアクセス)して反応がなくなりました^^;
 (メモリのアクセスタイムは70nsなので大丈夫だと思いますが)やはり68Kの10MHz版では16MHz動作は厳しいようです。


★2018/12/04 追記
 ebayで注文していた512KBのSRAMが届いたのでブレッドボード用にラベルの付けたメモリからラベル無しのものに交換しました。
 記念として撮った写真を貼っておきます。TOP面のR23がDCジャックと若干干渉気味ですがDCジャック用の丸穴が大きめなので位置調整で何とか入りそう(若干削るといいかも^^;)
 初期バージョンとしてはまぁまぁのできではないでしょうか?

Pic24CPM68K部品実装写真(top面)


Pic24CPM68K部品実装写真(bottom面)


[TOP] [ 前へ ] 連載記事 [ 次へ ]

nice!(0)  コメント(2) 
共通テーマ:趣味・カルチャー

3チップ構成68Kマイコンの構想(その12)Blocking/Deblocking [68K]

 前回の記事でプリント基板化のためのパターン設計について書きましたが、プリント基板製造をSeeedさんに注文し待ち状態です^^

 今回はCP/M-68KのSDカードアクセス時のブロッキング/デブロッキング処理を追加しました。
 3チップ構成のCP/M-80の時はCP/Mのメモリサイズを最大の64KBにしたいこともあってSDカードアクセス処理でブロッキング/デブロッキング処理には対応していませんでした。
 今回のCP/M-68KではBIOSのメモリサイズをあまり気にしなくてもいいこと、及びコマンドのサイズがCP/M-80と比較して大きめなのでコマンド実行時に少し待ち時間が発生してしまうのでブロッキング/デブロッキング処理に対応しました。

 SDカードのブロック長は512バイトなのでCP/Mのセクタ(128バイト)の4つ分に該当します。
 今回の対応で変更したワークエリアは
  1. PICと68K間のSDデータ渡し用の領域(SDバッファ)を128バイトから512バイトに変更
  2. SDバッファ内のデータがSDに書き込み済みでない場合の変更フラグを追加
  3. SDバッファの属性としてsector番号での管理をSDのブロック番号の管理に変更

の変更を行いました。

 BIOS内のWriteSectorコール時にD1レジスタに下記の情報が渡されます。
  1. d1.w = 0 : normal write
  2. d1.w = 1 : write to a directory sector
  3. d1.w = 2 : write to first sector of new block

 WriteSector処理での追加処理としては最初にSDバッファがヒット(今回の書込みセクタが含まれている)場合はSDの先読みは不要で含まれていない場合は変更フラグがオンならSDバッファをSDに書き込み後、先読みが必要か判断します。
 3)の場合は先読み不要でそれ以外の場合は先読みが必要になります。
 DMAの内容をSDバッファに書き込み、変更フラグをオンにし、2)の場合は即座にSDバッファ内容をSDに書き込みます(変更フラグはオフにする)。

 ReadSector処理に関してはSDバッファにヒットしている場合はSDバッファからセクタ内容を読み取り、ヒットしない場合は変更フラグがオンの場合SDバッファを書込んだ後、必要なSDブロックの内容をSDバッファに読込みます。
 SDバッファにヒットした場合、変更フラグがオンでもSDへの書込みは不要ですが、今回は長時間変更フラグがオンになる(その間、電源断等が発生すると書込み情報が失われる)のを避けるため、ReadSector処理ではありますがSDへの書込みを行うようにしました。

 文章で書くと少しややこしいですが、プログラム的には若干の追加で対応可能です。
 (ワークエリアはSDバッファが4倍に増えるけどプログラムコードのサイズはあまり増えない)

 参考に今回対応したBIOSのReadSectorとWriteSectorの部分の抜粋を以下に貼っておきます。

BIOS内ブロッキング/デブロッキング処理
212 * caliculate sector number 213 * d2 -> logical sector number in buffer 214 * d3 -> SD block No 215 CalSdSec: 216 0000017A 4283 clr.l d3 217 0000017C 363900000002 move.w track,d3 218 00000182 ED8B lsl.l #SEC_TR_SFT,d3 219 00000184 4282 clr.l d2 220 00000186 343900000004 move.w sector,d2 221 0000018C D682 add.l d2,d3 222 0000018E 2403 move.l d3,d2 223 00000190 028200000003 andi.l #$03,d2 * logical sec in buffer 224 00000196 E48B lsr.l #SD_SFT,d3 225 00000198 4E75 rts 226 227 * read sector 228 * d0.w -> 0:no error, 1:error 229 read: 230 0000019A 610000A8 bsr flush * if no error then d0.w=0 231 0000019E 66000038 bne rdend * if error 232 000001A2 61D6 bsr CalSdSec 233 000001A4 B6A90002 cmp.l OSdSec(a1),d3 234 000001A8 67000014 beq rd010 * if hit buffer 235 236 000001AC 12BC0004 move.b #FC_READ,(a1) 237 000001B0 23430002 move.l d3,OSdSec(a1) 238 000001B4 4E70 reset 239 000001B6 30290006 move.w ORetVal(a1),d0 * get return val 240 000001BA 6600001C bne rdend * if error 241 242 000001BE C4FC0080 rd010: mulu #SEC_SIZE,d2 243 000001C2 D4BC0007FE00 add.l #PICDMA,d2 244 000001C8 2042 move.l d2,a0 245 000001CA 247900000006 move.l dma,a2 246 000001D0 747F moveq #(SEC_SIZE-1),d2 247 000001D2 14D8 rdcpy: move.b (a0)+,(a2)+ * DMA is able to be odd 248 000001D4 51CAFFFC dbf d2,rdcpy 249 000001D8 4E75 rdend: rts 250 251 252 * write sector 253 * d1.w <- 0:normal write 1:directory write 2:write to first sector of new block 254 * d0.w -> 0:no error, 1:error 255 write: 256 000001DA 4280 clr.l d0 * set no error value 257 000001DC 619C bsr CalSdSec 258 000001DE B6A90002 cmp.l OSdSec(a1),d3 259 000001E2 67000024 beq wr010 * if hit buffer 260 261 000001E6 6100005C bsr flush 262 000001EA 66000056 bne wrend * if error 263 264 000001EE 23430002 move.l d3,OSdSec(a1) 265 000001F2 B27C0002 cmp.w #2,d1 266 000001F6 67000010 beq wr010 * if new block 267 268 000001FA 12BC0004 move.b #FC_READ,(a1) 269 000001FE 4E70 reset 270 00000200 30290006 move.w ORetVal(a1),d0 * get return val 271 00000204 6600003C bne wrend * if error 272 273 00000208 C4FC0080 wr010: mulu #SEC_SIZE,d2 274 0000020C D4BC0007FE00 add.l #PICDMA,d2 275 00000212 2042 move.l d2,a0 276 00000214 247900000006 move.l dma,a2 277 0000021A 747F moveq #(SEC_SIZE-1),d2 278 0000021C 10DA wrcpy: move.b (a2)+,(a0)+ 279 0000021E 51CAFFFC dbf d2,wrcpy 280 281 00000222 13FC000100000001 move.b #1,ChgFlg * set change flag 282 0000022A B27C0001 cmp #1,d1 283 0000022E 66000012 bne wrend * if not directory wite 284 285 00000232 423900000001 clr.b ChgFlg 286 00000238 12BC0005 move.b #FC_WRITE,(a1) 287 0000023C 4E70 reset 288 0000023E 30290006 move.w ORetVal(a1),d0 * get return val 289 00000242 4E75 wrend: rts 290 291 292 * flush disk 293 * d0.w -> 0:no err, $ffff:cann't flush 294 00000244 4240 flush: clr.w d0 295 00000246 103900000001 move.b ChgFlg,d0 296 0000024C 67000012 beq flend 297 00000250 423900000001 clr.b ChgFlg 298 00000256 12BC0005 move.b #FC_WRITE,(a1) 299 0000025A 4E70 reset 300 0000025C 30290006 move.w ORetVal(a1),d0 * get return val 301 00000260 4E75 flend: rts 302 303


 ブロッキング/デブロッキング対処後の動作例として「XMODEMアプリの作成」の記事で載せたxmodemでのファイル送信中のロジアナ波形のbefore/Afterを貼っておきます。

Before


 対処後は下図の赤丸部分に示すようにSDカードのアクセス回数が減少しています。

After


★2018/10/17 追記
 コメントに書いたようにCP/MからBIOSのWriteSectorには新たに確保したブロックの最初のセクタ書込み(D1レジスタ=2)であるという情報が渡されています。
 今回はCP/Mのブロックサイズを2048バイトにしているので、この情報からSDカードの4ブロック分(SDカードのブロックサイズは512バイト)、先読み無しで書込んでも問題ないはずなので改善してみました。
 ワークエリアとして新たに先読み不要カウンタと先読み無しで書込んだブロック番号の保存用ワークを追加して、念のためにSDカードのブロック番号が連番であることも確認するようにしています。
 また、ワークエリアを絶対アドレス指定でアクセスするとコード効率が悪くなるのでアドレスレジスタとのオフセットでアクセスするように一部変更しました。

 CP/Mの2ブロック分をバイナリモードで単純に書き込むテストプログラムを作りSDカードへの書込み動作を確認してみました。新規ファイルへの書込み動作のみを確認するためにファイルオープン後の書込み開始前と書込み終了後のファイルクローズ前にキー入力処理を入れることでファイルへの書込み中の波形をロジアナで確認しました。

 下のキャプチャがロジアナ波形のBefore/After比較になります。

 対処前はCP/Mブロックの最初の書込みだけ先読みがない状態なのでSDへの書込みの4回に3回は先読みが発生しています。

Before


 改善後は新規書込みの場合、常に先読み無しでSDカードへの書込みが行われていて想定通りの動作になっています。

After


 今回、CPM.SYSを何度か変更して評価するにあたり、CP/M-68Kで採用されているCP/Mローダのおかげで、AドライブのCPM.SYSファイルを入れ替えてCP/Mを再立ち上げするだけでいいので効率的に作業が出来ました。

 CP/Mのファイルセットに含まれているサイズが大きめのDDT68000.68K(431セクタ、54KB)のファイルをpipコマンドで空ディスクにコピーする時間を計ってみたところ 5.2秒から4.9秒に改善されました(あまり変わらないですねw)


[TOP] [ 前へ ] 連載記事 [ 次へ ]

nice!(0)  コメント(2) 
共通テーマ:趣味・カルチャー