561 lines
19 KiB
NASM
561 lines
19 KiB
NASM
|
|
; Copyright (C) 2018 Christophe Meneboeuf <christophe@xtof.info>
|
|
;
|
|
; This program is free software: you can redistribute it and/or modify
|
|
; it under the terms of the GNU General Public License as published by
|
|
; the Free Software Foundation, either version 3 of the License, or
|
|
; (at your option) any later version.
|
|
;
|
|
; This program is distributed in the hope that it will be useful,
|
|
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
; GNU General Public License for more details.
|
|
;
|
|
; You should have received a copy of the GNU General Public License
|
|
; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
.include "display.inc"
|
|
.include "world.inc"
|
|
.include "tiles.inc"
|
|
.include "math.inc"
|
|
.include "memory.inc"
|
|
.include "monitor.inc"
|
|
|
|
|
|
; Init the view. To be called before anything else!
|
|
.export view_init
|
|
|
|
; Refreshes the view to reflect the world
|
|
; destroyed: ZERO_2_1 & ZERO_2_2
|
|
.export view_refresh
|
|
|
|
|
|
; Places the upper left corner of the *view* on the given coordinates
|
|
; X: in x (values [0:255])
|
|
; Y: in y (values [0:255])
|
|
; destroyed: ZERO_2_1
|
|
.export set_view_coords ; routine to place the view over the world
|
|
|
|
; Shows a tile at the provided coordinates
|
|
; Tile number to be displayed : TILE_NR
|
|
; X: TILE_COORD_X
|
|
; Y: TILE_COORD_Y
|
|
|
|
.import Compute_Maze_Addr
|
|
.import World
|
|
.import Player_XY
|
|
|
|
.import DBG_TRACE
|
|
.import DBG_TRACES
|
|
|
|
.CODE
|
|
|
|
|
|
; ********* PRIVATE CONSTANTS ********
|
|
; shall be even
|
|
.define GRID_WIDTH $A
|
|
; shall be even
|
|
.define GRID_HEIGHT $A
|
|
|
|
; location of th eplayer in the view
|
|
.define PLAYER_X GRID_WIDTH/2
|
|
.define PLAYER_Y GRID_HEIGHT/2
|
|
|
|
; sizeof the structure describing a "free tile":
|
|
; struct { int8_t* p_in_world; int8_t offset_from_player }
|
|
.define SIZEOF_TILETRANSP_T 3
|
|
|
|
; ********* USEFUL VARIABLES & LOCATIONS *******
|
|
; x location
|
|
.define TILE_COORD_X ZERO_5_3
|
|
; y location
|
|
.define TILE_COORD_Y ZERO_5_4
|
|
; Address of the first tile in the world to be viewed
|
|
.define VIEW_WORLD ZERO_4_1
|
|
|
|
|
|
|
|
view_init:
|
|
|
|
; inits the current view to an impossible value
|
|
; for the first screen refresh
|
|
ldx #(GRID_HEIGHT*GRID_WIDTH - 1)
|
|
lda #$FF
|
|
sta View_Current
|
|
loop_view_init:
|
|
sta View_Current, x
|
|
dex
|
|
bne loop_view_init
|
|
|
|
; sets the text portion of the mixed mode
|
|
lda #$14
|
|
sta WNDTOP ; sets the beginning of the text
|
|
jsr HOME ; clear the text screen and positions the "cursor"
|
|
|
|
jsr HGR ; HIRES mixed mode, page 1
|
|
|
|
rts
|
|
|
|
|
|
; this routines populates View_Future, without any LOS
|
|
_dbg_build_view:
|
|
|
|
lda #0
|
|
ldx #(GRID_WIDTH * GRID_HEIGHT - 1)
|
|
loop_build_view:
|
|
lda #ACTORS::PLAYER
|
|
sta View_Future,X
|
|
dex
|
|
bne loop_build_view
|
|
sta View_Future,X
|
|
|
|
rts
|
|
|
|
; this routine will create the view and populate View_Future
|
|
; destroys ZERO_4_3, ZERO_4_4, ZERO_5_1, ZERO_5_2, ZERO_5_3
|
|
; ZERO_5_4, ZERO_5_5, ZERO_5_6, ZERO_7_1, ZERO_7_2
|
|
_build_view:
|
|
|
|
; 1 - Init the view
|
|
lda #0
|
|
ldx #(GRID_WIDTH * GRID_HEIGHT - 1)
|
|
loop_init_view:
|
|
lda #ACTORS::UNKNOWN
|
|
sta View_Future,X
|
|
dex
|
|
bne loop_init_view
|
|
sta View_Future,X
|
|
|
|
; 2 - Player
|
|
.define OFFSET_PLAYER_IN_VIEW PLAYER_X+PLAYER_Y*GRID_WIDTH
|
|
ldx #(OFFSET_PLAYER_IN_VIEW)
|
|
lda #ACTORS::PLAYER
|
|
sta View_Future,X
|
|
|
|
; 3 - Casting rays
|
|
.define NB_RAYS 68
|
|
.define NB_ITER ZERO_4_3
|
|
.define NB_TILES_IN_RAY ZERO_4_4
|
|
.define NB_TILES_IN_RAY_LEFT ZERO_5_1
|
|
.define SRC_TILE_IN_WORLD ZERO_5_2 ; 2 bytes
|
|
.define PTR_RAY ZERO_5_4 ; 2 bytes
|
|
.define TMP ZERO_5_6
|
|
|
|
|
|
; loading ptr_rays - 1 as it will be incremented
|
|
; at the 1st iteration of the loop
|
|
lda #<Rays
|
|
sec
|
|
sbc #1
|
|
sta PTR_RAY
|
|
lda #>Rays
|
|
sbc #0
|
|
sta PTR_RAY+1
|
|
|
|
ldx #0
|
|
stx NB_TILES_IN_RAY
|
|
|
|
loop_rays:
|
|
|
|
stx NB_ITER
|
|
|
|
; computing the pointer to the ray to be casted
|
|
; ptr_ray += sizeof(ray_elem)*nb elem
|
|
lda NB_TILES_IN_RAY
|
|
sta FAC1
|
|
lda #3 ; sizeof(ray_elem) = 1 byte (offset_view) + 2 bytes (offset_world)
|
|
sta FAC2
|
|
jsr mul8 ; result is alway 8 bit
|
|
inx ; result += 1
|
|
txa
|
|
clc
|
|
adc PTR_RAY ; incrementing the ptr to the current ray
|
|
sta PTR_RAY
|
|
lda #0
|
|
adc PTR_RAY+1
|
|
sta PTR_RAY+1
|
|
|
|
|
|
; loading nb tiles in ray
|
|
ldy #0
|
|
lda (PTR_RAY),Y
|
|
tax
|
|
stx NB_TILES_IN_RAY
|
|
iny
|
|
|
|
loop_ray:
|
|
stx NB_TILES_IN_RAY_LEFT
|
|
|
|
lda VIEW_WORLD
|
|
clc
|
|
adc (PTR_RAY),Y ; offset_tile_world_low
|
|
sta SRC_TILE_IN_WORLD
|
|
lda VIEW_WORLD+1
|
|
iny
|
|
adc (PTR_RAY),Y ; offset_tile_world_high
|
|
sta SRC_TILE_IN_WORLD+1
|
|
iny
|
|
sty TMP
|
|
lda (PTR_RAY),Y ; offset_view
|
|
tax
|
|
ldy #0
|
|
lda (SRC_TILE_IN_WORLD),Y
|
|
sta View_Future,X
|
|
ldy TMP
|
|
iny
|
|
; break if non-transparent
|
|
cmp #ACTORS::NOT_TRANSPARENT
|
|
bcs end_loop_ray
|
|
; loop if tiles are left in the ray
|
|
|
|
ldx NB_TILES_IN_RAY_LEFT
|
|
dex
|
|
bne loop_ray
|
|
|
|
end_loop_ray:
|
|
|
|
ldx NB_ITER
|
|
inx
|
|
cpx #NB_RAYS
|
|
bne loop_rays
|
|
|
|
end_loop_rays:
|
|
|
|
rts
|
|
|
|
.undef OFFSET_PLAYER_IN_VIEW
|
|
.undef NB_RAYS
|
|
.undef NB_ITER
|
|
.undef NB_TILES_IN_RAY
|
|
.undef NB_TILES_IN_RAY_LEFT
|
|
.undef SRC_TILE_IN_WORLD
|
|
.undef PTR_RAY
|
|
.undef TMP
|
|
|
|
|
|
|
|
|
|
;.align 256
|
|
; This routine refreshes (updates) the screen.
|
|
; It won't update tiles that are not modified
|
|
; destroys ZERO_2_1, ZERO_2_2,
|
|
; ZERO_4_3, ZERO_4_4, ZERO_5_1, ZERO_5_2, ZERO_5_3,
|
|
; ZERO_5_4, ZERO_5_5, ZERO_5_6, ZERO_7_1, ZERO_7_2
|
|
view_refresh:
|
|
|
|
; 1 - computing the start address of the view
|
|
; to VIEW_WORLD. It places the top-left corner at the given offset
|
|
lda #<World
|
|
clc
|
|
adc View_Offset
|
|
sta VIEW_WORLD
|
|
lda #>World
|
|
adc View_Offset+1
|
|
sta VIEW_WORLD+1
|
|
; 2 - shifting the view to place the center at the given offset
|
|
sec
|
|
lda VIEW_WORLD
|
|
sbc SHIFT_VIEW
|
|
sta VIEW_WORLD
|
|
lda VIEW_WORLD+1
|
|
sbc SHIFT_VIEW+1
|
|
sta VIEW_WORLD+1
|
|
|
|
; 3 - build the view to be displayed
|
|
jsr _build_view
|
|
;jsr _dbg_build_view
|
|
|
|
; 4 - display the tiles viewed
|
|
.define SAVE_X ZERO_3
|
|
lda #0
|
|
tax
|
|
sta TILE_COORD_Y
|
|
loop_display_tiles_y:
|
|
ldy #0
|
|
sty TILE_COORD_X
|
|
loop_display_tiles_x:
|
|
lda View_Future, X
|
|
cmp View_Current, X
|
|
beq no_display ; do not display an unchanged tile
|
|
sta View_Current, X ; update the list of diplayed tiles
|
|
sta TILE_NR
|
|
stx SAVE_X
|
|
jsr _set_tile ; this routines does not alter its parameters
|
|
ldx SAVE_X
|
|
no_display:
|
|
inx
|
|
inc TILE_COORD_X
|
|
ldy TILE_COORD_X
|
|
tya
|
|
cmp #GRID_WIDTH
|
|
bne loop_display_tiles_x
|
|
; next line
|
|
inc TILE_COORD_Y
|
|
lda TILE_COORD_Y
|
|
cmp #GRID_HEIGHT
|
|
bne loop_display_tiles_y
|
|
|
|
rts
|
|
.undef VIEW_WORLD
|
|
SHIFT_VIEW: .word WIDTH_WORLD*PLAYER_Y + PLAYER_X ; shift to center the view on the player
|
|
|
|
.CODE
|
|
set_view_coords:
|
|
|
|
; 1. Compute offset from the starting address of the maze
|
|
stx ZERO_2_1
|
|
sty FAC1
|
|
lda #WIDTH_WORLD
|
|
sta FAC2
|
|
jsr mul8
|
|
tay ; high part
|
|
txa ; low part
|
|
clc
|
|
adc ZERO_2_1
|
|
sta View_Offset ; little endian
|
|
tya
|
|
adc #0
|
|
sta View_Offset+1 ; little endian
|
|
|
|
rts
|
|
|
|
|
|
;.align 256
|
|
; displays tile #TILE_NR at [TILE_COORD_X, TILE_COORD_Y]
|
|
; destroys ZERO_2_1, ZERO_2_2
|
|
_set_tile:
|
|
.define ADDR_TO_PATCH $666 ; 2 byte address to be patched by tile's address
|
|
; A tile being 16 line tall, it will vertically spawn on two 8 line "blocks"
|
|
.define ADDR_DST_BLOCK_1 ZERO_2_1 ; first block
|
|
.define ADDR_DST_BLOCK_2 ZERO_2_3 ; second bloc
|
|
|
|
; 1 - patching the code with the adress
|
|
; of the tile to be displayed
|
|
lda TILE_NR
|
|
asl
|
|
tax
|
|
|
|
lda TILES, X
|
|
sta PATCH_1+1
|
|
sta PATCH_2+1
|
|
sta PATCH_3+1
|
|
sta PATCH_4+1
|
|
sta PATCH_5+1
|
|
sta PATCH_6+1
|
|
sta PATCH_7+1
|
|
sta PATCH_8+1
|
|
|
|
lda TILES+1, X
|
|
sta PATCH_1+2
|
|
sta PATCH_2+2
|
|
sta PATCH_3+2
|
|
sta PATCH_4+2
|
|
sta PATCH_5+2
|
|
sta PATCH_6+2
|
|
sta PATCH_7+2
|
|
sta PATCH_8+2
|
|
|
|
; destination address (HGR)
|
|
; 2 - get the offset from HGR_GRID (view)
|
|
lda #GRID_WIDTH
|
|
sta FAC1
|
|
lda TILE_COORD_Y
|
|
sta FAC2
|
|
jsr mul8 ; X = GRID_WITH * Y (always < 0xFF)
|
|
txa
|
|
clc
|
|
adc TILE_COORD_X ; Won't set the carry
|
|
asl ; 16 bit elements: doubling the offset. Won't work if grid > 127 tiles (ie 20x10)
|
|
tay ; Y: offset to get the address
|
|
; 3 - retrieve the destination address
|
|
lda HGR_GRID, Y
|
|
sta ADDR_DST_BLOCK_1
|
|
adc #$80
|
|
sta ADDR_DST_BLOCK_2
|
|
lda HGR_GRID+1, Y
|
|
sta ADDR_DST_BLOCK_1+1
|
|
sta ADDR_DST_BLOCK_2+1
|
|
|
|
; 4 - Draw
|
|
ldx #0 ; loop counter & index source
|
|
.define NB_ITER_1 #$20
|
|
; First loop: draw lines 1 to 8
|
|
loop_lines_1to8:
|
|
ldy #0 ; index destination
|
|
; copy lines (4 blocks)
|
|
PATCH_1:
|
|
lda ADDR_TO_PATCH, X
|
|
sta (ADDR_DST_BLOCK_1), Y
|
|
iny
|
|
inx
|
|
PATCH_2:
|
|
lda ADDR_TO_PATCH, X
|
|
sta (ADDR_DST_BLOCK_1), Y
|
|
iny
|
|
inx
|
|
PATCH_3:
|
|
lda ADDR_TO_PATCH, X
|
|
sta (ADDR_DST_BLOCK_1), Y
|
|
iny
|
|
inx
|
|
PATCH_4:
|
|
lda ADDR_TO_PATCH, X
|
|
sta (ADDR_DST_BLOCK_1), Y
|
|
iny
|
|
inx
|
|
; next line
|
|
lda ADDR_DST_BLOCK_1+1
|
|
ADC #$4 ; addr += 0x400
|
|
sta ADDR_DST_BLOCK_1+1
|
|
cpx NB_ITER_1
|
|
bne loop_lines_1to8
|
|
|
|
clc ; cpx affects carry
|
|
|
|
.define NB_ITER_2 #$40
|
|
; Second loop: draw lines 9 to 16
|
|
loop_lines_9to16:
|
|
ldy #0 ; index destination
|
|
; copy lines (4 blocks)
|
|
_DISP_TILE_2:
|
|
PATCH_5:
|
|
lda ADDR_TO_PATCH, X
|
|
sta (ADDR_DST_BLOCK_2), Y
|
|
iny
|
|
inx
|
|
PATCH_6:
|
|
lda ADDR_TO_PATCH, X
|
|
sta (ADDR_DST_BLOCK_2), Y
|
|
iny
|
|
inx
|
|
PATCH_7:
|
|
lda ADDR_TO_PATCH, X
|
|
sta (ADDR_DST_BLOCK_2), Y
|
|
iny
|
|
inx
|
|
PATCH_8:
|
|
lda ADDR_TO_PATCH, X
|
|
sta (ADDR_DST_BLOCK_2), Y
|
|
iny
|
|
inx
|
|
; next line
|
|
lda ADDR_DST_BLOCK_2+1
|
|
ADC #$4 ; addr += 0x400
|
|
sta ADDR_DST_BLOCK_2+1
|
|
cpx NB_ITER_2
|
|
bne loop_lines_9to16
|
|
|
|
|
|
rts
|
|
|
|
|
|
|
|
|
|
|
|
.RODATA
|
|
|
|
; Adress of the tiles in the HIRES screen
|
|
; T0 T1 T2
|
|
; T3 T4 T5
|
|
HGR_GRID:
|
|
.word $2000, $2004, $2008, $200C, $2010, $2014, $2018, $201C, $2020, $2024
|
|
.word $2100, $2104, $2108, $210C, $2110, $2114, $2118, $211C, $2120, $2124
|
|
.word $2200, $2204, $2208, $220C, $2210, $2214, $2218, $221C, $2220, $2224
|
|
.word $2300, $2304, $2308, $230C, $2310, $2314, $2318, $231C, $2320, $2324
|
|
.word $2028, $202C, $2030, $2034, $2038, $203C, $2040, $2044, $2048, $204C
|
|
.word $2128, $212C, $2130, $2134, $2138, $213C, $2140, $2144, $2148, $214C
|
|
.word $2228, $222C, $2230, $2234, $2238, $223C, $2240, $2244, $2248, $224C
|
|
.word $2328, $232C, $2330, $2334, $2338, $233C, $2340, $2344, $2348, $234C
|
|
.word $2050, $2054, $2058, $205C, $2060, $2064, $2068, $206C, $2070, $2074
|
|
.word $2150, $2154, $2158, $215C, $2160, $2164, $2168, $216C, $2170, $2174
|
|
|
|
; Nb rays: 68
|
|
; A ray: length (nb_tiles), offset_from_view_in_world_low, offset_from_view_in_world_high, offset_view
|
|
Rays:
|
|
.byte 10, 68, 1, 54, 4, 1, 44, 3, 1, 43, 195, 0, 33, 194, 0, 32, 130, 0, 22, 129, 0, 21, 65, 0, 11, 64, 0, 10, 0, 0, 0
|
|
.byte 10, 5, 1, 45, 4, 1, 44, 196, 0, 34, 195, 0, 33, 131, 0, 23, 130, 0, 22, 66, 0, 12, 65, 0, 11, 1, 0, 1, 0, 0, 0
|
|
.byte 9, 68, 1, 54, 4, 1, 44, 3, 1, 43, 195, 0, 33, 131, 0, 23, 130, 0, 22, 66, 0, 12, 65, 0, 11, 1, 0, 1
|
|
.byte 9, 5, 1, 45, 4, 1, 44, 196, 0, 34, 195, 0, 33, 131, 0, 23, 67, 0, 13, 66, 0, 12, 2, 0, 2, 1, 0, 1
|
|
.byte 8, 68, 1, 54, 4, 1, 44, 196, 0, 34, 195, 0, 33, 131, 0, 23, 67, 0, 13, 66, 0, 12, 2, 0, 2
|
|
.byte 8, 5, 1, 45, 4, 1, 44, 196, 0, 34, 132, 0, 24, 131, 0, 23, 67, 0, 13, 3, 0, 3, 2, 0, 2
|
|
.byte 7, 5, 1, 45, 4, 1, 44, 196, 0, 34, 132, 0, 24, 131, 0, 23, 67, 0, 13, 3, 0, 3
|
|
.byte 7, 5, 1, 45, 197, 0, 35, 196, 0, 34, 132, 0, 24, 68, 0, 14, 67, 0, 13, 3, 0, 3
|
|
.byte 6, 5, 1, 45, 197, 0, 35, 196, 0, 34, 132, 0, 24, 68, 0, 14, 4, 0, 4
|
|
.byte 6, 5, 1, 45, 197, 0, 35, 133, 0, 25, 132, 0, 24, 68, 0, 14, 4, 0, 4
|
|
.byte 5, 5, 1, 45, 197, 0, 35, 133, 0, 25, 69, 0, 15, 5, 0, 5
|
|
.byte 6, 5, 1, 45, 197, 0, 35, 198, 0, 36, 134, 0, 26, 70, 0, 16, 6, 0, 6
|
|
.byte 6, 5, 1, 45, 197, 0, 35, 133, 0, 25, 134, 0, 26, 70, 0, 16, 6, 0, 6
|
|
.byte 7, 5, 1, 45, 6, 1, 46, 198, 0, 36, 134, 0, 26, 135, 0, 27, 71, 0, 17, 7, 0, 7
|
|
.byte 7, 5, 1, 45, 197, 0, 35, 198, 0, 36, 134, 0, 26, 70, 0, 16, 71, 0, 17, 7, 0, 7
|
|
.byte 8, 70, 1, 56, 6, 1, 46, 198, 0, 36, 199, 0, 37, 135, 0, 27, 71, 0, 17, 72, 0, 18, 8, 0, 8
|
|
.byte 8, 5, 1, 45, 6, 1, 46, 198, 0, 36, 134, 0, 26, 135, 0, 27, 71, 0, 17, 7, 0, 7, 8, 0, 8
|
|
.byte 9, 70, 1, 56, 6, 1, 46, 7, 1, 47, 199, 0, 37, 135, 0, 27, 136, 0, 28, 72, 0, 18, 73, 0, 19, 9, 0, 9
|
|
.byte 9, 5, 1, 45, 6, 1, 46, 198, 0, 36, 199, 0, 37, 135, 0, 27, 71, 0, 17, 72, 0, 18, 8, 0, 8, 9, 0, 9
|
|
.byte 8, 70, 1, 56, 6, 1, 46, 7, 1, 47, 199, 0, 37, 200, 0, 38, 136, 0, 28, 137, 0, 29, 73, 0, 19
|
|
.byte 8, 5, 1, 45, 6, 1, 46, 198, 0, 36, 199, 0, 37, 135, 0, 27, 136, 0, 28, 72, 0, 18, 73, 0, 19
|
|
.byte 7, 70, 1, 56, 6, 1, 46, 7, 1, 47, 199, 0, 37, 200, 0, 38, 201, 0, 39, 137, 0, 29
|
|
.byte 7, 5, 1, 45, 6, 1, 46, 198, 0, 36, 199, 0, 37, 200, 0, 38, 136, 0, 28, 137, 0, 29
|
|
.byte 6, 70, 1, 56, 6, 1, 46, 7, 1, 47, 8, 1, 48, 200, 0, 38, 201, 0, 39
|
|
.byte 6, 5, 1, 45, 6, 1, 46, 7, 1, 47, 199, 0, 37, 200, 0, 38, 201, 0, 39
|
|
.byte 5, 70, 1, 56, 71, 1, 57, 7, 1, 47, 8, 1, 48, 9, 1, 49
|
|
.byte 5, 70, 1, 56, 6, 1, 46, 7, 1, 47, 8, 1, 48, 9, 1, 49
|
|
.byte 4, 70, 1, 56, 71, 1, 57, 72, 1, 58, 73, 1, 59
|
|
.byte 5, 70, 1, 56, 71, 1, 57, 135, 1, 67, 136, 1, 68, 137, 1, 69
|
|
.byte 5, 70, 1, 56, 134, 1, 66, 135, 1, 67, 136, 1, 68, 137, 1, 69
|
|
.byte 6, 70, 1, 56, 134, 1, 66, 135, 1, 67, 136, 1, 68, 200, 1, 78, 201, 1, 79
|
|
.byte 6, 133, 1, 65, 134, 1, 66, 135, 1, 67, 199, 1, 77, 200, 1, 78, 201, 1, 79
|
|
.byte 7, 70, 1, 56, 134, 1, 66, 135, 1, 67, 199, 1, 77, 200, 1, 78, 201, 1, 79, 9, 2, 89
|
|
.byte 7, 133, 1, 65, 134, 1, 66, 198, 1, 76, 199, 1, 77, 200, 1, 78, 8, 2, 88, 9, 2, 89
|
|
.byte 8, 70, 1, 56, 134, 1, 66, 135, 1, 67, 199, 1, 77, 200, 1, 78, 8, 2, 88, 9, 2, 89, 73, 2, 99
|
|
.byte 8, 133, 1, 65, 134, 1, 66, 198, 1, 76, 199, 1, 77, 7, 2, 87, 8, 2, 88, 72, 2, 98, 73, 2, 99
|
|
.byte 7, 70, 1, 56, 134, 1, 66, 135, 1, 67, 199, 1, 77, 7, 2, 87, 8, 2, 88, 72, 2, 98
|
|
.byte 7, 133, 1, 65, 134, 1, 66, 198, 1, 76, 199, 1, 77, 7, 2, 87, 71, 2, 97, 72, 2, 98
|
|
.byte 6, 70, 1, 56, 134, 1, 66, 198, 1, 76, 199, 1, 77, 7, 2, 87, 71, 2, 97
|
|
.byte 6, 133, 1, 65, 134, 1, 66, 198, 1, 76, 6, 2, 86, 7, 2, 87, 71, 2, 97
|
|
.byte 5, 133, 1, 65, 134, 1, 66, 198, 1, 76, 6, 2, 86, 70, 2, 96
|
|
.byte 5, 133, 1, 65, 197, 1, 75, 198, 1, 76, 6, 2, 86, 70, 2, 96
|
|
.byte 4, 133, 1, 65, 197, 1, 75, 5, 2, 85, 69, 2, 95
|
|
.byte 5, 133, 1, 65, 132, 1, 64, 196, 1, 74, 4, 2, 84, 68, 2, 94
|
|
.byte 5, 133, 1, 65, 197, 1, 75, 196, 1, 74, 4, 2, 84, 68, 2, 94
|
|
.byte 6, 68, 1, 54, 132, 1, 64, 196, 1, 74, 195, 1, 73, 3, 2, 83, 67, 2, 93
|
|
.byte 6, 133, 1, 65, 132, 1, 64, 196, 1, 74, 4, 2, 84, 3, 2, 83, 67, 2, 93
|
|
.byte 7, 68, 1, 54, 132, 1, 64, 131, 1, 63, 195, 1, 73, 3, 2, 83, 2, 2, 82, 66, 2, 92
|
|
.byte 7, 133, 1, 65, 132, 1, 64, 196, 1, 74, 195, 1, 73, 3, 2, 83, 67, 2, 93, 66, 2, 92
|
|
.byte 8, 68, 1, 54, 132, 1, 64, 131, 1, 63, 195, 1, 73, 194, 1, 72, 2, 2, 82, 1, 2, 81, 65, 2, 91
|
|
.byte 8, 133, 1, 65, 132, 1, 64, 196, 1, 74, 195, 1, 73, 3, 2, 83, 2, 2, 82, 66, 2, 92, 65, 2, 91
|
|
.byte 9, 68, 1, 54, 132, 1, 64, 131, 1, 63, 195, 1, 73, 194, 1, 72, 193, 1, 71, 1, 2, 81, 0, 2, 80, 64, 2, 90
|
|
.byte 9, 133, 1, 65, 132, 1, 64, 196, 1, 74, 195, 1, 73, 194, 1, 72, 2, 2, 82, 1, 2, 81, 65, 2, 91, 64, 2, 90
|
|
.byte 8, 68, 1, 54, 132, 1, 64, 131, 1, 63, 130, 1, 62, 194, 1, 72, 193, 1, 71, 192, 1, 70, 0, 2, 80
|
|
.byte 8, 133, 1, 65, 132, 1, 64, 131, 1, 63, 195, 1, 73, 194, 1, 72, 193, 1, 71, 1, 2, 81, 0, 2, 80
|
|
.byte 7, 68, 1, 54, 67, 1, 53, 131, 1, 63, 130, 1, 62, 129, 1, 61, 193, 1, 71, 192, 1, 70
|
|
.byte 7, 68, 1, 54, 132, 1, 64, 131, 1, 63, 130, 1, 62, 194, 1, 72, 193, 1, 71, 192, 1, 70
|
|
.byte 6, 68, 1, 54, 67, 1, 53, 66, 1, 52, 130, 1, 62, 129, 1, 61, 128, 1, 60
|
|
.byte 6, 68, 1, 54, 67, 1, 53, 131, 1, 63, 130, 1, 62, 129, 1, 61, 128, 1, 60
|
|
.byte 5, 68, 1, 54, 67, 1, 53, 66, 1, 52, 65, 1, 51, 64, 1, 50
|
|
.byte 6, 68, 1, 54, 67, 1, 53, 66, 1, 52, 2, 1, 42, 1, 1, 41, 0, 1, 40
|
|
.byte 6, 68, 1, 54, 67, 1, 53, 3, 1, 43, 2, 1, 42, 1, 1, 41, 0, 1, 40
|
|
.byte 7, 68, 1, 54, 67, 1, 53, 3, 1, 43, 2, 1, 42, 1, 1, 41, 193, 0, 31, 192, 0, 30
|
|
.byte 7, 68, 1, 54, 4, 1, 44, 3, 1, 43, 2, 1, 42, 194, 0, 32, 193, 0, 31, 192, 0, 30
|
|
.byte 8, 68, 1, 54, 4, 1, 44, 3, 1, 43, 2, 1, 42, 194, 0, 32, 193, 0, 31, 192, 0, 30, 128, 0, 20
|
|
.byte 8, 5, 1, 45, 4, 1, 44, 3, 1, 43, 195, 0, 33, 194, 0, 32, 193, 0, 31, 129, 0, 21, 128, 0, 20
|
|
.byte 9, 68, 1, 54, 4, 1, 44, 3, 1, 43, 195, 0, 33, 194, 0, 32, 193, 0, 31, 129, 0, 21, 128, 0, 20, 64, 0, 10
|
|
.byte 9, 5, 1, 45, 4, 1, 44, 196, 0, 34, 195, 0, 33, 194, 0, 32, 130, 0, 22, 129, 0, 21, 65, 0, 11, 64, 0, 10
|
|
|
|
.BSS
|
|
|
|
.align 256
|
|
View_Current: .res GRID_HEIGHT*GRID_WIDTH ; current displayed view
|
|
|
|
View_Offset: .res 2 ; offset of the corner from HGR_GRID (x,y)
|
|
|
|
Tiles_Transparent: .res GRID_WIDTH*SIZEOF_TILETRANSP_T ; Tiles on the same line as the player that don't block the view
|
|
; struct { int8_t* p_in_world; int8_t offset_from_player}
|
|
|
|
DBG_NB_REDRAW: .res 1
|
|
|
|
; This alignement is **MANDATORY** for the raycasting to work:
|
|
; only 8-bit additions are used to compute pointers in this view
|
|
.align 256
|
|
View_Future: .res GRID_HEIGHT*GRID_WIDTH ; next displayed view
|