- *crtat++ = (ca<<8)| c; row++ ;
- if (row >= COL) {
- /*bzero (crtat,(COL-row)*CHR) ;*/ crtat -= row ; row = 0;
- if (crtat >= CRT_TXTADDR+COL*(ROW-1)) { /* scroll */
- bcopy(CRT_TXTADDR+COL, CRT_TXTADDR,COL*(ROW-1)*CHR);
- bzero (CRT_TXTADDR+COL*(ROW-1),COL*CHR) ;
- crtat -= COL ;
- }
- crtat += COL ;
+ if (esc) {
+ if (ebrac) {
+ switch(c) {
+ case 'm': /* no support for standout */
+ if (!cx) so = 0;
+ else so = 1;
+ esc = 0; ebrac = 0; eparm = 0;
+ break;
+ case 'A': /* back one row */
+ crtat -= COL;
+ esc = 0; ebrac = 0; eparm = 0;
+ break;
+ case 'B': /* down one row */
+ crtat += COL;
+ esc = 0; ebrac = 0; eparm = 0;
+ break;
+ case 'C': /* right cursor */
+ crtat++; row++;
+ esc = 0; ebrac = 0; eparm = 0;
+ break;
+ case 'J': /* Clear to end of display */
+ bzero(crtat,(Crtat+COL*ROW-crtat)*CHR);
+ esc = 0; ebrac = 0; eparm = 0;
+ break;
+ case 'K': /* Clear to EOL */
+ bzero(crtat,(COL-row)*CHR);
+ esc = 0; ebrac = 0; eparm = 0;
+ break;
+ case 'H': /* Cursor move */
+ if ((!cx)||(!cy)) {
+ crtat = Crtat;
+ row = 0;
+ } else {
+ crtat = Crtat+(cx-1)*COL+cy-1;
+ row = cy-1;
+ }
+ esc = 0; ebrac = 0; eparm = 0;
+ break;
+ case ';': /* Switch params in cursor def */
+ eparm = 1;
+ splx(s);
+ return;
+ default: /* Only numbers valid here */
+ if ((c >= '0')&&(c <= '9')) {
+ if (eparm) {
+ cy *= 10;
+ cy += c - '0';
+ } else {
+ cx *= 10;
+ cx += c - '0';
+ }
+ } else {
+ esc = 0; ebrac = 0; eparm = 0;
+ }
+ splx(s);
+ return;
+ }
+ break;
+ } else if (c == 'c') { /* Clear screen & home */
+ bzero(Crtat,COL*ROW*CHR);
+ crtat = Crtat; row = 0;
+ esc = 0; ebrac = 0; eparm = 0;
+ }else if (c == '[') { /* Start ESC [ sequence */
+ ebrac = 1; cx = 0; cy = 0; eparm = 0;
+ }else{ /* Invalid, clear state */
+ esc = 0; ebrac = 0; eparm = 0;
+ }
+ } else {
+ if (c == 7) {
+ sysbeep();
+ }
+ /* Print only printables */
+ else if (c >= ' ') {
+ if (so) {
+ *crtat++ = 0x7000| c; row++ ;
+ } else {
+ *crtat++ = (ca<<8)| c; row++ ;
+ }
+ if (row >= COL) row = 0;
+ break ;
+ }