ドラクエ風RPGファミコンプログラム講座 アセンブラ入門編
【第44回】
『MAPDATA取得とタイルパターン表示までの流れ』
1.MAPDATA取得
MAPの先頭アドレスと map_x、map_y のoffsetによってタイルIDを取得,
計算式は MAPの先頭アドレス+MAPの横幅*map_y+map_x で求められる。
【例】
MAPの先頭アドレス = $e000
MAPの横幅 = 16
map_x = 6
map_y = 6
⁂ offsetは、16x6+6 で、102 16進数に直すと $66 なので $e066 番地が
MAPDATAのアドレスになります。
2. MAPDATAのフォーマット
MAPDATA = #%00000000(2進数)
⁂赤の部分が、パレットIDです。(0~3)
3.パレットIDの取り出し
特定のBITを取り出すには、論理演算のAND(論理積)を使います。
【論理積とは】
AND はビット演算の1つで、Aレジスタとオペランドのビット単位に
演算し結果をAレジスタに格納します、ANDは演算対象のビットが
両方とも1の時は1 それ以外は、0にセットされます。
Aレジスタの値 %01000001 (MAPDATA)
オペランドの値 %11000000 (MASKDATA)
演算結果の値 %01000000 (パレットID)
4.タイルDATAの算出
TILEDATAのアドレス + MAPDATA x 4で求められます。
tile_data:
.db $00,$00,$00,$00 ;海
.db $01,$02,$03,$04 ;草原
.db $58,$59,$5a,$5b ;祠
2.タイルパターン表示
【サンプルプログラム】
ldy #0
lda $e000,y
asl a
asl a
tax
lda #2
sta counter0
lp:
lda Vram_add_hi
sta $2006
lda Vram_add_low
sta $2006
lda BG_tile,x
sta $2007
inx
lda BG_tile,x
sta $2007
inx
lda Vram_add_low
clc
adc #$20
sta Vram_add_low
lda Vram_add_hi
adc #0
sta Vram_add_hi
dec counter0
bne lp
【参考画像】
*上のコードは、タイルパターンを1つ描画するものですが、
このプログラムはオリジナルなもので、他にも色々な方法があると思います、
今回は、ここまでです。