From d5e9dde21d28ef5b0418616390495274a323bba0 Mon Sep 17 00:00:00 2001 From: Robin Chappatte Date: Sat, 25 Apr 2026 07:35:00 +0200 Subject: [PATCH] use prerendered screen and remove sprite rotation (cherry picked from commit 3783a98f95a11c1122877f57b755a14a8b3ff713) --- assets/screen.ppm | Bin 0 -> 14457 bytes build.ts | 13 +-- src/consts/sprites.asm | 16 +--- src/init.asm | 20 +---- src/lib/drawing.asm | 139 +++++------------------------ src/lib/sprite_rotation.asm | 171 ------------------------------------ src/main.asm | 31 ++----- src/reserved_space.asm | 5 -- 8 files changed, 44 insertions(+), 351 deletions(-) create mode 100644 assets/screen.ppm delete mode 100644 src/lib/sprite_rotation.asm diff --git a/assets/screen.ppm b/assets/screen.ppm new file mode 100644 index 0000000000000000000000000000000000000000..ce01ee700878dbcc0c8075ccbf3b2a8f14671863 GIT binary patch literal 14457 zcmeH}Pm9|y6vT7Rr!e%~W!ZL@-g_uLY{^$>X($V2Teg3ow|?_fb}HNREdS*2BGxtu zCic^4Ml%vf+TCqmRBxa5AAjyYSD*e=@7~|= zK0I#UTvvD3+nd|l?dI~k%)n}A;IP@O?-^UI!}_9zM9m5&BiDIXw!SeD=S`wZY;0FB zX`ay}W#)~Xh|!rxOWNZ^7CrnGkp-4Ek>uGhs(qJHaUw>Skx*T7B1Tnd85JjDG$hR4 zM_?A7h0BR7svA^|^3%V`%!k`|rR!nyDwo}GE8dT|dT#M?Sv%%8CEvIZ<>3lM(eQo98 zS}m2Rfq^59C2(lu2(MXp%(i z#8TzZIR2zJ+n6K~JF!$bG>$*%%{C@U#7-=A8hXkm!*?WuS{pi$>C7cdSv1bl@$ErX zDO2%48M4AGRSs1bnTl;>$O^MmIaFO_Dz=d!E6h^m(BQ%xzTIU*9o9V?j5-X|1{(hx zSn4!Xw-L)7q9$^UM2d!rR;0lOHU|>10i=!tby86|Qtcb0I1!_E z7_B{ARkD>wnYoNwA6k33s$?sVGIJTVKD735RmoN!W#(E`HyO`8hq;WN)0NJpRaTTM z54W5$yJEDQt8&Vmh|zMc$|-XqMuV&FOdNhsI3vW1;#iLqaZt5h!a^<_Z+?j%@ehWbYU3P zzRRdM5u?jUs4h7XqpGxwiW9YH_N-h?hvrVu{3RBs&bz*6{C*XtV104N7B{ipm!``M KTxMYAGw=`912X6U literal 0 HcmV?d00001 diff --git a/build.ts b/build.ts index dc8cb41..9b52f5c 100755 --- a/build.ts +++ b/build.ts @@ -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)) /** diff --git a/src/consts/sprites.asm b/src/consts/sprites.asm index 8c6f485..9f6f12b 100644 --- a/src/consts/sprites.asm +++ b/src/consts/sprites.asm @@ -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 diff --git a/src/init.asm b/src/init.asm index c5688a2..06ed09b 100644 --- a/src/init.asm +++ b/src/init.asm @@ -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 diff --git a/src/lib/drawing.asm b/src/lib/drawing.asm index 2424274..03cbf44 100644 --- a/src/lib/drawing.asm +++ b/src/lib/drawing.asm @@ -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 diff --git a/src/lib/sprite_rotation.asm b/src/lib/sprite_rotation.asm deleted file mode 100644 index 2d3a1f0..0000000 --- a/src/lib/sprite_rotation.asm +++ /dev/null @@ -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 diff --git a/src/main.asm b/src/main.asm index be88511..6118fc4 100644 --- a/src/main.asm +++ b/src/main.asm @@ -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 ; diff --git a/src/reserved_space.asm b/src/reserved_space.asm index f513191..cda0e83 100644 --- a/src/reserved_space.asm +++ b/src/reserved_space.asm @@ -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: \ No newline at end of file