home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Monster Media 1994 #1
/
monster.zip
/
monster
/
PROG_C
/
SVGACC20.ZIP
/
SVGADEMO.C
< prev
next >
Wrap
C/C++ Source or Header
|
1994-03-11
|
14KB
|
593 lines
/****************************************************************************
'SVGACC' A Super Vga Graphics Library for use with Microsoft and
Borland C/C++
Copyright 1993-1994 by Stephen L. Balkum and Daniel A. Sill
GIF and 'Graphics Intechange Format' are trademarks (tm) of
Compuserve, Incorporated, an H&R Block Company.
**************** UNREGISTERD SHAREWARE VERSION ***********************
* FOR EVUALATION ONLY. NOT FOR RESALE IN ANY FORM. SOFTWARE WRITTEN *
* USING THIS UNREGISTERED SHAREWARE GRAPHICS LIBRARY MAY NOT BY SOLD *
* OR USED FOR ANY PURPOSE OTHER THAN THE EVUALTION OF THIS LIBRARY. *
**********************************************************************
**************** NO WARRANTIES AND NO LIABILITY **********************
* Stephen L. Balkum and Daniel A. Sill provide no warranties, either *
* expressed or implied, of merchantability, or fitness, for a *
* particular use or purpose of this SOFTWARE and documentation. *
* In no event shall Stephen L. Balkum or Daniel A. Sill be held *
* liable for any damages resulting from the use or misuse of the *
* SOFTWARE and documentation. *
**********************************************************************
************** U.S. GOVERNMENT RESTRICTED RIGHTS *********************
* Use, duplication, or disclosure of the SOFTWARE and documentation *
* by the U.S. Government is subject to the restictions as set forth *
* in subparagraph (c)(1)(ii) of the Rights in Technical Data and *
* Computer Software cluse at DFARS 252.227-7013. *
* Contractor/manufacturer is Stephen L. Balkum and Daniel A. Sill, *
* P.O. Box 7704, Austin, Texas 78713-7704 *
**********************************************************************
**********************************************************************
* By using this SOFTWARE or documentation, you agree to the above *
* terms and conditions. *
**********************************************************************
***************************************************************************/
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <dos.h>
#include "svgacc.h"
#include "svgademo.h"
void main(void) {
int startvideomode;
int i, max, ky;
int mjv, mnv, tp;
int cpu, videomemory;
int mouse, joystick;
int res;
int offset, colr;
float mypi;
char dummy;
char buf[TITLEN];
char *dumptr;
/*
* Save the starting videomode and set it to mode 3.
*/
startvideomode = videomodeget();
restext();
screenclear();
/*
* Move the DOS cursor to the top left to start the program and say hello
*/
screengoto(11,0);
printf("/*SVGACC.LIB/* A SuperVGA Graphics Library for use with\n");
screengoto(23,1);
printf("Microsoft and Borland C/C++\n");
screengoto(9,2);
printf("Copyright 1993-1994 by Stephen L. Balkum and Daniel A. Sill\n");
screengoto(23,11);
printf("Demonstration/Example Program\n");
screengoto(0,22);
printf("press a key to begin the demo...\n");
getkey();
screenclear();
/*
* Let's id the processor first as the library requires a 386 or better.
*/
screengoto(0,0);
cpu = whichcpu();
if (cpu < 386) {
printf("Sorry, this library requires an 80386 or better processor.\n");
printf("Processor is identified as an 80%d.\n", cpu);
printf("Demo program will be terminated.\n\n");
printf("press a key...\n");
getkey();
videomodeset(startvideomode);
exit(0);
}
/*
* Let's id the video card/chip as the library requires a SuperVGA adapter.
*/
switch(whichvga()) {
case ACUMOS:
sprintf(buf,"Acumos AVGA2/3 SuperVGA");
break;
case ATI:
sprintf(buf,"ATI Technologies 18/28/38/68800 SuperVGA");
break;
case AHEADA:
sprintf(buf,"Ahead V5000 Ver A SuperVGA");
break;
case AHEADB:
sprintf(buf,"Ahead V5000 Ver B SuperVGA");
break;
case CHIPSTECH:
sprintf(buf,"Chips and Technologies 82C450/1/2/3/5/6/7 SuperVGA");
break;
case CIRRUS:
sprintf(buf,"Cirrus Logic CL-GD 5xx,6xx,28xx,54xx,62xx SuperVGA");
break;
case EVEREX:
sprintf(buf,"Everex EV236/6xx Micro Enhancer SuperVGA");
break;
case GENOA:
sprintf(buf,"Genoa 61/62/63/64/6600 SuperVGA");
break;
case NCR:
sprintf(buf,"NCR 77C21/22/22E/22E+ SuperVGA");
break;
case OAKTECH:
sprintf(buf,"Oak Technologies OTI-037/67/77/87C SuperVGA");
break;
case PARADISE:
sprintf(buf,"Paradise/Western Digital PVGA1A,WD90C00/1x/2x/3x SuperVGA");
break;
case REALTEK:
sprintf(buf,"Realtek RT3106 SuperVGA");
break;
case TRIDENT:
sprintf(buf,"Trident 8800CS,8900B/C/CL/CX,90x0 SuperVGA");
break;
case TSENG3:
sprintf(buf,"Tseng Labs ET3000-AX/BX/BP SuperVGA");
break;
case TSENG4:
sprintf(buf,"Tseng Labs ET4000/W32/W32I SuperVGA");
break;
case VESA:
sprintf(buf,"VESA compatible SuperVGA");
break;
case VIDEO7:
sprintf(buf,"Video 7 HT-208/16 SuperVGA");
break;
case AVANCE:
sprintf(buf,"Avance Logic AL2101 SuperVGA");
break;
case MXIC:
sprintf(buf,"MXIC MX68000/10 SuperVGA");
break;
case PRIMUS:
sprintf(buf,"Primus P2000 SuperVGA");
break;
default:
printf("Microprocessor is identified as an 80%d.\n", cpu);
printf("Sorry, unable to identify video card or it is not a SuperVGA video adapter.\n");
printf("Demo program will be terminated.\n\n");
printf("press a key...\n");
getkey();
videomodeset(startvideomode);
exit(0);
}
printf("Microprocessor is identified as an 80%d.\n", cpu);
fontsystem();
printf("Video card/chip is identified as %s.\n",&buf);
/*
* Let's see the how much memory is installed on the super vga adapter.
*/
videomemory = whichmem();
if (videomemory < 1) {
printf("Sorry, unable to identify the amount of installed video memory.\n");
printf("Demo program will be terminated.\n\n");
printf("press a key...\n");
getkey();
videomodeset(startvideomode);
exit(0);
} else
printf("Installed video memory identified as %dkb.\n", videomemory);
/*
* Let's tell the user what the highest resolution that the video card
* and its installed memory card is capable of. The monitor must be able
* to support those modes too !
*/
printf("Video card and installed memory is capable of the following resolutions:\n");
if (videomemory > 1023) {
printf(" 320x200 in 256 colors\n");
printf(" 640x400 in 256 colors\n");
printf(" 640x480 in 256 colors\n");
printf(" 800x600 in 256 colors\n");
printf(" 1024x768 in 256 colors\n");
max = 4;
} else if (videomemory > 511) {
printf(" 320x200 in 256 colors\n");
printf(" 640x400 in 256 colors\n");
printf(" 640x480 in 256 colors\n");
printf(" 800x600 in 256 colors\n");
max = 3;
} else {
printf(" 320x200 in 256 colors\n");
printf(" 640x400 in 256 colors\n");
max = 1;
}
printf("\nPlease keep in mind that not all monitors support all resolutions.\n\n");
/*
* Let's look for a mouse. if we find one, tell all about it
*/
mouse = whichmouse();
if (mouse > 0) {
mouseinfo(&mjv, &mnv, &tp, &i);
switch (tp) {
case 1:
sprintf(buf,"bus mouse");
break;
case 2:
sprintf(buf,"serial mouse");
break;
case 3:
sprintf(buf,"Inport mouse");
break;
case 4:
sprintf(buf,"PS/2 mouuse");
break;
case 5:
sprintf(buf,"HP mouse");
break;
default:
sprintf(buf,"unknown type");
}
printf("Microsoft compatible %s detected with %d buttons on IRQ %d.\n", &buf, mouse, i);
printf("Software driver version is %d.%d (Microsoft equivalent version).\n\n", mjv, mnv);
} else
printf("No Microsoft compatible mouse detected.\n\n");
/*
* Let's look for joysticks
*/
joystick = whichjoystick();
switch (joystick) {
case -1:
printf("No joystick port detected or no joystick BIOS support present.\n\n");
break;
case 0:
printf("No joystick detected\n\n");
break;
case 1:
printf("Joystick A is present and available.\n\n");
break;
case 2:
printf("Joystick B is present and available.\n\n");
break;
case 3:
printf("Both Joystick A and Joystick B are present and available.\n\n");
break;
}
printf("press a key...\n");
getkey();
/*
* Let's get down to business
*/
res = 1;
endit = 0;
ky=0;
/*
* Init alternate color palettes
*/
res320();
palget(orgpal, 0, 255);
palcopy(orgpal,pal,0,255);
palcopy(orgpal,pal2,0,255);
mypi=(float)(8 * atan(1) / 240);
offset = 16;
for (colr=0;colr<240;colr++,offset++) {
pal[offset].r = (char)(32.0 + sin((colr + 0) * mypi) * 31.0);
pal[offset].g = (char)(32.0 + sin((colr + 80) * mypi) * 31.0);
pal[offset].b = (char)(32.0 + sin((colr + 160) * mypi) * 31.0);
pal2[offset].r = (char)(32.0 + sin((colr + 10) * mypi) * 31.0);
pal2[offset].g = (char)(32.0 + sin((colr + 30) * mypi) * 31.0);
pal2[offset].b = (char)(32.0 + sin((colr + 50) * mypi) * 31.0);
}
restext();
/*
* Here is the main selector loop
*/
while (endit == 0) {
screenclear();
switch (res) {
case 1:
sprintf(buf,"320x200x256");
break;
case 2:
sprintf(buf,"640x400x256");
break;
case 3:
sprintf(buf,"640x480x256");
break;
case 4:
sprintf(buf,"800x600x256");
break;
case 5:
sprintf(buf,"1024x768x256");
}
printf("Please select the demo you would like to see in the %s resolution:\n\n",&buf);
printf("(0) Exit This Program\n\n");
printf("(1) Demo #1 The Primitive Drawing Routines\n");
printf("(2) Demo #2 The Clipping Capabilities\n");
printf("(3) Demo #3 The Fill Routines\n");
printf("(4) Demo #4 The Palette Routines\n");
printf("(5) Demo #5 The Block Routines\n");
printf("(6) Demo #6 The Text Routines\n");
printf("(7) Demo #7 The Scrolling Routines\n");
printf("(8) Demo #8 The GIF (tm) Routines\n");
printf("(9) Demo #9 The Mouse Routines\n");
printf("(10) Demo #10 The Joystick Routines\n");
printf("(11) Demo #11 The Two Dimensional Routines\n");
printf("(12) Demo #12 The Three Dimensional Routines\n");
printf("(13) The Grand Tour of All Demos\n\n");
printf("(14) Use 320x200 in 256 colors\n");
printf("(15) Use 640x400 in 256 colors\n");
max = 14;
if (videomemory > 511) {
printf("(16) Use 640x480 in 256 colors\n");
printf("(17) Use 800x600 in 256 colors\n");
max = 17;
}
if (videomemory > 1023) {
printf("(18) Use 1024x768 in 256 colors\n");
max = 18;
}
printf("\nYour Choice: ");
for (i=0;i<3;i++) {
dummy = (char)getch();
switch (dummy) {
case 13:
if (i == 0)
i--;
else {
buf[i]='\0';
i=2;
}
break;
case 8:
i--;
if (i > (-1)) {
printf("\b \b");
i--;
}
break;
default:
if ((dummy < '0') || (dummy > '9'))
i--;
else if (i < 2) {
printf("%c",dummy);
buf[i] = dummy;
} else
buf[i] = '\0';
}
}
ky=(int)strtol(buf,&dumptr,10);
if (ky > max)
ky = 99;
if((ky > 0) && (ky < 14))
switch (res) {
case 1:
res320();
break;
case 2:
res640l();
break;
case 3:
res640();
break;
case 4:
res800();
break;
case 5:
res1024();
break;
}
switch (ky) {
case 0:
endit = 1;
break;
case 1:
doprims();
break;
case 2:
doclip();
break;
case 3:
dofill();
break;
case 4:
dopal();
break;
case 5:
doblock();
break;
case 6:
dotext();
break;
case 7:
doscroll();
break;
case 8:
dogif();
break;
case 9:
domouse();
break;
case 10:
dojoystick();
break;
case 11:
do2d();
break;
case 12:
do3d();
break;
case 13:
doall();
break;
case 14:
res = 1;
break;
case 15:
res = 2;
break;
case 16:
res = 3;
break;
case 17:
res = 4;
break;
case 18:
res = 5;
break;
default:
;
}
restext();
}
videomodeset(startvideomode);
}
/**********
* GETKEY *
**********/
char getkey(void)
{
char ret;
beep();
ret = (char)getch();
if ( (ret == 'Q') || (ret == 'q') )
endit = 1;
if (ret == 'Q')
ret = 'q';
if (ret == 'S')
ret = 's';
return(ret);
}
/*********
* DOALL *
*********/
void doall(void)
{
if(doprims()=='q')
return;
if(doclip()=='q')
return;
if(dofill()=='q')
return;
if(dopal()=='q')
return;
if(doblock()=='q')
return;
if(dotext()=='q')
return;
if(doscroll()=='q')
return;
if(dogif()=='q')
return;
if(domouse()=='q')
return;
if(dojoystick()=='q')
return;
if(do2d()=='q')
return;
if(do3d()=='q')
return;
return;
}
/***************
* SCREENCLEAR *
***************/
void screenclear(void)
{
union REGS regs;
regs.h.ah = 0x07;
regs.h.al = 0x00;
regs.h.ch = 0;
regs.h.cl = 0;
regs.h.dh = 24;
regs.h.dl = 79;
regs.h.bh = 7;
int86(0x10, ®s, ®s);
screengoto(1,1);
}
/**************
* SCREENGOTO *
**************/
void screengoto(int x, int y)
{
union REGS regs;
regs.h.ah = 0x02;
regs.h.bh = 0;
regs.h.dh = (unsigned char)y;
regs.h.dl = (unsigned char)x;
int86(0x10, ®s, ®s);
}
/********
* BEEP *
********/
void beep(void)
{
int cont;
outp(0x43,0xB6);
outp(0x42,0xA9);
outp(0x42,0x06);
cont = inp(0x61);
outp(0x61,cont | 0x03);
sdelay(4);
outp(0x61,cont);
}