; 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