From b18dd94a06c0bd61d56d22e83006e659ba2ac40c Mon Sep 17 00:00:00 2001 From: John Bliss Date: Sat, 25 Apr 2026 23:46:23 -0400 Subject: [PATCH] got basic 2bpp sprites working. need to test 1bpp again with new system. --- uxn/uxn.ha | 106 ++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 73 insertions(+), 33 deletions(-) diff --git a/uxn/uxn.ha b/uxn/uxn.ha index 89bd9a5..fe71c02 100644 --- a/uxn/uxn.ha +++ b/uxn/uxn.ha @@ -26,7 +26,6 @@ export type uxn = struct { palette: [4] u16, }; -//TODO find a way to use these below export def MAXWIDTH = 4096; export def MAXHEIGHT = 2160; export def SCREENRATE = 60; @@ -236,38 +235,23 @@ fn copy_sprite_to_screen(bpp2: bool, colors: u8, x: u16, y: u16, addr: u16, flip let xoff: u16 = 0; let yoff: u16 = 0; - - - // fmt::printfln("Drawing Sprite to x: {} y: {}", x, y)!; - for(let i = 0; i < bytes_per_sprite; i+=1){ - let data: u8 = state.ram[addr + i: u16]; - const pixels: []u8 = if(bpp2){ - yield [ - (data & 0b11000000) >> 6, - (data & 0b00110000) >> 4, - (data & 0b00001100) >> 2, - (data & 0b00000011) >> 0 ]; - } else { - yield [ - (data & 0b10000000) >> 7, - (data & 0b01000000) >> 6, - (data & 0b00100000) >> 5, - (data & 0b00010000) >> 4, - (data & 0b00001000) >> 3, - (data & 0b00000100) >> 2, - (data & 0b00000010) >> 1, - (data & 0b00000001) >> 0 ]; - }; + if(!bpp2) { + const pixels = get_pixels_from_1bpp_sprite(addr,state); for(let p .. pixels){ - const color: u8 = if (bpp2){ - yield p: u8; // implement real value based on colors value - }else { - if( p == 0 ) yield 0: u8; - yield colors: u8; - - } & 0b00000011; - // fmt::printfln("Drawing 2bpp: {} Sprite Pixel to x: {} y: {} color: {}", bpp2, x+xoff, y+yoff, p)!; + const color = if(p == 0) { yield 0:u8;} else {yield colors: u8; }; + if(layer1) { state.screen.1[x+xoff][y+yoff] = color; } + else {state.screen.0[x+xoff][y+yoff] = color; }; + xoff += 1; + if(xoff >= 8){ + xoff = 0; + yoff += 1; + }; + }; + }else{ + const pixels = get_pixels_from_2bpp_sprite(addr,state); + for(let p .. pixels){ + const color = p; //TODO use colors bits if(layer1) { state.screen.1[x+xoff][y+yoff] = color; } else {state.screen.0[x+xoff][y+yoff] = color; }; xoff += 1; @@ -275,11 +259,67 @@ fn copy_sprite_to_screen(bpp2: bool, colors: u8, x: u16, y: u16, addr: u16, flip xoff = 0; yoff += 1; }; - - }; }; + // fmt::printfln("Drawing Sprite to x: {} y: {}", x, y)!; + // for(let i = 0; i < bytes_per_sprite; i+=1){ + // const pixels = get_pixels_from_sprite(bpp2,addr,state); + // for(let p .. pixels){ + // const color: u8 = (if (bpp2){ + // yield p: u8; // implement real value based on colors value + // }else { + // if( p == 0 ) yield 0: u8; + // yield colors: u8; + + // } )& 0b00000011; + // // fmt::printfln("Drawing 2bpp: {} Sprite Pixel to x: {} y: {} color: {}", bpp2, x+xoff, y+yoff, p)!; + // if(layer1) { state.screen.1[x+xoff][y+yoff] = color; } + // else {state.screen.0[x+xoff][y+yoff] = color; }; + // xoff += 1; + // if(xoff >= 8){ + // xoff = 0; + // yoff += 1; + // }; + + + // }; + // }; + +}; + +fn get_pixels_from_1bpp_sprite(addr: u16, state: *uxn) []u8 = { + let pixels: [64]u8 = [0...]; + + for(let i = 0; i < 8; i+=1){ + let data: u8 = state.ram[addr + i: u16]; + pixels[i*8 +0] = (data & 0b10000000) >> 7; + pixels[i*8 +1] = (data & 0b01000000) >> 6; + pixels[i*8 +2] = (data & 0b00100000) >> 5; + pixels[i*8 +3] = (data & 0b00010000) >> 4; + pixels[i*8 +4] = (data & 0b00001000) >> 3; + pixels[i*8 +5] = (data & 0b00000100) >> 2; + pixels[i*8 +6] = (data & 0b00000010) >> 1; + pixels[i*8 +7] = (data & 0b00000001) >> 0; + }; + return pixels; +}; +fn get_pixels_from_2bpp_sprite(addr: u16, state: *uxn) []u8 = { + let pixels: [64]u8 = [0...]; + + for(let i = 0; i < 8; i+=1){ + const data1: u8 = state.ram[addr + i: u16]; + const data2: u8 = state.ram[addr + i:u16 + 8]; + pixels[i*8 +0] = ((data1 & 0b10000000) >> 6) | ((data2 & 0b10000000) >> 7); + pixels[i*8 +1] = ((data1 & 0b01000000) >> 5) | ((data2 & 0b01000000) >> 6); + pixels[i*8 +2] = ((data1 & 0b00100000) >> 4) | ((data2 & 0b00100000) >> 5); + pixels[i*8 +3] = ((data1 & 0b00010000) >> 3) | ((data2 & 0b00010000) >> 4); + pixels[i*8 +4] = ((data1 & 0b00001000) >> 2) | ((data2 & 0b00001000) >> 3); + pixels[i*8 +5] = ((data1 & 0b00000100) >> 1) | ((data2 & 0b00000100) >> 2); + pixels[i*8 +6] = ((data1 & 0b00000010) >> 0) | ((data2 & 0b00000010) >> 1); + pixels[i*8 +7] = ((data1 & 0b00000001) << 1) | ((data2 & 0b00000001) >> 0); + }; + return pixels; }; export fn get_color(x: u16, y: u16, state: *uxn) u16 = {