Tips & Tricks für Einsteiger
Wie lese ich innerhalb eines Basic-Programms das Disketteninhaltsverzeichnis ein? Wie berechne ich mit dem C 64 Primzahlen? Wie rechne ich mit hexadezimalen Zahlen? Auf diese und einige weitere Fragen sollen Sie hier Antwort bekommen.
Häufig bekommen wir von unseren Lesern Anfragen, wie man von einem Basic-Programm aus das Inhaltsverzeichnis einer Diskette einlesen kann. Die wirklich einfachste Lösung soll hier einmal vorgestellt werden. Sie kann problemlos in eigene Basic-Programme eingebaut und mit »GOSUB 1000« aufgerufen werden:
1000 OPEN 1,8,0,"$" : GET#1,A$,A$
1010 GET#1,A$,A$ : IF ST=64 THEN CLOSE 1 : RETURN
1020 GET#1,A$,B$ : PRINT ASC(A$+CHR$(0))+256*ASC(B$+CHR$(0));
1030 GET#1,A$ : PRINT A$; : IF A$<>"" THEN 1030
1040 PRINT : GOTO 1010
Wem es gelingt, eine bessere Version zu entwerfen, soll uns sofort schreiben!
(tr)Ein paar kleine Effekte
1. Diese Routine gibt einen vorher festgelegten Namen in dreieckiger Form auf dem Bildschirm aus.
0 A=53270:A$="PETER":L=LEN(A$)
1 FOR R=1 TO L : PRINT TAB(20)MID$(A$,R,L):POKE A,R:NEXT R
Der Ausdruck (Bildschirm) sieht folgendermaßen aus:
PETER
ETER
TER
ER
R
Der Name ist also horizontal und vertikal lesbar.
2. Mit dieser Routine wird folgendes erreicht:
a) Diskname und ID werden extern eingegeben, das heißt beide können fest im Programm gespeichert werden.
b) Diskname und ID erscheinen beim Listen des Directory untereinander!
10 INPUT "NAME";N$
20 INPUT "ID"; I$
30 OPEN 1,8,15,"N:□"+N$+","+I$:CLOSE 1
Das Zeichen »□« erhält man folgendermaßen: Geben Sie ein: OPEN 1,8,15,"N:"
Zurückfahren auf das zweite Anführungszeichen (Cursor nach links) und <CTRL+9, SHIFT+M, CTRL+0> drücken.
3. Dieser Trick erlaubt das Anhängen von Buchstaben an Directory-Namen.
OPEN 1,8,15,"R:Prgname{shift-space} Buchstaben = Prgname"
Prgname = Programmname
Natürlich funktioniert das auch beim Speichern:
SAVE "Programmname {shift+space} Buchstaben",8,1
Beim Laden braucht nur der Programmname angegeben zu werden.
(Stefan Wichmann/tr)Input-Zeichen selbst wählen
Wenn man bei INPUT ein anderes Zeichen als das »?« haben möchte, muß man vor dem INPUT-Befehl folgende POKEs eingeben:
POKE 631,20:POKE 632,20:POKE 633,ASC("gewünschtes Zeichen"): POKE 634,32:POKE 198,4
(Axel Stämmler/tr)
Schnelles Primzahlenprogramm in Basic
Das Programm (Listing 1) arbeitet nach dem Prinzip des Eratosthenes. Hierbei werden die geraden Zahlen gar nicht erst gestrichen, sondern durch einen STEP-Befehl übersprungen. Nun werden alle Vielfachen der Zahlen gestrichen. Alle Zahlen, die übrigbleiben, sind Primzahlen.
Die Primzahl 2 wird nur deshalb ohne Rechnung ausgegeben (Zeile 30), da es sich um die einzige gerade Primzahl handelt. Man müßte sonst in der Ausgabeschleife mit einer Verzögerung rechnen.
Übrigens ist in der IF-Abfrage in Zeile 30 der Punkt hinter dem Gleichheitszeichen kein Fehler. Der Computer rechnet hier mit dem Punkt schneller als mit einer Null. Das Programm benötigt für die Primzahlen bis 1000 weniger als 9 Sekunden. Da mit Feldvariablen gearbeitet wird, können nun Primzahlen bis 19300 ausgerechnet werden.
(Marcus Werner/tr)10 input"{clr}primzahlen bis";h:z=3:t=int(sqr(h)+1):w=(t-1)/2:g=t*t:dimp%(g)
20 forx=1tow:fory=z*ztogstepz*2:p%(y)=1:next:z=z+2:next
30 print2;:forx=3tohstep2:ifp%(x)=.thenprintx;
40 next
Die Multifunktions-Taste
Bei der Auswahl aus einem Menü störte mich immer die umständliche Sucherei nach der richtigen Taste. Ich habe mir deshalb eine kleine Routine ausgedacht, die einer Taste mehrere Funktionen zuweist und diese Taste zur »Auswahltaste« macht. Je nachdem, ob die »Auswahltaste« (hier: <↑>) einmal oder kurz hintereinander zwei-, drei-, viermal und so weiter gedrückt wird, werden die verschiedenen Menüpunkte angewählt. Bei bis zu sechs Wahlmöglichkeiten ist ein durchaus komfortables Arbeiten möglich.
Programmbeschreibung:
Im Prinzip besteht das Programm (Listing 2) aus zwei hintereinandergeschalteten GET-Befehlen (Zeilen 40 und 60). Mittels einer entsprechend dimensionierten FOR(K)-NEXT-Schleife verweilt das Programm beim zweiten GET aber nur sehr kurz. (Dauer einstellbar in Zeile 50; die Zahl 35 hat sich als ideal erwiesen.)
Je nachdem wieviel Funktionen zugewiesen wurden (Variable x in Zeile 6), so oft wird das zweite GET mit seiner »Verweilschleife« mittels einer weiteren FOR(A)-NEXT-Schleife durchlaufen — das aber nur, wenn jeweils rechtzeitig die »Auswahltaste« (festgelegt in Zeile 5) gedrückt wird. Ansonsten dringt das Programm nach Zeile 90 vor. Dort verzweigt es sich, je nachdem, wie oft die FOR(A)-NEXT-Schleife durchlaufen wurde (= wie oft die »Auswahltaste« gedrückt wurde).
Durch die Zeilen 70 und 30 ist das Programm gegen Fehlbedienung geschützt.
(Harald Poxrucker/tr)5 t=asc("^"):rem hier auswahltaste einsetzen
6 x=6:rem anzahl der funktionen
10 print"{clr}demo-programm fuer 'mulitfunktionstaste'":print:print
20 forz=1tox:printz"mal <"chr$(t)"> druecken = funktion "z:print:nextz:goto40
30 fork1=1to50:fork2=640to631step-1:pokek2,0:nextk2:nextk1
40 gett$:ift$<>chr$(t)then40
50 fora=1tox:fork=1to35
60 gett$:ift$=chr$(t)thennexta
70 ifa>xthen30
80 nextk
90 onagoto1000,2000,3000,4000,5000,6000
100 :
1000 print"{clr}funktion 1":end
2000 print"{clr}funktion 2":end
3000 print"{clr}funktion 3":end
4000 print"{clr}funktion 4":end
5000 print"{clr}funktion 5":end
6000 print"{clr}funktion 6":end
Tip zum MSE
In der Adresse 3586 steht die Gerätenummer der Datasette. Wenn Sie zum Beispiel zwei Diskettenlaufwerke mit den Geräteadressen 8 und 9 haben, lohnt sich ein POKE 3586,9. Dadurch wird beim Speichern und Laden auf »TAPE« das Laufwerk 9 angesprochen.
(tr)Vereinfachte Joystick-Abfrage
Mit »SYS 49152, Richtung, Programmzeile« wird die Joystick-Stellung abgefragt. Wenn »Stellung« mit »Richtung« übereinstimmt, verzweigt der Befehl zur angegebenen Zeilen-Nummer. Für die Richtung gilt:
| 1 | oben |
| 2 | unten |
| 4 | links |
| 8 | rechts |
| 16 | Feuer |
| 5 | links oben |
| 6 | links unten |
| 9 | rechts oben |
| 10 | rechts unten |
Nachfolgend der Basic-Lader:
10 FOR A = 0 TO 41: READ B: POKE 49152+A,B: NEXT
20 DATA 32,115,0,32,138,173,32,247,183,173,0,220,37,20,234,208,3,76,30,192
30 DATA 32,115,0,32,138,173,32,247,183,96,32,115,0,32,138,173,32,247,183,76
40 DATA 163,168
(Ralf Stumm/tr)
SMON auf Tastendruck
Wenn man die <RUN/STOP + RESTORE > -Tasten betätigt, so führt der Computer einen Interrupt (NMI) aus und springt zu einem Maschinenprogramm, dessen Startadresse in den Speicherzellen 792 und 793 gespeichert wurde.
Anwendung:
Man kann die Startadresse von einem eigenen Maschinenprogramm in 792 und 793 speichern und damit das Programm mit Drücken der <RESTORE>-Taste starten. In der Speicherzelle 792 muß das Low-Byte und in 793 das High-Byte der Startadresse stehen.
Beispiel:
POKE 792,0:POKE 793,192 startet SMON C000 (das Programm muß vorher geladen werden).
POKE 792,226: POKE 793,252 Es wird ein Reset ausgeführt.
(Jörg Ch. Ewert/tr)Das Hexadezimal-System
1. Hexadezimalzahl in Dezimalzahl umformen
1 z=0:fors=1to4:a=asc(mid$(h$,s,1)):a=a-48+(a>64)*7:z=z+a*16↑(4-s):next
In der Stringvariablen h$ muß zunächst die vierstellige (I) Hexadezimalzahl abgelegt werden, also zum Beispiel C000, ABCD, 0001 etc. Die Dezimalzahl befindet sich dann in der Variablen z.
2. Dezimalzahl in Hexadezimalzahl umformen
1 h$="":fors=1to4:m=16↑(4-s):a=int(z/m):z=z-m*a:h$=h$+chr$(a+48-(a>9)*7):next
Hier muß zunächst eine Dezimalzahl in der Variablen z abgelegt werden. Die Hexadezimalzahl liegt danach in h$.
(Knut Smoczyk/tr)