src = $(wildcard src/*.asm)
+data = data/sprsheet.inc
bin = game
QEMU_FLAGS = -fda floppy.img -serial file:serial.log -soundhw sb16 -d guest_errors
bootldr: src/boot/boot.asm $(bin)
nasm -o $@ -f bin -DBINSIZE=`ls -l $(bin) | awk '{print $$5}'` $<
-$(bin): $(src)
+$(bin): $(src) $(data)
nasm -o $@ -f bin -i src/ src/main.asm
boot.img: bootldr $(bin)
dd of=$@ if=/dev/zero bs=512 count=2880
dd of=$@ if=$< bs=1 conv=notrunc
+data/sprsheet.inc: data/sprsheet.png
+ img2tiles -o $@ -n -t 32x32 $<
+
.PHONY: clean
clean:
rm -f $(bin) bootldr floppy.img boot.img
; 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