TINY野郎のブログ -16ページ目

TINY野郎のブログ

PC-6001、MSX、ぴゅう太など、昔のPCが大好きな人のブログ。

約一カ月のご無沙汰です。

P6で「ドラクエっぽいもの」を作り始めたものの、
開発のペースは大幅にダウンしております…。
なんとか、P6月間(6月中)には
完成(っぽく)させたいと思っているので、
温かく見守っていただければと。

さて。


今回は、
生まれてはじめてアセンブラでプログラミングしたときのことを、
記憶をたどりつつ&エミュレーターで検証しつつ
書いてみたいと思います。




あれは、確か小6の頃だったと思います。

ウチに遊びに来ていた
PCのことなど何もしらない友人の、
何気ない一言がきっかけでした。

「ファミコンのゲームは上に向かって進んでいくのに、
どうしてパソコンのゲームは下に向かって進んでいくわけ?」


確かに、
当時ベーマガなどの投稿雑誌によく掲載されていた
レースゲームやスキーゲームなどの
BASICで作られたスクロールタイプのゲームは、
スクロールさせるために

「最下行で改行する」

という方法を利用したものが多く、
その結果、下方向へ進むものばかりでした。

上方向へ向かうこと、すなわち、
上から下へテキスト画面をスクロールさせることは、

「逆スクロール」

と呼ばれていて、
当時の多くのPCでは、BASICでは不可能な動作でした。


友人の発言を聞いた私は、
なんとなくP6をバカにされたような気がして
悔しかったこともあり、
(なんとかして逆スクロールをさせてやろう)
と思ったのです。

マシン語自体は全く分からなかったのですが、
PEEK関数を利用して
画面のキャラクターコードを読むことくらいは
知っていました。

というわけで、とりあえず、
BASICでの逆スクロールにチャレンジしてみました。

MODE5 PAGE4 の場合、
PAGE1のキャラクターデータは
C400Hから40文字×20行分格納されているので、
そのエリアのメモリの内容を
40バイトずらしてコピーすれば良いわけです。



10 FOR I=&HC400+40*19+39 TO &HC400+40 STEP -1
20 POKE I,PEEK(I-40)
30 NEXT



これを実行すると…


逆スクロールができた!



…のですが。


画面全部をスクロールするのに
20秒 かかります。

これではゲームには使えません。


となると、方法はただ一つ。

「マシン語でやる」

ということでした。


一大決心をした私は、
父が「入門」という言葉に騙されて買ってきて以来、
誰も理解できずにずっと本棚に眠っていた

http://www.geocities.jp/tiny_yarou/wakaru.jpg
「わかるマシン語入門」

を手に取り、
最低限必要そうな基礎知識を理解しました。

・「ニーモニック」という変な言語で書く。
・BASICの変数に当たるのが「レジスタ」というもの。
・レジスタは超少ない。
・代入は LD という命令。
・計算結果がゼロになると、ZフラグというものがONになる。
・Zフラグの結果でジャンプする命令がある。

あとは、P6mkIIの取説の最後に載っている、
ニーモニック→機械語対応表を見ながら、
一生懸命、ノートにマシン語を書いてみました。










アドレスマシン語ニーモニックBASIC
D00021 1F C7LD HL,0C71FH HL=&HC400+40*19+39
D00311 F7 C6LD DE,0C6F7H DE=&HC400+40*18+39
D00601 F8 02LD BC,02F8H BC=40*19
D0091ALD A,(DE) A=PEEK(DE)
D00A77LD (HL),A POKE HL,A
D00B1BDEC DE DE=DE-1
D00C2BDEC HL HL=HL-1
D00D0BDEC BC BC=BC-1
D00EC2 09 D0JP NZ,0D009H IF BC<>0 THEN &HD009
D011C9RET RETURN



先ほどのBASICプログラムを移植しただけの、
とてもシンプルなリストです。

これを、mkII内蔵のマシン語モニタで入力し、
BASICに戻ると、おもむろに


EXEC&HD000


すると…


高速逆スクロールができた!!

バンザーーーイ!!!



…っと思ったのも つかの間でした。

確かに、一瞬逆スクロールはしたのですが、
その直後、我がP6mkIIは無情にもリセットされ、
モード選択画面へ戻ってしまったのです。


マシン語の恐ろしさを知った瞬間でした。


※16ビットレジスタでZフラグが変化しないなんて知らん!