Prost mit dem C 64
Dieses Programm macht Ihren C 64 zum elektronischen Steuermann. Mit dem User-Port können Sie bis zu acht Geräte ein- und ausschalten.
Der Name Pro.St steht für programmierbare Steuerung; das Programm erlaubt die Steuerung von acht Geräten, die über entsprechende Treiberschaltungen am User-Port des C 64 angeschlossen sind. Für den Steuerungsablauf stehen Ihnen etwa 30 000 Einzelschritte zur Verfügung. Jeder Schritt wird als ein Byte im verbleibenden Basic-Speicher abgelegt. Zur Bearbeitung des Programmablaufs hat Pro.St einen eigenen Editor, mit dem Abläufe erstellt, geändert, angezeigt, ausgeführt, gespeichert und geladen werden.
Nach dem Starten des Programms wird in Zeile 9 das User-Port-Display von Jan Legenhausen, 64’er Ausgabe 8/84, geladen. Sollten Sie dieses Programm (noch) nicht haben, sei gesagt, daß Pro.St auch ohne diese Anzeige läuft, dann aber an eine Autofahrt mit schwarzen Scheiben erinnert: Man weiß nie, woran man ist. Haben Sie das Programm von Jan Legenhausen nur als Basic-Lader, starten Sie den Lader und laden dieses Programm manuell. Vergessen Sie dann nicht, Zeile 9 von Pro.St zu löschen.
Pro.St meldet sich nach dem Start mit seinem Hauptmenü, das sieben Wahlmöglichkeiten hat:
- 1: Eingabe eines Steuerprogramms über die Tastatur. Es werden für jeden Kanal des User-Ports die Schaltzustände (an/aus) binär eingegeben. Tippfehler können Sie mit DELete löschen. Korrekte Eingaben schließen mit RETURN ab. Das Programm wandelt die Eingabe in eine Dezimalzahl und POKEt sie in den Programmspeicher, der ab Adresse 10240im Basic-RAM beginnt. Beendet wird der Eingabemodus durch Eingabe von E und bei vollem Programmspeicher (RAM-Ende bei 40960).
- 2: Schaltet in den Edit-Modus. In einem Untermenü können Sie bestimmen, ob ein Schritt gelöscht (1), eingefügt (2) oder ersetzt (3) werden soll. Um den entsprechenden Schritt zu ändern, muß dessen Nummer eingetippt werden. Die letzte Wahlmöglichkeit (4) zeichnet eine grafische Darstellung des Programmablaufs. Die Schaltzustände am User-Port werden dazu in einem Diagramm gegen die Zeit aufgetragen, indem bis zu 35 Schritte aus dem Speicher geholt, ins Binärsystem umgerechnet und als High-Low-Diagramm auf den Bildschirm gedruckt werden. Mit den V- und Z-Tasten kann dabei im Programmablaufplan geblättert werden.
- 3: Führt ins Disketten-Unterprogramm. Hier können erstellte Programme gespeichert (1), geladen (2) und Directories gezeigt werden.
- 4: Löscht den Programmspeicher von Pro.St.
- 5: Startet das Programm im Speicher. Zuvor können Sie noch zwischen Freilauf (1) und Einzelschrittverarbeitung (2) wählen. Bei Freilauf müssen Sie die Zeit zwischen zwei Schritten angeben. Bei Einzelschritt können Sie mit der CTRL-Taste den nächsten Schritt starten. In beiden Fällen bestimmen Sie zusätzlich die Anzahl der Programmdurchläufe.
- 6: Dient zum direkten Testen der angeschlossenen Peripherie. Mit den Tasten 1 bis 8 kann ein Gerät, das am entsprechenden User-Port-Kanal angeschlossen ist, geschaltet werden.
- 7: Beendet das Programm. Nach einer Sicherheitsabfrage wird der User-Port wieder in den Anfangszustand versetzt.
Hinweis
Da das Programm in Basic geschrieben ist, kann es nicht für zeitkritische Fälle verwendet werden. Wegen der Ungenauigkeit der internen Uhr des C 64 bedarf es einer Zeitkorrektur. Sie sollten den Korrekturfaktor in Zeile 2065 mit einer Stoppuhr nachprüfen. Der Korrekturfaktor wird mit Ihrer Sekundenangabe (ZD) für einen Schaltschritt multipliziert und dann ständig mit der internen Uhr (TI) verglichen. Da TI im 1/60-Sekundentakt zählt, ist der Standard für den Korrekturfaktor 60.
(Michael Anton/hm)| T$ | Tastaturabfrage |
| BZ$(8) | Diagrammzeile |
| DS$ | Diskstatus |
| NA$ | Filename |
| AN | Anfang des Steuerprogrammspeichers-1 |
| BI(8) | Binärwert |
| D | Dezimalwert |
| HI(8) | Umwandlungshilfe |
| MA | Anzahl der Steuerschritte |
| SS | Aktueller Schritt |
| PO | Portadresse |
| SV | Flag für Speicherbelegung |
| UF | Unterprogramm-Flag |
0 rem ********************************** * *
1 rem * p r o.s t 6 4 (3) * * *
2 rem * 1984 by * * michael anton *
3 rem * herm.essig str 106 * * 7141 schwieberdingen *
4 rem * (07150)/31576 * * *
5 rem **********************************
7 rem "zeile 9 u.10 weglassen, wenn sie das userport-display aus der 64'er"
8 rem "nicht als maschinenprogramm nachladen koennen"
9 ifsv=0thensv=1:load"upd.49309",8,1
10 sys49309
11 :
12 poke56,40:clr
13 :
14 :
15 rem *init*
16 :
20 an=10240:sv=0:uf=0:bs$(0)="R":bs$(1)="E":po=56577:poke56579,255:pokepo,0
30 poke53280,15:poke53281,8:print"{clr}{cyn}"
40 forl=1to8:readhi(l):nextl
41 data8,7,6,5,4,3,2,1
50 goto10000
70 :
75 :
80 rem *loesch1*
81 input"{clr}{down}{down}{down}{down}{down}{down}{down}{rght}{rght}{rght}sicher (j/n)";a$:ifa$<>"j"thenreturn
85 ma=0:sv=0:return
87 :
90 rem *loesch2*
92 forll=an+sstoan+ma+1:pokell,peek(ll+1):nextll:ma=ma-1:return
93 :
95 rem *einf*
97 forll=an+ma+1toan+lxstep-1:pokell+1,peek(ll):nextll:ma=ma+1:return
98 :
99 :
100 rem *eingabe*
101 :
102 ifsv=0then105
103 input"{clr}{down}{down}{down}{down}{down}{rght}altes programm ueberschreiben (j/n)";a$
104 ifa$<>"j"thenreturn
105 uf=0
110 print"{clr}{down}{down}{rght}{rght}{rght}eingabe{down}{down}{down}":print"{rvon}0{rvof} {rvon}1{rvof} {rvon}del{rvof} {rvon}return{rvof} {rvon}e{rvof}nde"
120 gosub6000
130 :
160 rem *einsch*
170 lx=1
180 print"{down}schritt "lx;tab(15);"87654321":printtab(15);
190 :
200 rem *bin-in*
210 forlb=1to9
220 gett$:if(t$="0"ort$="1")andlb<9then260
225 ift$=chr$(13)andlb=9then290
230 ift$=chr$(20)thenlb=lb-1:print"{left}";:goto220
240 ift$="e"then340
250 goto220
260 bi(lb)=val(t$):printt$;:nextlb
270 :
290 rem *bin-dez*
295 d=0:h=128
300 forlb=1to8:d=d+bi(lb)*h:h=h/2:nextlb
305 ifuf=1thenreturn
310 print"{rght}{rght}";d:pokean+lx,d
315 ifuf=2thenreturn
320 lx=lx+1:iflx+an<40960then180
330 print"{down}{down}{rght}{rght}speicherplatz zuende!!"
340 print:print"eingabeende bei schritt ";lx-1:ma=lx-1:sv=1:gosub6000
350 return
400 :
450 :
500 rem *editieren*
502 :
505 ifsv=0thenprint"{clr}{down}{down}{down}{down}{down}{rght}{rght}{rght}{rght}{rght}speicher leer":goto6000
510 print"{clr}{down}{down}{down}{down}{down}1 _ schritt loeschen":print"{down}2 _ schritt einfuegen"
520 print"{down}3 _ schritt ersetzen":print"{down}4 _ verlaufsdiagramm":print"{down}5 _ menu"
530 gett$:ift$=""then530
535 wa=val(t$):ifwa<1orwa>5then530
540 onwagoto560,580,587,600,550
545 goto500
550 return
555 :
560 rem *loeschen*
565 input"{clr}{down}{down}{down}{down}{down}zu loeschender schritt: ";ss:gosub90
570 print"{down}{down}{down}{rght}{rght}{rght}{rght}{rght}ok":gosub6000:goto500
575 :
580 rem *einfuegen*
585 input"{clr}{down}{down}{down}{down}{down}{rght}{rght}{rght}{rght}{rght}einfuegen bei schritt: ";lx:gosub95:goto590
587 input"{clr}{down}{down}{down}{down}{down}{rght}{rght}{rght}{rght}{rght}zu eretzender schritt ";lx
590 print"{down}neuen schritt eingeben:{down}{down}":uf=2:gosub180
595 gosub6000:goto500
597 :
600 rem *diagramm*
602 :
605 ms$="{CBM-Q}{CBM-E}{CBM-E}{CBM-E}{CBM-E}{CBM-E}{CBM-E}{CBM-E}{CBM-E}{CBM-E}{CBM-E}{CBM-E}{CBM-E}{CBM-E}{CBM-E}{CBM-E}{CBM-E}{CBM-E}{CBM-E}{CBM-E}{CBM-E}{CBM-E}{CBM-E}{CBM-E}{CBM-E}{CBM-E}{CBM-E}{CBM-E}{CBM-E}{CBM-E}{CBM-E}{CBM-E}{CBM-E}{CBM-E}{CBM-W}":ss=1
610 ko$=" {rvon}v{rvof}or {rvon}z{rvof}urueck {rvon}a{rvof}nfang {rvon}e{rvof}nde"
615 forl=1to8:bz$(l)="":nextl:hz=1
617 poke211,15:poke214,24:sys58640:print"bitte warten!"
620 d=peek(an+ss):h=128
630 forl=1to8:bi=int(d/h)
650 bz$(hi(l))=bz$(hi(l))+bs$(bi)
670 d=d-h*bi:h=h/2:nextl
680 hz=hz+1:ss=ss+1:ifss>mathen700
690 ifhz<=35then620
700 print"{clr}{down}":forl=1to8:printl;bz$(l):print:nextl:print
710 printtab(3);"{up}";ms$:print:printtab(2);ss-hz+1:print:printko$
720 gett$:ift$=""then720
725 ift$="v"andss<mathen615
730 zf=0:ift$="z"andss>35thenss=ss-70:zf=1:ifss<1thenss=1
735 ift$="z"andzf=1then615
740 ift$="a"thenss=1:goto615
745 ift$="e"then500
750 goto720
1000 :
1500 :
2000 rem *start*
2002 :
2003 ifsv=0thenprint"{clr}{down}{down}{down}{down}{down}{rght}{rght}{rght}{rght}{rght}speicher leer":goto6000
2005 print"{clr}{down}{down}{down}{rght}{rght}{rght}{rght}{rght}{rght}lauf":print"{down}{down}{down}1 _ freilauf"
2010 print"{down}2 _ einzelschritt":print"{down}{down}{down}{rght}{rght}{rght}{rght}{rght}wahl?"
2015 wait203,63:gett$
2020 ift$="1"then2040
2025 ift$="2"then2200
2030 goto2015
2040 print"{clr}{down}{down}{down}{down}{down}{down}{rght}{rght}{rght}freilauf":print"{down}{down}{down}1 _ dauerlauf"
2045 print"{down}2 _ x*durchlaufen":print"{down}{down}{down}{rght}{rght}{rght}{rght}{rght}wahl?"
2046 wl=0
2050 wait203,63:gett$
2055 ift$="1"thenwl=1
2060 ift$="2"thenwl=2
2062 ifwl=0then2050
2064 :
2065 input "{clr}{down}{down}{down}{down}{rght}{rght}{rght}zyklusdauer in sekunden ";zd:zd=zd*55
2070 ifwl=2theninput"{down}{down}{rght}{rght}{rght}durchlaeufe ";dl
2075 input"{down}{down}{rght}{rght}{rght}start bei schritt ";ss:ll=0:print"{down}{down}{down}{rght}{rght}{rght}{rght}{rght}start = < taste >"
2078 gett$:ift$=""then2078
2080 l=an+ss
2090 pokepo,peek(l):ti$="000000"
2110 ifti<zdthen2110
2120 ifpeek(653)=1thenk$="break":ll=ll+1:ss=ss+1:goto2160
2130 ss=ss+1:ifss<=mathen2080
2135 ll=ll+1:ifll<dlthenss=1:goto2080
2140 ifwl=1thenss=1:goto2080
2150 k$="ende"
2160 print"{down}{down}{down}";k$;" bei durchlauf";ll;" schritt";ss-1:goto6000
2180 :
2200 rem *einzel*
2210 input"{clr}{down}{down}{down}{rght}{rght}{rght}durchlaeufe ";dl
2220 input"{down}{down}{rght}{rght}{rght}start bei ";ss:print"{down}{down}{down}{down}{rght}{rght}{rght}{rght}{rght}start = < taste >":ll=0
2230 gett$:ift$=""then2230
2240 l=an+ss:pokepo,peek(l)
2250 ifpeek(653)=1thenk$="break":ll=ll+1:goto2160
2260 ifpeek(653)<>4then2250
2265 ford=1to50:nextd
2270 ss=ss+1:ifss<=mathen2240
2280 ll=ll+1:ifll<dlthenss=1:goto2240
2290 k$="ende":goto2160
2400 :
2500 :
3000 rem *saven*
3010 print"{clr}{down}{down}{down}{down}{down}{down}{down}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}absaven"
3020 input"{down}{down}{rght}{rght}{rght}{rght}{rght}filename:";na$
3030 open1,8,2,na$+",s,w":gosub5000
3035 print"{down}{rght}{rght}{rght}{rght}{rght}";ds$:ifd1>19then3085
3040 ll=ma+1:print#1,ll
3050 forl=1toll:print#1,peek(an+l):nextl
3085 close1:close15:ifd1>19then3020
3090 print"{down}{rght}{rght}{rght}{rght}{rght}file gespeichert":gosub6000
3100 return
3200 :
3300 :
4000 rem *einlesen*
4010 print"{clr}{down}{down}{down}{down}{down}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}einlesen"
4012 ifsv=0then4020
4014 input"{down}{rght}{rght}altes programm loeschen?? (j/n)";a$:ifa$<>"j"thenreturn
4020 input"{down}{down}{down}{rght}{rght}{rght}{rght}{rght}filename:";na$
4030 open1,8,2,na$+",s,r":gosub5000
4035 print"{down}{rght}{rght}{rght}{rght}{rght}";ds$:ifd1>19then4100
4040 input#1,ll:ma=ll-1
4050 forl=1toll:input#1,d:pokean+l,d:nextl
4100 close1:close15:ifd1>19then4020
4110 print"{down}{rght}{rght}{rght}{rght}{rght}file eingelesen":sv=1:gosub6000
4120 return
4200 :
4300 :
5000 rem *status*
5010 open15,8,15:input#15,d1,ds$,d2,d3:return
5050 :
5100 print"{clr}":open1,8,0,"$":a=0
5110 get#1,x$,x$
5120 get#1,x$,x$
5130 get#1,x$,x$
5140 get#1,x$:ifst<>0then5220
5150 ifx$<>chr$(34)then5140
5160 get#1,x$:ifx$<>chr$(34)thenprintx$;:goto5160
5170 ifa=0thena=1:print:goto5180
5175 a=0:printtab(20);
5180 get#1,x$:ifx$=chr$(32)then5180
5190 get#1,x$:ifx$<>""then5190
5200 gett$:ift$<>""thengosub5240
5210 ifst=0then5120
5220 print
5230 close1:goto6000
5240 gett$:ift$=""then5240
5250 return
5400 :
5500 rem *disk*
5510 print"{clr}{down}{down}{down}{down}{down}1 _ saven":print"{down}2 _ einlesen":print"{down}3 _ inhalt"
5520 gett$:ift$=""then5520
5525 wa=val(t$):ifwa<1orwa>3then5520
5530 onwagoto3000,4000,5100
5600 :
5700 :
6000 rem *warten*
6005 :
6010 print "{down}{down}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}<< taste >>"
6020 gett$:ift$=""then6020
6030 return
7000 :
8000 :
9000 rem *test*
9005 :
9010 print"{clr}{down}{down}{down}{rght}{rght}{rght}{rght}peripherietest":print"{down}{down}{down}{rght}{rght}{rvon}m{rvof}enu{down}{down}"
9015 forl=1to8:bi(l)=0:nextl:d=0
9020 print" 1 2 3 4 5 6 7 8":print
9025 goto9055
9030 gett$:ift$=""then9030
9035 ift$="m"thenreturn
9040 lb=val(t$):iflb<1orlb>8then9030
9045 lb=hi(lb)
9050 ifbi(lb)=1thenbi(lb)=0:goto9054
9051 ifbi(lb)=0thenbi(lb)=1
9054 uf=1:gosub290
9055 print"{up}";:forl=8to1step-1:printbi(l);:nextl:print
9060 pokepo,d:goto9030
9100 :
9200 :
10000 rem *menu*
10005 :
10010 print"{clr}{down}{down}{down}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}p r o.s t 64.1{down}{down}"
10030 print"{down}1 _ eingabe":print"{down}2 _ editieren"
10040 print"{down}3 _ diskette":print"{down}4 _ loeschen":print"{down}5 _ starten"
10050 print"{down}6 _ peripherietest":print"{down}7 _ ende"
10120 gett$:ift$=""then10120
10130 wa=val(t$):ifwa<1orwa>7then10120
10140 onwagosub100,500,5500,80,2000,9000,11000
10150 goto10000
10200 :
10300 :
11000 rem *ende*
11005 :
11010 input"{clr}{down}{down}{down}{down}{down}{rght}{rght}{rght}{rght}{rght}alles gesichert??? (j/n)";a$:ifa$<>"j"thenreturn
11020 pokepo,0:poke56579,0
11030 :
11040 end
11050 :
11055 :
11060 :
12025 rem directory (5100-5400) frei
12030 rem nach commodore vic 1541 sdfd
12035 rem user's manual s.47
12040 rem userportdisplay von jan
12045 rem legenhausen, 64'er 8/84
12050 rem vielen dank!!!
12055 :
12060 rem zeilen 0-5 und 12025 ff.
12065 rem weglassen!! gilt auch fuer
12070 :
12075 rem ^ solche ^
0 REM ********************************** * * 1 REM * P R O.S T 6 4 (3) * * * 2 REM * 1984 BY * * MICHAEL ANTON * 3 REM * HERM.ESSIG STR 106 * * 7141 SCHWIEBERDINGEN * 4 REM * (07150)/31576 * * * 5 REM ********************************** 7 REM "ZEILE 9 U.10 WEGLASSEN, WENN SIE DAS USERPORT-DISPLAY AUS DER 64'ER" 8 REM "NICHT ALS MASCHINENPROGRAMM NACHLADEN KOENNEN" 9 IF SV=0 THENSV=1:LOAD "UPD.49309",8,1 10 SYS 49309 11 : 12 POKE 56,40:CLR 13 : 14 : 15 REM *INIT* 16 : 20 AN=10240:SV=0:UF=0:BS$(0)="R":BS$(1)="E":PO=56577:POKE 56579,255:POKE PO,0 30 POKE 53280,15:POKE 53281,8:PRINT"{CLR,CYAN}" 40 FOR L=1 TO8:READ HI(L):NEXT L 41 DATA 8,7,6,5,4,3,2,1 50 GOTO 10000 70 : 75 : 80 REM *LOESCH1* 81 INPUT"{CLR,7DOWN,3RIGHT}SICHER (J/N)";A$:IF A$<>"J" THENRETURN 85 MA=0:SV=0:RETURN 87 : 90 REM *LOESCH2* 92 FOR LL=AN+SS TOAN+MA+1:POKE LL,PEEK (LL+1):NEXT LL:MA=MA-1:RETURN 93 : 95 REM *EINF* 97 FOR LL=AN+MA+1 TOAN+LXSTEP -1:POKE LL+1,PEEK (LL):NEXT LL:MA=MA+1:RETURN 98 : 99 : 100 REM *EINGABE* 101 : 102 IF SV=0 THEN105 103 INPUT"{CLR,5DOWN,RIGHT}ALTES PROGRAMM UEBERSCHREIBEN (J/N)";A$ 104 IF A$<>"J" THENRETURN 105 UF=0 110 PRINT"{CLR,2DOWN,3RIGHT}EINGABE{3DOWN}":PRINT"{RVSON}0{RVOFF,2SPACE,RVSON}1{RVOFF,2SPACE,RVSON}DEL{RVOFF,3SPACE,RVSON}RETURN{RVOFF,3SPACE,RVSON}E{RVOFF}NDE" 120 GOSUB 6000 130 : 160 REM *EINSCH* 170 LX=1 180 PRINT"{DOWN}SCHRITT "LX;TAB( 15);"87654321":PRINTTAB( 15); 190 : 200 REM *BIN-IN* 210 FOR LB=1 TO9 220 GET T$:IF (T$="0"OR T$="1")AND LB<9 THEN260 225 IF T$=CHR$ (13)AND LB=9 THEN290 230 IF T$=CHR$ (20) THENLB=LB-1:PRINT"{LEFT}";:GOTO 220 240 IF T$="E" THEN340 250 GOTO 220 260 BI(LB)=VAL (T$):PRINTT$;:NEXT LB 270 : 290 REM *BIN-DEZ* 295 D=0:H=128 300 FOR LB=1 TO8:D=D+BI(LB)*H:H=H/2:NEXT LB 305 IF UF=1 THENRETURN 310 PRINT"{2RIGHT}";D:POKE AN+LX,D 315 IF UF=2 THENRETURN 320 LX=LX+1:IF LX+AN<40960 THEN180 330 PRINT"{2DOWN,2RIGHT}SPEICHERPLATZ ZUENDE!!" 340 PRINT:PRINT"EINGABEENDE BEI SCHRITT ";LX-1:MA=LX-1:SV=1:GOSUB 6000 350 RETURN 400 : 450 : 500 REM *EDITIEREN* 502 : 505 IF SV=0 THENPRINT"{CLR,5DOWN,5RIGHT}SPEICHER LEER":GOTO 6000 510 PRINT"{CLR,5DOWN}1 ← SCHRITT LOESCHEN":PRINT"{DOWN}2 ← SCHRITT EINFUEGEN" 520 PRINT"{DOWN}3 ← SCHRITT ERSETZEN":PRINT"{DOWN}4 ← VERLAUFSDIAGRAMM":PRINT"{DOWN}5 ← MENU" 530 GET T$:IF T$="" THEN530 535 WA=VAL (T$):IF WA<1OR WA>5 THEN530 540 ON WAGOTO 560,580,587,600,550 545 GOTO 500 550 RETURN 555 : 560 REM *LOESCHEN* 565 INPUT"{CLR,5DOWN}ZU LOESCHENDER SCHRITT: ";SS:GOSUB 90 570 PRINT"{3DOWN,5RIGHT}OK":GOSUB 6000:GOTO 500 575 : 580 REM *EINFUEGEN* 585 INPUT"{CLR,5DOWN,5RIGHT}EINFUEGEN BEI SCHRITT: ";LX:GOSUB 95:GOTO 590 587 INPUT"{CLR,5DOWN,5RIGHT}ZU ERETZENDER SCHRITT ";LX 590 PRINT"{DOWN}NEUEN SCHRITT EINGEBEN:{DOWN,DOWN}":UF=2:GOSUB 180 595 GOSUB 6000:GOTO 500 597 : 600 REM *DIAGRAMM* 602 : 605 MS$="QEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEW":SS=1 610 KO$="{3SPACE,RVSON}V{RVOFF}OR{SPACE,3SPACE,RVSON}Z{RVOFF}URUECK{SPACE,4SPACE,RVSON}A{RVOFF}NFANG{SPACE,4SPACE,RVSON}E{RVOFF}NDE" 615 FOR L=1 TO8:BZ$(L)="":NEXT L:HZ=1 617 POKE 211,15:POKE 214,24:SYS 58640:PRINT"BITTE WARTEN!" 620 D=PEEK (AN+SS):H=128 630 FOR L=1 TO8:BI=INT (D/H) 650 BZ$(HI(L))=BZ$(HI(L))+BS$(BI) 670 D=D-H*BI:H=H/2:NEXT L 680 HZ=HZ+1:SS=SS+1:IF SS>MA THEN700 690 IF HZ<=35 THEN620 700 PRINT"{CLR,DOWN}":FOR L=1 TO8:PRINTL;BZ$(L):PRINT:NEXT L:PRINT 710 PRINTTAB( 3);"{UP}";MS$:PRINT:PRINTTAB( 2);SS-HZ+1:PRINT:PRINTKO$ 720 GET T$:IF T$="" THEN720 725 IF T$="V"AND SS<MA THEN615 730 ZF=0:IF T$="Z"AND SS>35 THENSS=SS-70:ZF=1:IF SS<1 THENSS=1 735 IF T$="Z"AND ZF=1 THEN615 740 IF T$="A" THENSS=1:GOTO 615 745 IF T$="E" THEN500 750 GOTO 720 1000 : 1500 : 2000 REM *START* 2002 : 2003 IF SV=0 THENPRINT"{CLR,5DOWN,5RIGHT}SPEICHER LEER":GOTO 6000 2005 PRINT"{CLR,3DOWN,6RIGHT}LAUF":PRINT"{3DOWN}1 ← FREILAUF" 2010 PRINT"{DOWN}2 ← EINZELSCHRITT":PRINT"{DOWN,2DOWN,5RIGHT}WAHL?" 2015 WAIT 203,63:GET T$ 2020 IF T$="1" THEN2040 2025 IF T$="2" THEN2200 2030 GOTO 2015 2040 PRINT"{CLR,6DOWN,3RIGHT}FREILAUF":PRINT"{3DOWN}1 ← DAUERLAUF" 2045 PRINT"{DOWN}2 ← X*DURCHLAUFEN":PRINT"{DOWN,2DOWN,5RIGHT}WAHL?" 2046 WL=0 2050 WAIT 203,63:GET T$ 2055 IF T$="1" THENWL=1 2060 IF T$="2" THENWL=2 2062 IF WL=0 THEN2050 2064 : 2065 INPUT "{CLR,4DOWN,3RIGHT}ZYKLUSDAUER IN SEKUNDEN ";ZD:ZD=ZD*55 2070 IF WL=2 THENINPUT"{2DOWN,3RIGHT}DURCHLAEUFE ";DL 2075 INPUT"{2DOWN,3RIGHT}START BEI SCHRITT ";SS:LL=0:PRINT"{3DOWN,5RIGHT}START = < TASTE >" 2078 GET T$:IF T$="" THEN2078 2080 L=AN+SS 2090 POKE PO,PEEK (L):TI$="000000" 2110 IF TI<ZD THEN2110 2120 IF PEEK (653)=1 THENK$="BREAK":LL=LL+1:SS=SS+1:GOTO 2160 2130 SS=SS+1:IF SS<=MA THEN2080 2135 LL=LL+1:IF LL<DL THENSS=1:GOTO 2080 2140 IF WL=1 THENSS=1:GOTO 2080 2150 K$="ENDE" 2160 PRINT"{3DOWN}";K$;" BEI DURCHLAUF";LL;" SCHRITT";SS-1:GOTO 6000 2180 : 2200 REM *EINZEL* 2210 INPUT"{CLR,3DOWN,3RIGHT}DURCHLAEUFE ";DL 2220 INPUT"{2DOWN,3RIGHT}START BEI ";SS:PRINT"{4DOWN,5RIGHT}START = < TASTE >":LL=0 2230 GET T$:IF T$="" THEN2230 2240 L=AN+SS:POKE PO,PEEK (L) 2250 IF PEEK (653)=1 THENK$="BREAK":LL=LL+1:GOTO 2160 2260 IF PEEK (653)<>4 THEN2250 2265 FOR D=1 TO50:NEXT D 2270 SS=SS+1:IF SS<=MA THEN2240 2280 LL=LL+1:IF LL<DL THENSS=1:GOTO 2240 2290 K$="ENDE":GOTO 2160 2400 : 2500 : 3000 REM *SAVEN* 3010 PRINT"{CLR,7DOWN,12RIGHT}ABSAVEN" 3020 INPUT"{2DOWN,5RIGHT}FILENAME:";NA$ 3030 OPEN 1,8,2,NA$+",S,W":GOSUB 5000 3035 PRINT"{DOWN,5RIGHT}";DS$:IF D1>19 THEN3085 3040 LL=MA+1:PRINT#1,LL 3050 FOR L=1 TOLL:PRINT#1,PEEK (AN+L):NEXT L 3085 CLOSE 1:CLOSE 15:IF D1>19 THEN3020 3090 PRINT"{DOWN,5RIGHT}FILE GESPEICHERT":GOSUB 6000 3100 RETURN 3200 : 3300 : 4000 REM *EINLESEN* 4010 PRINT"{CLR,5DOWN,9RIGHT}EINLESEN" 4012 IF SV=0 THEN4020 4014 INPUT"{DOWN,2RIGHT}ALTES PROGRAMM LOESCHEN??{2SPACE}(J/N)";A$:IF A$<>"J" THENRETURN 4020 INPUT"{3DOWN,5RIGHT}FILENAME:";NA$ 4030 OPEN 1,8,2,NA$+",S,R":GOSUB 5000 4035 PRINT"{DOWN,5RIGHT}";DS$:IF D1>19 THEN4100 4040 INPUT#1,LL:MA=LL-1 4050 FOR L=1 TOLL:INPUT#1,D:POKE AN+L,D:NEXT L 4100 CLOSE 1:CLOSE 15:IF D1>19 THEN4020 4110 PRINT"{DOWN,5RIGHT}FILE EINGELESEN":SV=1:GOSUB 6000 4120 RETURN 4200 : 4300 : 5000 REM *STATUS* 5010 OPEN 15,8,15:INPUT#15,D1,DS$,D2,D3:RETURN 5050 : 5100 PRINT"{CLR}":OPEN 1,8,0,"$":A=0 5110 GET #1,X$,X$ 5120 GET #1,X$,X$ 5130 GET #1,X$,X$ 5140 GET #1,X$:IF ST<>0 THEN5220 5150 IF X$<>CHR$ (34) THEN5140 5160 GET #1,X$:IF X$<>CHR$ (34) THENPRINTX$;:GOTO 5160 5170 IF A=0 THENA=1:PRINT:GOTO 5180 5175 A=0:PRINTTAB( 20); 5180 GET #1,X$:IF X$=CHR$ (32) THEN5180 5190 GET #1,X$:IF X$<>"" THEN5190 5200 GET T$:IF T$<>"" THENGOSUB 5240 5210 IF ST=0 THEN5120 5220 PRINT 5230 CLOSE 1:GOTO 6000 5240 GET T$:IF T$="" THEN5240 5250 RETURN 5400 : 5500 REM *DISK* 5510 PRINT"{CLR,5DOWN}1 ← SAVEN":PRINT"{DOWN}2 ← EINLESEN":PRINT"{DOWN}3 ← INHALT" 5520 GET T$:IF T$="" THEN5520 5525 WA=VAL (T$):IF WA<1OR WA>3 THEN5520 5530 ON WAGOTO 3000,4000,5100 5600 : 5700 : 6000 REM *WARTEN* 6005 : 6010 PRINT "{2DOWN,13RIGHT}<< TASTE >>" 6020 GET T$:IF T$="" THEN6020 6030 RETURN 7000 : 8000 : 9000 REM *TEST* 9005 : 9010 PRINT"{CLR,3DOWN,4RIGHT}PERIPHERIETEST":PRINT"{3DOWN,2RIGHT,RVSON}M{RVOFF}ENU{DOWN,DOWN}" 9015 FOR L=1 TO8:BI(L)=0:NEXT L:D=0 9020 PRINT" 1{2SPACE}2{2SPACE}3{2SPACE}4{2SPACE}5{2SPACE}6{2SPACE}7{2SPACE}8":PRINT 9025 GOTO 9055 9030 GET T$:IF T$="" THEN9030 9035 IF T$="M" THENRETURN 9040 LB=VAL (T$):IF LB<1OR LB>8 THEN9030 9045 LB=HI(LB) 9050 IF BI(LB)=1 THENBI(LB)=0:GOTO 9054 9051 IF BI(LB)=0 THENBI(LB)=1 9054 UF=1:GOSUB 290 9055 PRINT"{UP}";:FOR L=8 TO1STEP -1:PRINTBI(L);:NEXT L:PRINT 9060 POKE PO,D:GOTO 9030 9100 : 9200 : 10000 REM *MENU* 10005 : 10010 PRINT"{CLR,3DOWN,9RIGHT}P R O.S T{2SPACE}64.1{2DOWN}" 10030 PRINT"{DOWN}1 ← EINGABE":PRINT"{DOWN}2 ← EDITIEREN" 10040 PRINT"{DOWN}3 ← DISKETTE":PRINT"{DOWN}4 ← LOESCHEN":PRINT"{DOWN}5 ← STARTEN" 10050 PRINT"{DOWN}6 ← PERIPHERIETEST":PRINT"{DOWN}7 ← ENDE" 10120 GET T$:IF T$="" THEN10120 10130 WA=VAL (T$):IF WA<1OR WA>7 THEN10120 10140 ON WAGOSUB 100,500,5500,80,2000,9000,11000 10150 GOTO 10000 10200 : 10300 : 11000 REM *ENDE* 11005 : 11010 INPUT"{CLR,5DOWN,5RIGHT}ALLES GESICHERT??? (J/N)";A$:IF A$<>"J" THENRETURN 11020 POKE PO,0:POKE 56579,0 11030 : 11040 END 11050 : 11055 : 11060 : 12025 REM DIRECTORY (5100-5400) FREI 12030 REM NACH COMMODORE VIC 1541 SDFD 12035 REM USER'S MANUAL S.47 12040 REM USERPORTDISPLAY VON JAN 12045 REM LEGENHAUSEN, 64'ER 8/84 12050 REM VIELEN DANK!!! 12055 : 12060 REM ZEILEN 0-5 UND 12025 FF. 12065 REM WEGLASSEN!! GILT AUCH FUER 12070 : 12075 REM ↑ SOLCHE ↑