home *** CD-ROM | disk | FTP | other *** search
/ Power Programming / powerprogramming1994.iso / progtool / microcrn / issue_33.arc / C.FIG next >
Text File  |  1986-11-20  |  3KB  |  80 lines

  1.  
  2.  
  3. #include <regs.h >             /* or however you generate interrupts */
  4. #define TEXTSPACE ????             /* however long the total text is */
  5. #define SCREENCOUNT ???
  6. unsigned scrseg;
  7. char *charptr,*place[SCREENCOUNT],  /* place[] = pointers to screens */
  8.     buff[4000],texthold[TEXTSPACE];
  9. main()
  10. {
  11.   struct regs rr;
  12.   int i,fhand;
  13.  
  14.   interrupt(0x11,rr);                  /* equipment check interrupt */
  15.   scrseg=((rr.ax >> 4) & 3 == 3) ? 0xb000 : 0xb800; /* which CRT adapter? */
  16.   fhand=open("text.txt",0);    /* load text area from word processor file */
  17.   read(fhand,texthold,TEXTSPACE);
  18.   close(fhand);
  19.   place[0]=charptr=texthold;
  20.   for(i=1;i<SCREENCOUNT;i++){      /* setting addresses of screens */
  21.     while(*charptr++ != '~');             /* tilde divides screens */
  22.     place[i] = charptr;
  23.     }
  24.   *  *  *  *  *  *           /* this is the area where the program */
  25.   text(QQ);                          /* would do something useful. */
  26.      *  *
  27.   text (RR);
  28.   *  *  *  *  *  *
  29. }
  30. /***************/
  31. text(nn)
  32.   int nn;
  33. {
  34.   char att,*wptr;
  35.   int y,i,*iptr;
  36.  
  37.   for(i=0,iptr=buff;i<2000;i++) 0x0720;     /* blank screen buffer */
  38.   for(charptr = place[nn]; *charptr != 0xa ;) if(*charptr++ == 26) return;
  39.              /* to end of line: this gives me an area for comments */
  40.   for(att=0x7,y=0,wptr=buff;;charptr++)  switch(*charptr){
  41.       case 0xa: wptr = &buff[++y*160];
  42.                         /* point pointer to beginning of new line */
  43.         if(y<25) break;       /* fall through if screen too large */
  44.       case '~': longmove(scrseg,0,buff,4000);
  45.        /* End of screen. You could use port calls to the 6845 to
  46.           blank the screen and avoid flicker. If you do, remember
  47.           that the control port is 0x3d8 for color/graphics and
  48.           0x3b8 for monochrome. More hardware dependencies! */
  49.         return;
  50.  
  51.       case 0xd: break;     /* some WP's don't include 0xd's */
  52.       case '^': att ^= 8; /* toggling intensity bit: 0xf<->0x7*/
  53.         break;
  54.       default: *wptr++ = *charptr;      /*insert character */
  55.        *wptr++ = att;                      /*and attribute */
  56.        break;
  57.      }
  58. }
  59. /******************/
  60. longmove(segment,offset,buffer,count)
  61.   unsigned seg,offset,ct;
  62.   char *buffer;
  63. {
  64. /* This one depends on
  65.   a. How your version of C handles the stack.
  66.   b. What sort of assembler you are using.
  67.  
  68.      I'll just give assembly pseudocode. You'd probably be
  69.      using [BP+?] addressing */
  70. #asm
  71.    mov      es,segment
  72.    mov      di,offset
  73.    mov      si,buffer    ;ds is already set
  74.    mov      cx,count
  75.    cld                   ;increment si & di with each loop
  76.    rep      movsb
  77. #endasm
  78. }
  79.  
  80.