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=d35213935a64775454a4b5145621837a550a34a2;hp=0000000000000000000000000000000000000000;hb=778d7ca8d282c31b4067f6a6e06df7be72822ea1;hpb=43024162f96501c111a0fb7ff6b14f39d478c1a3 diff --git a/src/gfx.asm b/src/gfx.asm new file mode 100644 index 0000000..d352139 --- /dev/null +++ b/src/gfx.asm @@ -0,0 +1,88 @@ +; 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: ax, cx, di +; swap_buffers +; copies the framebuffer to video memory +; clobbers: ax, cx, di, si +; wait_vsync +; clobbers: al, dx +; set_palette_entry(idx[al], r[ah], g[bl], b[bh]) +; colors are 0-255 + +VIDMEM_SEG equ 0a000h +FRAMEBUF_SEG equ 09000h + +REG_CRTC_STATUS equ 3dah +CRTC_VBLANK_BIT equ 08h + +REG_DAC_ADDR equ 3c8h +REG_DAC_DATA equ 3c9h + +init_gfx: + ; video mode 13h (320x200 8bpp) + mov ax, 13h + int 10h + + call clear + ret + +clear: + push es + mov ax, FRAMEBUF_SEG + mov es, ax + xor di, di + xor ax, ax + mov cx, 16000 + rep stosd + pop es + ret + +swap_buffers: + push ds + push es + mov ax, FRAMEBUF_SEG + mov ds, ax + xor si, si + mov ax, VIDMEM_SEG + mov es, ax + xor di, di + mov cx, 16000 + rep movsd + pop es + pop ds + ret + +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