|
- /* 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 ÒÁÍ 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 */
|