Terminalprogramm der Spitzenklasse
Eine harte Nuß haben wir unseren Lesern mit diesem Wettbewerb zu knacken gegeben. Trotzdem erreichten uns viele Einsendungen als Anwärter auf den ersten Preis.
Peter Falk konnte mit seinem Programm »Super Term 64« diesen Wettbewerb für sich entscheiden. Besonders erwähnenswert ist neben der Leistung dieses Programmes der übersichtliche und gut durchschaubare Programmierstil.
Der Autor: »Ich habe bei dem Terminal-Programm einerseits darauf Wert gelegt, daß es möglichst komfortabel und benutzerfreundlich ist, andererseits war mir aber auch ein großer Terminal-Speicher sehr wichtig. Deswegen habe ich auf unnötige »Verzierungen« verzichtet. So kann man bei den Übertragungs-Parametern zum Beispiel nur Baudrate, Datenbits und Stop-Bits in begrenztem Umfang ändern. Ich habe jedoch die Erfahrung gemacht, daß man bei allen Mailboxen eine einwandfreie Verbindung hat, wenn man die Normalparameter (300 Baud, 7 Bit, 1 Stop-Bit) benutzt. Der C 64 empfängt nämlich auch dann richtig, wenn er zum Beispiel auf 7 Datenbit eingestellt ist und die Gegenstelle mit 8 Bit sendet. Nur wenn man auch Steuerzeichen übertragen will, muß man auf 8 Datenbit umstellen.
Der große Terminal-Speicher wurde unter anderem dadurch erreicht, daß der gesamte vom ROM überlagerte RAM genutzt wird, indem das Betriebssystem beim Zugriff auf den RAM mit einer Assembler-Routine abgeschaltet wird. Weitere Maschinen-Routinen werden für das Laden von Daten in den Terminal-Speicher und für das Listen des Directorys benutzt. Sie werden alle über DATA-Zeilen im Lader eingelesen, so daß sie nachher keinen Speicherplatz mehr verbrauchen.
Bei der Programm-Übertragung nach der »Teleterm-Norm« können natürlich die selben Fehler auftreten wie bei Teleterm, nämlich dann, wenn sich zwei Übertragungsfehler in einem Block gegenseitig aufheben. Trotzdem ist die Übertragungs-Routine etwas sicherer als bei Teleterm. Am Anfang der Übertragung kann man die Länge einer Übertragungseinheit einstellen (bei Teleterm: »Programmsatzlänge«). Bei einer guten Verbindung kann sie ruhig auf 256 Byte gestellt werden; die Übertragung ist dann etwas schneller.«
Ladeprogramm
Nachdem man den Lader geladen und mit RUN gestartet hat, werden die Funktionstasten-Belegungen von der Diskette geladen, soweit sie schon vorhanden sind. Ansonsten wird der F-Tasten-Speicher gelöscht. Danach erscheint ein Menü, in dem man zwischen dem Terminal-Programm und dem Editor wählen kann. Wenn man 1 oder 2 gedrückt hat, wird das jeweilige Programm geladen und automatisch gestartet.
In die ersten Programmzeilen des Laders kann man individuelle Parameter schreiben. So kann man in Zeile 90 Hintergrund- und Rahmenfarbe eingeben (Schriftfarbe muß schwarz bleiben), in Zeile 110 den Preis für eine Telefon-Gebühreneinheit ändern und in den Zeilen 30 und 40 kann man Parameter zur Druckeranpassung eingeben (Sekundäradresse und maximal fünf sonstige Parameter).
In den Zeilen 350 bis 580 werden die Assembler-Routinen für Speicherzugriff, LOAD und Directory eingelesen.
Die vorhandenen Druckerparameter sind für einen Epson-Drucker mit Görlitz-Interface zugeschnitten (Sekundäradresse: 0, Parameter: »chr$(27)"t"«, also 27, 32, 84).
Terminalprogramm
Das Terminal-Programm muß mit dem Lader geladen werden, damit es funktionstüchtig ist. Im folgenden werden die einzelnen Menüpunkte erklärt:
1. Kommunizieren
Nachdem man 1 gedrückt hat, muß man eingeben, ob die Gegenstelle mit oder ohne Echo arbeitet. Danach wird man gefragt, ob man eine Berechnung der Telefongebühren wünscht. Wenn ja, dann müssen die Gebührenzone und der Gebührentarif (vor oder nach 18 Uhr plus Wochenende) eingegeben werden. Nachdem man die Verbindung hergestellt hat (was ja durchaus etwas länger dauern kann!), startet man den Terminal-Modus mit einem Tastendruck (die ←-Taste führt ins Menü zurück). Im Terminal-Modus wird nun eine Help-Liste ausgegeben, in der alle Funktionen aufgeführt sind, die man über »Commodore«-Taste ansprechen kann. »Commodore S« bewirkt, daß alle empfangenen Zeichen in den Terminal-Speicher geschrieben werden, der eine Größe von 46000 Byte hat. Auf ein automatisches Abspeichern habe ich wegen der Time-Out-Regelung der meisten Mailboxen verzichtet. Außerdem muß man schon ganz schön lange telefonieren, um den Speicher voll zu bekommen.
»Commodore E« beendet den Speichervorgang wieder.
»Commodore A« bewirkt, daß der Inhalt des Terminal-Speichers ausgesendet wird. So kann man zum Beispiel vorher abgefaßte Briefe übertragen. Abbruch mit ’←’. Auch Basic-Programme, die in einer Sequenz vorliegen, können so übertragen werden. Diese Prozedur reagiert auf die Steuerzeichen
- CTRL — S = Stop
- CTRL — Q = Weiter
- CTRL — X = Abbruch
»Commodore L« löscht den Terminal-Speicher.
»Commodore B« gibt an, wieviele Bytes im Speicher schon belegt und wieviele noch frei sind.
»Commodore G« zeigt die Zeit und die Gebühren an, die schon »vertelefoniert« sind.
»Commodore H« gibt die angezeigte Help-Liste nochmals aus.
»Commodore P« bietet eine Besonderheit: In diesem Modus ist es möglich Basic- und Maschinen-Programme zu übertragen und zwar nach der »TELETERM-Norm«. Man kann sich jetzt also Programme aus Mailboxen holen, die eine Teleterm-Box besitzen (zum Beispiel K.I.S., R.T.C., MHB etc.) oder man kann Programme unter Freunden und Bekannten austauschen, ohne Teleterm benutzen zu müssen. Es ist so eine weitgehend fehlerlose Übertragung von Programmen möglich.
Statt »Commodore £« und »1« bei Teleterm muß man hier »Commodore P« und »E« für empfangen drücken.
»Commodore ↑« unterbricht den Terminal-Modus, das heißt man kann jetzt alle Menüpunkte anwählen, ohne daß die eingestellten Parameter und die Gebühren verloren gehen. Man kann so also auch während man mit einer Mailbox kommuniziert, die anderen Menüpunkte ausführen.
»Commodore ←« beendet den Terminal-Modus. Hier werden jetzt die Zeit und die Gebühren angezeigt und abgespeichert, und dann der Gesamtbetrag angezeigt.
2. Daten speichern
Hier wird der Inhalt des Terminal-Speichers auf Diskette gespeichert. Man muß dafür den Namen angeben, unter dem abgespeichert werden soll.
RETURN bewirkt den Rücksprung ins Menüs.
3. Entspricht Punkt 2, nur daß hier geladen wird.
4. Daten ausgeben
Unter diesem Menüpunkt wird der Inhalt des Terminal-Speichers auf dem Bildschirm oder dem Drucker ausgegeben.
- F1 = Ausgabe auf dem Bildschirm
- F3 = Ausgabe auf dem Drucker
- F5 = Bildschirm-Hardcopy
- ← = Menü
SPACE hält die Ausgabe an. Sie kann dann mit einer beliebigen Taste fortgesetzt werden.
5. Funktionstasten
Hier kann man sich eine Übersicht der F-Tasten-Belegungen ausgeben lassen und sie gegebenenfalls ändern und abspeichern.
6. Parameter ändern
Die Baudrate und die Anzahl der Daten- und Stop-Bits können hier verändert werden.
7. Gebühren ansehen
Wenn man mit der Gebühren-Berechnung arbeitet, kann man hier den abgespeicherten Gesamtbetrag abrufen und die Gebühren am Ablesetag löschen.
8. Diskbefehle
Unter diesem Punkt kann man Befehle wie zum Beispiel Validate, Scratch, Rename etc. der Floppy übermitteln. Mit dem Dollarzeichen kann man das Inhaltsverzeichnis auflisten.
Editor-Programm
Mit dem Editor kann man Anzeigen oder Briefe, die man in Mailboxen schreiben will, erstellen. Der Text wird nach dem Erstellen sofort in den Terminal-Speicher geschrieben, so daß er nicht erst auf Diskette gespeichert zu werden braucht, bevor man das Terminal-Programm lädt. Der Speicherplatz für Variablen ist deswegen nur so groß, daß der Editor maximal 100 Zeilen aufnehmen kann.
Wenn man den Menüpunkt 1 anwählt, wird man zuerst gefragt, ob der Terminal-Speicher gelöscht werden soll. Antwortet man mit »ja«, so kann man einen neuen Text schreiben. Ansonsten wird der Inhalt des Terminal-Speichers in den Editor übertragen. Hier kann man nun seinen Text eingeben und mit den Cursor-Tasten frei editieren. Man muß allerdings in jeder Zeile, die übernommen werden soll, RETURN drücken. Wenn der Cursor am Anfang einer Zeile steht, kann man vor dieser Zeile mit CTRL-I (Insert) eine Zeile einfügen und mit CTRL-D (Delete) kann man die Zeile löschen. Wenn die maximale Anzahl von 100 Zeilen erreicht ist, wechselt die Rahmenfarbe in Rot und es wird keine weitere Zeile mehr übernommen.
Die ←-Taste führt ins Menü zurück, nachdem der Text in den Terminal-Speicher geschrieben wurde.
Die anderen Menüpunkte entsprechen denen des Terminal-Programms.
(Peter Falk/rg)10 rem written by peter falk 20 : 30 poke840,0:rem sekundaer-adresse 40 poke841,27:poke842,32:poke843,84:poke844,0:poke845,0:rem drucker-parameter 50 : 60 poke 55,79:poke 56,60:rem speicher- 70 poke643,79:poke644,60:rem grenze 80 clr :rem auf 15439 90 poke838,6:poke839,15:rem farben 100 poke53280,peek(838):poke53281,peek(839) 110 g%=100*0.23:poke828,g%:rem gebuehren-einheit 120 print"{blk}{clr}{down}";chr$(14);chr$(8) 130 gosub350:gosub600:poke650,128 140 poke832,80:rem pufferanfang 150 poke833,60:rem bei 15440 160 print"{clr}{down}{down} *******************************" 170 print" * *" 180 print" * S U P E R - T E R M 64 *" 190 print" * {CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y} *" 200 print" * *" 210 print" * Written by Peter Falk *" 220 print" * *" 230 print" * (c) 64'er 1985 *" 240 print" * *" 250 print" *******************************" 260 print"{down}{down} (1) - Terminalprogramm{down}" 270 print" (2) - Editor{down}{down}" 280 print" (0) - Programm beenden" 290 getq$:ifq$<>"0"andq$<>"1"andq$<>"2"then290 300 ifq$="0"thenend 310 print"{down}{down} Loading..." 320 ifq$="1"thenload"terminal",8 330 ifq$="2"thenload"editor",8 340 : 350 rem * peek+poke fuer ueberl. ram * 360 data165,20,72,165,21,72,32,247,183,120,165,1,41,252,133,1,160,0,177,20 370 data168,165,1,9,3,133,1,88,104,133,21,104,133,20,76,162,179,32,253,174 380 data32,138,173,32,247,183,32,253,174,32,158,183,120,169,52,133,1,138,160 390 data0,145,20,169,55,133,1,88,96 400 fori=698to765:reada:pokei,a:next 410 poke785,186:poke786,2 420 : 430 rem * load * 440 data160,0,169,8,32,180,255,169,98,32,150,255,173,64,3,133,174,173,65 450 data3,133,175,32,19,238,145,174,230,174,208,2,230,175,169,208,197,175 460 data208,8,169,0,133,174,169,224,133,175,165,175,240,4,36,144,80,223 470 data165,174,141,64,3,165,175,141,65,3,32,171,255,96,0 480 fori=848to917:reada:pokei,a:next 490 : 500 rem * directory * 510 data169,36,133,251,169,251,133,187,169,0,133,188,169,1,133,183,169,8 520 data133,186,169,96,133,185,32,213,243,165,186,32,180,255,165,185,32,150 530 data255,169,0,133,144,160,3,132,251,32,165,255,133,252,164,144,208,47 540 data32,165,255,164,144,208,40,164,251,136,208,233,166,252,32,205,189 550 data169,32,32,210,255,32,165,255,166,144,208,18,170,240,6,32,210,255 560 data76,226,3,169,13,32,210,255,160,2,208,198,32,66,246,96 570 fori=918to1022:reada:pokei,a:next 580 return 590 : 600 rem * f-tasten laden * 610 open1,8,2,"f-tasten,s,r" 620 open2,8,15 630 input#2,f 640 iff=0thenprint"{down}{down}{down} Die Funktionstasten werden geladen." 650 print"{down}{down}{down} Bitte warten..." 660 iff=0then700 670 fors=54000to54559 680 sys735,s,13:next 690 goto720 700 fors=54000to54559 710 get#1,a$:sys735,s,asc(a$):next 720 close1:close2 730 return
10 REM WRITTEN BY PETER FALK 20 : 30 POKE 840,0:REM SEKUNDAER-ADRESSE 40 POKE 841,27:POKE 842,32:POKE 843,84:POKE 844,0:POKE 845,0:REM DRUCKER-PARAMETER 50 : 60 POKE 55,79:POKE 56,60:REM SPEICHER- 70 POKE 643,79:POKE 644,60:REM GRENZE 80 CLR :REM AUF 15439 90 POKE 838,6:POKE 839,15:REM FARBEN 100 POKE 53280,PEEK (838):POKE 53281,PEEK (839) 110 G%=100*0.23:POKE 828,G%:REM GEBUEHREN-EINHEIT 120 PRINT"{BLACK,CLR,DOWN}";CHR$ (14);CHR$ (8) 130 GOSUB 350:GOSUB 600:POKE 650,128 140 POKE 832,80:REM PUFFERANFANG 150 POKE 833,60:REM BEI 15440 160 PRINT"{CLR,2DOWN,5SPACE}*******************************" 170 PRINT"{5SPACE}*{29SPACE}*" 180 PRINT"{5SPACE}*{3SPACE}S U P E R - T E R M{2SPACE}64{3SPACE}*" 190 PRINT"{5SPACE}*{3SPACE}YYYYYYYYYYYYYYYYYYYYYYY{3SPACE}*" 200 PRINT"{5SPACE}*{29SPACE}*" 210 PRINT"{5SPACE}*{4SPACE}WRITTEN BY PETER FALK{4SPACE}*" 220 PRINT"{5SPACE}*{29SPACE}*" 230 PRINT"{5SPACE}*{4SPACE}(C) 64'ER{2SPACE}1985{10SPACE}*" 240 PRINT"{5SPACE}*{29SPACE}*" 250 PRINT"{5SPACE}*******************************" 260 PRINT"{2DOWN,8SPACE}(1) - TERMINALPROGRAMM{DOWN}" 270 PRINT"{8SPACE}(2) - EDITOR{2DOWN}" 280 PRINT"{8SPACE}(0) - PROGRAMM BEENDEN" 290 GET Q$:IF Q$<>"0"AND Q$<>"1"AND Q$<>"2" THEN290 300 IF Q$="0" THENEND 310 PRINT"{2DOWN,14SPACE}LOADING..." 320 IF Q$="1" THENLOAD "TERMINAL",8 330 IF Q$="2" THENLOAD "EDITOR",8 340 : 350 REM * PEEK+POKE FUER UEBERL. RAM * 360 DATA 165,20,72,165,21,72,32,247,183,120,165,1,41,252,133,1,160,0,177,20 370 DATA 168,165,1,9,3,133,1,88,104,133,21,104,133,20,76,162,179,32,253,174 380 DATA 32,138,173,32,247,183,32,253,174,32,158,183,120,169,52,133,1,138,160 390 DATA 0,145,20,169,55,133,1,88,96 400 FOR I=698 TO765:READ A:POKE I,A:NEXT 410 POKE 785,186:POKE 786,2 420 : 430 REM * LOAD * 440 DATA 160,0,169,8,32,180,255,169,98,32,150,255,173,64,3,133,174,173,65 450 DATA 3,133,175,32,19,238,145,174,230,174,208,2,230,175,169,208,197,175 460 DATA 208,8,169,0,133,174,169,224,133,175,165,175,240,4,36,144,80,223 470 DATA 165,174,141,64,3,165,175,141,65,3,32,171,255,96,0 480 FOR I=848 TO917:READ A:POKE I,A:NEXT 490 : 500 REM * DIRECTORY * 510 DATA 169,36,133,251,169,251,133,187,169,0,133,188,169,1,133,183,169,8 520 DATA 133,186,169,96,133,185,32,213,243,165,186,32,180,255,165,185,32,150 530 DATA 255,169,0,133,144,160,3,132,251,32,165,255,133,252,164,144,208,47 540 DATA 32,165,255,164,144,208,40,164,251,136,208,233,166,252,32,205,189 550 DATA 169,32,32,210,255,32,165,255,166,144,208,18,170,240,6,32,210,255 560 DATA 76,226,3,169,13,32,210,255,160,2,208,198,32,66,246,96 570 FOR I=918 TO1022:READ A:POKE I,A:NEXT 580 RETURN 590 : 600 REM * F-TASTEN LADEN * 610 OPEN 1,8,2,"F-TASTEN,S,R" 620 OPEN 2,8,15 630 INPUT#2,F 640 IF F=0 THENPRINT"{3DOWN,2SPACE}DIE FUNKTIONSTASTEN WERDEN GELADEN." 650 PRINT"{3DOWN,12SPACE}BITTE WARTEN..." 660 IF F=0 THEN700 670 FOR S=54000 TO54559 680 SYS 735,S,13:NEXT 690 GOTO 720 700 FOR S=54000 TO54559 710 GET #1,A$:SYS 735,S,ASC (A$):NEXT 720 CLOSE 1:CLOSE 2 730 RETURN
10 clr 20 dim ze$(100) 30 sg=peek(832)+peek(833)*256 40 print:print"{blk}{clr}{down}" 50 print" {CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}" 60 print" {rvon} ** EDITOR-MENUE ** " 70 print" {CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{down}{down}{down}" 80 print" (1) - Text schreiben/editieren{down}" 90 print" (2) - Text speichern{down}" 100 print" (3) - Text laden{down}" 110 print" (4) - Text ausgeben{down}" 120 print" (5) - Diskbefehle{down}" 130 print" (6) - Puffer loeschen{down}{down}" 140 print" (7) - Terminal-Programm" 150 get q$:if q$="" then 150 160 on val(q$) goto 210,1930,2140,1650,2540,2430,190 170 if q$="0" then gosub 2370:end 180 goto 150 190 gosub 2370:load"terminal",8 200 : 210 rem ** text schreiben ** 220 print"{clr}":gosub 2300 230 print"{down}{down}{down} Puffer loeschen (j/n)?" 240 get q$:if q$<>"j" and q$<>"n" then 240 250 print"{clr}" 260 if q$="j" then max=0:goto 320 270 gosub 1370:print"{clr}" 280 for nr=0 to 22 290 print ze$(nr) 300 next nr 310 print"{home}" 320 nr=0 330 gosub 1030 340 get q$:if q$="" or q$="{home}" or q$="{clr}" then 340 350 if q$="_" then max=max-1:gosub 1490:goto 40 360 gosub 1080 370 if asc(q$)>31 and asc(q$)<128 then 460 380 if (q$="{left}" or q$=chr$(20)) and pos(0)=0 then 330 390 if q$="{rght}" and pos(0)=38 then 330 400 if q$="{up}" then gosub 1220:goto 330 410 if q$="{down}" then gosub 1300:goto 330 420 if q$=chr$(13) or q$=chr$(141) then 490 430 if q$="{inst}" and peek(1024+38+peek(214)*40)<>32 then 330 440 if q$="{ensh}" and pos(0)=0 then gosub 680:goto 330 450 if q$="{CTRL-D}" and pos(0)=0 then gosub 860:goto 330 460 print q$;:poke 212,0 470 if pos(0)<39 then 330 480 : 490 rem * einlesen * 500 if nr=100 then print"{up}":goto 330 510 print chr$(13);"{up}";:poke 211,0 520 ze$(nr)="" 530 open 1,3 540 for x=1 to 39 550 get#1,e$ 560 ze$(nr)=ze$(nr)+e$ 570 next x 580 close 1 590 n=39 600 if mid$(ze$(nr),n,1)<>" " then 620 610 n=n-1:if n>0 then 600 620 ze$(nr)=left$(ze$(nr),n) 630 nr=nr+1:if nr>max then max=nr 640 print 650 if nr=100 then poke 53280,2 660 goto 330 670 : 680 rem * insert * 690 if max=100 then return 700 z=peek(214):n=nr 710 for x=peek(214) to 23 720 print" ";chr$(20);" ":next x 730 poke 214,z+1:print"{up}" 740 e=nr+22-z:if e>max then e=max 750 for n=nr to e 760 print ze$(n) 770 next n 780 poke 214,z:print"{up}" 790 for z=max to nr step-1 800 ze$(z+1)=ze$(z) 810 next z 820 max=max+1 830 ze$(nr)="" 840 return 850 : 860 rem * delete * 870 if max=0 then return 880 z=peek(214) 890 for x=peek(214) to 23 900 print" ";chr$(20);" ":next x 910 poke 214,z:print"{up}" 920 e=nr+24-z:if e>max then e=max 930 for n=nr+1 to e 940 print ze$(n) 950 next n 960 poke 214,z:print"{up}" 970 max=max-1 980 for z=nr to max 990 ze$(z)=ze$(z+1) 1000 next z 1010 return 1020 : 1030 rem * cursor ein * 1040 p=peek(209)+peek(210)*256+peek(211) 1050 if peek(p)<128 then poke p,peek(p)+128:poke 54272+p,0 1060 return 1070 : 1080 rem * cursor aus * 1090 p=peek(209)+peek(210)*256+peek(211) 1100 if peek(p)>127 then poke p,peek(p)-128 1110 return 1120 : 1130 rem * zurueckblaettern * 1140 print"{clr}" 1150 nr=nr-22:if nr<0 then nr=0 1160 for z=nr to nr+22 1170 print ze$(z) 1180 next z 1190 print"{home}" 1200 return 1210 : 1220 rem * cursor up * 1230 if nr=100 then poke 53280,peek(838) 1240 if peek(214)=1 and nr>0 then gosub 1130:return 1250 if peek(214)=1 then return 1260 print"{up}"; 1270 nr=nr-1 1280 return 1290 : 1300 rem * cursor down * 1310 if nr=max then return 1320 if peek(214)>23 then print ze$(nr):nr=nr+1:return 1330 print"{down}"; 1340 nr=nr+1 1350 return 1360 : 1370 rem * speicher-->variable * 1380 print"{clr}{down}{down}{down}{down}{down} Einen Moment bitte..." 1390 nr=0:ze$(0)="" 1400 for sz=15440 to sg 1410 e=usr(sz) 1420 if e=13 then nr=nr+1:ze$(nr)="":goto 1450 1430 if len(ze$(nr))=39 then nr=nr+1:ze$(nr)="" 1440 ze$(nr)=ze$(nr)+chr$(e) 1450 if nr<100 then next sz 1460 if nr=100 then print"{down}{down}{down}{down} Achtung, Text zu lang !!!":wait 198,255 1470 max=nr:poke 198,0:return 1480 : 1490 rem * variable-->speicher * 1500 poke 53280,peek(838) 1510 print"{clr}{down}{down}{down}{down}{down} Einen Moment bitte...{down}{down}" 1520 sg=15440 1530 for nr=0 to max 1540 if ze$(nr)="" then 1590 1550 for z=1 to len(ze$(nr)) 1560 q$=mid$(ze$(nr),z,1) 1570 poke sg,asc(q$):sg=sg+1 1580 next z:ze$(nr)="" 1590 poke sg,13:sg=sg+1 1600 next nr 1610 sg=sg-1 1620 gosub 2300:wait 198,255 1630 return 1640 : 1650 rem ** daten ausgeben ** 1660 print"{clr}" 1670 gosub 2300 1680 if sg=15440 then 40 1690 print"{down}'F1' = Bildschirm" 1700 print"'F3' = Drucker" 1710 print"'F5' = Hardcopy{down}" 1720 wait 198,255 1730 d=0 1740 for sz=15440 to sg 1750 if peek(198)=0 then 1830 1760 get b$ 1770 if b$=" " then wait 198,255:get b$ 1780 if b$="_" then poke 53280,6:close 1:goto 40 1790 if b$="{f3}" and d=0 then z=peek(840):poke 53280,2 1800 if b$="{f3}"andd=0thenopen1,4,z:forz=841to845:print#1,chr$(peek(z));:next:d=1 1810 if b$="{f1}" then d=0:close 1:poke 53280,peek(838) 1820 if b$="{f5}" then gosub 2720 1830 c$=chr$(usr(sz)) 1840 print c$; 1850 if d then print#1,c$; 1860 if sz=53247 then sz=57343 1870 next sz 1880 close 1:poke 53280,peek(838) 1890 get b$:if b$="" then 1890 1900 if b$="{f5}" then gosub 2720 1910 goto 40 1920 : 1930 rem ** daten speichern ** 1940 print"{clr}" 1950 gosub 2300 1960 if sg=15440 then 40 1970 dn$="" 1980 input"{down}{down}Dateiname ";dn$ 1990 if dn$="" then 40 2000 open 1,8,2,dn$+",s,w" 2010 gosub 2660 2020 print#1,chr$(usr(15440)); 2030 if st<>0 then 2100 2040 cmd 1 2050 for sz=15441 to sg 2060 print chr$(usr(sz)); 2070 if sz=53247 then sz=57343 2080 next sz 2090 print#1,""; 2100 close 1:close 15 2110 if val(b$)<>0 then wait 198,255 2120 goto 40 2130 : 2140 rem *** daten laden *** 2150 dn$="" 2160 input"{clr}{down}{down}{down}Dateiname ";dn$ 2170 if dn$="" then 40 2180 sg=15440 2190 open 1,8,2,dn$+",s,r" 2200 gosub 2660 2210 if val(b$)<>0 then 2250 2220 poke 144,0:poke 832,80:poke 833,60 2230 sys 848:rem load-routine 2240 sg=peek(832)+peek(833)*256-1 2250 close 1:close 15 2260 if sg=-1 then print"{down}{down}Achtung, Puffer voll !!!{down}{down}":sg=65535 2270 gosub 2300:wait 198,255 2280 goto 40 2290 : 2300 rem ** speichergrenze ** 2310 if sg<53248 then by=sg-15440 2320 if sg>57343 then by=sg-15440-4095 2330 print:print"Bytes belegt:";by 2340 print"Bytes frei :";46000-by 2350 return 2360 : 2370 rem ** lo/hi-berechnung ** 2380 lo=sg-int(sg/256)*256 2390 hi=int(sg/256) 2400 poke 832,lo:poke 833,hi 2410 return 2420 : 2430 rem ** puffer loeschen ** 2440 print"{clr}{down}{down}" 2450 input"Puffer loeschen (j/n)";q$ 2460 if q$<>"j" and q$<>"n" then 2450 2470 print"{down}" 2480 if q$="n" then gosub 2300:wait 198,255:goto 40 2490 sg=15440 2500 gosub 2300 2510 wait 198,255 2520 goto 40 2530 : 2540 rem ** diskbefehle ** 2550 print"{clr}{down}{down}'$' = Directory{down}{down}" 2560 print spc(13) chr$(34);:poke 212,0:print"{up}" 2570 poke 198,1:poke 631,29 2580 input"Diskbefehl ";b$ 2590 if b$="$" then print:sys 918:wait 198,255:goto 40 2600 open 15,8,15 2610 print#15,b$ 2620 gosub 2680 2630 close 15 2640 wait 198,255:goto 40 2650 : 2660 rem ** diskstatus ** 2670 open 15,8,15 2680 input#15,b$,c$ 2690 print"{down}{down}Diskstatus: "b$;" ";c$;"{down}" 2700 return 2710 : 2720 rem * hardcopy * 2730 d=0:close 1:z=peek(840):open 1,4,z 2740 for z=841 to 845:print#1,chr$(peek(z));:next 2750 open 2,3 2760 print"{home}"; 2770 print#1 2780 for z=1 to 25 2790 for sp=1 to 40 2800 get#2,e$:print#1,e$; 2810 next sp 2820 next z 2830 print#1:close 1:close 2 2840 return
10 CLR 20 DIM ZE$(100) 30 SG=PEEK (832)+PEEK (833)*256 40 PRINT:PRINT"{BLACK,CLR,DOWN}" 50 PRINT"{8SPACE}PPPPPPPPPPPPPPPPPPPPPP" 60 PRINT"{8SPACE,RVSON,2SPACE}** EDITOR-MENUE **{2SPACE}" 70 PRINT"{8SPACE}YYYYYYYYYYYYYYYYYYYYYY{3DOWN}" 80 PRINT"{7SPACE}(1) - TEXT SCHREIBEN/EDITIEREN{DOWN}" 90 PRINT"{7SPACE}(2) - TEXT SPEICHERN{DOWN}" 100 PRINT"{7SPACE}(3) - TEXT LADEN{DOWN}" 110 PRINT"{7SPACE}(4) - TEXT AUSGEBEN{DOWN}" 120 PRINT"{7SPACE}(5) - DISKBEFEHLE{DOWN}" 130 PRINT"{7SPACE}(6) - PUFFER LOESCHEN{2DOWN}" 140 PRINT"{7SPACE}(7) - TERMINAL-PROGRAMM" 150 GET Q$:IF Q$="" THEN 150 160 ON VAL (Q$) GOTO 210,1930,2140,1650,2540,2430,190 170 IF Q$="0" THEN GOSUB 2370:END 180 GOTO 150 190 GOSUB 2370:LOAD "TERMINAL",8 200 : 210 REM ** TEXT SCHREIBEN ** 220 PRINT"{CLR}":GOSUB 2300 230 PRINT"{3DOWN,8SPACE}PUFFER LOESCHEN (J/N)?" 240 GET Q$:IF Q$<>"J" AND Q$<>"N" THEN 240 250 PRINT"{CLR}" 260 IF Q$="J" THEN MAX=0:GOTO 320 270 GOSUB 1370:PRINT"{CLR}" 280 FOR NR=0 TO 22 290 PRINT ZE$(NR) 300 NEXT NR 310 PRINT"{HOME}" 320 NR=0 330 GOSUB 1030 340 GET Q$:IF Q$="" OR Q$="{HOME}" OR Q$="{CLR}" THEN 340 350 IF Q$="←" THEN MAX=MAX-1:GOSUB 1490:GOTO 40 360 GOSUB 1080 370 IF ASC (Q$)>31 AND ASC (Q$)<128 THEN 460 380 IF (Q$="{LEFT}" OR Q$=CHR$ (20)) AND POS (0)=0 THEN 330 390 IF Q$="{RIGHT}" AND POS (0)=38 THEN 330 400 IF Q$="{UP}" THEN GOSUB 1220:GOTO 330 410 IF Q$="{DOWN}" THEN GOSUB 1300:GOTO 330 420 IF Q$=CHR$ (13) OR Q$=CHR$ (141) THEN 490 430 IF Q$="{INST}" AND PEEK (1024+38+PEEK (214)*40)<>32 THEN 330 440 IF Q$="{CTRL-I}" AND POS (0)=0 THEN GOSUB 680:GOTO 330 450 IF Q$="{CTRL-D}" AND POS (0)=0 THEN GOSUB 860:GOTO 330 460 PRINT Q$;:POKE 212,0 470 IF POS (0)<39 THEN 330 480 : 490 REM * EINLESEN * 500 IF NR=100 THEN PRINT"{UP}":GOTO 330 510 PRINT CHR$ (13);"{UP}";:POKE 211,0 520 ZE$(NR)="" 530 OPEN 1,3 540 FOR X=1 TO 39 550 GET #1,E$ 560 ZE$(NR)=ZE$(NR)+E$ 570 NEXT X 580 CLOSE 1 590 N=39 600 IF MID$ (ZE$(NR),N,1)<>" " THEN 620 610 N=N-1:IF N>0 THEN 600 620 ZE$(NR)=LEFT$ (ZE$(NR),N) 630 NR=NR+1:IF NR>MAX THEN MAX=NR 640 PRINT 650 IF NR=100 THEN POKE 53280,2 660 GOTO 330 670 : 680 REM * INSERT * 690 IF MAX=100 THEN RETURN 700 Z=PEEK (214):N=NR 710 FOR X=PEEK (214) TO 23 720 PRINT"{39SPACE}";CHR$ (20);" ":NEXT X 730 POKE 214,Z+1:PRINT"{UP}" 740 E=NR+22-Z:IF E>MAX THEN E=MAX 750 FOR N=NR TO E 760 PRINT ZE$(N) 770 NEXT N 780 POKE 214,Z:PRINT"{UP}" 790 FOR Z=MAX TO NR STEP -1 800 ZE$(Z+1)=ZE$(Z) 810 NEXT Z 820 MAX=MAX+1 830 ZE$(NR)="" 840 RETURN 850 : 860 REM * DELETE * 870 IF MAX=0 THEN RETURN 880 Z=PEEK (214) 890 FOR X=PEEK (214) TO 23 900 PRINT"{39SPACE}";CHR$ (20);" ":NEXT X 910 POKE 214,Z:PRINT"{UP}" 920 E=NR+24-Z:IF E>MAX THEN E=MAX 930 FOR N=NR+1 TO E 940 PRINT ZE$(N) 950 NEXT N 960 POKE 214,Z:PRINT"{UP}" 970 MAX=MAX-1 980 FOR Z=NR TO MAX 990 ZE$(Z)=ZE$(Z+1) 1000 NEXT Z 1010 RETURN 1020 : 1030 REM * CURSOR EIN * 1040 P=PEEK (209)+PEEK (210)*256+PEEK (211) 1050 IF PEEK (P)<128 THEN POKE P,PEEK (P)+128:POKE 54272+P,0 1060 RETURN 1070 : 1080 REM * CURSOR AUS * 1090 P=PEEK (209)+PEEK (210)*256+PEEK (211) 1100 IF PEEK (P)>127 THEN POKE P,PEEK (P)-128 1110 RETURN 1120 : 1130 REM * ZURUECKBLAETTERN * 1140 PRINT"{CLR}" 1150 NR=NR-22:IF NR<0 THEN NR=0 1160 FOR Z=NR TO NR+22 1170 PRINT ZE$(Z) 1180 NEXT Z 1190 PRINT"{HOME}" 1200 RETURN 1210 : 1220 REM * CURSOR UP * 1230 IF NR=100 THEN POKE 53280,PEEK (838) 1240 IF PEEK (214)=1 AND NR>0 THEN GOSUB 1130:RETURN 1250 IF PEEK (214)=1 THEN RETURN 1260 PRINT"{UP}"; 1270 NR=NR-1 1280 RETURN 1290 : 1300 REM * CURSOR DOWN * 1310 IF NR=MAX THEN RETURN 1320 IF PEEK (214)>23 THEN PRINT ZE$(NR):NR=NR+1:RETURN 1330 PRINT"{DOWN}"; 1340 NR=NR+1 1350 RETURN 1360 : 1370 REM * SPEICHER-->VARIABLE * 1380 PRINT"{CLR,5DOWN,9SPACE}EINEN MOMENT BITTE..." 1390 NR=0:ZE$(0)="" 1400 FOR SZ=15440 TO SG 1410 E=USR (SZ) 1420 IF E=13 THEN NR=NR+1:ZE$(NR)="":GOTO 1450 1430 IF LEN (ZE$(NR))=39 THEN NR=NR+1:ZE$(NR)="" 1440 ZE$(NR)=ZE$(NR)+CHR$ (E) 1450 IF NR<100 THEN NEXT SZ 1460 IF NR=100 THEN PRINT"{4DOWN,8SPACE}ACHTUNG, TEXT ZU LANG !!!":WAIT 198,255 1470 MAX=NR:POKE 198,0:RETURN 1480 : 1490 REM * VARIABLE-->SPEICHER * 1500 POKE 53280,PEEK (838) 1510 PRINT"{CLR,5DOWN,9SPACE}EINEN MOMENT BITTE...{2DOWN}" 1520 SG=15440 1530 FOR NR=0 TO MAX 1540 IF ZE$(NR)="" THEN 1590 1550 FOR Z=1 TO LEN (ZE$(NR)) 1560 Q$=MID$ (ZE$(NR),Z,1) 1570 POKE SG,ASC (Q$):SG=SG+1 1580 NEXT Z:ZE$(NR)="" 1590 POKE SG,13:SG=SG+1 1600 NEXT NR 1610 SG=SG-1 1620 GOSUB 2300:WAIT 198,255 1630 RETURN 1640 : 1650 REM ** DATEN AUSGEBEN ** 1660 PRINT"{CLR}" 1670 GOSUB 2300 1680 IF SG=15440 THEN 40 1690 PRINT"{DOWN}'F1' = BILDSCHIRM" 1700 PRINT"'F3' = DRUCKER" 1710 PRINT"'F5' = HARDCOPY{DOWN}" 1720 WAIT 198,255 1730 D=0 1740 FOR SZ=15440 TO SG 1750 IF PEEK (198)=0 THEN 1830 1760 GET B$ 1770 IF B$=" " THEN WAIT 198,255:GET B$ 1780 IF B$="←" THEN POKE 53280,6:CLOSE 1:GOTO 40 1790 IF B$="{F3}" AND D=0 THEN Z=PEEK (840):POKE 53280,2 1800 IF B$="{F3}"AND D=0 THENOPEN 1,4,Z:FOR Z=841 TO845:PRINT#1,CHR$ (PEEK (Z));:NEXT :D=1 1810 IF B$="{F1}" THEN D=0:CLOSE 1:POKE 53280,PEEK (838) 1820 IF B$="{F5}" THEN GOSUB 2720 1830 C$=CHR$ (USR (SZ)) 1840 PRINT C$; 1850 IF D THEN PRINT#1,C$; 1860 IF SZ=53247 THEN SZ=57343 1870 NEXT SZ 1880 CLOSE 1:POKE 53280,PEEK (838) 1890 GET B$:IF B$="" THEN 1890 1900 IF B$="{F5}" THEN GOSUB 2720 1910 GOTO 40 1920 : 1930 REM ** DATEN SPEICHERN ** 1940 PRINT"{CLR}" 1950 GOSUB 2300 1960 IF SG=15440 THEN 40 1970 DN$="" 1980 INPUT"{2DOWN}DATEINAME ";DN$ 1990 IF DN$="" THEN 40 2000 OPEN 1,8,2,DN$+",S,W" 2010 GOSUB 2660 2020 PRINT#1,CHR$ (USR (15440)); 2030 IF ST<>0 THEN 2100 2040 CMD 1 2050 FOR SZ=15441 TO SG 2060 PRINT CHR$ (USR (SZ)); 2070 IF SZ=53247 THEN SZ=57343 2080 NEXT SZ 2090 PRINT#1,""; 2100 CLOSE 1:CLOSE 15 2110 IF VAL (B$)<>0 THEN WAIT 198,255 2120 GOTO 40 2130 : 2140 REM *** DATEN LADEN *** 2150 DN$="" 2160 INPUT"{CLR,3DOWN}DATEINAME ";DN$ 2170 IF DN$="" THEN 40 2180 SG=15440 2190 OPEN 1,8,2,DN$+",S,R" 2200 GOSUB 2660 2210 IF VAL (B$)<>0 THEN 2250 2220 POKE 144,0:POKE 832,80:POKE 833,60 2230 SYS 848:REM LOAD-ROUTINE 2240 SG=PEEK (832)+PEEK (833)*256-1 2250 CLOSE 1:CLOSE 15 2260 IF SG=-1 THEN PRINT"{2DOWN}ACHTUNG, PUFFER VOLL !!!{2DOWN}":SG=65535 2270 GOSUB 2300:WAIT 198,255 2280 GOTO 40 2290 : 2300 REM ** SPEICHERGRENZE ** 2310 IF SG<53248 THEN BY=SG-15440 2320 IF SG>57343 THEN BY=SG-15440-4095 2330 PRINT:PRINT"BYTES BELEGT:";BY 2340 PRINT"BYTES FREI{2SPACE}:";46000-BY 2350 RETURN 2360 : 2370 REM ** LO/HI-BERECHNUNG ** 2380 LO=SG-INT (SG/256)*256 2390 HI=INT (SG/256) 2400 POKE 832,LO:POKE 833,HI 2410 RETURN 2420 : 2430 REM ** PUFFER LOESCHEN ** 2440 PRINT"{CLR,2DOWN}" 2450 INPUT"PUFFER LOESCHEN (J/N)";Q$ 2460 IF Q$<>"J" AND Q$<>"N" THEN 2450 2470 PRINT"{DOWN}" 2480 IF Q$="N" THEN GOSUB 2300:WAIT 198,255:GOTO 40 2490 SG=15440 2500 GOSUB 2300 2510 WAIT 198,255 2520 GOTO 40 2530 : 2540 REM ** DISKBEFEHLE ** 2550 PRINT"{CLR,2DOWN}'$' = DIRECTORY{2DOWN}" 2560 PRINT SPC( 13) CHR$ (34);:POKE 212,0:PRINT"{UP}" 2570 POKE 198,1:POKE 631,29 2580 INPUT"DISKBEFEHL ";B$ 2590 IF B$="$" THEN PRINT:SYS 918:WAIT 198,255:GOTO 40 2600 OPEN 15,8,15 2610 PRINT#15,B$ 2620 GOSUB 2680 2630 CLOSE 15 2640 WAIT 198,255:GOTO 40 2650 : 2660 REM ** DISKSTATUS ** 2670 OPEN 15,8,15 2680 INPUT#15,B$,C$ 2690 PRINT"{2DOWN}DISKSTATUS: "B$;" ";C$;"{DOWN}" 2700 RETURN 2710 : 2720 REM * HARDCOPY * 2730 D=0:CLOSE 1:Z=PEEK (840):OPEN 1,4,Z 2740 FOR Z=841 TO 845:PRINT#1,CHR$ (PEEK (Z));:NEXT 2750 OPEN 2,3 2760 PRINT"{HOME}"; 2770 PRINT#1 2780 FOR Z=1 TO 25 2790 FOR SP=1 TO 40 2800 GET #2,E$:PRINT#1,E$; 2810 NEXT SP 2820 NEXT Z 2830 PRINT#1:CLOSE 1:CLOSE 2 2840 RETURN
10 rem written by peter falk 20 rem 828=preis einer einheit 30 poke 829,32:rem 7 datenbits 40 poke 830,6:rem 300 baud 50 poke 831,0:rem 1 stopbit 60 rem 832,80:rem (lo) pufferanfang 70 rem 833,60:rem (hi) bei 15440 80 rem 834=gegenstelle duplex 90 rem 835=gebuehren ja/nein 100 rem 836=gebuehren-zone 110 rem 837=gebuehren-tarif 120 rem 838=rahmen-farbe 130 rem 839=hintergrund-farbe 140 rem 840-845=drucker-parameter 150 : 160 rem ** menue ** 170 print:print"{clr}{blk}{down}{down} {CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}{CBM-P}" 180 print" {rvon} ** TERMINAL-MENUE ** " 190 print" {CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{down}{down}" 200 print" (1) - Kommunizieren";a$;"{down}" 210 print" (2) - Daten speichern{down}" 220 print" (3) - Daten laden{down}" 230 print" (4) - Daten ausgeben{down}" 240 print" (5) - Funktionstasten{down}" 250 print" (6) - Parameter{down}" 260 print" (7) - Gebuehren{down}" 270 print" (8) - Diskbefehle{down}" 280 print" (9) - Editor laden" 290 get q$:if q$="" then 290 300 if q$="1" and a$="(Fortsetzung)" then a$="":goto 480 310 on val(q$) goto 360,2390,2610,2770,4110,3070,3850,4810,340 320 if q$="0" then end 330 goto 290 340 load"editor",8 350 : 360 rem *** kommunizieren *** 370 input"{clr}{down}{down} Gegenstelle {rvon}H{rvof}alb- / {rvon}V{rvof}ollduplex v{left}{left}{left}";q$ 380 if q$="v" then poke 834,1 390 if q$="h" then poke 834,0 400 print"{down}{down} Gebuehren-Berechnung (j/n)?{down}" 410 get q$:if q$<>"j" and q$<>"n" then 410 420 poke 835,0 430 if q$="j" then poke 835,1:gosub 3390 440 print"{down}{down} Zum Starten Taste !" 450 get q$:if q$="" then 450 460 if q$="_" then 160 470 ti$="000000" 480 baud=peek(830):db=peek(829):sb=peek(831) 490 open 2,2,0,chr$(baud+db+sb)+chr$(0):get#2,q$ 500 print"{clr}"; 510 gosub 4990 520 gosub 4030 530 dp=-peek(834) 540 gb=-peek(835) 550 get#2,q$:print 560 : 570 gosub 4700 580 get b$:if b$="" then 650 590 gosub 4760 600 if asc(b$)>132 and asc(b$)<141 then gosub 4480:goto 570 610 if peek(653)=2 then 2250 620 gosub 2100 630 : 640 gosub 4700 650 if peek(667)=peek(668) then 580 660 gosub 4760 670 get#2,c$:if c$="" then c$=chr$(0) 680 gosub 2170 690 if not sp then 570 700 poke sg,d:sg=sg+1:if sg=53248 then sg=57344 710 if sg=65536 then poke 53280,peek(838):sp=0:sg=65535 720 goto 570 730 : 740 rem * programm-uebertragung * 750 gosub 3970:close 2:clr 760 baud=peek(830) 770 open 2,2,0,chr$(baud)+chr$(0):get#2,q$ 780 input"{clr}{down}{down}{down}Programm-Name:";dn$:if dn$="" then print:close 2:goto 480 790 dim b$(258) 800 open 1,8,15,"m-w"+chr$(7)+chr$(28)+chr$(1)+chr$(15):close 1 810 print"{down}{down}{rvon}S{rvof}enden / {rvon}E{rvof}mpfangen ?" 820 get q$:if q$<>"s" and q$<>"e" then 820 830 if q$="e" then 1440 840 : 850 rem * senden * 860 print"{down}{down}Laenge einer Uebertragungs-Einheit" 870 input"in Bytes (max.256) 80{left}{left}{left}{left}";e 880 if e<1 or e>256 then 860 890 open 1,8,2,dn$+",p,r" 900 gosub 4930 910 if val(b$)<>0 then 1360 920 poke 668,peek(667):poke 198,0 930 print#2,chr$(2); 940 get#2,e$:get q$ 950 for w=1 to 100:next 960 if e$="" and q$<>"_" then 930 970 if q$="_" then 1360 980 print"{down}Beginn der Uebertragung.{down}" 990 for w=1 to 250:next 1000 poke 688,peek(667):by=0 1010 : 1020 for z=1 to e 1030 get#1,b$(z):if b$(z)="" then b$(z)=chr$(0) 1040 if st=0 then next z 1050 f=st:if z>e then z=e 1060 for w=1 to 1000:next 1070 su=0:get#2,e$ 1080 for x=1 to z 1090 print#2,b$(x); 1100 su=su+asc(b$(x)) 1110 next x 1120 if peek(669)<>peek(670) then 1120 1130 poke 668,peek(667) 1140 get q$:if peek(667)=peek(668) and q$<>"_" then 1140 1150 if q$="_" then 1360 1160 get#2,lo$:if lo$="" then lo$=chr$(0) 1170 get q$:if peek(667)=peek(668) and q$<>"_" then 1170 1180 if q$="_" then 1360 1190 get#2,hi$:if hi$="" then hi$=chr$(0) 1200 se=asc(lo$)+256*asc(hi$) 1210 if se<>su then 1300 1220 by=by+z 1230 print" OK. ";int(by/254)+1;"{left}. BLOCK" 1240 if f<>0 then 1360 1250 print#2,chr$(2); 1260 get q$:if peek(667)=peek(668) and q$<>"_" then 1260 1270 if q$="_" then 1360 1280 goto 1020 1290 : 1300 rem error 1310 print#2,chr$(1);:print" ERROR !" 1320 get q$:if peek(667)=peek(668) and q$<>"_" then 1320 1330 for w=1 to 1000:next 1340 if q$<>"_" then 1070 1350 : 1360 if q$="_" then print"{down}ABBRUCH !{down}" 1370 print#2,chr$(3); 1380 print"{down}Ende der Uebertragung." 1390 close 1:close 15:close 2 1400 print"{down}{down} Taste druecken !" 1410 wait 198,255:poke 198,0 1420 goto 480 1430 : 1440 rem * empfangen * 1450 open 1,8,2,dn$+",p,w" 1460 gosub 4930 1470 if val(b$)<>0 then 1800 1480 poke 668,peek(667):poke 198,0 1490 print#2,chr$(2); 1500 get#2,e$:get q$ 1510 for w=1 to 100:next 1520 if e$="" and q$<>"_" then 1490 1530 if q$="_" then 1800 1540 print"{down}Beginn der Uebertragung.{down}" 1550 for w=1 to 100:next 1560 get#2,e$:poke 668,peek(667):by=0 1570 su=0:z=1 1580 get q$:if peek(667)=peek(668) and q$<>"_" then 1580 1590 if q$="_" then 1800 1600 at=ti 1610 if ti-at>30 then 1660 1620 if peek(667)=peek(668) then 1610 1630 get#2,b$(z):if b$(z)="" then b$(z)=chr$(0) 1640 su=su+asc(b$(z)):z=z+1 1650 if z<258 then 1600 1660 hi=int(su/256):lo=su-256*hi 1670 print#2,chr$(lo);chr$(hi); 1680 get q$:if peek(667)=peek(668) and q$<>"_" then 1680 1690 if q$="_" then 1800 1700 get#2,e$ 1710 if e$<>chr$(2)and e$<>chr$(3)then 1870 1720 print#2,chr$(4); 1730 for x=1 to z 1740 print#1,b$(x); 1750 next x 1760 get#2,q$ 1770 by=by+z 1780 print" OK. ";int(by/254)+1;"{left}. BLOCK" 1790 if e$=chr$(2) then 1570 1800 if q$="_" then print"{down}ABBRUCH !{down}" 1810 print"{down}Ende der Uebertragung." 1820 close 1:close 15:close 2 1830 print"{down}{down} Taste druecken !" 1840 wait 198,255:poke 198,0 1850 goto 480 1860 : 1870 rem error 1880 print" ERROR !" 1890 print#2,chr$(3); 1900 poke 668,peek(667) 1910 goto 1570 1920 : 1930 rem * daten senden * 1940 for sz=15440 to sg 1950 get q$:if q$="_" then print:return 1960 if q$=" " then get e$:if e$<>" " then 1960 1970 for w=1 to 24:next 1980 get#2,c$:if c$=chr$(24) then print:return 1990 if c$<>chr$(19) then 2010 2000 get#2,q$:if q$<>chr$(17) and peek(203)=64 then 2000 2010 sys 62595:rem cia's setzen 2020 b$=chr$(usr(sz)):get#2,c$ 2030 if dp then poke 646,0:print b$; 2040 if sz=53247 then sz=57343 2050 gosub 2100 2060 if d=13 then for w=1 to 100:next 2070 next sz 2080 return 2090 : 2100 rem * umformen/senden * 2110 e=0:d=asc(b$):if d>64 and d<91 then e=32 2120 if d=20 then d=8 2130 d=d+e 2140 print#2,chr$(d);:if not dp then poke 646,0:print b$; 2150 return 2160 : 2170 rem * umformen/ausgeben * 2180 e=0:d=asc(c$):if d>64 and d<91 then e=32 2190 if d>96 and d<123then e=-32 2200 if d=8 then d=20 2210 d=d+e 2220 poke646,0:poke199,0:print chr$(d); 2230 return 2240 : 2250 rem * tastatur-auswertung * 2260 e=asc(b$) 2270 if e=174 and sg<65536 then sp=-1:poke 53280,2:goto 570 2280 if e=182 then sg=15440:gosub 3970:goto 570 2290 if e=177 then sp=0:poke 53280,peek(838):goto 570 2300 if e=176 and sg>15440 then gosub 1930:goto 570 2310 if e=165 then gosub 3520:goto 570 2320 if e=191 then gosub 4050:goto 570 2330 if e=175 then 740 2340 ife=95thenpoke53280,peek(838):gosub3970:gosub3520:close2:wait198,1:goto160 2350 ife=222thenpoke53280,peek(838):gosub3970:close2:a$="(Fortsetzung)":goto160 2360 if e=180 then gosub 4990:goto 570 2370 goto 570 2380 : 2390 rem *** daten speichern *** 2400 print"{clr}" 2410 gosub 4030 2420 if sg=15440 then 160 2430 dn$="" 2440 input"{down}{down}Dateiname ";dn$ 2450 if dn$="" then 160 2460 open 1,8,2,dn$+",s,w" 2470 gosub 4930 2480 print#1,chr$(usr(15440)); 2490 if st<>0 then 2570 2500 cmd 1:a=15441 2510 e=sg:if e>53247 then e=53247 2520 for sz=a to e 2530 print chr$(usr(sz)); 2540 next 2550 if e<sg then a=57344:e=sg:goto2520 2560 print#1,""; 2570 close 1:close 15 2580 if val(b$)<>0 then wait 198,255 2590 goto 160 2600 : 2610 rem *** daten laden *** 2620 dn$="" 2630 input"{clr}{down}{down}{down}Dateiname ";dn$ 2640 if dn$="" then 160 2650 sg=15440 2660 open 1,8,2,dn$+",s,r" 2670 gosub 4930 2680 if val(b$)<>0 then 2720 2690 poke 144,0:poke 832,80:poke 833,60 2700 sys 848:rem load-routine 2710 sg=peek(832)+peek(833)*256-1 2720 close 1:close 15 2730 if sg=-1 then print"{down}{down}Achtung, Puffer voll !!!{down}{down}":sg=65535 2740 gosub 3970:poke 198,0:wait 198,255 2750 goto 160 2760 : 2770 rem *** daten ausgeben *** 2780 print"{clr}" 2790 gosub 4030 2800 if sg=15440 then 160 2810 print"{down}'F1' = Bildschirm" 2820 print"'F3' = Drucker" 2830 print"'F5' = Hardcopy{down}" 2840 wait 198,255 2850 d=0 2860 for sz=15440 to sg 2870 if peek(198)<>0 then 2980 2880 c$=chr$(usr(sz)) 2890 print c$; 2900 if d then print#1,c$; 2910 if sz=53247 then sz=57343 2920 next sz 2930 close 1:poke 53280,peek(838) 2940 get b$:if b$="" then 2940 2950 if b$="{f5}" then gosub 5130 2960 goto 160 2970 : 2980 get b$ 2990 if b$=" " then wait 198,255:get b$ 3000 if b$="_" then close 1:poke 53280,peek(838):goto 160 3010 if b$="{f3}" and d=0 then e=peek(840):poke 53280,2 3020 if b$="{f3}"andd=0thenopen1,4,e:fore=841to845:print#1,chr$(peek(e));:next:d=1 3030 if b$="{f1}" then d=0:close 1:poke 53280,peek(838) 3040 if b$="{f5}" then gosub 5130 3050 goto 2880 3060 : 3070 rem ** parameter ** 3080 print"{clr}{down}{down}" 3090 : 3100 rem baudrate 3110 if peek(830)=3 then baud=110 3120 if peek(830)=5 then baud=150 3130 if peek(830)=6 then baud=300 3140 if peek(830)=7 then baud=600 3150 print spc(22) baud;"{up}" 3160 input"110,150,300,600 Baud ";baud 3170 if baud=110 then poke 830,3 3180 if baud=150 then poke 830,5 3190 if baud=300 then poke 830,6 3200 if baud=600 then poke 830,7 3210 : 3220 rem datenbits 3230 if peek(829)=32 then db=7 3240 if peek(829)=0 then db=8 3250 print"{down}{down}{down}";spc(20) db;"{up}" 3260 input"7 oder 8 Datenbits ";db 3270 if db=7 then poke 829,32 3280 if db=8 then poke 829,0 3290 : 3300 rem stopbits 3310 if peek(831)=0 then sb=1 3320 if peek(831)=128 then sb=2 3330 print"{down}{down}{down}";spc(19) sb;"{up}" 3340 input"1 oder 2 Stopbits ";sb 3350 if sb=1 then poke 831,0 3360 if sb=2 then poke 831,128 3370 goto 160 3380 : 3390 rem ** gebuehren berechnen ** 3400 print"{down} 0. Zone: Nahgespraech" 3410 print"{down} 1. Zone: unter 50 KM" 3420 print"{down} 2. Zone: 50 - 100 KM" 3430 print"{down} 3. Zone: ueber 100 KM" 3440 zo=4:input"{down} Zone 0, 1, 2 oder 3 ";zo 3450 if zo<>0 and zo<>1 and zo<>2 and zo<>3 then 3440 3460 input"{down} {rvon}N{rvof}ormal- / {rvon}B{rvof}illig-Tarif ";q$ 3470 if q$<>"n" and q$<>"b" then 3460 3480 poke 836,zo 3490 poke 837,asc(q$) 3500 return 3510 : 3520 if not gb then return 3530 zo=peek(836) 3540 q$=chr$(peek(837)) 3550 zeit=val(left$(ti$,2))*3600+val(mid$(ti$,3,2))*60+val(right$(ti$,2)) 3560 if q$="b" then 3620 3570 if zo=0 then betrag=int(zeit/480+1)*peek(828)/100 3580 if zo=1 then betrag=int(zeit/45+1)*peek(828)/100 3590 if zo=2 then betrag=int(zeit/20+1)*peek(828)/100 3600 if zo=3 then betrag=int(zeit/12+1)*peek(828)/100 3610 goto 3650 3620 if zo=0 then betrag=int(zeit/720+1)*peek(828)/100 3630 if zo=1 then betrag=int(zeit/67.5+1)*peek(828)/100 3640 if zo=2 or zo=3 then betrag=int(zeit/38.6+1)*peek(828)/100 3650 print 3660 print"Zeit =";ti$ 3670 print"Betrag=";betrag;"DM" 3680 print 3690 if b$<>"_" then 3830 3700 print"Gebuehren speichern (j/n)?" 3710 get q$ 3720 if q$<>"j" and q$<>"n" then 3710 3730 if q$="n" then 3830 3740 open 1,8,2,"gebuehren,s,r" 3750 input#1,gesb 3760 close 1 3770 gesb=gesb+betrag 3780 open 1,8,2,"@:gebuehren,s,w" 3790 print#1,gesb 3800 close 1 3810 print"{down}Gesamtbetrag=";gesb;"DM" 3820 wait 198,255 3830 poke 198,1:return 3840 : 3850 rem ** gebuehren ansehen ** 3860 print"{clr}{down}{down}" 3870 input"Gebuehren loeschen n{left}{left}{left}";q$ 3880 if q$<>"j" and q$<>"n" then 3870 3890 if q$="j" then open 1,8,2,"@:gebuehren,s,w":print#1,0:close 1 3900 open 1,8,2,"gebuehren,s,r" 3910 input#1,gesb 3920 close 1 3930 print"{down}{down}Gesamtbetrag=";gesb;"DM" 3940 wait 198,255 3950 goto 160 3960 : 3970 rem ** lo/hi-berechnung ** 3980 poke 832,sg-int(sg/256)*256 3990 poke 833,int(sg/256) 4000 gosub 4030 4010 return 4020 : 4030 rem ** speichergrenze ** 4040 sg=peek(832)+peek(833)*256 4050 if sg<53248 then by=sg-15440 4060 if sg>57343 then by=sg-15440-4095 4070 print:print"Bytes belegt:";by 4080 print"Bytes frei :";46000-by 4090 return 4100 : 4110 rem ** funktionstasten ** 4120 print"{clr}{down}{down} FUNKTIONSTASTEN" 4130 print" {CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{down}" 4140 for ft=0 to 7 4150 print" F";ft+1;": ";chr$(34); 4160 sz=54000+70*ft 4170 e=usr(sz):if e=13 then 4210 4180 print chr$(e); 4190 sz=sz+1 4200 goto 4170 4210 print 4220 next ft 4230 print"{down} Aendern (j/n)?" 4240 get q$:if q$<>"j" and q$<>"n" then4240 4250 if q$="n" then 160 4260 print"{home}{down}{down}{down}{down}" 4270 for ft=0 to 7 4280 poke 631,29:poke 198,1 4290 input"{rght}{rght}{rght}{rght}{rght}{rght}";q$ 4300 if q$="" then 4370 4310 q$=left$(q$,69)+chr$(13) 4320 sz=54000+70*ft 4330 for sp=1 to len(q$) 4340 sys 735,sz,asc(mid$(q$,sp,1)) 4350 sz=sz+1 4360 next sp 4370 next ft 4380 print"{down} Speichern (j/n)?" 4390 get q$:if q$<>"j" and q$<>"n" then4390 4400 if q$="n" then 160 4410 open 1,8,2,"@:f-tasten,s,w" 4420 for sz=54000 to 54559 4430 print#1,chr$(usr(sz)); 4440 next sz 4450 close 1 4460 goto 160 4470 : 4480 rem ** funktionstasten senden ** 4490 d=asc(b$) 4500 if d=133 then ft=0 4510 if d=134 then ft=2 4520 if d=135 then ft=4 4530 if d=136 then ft=6 4540 if d=137 then ft=1 4550 if d=138 then ft=3 4560 if d=139 then ft=5 4570 if d=140 then ft=7 4580 sz=54000+70*ft 4590 for w=1 to 30:next 4600 sys 62595 4610 b$=chr$(usr(sz)) 4620 get#2,q$ 4630 if dp then print b$; 4640 gosub 2100 4650 sz=sz+1 4660 if b$<>chr$(13) then 4590 4670 poke 668,peek(667):get#2,q$ 4680 return 4690 : 4700 rem * cursor ein * 4710 e=peek(209)+peek(210)*256+peek(211) 4720 if peek(e)<128 then poke e,peek(e)+128 4730 poke 54272+e,0 4740 return 4750 : 4760 rem * cursor aus * 4770 e=peek(209)+peek(210)*256+peek(211) 4780 if peek(e)>127 then poke e,peek(e)-128 4790 return 4800 : 4810 rem ** diskbefehle ** 4820 print"{clr}{down}{down}'$' = Directory{down}{down}" 4830 print spc(13) chr$(34);:poke 212,0:print"{up}" 4840 poke 198,1:poke 631,29 4850 input"Diskbefehl ";b$ 4860 if b$="$" then print:sys 918:wait 198,255:goto 160 4870 open 15,8,15 4880 print#15,b$ 4890 gosub 4950 4900 close 15 4910 wait 198,255:goto 160 4920 : 4930 rem ** diskstatus ** 4940 open 15,8,15 4950 input#15,b$,c$ 4960 print"{down}{down}Diskstatus: "b$;" ";c$;"{down}" 4970 return 4980 : 4990 rem * help * 5000 print 5010 print"'C= S':Daten speichern" 5020 print"'C= E':Speichern Ende" 5030 print"'C= A':Daten aussenden" 5040 print"'C= L':Puffer loeschen" 5050 print"'C= G':Gebuehren" 5060 print"'C= B':Bytes frei" 5070 print"'C= P':Prg-Uebertragung" 5080 print"'C= _':Off-line" 5090 print"'C= ^':Unterbrechung" 5100 print"'C= H':Help" 5110 return 5120 : 5130 rem * hardcopy * 5140 d=0:close 1:e=peek(840):open 1,4,e 5150 for e=841 to 845:print#1,chr$(peek(e));:next 5160 open 2,3 5170 print"{home}"; 5180 print#1 5190 for z=1 to 25 5200 for sp=1 to 40 5210 get#2,e$:print#1,e$; 5220 next sp 5230 next z 5240 print#1:close 1:close 2 5250 return
10 REM WRITTEN BY PETER FALK 20 REM 828=PREIS EINER EINHEIT 30 POKE 829,32:REM 7 DATENBITS 40 POKE 830,6:REM 300 BAUD 50 POKE 831,0:REM 1 STOPBIT 60 REM 832,80:REM (LO) PUFFERANFANG 70 REM 833,60:REM (HI) BEI 15440 80 REM 834=GEGENSTELLE DUPLEX 90 REM 835=GEBUEHREN JA/NEIN 100 REM 836=GEBUEHREN-ZONE 110 REM 837=GEBUEHREN-TARIF 120 REM 838=RAHMEN-FARBE 130 REM 839=HINTERGRUND-FARBE 140 REM 840-845=DRUCKER-PARAMETER 150 : 160 REM ** MENUE ** 170 PRINT:PRINT"{CLR,BLACK,2DOWN,7SPACE}PPPPPPPPPPPPPPPPPPPPPPPP" 180 PRINT"{7SPACE,RVSON,2SPACE}** TERMINAL-MENUE **{2SPACE}" 190 PRINT"{7SPACE}YYYYYYYYYYYYYYYYYYYYYYYY{2DOWN}" 200 PRINT"{7SPACE}(1) - KOMMUNIZIEREN";A$;"{DOWN}" 210 PRINT"{7SPACE}(2) - DATEN SPEICHERN{DOWN}" 220 PRINT"{7SPACE}(3) - DATEN LADEN{DOWN}" 230 PRINT"{7SPACE}(4) - DATEN AUSGEBEN{DOWN}" 240 PRINT"{7SPACE}(5) - FUNKTIONSTASTEN{DOWN}" 250 PRINT"{7SPACE}(6) - PARAMETER{DOWN}" 260 PRINT"{7SPACE}(7) - GEBUEHREN{DOWN}" 270 PRINT"{7SPACE}(8) - DISKBEFEHLE{DOWN}" 280 PRINT"{7SPACE}(9) - EDITOR LADEN" 290 GET Q$:IF Q$="" THEN 290 300 IF Q$="1" AND A$="(FORTSETZUNG)" THEN A$="":GOTO 480 310 ON VAL (Q$) GOTO 360,2390,2610,2770,4110,3070,3850,4810,340 320 IF Q$="0" THEN END 330 GOTO 290 340 LOAD "EDITOR",8 350 : 360 REM *** KOMMUNIZIEREN *** 370 INPUT"{CLR,2DOWN,2SPACE}GEGENSTELLE{SPACE,RVSON}H{RVOFF}ALB- /{SPACE,RVSON}V{RVOFF}OLLDUPLEX{SPACE,2SPACE}V{3LEFT}";Q$ 380 IF Q$="V" THEN POKE 834,1 390 IF Q$="H" THEN POKE 834,0 400 PRINT"{2DOWN,2SPACE}GEBUEHREN-BERECHNUNG (J/N)?{DOWN}" 410 GET Q$:IF Q$<>"J" AND Q$<>"N" THEN 410 420 POKE 835,0 430 IF Q$="J" THEN POKE 835,1:GOSUB 3390 440 PRINT"{2DOWN,11SPACE}ZUM STARTEN TASTE !" 450 GET Q$:IF Q$="" THEN 450 460 IF Q$="←" THEN 160 470 TI$="000000" 480 BAUD=PEEK (830):DB=PEEK (829):SB=PEEK (831) 490 OPEN 2,2,0,CHR$ (BAUD+DB+SB)+CHR$ (0):GET #2,Q$ 500 PRINT"{CLR}"; 510 GOSUB 4990 520 GOSUB 4030 530 DP=-PEEK (834) 540 GB=-PEEK (835) 550 GET #2,Q$:PRINT 560 : 570 GOSUB 4700 580 GET B$:IF B$="" THEN 650 590 GOSUB 4760 600 IF ASC (B$)>132 AND ASC (B$)<141 THEN GOSUB 4480:GOTO 570 610 IF PEEK (653)=2 THEN 2250 620 GOSUB 2100 630 : 640 GOSUB 4700 650 IF PEEK (667)=PEEK (668) THEN 580 660 GOSUB 4760 670 GET #2,C$:IF C$="" THEN C$=CHR$ (0) 680 GOSUB 2170 690 IF NOT SP THEN 570 700 POKE SG,D:SG=SG+1:IF SG=53248 THEN SG=57344 710 IF SG=65536 THEN POKE 53280,PEEK (838):SP=0:SG=65535 720 GOTO 570 730 : 740 REM * PROGRAMM-UEBERTRAGUNG * 750 GOSUB 3970:CLOSE 2:CLR 760 BAUD=PEEK (830) 770 OPEN 2,2,0,CHR$ (BAUD)+CHR$ (0):GET #2,Q$ 780 INPUT"{CLR,3DOWN}PROGRAMM-NAME:";DN$:IF DN$="" THEN PRINT:CLOSE 2:GOTO 480 790 DIM B$(258) 800 OPEN 1,8,15,"M-W"+CHR$ (7)+CHR$ (28)+CHR$ (1)+CHR$ (15):CLOSE 1 810 PRINT"{2DOWN,RVSON}S{RVOFF}ENDEN /{SPACE,RVSON}E{RVOFF}MPFANGEN ?" 820 GET Q$:IF Q$<>"S" AND Q$<>"E" THEN 820 830 IF Q$="E" THEN 1440 840 : 850 REM * SENDEN * 860 PRINT"{2DOWN}LAENGE EINER UEBERTRAGUNGS-EINHEIT" 870 INPUT"IN BYTES (MAX.256){3SPACE}80{4LEFT}";E 880 IF E<1 OR E>256 THEN 860 890 OPEN 1,8,2,DN$+",P,R" 900 GOSUB 4930 910 IF VAL (B$)<>0 THEN 1360 920 POKE 668,PEEK (667):POKE 198,0 930 PRINT#2,CHR$ (2); 940 GET #2,E$:GET Q$ 950 FOR W=1 TO 100:NEXT 960 IF E$="" AND Q$<>"←" THEN 930 970 IF Q$="←" THEN 1360 980 PRINT"{DOWN}BEGINN DER UEBERTRAGUNG.{DOWN}" 990 FOR W=1 TO 250:NEXT 1000 POKE 688,PEEK (667):BY=0 1010 : 1020 FOR Z=1 TO E 1030 GET #1,B$(Z):IF B$(Z)="" THEN B$(Z)=CHR$ (0) 1040 IF ST=0 THEN NEXT Z 1050 F=ST:IF Z>E THEN Z=E 1060 FOR W=1 TO 1000:NEXT 1070 SU=0:GET #2,E$ 1080 FOR X=1 TO Z 1090 PRINT#2,B$(X); 1100 SU=SU+ASC (B$(X)) 1110 NEXT X 1120 IF PEEK (669)<>PEEK (670) THEN 1120 1130 POKE 668,PEEK (667) 1140 GET Q$:IF PEEK (667)=PEEK (668) AND Q$<>"←" THEN 1140 1150 IF Q$="←" THEN 1360 1160 GET #2,LO$:IF LO$="" THEN LO$=CHR$ (0) 1170 GET Q$:IF PEEK (667)=PEEK (668) AND Q$<>"←" THEN 1170 1180 IF Q$="←" THEN 1360 1190 GET #2,HI$:IF HI$="" THEN HI$=CHR$ (0) 1200 SE=ASC (LO$)+256*ASC (HI$) 1210 IF SE<>SU THEN 1300 1220 BY=BY+Z 1230 PRINT" OK.{7SPACE}";INT (BY/254)+1;"{LEFT}. BLOCK" 1240 IF F<>0 THEN 1360 1250 PRINT#2,CHR$ (2); 1260 GET Q$:IF PEEK (667)=PEEK (668) AND Q$<>"←" THEN 1260 1270 IF Q$="←" THEN 1360 1280 GOTO 1020 1290 : 1300 REM ERROR 1310 PRINT#2,CHR$ (1);:PRINT" ERROR !" 1320 GET Q$:IF PEEK (667)=PEEK (668) AND Q$<>"←" THEN 1320 1330 FOR W=1 TO 1000:NEXT 1340 IF Q$<>"←" THEN 1070 1350 : 1360 IF Q$="←" THEN PRINT"{DOWN}ABBRUCH !{DOWN}" 1370 PRINT#2,CHR$ (3); 1380 PRINT"{DOWN}ENDE DER UEBERTRAGUNG." 1390 CLOSE 1:CLOSE 15:CLOSE 2 1400 PRINT"{2DOWN,11SPACE}TASTE DRUECKEN !" 1410 WAIT 198,255:POKE 198,0 1420 GOTO 480 1430 : 1440 REM * EMPFANGEN * 1450 OPEN 1,8,2,DN$+",P,W" 1460 GOSUB 4930 1470 IF VAL (B$)<>0 THEN 1800 1480 POKE 668,PEEK (667):POKE 198,0 1490 PRINT#2,CHR$ (2); 1500 GET #2,E$:GET Q$ 1510 FOR W=1 TO 100:NEXT 1520 IF E$="" AND Q$<>"←" THEN 1490 1530 IF Q$="←" THEN 1800 1540 PRINT"{DOWN}BEGINN DER UEBERTRAGUNG.{DOWN}" 1550 FOR W=1 TO 100:NEXT 1560 GET #2,E$:POKE 668,PEEK (667):BY=0 1570 SU=0:Z=1 1580 GET Q$:IF PEEK (667)=PEEK (668) AND Q$<>"←" THEN 1580 1590 IF Q$="←" THEN 1800 1600 AT=TI 1610 IF TI-AT>30 THEN 1660 1620 IF PEEK (667)=PEEK (668) THEN 1610 1630 GET #2,B$(Z):IF B$(Z)="" THEN B$(Z)=CHR$ (0) 1640 SU=SU+ASC (B$(Z)):Z=Z+1 1650 IF Z<258 THEN 1600 1660 HI=INT (SU/256):LO=SU-256*HI 1670 PRINT#2,CHR$ (LO);CHR$ (HI); 1680 GET Q$:IF PEEK (667)=PEEK (668) AND Q$<>"←" THEN 1680 1690 IF Q$="←" THEN 1800 1700 GET #2,E$ 1710 IF E$<>CHR$ (2)AND E$<>CHR$ (3) THEN 1870 1720 PRINT#2,CHR$ (4); 1730 FOR X=1 TO Z 1740 PRINT#1,B$(X); 1750 NEXT X 1760 GET #2,Q$ 1770 BY=BY+Z 1780 PRINT" OK.{7SPACE}";INT (BY/254)+1;"{LEFT}. BLOCK" 1790 IF E$=CHR$ (2) THEN 1570 1800 IF Q$="←" THEN PRINT"{DOWN}ABBRUCH !{DOWN}" 1810 PRINT"{DOWN}ENDE DER UEBERTRAGUNG." 1820 CLOSE 1:CLOSE 15:CLOSE 2 1830 PRINT"{2DOWN,11SPACE}TASTE DRUECKEN !" 1840 WAIT 198,255:POKE 198,0 1850 GOTO 480 1860 : 1870 REM ERROR 1880 PRINT" ERROR !" 1890 PRINT#2,CHR$ (3); 1900 POKE 668,PEEK (667) 1910 GOTO 1570 1920 : 1930 REM * DATEN SENDEN * 1940 FOR SZ=15440 TO SG 1950 GET Q$:IF Q$="←" THEN PRINT:RETURN 1960 IF Q$=" " THEN GET E$:IF E$<>" " THEN 1960 1970 FOR W=1 TO 24:NEXT 1980 GET #2,C$:IF C$=CHR$ (24) THEN PRINT:RETURN 1990 IF C$<>CHR$ (19) THEN 2010 2000 GET #2,Q$:IF Q$<>CHR$ (17) AND PEEK (203)=64 THEN 2000 2010 SYS 62595:REM CIA'S SETZEN 2020 B$=CHR$ (USR (SZ)):GET #2,C$ 2030 IF DP THEN POKE 646,0:PRINT B$; 2040 IF SZ=53247 THEN SZ=57343 2050 GOSUB 2100 2060 IF D=13 THEN FOR W=1 TO 100:NEXT 2070 NEXT SZ 2080 RETURN 2090 : 2100 REM * UMFORMEN/SENDEN * 2110 E=0:D=ASC (B$):IF D>64 AND D<91 THEN E=32 2120 IF D=20 THEN D=8 2130 D=D+E 2140 PRINT#2,CHR$ (D);:IF NOT DP THEN POKE 646,0:PRINT B$; 2150 RETURN 2160 : 2170 REM * UMFORMEN/AUSGEBEN * 2180 E=0:D=ASC (C$):IF D>64 AND D<91 THEN E=32 2190 IF D>96 AND D<123 THEN E=-32 2200 IF D=8 THEN D=20 2210 D=D+E 2220 POKE 646,0:POKE 199,0:PRINT CHR$ (D); 2230 RETURN 2240 : 2250 REM * TASTATUR-AUSWERTUNG * 2260 E=ASC (B$) 2270 IF E=174 AND SG<65536 THEN SP=-1:POKE 53280,2:GOTO 570 2280 IF E=182 THEN SG=15440:GOSUB 3970:GOTO 570 2290 IF E=177 THEN SP=0:POKE 53280,PEEK (838):GOTO 570 2300 IF E=176 AND SG>15440 THEN GOSUB 1930:GOTO 570 2310 IF E=165 THEN GOSUB 3520:GOTO 570 2320 IF E=191 THEN GOSUB 4050:GOTO 570 2330 IF E=175 THEN 740 2340 IF E=95 THENPOKE 53280,PEEK (838):GOSUB 3970:GOSUB 3520:CLOSE 2:WAIT 198,1:GOTO 160 2350 IF E=222 THENPOKE 53280,PEEK (838):GOSUB 3970:CLOSE 2:A$="(FORTSETZUNG)":GOTO 160 2360 IF E=180 THEN GOSUB 4990:GOTO 570 2370 GOTO 570 2380 : 2390 REM *** DATEN SPEICHERN *** 2400 PRINT"{CLR}" 2410 GOSUB 4030 2420 IF SG=15440 THEN 160 2430 DN$="" 2440 INPUT"{2DOWN}DATEINAME ";DN$ 2450 IF DN$="" THEN 160 2460 OPEN 1,8,2,DN$+",S,W" 2470 GOSUB 4930 2480 PRINT#1,CHR$ (USR (15440)); 2490 IF ST<>0 THEN 2570 2500 CMD 1:A=15441 2510 E=SG:IF E>53247 THEN E=53247 2520 FOR SZ=A TO E 2530 PRINT CHR$ (USR (SZ)); 2540 NEXT 2550 IF E<SG THEN A=57344:E=SG:GOTO 2520 2560 PRINT#1,""; 2570 CLOSE 1:CLOSE 15 2580 IF VAL (B$)<>0 THEN WAIT 198,255 2590 GOTO 160 2600 : 2610 REM *** DATEN LADEN *** 2620 DN$="" 2630 INPUT"{CLR,3DOWN}DATEINAME ";DN$ 2640 IF DN$="" THEN 160 2650 SG=15440 2660 OPEN 1,8,2,DN$+",S,R" 2670 GOSUB 4930 2680 IF VAL (B$)<>0 THEN 2720 2690 POKE 144,0:POKE 832,80:POKE 833,60 2700 SYS 848:REM LOAD-ROUTINE 2710 SG=PEEK (832)+PEEK (833)*256-1 2720 CLOSE 1:CLOSE 15 2730 IF SG=-1 THEN PRINT"{2DOWN}ACHTUNG, PUFFER VOLL !!!{2DOWN}":SG=65535 2740 GOSUB 3970:POKE 198,0:WAIT 198,255 2750 GOTO 160 2760 : 2770 REM *** DATEN AUSGEBEN *** 2780 PRINT"{CLR}" 2790 GOSUB 4030 2800 IF SG=15440 THEN 160 2810 PRINT"{DOWN}'F1' = BILDSCHIRM" 2820 PRINT"'F3' = DRUCKER" 2830 PRINT"'F5' = HARDCOPY{DOWN}" 2840 WAIT 198,255 2850 D=0 2860 FOR SZ=15440 TO SG 2870 IF PEEK (198)<>0 THEN 2980 2880 C$=CHR$ (USR (SZ)) 2890 PRINT C$; 2900 IF D THEN PRINT#1,C$; 2910 IF SZ=53247 THEN SZ=57343 2920 NEXT SZ 2930 CLOSE 1:POKE 53280,PEEK (838) 2940 GET B$:IF B$="" THEN 2940 2950 IF B$="{F5}" THEN GOSUB 5130 2960 GOTO 160 2970 : 2980 GET B$ 2990 IF B$=" " THEN WAIT 198,255:GET B$ 3000 IF B$="←" THEN CLOSE 1:POKE 53280,PEEK (838):GOTO 160 3010 IF B$="{F3}" AND D=0 THEN E=PEEK (840):POKE 53280,2 3020 IF B$="{F3}"AND D=0 THENOPEN 1,4,E:FOR E=841 TO845:PRINT#1,CHR$ (PEEK (E));:NEXT :D=1 3030 IF B$="{F1}" THEN D=0:CLOSE 1:POKE 53280,PEEK (838) 3040 IF B$="{F5}" THEN GOSUB 5130 3050 GOTO 2880 3060 : 3070 REM ** PARAMETER ** 3080 PRINT"{CLR,2DOWN}" 3090 : 3100 REM BAUDRATE 3110 IF PEEK (830)=3 THEN BAUD=110 3120 IF PEEK (830)=5 THEN BAUD=150 3130 IF PEEK (830)=6 THEN BAUD=300 3140 IF PEEK (830)=7 THEN BAUD=600 3150 PRINT SPC( 22) BAUD;"{UP}" 3160 INPUT"110,150,300,600 BAUD ";BAUD 3170 IF BAUD=110 THEN POKE 830,3 3180 IF BAUD=150 THEN POKE 830,5 3190 IF BAUD=300 THEN POKE 830,6 3200 IF BAUD=600 THEN POKE 830,7 3210 : 3220 REM DATENBITS 3230 IF PEEK (829)=32 THEN DB=7 3240 IF PEEK (829)=0 THEN DB=8 3250 PRINT"{3DOWN}";SPC( 20) DB;"{UP}" 3260 INPUT"7 ODER 8 DATENBITS ";DB 3270 IF DB=7 THEN POKE 829,32 3280 IF DB=8 THEN POKE 829,0 3290 : 3300 REM STOPBITS 3310 IF PEEK (831)=0 THEN SB=1 3320 IF PEEK (831)=128 THEN SB=2 3330 PRINT"{3DOWN}";SPC( 19) SB;"{UP}" 3340 INPUT"1 ODER 2 STOPBITS ";SB 3350 IF SB=1 THEN POKE 831,0 3360 IF SB=2 THEN POKE 831,128 3370 GOTO 160 3380 : 3390 REM ** GEBUEHREN BERECHNEN ** 3400 PRINT"{DOWN,2SPACE}0. ZONE: NAHGESPRAECH" 3410 PRINT"{DOWN,2SPACE}1. ZONE: UNTER 50 KM" 3420 PRINT"{DOWN,2SPACE}2. ZONE: 50 - 100 KM" 3430 PRINT"{DOWN,2SPACE}3. ZONE: UEBER 100 KM" 3440 ZO=4:INPUT"{DOWN,2SPACE}ZONE 0, 1, 2 ODER 3 ";ZO 3450 IF ZO<>0 AND ZO<>1 AND ZO<>2 AND ZO<>3 THEN 3440 3460 INPUT"{DOWN,2SPACE,RVSON}N{RVOFF}ORMAL- /{SPACE,RVSON}B{RVOFF}ILLIG-TARIF ";Q$ 3470 IF Q$<>"N" AND Q$<>"B" THEN 3460 3480 POKE 836,ZO 3490 POKE 837,ASC (Q$) 3500 RETURN 3510 : 3520 IF NOT GB THEN RETURN 3530 ZO=PEEK (836) 3540 Q$=CHR$ (PEEK (837)) 3550 ZEIT=VAL (LEFT$ (TI$,2))*3600+VAL (MID$ (TI$,3,2))*60+VAL (RIGHT$ (TI$,2)) 3560 IF Q$="B" THEN 3620 3570 IF ZO=0 THEN BETRAG=INT (ZEIT/480+1)*PEEK (828)/100 3580 IF ZO=1 THEN BETRAG=INT (ZEIT/45+1)*PEEK (828)/100 3590 IF ZO=2 THEN BETRAG=INT (ZEIT/20+1)*PEEK (828)/100 3600 IF ZO=3 THEN BETRAG=INT (ZEIT/12+1)*PEEK (828)/100 3610 GOTO 3650 3620 IF ZO=0 THEN BETRAG=INT (ZEIT/720+1)*PEEK (828)/100 3630 IF ZO=1 THEN BETRAG=INT (ZEIT/67.5+1)*PEEK (828)/100 3640 IF ZO=2 OR ZO=3 THEN BETRAG=INT (ZEIT/38.6+1)*PEEK (828)/100 3650 PRINT 3660 PRINT"ZEIT{2SPACE}=";TI$ 3670 PRINT"BETRAG=";BETRAG;"DM" 3680 PRINT 3690 IF B$<>"←" THEN 3830 3700 PRINT"GEBUEHREN SPEICHERN (J/N)?" 3710 GET Q$ 3720 IF Q$<>"J" AND Q$<>"N" THEN 3710 3730 IF Q$="N" THEN 3830 3740 OPEN 1,8,2,"GEBUEHREN,S,R" 3750 INPUT#1,GESB 3760 CLOSE 1 3770 GESB=GESB+BETRAG 3780 OPEN 1,8,2,"@:GEBUEHREN,S,W" 3790 PRINT#1,GESB 3800 CLOSE 1 3810 PRINT"{DOWN}GESAMTBETRAG=";GESB;"DM" 3820 WAIT 198,255 3830 POKE 198,1:RETURN 3840 : 3850 REM ** GEBUEHREN ANSEHEN ** 3860 PRINT"{CLR,2DOWN}" 3870 INPUT"GEBUEHREN LOESCHEN{3SPACE}N{3LEFT}";Q$ 3880 IF Q$<>"J" AND Q$<>"N" THEN 3870 3890 IF Q$="J" THEN OPEN 1,8,2,"@:GEBUEHREN,S,W":PRINT#1,0:CLOSE 1 3900 OPEN 1,8,2,"GEBUEHREN,S,R" 3910 INPUT#1,GESB 3920 CLOSE 1 3930 PRINT"{2DOWN}GESAMTBETRAG=";GESB;"DM" 3940 WAIT 198,255 3950 GOTO 160 3960 : 3970 REM ** LO/HI-BERECHNUNG ** 3980 POKE 832,SG-INT (SG/256)*256 3990 POKE 833,INT (SG/256) 4000 GOSUB 4030 4010 RETURN 4020 : 4030 REM ** SPEICHERGRENZE ** 4040 SG=PEEK (832)+PEEK (833)*256 4050 IF SG<53248 THEN BY=SG-15440 4060 IF SG>57343 THEN BY=SG-15440-4095 4070 PRINT:PRINT"BYTES BELEGT:";BY 4080 PRINT"BYTES FREI{2SPACE}:";46000-BY 4090 RETURN 4100 : 4110 REM ** FUNKTIONSTASTEN ** 4120 PRINT"{CLR,2DOWN,12SPACE}FUNKTIONSTASTEN" 4130 PRINT"{12SPACE}YYYYYYYYYYYYYYY{DOWN}" 4140 FOR FT=0 TO 7 4150 PRINT" F";FT+1;":{2SPACE}";CHR$ (34); 4160 SZ=54000+70*FT 4170 E=USR (SZ):IF E=13 THEN 4210 4180 PRINT CHR$ (E); 4190 SZ=SZ+1 4200 GOTO 4170 4210 PRINT 4220 NEXT FT 4230 PRINT"{DOWN,12SPACE}AENDERN (J/N)?" 4240 GET Q$:IF Q$<>"J" AND Q$<>"N" THEN4240 4250 IF Q$="N" THEN 160 4260 PRINT"{HOME,4DOWN}" 4270 FOR FT=0 TO 7 4280 POKE 631,29:POKE 198,1 4290 INPUT"{6RIGHT}";Q$ 4300 IF Q$="" THEN 4370 4310 Q$=LEFT$ (Q$,69)+CHR$ (13) 4320 SZ=54000+70*FT 4330 FOR SP=1 TO LEN (Q$) 4340 SYS 735,SZ,ASC (MID$ (Q$,SP,1)) 4350 SZ=SZ+1 4360 NEXT SP 4370 NEXT FT 4380 PRINT"{DOWN,12SPACE}SPEICHERN (J/N)?" 4390 GET Q$:IF Q$<>"J" AND Q$<>"N" THEN4390 4400 IF Q$="N" THEN 160 4410 OPEN 1,8,2,"@:F-TASTEN,S,W" 4420 FOR SZ=54000 TO 54559 4430 PRINT#1,CHR$ (USR (SZ)); 4440 NEXT SZ 4450 CLOSE 1 4460 GOTO 160 4470 : 4480 REM ** FUNKTIONSTASTEN SENDEN ** 4490 D=ASC (B$) 4500 IF D=133 THEN FT=0 4510 IF D=134 THEN FT=2 4520 IF D=135 THEN FT=4 4530 IF D=136 THEN FT=6 4540 IF D=137 THEN FT=1 4550 IF D=138 THEN FT=3 4560 IF D=139 THEN FT=5 4570 IF D=140 THEN FT=7 4580 SZ=54000+70*FT 4590 FOR W=1 TO 30:NEXT 4600 SYS 62595 4610 B$=CHR$ (USR (SZ)) 4620 GET #2,Q$ 4630 IF DP THEN PRINT B$; 4640 GOSUB 2100 4650 SZ=SZ+1 4660 IF B$<>CHR$ (13) THEN 4590 4670 POKE 668,PEEK (667):GET #2,Q$ 4680 RETURN 4690 : 4700 REM * CURSOR EIN * 4710 E=PEEK (209)+PEEK (210)*256+PEEK (211) 4720 IF PEEK (E)<128 THEN POKE E,PEEK (E)+128 4730 POKE 54272+E,0 4740 RETURN 4750 : 4760 REM * CURSOR AUS * 4770 E=PEEK (209)+PEEK (210)*256+PEEK (211) 4780 IF PEEK (E)>127 THEN POKE E,PEEK (E)-128 4790 RETURN 4800 : 4810 REM ** DISKBEFEHLE ** 4820 PRINT"{CLR,2DOWN}'$' = DIRECTORY{2DOWN}" 4830 PRINT SPC( 13) CHR$ (34);:POKE 212,0:PRINT"{UP}" 4840 POKE 198,1:POKE 631,29 4850 INPUT"DISKBEFEHL ";B$ 4860 IF B$="$" THEN PRINT:SYS 918:WAIT 198,255:GOTO 160 4870 OPEN 15,8,15 4880 PRINT#15,B$ 4890 GOSUB 4950 4900 CLOSE 15 4910 WAIT 198,255:GOTO 160 4920 : 4930 REM ** DISKSTATUS ** 4940 OPEN 15,8,15 4950 INPUT#15,B$,C$ 4960 PRINT"{2DOWN}DISKSTATUS: "B$;" ";C$;"{DOWN}" 4970 RETURN 4980 : 4990 REM * HELP * 5000 PRINT 5010 PRINT"'C= S':DATEN SPEICHERN" 5020 PRINT"'C= E':SPEICHERN ENDE" 5030 PRINT"'C= A':DATEN AUSSENDEN" 5040 PRINT"'C= L':PUFFER LOESCHEN" 5050 PRINT"'C= G':GEBUEHREN" 5060 PRINT"'C= B':BYTES FREI" 5070 PRINT"'C= P':PRG-UEBERTRAGUNG" 5080 PRINT"'C= ←':OFF-LINE" 5090 PRINT"'C= ↑':UNTERBRECHUNG" 5100 PRINT"'C= H':HELP" 5110 RETURN 5120 : 5130 REM * HARDCOPY * 5140 D=0:CLOSE 1:E=PEEK (840):OPEN 1,4,E 5150 FOR E=841 TO 845:PRINT#1,CHR$ (PEEK (E));:NEXT 5160 OPEN 2,3 5170 PRINT"{HOME}"; 5180 PRINT#1 5190 FOR Z=1 TO 25 5200 FOR SP=1 TO 40 5210 GET #2,E$:PRINT#1,E$; 5220 NEXT SP 5230 NEXT Z 5240 PRINT#1:CLOSE 1:CLOSE 2 5250 RETURN