Autor Thema: CPCBasic "Unchained"  (Gelesen 2114 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline mv

CPCBasic "Unchained"
« am: 28. Januar 2020, 22:08:49 »
Vor knapp 20 Jahren habe ich eine Website mit einigen CPC-Programmen zusammengestellt: http://benchmarko.de/cpcemu/cpcsoft/index.html
Heutzutage könnte man zu den Screenshots gleich einen CPC-Emulator einbinden, der die Programme auch ausführt.
Die ersten Browser-basierten CPC-Emulatoren kamen mir recht Ressourcen-intensiv vor, bis ich https://floooh.github.io/tiny8bit entdeckte. Einfach toll, was mit WebAssembly möglich ist!

Soweit so gut.

Nur: Auch für ein einfaches BASIC-Programm muss man einen kompletten CPC-Emulator starten.
Geht das nicht auch anders? Und könnten die Programme dann nicht auch noch viel schneller laufen?

Ja, wenn man das CPC-BASIC irgendwie aus dem ROM "loslösen" kann, ja "entfesselt", und dann als JavaScript ausführt.

Genau das macht CPCBasic. Es compiliert CPC-BASIC-Programme nach JavaScript.
Man braucht dann keine ROMs und Z80-Emulation mehr, sondern kann auf viel höherer Ebene die BASIC-Befehle ausführen.

Dummerweise ist das deutlich aufwändiger, als ich zunächst dachte. Zumindest, wenn das BASIC möglichst kompatibel sein soll und die Programme mit möglichst wenig Anpassungen laufen sollen.

Aber mittlerweile läuft es schon ganz ordentlich:
https://benchmarko.github.io/CPCBasic/cpcbasic.html

In einem separaten Repository habe ich weitere Apps gesammelt:
https://github.com/benchmarko/CPCBasicApps

Hier ein schönes Beispiel, das nicht nur zeigt, wie flott CPCBasic ist, sondern aus ein paar Zeilen Code tolle Effekte zaubert:
https://benchmarko.github.io/CPCBasic/cpcbasic.html?database=apps&example=demo/100demo
(Ich mag das Programm, hoffe es ist ok, dass ich es in die Sammlung aufgenommen habe... ;)

Gerne nehme ich weitere Programme auf.

Oder auch Anregungen...

Offline TFM

  • Administrator
  • CPC 6128+
  • *****
  • Beiträge: 3.527
  • Likes gesamt: 21
  • Karma: +54/-0
  • Geschlecht: Männlich
  • FutureSoft und CPC - Ein starkes Team!
    • FutureOS
Re: CPCBasic "Unchained"
« Antwort #1 am: 29. Januar 2020, 09:15:58 »
Das Projekt ist sehr interessant!  :jubelaola:

Gibt es da auch direkte Vergleiche zwischen CPC und PC. Wie viel mal schneller geht das denn?

Würde mich interessieren, ob  ich da unter FutureOS noch mithalten kann.
TFM of FutureSoft
http://www.FutureOS.de --> Das Betriebssystem FutureOS (Update: 24.01.2021)
http://futureos.cpc-live.com/files/LambdaSpeak_RSX_by_TFM.zip --> RSX ROM für LambdaSpeak (Update: 15.7.2021)

Offline Devilmarkus

Re: CPCBasic "Unchained"
« Antwort #2 am: 29. Januar 2020, 12:43:34 »
Tolles Projekt von dir!
Ich hab damit schon einige Male rumgespielt :)

Was mich ja noch interessieren würde, wäre die Umwandlung von Textdateien (BASIC) in "Tokenized BASIC" also die direkte Umwandlung, in das vom CPC gespeicherte Format.
Umgekehrt mache ich das ja schon, in meinem BASIC Debugger, aber das fehlt mir halt noch, es würde den Transfer von Text-Dateien als BASIC Programm sehr vereinfachen.
https://cpcwiki.de
Dein Deutsches CPCWiki!

Offline mv

Re: CPCBasic "Unchained"
« Antwort #3 am: 29. Januar 2020, 19:42:49 »
Das Projekt ist sehr interessant!  :jubelaola:
Gibt es da auch direkte Vergleiche zwischen CPC und PC. Wie viel mal schneller geht das denn?
Würde mich interessieren, ob  ich da unter FutureOS noch mithalten kann.

Ja danke.
Beim Vergleich der Geschwindigkeit kommt es ja immer darauf an, was man macht, z.B. CPU-Berechnungen, Grafik...
Für eine einfache Zählschleife erreicht CPCBasic auf meinem Laptop mit Chrome ca 17000 MHz im Vergleich zum CPC, also mehr als Faktor 4000:
https://benchmarko.github.io/CPCBasic/cpcbasic.html?example=test/cpcmhz

Eigentlich habe ich einen CPU-Benchmark für verschiedene Programmiersprachen geschrieben, die meisten Tests sind aber für 32 Bit ausgelegt:
https://github.com/benchmarko/BMbench/tree/dev07
Für CPC-BASIC gibt es eine ältere Version mit Zählschleife, Summe 1...10000: bench0(Integer, teilweise FP, da sonst overflow) und bench2(Floating Point):
https://benchmarko.github.io/CPCBasic/cpcbasic.html?example=test/bmbench3
Chrome: bench0 (int): 49 ms, bench2 (fp): 72 ms
CPC(emu): bench0 (int): 241733 ms, bench2 (fp): 289666 ms

Ich suche immer noch schöne Tests, die auch für 8-Bit funktionieren.
Bei denen sich die Dauer per Parameter steuern und das Ergebnis gut überprüfen lässt.

Für FutureOS braucht man ja C oder ASM, wenn ich das richtig verstanden habe.

Offline mv

Re: CPCBasic "Unchained"
« Antwort #4 am: 29. Januar 2020, 20:13:46 »
Tolles Projekt von dir!
Ich hab damit schon einige Male rumgespielt :)

Was mich ja noch interessieren würde, wäre die Umwandlung von Textdateien (BASIC) in "Tokenized BASIC" also die direkte Umwandlung, in das vom CPC gespeicherte Format.
Umgekehrt mache ich das ja schon, in meinem BASIC Debugger, aber das fehlt mir halt noch, es würde den Transfer von Text-Dateien als BASIC Programm sehr vereinfachen.

Freut mich, dass Dich das Projekt interessiert.
Hmm, eine interessante Idee. Für den umgekehrten Fall habe ich ein Perl-Script (http://benchmarko.de/download/lbas2ascii002.zip). Habe schon überlegt, das auch in JavaScript für CPCBasic umzusetzen, damit man .BAS importieren kann.

Wenn CPCBasic mal so brauchbar ist, dass man es als "Entwicklungsumgebung" für BASIC-Programme nehmen kann (im Moment fehlt z.B. noch ein RENUM-Befehl, und so einige Checks und Berechnungen sind nicht so restriktiv wie beim CPC), dann auch einen Export nach "Tokenized BASIC".
Oder möchtest Du ein Plugin bauen... ;)

Offline Devilmarkus

Re: CPCBasic "Unchained"
« Antwort #5 am: 30. Januar 2020, 12:04:22 »
Na ich dachte da eher als Fileimport für meinen Emulator ;)

Wäre toll, wenn man eine .BAS Datei hätte (ASCII), und diese direkt auf das DSK kopieren könnte, dann aber eben als Tokenized BASIC ;)

Bzw wäre es auch im Emulator-Intern Filesystem toll, wenn man so eine ASCII-Datei direkt von Festplatte lesen könnte.

Da hapert es allerdings leider selbst noch bei Tokenized BASIC, diese korrekt ins RAM einzubinden. Obwohl ich den Stack ändere.

Binär funktioniert hier einwandfrei.
https://cpcwiki.de
Dein Deutsches CPCWiki!

Offline oobdoo

Re: CPCBasic "Unchained"
« Antwort #6 am: 02. Februar 2020, 00:08:47 »
Das tolle Projekt habe ich mal im Feindes-Forum64 vorgestellt.  :smiley027:

https://www.forum64.de/index.php?thread/98495-cpc-basic-programme-nach-javascript/
CPC 464/6128, 464/6128+, GX4000 | Atari 2600, 600XL, 800XL/XE, Portfolio | C64/II/G/R/SX, VC20, TC64 | LC 80, MPF-I | ZX81, AX81, ZX Spectrum 48k, ZX Spectrum+2 | Amiga 500/600/2000, A2630, A2088

Offline TFM

  • Administrator
  • CPC 6128+
  • *****
  • Beiträge: 3.527
  • Likes gesamt: 21
  • Karma: +54/-0
  • Geschlecht: Männlich
  • FutureSoft und CPC - Ein starkes Team!
    • FutureOS
Re: CPCBasic "Unchained"
« Antwort #7 am: 30. April 2020, 15:33:52 »
Servus Marco,

Sackl Zement! Habe jetzt mal einige Benchmarks damit gemacht. Also Hola die Waldfee!!! Am Anfang dachte ich noch ich hätte mich vertippt, aber das ist da wirklich so schnell!!!  :jubelaola:

Jetzt muss ich mal rausfinden wie man z.B. Bilder die man damit erzeugen kann (Fraktale z.B.) dann am besten auf den CPC bekommt  :smiley027:
TFM of FutureSoft
http://www.FutureOS.de --> Das Betriebssystem FutureOS (Update: 24.01.2021)
http://futureos.cpc-live.com/files/LambdaSpeak_RSX_by_TFM.zip --> RSX ROM für LambdaSpeak (Update: 15.7.2021)

Offline Devilmarkus

Re: CPCBasic "Unchained"
« Antwort #8 am: 07. Februar 2021, 22:20:23 »
Moin Marco,
könntest du noch ne Option einbauen, für Grün / Graumonitor?
Ich experimentiere mit Raytracing und da wär das optimal für ;)
LG
Markus
https://cpcwiki.de
Dein Deutsches CPCWiki!

Offline Devilmarkus

Re: CPCBasic "Unchained"
« Antwort #9 am: 07. Februar 2021, 23:34:52 »
Hier mal mein Beispiel für Raytracing: (Echt flott in deinem JavaScript Emu)

1000 ' Screen init
1010 'SCREEN 8,0:SET PAGE 1,1
1020 MODE 0: FOR k=0 TO 15:INK k,k*1.7:NEXT:INK 1,26:INK 15,1
1030 CLS
1040 '_TURBO ON
1050 ' Initialize
1060 DIM T(9),V(15),O(19,7),S(19,7),RI(3),GI(3),BI(3),I(3),Z(3),Y(3)
1070 FOR I=0 TO 9:READ T(I):NEXT I
1080 V(0)=T(0):V(1)=T(1):V(2)=T(2)
1090 V(9)=T(0)-T(3):V(10)=T(1)-T(4):V(11)=T(2)-T(5)
1100 V=SQR(V(9)*V(9)+V(10)*V(10)+V(11)*V(11))
1110 V(9)=V(9)/V:V(10)=V(10)/V:V(11)=V(11)/V
1120 V(6)=-V(9)*V(10):V(7)=1-V(10)*V(10):V(8)=-V(11)*V(10)
1130 V(3)=-(V(10)*V(8)-V(11)*V(7)):V(4)=-(V(11)*V(6)-V(9)*V(8))
1140 V(5)=-(V(9)*V(7)-V(10)*V(6)):V(15)=T(9)
1150 V(12)=T(6):V(13)=T(7):V(14)=T(8)
1160 READ MO:FOR I=0 TO MO-1:FOR J=0 TO 7:READ O(I,J):NEXT J,I
1170 READ MS:FOR I=0 TO MS-1:FOR J=0 TO 7:READ S(I,J):NEXT J,I
1180 MA=1000:MI=0.001:MD=0:PT=4
1190 FOR I=1 TO 4
1200 V=SQR(V(I*3+0)*V(I*3+0)+V(I*3+1)*V(I*3+1)+V(I*3+2)*V(I*3+2))
1210 V(I*3+0)=V(I*3+0)/V:V(I*3+1)=V(I*3+1)/V:V(I*3+2)=V(I*3+2)/V
1220 NEXT I
1230 ' Trace
1240 FOR SY=0 TO 200 STEP 4:FOR SX=0 TO 320 STEP 4:XD=0:YD=0
1250 CX=V(0):CY=V(1):CZ=V(2)
1260 VX=V(3)*(SX+XD-128)/99+V(6)*(106-SY-YD)/99-V(9)*V(15)
1270 VY=V(4)*(SX+XD-128)/99+V(7)*(106-SY-YD)/99-V(10)*V(15)
1280 VZ=V(5)*(SX+XD-128)/99+V(8)*(106-SY-YD)/99-V(11)*V(15)
1290 V=SQR(VX*VX+VY*VY+VZ*VZ)
1300 VX=VX/V:VY=VY/V:VZ=VZ/V
1310 CR=0:CG=0:CB=0:RN=0:RF=1
1320 GOSUB 1760
1330 IF CR>=1 THEN CR=0.99
1340 IF CG>=1 THEN CG=0.99
1350 IF CB>=1 THEN CB=0.99
1370 RI(XD)=CR:GI(XD)=CG:BI(XD)=CB
1380 XD=XD+1:IF XD<4 THEN 1250
1390 GOSUB 1470:XD=0
1400 YD=YD+1:IF YD<4 THEN 1250
1440 IF STRIG(0) THEN GOTO 1460
1450 NEXT SX,SY
1460 GOTO 1460
1470 ' Draw
1490 'MAKE RGB DATA FOR SCREEN8 AND WRITE IT ON THE SCREEN
1500 FOR XD=0 TO 3
1510 CC%=(RI(XD)+GI(XD)+BI(XD))/3*15:IF CC%=15 THEN CC%=1 ELSE IF CC%=1 THEN CC%=15
1520 PLOT (SX+XD)*2,400-((SY+YD)*2),CC%
1530 NEXT XD
1540 RETURN
1760 ' Pixel
1770 TT=MA
1780 FOR N=0 TO MO-1
1790 GOSUB 1870
1800 IF TT>T AND T>MI THEN TT=T:TN=N:LX=NX:LY=NY:LZ=NZ
1810 NEXT N
1820 IF TT=MA THEN 1860
1830 CX=CX+TT*VX:CY=CY+TT*VY:CZ=CZ+TT*VZ:N=TN
1840 GOSUB 2150
1850 IF F=1 THEN GOTO 1760
1860 RETURN
1870 ' Cross
1880 RX=CX-O(N,0):RY=CY-O(N,1):RZ=CZ-O(N,2)
1890 A=O(N,3):B=O(N,4):C=O(N,5)
1900 ON O(N,6)+1 GOTO 1920,2030
1910 GOTO 1920
1920 ' Box
1930 IF VX=0 THEN T1=MA ELSE IF RX<0 THEN T1=-(RX+A)/VX ELSE T1=-(RX-A)/VX
1940 IF VY=0 THEN T2=MA ELSE IF RY<0 THEN T2=-(RY+B)/VY ELSE T2=-(RY-B)/VY
1950 IF VZ=0 THEN T3=MA ELSE IF RZ<0 THEN T3=-(RZ+C)/VZ ELSE T3=-(RZ-C)/VZ
1960 IF ABS(RY+T1*VY)>B OR ABS(RZ+T1*VZ)>C THEN T1=MA
1970 IF ABS(RZ+T2*VZ)>C OR ABS(RX+T2*VX)>A THEN T2=MA
1980 IF ABS(RX+T3*VX)>A OR ABS(RY+T3*VY)>B THEN T3=MA
1990 IF T1<=T2 AND T1<=T3 THEN T=T1:NX=-VX/ABS(VX):NY=0:NZ=0
2000 IF T2<=T3 AND T2<=T1 THEN T=T2:NY=-VY/ABS(VY):NZ=0:NX=0
2010 IF T3<=T1 AND T3<=T2 THEN T=T3:NZ=-VZ/ABS(VZ):NX=0:NY=0
2020 RETURN
2030 ' Ball
2040 AA=VX*VX*A+VY*VY*B+VZ*VZ*C
2050 BB=RX*VX*A+RY*VY*B+RZ*VZ*C
2060 CC=RX*RX*A+RY*RY*B+RZ*RZ*C-1
2070 DD=BB*BB-AA*CC
2080 IF DD<0 THEN T=MA:GOTO 2140
2090 T1=(-BB-SQR(DD))/AA:T2=(-BB+SQR(DD))/AA
2100 IF T1<T2 THEN T=T1 ELSE T=T2
2110 NX=A*(RX+T*VX):NY=B*(RY+T*VY):NZ=C*(RZ+T*VZ)
2120 M=SQR(NX*NX+NY*NY+NZ*NZ)
2130 NX=NX/M:NY=NY/M:NZ=NZ/M
2140 RETURN
2150 ' Shade
2160 SH=O(N,7):REM 0=Silber,1=Stahl,2=Rotes Plastik, 3=Graues Plastik, 4=Blaues Plastik,5=Graues Plastik,6=Chrom
2170 IF SH<>-1 THEN 2220
2180 PX=INT(ABS(CX+100)/PT-(CX+100<0))
2190 PY=INT(ABS(CY+100)/PT-(CY+100<0))
2200 PZ=INT(ABS(CZ+100)/PT-(CZ+100<0))
2210 SH=(PX+PY+PZ) MOD 2
2220 SR=S(SH,0):SG=S(SH,1):SB=S(SH,2)
2230 SA=S(SH,3):SD=S(SH,4):SF=S(SH,5)
2240 SP=S(SH,6):SE=S(SH,7)
2250 JX=V(12)-VX:JY=V(13)-VY:JZ=V(14)-VZ
2260 JN=SQR(JX*JX+JY*JY+JZ*JZ)
2270 SM=(LX*JX+LY*JY+LZ*JZ)/JN
2280 IF SM<0 THEN SM=0
2290 FOR P=1 TO SE:SM=SM*SM:NEXT P
2300 VN=-2*(LX*VX+LY*VY+LZ*VZ)
2310 WX=VX+VN*LX:WY=VY+VN*LY:WZ=VZ+VN*LZ
2320 VX=V(12):VY=V(13):VZ=V(14)
2330 SN=LX*VX+LY*VY+LZ*VZ
2340 IF SN<0 THEN SN=0
2350 FOR N=0 TO MO-1
2360 GOSUB 1870
2370 IF MA>T AND T>MI THEN SN=0:SM=0
2380 NEXT N
2390 CR=CR+(SR*(SA+SD*SN)+SP*SM)*RF
2400 CG=CG+(SG*(SA+SD*SN)+SP*SM)*RF
2410 CB=CB+(SB*(SA+SD*SN)+SP*SM)*RF
2420 IF SF=0 AND RN<4 THEN F=0:GOTO 2450
2430 F=1:RF=RF*SF:RN=RN+1
2440 VX=WX:VY=WY:VZ=WZ
2450 RETURN
5000 ' Picture data
5010 DATA   20,  40,  20
5020 DATA    0,   0,   0
5030 DATA   -8,   9,  -3
5040 DATA    6
5050 DATA    6
5060 DATA    2,   0,   2
5070 DATA   .2,  .2,  .2
5080 DATA    1,   2:REM Shader lower ball
5090 DATA   -2,   2,   2
5100 DATA   .2,  .2,  .2
5110 DATA    1,   3:REM Shader left grey ball
5120 DATA   -6,   4,   2
5130 DATA   .2,  .2,  .2
5140 DATA    1,   4:REM Shader blue ball
5150 DATA   -2,   2,  -2
5160 DATA   .2,  .2,  .2
5170 DATA    1,   5:REM Shader right grey ball
5180 DATA   -6,   4,  -6
5190 DATA   .2,  .2,  .2
5200 DATA    1,   6
5210 DATA    0,  -2,   0
5220 DATA   20,   1,  20
5230 DATA    0,  -1
5240 DATA    7
5250 DATA   .9,  .9,  .9
5260 DATA   .5,  .4,  .6
5270 DATA   .7,   6
5280 DATA   .0,  .9,  .0
5290 DATA   .5,  .4,  .6
5300 DATA   .7,   6
5310 DATA   .9,  .0,  .0
5320 DATA   .3,  .6,   0
5330 DATA    0,   0
5340 DATA   .9,  .9,  .9
5350 DATA   .3,  .6,   0
5360 DATA   .6,   8
5370 DATA   .0,  .0,  .9
5380 DATA   .3,  .6,   0
5390 DATA   .6,   8
5400 DATA   .9,  .9,  .9
5410 DATA   .3,  .6,   0
5420 DATA   .6,   6
5430 DATA   .0,  .0,  .0
5440 DATA   ,3,  .6,   1
5450 DATA   .9,   8
https://cpcwiki.de
Dein Deutsches CPCWiki!

Offline Devilmarkus

Re: CPCBasic "Unchained"
« Antwort #10 am: 08. Februar 2021, 14:13:15 »
Ich war mal so "dreist", dein Projekt zu kopieren und habe einen Graustufen-Monitor simuliert.

http://cpc-live.com/CPCBasic/gray.html?example=examples/raytracing

Solltest du was dagegen haben, lieber Marco, nehme ich die Seite natürlich wieder offline! Ich hab das nur mal so für mich zum  Experimentieren hochgeladen...
https://cpcwiki.de
Dein Deutsches CPCWiki!