use prerendered screen and remove sprite rotation

(cherry picked from commit 3783a98f95)
This commit is contained in:
2026-04-25 07:35:00 +02:00
parent 02e1e4c6b3
commit d5e9dde21d
8 changed files with 44 additions and 351 deletions

BIN
assets/screen.ppm Normal file

Binary file not shown.

View File

@@ -9,6 +9,10 @@ if (Deno.args.length !== 0) {
import { TextLineStream } from "jsr:@std/streams@1.1.0";
const instructionLength = 4; // in bytes
const mapWidth = 15;
const spriteWidth = 5;
const asmFilePaths = [
"src/consts/arch.asm",
"src/consts/game.asm",
@@ -23,14 +27,10 @@ const asmFilePaths = [
"src/lib/game.asm",
"src/lib/drawing.asm",
"src/lib/sprite_rotation.asm",
];
const initialScreenPath = 'assets/screen.ppm';
const reservedSpacePath = 'src/reserved_space.asm';
const instructionLength = 4; // in bytes
const mapWidth = 15;
const spriteWidth = 5;
const mapMatchingStrings = {
0x00_00_00: '0', // Empty
0xFF_00_00: '1', // Wall
@@ -104,6 +104,9 @@ console.log(`
;
`);
const screenBytes = await getDataFromPPM(initialScreenPath);
console.log(bytesToAsmConstU8('screen', screenBytes, spritesMatchingStrings, 1));
console.log(await Deno.readTextFile(reservedSpacePath))
/**

View File

@@ -2,17 +2,9 @@ pub const sprites.width = 5
pub const sprites.height = 5 ; unused as sprite are all square
pub const sprites.size = 25 ; height x width
pub const sprites.rotation_0 = 0
pub const sprites.rotation_90 = 1
pub const sprites.rotation_180 = 2
pub const sprites.rotation_270 = 3
pub const sprites.empty = 0
pub const sprites.unimplemented = 1
pub const sprites.wall_end = 2
pub const sprites.wall_straight = 3
pub const sprites.wall_corner = 4
pub const sprites.robot = 5
pub const sprites.ghost = 6
pub const sprites.coin = 7
pub const sprites.max = 7 ; for lookup table
pub const sprites.robot = 2
pub const sprites.ghost = 3
pub const sprites.coin = 4
pub const sprites.max = 4 ; for lookup table

View File

@@ -17,24 +17,6 @@ lsl r2, r1, arch.instruction_increment_shift
add r2, r2, ptr.textures_addresses
add r3, zr, sprite_unimplemented
store_32 [r2], r3
; sprite_wall_end
add r1, zr, sprites.wall_end
lsl r2, r1, arch.instruction_increment_shift
add r2, r2, ptr.textures_addresses
add r3, zr, sprite_wall_end
store_32 [r2], r3
; sprite_wall_straight
add r1, zr, sprites.wall_straight
lsl r2, r1, arch.instruction_increment_shift
add r2, r2, ptr.textures_addresses
add r3, zr, sprite_wall_straight
store_32 [r2], r3
; sprite_wall_corner
add r1, zr, sprites.wall_corner
lsl r2, r1, arch.instruction_increment_shift
add r2, r2, ptr.textures_addresses
add r3, zr, sprite_wall_corner
store_32 [r2], r3
; sprite_robot
add r1, zr, sprites.robot
lsl r2, r1, arch.instruction_increment_shift
@@ -63,7 +45,7 @@ mov r1, screen.mode_index
screen r1, screen.mode_value
mov r1, screen.offset_index
add r2, zr, ptr.screen
add r2, zr, screen
screen r1, r2
mov r1, screen.resolution_index

View File

@@ -5,53 +5,6 @@ include ../consts/scene
include ../consts/sprites
include sprite_rotation
; /* Draw the whole (fill the screen memory with the values of the sprites based on the map)
; Inputs:
; Outputs:
; Locals:
; r1: x map coord
; r2: y map coord
; r3: sprite rotation
; r4: sprite id
; r12: rotation (returned by `sprite and rotation`)
; r13: sprite (returned by `get_sprite_id_and_rotation`)
; */
pub drawing.draw_whole_map:
push r1
push r2
push r3
push r4
push r12
push r13
mov r1, 0
mov r2, 0
draw_whole_map_loop:
call sprite_rotation.get_sprite_id_and_rotation
mov r3, r12
mov r4, r13
call drawing.draw_sprite_at_map_coord
add r1, r1, 1
cmp r1, map.width
jne draw_whole_map_loop
mov r1, 0
add r2, r2, 1
cmp r2, map.height
jne draw_whole_map_loop
pop r13
pop r12
pop r4
pop r3
pop r2
pop r1
ret
; /* Return the top-left pixel address of the tile at the given map coordinates
; Inputs:
@@ -77,7 +30,7 @@ get_tile_address:
cmp r3, sprites.height
jne get_tile_address_offset_per_row_loop
add r13, zr, ptr.screen
add r13, zr, screen
mov r3, 0
get_tile_address_margin_top_loop:
@@ -144,8 +97,7 @@ get_sprite_address:
; Inputs:
; r1: map x coord
; r2: map y coord
; r3: sprite rotation
; r4: sprite id
; r3: sprite id
; Outputs:
@@ -158,22 +110,20 @@ pub drawing.draw_sprite_at_map_coord:
push r1
push r2
push r3
push r4
push r13
call get_tile_address
mov r1, r13
push r1
push r13
mov r1, r4
mov r1, r3
call get_sprite_address
mov r2, r13
pop r1
mov r2, r13
pop r13
mov r1, r13
call draw_sprite
pop r13
pop r4
pop r3
pop r2
pop r1
@@ -184,18 +134,15 @@ pub drawing.draw_sprite_at_map_coord:
; Inputs:
; r1: screen address
; r2: sprite address
; r3: rotation
; Outputs:
; Locals:
; r1: current screen pixel address
; r4: x
; r5: y
; r6: current sprite pixel address
; r7: color
; r8: x increment
; r9: y increment
; r2: current sprite pixel address
; r3: x
; r4: color
; r5: sprite last pixel address + 1
; */
draw_sprite:
push r1
@@ -203,67 +150,25 @@ draw_sprite:
push r3
push r4
push r5
push r6
push r7
push r8
push r9
mov r6, r2
; rotation
draw_sprite_cmp_rotation_0:
cmp r3, sprites.rotation_0
jne draw_sprite_cmp_rotation_90
mov r8, 1
mov r9, 0
jmp draw_sprite_loop_init
draw_sprite_cmp_rotation_90:
cmp r3, sprites.rotation_90
jne draw_sprite_cmp_rotation_180
add r6, r6, sprites.size
sub r6, r6, sprites.width
sub r8, zr, sprites.width
mov r9, sprites.size
add r9, r9, 1
jmp draw_sprite_loop_init
draw_sprite_cmp_rotation_180:
cmp r3, sprites.rotation_180
jne draw_sprite_cmp_rotation_270
add r6, r6, sprites.size
sub r6, r6, 1
sub r8, zr, 1
mov r9, 0
jmp draw_sprite_loop_init
draw_sprite_cmp_rotation_270:
add r6, r6, sprites.width
sub r6, r6, 1
mov r8, sprites.width
sub r9, zr, sprites.size
sub r9, r9, 1
draw_sprite_loop_init:
mov r4, 0
mov r5, 0
add r5, r2, sprites.size
mov r3, 0
draw_sprite_loop:
load_8 r7, [r6]
store_8 [r1], r7
add r4, r4, 1
load_8 r4, [r2]
store_8 [r1], r4
add r1, r1, 1
add r6, r6, r8
cmp r4, sprites.width
add r2, r2, 1
add r3, r3, 1
cmp r3, sprites.width
jne draw_sprite_loop
mov r4, 0
add r6, r6, r9
mov r3, 0
add r1, r1, screen.width
sub r1, r1, sprites.width
add r5, r5, 1
cmp r5, sprites.width
cmp r5, r2
jne draw_sprite_loop
pop r9
pop r8
pop r7
pop r6
pop r5
pop r4
pop r3

View File

@@ -1,171 +0,0 @@
include ../consts/offsets
include ../consts/map
include ../consts/sprites
; /* Return the sprite id and rotation for the given map coordinates
; Inputs:
; r1: x map coord
; r2: y map coord
; Outputs:
; r12: sprite rotation
; r13: sprite id
; Locals:
; r3: tile id
; r4: map offset
; r5: counter
; r6: left tile id
; r7: up tile id
; r8: right tile id
; r9: down tile id
; */
pub sprite_rotation.get_sprite_id_and_rotation:
push r1
push r2
push r3
push r4
push r5
push r6
push r7
push r8
push r9
add r4, r1, map
mov r5, 0
get_sprite_id_and_rotation_map_row_loop:
cmp r5, r2
je get_sprite_id_and_rotation_map_row_loop_end
add r4, r4, map.width
add r5, r5, 1
jmp get_sprite_id_and_rotation_map_row_loop
get_sprite_id_and_rotation_map_row_loop_end:
mov r12, sprites.rotation_0 ; default rotation
load_8 r3, [r4]
lsl r3, r3, 3 ; 2*instruction_size = *8 = <<3
add r3, r3, get_sprite_id_and_rotation_jump_table
jmp r3
get_sprite_id_and_rotation_jump_table:
; tile_empty
mov r13, sprites.empty
jmp get_sprite_id_and_rotation_return
; tiles_wall
jmp get_sprite_id_and_rotation_wall
nop
; tile_coin
mov r13, sprites.coin
jmp get_sprite_id_and_rotation_return
get_sprite_id_and_rotation_wall:
mov r6, 0
mov r7, 0
mov r8, 0
mov r9, 0
get_sprite_id_and_rotation_cmp_left:
cmp r1, 0
je get_sprite_id_and_rotation_cmp_up
sub r4, r4, 1
load_8 r6, [r4]
add r4, r4, 1
get_sprite_id_and_rotation_cmp_up:
cmp r2, 0
je get_sprite_id_and_rotation_cmp_right
sub r4, r4, map.width
load_8 r7, [r4]
add r4, r4, map.width
get_sprite_id_and_rotation_cmp_right:
cmp r1, map.max_x
je get_sprite_id_and_rotation_cmp_down
add r4, r4, 1
load_8 r8, [r4]
sub r4, r4, 1
get_sprite_id_and_rotation_cmp_down:
cmp r2, map.max_y
je get_sprite_id_and_rotation_check_connections
add r4, r4, map.width
load_8 r9, [r4]
sub r4, r4, map.width
get_sprite_id_and_rotation_check_connections:
get_sprite_id_and_rotation_straight_0:
cmp r7, map.tiles.wall
jne get_sprite_id_and_rotation_straight_90
cmp r9, map.tiles.wall
jne get_sprite_id_and_rotation_straight_90
mov r12, sprites.rotation_0
mov r13, sprites.wall_straight
jmp get_sprite_id_and_rotation_return
get_sprite_id_and_rotation_straight_90:
cmp r6, map.tiles.wall
jne get_sprite_id_and_rotation_corner_0
cmp r8, map.tiles.wall
jne get_sprite_id_and_rotation_corner_0
mov r12, sprites.rotation_90
mov r13, sprites.wall_straight
jmp get_sprite_id_and_rotation_return
get_sprite_id_and_rotation_corner_0:
cmp r6, map.tiles.wall
jne get_sprite_id_and_rotation_corner_180
cmp r9, map.tiles.wall
jne get_sprite_id_and_rotation_corner_90
mov r12,sprites.rotation_0
mov r13, sprites.wall_corner
jmp get_sprite_id_and_rotation_return
get_sprite_id_and_rotation_corner_90:
cmp r7, map.tiles.wall
jne get_sprite_id_and_rotation_end_90
mov r12,sprites.rotation_90
mov r13, sprites.wall_corner
jmp get_sprite_id_and_rotation_return
get_sprite_id_and_rotation_corner_180:
cmp r8, map.tiles.wall
jne get_sprite_id_and_rotation_end_0
cmp r7, map.tiles.wall
jne get_sprite_id_and_rotation_corner_270
mov r12,sprites.rotation_180
mov r13, sprites.wall_corner
jmp get_sprite_id_and_rotation_return
get_sprite_id_and_rotation_corner_270:
cmp r9, map.tiles.wall
jne get_sprite_id_and_rotation_end_270
mov r12,sprites.rotation_270
mov r13, sprites.wall_corner
jmp get_sprite_id_and_rotation_return
get_sprite_id_and_rotation_end_0:
cmp r9, map.tiles.wall
jne get_sprite_id_and_rotation_end_180
mov r12,sprites.rotation_0
mov r13, sprites.wall_end
jmp get_sprite_id_and_rotation_return
get_sprite_id_and_rotation_end_90:
mov r12,sprites.rotation_90
mov r13, sprites.wall_end
jmp get_sprite_id_and_rotation_return
get_sprite_id_and_rotation_end_180:
mov r12,sprites.rotation_180
mov r13, sprites.wall_end
jmp get_sprite_id_and_rotation_return
get_sprite_id_and_rotation_end_270:
mov r12,sprites.rotation_270
mov r13, sprites.wall_end
;jmp get_sprite_id_and_rotation_return
get_sprite_id_and_rotation_return:
pop r9
pop r8
pop r7
pop r6
pop r5
pop r4
pop r3
pop r2
pop r1
ret

View File

@@ -2,8 +2,6 @@ include consts/screen
include init
call drawing.draw_whole_map
;
; State initialization
;
@@ -22,8 +20,7 @@ store_8 [r6], r2
add r6, r6, 1
store_8 [r6], r5
mov r3, sprites.rotation_0
mov r4, sprites.robot
mov r3, sprites.robot
call drawing.draw_sprite_at_map_coord
; Ghost
@@ -41,8 +38,7 @@ store_8 [r6], r2
add r6, r6, 1
store_8 [r6], r5
mov r3, sprites.rotation_0
mov r4, sprites.ghost
mov r3, sprites.ghost
call drawing.draw_sprite_at_map_coord
;
@@ -229,15 +225,13 @@ game_loop:
; clear old position
mov r1, r2
mov r2, r3
mov r3, sprites.rotation_0
mov r4, sprites.empty
mov r3, sprites.empty
call drawing.draw_sprite_at_map_coord
; draw robot on new position
mov r1, r5
mov r2, r6
mov r3, sprites.rotation_0
mov r4, sprites.robot
mov r3, sprites.robot
call drawing.draw_sprite_at_map_coord
@@ -295,34 +289,27 @@ game_loop:
store_8 [r1], r8
; get tile at previous position
push r2
mov r1, r2
mov r2, r3
call game.get_tile_address_from_map_coord
mov r9, r13
pop r2
load_8 r13, [r13]
; draw tile at previous position
load_8 r1, [r9]
cmp r1, map.tiles.coin
cmp r13, map.tiles.coin
je game_loop_ghost_movement_old_tile_coin
; old tile empty
mov r4, sprites.empty
mov r3, sprites.empty
jmp game_loop_ghost_movement_draw_old_tile
game_loop_ghost_movement_old_tile_coin:
mov r4, sprites.coin
mov r3, sprites.coin
game_loop_ghost_movement_draw_old_tile:
mov r1, r2
mov r2, r3
mov r3, sprites.rotation_0
call drawing.draw_sprite_at_map_coord
; draw ghost on new position
mov r1, r7
mov r2, r8
mov r3, sprites.rotation_0
mov r4, sprites.ghost
mov r3, sprites.ghost
call drawing.draw_sprite_at_map_coord
;

View File

@@ -2,9 +2,6 @@
pub ptr.textures_addresses:
U32 0 ; empty
U32 0 ; placeholder
U32 0 ; wall_end
U32 0 ; wall_straight
U32 0 ; wall_corner
U32 0 ; robot
U32 0 ; ghost
U32 0 ; coin
@@ -31,5 +28,3 @@ U8 0 ; x coord
U8 0 ; y coord
U8 0 ; direction
U8 0 ; [padding]
pub ptr.screen: