VT_DRIVE Version 01.01 (VTDRV_PT.PRG) Version 01.02 (VTDRV_CT.PRG) Copyright mz'92 + dl'93 Benutzungsanleitung =================== 1. Einleitung ------------- VTDRV_PT.PRG stellt einen Treiber fr den Videotext-Decoder von Print- Technik (neuere Version zum Anschluž an den ROM-Port) zur Verfgung, VTDRV_CT.PRG fr den Videotext-Decoder der Zeitschrift c't. Diese Treiber erlauben vollen Zugriff auf die Decoder-Hardware zur Ausnutzung aller Features des eingesetzten Videotext-Decoder-Bausteins. Die Hardware des Videotext-Decoders von Print-Technik ist (ganz im Gegensatz zur Software) sehr leistungsf„hig. In der von mir erworbenen Version verrichtet ein SAA 5246 von Philips (oder ein kompatibler Baustein) seinen Dienst. Dieser Baustein kann viel mehr, als es ihm die mitgelieferte oder nachkaufbare stand-alone Treiber-Software er- lauben. Vom zus„tzlichen Kauf des "Entwicklungs-Utility" (stand-alone Treiber) kann ich nur abraten, da dieser Treiber einige "Besonderheiten" aufweist, die ihn untauglich machen: - nur eingeschr„nkter Zugriff auf die Hardware - unakzeptable Zugriffsgeschwindigkeit - Ausgaben direkt auf den Bildschirm - braucht beim Start oben links auf dem Bildschirm eine leere Fl„che (?!?!?!) - nicht XBRA-konforme Anbindung ans Betriebssystem - Benutzung des Timer A des MFP (wofr blož?) - bringt h„ufig die Kommunikation mit dem Decoder-Baustein zum Erliegen (ohne ein M”glichkeit zum Reset; das System muž ausgeschaltet werden!) - beschert ab und zu einen wundersch”nen Systemcrash - Dokumentation absolut mangelhaft Ganz nebenbei: Der stand-alone Treiber ist nur eine geringfgig ver„nderte Version der mitgelieferten Software und das zus„tzliche L”hnen eigentlich ein Frechheit sondermannshausen... Wenn man sich lange genug „rgert, motiviert das zu eigenen Taten. Aber dagegen ist vorgesorgt: Auf der Decoder-Platine sind von allen Bausteinen die Bezeichnungen abgekratzt (wenn man die Mhe doch blož in die Software investieren wrde...). Glcklicherweise sind aber nur vier K„fer auf der Platine und ein bižchen šberlegen hilft bei der Identifizierung. Weiter unten ist die Hardware ein bižchen n„her beschrieben. Damit wird fr Interessierte und solche, die meinen Treiber auch nicht berauschend finden, die Entwicklung eines eigenen Treibers leicht m”glich. Die Hardware des c't-Videotext-Decoders ist in der Zeitschrift genauestens erkl„rt. Die Anpassung des zun„chst nur fr die Print-Technik-Decoder-Hardware entwickelten Treibers wurde von Daniel Leridez vorgenommen. Beide Treiber bieten dieselbe Funktionalit„t. 2. Treiber-Installation ----------------------- VTDRV_PT.PRG stellt einen Treiber zur Verfgung, der als Erweiterung des Betriebssystems implementiert ist (wie brigens auch der nachkaufbare stand-alone Treiber von Print-Technik bzw. Roger Bishoff). VTDRV_CT.PRG verh„lt sich genauso, nur ist es zum Betrieb mit der c't- Decoder-Hardware gedacht. Da die Funktionalit„t beider Treiber sich nicht unterscheidet, ist im folgenden nur von "dem Treiber" oder "VT_DRIVE.PRG" die Rede. Es kann (sinnvollerweise) immer nur eine Treiber-Version zur Zeit installiert sein. Die Anbindung an das Betriebssystem erfolgt als neue BIOS-Funktion mit der Funktionsnummer 121. Eigentlich mžte es eine XBIOS-Funktion sein, aber das XBIOS wird mit jedem neuen ATARI-Modell erweitert und daher ist es schwierig, eine Funktionsnummer zu finden, die auch noch in Zukunft nicht von ATARI selbst belegt sein wird. Beim BIOS ist man da mit der Nummer 121 schon eher auf der sicheren Seite. Der Treiber verbleibt nach der Installation (typischerweise aus dem AUTO-Ordner heraus, geht aber auch vom Desktop aus) resident im Speicher. Er f„ngt XBRA-konform den BIOS-Trap (#13) ab (XBRA-ID: MZVT). Der Treiber wird nur installiert, wenn die Decoder-Hardware angeschlossen ist. Doppelinstallation wird verhindert. Er legt einen Cookie an mit der Kennung "MZVT" und der Versionsnummer als Wert. Sollte kein Cookie-Jar existieren, wird einer angelegt bzw. bei šberfllung erweitert. Auch an die Besitzer von 'gr”žeren' Maschinen wurde gedacht: _longframe wird beachtet. Es kann aber bei schnelleren Maschinen zu Timing-Problemen kommen, da der I2C-Bus, ber den der Decoder-Baustein angesprochen wird, nicht der allerschnellste ist. Falls jemand Probleme damit haben sollte: bitte melden! 3. Aufbau einer Videotext-Seite ------------------------------- Der VT-Treiber liefert eine VT-Seite (mittels der Funktion VT_PAGE_GET, siehe dort) in einem Block von 970 Bytes ab. Dieser Block ist wie folgt aufgebaut: Bytes 0 .. 39 Titelzeile 40 .. 79 1. Textzeile 80 .. 119 2. Textzeile .... ... 880 .. 919 22. Textzeile 920 .. 959 23. Textzeile 960 .. 969 Informations/Status-Bytes Man kann auch nur die Titelzeile (mittels VT_PAGE_TITLE, siehe dort), oder nur die Informations/Status-Bytes (mittels VT_PAGE_INFO, siehe dort) anfordern. Zum Aufbau von Titelzeile und Informations/Status-Bytes siehe Videotext- Dokumentation z.B. in c't 11/1991; Literaturhinweise s. unten. Die gelieferten Bytes entsprechen dem VT-Code, der sich nur teilweise mit dem ASCII-Code deckt. VT-Steuerzeichen werden unausgewertet geliefert. Zur Anzeige ist eine Umkodierung bzw. Auswertung notwendig. N„heres siehe VT-Dokumentation. Die Informations/Status-Bytes enthalten bitweise codierte Informationen. N„heres ebenfalls in der VT-Dokumentation. 4. Funktionsaufrufe ------------------- Generelle Struktur beim Aufruf: long bios( VT_DRV, int mode, char *buffer, int mem, int page ) wobei mode: einer der Funktionsmodi (siehe unten) HINWEIS: Bei nicht vorhandenem Funktionsmodus gibt der Aufruf den Fehlercode -3 zurck. buffer: Zeiger auf einen (ausreichend grožen) Schreib-/Lesepuffer mem: Nr. des internen Seitenspeichers (0 .. 7) Der VT-Decoder kann intern 8 VT-Seiten speichern. Zugleich wird einer der 4 acquisition-circuits mit den niederwertigen Bits ausgew„hlt. Der VT-Decoder kann mit den acquisition-circuits gleichzeitig nach 4 verschiedenen VT-Seiten suchen. HINWEIS: Es drfen nicht mehrere acquisition-circuits nach derselben (bestimmten) Seite suchen! page: gewnschte VT-Seite (100 .. 899) HINWEIS: Nicht vorhandene VT-Seiten werden nie gefunden! HINWEISE: - Es werden nicht fr jeden Funktionsmodus alle Parameter ben”tigt. - Fr die Funktion VT_PAGE_TEST2 heižt der vierte Parameter 'mem2'. - Fr die Funktionen VT_STRING_WRITE und VT_STRING_READ heižt der vierte Parameter 'count'. N„heres siehe unten. - Der Rckgabewert ist vom Typ 'long' (32 Bit). - Die Fehlercodes orientieren sich an den BIOS-Fehlermeldungen; n„heres siehe unten. - Alle Konstanten sind in der Header-Datei 'VT_DRIVE.H' definiert. Aufruf einzelner Funktionsmodi: Funktion VT_INIT: Initialisiert die VT-Decoder-Hardware und die Kommunikation. HINWEIS: Wird vom VT-Treiber beim Starten (i.a. beim Booten) erledigt; evtl. bei Kommunikationsfehlern hilfreich. Aufruf: ret = bios( VT_DRV, VT_INIT ) Parameter: Rckgabe (ret): 0 OK 121 VT-Treiber nicht installiert -2 Decoder-Hardware nicht angeschlossen Funktion VT_STATUS: Liest die Signal-Qualit„ts-Bits fr TV und VT Signale. Damit kann man ermitteln, ob berhaupt ein VT-Programm empfangen wird. Aufruf: ret = bios( VT_DRV, VT_STATUS ) Parameter: Rckgabe (ret): 0 OK (VT-Signal wird empfangen) 121 VT-Treiber nicht installiert -7 kein TV/VT-Signal Funktion VT_PAGE_SET: L„žt den ausgew„hlten acquisition-circuit nach der gesetzten VT-Seite suchen; die Seite wird im ausgew„hlten Seitenspeicher abgelegt. Aufruf: ret = bios( VT_DRV, VT_PAGE_SET, buffer, mem, page ) Parameter: Eingabe: buffer: irgendein Zeigerwert (z.B. NULL); wird nur als Fller ben”tigt mem: int. Speicher (0 .. 7) und acquisition-circuit (implizit) HINWEIS: Die niederwertigen Bits bestimmen den acquisition- circuit, d.h. men = 0 und mem = 4 benutzen den gleichen acquisition-circuit. page: gewnschte VT-Seite (100 .. 899) HINWEIS: Bei šbergabe von 0 fr 'page' wird st„ndig die gerade gesendete Seite empfangen (don't care). Rckgabe (ret): 0 OK (Suche beginnt) 121 VT-Treiber nicht installiert -5 Parameter ungltig -10 Schreibfehler Funktion VT_PAGE_TEST: Testet, ob die gewnschte VT-Seite im ausgew„hlten Seitenspeicher gefunden wurde; zur Sicherung der vollst„ndigen Empfangs wird eine feste Zeitspanne gewartet. Aufruf: ret = bios( VT_DRV, VT_PAGE_TEST, buffer, mem ) Parameter: Eingabe: buffer: irgendein Zeigerwert (z.B. NULL); wird nur als Fller ben”tigt mem: int. Speicher (0..7) Rckgabe (ret): 0 OK (Seite gefunden) 121 VT-Treiber nicht installiert -2 Seite noch nicht gefunden -5 Parameter ungltig -10 Schreibfehler -11 Lesefehler Funktion VT_PAGE_TEST2: Testet, ob die gewnschte VT-Seite im ausgew„hlten Seitenspeicher gefunden wurde; zur Sicherung des vollst„ndigen Empfangs wird bis zum Eintreffen der n„chsten Titelzeile gewartet. Aufruf: ret = bios( VT_DRV, VT_PAGE_TEST, buffer, mem, mem2 ) Parameter: Eingabe: buffer: irgendein Zeigerwert (z.B. NULL); wird nur als Fller ben”tigt mem: int. Speicher (0..7) mem2: int. Speicher (0..7); muž von 'mem' verschieden sein. HINWEIS: mem2 sollte auch einen anderen acquisition-circuit benutzen als mem, d.h. mem = 0 und mem2 = 4 ist beispielsweise nicht unproblematisch (w/ update). Der Inhalt des int. Speichers 'mem2' ist nach dem Aufruf undefiniert. Rckgabe (ret): 0 OK (Seite gefunden) 121 VT-Treiber nicht installiert -2 Seite noch nicht gefunden -5 Parameter ungltig -10 Schreibfehler -11 Lesefehler Funktion VT_PAGE_GET: L„dt eine VT-Seite aus dem ausgew„hlten Seitenspeicher ins RAM. Aufruf: ret = bios( VT_DRV, VT_PAGE_GET, buffer, mem ) Parameter: Eingabe: buffer: Zeiger auf einen 970 Bytes grožen Puffer mem: int. Speicher (0..7) Rckgabe (ret): 0 OK (Seite bertragen) 121 VT_Treiber nicht installiert -5 Parameter ungltig -10 Schreibfehler -11 Lesefehler Funktion VT_PAGE_TITLE: L„dt die Titelzeile einer VT-Seite aus dem ausgew„hlten Seitenspeicher ins RAM. Aufruf: ret = bios( VT_DRV, VT_PAGE_TITLE, buffer, mem ) Parameter: Eingabe: buffer: Zeiger auf einen 40 Bytes grožen Puffer mem: int. Speicher (0 .. 7) Rckgabe (ret): 0 OK 121 VT-Treiber nicht installiert -5 Parameter ungltig -10 Schreibfehler -11 Lesefehler Funktion VT_PAGE_INFO: L„dt die Informations/Status-Bytes einer VT-Seite aus dem ausgew„hlten Seitenspeicher ins RAM. Aufruf: ret = bios( VT_DRV, VT_PAGE_INFO, buffer, mem ) Parameter: Eingabe: buffer: Zeiger auf einen 10 Bytes grožen Puffer mem: int. Speicher (0 .. 7) Rckgabe (ret): 0 OK 121 VT-Treiber nicht installiert -5 Parameter ungltig -10 Schreibfehler -11 Lesefehler Funktion VT_STRING_WRITE: Sendet eine Bytefolge an den VT-Baustein. HINWEIS: Diese Funktion sollte man nur benutzen, wenn man weiž, was die Bytefolge bewirkt; unsinnige Bytefolgen k”nnen zum Absturz des Decoders fhren! Aufruf: ret = bios( VT_DRV, VT_STRING_WRITE, buffer, count ) Parameter: Eingabe: buffer: Zeiger auf einen Puffer der L„nge 'count' (Bytes) count: Anzahl der zu sendenden Bytes (1 .. 32767) HINWEIS: Dies ist ein 'signed int'-Wert; negative Werte fhren zu Fehlern! Rckgabe (ret): 0 OK 121 VT-Treiber nicht installiert -5 Parameter ungltig -10 Schreibfehler -11 Lesefehler Funktion VT_STRING_READ: Empf„ngt eine Bytefolge vom VT-Baustein. HINWEIS: Diese Funktion sollte man nur benutzen, wenn man weiž, was man liest. Vorher muž die entsprechende Befehlsfolge an den VT-Baustein gesendet worden sein (mittels VT_STRING_WRITE). Aufruf: ret = bios( VT_DRV, VT_STRING_READ, buffer, count ) Parameter: Eingabe: buffer: Zeiger auf einen Puffer der L„nge 'count' (Bytes) count: Anzahl der zu lesenden Bytes (1 .. 32767) HINWEIS: Dies ist ein 'signed int'-Wert; negative Werte fhren zu Fehlern! Rckgabe (ret): 0 OK 121 VT-Treiber nicht installiert -5 Parameter ungltig -10 Schreibfehler -11 Lesefehler 5. Ein paar Worte zur Decoder-Hardware von Print-Technik -------------------------------------------------------- Wie bereits erw„hnt, sind die Bezeichnungen von den K„fern auf der Decoder- Platine abgekratzt (o tempora, o mores!). Daher sind alle Angaben als reine Spekulatius zu betrachten, wenn auch mit einer gewissen Wahrscheinlichkeit zutreffend, denn auf diesen Kaffeesatzlesereien basiert der Treiber, der bei mir einwandfrei funktioniert. Nichtsdestotrotz mag es aber auch v”llig anders aufgebaute Decoder-Hardware von Print-Technik geben. Daher also: Alle Angaben sind wie immer ohne Gew„hr! Die Decoder-Platine ist am ROM-Port angeschlossen (Sollte dies bei Ihnen nicht so sein: Pech!). Belegt sind nur die folgenden Anschlsse: ROM3-select (geht bei Zugriff im Adressbereich $FB0000-$FBFFFF auf LOW) ROM4-select (dito fr $FA0000-$FAFFFF) D1 (Datenleitung D1 - wohlgemerkt, nicht D0!) A1 (Adressleitung A1) A2 (Adressleitung A2) A3 (Adressleitung A3) +5V (Spannungsversorgung) GND (ach was !?) Das reicht bereits fr die Ansteuerung des seriellen I2C-Bus. N„heres dazu: s. Literaturhinweise. Der dicke Brocken auf der Platine ist der Decoder-Baustein SAA 5246 oder ein kompatibler. Der zweitgr”žte Chip (28 Pins) drfte der zugeh”rige RAM- Baustein 6264 (8Kx8) sein, der immer wieder erw„hnte interne Speicher. Die beiden anderen Chips dienen der Ansteuerung des I2C-Bus. Da vom ROM-Port nur gelesen werden darf (sonst droht Bombenterror) ist die Ansteuerung etwas verschlungen. ROM4-select steuert zusammen mit A2 die Clock-Leitung des I2C-Bus (SCL), zusammen mit A1 und A3 den schreibenden Zugriff auf die Daten-Leitung des I2C-Bus (SDA) und ROM3-select steuert den lesenden Zugriff auf SDA. ROM4-select gibt ber einen Leitungstreiber (74 125, der 14-beinige K„fer) einen 'clock'-Impuls (positive Flanke) auf ein 4-Bit-D-Register (im 74 175, 16 Beinchen). Dadurch werden in die D-Register die auf den Leitungen A1, A2 und A3 liegenden Werte bernommen. A2 ist der Wert, der dann auf SCL liegt. Um also SCL auf low zu ziehen ist irgendein lesender(!) Zugriff auf die Adresse $FA0000 zu t„tigen, fr high auf SCL ein Zugriff auf Adresse $FA0004. Dies stimmt allerdings nur bedingt, da die Adressleitungen A1 und A3 auch eine Rolle spielen, aber fr SDA. Sagen wir also besser: Um low auf SCL zu legen, muž ein Zugriff auf den Adressbereich $FAxxxx mit gel”schtem Adressbit A2 get„tigt werden, fr high auf SCL mit gesetztem A2-Bit. A1 ist der Wert, der ber einen Leitungstreiber auf SDA gelegt wird. Will man high auf SDA legen, muž also beim Zugriff auf $FAxxxx das A1-Bit gesetzt sein (low entsprechend). Nun ist aber zu beachten, daž auf SDA auch lesend zugegriffen werden muž. Daher wird der ber A1 angelegte Wert vom Leitungstreiber nur auf SDA gelegt, wenn er mittels A3 freigegeben wird. Die Freigabeleitungen des 74 125 sind low-aktiv, also erscheint der durch A1 vorgegebene Wert nur dann auf der SDA-Leitung, wenn A3 gel”scht ist. Das heižt, um einen Wert auf SDA zu legen, muž dieser Wert im A1-Bit er- scheinen und das A3-Bit beim Zugriff auf $FAxxxx gel”scht sein. Ist das A3-Bit gesetzt, geht der mit SDA verbundene Leitungstreiber-Ausgang in hochohmigen Zustand (tri-state), nichts wird auf SDA gelegt und folglich kann lesend auf SDA zugegriffen werden. Von SDA zu lesen ist dagegen beruhigend einfach: šber einen Leitungstreiber ist SDA mit der Datenleitung D1 verbunden. Am Ausgang erscheint aber der Wert von SDA nur, wenn der Leitungstreiber ber ROM3-select freigegeben wird, was bei einem Zugriff auf den Adressbereich $FBxxxx der Fall ist. Man muž aber darauf achten, daž vor dem Lesezugriff auf $FBxxxx ber einen Zugriff auf $FAxxxx mit gesetztem A3-Bit der Wert von A1 aus dem D-Register von SDA abgetrennt wird. Ich sagte bereits, es ist etwas verschlungen. Noch ein Hinweis: Wie schon erw„hnt, ist der I2C-Bus (am 5246) nicht der schnellste. Der Takt auf SCL darf also nicht zu hoch werden. Die Hardware des c't-Dekoders ist in der Zeitschrift ausfhrlich dokumentiert. 6. Copyright und Haftungsausschluž ---------------------------------- VTDRV_PT.PRG wurde entwickelt und implementiert von Michael Zuhl Transvaalstr. 16 13351 Berlin email: maze@cs.tu-berlin.de VTDRV_CT.PRG wurde fr den c't-Dekoder angepažt von Daniel Leridez Stettiner Str. 8 76863 Herxheim email: leridez@rpksun1.mach.uni-karlsruhe.de Die Programme VTDRV_PT.PRG und VTDRV_CT.PRG sind Freeware. Das heižt, sie drfen kopiert und weitergegeben werden, solange dies nicht kommerziell geschieht. Ausgenommen ist lediglich die kommerzielle Verbreitung ber PD-Disketten, sofern diese fr einen geringen Unkostenbeitrag abgegeben werden. Fehlerreports, Fragen und Anregungen bitte an obige Adressen. Obwohl bei der Programmierung und beim Testen grože Sorgfalt gebt wurde, k”nnen die Autoren keine Haftung bernehmen fr die Funktion dieser Programme oder fr eventuelle Sch„den, die aus der Benutzung dieser Programme entstehen. Die Benutzung erfolgt auf eigene Gefahr und ohne jede Gew„hrleistung. 7. Literatur ------------ Handbuch zum Entwicklungs-Utility fr Print-Technik-Teletext ATARI ST, Roger Bischoff (o.J.) [Ein bemerkenswert fehlerhaftes und unvollst„ndiges Werk zu einer ebensolchen Software, die dieses Projekt berhaupt erst anregte] Fernsehdaten - Videotext-Karte fr den PC-Slot, Dietmar Loy, c't 1991, Heft 11, Seite 228 ff. [Grundlagen zu Videotext, Bauanleitung fr Decoder, Software, I2C-Bus] VideoNext - c't-Videotextkarte am Next, Dirk Schwarzhans, Matthias Braun, c't 1992, Heft 10, Seite 170 ff. [Grundlagen zu Videotext, Software] Integrated VIP and Teletext SAA 5246 Series User Manual, Philips (o.J.) [Beschreibung des Decoder-Bausteins, Peripherie, Grundlagen] Fernsehtext-Spezifikation, Technische Richtlinie Nr. 8R4, Institut fr Rundfunktechnik (o.J.) [Der Titel sagt alles] ATARI Profibuch ST-STE-TT, Jankowski, Rabich, Reschke, Sybex, 10. Auflage 1991 [Und berhaupt] VTDRV_PT.PRG V01.01 VTDRV_CT.PRG V01.02 09.06.93 mz'92 + dl'93