C 64/VC 20
Wettbewerbe

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.

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
Variablenliste »Block Busters«
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
Programmbeschreibung »Block Busters«
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
Hinweise zu »Block Busters« für VC 2O-Besitzer
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
Listing »Block Busters«
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
Listing »X-Gleichung«
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
Listing »Musik-Tool 1«
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
Listing »Musik-Tool 2«
0 rem  ********************
1 rem  *demo zu musik-tool*
2 rem  ********************
3 :
4 rem von r.wenski und m.wernecke
5 :
6 z3=-0.01:sclr
10 adsr1,0,0,12,0
12 adsr2,0,0,12,0
14 adsr3,8,9,0,7
20 play1,936,33:play2,941,33:fort=1to15:vol t:foru=0to200:nextu,t
60 c(0)=936:c(1)=936:c(2)=1114:c(3)=834
100 reada:ifa=-1thenrestore:goto100
110 play3,a,17+2+4 : rem dreieck + synchronisation + ringmodulation
135 z3=z3+.5:ifz3>4thenz3=.499
140 play1,c(z3),33:play2,c(z3)+5,33
160 fori=1to100:next:soff3:goto100
165 data0,0,0,0,0,0,0,0,0,0,0,0
170 data14435,14435,12860,14435,17167,16203,15294,14435
180 data12860,14435,12860,14435
190 data21629,21629,19269,21629,28871,25721,22915,21629
200 data30588,28871,30588,28871,30588,28871,30588,28871
210 data34334,30588,28871,27251,25721,24288,22915,21629
220 data17167,17167,19269,17167,19269,17167,16203,16203
230 data18188,18188,17167,17167,21629,21629,21269,21269
10000 data-1
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →