/* vview.c - drawing for the c64 vim clone: scroll, rows, status row. */ extern char *bfr; extern unsigned blen; extern unsigned lptr[]; extern int nlines, cy, cx, top, leftcol, mode, dirty; extern char *note; extern char fname[]; extern char ybuf[]; extern int ylen, yok; /* decimal of v into t at p, returns the position after it */ dnum(t, p, v) char *t; int p, v; { char d[6]; int n; n = 0; if (v == 0) { t[p++] = 48; return p; } while (v > 0 && n < 5) { d[n++] = 48 + (v % 10); v = v / 10; } while (n > 0) t[p++] = d[--n]; return p; } /* bring the cursor back into view */ scroll() { if (cy < top) top = cy; if (cy > top + 23) top = cy - 23; if (top < 0) top = 0; if (cx < leftcol) leftcol = cx; if (cx > leftcol + 39) leftcol = cx - 39; if (leftcol < 0) leftcol = 0; return 0; } /* draw screen row sr from buffer line top+sr */ drow(sr) int sr; { int ln, n, cc; unsigned i, e, d; d = 1024 + sr * 40; /* screen RAM address of the row */ ln = top + sr; if (ln >= nlines) { mlrow(0, 0, d, 255, 0); return 0; } i = lptr[ln] + leftcol; e = linend(ln); n = 0; if (e > i) n = e - i; if (n > 40) n = 40; cc = 255; /* cursor column, 255 = not here */ if (ln == cy) { cc = cx - leftcol; if (cc < 0) cc = 255; if (cc > 39) cc = 255; } mlrow((unsigned) bfr + i, n, d, cc, 0); /* machine code does the rest */ return 0; } /* the status row: message, mode or name on the left; modified flag; line/total */ dstat() { char t[40]; char *s; int i, n, p; if (note != 0) s = note; else if (mode) s = "-- insert --"; else if (fname[0] == 0) s = "[no name]"; else s = fname; n = 0; for (i = 0; s[i] && i < 26; i++) t[n++] = s[i]; while (n < 28) t[n++] = 32; if (dirty) t[n++] = 43; /* + */ else t[n++] = 32; while (n < 31) t[n++] = 32; p = dnum(t, n, cy + 1); t[p++] = 47; /* / */ p = dnum(t, p, nlines); mlrow((unsigned) t, p, 1984, 255, 128); /* row 24 = $0400 + 960, reverse */ return 0; } dall() { int r; for (r = 0; r < 24; r++) drow(r); dstat(); return 0; } /* end of vview.c */