User Tools

Site Tools


base:extract_row_from_tile_based_map

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

base:extract_row_from_tile_based_map [2015-04-17 04:31] (current)
Line 1: Line 1:
 +====== Extract row from tile based map ======
 +by Achim
  
 +Example 4x4 tile:
 +<code>aabb
 +ccdd
 +eeff
 +gghh
 +</code>
 +Tile data stored in memory: 
 +<code>aabbccddeeffgghh</code>
 +
 +In order to read and plot the correct tile row for a vertical scrolling
 +game, tileY has to be defined.
 +<code>
 +tileY: 00, ...    aabb
 +       04, ...    ccdd
 +       08, ...    eeff
 +       0c, ...    gghh
 +</code>
 +
 +Again a map pointer is needed (top-left) and mapX (=map width) for correct map data handling. 
 +For a straight vertical scrolling game
 +
 +mapX = number of tiles left to right. In case of 4x4 tiles: mapX=#$0a, in case of 5x5 tiles mapX=#$08.
 +
 +
 +Pseudo code for scrolling down (player moving up):
 +
 +<code>
 + lda tileY
 + bne samemaprow //top tile row done?
 +
 + lda map //map - mapX
 + sec
 + sbc mapX
 + sta map
 + lda map+1
 + sbc #$00
 + sta map+1
 + lda #$10 //tileY=0c
 +samemaprow: sec
 + sbc #$04
 + sta tileY
 +
 + lda map //don't mess up map pointer...
 + sta maptmp
 + lda map+1
 + sta maptmp+1
 +
 + lda lo-bytescreentop
 + ldx hi-bytescreentop
 + jsr extractrow
 + ...
 +</code>
 +
 +Pseudo code for scrolling up (player moving down):
 +
 +<code>
 + lda map //using tmp again
 + sta maptmp
 + lda map+1
 + sta maptmp+1
 +
 + ldx numbertiles //number of tiles top-bottom
 +!: lda maptmp //calculate map row bottom
 + clc
 + adc mapX
 + sta maptmp
 + lda maptmp+1
 + adc #$00
 + sta maptmp+1
 + dex
 + bpl !-
 +
 + lda lo-bytescreenbottom
 + ldx hi-bytescreenbottom
 + jsr extractrow
 +
 + lda tileY
 + cmp #$0c //lowest tile row done?
 + bne !+
 + lda map //map + mapX
 + clc
 + adc mapX
 + sta map
 + lda map+1
 + adc #$00
 + sta map+1
 + lda #$fc //tileY=00
 +!: clc
 + adc #$04
 + sta tileY
 + ...
 +</code>
 +Extracting a row is pretty simple...
 +<code>
 +/*--------------------------------------------------------------------------
 +Extract row from tile data
 +by A. Volkers, 2011
 +
 +a = lo-bytescreen
 +x = hi-bytescreen
 +
 +->KickAssambler
 +--------------------------------------------------------------------------*/
 +.pc = $1000
 +
 +.const tilemem = 48 //hi-byte tile data: $3000
 +
 +.var tileY = $02 //row 00, 04, 08, 0c
 +.var map = $03 //16bit address for main program
 +.var mapX = $04 //map width
 +.var tiledata = $fc //16bit address tile
 +.var maptmp = $fe //16bit tmp for mappointer
 +
 +
 +
 +extractrow: sta plotrow+1 //prepare selfmod
 + clc
 + adc #$28
 + sta check+1
 + stx plotrow+2
 +
 +extract: ldy #$00
 + lda (maptmp),y //calculate tile data address
 + and #$0f //use tables for 5x5 tiles instead
 + asl
 + asl
 + asl
 + asl
 + sta tiledata //lo-byte
 + lda (maptmp),y
 + and #$f0
 + lsr
 + lsr
 + lsr
 + lsr
 + clc
 +                adc #tilemem //hi-byte
 + sta tiledata+1
 +
 + ldy tileY //get actual tile row
 + ldx #$03 //#$04 for 5x5 tiles
 +readtile: lda (tiledata),y //read actual tile data
 +plotrow: sta $ffff //selfmod for screen position
 + inc plotrow+1
 + bne !+
 + inc plotrow+2
 +!: lda plotrow+1
 +check: cmp #$28 //40 chars done?
 + beq exit
 + iny
 + dex
 + bpl readtile
 + inc maptmp //next tile
 + bne !+
 + inc maptmp+1
 +!: clv
 + bvc extract
 +exit: rts
 +</code>
 +
 +Check out this program which uses the same routine. Hardscrolling only, no colour RAM shifting: {{:base:tile_row.zip|}}
base/extract_row_from_tile_based_map.txt ยท Last modified: 2015-04-17 04:31 (external edit)