display: Update Type 340 shift out character set.

Character codes found in ITS.  Glyph appearance was made up.
This commit is contained in:
Lars Brinkhoff 2019-01-14 12:56:44 -08:00 committed by Mark Pizzolato
parent ae0cad26e4
commit 5ba6aacace

View file

@ -101,6 +101,14 @@ enum mode { PARAM=0, POINT, SLAVE, CHAR, VECTOR, VCONT, INCR, SUBR };
enum jump_type { DJP=2, DJS=3, DDS=1 }; /* type 347 */
/* Flags for special characters. */
#define CH_LF 0001 /* Line feed. */
#define CH_CR 0002 /* Carriage return. */
#define CH_UC 0004 /* Shift in. */
#define CH_LC 0010 /* Shift out. */
#define CH_ESC 0020 /* Escape to parameter mode. */
#define CH_NSPC 0040 /* Non spacing. */
/* put all the state in a struct "just in case" */
static struct type340 {
/* ty340word DAC; /* Display Address Counter */
@ -564,141 +572,141 @@ ipoint(int i, int n, unsigned char byte)
* highest bit is top, lowest bit is unused (what was I drinking? -PLB)
* first char is leftmost
*/
static const unsigned char chars[128][5] = {
{ 0070, 0124, 0154, 0124, 0070 }, /* 00 blob */
{ 0176, 0220, 0220, 0220, 0176 }, /* 01 A */
{ 0376, 0222, 0222, 0222, 0154 }, /* 02 B */
{ 0174, 0202, 0202, 0202, 0104 }, /* 03 C */
{ 0376, 0202, 0202, 0202, 0174 }, /* 04 D */
{ 0376, 0222, 0222, 0222, 0222 }, /* 05 E */
{ 0376, 0220, 0220, 0220, 0220 }, /* 06 F */
{ 0174, 0202, 0222, 0222, 0134 }, /* 07 G */
{ 0376, 0020, 0020, 0020, 0376 }, /* 10 H */
{ 0000, 0202, 0376, 0202, 0000 }, /* 11 I */
{ 0004, 0002, 0002, 0002, 0374 }, /* 12 J */
{ 0376, 0020, 0050, 0104, 0202 }, /* 13 K */
{ 0376, 0002, 0002, 0002, 0002 }, /* 14 L */
{ 0376, 0100, 0040, 0100, 0376 }, /* 15 M */
{ 0376, 0100, 0040, 0020, 0376 }, /* 16 N */
{ 0174, 0202, 0202, 0202, 0174 }, /* 17 O */
{ 0376, 0220, 0220, 0220, 0140 }, /* 20 P */
{ 0174, 0202, 0212, 0206, 0176 }, /* 21 Q */
{ 0376, 0220, 0230, 0224, 0142 }, /* 22 R */
{ 0144, 0222, 0222, 0222, 0114 }, /* 23 S */
{ 0200, 0200, 0376, 0200, 0200 }, /* 24 T */
{ 0374, 0002, 0002, 0002, 0374 }, /* 25 U */
{ 0370, 0004, 0002, 0004, 0370 }, /* 26 V */
{ 0376, 0004, 0010, 0004, 0376 }, /* 27 W */
{ 0202, 0104, 0070, 0104, 0202 }, /* 30 X */
{ 0200, 0100, 0076, 0100, 0200 }, /* 31 Y */
{ 0226, 0232, 0222, 0262, 0322 }, /* 32 Z */
{ 0000, 0000, 0000, 0000, 0000 }, /* 33 LF */
{ 0000, 0000, 0000, 0000, 0000 }, /* 34 CR */
{ 0000, 0000, 0000, 0000, 0000 }, /* 35 HORIZ */
{ 0000, 0000, 0000, 0000, 0000 }, /* 36 VERT */
{ 0000, 0000, 0000, 0000, 0000 }, /* 37 ESC */
{ 0000, 0000, 0000, 0000, 0000 }, /* 40 space */
{ 0000, 0000, 0372, 0000, 0000 }, /* 41 ! */
{ 0000, 0340, 0000, 0340, 0000 }, /* 42 " */
{ 0050, 0376, 0050, 0376, 0050 }, /* 43 # */
{ 0144, 0222, 0376, 0222, 0114 }, /* 44 $ */
{ 0306, 0310, 0220, 0246, 0306 }, /* 45 % */
{ 0154, 0222, 0156, 0004, 0012 }, /* 46 & */
{ 0000, 0000, 0300, 0340, 0000 }, /* 47 ' */
{ 0070, 0104, 0202, 0000, 0000 }, /* 50 ( */
{ 0000, 0000, 0202, 0104, 0070 }, /* 51 ) */
{ 0124, 0070, 0174, 0070, 0124 }, /* 52 * */
{ 0020, 0020, 0174, 0020, 0020 }, /* 53 + */
{ 0000, 0014, 0016, 0000, 0000 }, /* 54 , */
{ 0020, 0020, 0020, 0020, 0020 }, /* 55 - */
{ 0000, 0006, 0006, 0000, 0000 }, /* 56 . */
{ 0004, 0010, 0020, 0040, 0100 }, /* 57 / */
{ 0174, 0212, 0222, 0242, 0174 }, /* 60 0 */
{ 0000, 0102, 0376, 0002, 0000 }, /* 61 1 */
{ 0116, 0222, 0222, 0222, 0142 }, /* 62 2 */
{ 0104, 0202, 0222, 0222, 0154 }, /* 63 3 */
{ 0020, 0060, 0120, 0376, 0020 }, /* 64 4 */
{ 0344, 0222, 0222, 0222, 0214 }, /* 65 5 */
{ 0174, 0222, 0222, 0222, 0114 }, /* 66 6 */
{ 0306, 0210, 0220, 0240, 0300 }, /* 67 7 */
{ 0154, 0222, 0222, 0222, 0154 }, /* 70 8 */
{ 0144, 0222, 0222, 0222, 0174 }, /* 71 9 */
{ 0000, 0066, 0066, 0000, 0000 }, /* 72 : */
{ 0000, 0154, 0156, 0000, 0000 }, /* 73 ; */
{ 0020, 0050, 0104, 0202, 0000 }, /* 74 < */
{ 0050, 0050, 0050, 0050, 0050 }, /* 75 = */
{ 0000, 0202, 0104, 0050, 0020 }, /* 76 > */
{ 0100, 0200, 0236, 0220, 0140 }, /* 77 ? */
static const unsigned char chars[128][6] = {
{ 0070, 0124, 0154, 0124, 0070, 0 }, /* 00 blob */
{ 0176, 0220, 0220, 0220, 0176, 0 }, /* 01 A */
{ 0376, 0222, 0222, 0222, 0154, 0 }, /* 02 B */
{ 0174, 0202, 0202, 0202, 0104, 0 }, /* 03 C */
{ 0376, 0202, 0202, 0202, 0174, 0 }, /* 04 D */
{ 0376, 0222, 0222, 0222, 0222, 0 }, /* 05 E */
{ 0376, 0220, 0220, 0220, 0220, 0 }, /* 06 F */
{ 0174, 0202, 0222, 0222, 0134, 0 }, /* 07 G */
{ 0376, 0020, 0020, 0020, 0376, 0 }, /* 10 H */
{ 0000, 0202, 0376, 0202, 0000, 0 }, /* 11 I */
{ 0004, 0002, 0002, 0002, 0374, 0 }, /* 12 J */
{ 0376, 0020, 0050, 0104, 0202, 0 }, /* 13 K */
{ 0376, 0002, 0002, 0002, 0002, 0 }, /* 14 L */
{ 0376, 0100, 0040, 0100, 0376, 0 }, /* 15 M */
{ 0376, 0100, 0040, 0020, 0376, 0 }, /* 16 N */
{ 0174, 0202, 0202, 0202, 0174, 0 }, /* 17 O */
{ 0376, 0220, 0220, 0220, 0140, 0 }, /* 20 P */
{ 0174, 0202, 0212, 0206, 0176, 0 }, /* 21 Q */
{ 0376, 0220, 0230, 0224, 0142, 0 }, /* 22 R */
{ 0144, 0222, 0222, 0222, 0114, 0 }, /* 23 S */
{ 0200, 0200, 0376, 0200, 0200, 0 }, /* 24 T */
{ 0374, 0002, 0002, 0002, 0374, 0 }, /* 25 U */
{ 0370, 0004, 0002, 0004, 0370, 0 }, /* 26 V */
{ 0376, 0004, 0010, 0004, 0376, 0 }, /* 27 W */
{ 0202, 0104, 0070, 0104, 0202, 0 }, /* 30 X */
{ 0200, 0100, 0076, 0100, 0200, 0 }, /* 31 Y */
{ 0226, 0232, 0222, 0262, 0322, 0 }, /* 32 Z */
{ 0000, 0000, 0000, 0000, 0000, CH_LF }, /* 33 LF */
{ 0000, 0000, 0000, 0000, 0000, CH_CR }, /* 34 CR */
{ 0000, 0000, 0000, 0000, 0000, CH_UC }, /* 35 HORIZ */
{ 0000, 0000, 0000, 0000, 0000, CH_LC }, /* 36 VERT */
{ 0000, 0000, 0000, 0000, 0000, CH_ESC }, /* 37 ESC */
{ 0000, 0000, 0000, 0000, 0000, 0 }, /* 40 space */
{ 0000, 0000, 0372, 0000, 0000, 0 }, /* 41 ! */
{ 0000, 0340, 0000, 0340, 0000, 0 }, /* 42 " */
{ 0050, 0376, 0050, 0376, 0050, 0 }, /* 43 # */
{ 0144, 0222, 0376, 0222, 0114, 0 }, /* 44 $ */
{ 0306, 0310, 0220, 0246, 0306, 0 }, /* 45 % */
{ 0154, 0222, 0156, 0004, 0012, 0 }, /* 46 & */
{ 0000, 0000, 0300, 0340, 0000, 0 }, /* 47 ' */
{ 0070, 0104, 0202, 0000, 0000, 0 }, /* 50 ( */
{ 0000, 0000, 0202, 0104, 0070, 0 }, /* 51 ) */
{ 0124, 0070, 0174, 0070, 0124, 0 }, /* 52 * */
{ 0020, 0020, 0174, 0020, 0020, 0 }, /* 53 + */
{ 0000, 0014, 0016, 0000, 0000, 0 }, /* 54 , */
{ 0020, 0020, 0020, 0020, 0020, 0 }, /* 55 - */
{ 0000, 0006, 0006, 0000, 0000, 0 }, /* 56 . */
{ 0004, 0010, 0020, 0040, 0100, 0 }, /* 57 / */
{ 0174, 0212, 0222, 0242, 0174, 0 }, /* 60 0 */
{ 0000, 0102, 0376, 0002, 0000, 0 }, /* 61 1 */
{ 0116, 0222, 0222, 0222, 0142, 0 }, /* 62 2 */
{ 0104, 0202, 0222, 0222, 0154, 0 }, /* 63 3 */
{ 0020, 0060, 0120, 0376, 0020, 0 }, /* 64 4 */
{ 0344, 0222, 0222, 0222, 0214, 0 }, /* 65 5 */
{ 0174, 0222, 0222, 0222, 0114, 0 }, /* 66 6 */
{ 0306, 0210, 0220, 0240, 0300, 0 }, /* 67 7 */
{ 0154, 0222, 0222, 0222, 0154, 0 }, /* 70 8 */
{ 0144, 0222, 0222, 0222, 0174, 0 }, /* 71 9 */
{ 0000, 0066, 0066, 0000, 0000, 0 }, /* 72 : */
{ 0000, 0154, 0156, 0000, 0000, 0 }, /* 73 ; */
{ 0020, 0050, 0104, 0202, 0000, 0 }, /* 74 < */
{ 0050, 0050, 0050, 0050, 0050, 0 }, /* 75 = */
{ 0000, 0202, 0104, 0050, 0020, 0 }, /* 76 > */
{ 0100, 0200, 0236, 0220, 0140, 0 }, /* 77 ? */
/*
* NOT YET COMPLETE!!!
* original letterforms not available, using
* https://fontstruct.com/fontstructions/show/357807/5x7_monospaced_pixel_font
* PLB: I wonder if VT52 was 5x7????
*/
{ 0070, 0124, 0154, 0124, 0070 }, /* 00 blob */
{ 0034, 0042, 0042, 0024, 0076 }, /* 01 a */
{ 0376, 0024, 0042, 0042, 0034 }, /* 02 b */
{ 0034, 0042, 0042, 0042, 0024 }, /* 03 c */
{ 0034, 0042, 0042, 0024, 0376 }, /* 04 d */
{ 0034, 0052, 0052, 0052, 0032 }, /* 05 e */
{ 0010, 0176, 0210, 0200, 0100 }, /* 06 f */
{ 0020, 0052, 0052, 0052, 0074 }, /* 07 g */
{ 0376, 0020, 0040, 0040, 0036 }, /* 10 h */
{ 0000, 0022, 0136, 0002, 0000 }, /* 11 i */
{ 0000, 0004, 0042, 0274, 0000 }, /* 12 j */
{ 0376, 0010, 0024, 0042, 0000 }, /* 13 k */
{ 0374, 0002, 0002, 0000, 0000 }, /* 14 l */
{ 0076, 0040, 0036, 0040, 0036 }, /* 15 m */
{ 0076, 0020, 0040, 0040, 0036 }, /* 16 n */
{ 0034, 0042, 0042, 0042, 0034 }, /* 17 o */
{ 0076, 0050, 0050, 0050, 0020 }, /* 20 p */
{ 0020, 0050, 0050, 0050, 0076 }, /* 21 q */
{ 0076, 0020, 0040, 0040, 0000 }, /* 22 r */
{ 0022, 0052, 0052, 0052, 0044 }, /* 23 s */
{ 0020, 0174, 0022, 0004, 0000 }, /* 24 t */
{ 0074, 0002, 0002, 0004, 0076 }, /* 25 u */
{ 0060, 0014, 0002, 0014, 0060 }, /* 26 v */
{ 0070, 0006, 0030, 0006, 0070 }, /* 27 w */
{ 0042, 0024, 0010, 0024, 0042 }, /* 30 x */
{ 0060, 0012, 0012, 0012, 0074 }, /* 31 y */
{ 0042, 0046, 0052, 0062, 0042 }, /* 32 z */
{ 0000, 0000, 0000, 0000, 0000 }, /* 33 LF */
{ 0000, 0000, 0000, 0000, 0000 }, /* 34 CR */
{ 0000, 0000, 0000, 0000, 0000 }, /* 35 HORIZ */
{ 0000, 0000, 0000, 0000, 0000 }, /* 36 VERT */
{ 0000, 0000, 0000, 0000, 0000 }, /* 37 ESC */
{ 0000, 0000, 0000, 0000, 0000 }, /* 40 space */
{ 0000, 0000, 0372, 0000, 0000 }, /* 41 ! */
{ 0000, 0340, 0000, 0340, 0000 }, /* 42 " */
{ 0050, 0376, 0050, 0376, 0050 }, /* 43 # */
{ 0144, 0222, 0376, 0222, 0114 }, /* 44 $ */
{ 0306, 0310, 0220, 0246, 0306 }, /* 45 % */
{ 0154, 0222, 0156, 0004, 0012 }, /* 46 & */
{ 0000, 0000, 0300, 0340, 0000 }, /* 47 ' */
{ 0070, 0104, 0202, 0000, 0000 }, /* 50 ( */
{ 0000, 0000, 0202, 0104, 0070 }, /* 51 ) */
{ 0124, 0070, 0174, 0070, 0124 }, /* 52 * */
{ 0020, 0020, 0174, 0020, 0020 }, /* 53 + */
{ 0000, 0014, 0016, 0000, 0000 }, /* 54 , */
{ 0020, 0020, 0020, 0020, 0020 }, /* 55 - */
{ 0000, 0006, 0006, 0000, 0000 }, /* 56 . */
{ 0004, 0010, 0020, 0040, 0100 }, /* 57 / */
{ 0174, 0212, 0222, 0242, 0174 }, /* 60 0 */
{ 0000, 0102, 0376, 0002, 0000 }, /* 61 1 */
{ 0116, 0222, 0222, 0222, 0142 }, /* 62 2 */
{ 0104, 0202, 0222, 0222, 0154 }, /* 63 3 */
{ 0020, 0060, 0120, 0376, 0020 }, /* 64 4 */
{ 0344, 0222, 0222, 0222, 0214 }, /* 65 5 */
{ 0174, 0222, 0222, 0222, 0114 }, /* 66 6 */
{ 0306, 0210, 0220, 0240, 0300 }, /* 67 7 */
{ 0154, 0222, 0222, 0222, 0154 }, /* 70 8 */
{ 0144, 0222, 0222, 0222, 0174 }, /* 71 9 */
{ 0000, 0066, 0066, 0000, 0000 }, /* 72 : */
{ 0000, 0154, 0156, 0000, 0000 }, /* 73 ; */
{ 0020, 0050, 0104, 0202, 0000 }, /* 74 < */
{ 0050, 0050, 0050, 0050, 0050 }, /* 75 = */
{ 0000, 0202, 0104, 0050, 0020 }, /* 76 > */
{ 0100, 0200, 0236, 0220, 0140 } /* 77 ? */
{ 0070, 0124, 0154, 0124, 0070, 0 }, /* 00 blob */
{ 0034, 0042, 0042, 0024, 0076, 0 }, /* 01 a */
{ 0376, 0024, 0042, 0042, 0034, 0 }, /* 02 b */
{ 0034, 0042, 0042, 0042, 0024, 0 }, /* 03 c */
{ 0034, 0042, 0042, 0024, 0376, 0 }, /* 04 d */
{ 0034, 0052, 0052, 0052, 0032, 0 }, /* 05 e */
{ 0010, 0176, 0210, 0200, 0100, 0 }, /* 06 f */
{ 0020, 0052, 0052, 0052, 0074, 0 }, /* 07 g */
{ 0376, 0020, 0040, 0040, 0036, 0 }, /* 10 h */
{ 0000, 0022, 0136, 0002, 0000, 0 }, /* 11 i */
{ 0000, 0004, 0042, 0274, 0000, 0 }, /* 12 j */
{ 0376, 0010, 0024, 0042, 0000, 0 }, /* 13 k */
{ 0374, 0002, 0002, 0000, 0000, 0 }, /* 14 l */
{ 0076, 0040, 0036, 0040, 0036, 0 }, /* 15 m */
{ 0076, 0020, 0040, 0040, 0036, 0 }, /* 16 n */
{ 0034, 0042, 0042, 0042, 0034, 0 }, /* 17 o */
{ 0076, 0050, 0050, 0050, 0020, 0 }, /* 20 p */
{ 0020, 0050, 0050, 0050, 0076, 0 }, /* 21 q */
{ 0076, 0020, 0040, 0040, 0000, 0 }, /* 22 r */
{ 0022, 0052, 0052, 0052, 0044, 0 }, /* 23 s */
{ 0020, 0174, 0022, 0004, 0000, 0 }, /* 24 t */
{ 0074, 0002, 0002, 0004, 0076, 0 }, /* 25 u */
{ 0060, 0014, 0002, 0014, 0060, 0 }, /* 26 v */
{ 0070, 0006, 0030, 0006, 0070, 0 }, /* 27 w */
{ 0042, 0024, 0010, 0024, 0042, 0 }, /* 30 x */
{ 0060, 0012, 0012, 0012, 0074, 0 }, /* 31 y */
{ 0042, 0046, 0052, 0062, 0042, 0 }, /* 32 z */
{ 0000, 0000, 0000, 0000, 0000, CH_LF }, /* 33 LF */
{ 0000, 0000, 0000, 0000, 0000, CH_CR }, /* 34 CR */
{ 0000, 0000, 0000, 0000, 0000, CH_UC }, /* 35 HORIZ */
{ 0000, 0000, 0000, 0000, 0000, CH_LC }, /* 36 VERT */
{ 0000, 0000, 0000, 0000, 0000, CH_ESC }, /* 37 ESC */
{ 0000, 0000, 0000, 0000, 0000, 0 }, /* 40 space */
{ 0376, 0376, 0376, 0376, 0376, 0 }, /* 41 ??? */
{ 0376, 0376, 0376, 0376, 0376, 0 }, /* 42 ??? */
{ 0100, 0200, 0100, 0040, 0100, 0 }, /* 43 ~ */
{ 0376, 0376, 0376, 0376, 0376, 0 }, /* 44 ??? */
{ 0376, 0376, 0376, 0376, 0376, 0 }, /* 45 ??? */
{ 0376, 0376, 0376, 0376, 0376, 0 }, /* 46 ??? */
{ 0020, 0020, 0124, 0070, 0020, 0 }, /* 47 right arrow */
{ 0010, 0004, 0376, 0004, 0010, 0 }, /* 50 down arrow */
{ 0376, 0376, 0376, 0376, 0376, 0 }, /* 51 ??? */
{ 0100, 0040, 0020, 0010, 0004, 0 }, /* 52 \ */
{ 0376, 0202, 0202, 0000, 0000, 0 }, /* 53 [ */
{ 0000, 0000, 0202, 0202, 0376, 0 }, /* 54 ] */
{ 0020, 0154, 0202, 0000, 0000, 0 }, /* 55 { */
{ 0000, 0000, 0202, 0154, 0020, 0 }, /* 56 } */
{ 0376, 0376, 0376, 0376, 0376, 0 }, /* 57 ??? */
{ 0020, 0070, 0124, 0020, 0020, 0 }, /* 60 left arrow */
{ 0376, 0376, 0376, 0376, 0376, 0 }, /* 61 ??? */
{ 0000, 0000, 0376, 0000, 0000, 0 }, /* 62 | */
{ 0376, 0376, 0376, 0376, 0376, 0 }, /* 63 ??? */
{ 0376, 0376, 0376, 0376, 0376, 0 }, /* 64 ??? */
{ 0376, 0376, 0376, 0376, 0376, 0 }, /* 65 ??? */
{ 0000, 0200, 0100, 0040, 0000, CH_NSPC }, /* 66 ` */
{ 0040, 0100, 0376, 0100, 0040, CH_NSPC }, /* 67 up arrow */
{ 0376, 0376, 0376, 0376, 0376, 0 }, /* 70 ??? */
{ 0376, 0376, 0376, 0376, 0376, 0 }, /* 71 ??? */
{ 0376, 0376, 0376, 0376, 0376, 0 }, /* 72 ??? */
{ 0376, 0376, 0376, 0376, 0376, 0 }, /* 73 ??? */
{ 0376, 0376, 0376, 0376, 0376, 0 }, /* 74 ??? */
{ 0376, 0376, 0376, 0376, 0376, 0 }, /* 75 ??? */
{ 0376, 0376, 0376, 0376, 0376, 0 }, /* 76 ??? */
{ 0376, 0376, 0376, 0376, 0376, 0 } /* 77 ??? */
};
/*
@ -711,31 +719,41 @@ character(int n, unsigned char c)
struct type340 *u = UNIT(0);
int x, y;
unsigned char s = u->scale;
unsigned char flags;
switch (c) {
case CHRLF: /* LF */
u->ypos -= 12*s;
c |= u->shift;
flags = chars[c][5];
if (flags & CH_LF) { /* LF */
u->ypos -= u->12*s;
if (u->ypos < 0) {
u->status |= ST340_HEDGE;
u->ypos = 0;
}
return 0;
case CHRCR: /* CR */
}
if (flags & CH_CR) { /* CR */
u->xpos = 0;
return 0;
case CHRUC: /* "SHIFT IN (HORIZ)" */
}
if (flags & CH_UC) { /* "SHIFT IN (HORIZ)" */
u->shift = 0; /* upper case in SPCWAR 163 */
return 0;
case CHRLC: /* "SHIFT OUT (VERT)" */
}
if (flags & CH_LC) { /* "SHIFT OUT (VERT)" */
u->shift = 0100; /* lower case in SPCWAR 163 */
return 0;
case CHRESC: /* escape */
}
if (flags & CH_ESC) { /* escape */
return 1;
}
if ((flags & CH_NSPC) && u->xpos >= u->7*s) {
u->xpos -= u->7*s; /* non spacing character */
}
/* plot character from character set selected by "shift" */
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 */
if (chars[c|u->shift][x] & (2<<y)) {
if (chars[c][x] & (2<<y)) {
/* XXX check for raster violation? */
point(u->xpos+x*s, u->ypos+y*s, n);
}