Auflösung: Wettbewerb Bildschirmseite Spitzenprogramme auf einem Bildschirm
Drei Top-Programme aus verschiedenen Themenbereichen stellen wir Ihnen vor.
Eine Flut von Programmeinsendungen erreichte uns auf diesen Wettbewerb. Auch nach intensiver Vorabauswahl kamen noch über 50 Programme in die engere Wahl. Nach weiteren Tests und Diskussionen in der Redaktion blieben schließlich drei Programme übrig. Es handelt sich hierbei um ein Spiel, ein Mathematikprogramm und eine Basic-Erweiterung. Dies veranlaßte uns, ein salomonisches Urteil zu fällen. Wir erhöhten den Preis um 50 Prozent und teilten den Gewinn auf. Jeder der drei Programmautoren erhält 500 Mark. Da die geistige Arbeit, die oft in einem »Bildschirmseitenprogramm« steckt, nicht unerheblich ist, werden wir auch in den nächsten Ausgaben noch einige BS-Seiten veröffentlichen.
Spiel: Block Busters
Block Busters ist eine »Break out«-Version. Sie müssen mit einem Ball möglichst viel von einer Mauer zerstören. Der Ball, der sich auf der Grundlinie hin und her bewegt, kann über den Feuerknopf nach oben geschleudert werden. Jedes zerstörte Mauerelement bringt Punkte. Zehn Bälle stehen Ihnen zur Verfügung. Erreichen Sie 150 Punkte oder ein Vielfaches hiervon, wird eine neue Mauer aufgebaut und Sie erhalten drei Extra-Bälle.
Die Grundanzahl der Bälle kann durch die Veränderung der 10 in Zeile 22, die Anzahl der Extrabälle durch Änderung der 3 in Zeile 14 eingestellt werden. Die Punktanzahl, mit der eine neue Mauer aufgebaut werden soll, kann in Zeile 14 verändert werden, indem man beide 150 verändert.
Noch ein Tip für Anfänger: Wenn Sie die linke oder rechte untere Ecke der Mauer treffen, wird gleich ein großer Teil der Mauer zerstört.
(Martin Greil/rg)X-Gleichung
Dieses Programm berechnet aus einer X-Gleichung den Wert für X. Durch die Begrenzung auf eine Bildschirmseite mußten leider einige Überprüfungen wegfallen. So muß der X-Wert eindeutig sein, das heißt wenn X + 3 und zugleich −3 ist, errechnet das Programm nur die −3. Wenn X unendlich viele Werte annehmen kann, erhält man nur die Lösung X = −1000000. Es dürfen auch keine undefinierten Werte auftreten, sonst erhält man eine Fehlermeldung vom Computer, so zum Beispiel DIVISION BY ZERO bei l/X und X = 0. Beachtet man dies, kann jede mathematische Funktion, die der C 64 kennt, in der Gleichung verwendet werden.
Programmbeschreibung:
In Zeile 0 bis 4 wird die Gleichung eingegeben und in eine linke (L$) und eine rechte (R$) Seite zerlegt und schließlich in die Zeilen 5 und 6 eingefügt. Nun erfolgt ein Neustart bei der Zeile 5, in der ja der eine Teil der Gleichung definiert ist. In Zeile 7 wird der kleinste Wert für X und in der Variablen I die Schrittweite festgelegt. A$ erhält ein Anführungszeichen und der Bildschirm wird gelöscht. Zeile 8 überprüft, ob die linke Seite der Gleichung mit X = −1E+6 kleiner als die rechte ist. Ist dies nicht der Fall, werden in den Zeilen 12 und 13 die rechte und die linke Seite vertauscht.
Danach werden in Zeile 9 A und B (linke und rechte Seite) definiert. X wird auf dem Bildschirm ausgegeben und I wird, wenn A < B ist, durch 10 dividiert. X nimmt den Wert der Hilfsvariablen V an. Jetzt wird wieder zur Zeile 9 zurückgesprungen.
Zeile 10 prüft, ob A = B ist, das heißt, daß beide Seiten der Gleichung gleich sind. In diesem Fall wird X invertiert ausgegeben.
In Zeile 11 wird mit einer GOSUB-Routine in Zeile 14 abgefragt, ob man durch einen Tastendruck das Programm wieder starten möchte. Dies ist sehr sinnvoll, wenn X beispielsweise gleich ⅓ ist, und es für den Computer keine dezimale Lösung gibt. Wird keine Taste gedrückt, übernimmt V den Wert von X und X wird um I erhöht. Dann erfolgt der Rücksprung zu Zeile 9.
(Christoph Rockenstein/rg)Musik-Tool
Unser letzter Ein-Seiter ist eine kleine Basic-Erweiterung, die dem C 64 einige neue Sound-Befehle beschert. So etwas ließe sich natürlich nur in Maschinensprache programmieren. Deswegen haben die Autoren zwei trickreiche Eingabesysteme erfunden. Das eine hat den Nachteil, daß es mehr als eine Bildschirmseite benötigt. Dafür ist es aber sehr viel leichter abzutippen als das zweite. Bei der ersten Version wurde das Maschinenprogramm mit den Buchstaben A bis P codiert. Somit kann es jeder innerhalb von wenigen Minuten abtippen. Die zweite Version verwendet den kompletten Commodore-Zeichensatz und ist deswegen sehr schwer einzugeben. Dies zeigt auch das überlange Checksummer-Listing, das beim normalen Listen aber auf eine Bildschirmseite paßt und somit die Wettbewerbsbedingungen erfüllt. Das erste Listing muß übrigens mit RUN 30 gestartet werden.
Nach dem Starten des Musik-Tools stehen Ihnen dann folgende Basic-Befehle zusätzlich zur Verfügung.
- SCLR löscht alle Register des Sound-Chips.
- ADSR Stimme (1 bis 3), Anschlag, Abschwellen, Halten, Ausklingen
Die Parameter für die Hüllkurve einstellen. Es sind Werte von 0 bis 15 erlaubt.
- PLAY Stimme, Tonhöhe, Wellenform
Spielt einen Ton beliebiger Höhe und Wellenform auf einer der drei Stimmen. Die Tonhöhe kann entweder durch einen Wert zwischen 0 und 65535 angegeben werden oder durch die Frequenz in Hertz, wenn man vor die Tonhöhe ein Ausrufezeichen setzt. Es stehen die vier normalen Wellenformen zur Verfügung, deren Werte im Handbuch stehen. Zusätzlich sind die Effekte Synchronisation und Ringmodulation verfügbar. Es muß dann 2 beziehungsweise 4 zur Wellenform addiert werden.
- SOFF Stimme
Die Lautstärke der Stimme geht in der Zeit auf Null zurück, die bei ADSR mit Ausklingen bestimmt wurde.
- FILT Resonanz + Stimme, Art, Frequenz
Legt die Filterbetriebsart fest. Resonanz + Stimme legt fest, welche Stimmen gefiltert werden sollen und wie hoch die Filterresonanz ist. Dieser Parameter errechnet sich wie folgt:
Wert = Resonanz * 16 + (Stimme —1) hoch 2Der Wert der Resonanz darf ebenfalls Werte von 0 bis 15 annehmen.
Die Art des Filters wird folgendermaßen bestimmt: 16-Tiefpaß, 32-Bandpaß und 64-Hochpaß. Die Stimme 3 läßt sich stummschalten, wenn man zu diesem Parameter 128 addiert.
Die Filterfrequenz darf Werte von 0 bis 2047 annehmen. Hier ist keine direkte Eingabe in Hertz möglich.
- TV Stimme, Tastverhältnis definiert das Tastverhältnis der Stimme, sofern als Wellenform das Rechteck Verwendung findet. Hier sind Werte von 0 bis 2047 erlaubt.
- VOL
legt schließlich die Lautstärke fest, die Werte von 0 bis 15 annehmen darf.
Schließlich wurden noch der POKE- und der PEEK-Befehle angepaßt, so daß sich jetzt auch alle Parameter des SID mit PEEK auslesen lassen.
(Rüdiger Wemski/Martin Wernecke/bs)A | Laufvarariable für Titelgrafik |
P | Für Farbwechsel in der Titelgrafik |
X | X-Koordinate vom Ball +1024 (Startadresse des Bildschirms) |
Y | Y-Koordinate vom Ball |
V | Vektor zur Berechnung der neuen X-Koordinate |
W | Vektor zur Berechnung der neuen Y-Koordinate |
T | Startadresse des SID +1 |
G | Zur Berechnung der Tonhöhe |
H | Punkte-Rekord (Hi-score) |
P | Punkte +1 (bei 150 – neue Mauer) |
S | Anzahl der gespielten Bälle (für jede fertiggestellte Mauer –3) |
F | Hilfsvariable zur Ballsteuerung innerhalb der Mauer |
A$ | Für Bildschirmaufbau der Mauer |
Zeile | Bedeutung |
0 | Titelgrafik |
1 | Titelgrafik; Initialisierung des SID (Lautstärke) |
2 | Initialisierung der Variablen |
4 | Bildschirm löschen und Aufbau der Mauer |
6 | Löschen und Setzen der Ballposition |
8 | Berechnung der nächsten Ballposition; Tonerzeugung; Abfrage ob Ball kollidiert. |
10-12 | Berechnung der neuen Richtung des Balles innerhalb der Mauer |
14 | Bei erreichen von 150 Punkten (oder ein Vielfaches davon) erhält man 3 Bälle extra; Aufbau einer neuen Mauer |
16-18 | Richtungsänderung bei Kollision von Ball und Rahmen |
20 | Hochschnellen des Balles von der Grundlinie bei Betätigung des Feuerknopfes |
22 | Abfrage, ob die maximale Anzahl der gespielten Bälle schon erreicht ist |
24-26 | Ausgabe der erreichten Punkte und des Rekords; Behandlung derselben |
Zeile | ||
0 | POKE53281,0 | Farbe Schwarz für Hintergrund |
1 | T=54273 | Tongenerator Frequenz HI |
1 | POKET+23 | Lautstärke 15 |
2 | POKE53280,14 | Farbe Hellblau des Rahmens |
2 | X=1034 | Startadresse des Bildschirms + 10 |
2 | POKET+4,51 | Tongen. Anschlag 3; Abschwellen 3 |
26;2 | WAIT56320,16,240 | Warten auf Loslassen des Feuerknopfes (2) |
6;8 | Zahl 40 | ist die Anzahl der Spalten |
8 | 2 POKEs | Ton ausschalten; Ton einschalten |
16 | Zahl 1025 | Bildschirmadr. 1 |
16 | Zahl 1062 | Bildschirmadr. -1 + Spaltenzahl |
20;18 | Zahl 23 | Zeilenzahl -1 |
18 | Zahl 24 | Zeilenzahl |
20 | PEEK(56320)=111 | Port 2 Feuerknopf gedrückt |
24 | WAIT56320,16 | Warten auf Feuerknopf gedrückt |
0 poke53281,0:fora=0to57:printtab(14)left$("block busters{lred}{wht}{gry3}{gry2}{gry1}{blk}",b+14) 1 b=(b+1)and7:next:printtab(13)"{down}{yel}by martin greil":t=54273:poket+23,15 2 poke53280,14:x=1034:y=15:p=1:v=1:w=1:poket+4,51:wait56320,16,240:wait56320,16 4 fora=1to36:a$=a$+"V":next:a$=" "+a$:print"{wht}{clr}{yel}{down}{down}{down}{down}":fora=1to6:printa$:next 6 pokex+v+(y+w)*40,87:pokex+v+(y+w)*40+54272,1:pokex+y*40,32 8 x=x+v:y=y+w:poket,9*g:poket+3,32:poket+3,33:g=0:ifpeek(x+v+(y+w)*40)=32then16 10 g=1:p=p+1:iff=1thenw=-w:f=0:goto14 12 f=1 14 ifp/150=int(p/150)thens=s-3:goto4 16 ifx+v<1025orx+v>1062thenv=-v:f=0:g=4 18 ify+w<1ory+w>23thenw=abs(sgn(y+w-24)):f=0:g=5:a$="":ifw=0theng=1 20 ify=23andpeek(56320)=111thens=s+1:w=-1:g=3:rem"{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}I(c) by martin greilU{SHIFT-*}{SHIFT-*} 22 ifs<10then6:"J{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}K 24 printtab(5)"{down}{down}"p"punkte alter rekord"h:wait56320,16,240:ifp>hthenh=p 26 wait56320,16:s=0:goto2
0 input"{clr}gleichung{home}{down}{down}{down}";g$:fori=1tolen(g$):ifmid$(g$,i,1)="="then2 1 next:goto0 2 l$=left$(g$,i-1):r$=right$(g$,len(g$)-i):print"{clr}{down}{down}{down}5deffna(x)=";l$:poke198,6 3 print"6deffnb(x)=";r$:print"run5{home}" 4 fori=1to6:poke630+i,13:next:end 5 : 6 : 7 x=-1e+6:i=1e+6:a$=chr$(34):print"{clr}";: 8 iffna(x)<fnb(x)then12 9 a=fna(x):b=fnb(x):print"{home}x=";x;" ":ifa<btheni=i/10:x=v:goto9 10 poke198,0:ifa=bthenprint"{clr}{rvon}x=";x:wait198,1:poke198,0:run 11 gosub14:v=x:x=x+i:goto9 12 print"{clr}{down}{down}{down}{down}{down}{down}?"a$"{up}{up}{up}{up}{up}{up}5 deffnb{left}{left}{left}{left}{left}{left}{left}{left}{down}6 deffna{left}{left}{left}{left}{left}{left}{left}{left}{down}run5"a$" 13 fori=1to6:poke630+i,13:next:poke198,6:print"?"a$"{home}"a$";{home}":list5-6 14 ifpeek(198)=0thenreturn 15 run (c) 20.02.1985 by christoph rockenstein * bahnhofstr.4 * 8452 hirschau
0 "jkmbakamniiadamijadajkfbakamnikadamiladaagakiackbcidalfajkaakkikibiaeiojakba 1 "blkhnnchamankcioimnlchamjmacanapiiijibfgkhfikhajcagolhigfkojkaikjkhkiejknkie 2 "jlnjamiejlmjamiemedhaaakbaionlchamjmacanipiogoojnlchamannlicaldameeohkmegiok 3 "beeedfcfacgfpemeacgejemeefacefgfacafmebejfacdfpegegeacdfmjachjacaacmacaaaafi 4 "iamdkfggkoambbbmecbmlgbmkibmlfbmokbmonamflamacnpokacojhlkiagigigacbpokfkfbie 5 "fkebieachphlfkfbjmenancbgkebaojbalmamlmobmigfiebigfifbmeckdlmegbilaclohlkiek 6 "ebjjmobmmeicilacnlbmacbabmjjfaenjjbpbmacbabmjjgaenjjcpbmagacokamkakakakafifk 7 "acokamfafkekekagacojhlgieknkeacmjcapfaekniibennieacmagacojhloihbenoidacmnkea 8 "cmjcpaficaacokamfacaniibennieacmacnpokackinkachphlfkebnifbennibacmfkfbjchani 9 "gbennicacmagacnlbmikjlapbmjcopjjapbmjjeaenagacnlbmacnpokackinkachphlfkebekek 10 "jjcaenjjoobmfkfbjjdaenjjpobmagacnlbmacpmbmekekfkebjjaaenjjmobmfkfbjjbaenjjno 11 "bmacokamekekjjapbmjjeaenagakibjkaajjaaenjjmobmiiabhpagacojhlkmkiapiajkaaibjg 12 "hakmanlpfiekagacnpokjmbcapgaackinkmehphlacdhaaackinkjkhjakamacicklmehphlnefe 13 "ieafiemebedeeeiebebebedelejeoelekeleiekebelebenebedejedelemenefeieafiemeoefe 30 fori=0to13:a=i*82+2054:fore=atoa+75step2:c=peek(e)-65+(peek(e+1)-65)*16 40 poke49152+p,c:p=p+1:nexte,i:sys49152
0 print"{clr}{rvon} {rvof}@{rvon}>{rvof}xd{rvon}{CBM-POUND}jy{rvof}@{rvon}{SHIFT-*}>{rvof}xe{rvon}{CBM-POUND}jy{rvof}@{rvon}AHP{CBM-Z}{rvof}L@{rvon}{SHIFT-*}{rvof}{rvon}({rvof}[{rvon}_?l{rvof}gb{rvon}k{rvof}hb{rvon}({rvof}t{rvon}_?l{rvof}ib{rvon}k{rvof}"; 1 print"jb{CBM-*}{rvon}_{rvof}g{rvon}!{rvof} 7{rvon}/{rvof}d{rvon}({CBM-B})'{rvof}wg{rvon}c]_{rvof}@{rvon}0{rvof}{CBM-O}{rvon}{CBM--}{rvof}{CBM-E}{rvon}?O{rvof}){rvon}{CBM-M}G<{rvof}{CBM-E}{rvon}?H{rvof}_{rvon}O{CBM-P}gw{rvof}w{CBM-@}{CBM-O}{rvon}d{rvof}{CBM-O}{rvon}o"; 2 print"{rvof}a{rvon}{CBM-G}{rvof}{SHIFT-@}{CBM-M}{rvon}$]{rvof}i{rvon}'(&{rvof}G{rvon}(,{rvof}G{rvon}8\?{rvof}G{rvon}8[?{rvof}GK{CBM-R}{rvon}{CBM-B}_{rvof}@{rvon}{CBM-M}<{rvof}{CBM-E}{rvon}?H{rvof}_{rvon}O{CBM-Y}{CBM-M}{CBM-G}]<{rvof}{CBM-E}{rvon}?O<{rvof}'{rvon}/"; 3 print"{rvof}bK{rvon}{CBM-T}&{rvof}K{rvon}e-{rvof}{SHIFT-*}CRQ_UNK_EHKS_SU_OK{SHIFT-*}X_RNEE_R{rvon}[{rvof}_{rvon}v{rvof}_{rvon}{CBM-B}A{rvof}_{rvon}{CBM-B}{CBM-B}d{rvof}g;Y{CBM-G}{rvon}{SHIFT-POUND}?{rvof}p{rvon}{SHIFT-*}"; 4 print"{rvof}#{rvon}{SHIFT-*}{rvof}{CBM-N}{rvon}{SHIFT-*}i{SHIFT-*}{rvof}Z{rvon}{SHIFT-*}-{SHIFT-*}{SHIFT--}?4?{rvof}_{rvon}{CBM-C}-{rvof}_{rvon}]6i{rvof}{CBM-*}{CBM-M}{CBM-M}_{rvon}{CBM-A}-${rvof}tG{rvon}${rvof}sG_{rvon}{CBM-L}6${rvof}t{rvon}HSO{rvof}q{rvon}%{rvof}s{rvon}{CBM-*}{rvof}x"; 5 print"{rvon}/{rvof}k{rvon};{CBM-Q}{SHIFT-*}{rvof}{CBM-M}{rvon}d{rvof}s{CBM-M}{rvon}d{rvof}tK{rvon}!2{rvof}Ku{rvon}7{rvof}_{rvon}{CBM-N}6i#{rvof}s{rvon}x{CBM-Q}{SHIFT-*}{rvof}K'{rvon}7{rvof}_{rvon}<{SHIFT-*}{rvof}_@{rvon}{SHIFT-*}x{rvof}d{rvon}Sx{CBM-A}{SHIFT-*}{rvof}_@{rvon}{SHIFT-*}"; 6 print"x{rvof}e{rvon}Sx{CBM-E}{SHIFT-*}{rvof}{CBM-*}_{rvon}-?{rvof}iiii{rvon}d${rvof}_{rvon}-?{rvof}d{rvon}$##{rvof}{CBM-*}_{rvon}]6e#,{rvof}c{rvon}A{rvof}({rvon}{CBM-P}{rvof}d{rvon}#l{rvof}w{rvon}Sl{rvof}c{rvon}A{rvof}{CBM-*}_{rvon}]"; 7 print"6m{rvof}v{rvon}Sm{rvof}b{rvon}A,{rvof}c{rvon}A{rvof}(n{rvon}d{rvof}a_{rvon}-?{rvof}da{rvon}l{rvof}w{rvon}Sl{rvof}c{rvon}A{rvof}_{rvon}{CBM-C}-{rvof}_{rvon}i,{rvof}_{rvon}{CBM-L}6${rvof}s{rvon}l{rvof}t{rvon}Sl{rvof}@{rvon}"; 8 print"A${rvof}t(f{rvon}l{rvof}u{rvon}Sl{rvof}a{rvon}A{rvof}{CBM-*}_{rvon}<{SHIFT-*}'8{CBM-P}{SHIFT-*}{rvof}({rvon}{CBM-X}x{CBM-P}{SHIFT-*}x{rvof}c{rvon}S{rvof}{CBM-*}_{rvon}<{SHIFT-*}{rvof}_{rvon}{CBM-C}-{rvof}_{rvon}i,{rvof}_{rvon}{CBM-L}6${rvof}s{rvon}##x{rvof}a"; 9 print"{rvon}Sx{CBM-Z}{SHIFT-*}${rvof}t{rvon}x{rvof}b{rvon}Sx{CBM-S}{SHIFT-*}{rvof}{CBM-*}_{rvon}<{SHIFT-*}{rvof}_{rvon}N{SHIFT-*}##${rvof}s{rvon}x{CBM-B}Sx{CBM-Q}{SHIFT-*}${rvof}t{rvon}x{rvof}@{rvon}Sx{CBM-D}{SHIFT-*}{rvof}_{rvon}-?##x{CBM-P}{SHIFT-*}x{rvof}c{rvon}S{rvof}{CBM-*}"; 10 print"{rvon}_{rvof}w{rvon}({CBM-B}x{CBM-B}Sx{CBM-Q}{SHIFT-*}g{rvof}o{rvon}{CBM-L}{rvof}{CBM-*}_{rvon}]6Ii{CBM-P}{rvof}g{rvon}({CBM-B}{rvof}w{CBM-POUND}f{rvon}IO{SHIFT-@}d#{rvof}{CBM-*}_{rvon}{CBM-C}-H{rvof} {rvon}{CBM-P}{rvof}e_{rvon}i,{rvof}K{rvon}{CBM-L}6{rvof}_{CBM-R}{rvon}"; 11 print"{CBM-B}{rvof}_{rvon}i,(v_?{rvof}_'{rvon}9{rvof}K{rvon}{CBM-L}6":sys4^5