/* 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 */ }