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をつくる〜

74HC595を使ってarduinoの16ビットパラレル出力に挑んでみた