display: Add Type 340 backspace, subscript, and superscript character codes.

This commit is contained in:
Lars Brinkhoff 2019-06-01 21:40:47 +02:00
parent fc4d9cae40
commit 0e3f9c944f

View file

@ -101,14 +101,17 @@ enum mode { PARAM=0, POINT, SLAVE, CHAR, VECTOR, VCONT, INCR, SUBR };
enum jump_type { DJP=2, DJS=3, DDS=1 }; /* type 347 */ enum jump_type { DJP=2, DJS=3, DDS=1 }; /* type 347 */
/* Flags for special characters. */ /* Codes for special characters. */
#define CH_LF 0001 /* Line feed. */ #define CH_LF 0001 /* Line feed. */
#define CH_CR 0002 /* Carriage return. */ #define CH_CR 0002 /* Carriage return. */
#define CH_UC 0004 /* Shift in. */ #define CH_UC 0003 /* Shift in. */
#define CH_LC 0010 /* Shift out. */ #define CH_LC 0004 /* Shift out. */
#define CH_ESC 0020 /* Escape to parameter mode. */ #define CH_ESC 0005 /* Escape to parameter mode. */
#define CH_NSPC 0040 /* Non spacing. */ #define CH_NSPC 0006 /* Non spacing. */
#define CH_D 0100 /* Descender. */ #define CH_D 0007 /* Descender. */
#define CH_BS 0010 /* Backspace. */
#define CH_SUB 0011 /* Subscript. */
#define CH_SUP 0012 /* Superscript. */
/* put all the state in a struct "just in case" */ /* put all the state in a struct "just in case" */
static struct type340 { static struct type340 {
@ -692,7 +695,7 @@ static const unsigned char chars[128][6] = {
{ 0040, 0100, 0376, 0100, 0040, 0 }, /* 46 up arrow */ { 0040, 0100, 0376, 0100, 0040, 0 }, /* 46 up arrow */
{ 0020, 0020, 0124, 0070, 0020, 0 }, /* 47 left arrow */ { 0020, 0020, 0124, 0070, 0020, 0 }, /* 47 left arrow */
{ 0010, 0004, 0376, 0004, 0010, 0 }, /* 50 down arrow */ { 0010, 0004, 0376, 0004, 0010, 0 }, /* 50 down arrow */
{ 0020, 0070, 0124, 0020, 0020, 0 }, /* 47 right arrow */ { 0020, 0070, 0124, 0020, 0020, 0 }, /* 51 right arrow */
{ 0100, 0040, 0020, 0010, 0004, 0 }, /* 52 \ */ { 0100, 0040, 0020, 0010, 0004, 0 }, /* 52 \ */
{ 0000, 0376, 0202, 0202, 0000, 0 }, /* 53 [ */ { 0000, 0376, 0202, 0202, 0000, 0 }, /* 53 [ */
{ 0000, 0202, 0202, 0376, 0000, 0 }, /* 54 ] */ { 0000, 0202, 0202, 0376, 0000, 0 }, /* 54 ] */
@ -709,12 +712,12 @@ static const unsigned char chars[128][6] = {
{ 0040, 0100, 0200, 0100, 0040, CH_NSPC }, /* 67 ^ */ { 0040, 0100, 0200, 0100, 0040, CH_NSPC }, /* 67 ^ */
{ 0376, 0376, 0376, 0376, 0376, 0 }, /* 70 ??? */ { 0376, 0376, 0376, 0376, 0376, 0 }, /* 70 ??? */
{ 0376, 0376, 0376, 0376, 0376, 0 }, /* 71 block? */ { 0376, 0376, 0376, 0376, 0376, 0 }, /* 71 block? */
{ 0376, 0376, 0376, 0376, 0376, 0 }, /* 72 ??? */ { 0000, 0000, 0000, 0000, 0000, CH_BS }, /* 72 backspace */
{ 0376, 0376, 0376, 0376, 0376, 0 }, /* 73 ??? */ { 0376, 0376, 0376, 0376, 0376, CH_SUB }, /* 73 subscript */
{ 0376, 0376, 0376, 0376, 0376, 0 }, /* 74 ??? */ { 0376, 0376, 0376, 0376, 0376, 0 }, /* 74 ??? */
{ 0376, 0376, 0376, 0376, 0376, 0 }, /* 75 ??? */ { 0376, 0376, 0376, 0376, 0376, 0 }, /* 75 ??? */
{ 0376, 0376, 0376, 0376, 0376, 0 }, /* 76 ??? */ { 0376, 0376, 0376, 0376, 0376, 0 }, /* 76 ??? */
{ 0376, 0376, 0376, 0376, 0376, 0 } /* 77 ??? */ { 0376, 0376, 0376, 0376, 0376, CH_SUP } /* 77 superscript */
}; };
void void
@ -740,7 +743,7 @@ character(int n, unsigned char c)
c |= u->shift; c |= u->shift;
flags = chars[c][5]; flags = chars[c][5];
if (flags & CH_LF) { /* LF */ if (flags == CH_LF) { /* LF */
u->ypos -= u->height*s; u->ypos -= u->height*s;
if (u->ypos < 0) { if (u->ypos < 0) {
u->status |= ST340_HEDGE; u->status |= ST340_HEDGE;
@ -748,27 +751,35 @@ character(int n, unsigned char c)
} }
return 0; return 0;
} }
if (flags & CH_CR) { /* CR */ if (flags == CH_CR) { /* CR */
u->xpos = 0; u->xpos = 0;
return 0; return 0;
} }
if (flags & CH_UC) { /* "SHIFT IN (HORIZ)" */ if (flags == CH_UC) { /* "SHIFT IN (HORIZ)" */
u->shift = 0; /* upper case in SPCWAR 163 */ u->shift = 0; /* upper case in SPCWAR 163 */
return 0; return 0;
} }
if (flags & CH_LC) { /* "SHIFT OUT (VERT)" */ if (flags == CH_LC) { /* "SHIFT OUT (VERT)" */
u->shift = 0100; /* lower case in SPCWAR 163 */ u->shift = 0100; /* lower case in SPCWAR 163 */
return 0; return 0;
} }
if (flags & CH_ESC) { /* escape */ if (flags == CH_ESC) { /* escape */
return 1; return 1;
} }
if ((flags & CH_NSPC) && u->xpos >= u->width*s) { if ((flags == CH_NSPC) && u->xpos >= u->width*s) {
u->xpos -= u->width*s; /* non spacing character */ u->xpos -= u->width*s; /* non spacing character */
} }
if (flags & CH_D) { /* descender */ if (flags == CH_D) { /* descender */
u->ypos -= 2*s; u->ypos -= 2*s;
} }
if (flags == CH_SUB) { /* subscript */
u->ypos -= u->width*s/2;
return 0;
}
if (flags == CH_SUP) { /* superscript */
u->ypos += u->width*s/2;
return 0;
}
/* plot character from character set selected by "shift" */ /* plot character from character set selected by "shift" */
for (x = 0; x < 5; x++) { /* column: 0 to 4, left to right */ for (x = 0; x < 5; x++) { /* column: 0 to 4, left to right */
for (y = 0; y < 7; y++) { /* row: 0 to 6, bottom to top */ for (y = 0; y < 7; y++) { /* row: 0 to 6, bottom to top */
@ -778,8 +789,12 @@ character(int n, unsigned char c)
} }
} }
} }
u->xpos += u->width*s; if (flags == CH_BS) { /* backspace */
if (flags & CH_D) { /* undo descender */ u->xpos -= u->width*s;
} else {
u->xpos += u->width*s;
}
if (flags == CH_D) { /* undo descender */
u->ypos += 2*s; u->ypos += 2*s;
} }
if (u->xpos > 1023) { if (u->xpos > 1023) {