+ ; run 16bit video bios test
+ mov ax, 13h
+ int 10h
+
+ ; setup palette
+ mov dx, 3c8h
+ xor al, al
+ out dx, al
+ inc dx
+ xor cl, cl
+.pal: mov al, cl
+ out dx, al
+ xor al, al
+ out dx, al
+ mov al, cl
+ not al
+ out dx, al
+ inc cl
+ jnz .pal
+
+ ; fill framebuffer with xor pattern
+ mov ax, 0a000h
+ mov es, ax
+ xor di, di
+ xor cx, cx
+.yloop: xor dx, dx
+.xloop: mov ax, dx
+ xor ax, cx
+ stosb
+ inc dx
+ cmp dx, 320
+ jnz .xloop
+ inc cx
+ cmp cx, 200
+ jnz .yloop
+
+ ; halt for ever
+halt: hlt
+ jmp halt
+
+init_vbios:
+ mov ax, 0c000h
+ mov es, ax
+ xor bx, bx
+ cmp word [es:bx], 0aa55h
+ jz .foundsig
+ mov si, err_vbios_notfound
+ call ser_putstr
+ mov ax, [es:bx]
+ call printhex16
+ mov al, 13
+ call ser_putchar
+ mov al, 10
+ call ser_putchar
+ stc
+ ret
+.foundsig:
+ mov si, msg_vbios_init
+ call ser_putstr
+ ; don't bother with CRC, just call it
+ push es
+ push word 4
+ mov bp, sp
+ call far [bp]
+ add sp, 4
+ clc
+ ret
+
+msg_vbios_test db 'running video BIOS test',13,10,0
+msg_vbios_init db 'attempting to initialize video BIOS',13,10,0
+err_vbios_notfound db 'failed to initialize video BIOS, sig not found at c0000h: ',0
+
+print_ivt:
+ xor bx, bx
+.loop: mov ax, bx
+ shr ax, 2
+ call printhex8
+ mov al, ' '
+ call ser_putchar
+ mov ax, [bx + 2] ; segment
+ call printhex16
+ mov al, ':'
+ call ser_putchar
+ mov ax, [bx] ; offset
+ call printhex16
+ mov al, 13
+ call ser_putchar
+ mov al, 10
+ call ser_putchar
+ add bx, 4
+
+ cmp bx, 33 << 2
+ jnz .loop
+ ret
+
+hexdig db '0123456789abcdef'
+
+printhex8:
+ push bx
+ rol al, 4
+ mov bx, ax
+ and bx, 0fh
+ mov cx, ax
+ mov al, [bx + hexdig]
+ call ser_putchar
+ mov ax, cx
+ rol al, 4
+ mov bx, ax
+ and bx, 0fh
+ mov al, [bx + hexdig]
+ call ser_putchar
+ pop bx
+ ret
+
+printhex16:
+ push ax
+ mov al, ah
+ call printhex8
+ pop ax
+ call printhex8
+ ret