home *** CD-ROM | disk | FTP | other *** search
- UNIT decode; {$project vt}
- { Zeichensatzkonvertierung zum Programm VideoText }
-
- INTERFACE; FROM vt USES global;
-
- PROCEDURE makeascii(source: p_onepage; zeile: Integer; farblos: Boolean;
- var asciicode: str80);
- PROCEDURE decode_line(source: p_onepage; zeile: Integer; verdeckt: Boolean;
- VAR amigacode: bigstring; VAR attrib: str80;
- VAR dblheight,rastergfx: Boolean);
- PROCEDURE gettopnum(source: p_onepage; x,y: Integer; VAR pg,sp: Integer);
- PROCEDURE make_colperms(cp: Long);
- VAR blank40: String[41];
- topcode: ARRAY[0..255] OF Byte;
- colperms: ARRAY[0..8] OF Char;
-
- { ---------------------------------------------------------------------- }
-
- IMPLEMENTATION;
-
- {$opt q,s+,i+ } { keine Laufzeitprüfungen außer Stack und Feldindizes }
-
- VAR notascii: ARRAY[32..127] OF Byte; STATIC;
- vt_to_ascii, vt_to_myfont: ARRAY[0..7] OF String[15]; STATIC;
- j: Integer;
-
- PROCEDURE makeascii{(source: p_onepage; zeile: Integer; farblos: Boolean;
- VAR asciicode: str80)};
- { Eine Zeile einer VT-Seite für Drucker- oder Dateiausgabe umwandeln. }
- { Für <farblos>=false werden Farbcodes nicht einfach weggeworfen, sondern }
- { durch Klartext '\0' .. '\7' umschrieben. }
- VAR thisbyte,group8,group32,country: Byte;
- start, spalte, i: Integer;
- grafik: Boolean;
- BEGIN
- IF source=Nil THEN
- asciicode := blank40
- ELSE BEGIN
- country := (source^.cbits SHR 12) AND $07;
- start := zeile*40;
- grafik := false;
- i := 1;
- FOR spalte := 0 TO 39 DO BEGIN
- thisbyte := source^.chars[start+spalte];
- group8 := thisbyte SHR 3; { 8er-Gruppe }
- group32 := group8 SHR 2; { 32er-Gruppe }
- IF group8=0 THEN grafik := False;
- IF group8=2 THEN grafik := True;
- IF (group32=2) OR (NOT grafik AND (group32 in [1..3])) THEN
- { druckbares Zeichen, über Tabellen decodieren }
- IF notascii[thisbyte]>0 THEN
- asciicode[i] := vt_to_ascii[country][notascii[thisbyte]]
- ELSE
- asciicode[i] := Chr(thisbyte)
- ELSE
- asciicode[i] := ' ';
- IF NOT farblos AND (group8=0) THEN BEGIN { Farbcode als Klartext }
- asciicode[i] := '\'; Inc(i); asciicode[i] := chr(thisbyte+ord('0'));
- END;
- Inc(i);
- END;
- asciicode[i] := Chr(0);
- END;
- END;
-
- {$opt i-}
- PROCEDURE decode_line{(source: p_onepage; zeile: Integer; verdeckt: Boolean;
- VAR amigacode: bigstring; VAR attrib: str80;
- VAR dblheight,rastergfx: Boolean)};
- { Setzt eine Zeile Teletextzeichen (40 Zeichen) in einen String für den }
- { Amiga um (bis zu 160 Zeichen, leider), mit ANSI-Steuerzeichen, für meinen }
- { videotext.font. <attrib> dient zur Hilfe bei der Darstellung gerasterter }
- { Grafikzeichen. }
- { Anhand der c't 10/92 komplett überarbeitet (01/96). }
- VAR vfarbe, hfarbe, country, thisbyte, lastout, group32: Byte;
- grafik, raster, hold, geheim: Boolean;
- start,spalte,i,x: Integer;
- BEGIN
- country := (source^.cbits SHR 12) AND $07;
- vfarbe := 7; hfarbe := 0; lastout := 32;
- grafik := False; raster := False; hold := False; geheim := False;
- dblheight := False; rastergfx := False;
- i := 1;
- start := zeile*40;
- FOR spalte := 0 TO 39 DO BEGIN
- thisbyte := source^.chars[start+spalte] AND $7F;
- IF thisbyte<32 THEN BEGIN { Steuerzeichen }
- { zunächst nur die sofort wirkenden behandeln }
- CASE thisbyte OF
- 13: dblheight := True; { doppelthohe Zeichen }
- 24: geheim := True; { verdeckter Text }
- 28: BEGIN { schwarzer Hintergrund }
- hfarbe := 0;
- amigacode[i] := #155; Inc(i);
- amigacode[i] := '4'; Inc(i);
- amigacode[i] := colperms[0]; Inc(i);
- amigacode[i] := 'm'; Inc(i);
- END;
- 29: BEGIN { Zeichenfarbe als Hintergrund }
- hfarbe := vfarbe;
- amigacode[i] := #155; Inc(i);
- amigacode[i] := '4'; Inc(i);
- amigacode[i] := colperms[hfarbe]; Inc(i);
- amigacode[i] := 'm'; Inc(i);
- END;
- 30: hold := True;
- OTHERWISE; { kommt gleich ... }
- END;
- { jetzt ein Leerzeichen ausgeben (bzw. ein Grafikzeichen wiederholen) }
- IF hold THEN amigacode[i] := Chr(lastout)
- ELSE amigacode[i] := ' '; Inc(i);
- { Rasterattribut notieren: }
- x := Ord(colperms[hfarbe])-Ord('0');
- IF raster AND grafik THEN x := x OR 16;
- attrib[spalte+1] := Chr(x);
- { und noch die verzögert wirkenden Steuerzeichen: }
- CASE thisbyte OF
- 0..7: BEGIN { neue Textfarbe }
- geheim := False;
- grafik := False;
- vfarbe := thisbyte;
- amigacode[i] := #155; Inc(i);
- amigacode[i] := '3'; Inc(i);
- amigacode[i] := colperms[vfarbe]; Inc(i);
- amigacode[i] := 'm'; Inc(i);
- END;
- 16..23: BEGIN { neue Grafikfarbe }
- geheim := False;
- grafik := True;
- vfarbe := thisbyte-16;
- amigacode[i] := #155; Inc(i);
- amigacode[i] := '3'; Inc(i);
- amigacode[i] := colperms[vfarbe]; Inc(i);
- amigacode[i] := 'm'; Inc(i);
- END;
- 25: raster := False; { gerasterte Grafikzeichen }
- 26: BEGIN raster := True; rastergfx := True; END;
- 31: hold := False;
- OTHERWISE;
- END;
- END ELSE BEGIN { druckbares Zeichen }
- { Rasterattribut? }
- x := Ord(colperms[hfarbe])-Ord('0');
- IF raster AND grafik AND NOT (thisbyte IN [64..95]) THEN x := x OR 16;
- attrib[spalte+1] := Chr(x);
- { Grafikzeichen? }
- IF grafik AND NOT (thisbyte IN [64..95]) THEN
- thisbyte := thisbyte + 128
- ELSE IF notascii[thisbyte]>0 THEN
- thisbyte := Ord(vt_to_myfont[country][notascii[thisbyte]]);
- { verdecktes Zeichen? }
- IF (geheim AND verdeckt) THEN
- amigacode[i] := ' '
- ELSE
- amigacode[i] := Chr(thisbyte); Inc(i);
- { nur echte Grafikzeichen für "hold"-Wiederholung merken: }
- IF thisbyte SHR 5 IN [5,7] THEN
- lastout := thisbyte ELSE lastout := 32;
- END;
- END;
- amigacode[i] := Chr(0);
- END;
- {$opt i+}
-
- PROCEDURE gettopnum{(source: p_onepage; x,y: Integer; VAR pg,sp: Integer)};
- { Eine Seitennummer pg/sp aus einer TopText-Seite auslesen }
- { Rückgabewert -1 bedeutet, daß unerlaubte Ziffern aufgetreten sind }
- VAR i,j,z: Integer;
- illegal: Boolean;
- BEGIN
- i := x + 40*y;
- pg := 0; illegal := False;
- FOR j := 0 TO 2 DO BEGIN
- z := topcode[source^.chars[i+j]];
- pg := (pg SHL 4)+z;
- IF z>15 THEN illegal := True;
- END;
- IF illegal THEN pg := -1;
- sp := 0; illegal := False;
- FOR j := 3 TO 6 DO BEGIN
- z := topcode[source^.chars[i+j]];
- sp := (sp SHL 4)+z;
- IF z>15 THEN illegal := True;
- END;
- IF illegal THEN sp := -1;
- END;
-
- PROCEDURE make_colperms{(cp: Long)};
- { colperms-String der tatsächlichen Farbreihenfolge auf dem Screen anpassen }
- VAR i: Integer;
- BEGIN
- FOR i := 0 TO 7 DO
- colperms[(cp SHR (4*(7-i))) AND $F] := Chr(i+Ord('0'));
- END;
-
- BEGIN { Initialisierungsteil }
- { VT-Zeichensatzdekodierung }
- { Welche (druckbaren) Zeichen müssen überhaupt dekodiert werden? }
- FOR j := 32 TO 127 DO notascii[j] := 0;
- FOR j := 0 TO 1 DO notascii[35+j] := 1+j;
- notascii[64] := 3;
- FOR j := 0 TO 5 DO notascii[91+j] := 4+j;
- FOR j := 0 TO 3 DO notascii[123+j] := 10+j;
- { Durch welche Zeichen werden sie ersetzt, a) im Standard-Amiga-Zeichensatz, }
- { b) in meinem videotext.font? }
- { Die Ländernummern (aus den Steuerbits als C12 + 2*C13 + 4*C14 berechnet) }
- { sind: 0=England, 1=Frankreich, 2=Schweden, 3=reserviert, 4=Deutschland, }
- { 5=Spanien, 6=Italien, 7=reserviert. }
- vt_to_ascii[0] := '£$@«½»^#¼|¾÷'; vt_to_myfont[0] := 'Á$ÀÂÈÄÃ#-ÇÅÉÆ'; { GB }
- vt_to_ascii[1] := 'éïàëêùî#èâôûç'; vt_to_myfont[1] := 'Ô×ÎÔÕÝØ#ÓÐÜßÒ'; { F }
- vt_to_ascii[2] := '#¤ÉÄÖÅÜ_éäöåü'; vt_to_myfont[2] := '#ÌE[\Í]_Ô{|Ñ}'; { S }
- vt_to_ascii[3] := '£$@«½»^#¼|¾÷'; vt_to_myfont[3] := 'Á$ÀÂÈÄÃ#-ÇÅÉÆ'; { ?? }
- vt_to_ascii[4] := '#$§ÄÖÜ^_°äöüß'; vt_to_myfont[4] := '#$@[\]^_`{|}~'; { D }
- vt_to_ascii[5] := 'ç$¡áéíóú¿üñèà'; vt_to_myfont[5] := 'Ò$ÊÏÔ×ÛÞË}ÙÓÎ'; { E }
- vt_to_ascii[6] := '£$é°ç»^#ùàòèì'; vt_to_myfont[6] := 'Á$Ô`ÒÄÃ#ÝÎÚÓÖ'; { I }
- vt_to_ascii[7] := '£$@«½»^#¼|¾÷'; vt_to_myfont[7] := 'Á$ÀÂÈÄÃ#-ÇÅÉÆ'; { ?? }
- { Decodierung der TopText-Ziffern 0..F }
- FOR j := 0 TO 255 DO topcode[j] := 16; { unmögliche Ziffer=Fehler }
- topcode[21] := 0; topcode[2] := 1; topcode[73] := 2; topcode[94] := 3;
- topcode[100] := 4; topcode[115] := 5; topcode[56] := 6; topcode[47] := 7;
- topcode[80] := 8; topcode[71] := 9; topcode[12] := 10; topcode[27] := 11;
- topcode[33] := 12; topcode[54] := 13; topcode[125] := 14; topcode[106] := 15;
- FOR j := 1 TO 40 DO blank40[j] := ' '; blank40[41] := #0;
- colperms := '01234567'; { Zuordnung VT-Farben/Screen-Farben }
- END.
-
-