ドラクエ風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レジスタの値  %000001  (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

f:id:chien1956:20200131110636p:plain

【参考画像】

*上のコードは、タイルパターンを1つ描画するものですが、

 このプログラムはオリジナルなもので、他にも色々な方法があると思います、

 今回は、ここまでです。