From 5ba6aacaceb85b8e9ebd6c2f068d730811aaf5c6 Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Mon, 14 Jan 2019 12:56:44 -0800 Subject: [PATCH] display: Update Type 340 shift out character set. Character codes found in ITS. Glyph appearance was made up. --- display/type340.c | 292 ++++++++++++++++++++++++---------------------- 1 file changed, 155 insertions(+), 137 deletions(-) diff --git a/display/type340.c b/display/type340.c index e508bff3..8e6bbbfe 100644 --- a/display/type340.c +++ b/display/type340.c @@ -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<xpos+x*s, u->ypos+y*s, n); }