home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast2.iso / c / ibmcur.c < prev    next >
C/C++ Source or Header  |  1994-03-04  |  3KB  |  96 lines

  1.  
  2. /* ibmcurs.c follows: */
  3. #define         screensize      80*2*24 /* IBM screen size (savable part) */
  4. #define         crtbuffer       0Xb800
  5.  
  6. static char buf1[screensize];
  7. static int cursor  = 0;
  8.  
  9. Savescrn()
  10.  
  11. {
  12. register char *diptr;
  13. register char *siptr;
  14.  
  15.     diptr = &buf1[0];                  /* save this screen */
  16.     siptr = crtbuffer;                      /* screen segment addr */
  17.     asm(" mov dx,si");                      /* hold segment loc */
  18.     asm(" mov ax,*24");                     /* num lines to save */
  19.     asm(" mov si,*0");                      /* offset in buffer */
  20.     asm("movel1: mov cx,*160");             /* bytes per bfr line */
  21.     asm(" cli");                            /* stop interrupts */
  22.     asm(" mov ds,dx");                      /* set dest seg reg */
  23.     asm(" rep");                            /* do string move */
  24.     asm(" movb");
  25.     asm(" sti");                            /* reenable interrupts */
  26.     asm(" dec ax");                         /* decrement lines left */
  27.     asm(" jnz movel1");                     /* loop thru lines */
  28.     asm(" mov ax,es");                      /* restore seg reg */
  29.     asm(" mov ds,ax");
  30. }
  31.  
  32. Restscrn()
  33.  
  34. {
  35. register char *diptr1;
  36. register char *siptr1;
  37.  
  38.     siptr1 = &buf1[0];                  /* restore the screen */
  39.     diptr1 = crtbuffer;
  40.     asm(" mov dx,di");
  41.     asm(" mov ax,*24");
  42.     asm(" mov di,*0");
  43.     asm("movel2: mov cx,*160");
  44.     asm(" cli");
  45.     asm(" mov es,dx");
  46.     asm(" rep");
  47.     asm(" movb");
  48.     asm(" sti");
  49.     asm(" dec ax");
  50.     asm(" jnz movel2");
  51.     asm(" mov ax,ds");
  52.     asm(" mov es,ax");
  53.  
  54. }
  55.  
  56. ibmcur(Y,X)
  57. int     X;
  58. int     Y;
  59.  
  60. {                                               /* compute the display */
  61.     cursor = X - 1;                         /* screen loc of cursor */
  62.     if (X < 0) cursor = 0;
  63.     cursor = cursor + cursor + ((Y - 1) * 160);
  64. }
  65.  
  66. ibmprt(s)
  67. char *s;
  68.  
  69. {
  70. register char *diptr2;
  71. register char *siptr2;
  72.  
  73.     siptr2 = s;                             /* users input pointer */
  74.     diptr2 = crtbuffer;                     /* screen buffer address */
  75.     asm(" mov bx,di");                      /* set into a register */
  76.     diptr2 = cursor;                        /* get the last cursor loc */
  77.     asm(" mov cx,ds");                      /* save current data seg */
  78.     asm(" mov dx,#0x3da");                  /* crt status port addr */
  79.     asm("prtl1: movb ah,(si)");             /* get next char to output */
  80.     asm(" cmp ah,*0");                      /* end of string??? */
  81.     asm(" je prtdone");
  82.     asm(" in");                             /* wait for vert. retrace */
  83.     asm(" testb al,*8");                    /* bit 3 on during retrace */
  84.     asm(" jz prtl1");
  85.     asm(" cli");                            /* hold all interrupts */
  86.     asm(" mov ds,bx");                      /* use screen buf segment */
  87.     asm(" movb (di),ah");                   /* output the char */
  88.     asm(" mov ds,cx");                      /* restore seg register */
  89.     asm(" sti");                            /* reenable interrupts */
  90.     asm(" inc si");                         /* incr source pointer */
  91.     asm(" add di,*2");                      /* dbl incr dest pointer */
  92.     asm(" j prtl1");                        /* go get another char */
  93.     asm("prtdone: ");                       /* end of all it */
  94.     cursor = diptr2;                        /* save new cursor loc */
  95. }
  96.