Wann habt ihr zuletzt ein Apfelmännchen programmiert?

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

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

Beitrag von bbock »

Hier ist ein Screenshot des Apfelmännchens:
apfelm01.zip
(6.28 KiB) 2027-mal heruntergeladen
Die ZIP-Datei enthält den Screenshot APFELM01.DAT, der mit folgendem Programm eingelesen und betrachtet werden kann:

Code: Alles auswählen

10 REM Load screendump
15 GOSUB 54000: REM Load SCRNSAVE/SCRNLOAD Machine Code
200 a$="APFELM01.DAT" + CHR$(0)
210 CALL SCRNLOAD(a$,e%)
220 IF e%<>0 THEN PRINT "file load error"
230 IF INKEY$="" THEN 230
990 GOSUB 51230: REM Show Cursor
1000 STOP
50999 REM Screen On
51000 OUT 248,8
51010 RETURN
51099 REM Screen Off
51100 OUT 248,8
51110 RETURN
51199 REM Hide Cursor
51200 PRINT CHR$(27);"f";
51210 RETURN
51219 REM Show Cursor
51230 PRINT CHR$(27);"e";
51240 RETURN
51249 REM Clear Screen
51250 PRINT CHR$(27)+"H";CHR$(27)+"E";CHR$(27)+"f";
51260 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,$$
Danke nochmal an Werner; ohne dich wäre es sehr viel komplizierter gewesen dieses Projekt zu realisieren.

Viele Grüße
Bernd
funkheld
Beiträge: 16
Registriert: 19.08.2020, 23:02

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

Beitrag von funkheld »

Hallo, mit welchen Basic habt ihr das zum laufen gebracht?
Auf der Start-CP/M ist ein Basic drauf.
Habe die CP/M Box auf Model 8256 eingestellt.

Danke.
wnb
Beiträge: 66
Registriert: 06.03.2015, 12:16
Wohnort: Werner aus Wolfhagen

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

Beitrag von wnb »

Die Antwort lautet „Mallard Basic“ von der CP/M Plus Boot-Diskette.

Den Emulator stellst Du am besten auf das Model 8512, da hast Du mehr Speicher und kannst das Laufwerk M: des JOYCE in ein Verzeichnis auf Deinem PC mappen (Options – Emulation – Mapping).

Nun noch das Apfelmännchen-Programm kopieren (siehe Listing vom 17. Mai 2015 18:55) und als Text-Datei (apfel.txt) in das gemappte Memory-Laufwerk der CP/M Box kopieren ... bitte darauf achten, dass die letzte Zeile des Listings in Deiner Text-Datei (54350 DATA ...) mit einem Zeilenumbruch / einem Return abgeschlossen wird.

CP/M Plus mit Mallard Basic booten.

Aufruf:
  • basic M:apfel.txt
oder
  • basic
    run "M:apfel.txt
Wenn der Bildschirm schwarz wird, die Beschleunigungstaste des Emulator drücken und nach wenigen Augenblicken werden auch die ersten grünen Pixel des Apfelmännchen sichtbar (was auf dem realen JOYCE Stunden dauert, schafft der Emulator mit Beschleunigung in nochnicht einmal zehn Minuten).
funkheld
Beiträge: 16
Registriert: 19.08.2020, 23:02

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

Beitrag von funkheld »

Danke für die Info.
Jetzt funktioniert es.

Kannst du bitte einmal von der Inline :

20 GOSUB 50000:REM Load graphics machine code

den ASM-Source hier reinstellen?

Gruss
Benutzeravatar
bbock
Beiträge: 247
Registriert: 08.02.2015, 15:31

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

Beitrag von bbock »

Der Assembler-Quellcode für den Grafikkern des Apfelmännchen-Programms ist nicht sicher bekannt; es könnte dieser hier sein:
https://joyceforum.de/viewtopic.php?f=5&t=4

Dieser Quellcode einer Plot-Routine ist ähnlich, aber für Turbo Pascal:
http://cpm.jenandcal.familyds.org/cpm/m ... EL-MAC.txt
funkheld
Beiträge: 16
Registriert: 19.08.2020, 23:02

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

Beitrag von funkheld »

Danke , dieser war es:
https://joyceforum.de/viewtopic.php?f=5&t=4

Habe ihn mal jetzt selber compiliert mit pasmo

gruss
Benutzeravatar
ein Thüringer
Beiträge: 44
Registriert: 29.08.2021, 11:04

Dateiformat von APFELM01.DAT

Beitrag von ein Thüringer »

Das Apfelmännchen-Programm ist cool, dauert leider nur recht lange... Dafür ist das Speichern und Laden der Bilder um so fixer.
Mich hat interessiert, wie so eine Bilddatei aufgebaut ist. Ich hatte versucht, mit dem Ladeprogramm eine SCR-Datei zu laden, das ergab ein Bild mit etwas verschobenen Zeilen. Die Untersuchung in einem Hex-Editor ergab, dass SCR im Prinzip schon die richtige Fährte ist, aber nach jeden 720 Bytes 48 Dummy-Bytes eingefügt werden. Das hat für den Programmierer des Maschinencodes den Aufwand verringert, weil im Dualsystem 768 eine "glattere" Zahl ist.
Als Probe meiner Erkenntnisse habe ich im Hex-Editor in eine SCR-Datei 00-Bytes eingefügt, erfolgreich.
MAGICEYE.png
MAGICEYE.png (65.66 KiB) 18569 mal betrachtet
Das Bild ist für die Betrachtung wie in den Magic-Eye-Büchern gedacht, die in den 90ern populär waren: mit leichtem Schielblick scheinen die Kegel aus dem Bildschirm herauszuragen.
MAGICEYE.ZIP
in MAGICEYE.DAT umbennen !
(24 KiB) 812-mal heruntergeladen
Umgekehrt kann man aus einer DAT-Datei auch die Dummy-Bytes entfernen und nach Abspeicherung als SCR-Datei das Bild mit diesem Programm
DIASHOW.ZIP
in DIASHOW.ASC umbenennen !
(2.65 KiB) 771-mal heruntergeladen
für Mallard Basic betrachten.
Benutzeravatar
ein Thüringer
Beiträge: 44
Registriert: 29.08.2021, 11:04

Apfelmännchen-Ausschnitt

Beitrag von ein Thüringer »

Mit dem Rahmen von Bernds Programm als Grundlage habe ich mal ein Programm gebastelt, das einen Ausschnitt der Apfelmännchen-Grafik zeichnen und abspeichern kann:

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
1000 HG%=720:VG%=256:GOTO 1010:REM   APFELMAENNCHEN  ANDREA UND ULF KINDERMANN  PRACTIC 2/88
1002 YC=YU+(M%+M1%+M2%+M3%)*DY:XC=XU+(N%+N1%+N2%+N3%)*DX:K=0:XZ=0:YZ=0:
1003 K=K+1:XX=XZ*XZ:YY=YZ*YZ:YZ=2*XZ*YZ-YC:XZ=XX-YY-XC:IF K=KX THEN GOTO 1005
1004 IF XX+YY<100 THEN GOTO 1003
1005 f%=CINT(K-INT(K/2)*2)
1006 IF f%<>0 THEN GOSUB 2500
1007 RETURN
1010 GOSUB 50430:REM Clear screen
2020 XU=1.43349:XO=1.43354
2030 YU=-0.00004:YO=0
2040 KX=70:REM Iterationstiefe
2050 DX=(XO-XU)/HG%:DY=(YO-YU)/VG%
2060 FOR N3%=0 TO 1 STEP 1:FOR M3%=0 TO 1 STEP 1:FOR N2%=0 TO 2 STEP 2:FOR M2%=0 TO 2 STEP 2
2070 FOR N1%=0 TO 4 STEP 4:FOR M1%=0 TO 4 STEP 4:FOR N%=0 TO HG%-1 STEP 8:FOR M%=0 TO VG%-1 STEP 8
2080 GOSUB 1002
2180 NEXT M%:NEXT N%:NEXT M1%:NEXT N1%
2190 NEXT M2%:NEXT N2%:NEXT M3%:NEXT N3%
2200 GOTO 49995
2500 REM UP-PSET(N,M)
2502 x%=N%+N1%+N2%+N3%:y%=M%+M1%+M2%+M3%:CC(0)=F:CALL plot(x%,y%,f%):RETURN
49994 REM Save screenshot
49995 a$="M:APFELM03.DAT" + CHR$(0)
49996 CALL SCRNSAVE(a$,e%)
49997 IF e%<>0 THEN PRINT "screen save error"
49998 IF INKEY$="" THEN 49998
49999 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,$$
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,
Die Grenzen des gewünschten Bereichs können in den Zeilen 2020 und 2030 eingestellt werden. allerdings dauert es um so länger, je tiefer man "hineinzoomt", auch mit dem Habisoft-Emulator und F11 Stunden.

Um schneller abschätzen zu können, ob der Bereich "ergiebig" ist, ist die Reihenfolge der Pixel so gestaffelt, dass man erst einmal einen groben Überblick bekommt. Besser ist, dieses Programm:

Code: Alles auswählen

 1000 A=200:GOTO 20:REM   APFELMAENNCHEN  ANDREA UND ULF KINDERMANN  PRACTIC 2/88
 1002 YC=YU+(M+M1+M2+M3)*DY:XC=XU+(N+N1+N2+N3)*DX:K=0:XZ=0:YZ=0:
 1003 K=K+1:XX=XZ*XZ:YY=YZ*YZ:YZ=2*XZ*YZ-YC:XZ=XX-YY-XC:IF K=KX THEN GOTO 1005
 1004 IF XX+YY<100 THEN GOTO 1003
 1005 F=K-INT(K/8)*8
 1006 IF F<>7 THEN GOSUB 2500
 1007 RETURN
 1010 CN=0:CC(1)=7:CC(0)=4:GOSUB 600
 2010 REM GOSUB 100:REM Def. der Randwerte
 2020 XU=1.43349:XO=1.43354
 2030 YU=-0.00004:YO=0
 2040 KX=63:REM Iterationstiefe
 2050 DX=(XO-XU)/HG:DY=(YO-YU)/VG
 2060 FOR N3=1 TO 0 STEP -1:FOR M3=1 TO 0 STEP -1:FOR N2=2 TO 0 STEP -2:FOR M2=2 TO 0 STEP -2
 2070         FOR N1=4 TO 0 STEP -4:FOR M1=4 TO 0 STEP -4:FOR N=HG-1 TO 0 STEP -8:FOR M=VG-1 TO 0 STEP -8
 2080                 GOSUB 1002
 2180               NEXT M:NEXT N:NEXT M1:NEXT N1
 2190       NEXT M2:NEXT N2:NEXT M3:NEXT N3
 2200 GOSUB 210:STOP
 2500 REM UP-PSET(N,M)
 2502 HO=(N+N1+N2+N3)/HG:VE=(VG-1-(M+M1+M2+M3))/VG:CC(0)=F:GOSUB 620:RETURN
in das Listing-Fenster von http://robhagemans.github.io/basicode/ zu ziehen, anschließend zum Starten ins Monitor-Fenster klicken.
Hier läuft es wesentlich schneller (dafür im Fenster Settings den Regler Speed auf das Maximum ziehen) und man hat sogar acht statt zwei Farben. Als Website abgespeichert kann dieses Programm auch offline genutzt werden.

Hier ist das fertige Bild
APFELM03.ZIP
in APFELM03.SCR umbenennen!
(22.5 KiB) 747-mal heruntergeladen
als SCR-Datei zum Laden mit dem Programm aus dem vorigen Beitrag.
ein Ausschnitt unter Mallard Basic und unter BBC Basic for Windows
ein Ausschnitt unter Mallard Basic und unter BBC Basic for Windows
APFEL_03.png (114.55 KiB) 18448 mal betrachtet
Benutzeravatar
ein Thüringer
Beiträge: 44
Registriert: 29.08.2021, 11:04

eine Spirale

Beitrag von ein Thüringer »

Hier sind noch zwei Bilder von einer attraktiven Stelle in der Apfelmännchen-Figur.
Einmal von der JOYCE
JOYCE.png
JOYCE.png (15.96 KiB) 17576 mal betrachtet
mit den Parametern
XU=.7464
XO=.745
YU =-0.1142
YO=-0.11165 und
KX 123, dazu die fertige .DAT-Datei
SPIRAL03.ZIP
in .DAT umbenennen
(24 KiB) 774-mal heruntergeladen
Außerdem vom Amstrad CPC im 40-Zeichen-Modus (damit etwas weniger fein auflösend)
CPCMODE1.png
CPCMODE1.png (8.82 KiB) 17548 mal betrachtet
mit den Parametern
XU=0.7437
XO=0.7457
YU=-0.1135
YO=-0.11185 und
KX=123
Zuletzt geändert von ein Thüringer am 14.11.2021, 13:01, insgesamt 1-mal geändert.
Benutzeravatar
bbock
Beiträge: 247
Registriert: 08.02.2015, 15:31

Apfelmännchen mit TurboPascal

Beitrag von bbock »

Das Berechnen von Apfelmännchen-Grafiken benötigt auf 8-Bit-Rechnern viel Zeit und Geduld. So kann es nicht schaden, wenn man eine Compiler-Programmiersprache verwendet, mit der man schneller zum Ziel kommt als mit einem BASIC-Interpreter. Daher habe ich ein Apfelmännchen-Programm in TurboPascal entwickelt.

APFELM10 ist die Version 1.0 des Programms; es bietet folgende Features:
  • Zeichnen des Standard-Apfelmännchens (x: -2.05 bis 0.75, y: -0.9625 bis 0.9625) mit geschwindigkeitsoptimierter Iteration.
  • Zeichnen eines benutzerdefinierten Ausschnitts. Hierbei werden die x- und y-Bereiche und die maximale Iterationstiefe angegeben.
  • Umschalten zwischen normalem und Vorschau-Modus. Im Vorschau-Modus sind die Punkte 4x4 Pixel groß, d.h. das Bild hat eine wesentlich niedrigere Auflösung, wird dafür aber auch wesentlich schneller berechnet.
Als Dezimalzeichen ist das Komma einzugeben.

APFELM10_src.zip
Quellcode von V1.0
(6.14 KiB) 736-mal heruntergeladen
APFELM10_com.zip
Ausführbares COM-Programm V1.0
(9.02 KiB) 716-mal heruntergeladen
Standard-Apfelmännchen
Standard-Apfelmännchen
apfelm_1.png (58.53 KiB) 17297 mal betrachtet
x: 0,435396403 bis 0,451687191<br />y: 0,367981352 0,380210061<br />max. It.: 150
x: 0,435396403 bis 0,451687191
y: 0,367981352 0,380210061
max. It.: 150
apfelm_2.png (134.38 KiB) 17297 mal betrachtet
Antworten