; 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:
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