6503がようやく動いた報告

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

Apple2のローレゾグラフィックにPOKE命令で書き込むには

どうも。Apple2のプログラミングにドはまりしているものです。さて、ドットを矢印キーで動かすことに成功し、大きなマリオの絵も配列とFOR文により移動させることに成功しましたが、いかんせんBASICで書き換えると正直アニメーションにならないのです。遅すぎて。CPUがMhzの時代がいかに遅かったのか痛感するいいきっかけになりました。(仲間に見せて大笑いしました)しかし、せっかく頑張って書いた絵もこうなっては…
そこで、Apple2に備わっている機能の一つである「ページ切り替え」とPOKE命令でどうにかできないかと試行錯誤した結果どうなったのかを今回は紹介しようと思います。

■そもそもPOKE命令とはなにか?
 POKE命令とは、「パソコンのメモリの番地を指定してデータを直接書き込む」という動作を行います。「どこどこのこのメモリにこのデータを書き込め」という風に書き込むので、Apple2の場合は

POKE 番地,データ

と書き込むことにより指定のメモリ番地にデータを書き込むことができます。
そして、こちらがapple2のメモリマップというどこに何のデータが書かれているかが一覧になっているサイトです。この中に、pageとpage2というものがあるのですが、ここのメモリ範囲を1ページ2ページと扱うことにより高速に画面を書き換えることができるという機能があります。
そこでこれを利用して2ページ目のメモリに絵のデータを書き込んでしまおう!というわけなのですが、実はこの「2ページ目」の扱いが絵だけに割り当てられていなかったのです。というのがこちらの画像をご覧ください。
POKE 49237,0と打ち込むと表示できる「2ページ目」
このようにプログラムデータが書き込まれてしまっているのです。つまり、重要なデータが書き込まれているこのエリアのメモリを画像書き換えしてしまうと次に何をするかというデータが消えてしまい、フリーズして復帰不可能!それまで頑張って書いたプログラムはすべて消えてしまいます(何回か消しました!)
 また、それまで色のデータを書き込む際には

PLOT Xの位置,Yの位置

 と打ち込んでいましたが、メモリーに直接書き込むとなる場合は全く異なります。まず、メモリーとドットの位置は39バイトごとに縦に16ドット分(確か)とびとびで配置されているうえに、縦に2ドットを1バイトの上位4ビットと下位4ビットで管理しているのです。なので全く違うプログラムを組まないとマリオの姿すらまともに表示できません。
 画像データの書き換えに2ページ目が使えず、かつドットの管理も難しいとなると、ではどうしたら表示できるのか…まだ解決策は見えていません。pokeとcall命令を組み合わせるとどうも機械語プログラミングもできるそうですが。誰かお分かりになる方がいらっしゃいましたら、ぜひ教えてくださいませ・・・

コメント

このブログの人気の投稿

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

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

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