home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug035.arc / DEMO.C < prev    next >
Text File  |  1979-12-31  |  6KB  |  229 lines

  1.  
  2. /********************************************************/
  3. /*                            */
  4. /*        GRAF Demonstration Program        */
  5. /*                            */
  6. /*    Uses the following .GRF files:            */
  7. /*       TITLE, SMALL, MEDIUM, HUGH, BAR1        */
  8. /*       BAR2, CIRCLE, LINE, and STAR            */
  9. /*                            */
  10. /*   Don Brittain            3 January 1983    */
  11. /*   4200 Spruce St. #208           phone:        */
  12. /*   Philadelphia, PA 19104       (215) 386-2684    */
  13. /*                            */
  14. /********************************************************/
  15.  
  16. #define HSIZE 320
  17. #define VSIZE 328
  18. #define LIST 5
  19. #define ESC 27
  20.  
  21. short grafbuf[HSIZE][VSIZE/8];
  22. int horsize, versize;
  23. int flag=1;
  24. char grafname[13];
  25.  
  26. #include "libc.h"
  27.  
  28. main()
  29.  
  30. {
  31.     bdos(LIST,12);
  32.     crlf(8);
  33.     graph("title");
  34.     crlf(3);
  35.     margin(23);
  36.     pr("PRELIMINARY VERSION 1.0\n");
  37.     margin(23);
  38.     pr("    3 January 1983");
  39.     crlf(19);
  40.     margin(27);
  41.     pr("Don Brittain\n");
  42.     margin(23);
  43.     pr("4200 Spruce St. #208\n");
  44.     margin(22);
  45.     pr("Philadelphia, PA  19104\n");
  46.     margin(26);
  47.     pr("(215) 386-2684");
  48.     crlf(12);
  49.     pr("This program was written to illustrate the power of GRAF.  All\n");
  50.     pr("the examples were created with this preliminary version.\n\n");
  51.     pr("Actually, GRAF is just an interactive 'shell' allowing (minimal) \n");
  52.     pr("access to the modules grafutil.c, grafplot.c, grafline.c, graf-\n");
  53.     pr("circ.c, grafinvt.c, and graffile.c.  These modules were originally\n");
  54.     pr("written to be included in C programs requiring graphics.  GRAF\n");
  55.     pr("hardly begins to utilize the real power of these subroutines.\n");
  56.     pr("With them, C programs can easily be written to plot functions,\n");
  57.     pr("draw recursive figures, plot solutions of ordinary differential\n");
  58.     pr("equations, etc.  For technical details regarding the graphics\n");
  59.     pr("modules (and a discussion of their shortcomings) see the file\n");
  60.     pr("GRAF.DOC.\n\n");
  61.     pr("I would appreciate being informed of any applications using these\n");
  62.     pr("graphics subroutines.  Suggestions, criticisms, and improvements\n");
  63.     pr("regarding any of my programs are always welcome.  I would also \n");
  64.     pr("like to know about any other MX-80 graphics programs in the public\n");
  65.     pr("domain.  I am particularly interested in 3-D graphics.  (This\n");
  66.     pr("version of GRAF is FAR from supporting 3-D images!)\n\n");
  67.     pr("Now for the demonstration:");
  68.     crlf(10);
  69.     pr("GRAF can create small graphs (as small as  1 x 1  pixels!):");
  70.     graph("small");
  71.     pr("Medium-size graphs:");
  72.     graph("medium");
  73.     crlf(5);
  74.     pr("And hugh graphs (as large as  320 x 320  pixels):");
  75.     graph("hugh");
  76.     pr("GRAF makes bar graphs easily:");
  77.     graph("bar1");
  78.     pr("and can 'invert' graphs with a single command:");
  79.     graph("bar2");
  80.     crlf(8);
  81.     pr("GRAF also has a circle (ellipse?) plotting command:");
  82.     crlf(2);
  83.     graph("circle");
  84.     crlf(3);
  85.     pr("and the ability to plot (or unplot) points and lines:");
  86.     crlf(3);
  87.     graph("line");
  88.     crlf(17);
  89.     pr("In order to use GRAF, simply type 'graf' after CP/M signs on,\n");
  90.     pr("enter the dimensions of the graph when asked, then (following the\n");
  91.     pr("'command:' prompt) type HELP.  A list of GRAF commands, together\n");
  92.     pr("with a brief description of their actions, will be displayed on\n");
  93.     pr("your console.\n\n     Have fun!");
  94.     crlf(5);
  95.     graph("star");
  96.     crlf(35);
  97. }
  98.     
  99.     
  100. graph(name)
  101.  
  102. char *name;
  103.  
  104. {
  105.     FILE *fopen(), *fp;
  106.     int vrt;
  107.     register i,j;
  108.  
  109.     graffcb(name);
  110.     fp=fopen(grafname,"r");
  111.     if(fp==NULL)     {
  112.     printf("\nERROR: %s does not exist on ",grafname);
  113.     printf("the current drive.\n\n");
  114.     return();    }
  115.     horsize=getw(fp);
  116.     versize=getw(fp);
  117.     vrt=(versize+7)/8;
  118.     printf("\nThe graph in %s has the following dimensions:",grafname);
  119.     printf("\n\tHorizontal size: %3d",horsize);
  120.     printf("\n\tVertical size: %3d\n\n",versize);
  121.     for(j=0; j<vrt; j++)
  122.     for(i=0; i<horsize; i++)
  123.         grafbuf[i][j]=getc(fp);
  124.     fclose(fp);
  125.     grafprnt();
  126. }
  127.  
  128. graffcb(name)
  129.  
  130. char *name;
  131.  
  132. {
  133.     register i;
  134.  
  135.     for(i=0; (grafname[i]=toupper(name[i]))!='\0'; i++);
  136.     grafname[i++]='.';
  137.     grafname[i++]='G';
  138.     grafname[i++]='R';
  139.     grafname[i++]='F';
  140.     grafname[i]='\0';
  141. }
  142.  
  143. pr(name)
  144.  
  145. char *name;
  146.  
  147. {
  148.     register i;
  149.     
  150.     margin(5);
  151.     for(i=0; name[i]!='\0'; i++)
  152.     bdos(LIST,name[i]);
  153. }
  154.     
  155.     
  156. grafprnt()
  157.  
  158. {
  159.     register i, j;
  160.     int v,w;
  161.     
  162.     v=(versize+7)/8;
  163.     w=50-horsize/8;
  164.     crlf(3);
  165.     setline(8);
  166.     clmar(w);
  167.     for(j=0; j<v; j++)    {
  168.     bitmode(horsize);
  169.     for(i=0; i<horsize; i++)
  170.         bdos(LIST, grafbuf[i][j]);
  171.     clmar(w);    }
  172.     crlf(3);
  173.     setline(12);
  174. }
  175.  
  176.  
  177. setline(n)    /* routine to set the line-spacing on the MX-80 */
  178. int n;
  179. {
  180.     bdos(LIST,ESC);
  181.     bdos(LIST,'A');
  182.     bdos(LIST,n);
  183. }
  184.  
  185. bitmode(n)    /* sets n chars of dot graphics (480 dots/line) on MX-80 */
  186. int n;
  187. {
  188.     bdos(LIST,ESC);
  189.     bdos(LIST,'K');
  190.     if(n<256)
  191.     {
  192.     bdos(LIST,n);
  193.     bdos(LIST,0);
  194.     }
  195.     else
  196.     {
  197.     bdos(LIST,n-256);
  198.     bdos(LIST,1);
  199.     }
  200. }
  201.  
  202.  
  203. crlf(n)        /* printer carriage-return-linefeed */
  204. int n;
  205. {
  206. int i;
  207. for(i=0; i<n; i++)
  208.     {
  209.     bdos(LIST,13);
  210.     bdos(LIST,10);
  211.     }
  212. }
  213.  
  214.  
  215. margin(n)    /* printer left-margin */
  216. int n;
  217. {
  218. int i;
  219. for(i=0; i<n; i++)
  220.     bdos(LIST,' ');
  221. }
  222.  
  223. clmar(n)
  224. int n;
  225. {
  226. crlf(1);
  227. margin(n);
  228. }
  229.