foo
[ld45_start_nothing] / src / gfx.asm
index d352139..a3f2d39 100644 (file)
@@ -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