; vi:filetype=nasm ts=8 sts=8 sw=8: ; ; list of functions ; ----------------- ; init_gfx ; initializes the video hardware and graphics routines ; clear ; clears the framebuffer (not vmem) ; clobbers: eax, ecx, edi ; swap_buffers ; copies the framebuffer to video memory ; clobbers: eax, ecx, edi, esi ; wait_vsync ; clobbers: al, dx ; set_palette_entry(idx[al], r[ah], g[bl], b[bh]) ; colors are 0-255 bits 32 section .text VIDMEM_ADDR equ 0a0000h FRAMEBUF_ADDR equ 090000h REG_CRTC_STATUS equ 3dah CRTC_VBLANK_BIT equ 08h REG_DAC_ADDR equ 3c8h REG_DAC_DATA equ 3c9h extern sprsheet_cmap extern sprsheet_tiles global init_gfx init_gfx: call clear ; setup the spritesheet palette mov esi, sprsheet_cmap xor cl, cl .cmaploop: mov al, cl mov ah, [esi] mov bl, [esi + 1] mov bh, [esi + 2] add esi, 3 call set_palette_entry inc cl jnz .cmaploop ret global clear clear: mov edi, FRAMEBUF_ADDR xor eax, eax mov ecx, 16000 rep stosd ret global swap_buffers swap_buffers: mov esi, FRAMEBUF_ADDR mov edi, VIDMEM_ADDR mov ecx, 16000 rep movsd ret global wait_vsync wait_vsync: mov dx, REG_CRTC_STATUS .wait_vblank_end: in al, dx and al, CRTC_VBLANK_BIT jnz .wait_vblank_end .wait_vblank_start: in al, dx and al, CRTC_VBLANK_BIT jz .wait_vblank_start ret set_palette_entry: push dx mov dx, REG_DAC_ADDR out dx, al inc dx ; dx <- REG_DAC_DATA mov al, ah shr al, 2 out dx, al mov al, bl shr al, 2 out dx, al mov al, bh shr al, 2 out dx, al pop dx ret ; slow_sprite(int id, int x, int y) ; assumptions: 32x32, one after the other, 0 is transparent global slow_sprite slow_sprite: push ebp mov ebp, esp pusha mov eax, [ebp + 16] ; ax <- y sub eax, 16 ; ax <- y - 16 (center sprite vertically) mov ebx, eax shl eax, 8 shl ebx, 6 add eax, ebx ; ax <- (y - 16) * 320 mov edi, [ebp + 12] ; di <- x sub edi, 16 ; di <- x - 16 (center sprite horizontally) add edi, eax ; di <- (y - 16) * 320 + (x - 16) add edi, FRAMEBUF_ADDR mov esi, sprsheet_tiles ; calculate sprite id offset (each spr is 32*32=1k) mov eax, [ebp + 8] shl eax, 10 add esi, eax mov ecx, 32 .yloop: xor ebx, ebx .xloop: mov al, [esi] cmp al, 0 ;jz .skip_pixel mov [edi + ebx], al .skip_pixel: inc esi inc ebx cmp ebx, 32 jnz .xloop add edi, 320 dec ecx jnz .yloop popa pop ebp ret