SVGADEMO.C
上传用户:kammenn
上传日期:2007-06-26
资源大小:210k
文件大小:14k
源码类别:

GDI/图象编程

开发平台:

C/C++

  1. /****************************************************************************
  2.  
  3.   'SVGACC' A Super Vga Graphics Library for use with Microsoft and
  4.   Borland C/C++
  5.   Copyright 1993-1994 by Stephen L. Balkum and Daniel A. Sill
  6.   GIF and 'Graphics Intechange Format' are trademarks (tm) of
  7.   Compuserve, Incorporated, an H&R Block Company.
  8. **************** UNREGISTERD SHAREWARE VERSION ***********************
  9. * FOR EVUALATION ONLY. NOT FOR RESALE IN ANY FORM. SOFTWARE WRITTEN  *
  10. * USING THIS UNREGISTERED SHAREWARE GRAPHICS LIBRARY MAY NOT BY SOLD *
  11. * OR USED FOR ANY PURPOSE OTHER THAN THE EVUALTION OF THIS LIBRARY.  *
  12. **********************************************************************
  13. **************** NO WARRANTIES AND NO LIABILITY **********************
  14. * Stephen L. Balkum and Daniel A. Sill provide no warranties, either *
  15. * expressed or implied, of merchantability, or fitness, for a        *
  16. * particular use or purpose of this SOFTWARE and documentation.      *
  17. * In no event shall Stephen L. Balkum or Daniel A. Sill be held      *
  18. * liable for any damages resulting from the use or misuse of the     * 
  19. * SOFTWARE and documentation.                                        *
  20. **********************************************************************
  21. ************** U.S. GOVERNMENT RESTRICTED RIGHTS *********************
  22. * Use, duplication, or disclosure of the SOFTWARE and documentation  *
  23. * by the U.S. Government is subject to the restictions as set forth  *
  24. * in subparagraph (c)(1)(ii) of the Rights in Technical Data and     *
  25. * Computer Software cluse at DFARS 252.227-7013.                     *
  26. * Contractor/manufacturer is Stephen L. Balkum and Daniel A. Sill,   *
  27. * P.O. Box 7704, Austin, Texas 78713-7704                            *
  28. **********************************************************************
  29. **********************************************************************
  30. * By using this SOFTWARE or documentation, you agree to the above    *
  31. * terms and conditions.                                              *
  32. **********************************************************************
  33.  ***************************************************************************/
  34. #include <stdio.h>
  35. #include <conio.h>
  36. #include <stdlib.h>
  37. #include <string.h>
  38. #include <math.h>
  39. #include <dos.h>
  40. #include "svgacc.h"
  41. #include "svgademo.h"
  42. void main(void) {
  43. int startvideomode;
  44. int i, max, ky;
  45. int mjv, mnv, tp;
  46. int cpu, videomemory;
  47. int mouse, joystick;
  48. int res;
  49. int offset, colr;
  50. float mypi;
  51. char dummy;
  52. char buf[TITLEN];
  53. char *dumptr;
  54. /*
  55.  * Save the starting videomode and set it to mode 3.
  56.  */
  57. startvideomode = videomodeget();
  58. restext();
  59. screenclear();
  60. /*
  61.  * Move the DOS cursor to the top left to start the program and say hello
  62.  */
  63. screengoto(11,0);
  64. printf("/*SVGACC.LIB/* A SuperVGA Graphics Library for use withn");
  65. screengoto(23,1);
  66. printf("Microsoft and Borland C/C++n");
  67. screengoto(9,2);
  68. printf("Copyright 1993-1994 by Stephen L. Balkum and Daniel A. Silln");
  69. screengoto(23,11);
  70. printf("Demonstration/Example Programn");
  71. screengoto(0,22);
  72. printf("press a key to begin the demo...n");
  73. getkey();
  74. screenclear();
  75.    
  76. /*
  77.  * Let's id the processor first as the library requires a 386 or better.
  78.  */
  79. screengoto(0,0);
  80. cpu = whichcpu();
  81. if (cpu < 386) {
  82. printf("Sorry, this library requires an 80386 or better processor.n");
  83. printf("Processor is identified as an 80%d.n", cpu);
  84. printf("Demo program will be terminated.nn");
  85. printf("press a key...n");
  86. getkey();
  87. videomodeset(startvideomode);
  88. exit(0);
  89. }
  90. /*
  91.  * Let's id the video card/chip as the library requires a SuperVGA adapter.
  92.  */
  93. switch(whichvga()) {
  94. case ACUMOS:
  95. sprintf(buf,"Acumos AVGA2/3 SuperVGA");
  96. break;
  97. case ATI:
  98. sprintf(buf,"ATI Technologies 18/28/38/68800 SuperVGA");
  99. break;
  100. case AHEADA:
  101. sprintf(buf,"Ahead V5000 Ver A SuperVGA");
  102. break;
  103. case AHEADB:
  104. sprintf(buf,"Ahead V5000 Ver B SuperVGA");
  105. break;
  106. case CHIPSTECH:
  107. sprintf(buf,"Chips and Technologies 82C450/1/2/3/5/6/7 SuperVGA");
  108. break;
  109. case CIRRUS:
  110. sprintf(buf,"Cirrus Logic CL-GD 5xx,6xx,28xx,54xx,62xx SuperVGA");
  111. break;
  112. case EVEREX:
  113. sprintf(buf,"Everex EV236/6xx Micro Enhancer SuperVGA");
  114. break;
  115. case GENOA:
  116. sprintf(buf,"Genoa 61/62/63/64/6600 SuperVGA");
  117. break;
  118. case NCR:
  119. sprintf(buf,"NCR 77C21/22/22E/22E+ SuperVGA");
  120. break;
  121. case OAKTECH:
  122. sprintf(buf,"Oak Technologies OTI-037/67/77/87C SuperVGA");
  123. break;
  124. case PARADISE:
  125. sprintf(buf,"Paradise/Western Digital PVGA1A,WD90C00/1x/2x/3x SuperVGA");
  126. break;
  127. case REALTEK:
  128. sprintf(buf,"Realtek RT3106 SuperVGA");
  129. break;
  130. case TRIDENT:
  131. sprintf(buf,"Trident 8800CS,8900B/C/CL/CX,90x0 SuperVGA");
  132. break;
  133. case TSENG3:
  134. sprintf(buf,"Tseng Labs ET3000-AX/BX/BP SuperVGA");
  135. break;
  136. case TSENG4:
  137. sprintf(buf,"Tseng Labs ET4000/W32/W32I SuperVGA");
  138. break;
  139. case VESA:
  140. sprintf(buf,"VESA compatible SuperVGA");
  141. break;
  142. case VIDEO7:
  143. sprintf(buf,"Video 7 HT-208/16 SuperVGA");
  144. break;
  145. case AVANCE:
  146. sprintf(buf,"Avance Logic AL2101 SuperVGA");
  147. break;
  148. case MXIC:
  149. sprintf(buf,"MXIC MX68000/10 SuperVGA");
  150. break;
  151. case PRIMUS:
  152. sprintf(buf,"Primus P2000 SuperVGA");
  153. break;
  154. default:
  155. printf("Microprocessor is identified as an 80%d.n", cpu);
  156. printf("Sorry, unable to identify video card or it is not a SuperVGA video adapter.n");
  157. printf("Demo program will be terminated.nn");
  158. printf("press a key...n");
  159. getkey();
  160. videomodeset(startvideomode);
  161. exit(0);
  162. }
  163. printf("Microprocessor is identified as an 80%d.n", cpu);
  164. fontsystem();
  165. printf("Video card/chip is identified as %s.n",&buf);
  166.    
  167. /*
  168.  * Let's see the how much memory is installed on the super vga adapter.
  169.  */
  170. videomemory = whichmem();
  171. if (videomemory < 1) {
  172. printf("Sorry, unable to identify the amount of installed video memory.n");
  173. printf("Demo program will be terminated.nn");
  174. printf("press a key...n");
  175. getkey();
  176. videomodeset(startvideomode);
  177. exit(0);
  178. } else
  179. printf("Installed video memory identified as %dkb.n", videomemory);
  180.    
  181. /*
  182.  * Let's tell the user what the highest resolution that the video card
  183.  * and its installed memory card is capable of. The monitor must be able
  184.  * to support those modes too !
  185.  */
  186. printf("Video card and installed memory is capable of the following resolutions:n");
  187. if (videomemory > 1023) {
  188. printf("    320x200 in 256 colorsn");
  189. printf("    640x400 in 256 colorsn");
  190. printf("    640x480 in 256 colorsn");
  191. printf("    800x600 in 256 colorsn");
  192. printf("    1024x768 in 256 colorsn");
  193. max = 4;
  194. } else if (videomemory > 511) {
  195. printf("    320x200 in 256 colorsn");
  196. printf("    640x400 in 256 colorsn");
  197. printf("    640x480 in 256 colorsn");
  198. printf("    800x600 in 256 colorsn");
  199. max = 3;
  200. } else {
  201. printf("    320x200 in 256 colorsn");
  202. printf("    640x400 in 256 colorsn");
  203. max = 1;
  204. }
  205. printf("nPlease keep in mind that not all monitors support all resolutions.nn");
  206. /*
  207.  * Let's look for a mouse. if we find one, tell all about it
  208.  */
  209. mouse = whichmouse();
  210. if (mouse > 0) {
  211. mouseinfo(&mjv, &mnv, &tp, &i);
  212. switch (tp) {
  213. case 1:
  214. sprintf(buf,"bus mouse");
  215. break;
  216. case 2:
  217. sprintf(buf,"serial mouse");
  218. break;
  219. case 3:
  220. sprintf(buf,"Inport mouse");
  221. break;
  222. case 4:
  223. sprintf(buf,"PS/2 mouuse");
  224. break;
  225. case 5:
  226. sprintf(buf,"HP mouse");
  227. break;
  228. default:
  229. sprintf(buf,"unknown type");
  230. }
  231. printf("Microsoft compatible %s detected with %d buttons on IRQ %d.n", &buf, mouse, i);
  232. printf("Software driver version is %d.%d (Microsoft equivalent version).nn", mjv, mnv);
  233. } else
  234. printf("No Microsoft compatible mouse detected.nn");
  235. /*
  236.  * Let's look for joysticks
  237.  */
  238. joystick = whichjoystick();
  239. switch (joystick) {
  240. case -1:
  241. printf("No joystick port detected or no joystick BIOS support present.nn");
  242. break;
  243. case 0:
  244. printf("No joystick detectednn");
  245. break;
  246. case 1:
  247. printf("Joystick A is present and available.nn");
  248. break;
  249. case 2:
  250. printf("Joystick B is present and available.nn");
  251. break;
  252. case 3:
  253. printf("Both Joystick A and Joystick B are present and available.nn");
  254. break;
  255. }
  256. printf("press a key...n");
  257. getkey();
  258. /*
  259.  * Let's get down to business
  260.  */
  261. res = 1;
  262. endit = 0;
  263. ky=0;
  264. /*
  265.  * Init alternate color palettes
  266.  */
  267. res320();
  268. palget(orgpal, 0, 255);
  269. palcopy(orgpal,pal,0,255);
  270. palcopy(orgpal,pal2,0,255);
  271. mypi=(float)(8 * atan(1) / 240);
  272. offset = 16;
  273. for (colr=0;colr<240;colr++,offset++) {
  274. pal[offset].r = (char)(32.0 + sin((colr + 0) * mypi) * 31.0);
  275. pal[offset].g = (char)(32.0 + sin((colr + 80) * mypi) * 31.0);
  276. pal[offset].b = (char)(32.0 + sin((colr + 160) * mypi) * 31.0);
  277. pal2[offset].r = (char)(32.0 + sin((colr + 10) * mypi) * 31.0);
  278. pal2[offset].g = (char)(32.0 + sin((colr + 30) * mypi) * 31.0);
  279. pal2[offset].b = (char)(32.0 + sin((colr + 50) * mypi) * 31.0);
  280. }
  281. restext();
  282. /*
  283.  * Here is the main selector loop
  284.  */
  285. while (endit == 0) {
  286. screenclear();
  287. switch (res) {
  288. case 1: 
  289. sprintf(buf,"320x200x256");
  290. break;
  291. case 2:
  292. sprintf(buf,"640x400x256");
  293. break;
  294. case 3:
  295. sprintf(buf,"640x480x256");
  296. break;
  297. case 4:
  298. sprintf(buf,"800x600x256");
  299. break;
  300. case 5:
  301. sprintf(buf,"1024x768x256");
  302. }
  303. printf("Please select the demo you would like to see in the %s resolution:nn",&buf);
  304. printf("(0)  Exit This Programnn");
  305. printf("(1)  Demo #1  The Primitive Drawing Routinesn");
  306. printf("(2)  Demo #2  The Clipping Capabilitiesn");
  307. printf("(3)  Demo #3  The Fill Routinesn");
  308. printf("(4)  Demo #4  The Palette Routinesn");
  309. printf("(5)  Demo #5  The Block Routinesn");
  310. printf("(6)  Demo #6  The Text Routinesn");
  311. printf("(7)  Demo #7  The Scrolling Routinesn");
  312. printf("(8)  Demo #8  The GIF (tm) Routinesn");
  313. printf("(9)  Demo #9  The Mouse Routinesn");
  314. printf("(10) Demo #10 The Joystick Routinesn");
  315. printf("(11) Demo #11 The Two Dimensional Routinesn");
  316. printf("(12) Demo #12 The Three Dimensional Routinesn");
  317. printf("(13) The Grand Tour of All Demosnn");
  318. printf("(14) Use 320x200 in 256 colorsn");
  319. printf("(15) Use 640x400 in 256 colorsn");
  320. max = 14;
  321. if (videomemory > 511) {
  322. printf("(16) Use 640x480 in 256 colorsn");
  323. printf("(17) Use 800x600 in 256 colorsn");
  324. max = 17;
  325. if (videomemory > 1023) {
  326. printf("(18) Use 1024x768 in 256 colorsn");
  327. max = 18;
  328. }
  329. printf("nYour Choice: ");
  330. for (i=0;i<3;i++) {
  331. dummy = (char)getch();
  332. switch (dummy) {
  333. case 13:
  334. if (i == 0)
  335. i--;
  336. else {
  337. buf[i]='';
  338. i=2;
  339. }
  340. break;
  341. case 8:
  342. i--;
  343. if (i > (-1)) {
  344. printf("b b");
  345. i--;
  346. }
  347. break;
  348. default:
  349. if ((dummy < '0') || (dummy > '9'))
  350. i--;
  351. else if (i < 2) {
  352. printf("%c",dummy);
  353. buf[i] = dummy;
  354. } else
  355. buf[i] = '';
  356. }
  357. }
  358. ky=(int)strtol(buf,&dumptr,10);
  359. if (ky > max)
  360. ky = 99;
  361. if((ky > 0) && (ky < 14))
  362. switch (res) {
  363. case 1:
  364. res320();
  365. break;
  366. case 2:
  367. res640l();
  368. break;
  369. case 3:
  370. res640();
  371. break;
  372. case 4:
  373. res800();
  374. break;
  375. case 5:
  376. res1024();
  377. break;
  378. }
  379. switch (ky) {
  380. case 0:
  381. endit = 1;
  382. break;
  383. case 1:
  384. doprims();
  385. break;
  386. case 2:
  387. doclip();
  388. break;
  389. case 3:
  390. dofill();
  391. break;
  392. case 4:
  393. dopal();
  394. break;
  395. case 5:
  396. doblock();
  397. break;
  398. case 6:
  399. dotext();
  400. break;
  401. case 7:
  402. doscroll();
  403. break;
  404. case 8:
  405. dogif();
  406. break;
  407. case 9:
  408. domouse();
  409. break;
  410. case 10:
  411. dojoystick();
  412. break;
  413. case 11:
  414. do2d();
  415. break;
  416. case 12:
  417. do3d();
  418. break;
  419. case 13:
  420. doall();
  421. break;
  422. case 14:
  423. res = 1;
  424. break;
  425. case 15:
  426. res = 2;
  427. break;
  428. case 16:
  429. res = 3;
  430. break;
  431. case 17:
  432. res = 4;
  433. break;
  434. case 18:
  435. res = 5;
  436. break;
  437. default:
  438. ;
  439. }
  440. restext();
  441. }
  442. videomodeset(startvideomode);
  443. }
  444. /**********               
  445.  * GETKEY *
  446.  **********/
  447. char getkey(void)
  448. {
  449. char ret;
  450. beep();
  451. ret = (char)getch();
  452. if ( (ret == 'Q') || (ret == 'q') )
  453. endit = 1;
  454. if (ret == 'Q')
  455. ret = 'q';
  456. if (ret == 'S')
  457. ret = 's';
  458. return(ret);
  459. }
  460. /*********
  461.  * DOALL *
  462.  *********/
  463. void doall(void)
  464. {
  465. if(doprims()=='q')
  466. return;
  467. if(doclip()=='q')
  468. return;
  469. if(dofill()=='q')
  470. return;
  471. if(dopal()=='q')
  472. return;
  473. if(doblock()=='q')
  474. return;
  475. if(dotext()=='q')
  476. return;
  477. if(doscroll()=='q')
  478. return;
  479. if(dogif()=='q')
  480. return;
  481. if(domouse()=='q')
  482. return;
  483. if(dojoystick()=='q')
  484. return;
  485. if(do2d()=='q')
  486. return;
  487. if(do3d()=='q')
  488. return;
  489. return;
  490. }
  491. /***************
  492.  * SCREENCLEAR *
  493.  ***************/
  494. void screenclear(void)
  495. {
  496. union REGS regs;
  497. regs.h.ah = 0x07;
  498. regs.h.al = 0x00;
  499. regs.h.ch = 0;
  500. regs.h.cl = 0;
  501. regs.h.dh = 24;
  502. regs.h.dl = 79;
  503. regs.h.bh = 7;
  504. int86(0x10, &regs, &regs);
  505. screengoto(1,1);
  506. }
  507. /**************
  508.  * SCREENGOTO *
  509.  **************/
  510. void screengoto(int x, int y)
  511. {
  512. union REGS regs;
  513. regs.h.ah = 0x02;
  514. regs.h.bh = 0;
  515. regs.h.dh = (unsigned char)y;
  516. regs.h.dl = (unsigned char)x;
  517. int86(0x10, &regs, &regs);
  518. }
  519. /********
  520.  * BEEP *
  521.  ********/
  522. void beep(void)
  523. {
  524. int cont;
  525. outp(0x43,0xB6);
  526. outp(0x42,0xA9);
  527. outp(0x42,0x06);
  528. cont = inp(0x61);
  529. outp(0x61,cont | 0x03);
  530. sdelay(4);
  531. outp(0x61,cont);
  532. }