Grafika fali

Grafika falowa była ograniczona, ale nadal mogła generować użyteczne dane wyjściowe, gdy była używana w połączeniu z programami takimi jak gnuplot .

Grafika Waveform to prosty system grafiki wektorowej wprowadzony przez firmę Digital Equipment Corporation (DEC) w terminalach VT55 i VT105 w połowie lat siedemdziesiątych. Był używany do tworzenia grafiki wyjściowej z typu mainframe i minikomputerów . DEC użył terminu „grafika falowa” w odniesieniu konkretnie do sprzętu, ale użyto go bardziej ogólnie do opisania całego systemu.

System został zaprojektowany tak, aby zużywał jak najmniej pamięci komputera . W dowolnej lokalizacji X może narysować dwie kropki w określonych lokalizacjach Y, dzięki czemu nadaje się do tworzenia dwóch nałożonych na siebie przebiegów , wykresów liniowych lub histogramów . Można było mieszać tekst i grafikę, były też dodatkowe narzędzia do rysowania osi i znaczników.

System grafiki falowej był używany tylko przez krótki czas, zanim został zastąpiony bardziej wyrafinowanym systemem ReGIS , wprowadzonym po raz pierwszy na VT125 w 1981 r. ReGIS umożliwił konstruowanie dowolnych wektorów i innych kształtów. Podczas gdy DEC zwykle zapewniał rozwiązanie kompatybilne wstecz w nowszych modelach terminali, nie zdecydował się na to, gdy wprowadzono ReGIS, a grafika falowa zniknęła z późniejszych terminali.

Opis

Grafika Waveform została wprowadzona na terminalu VT55 w październiku 1975 r., w czasach, gdy pamięć była niezwykle droga. Chociaż technicznie możliwe było wyprodukowanie bitmapowego przy użyciu bufora ramki przy użyciu technologii tamtej epoki, pamięć potrzebna do tego w rozsądnej rozdzielczości była zwykle poza ceną, która czyniła to praktycznym. Do zastąpienia pamięci komputera innymi koncepcjami stosowano wszelkiego rodzaju systemy, takie jak tuby do przechowywania używane w terminalach Tektronix 4010 lub system wyścigów wiązek pamięci o zerowej pamięci używany w Atari 2600 . DEC postanowił zaatakować ten problem poprzez sprytne użycie małego bufora reprezentującego tylko pionowe pozycje na ekranie. Taki system nie mógłby rysować dowolnych kształtów, ale umożliwiałby wyświetlanie danych wykresu.

System był oparty na wyświetlaczu o wymiarach 512 na 236 pikseli, tworzącym 512 pionowych kolumn wzdłuż osi X i 236 poziomych rzędów na osi Y. Lokalizacje Y były liczone od dołu, więc współrzędna 0,0 znajdowała się w lewym dolnym rogu, a 511, 235 w prawym górnym rogu. Gdyby zostało to zaimplementowane przy użyciu bufora ramki z każdą lokalizacją reprezentowaną przez pojedynczy bit, wymagane byłoby 512 ⨉ 236 x 1 = 120 832 bitów, czyli 15 104 bajtów. W tamtym czasie pamięć kosztowała około 50 USD za kilobajt, więc sam bufor kosztowałby ponad 700 USD, co odpowiada 3846 USD w 2021 r.

Zamiast tego system grafiki falowej używał jednego bajtu pamięci dla każdej lokalizacji osi X, przy czym wartość bajtu reprezentuje lokalizację Y. Wymagało to tylko 512 bajtów dla każdego wykresu, łącznie 1024 bajtów dla dwóch wykresów. Narysowanie linii wymagało od programisty skonstruowania szeregu lokalizacji Y i wysłania ich jako pojedynczych punktów, terminal nie mógł sam połączyć kropek. Aby to ułatwić, terminal automatycznie zwiększał lokalizację X za każdym razem, gdy odbierana była współrzędna Y, więc linia wykresu mogła być wysyłana jako długi ciąg liczb dla kolejnych lokalizacji Y zamiast konieczności wielokrotnego wysyłania lokalizacji X za każdym razem. Rysowanie zwykle rozpoczynało się od wysłania pojedynczej instrukcji, aby ustawić początkowe położenie X, często 0 po lewej stronie, a następnie wysłanie danych dla całej krzywej.

System obejmował również przechowywanie do 512 znaczników na obu liniach. Zawsze były one rysowane pośrodku wartości Y linii, z którą były powiązane, co oznaczało, że wystarczyło proste wskazanie włączenia/wyłączenia dla lokalizacji X, co wymagało łącznie tylko 1024 bitów, czyli 128 bajtów. Znaczniki rozciągały się na 16 pikseli w pionie i można je było wyrównać tylko na granicach 16 pikseli, więc niekoniecznie były wyśrodkowane na leżącym poniżej wykresie. Znaczniki zostały użyte do wskazania ważnych punktów na wykresie, gdzie normalnie byłby używany jakiś symbol. System umożliwił również narysowanie linii pionowej dla każdej lokalizacji poziomej i poziomej dla każdej lokalizacji pionowej. Były one również przechowywane jako proste bity włączania / wyłączania, wymagające kolejnych 128 bajtów pamięci. Linie te były używane do rysowania osi i linii skali lub mogły być używane jako kursor celownika rozciągający się na ekran. Oddzielny zestaw dwóch 7-bitowych rejestry zawierały dodatkowe informacje o stylu rysowania i innych ustawieniach.

Chociaż złożony z punktu widzenia użytkownika, system ten był łatwy do wdrożenia sprzętowego. Kineskop wytwarza obraz, skanując ekran serią poziomych ruchów, przesuwając się w dół o jedną linię pionową po każdym skanowaniu poziomym . W dowolnym momencie podczas tego procesu sprzęt wyświetlający sprawdza kilka lokalizacji pamięci, aby sprawdzić, czy coś wymaga wyświetlenia. Na przykład może określić, czy narysować znacznik na wykresie 0, sprawdzając rejestr 1, aby zobaczyć, czy znaczniki są włączone, sprawdzając w buforze znaczników, czy w bieżącej lokalizacji X znajduje się 1, a następnie sprawdzając lokalizację Y wykresu 0, aby sprawdzić, czy znajduje się on w odległości 16 pikseli od bieżącej linii skanowania. Jeśli wszystkie z nich są prawdziwe, rysowane jest miejsce, aby przedstawić tę część znacznika. Ponieważ będzie to prawdą dla 16 pionowych lokalizacji podczas procesu skanowania, zostanie narysowany znacznik o wysokości 16 pikseli.

Sprzedawany sam VT55 kosztował 2496 USD, co odpowiada 13 715 USD w 2021 r. Podobnie jak inne modele z serii VT50, terminal można było wyposażyć w opcjonalną drukarkę do mokrego papieru w panelu po prawej stronie ekranu. To dodało do ceny 800 USD, co odpowiada 4396 USD w 2021 r.

DEC oferował również VT55 w pakiecie z małym modelem PDP -11 do stworzenia jednego modelu systemu DEClab 11/03. DEClab zwykle sprzedawano za 14 000 USD, co odpowiada 76 924 USD w 2021 r. Z terminalem do kopiowania DECwriter II (LA36) za 15 000 USD, co odpowiada 76 924 USD w 2021 r., Z VT55. System posiadał kanały wejścia/wyjścia dla maksymalnie 15 urządzeń laboratoryjnych oraz zawierał biblioteki FORTRAN i BASIC do odczytu danych i tworzenia wykresów. Dość obszerny Podręcznik programistów VT55 szczegółowo omówił ten ostatni.

Polecenia i dane

Tryb histogramu wypełnia obszar pod krzywą. Ten przykład ilustruje, dlaczego system został nazwany grafiką falową.

Dane przesyłano do terminala przy użyciu rozszerzonego zestawu kodów, podobnego do tych wprowadzonych w VT52 . Kody VT52 na ogół zaczynały się od ESC (33 ósemkowe, 27 dziesiętne), po których następowała pojedyncza instrukcja. Na przykład ciąg czterech znaków ESC H ESC J spowoduje zmianę położenia kursora w lewym górnym rogu (home), a następnie wyczyszczenie ekranu od tego punktu w dół. Kody te były w zasadzie niemodalne ; wyzwalany przez ESC wynikowy tryb ucieczki automatycznie zakończył się ponownie, gdy polecenie zostało zakończone. Kody ucieczki mogą być przeplatane wyświetlanym tekstem w dowolnym miejscu strumienia danych.

W przeciwieństwie do tego system graficzny był całkowicie modalny, z wysyłanymi sekwencjami specjalnymi , aby spowodować przejście terminala do trybu rysowania wykresów lub wyjście z niego . Dane przesyłane między tymi dwoma kodami były interpretowane przez sprzęt graficzny, więc tekstu i grafiki nie można było mieszać w jednym strumieniu instrukcji. Tryb graficzny został wprowadzony przez wysłanie ciągu znaków ESC 1 i ponownie wyszedł z ciągu znaków ESC 2 . Nawet polecenia w trybie graficznym były modalne; znaki zostały zinterpretowane jako dodatkowe dane do poprzedniego znaku ładowania (polecenie), aż pojawi się inny znak ładowania. Dostępnych było dziesięć znaków ładowania:

 @ - brak operacji, używany do poinformowania terminala, że ​​ostatnie polecenie nie jest już aktywne A - załadowanie danych do rejestru 0, wybór trybu rysowania dla dwóch wykresów I - załadowanie danych do rejestru 1, wybór innych opcji rysowania H - załadowanie  początkowego  Pozycja X (pozioma) dla następujących poleceń B - wczytaj dane dla lokalizacji Y dla wykresu 0 zaczynając od wybranej wcześniej pozycji H J - załaduj dane dla lokalizacji Y dla wykresu 1 zaczynając od wybranej wcześniej pozycji H C - zapisz znacznik na wykresie 0 w kolejnym miejscu X K - zapisz znacznik na wykresie 1 w kolejnym miejscu X D - narysuj linię poziomą w danym miejscu Y L - narysuj linię pionową w podanym miejscu X 

Lokalizacje X i Y zostały przesłane jako 10-bitowe liczby dziesiętne, zakodowane jako znaki ASCII , z 5 bitami na znak. Oznacza to, że dowolna liczba w przestrzeni liczbowej 1024 (2 10 ) może być przechowywana jako ciąg dwóch znaków. Aby zapewnić, że znaki mogą być przesyłane przez 7-bitowe łącza, wzorzec 01 jest umieszczany przed obiema 5-bitowymi liczbami, tworząc 7-bitowe wartości ASCII, które zawsze mieszczą się w możliwym do wydrukowania zakresie. Powoduje to nieco skomplikowany algorytm kodowania.

Na przykład, jeśli ktoś chciał zakodować wartość dziesiętną 102, najpierw przekonwertował ją na 10-bitowy wzór dziesiętny 0010010010. To jest następnie podzielony na górną i dolną 5-bitową część, 00100 i 10010. Następnie dołącz binarny 01, aby utworzyć 7-bitowe liczby 0100100 i 0110010. Indywidualnie przekonwertuj z powrotem na dziesiętne 40 i 50, a następnie wyszukaj te znaki na wykresie ASCII, znajdując ( i 2. Należy je najpierw przesłać do terminala jako najmniej znaczący znak. Gdyby były użyty do ustawienia współrzędnej X, cały łańcuch będzie miał postać H 2 ( . Gdy były używane jako lokalizacje X i Y dla wykresów, dodatkowe cyfry były ignorowane. Na przykład oś X o 512 pikselach wymaga tylko 9 bitów do zakodowania, więc dziesiąty bit został zignorowany. Podobnie lokalizacje Y ignorowały dziewiąty i dziesiąty bit.

Rejestry kontrolne zawsze zawierały 7 bitów, przy czym najbardziej znaczącym bitem był zawsze 01. W rejestrze zerowym bit 0 (najmniej znaczący) włączał lub wyłączał cały system rysowania linii. Bity 1 i 2 włączały lub wyłączały poszczególne wykresy 0 lub 1, a bity 3 i 4 kontrolowały, czy wykresy 0 i 1 były liniami, czy też były wypełnione w celu utworzenia histogramów. Na przykład, jeśli ktoś chciałby mieć oba wykresy na ekranie, ale wykres 0 byłby histogramem, a wykres 1 byłby linią, wymagany wzór bitowy to 0101111, wiodące 01 jest ustalone, następny bit mówiący o wykresie 1 to linię (0), następną, że wykres 0 to histogram (1), że oba wykresy są włączone (11) i że cały system graficzny jest włączony (1). Otrzymany wzorzec jest odpowiednikiem dziesiętnej liczby 47, znaku /. Ten tryb byłby włączony za pomocą ciągu A / .

0 Rejestr I został załadowany przy użyciu podobnego kodowania, ale bity kontrolowały wyświetlanie znaczników oraz linii poziomych i pionowych. Podobnie jak w przypadku A, najbardziej znaczącymi bitami były zawsze 01, najmniej znaczący bit włączał lub wyłączał linie poziome, bit 1 taki sam dla pionowych, 2 i 3, czy wyświetlać znaczniki odpowiednio na wykresie 0 lub 1, oraz ustawianie bitu 5 usunie wszystkie dane dla znaczników i linii. Oznaczało to, że można było wyczyścić wyświetlacz, wysyłając wzór bitowy 0110000, dziesiętne 48, znak 0. W ten sposób powstaje łatwe do odczytania polecenie I .

Znaczniki i linie wymagały wysłania tylko jednej współrzędnej, X lub Y. W przypadku znacznika położenie Y było definiowane przez dane ustawione wcześniej za pomocą B lub J. W przypadku linii druga współrzędna obejmowała ekran. Na przykład pionowa linia mogłaby zostać umieszczona w miejscu 102 na osi X za pomocą łańcucha L2 ( . Zarówno znaczniki, jak i linie mogłyby zostać wyczyszczone przez ustawienie bitu 5 trzeciego znaku, który w przeciwnym razie byłby nieużywany.

Przykład

Poniższy przykład tworzy prostą grafikę:

ESC1A'I?B1111111111111111H (J6666666666666666C$09K$8D+723L 0?? 8

Pierwsze dwa znaki informują terminal, aby wszedł w tryb graficzny, podczas gdy kolejne cztery ustawiają dwa rejestry trybu rysowania, aby włączyć obie linie wykresu, znaczniki na obu oraz włączyć linie poziome i pionowe. B, po którym następuje ciąg 1, tworzy 8-pikselową poziomą linię w lewym dolnym rogu ekranu, narysowaną za pomocą wykresu 0. Lokalizacja X rozpoczyna się w domyślnej lokalizacji 0 i przesuwa się o jedną lokalizację z każdym kolejnym punktem danych, co zawsze składa się z dwóch znaków. Nie ma potrzeby ponownego wpisywania B, łańcuch jest modalny, a bieżące polecenie pozostaje B, dopóki nie zostanie napotkane inne.

Dzieje się tak, gdy napotkana jest litera H, a następujące dwa znaki są używane do przesunięcia początkowej lokalizacji X na środek ekranu. Następnie drugi odcinek linii jest rysowany na wykresie 1 za pomocą J. Następnie dodaje się dwa znaczniki, po jednym na każdej linii, wyśrodkowane wzdłuż segmentów. Segmenty linii mają szerokość 16 pikseli, a znaczniki mają zawsze wysokość 16 pikseli. Rezultatem są kształty krzyży, jeden w lewym dolnym rogu, a drugi w środku. Ponieważ znaczniki są wyśrodkowane na 16-pikselowych granicach i nie można ich narysować poza widocznym obszarem, pierwszy znacznik na dolnym segmencie pojawi się nad linią, tworząc kształt odwróconej litery T zamiast krzyża. Ostatnie dwa polecenia, D i L, tworzą dwie poziome linie u dołu i na środku ekranu oraz trzy pionowe linie po lewej, na środku i po prawej stronie.

W tym momencie terminal jest nadal w trybie rysowania wykresów. Można zamienić wykres 1 w histogram, wysyłając A7 , powodując narysowanie pionowego paska rozciągającego się w dół od środka ekranu. Wysłanie ESC2 spowodowałoby wyjście z trybu graficznego, w którym to momencie dalsze znaki są interpretowane jako normalny tekst.

Zmiany VT105

VT105 był zasadniczo podobny do VT55, ale dodał szereg dodatkowych funkcji. Jednym z nich był formatu kwadratowego , który zmniejszał wyświetlacz w poziomie o osiem szerokości znaków i wydłużał go w pionie o jedną linię, aby był bardziej kwadratowy niż oryginalny układ. To pozostawiło dodatkowe miejsce po lewej stronie na osiem znaków zamiast jednej pionowej kolumny, poprawiając wyświetlanie etykiet. VT105 również nieznacznie zmienił znaczenie bitów rejestru 0; bity 1 i 2 nie włączały już i nie wyłączały całego wykresu, ale wyświetlanie samych punktów wykresu. Dzięki temu wyświetlacz mógł utworzyć linię, zacieniony histogram lub histogram z jaśniejszą linią na górze. Dla porównania, w VT55 bit wykresu sterował wyświetlaniem całego zestawu danych, a nie tylko samej linii, więc wyłączenie bitu wykresu spowodowałoby również zniknięcie histogramu.

Kolejną zmianą było ponowne użycie polecenia @ , dawniej noop , aby umożliwić wysłanie nowej pozycji Y jako linii cienia . Działało to w połączeniu z histogramem, umożliwiając zmianę kierunku wypełnienia. W VT55 wypełnienie zawsze rysowało się od wykresu do podstawy wyświetlacza, w VT105 z ustawioną linią cieniowania można to ustawić tak, aby było rysowane do góry ekranu lub częściej w kierunku punktu środkowego w danych. Na przykład z linią cienia ustawioną na środek ekranu, jeśli jest to sinusoida został wykreślony, obszary powyżej środka byłyby zacienione w dół, a sekcje poniżej środka w górę, tworząc wypełniony przebieg. Włączenie linii poziomej w tym samym punkcie dodaje wizualną linię bazową. W pamięci były dwie linie cieni, po jednej dla każdego wykresu, ale tylko jedno polecenie @. Bit w rejestrze 1 kontrolował, do którego z dwóch buforów ładowane są dane @.

Innym ważnym dodatkiem była koncepcja wykresów paskowych , tryb emulujący papierowe plotery pisakowe, które poruszały się w górę iw dół, gdy papier był pod nimi nawijany. Były one powszechnie używane do rejestrowania danych naukowych, ale prawdopodobnie najlepiej znane są ze starszych wykrywaczy kłamstw . W miarę dodawania nowych punktów danych do jednego z wykresów poprzednie dane były przesuwane w lewo. Zatem wysłanie serii wartości Y za pomocą B lub J spowodowałoby najpierw narysowanie linii od lewej do prawej, jak w przypadku VT55, ale dodatkowe punkty danych przesunęłyby poprzednie dane w lewo. Jeśli ustawiono znaczniki lub pionowe linie osi, one również zostały przesunięte, podążając za danymi. W tryb podwójnego paska , dodanie danych do wykresu 1 spowodowało jednoczesne przesunięcie obu wykresów.

Wszystkie te nowe funkcje były kontrolowane za pomocą opcjonalnych drugich znaków dodanych do poleceń A i I. Pierwszy znak danych działał tak, jak w VT55, zapewniając w ten sposób kompatybilność wsteczną. Drugi włączył nowe funkcje. Drugi znak wysłany do kontrolowanych linii cieniowania i funkcji wykresu paskowego; najmniej znaczący bit, bit 0, ustawia dane linii cienia wysłane za pomocą @ do załadowania do wykresu 0 lub wykresu 1, podczas gdy bity 2 i 3 włączają lub wyłączają linię cienia odpowiednio dla wykresu 0 lub 1. Włączenie bitu 3 pozwoliło na użycie wykresów paskowych, podczas gdy bit 4 włączył go dla obu wykresów, funkcję podwójnego paska. Drugi znak w poleceniu I miał tylko dwie wartości, ! lub przestrzeń; wysyłanie ! przestaw terminal w tryb kwadratowy, podczas gdy spacja lub nic pozostawia go w formacie prostokąta zgodnym z VT55.

Inne szczegóły

Seria VT50 zawierała również alternatywny zestaw znaków, tryb graficzny , który można było włączać i wyłączać w trybie tekstowym. Zostały one użyte do dostarczenia dodatkowych glifów przydatnych do etykietowania i podobnych zadań. Wśród znaków były indeksy od 0 do 9 oraz górna część ułamków 1/, 2/, 3/, 5/ i 7/. Można je połączyć, tworząc na przykład 3 / 7 . Zestaw zawierał również poziome paski na każdej z 8 linii skanowania w normalnym glifie, symbol stopnia i inne typowe przykłady. Używały one oddzielnych kodów znaków, więc znaki graficzne można było mieszać z normalnym zestawem znaków na jednym ekranie.

Notatki

Cytaty

Bibliografia