Wann habt ihr zuletzt ein Apfelmännchen programmiert?

Software-Entwicklung, Compiler, Interpreter, ...
Benutzeravatar
bbock
Beiträge: 242
Registriert: 08.02.2015, 15:31

Wann habt ihr zuletzt ein Apfelmännchen programmiert?

Beitrag von bbock »

Bei mir war das gestern Nacht - hat mehrere Stunden gedauert. :)
Hier ist das Ergebnis:
"Apfelmännchen"
"Apfelmännchen"
APFELM.jpg (91.4 KiB) 48523 mal betrachtet
Wer es selbst ausprobieren möchte, hier ist das Programm:

Code: Alles auswählen

10 REM Apfelmaennchen
20 GOSUB 50000
30 GOSUB 50280
40 f%=1
50 GOSUB 50430
60 GOTO 310
70 REM iter(cx,cy)
80 cnt%=0
90 zx=0: zy=0
100 zxq=0: zyq=0
110 cxq=cx*cx: cyq=cy*cy
120 r=cxq+cyq
130 s=SQR(r-0.5*cx+0.0625)
140 IF (16*r*s>5*s-4*cx+1) AND ((cx+1)*(cx+1)+cyq>0.0625) THEN 240
150 cnt%=maxIt%
160 RETURN
170 REM zeichne Punkt
180 GOSUB 80
190 cnt2=cnt%/2
200 IF cnt2<>INT(cnt2) THEN RETURN
210 CALL plot(x%,y%,f%)
215 y2%=hoehe%-y%
220 CALL plot(x%,y2%,f%)
230 RETURN
240 zy=2*zx*zy+cy
250 zx=zxq-zyq+cx
260 zxq=zx*zx
270 zyq=zy*zy
280 cnt%=cnt%+1
290 IF (zxq+zyq<4) AND (cnt%<maxIt%) THEN 240
300 RETURN
310 REM zeichne
320 breite%=720:hoehe%=256
330 maxIt%=100
340 xa=-2.05:xe=0.75
350 ya=-0.9625:ye=0.9625
360 y0Pkt%=INT(ye/(ye-ya)*hoehe%)
370 dx=(xe-xa)/breite%
380 dy=(ye-ya)/hoehe%
390 cx=xa
400 FOR x%=0 TO breite%-1
410 cy=0
420 FOR y%=y0Pkt% TO hoehe%-1
430 GOSUB 180
440 cy=cy-dy
450 NEXT y%
460 cx=cx+dx
470 NEXT x%
480 STOP
50000 MEMORY &HBFFF:PLOT=&HC000:A%=PLOT:E%=0
50010 RESTORE 50120
50020 FOR F%=0 TO 14
50030 S%=0
50040 FOR G%=0 TO 7
50050 READ X$:X%=VAL("&H"+X$)
50060 S%=S%+X%:POKE A%,X%:A%=A%+1:NEXT
50070 READ X$:IF S%<>VAL("&H"+X$) THEN E%=E%+1:PRINT "ERROR IN LINE ";10*(F%+5012)
50080 NEXT
50090 IF E%=0 THEN RETURN
50100 PRIMT E%; "ERROR";:IF E%=1 THEN PRINT ELSE PRINT "S"
50110 STOP
50120 DATA 0A,32,7C,C0,4E,23,46,21,250
50130 DATA CF,02,A7,ED,42,D8,ED,43,4AF
50140 DATA 78,C0,EB,5E,23,56,7A,A7,41B
50150 DATA C0,93,3D,5F,ED,53,7A,C0,469
50160 DATA F3,ED,73,7D,C0,31,9D,C0,51E
50170 DATA 01,36,C0,CD,5A,FC,E9,00,403
50180 DATA ED,7B,7D,C0,FB,C9,2A,7A,50D
50190 DATA C0,29,11,00,B6,19,5E,23,24A
50200 DATA 56,7B,E6,F8,CB,27,CB,12,47E
50210 DATA 47,7B,E6,07,B0,5F,2A,78,360
50220 DATA C0,45,7D,E6,F8,6F,EB,19,4D3
50230 DATA 78,E6,07,3C,47,AF,37,1F,2ED
50240 DATA 10,FD,47,3A,7C,C0,A7,20,391
50250 DATA 05,78,2F,A6,77,C9,3D,78,347
50260 DATA 20,03,B6,77,C9,AE,77,C9,407
50270 REM Init Graphics
50280 aspectRatio=0.45
50290 RETURN
50300 REM Screen On
50310 OUT 248,8
50320 RETURN
50330 REM Screen Off
50340 OUT 248,8
50350 RETURN
50360 REM Hide Cursor
50370 PRINT CHR$(27);"f";
50380 RETURN
50390 REM Show Cursor
50400 PRINT CHR$(27);"e";
50410 RETURN
50420 REM Clear Screen
50430 PRINT CHR$(27)+"H";CHR$(27)+"E";CHR$(27)+"f"
50440 RETURN
Benutzeravatar
bbock
Beiträge: 242
Registriert: 08.02.2015, 15:31

Re: Wann habt ihr zuletzt ein Apfelmännchen programmiert?

Beitrag von bbock »

Jetzt müsste ich nur noch wissen, wie man die Grafik speichern kann; siehe hier.

Gruß
Bernd
Benutzeravatar
PCWerner
Beiträge: 7
Registriert: 10.02.2015, 15:25

Re: Wann habt ihr zuletzt ein Apfelmännchen programmiert?

Beitrag von PCWerner »

Moin,

ich habe in der Vergangenheit einige Artikel der englischen Zeitschrift 8000Plus bearbeitet und ins Netz gestellt. Ein Artikel beschäftigte sich mit Mandelbrot aka Apfelmännchen. In diesem Artikel findet sich auch eine Screen Save-Funktion.

Hier der Artikel:
http://www.cirsovius.de/CPM/Projekte/Ar ... lbrot.html

Allerdings habe ich das Programm selber nicht getestet - es kann also sein, dass - OCR-bedingt - das BASIC-Programm mit einer Fehlermeldung aussteigt :?

Aber vielleicht hilft der Artikel....

Gruß,
Werner
Benutzeravatar
schombi
Beiträge: 118
Registriert: 09.02.2015, 19:19

Re: Wann habt ihr zuletzt ein Apfelmännchen programmiert?

Beitrag von schombi »

Schick!
My beloved residents:
http://schombi.de/my-retro-collection.html
Benutzeravatar
bbock
Beiträge: 242
Registriert: 08.02.2015, 15:31

Re: Wann habt ihr zuletzt ein Apfelmännchen programmiert?

Beitrag von bbock »

PCWerner hat geschrieben:...ich habe in der Vergangenheit einige Artikel der englischen Zeitschrift 8000Plus bearbeitet und ins Netz gestellt. Ein Artikel beschäftigte sich mit Mandelbrot aka Apfelmännchen. In diesem Artikel findet sich auch eine Screen Save-Funktion.

Hier der Artikel:
http://www.cirsovius.de/CPM/Projekte/Ar ... lbrot.html

Allerdings habe ich das Programm selber nicht getestet - es kann also sein, dass - OCR-bedingt - das BASIC-Programm mit einer Fehlermeldung aussteigt :?

Aber vielleicht hilft der Artikel....
Hab's ausprobiert; bei mir stürzt die Screen Save Routine ab und hinterlässt ein lustiges Muster auf dem Bildschirm... Vielleicht ist da noch irgend etwas falsch. Ich musste auch ein paar Prüfsummen korrigieren. Beim nächsten Versuch werde ich den Quelltext selbst assemblieren und sehen, was dabei rauskommt. Jetzt brauche ich nur noch etwas Zeit für's Hobby...

Gruß
Bernd
Benutzeravatar
PCWerner
Beiträge: 7
Registriert: 10.02.2015, 15:25

Re: Wann habt ihr zuletzt ein Apfelmännchen programmiert?

Beitrag von PCWerner »

... oops, Asche auf mein Haupt :shock:

Ich hatte so viele Artikel HTML-mäßig aufbereitet, dass ich nicht dazu gekommen war, alle zu testen...
bbock hat geschrieben:Hab's ausprobiert; bei mir stürzt die Screen Save Routine ab und hinterlässt ein lustiges Muster auf dem Bildschirm... Vielleicht ist da noch irgend etwas falsch. Ich musste auch ein paar Prüfsummen korrigieren. Beim nächsten Versuch werde ich den Quelltext selbst assemblieren und sehen, was dabei rauskommt. Jetzt brauche ich nur noch etwas Zeit für's Hobby...
... das Ergebis täte mich schon interessieren :D

Gruß,
Werner

PS: Auf meiner Webseite sind von anderen Zeitschriften Artikel zum Thema Grafik ausgehängt, die möglicherweise helfen können.
Benutzeravatar
bbock
Beiträge: 242
Registriert: 08.02.2015, 15:31

Re: Wann habt ihr zuletzt ein Apfelmännchen programmiert?

Beitrag von bbock »

Danke Werner,

bei nächster Gelegenheit werde ich mich wieder damit befassen. Jetzt steht aber erst einmal das ZX-Team-Treffen in Mahlerts vor der Tür; da glaube ich nicht, dass ich vorher noch die Zeit finde mich um die Joyce zu kümmern...

Viele Grüße
Bernd
Benutzeravatar
PCWerner
Beiträge: 7
Registriert: 10.02.2015, 15:25

Re: Wann habt ihr zuletzt ein Apfelmännchen programmiert?

Beitrag von PCWerner »

... mit Brille wäre das nicht passiert :oops:

Die folgenden Zeilen sind nun in allen Listings korrigiert:

54540 DATA E6, F8, CB, 27, CB, 12, 47, 7B, 46F
54550 DATA E6, 07, B0, 5F, C9, 00, 00, 00, 2C5

Ohne Brille habe ich statt "E6" "B6" gelesen.

Jetzt müsste alles funktionieren...

Gruß,
Werner
Benutzeravatar
bbock
Beiträge: 242
Registriert: 08.02.2015, 15:31

Re: Wann habt ihr zuletzt ein Apfelmännchen programmiert?

Beitrag von bbock »

Wir sollten die Diskussion bzgl. Laden / Speichern von Screenshots hier weiterführen.

Bernd
Benutzeravatar
bbock
Beiträge: 242
Registriert: 08.02.2015, 15:31

Re: Wann habt ihr zuletzt ein Apfelmännchen programmiert?

Beitrag von bbock »

Hier ist nun das Apfelmännchen-Programm, das die Mandelbrotmenge nicht nur berechnet, sondern auch den Screenshot als "APFELM01.DAT" speichert:

Code: Alles auswählen

10 REM Apfelmaennchen
20 GOSUB 50000:REM Load graphics machine code
25 GOSUB 54000:REM Load SCRNSAVE & SCRNLOAD mc
30 GOSUB 50280:REM Init graphics
40 f%=1
50 GOSUB 50430:REM Clear screen
60 GOTO 310
70 REM iter(cx,cy)
80 cnt%=0
90 zx=0: zy=0
100 zxq=0: zyq=0
110 cxq=cx*cx: cyq=cy*cy
120 r=cxq+cyq
130 s=SQR(r-0.5*cx+0.0625)
140 IF (16*r*s>5*s-4*cx+1) AND ((cx+1)*(cx+1)+cyq>0.0625) THEN 240
150 cnt%=maxIt%
160 RETURN
170 REM zeichne Punkt
180 GOSUB 80
190 cnt2=cnt%/2
200 IF cnt2<>INT(cnt2) THEN RETURN
210 CALL plot(x%,y%,f%)
215 y2%=hoehe%-y%
220 CALL plot(x%,y2%,f%)
230 RETURN
240 zy=2*zx*zy+cy
250 zx=zxq-zyq+cx
260 zxq=zx*zx
270 zyq=zy*zy
280 cnt%=cnt%+1
290 IF (zxq+zyq<4) AND (cnt%<maxIt%) THEN 240
300 RETURN
310 REM zeichne
320 breite%=720:hoehe%=256
330 maxIt%=100
340 xa=-2.05:xe=0.75
350 ya=-0.9625:ye=0.9625
360 y0Pkt%=INT(ye/(ye-ya)*hoehe%)
370 dx=(xe-xa)/breite%
380 dy=(ye-ya)/hoehe%
390 cx=xa
400 FOR x%=0 TO breite%-1
410 cy=0
420 FOR y%=y0Pkt% TO hoehe%-1
430 GOSUB 180
440 cy=cy-dy
450 NEXT y%
460 cx=cx+dx
470 NEXT x%
480 REM Save screenshot
490 a$="APFELM01.DAT" + CHR$(0)
500 CALL SCRNSAVE(a$,e%)
510 IF e%<>0 THEN PRINT "screen save error"
520 IF INKEY$="" THEN 520
999 STOP
50000 MEMORY &HBFFF:PLOT=&HC000:A%=PLOT:E%=0
50010 RESTORE 50120
50020 FOR F%=0 TO 14
50030 S%=0
50040 FOR G%=0 TO 7
50050 READ X$:X%=VAL("&H"+X$)
50060 S%=S%+X%:POKE A%,X%:A%=A%+1:NEXT
50070 READ X$:IF S%<>VAL("&H"+X$) THEN E%=E%+1:PRINT "ERROR IN LINE ";10*(F%+5012)
50080 NEXT
50090 IF E%=0 THEN RETURN
50100 PRIMT E%; "ERROR";:IF E%=1 THEN PRINT ELSE PRINT "S"
50110 STOP
50120 DATA 0A,32,7C,C0,4E,23,46,21,250
50130 DATA CF,02,A7,ED,42,D8,ED,43,4AF
50140 DATA 78,C0,EB,5E,23,56,7A,A7,41B
50150 DATA C0,93,3D,5F,ED,53,7A,C0,469
50160 DATA F3,ED,73,7D,C0,31,9D,C0,51E
50170 DATA 01,36,C0,CD,5A,FC,E9,00,403
50180 DATA ED,7B,7D,C0,FB,C9,2A,7A,50D
50190 DATA C0,29,11,00,B6,19,5E,23,24A
50200 DATA 56,7B,E6,F8,CB,27,CB,12,47E
50210 DATA 47,7B,E6,07,B0,5F,2A,78,360
50220 DATA C0,45,7D,E6,F8,6F,EB,19,4D3
50230 DATA 78,E6,07,3C,47,AF,37,1F,2ED
50240 DATA 10,FD,47,3A,7C,C0,A7,20,391
50250 DATA 05,78,2F,A6,77,C9,3D,78,347
50260 DATA 20,03,B6,77,C9,AE,77,C9,407
50270 REM Init Graphics
50280 aspectRatio=0.45
50290 RETURN
50300 REM Screen On
50310 OUT 248,8
50320 RETURN
50330 REM Screen Off
50340 OUT 248,8
50350 RETURN
50360 REM Hide Cursor
50370 PRINT CHR$(27);"f";
50380 RETURN
50390 REM Show Cursor
50400 PRINT CHR$(27);"e";
50410 RETURN
50420 REM Clear Screen
50430 PRINT CHR$(27)+"H";CHR$(27)+"E";CHR$(27)+"f"
50440 RETURN
52999 REM Load Machine Code
53000 RESTORE 53090
53010 A=PLOT
53020 READ X$
53030 IF X$="XX" THEN 53080
53040 X=VAL("&H"+X$)
53050 POKE A,X
53060 A=A+1
53070 GOTO 53020
53080 RETURN
54000 REM Set up SCRNSAVE & SCRNLOAD machine-code routines
54010 MEMORY &HBFFF
54020 SCRNSAVE=&HC400:SCRNLOAD=&HC46D:A=SCRNSAVE:E%=0
54030 RESTORE 54150
54040 FOR F%=0 TO 100
54050 S%=0
54060 FOR G%=0 TO 15
54070 READ X$
54073 IF X$="$$" THEN GOTO 54120
54078 X%=VAL("&H"+X$)
54080 S%=S%+X%:POKE A,X%:A=A+1
54090 NEXT G%
54110 NEXT F%
54120 RETURN
54140 END
54150 DATA ED,73,4D,C5,31,6D,C5,D5,CD,DF,C4,CD,2C,C4,CD,04
54160 DATA C5,AF,F5,01,5C,C4,CD,5A,FC,E9,00,CD,3C,C4,F1,3C
54170 DATA FE,20,38,EE,CD,4C,C4,11,00,00,18,6A,0E,16,11,5C
54180 DATA 00,CD,05,00,3C,C0,D1,11,02,00,18,5A,0E,15,11,5C
54190 DATA 00,CD,05,00,A7,C8,D1,11,03,00,18,4A,0E,10,11,5C
54200 DATA 00,CD,05,00,3C,C0,D1,11,04,00,18,3A,CD,29,C5,EB
54210 DATA 11,6D,C5,01,D0,02,ED,B0,C9,3C,00,4A,00,ED,73,4D
54220 DATA C5,31,6D,C5,D5,CD,DF,C4,CD,B3,C4,CD,04,C5,AF,F5
54230 DATA CD,C3,C4,F1,F5,01,D3,C4,CD,5A,FC,E9,00,F1,3C,FE
54240 DATA 20,38,EC,11,00,00,D5,0E,1A,ED,5B,49,C5,CD,05,00
54250 DATA 0E,2C,3A,4B,C5,5F,CD,05,00,D1,E1,73,23,72,ED,7B
54260 DATA 4D,C5,C9,0E,0F,11,5C,00,CD,05,00,3C,C0,D1,11,02
54270 DATA 00,18,D3,0E,14,11,5C,00,CD,05,00,A7,C8,D1,11,03
54280 DATA 00,18,C3,CD,29,C5,21,6D,C5,01,D0,02,ED,B0,C9,7E
54290 DATA A7,28,1B,23,5E,23,56,21,45,C5,73,23,72,23,36,5C
54300 DATA 23,36,00,0E,98,11,45,C5,CD,05,00,7C,B5,C8,D1,11
54310 DATA 01,00,18,A6,0E,31,11,69,C4,CD,05,00,22,49,C5,0E
54320 DATA 1A,11,6D,C5,CD,05,00,0E,31,11,6B,C4,CD,05,00,32
54330 DATA 4B,C5,0E,2C,1E,06,C3,05,00,6F,26,00,29,29,29,29
54340 DATA 11,00,B6,19,5E,23,56,7B,E6,F8,CB,27,CB,12,47,7B
54350 DATA E6,07,B0,5F,C9,00,00,00,00,$$
Das Programm hat noch Raum für Verbesserungen wie z.B. die freie Wahl des zu berechnenden Ausschnitts (z.Z. hard coded in Zeilen 340 und 350), der maximalen Iterationstiefe (z.Z. hard coded in Zeile 330) oder einer Zeitmessung der Berechnungsdauer. Außerdem sind momentan zwei Maschinencode-Laderoutinen vorhanden; das könnte man auch mit einer erledigen.
Antworten