diff --git a/README.md b/README.md index eb3c528..979430d 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,29 @@ [![Build Status](https://travis-ci.org/rricharz/Tek4010.svg?branch=master)](https://travis-ci.org/rricharz/Tek4010) -# Tektronix 4010 and 4014 Terminal Emulator +# Tektronix 4010 and 4014 Storage Tube Terminal Emulator This is a [Tektronix 4010 and 4014](https://en.wikipedia.org/wiki/Tektronix_4010) terminal emulator for the Raspberry Pi and other Linux systems. It can also be used on Windows and Macintosh systems with [Virtualbox](https://www.virtualbox.org/) and [Ubuntu](https://www.ubuntu.com/). +It can also display historical data for the +[MIT Project MAC](https://en.wikipedia.org/wiki/MIT_Computer_Science_and_Artificial_Intelligence_Laboratory#Project_MAC) +'s ARDS (Advanced Remote Display Station). + ![screen_shot](screendump.png?raw=true "tek4010 screendump") -It attempts to emulate the storage tube display of the Tektronix 4010, including the bright -drawing spot. +It attempts to emulate the [storage tube display](https://en.wikipedia.org/wiki/Storage_tube) +of the Tektronix 4010, including the bright drawing spot. -To the best of my knowledge this is the only Tektronix 4010 emulator, which makes an effort -to emulate the storage tube behavior of the 4010. If the look and feel is not important, you can -use ["xterm"](https://en.wikipedia.org/wiki/Xterm) instead. "xterm" does not support the -"write through" mode. - -This tek4010 emulator is currently in beta-testing and updated frequently. +To the best of my knowledge this is the only Tektronix 4010/4014 emulator, which makes an effort +to emulate the storage tube behavior. If the look and feel is not important, you can +use ["xterm"](https://en.wikipedia.org/wiki/Xterm) instead. "xterm" does not support all +graphics modes of the 4014. It can be used to log into a historical Unix system such as [2.11 BSD](https://en.wikipedia.org/wiki/Berkeley_Software_Distribution) on the [pidp11](http://obsolescence.wixsite.com/obsolescence/pidp-11) -or a real historical system. +or a real historical system. At can also be used to display historical plot data. This [video of a tek4010 demo](https://youtu.be/ioYiu6oUT88) was generated using [simplescreenrecorder](https://www.maartenbaert.be/simplescreenrecorder). There is also a @@ -232,7 +234,9 @@ tek4010 has the following options: -full in this mode the tek4010 emulator creates a full screen window, and uses the full resolution of the 4014 with the enhanced graphics module installed, scaled down to the actual window size. Use control-q to - close the tek4010 window. This option is experimental. + close the tek4010 window. This option is experimental. + + -ARDS display ARDS data **Reporting problems** @@ -277,4 +281,11 @@ There is a make file in the repo. See [versions.txt](versions.txt) +**Contributors** + +The storage tube emulator and the Tektronix 4010/4014 decoder were witten by Rene Richarz. +The ARDS decoder was written by Lars Brinkhoff. +The historical plot data for the Tektronix 4014 was obtained from Jos Dreesen. +Thanks to many others who contributed important ideas and helped with the debugging. + diff --git a/pltfiles/More_pltfiles/isco36.plt b/pltfiles/08_isco36.plt similarity index 100% rename from pltfiles/More_pltfiles/isco36.plt rename to pltfiles/08_isco36.plt diff --git a/pltfiles/08_warandpeace.plt b/pltfiles/08_warandpeace.plt deleted file mode 100644 index e2bf363..0000000 Binary files a/pltfiles/08_warandpeace.plt and /dev/null differ diff --git a/tek4010 b/tek4010 index 0a9cd38..d0507ac 100755 Binary files a/tek4010 and b/tek4010 differ diff --git a/tek4010.c b/tek4010.c index 4d6b18e..b8ea98b 100755 --- a/tek4010.c +++ b/tek4010.c @@ -73,6 +73,16 @@ static long startPaintTime; static int xh,xl,yh,yl,xy4014; static long todo; +// table for special plot point mode +// 4014 manual page F-9 +int intensityTable[] = {14,16,17,19, 20,22,23,25, 28,31,34,38, 41,33,47,50, + 56,62,69,75, 81,88,94,100, 56,62,69,75, 81,88,96,100, + 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, + 4, 4, 4, 5, 5, 5, 6, 6, 7, 8, 9,10, 11,12,12,13, + 14,16,17,19, 20,22,23,25, 28,31,34,38, 41,44,47,50, + 56,62,69,75, 81,88,94,100, 56,63,69,75, 81,88}; + + void tek4010_checkLimits() /* check whether char is in visibel space */ { @@ -147,9 +157,12 @@ void tek4010_escapeCodeHandler(cairo_t *cr, cairo_t *cr2, int ch) break; // modes 27 and 29 - 31 are identical in all modes - case 28: // record sepatator - if (DEBUG) printf("Special point plot mode not supported, ignored\n"); - mode = 50; + case 28: // record separator + /*if (DEBUG)*/ printf("Special point plot mode, mode=%d\n",savemode); + mode = 50; // for the intensity/focus character + specialPlotMode = 1; + double intensity = 1.0; + int defocussed = 0; break; case '8': tube_changeCharacterSize(cr, cr2, 74, 35, (int)(efactor * 18)); break; @@ -215,6 +228,7 @@ int tek4010_checkReturnToAlpha(int ch) todo = 0; } plotPointMode = 0; + specialPlotMode = 0; return 1; } else return 0; @@ -225,7 +239,7 @@ void tek4010_draw(cairo_t *cr, cairo_t *cr2, int first) // cr is used for persistent drawing, cr2 for temporary drawing { - int ch; + int ch, tag; refreshCount++; @@ -332,7 +346,7 @@ void tek4010_draw(cairo_t *cr, cairo_t *cr2, int first) plotPointMode = 0; goto endDo; case 30: // record separator >> incremental plot mode - if (DEBUG) printf("Incremental point plot mode not supported, ignored\n"); + if (DEBUG) printf("Incremental point plot mode\n"); penDown = 1; mode = 40; goto endDo; @@ -346,7 +360,7 @@ void tek4010_draw(cairo_t *cr, cairo_t *cr2, int first) // this cannot be done in switch(mode) below, because multiple bytes // can be skipped and the current byte must be executed after a mode change - int tag = (ch >> 5) & 3; + tag = (ch >> 5) & 3; if ((mode >= 1) && (mode <= 8)) { @@ -483,9 +497,9 @@ void tek4010_draw(cairo_t *cr, cairo_t *cr2, int first) showCursor = 0; tube_x0 = tube_x2; // prepare for additional vectors - tube_y0 = tube_y2; - mode = 5; - + tube_y0 = tube_y2; + if (specialPlotMode) mode = 50; // another intensity/focus char follows + else mode = 5; break; case 30: // escape code handler tek4010_escapeCodeHandler(cr, cr2, ch); @@ -507,8 +521,15 @@ void tek4010_draw(cairo_t *cr, cairo_t *cr2, int first) } else if (DEBUG) printf("Illegal byte 0x%02X in incremental plot\n", ch); break; - case 50: // special plot mode, not implemented - tek4010_checkReturnToAlpha(ch); // check for exit + case 50:// special plot mode, not implemented + // ignore the value for now + tag = ch >> 5; + if ((ch < 32) || (ch >= 126)) return; + if (DEBUG) printf("intensity/focus control = %c: %d: ", ch, tag); + defocussed = (tag == 1); + intensity = intensityTable[ch - 32]; + if (DEBUG) printf("defocussed = %d, intensity = %d%%\n", defocussed, intensity); + mode = 5; // coordinates follow break; case 101: if (DEBUG) printf("Ignore until group separator, ch = %02x\n", ch); diff --git a/tektests/greyscaletest.plt b/tektests/greyscaletest.plt new file mode 100644 index 0000000..83c19df --- /dev/null +++ b/tektests/greyscaletest.plt @@ -0,0 +1,2 @@ +$v)L1fL &hL!P"T#X$\%h*@&D'H(L)P*T+X,\-h+@.D/H0L1P2T3X4\5h,@6D7H8L9P:T;X<\=h-@>D?H@LAPBTCXD\Eh.@FDGHHLIPJTKXL\Mh/@NDOHPLQPRTSXT\Uh0@VDWHXLYPZT[X\\]h1@^D_H`LaPbTcXd\eh2@fDgHhLiPjTkXl\mh3@nDoHpLqPrTsXt\uh4@vDwHxLyPzT{X|\}h5@~DH k)L!P"T#X$\%k*@&D'H(L)P*T+X,\-k+@.D/H0L1P2T3X4\5k,@6D7H8L9P:T;X<\=k-@>D?H@LAPBTCXD\Ek.@FDGHHLIPJTKXL\Mk/@NDOHPLQPRTSXT\Uk0@VDWHXLYPZT[X\\]k1@^D_H`LaPbTcXd\ek2@fDgHhLiPjTkXl\mk3@nDoHpLqPrTsXt\uk4@vDwHxLyPzT{X|\}k5@~DH n)L!P"T#X$\%n*@&D'H(L)P*T+X,\-n+@.D/H0L1P2T3X4\5n,@6D7H8L9P:T;X<\=n-@>D?H@LAPBTCXD\En.@FDGHHLIPJTKXL\Mn/@NDOHPLQPRTSXT\Un0@VDWHXLYPZT[X\\]n1@^D_H`LaPbTcXd\en2@fDgHhLiPjTkXl\mn3@nDoHpLqPrTsXt\un4@vDwHxLyPzT{X|\}n5@~DH q)L!P"T#X$\%q*@&D'H(L)P*T+X,\-q+@.D/H0L1P2T3X4\5q,@6D7H8L9P:T;X<\=q-@>D?H@LAPBTCXD\Eq.@FDGHHLIPJTKXL\Mq/@NDOHPLQPRTSXT\Uq0@VDWHXLYPZT[X\\]q1@^D_H`LaPbTcXd\eq2@fDgHhLiPjTkXl\mq3@nDoHpLqPrTsXt\uq4@vDwHxLyPzT{X|\}q5@~DH t)L!P"T#X$\%t*@&D'H(L)P*T+X,\-t+@.D/H0L1P2T3X4\5t,@6D7H8L9P:T;X<\=t-@>D?H@LAPBTCXD\Et.@FDGHHLIPJTKXL\Mt/@NDOHPLQPRTSXT\Ut0@VDWHXLYPZT[X\\]t1@^D_H`LaPbTcXd\et2@fDgHhLiPjTkXl\mt3@nDoHpLqPrTsXt\ut4@vDwHxLyPzT{X|\}t5@~DH w)L!P"T#X$\%w*@&D'H(L)P*T+X,\-w+@.D/H0L1P2T3X4\5w,@6D7H8L9P:T;X<\=w-@>D?H@LAPBTCXD\Ew.@FDGHHLIPJTKXL\Mw/@NDOHPLQPRTSXT\Uw0@VDWHXLYPZT[X\\]w1@^D_H`LaPbTcXd\ew2@fDgHhLiPjTkXl\mw3@nDoHpLqPrTsXt\uw4@vDwHxLyPzT{X|\}w5@~DH z)L!P"T#X$\%z*@&D'H(L)P*T+X,\-z+@.D/H0L1P2T3X4\5z,@6D7H8L9P:T;X<\=z-@>D?H@LAPBTCXD\Ez.@FDGHHLIPJTKXL\Mz/@NDOHPLQPRTSXT\Uz0@VDWHXLYPZT[X\\]z1@^D_H`LaPbTcXd\ez2@fDgHhLiPjTkXl\mz3@nDoHpLqPrTsXt\uz4@vDwHxLyPzT{X|\}z5@~DH })L!P"T#X$\%}*@&D'H(L)P*T+X,\-}+@.D/H0L1P2T3X4\5},@6D7H8L9P:T;X<\=}-@>D?H@LAPBTCXD\E}.@FDGHHLIPJTKXL\M}/@NDOHPLQPRTSXT\U}0@VDWHXLYPZT[X\\]}1@^D_H`LaPbTcXd\e}2@fDgHhLiPjTkXl\m}3@nDoHpLqPrTsXt\u}4@vDwHxLyPzT{X|\}}5@~DH '`)L!P"T#X$\%`*@&D'H(L)P*T+X,\-`+@.D/H0L1P2T3X4\5`,@6D7H8L9P:T;X<\=`-@>D?H@LAPBTCXD\E`.@FDGHHLIPJTKXL\M`/@NDOHPLQPRTSXT\U`0@VDWHXLYPZT[X\\]`1@^D_H`LaPbTcXd\e`2@fDgHhLiPjTkXl\m`3@nDoHpLqPrTsXt\u`4@vDwHxLyPzT{X|\}`5@~DH c)L!P"T#X$\%c*@&D'H(L)P*T+X,\-c+@.D/H0L1P2T3X4\5c,@6D7H8L9P:T;X<\=c-@>D?H@LAPBTCXD\Ec.@FDGHHLIPJTKXL\Mc/@NDOHPLQPRTSXT\Uc0@VDWHXLYPZT[X\\]c1@^D_H`LaPbTcXd\ec2@fDgHhLiPjTkXl\mc3@nDoHpLqPrTsXt\uc4@vDwHxLyPzT{X|\}c5@~DH f)L!P"T#X$\%f*@&D'H(L)P*T+X,\-f+@.D/H0L1P2T3X4\5f,@6D7H8L9P:T;X<\=f-@>D?H@LAPBTCXD\Ef.@FDGHHLIPJTKXL\Mf/@NDOHPLQPRTSXT\Uf0@VDWHXLYPZT[X\\]f1@^D_H`LaPbTcXd\ef2@fDgHhLiPjTkXl\mf3@nDoHpLqPrTsXt\uf4@vDwHxLyPzT{X|\}f5@~DH i)L!P"T#X$\%i*@&D'H(L)P*T+X,\-i+@.D/H0L1P2T3X4\5i,@6D7H8L9P:T;X<\=i-@>D?H@LAPBTCXD\Ei.@FDGHHLIPJTKXL\Mi/@NDOHPLQPRTSXT\Ui0@VDWHXLYPZT[X\\]i1@^D_H`LaPbTcXd\ei2@fDgHhLiPjTkXl\mi3@nDoHpLqPrTsXt\ui4@vDwHxLyPzT{X|\}i5@~DH l)L!P"T#X$\%l*@&D'H(L)P*T+X,\-l+@.D/H0L1P2T3X4\5l,@6D7H8L9P:T;X<\=l-@>D?H@LAPBTCXD\El.@FDGHHLIPJTKXL\Ml/@NDOHPLQPRTSXT\Ul0@VDWHXLYPZT[X\\]l1@^D_H`LaPbTcXd\el2@fDgHhLiPjTkXl\ml3@nDoHpLqPrTsXt\ul4@vDwHxLyPzT{X|\}l5@~DH o)L!P"T#X$\%o*@&D'H(L)P*T+X,\-o+@.D/H0L1P2T3X4\5o,@6D7H8L9P:T;X<\=o-@>D?H@LAPBTCXD\Eo.@FDGHHLIPJTKXL\Mo/@NDOHPLQPRTSXT\Uo0@VDWHXLYPZT[X\\]o1@^D_H`LaPbTcXd\eo2@fDgHhLiPjTkXl\mo3@nDoHpLqPrTsXt\uo4@vDwHxLyPzT{X|\}o5@~DH r)L!P"T#X$\%r*@&D'H(L)P*T+X,\-r+@.D/H0L1P2T3X4\5r,@6D7H8L9P:T;X<\=r-@>D?H@LAPBTCXD\Er.@FDGHHLIPJTKXL\Mr/@NDOHPLQPRTSXT\Ur0@VDWHXLYPZT[X\\]r1@^D_H`LaPbTcXd\er2@fDgHhLiPjTkXl\mr3@nDoHpLqPrTsXt\ur4@vDwHxLyPzT{X|\}r5@~DH u)L!P"T#X$\%u*@&D'H(L)P*T+X,\-u+@.D/H0L1P2T3X4\5u,@6D7H8L9P:T;X<\=u-@>D?H@LAPBTCXD\Eu.@FDGHHLIPJTKXL\Mu/@NDOHPLQPRTSXT\Uu0@VDWHXLYPZT[X\\]u1@^D_H`LaPbTcXd\eu2@fDgHhLiPjTkXl\mu3@nDoHpLqPrTsXt\uu4@vDwHxLyPzT{X|\}u5@~DH x)L!P"T#X$\%x*@&D'H(L)P*T+X,\-x+@.D/H0L1P2T3X4\5x,@6D7H8L9P:T;X<\=x-@>D?H@LAPBTCXD\Ex.@FDGHHLIPJTKXL\Mx/@NDOHPLQPRTSXT\Ux0@VDWHXLYPZT[X\\]x1@^D_H`LaPbTcXd\ex2@fDgHhLiPjTkXl\mx3@nDoHpLqPrTsXt\ux4@vDwHxLyPzT{X|\}x5@~DH {)L!P"T#X$\%{*@&D'H(L)P*T+X,\-{+@.D/H0L1P2T3X4\5{,@6D7H8L9P:T;X<\={-@>D?H@LAPBTCXD\E{.@FDGHHLIPJTKXL\M{/@NDOHPLQPRTSXT\U{0@VDWHXLYPZT[X\\]{1@^D_H`LaPbTcXd\e{2@fDgHhLiPjTkXl\m{3@nDoHpLqPrTsXt\u{4@vDwHxLyPzT{X|\}{5@~DH ~)L!P"T#X$\%~*@&D'H(L)P*T+X,\-~+@.D/H0L1P2T3X4\5~,@6D7H8L9P:T;X<\=~-@>D?H@LAPBTCXD\E~.@FDGHHLIPJTKXL\M~/@NDOHPLQPRTSXT\U~0@VDWHXLYPZT[X\\]~1@^D_H`LaPbTcXd\e~2@fDgHhLiPjTkXl\m~3@nDoHpLqPrTsXt\u~4@vDwHxLyPzT{X|\}~5@~DH (a)L!P"T#X$\%a*@&D'H(L)P*T+X,\-a+@.D/H0L1P2T3X4\5a,@6D7H8L9P:T;X<\=a-@>D?H@LAPBTCXD\Ea.@FDGHHLIPJTKXL\Ma/@NDOHPLQPRTSXT\Ua0@VDWHXLYPZT[X\\]a1@^D_H`LaPbTcXd\ea2@fDgHhLiPjTkXl\ma3@nDoHpLqPrTsXt\ua4@vDwHxLyPzT{X|\}a5@~DH d)L!P"T#X$\%d*@&D'H(L)P*T+X,\-d+@.D/H0L1P2T3X4\5d,@6D7H8L9P:T;X<\=d-@>D?H@LAPBTCXD\Ed.@FDGHHLIPJTKXL\Md/@NDOHPLQPRTSXT\Ud0@VDWHXLYPZT[X\\]d1@^D_H`LaPbTcXd\ed2@fDgHhLiPjTkXl\md3@nDoHpLqPrTsXt\ud4@vDwHxLyPzT{X|\}d5@~DH g)L!P"T#X$\%g*@&D'H(L)P*T+X,\-g+@.D/H0L1P2T3X4\5g,@6D7H8L9P:T;X<\=g-@>D?H@LAPBTCXD\Eg.@FDGHHLIPJTKXL\Mg/@NDOHPLQPRTSXT\Ug0@VDWHXLYPZT[X\\]g1@^D_H`LaPbTcXd\eg2@fDgHhLiPjTkXl\mg3@nDoHpLqPrTsXt\ug4@vDwHxLyPzT{X|\}g5@~DH j)L!P"T#X$\%j*@&D'H(L)P*T+X,\-j+@.D/H0L1P2T3X4\5j,@6D7H8L9P:T;X<\=j-@>D?H@LAPBTCXD\Ej.@FDGHHLIPJTKXL\Mj/@NDOHPLQPRTSXT\Uj0@VDWHXLYPZT[X\\]j1@^D_H`LaPbTcXd\ej2@fDgHhLiPjTkXl\mj3@nDoHpLqPrTsXt\uj4@vDwHxLyPzT{X|\}j5@~DH m)L!P"T#X$\%m*@&D'H(L)P*T+X,\-m+@.D/H0L1P2T3X4\5m,@6D7H8L9P:T;X<\=m-@>D?H@LAPBTCXD\Em.@FDGHHLIPJTKXL\Mm/@NDOHPLQPRTSXT\Um0@VDWHXLYPZT[X\\]m1@^D_H`LaPbTcXd\em2@fDgHhLiPjTkXl\mm3@nDoHpLqPrTsXt\um4@vDwHxLyPzT{X|\}m5@~DH p)L!P"T#X$\%p*@&D'H(L)P*T+X,\-p+@.D/H0L1P2T3X4\5p,@6D7H8L9P:T;X<\=p-@>D?H@LAPBTCXD\Ep.@FDGHHLIPJTKXL\Mp/@NDOHPLQPRTSXT\Up0@VDWHXLYPZT[X\\]p1@^D_H`LaPbTcXd\ep2@fDgHhLiPjTkXl\mp3@nDoHpLqPrTsXt\up4@vDwHxLyPzT{X|\}p5@~DH s)L!P"T#X$\%s*@&D'H(L)P*T+X,\-s+@.D/H0L1P2T3X4\5s,@6D7H8L9P:T;X<\=s-@>D?H@LAPBTCXD\Es.@FDGHHLIPJTKXL\Ms/@NDOHPLQPRTSXT\Us0@VDWHXLYPZT[X\\]s1@^D_H`LaPbTcXd\es2@fDgHhLiPjTkXl\ms3@nDoHpLqPrTsXt\us4@vDwHxLyPzT{X|\}s5@~DH v)L!P"T#X$\%v*@&D'H(L)P*T+X,\-v+@.D/H0L1P2T3X4\5v,@6D7H8L9P:T;X<\=v-@>D?H@LAPBTCXD\Ev.@FDGHHLIPJTKXL\Mv/@NDOHPLQPRTSXT\Uv0@VDWHXLYPZT[X\\]v1@^D_H`LaPbTcXd\ev2@fDgHhLiPjTkXl\mv3@nDoHpLqPrTsXt\uv4@vDwHxLyPzT{X|\}v5@~DH y)L!P"T#X$\%y*@&D'H(L)P*T+X,\-y+@.D/H0L1P2T3X4\5y,@6D7H8L9P:T;X<\=y-@>D?H@LAPBTCXD\Ey.@FDGHHLIPJTKXL\My/@NDOHPLQPRTSXT\Uy0@VDWHXLYPZT[X\\]y1@^D_H`LaPbTcXd\ey2@fDgHhLiPjTkXl\my3@nDoHpLqPrTsXt\uy4@vDwHxLyPzT{X|\}y5@~DH |)L!P"T#X$\%|*@&D'H(L)P*T+X,\-|+@.D/H0L1P2T3X4\5|,@6D7H8L9P:T;X<\=|-@>D?H@LAPBTCXD\E|.@FDGHHLIPJTKXL\M|/@NDOHPLQPRTSXT\U|0@VDWHXLYPZT[X\\]|1@^D_H`LaPbTcXd\e|2@fDgHhLiPjTkXl\m|3@nDoHpLqPrTsXt\u|4@vDwHxLyPzT{X|\}|5@~DH )L!P"T#X$\%*@&D'H(L)P*T+X,\-+@.D/H0L1P2T3X4\5,@6D7H8L9P:T;X<\=-@>D?H@LAPBTCXD\E.@FDGHHLIPJTKXL\M/@NDOHPLQPRTSXT\U0@VDWHXLYPZT[X\\]1@^D_H`LaPbTcXd\e2@fDgHhLiPjTkXl\m3@nDoHpLqPrTsXt\u4@vDwHxLyPzT{X|\}5@~DH )b)L!P"T#X$\%b*@&D'H(L)P*T+X,\-b+@.D/H0L1P2T3X4\5b,@6D7H8L9P:T;X<\=b-@>D?H@LAPBTCXD\Eb.@FDGHHLIPJTKXL\Mb/@NDOHPLQPRTSXT\Ub0@VDWHXLYPZT[X\\]b1@^D_H`LaPbTcXd\eb2@fDgHhLiPjTkXl\mb3@nDoHpLqPrTsXt\ub4@vDwHxLyPzT{X|\}b5@~DH e)L!P"T#X$\%e*@&D'H(L)P*T+X,\-e+@.D/H0L1P2T3X4\5e,@6D7H8L9P:T;X<\=e-@>D?H@LAPBTCXD\Ee.@FDGHHLIPJTKXL\Me/@NDOHPLQPRTSXT\Ue0@VDWHXLYPZT[X\\]e1@^D_H`LaPbTcXd\ee2@fDgHhLiPjTkXl\me3@nDoHpLqPrTsXt\ue4@vDwHxLyPzT{X|\}e5@~DH h)L!P"T#X$\%h*@&D'H(L)P*T+X,\-h+@.D/H0L1P2T3X4\5h,@6D7H8L9P:T;X<\=h-@>D?H@LAPBTCXD\Eh.@FDGHHLIPJTKXL\Mh/@NDOHPLQPRTSXT\Uh0@VDWHXLYPZT[X\\]h1@^D_H`LaPbTcXd\eh2@fDgHhLiPjTkXl\mh3@nDoHpLqPrTsXt\uh4@vDwHxLyPzT{X|\}h5@~DH k)L!P"T#X$\%k*@&D'H(L)P*T+X,\-k+@.D/H0L1P2T3X4\5k,@6D7H8L9P:T;X<\=k-@>D?H@LAPBTCXD\Ek.@FDGHHLIPJTKXL\Mk/@NDOHPLQPRTSXT\Uk0@VDWHXLYPZT[X\\]k1@^D_H`LaPbTcXd\ek2@fDgHhLiPjTkXl\mk3@nDoHpLqPrTsXt\uk4@vDwHxLyPzT{X|\}k5@~DH n)L!P"T#X$\%n*@&D'H(L)P*T+X,\-n+@.D/H0L1P2T3X4\5n,@6D7H8L9P:T;X<\=n-@>D?H@LAPBTCXD\En.@FDGHHLIPJTKXL\Mn/@NDOHPLQPRTSXT\Un0@VDWHXLYPZT[X\\]n1@^D_H`LaPbTcXd\en2@fDgHhLiPjTkXl\mn3@nDoHpLqPrTsXt\un4@vDwHxLyPzT{X|\}n5@~DH q)L!P"T#X$\%q*@&D'H(L)P*T+X,\-q+@.D/H0L1P2T3X4\5q,@6D7H8L9P:T;X<\=q-@>D?H@LAPBTCXD\Eq.@FDGHHLIPJTKXL\Mq/@NDOHPLQPRTSXT\Uq0@VDWHXLYPZT[X\\]q1@^D_H`LaPbTcXd\eq2@fDgHhLiPjTkXl\mq3@nDoHpLqPrTsXt\uq4@vDwHxLyPzT{X|\}q5@~DH t)L!P"T#X$\%t*@&D'H(L)P*T+X,\-t+@.D/H0L1P2T3X4\5t,@6D7H8L9P:T;X<\=t-@>D?H@LAPBTCXD\Et.@FDGHHLIPJTKXL\Mt/@NDOHPLQPRTSXT\Ut0@VDWHXLYPZT[X\\]t1@^D_H`LaPbTcXd\et2@fDgHhLiPjTkXl\mt3@nDoHpLqPrTsXt\ut4@vDwHxLyPzT{X|\}t5@~DH w)L!P"T#X$\%w*@&D'H(L)P*T+X,\-w+@.D/H0L1P2T3X4\5w,@6D7H8L9P:T;X<\=w-@>D?H@LAPBTCXD\Ew.@FDGHHLIPJTKXL\Mw/@NDOHPLQPRTSXT\Uw0@VDWHXLYPZT[X\\]w1@^D_H`LaPbTcXd\ew2@fDgHhLiPjTkXl\mw3@nDoHpLqPrTsXt\uw4@vDwHxLyPzT{X|\}w5@~DH z)L!P"T#X$\%z*@&D'H(L)P*T+X,\-z+@.D/H0L1P2T3X4\5z,@6D7H8L9P:T;X<\=z-@>D?H@LAPBTCXD\Ez.@FDGHHLIPJTKXL\Mz/@NDOHPLQPRTSXT\Uz0@VDWHXLYPZT[X\\]z1@^D_H`LaPbTcXd\ez2@fDgHhLiPjTkXl\mz3@nDoHpLqPrTsXt\uz4@vDwHxLyPzT{X|\}z5@~DH })L!P"T#X$\%}*@&D'H(L)P*T+X,\-}+@.D/H0L1P2T3X4\5},@6D7H8L9P:T;X<\=}-@>D?H@LAPBTCXD\E}.@FDGHHLIPJTKXL\M}/@NDOHPLQPRTSXT\U}0@VDWHXLYPZT[X\\]}1@^D_H`LaPbTcXd\e}2@fDgHhLiPjTkXl\m}3@nDoHpLqPrTsXt\u}4@vDwHxLyPzT{X|\}}5@~DH *`)L!P"T#X$\%`*@&D'H(L)P*T+X,\-`+@.D/H0L1P2T3X4\5`,@6D7H8L9P:T;X<\=`-@>D?H@LAPBTCXD\E`.@FDGHHLIPJTKXL\M`/@NDOHPLQPRTSXT\U`0@VDWHXLYPZT[X\\]`1@^D_H`LaPbTcXd\e`2@fDgHhLiPjTkXl\m`3@nDoHpLqPrTsXt\u`4@vDwHxLyPzT{X|\}`5@~DH c)L!P"T#X$\%c*@&D'H(L)P*T+X,\-c+@.D/H0L1P2T3X4\5c,@6D7H8L9P:T;X<\=c-@>D?H@LAPBTCXD\Ec.@FDGHHLIPJTKXL\Mc/@NDOHPLQPRTSXT\Uc0@VDWHXLYPZT[X\\]c1@^D_H`LaPbTcXd\ec2@fDgHhLiPjTkXl\mc3@nDoHpLqPrTsXt\uc4@vDwHxLyPzT{X|\}c5@~DH f)L!P"T#X$\%f*@&D'H(L)P*T+X,\-f+@.D/H0L1P2T3X4\5f,@6D7H8L9P:T;X<\=f-@>D?H@LAPBTCXD\Ef.@FDGHHLIPJTKXL\Mf/@NDOHPLQPRTSXT\Uf0@VDWHXLYPZT[X\\]f1@^D_H`LaPbTcXd\ef2@fDgHhLiPjTkXl\mf3@nDoHpLqPrTsXt\uf4@vDwHxLyPzT{X|\}f5@~DH i)L!P"T#X$\%i*@&D'H(L)P*T+X,\-i+@.D/H0L1P2T3X4\5i,@6D7H8L9P:T;X<\=i-@>D?H@LAPBTCXD\Ei.@FDGHHLIPJTKXL\Mi/@NDOHPLQPRTSXT\Ui0@VDWHXLYPZT[X\\]i1@^D_H`LaPbTcXd\ei2@fDgHhLiPjTkXl\mi3@nDoHpLqPrTsXt\ui4@vDwHxLyPzT{X|\}i5@~DH l)L!P"T#X$\%l*@&D'H(L)P*T+X,\-l+@.D/H0L1P2T3X4\5l,@6D7H8L9P:T;X<\=l-@>D?H@LAPBTCXD\El.@FDGHHLIPJTKXL\Ml/@NDOHPLQPRTSXT\Ul0@VDWHXLYPZT[X\\]l1@^D_H`LaPbTcXd\el2@fDgHhLiPjTkXl\ml3@nDoHpLqPrTsXt\ul4@vDwHxLyPzT{X|\}l5@~DH o)L!P"T#X$\%o*@&D'H(L)P*T+X,\-o+@.D/H0L1P2T3X4\5o,@6D7H8L9P:T;X<\=o-@>D?H@LAPBTCXD\Eo.@FDGHHLIPJTKXL\Mo/@NDOHPLQPRTSXT\Uo0@VDWHXLYPZT[X\\]o1@^D_H`LaPbTcXd\eo2@fDgHhLiPjTkXl\mo3@nDoHpLqPrTsXt\uo4@vDwHxLyPzT{X|\}o5@~DH r)L!P"T#X$\%r*@&D'H(L)P*T+X,\-r+@.D/H0L1P2T3X4\5r,@6D7H8L9P:T;X<\=r-@>D?H@LAPBTCXD\Er.@FDGHHLIPJTKXL\Mr/@NDOHPLQPRTSXT\Ur0@VDWHXLYPZT[X\\]r1@^D_H`LaPbTcXd\er2@fDgHhLiPjTkXl\mr3@nDoHpLqPrTsXt\ur4@vDwHxLyPzT{X|\}r5@~DH u)L!P"T#X$\%u*@&D'H(L)P*T+X,\-u+@.D/H0L1P2T3X4\5u,@6D7H8L9P:T;X<\=u-@>D?H@LAPBTCXD\Eu.@FDGHHLIPJTKXL\Mu/@NDOHPLQPRTSXT\Uu0@VDWHXLYPZT[X\\]u1@^D_H`LaPbTcXd\eu2@fDgHhLiPjTkXl\mu3@nDoHpLqPrTsXt\uu4@vDwHxLyPzT{X|\}u5@~DH x)L!P"T#X$\%x*@&D'H(L)P*T+X,\-x+@.D/H0L1P2T3X4\5x,@6D7H8L9P:T;X<\=x-@>D?H@LAPBTCXD\Ex.@FDGHHLIPJTKXL\Mx/@NDOHPLQPRTSXT\Ux0@VDWHXLYPZT[X\\]x1@^D_H`LaPbTcXd\ex2@fDgHhLiPjTkXl\mx3@nDoHpLqPrTsXt\ux4@vDwHxLyPzT{X|\}x5@~DH {)L!P"T#X$\%{*@&D'H(L)P*T+X,\-{+@.D/H0L1P2T3X4\5{,@6D7H8L9P:T;X<\={-@>D?H@LAPBTCXD\E{.@FDGHHLIPJTKXL\M{/@NDOHPLQPRTSXT\U{0@VDWHXLYPZT[X\\]{1@^D_H`LaPbTcXd\e{2@fDgHhLiPjTkXl\m{3@nDoHpLqPrTsXt\u{4@vDwHxLyPzT{X|\}{5@~DH ~)L!P"T#X$\%~*@&D'H(L)P*T+X,\-~+@.D/H0L1P2T3X4\5~,@6D7H8L9P:T;X<\=~-@>D?H@LAPBTCXD\E~.@FDGHHLIPJTKXL\M~/@NDOHPLQPRTSXT\U~0@VDWHXLYPZT[X\\]~1@^D_H`LaPbTcXd\e~2@fDgHhLiPjTkXl\m~3@nDoHpLqPrTsXt\u~4@vDwHxLyPzT{X|\}~5@~DH +a)L!P"T#X$\%a*@&D'H(L)P*T+X,\-a+@.D/H0L1P2T3X4\5a,@6D7H8L9P:T;X<\=a-@>D?H@LAPBTCXD\Ea.@FDGHHLIPJTKXL\Ma/@NDOHPLQPRTSXT\Ua0@VDWHXLYPZT[X\\]a1@^D_H`LaPbTcXd\ea2@fDgHhLiPjTkXl\ma3@nDoHpLqPrTsXt\ua4@vDwHxLyPzT{X|\}a5@~DH d)L!P"T#X$\%d*@&D'H(L)P*T+X,\-d+@.D/H0L1P2T3X4\5d,@6D7H8L9P:T;X<\=d-@>D?H@LAPBTCXD\Ed.@FDGHHLIPJTKXL\Md/@NDOHPLQPRTSXT\Ud0@VDWHXLYPZT[X\\]d1@^D_H`LaPbTcXd\ed2@fDgHhLiPjTkXl\md3@nDoHpLqPrTsXt\ud4@vDwHxLyPzT{X|\}d5@~DH g)L!P"T#X$\%g*@&D'H(L)P*T+X,\-g+@.D/H0L1P2T3X4\5g,@6D7H8L9P:T;X<\=g-@>D?H@LAPBTCXD\Eg.@FDGHHLIPJTKXL\Mg/@NDOHPLQPRTSXT\Ug0@VDWHXLYPZT[X\\]g1@^D_H`LaPbTcXd\eg2@fDgHhLiPjTkXl\mg3@nDoHpLqPrTsXt\ug4@vDwHxLyPzT{X|\}g5@~DH j)L!P"T#X$\%j*@&D'H(L)P*T+X,\-j+@.D/H0L1P2T3X4\5j,@6D7H8L9P:T;X<\=j-@>D?H@LAPBTCXD\Ej.@FDGHHLIPJTKXL\Mj/@NDOHPLQPRTSXT\Uj0@VDWHXLYPZT[X\\]j1@^D_H`LaPbTcXd\ej2@fDgHhLiPjTkXl\mj3@nDoHpLqPrTsXt\uj4@vDwHxLyPzT{X|\}j5@~DH m)L!P"T#X$\%m*@&D'H(L)P*T+X,\-m+@.D/H0L1P2T3X4\5m,@6D7H8L9P:T;X<\=m-@>D?H@LAPBTCXD\Em.@FDGHHLIPJTKXL\Mm/@NDOHPLQPRTSXT\Um0@VDWHXLYPZT[X\\]m1@^D_H`LaPbTcXd\em2@fDgHhLiPjTkXl\mm3@nDoHpLqPrTsXt\um4@vDwHxLyPzT{X|\}m5@~DH p)L!P"T#X$\%p*@&D'H(L)P*T+X,\-p+@.D/H0L1P2T3X4\5p,@6D7H8L9P:T;X<\=p-@>D?H@LAPBTCXD\Ep.@FDGHHLIPJTKXL\Mp/@NDOHPLQPRTSXT\Up0@VDWHXLYPZT[X\\]p1@^D_H`LaPbTcXd\ep2@fDgHhLiPjTkXl\mp3@nDoHpLqPrTsXt\up4@vDwHxLyPzT{X|\}p5@~DH s)L!P"T#X$\%s*@&D'H(L)P*T+X,\-s+@.D/H0L1P2T3X4\5s,@6D7H8L9P:T;X<\=s-@>D?H@LAPBTCXD\Es.@FDGHHLIPJTKXL\Ms/@NDOHPLQPRTSXT\Us0@VDWHXLYPZT[X\\]s1@^D_H`LaPbTcXd\es2@fDgHhLiPjTkXl\ms3@nDoHpLqPrTsXt\us4@vDwHxLyPzT{X|\}s5@~DH v)L!P"T#X$\%v*@&D'H(L)P*T+X,\-v+@.D/H0L1P2T3X4\5v,@6D7H8L9P:T;X<\=v-@>D?H@LAPBTCXD\Ev.@FDGHHLIPJTKXL\Mv/@NDOHPLQPRTSXT\Uv0@VDWHXLYPZT[X\\]v1@^D_H`LaPbTcXd\ev2@fDgHhLiPjTkXl\mv3@nDoHpLqPrTsXt\uv4@vDwHxLyPzT{X|\}v5@~DH y)L!P"T#X$\%y*@&D'H(L)P*T+X,\-y+@.D/H0L1P2T3X4\5y,@6D7H8L9P:T;X<\=y-@>D?H@LAPBTCXD\Ey.@FDGHHLIPJTKXL\My/@NDOHPLQPRTSXT\Uy0@VDWHXLYPZT[X\\]y1@^D_H`LaPbTcXd\ey2@fDgHhLiPjTkXl\my3@nDoHpLqPrTsXt\uy4@vDwHxLyPzT{X|\}y5@~DH |)L!P"T#X$\%|*@&D'H(L)P*T+X,\-|+@.D/H0L1P2T3X4\5|,@6D7H8L9P:T;X<\=|-@>D?H@LAPBTCXD\E|.@FDGHHLIPJTKXL\M|/@NDOHPLQPRTSXT\U|0@VDWHXLYPZT[X\\]|1@^D_H`LaPbTcXd\e|2@fDgHhLiPjTkXl\m|3@nDoHpLqPrTsXt\u|4@vDwHxLyPzT{X|\}|5@~DH )L!P"T#X$\%*@&D'H(L)P*T+X,\-+@.D/H0L1P2T3X4\5,@6D7H8L9P:T;X<\=-@>D?H@LAPBTCXD\E.@FDGHHLIPJTKXL\M/@NDOHPLQPRTSXT\U0@VDWHXLYPZT[X\\]1@^D_H`LaPbTcXd\e2@fDgHhLiPjTkXl\m3@nDoHpLqPrTsXt\u4@vDwHxLyPzT{X|\}5@~DH ,b)L!P"T#X$\%b*@&D'H(L)P*T+X,\-b+@.D/H0L1P2T3X4\5b,@6D7H8L9P:T;X<\=b-@>D?H@LAPBTCXD\Eb.@FDGHHLIPJTKXL\Mb/@NDOHPLQPRTSXT\Ub0@VDWHXLYPZT[X\\]b1@^D_H`LaPbTcXd\eb2@fDgHhLiPjTkXl\mb3@nDoHpLqPrTsXt\ub4@vDwHxLyPzT{X|\}b5@~DH e)L!P"T#X$\%e*@&D'H(L)P*T+X,\-e+@.D/H0L1P2T3X4\5e,@6D7H8L9P:T;X<\=e-@>D?H@LAPBTCXD\Ee.@FDGHHLIPJTKXL\Me/@NDOHPLQPRTSXT\Ue0@VDWHXLYPZT[X\\]e1@^D_H`LaPbTcXd\ee2@fDgHhLiPjTkXl\me3@nDoHpLqPrTsXt\ue4@vDwHxLyPzT{X|\}e5@~DH h)L!P"T#X$\%h*@&D'H(L)P*T+X,\-h+@.D/H0L1P2T3X4\5h,@6D7H8L9P:T;X<\=h-@>D?H@LAPBTCXD\Eh.@FDGHHLIPJTKXL\Mh/@NDOHPLQPRTSXT\Uh0@VDWHXLYPZT[X\\]h1@^D_H`LaPbTcXd\eh2@fDgHhLiPjTkXl\mh3@nDoHpLqPrTsXt\uh4@vDwHxLyPzT{X|\}h5@~DH k)L!P"T#X$\%k*@&D'H(L)P*T+X,\-k+@.D/H0L1P2T3X4\5k,@6D7H8L9P:T;X<\=k-@>D?H@LAPBTCXD\Ek.@FDGHHLIPJTKXL\Mk/@NDOHPLQPRTSXT\Uk0@VDWHXLYPZT[X\\]k1@^D_H`LaPbTcXd\ek2@fDgHhLiPjTkXl\mk3@nDoHpLqPrTsXt\uk4@vDwHxLyPzT{X|\}k5@~DH n)L!P"T#X$\%n*@&D'H(L)P*T+X,\-n+@.D/H0L1P2T3X4\5n,@6D7H8L9P:T;X<\=n-@>D?H@LAPBTCXD\En.@FDGHHLIPJTKXL\Mn/@NDOHPLQPRTSXT\Un0@VDWHXLYPZT[X\\]n1@^D_H`LaPbTcXd\en2@fDgHhLiPjTkXl\mn3@nDoHpLqPrTsXt\un4@vDwHxLyPzT{X|\}n5@~DH q)L!P"T#X$\%q*@&D'H(L)P*T+X,\-q+@.D/H0L1P2T3X4\5q,@6D7H8L9P:T;X<\=q-@>D?H@LAPBTCXD\Eq.@FDGHHLIPJTKXL\Mq/@NDOHPLQPRTSXT\Uq0@VDWHXLYPZT[X\\]q1@^D_H`LaPbTcXd\eq2@fDgHhLiPjTkXl\mq3@nDoHpLqPrTsXt\uq4@vDwHxLyPzT{X|\}q5@~DH t)L!P"T#X$\%t*@&D'H(L)P*T+X,\-t+@.D/H0L1P2T3X4\5t,@6D7H8L9P:T;X<\=t-@>D?H@LAPBTCXD\Et.@FDGHHLIPJTKXL\Mt/@NDOHPLQPRTSXT\Ut0@VDWHXLYPZT[X\\]t1@^D_H`LaPbTcXd\et2@fDgHhLiPjTkXl\mt3@nDoHpLqPrTsXt\ut4@vDwHxLyPzT{X|\}t5@~DH w)L!P"T#X$\%w*@&D'H(L)P*T+X,\-w+@.D/H0L1P2T3X4\5w,@6D7H8L9P:T;X<\=w-@>D?H@LAPBTCXD\Ew.@FDGHHLIPJTKXL\Mw/@NDOHPLQPRTSXT\Uw0@VDWHXLYPZT[X\\]w1@^D_H`LaPbTcXd\ew2@fDgHhLiPjTkXl\mw3@nDoHpLqPrTsXt\uw4@vDwHxLyPzT{X|\}w5@~DH z)L!P"T#X$\%z*@&D'H(L)P*T+X,\-z+@.D/H0L1P2T3X4\5z,@6D7H8L9P:T;X<\=z-@>D?H@LAPBTCXD\Ez.@FDGHHLIPJTKXL\Mz/@NDOHPLQPRTSXT\Uz0@VDWHXLYPZT[X\\]z1@^D_H`LaPbTcXd\ez2@fDgHhLiPjTkXl\mz3@nDoHpLqPrTsXt\uz4@vDwHxLyPzT{X|\}z5@~DH })L!P"T#X$\%}*@&D'H(L)P*T+X,\-}+@.D/H0L1P2T3X4\5},@6D7H8L9P:T;X<\=}-@>D?H@LAPBTCXD\E}.@FDGHHLIPJTKXL\M}/@NDOHPLQPRTSXT\U}0@VDWHXLYPZT[X\\]}1@^D_H`LaPbTcXd\e}2@fDgHhLiPjTkXl\m}3@nDoHpLqPrTsXt\u}4@vDwHxLyPzT{X|\}}5@~DH -`)L!P"T#X$\%`*@&D'H(L)P*T+X,\-`+@.D/H0L1P2T3X4\5`,@6D7H8L9P:T;X<\=`-@>D?H@LAPBTCXD\E`.@FDGHHLIPJTKXL\M`/@NDOHPLQPRTSXT\U`0@VDWHXLYPZT[X\\]`1@^D_H`LaPbTcXd\e`2@fDgHhLiPjTkXl\m`3@nDoHpLqPrTsXt\u`4@vDwHxLyPzT{X|\}`5@~DH c)L!P"T#X$\%c*@&D'H(L)P*T+X,\-c+@.D/H0L1P2T3X4\5c,@6D7H8L9P:T;X<\=c-@>D?H@LAPBTCXD\Ec.@FDGHHLIPJTKXL\Mc/@NDOHPLQPRTSXT\Uc0@VDWHXLYPZT[X\\]c1@^D_H`LaPbTcXd\ec2@fDgHhLiPjTkXl\mc3@nDoHpLqPrTsXt\uc4@vDwHxLyPzT{X|\}c5@~DH f)L!P"T#X$\%f*@&D'H(L)P*T+X,\-f+@.D/H0L1P2T3X4\5f,@6D7H8L9P:T;X<\=f-@>D?H@LAPBTCXD\Ef.@FDGHHLIPJTKXL\Mf/@NDOHPLQPRTSXT\Uf0@VDWHXLYPZT[X\\]f1@^D_H`LaPbTcXd\ef2@fDgHhLiPjTkXl\mf3@nDoHpLqPrTsXt\uf4@vDwHxLyPzT{X|\}f5@~DH i)L!P"T#X$\%i*@&D'H(L)P*T+X,\-i+@.D/H0L1P2T3X4\5i,@6D7H8L9P:T;X<\=i-@>D?H@LAPBTCXD\Ei.@FDGHHLIPJTKXL\Mi/@NDOHPLQPRTSXT\Ui0@VDWHXLYPZT[X\\]i1@^D_H`LaPbTcXd\ei2@fDgHhLiPjTkXl\mi3@nDoHpLqPrTsXt\ui4@vDwHxLyPzT{X|\}i5@~DH l)L!P"T#X$\%l*@&D'H(L)P*T+X,\-l+@.D/H0L1P2T3X4\5l,@6D7H8L9P:T;X<\=l-@>D?H@LAPBTCXD\El.@FDGHHLIPJTKXL\Ml/@NDOHPLQPRTSXT\Ul0@VDWHXLYPZT[X\\]l1@^D_H`LaPbTcXd\el2@fDgHhLiPjTkXl\ml3@nDoHpLqPrTsXt\ul4@vDwHxLyPzT{X|\}l5@~DH o)L!P"T#X$\%o*@&D'H(L)P*T+X,\-o+@.D/H0L1P2T3X4\5o,@6D7H8L9P:T;X<\=o-@>D?H@LAPBTCXD\Eo.@FDGHHLIPJTKXL\Mo/@NDOHPLQPRTSXT\Uo0@VDWHXLYPZT[X\\]o1@^D_H`LaPbTcXd\eo2@fDgHhLiPjTkXl\mo3@nDoHpLqPrTsXt\uo4@vDwHxLyPzT{X|\}o5@~DH r)L!P"T#X$\%r*@&D'H(L)P*T+X,\-r+@.D/H0L1P2T3X4\5r,@6D7H8L9P:T;X<\=r-@>D?H@LAPBTCXD\Er.@FDGHHLIPJTKXL\Mr/@NDOHPLQPRTSXT\Ur0@VDWHXLYPZT[X\\]r1@^D_H`LaPbTcXd\er2@fDgHhLiPjTkXl\mr3@nDoHpLqPrTsXt\ur4@vDwHxLyPzT{X|\}r5@~DH u)L!P"T#X$\%u*@&D'H(L)P*T+X,\-u+@.D/H0L1P2T3X4\5u,@6D7H8L9P:T;X<\=u-@>D?H@LAPBTCXD\Eu.@FDGHHLIPJTKXL\Mu/@NDOHPLQPRTSXT\Uu0@VDWHXLYPZT[X\\]u1@^D_H`LaPbTcXd\eu2@fDgHhLiPjTkXl\mu3@nDoHpLqPrTsXt\uu4@vDwHxLyPzT{X|\}u5@~DH x)L!P"T#X$\%x*@&D'H(L)P*T+X,\-x+@.D/H0L1P2T3X4\5x,@6D7H8L9P:T;X<\=x-@>D?H@LAPBTCXD\Ex.@FDGHHLIPJTKXL\Mx/@NDOHPLQPRTSXT\Ux0@VDWHXLYPZT[X\\]x1@^D_H`LaPbTcXd\ex2@fDgHhLiPjTkXl\mx3@nDoLxLqPsVsXt\ux4@vDwHxLyPzT{X|\}x5@~DH {)L!P"T#X$\%{*@&D'H(L)P*T+X,\-{+@.D/H0L1P2T3X4\5{,@6D7H8L9P:T;X<\={-@>D?H@LAPBTCXD\E{.@FDGHHLIPJTKXL\M{/@NDOHPLQPRTSXT\U{0@VDWHXLYPZT[X\\]{1@^D_H`LaPbTcXd\e{2@fDgHhLiPjTkXl\m{3@nDoHpLqPrTsXt\u{4@vDwHxLyPzT{X|\}{5@~DH ~)L!P"T#X$\%~*@&D'H(L)P*T+X,\-~+@.D/H0L1P2T3X4\5~,@6D7H8L9P:T;X<\=~-@>D?H@LAPBTCXD\E~.@FDGHHLIPJTKXL\M~/@NDOHPLQPRTSXT\U~0@VDWHXLYPZT[X\\]~1@^D_H`LaPbTcXd\e~2@fDgHhLiPjTkXl\m~3@nDoHpLqPrTsXt\u~4@vDwHxLyPzT{X|\}~5@~DH .a)L!P"T#X$\%a*@&D'H(L)P*T+X,\-a+@.D/H0L1P2T3X4\5a,@6D7H8L9P:T;X<\=a-@>D?H@LAPBTCXD\Ea.@FDGHHLIPJTKXL\Ma/@NDOHPLQPRTSXT\Ua0@VDWHXLYPZT[X\\]a1@^D_H`LaPbTcXd\ea2@fDgHhLiPjTkXl\ma3@nDoHpLqPrTsXt\ua4@vDwHxLyPzT{X|\}a5@~DH d)L!P"T#X$\%d*@&D'H(L)P*T+X,\-d+@.D/H0L1P2T3X4\5d,@6D7H8L9P:T;X<\=d-@>D?H@LAPBTCXD\Ed.@FDGHHLIPJTKXL\Md/@NDOHPLQPRTSXT\Ud0@VDWHXLYPZT[X\\]d1@^D_H`LaPbTcXd\ed2@fDgHhLiPjTkXl\md3@nDoHpLqPrTsXt\ud4@vDwHxLyPzT{X|\}d5@~DH g)L!P"T#X$\%g*@&D'H(L)P*T+X,\-g+@.D/H0L1P2T3X4\5g,@6D7H8L9P:T;X<\=g-@>D?H@LAPBTCXD\Eg.@FDGHHLIPJTKXL\Mg/@NDOHPLQPRTSXT\Ug0@VDWHXLYPZT[X\\]g1@^D_H`LaPbTcXd\eg2@fDgHhLiPjTkXl\mg3@nDoHpLqPrTsXt\ug4@vDwHxLyPzT{X|\}g5@~DH j)L!P"T#X$\%j*@&D'H(L)P*T+X,\-j+@.D/H0L1P2T3X4\5j,@6D7H8L9P:T;X<\=j-@>D?H@LAPBTCXD\Ej.@FDGHHLIPJTKXL\Mj/@NDOHPLQPRTSXT\Uj0@VDWHXLYPZT[X\\]j1@^D_H`LaPbTcXd\ej2@fDgHhLiPjTkXl\mj3@nDoHpLqPrTsXt\uj4@vDwHxLyPzT{X|\}j5@~DH m)L!P"T#X$\%m*@&D'H(L)P*T+X,\-m+@.D/H0L1P2T3X4\5m,@6D7H8L9P:T;X<\=m-@>D?H@LAPBTCXD\Em.@FDGHHLIPJTKXL\Mm/@NDOHPLQPRTSXT\Um0@VDWHXLYPZT[X\\]m1@^D_H`LaPbTcXd\em2@fDgHhLiPjTkXl\mm3@nDoHpLqPrTsXt\um4@vDwHxLyPzT{X|\}m5@~DH p)L!P"T#X$\%p*@&D'H(L)P*T+X,\-p+@.D/H0L1P2T3X4\5p,@6D7H8L9P:T;X<\=p-@>D?H@LAPBTCXD\Ep.@FDGHHLIPJTKXL\Mp/@NDOHPLQPRTSXT\Up0@VDWHXLYPZT[X\\]p1@^D_H`LaPbTcXd\ep2@fDgHhLiPjTkXl\mp3@nDoHpLqPrTsXt\up4@vDwHxLyPzT{X|\}p5@~DH s)L!P"T#X$\%s*@&D'H(L)P*T+X,\-s+@.D/H0L1P2T3X4\5s,@6D7H8L9P:T;X<\=s-@>D?H@LAPBTCXD\Es.@FDGHHLIPJTKXL\Ms/@NDOHPLQPRTSXT\Us0@VDWHXLYPZT[X\\]s1@^D_H`LaPbTcXd\es2@fDgHhLiPjTkXl\ms3@nDoHpLqPrTsXt\us4@vDwHxLyPzT{X|\}s5@~DH v)L!P"T#X$\%v*@&D'H(L)P*T+X,\-v+@.D/H0L1P2T3X4\5v,@6D7H8L9P:T;X<\=v-@>D?H@LAPBTCXD\Ev.@FDGHHLIPJTKXL\Mv/@NDOHPLQPRTSXT\Uv0@VDWHXLYPZT[X\\]v1@^D_H`LaPbTcXd\ev2@fDgHhLiPjTkXl\mv3@nDoHpLqPrTsXt\uv4@vDwHxLyPzT{X|\}v5@~DH y)L!P"T#X$\%y*@&D'H(L)P*T+X,\-y+@.D/H0L1P2T3X4\5y,@6D7H8L9P:T;X<\=y-@>D?H@LAPBTCXD\Ey.@FDGHHLIPJTKXL\My/@NDOHPLQPRTSXT\Uy0@VDWHXLYPZT[X\\]y1@^D_H`LaPbTcXd\ey2@fDgHhLiPjTkXl\my3@nDoHpLqPrTsXt\uy4@vDwHxLyPzT{X|\}y5@~DH |)L!P"T#X$\%|*@&D'H(L)P*T+X,\-|+@.D/H0L1P2T3X4\5|,@6D7H8L9P:T;X<\=|-@>D?H@LAPBTCXD\E|.@FDGHHLIPJTKXL\M|/@NDOHPLQPRTSXT\U|0@VDWHXLYPZT[X\\]|1@^D_H`LaPbTcXd\e|2@fDgHhLiPjTkXl\m|3@nDoHpLqPrTsXt\u|4@vDwHxLyPzT{X|\}|5@~DH )L!P"T#X$\%*@&D'H(L)P*T+X,\-+@.D/H0L1P2T3X4\5,@6D7H8L9P:T;X<\=-@>D?H@LAPBTCXD\E.@FDGHHLIPJTKXL\M/@NDOHPLQPRTSXT\U0@VDWHXLYPZT[X\\]1@^D_H`LaPbTcXd\e2@fDgHhLiPjTkXl\m3@nDoHpLqPrTsXt\u4@vDwHxLyPzT{X|\}5@~DH /b)L!P"T#X$\%b*@&D'H(L)P*T+X,\-b+@.D/H0L1P2T3X4\5b,@6D7H8L9P:T;X<\=b-@>D?H@LAPBTCXD\Eb.@FDGHHLIPJTKXL\Mb/@NDOHPLQPRTSXT\Ub0@VDWHXLYPZT[X\\]b1@^D_H`LaPbTcXd\eb2@fDgHhLiPjTkXl\mb3@nDoHpLqPrTsXt\ub4@vDwHxLyPzT{X|\}b5@~DH e)L!P"T#X$\%e*@&D'H(L)P*T+X,\-e+@.D/H0L1P2T3X4\5e,@6D7H8L9P:T;X<\=e-@>D?H@LAPBTCXD\Ee.@FDGHHLIPJTKXL\Me/@NDOHPLQPRTSXT\Ue0@VDWHXLYPZT[X\\]e1@^D_H`LaPbTcXd\ee2@fDgHhLiPjTkXl\me3@nDoHpLqPrTsXt\ue4@vDwHxLyPzT{X|\}e5@~DH h)L!P"T#X$\%h*@&D'H(L)P*T+X,\-h+@.D/H0L1P2T3X4\5h,@6D7H8L9P:T;X<\=h-@>D?H@LAPBTCXD\Eh.@FDGHHLIPJTKXL\Mh/@NDOHPLQPRTSXT\Uh0@VDWHXLYPZT[X\\]h1@^D_H`LaPbTcXd\eh2@fDgHhLiPjTkXl\mh3@nDoHpLqPrTsXt\uh4@vDwHxLyPzT{X|\}h5@~DH k)L!P"T#X$\%k*@&D'H(L)P*T+X,\-k+@.D/H0L1P2T3X4\5k,@6D7H8L9P:T;X<\=k-@>D?H@LAPBTCXD\Ek.@FDGHHLIPJTKXL\Mk/@NDOHPLQPRTSXT\Uk0@VDWHXLYPZT[X\\]k1@^D_H`LaPbTcXd\ek2@fDgHhLiPjTkXl\mk3@nDoHpLqPrTsXt\uk4@vDwHxLyPzT{X|\}k5@~DH n)L!P"T#X$\%n*@&D'H(L)P*T+X,\-n+@.D/H0L1P2T3X4\5n,@6D7H8L9P:T;X<\=n-@>D?H@LAPBTCXD\En.@FDGHHLIPJTKXL\Mn/@NDOHPLQPRTSXT\Un0@VDWHXLYPZT[X\\]n1@^D_H`LaPbTcXd\en2@fDgHhLiPjTkXl\mn3@nDoHpLqPrTsXt\un4@vDwHxLyPzT{X|\}n5@~DH q)L!P"T#X$\%q*@&D'H(L)P*T+X,\-q+@.D/H0L1P2T3X4\5q,@6D7H8L9P:T;X<\=q-@>D?H@LAPBTCXD\Eq.@FDGHHLIPJTKXL\Mq/@NDOHPLQPRTSXT\Uq0@VDWHXLYPZT[X\\]q1@^D_H`LaPbTcXd\eq2@fDgHhLiPjTkXl\mq3@nDoHpLqPrTsXt\uq4@vDwHxLyPzT{X|\}q5@~DH t)L!P"T#X$\%t*@&D'H(L)P*T+X,\-t+@.D/H0L1P2T3X4\5t,@6D7H8L9P:T;X<\=t-@>D?H@LAPBTCXD\Et.@FDGHHLIPJTKXL\Mt/@NDOHPLQPRTSXT\Ut0@VDWHXLYPZT[X\\]t1@^D_H`LaPbTcXd\et2@fDgHhLiPjTkXl\mt3@nDoHpLqPrTsXt\ut4@vDwHxLyPzT{X|\}t5@~DH#d#Dd/T + diff --git a/tests/incremental.c b/tektests/incremental.c similarity index 100% rename from tests/incremental.c rename to tektests/incremental.c diff --git a/tests/incremental.plt b/tektests/incremental.plt similarity index 100% rename from tests/incremental.plt rename to tektests/incremental.plt diff --git a/tests/incremental.png b/tests/incremental.png deleted file mode 100644 index f7c944e..0000000 Binary files a/tests/incremental.png and /dev/null differ diff --git a/tube.c b/tube.c index 1b6108c..c81af53 100755 --- a/tube.c +++ b/tube.c @@ -30,8 +30,8 @@ #define WRITE_TROUGH_INTENSITY 0.5 // green only #define NORMAL_INTENSITY 0.8 #define CURSOR_INTENSITY 0.8 -#define BRIGHT_SPOT_COLOR 1.0,1.0,1.0 -#define BRIGHT_SPOT_COLOR_HALF 0.3,0.6,0.3 +#define BRIGHT_SPOT_COLOR 1.0 +#define BRIGHT_SPOT_COLOR_HALF 0.6 #define BLACK_COLOR 0.0,0.08,0.0 // effect of flood gun #define _GNU_SOURCE @@ -76,6 +76,10 @@ int plotPointMode = 0; // plot point mode int writeThroughMode = 0; // write through mode int tube_doClearPersistent; +int specialPlotMode = 0; +int defocussed = 0; +int intensity = 100; + int tube_x0, tube_x2,tube_y0, tube_y2; static int debugCount = 0; @@ -177,7 +181,7 @@ void tube_init(int argc, char* argv[]) char *argv2[20]; size_t bufsize = 127; int firstArg = 1; - printf("tek4010 version 1.1 - branch split\n"); + printf("tek4010 version 1.2\n"); windowName = "Tektronix 4010/4014 emulator"; if ((argc<2) || (argc>19)) { printf("Error:number of arguments\n"); @@ -409,13 +413,16 @@ void tube_clearPersistent(cairo_t *cr, cairo_t *cr2) tube_y2 = tube_y0; leftmargin = 0; cairo_set_source_rgb(cr, 0, NORMAL_INTENSITY, 0); - cairo_set_source_rgb(cr2, BRIGHT_SPOT_COLOR); + cairo_set_source_rgb(cr2, BRIGHT_SPOT_COLOR, BRIGHT_SPOT_COLOR, BRIGHT_SPOT_COLOR); cairo_paint(cr2); isBrightSpot = 1; plotPointMode = 0; ltype = SOLID; xlast = 0; - ylast = 0; + ylast = 0; + specialPlotMode = 0; + defocussed = 0; + intensity = 100; } void tube_clearSecond(cairo_t *cr2) @@ -475,12 +482,12 @@ void tube_drawCharacter(cairo_t *cr, cairo_t *cr2, char ch) else { // draw the character - cairo_set_source_rgb(cr, 0, NORMAL_INTENSITY, 0); + cairo_set_source_rgb(cr, 0, (NORMAL_INTENSITY * intensity) / 100, 0); cairo_move_to(cr, tube_x0 + eoffx, windowHeight - tube_y0); cairo_show_text(cr, s); // draw the bright spot - cairo_set_source_rgb(cr2, BRIGHT_SPOT_COLOR); + cairo_set_source_rgb(cr2, BRIGHT_SPOT_COLOR, BRIGHT_SPOT_COLOR, BRIGHT_SPOT_COLOR); cairo_move_to(cr2, tube_x0 + eoffx, windowHeight - tube_y0); cairo_show_text(cr2, s); } @@ -504,7 +511,8 @@ void tube_emulateDeflectionTime() void tube_drawPoint(cairo_t *cr, cairo_t *cr2) { #define PI2 6.283185307 - cairo_set_source_rgb(cr, 0, NORMAL_INTENSITY, 0); + cairo_set_line_width (cr, 1 + defocussed); + cairo_set_source_rgb(cr, 0, (NORMAL_INTENSITY * intensity) / 100, 0); cairo_move_to(cr, tube_x2 + eoffx, windowHeight - tube_y2); cairo_line_to(cr, tube_x2 + 1 + eoffx, windowHeight - tube_y2); cairo_stroke (cr); @@ -515,10 +523,11 @@ void tube_drawPoint(cairo_t *cr, cairo_t *cr2) if (((tube_x2 - xlast) > 2) || ((xlast - tube_x2) > 2) || ((tube_y2 - ylast) > 2) || ((ylast - tube_y2) > 2)) { - // draw the bright spot, higher intensity + // draw the bright spot cairo_set_line_width (cr2, 0.1); - cairo_set_source_rgb(cr2, BRIGHT_SPOT_COLOR); - cairo_arc(cr2, tube_x2 + eoffx, windowHeight - tube_y2, 2, 0, PI2); + double bsc = (BRIGHT_SPOT_COLOR * intensity) / 100; + cairo_set_source_rgb(cr2, bsc, bsc, bsc); + cairo_arc(cr2, tube_x2 + eoffx, windowHeight - tube_y2, 2 + defocussed, 0, PI2); cairo_fill(cr2); xlast = tube_x2; @@ -549,23 +558,25 @@ void tube_drawVector(cairo_t *cr, cairo_t *cr2) else { // draw the actual vector on permanent surface - cairo_set_line_width (cr, 1); - cairo_set_source_rgb(cr, 0, NORMAL_INTENSITY, 0); + cairo_set_line_width (cr, 1 + defocussed); + cairo_set_source_rgb(cr, 0, (NORMAL_INTENSITY * intensity) / 100, 0); tube_line_type(cr, cr2, ltype); cairo_move_to(cr, tube_x0 + eoffx, windowHeight - tube_y0); cairo_line_to(cr, tube_x2 + eoffx, windowHeight - tube_y2); cairo_stroke (cr); //draw the bright spot, half intensity - cairo_set_line_width (cr2, 6); - cairo_set_source_rgb(cr2, BRIGHT_SPOT_COLOR_HALF); + cairo_set_line_width (cr2, 6 + 2 * defocussed); + double bsc = (BRIGHT_SPOT_COLOR_HALF * intensity) / 100; + cairo_set_source_rgb(cr2, bsc, bsc, bsc); cairo_move_to(cr2, tube_x0 + eoffx, windowHeight - tube_y0); cairo_line_to(cr2, tube_x2 + eoffx, windowHeight - tube_y2); cairo_stroke (cr2); // draw the bright spot, high intensity - cairo_set_line_width (cr2, 3); - cairo_set_source_rgb(cr2, BRIGHT_SPOT_COLOR); + cairo_set_line_width (cr2, 3 + 2 * defocussed); + bsc = (BRIGHT_SPOT_COLOR * intensity) / 100; + cairo_set_source_rgb(cr2, bsc, bsc, bsc); cairo_move_to(cr2, tube_x0 + eoffx, windowHeight - tube_y0); cairo_line_to(cr2, tube_x2 + eoffx, windowHeight - tube_y2); cairo_stroke(cr2); diff --git a/tube.h b/tube.h index 3329f46..bc0aeb4 100644 --- a/tube.h +++ b/tube.h @@ -20,6 +20,10 @@ extern long refreshCount; extern int showCursor; // set of cursor is shown (not set in graphics mode) extern int isBrightSpot; // set if there is currently a bright spot on the screen +extern int specialPlotMode; +extern int defocussed; +extern int intensity; + extern int plotPointMode; extern int writeThroughMode; diff --git a/versions.txt b/versions.txt index f40a1af..bff9d9f 100644 --- a/versions.txt +++ b/versions.txt @@ -1,12 +1,13 @@ -Next version t.b.b -================== +Next version t.b.d. +=================== New features -- variable character size, set with ESC sequencies, reset if screen is cleared -- incremental plot implemented +- variable character size +- incremental plot mode +- ARDS mode +- special plot mode with greyscale Bug fixes - vertical position of characters corrected - full implementation of Tektronix 4014 decoder -Appearance: Version 1.1 April 12, 2019 ==========================