X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=ld45_start_nothing;a=blobdiff_plain;f=src%2Fgfx.asm;fp=src%2Fgfx.asm;h=a3f2d39ea2efc34d2c2d8f328bad797a814bb3d9;hp=d35213935a64775454a4b5145621837a550a34a2;hb=6a16a1c526937ee551f968901cb949d55e35ecda;hpb=778d7ca8d282c31b4067f6a6e06df7be72822ea1 diff --git a/src/gfx.asm b/src/gfx.asm index d352139..a3f2d39 100644 --- a/src/gfx.asm +++ b/src/gfx.asm @@ -28,8 +28,21 @@ init_gfx: ; video mode 13h (320x200 8bpp) mov ax, 13h int 10h - call clear + + ; setup the spritesheet palette + mov si, sprsheet_cmap + xor cl, cl +.cmaploop: + mov al, cl + mov ah, [si] + mov bl, [si + 1] + mov bh, [si + 2] + add si, 3 + call set_palette_entry + dec cl + jnz .cmaploop + ret clear: @@ -86,3 +99,51 @@ set_palette_entry: out dx, al pop dx ret + + ; slow_sprite(short id, short x, short y) + ; assumptions: 32x32, one after the other, 0 is transparent + ; XXX sprsheet needs to go to its own segment +slow_sprite: + push bp + mov bp, sp + pusha + + mov ax, FRAMEBUF_SEG + mov es, ax + mov ax, [bp + 8] ; ax <- y + sub ax, 16 ; ax <- y - 16 (center sprite vertically) + mov bx, ax + shl ax, 8 + shl bx, 6 + add ax, bx ; ax <- (y - 16) * 320 + mov di, [bp + 6] ; di <- x + sub di, 16 ; di <- x - 16 (center sprite horizontally) + add di, ax ; di <- (y - 16) * 320 + (x - 16) + + mov si, sprsheet_tiles + ; calculate sprite id offset (each spr is 32*32=1k) + mov ax, [bp + 4] + shl ax, 10 + add si, ax + + mov cx, 32 +.yloop: + xor bx, bx +.xloop: + mov al, [si] + cmp al, 0 + ;jz .skip_pixel + mov [es:di + bx], al +.skip_pixel: + inc si + inc bx + cmp bx, 32 + jnz .xloop + + add di, 320 + dec cx + jnz .yloop + + popa + pop bp + ret