ひとしれずひっそり

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

Space Invaders(7) - UFOの得点

0x1D54からUFOの得点表になっている。

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

; Thus the one and only 300 comes up every 15 shots (after an initial 8).
1D54: 10 05 05 10 15 10 10 05 30 10 10 10 05 15 10 05                                 

得点表は打ったビームが消えた時にに得点表のポインターが一つ進む様になっている。
桁上がりしない前提で下位バイトのみの比較をしていて最後の次に最初(0x54)に巻き戻す様にしているが本来0x64で比較するところを0x63で比較している為、表には16個あるが15周期になってしまっている。

0447: 2A 8D 20        LD      HL,(sauScoreLSB)    ; Get pointer to saucer-score table
044A: 2C              INC     L                   ; Every shot explosion advances it one
044B: 7D              LD      A,L                 ; Have we passed ...
044C: FE 63           CP      $63                 ; ... the end at 1D63 (bug! this should be $64 to cover all 16 values)
044E: DA 53 04        JP      C,$0453             ; No .... keep it
0451: 2E 54           LD      L,$54               ; Wrap back around to 1D54
0453: 22 8D 20        LD      (sauScoreLSB),HL    ; New score pointer

得点表が最後の0を取り除いた形になっているのは興味深い。まだ全容はわかっていないが最後の0は固定表示で内部では1/10の値で管理されているのではないかと勘繰ってしまう。

UFOの得点が300点になるのは23発目というのが知られていたが、8発目も出ることがわかる。
今になって考えれは15発周期なので8発目というのは容易に思いつきそうだが、最初は23発目というのが定説で考えが及ばなかったのだろう。
8発目だとわかっても狙うのはなかなか難しいだろう。