ひとしれずひっそり

主にソフトに関することをメモしていきます。過程をそのまま書いていたりするので間違いが含まれます。鵜呑みしない様に。

Space Invaders(4) - DrawScoreHead

次はDrawScoreHead

https://computerarcheology.com/Arcade/SpaceInvaders/Code.html#DrawScoreHead

ここはコメントから" SCORE<1> HI-SCORE SCORE<2> "を表示する様だ。
ここの部分だ

" SCORE<1> HI-SCORE SCORE<2> ".length.to_s(16) #=> "1c"

$1c(28)文字がループ回数として設定されている。

VRAMのアドレスは縦方向に進んでいく様なので、一列が256ドットで、バイト数に換算すると32バイトになる。 書き出しが$241Eになっている。30バイト目から書き込んでいるので、多分この様な順番ではないかと…

アドレスが間違ってたので差し替えた(10/1)

$1E00からキャラクターデータが8バイトずつ64文字分あって、PrintMessageで指定された文字列を書き込んでいる。
PrintMessageにはJPで飛んでいるので、PrintMessageのRETでDrawStatusの呼び出しの次に戻る。
CALLもJPも3バイト使用するがCALLした場合に多段呼び出しになるので対になるRETがまた必要になる。多段にせずRETの回数を減らしメモリを削減するテクニックだろう。

同様に、スコア、ハイスコア、クレジット等を書いている。
スコアはどうもBCDで表現されているっぽい。4bitずつ文字に変換している感じ。