Internal Viewport 270p (480x270)

This commit is contained in:
bQUARKz 2026-04-28 18:17:12 +01:00
parent 6a681ba4bc
commit 1ab2898f5e
Signed by: bquarkz
SSH Key Fingerprint: SHA256:Z7dgqoglWwoK6j6u4QC87OveEq74WOhFN+gitsxtkf8
3 changed files with 53 additions and 34 deletions

View File

@ -26,6 +26,13 @@ use std::path::PathBuf;
const STRESS_GLYPH_ASSET_ID: AssetId = 100; const STRESS_GLYPH_ASSET_ID: AssetId = 100;
const STRESS_SCENE_ASSET_ID: AssetId = 1; 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<u8> { fn asm(s: &str) -> Vec<u8> {
assemble(s).expect("assemble") assemble(s).expect("assemble")
@ -141,34 +148,38 @@ fn heavy_load(rom: &mut Vec<u8>) {
rom.extend(asm("PUSH_I32 0\nHOSTCALL 0")); rom.extend(asm("PUSH_I32 0\nHOSTCALL 0"));
rom.extend(asm( let scene_width_px = (STRESS_SCENE_TILE_W * 8) as i32;
"GET_GLOBAL 0\nPUSH_I32 2\nMUL\nPUSH_I32 192\nMOD\nGET_GLOBAL 0\nPUSH_I32 76\nMOD\nHOSTCALL 4", 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")); rom.extend(asm("PUSH_I32 0\nSET_LOCAL 0"));
let row_loop_start = rom.len() as u32; 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; let jif_row_end_offset = rom.len() + 2;
rom.extend(asm("JMP_IF_FALSE 0")); rom.extend(asm("JMP_IF_FALSE 0"));
rom.extend(asm("PUSH_I32 0\nSET_LOCAL 1")); rom.extend(asm("PUSH_I32 0\nSET_LOCAL 1"));
let col_loop_start = rom.len() as u32; 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; let jif_col_end_offset = rom.len() + 2;
rom.extend(asm("JMP_IF_FALSE 0")); rom.extend(asm("JMP_IF_FALSE 0"));
rom.extend(asm( rom.extend(asm(&format!(
"PUSH_I32 0\n\ "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 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 10\nMUL\nGET_GLOBAL 0\nPUSH_I32 10\nMOD\nADD\nPUSH_I32 320\nMOD\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 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_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\ GET_LOCAL 0\nGET_LOCAL 1\nADD\nGET_GLOBAL 0\nADD\nPUSH_I32 4\nMOD\n\
PUSH_I32 0\n\ PUSH_I32 0\n\
GET_LOCAL 1\nGET_GLOBAL 0\nADD\nPUSH_I32 1\nBIT_AND\nPUSH_I32 0\nNEQ\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_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\ 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")); rom.extend(asm("GET_LOCAL 1\nPUSH_I32 1\nADD\nSET_LOCAL 1"));
let jmp_col_loop_offset = rom.len() + 2; let jmp_col_loop_offset = rom.len() + 2;
@ -180,23 +191,23 @@ fn heavy_load(rom: &mut Vec<u8>) {
rom.extend(asm("JMP 0")); rom.extend(asm("JMP 0"));
let row_loop_end = rom.len() as u32; 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_I32 8\n\
PUSH_CONST 0\n\ PUSH_CONST 0\n\
GET_GLOBAL 0\nPUSH_I32 2047\nMUL\nPUSH_I32 65535\nBIT_AND\n\ GET_GLOBAL 0\nPUSH_I32 2047\nMUL\nPUSH_I32 65535\nBIT_AND\n\
HOSTCALL 1")); HOSTCALL 1"));
rom.extend(asm("PUSH_I32 12\n\ rom.extend(asm("PUSH_I32 16\n\
GET_GLOBAL 0\nPUSH_I32 2\nMUL\nPUSH_I32 120\nMOD\nPUSH_I32 24\nADD\n\ GET_GLOBAL 0\nPUSH_I32 2\nMUL\nPUSH_I32 186\nMOD\nPUSH_I32 32\nADD\n\
PUSH_CONST 1\n\ PUSH_CONST 1\n\
GET_GLOBAL 0\nPUSH_I32 4093\nMUL\nPUSH_I32 65535\nBIT_AND\n\ GET_GLOBAL 0\nPUSH_I32 4093\nMUL\nPUSH_I32 65535\nBIT_AND\n\
HOSTCALL 1")); HOSTCALL 1"));
rom.extend(asm("PUSH_I32 220\n\ rom.extend(asm("PUSH_I32 336\n\
GET_GLOBAL 0\nPUSH_I32 5\nMUL\nPUSH_I32 140\nMOD\n\ GET_GLOBAL 0\nPUSH_I32 5\nMUL\nPUSH_I32 194\nMOD\n\
PUSH_CONST 2\n\ PUSH_CONST 2\n\
GET_GLOBAL 0\nPUSH_I32 1237\nMUL\nPUSH_I32 65535\nBIT_AND\n\ GET_GLOBAL 0\nPUSH_I32 1237\nMUL\nPUSH_I32 65535\nBIT_AND\n\
HOSTCALL 1")); HOSTCALL 1"));
rom.extend(asm("GET_GLOBAL 0\nPUSH_I32 4\nMUL\nPUSH_I32 180\nMOD\nPUSH_I32 80\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 90\nMOD\nPUSH_I32 70\nADD\n\ GET_GLOBAL 0\nPUSH_I32 3\nMUL\nPUSH_I32 120\nMOD\nPUSH_I32 88\nADD\n\
PUSH_CONST 3\n\ PUSH_CONST 3\n\
GET_GLOBAL 0\nPUSH_I32 3001\nMUL\nPUSH_I32 65535\nBIT_AND\n\ GET_GLOBAL 0\nPUSH_I32 3001\nMUL\nPUSH_I32 65535\nBIT_AND\n\
HOSTCALL 1")); HOSTCALL 1"));
@ -326,19 +337,23 @@ fn build_scene_bank() -> SceneBank {
flip_x: false, flip_x: false,
flip_y: false, flip_y: false,
}; };
64 * 32 STRESS_SCENE_TILE_W * STRESS_SCENE_TILE_H
]; ];
for step in 0..8 { for y in 0..STRESS_SCENE_TILE_H {
let x = 4 + step * 7 + layer_index * 2; for x in 0..STRESS_SCENE_TILE_W {
let y = 2 + step * 3 + layer_index * 2; let diagonal = (x + layer_index * 2) % 11 == (y * 2) % 11;
let index = y * 64 + x; let stripe = (x / 6 + y / 5 + layer_index) % 5 == 0;
tiles[index] = Tile { if diagonal || stripe {
active: true, let index = y * STRESS_SCENE_TILE_W + x;
glyph: Glyph { glyph_id: 0, palette_id: layer_index as u8 + 1 }, tiles[index] = Tile {
flip_x: false, active: true,
flip_y: false, glyph: Glyph { glyph_id: 0, palette_id: layer_index as u8 + 1 },
}; flip_x: false,
flip_y: false,
};
}
}
} }
SceneLayer { SceneLayer {
@ -351,15 +366,19 @@ fn build_scene_bank() -> SceneBank {
2 => ParallaxFactor { x: 0.5, y: 0.5 }, 2 => ParallaxFactor { x: 0.5, y: 0.5 },
_ => ParallaxFactor { x: 0.25, y: 0.25 }, _ => 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. // Keep the farthest layer a bit sparser so the diagonal remains visually readable.
for step in 0..4 { for step in 0..12 {
let x = 10 + step * 12; let x = 10 + step * 7;
let y = 4 + step * 5; let y = 4 + step * 3;
let index = y * 64 + x; let index = y * STRESS_SCENE_TILE_W + x;
layers[3].tilemap.tiles[index].active = false; layers[3].tilemap.tiles[index].active = false;
} }