/****************************************/ /* iiscr valdes 8 30 82 */ /* */ /* IIS cursor subroutines */ /****************************************/ #include "misc.h" #include "iisfv.h" int lastwin = -1; static short lastcur[2]; static unsigned char data[64][64]; /*Cursor position on display*/ iiscr (window, mode, pos) int window; int mode; /*0 - read cursor position*/ /*1 - write cursor position*/ int pos[2]; /* Cursor position */ { int i, vec[4], size, on; short hdr[8], cur[2]; short *status; float x, y; char curval[SZ_IMCURVAL]; switch (iisdev) { case 1: status = iiswda[window].cursor.status; switch (mode) { case 0: iishdr (hdr, IREAD + VRETRACE, 3, COMMAND + CURSOR, ADVXONTC, 0, 0, 0); iiswrite (hdr, 0, 0); iisread (status, 6); status[1] = (status[1] + 32) & 0777; status[2] = (status[2] + 32) & 0777; pos[0] = status[1]; pos[1] = status[2]; break; case 1: iishdr (hdr, IWRITE + VRETRACE, 2, COMMAND + CURSOR, 1 + ADVXONTC, 0, 0, 0); status[1] = pos[0]; status[2] = pos[1]; cur[0] = (status[1] - 32) & 0777; cur[1] = (status[2] - 32) & 0777; iiswrite (hdr, cur, 4); break; } break; case 2: status = iiswda[window].cursor.status; switch (mode) { case 0: iishdr (hdr, IREAD + VRETRACE, 3, COMMAND + CURSOR, M75_ADVXONTC, 0, 0, 0); iiswrite (hdr, 0, 0); iisread (status, 6); status[1] = (status[1] + 32) & 0777; status[2] = (status[2] + 32) & 0777; pos[0] = status[1]; pos[1] = status[2]; break; case 1: iishdr (hdr, IWRITE + VRETRACE, 2, COMMAND + CURSOR, 1 + M75_ADVXONTC, 0, 0, 0); status[1] = pos[0]; status[2] = pos[1]; cur[0] = (status[1] - 32) & 0777; cur[1] = (status[2] - 32) & 0777; iiswrite (hdr, cur, 4); break; } break; case 3: on = iiswda[window].cursor.on; size = iiswda[window].cursor.size; switch (mode) { case 0: iishdr (hdr, IREAD, 3, IMCURSOR, ADVXONTC, 0, 1, 0); iiswrite (hdr, 0, 0); iisread (curval, SZ_IMCURVAL); sscanf (curval, "%hf%hf", &x, &y); pos[0] = x + 0.5; pos[1] = y + 0.5; break; case 1: /* cur[0] = pos[0]; cur[1] = pos[1]; iishdr (hdr, IWRITE, 2, IMCURSOR, cur[0], cur[1], 1, 0); iiswrite (hdr, 0, 0); */ if (on) { /* We must subtract window origin because the iisvec and iisline routines are relative to the window origin while this routine is called in absolute coordinates. */ pos[0] -= iiswda[window].wndw[0]; pos[1] -= iiswda[window].wndw[1]; if (lastwin != -1) for (i = lastcur[1]-size/2; i <= lastcur[1]+size/2; i++) iisline (lastwin, lastcur[0]-size/2, i, size, data[i]); lastwin = window; lastcur[0] = pos[0]; lastcur[1] = pos[1]; for (i = lastcur[1]-size/2; i <= lastcur[1]+size/2; i++) iisrline (lastwin, lastcur[0]-size/2, i, size, data[i]); vec[0] = pos[0]; vec[1] = pos[1] - size / 2; vec[2] = pos[0]; vec[3] = pos[1] + size / 2; iisvec (window, vec, 204); vec[0] = pos[0] - size / 2; vec[1] = pos[1]; vec[2] = pos[0] + size / 2; vec[3] = pos[1]; iisvec (window, vec, 204); } break; } } } /*Cursor position on display window*/ iiscrw (window, mode, pos) int window; int mode; /*0 - read cursor position*/ /*1 - write cursor position*/ int pos[2]; /* Cursor position */ { int cur[2]; short *wndw; wndw = iiswda[window].wndw; switch (mode) { case 0: iiscr (window, mode, cur); pos[0] = cur[0] - wndw[0]; pos[1] = cur[1] - wndw[1]; break; case 1: cur[0] = pos[0] + wndw[0]; cur[1] = pos[1] + wndw[1]; iiscr (window, mode, cur); break; } } /*Cursor position in memory*/ iiscrm (window, mode, pos) int window; int mode; /*0 - read cursor position*/ /*1 - write cursor position*/ int pos[2]; { short *zoom, *wndw; int cur[2]; wndw = iiswda[window].wndw; zoom = iiswda[window].zoom; switch (iisdev) { case 1: case 3: switch (mode) { case 0: iiscr (window, mode, cur); pos[0] = (cur[0] - zoom[1]) / (1 << zoom[0]) + zoom[1] - wndw[0]; pos[1] = (cur[1] - zoom[2]) / (1 << zoom[0]) + zoom[2] - wndw[1]; break; case 1: cur[0] = (pos[0] + wndw[0] - zoom[1]) * (1 << zoom[0]) + zoom[1]; cur[1] = (pos[1] + wndw[1] - zoom[2]) * (1 << zoom[0]) + zoom[2]; iiscr (window, mode, cur); } break; case 2: switch (mode) { case 0: iiscr (window, mode, cur); pos[0] = cur[0] / (1 << zoom[0]) + zoom[1] - wndw[0]; pos[1] = cur[1] / (1 << zoom[0]) + zoom[2] - wndw[1]; if(pos[0] > 511) pos[0] -= 512; if(pos[1] > 511) pos[1] -= 512; if(pos[0] < 0) pos[0] += 512; if(pos[1] < 0) pos[1] += 512; break; case 1: cur[0] = (pos[0] + wndw[0] - zoom[1]) * (1 << zoom[0]); /* + zoom[1]; */ cur[1] = (pos[1] + wndw[1] - zoom[2]) * (1 << zoom[0]); /* + zoom[2]; */ /* printf("iiscrm cur %d,%d\n",cur[0],cur[1]); printf("iiscrm pos %d,%d\n",pos[0],pos[1]); printf("iiscrm wndw %d,%d\n",wndw[0],wndw[1]); printf("iiscrm zoom %d,%d\n",zoom[0],zoom[1],zoom[2]); */ iiscr(window, mode, cur); break; } } } /*Set the cursor for the window*/ iisetcr (window) int window; { struct iiscdf *cursor; short status, hdr[8]; short cur[64][64]; int i, j, min, max; cursor = &iiswda[window].cursor; status = 0; if (cursor->on) status |= 01; if (cursor->x) status |= 02; if (cursor->y) status |= 04; status |= (cursor->blink << 3) & 030; if ((cursor->size < 1) || (cursor->size > 64)) cursor->size = 64; min = 32 - cursor->size / 2; max = min + cursor->size - 1; for (i = 0; i < 64; i++) for (j = 0; j < 64; j++) cur[i][j] = 0; if (strcmp (cursor->shape, "box") == 0) { for (i = min; i <= max; i++) cur[min][i] = 1; for (i = min; i <= max; i++) cur[i][min] = 1; for (i = min; i <= max; i++) cur[max][i] = 1; for (i = min; i <= max; i++) cur[i][max] = 1; } else { for (i = min; i <= max; i++) cur[32][i] = 1; for (i = min; i <= max; i++) cur[i][32] = 1; } switch (iisdev) { case 1: iishdr (hdr, IWRITE + VRETRACE, 1, COMMAND + CURSOR, ADVXONTC, 0, 0, 0); iiswrite (hdr, &status, 2); iishdr (hdr, IWRITE + VRETRACE, 4096, CURSOR, ADVXONTC, ADVYONXOV, 0,0); iiswrite (hdr, cur, 8192); break; case 2: iishdr(hdr, IWRITE + VRETRACE, 1, COMMAND + CURSOR, 0, 0, 0, 0); iiswrite(hdr, &status, 2); iishdr(hdr, IWRITE + VRETRACE, 4096, CURSOR, 0, 0, 0, 0); iiswrite(hdr, cur, 8192); break; case 3: if (lastwin != -1) { j = cursor->size; for (i = lastcur[1]-j/2; i <= lastcur[1]+j/2; i++) iisline (lastwin, lastcur[0]-j/2, i, j, data[i]); } lastwin = -1; break; } } /* Link/unlink trackball to x,yregs */ tlink(window, mode) int window; int mode; /*0 - link*/ /*1 - unlink*/ { short hdr[8], cur[2]; short *status; if (iisdev != 2) return; iiscr(window, 0, cur); status = iiswda[window].cursor.status; switch (mode) { case 0: iishdr(hdr,IWRITE + VRETRACE, 1, COMMAND + CURSOR, 0, 0, 0, 0); status[0] |= TLINK; iiswrite(hdr, status, 2); break; case 1: iishdr(hdr,IWRITE + VRETRACE, 1, COMMAND + CURSOR, 0, 0, 0, 0); status[0] |= ~TLINK; iiswrite(hdr, status, 2); break; } }