home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_100 / 109_01 / screen.c < prev    next >
Text File  |  1985-03-10  |  6KB  |  181 lines

  1. /*
  2.     SCREEN:   Currently setup for TRS-80 Model II operation.
  3.  
  4.     Screen is a raw I/O routine with direct video drive (flashwriter),
  5.     intended for quickly viewing source files (ASCII character files).
  6.     The F2 key on the TRS-80 Model II pages deeper into file.
  7.     The BREAK key on the TRS-80 Model II provides an immediate and
  8.     orderly return to CP/M.
  9.     
  10.     Usage: screen filename <cr>
  11.     
  12.     Bugs:  If there are exactly n*23 (n > 0) lines in a file
  13.        the last page will be completely blank. All data,
  14.        however, will have been displayed correctly.
  15.     
  16.     Environment: CP/M 2.2 (P&T)
  17.              BDS C compiler Rev. 1.42
  18.  
  19.     Author: Jack S. Bakeman, Jr.
  20.         1222 Inverrary Ln.
  21.         Deerfield, IL 60015
  22.         (312) 459-0565
  23. */
  24.  
  25. #include "bdscio.h"
  26.  
  27. #define BUFSECTS 192    /* Buffer up to 192 sectors in memory    */
  28. #define VIDADDR  0xf800    /* Starting address if video memory    */
  29. #define VIDSIZE  1920    /* Video mem. size (24 lines * 80 char)    */
  30. #define VLINSIZ  80    /* Number of char. per video line    */
  31. #define F1       0x01    /* F1 key on TRS-80 Model II         */
  32. #define F2       0x02    /* F2 key on TRS-80 Model II         */
  33. #define CR       0x0d    /* Carriage return              */
  34. #define BRK     0x03    /* BREAK key on TRS-80 Model II         */
  35. #define NON_CPMEOF 1    /* Use if you expect EOF's other than ^Z*/
  36. #define USR_EOF  NULL    /* Non-standard EOF character         */
  37. #define not !
  38.  
  39. int fd1;         /* File descriptor for the file         */
  40. char buffer[BUFSECTS * SECSIZ];    /* The raw data transfer buffer    */
  41. char vidbuf[VIDSIZE];    /* Video buffer, holds processed data     */
  42.  
  43. main(argc,argv)
  44. int argc;         /* Arg count         */
  45. char *argv[];         /* Arg vector         */
  46. {
  47.     int i, j, k;
  48.     int cc;         /* Character counter for 1 line    */
  49.     int vidbuftotal;    /* Count of chars processed into vidbuf[] */
  50.     int rawcount;    /* Count of chars processed from buffer[] */
  51.     int pagenum;
  52.     char c, firstpage, done;    /* General purpose flags    */
  53.     char *ptr;         /* General purpose pointer    */
  54.     char pgstr[12];    /* Holds "page nnn"         */
  55.  
  56.               /* Make sure exactly 1 arg was given    */
  57.     if (argc != 2)
  58.          perror("Usage: screen filename <cr>\n");
  59.  
  60.               /* Try to open file; abort on error    */
  61.     if ((fd1 = open(argv[1],0)) == ERROR)
  62.          perror("Can't open: %s\n",argv[1]);
  63.  
  64.     firstpage = TRUE;
  65.     done = FALSE;
  66.     rawcount = 0;
  67.     pagenum = 1;
  68.  
  69.          /* Move data from th floppy to the buffer    */
  70.     if (read(fd1, buffer, BUFSECTS) == ERROR)
  71.     perror("Error reading: %s\n",argv[1]);
  72.  
  73.     while (not done)
  74.     {
  75.         vidbuftotal = cc = 0;
  76.         for (i = rawcount; vidbuftotal < VIDSIZE - VLINSIZ; i++)
  77.             {
  78.  
  79.               /* Raw buffer has been processed & file is not done    */
  80.         if (i >= BUFSECTS * SECSIZ)
  81.             {
  82.                 if (read(fd1, buffer, BUFSECTS) == ERROR)
  83.                 perror("Error reading: %s\n",argv[1]);
  84.             i = rawcount = 0;
  85.             }
  86.  
  87.               /* Check for end of file (EOF)    */
  88. #ifndef NON_CPMEOF
  89.  
  90.             if ((c = buffer[i]) == CPMEOF)
  91.  
  92. #else
  93. #ifdef NON_CPMEOF
  94.  
  95.         if ((c = buffer[i]) == CPMEOF || c == USR_EOF)
  96.  
  97. #endif
  98.          {
  99.          done = TRUE;
  100.             while (vidbuftotal < VIDSIZE)
  101.              vidbuf[vidbuftotal++] = ' ';
  102.          }
  103.  
  104.               /* Not at EOF so make video buffer from raw ASCII    */
  105.             else switch (c)
  106.                 {
  107.                 case '\t':    /* Tab: insert up to 8 spaces    */
  108.                  for (j = cc, k = cc % 8; j < VLINSIZ && k < 8; j++,k++)
  109.                  {
  110.                      vidbuf[vidbuftotal++] = ' ';
  111.                  cc++;
  112.                  }
  113.                  break;
  114.                 case CR:    /* Carriage return: merely incr. raw buffer */
  115.                  break;
  116.                 case '\n':   /* Line feed: fill remainder if line w/ spaces */
  117.                  for (j = cc; j < VLINSIZ; j++)
  118.                      vidbuf[vidbuftotal++] = ' ';
  119.              cc = 0;         /* Reset cc char count of line    */
  120.                  break;
  121.                 default:    /* Most characters are processed here    */
  122.                  vidbuf[vidbuftotal++] = c;
  123.              cc++;
  124.                  break;
  125.                 }
  126.             }
  127.     rawcount = i;         /* Bump rawcount */
  128.  
  129.                    /* Bottom line data */
  130.     sprintf(pgstr, "page %d", pagenum);
  131.     if (not done)         /* Put info line on line 24    */
  132.         {
  133.         for (i = VIDSIZE - VLINSIZ; i < VIDSIZE; i++)
  134.             vidbuf[i] = '-';
  135.         for (i = 1844, ptr = pgstr; *ptr != NULL; i++, ptr++)
  136.             vidbuf[i] = 0x80 | *ptr;
  137.         for (i = 1904, ptr = argv[1]; *ptr != NULL; i++, ptr++)
  138.         vidbuf[i] = 0x80 | *ptr;
  139.         }
  140.     else              /* Put info line on line 23    */
  141.         {
  142.         for (i = VIDSIZE - 2*VLINSIZ; i < VIDSIZE - VLINSIZ; i++)
  143.             vidbuf[i] = '-';
  144.         for (i = 1764, ptr = pgstr; *ptr != NULL; i++, ptr++)
  145.             vidbuf[i] = 0x80 | *ptr;
  146.         for (i = 1824, ptr = argv[1]; *ptr != NULL; i++, ptr++)
  147.         vidbuf[i] = 0x80 | *ptr;
  148.         }
  149.  
  150.           /* Video buffer has know been made so move it */
  151.         if (firstpage)
  152.         {
  153.              call(0x40,NULL,NULL,0x1500,NULL);   /* Enable video RAM    */
  154.             movmem(vidbuf,VIDADDR,VIDSIZE);     /* Data to screen mem    */
  155.               call(0x40,NULL,NULL,0x1600,NULL);   /* Disable video RAM    */
  156.         firstpage = FALSE;              /* Not firstpage now    */
  157.         pagenum++;
  158.             }
  159.         else while ((c = bios(3)) != F2 && c != BRK) /* Raw KB input    */
  160.         ;
  161.     if (c == F2)    /* Descend one page deeper into file         */
  162.         {
  163.              call(0x40,NULL,NULL,0x1500,NULL);   /* Enable video RAM    */
  164.             movmem(vidbuf,VIDADDR,VIDSIZE);     /* Data to screen mem    */
  165.               call(0x40,NULL,NULL,0x1600,NULL);   /* Disable video RAM    */
  166.         pagenum++;
  167.             }
  168.     if (c == BRK) exit();    /* Not at EOF but user wants out    */
  169.     }
  170.  
  171.               /* File has been totally displayed. Now close the file: */
  172.     close(fd1);
  173.     printf("\033Y\066\076Screen complete");
  174. }
  175.  
  176. perror(format,arg)    /* Print error message and abort    */
  177.  
  178.     printf(format, arg);    /* Print message    */
  179.     exit();              /* Return to CP/M    */
  180. }
  181.