/* VGA.H * * VGA hardware level routines for standard 320x200x256 mode * * Copyright 1995 Petteri Kangaslampi */ #ifndef __VGA_H #define __VGA_H #ifdef __386__ void vgaSetMode(int mode); #pragma aux vgaSetMode = \ "xor ah,ah" \ "int 10h" \ parm [eax] \ modify exact [eax]; void vgaClearScreen(uchar *buffer); #pragma aux vgaClearScreen = \ "mov ecx,16000" \ "cld" \ "xor eax,eax" \ "rep stosd" \ parm [edi] \ modify exact [eax ecx edi]; void vgaCopyScreen(uchar *buffer, uchar *dest); #pragma aux vgaCopyScreen = \ "mov ecx,16000" \ "cld" \ "rep movsd" \ parm [esi] [edi] \ modify exact [ecx esi edi]; void vgaPutPixel(uchar *buffer, int x, int y, int color); #pragma aux vgaPutPixel = \ "cmp eax,319" \ "ja clip" \ "cmp ebx,199" \ "ja clip" \ "imul ebx,320" \ "add ebx,eax" \ "mov [edi+ebx],cl" \ "clip:" \ parm [edi] [eax] [ebx] [ecx] \ modify exact [ebx]; void vgaWaitVR(void); #pragma aux vgaWaitVR = \ "mov dx,03DAh" \ "vr:" \ "in al,dx" \ "test al,8" \ "jz vr" \ modify exact [eax edx]; void vgaWaitNoVR(void); #pragma aux vgaWaitNoVR = \ "mov dx,03DAh" \ "nvr:" \ "in al,dx" \ "test al,8" \ "jnz nvr" \ modify exact [eax edx]; void vgaWaitDE(void); #pragma aux vgaWaitDE = \ "mov dx,03DAh" \ "de:" \ "in al,dx" \ "test al,1" \ "jnz de" \ modify exact [eax edx]; void vgaSetBorder(int color); #pragma aux vgaSetBorder = \ "mov dx,03DAh" \ "in al,dx" \ "mov dx,03C0h" \ "mov al,31h" \ "out dx,al" \ "mov al,bl" \ "out dx,al" \ parm [ebx] \ modify exact [eax edx]; void vgaSetRGB(int color, int r, int g, int b); #pragma aux vgaSetRGB = \ "mov dx,03C8h" \ "out dx,al" \ "inc dx" \ "mov al,bl" \ "out dx,al" \ "mov al,cl" \ "out dx,al" \ "mov eax,esi" \ "out dx,al" \ parm [eax] [ebx] [ecx] [esi] \ modify exact [eax edx]; #else void vgaSetMode(int mode); #pragma aux vgaSetMode = \ "xor ah,ah" \ "int 10h" \ parm [ax] \ modify exact [ax]; void vgaWaitVR(void); #pragma aux vgaWaitVR = \ "mov dx,03DAh" \ "vr:" \ "in al,dx" \ "test al,8" \ "jz vr" \ modify exact [ax dx]; void vgaWaitNoVR(void); #pragma aux vgaWaitNoVR = \ "mov dx,03DAh" \ "nvr:" \ "in al,dx" \ "test al,8" \ "jnz nvr" \ modify exact [ax dx]; void vgaWaitDE(void); #pragma aux vgaWaitDE = \ "mov dx,03DAh" \ "de:" \ "in al,dx" \ "test al,1" \ "jnz de" \ modify exact [ax dx]; void vgaSetBorder(int color); #pragma aux vgaSetBorder = \ "mov dx,03DAh" \ "in al,dx" \ "mov dx,03C0h" \ "mov al,31h" \ "out dx,al" \ "mov al,bl" \ "out dx,al" \ parm [bx] \ modify exact [ax dx]; void vgaSetRGB(int color, int r, int g, int b); #pragma aux vgaSetRGB = \ "mov dx,03C8h" \ "out dx,al" \ "inc dx" \ "mov al,bl" \ "out dx,al" \ "mov al,cl" \ "out dx,al" \ "mov ax,si" \ "out dx,al" \ parm [ax] [bx] [cx] [si] \ modify exact [ax dx]; #endif #endif