home *** CD-ROM | disk | FTP | other *** search
-
- /* ibmcurs.c follows: */
- #define screensize 80*2*24 /* IBM screen size (savable part) */
- #define crtbuffer 0Xb800
-
- static char buf1[screensize];
- static int cursor = 0;
-
- Savescrn()
-
- {
- register char *diptr;
- register char *siptr;
-
- diptr = &buf1[0]; /* save this screen */
- siptr = crtbuffer; /* screen segment addr */
- asm(" mov dx,si"); /* hold segment loc */
- asm(" mov ax,*24"); /* num lines to save */
- asm(" mov si,*0"); /* offset in buffer */
- asm("movel1: mov cx,*160"); /* bytes per bfr line */
- asm(" cli"); /* stop interrupts */
- asm(" mov ds,dx"); /* set dest seg reg */
- asm(" rep"); /* do string move */
- asm(" movb");
- asm(" sti"); /* reenable interrupts */
- asm(" dec ax"); /* decrement lines left */
- asm(" jnz movel1"); /* loop thru lines */
- asm(" mov ax,es"); /* restore seg reg */
- asm(" mov ds,ax");
- }
-
- Restscrn()
-
- {
- register char *diptr1;
- register char *siptr1;
-
- siptr1 = &buf1[0]; /* restore the screen */
- diptr1 = crtbuffer;
- asm(" mov dx,di");
- asm(" mov ax,*24");
- asm(" mov di,*0");
- asm("movel2: mov cx,*160");
- asm(" cli");
- asm(" mov es,dx");
- asm(" rep");
- asm(" movb");
- asm(" sti");
- asm(" dec ax");
- asm(" jnz movel2");
- asm(" mov ax,ds");
- asm(" mov es,ax");
-
- }
-
- ibmcur(Y,X)
- int X;
- int Y;
-
- { /* compute the display */
- cursor = X - 1; /* screen loc of cursor */
- if (X < 0) cursor = 0;
- cursor = cursor + cursor + ((Y - 1) * 160);
- }
-
- ibmprt(s)
- char *s;
-
- {
- register char *diptr2;
- register char *siptr2;
-
- siptr2 = s; /* users input pointer */
- diptr2 = crtbuffer; /* screen buffer address */
- asm(" mov bx,di"); /* set into a register */
- diptr2 = cursor; /* get the last cursor loc */
- asm(" mov cx,ds"); /* save current data seg */
- asm(" mov dx,#0x3da"); /* crt status port addr */
- asm("prtl1: movb ah,(si)"); /* get next char to output */
- asm(" cmp ah,*0"); /* end of string??? */
- asm(" je prtdone");
- asm(" in"); /* wait for vert. retrace */
- asm(" testb al,*8"); /* bit 3 on during retrace */
- asm(" jz prtl1");
- asm(" cli"); /* hold all interrupts */
- asm(" mov ds,bx"); /* use screen buf segment */
- asm(" movb (di),ah"); /* output the char */
- asm(" mov ds,cx"); /* restore seg register */
- asm(" sti"); /* reenable interrupts */
- asm(" inc si"); /* incr source pointer */
- asm(" add di,*2"); /* dbl incr dest pointer */
- asm(" j prtl1"); /* go get another char */
- asm("prtdone: "); /* end of all it */
- cursor = diptr2; /* save new cursor loc */
- }
-