Vågformsgrafik
Vågformsgrafik är ett enkelt vektorgrafiksystem som introducerades av Digital Equipment Corporation (DEC) på terminalerna VT55 och VT105 i mitten av 1970-talet. Den användes för att producera grafik från stordatorer och minidatorer . DEC använde termen "vågformsgrafik" för att specifikt referera till hårdvaran, men den användes mer allmänt för att beskriva hela systemet.
Systemet utformades för att använda så lite datorminne som möjligt. Vid vilken given X-plats som helst kunde den rita två punkter på givna Y-platser, vilket gör den lämplig för att producera två överlagrade vågformer , linjediagram eller histogram . Text och grafik kunde blandas, och det fanns ytterligare verktyg för att rita yxor och markörer.
Vågformsgrafiksystemet användes endast under en kort tidsperiod innan det ersattes av det mer sofistikerade ReGIS- systemet, som först introducerades på VT125 1981. ReGIS tillät konstruktion av godtyckliga vektorer och andra former. Medan DEC normalt gav en bakåtkompatibel lösning i nyare terminalmodeller, valde de inte att göra detta när ReGIS introducerades, och vågformsgrafik försvann från senare terminaler.
Beskrivning
Vågformsgrafik introducerades på VT55-terminalen i oktober 1975, en era då minnet var extremt dyrt. Även om det var tekniskt möjligt att producera en bitmappsskärm med hjälp av en rambuffert med hjälp av tidens teknologi, var minnet som behövdes för att göra det med en rimlig upplösning vanligtvis över det pris som gjorde det praktiskt. Alla typer av system användes för att ersätta datorminne med andra koncept, som lagringsrören som används i Tektronix 4010- terminalerna, eller nollminne racing-the-beam-systemet som används i Atari 2600 . DEC valde att attackera detta problem genom en smart användning av en liten buffert som endast representerar de vertikala positionerna på skärmen. Ett sådant system kunde inte rita godtyckliga former, men skulle tillåta visning av grafdata.
Systemet var baserat på en skärm med 512 x 236 pixlar, som producerade 512 vertikala kolumner längs X-axeln och 236 horisontella rader på Y-axeln. Y-platser räknades upp från botten, så koordinaten 0,0 låg nere till vänster och 511, 235 uppe till höger. Hade detta implementerats med en rambuffert med varje plats representerad av en enda bit, skulle 512 ⨉ 236 x 1 = 120 832 bitar, eller 15 104 byte, ha krävts. På den tiden kostade minnet cirka 50 USD per kilobyte, så enbart bufferten skulle kosta över 700 USD, motsvarande 3 846 USD 2021.
Istället använde det grafiska vågformssystemet en byte minne för varje X-axelposition, där bytens värde representerade Y-platsen. Detta krävde endast 512 byte för varje graf, totalt 1024 byte för de två graferna. Att rita en linje krävde att programmeraren konstruerade en serie Y-platser och skickade dem som individuella punkter, terminalen kunde inte koppla ihop prickarna själv. För att göra detta enklare ökade terminalen automatiskt X-platsen varje gång en Y-koordinat togs emot, så en graflinje kunde skickas som en lång sträng med nummer för efterföljande Y-platser istället för att behöva skicka X-platsen upprepade gånger varje gång. Ritningen startade normalt med att skicka en enda instruktion för att ställa in den initiala X-platsen, ofta 0 till vänster, och sedan skicka in data för hela kurvan.
Systemet inkluderade även lagring för upp till 512 markörer på båda linjerna. Dessa ritades alltid centrerade på Y-värdet på linjen de var associerade med, vilket innebär att en enkel på/av-indikation för X-platser var allt som behövdes, och krävde endast 1024 bitar, eller 128 byte, totalt. Markörerna sträckte sig 16 pixlar vertikalt och kunde bara justeras på 16-pixelgränser, så de var inte nödvändigtvis centrerade över den underliggande grafen. Markörer användes för att indikera viktiga punkter på grafen, där en symbol av något slag normalt skulle användas. Systemet gjorde det också möjligt att rita en vertikal linje för varje horisontell plats och en horisontell vid varje vertikal plats. Dessa lagrades också som enkla på/av-bitar, som kräver ytterligare 128 byte minne. Dessa linjer användes för att rita yxor och skala linjer, eller kunde användas för en skärmövergripande hårkorsmarkör. En separat uppsättning av två 7-bitars register innehöll ytterligare information om ritstilen och andra inställningar.
Även om det var komplext ur användarens perspektiv, var detta system lätt att implementera i hårdvara. Ett katodstrålerör producerar en bildskärm genom att skanna skärmen i en serie horisontella rörelser, och röra sig ner en vertikal linje efter varje horisontell skanning. Vid varje givet ögonblick under denna process undersöker displayhårdvaran några minnesplatser för att se om något behöver visas. Till exempel kan den avgöra om en markör ska ritas på graf 0 genom att undersöka register 1 för att se om markörer är påslagna, titta i markörbufferten för att se om det finns en 1 vid den aktuella X-platsen och sedan undersöka Y-platsen av graf 0 för att se om den är inom 16 pixlar från den aktuella skanningslinjen. Om alla dessa är sanna, dras en fläck för att presentera den delen av markören. Eftersom detta kommer att vara sant för 16 vertikala platser under skanningsprocessen, kommer en 16-pixel hög markör att ritas.
VT55 såldes ensam och kostade 2 496 USD, motsvarande 13 715 USD 2021. Liksom andra modeller i VT50-serien kunde terminalen utrustas med en valfri våtpappersskrivare i en panel till höger på skärmen. Detta lade till 800 USD motsvarande 4 396 USD 2021 till priset.
DEC erbjöd också VT55 i ett paket med en liten modell av PDP-11 för att skapa en modell av DEClab 11/03-systemet. DEClab såldes normalt för 14 000 USD, motsvarande 76 924 USD 2021 med en DECwriter II (LA36) pappersterminal för 15 000 USD, motsvarande 76 924 USD 2021, med VT55. Systemet hade I/O-kanaler för upp till 15 labbenheter och inkluderade bibliotek för FORTRAN och BASIC för att läsa data och skapa grafer. Den ganska omfattande VT55 Programmers Manual täckte det senare på djupet.
Kommandon och data
Data skickades till terminalen med hjälp av en utökad uppsättning koder liknande de som introducerades på VT52 . VT52-koder började i allmänhet med ESC- tecknet (oktalt 33, decimal 27) och följdes sedan av en enbokstavsinstruktion. Till exempel skulle strängen med fyra tecken ESC H ESC J flytta markören i det övre vänstra hörnet (hem) och sedan rensa skärmen från den punkten och nedåt. Dessa koder var i princip modelllösa ; utlöst av ESC avslutade det resulterande escape-läget automatiskt igen när kommandot var klart. Escape-koder kan varvas med visningstext var som helst i dataströmmen.
Däremot var grafiksystemet helt modalt, med escape-sekvenser som skickades för att få terminalen att gå in i eller lämna grafritningsläget . Data som skickades mellan dessa två koder tolkades av grafikhårdvaran, så text och grafik kunde inte blandas i en enda ström av instruktioner. Grafikläget gick in genom att skicka strängen ESC 1 och avslutades igen med strängen ESC 2 . Även kommandona inom grafikläget var modala; tecken tolkades som ytterligare data för det föregående laddningstecken (kommandot) tills ett annat laddningstecken ses. Tio laddningstecken var tillgängliga:
@ - ingen operation, används för att tala om för terminalen att det sista kommandot inte längre är aktivt A - ladda data i register 0, välj ritningsläge för de två graferna I - ladda data i register 1, välj andra ritningsalternativ H - ladda start X-position (horisontell) för följande kommandon B - ladda data för Y-positioner för graf 0 med början vid den tidigare valda H-positionen J - ladda data för Y-positioner för graf 1 med start vid den tidigare valda H-positionen C - lagra en markör på grafen 0 vid följande X-plats K - lagra en markör på graf 1 på följande X-plats D - rita en horisontell linje vid den givna Y-platsen L - rita en vertikal linje vid den givna X-platsen
X- och Y-platser skickades som 10-bitars decimaltal, kodade som ASCII- tecken, med 5 bitar per tecken. Detta innebär att vilket nummer som helst inom 1024-nummerutrymmet (2 10 ) kan lagras som en sträng med två tecken. För att säkerställa att tecknen kan överföras över 7-bitarslänkar placeras mönstret 01 framför båda 5-bitarsnumren, vilket ger 7-bitars ASCII-värden som alltid ligger inom det utskrivbara området. Detta resulterar i en något komplex kodningsalgoritm.
Till exempel, om man vill koda decimalvärdet 102, konverterar du först det till 10-bitars decimalmönstret 0010010010. Det delas sedan upp i övre och nedre 5-bitars delar, 00100 och 10010. Lägg sedan till 01 binär för att producera 7-bitars siffror 0100100 och 0110010. Konvertera individuellt tillbaka till decimal 40 och 50 och slå sedan upp dessa tecken i ett ASCII-diagram, hitta ( och 2. Dessa måste skickas till terminalens minst signifikanta tecken först. Om dessa skulle vara används för att ställa in X-koordinaten, skulle hela strängen vara H 2 ( . När den används som X- och Y-platser för graferna ignorerades extra siffror. Till exempel kräver X-axeln med 512 pixlar bara 9 bitar att koda, så den 10:e bit ignorerades. Likaså ignorerade Y-platser den 9:e och 10:e biten.
Kontrollregister innehöll alltid 7 bitar, där de mest signifikanta bitarna alltid var 01. I register noll slog bit 0 (minst signifikant) på eller av hela linjeritningssystemet. Bit 1 och 2 aktiverade eller avaktiverade de individuella graferna 0 eller 1, och bitarna 3 och 4 styrde om graferna 0 och 1 var linjer eller ifyllda för att göra histogram. Till exempel, om man vill ha båda graferna på skärmen, men graf 0 skulle vara ett histogram och graf 1 skulle vara en linje, skulle det erforderliga bitmönstret vara 0101111, den inledande 01:an är fixerad, nästa bit som säger graf 1 är en linje (0), nästa att graf 0 är ett histogram (1), att båda graferna är på (11) och att hela grafiksystemet är aktiverat (1). Det resulterande mönstret motsvarar decimal 47, tecknet /. Detta läge skulle vara aktiverat med strängen A / .
0 I-registret laddades med liknande kodning, men bitarna styrde visningen av markörer och de horisontella och vertikala linjerna. Som med A var de mest signifikanta bitarna alltid 01, den minst signifikanta biten aktiverad eller avstängd horisontella linjer, bit 1 samma för vertikala, 2 och 3 oavsett om markörer ska visas på graf 0 respektive 1, och inställning av bit 5 skulle rensa ut all data för markörerna och linjerna. Det innebar att man kunde rensa displayen genom att skicka bitmönstret 0110000, decimal 48, tecknet 0. Detta ger det lättläsliga kommandot I .
Markörer och linjer krävde endast en koordinat för att skickas, ett X eller Y. När det gäller en markör definierades Y-platsen av data som tidigare ställts in med B eller J. För linjer sträckte sig den andra koordinaten över skärmen. Till exempel skulle en vertikal linje kunna placeras vid plats 102 på X-axeln med strängen L2 ( . Både markörer och linjer skulle kunna rensas genom att sätta bit 5 av det tredje tecknet, som annars skulle vara oanvänt .
Exempel
Följande exempel ger en enkel grafik:
ESC1A'I?B1111111111111111H (J6666666666666666C$09K$8D+723L 0?? 8
De första två tecknen talar om för terminalen att gå in i grafikläge, medan de nästa fyra ställer in de två ritlägesregistren för att aktivera båda graflinjerna, markörer på båda och möjliggöra horisontella och vertikala linjer. B följt av strängen med 1:or ger en horisontell linje på 8 pixlar längst ner till vänster på skärmen ritad med graf 0. X-platsen börjar på standardplatsen 0 och flyttar sig över en plats med varje efterföljande datapunkt, vilket alltid består av två tecken. Det finns ingen anledning att skriva in B igen, strängen är modal och det aktuella kommandot förblir B tills ett annat påträffas.
Det inträffar när H påträffas, och följande två tecken används för att flytta start X-platsen till mitten av skärmen. Detta följs av att ett andra linjesegment ritas i diagram 1 med J. Två markörer läggs sedan till, en på varje linje, centrerade längs segmenten. Linjesegmenten är 16 pixlar breda och markörerna är alltid 16 höga. Resultatet är korsformer, en nere till vänster och en annan centrerad. Eftersom markörerna är centrerade på 16-pixelgränser och inte kan ritas utanför det synliga området, kommer den första markören på det nedre segmentet att visas ovanför linjen, vilket skapar en upp och nervänd T-form snarare än ett kors. De två sista kommandona, D och L, ger två horisontella linjer längst ned och i mitten av skärmen, och tre vertikala linjer till vänster, mitten och höger.
Vid denna tidpunkt är terminalen fortfarande i grafritningsläge. Man skulle kunna förvandla graf 1 till ett histogram genom att skicka A7
, vilket gör att en vertikal stapel ritas ned från mitten av skärmen. Att skicka ESC2
skulle avsluta grafikläget, då ytterligare tecken tolkas som normal text.
VT105 ändras
VT105 liknade i stort sett VT55, men lade till ett antal ytterligare funktioner. Det ena var ett fyrkantigt formatläge som minskade displayen horisontellt med åtta teckenbredder och utökade den vertikalt med en linje för att göra den mer kvadratisk än den ursprungliga layouten. Detta lämnade ytterligare utrymme till vänster för åtta tecken istället för en enda vertikal kolumn, vilket förbättrade etikettvisningen. VT105 ändrade också betydelsen av register 0:s bitar något; bit 1 och 2 slog inte längre på och av hela grafen, utan visningen av grafen pekar själva. Detta gjorde det möjligt för skärmen att göra en linje, ett skuggat histogram eller ett histogram med en ljusare linje ovanpå. Som jämförelse, på VT55 styrde grafbiten visningen av hela datamängden, inte bara själva linjen, så att stänga av grafbiten skulle också få histogrammet att försvinna.
En annan förändring var att återanvända @-kommandot, tidigare noop
, för att tillåta en ny Y-position att skickas in som skuggalinjen . Detta fungerade tillsammans med histogrammet för att tillåta riktningen på fyllningen att ändras. På VT55 drogs fyllningen alltid ner från grafen till basen av displayen, på VT105 med skugglinjen inställd, kan detta ställas in för att dra upp till toppen av skärmen, eller mer vanligt, mot en mittpunkt i datan. Till exempel, med skugglinjen inställd på mitten av skärmen, om en sinusvåg plottades skulle områdena ovanför mitten skuggas nedåt och sektionerna under mitten uppåt, vilket ger en ifylld vågform. Aktivering av en horisontell linje vid samma punkt lägger till en visuell baslinje. Det fanns två skugglinjer i minnet, en för varje graf, men bara ett @-kommando. En bit i register 1 styrde vilken av de två buffertarna @-datan laddades in i.
Ett annat stort tillägg var konceptet med strip graphs , ett läge som emulerade papperspennor som rörde sig upp och ner medan papperet lindades under dem. Dessa användes ofta för att registrera vetenskapliga data, men är kanske mest kända på äldre lögndetektorer . När nya datapunkter lades till i en av graferna flyttades tidigare data åt vänster. Att skicka en serie Y-värden med hjälp av B eller J skulle alltså först göra att linjen dras från vänster till höger som VT55, men ytterligare datapunkter skulle trycka tidigare data åt vänster. Om markörer eller vertikala axellinjer sattes, skjuts även de över efter data. I läge med dubbla remsor gjorde att data lades till i diagram 1 att båda graferna flyttades över samtidigt.
Alla dessa nya funktioner styrdes genom valfria andra tecken som lades till i A- och I-kommandona. Det första datatecknet fungerade som det hade under VT55 och gav därmed bakåtkompatibilitet. Den andra slog på de nya funktionerna. Det andra tecknet skickas till A-kontrollerade skugglinjer och remsdiagram-funktionen; minst signifikanta bit, bit 0, ställer in skugglinjedata som skickas med @ för att laddas in i graf 0 eller graf 1, medan bit 2 och 3 aktiverade eller avaktiverade skuggalinjen för graf 0 respektive 1. Genom att slå på bit 3 kunde remsdiagram användas, medan bit 4 aktiverade det för båda graferna, funktionen med dubbla remsor. Det andra tecknet på I-kommandot hade bara två värden, ! eller utrymme; skickar! sätt terminalen i kvadratiskt läge, medan utrymme, eller ingenting, lämnade den i det VT55-kompatibla rektangelformatet.
Andra detaljer
VT50-serien inkluderade också en alternativ teckenuppsättning, grafikläge , som kunde växlas in och ut i textläge. Dessa användes för att tillhandahålla ytterligare glyfer användbara för märkning och liknande uppgifter. Bland tecknen fanns nedsänkta 0 till 9 och den övre delen av bråk 1/, 2/, 3/, 5/ och 7/. Dessa kan kombineras till t.ex. 3 ⁄ 7 . Uppsättningen inkluderade också horisontella streck vid var och en av de 8 skanningslinjerna i en normal glyf, gradsymbolen och andra vanliga exempel. Dessa använde separata teckenkoder, så att grafiktecken kunde blandas med den normala teckenuppsättningen på en enda skärm.
Anteckningar
Citat
Bibliografi
- VT55 DECgraphic Scope Användarmanual (PDF) . Digital. December 1976.
- VT105 Grafisk terminal teknisk handbok (PDF) . Digital. september 1979.