www.pudn.com > CRGAB.zip > VIDEO.C


 
 
 
/*  Video.c maps boxes and borders to the screen : determines video hardware */ 
 
/*  Uses memrite : an assembler routine that writes directly to video ram  */ 
 
#include  
#include  
#include  
#include  
#include "video.h" 
#include "crt.h" 
 
 
int box(int left, int top, int right, int bot,int vpage, int style, int atr) 
{ 
register int i; 
int x,v_bar,h_bar,ul_corner,ur_corner,ll_corner,lr_corner; 
unsigned char top_line[81], mid_line[81], bot_line[81]; 
 
       if(right < (left + 2) || bot < (top + 2)) 
               return(0); 
 
    if(style == 0) 
       ul_corner = ur_corner = ll_corner = lr_corner = h_bar = v_bar = 32; 
    else if(style == 1 ) { 
       ul_corner = 218; 
       ur_corner = 191; 
       h_bar = 196; 
       v_bar = 179; 
       ll_corner = 192; 
       lr_corner = 217; 
    } 
    else if(style == 2) { 
       ul_corner = 201; 
       ur_corner = 187; 
       h_bar = 205; 
       v_bar = 186; 
       ll_corner = 200; 
       lr_corner = 188; 
    } 
    else 
	return(0); 
 
    x = right - left; 
    top_line[0] = ul_corner; 
    mid_line[0] = v_bar; 
    bot_line[0] = ll_corner; 
 
    for(i = 1;i < x; i++) { 
	top_line[i] = bot_line[i] = h_bar; 
	mid_line[i] = 32; 
    } 
 
    top_line[i] = ur_corner; 
    mid_line[i] = v_bar; 
    bot_line[i] = lr_corner; 
    i++; 
    top_line[i] = mid_line[i] = bot_line[i] = '\0'; 
 
    x = bot - top; 
 
    memrite(atr,top,left,vpage,HORIZ,top_line); 
    for(i = 1; i < x; i++) 
	memrite(atr,(top+i),left,vpage,HORIZ,mid_line); 
 
    memrite(atr,(top+i),left,vpage,HORIZ,bot_line); 
 
    return(1); 
} 
 
int border(int left,int top,int right,int bot,int vpage,int style,int atr) 
{ 
register int i; 
int x,v_bar,h_bar,ul_corner,ur_corner,ll_corner,lr_corner; 
unsigned char top_line[81], mid_line[52], bot_line[81]; 
 
    if(right < (left + 2) || bot < (top + 2)) 
	return(0); 
 
    if(style == 0) 
	ul_corner = ur_corner = ll_corner = lr_corner = h_bar = v_bar = 32; 
    else if(style == 1 ) { 
	ul_corner = 218;  /* Single line border */ 
	ur_corner = 191; 
	h_bar = 196; 
	v_bar = 179; 
	ll_corner = 192; 
	lr_corner = 217; 
    } 
    else if(style == 2) { 
	ul_corner = 201; 
	ur_corner = 187; 
	h_bar = 205; 
	v_bar = 186; 
	ll_corner = 200; 
	lr_corner = 188; 
    } 
    else 
	return(0); 
 
    x = right - left; 
    top_line[0] = ul_corner; 
    bot_line[0] = ll_corner; 
 
    for(i = 1;i < x; i++) 
	top_line[i] = bot_line[i] = h_bar; 
 
    top_line[i] = ur_corner; 
    bot_line[i] = lr_corner; 
    i++; 
    top_line[i] = bot_line[i] = '\0'; 
    x = bot - top; 
    memset(mid_line,v_bar,x); 
    mid_line[x] = '\0'; 
 
    memrite(atr,top,left,vpage,HORIZ,top_line); 
    memrite(atr,(top+1),left,vpage,VERT,mid_line); 
    memrite(atr,(top+1),right,vpage,VERT,mid_line); 
    memrite(atr,bot,left,vpage,HORIZ,bot_line); 
 
    return(1); 
} 
 
unsigned char getmode() 
{ 
    _AH = 15; 
    _BH = 0; 
    geninterrupt(0x10); 
    return(_AL); 
} 
 
enum VIDEO_CARD get_adaptor() 
{ 
unsigned char equip_code = 0; 
 
    _AX = 0x1A00; 
    geninterrupt(0x10); 
    if(_AL == 0x1A) { 
	switch(_BL) { 
		case 0: return(NONE); 
		case 1: return(MDA); 
		case 2: return(CGA); 
		case 4: return(EGACOLOR); 
		case 5: return(EGAMONO); 
		case 7: return(VGAMONO); 
		case 8: return(VGACOLOR); 
		case 10: 
		case 12:return(MCGACOLOR); 
		case 11:return(MCGAMONO); 
 
	default:        return(CGA); 
	} 
    } 
    else { 
	_AH = 0x12; 
	_BX = 0x0010; 
	geninterrupt(0x10); 
	if(_BX != 0x10) 
	    if(_BH == 0) 
		return(EGACOLOR); 
	    else 
		return(EGAMONO); 
	else { 
	    geninterrupt(0x11); 
	    equip_code = (_AL & 0x30) >> 4; 
	    switch(equip_code) { 
		case 1: 
		case 2: return(CGA); 
		case 3: return(MDA); 
 
		default:    return(NONE); 
	    } 
	} 
    } 
}