ひとしれずひっそり

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

Space Invaders(6) - データ

データはROMに初期値がありそれをコピーしている。

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

CopyRAMMirror:
; Block copy ROM mirror 1B00-1BBF to initialize RAM at 2000-20BF.
;
01E4: 06 C0           LD      B,$C0               ; Number of bytes
01E6: 11 00 1B        LD      DE,$1B00            ; RAM mirror in ROM
01E9: 21 00 20        LD      HL,$2000            ; Start of RAM
01EC: C3 32 1A        JP      BlockCopy           ; Copy [DE]->[HL] and return

0x1B00(ROM)から0xC0(192)バイトを0x2000(RAM)からにコピーしている。

元となるデータはこちらで0x1B10から0x1B6Fまでは16バイトが一組になっていて自機やビームなどのキャラクターを表すデータになっている様だ。
0x1B700x1BA0以降もコピーされるが文字列やキャラクターのビットパターンになっていて本来はコピーする必要はない様だ。

0x20?3と0x20?4は処理ルーチンへのジャンプアドレスになっていてキャラ毎の処理に飛ばしている。
0x20?0はフラグになっている様でループ処理で0xFFが出たら終了と判断している。つまり0x2060に達したらループを終了している。

;-------------------------- RAM initialization -----------------------------
; Coppied to RAM (2000) C0 bytes as initialization.
; See the description of RAM at the top of this file for the details on this data.

1B00: 01 00 00 10 00 00 00 00 02 78 38 78 38 00 F8 00  ; -> 0x2000
1B10: 00 80 00 8E 02 FF 05 0C 60 1C 20 30 10 01 00 00  ; -> 0x2010   
1B20: 00 00 00 BB 03 00 10 90 1C 28 30 01 04 00 FF FF  ; -> 0x2020   
1B30: 00 00 02 76 04 00 00 00 00 00 04 EE 1C 00 00 03  ; -> 0x2030    
1B40: 00 00 00 B6 04 00 00 01 00 1D 04 E2 1C 00 00 03  ; -> 0x2040 
1B50: 00 00 00 82 06 00 00 01 06 1D 04 D0 1C 00 00 03  ; -> 0x2050
1B60: FF 00 C0 1C 00 00 10 21 01 00 30 00 12 00 00 00  ; -> 0x2060         

; These don't need to be copied over to RAM (see 1BA0 below).
MesssageP1:
; "PLAY PLAYER<1>"
1B70: 0F 0B 00 18 26 0F 0B 00 18 04 11 24 1B 25 FC  ; -> 0x2070   
1B7F: 00 

1B80: 01 FF FF 00 00 00 20 64 1D D0 29 18 02 54 1D 00  ; -> 0x2080                 
1B90: 08 00 06 00 00 01 40 00 01 00 00 10 9E 00 20 1C  ; -> 0x2090