diff --git a/crates/tools/pbxgen-stress/src/lib.rs b/crates/tools/pbxgen-stress/src/lib.rs index 284f7b87..e89b2479 100644 --- a/crates/tools/pbxgen-stress/src/lib.rs +++ b/crates/tools/pbxgen-stress/src/lib.rs @@ -26,6 +26,13 @@ use std::path::PathBuf; const STRESS_GLYPH_ASSET_ID: AssetId = 100; const STRESS_SCENE_ASSET_ID: AssetId = 1; +const STRESS_VIEWPORT_W: i32 = 480; +const STRESS_VIEWPORT_H: i32 = 270; +const STRESS_SPRITE_COLS: i32 = 48; +const STRESS_SPRITE_ROWS: i32 = 24; +const STRESS_SPRITE_SPACING_PX: i32 = 10; +const STRESS_SCENE_TILE_W: usize = 96; +const STRESS_SCENE_TILE_H: usize = 64; fn asm(s: &str) -> Vec { assemble(s).expect("assemble") @@ -141,34 +148,38 @@ fn heavy_load(rom: &mut Vec) { rom.extend(asm("PUSH_I32 0\nHOSTCALL 0")); - rom.extend(asm( - "GET_GLOBAL 0\nPUSH_I32 2\nMUL\nPUSH_I32 192\nMOD\nGET_GLOBAL 0\nPUSH_I32 76\nMOD\nHOSTCALL 4", - )); + let scene_width_px = (STRESS_SCENE_TILE_W * 8) as i32; + let scene_height_px = (STRESS_SCENE_TILE_H * 8) as i32; + let camera_x_span = scene_width_px - STRESS_VIEWPORT_W; + let camera_y_span = scene_height_px - STRESS_VIEWPORT_H; + rom.extend(asm(&format!( + "GET_GLOBAL 0\nPUSH_I32 2\nMUL\nPUSH_I32 {camera_x_span}\nMOD\nGET_GLOBAL 0\nPUSH_I32 {camera_y_span}\nMOD\nHOSTCALL 4" + ))); rom.extend(asm("PUSH_I32 0\nSET_LOCAL 0")); let row_loop_start = rom.len() as u32; - rom.extend(asm("GET_LOCAL 0\nPUSH_I32 16\nLT")); + rom.extend(asm(&format!("GET_LOCAL 0\nPUSH_I32 {STRESS_SPRITE_ROWS}\nLT"))); let jif_row_end_offset = rom.len() + 2; rom.extend(asm("JMP_IF_FALSE 0")); rom.extend(asm("PUSH_I32 0\nSET_LOCAL 1")); let col_loop_start = rom.len() as u32; - rom.extend(asm("GET_LOCAL 1\nPUSH_I32 32\nLT")); + rom.extend(asm(&format!("GET_LOCAL 1\nPUSH_I32 {STRESS_SPRITE_COLS}\nLT"))); let jif_col_end_offset = rom.len() + 2; rom.extend(asm("JMP_IF_FALSE 0")); - rom.extend(asm( + rom.extend(asm(&format!( "PUSH_I32 0\n\ - GET_LOCAL 0\nPUSH_I32 32\nMUL\nGET_LOCAL 1\nADD\nGET_GLOBAL 0\nADD\nPUSH_I32 15\nMOD\nPUSH_I32 1\nADD\n\ - GET_LOCAL 1\nPUSH_I32 10\nMUL\nGET_GLOBAL 0\nPUSH_I32 10\nMOD\nADD\nPUSH_I32 320\nMOD\n\ - GET_LOCAL 0\nPUSH_I32 10\nMUL\nGET_GLOBAL 0\nPUSH_I32 2\nMUL\nPUSH_I32 10\nMOD\nADD\nPUSH_I32 180\nMOD\n\ + GET_LOCAL 0\nPUSH_I32 {STRESS_SPRITE_COLS}\nMUL\nGET_LOCAL 1\nADD\nGET_GLOBAL 0\nADD\nPUSH_I32 15\nMOD\nPUSH_I32 1\nADD\n\ + GET_LOCAL 1\nPUSH_I32 {STRESS_SPRITE_SPACING_PX}\nMUL\nGET_GLOBAL 0\nPUSH_I32 10\nMOD\nADD\nPUSH_I32 {STRESS_VIEWPORT_W}\nMOD\n\ + GET_LOCAL 0\nPUSH_I32 {STRESS_SPRITE_SPACING_PX}\nMUL\nGET_GLOBAL 0\nPUSH_I32 2\nMUL\nPUSH_I32 10\nMOD\nADD\nPUSH_I32 {STRESS_VIEWPORT_H}\nMOD\n\ GET_LOCAL 0\nGET_LOCAL 1\nADD\nGET_GLOBAL 0\nADD\nPUSH_I32 4\nMOD\n\ PUSH_I32 0\n\ GET_LOCAL 1\nGET_GLOBAL 0\nADD\nPUSH_I32 1\nBIT_AND\nPUSH_I32 0\nNEQ\n\ GET_LOCAL 0\nGET_GLOBAL 0\nADD\nPUSH_I32 1\nBIT_AND\nPUSH_I32 0\nNEQ\n\ GET_LOCAL 0\nGET_LOCAL 1\nADD\nPUSH_I32 4\nMOD\n\ - HOSTCALL 5\nPOP_N 1", - )); + HOSTCALL 5\nPOP_N 1" + ))); rom.extend(asm("GET_LOCAL 1\nPUSH_I32 1\nADD\nSET_LOCAL 1")); let jmp_col_loop_offset = rom.len() + 2; @@ -180,23 +191,23 @@ fn heavy_load(rom: &mut Vec) { rom.extend(asm("JMP 0")); let row_loop_end = rom.len() as u32; - rom.extend(asm("GET_GLOBAL 0\nPUSH_I32 3\nMUL\nPUSH_I32 220\nMOD\n\ + rom.extend(asm("GET_GLOBAL 0\nPUSH_I32 3\nMUL\nPUSH_I32 380\nMOD\n\ PUSH_I32 8\n\ PUSH_CONST 0\n\ GET_GLOBAL 0\nPUSH_I32 2047\nMUL\nPUSH_I32 65535\nBIT_AND\n\ HOSTCALL 1")); - rom.extend(asm("PUSH_I32 12\n\ - GET_GLOBAL 0\nPUSH_I32 2\nMUL\nPUSH_I32 120\nMOD\nPUSH_I32 24\nADD\n\ + rom.extend(asm("PUSH_I32 16\n\ + GET_GLOBAL 0\nPUSH_I32 2\nMUL\nPUSH_I32 186\nMOD\nPUSH_I32 32\nADD\n\ PUSH_CONST 1\n\ GET_GLOBAL 0\nPUSH_I32 4093\nMUL\nPUSH_I32 65535\nBIT_AND\n\ HOSTCALL 1")); - rom.extend(asm("PUSH_I32 220\n\ - GET_GLOBAL 0\nPUSH_I32 5\nMUL\nPUSH_I32 140\nMOD\n\ + rom.extend(asm("PUSH_I32 336\n\ + GET_GLOBAL 0\nPUSH_I32 5\nMUL\nPUSH_I32 194\nMOD\n\ PUSH_CONST 2\n\ GET_GLOBAL 0\nPUSH_I32 1237\nMUL\nPUSH_I32 65535\nBIT_AND\n\ HOSTCALL 1")); - rom.extend(asm("GET_GLOBAL 0\nPUSH_I32 4\nMUL\nPUSH_I32 180\nMOD\nPUSH_I32 80\nADD\n\ - GET_GLOBAL 0\nPUSH_I32 3\nMUL\nPUSH_I32 90\nMOD\nPUSH_I32 70\nADD\n\ + rom.extend(asm("GET_GLOBAL 0\nPUSH_I32 4\nMUL\nPUSH_I32 240\nMOD\nPUSH_I32 112\nADD\n\ + GET_GLOBAL 0\nPUSH_I32 3\nMUL\nPUSH_I32 120\nMOD\nPUSH_I32 88\nADD\n\ PUSH_CONST 3\n\ GET_GLOBAL 0\nPUSH_I32 3001\nMUL\nPUSH_I32 65535\nBIT_AND\n\ HOSTCALL 1")); @@ -326,19 +337,23 @@ fn build_scene_bank() -> SceneBank { flip_x: false, flip_y: false, }; - 64 * 32 + STRESS_SCENE_TILE_W * STRESS_SCENE_TILE_H ]; - for step in 0..8 { - let x = 4 + step * 7 + layer_index * 2; - let y = 2 + step * 3 + layer_index * 2; - let index = y * 64 + x; - tiles[index] = Tile { - active: true, - glyph: Glyph { glyph_id: 0, palette_id: layer_index as u8 + 1 }, - flip_x: false, - flip_y: false, - }; + for y in 0..STRESS_SCENE_TILE_H { + for x in 0..STRESS_SCENE_TILE_W { + let diagonal = (x + layer_index * 2) % 11 == (y * 2) % 11; + let stripe = (x / 6 + y / 5 + layer_index) % 5 == 0; + if diagonal || stripe { + let index = y * STRESS_SCENE_TILE_W + x; + tiles[index] = Tile { + active: true, + glyph: Glyph { glyph_id: 0, palette_id: layer_index as u8 + 1 }, + flip_x: false, + flip_y: false, + }; + } + } } SceneLayer { @@ -351,15 +366,19 @@ fn build_scene_bank() -> SceneBank { 2 => ParallaxFactor { x: 0.5, y: 0.5 }, _ => ParallaxFactor { x: 0.25, y: 0.25 }, }, - tilemap: TileMap { width: 64, height: 32, tiles }, + tilemap: TileMap { + width: STRESS_SCENE_TILE_W, + height: STRESS_SCENE_TILE_H, + tiles, + }, } }); // Keep the farthest layer a bit sparser so the diagonal remains visually readable. - for step in 0..4 { - let x = 10 + step * 12; - let y = 4 + step * 5; - let index = y * 64 + x; + for step in 0..12 { + let x = 10 + step * 7; + let y = 4 + step * 3; + let index = y * STRESS_SCENE_TILE_W + x; layers[3].tilemap.tiles[index].active = false; } diff --git a/test-cartridges/stress-console/assets.pa b/test-cartridges/stress-console/assets.pa index ca43164c..aad01aef 100644 Binary files a/test-cartridges/stress-console/assets.pa and b/test-cartridges/stress-console/assets.pa differ diff --git a/test-cartridges/stress-console/program.pbx b/test-cartridges/stress-console/program.pbx index 5f278669..62767f59 100644 Binary files a/test-cartridges/stress-console/program.pbx and b/test-cartridges/stress-console/program.pbx differ