home *** CD-ROM | disk | FTP | other *** search
/ Virtual Reality Zone / VRZONE.ISO / mac / PC / PCGLOVE / GLOVE / OBJGLV.ZIP / SRC / DEMO4B / DRV256 / FX3DKIT.CPP < prev    next >
C/C++ Source or Header  |  1993-05-12  |  11KB  |  416 lines

  1. extern "C" {
  2. int clipper();
  3.  
  4. extern void far load_color(int color);
  5. extern void far xprintc(int c);
  6. extern void far xrprintc(int c);
  7.  
  8. extern void far vsync();                /* pause till vert. retrace */
  9.  
  10. extern void far set_vmode(int mode);    /* set video mode */
  11. extern void far set_vpage(int page);    /* set video page */
  12.  
  13. void far set_clip_rect(int l, int t, int r, int b);  /* only affects lines */
  14.  
  15. #define PUT 0           /* defines of VGA write modes */
  16. #define AND 1           /* for use with setup_hdwe()  */
  17. #define OR  2
  18. #define XOR 3
  19.  
  20. extern void far setup_hdwe(int mode);  /* setup VGA for bunch of line */
  21.                        /* or poly draws: once per set */
  22.  
  23. extern void far reset_hdwe();  /* reset VGA to BIOS state after drawing */
  24.  
  25.              /* clear video page to solid color: 10 mS */
  26.              /* returns -1 if bad page #             */
  27. extern int far clr_page(int page, int color);
  28.  
  29.             /* copy one page to another for use as */
  30.             /* background: 21 mS per call          */
  31.             /* returns -1 if bad page #            */
  32. extern int far copy_page(int source, int dest);
  33.  
  34.             /* fast VGA line draw: about 15600 24-pixel */
  35.             /* vectors/sec (horizontal much faster)     */
  36. extern void far vgaline(int x1, int y1, int x2, int y2, int color);
  37.  
  38.             /* does C-S clipping and draws line   */
  39. extern void far clipline(int x1, int y1, int x2, int y2, int color);
  40.  
  41. void far set_gmode();              /* enters 320x200x16 mode, clears screen */
  42. void far exit_gmode();             /* exits to text mode */
  43.  
  44. int far set_drawpage(int page);         /* set page for drawing on (0-7)   */
  45.  
  46.              /* set displayed page: uses BIOS   */
  47.              /* call, so DON'T use in interrupt */
  48.              /* routines! If WAIT is 1, will    */
  49.              /* sync with vert. retrace (pause) */
  50. int far set_vidpage(int page, int wait);
  51.  
  52. void far rest_8x8(int buffer, int address);
  53. int  far save_8x8(int x, int y, int buffer);
  54.  
  55.             /* print text in foreground only-- */
  56.             /* reversed = 1 for right-to-left  */
  57.             /* with x now right side of text   */
  58. void far printxyr(int x, int y, int color, char far *pstring, int reversed);
  59.  
  60.             /* draw "+" cursor on screen      */
  61.             /* save s screen under cursor     */
  62. void far draw_cursor(int x, int y, int color, int savebuff);
  63.  
  64.                  /* restores 8x8 area saved when   */
  65. void far erase_cursor(int savebuff); /* cursor was drawn               */
  66.  
  67.             /* copy any byte-aligned rectangle  */
  68.             /* this is evey 4 pixels for Y mode */
  69.             /* but every 8 for 16-color mode    */
  70.             /* x coords (left) are truncated to */
  71.             /* left byte boundary: x size is    */
  72.             /* bumped up to next full byte count */
  73. extern int far copy_block(int spage, int sx, int sy,  /* source */
  74.               int dpage, int dx, int dy,  /* dest   */
  75.               int xs, int ys);            /* # lines, pixels */
  76.  
  77.             /* clear any byte-aligned block       */
  78.             /* 15-30% slower than full page clear */
  79.             /* left edge rounded down, right edge */
  80.             /* rounded up to nearest byte boundary */
  81. extern int far clear_block(int left, int top, int right, int bottom,
  82.                int page, int color);
  83.  
  84. }
  85.  
  86. unsigned int dpaddr = 0;        /* video write base */
  87.  
  88. unsigned long l_hold, r_hold;   /* used to hold old x data for edge */
  89.  
  90. extern "C" int x1clipl, x2clipl, y1clipl, y2clipl;
  91.  
  92. int xcpline = 0;                  /* line 0 to 199     */
  93. int xcpcol = 0;                   /* column 0 to 39 (char width) */
  94.  
  95. int l_clip = 0;           /* clipping rectangle for polys and lines */
  96. int r_clip = 319;         /* max. 0,319,0,199                     */
  97. int t_clip = 0;
  98. int b_clip = 199;
  99.  
  100. struct Screeninfo {
  101.     int xmin, ymin, xmax, ymax, xcent, ycent, colors, pages, bw;
  102.     long aspect;
  103.     char id[80];
  104. } scrdat = {
  105.     0, 0, 319, 200, 160, 100, 256, 4, 0,
  106.     65536L/1.25,
  107.     "REND386 320x200 Y-mode Driver"
  108. };
  109.  
  110. struct Screeninfo far * far screen_data();
  111.  
  112.  
  113. /************* GRAPHICS MODE CONTROL SUPPORT **************/
  114.  
  115. struct Screeninfo far * far screen_data()
  116. {
  117.  return (struct Screeninfo far *)&scrdat;
  118. }
  119.  
  120. void far set_gmode()            /* enters 320x200x256 mode, clears screen */
  121. {                               /* may take arg in ext. VGA modes */
  122.  set_vmode(0x14);
  123. }
  124.  
  125. void far exit_gmode()           /* exits to text mode */
  126. {
  127.  set_vmode(0x03);
  128. }
  129.  
  130.  
  131. int far set_drawpage(int page)      /* set page for drawing */
  132. {
  133.  if(page>3) return(-1);
  134.  dpaddr = 16000*page;
  135.  return(0);
  136. }
  137.  
  138.  
  139. int far set_vidpage(int page, int wait)  /* set visible page, wait for vsync */
  140. {
  141.  if(page>3) return(-1);
  142.  set_vpage(page);
  143.  if(wait) vsync();
  144.  return 0;
  145. }
  146.  
  147.  
  148. /******************* LINE DRAWING SUPPORT ***************/
  149.  
  150. void far set_clip_rect(int l, int t, int r, int b)
  151. {
  152.  l_clip = l;
  153.  r_clip = r;
  154.  t_clip = t;
  155.  b_clip = b;
  156. }
  157.  
  158.  
  159. void far clipline(int x1, int y1, int x2, int y2, int color)
  160. {
  161.  x1clipl = x1;
  162.  x2clipl = x2;
  163.  y1clipl = y1;
  164.  y2clipl = y2;
  165.  
  166.  if (clipper()==-1) return;
  167.  vgaline(x1, y1, x2, y2, color);
  168.  return;
  169. }
  170.  
  171.  
  172. /********************* g-MODE TEXT PRINT SUPPORT ***************/
  173.  
  174. void fxprints(char far *pstring)
  175. {
  176.  int i,c;
  177.  
  178.  c = 1;
  179.  i = 0;
  180.  
  181.  while(c != 0)
  182.   {
  183.    c = pstring[i];
  184.    i++;
  185.    switch (c)
  186.     {
  187.      case 0: break;
  188.  
  189.      case '\n' :
  190.       {
  191.        if(xcpline<192) xcpline++;
  192.     xcpcol = 0;
  193.        if(xcpline>192) xcpline = 192;
  194.       }
  195.  
  196.      case '\r':
  197.       {
  198.        xcpcol = 0;
  199.        break;
  200.       }
  201.  
  202.      case '\t':
  203.       {
  204.        if((xcpcol&56)==0)
  205.     {
  206.      fxprints("        ");
  207.     }
  208.        while((xcpcol&56)!=0)
  209.     {
  210.      fxprints(" ");
  211.     }
  212.        break;
  213.       }
  214.  
  215.      default:
  216.       {
  217.        xprintc(c);
  218.        xcpcol+=8;
  219.        if(xcpcol>312) fxprints("\n");
  220.        break;
  221.       }
  222.     }
  223.    if(xcpcol>312) fxprints("\n");
  224.   }
  225. }
  226.  
  227. /***************** MIRROR TEXT PRINT SUPPORT ***************/
  228.  
  229. void rxprints(char far *pstring)
  230. {
  231.  int i,c;
  232.  
  233.  c = 1;
  234.  i = 0;
  235.  
  236.  while(c != 0)
  237.   {
  238.    c = pstring[i];
  239.    i++;
  240.    switch (c)
  241.     {
  242.      case 0: break;
  243.  
  244.      case '\n' :
  245.       {
  246.        if(xcpline<192) xcpline++;
  247.     xcpcol = 319;
  248.        if(xcpline>192) xcpline = 192;
  249.       }
  250.  
  251.      case '\r':
  252.       {
  253.        xcpcol = 319;
  254.        break;
  255.       }
  256.  
  257.      case '\t':
  258.       {
  259.        if((xcpcol&56)==0)
  260.     {
  261.      rxprints("        ");
  262.     }
  263.        while((xcpcol&56)!=0)
  264.     {
  265.      rxprints(" ");
  266.     }
  267.        break;
  268.       }
  269.  
  270.      default:
  271.       {
  272.        xrprintc(c);
  273.        xcpcol-=8;
  274.        if(xcpcol<7) rxprints("\n");
  275.        break;
  276.       }
  277.     }
  278.    if(xcpcol<7) rxprints("\n");
  279.   }
  280. }
  281.  
  282.  
  283.  
  284. void far printxyr(int x, int y, int color, char far *pstring, int reversed)
  285. {
  286.  setup_hdwe(0);
  287.  xcpline = y;
  288.  xcpcol = x;
  289.  load_color(color);
  290.  if(reversed) rxprints(pstring); else fxprints(pstring);
  291.  reset_hdwe();
  292. }
  293.  
  294.  
  295. /*************** CURSOR STUFF ************/
  296.  
  297. int savadr[8];
  298.  
  299. void far draw_cursor(int x, int y, int color, int savebuff)
  300. {
  301.  int xx = x-3;
  302.  int yy = y-3;
  303.  
  304.  if(xx<0)xx = 0;
  305.  if(yy<0)yy = 0;
  306.  
  307.  setup_hdwe(0);
  308.  savadr[savebuff] = save_8x8(xx,yy,savebuff);
  309.  vgaline(xx,y,x+3,y,color);
  310.  vgaline(x,yy,x,y+3,color);
  311.  reset_hdwe();
  312. }
  313.  
  314.  
  315. void far erase_cursor(int savebuff)
  316. {
  317.  setup_hdwe(0);
  318.  rest_8x8(savebuff, savadr[savebuff]);
  319.  reset_hdwe();
  320. }
  321.  
  322.  
  323. char default_palette[768] =
  324.                                                 {
  325. 0, 0, 0, 0, 0, 42, 0, 42, 0, 0, 42, 42,
  326. 42, 0, 0, 42, 0, 42, 42, 21, 0, 42, 42, 42,
  327. 21, 21, 21, 21, 21, 63, 21, 63, 21, 21, 63, 63,
  328. 63, 21, 21, 63, 21, 63, 63, 63, 21, 63, 63, 63,
  329. 5, 0, 0, 8, 0, 0, 10, 0, 0, 12, 0, 0,
  330. 15, 0, 0, 17, 0, 0, 20, 0, 0, 23, 0, 0,
  331. 26, 0, 0, 30, 0, 0, 34, 0, 0, 38, 0, 0,
  332. 43, 0, 0, 49, 0, 0, 56, 0, 0, 63, 0, 0,
  333. 5, 2, 0, 8, 4, 0, 10, 4, 0, 12, 6, 0,
  334. 15, 7, 0, 17, 8, 0, 20, 10, 0, 23, 11, 0,
  335. 26, 13, 0, 30, 14, 0, 34, 16, 0, 38, 18, 0,
  336. 43, 21, 0, 49, 24, 0, 56, 27, 0, 63, 31, 0,
  337. 5, 2, 2, 8, 4, 4, 10, 4, 4, 12, 6, 6,
  338. 15, 7, 7, 17, 8, 8, 20, 10, 10, 23, 11, 11,
  339. 26, 13, 13, 30, 14, 14, 34, 16, 16, 38, 18, 18,
  340. 43, 21, 21, 49, 24, 24, 56, 27, 27, 63, 31, 31,
  341. 5, 3, 2, 8, 6, 4, 10, 7, 4, 12, 9, 6,
  342. 15, 11, 7, 17, 13, 8, 20, 15, 10, 23, 17, 11,
  343. 26, 19, 13, 30, 22, 14, 34, 25, 16, 38, 28, 18,
  344. 43, 32, 21, 49, 37, 24, 56, 41, 27, 63, 47, 31,
  345. 5, 5, 2, 8, 8, 4, 10, 10, 4, 12, 12, 6,
  346. 15, 15, 7, 17, 17, 8, 20, 20, 10, 23, 23, 11,
  347. 26, 26, 13, 30, 30, 14, 34, 34, 16, 38, 38, 18,
  348. 43, 43, 21, 49, 49, 24, 56, 56, 27, 63, 63, 31,
  349. 5, 5, 0, 8, 8, 0, 10, 10, 0, 12, 12, 0,
  350. 15, 15, 0, 17, 17, 0, 20, 20, 0, 23, 23, 0,
  351. 26, 26, 0, 30, 30, 0, 34, 34, 0, 38, 38, 0,
  352. 43, 43, 0, 49, 49, 0, 56, 56, 0, 63, 63, 0,
  353. 0, 5, 2, 0, 8, 4, 0, 10, 4, 0, 12, 6,
  354. 0, 15, 7, 0, 17, 8, 0, 20, 10, 0, 23, 11,
  355. 0, 26, 13, 0, 30, 14, 0, 34, 16, 0, 38, 18,
  356. 0, 43, 21, 0, 49, 24, 0, 56, 27, 0, 63, 31,
  357. 0, 5, 0, 0, 8, 0, 0, 10, 0, 0, 12, 0,
  358. 0, 15, 0, 0, 17, 0, 0, 20, 0, 0, 23, 0,
  359. 0, 26, 0, 0, 30, 0, 0, 34, 0, 0, 38, 0,
  360. 0, 43, 0, 0, 49, 0, 0, 56, 0, 0, 63, 0, 
  361. 0, 5, 3, 0, 8, 6, 0, 10, 7, 0, 12, 9, 
  362. 0, 15, 11, 0, 17, 13, 0, 20, 15, 0, 23, 17, 
  363. 0, 26, 19, 0, 30, 22, 0, 34, 25, 0, 38, 28, 
  364. 0, 43, 32, 0, 49, 37, 0, 56, 41, 0, 63, 47,
  365. 0, 3, 5, 0, 6, 8, 0, 7, 10, 0, 9, 12, 
  366. 0, 11, 15, 0, 13, 17, 0, 15, 20, 0, 17, 23, 
  367. 0, 19, 26, 0, 22, 30, 0, 25, 34, 0, 28, 38, 
  368. 0, 32, 43, 0, 37, 49, 0, 41, 56, 0, 47, 63, 
  369. 0, 0, 5, 0, 0, 8, 0, 0, 10, 0, 0, 12, 
  370. 0, 0, 15, 0, 0, 17, 0, 0, 20, 0, 0, 23,
  371. 0, 0, 26, 0, 0, 30, 0, 0, 34, 0, 0, 38, 
  372. 0, 0, 43, 0, 0, 49, 0, 0, 56, 0, 0, 63, 
  373. 5, 0, 5, 8, 0, 8, 10, 0, 10, 12, 0, 12, 
  374. 15, 0, 15, 17, 0, 17, 20, 0, 20, 23, 0, 23, 
  375. 26, 0, 26, 30, 0, 30, 34, 0, 34, 38, 0, 38,
  376. 43, 0, 43, 49, 0, 49, 56, 0, 56, 63, 0, 63, 
  377. 5, 0, 3, 8, 0, 6, 10, 0, 7, 12, 0, 9, 
  378. 15, 0, 11, 17, 0, 13, 20, 0, 15, 23, 0, 17,
  379. 26, 0, 19, 30, 0, 22, 34, 0, 25, 38, 0, 28,
  380. 43, 0, 32, 49, 0, 37, 56, 0, 41, 63, 0, 47, 
  381. 2, 2, 2, 4, 4, 4, 5, 5, 5, 6, 6, 6, 
  382. 7, 7, 7, 8, 8, 8, 10, 10, 10, 11, 11, 11,
  383. 13, 13, 13, 15, 15, 15, 17, 17, 17, 19, 19, 19, 
  384. 22, 22, 22, 25, 25, 25, 28, 28, 28, 32, 32, 32, 
  385. 5, 5, 5, 8, 8, 8, 10, 10, 10, 12, 12, 12,
  386. 15, 15, 15, 17, 17, 17, 20, 20, 20, 23, 23, 23, 
  387. 26, 26, 26, 30, 30, 30, 34, 34, 34, 38, 38, 38,
  388. 43, 43, 43, 49, 49, 49, 56, 56, 56, 63, 63, 63
  389.                                  };
  390.  
  391.  
  392. extern "C" void far load_DAC(char far *pal, int n);
  393. void far load_DAC_colors( char far *pal, int n, int bw)
  394. {
  395.  int i;
  396.  
  397.  if(pal==0) pal = &default_palette[0];
  398.  if(bw)
  399.   {
  400.    for(i=0;i<n;i++)
  401.    pal[i+i+i] = pal[i+i+i+1] = pal[i+i+i+2] =
  402.        ((pal[i+i+i]*3)+(pal[i+i+i+1]*8)+(pal[i+i+i+2]*5))/16;
  403.   }
  404.  load_DAC(pal, n);
  405. }
  406.  
  407. extern "C" void far read_DAC(char far *pal, int n);
  408. void far read_DAC_colors( char far *pal, int n)
  409. {
  410.  int i;
  411.  
  412.  if(n>scrdat.colors) n = scrdat.colors;
  413.  read_DAC(pal, n);
  414. }
  415.  
  416.