2012年01月03日

mk2設計(6)

  T80で、問題がありそうな命令(ブロック転送やブロック比較やブロック入出力系)を調査しました。

  結局おかしいのは、ブロック入出力系のINI、IND、INIR、INDR、OUTI、OUTD、OTIR、OTDR の8つの命令で、これらのHLレジスタのイ

ンクリメント/デクリメントが出来ていませんでした。


  記述を見ましたが...うーん、という感じです。H/W の設計者ではなく、S/W の設計者が書いたような記述でした。


  修正箇所も何とかわかったので、修正してレイアウトしてみると...
  モード選択の画面にはならずに、画面一面赤紫色。

  他に問題がありそうなんですが、この赤紫色の画面はどうも画面モードの間違いのようです。

  試しに5を押すと、N60m-BASIC が立ち上がりました(^^)/


  まだ実装を残している部分があるのですが、割とまともに動いているみたいです。

  ↓こんな感じです。

ちゃっくんぽっぷ


  撮影にDSi ではなく3DS のカメラだと、調整が効くのでキレイなようです。

posted by えすび at 19:55| Comment(0) | FPGA化:CPU周り | このブログの読者になる | 更新情報をチェックする

mk2設計(5)

  mk2 の回路が起動しない件、判明しました。

  Z80 のコアで使用しているT80 のバグでした...特殊な命令なんですけどねぇ。


  mk2 の音声合成ルーチンで、OUTI という命令を使っています。


  以下、Zilog社の「Z80 Family CPU User Manual」の282ページより抜粋です。

===
  OUTI
  Operation: (C) ← (HL), B ← B -1, HL ← HL + 1

===

  HL で指すメモリの内容を、ポートCに出力する命令です。
  その後に、レジスタBをデクリメント、HLレジスタをインクリメントします。


  mk2 では、0x0045 より

0x0045  LD C,0EFH
0x0047  LD HL,02C9CH
0x004A  LD B,09H
0x004C  INC C
0x004D  OUTI
0x004F  JR NZ,04CH

  で、ロジアナで観測した結果がこちら。

OUTI NG


  OUTI 命令は、「ED A3」で、2回実行している所を観測しています。

  1回目は、OUTIを実行した後に、アドレス「0x2C9C」を出力していて、そのアドレスに対して、データ「0x71」が返されています。
  で、その値を、I/Oポートのアドレス「0x08F0」に出力しています(iorqn が "L" の時)。


  2回目も同様に、OUTIを実行した後に、アドレス「0x2C9C」を出力していて、データ「0x71」が返されています。
  で、その値を、I/Oポートのアドレス「0x07F1」に出力しています(iorqn が "L" の時)。


  その後も同様なんですが、OUTI 命令で実行した結果の「HLレジスタをインクリメント」が行われていません(−−;



  こういう不具合があると、他の命令に関しても調べる必要がありそうです。



posted by えすび at 12:48| Comment(0) | FPGA化:CPU周り | このブログの読者になる | 更新情報をチェックする

2011年10月21日

デバッグ(1)

 いろいろとあった問題ですが、解決しました。

 1つは、AY-3-8910 のレジスタを実装した事です。音は鳴りませんが、書き込み、読み出しが出来ます。


 もう1つですが、T80 のバグでした。

 唐突に挙動不振になる点ですが、実は

 10 OUT &H93,3:GOTO 10

 を実行すると、?UL Error が出る事に集約されていました。


 ?UL Error になる点から逆に追っていくと、見つかりました!

 OUT 命令 を実行した直後に割り込みが発生すると、その時のM1 ステートが短くなるというバグでした。


割り込み問題SIM



 これがシミュレーション結果です。上が正常の場合、下がバグった時です。



割り込み問題まとめ



 まとめてみたのがコレです。

 本来、M1N とIORQ の立ち上がりでデータを取り込んで、このアドレスを参照するはずなんですが、この取り込みタイミングが遅れるため、変

なアドレスを参照して、変な動作になるようでした。


 T80 のコアは触りたくなかったので、外部の回路で対処しました。面倒なので、RFSHN が L の時は、M1 サイクルのデータがそのままになって

いるという風に、外部でラッチしました。



 これを修正すると、今までの問題が嘘のよう。

 手当たり次第、ソフトを動かしてみましたが、今の所、調子が悪いソフトはありません(まあ当たり前なんですが)。


動物将棋

 動物将棋:HP には、mkII 用になっていましたが、PC-6001 でも問題なく動くようです。


F_DOT2

 F-DOT2:写真では分かりにくいですが、ぐりぐり動きます。


ザ・サーキット

 ザ・サーキット:PC-6001 専用。mkII 以降ではサポートしていない画面モードのヤツです。


タワーパニック

 タワーパニック:自分で入力した最初のゲームです。もう30年近く前ですね...






posted by えすび at 17:24| Comment(3) | FPGA化:CPU周り | このブログの読者になる | 更新情報をチェックする

2011年10月10日

CPU周りの設計(6)

 やっと、CPU周りの設計に戻りました。

 一つ修正。リセット系は、

 PLL安定 → SDRAM初期設定完了 → SDカードの設定完了 → CPUリセット解除

 とします。SDRAMの初期設定を行った後、SDカードから読み出したデータをSDRAMに書き込みます。


 画面周り、BASICROM、CPU、RAM と実装が完了したので、周りの回路(WAITやらI/Oやら)を実装しなくても動作するはず。

 だったんですが、画面は全然変わらない。


 ロジアナでCPUの動きをトレースすると、キー読み込みの箇所で無限ループに入っていました。


 サブCPUを実装していないため、割り込みが発生しないので、キー入力の値が変わらない事が原因のようです。

 どこまで作るか、が問題です。



posted by えすび at 13:21| Comment(0) | FPGA化:CPU周り | このブログの読者になる | 更新情報をチェックする

2011年10月03日

CPU周りの設計(5)

 前の記事、キャラクタROMは50MHz動作でした(修正済み)。

 キャラクタROMを50MHzに動作するように変更し、PC-6001 の内蔵RAMもとりあえずダミーを付けて、BASICROMは付けずにT80と接続してみると...CycloneIIIのメモリが足らない(;_;)

 内蔵RAMを8Kバイト(画面1ページ分)にしてレイアウトしてみると、画面に妙な模様が...

 調べた結果、T80 が暴走していて(当たり前だが)、そのために画面メモリに何かのデータを書き込んでいたようでした。

 T80 のデータバスに 0x76 の固定値を与えてやると、初期状態で与えていたRAMの内容の画面がキレイに出ました(0x76 はHALT ですね)。


 結局、SDRAMを実装しないとこの後全然進まないようなので、SDRAM部の仕様を決めてみる。

 ・アドレス空間は次の通り

 0x0000 〜 0x3FFF : BASIC-ROM
 0x4000 〜 0x7FFF : 空き
 0x8000 〜 0xBFFF : RAM or 空き
 0xC000 〜 0xCFFF : RAM

 ・空きの部分から読み出した場合は、0xFF が読み出せるようにする。
 ・SDRAM部 の初期設定動作時に、以下の設定を行う
 1)SDRAM の初期設定

 2)ROMデータの読み込みと、SDRAMへの書き込み
   外部FLASH または、外部SDカードからデータを読み込み、SDRAMのBASIC領域に書き込む。

 3)空き、及びRAM領域に固定値 0xFF を書き込む。


 SDRAM の制御以外に、SDカードの制御も必要になりました...


 ついでなので、キャラクタROM も外部SDカードからデータを読み出しキャラクタROMにする、という変更を行います。


 これに伴い、リセット系は、

 PLL安定 → キャラクタROM初期設定完了 → SDRAM初期設定完了 → CPUリセット解除

 と、キャラクタROMの初期設定を追加します。


posted by えすび at 19:22| Comment(2) | FPGA化:CPU周り | このブログの読者になる | 更新情報をチェックする

2011年10月02日

CPU周りの設計(4)

 VGAへの出力のため、CycloneIII の内蔵RAMを使っていますが、そのため、PC-6001 のRAMを外付けのRAMにする必要が出ました(容量が足らない)。
 また、キャラクタROMのアクセスに関しても、複数からアクセスがあるため、いろいろ考えた結果、メモリアクセスを以下のようにしました。

○メモリのアクセス

 ・RAS、CASでのアクセスは廃止する。ただし、RASをSDRAMのリフレッシュに使うかも知れない。
 ・アクセスは、アドレス、リードイネーブル(負論理)、ライトイネーブル(負論理)で制御する。
 ・アドレスは、リードイネーブル、ライトイネーブルの立ち下がりで取り込む。そのため、リードイネーブル、ライトイネーブルの立ち下がりの前後1クロックは、アドレスを安定させる。
 ・データ出力は、アドレス取り込み後、RAM側のクロックで数クロック後に出力する。このデータ出力は、次のアクセスまで安定させておく。

 現在、VDG周りの回路の中に入っているキャラクタROMは、トップレベルの階層に移動させる事にします。


 また、クロック系、リセット系も、以下のようにします。

○クロック系

 ・クロックは1つのブロックにする。シミュレーション時にダミーを呼んだりして便利。
 ・各クロックは、外部50MHzからPLLを用いて生成する。また、各PLLは、ロック信号を出力させる。
 ・生成するクロックは以下の通り。

  50MHz × 63/220 = 14.318MHz(VDG周りのクロック)
  50MHz × 23/ 72 = 15.972MHz(CPUのクロック)
  50MHz × 1/ 2 = 25MHz  (VGA出力のクロック)
  50MHz × 1/ 1 = 50MHz  (キャラクタROMのクロック)
  50MHz × 2/ 1 =100MHz  (SDRAMのクロック)

  キャラクタROM、SDRAMのクロックは、変更する可能性あり。

 ・CPU のクロックは、15.972MHz のカウンタで1/4分周して入力する。これは、クロックの関係性が必要性のため。

 ・AY-3-8910 のクロックは、本来 2MHz だが、15.972MHz を入力して、8回に1回動作させる。
 ・8049 のクロックは、本来 8MHz だが、15.972MHz を入力して、2回に1回動作させる。


○リセット系

 ・リセット系は1つのブロックにする。
 ・リセットは、CPU、「それ以外」に分けてリセットする。
 ・リセット部も含む「それ以外」のブロックは、外部からのリセットをそのまま使用する。
 ・PLLが安定して、ロック信号が全て出力された後に、SDRAM部へ初期設定パルスを出力する。
 ・SDRAM部の初期設定が完了したら、完了パルスを出力する。
 ・SDRAM部の完了パルスが入力されたら、CPUのリセットを解除する。
 ・リセット信号は、CPUクロックの立ち下がり(相当)で叩いて出力する。



posted by えすび at 19:37| Comment(0) | FPGA化:CPU周り | このブログの読者になる | 更新情報をチェックする

2011年10月01日

CPU周りの設計(3)

 PC-6001 の場合、回路から見ると 外部からWAIT が入るのは、以下の通り。

 1)ROM領域(0x0000〜0x7FFF)からの読み出し

  M1 cycle で 1 WAIT、Memory Read / Write cycle で 1 WAIT挿入。


 2)RAM領域(0x8000〜0xFFFF)からの読み出し

  M1 cycle で 1 WAIT挿入、Memory Read / Write cycle では、なぜか WAIT が入りません。
 (多分、タイミング的に間に合うから、WAIT を外しているんでしょう)


 3)AY-3-8910 へアクセス時

  I/O へのリード、ライトのどちらも、1 WAIT 挿入。


 4)拡張コネクタからの WAIT 信号入力時

  これは、サポートする気がないので、無視ですね。


 1)、2)は、Moriya さんが実機で調査されている内容と一致します。

 http://p6ers.net/mm/pc-6001/  内の『ハードウェア周りの調査』


posted by えすび at 20:22| Comment(0) | FPGA化:CPU周り | このブログの読者になる | 更新情報をチェックする

CPU周りの設計(2)

 シミュレーションの結果をまとめたものがこれです。

T80 タイミング


 元のZ80 のタイミングチャートがこれです。

Z80 タイミング


 T80 の方は、どうも内部で全部立ち上がりクロックに同期させて動かしているようで、各信号出力も、取り込みタイミングも全部立ち上がりになっていました。

 PC-6001 の回路に適用する時に、問題になりそうなのが、WAIT、CAS、RAS ぐらいな様子。大体がCS、RD、WR で非同期に組んでいるので、この辺りの回路は大丈夫。割り込み関連も大丈夫なようです。

 T80 は使えそうなので、これを元に周辺回路を組んでいきます。

posted by えすび at 17:13| Comment(0) | FPGA化:CPU周り | このブログの読者になる | 更新情報をチェックする

CPU周りの設計(1)

 とりあえず画面周りが一段落したので、CPU周りに着手することにしました。

 Z80 は、自分で作ってもいいんですが、面倒なので、opencores で公開されている T80 を使用する事にしました。

 ダウンロードには登録が必要なので登録すると、次の日には登録完了の通知がメールで届きました。
 で、T80 をダウンロードして、シミュレーションしてみると...パルスの出力タイミングが違うー。
 全部、立ち上がりクロックで出力しているような感じです。取り込みタイミングに関しては不明。

 仕方ないので、シミュレーションで違いをはっきりさせて、その結果をCPU周辺の回路に反映させるしかなさそう。



posted by えすび at 14:05| Comment(0) | FPGA化:CPU周り | このブログの読者になる | 更新情報をチェックする