home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / acad / c / hrsh2acd / cxyibmpc.c next >
Text File  |  1988-07-14  |  6KB  |  173 lines

  1. /*****************************************************************************/
  2. /*    Title    :   CXYIBMPC.C                                */
  3. /*    C Graphic Functions for CGA/EGA via slooow BIOS                 */
  4. /*****************************************************************************/
  5. /*                                            */
  6. /*       Jul. 14, 1988         I. Ohzawa                      */
  7. /*****************************************************************************/
  8.  
  9. #include <stdio.h>
  10. #include <dos.h>
  11. #define BIOS_VIDEO  0x10
  12.  
  13. static union REGS inregs, outregs;
  14. static int xcurr, ycurr;        /* current x,y */
  15.  
  16. /*********--------------------------------------------------------------******/
  17. /*    Function:   cxy_videomode(mode)                         */
  18. /*      changes the current mode of ncolor display to mode specified         */
  19. /*        mode ; --- refer to the Function to_color(mode)             */
  20. /*            = 0   40 (columns) x 25 (lines) Black & White         */
  21. /*            = 1   40 x 25 Color                     */
  22. /*            = 2   80 x 25 Black & White                 */
  23. /*            = 3   80 x 25 Color                     */
  24. /*            = 4   320 x 200 (dots) Color                 */
  25. /*            = 5   320 x 200 Black & White                 */
  26. /*            = 6   640 x 200 Black & White                 */
  27. /*            = 16  640 x 350 EGA graphics mode                   */
  28. /*    return value    ; NULL if safely selected                 */
  29. /*            ; -1 if error occured                     */
  30. /********---------------------------------------------------------------******/
  31. cxy_videomode(mode)
  32. int mode;
  33. {
  34. /*    union REGS inregs, outregs;     */
  35.     inregs.h.ah = 0;      /* set mode (AL) contains mode value */
  36.     inregs.h.al = mode;
  37.     int86(BIOS_VIDEO, &inregs, &outregs);
  38.     return(NULL);
  39. }
  40.  
  41. /* ------------------------------------------------------------------------*/
  42. /* Function:   cxy_color(bakgnd, palette)                   */
  43. /*    sets background color and palette                      */
  44. /*    bakgnd  -- background color                       */
  45. /*    palette -- palette selection                       */
  46. /*-------------------------------------------------------------------------*/
  47.  
  48. cxy_color(bakgnd, palette)
  49. int bakgnd, palette;
  50. {
  51.     inregs.h.bh = 0;        /* ID for background */
  52.     inregs.h.ah = 11;        /* palette select    */
  53.     inregs.h.bl = bakgnd;    /* color for bakgnd  */
  54.     int86(BIOS_VIDEO, &inregs, &outregs);
  55.  
  56.     inregs.h.bh = 1;        /* ID for palette */
  57.     inregs.h.ah = 11;        /* to be sure    */
  58.     inregs.h.bl = palette;    /* palette code   */
  59.     int86(BIOS_VIDEO, &inregs, &outregs);
  60.     return(NULL);
  61. }
  62.  
  63. /* ------------------------------------------------------------*/
  64. /* Function: cxy_move(xpos, ypos)                   */
  65. /*  preset current position to (xpos,ypos)                  */
  66. /*-------------------------------------------------------------*/
  67. cxy_move(xpos,ypos)
  68. int xpos,ypos;
  69. {
  70.     xcurr = xpos;
  71.     ycurr = ypos;
  72.     return(NULL);
  73. }
  74.  
  75.  
  76. /* ------------------------------------------------------------*/
  77. /* Function:  cxy_lineto(xpos, ypos, color)               */
  78. /*   draws a line of color from current x,y to xpos, ypos      */
  79. /* ------------------------------------------------------------*/
  80. cxy_lineto(xpos, ypos, color)
  81. int xpos, ypos, color;
  82. {
  83.     cxy_line(xcurr,ycurr,xpos,ypos,color);
  84.     return;
  85. }
  86.  
  87. /* ----------------------------------------------------------------*/
  88. /* Function:  cxy_line(x1, y1, x2, y2, color)               */
  89. /*   draws a line of color from x1,y1 to x2, y2               */
  90. /*   calls assembly language function cxy_dot(xpos, ypos, color)   */
  91. /* ----------------------------------------------------------------*/
  92. cxy_line(x1, y1, x2, y2, color)
  93. int x1, y1;        /* starting point */
  94. int x2, y2;        /* ending point   */
  95. int color;        /* color of line  */
  96. {
  97.                     /* use static vars for fastest access */
  98.     static int lg_delta, sh_delta;    /* distance of long, short axis */
  99.     static int lg_step, sh_step;        /* 0, 1, or -1 */
  100.     static int cycle;            /* decision variable */
  101.     static int temp;            /* swapping variable */
  102.  
  103.     xcurr = x2;                /* update current pos */
  104.     ycurr = y2;
  105.     lg_delta = x2 - x1;        /* get travel along x-axis */
  106.     if (lg_delta >= 0)
  107.         lg_step = 1;
  108.     else
  109.     {
  110.         lg_delta = -lg_delta;        /* get abs value */
  111.         lg_step  = -1;            /* reverse direction */
  112.     }
  113.  
  114.     sh_delta = y2 - y1;        /* get travel along y axis */
  115.     if (sh_delta >= 0)
  116.         sh_step = 1;
  117.     else
  118.     {
  119.         sh_delta = -sh_delta;        /* get abs value */
  120.         sh_step  = -1;
  121.     }
  122.  
  123.     if (sh_delta > lg_delta)     /* is y-axis travel is longer, swap */
  124.     {
  125.         cycle = sh_delta >> 1;            /* devide by 2 */
  126.         temp = lg_delta; lg_delta = sh_delta; sh_delta = temp;
  127.         temp = lg_step;  lg_step  = sh_step;  sh_step  = temp;
  128.  
  129.         while (y1 != y2)        /* loop for vertical line */
  130.         {
  131.            cxy_dot(x1, y1, color);
  132.            y1 += lg_step;        /* always bump line pointer */
  133.            cycle += sh_delta;    /* bump decision variable */
  134.            if(cycle >= lg_delta)    /* pase decision threshold? */
  135.             {
  136.               cycle -= lg_delta; /* reset for next decision cycle */
  137.               x1 += sh_step;    /* bump column pointer */
  138.             }
  139.         }
  140.     }
  141.  
  142.     else
  143.     {            /* if x-axis travel is longer, no swap */
  144.         cycle = lg_delta >> 1;            /* divide by 2 */
  145.         while (x1 != x2)
  146.         {            /* loop for horizontal line */
  147.             cxy_dot(x1, y1, color);
  148.             x1 += lg_step;
  149.             cycle += sh_delta;
  150.             if( cycle >= lg_delta)
  151.             {
  152.                cycle -= lg_delta;
  153.                y1 += sh_step;
  154.             }
  155.         }
  156.     }
  157.  
  158. }        /* end of line  */
  159.  
  160. /* ---- Sloooow function cxy_dot via BIOS --------------------------------- */
  161.  
  162. cxy_dot( xpos, ypos, color)
  163. int xpos, ypos, color;
  164. {
  165. /*    union REGS inregs, outregs;*/
  166.     inregs.x.dx = ypos;
  167.     inregs.x.cx = xpos;
  168.     inregs.h.ah = 12;
  169.     inregs.h.al = color;
  170.     int86 (BIOS_VIDEO, &inregs, &outregs);
  171. }
  172.  
  173.