1
0

Merge branch 'devel'

This commit is contained in:
acn 2018-05-30 14:14:47 +02:00
commit f2dad7338d
80 changed files with 868 additions and 545 deletions

127
cept.py
View File

@ -6,81 +6,88 @@ released under GPL
''' '''
CR = "\x0d" CR = "\x0d"
LF = "\x0a"
UMLAUT = "\xc9" UMLAUT = "\xc9"
INI = "\x13" INI = "\x13"
TER = "\x1c" TER = "\x1c"
SEND = "\x1a" SEND = "\x1a"
CURSOR_ON = "\x11" CURSOR_ON = "\x11"
CURSOR_OFF = "\x14"
BSP = "\x08" # backspace BSP = "\x08" # backspace
CLEARLINE = "\x18" CLEARLINE = "\x18"
# TODO: stimmt das?
LEFT = "\x08"
RIGHT = "\x09"
DOWN = "\x0a"
UP = "\x0b"
HOME = "\x1e"
clear_line24 = ( clear_line24 = (
"\x1f\x58\x41" # Cursor Zeile 24, Spalte 0 "\x1f\x58\x41" # Cursor Zeile 24, Spalte 0
"\x18" # Zeile löschen "\x18" # Zeile löschen
) )
error_prefix = ( error_prefix = (
"\x1f\x2f\x40\x58" # Servicesprung Zeile 24 "\x1f\x2f\x40\x58" # Servicesprung Zeile 24
) )
error_suffix = ( error_suffix = (
"\x1f\x2f\x4f" # Ende Servicesprung "\x1f\x2f\x4f" # Ende Servicesprung
"\x1f\x58\x41" # Cursor Zeile 24, Spalte 0 "\x1f\x58\x41" # Cursor Zeile 24, Spalte 0
) )
eingabezeile = ( eingabezeile = (
"\x1b" # Hintergrund blau ganze Reihe "\x1b" # Hintergrund blau ganze Reihe
"\x23" "\x23"
"\x21" "\x21"
"\x54" "\x54"
"\x44" # Hintergrund blau, Vordergrund gelb "\x44" # Hintergrund blau, Vordergrund gelb
"\x83" ) "\x83" )
init_screen = ( init_screen = (
"\x1f" "\x2f" "\x42" # Grundzustand parallel "\x1f" "\x2f" "\x42" # Grundzustand parallel
"\x9b" "\x9b"
"\x30" "\x32" "\x3b" "\x32" "\x33" "\x55" # Scrollbereich ist Zeile 2 - 23 "\x30" "\x32" "\x3b" "\x32" "\x33" "\x55" # Scrollbereich ist Zeile 2 - 23
"\x9b" "\x9b"
"\x32" "\x60" # Implizites Scrollen an "\x32" "\x60" # Implizites Scrollen an
"\x1b" "\x23" "\x21" "\x54" # Hintergrund blau ganze Reihe "\x1b" "\x23" "\x21" "\x54" # Hintergrund blau ganze Reihe
"\x94" "\x83" # Hintergrund blau, Vordergrund gelb "\x94" "\x83" # Hintergrund blau, Vordergrund gelb
"\x42" "\x74" "\x78" "\x20" "\x53" "\x65" "\x72" "\x76" "\x65" "\x72" # Btx Server "\x42" "\x74" "\x78" "\x20" "\x53" "\x65" "\x72" "\x76" "\x65" "\x72" # Btx Server
"\x20" "\x2d" "\x20" "\x4E" "\x6F" "\x72" "\x62" "\x65" "\x72" "\x74" # - Norbert "\x20" "\x2d" "\x20" "\x4E" "\x6F" "\x72" "\x62" "\x65" "\x72" "\x74" # - Norbert
"\x20" "\x4B" "\x65" "\x68" "\x72" "\x65" "\x72" "\x2c" "\x20" # Kehrer, "\x20" "\x4B" "\x65" "\x68" "\x72" "\x65" "\x72" "\x2c" "\x20" # Kehrer,
"\x41" "\x70" "\x72" "\x69" "\x6C" "\x20" "\x32" "\x30" "\x31" "\x36" # April 2016 "\x41" "\x70" "\x72" "\x69" "\x6C" "\x20" "\x32" "\x30" "\x31" "\x36" # April 2016
"\x90" "\x87" # Hintergrund schwarz, Vordergrund weisz "\x90" "\x87" # Hintergrund schwarz, Vordergrund weisz
"\x0d" "\x0a" # CR/LF "\x0d" "\x0a" # CR/LF
"\x11" # Cursor on "\x11" # Cursor on
) )
btxlogo = ( btxlogo = (
"\x1f\x2f\x42" # Grundzustand parallel "\x1f\x2f\x42" # Grundzustand parallel
"\x1b\x7e" # Zeichensatz G1 rechts "\x1b\x7e" # Zeichensatz G1 rechts
"\x9b\x31\x40" # Farbtafel 1 (Halbtöne) "\x9b\x31\x40" # Farbtafel 1 (Halbtöne)
"\x1b\x23\x20\x54" # ganzer Schirm blau "\x1b\x23\x20\x54" # ganzer Schirm blau
"\x1f\x3d1# 200961a\x1f" # Link zur Demo-Startseite 200961a "\x1f\x3d1# 200961a\x1f\x2f" # Link zur Demo-Startseite 200961a
"\x1f\x43\x48\xb8\xa3\x12\x57\xe4" "\x1f\x43\x48\xb8\xa3\x12\x57\xe4"
"\x1f\x44\x47\xea\xa0\x12\x59\xb5" "\x1f\x44\x47\xea\xa0\x12\x59\xb5"
"\x1f\x45\x47\xea \xe8\xfc\xdf\x12\x49\xfc\xb4 \xb5" "\x1f\x45\x47\xea \xe0\xf8\xfc\xdf\x12\x49\xfc\xf4\xb0 \xb5"
"\x1f\x46\x47\xea \xe8\xdf\x12\x44\xa3\x12\x45\xdf\x12\x44\xb4 \xb5" "\x1f\x46\x47\xea \xe8\xdf\x12\x43\xbf\xa3\x12\x45\xef\xdf\x12\x43\xb4 \xb5"
"\x1f\x47\x47\xea \xaa\xdf\xdf\xdf\xaf\xa1 \xfc\xdf\xdf\xfc \xa2\xaf\xdf\xdf\xdf\xa5 \xb5" "\x1f\x47\x47\xea \xaa\xdf\xdf\xdf\xaf\xa1\xe0\xfc\xdf\xdf\xfc\xb0\xa2\xaf\xdf\xdf\xdf\xa5 \xb5"
"\x1f\x48\x47\xea \xa2\xe3\xf8\xfe\xdf\xea\xdf\x12\x43\xb5\xdf\xfd\xf4\xb3\xa1 \xb5" "\x1f\x48\x47\xea \xa2\xe3\xf8\xfe\xdf\xea\xdf\x12\x43\xb5\xdf\xfd\xf4\xb3\xa1 \xb5"
"\x1f\x49\x47\xea \xdf\x12\x43\xea\xdf\x12\x43\xb5\xdf\x12\x43 \xb5" "\x1f\x49\x47\xea \xdf\x12\x43\xea\xdf\x12\x43\xb5\xdf\x12\x43 \xb5"
"\x1f\x4a\x47\xea \xdf\x12\x43\xfd\xf3\xaf\xaf\xf3\xfe\xdf\x12\x43 \xb5" "\x1f\x4a\x47\xea \xdf\x12\x43\xfd\xf3\xaf\xaf\xf3\xfe\xdf\x12\x43 \xb5"
"\x1f\x4b\x47\xea \xdf\x12\x4d \xb5" # Ende Telefon-Logo "\x1f\x4b\x47\xea \xdf\x12\x4d \xb5" # Ende Telefon-Logo
"\x1f\x4c\x47\xea \x12\x59\xb5" "\x1f\x4c\x47\xea \x12\x59\xb5"
"\x1f\x4d\x47\xea \x12\x44\xbc\xb4\xf0\xb0\xf4\xe0\xb0\xf0\xb0\xec\xa4\xf0\xb0\xb0\xb0\xf4 \x12\x44\xb5" # Logo-Text 1 "\x1f\x4d\x47\xea \x12\x44\xbc\xb4\xf0\xb0\xf4\xe0\xb0\xf0\xb0\xec\xa4\xf0\xb0\xb0\xb0\xf4 \x12\x44\xb5" # Logo-Text 1
"\x1f\x4e\x47\xea \x12\x44\xbf\xb1\xbd\xa5\xb5\xea \xb5\xb5\xea \xbd\xa5\xb9\xb1\xb5 \x12\x44\xb5" # Logo-Text 2 "\x1f\x4e\x47\xea \x12\x44\xbf\xb1\xbd\xa5\xb5\xea \xb5\xb5\xea \xbd\xa5\xb9\xb1\xb5 \x12\x44\xb5" # Logo-Text 2
"\x1f\x4f\x47\xea \x12\x44\xa1\xa1\xa3\xa1\xa3\xa2 \xa3\xa1\xa2 \xa3\xa1\xa1\xa1\xa3 \x12\x44\xb5" # Logo-Text 3 "\x1f\x4f\x47\xea \x12\x44\xa1\xa1\xa3\xa1\xa3\xa2 \xa3\xa1\xa2 \xa3\xa1\xa1\xa1\xa3 \x12\x44\xb5" # Logo-Text 3
"\x1f\x50\x47\xa2\xe4\xa0\x12\x57\xb8\xa1" "\x1f\x50\x47\xa2\xe4\xa0\x12\x57\xb8\xa1"
"\x1f\x51\x49\xa3\x12\x57\r\n" "\x1f\x51\x49\xa3\x12\x57\r\n"
"\x9b\x31\x40" # Farbtafel 1 "\x9b\x31\x40" # Farbtafel 1
"\x87\x19\x50\x12\x67" # Strich "\x87\x19\x50\x12\x67" # Strich
"\x9b\x30\x40" # Farbtafel 0 "\x9b\x30\x40" # Farbtafel 0
"\x87 Herzlich Willkommen in\r\n" "\x87 Herzlich Willkommen in\r\n"
"\x87 retroText!\r\n" "\x87 retroText!\r\n"
"\x9b\x31\x40" # Farbtafel 1 "\x9b\x31\x40" # Farbtafel 1
"\x87\x19\x50\x12\x67" "\x87\x19\x50\x12\x67"
"\x9b\x30\x40" # Farbtafel 0 "\x9b\x30\x40" # Farbtafel 0
"\x83Mit # fortfahren\r\n" "\x83Mit # fortfahren\r\n"
) )

View File

@ -6,16 +6,20 @@ Configuration file
import logging import logging
## general settings: ## define the location of rtx pages
PAGES="pages/" ## rtx searches all directories and serves the page from the first one
DEMOPAGES="demopages/" PAGES=[
"pages/",
"presentation/",
"demopages/",
]
## logging settings: ## logging settings:
# loglevel values: DEBUG (all messages) > INFO > WARNING > ERROR > CRITICAL (only cricital messages) # loglevel values: DEBUG (all messages) > INFO > WARNING > ERROR > CRITICAL (only cricital messages)
LOGLEVEL=logging.DEBUG LOGLEVEL=logging.DEBUG
## serial port settings: ## serial port settings:
PORT="/dev/pts/10" PORT="/dev/pts/5"
#PORT="/dev/ttyUSB0" #PORT="/dev/ttyUSB0"
BAUDRATE="2400" BAUDRATE="2400"
# if the system is connected directly (null-modem): MODE=direct # if the system is connected directly (null-modem): MODE=direct

1
demopages/11 Symbolic link
View File

@ -0,0 +1 @@
10501a

1
demopages/abida Symbolic link
View File

@ -0,0 +1 @@
35853a

1
demopages/adac Symbolic link
View File

@ -0,0 +1 @@
654320a

1
demopages/bka Symbolic link
View File

@ -0,0 +1 @@
86553222a

1
demopages/cbm Symbolic link
View File

@ -0,0 +1 @@
20095a

1
demopages/chip Symbolic link
View File

@ -0,0 +1 @@
50707545a

1
demopages/commodore Symbolic link
View File

@ -0,0 +1 @@
20095a

1
demopages/dimdi Symbolic link
View File

@ -0,0 +1 @@
44479a

1
demopages/eden Symbolic link
View File

@ -0,0 +1 @@
33033a

1
demopages/etb Symbolic link
View File

@ -0,0 +1 @@
1188a

1
demopages/faz Symbolic link
View File

@ -0,0 +1 @@
34034a

1
demopages/ffmi Symbolic link
View File

@ -0,0 +1 @@
34034100a

1
demopages/geisterbahn Symbolic link
View File

@ -0,0 +1 @@
5400404a

1
demopages/lotto Symbolic link
View File

@ -0,0 +1 @@
57575a

1
demopages/markttechnik Symbolic link
View File

@ -0,0 +1 @@
64064a

1
demopages/mut Symbolic link
View File

@ -0,0 +1 @@
64064a

1
demopages/neuemedien Symbolic link
View File

@ -0,0 +1 @@
34344a

1
demopages/pcnet Symbolic link
View File

@ -0,0 +1 @@
208888a

1
demopages/post Symbolic link
View File

@ -0,0 +1 @@
20000a

1
demopages/rheinpfalz Symbolic link
View File

@ -0,0 +1 @@
67007a

1
demopages/schrottplatz Symbolic link
View File

@ -0,0 +1 @@
9204920400920a

1
demopages/semmel Symbolic link
View File

@ -0,0 +1 @@
208585a

1
demopages/starduck Symbolic link
View File

@ -0,0 +1 @@
20147475a

1
demopages/vznrw Symbolic link
View File

@ -0,0 +1 @@
21212a

View File

@ -0,0 +1 @@
/B# ( @FA#!0Op!LL"Op!LL"0@@Cp!LL!O|OpL@Cp!0Gx!A`%@X!0Cp!LL!L@%0@@Cp!LL$Cp!0@@"ACG~!\@X@0@@"FC!LF!_xO`0GGGONXN_\\@!@@[[0xp@@yl!SM!@@[[0@@"p@!`@!@@"0'Yf AA # W€RetroText( @CA<0F><>!ƒ"#„$…%DJŒ1@‡&'()*(@1@BU‡RetroPulsiv 8.0DT‡26.+27. Nov. 2016EA…PgVA…Pg0@WA0@+ @„0€+ZurHuck Zeichensatz+„#€X` 1990aXA€

1
doc/CEPT/template.cept Normal file
View File

@ -0,0 +1 @@
/B# ( @GA# GA#!0'Yf 0@@@@CL@p@pOpqp|p@0@@@@@@@@@@CpO|0@@@@p@L@C|CCcOC@C0pOppppp@L@C@@@@0O|O|ss|O@@@@@@@@0|CCCCC@C@Lp@@@@=10 190a=2# 19001a/AA+ @ 1@# T0@RetroTextBA#!T"#$CA#!T%&' <20>UeberschriftEATextWA#!Tƒ0‡!ZurHuck Weiter!ƒ#‡X` 19000aXA

BIN
doc/DRCs.ods Normal file

Binary file not shown.

BIN
doc/Farbdefinition.ods Normal file

Binary file not shown.

11
doc/Nummernkreis 190.txt Normal file
View File

@ -0,0 +1,11 @@
190 - Leitseite ACN
190 0 - Präsentation
190 0xx
190 1 - RetroPulsiv
190 101 - Über die Retropulsiv
190 102 - Vortragsprogramm
190 9 - Testbilder
190 9xx

View File

@ -1,128 +0,0 @@
Präsentation retroText
----------------------
Bildschirmtext (Btx) war ein inter-
aktiver Onlinedienst.
Vorstellung auf der IFA '77 in Berlin
von Postminister Kurt Gscheidle
Entwickelt unter der Leitung von Eric
Danke, inspiriert 1975 durch Veröffent-
lichung über das britische
PRESTEL-System.
----
1980 Feldversuch mit 2000 Teilnehmern.
18. März 1983 Unterzeichnung des
Btx-Staatsvertrags
1. Sept. 1983 Start zur IFA
Nutzer: 1986 ca. 60.000 (gepl.: 1 Mio.)
erst 1996 1 Mio., aber da war es schon
T-Online mit Internet+E-Mail
31.12.2001: Abschaltung des
klassischen Btx
Online-Banking noch bis 10. Mai 2007
----
Btx-Leitzentrale in Ulm
Zu Beginn Vermittlungsstellen in
Düsseldorf, Hamburg, Frankfurt/M,
München, Stuttgart
Geplant waren 150 VSt...
----
Österreich:
Start Juni 1982,
MUPID als eigenes Terminal
(vgl. RetroPulsiv 7.0)
Ende: November 2001
----
Ähnliche Systeme in Europa:
Schweiz: Videotex
UK: Prestel
Schweden: Prestel plus
Frankreich: Minitel
Dänemark: Teledata
Italien: Videotel
Niederlande: Viditel
Spanien: Ibertex
Deutschland
-----------
Btx-Endgerät:
- Fernseher mit Btx-Decoder oder
Set-Top-Box (z.B. btxTv)
- Btx-Terminal (z.B. MultiTel, MultiKom)
- Computer mit Btx-Karten/-Modulen
oder Software
Postmodem:
- D-BT 03 war lange der Standard
- 1200 Bit/s empfangen,
75 Bit/s senden (V.23)
- feste Anschlußkennung (EPROM)
- fest programmierte Telefonnummer
- eigenes Anschlußinterface
- später auch alternative Modems,
Akustikkoppler erlaubt
- hierfür war "Software-Kennung" nötig
- Zugänge mit höherer Datenrate kamen
erst über die Jahre
Zugangsdaten:
- Anschlußkennung (12 Stellen) identi-
fiziert den Telefonanschluß
- aufgrunnd fehlender "CallerID", da ja
noch viele VSt Analogtechnik hatten
- Benutzerkennung identifiziert den
Teilnehmer
- Mitbenutzerkennung z.B. andere
Familienmitglieder
- Persönliches Kennwort als Sicherheit
- Für nomadische Benutzer:
- Anschlußfreizügigkeit
- Teilnehmerfreizügigkeit
Btx-Server:
- Hierarchisch organisiert
- Leitzentrale in Ulm mit IBM-Technik
- weitere VSt waren "Caches"
- "externe Rechner" wurden direkt
angesprochen, waren per Datex-P
(X.25) angebunden
- Beispiele: Quelle, Fluglinien, Bahn,
Banken ...
Kosten für Inhalte:
- "seitenabhängige Vergütung":
0,01 DM bis 9,99 DM möglich
- "zeitabhängige Vergütung":
0,01 DM bis 1,30 DM pro Min. möglich
- Abrechnung über Telefonrechnung
1993: Trennung von Netz (Datex-J)
und Inhalt (Btx)
Btx blieb aber der einzige Dienst
im Datex-J
1995: Umbenennung in T-Online
Österreich: "PAN" (Public Access
Network), 1993-1995
Der CEPT-Standard
-----------------
https://de.wikipedia.org/wiki/Minitel

BIN
doc/rtx-Logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 386 B

36
doc/socat mit dosbox.txt Normal file
View File

@ -0,0 +1,36 @@
socat mit DosBox als "virtuelles Modem"
---------------------------------------
In der dosbox-Konfigurationsdatei folgenden Eintrag hinzufügen/ändern:
----------
[serial]
serial1=nullmodem server port:5000
----------
Nun öffnet dosbox beim Start den TCP-Port 5000, worüber COM1 von DOS aus
verfügbar ist.
Um von Linux-Seite her einen "virtuellen seriellen Port" zur Vefügung zu haben,
folgendes Kommando eingeben:
# socat -d -d tcp:127.0.0.1:5000 pty,raw,echo=0
Dies verbindet den Port 5000 (dosbox) mit einem neuen /dev/pts-Device.
Welches /dev/pts-Device es ist, gibt socat beim Start aus, z.B.:
----------
socat[8054] N opening connection to AF=2 127.0.0.1:5000
socat[8054] N successfully connected from local address AF=2 127.0.0.1:51590
socat[8054] N PTY is /dev/pts/5
socat[8054] N starting data transfer loop with FDs [5,5] and [6,6]
----------
In die RetroText-Konfiguration config.py muß nun (in diesem Beispiel)
PORT="/dev/pts/5"
MODE="direct"
eingetragen werden.
MODE="direct" sorgt dafür, daß nicht auf ein Klingelzeichen gewartet wird,
welches von dosbox/socat nicht ausgegeben wird.

15
pages/190101a Normal file
View File

@ -0,0 +1,15 @@
/B# ( @FA#!0Op!LL"Op!LL"0@@Cp!LL!O|OpL@Cp!0Gx!A`%@X!0Cp!LL!L@%0@@Cp!LL$Cp!0@@"ACG~!\@X@0@@"FC!LF!_xO`0GGGONXN_\\@!@@[[0xp@@yl!SM!@@[[0@@"p@!`@!@@"0'Yf =10 190a=2# 190102a/AA # W€RetroText( @CA<0F><>!ƒ"#„$…%DJŒ1@‡&'()*(@1@BU‡RetroPulsiv 8.0DR‡HUber die RetroPulsivEA…PgVA…Pg0@+ @FA€
<20>Es gib zu wenig Retrocomputing-
Veranstaltungen im SHuden der Republik!
€Wer kennt sie nicht, die Computer der
60er, 70er und 80er Jahre? Kaum jemand
aus der "Generation Golf" saû nicht in
seiner Jugend vor einem C64, CPC oder
trHaumte von einem Amiga oder Atari ST.
Diese Zeit, in der die Welt der Compu-
ter vielfHaltig war und die begrenzten
technischen MHoglichkeiten ein hohes Maû
an Kreativitat fHorderten, „wird auf der
RETROpulsiv an der HS Augsburg (erneut)
zum Leben erweckt!€WA0@„0€+ZurHuck VortrHage+„#€Xb€190101aXA€

16
pages/190102a Normal file
View File

@ -0,0 +1,16 @@
/B# ( @FA#!0Op!LL"Op!LL"0@@Cp!LL!O|OpL@Cp!0Gx!A`%@X!0Cp!LL!L@%0@@Cp!LL$Cp!0@@"ACG~!\@X@0@@"FC!LF!_xO`0GGGONXN_\\@!@@[[0xp@@yl!SM!@@[[0@@"p@!`@!@@"0'Yf =10 190a=2# 190103a/AA # W€RetroText( @CA<0F><>!ƒ"#„$…%DJŒ1@‡&'()*(@1@BU‡RetroPulsiv 8.0DR‡Das VortragsprogrammEA…PgVA…Pg0@+ @FA<46>šSamstag 26. November 2016™
„11:30 …Dr. Stefan HHoltgen:€
G.W. Leibniz und der ALTAIR 8800
Eine archHaologische Verschaltung
von Computern und Philosophie
„15:00 …Herwig Solf:€ Feuer fur den A500
klassische Beschleunigung
fHur die Freundin, aber wie?
„17:00 …Christian Krenner:€ Space Chase:
Entwicklung eines Spiels fHur die
CBM II-Computer
<EFBFBD>šSonntag 27. November 2016™€
„13:00 …Richard LHowenstein:€ RESHOOT
Entwicklung eines Shoot em Up
fHur den Amiga 1200WA0@„0€+ZurHuck Veranstaltungen+„#€Xb€190102aXA€

1
pages/190103a Normal file
View File

@ -0,0 +1 @@
/B# ( @FA#!0Op!LL"Op!LL"0@@Cp!LL!O|OpL@Cp!0Gx!A`%@X!0Cp!LL!L@%0@@Cp!LL$Cp!0@@"ACG~!\@X@0@@"FC!LF!_xO`0GGGONXN_\\@!@@[[0xp@@yl!SM!@@[[0@@"p@!`@!@@"0'Yf =10 190a/AA # W€RetroText( @CA<0F><>!ƒ"#„$…%DJŒ1@‡&'()*(@1@BU‡RetroPulsiv 8.0CY‡WeitereDQ‡PflichtveranstaltungenEA…PgVA…Pg0@+ @FA<46>...WA0@„0€+ZurHuckXb€190103aXA€

View File

@ -1,8 +1,7 @@
/# ( @GA#!0@@@@CL@p@pOpqp|p@0@@@@@@@@@@CpO|0@@@@p@L@C|CCcOC@C0pOppppp@L@C@@@@0O|O|ss|O@@@@@@@@0|CCCCC@C@Lp@@@@AA 1@# T(@"A0@ž‡( @!"# /B# ( @GA#!0@@@@CL@p@pOpqp|p@0@@@@@@@@@@CpO|0@@@@p@L@C|CCcOC@C0pOppppp@L@C@@@@0O|O|ss|O@@@@@@@@0|CCCCC@C@Lp@@@@0'Yf =10 1909a=2# 190911a/AA 1@# T"Až0@‡RetroText
$%& (@ + @#!T
<EFBFBD>Bildschirmtrix #!T1@<40>Œ$%& !"#
#!T <EFBFBD> Testbild: ZeichensHatze
#!T1@<40> Testbild: ZeichensHatze *charset#
<0A>0@<40><><EFBFBD> <0A>0@<40><><EFBFBD>
(@<0F><>G0-SET:<3A><> <20>!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~<7E> (@<0F><>G0-SET:<3A><> <20>!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~<7E>
@ -10,7 +9,4 @@
(@<0F><>G2-SET:<3A><>(b <20>!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~<7E> (@<0F><>G2-SET:<3A><>(b <20>!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~<7E>
(@€G3-SET:‡ž(d <20>!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ž (@€G3-SET:‡ž(d <20>!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ž WA(@#!Tƒ0‡'ZurHuck DRCS'ƒ#‡X` 190910aXA
(@#!TWeiter mit # oder *Seitennummer#
Eingabe ==>

16
pages/1909111a Normal file
View File

@ -0,0 +1,16 @@
/B# ( @KA#!0@^QHJCEDBB0@@p_@yabCA0@DO`XN{trH0@f@@@@`pP0@@x~DCXX[X0@@@@@@xOpX0@@@@@@@@|N0CAABFLLHLD0WJGCA@@@AB0eRH`pPQhLF0FCAHfPHh`@0ToHXYIHIIL0aFX`@@@`@`0p@@@@@@@@@0DEECCAA@@@0Lxpp@@GlXO0CA@@Gx@Oxp0@pPPXHHhhl0LLDDCCA@AA0PPxp`@@```0@@@@@@@@@@0@@@x_@@@@0GB]A@pP@C0Qqcb@@@@CB0DDFBBBBrNB0@@@@@@@@@@0```PPPPLom0@@@@@@@@@`=10 1909a=2# 1909112aAA 1@# T"A0@ž‡RetroText
#!T
#!T0@ž‡<C5BE>” Testbild DRCS
0@ž‡Œ
BTX DRCS-Beispiel nach CEPT T/CD 6-1
Alle geladenen DRCS Zeichen:
( @!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
(@Zusammengebaut zu einem Bild:
( @!"#$%&'
()*+,-.
/012345
6789:;<
(@*Facepalm*žWA(@#!Tƒ0‡...ZurHuck Weiter...ƒ#‡X` 1909111aXA

20
pages/1909112a Normal file
View File

@ -0,0 +1,20 @@
/C /@XSeite wird aufgebaut/B# ( @GA#!0@@@@@@@@@@@@@@@@@@@@0@@@@@@@@@A@G@L@sAoFO0@A@OCp\]`\P]|]~O^N^G0`ANsnww}wm~bGp0`@|@Gp`^`S`pApCqCsxw0@@@@@@@@@@p@L@b@q`rp0@@@@@@@@@@@@@@@@@@@@0@@@@@@@A@C@F@D@J@V@w0LgX{~_o^O{CfChAX@`A@0lxc`L@p@`@@@@@@@@@@w0@@@@@sAsCWDQ[@}`t`j`0NMAq@M`B@A@@@@M@BP@\0gH}t|rmuoNR_LFsCvAd0@@@@@@@@`@P@h@l@T@r@0@cAYA~B|BNE{G|OeI}H}0b@t@OOsSOPn`S`L@B@A0A{AAz@~@`@@@@@`@@Bg0R`BX@H@FABCAB@M@_B~B0@^@G@A@A@A@@~@pS~P0@w`WPI|EnEGbAA@A@@`@0m@]@|`|`bPwP]H\HhL`D0HBPBPBPDpDaDodeLhoh0@AHBpCpBqCA^AHA@@@@0B^Al@P@@@A@AH@HOhGdA0@B@BX@|P|pxwAgFgGO0XWEM_w0P@d@~@}L~|CpAp@`T~d0`DPDPFPBHBHBkZk{y[y0lHoHoIlIoiol`L`D`DpD0C@G@f@DA|ArAXAXBXBpB0B@pOhPFPAp@@D@]@KpG`0_OF[xWL_GG_|y_y[0c0~H~C~b~j}hHZvf}0YiYyYyiiimiykcxBxBxB0PDPBPZK~OqI}O}D_DC0pBPBLBLB@B@B`A`APAPA0@@@A@C@GAF_D_XY_i0_`p0G{~~0y{y`ypypY`[@B@D0pBpFpDhDnDlOhshsP_P0CAAAc@n@X@X@K@G@B@A0h@lAvA[AYazq~Y]Lvmy0h@dC@@GAHOG@hGwcX@o@0o_sG[OwY@0y~~||xp`a0@E@J@W@gAkC]D^HOwFo@0~`|`Y@I@z@t@l@h@P@`@0@A@@@@@@@@@@@@@@@@@@0{|wIM}B^An@p@L@C@A0t`LPCdDMcKsYCUcGGsG0@@@@@@}Y{Y0f|g~GpEWG_gc{`{G0_AorD}X|pi`f@L@p@@@0@@@@@@@@@@@@@@@@@@@@=10 1909a=2# 190912a/AA 1@# T(@"A0@ž‡RetroText
#!T
#!T0@ž‡<C5BE>” Testbild DRCS2
0@ž‡ŒBTX DRCS-Beispiel nach CEPT T/CD 6-1
Geladenene DRCS Zeichen:
( @!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
(@Zusammengebaut zu einem Bild:
( @Ž!"#$%&'
()*+,-.
/012345
6789:;<
=>?@ABC
DEFGHIJ
KLMNOPQ
RSTUVWX
ŒWA(@#!Tƒ0‡...ZurHuck Farben...ƒ#‡X` 1909112aXA

13
pages/190911a Normal file
View File

@ -0,0 +1,13 @@
/B# ( @GA#!0@@@@CL@p@pOpqp|p@0@@@@@@@@@@CpO|0@@@@p@L@C|CCcOC@C0pOppppp@L@C@@@@0O|O|ss|O@@@@@@@@0|CCCCC@C@Lp@@@@0'Yf =10 1909a=2# 1909111a/AA 1@# T+ @"Až0@‡RetroText
#!T
#!T1@<40>Œ$%& !"#
<EFBFBD> Testbild: DRCS
0@Œž‡
(@€G0-SET:‡ž <20>!"#$%&'()*+,-./0123456789:;<=>?ž
€DRCS: ‡ž ( @<0F>!"#$%&'()*+,-./0123456789:;<=>?ž(@
(@€G0-SET:‡ž <20>@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ž€DRCS: ‡ž ( @<0F>@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ž(@
(@€G0-SET:‡ž <20>`abcdefghijklmnopqrstuvwxyz{|}~ž
€DRCS: ‡ž ( @<0F>`abcdefghijklmnopqrstuvwxyz{|}~žWA(@#!Tƒ0‡'ZurHuck Weiter'ƒ#‡X` 190911aXA

View File

@ -1,8 +1,8 @@
/# ( @GA#!0@@@@CL@p@pOpqp|p@0@@@@@@@@@@CpO|0@@@@p@L@C|CCcOC@C0pOppppp@L@C@@@@0O|O|ss|O@@@@@@@@0|CCCCC@C@Lp@@@@AA 1@# T(@"A0@ž‡( @!"# /B# ( @GA#!0@@@@CL@p@pOpqp|p@0@@@@@@@@@@CpO|0@@@@p@L@C|CCcOC@C0pOppppp@L@C@@@@0O|O|ss|O@@@@@@@@0|CCCCC@C@Lp@@@@0'Yf =10 1909a=2# 190920a/AA 1@# T+ @"Až0@‡RetroText
$%& (@
<EFBFBD>Bildschirmtrix
#!T #!T
#!T1@<40> Testbild: Farben *colorset# #!T1@<40>Œ$%& !"#
<EFBFBD> Testbild: Farben
0@Œž‡(@0@€Farbtabelle #1‡ž 0@Œž‡(@0@€Farbtabelle #1‡ž
0@<40> “ ” • <20> “ ” • 0@<40> “ ” • <20> “ ” •
0@€Farbtabelle #2‡ž 0@€Farbtabelle #2‡ž
@ -12,5 +12,4 @@
0@€Farbtabelle #4 (Frei definierbar)‡ž 0@€Farbtabelle #4 (Frei definierbar)‡ž
3@<40> “ ” • <20> “ ” • 3@<40> “ ” • <20> “ ” •
0@ 0@
ž‡(@#!TWeiter mit # oder *Seitennummer# žWA(@#!Tƒ0‡'ZurHuck Farbreinheit rot'ƒ#‡X` 190912aXA
Eingabe ==>

1
pages/190920a Normal file
View File

@ -0,0 +1 @@
/B=10 1909a=2# 190921a/AA # Q€

1
pages/190921a Normal file
View File

@ -0,0 +1 @@
/B=10 1909a=2# 190922a/AA # R€

1
pages/190922a Normal file
View File

@ -0,0 +1 @@
/B=10 1909a=2# 190923a/AA # T€

1
pages/190923a Normal file
View File

@ -0,0 +1 @@
/B=10 1909a=2# 190924a/AA # W€

View File

@ -1 +1 @@
# P≒(dZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ (@ /B=10 1909a=2# 190925a/AA # P‡<50>(@................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................

View File

@ -1 +1 @@
# P≒(@................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ /B=10 1909a=2# 190926a/AA # P≒(dZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ (@

1
pages/190926a Normal file
View File

@ -0,0 +1 @@
/B=10 1909a=2# 1909a/AA # P<>— “ ” — “ ” — “ ” — “ ” — “ ” — “ ” — “ ” — “ ” — “ ” — “ ” — “ ” — “ ” — “ ” — “ ” — “ ” — “ ” — “ ” — “ ” — “ ” ” <20><20> <20> — ” <20><20> <20> — ” <20><20> <20> — ‡<>

18
pages/1909a Normal file
View File

@ -0,0 +1,18 @@
/B# ( @GA# GA#!0@@@@CL@p@pOpqp|p@0@@@@@@@@@@CpO|0@@@@p@L@C|CCcOC@C0pOppppp@L@C@@@@0O|O|ss|O@@@@@@@@0|CCCCC@C@Lp@@@@0'Yf =110190910a=211190911a=312190912a=420190920a=521190921a=622190922a=723190923a=824190924a=925190925a=:26190926a=;0 190a=<# 190910a/AA 1@# T"Až0@‡RetroText
#!T
#!T1@+ @Œ$%& !"#
<EFBFBD> Testbilder *test#
0@Œž‡* @
š†Decodertest:‡™
Zeichensatz§Lƒ10‡
Zeichensatz (DRCS)§Eƒ11‡
Farben§Qƒ12‡
š†Monitortest:‡™
Farbreinheit (rot)§Eƒ20‡
Farbreinheit *b(grHun)* @§Dƒ21‡
Farbreinheit (blau)§Dƒ22‡
Farbreinheit (weiss)§Cƒ23‡
Konvergenz§Mƒ24‡
Geometrie§Nƒ25‡
Farbbalken§Mƒ26‡žWA(@#!Tƒ0‡'*bZurHuck* @ Zeichensatz'ƒ#‡X` 1909aXA

10
pages/190a Normal file
View File

@ -0,0 +1,10 @@
/B# ( @FA#!0Op!LL"Op!LL"0@@Cp!LL!O|OpL@Cp!0Gx!A`%@X!0Cp!LL!L@%0@@Cp!LL$Cp!0@@"ACG~!\@X@0@@"FC!LF!_xO`0GGGONXN_\\@!@@[[0xp@@yl!SM!@@[[0@@"p@!`@!@@"0'Yf =11 190101a=22 190102a=33 1909a=44 1900a=55 200961a/AA # W€RetroText( @CA<0F><>!ƒ"#„$…%DJŒ1@‡&'()*(@1@BU‡RetroPulsiv 8.0DT‡26.+27. Nov. 2016EA…PgVA…Pg0@+ @FA€
<20>Herzlich Willkommen zur RetroPulsiv!€
HUber die RetroPulsiv +C 1
Vortragsprogramm +G 2
Testbilder +M 3
PrHasentation +K 4
Btx-Demonstration +F 5WA0@„0€+ZurHuck Zeichensatz+„#€Xe€190aXA€

View File

@ -1 +0,0 @@
# T<>

View File

@ -1 +0,0 @@
# P<><50> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20><>

View File

@ -1,21 +0,0 @@
/# ) @GA#!0@@@@CL@p@pOpqp|p@0@@@@@@@@@@CpO|0@@@@p@L@C|CCcOC@C0pOppppp@L@C@@@@0O|O|ss|O@@@@@@@@0|CCCCC@C@Lp@@@@AA 1@# T(@"A0@ž‡(c|||
/// (@
<EFBFBD>Bildschirmtrix
#!T
#!T1@<40> Testbild: DRCS *drcs#
0@Œž‡
(@€G0-SET:‡ž <20>!"#$%&'()*+,-./0123456789:;<=>?ž
€DRCS: ‡ž ( @<0F>!"#$%&'()*+,-./0123456789:;<=>?ž(@
(@€G0-SET:‡ž <20>@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ž€DRCS: ‡ž ( @<0F>@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ž(@
(@€G0-SET:‡ž <20>`abcdefghijklmnopqrstuvwxyz{|}~ž
€DRCS: ‡ž ( @<0F>`abcdefghijklmnopqrstuvwxyz{|}~ž(@
#!TWeiter mit # oder *Seitennummer#
Eingabe ==>

View File

@ -1,20 +0,0 @@
/# ( @KA#!0@^QHJCEDBB0@@p_@yabCA0@DO`XN{trH0@f@@@@`pP0@@x~DCXX[X0@@@@@@xOpX0@@@@@@@@|N0CAABFLLHLD0WJGCA@@@AB0eRH`pPQhLF0FCAHfPHh`@0ToHXYIHIIL0aFX`@@@`@`0p@@@@@@@@@0DEECCAA@@@0Lxpp@@GlXO0CA@@Gx@Oxp0@pPPXHHhhl0LLDDCCA@AA0PPxp`@@```0@@@@@@@@@@0@@@x_@@@@0GB]A@pP@C0Qqcb@@@@CB0DDFBBBBrNB0@@@@@@@@@@0```PPPPLom0@@@@@@@@@`AA 1@# T(@"A0@ž‡Bildschirmtrix
0@#!W
#!W1@ž„1@<40> Testbild *drcs#
0@ž‡ŒBTX DRCS-Beispiel nach CEPT T/CD 6-1
Alle geladenen DRCS Zeichen:
( @!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
(@Zusammengebaut zu einem Bild:
( @!"#$%&'
()*+,-.
/012345
6789:;<
(@*Facepalm*
(@# um zweite seite zu laden
Eingabe ==>

View File

@ -1,20 +0,0 @@
/# ( @GA#!0@@@@@@@@@@@@@@@@@@@@0@@@@@@@@@A@G@L@sAoFO0@A@OCp\]`\P]|]~O^N^G0`ANsnww}wm~bGp0`@|@Gp`^`S`pApCqCsxw0@@@@@@@@@@p@L@b@q`rp0@@@@@@@@@@@@@@@@@@@@0@@@@@@@A@C@F@D@J@V@w0LgX{~_o^O{CfChAX@`A@0lxc`L@p@`@@@@@@@@@@w0@@@@@sAsCWDQ[@}`t`j`0NMAq@M`B@A@@@@M@BP@\0gH}t|rmuoNR_LFsCvAd0@@@@@@@@`@P@h@l@T@r@0@cAYA~B|BNE{G|OeI}H}0b@t@OOsSOPn`S`L@B@A0A{AAz@~@`@@@@@`@@Bg0R`BX@H@FABCAB@M@_B~B0@^@G@A@A@A@@~@pS~P0@w`WPI|EnEGbAA@A@@`@0m@]@|`|`bPwP]H\HhL`D0HBPBPBPDpDaDodeLhoh0@AHBpCpBqCA^AHA@@@@0B^Al@P@@@A@AH@HOhGdA0@B@BX@|P|pxwAgFgGO0XWEM_w0P@d@~@}L~|CpAp@`T~d0`DPDPFPBHBHBkZk{y[y0lHoHoIlIoiol`L`D`DpD0C@G@f@DA|ArAXAXBXBpB0B@pOhPFPAp@@D@]@KpG`0_OF[xWL_GG_|y_y[0c0~H~C~b~j}hHZvf}0YiYyYyiiimiykcxBxBxB0PDPBPZK~OqI}O}D_DC0pBPBLBLB@B@B`A`APAPA0@@@A@C@GAF_D_XY_i0_`p0G{~~0y{y`ypypY`[@B@D0pBpFpDhDnDlOhshsP_P0CAAAc@n@X@X@K@G@B@A0h@lAvA[AYazq~Y]Lvmy0h@dC@@GAHOG@hGwcX@o@0o_sG[OwY@0y~~||xp`a0@E@J@W@gAkC]D^HOwFo@0~`|`Y@I@z@t@l@h@P@`@0@A@@@@@@@@@@@@@@@@@@0{|wIM}B^An@p@L@C@A0t`LPCdDMcKsYCUcGGsG0@@@@@@}Y{Y0f|g~GpEWG_gc{`{G0_AorD}X|pi`f@L@p@@@0@@@@@@@@@@@@@@@@@@@@AA 1@# T(@"A0@ž‡Bildschirmtrix
0@#!W
#!W1@ž„1@<40> Testbild *drcs2#
0@ž‡ŒBTX DRCS-Beispiel nach CEPT T/CD 6-1
Geladenene DRCS Zeichen:
( @!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
(@Zusammengebaut zu einem Bild:
( @Ž!"#$%&'
()*+,-.
/012345
6789:;<
=>?@ABC
DEFGHIJ
KLMNOPQ
RSTUVWX
Œ(@(@# fHur HUbersicht
Eingabe ==>

View File

@ -1 +0,0 @@
# R<>

View File

@ -1 +0,0 @@
# Q<>

1
pages/test Symbolic link
View File

@ -0,0 +1 @@
1990a

View File

@ -1,25 +0,0 @@
/# ( @GA#!0@@@@CL@p@pOpqp|p@0@@@@@@@@@@CpO|0@@@@p@L@C|CCcOC@C0pOppppp@L@C@@@@0O|O|ss|O@@@@@@@@0|CCCCC@C@Lp@@@@AA 1@# T(@"A0@ž‡( @!"#
$%& (@
<EFBFBD>Bildschirmtrix
#!T
#!T1@<40> Testbilder: *testbild#
0@Œž‡(@
šDecodertest:™
Zeichensatz.............ƒ10 *charset#‡
Zeichensatz (DRCS)......ƒ11 *drcs#‡
Farben..................ƒ12 *colorset#‡
šMonitortest:™
Farbreinheit (rot)......ƒ20 *red#‡
Farbreinheit (grHun).....ƒ21 *green#‡
Farbreinheit (blau).....ƒ22 *blue#‡
Farbreinheit (weiss)....ƒ23 *white#‡
Konvergenz .............ƒ24 *dots#‡
Geometrie ..............ƒ25 *crosshatch#‡
Farbbalken .............ƒ26 *colorbars#‡
#!TWeiter mit # oder *Seitennummer#
Eingabe ==>

View File

@ -1 +0,0 @@
# W€

15
presentation/190000a Normal file
View File

@ -0,0 +1,15 @@
/B# ( @GA# GA#!0'Yf 0@@@@CL@p@pOpqp|p@0@@@@@@@@@@CpO|0@@@@p@L@C|CCcOC@C0pOppppp@L@C@@@@0O|O|ss|O@@@@@@@@0|CCCCC@C@Lp@@@@=10 1900a=2# 190001a/AA+ @ 1@# T0@RetroTextBA#!T"#$CA#!T%&' <20>BildschirmtextEABildschirmtext (Btx) war ein inter-
aktiver Onlinedienst.
Vorstellung auf der ƒIFA '77‡ in Berlin
von Postminister Kurt Gscheidle
Entwickelt unter der Leitung von Eric
Danke, inspiriert ƒ1975‡ durch VerHoffent-
lichung Huber das britische
PRESTEL-System.
ƒ1980‡ Feldversuch mit 2000 Teilnehmern.
18. MHarz ƒ1983‡ Unterzeichnung des
Btx-Staatsvertrags
1. Sept. ƒ1983‡ Start zur IFAWA#!Tƒ0‡!ZurHuck Weiter!ƒ#‡X` 190000aXA

13
presentation/190001a Normal file
View File

@ -0,0 +1,13 @@
/B# ( @GA# GA#!0'Yf 0@@@@CL@p@pOpqp|p@0@@@@@@@@@@CpO|0@@@@p@L@C|CCcOC@C0pOppppp@L@C@@@@0O|O|ss|O@@@@@@@@0|CCCCC@C@Lp@@@@=10 1900a=2# 190002a/AA+ @ 1@# T0@RetroTextBA#!T"#$CA#!T%&' <20>BildschirmtextEANutzer: ƒ1986‡ ca. ƒ60.000‡ (gepl.: 1 Mio.)
erst ƒ1996 1 Mio.‡, aber da war es schon
T-Online mit Internet+E-Mail
ƒ31.12.2001‡: Abschaltung des
klassischen Btx
Online-Banking noch bis 10. Mai ƒ2007‡
Btx-Leitzentrale in ƒUlm‡
Zu Beginn Vermittlungsstellen in
DHusseldorf, Hamburg, Frankfurt/M,
MHunchen, Stuttgart
Geplant waren 150 VSt...WA#!Tƒ0‡!ZurHuck Weiter!ƒ#‡X` 190001aXA

16
presentation/190002a Normal file
View File

@ -0,0 +1,16 @@
/B# ( @GA# GA#!0'Yf 0@@@@CL@p@pOpqp|p@0@@@@@@@@@@CpO|0@@@@p@L@C|CCcOC@C0pOppppp@L@C@@@@0O|O|ss|O@@@@@@@@0|CCCCC@C@Lp@@@@=10 190001a=2# 190003a/AA+ @ 1@# T0@RetroTextBA#!T"#$CA#!T%&' <20>Andere LHanderEA†šHOsterreich:™‡
Start Juni ƒ1982‡,
MUPID als eigenes Terminal
(vgl. RetroPulsiv 7.0)
Ende: November ƒ2001‡
HAhnliche Systeme in šEuropa™:
†Schweiz‡: Videotex
†UK‡: Prestel
†Schweden‡: Prestel plus
†Frankreich‡: Minitel
†DHanemark‡: Teledata
†Italien‡: Videotel
†Niederlande‡: Viditel
†Spanien‡: IbertexWA#!Tƒ0‡!ZurHuck Weiter!ƒ#‡X` 190002aXA

8
presentation/190003a Normal file
View File

@ -0,0 +1,8 @@
/B# ( @GA# GA#!0'Yf 0@@@@CL@p@pOpqp|p@0@@@@@@@@@@CpO|0@@@@p@L@C|CCcOC@C0pOppppp@L@C@@@@0O|O|ss|O@@@@@@@@0|CCCCC@C@Lp@@@@=10 190002a=2# 190004a/AA+ @ 1@# T0@RetroTextBA#!T"#$CA#!T%&' <20>Btx in DeutschlandEA…šBtx-EndgerHate:‡™
- Fernseher mit Btx-Decoder oder
Set-Top-Box (z.B. btxTv)
- Btx-Terminal (z.B. MultiTel/-Kom)
- Computer mit Btx-Karten/-Modulen
oder Software
- HOffentliche Btx-TerminalsWA#!Tƒ0‡!ZurHuck Weiter!ƒ#‡X` 190003aXA

13
presentation/190004a Normal file
View File

@ -0,0 +1,13 @@
/B# ( @GA# GA#!0'Yf 0@@@@CL@p@pOpqp|p@0@@@@@@@@@@CpO|0@@@@p@L@C|CCcOC@C0pOppppp@L@C@@@@0O|O|ss|O@@@@@@@@0|CCCCC@C@Lp@@@@=10 190003a=2# 190005a/AA+ @ 1@# T0@RetroTextBA#!T"#$CA#!T%&' <20>ModemsEA…Postmodem:‡
- D-BT 03 war lange der Standard
- ƒ1200‡ Bit/s empfangen,
ƒ75‡ Bit/s senden (V.23)
- feste Anschluûkennung (EPROM)
- fest programmierte Telefonnummer
- eigenes Anschluûinterface
- spHater auch alternative Modems,
Akustikkoppler erlaubt
- hierfHur war ƒSoftware-Kennung‡ nHotig
- ZugHange mit hHoherer Datenrate kamen
erst Huber die JahreWA#!Tƒ0‡!ZurHuck Weiter!ƒ#‡X` 190004aXA

16
presentation/190005a Normal file
View File

@ -0,0 +1,16 @@
/B# ( @GA# GA#!0'Yf 0@@@@CL@p@pOpqp|p@0@@@@@@@@@@CpO|0@@@@p@L@C|CCcOC@C0pOppppp@L@C@@@@0O|O|ss|O@@@@@@@@0|CCCCC@C@Lp@@@@=10 190004a=2# 190006a/AA+ @ 1@# T0@RetroTextBA#!T"#$CA#!T%&' <20>ZugangsdatenEA- †Anschluûkennung‡ (12 Stellen) identi-
fiziert den Telefonanschluû
- aufgrunnd fehlender ƒCallerID‡, da ja
noch viele VSt Analogtechnik hatten
- zunHachst fest in D-BT03 integriert,
spHater ƒSoftware-Kennung‡ mHoglich
- †Benutzerkennung‡ identifiziert den
Teilnehmer
- †Mitbenutzerkennung‡ z.B. andere
Familienmitglieder
- †PersHonliches Kennwort‡ als Sicherheit
- FHur nomadische Benutzer:
- AnschluûfreizHugigkeit
- TeilnehmerfreizHugigkeitWA#!Tƒ0‡!ZurHuck Weiter!ƒ#‡X` 190005aXA

16
presentation/190006a Normal file
View File

@ -0,0 +1,16 @@
/B# ( @GA# GA#!0'Yf 0@@@@CL@p@pOpqp|p@0@@@@@@@@@@CpO|0@@@@p@L@C|CCcOC@C0pOppppp@L@C@@@@0O|O|ss|O@@@@@@@@0|CCCCC@C@Lp@@@@=10 190005a=2# 190007a/AA+ @ 1@# T0@RetroTextBA#!T"#$CA#!T%&' <20>Btx-ZentraleEADas Btx-System war hierarchisch
organisiert.
- ƒLeitzentrale‡ in Ulm mit IBM-Technik
- weitere VSt waren "Caches"
- †externe Rechner‡ wurden direkt
angesprochen, waren per ƒDatex-P‡
(X.25) angebunden
- Beispiele: Quelle, Fluglinien, Bahn,
Banken ...
Kosten fHur Inhalte:
- †seitenabhHangige VergHutung‡:
ƒ0,01 DM‡ bis ƒ9,99 DM‡ mHoglich
- †zeitabhHangige VergHutung‡:
ƒ0,01 DM‡ bis ƒ1,30 DM‡ pro Min. mHoglich
- Abrechnung Huber TelefonrechnungWA#!Tƒ0‡!ZurHuck Weiter!ƒ#‡X` 190006aXA

12
presentation/190007a Normal file
View File

@ -0,0 +1,12 @@
/B# ( @GA# GA#!0'Yf 0@@@@CL@p@pOpqp|p@0@@@@@@@@@@CpO|0@@@@p@L@C|CCcOC@C0pOppppp@L@C@@@@0O|O|ss|O@@@@@@@@0|CCCCC@C@Lp@@@@=10 190006a=2# 190008a/AA+ @ 1@# T0@RetroTextBA#!T"#$CA#!T%&' <20>Datex-JEA…Datex-J‡:
ƒ1993‡: Trennung von Netz (Datex-J)
und Inhalt (Btx)
Btx blieb aber der einzige
Dienst in Datex-J
ƒ1995‡: Umbenennung in †T-Online‡
HOsterreich:‡
ƒPAN‡ (Public Access Network)
ƒ1993‡-ƒ1995‡WA#!Tƒ0‡!ZurHuck Weiter!ƒ#‡X` 190007aXA

15
presentation/190008a Normal file
View File

@ -0,0 +1,15 @@
/B# ( @GA# GA#!0'Yf 0@@@@CL@p@pOpqp|p@0@@@@@@@@@@CpO|0@@@@p@L@C|CCcOC@C0pOppppp@L@C@@@@0O|O|ss|O@@@@@@@@0|CCCCC@C@Lp@@@@=10 190007a=2# 190009a/AA+ @ 1@# T0@RetroTextBA#!T"#$CA#!T%&' <20>Frankreich: MinitelEASehr erfolgreiches System mit
eigenen Terminals.
Testbetrieb ƒ1981‡, Start ƒ1982‡.
Einstellung ƒ30.Juni 2012‡ (!)
Terminals kostenlos erhHaltlich, statt
gedrucktem Telefonbuch.
ƒ1985‡: 1 Mio. Nutzer
ƒ1990‡: 4 Mio. Nutzer
ƒ1990er‡: 25.000 Dienste
ƒ2000‡: 25 Mio. Nutzer (HHochstzahl)
ƒ2010‡: 2 Mio. Nutzer - 2.400 Dienste
ƒJuni 2012‡: 400.000 N. / 1.800 D.WA#!Tƒ0‡!ZurHuck Weiter!ƒ#‡X` 190008aXA

13
presentation/190009a Normal file
View File

@ -0,0 +1,13 @@
/B# ( @GA# GA#!0'Yf 0@@@@CL@p@pOpqp|p@0@@@@@@@@@@CpO|0@@@@p@L@C|CCcOC@C0pOppppp@L@C@@@@0O|O|ss|O@@@@@@@@0|CCCCC@C@Lp@@@@=10 190008a=2# 190010a/AA+ @ 1@# T0@RetroTextBA#!T"#$CA#!T%&' <20>Der CEPT-StandardEADie bei Btx dargestellten Daten sind
im CEPT-Standard gespeicherte Seiten.
CEPT-Seiten sind mit Steuerzeichen
angereicherte Textdateien. Die Steuer-
zeichen sind jedoch am besten mit einem
Hex-Editor sicht- und editierbar.
HUber Steuerzeichen lassen sich Farb-
paletten Handern, Zeichenattribute fest-
legen, der Zeichensatz umschalten und
auch eigene ZeichensHatze frei
definieren (ƒDRCS‡).WA#!Tƒ0‡!ZurHuck Weiter!ƒ#‡X` 190009aXA

14
presentation/190010a Normal file
View File

@ -0,0 +1,14 @@
/B# ( @GA# GA#!0'Yf 0@@@@CL@p@pOpqp|p@0@@@@@@@@@@CpO|0@@@@p@L@C|CCcOC@C0pOppppp@L@C@@@@0O|O|ss|O@@@@@@@@0|CCCCC@C@Lp@@@@=10 190009a=2# 190011a/AA+ @ 1@# T0@RetroTextBA#!T"#$CA#!T%&' <20>ZeichensHatzeEAEs gibt 4 Standard-ZeichensHatze, ƒG0‡-ƒG3‡.
Weiterhin den Zeichensatz ƒL‡ mit Zeichen
aus G0+G1 aufgr. Prestel-KompatibilitHat.
ƒG0‡ enthHalt die meisten †ASCII‡-Zeichen
ƒG1‡ enthHalt †Blockgrafik‡-Elemente mit
†2x3‡ BlHocken pro Zeichen
ƒG2‡ enthHalt weitere †Sonderzeichen‡
ƒG3‡ enthHalt weitere †Grafiksymbole‡, z.B.
Liniensymbole
ZeichensHatze kHonnen gemischt verwendet
werden, auch innerhalb einer Zeile.WA#!Tƒ0‡!ZurHuck Weiter!ƒ#‡X` 190010aXA

14
presentation/190011a Normal file
View File

@ -0,0 +1,14 @@
/B# ( @GA# GA#!0'Yf 0@@@@CL@p@pOpqp|p@0@@@@@@@@@@CpO|0@@@@p@L@C|CCcOC@C0pOppppp@L@C@@@@0O|O|ss|O@@@@@@@@0|CCCCC@C@Lp@@@@=10 190010a=2# 190012a/AA+ @ 1@# T0@RetroTextBA#!T"#$CA#!T%&' <20>Dynamische ZeichensHatze (DRC)EAMit DRCs lassen sich eigene Zeichen mit
ƒ12x10‡ bzw. ƒ12x12‡ (bei 20x40 Zeichen)
definieren.
Ein DRC-Zeichen kann ƒ2‡-, ƒ4‡- oder ƒ16‡-
ƒfarbig‡ sein, letzteres aber nur bei
max. ƒ6x10‡ Pixeln GrHoHûe.
Durch DRCs lassen sich hoch aufgelHoste
Bilder darstellen, die Huber die normalen
Blockgrafiken hinausgehen.
Zeichen aller ZeichensHatze (incl. DRCs)
sind auf der gleichen Seite darstellbar!WA#!Tƒ0‡!ZurHuck Weiter!ƒ#‡X` 190011aXA

15
presentation/190012a Normal file
View File

@ -0,0 +1,15 @@
/B# ( @GA# GA#!0'Yf 0@@@@CL@p@pOpqp|p@0@@@@@@@@@@CpO|0@@@@p@L@C|CCcOC@C0pOppppp@L@C@@@@0O|O|ss|O@@@@@@@@0|CCCCC@C@Lp@@@@=10 190011a=29 1900a/AA+ @ 1@# T0@RetroTextBA#!T"#$CA#!T%&' <20>RetroTextEA…RetroText‡ ist eine in ƒPython‡ implemen-
tierte Fassung eines Btx-Servers.
Es wurde inspiriert von ƒNorbert Kehrers‡
Btx-Server-Projekt,
siehe RetroPulsiv 7.0.
Infos unter
ƒ*…acn.wtf/retrotext.htmlƒ#‡ <20>:)‡
˜<EFBFBD> Fragen?‡ŒŸ
WA#!Tƒ0‡!ZurHuck Zum Anfang!ƒ9‡X` 190012aXA

1
presentation/1900a Normal file
View File

@ -0,0 +1 @@
/B# ( @GA# GA#!0'Yf 0@@@@CL@p@pOpqp|p@0@@@@@@@@@@CpO|0@@@@p@L@C|CCcOC@C0pOppppp@L@C@@@@0O|O|ss|O@@@@@@@@0|CCCCC@C@Lp@@@@=10 190a=2# 190000a/AA+ @ 1@# T0@RetroTextBA#!T"#$CA#!T%&' <20>PrHasentation RetroText~FH¸£GGê HGê àøüßIüô° µIGê èßC¿£EïßC´ µJGê ªßß߯¡àüßßü°¢¯ßßߥ µKGê ¢ãøþßêßCµßýô³¡ µLGê ßCêßCµßC µMGê ßCýó¯¯óþßC µNGê ßM µOGê PGê ´ð°ôà°ð°ì¤ð°°°ô QGê D¿±½¥µê µµê ½¥¹±µ RGê D¡¡£¡£¢ £¡¢ £¡¡¡£ SG¢ä W¸¡TI£WWA#!Tƒ0‡!ZurHuck Weiter!ƒ#‡X` 1900aXA

3
rtx.py Normal file → Executable file
View File

@ -23,7 +23,8 @@ import logging
logging.basicConfig(format='%(asctime)s %(levelname)s: %(message)s', level=config.LOGLEVEL, datefmt='%Y-%m-%d %I:%M:%S') logging.basicConfig(format='%(asctime)s %(levelname)s: %(message)s', level=config.LOGLEVEL, datefmt='%Y-%m-%d %I:%M:%S')
# initialize serial connection to client # initialize serial connection to client
glob.ser = serial.Serial(config.PORT, config.BAUDRATE, timeout=None) logging.debug("Serial port %s, Baud rate %s", config.PORT, config.BAUDRATE)
glob.ser = serial.Serial(config.PORT, config.BAUDRATE, timeout=None, rtscts=True, dsrdtr=True)
logging.info("Serial port %s opened", glob.ser.name) logging.info("Serial port %s opened", glob.ser.name)
while True: while True:

View File

@ -11,153 +11,161 @@ import cept
import glob import glob
import logging import logging
import config import config
import rtxMask
def process_byte(in_byte): def process_byte(in_byte):
""" takes the received byte and processes the command line """ takes the received byte and processes the command line
if a new command has been entered, it will call process_command() if a new command has been entered, it will call process_command()
if a short link has been entered, the link_list of the current page will be searched if a short link has been entered, the link_list of the current page will be searched
and the found target will be sent to process_command() and the found target will be sent to process_command()
""" """
instr=str(in_byte, encoding="latin-1") instr=str(in_byte, encoding="latin-1")
if config.MODE=="modem": if config.MODE=="modem":
logging.debug("> %s < CD: %s", instr, glob.ser.getCD()) logging.debug("> %s < CD: %s", instr, glob.ser.getCD())
# what to send back to the client # what to send back to the client
if instr == cept.INI: if instr == cept.INI:
logging.debug("INI") logging.debug("INI")
echo_char = "*" echo_char = "*"
elif instr == cept.TER: elif instr == cept.TER:
logging.debug("TER") logging.debug("TER")
echo_char = "#" echo_char = "#"
else: else:
echo_char=instr echo_char=instr
# start of line: clear rest of cmdline # start of line: clear rest of cmdline
if len(glob.cmdline) == 0: if len(glob.cmdline) == 0:
glob.ser.write(bytes(cept.CLEARLINE, "latin-1")) glob.ser.write(bytes(cept.CLEARLINE, "latin-1"))
# echo the character to the client # echo the character to the client
glob.ser.write(bytes(echo_char, "latin-1")) glob.ser.write(bytes(echo_char, "latin-1"))
glob.cmdline += instr glob.cmdline += instr
# Backspace: # Backspace:
if instr == cept.BSP: if instr == cept.BSP:
glob.cmdline = glob.cmdline[:-1] glob.cmdline = glob.cmdline[:-1]
return return
logging.debug("Cmdline: >%s<", glob.cmdline) logging.debug("Cmdline: >%s<", glob.cmdline)
# process links inside the page: # process links inside the page:
if ( len(glob.cmdline) == 1 or len(glob.cmdline) == 2 ) and glob.curpage.get_link(glob.cmdline): if ( len(glob.cmdline) == 1 or len(glob.cmdline) == 2 ) and glob.curpage.get_link(glob.cmdline):
glob.cmdline = cept.INI + glob.curpage.get_link(glob.cmdline) + cept.TER glob.cmdline = cept.INI + glob.curpage.get_link(glob.cmdline) + cept.TER
process_command(glob.cmdline) process_command(glob.cmdline)
return return
# reset cmdline: # reset cmdline:
if instr == cept.INI and glob.cmdline[-2:] == cept.INI+cept.INI: if instr == cept.INI and glob.cmdline[-2:] == cept.INI+cept.INI:
logging.debug("reset cmdline") logging.debug("reset cmdline")
glob.cmdline = "" glob.cmdline = ""
glob.ser.write(bytes(cept.clear_line24, "latin-1")) glob.ser.write(bytes(cept.clear_line24, "latin-1"))
return return
# goto last page: # goto last page:
if instr == cept.TER and glob.cmdline == cept.INI+cept.TER: if instr == cept.TER and glob.cmdline == cept.INI+cept.TER:
if glob.prevpage.get_page_id() == -1: if glob.prevpage.get_page_id() == -1:
glob.cmdline = "" glob.cmdline = ""
send_error("Keine vorige Seite vorhanden.") send_error("Keine vorige Seite vorhanden.")
return return
glob.cmdline = "" # reset cmdline glob.cmdline = "" # reset cmdline
goto_last_page() goto_last_page()
return return
# "Make it so": # "Make it so":
if instr == cept.TER: if instr == cept.TER:
# or instr == cept.SEND or instr == cept.CR: # or instr == cept.SEND or instr == cept.CR:
logging.info("Kommando: >%s<", glob.cmdline) logging.info("Kommando: >%s<", glob.cmdline)
process_command(glob.cmdline) process_command(glob.cmdline)
return return
def process_command(cmd): def process_command(cmd):
""" processes the given command line """ processes the given command line
""" """
# reset cmdline # reset cmdline
glob.cmdline = "" glob.cmdline = ""
# process *cmdline#, normally a page-loading command: # process *cmdline#, normally a page-loading command:
if cmd[0] == cept.INI and cmd[-1:] == cept.TER: if cmd[0] == cept.INI and cmd[-1:] == cept.TER:
pgnr = cmd[1:-1] pgnr = cmd[1:-1]
check_and_send_page(pgnr, "Die Seite kann nicht gefunden werden.") check_and_send_page(pgnr, "Die Seite kann nicht gefunden werden.")
# if only # is entered, either go to the link behind '#' # if only # is entered, either go to the link behind '#'
# or to the next sub-page (2000a => 2000b) if it exists # or to the next sub-page (2000a => 2000b) if it exists
if cmd == cept.TER: if cmd == cept.TER:
if glob.curpage.get_link("#"): if glob.curpage.get_link("#"):
pgnr = glob.curpage.get_link("#") pgnr = glob.curpage.get_link("#")
check_and_send_page(pgnr, "Die Seite kann nicht gefunden werden.") check_and_send_page(pgnr, "Die Seite kann nicht gefunden werden.")
else: else:
# check if the next page exists, e.g. 2000a => 2000b # check if the next page exists, e.g. 2000a => 2000b
curid = glob.curpage.get_page_id() curid = glob.curpage.get_page_id()
if curid[-1:].isalpha(): if curid == -1:
# aus 2000a 2000b machen: send_error("Keine n"+ cept.UMLAUT +"achste Seite gefunden.")
nextid = curid[:-1] + chr(ord(curid[-1:])+1) elif str(curid[-1:]).isalpha():
check_and_send_page(nextid, "Keine n"+str(cept['UMLAUT'])+"achste Seite gefunden.") # aus 2000a 2000b machen:
nextid = curid[:-1] + chr(ord(curid[-1:])+1)
check_and_send_page(nextid, "Keine n" + cept.UMLAUT +"achste Seite gefunden.")
# special commands:
if cmd == "!1" + cept.TER:
send_welcome_page()
return
if cmd == "!2" + cept.TER:
glob.ser.write(bytes(cept.init_screen, "latin-1"))
maske = rtxMask.rtxMask()
maske.addLine(3,1,10)
maske.addLine(4,4,10)
maske.process_input()
return
# special commands:
if cmd == "!1" + cept.TER:
send_welcome_page()
return
if cmd == "!2" + cept.TER:
glob.ser.write(bytes(cept.init_screen, "latin-1"))
return
def goto_last_page(): def goto_last_page():
""" go back to the previous page and make the current page the previous page """ go back to the previous page and make the current page the previous page
""" """
logging.info("Letzte Seite: %s", str(glob.prevpage.get_page_id())) logging.info("Letzte Seite: %s", str(glob.prevpage.get_page_id()))
# swap prevpage and curpage # swap prevpage and curpage
temp = glob.curpage temp = glob.curpage
glob.curpage = glob.prevpage glob.curpage = glob.prevpage
glob.prevpage = temp glob.prevpage = temp
# send the previous page (now curpage) to the client # send the previous page (now curpage) to the client
send_page(glob.curpage) send_page(glob.curpage)
def send_welcome_page(): def send_welcome_page():
""" get the btxlogo, make a rtxPage of it and send it to the client """ """ get the btxlogo, make a rtxPage of it and send it to the client """
wpage = rtxPage() glob.curpage = rtxPage()
wpage.set_page(bytes(cept.btxlogo, "latin-1")) glob.curpage.set_page(bytes(cept.btxlogo, "latin-1"))
send_page(wpage) send_page(glob.curpage)
def check_and_send_page(pgnr, errormsg): def check_and_send_page(pgnr, errormsg):
""" checks if the page "pgnr" exists """ checks if the page "pgnr" exists
if yes, it loads it into curpage and sends it to the client if yes, it loads it into curpage and sends it to the client
if not, it sends the error message "errormsg" to the client if not, it sends the error message "errormsg" to the client
""" """
logging.info("suche Seite: >%s<", pgnr) logging.info("suche Seite: >%s<", pgnr)
if rtxPage.exists(pgnr): if rtxPage.exists(pgnr):
glob.prevpage = glob.curpage glob.prevpage = glob.curpage
glob.curpage = rtxPage(pgnr) glob.curpage = rtxPage(pgnr)
send_page(glob.curpage) # takes a rtxPage object! send_page(glob.curpage) # takes a rtxPage object!
return True return True
elif pgnr[-1:].isnumeric() and rtxPage.exists(pgnr + "a"): elif pgnr[-1:].isnumeric() and rtxPage.exists(pgnr + "a"):
glob.prevpage = glob.curpage glob.prevpage = glob.curpage
glob.curpage = rtxPage(pgnr + "a") glob.curpage = rtxPage(pgnr + "a")
send_page(glob.curpage) # takes a rtxPage object! send_page(glob.curpage) # takes a rtxPage object!
return True return True
else: else:
send_error(errormsg) send_error(errormsg)
return False return False
def send_error(msg): def send_error(msg):
""" send an error message to the client """ """ send an error message to the client """
glob.ser.write(bytes(cept.error_prefix + msg + cept.error_suffix, "latin-1")) glob.ser.write(bytes(cept.error_prefix + msg + cept.error_suffix, "latin-1"))
def send_page(page): def send_page(page):
""" sends a page to the client """ """ sends a page to the client """
glob.ser.write(page.get_page()) glob.ser.write(page.get_page())

158
rtxMask.py Normal file
View File

@ -0,0 +1,158 @@
# -*- coding: UTF-8 -*-
'''
rtx - RetroText
rtxMask: Klasse zur Verarbeitung einer Eingabemaske
by Anna Christina Naß <acn@acn.wtf>
released under GPL
'''
import glob
import logging
import config
import cept
class rtxMask:
""" Klasse zur Verarbeitung einer Eingabemaske
"""
lines = []
answers = []
def __init__(self):
return
def addLine(self, x, y, length):
""" adds a new line for the mask to the object """
newLine = {}
newLine['x'] = x
newLine['y'] = y
newLine['length'] = length
self.lines.append(newLine)
def get_answer(self, nr):
""" returns the answer for a specific line """
if nr >= 0 and nr <= len(self.answers):
return self.answers[nr]
else:
return False
def get_answers(self):
""" returns the array of all answers """
return self.answers
def _pos_cur_to_line(self, line):
""" positions the cursor to the beginning of a line """
self._pos_cur_to_xy(line['x'], line['y'])
def _pos_cur_to_xy(self, x, y):
""" positions the cursor to a (x,y) position on screen """
toX=0x41 + x
toY=0x41 + y
gotoString = "\x1f" + chr(toX) + chr(toY)
glob.ser.write(bytes(gotoString, "latin-1"))
def _set_str_at_pos(self, char, pos, line):
""" changes the 'char' at a position 'pos' of a specific answer 'line' """
zeile = self.answers[line]
# if the line is shorter than the position, add spaces
while len(zeile) < pos:
zeile += " "
zeile = zeile[:pos-1] + char + zeile[pos:]
self.answers[line] = zeile
def process_input(self):
""" reads the input from the client, fills the mask and gets the input """
# if there have no input lines been defined, no input can be processed - so exit the function
if len(self.lines) == 0:
logging.debug("Keine Zeilen in der Maske definiert!")
return False
# position the cursor into the first field
self._pos_cur_to_line(self.lines[0])
posx = 0 # cursor position inside the line - max. position is length-1
posy = 0 # the current line - max. number is len(self.lines)-1
weiter = True
# read input and interpret it
while weiter==True:
# if the modem hangs up, exit the function:
#if config.MODE == "modem" and glob.ser.getCD() == False:
# weiter=False
in_byte = glob.ser.read(1)
instr = str(in_byte, encoding="latin-1")
echostr = instr
if instr == cept.TER or instr == cept.CR:
# go to the beginning of the next line
# or finish the mask
if posy == len(self.lines)-1:
weiter = False
self._send_data()
else:
# go to the beginning of the next line
posy += 1
posx = 0
self._pos_cur_to_line(self.lines[posy])
elif instr == cept.BSP:
self.answers[posy] = self.answers[posy][:-1]
posx -= 1
elif instr == cept.UP:
# if the cursor is in the first line, we can't go higher...
# so we ignore the keypress
echostr = "" # no echo needed, we position the curser ourselves
if posy > 0:
posy -= 1
posx = 0
self._pos_cur_to_line(self.lines[posy])
elif instr == cept.DOWN:
# same here: last line => it can't go lower => ignore
echostr = "" # no echo needed, we position the curser ourselves
if posy < len(self.lines):
posy += 1
posx = 0
self._pos_cur_to_line(self.lines[posy])
elif instr == cept.LEFT:
if posx > 0:
posx -= 1
else:
echostr = ""
elif instr == cept.RIGHT:
if posx < len(self.answers[posy]):
posx += 1
else:
echostr = ""
elif instr == cept.HOME:
posy = 0
posx = 0
self._pos_cur_to_line(self.lines[posy])
echostr = ""
elif instr == cept.SEND: # ist das DCT??
weiter = False
self._send_data()
elif instr.isalnum():
# "normal" input
# TODO: lineinput == Zeilenende beachten
#self._set_str_at_pos(instr, posx, posy)
posx += 1
else:
# ignore the rest and do not echo it :)
echostr = ""
# now send the echo
glob.ser.write(bytes(echostr, "latin-1"))
def _send_data(self):
""" strip spaces from the right of the answers and save them """
new_answers = []
for answer in self.answers:
temp = answer.rstrip()
new_answers.append(temp)
self.answers = new_answers
print(self.answers)

View File

@ -12,48 +12,51 @@ import config
import logging import logging
def init_modem(): def init_modem():
""" send the modem init strings to the modem """ logging.debug("clearing input/output buffers")
logging.debug("init_modem") glob.ser.reset_input_buffer()
if config.MODEM_INIT1 != "": glob.ser.reset_output_buffer()
logging.debug("sending MODEM_INIT1") """ send the modem init strings to the modem """
glob.ser.write(bytes(config.MODEM_INIT1 + "\r", "latin-1")) logging.debug("init_modem")
rc = _serial_readline() if config.MODEM_INIT1 != "":
logging.info("MODEM_INIT1: %s", rc) logging.debug("sending MODEM_INIT1")
rc = _serial_readline() glob.ser.write(bytes(config.MODEM_INIT1 + "\r", "latin-1"))
logging.info("MODEM_INIT1: %s", rc) rc = _serial_readline()
logging.info("MODEM_INIT1: %s", rc)
rc = _serial_readline()
logging.info("MODEM_INIT1: %s", rc)
if config.MODEM_INIT2 != "": if config.MODEM_INIT2 != "":
logging.debug("sending MODEM_INIT2") logging.debug("sending MODEM_INIT2")
glob.ser.write(bytes(config.MODEM_INIT2 + "\r", "latin-1")) glob.ser.write(bytes(config.MODEM_INIT2 + "\r", "latin-1"))
rc = _serial_readline() rc = _serial_readline()
logging.info("MODEM_INIT2: %s", rc) logging.info("MODEM_INIT2: %s", rc)
rc = _serial_readline() rc = _serial_readline()
logging.info("MODEM_INIT2: %s", rc) logging.info("MODEM_INIT2: %s", rc)
def wait_for_caller(): def wait_for_caller():
""" waits for the RING of the modem and answers it """ """ waits for the RING of the modem and answers it """
modem_answered = False modem_answered = False
logging.debug("wait_for_caller") logging.debug("wait_for_caller")
while not modem_answered: while not modem_answered:
rc = _serial_readline() rc = _serial_readline()
if rc.startswith(config.MODEM_RING): if rc.startswith(config.MODEM_RING):
logging.info("modem ringing! Answering.") logging.info("modem ringing! Answering.")
glob.ser.write(bytes(config.MODEM_ANSWER + "\r", "latin-1")) glob.ser.write(bytes(config.MODEM_ANSWER + "\r", "latin-1"))
rc = _serial_readline() rc = _serial_readline()
logging.info("Answer: %s", rc) logging.info("Answer: %s", rc)
rc = _serial_readline() rc = _serial_readline()
logging.info("Answer: %s", rc) logging.info("Answer: %s", rc)
modem_answered=True modem_answered=True
else: else:
modem_answered=False modem_answered=False
def _serial_readline(): def _serial_readline():
line = "" line = ""
in_byte = "" in_byte = ""
while not in_byte == b"\n": while not in_byte == b"\n":
in_byte = glob.ser.read(1) in_byte = glob.ser.read(1)
#print(in_byte) #print(in_byte)
line += str(in_byte, encoding="latin-1") line += str(in_byte, encoding="latin-1")
return line return line

View File

@ -12,103 +12,100 @@ import config
import logging import logging
class rtxPage: class rtxPage:
""" Klasse zur Benutzung einer CEPT-Seite """ Klasse zur Benutzung einer CEPT-Seite
""" """
die_seite = "" die_seite = ""
seiten_nummer = -1 seiten_nummer = -1
link_liste = {} link_liste = {}
def __init__(self, page = None): def __init__(self, page = None):
""" create a new page object for the page 'page' """ create a new page object for the page 'page'
returns False if the page cannot be found returns False if the page cannot be found
returns True if the page has been loaded returns True if the page has been loaded
""" """
if page == None: if page == None:
return return
else: else:
self.die_seite = "" self.die_seite = ""
self.seiten_nummer = -1 self.seiten_nummer = -1
self.link_liste = {} self.link_liste = {}
self._load_page(page) self._load_page(page)
@staticmethod @staticmethod
def exists(page): def exists(page):
""" checks if the page (i.e. the file) exists """ """ checks if the page (i.e. the file) exists """
if os.path.isfile(config.PAGES + page): for path in config.PAGES:
return True if os.path.isfile(path + page):
elif os.path.isfile(config.DEMOPAGES + page): return True
return True return False
else:
return False
def get_page(self): def get_page(self):
""" returns the page if loaded """ returns the page if loaded
returns False if no page has been loaded returns False if no page has been loaded
""" """
if self.die_seite != "": if self.die_seite != "":
return self.die_seite return self.die_seite
else: else:
return False return False
def set_page(self,pagedata): def set_page(self,pagedata):
""" write the pagedata as the new page and (probably) the link list """ """ write the pagedata as the new page and (probably) the link list """
self.die_seite = pagedata self.die_seite = pagedata
self.link_liste = self._get_link_list() self.link_liste = self._get_link_list()
def get_links(self): def get_links(self):
""" returns the list of links found in this page """ """ returns the list of links found in this page """
return self.link_liste return self.link_liste
def get_link(self, link): def get_link(self, link):
""" returns the target for a given link """ returns the target for a given link
returns False if this link does not exist returns False if this link does not exist
""" """
if link in self.link_liste: if link in self.link_liste:
return self.link_liste[link] return self.link_liste[link]
else: else:
return False return False
def get_page_id(self): def get_page_id(self):
""" returns the id of the current page """ """ returns the id of the current page """
return self.seiten_nummer return self.seiten_nummer
def _load_page(self, page): def _load_page(self, page):
""" Load a CEPT page from the file system """ Load a CEPT page from the file system
returns False if the page cannot be found returns False if the page cannot be found
returns True if the page has been loaded returns True if the page has been loaded
""" """
if os.path.isfile(config.PAGES + page): for path in config.PAGES:
filename = config.PAGES + page if os.path.isfile(path + page):
elif os.path.isfile(config.DEMOPAGES + page): filename = path + page
filename = config.DEMOPAGES + page """ page has been found, now exit the for loop """
else: break
return False else:
""" page does not exist anywhere, so exit the function """
return False
with open(filename, "rb") as f: with open(filename, "rb") as f:
self.die_seite = f.read() self.die_seite = f.read()
self.seiten_nummer = page self.seiten_nummer = page
link_liste = self._get_link_list() self.link_liste = self._get_link_list()
return True return True
def _get_link_list(self): def _get_link_list(self):
""" private function which parses the CEPT page and extracts the link list """ private function which parses the CEPT page and extracts the link list
returns True if links have been found returns True if links have been found
returns False if no links have been found returns False if no links have been found
""" """
links = [] links = []
links = re.findall("\x1f\x3d([^\x1f\x9b\x1b]+)", str(self.die_seite, "latin-1")) links = re.findall("\x1f\x3d([^\x1f\x9b\x1b]+)", str(self.die_seite, "latin-1"))
liste = {}
for item in links: for item in links:
if item[0] != "0": if item[0] != "0":
link = item[1:3].strip() link = item[1:3].strip()
target = item[3:].strip() target = item[3:].strip()
self.link_liste[link] = target liste[link] = target
logging.info(self.link_liste) logging.info(liste)
if self.link_liste == {}:
return False
else:
return True
return liste