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); 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 =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. dient zur Hilfe bei der Darstellung gerasterter } { Grafikzeichen. } { Stringfunktionen absichtlich vermieden, soll vor allem schnell sein! } VAR vfarbe, hfarbe, country, thisbyte, lastout, group32: Byte; grafik, raster, hold, geheim: Boolean; start,spalte,i: 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 } geheim := False; { jedes Steuerzeichen außer 24 schaltet geheim aus! } IF thisbyte=30 THEN hold := True; IF thisbyte=31 THEN hold := False; IF hold THEN BEGIN { Grafikzeichen wiederholen, Steuerzeichen ausführen } amigacode[i] := Chr(lastout); Inc(i); IF raster AND (lastout SHR 5 IN [5,7]) THEN { Grafikzeichen? } attrib[spalte+1] := Chr(Ord(colperms[hfarbe])-32) ELSE attrib[spalte+1] := Chr(Ord(colperms[hfarbe])-48); END; { ELSE: s. u. } CASE thisbyte OF 0..7: BEGIN { neue Textfarbe } 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; 13: dblheight := True; { doppelthohe Zeichen } 16..23: BEGIN { neue Grafikfarbe } 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; 24: geheim := True; 25: raster := False; { gerasterte Grafikzeichen } 26: BEGIN raster := True; rastergfx := True; END; 28: BEGIN { Hintergrund schwarz } 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; OTHERWISE; END; IF NOT hold THEN BEGIN { Steuerzeichen ausgeführt, Leerzeichen ausgeben } amigacode[i] := ' '; Inc(i); IF raster AND grafik THEN attrib[spalte+1] := Chr(Ord(colperms[hfarbe])-32) ELSE attrib[spalte+1] := Chr(Ord(colperms[hfarbe])-48); END; { ELSE: s. o. } END ELSE BEGIN { druckbares Zeichen } { Rasterattribut? } IF raster AND grafik AND NOT (thisbyte IN [64..95]) THEN { Grafikzeichen? } attrib[spalte+1] := Chr(Ord(colperms[hfarbe])-32) ELSE attrib[spalte+1] := Chr(Ord(colperms[hfarbe])-48); { 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; 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.