From 3313110312eadf08d52ced2633572530097f084f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=A8Rene=20Richarz?= <¨rene.richarz@bluewin.ch¨> Date: Thu, 28 Mar 2019 13:03:03 +0100 Subject: [PATCH] can now properly ignore SOME Tektronix 4014 codes, but not all of them --- main.c | 13 ++++++--- tek4010 | Bin 24392 -> 24412 bytes tek4010.c | 79 +++++++++++++++++++++++++++++++++++++++--------------- tek4010.h | 2 +- 4 files changed, 68 insertions(+), 26 deletions(-) diff --git a/main.c b/main.c index d0b6764..3eb3b52 100644 --- a/main.c +++ b/main.c @@ -111,8 +111,6 @@ static void on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer user_da // printf("key pressed, state =%04X, keyval=%04X\r\n", event->state, event->keyval); if ((event->keyval == 0xFF50) || // "home" key - (event->keyval == 0xFF51) || // "left arrow" key - (event->keyval == 0xFF52) || // "up arrow" key (event->keyval == 0xFF55) || // "page up" key (event->keyval == 0xFF56)) // "page down" key { @@ -123,8 +121,15 @@ static void on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer user_da // control keys else if ((event->keyval >= 0xFF00) && (event->keyval <= 0xFF1F)) ch = event->keyval & 0x1F; - else if (event->state & GDK_CONTROL_MASK) - ch = event->keyval & 0x1F; + else if (event->state & GDK_CONTROL_MASK) { + if ((event->keyval == 0xFF51) || // "left arrow" key + (event->keyval == 0xFF52)) { // "up arrow" key + globalClearPersistent = 1; + return; + } + else + ch = event->keyval & 0x1F; + } // normal keys else if ((event->keyval >= 0x0020) && (event->keyval <= 0x007F)) diff --git a/tek4010 b/tek4010 index df0959940c56e6bae064a1bad98b81c5a24e44a1..10fd9e845a54e8f0bc045b6d85a788512a42547d 100755 GIT binary patch delta 6803 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 delta 6442 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 Q$Ah@FCoA!zI;3^~2N)&@nE(I) diff --git a/tek4010.c b/tek4010.c index d7e48ec..6e73c0b 100644 --- a/tek4010.c +++ b/tek4010.c @@ -9,6 +9,8 @@ #define MEM 128 +#define DEBUG 0 // print debug info + #define TODO 6 // for speed reasons, draw multiple objects until screen updates #include @@ -34,7 +36,7 @@ float memv[MEM]; */ int count = 0; -static int x0,y0,x2,y2,xh,xl,yh,yl; +static int x0,y0,x2,y2,xh,xl,yh,yl,xy2014; // mode handles the current state of the emulator: // @@ -50,8 +52,9 @@ static int x0,y0,x2,y2,xh,xl,yh,yl; // mode 8 expecting fourth byte of persistent vector end point address // // mode 30 expecting escape sequence, escape code received -// mode 31 ; received in ANSI escape sequence, escape sequence continues if next char is digit +// mode 31 received in ANSI escape sequence, escape sequence continues if next char is digit // +// mode 40 incremental plot (4104); is ignored until exit from incremental plot received static int mode; @@ -275,9 +278,16 @@ void tek4010_draw(cairo_t *cr, cairo_t *cr2, int width, int height, int first) } if (ch == -1) todo--; // no char available, need to allow for updates - if ((mode>=1) && (mode <=9) && - ((ch==31) || (ch==13))) { + if (DEBUG && (ch != -1)) { + printf("mode=%d, ch code %02X",mode,ch); + if ((ch>0x20)&&(ch<=0x7E)) printf(" (%c)",ch); + printf("\n"); + } + + if ((mode>=1) && (mode <=9)) + if ((ch==31) || (ch==13) || (ch==27) || (ch==12)) { mode = 0; // exit from graphics mode + if (DEBUG) printf("Leaving graphics mode\n"); showCursor = 0; ch = -1; } @@ -286,20 +296,49 @@ void tek4010_draw(cairo_t *cr, cairo_t *cr2, int width, int height, int first) if ((ch>='0') && (ch<='9')) mode = 30; } + int tag = ch >> 5; + + // this overwrites the extra data byte of the 4014 for the + // first dark mode coordinates and stores it for further use + if ((mode == 3) && (tag == 3)) { + mode = 2; + xy2014 = yl; + if (DEBUG) printf("4014 coordinates, overwrite last value\n"); + } + if ((mode>=1)&&(mode<=8)) { if ((mode == 5) && (ch == 29)) { mode = 1; return; } - int tag = ch >> 5; + if (ch == 30) { + if (DEBUG) printf("Leaving graphics mode\n"); + mode = 0; return; + } if (tag == 0) { return; } - // if (mode & 1) - // printf("H%d-%d,",tag, 32 * (ch & 31)); - // else - // printf("L%d-%d,",tag, ch & 31); + + if (DEBUG) { + if (mode & 1) + printf("mode=%d,tag=%d-H-val=%d\n", + mode,tag, 32 * (ch & 31)); + else + printf("mode=%d,tag=%d-L-val=%d\n", + mode,tag, ch & 31); + } + if (tag > 0) { // bytes identified by tag, some can be skipped - if ((mode == 5) && (tag != 1)) mode = 6; + if ((mode == 5) && (tag != 1)) mode = 6; + + // this overwrites the extra data byte of the 4014 for the + // persistent mode ccordinates and stores it for further use + if ((mode == 7) && (tag == 3)) { + mode = 6; + xy2014 = yl; + if (DEBUG) + printf("4014 coordinates, overwrite last value\n"); + } + if ((mode == 6) && (tag != 3)) mode = 7; if ((mode == 7) && (tag != 1)) mode = 8; } @@ -310,7 +349,7 @@ void tek4010_draw(cairo_t *cr, cairo_t *cr2, int width, int height, int first) case 2: yl = (ch & 31); y0 = yh + yl; mode++; break; case 3: xh = 32 * (ch & 31); mode++; break; case 4: xl = (ch & 31); x0= xh + xl; mode++; - // printf("\nMoving to (%d,%d)\n",x0,y0); + if (DEBUG) printf("***** Moving to (%d,%d)\n",x0,y0); break; case 5: yh = 32 * (ch & 31); mode++; break; case 6: yl = (ch & 31); mode++; break; @@ -319,7 +358,7 @@ void tek4010_draw(cairo_t *cr, cairo_t *cr2, int width, int height, int first) x2 = xh + xl; y2 = yh + yl; - // printf("\nDrawing vector to (%d,%d)\n",x2,y2); + if (DEBUG) printf("tag=%d,***** Drawing vector to (%d,%d)\n",tag,x2,y2); cairo_move_to(cr, x0, WINDOW_HEIGHT - y0); cairo_line_to(cr, x2, WINDOW_HEIGHT - y2); cairo_stroke (cr); @@ -341,9 +380,11 @@ void tek4010_draw(cairo_t *cr, cairo_t *cr2, int width, int height, int first) mode = 5; break; case 30: // handle escape sequencies - // printf("Escape mode 30, ch=%02x\n",ch); + if (DEBUG) printf("Escape mode, ch=%02X\n",ch); switch (ch) { - case 12: cairo_set_source_rgb(cr, 0, 0.0, 0); // clear screen + case 12: + if (DEBUG) printf("Form feed, clear screen\n"); + cairo_set_source_rgb(cr, 0, 0.0, 0); // clear screen cairo_paint(cr); cairo_set_source_rgb(cr, 0, 0.8, 0); x0 = 0; @@ -367,17 +408,13 @@ void tek4010_draw(cairo_t *cr, cairo_t *cr2, int width, int height, int first) case ']': break; case 'm': mode = 0; break; // end of ignoring ANSI escape sequencies - default: // printf("Escape code %d\n",ch); + default: + if (DEBUG) printf("Ignore\n"); mode = 0; break; } break; - default: // if (ch != -1) { - // printf("ch code %2x",ch); - // if ((ch>0x20)&&(ch<=0x7E)) printf("(%c)",ch); - // printf("\n"); - // } - switch (ch) { + default: switch (ch) { case 0: break; case EOF: break; case 8: // backspace diff --git a/tek4010.h b/tek4010.h index e298a8d..97ecfc1 100644 --- a/tek4010.h +++ b/tek4010.h @@ -1,6 +1,6 @@ #define WINDOW_WIDTH 1024 // proposed width of main window -#define WINDOW_HEIGHT 768 // proposed height of main window +#define WINDOW_HEIGHT 780 // proposed height of main window #define WINDOW_NAME "Tektronix 4010" // name of main window #define ICON_NAME "" // path to icon for window