6503がようやく動いた報告

イメージ
  回路図まで載っけて作りましたと宣言した前回。 いざ色々動かそうとしたものの、 プログラムがまともに動かないので試行錯誤してたら何年たってたんですかねこれ 。月日が経つのは怖いですね。 今回ようやく6503と6532が無事に動きました。 何につまづいたのかというと、多分アセンブラの文法です。 6502系のアセンブラって結構豊富で、 いろんなところから出てるんですがそれぞれアドレスの表記とか微 妙に違うんですね。 で、 今回久しぶりにca65というアセンブラを使用してみたのがつま づいた原因でした。 一度設定すれば大体の6502系には対応できるのが魅力ですが、 本当よくわからないmakeファイルの設定とかで地獄を見ました 。 以下何やってたのか簡単にまとめていきます。 新しい道具も作ったよ! ■:まず動かない いや、電気は通ってるしクロックは走ってるんですよ。 なのに6532の挙動がおかしくてIRQはでっぱなしだしcpu は止まるし訳がわかりません。 そこで今一度6532のデータシートを読むと、 「 NMIとIRQはオープンコレクタなので 必ずプルアップすること 」 ってあるんですね。何その罠。 というわけでプルアップ抵抗を追加しました。 これでcpuがすぐに止まる事故は解決… と思いきやまだ止まります。というか出力がよくわからない。 そこで大昔に作りかけてやめた出力確認用LEDパネルを作成する ことにしました。 ■:めちゃくちゃ便利なLEDパネル 5年くらい前にこんなの作ったら便利やろってLEDだけ並べて、 回路に不備があることに気がついてなげたもの。 今ならなんとかできそうってことで抵抗とトランジスタ をばーっと取り付けて、 カードエッジからも表のポートからも入力できるようにしました。 これまでは毎回ブレッドボードでled回路組んでたんでクソめん どくさいし抜けるしで散々だったのですが、 これで見やすい簡単出力もicに負担がなく万々歳になりました。 やったぜ。 まあ回路図書かずにえいやっと作ったので裏はすごいことになって ます。ちゃんと整えて、 入力スイッチもつけて体裁整えたら普通に便利道具になりそう。 クロックパルスも出せるようにしたいですね。 ledドライブのために2sc1815を贅沢に使用してます。 意外と高いですがいつ買ったのか結構あったので奮発...

Arduinoでテキスト表示器(CRTC)をつくってみる その1(実験編)



先日z80と6502を入手しこれでコンピューターを自作しようと考え、とりあえずLEDをチカチカさせてみようとしたものの動いたんだか動いていないんだがわからないままで終わりました。(一応通電はしたようです。)

 やはりコンピューターといったら画面にテキストを表示できるようにならないと寂しいもの。いや、画面に文字が表示できるようになっていればモチベーションがかなり維持できるというもの(自分だけでしょうか)。そこで、Z80と74HCシリーズのみで回路を最初から組むのはさすがに無謀と考え、ひとまずArduinoでコンポジット出力によるROM内のキャラクター(文字)を表示できるようになってみようと考えました。

 とりあえずネットでArduinoでビデオ出力と検索すると出てくるのが「TVout」というもの。抵抗二個とコンポジット端子一つで画面に文字や図形が表示できるという、すごい優れものです。おまけに3Dのブロックが回転するデモ付き。しかしこのプログラムは文字が表示できるもののどうやってプログラムで表示させているかまではわかりずらく、今回の目的には応用できそうになかったため没にしました。
 
 やはりせっかく回路から組むのだからNTSC信号(ビデオ信号)がどのように生成され画面に映し出されているのかを自分で調べないともったいないということで今回こちらのサイトを見本にいろいろ実験してみることにしました。

■ビデオ信号はどういう信号なの?

■変数ではだめ、なら配列は?



_delay_us()の中に変数を入れると著しくタイミングが乱れてしまいまともに表示できないことがわかりました。しかしこのままでは任意の画像など表示できる訳がありません。しかし、この関数の中に変数を入れなければタイミングはあまり崩れることはないようです。そこで、配列の中に情報を入れ、IF文で切り替えるという方法をとってみました。


こんな感じで表示ができることが確認がとれました。つまり、この52.5usの間に黒か白かという信号をきちんと出し切り、かつずれが発生しないようにすれば表示器は完成するということです。プログラムであれこれとするとどうしても計算に時間がかかってしまったりするために水平同期信号のタイミングがずれてしまいそのあとの垂直同期信号もずれて画面がまともに映らなくなってしまう訳です。

これを防ぐにはどうしたらいいのか・・・特に動的なプログラム、外部からの読み込みとなると難しい部分が出てきそうです。

ちなみにArduinoにはアセンブリ言語で書く機能が備わっています。それでコードを書くと本来のマイコンの持っているスピードが出せて、この走査線の信号を出すのにも十分間に合うのではないかという。ただ、z80のアセンブリ言語は書いたことあるけどAVRは今までやったことがないという。また、タイマー割り込みをかけて強制的に処理の途中で信号を送るというのもまたありだと思いますが、どちらにせよ命令に何クロックかかるのかが予測できないので何ともいえません。

でもこれがうまくいけばオリジナルのテキスト表示器が作れるということ。
ビデオ信号、ほんとに奥が深いです…

コメント

このブログの人気の投稿

ファミコンの完全自作ROM&カセットを作ろう!!その1~立ちはだかるコンパイラの壁~

ファミリーベーシックでゲームプログラミング

ファミコンの完全自作ROM&カセット作ろう!〜cc65で起動ROMをつくる〜