Forum: Mikrocontroller und Digitale Elektronik Wettkampf Opa(MOS6502) gegen Frischling(ATmega)


von Norbert (der_norbert)


Lesenswert?

Nun, der Titel sagt's ja schon.

Aus dem CH32V003 Thread (Beitrag "CH32V003, float wirklich langsam?") 
ergab sich Folgendes…

Christoph M. schrieb:
> Das musst du mir mal zeigen.

Ich hatte ja eine Antwort versprochen und die möchte ich nicht schuldig 
bleiben.


Kann ein fünfzig Jahre alter Mikroprozessor (der originale MOS6502 
ca.1976) schneller arbeiten als ein deutlich modernerer AVR ATmega32u4 
(oder ähnlicher Typ)? Der wurde irgendwann ab 2008 released.
Der AVR darf mit 16 MHz getaktet werden, der MOS6502 kann nur 1 MHz.

Die sehr einfache und geradlinige Aufgabe ist die Folgende:

Berechne alle Fibonacci Zahlen < 10^80. Das sind die ersten 382 Zahlen.
1
#!/usr/bin/python3
2
# -*- coding: UTF-8 -*-
3
# vim: fileencoding=utf-8: ts=4: sw=4: expandtab:
4
value1, value2 = 0, 1
5
for i in range(383):
6
    value1, value2 = value2, value1 + value2
7
    print(f'{value2:080}')
10^80 deshalb, weil der gute alte Commodore CBM8032 einen 80×25 
Bildschirm sein Eigen nennt und man so jede Fibonacci-Zahl in einer 
eigenen Zeile darstellen kann.

Außerdem sind die Zahlen derart groß, dass man nicht mehr mit den 
üblichen Mitteln arbeiten kann. Und zumindest soweit mir bekannt ist, 
unterstützt auch kein C Compiler ein uint272_t. 
(ceil(ln(10)/ln(2)×80÷8)×8)

Die Wahl der Waffen/Programmiersprache ist wahlfrei, es wird aber wie 
beim MOS6502 vermutlich auf Assembler hinaus laufen.


Wie ist eure Einschätzung?
Kann ein CBM8032 so etwas?
Wie lange braucht der CBM8032 bei 1 MHz um die 382 Zahlen zu berechnen 
und darzustellen?
Und fast noch wichtiger, kann ein viel modernerer ATmega32u4 das 
(deutlich) schneller?

Ein Video des Programmlaufes auf dem Commodore ist bereits erstellt, 
allerdings ist das mp4 um die 10MB groß.
Das werde ich später einstellen.
Dazu ebenfalls eine »fibonacci.p00« Datei.
Damit kann es jeder selbst laufen lassen und überprüfen. (Läuft auch auf 
dem VICE)
Und natürlich die korrekten Ergebnisse mit der Ausgabe des Python 
Programms verifizieren.

Viel Spaß (und kreuzigt mich nicht)

von 🍅🍅 🍅. (tomate)


Lesenswert?

Wenn man genug Abstraktion/Virtualisierung/Emulation/API 
Schnittstellen... dazwischen packt, bekommt man sicher auch einen 
Epyc/i7 etc auf 8086 Geschwindigkeit.

Ansonsten gewinnen IPC und MHz.....

von Norbert (der_norbert)


Lesenswert?

🍅🍅 🍅. schrieb:
> Wenn man genug Abstraktion
Haben wir nicht…
> Virtualisierung
Haben wir nicht…
> Emulation
Haben wir nicht… (bzw. läuft auf der Original Hardware identisch)
> API Schnittstellen
Jetzt mach aber mal halblang ;-)

> Ansonsten gewinnen IPC und MHz.....
Also deine Schätzung…?

von Kurt (sommerwin)


Lesenswert?

Würds gern testen, hab aber leider keinen C-128er mehr. Ich hab aber vor 
vielen Jahren was ähnliches gemacht, nämlich die aktuelle 
Gewinnzahlposition aus den damals noch 13 Mio möglichen Lottosechser 
anzuzeigen und die möglichen Treffer aus dem Faber Systembuch zu 
berechnen. Dafür hab ich die Bildschirmausgabe abgeschaltet und erst 
nach Treffer wieder aktiviert. Fazit: das Assembler Programm des C64 war 
ein vielfaches schneller als das äquivalente QBasic Programm auf einem 
486er PC. Ich würd also so vorgehen: erst mal alle Zahlen berechnen und 
dann in den Bildschirmspeicher schieben...

Spann mich net auf die Folter, schafft das der 6502?

von 🍅🍅 🍅. (tomate)


Lesenswert?

Schätzung:
AVR32:
4x schneller wegen 32bit
16x schneller wegen Mhz
3x schneller wegen IPC

10^80 => 265bit =>34byte
Dementsprechend 34 add/adcs pro Zahl
382x das ganze, dazu noch overhead vom SRAM schreiben/lesen
34x382x z.B. 10cyclen Overhead für Read/Write
=>130000 Zyklen für den 6502 oder ca. 1/10sec
beim AVR32 entsprechend ca. 200x schneller oder 1/2 msec

von Falk B. (falk)


Lesenswert?

Norbert schrieb:

> Kann ein fünfzig Jahre alter Mikroprozessor (der originale MOS6502
> ca.1976) schneller arbeiten als ein deutlich modernerer AVR ATmega32u4
> (oder ähnlicher Typ)?

Wenn man den AVR ins Knie schießt und per Hand taktet.

> Der wurde irgendwann ab 2008 released.
> Der AVR darf mit 16 MHz getaktet werden, der MOS6502 kann nur 1 MHz.

Hat schon verloren. Aber der Heldentod kommt wieder in Mode ;-)

> 10^80 deshalb, weil der gute alte Commodore CBM8032 einen 80×25
> Bildschirm sein Eigen nennt und man so jede Fibonacci-Zahl in einer
> eigenen Zeile darstellen kann.

Hehe.

> Außerdem sind die Zahlen derart groß, dass man nicht mehr mit den
> üblichen Mitteln arbeiten kann. Und zumindest soweit mir bekannt ist,
> unterstützt auch kein C Compiler ein uint272_t.
> (ceil(ln(10)/ln(2)×80÷8)×8)

Kann man ja manuell mit BCD berechnen. Sollte einfacher und schneller 
sein als immer in binär und dann immer umrechnen.

> Die Wahl der Waffen/Programmiersprache ist wahlfrei, es wird aber wie
> beim MOS6502 vermutlich auf Assembler hinaus laufen.

Das kann auch ne Turingmaschine. Alles nur eine Frage der Rechenzeit.

> Wie ist eure Einschätzung?
> Kann ein CBM8032 so etwas?

Ja.

> Wie lange braucht der CBM8032 bei 1 MHz um die 382 Zahlen zu berechnen
> und darzustellen?

Geschätzt deutlich weniger als 1s (in Assembler). Ich mein es sind 382 
Additionen einer 80stelligen BCD Zahl. So wild ist das nicht. Die 
Hardcorevariante rechnet das gleich im Videospeicher mit PETSCII-Code!
macht ~2600 Takte / Zahl

> Und fast noch wichtiger, kann ein viel modernerer ATmega32u4 das
> (deutlich) schneller?

Sicher, denn der ist höher getaktet, braucht weniger 
Takte/Speicherzugriff und kann, wenn man weiß was man tut, mehrere 
Stellen in Registern halten und berechnen.

> Ein Video des Programmlaufes auf dem Commodore ist bereits erstellt,
> allerdings ist das mp4 um die 10MB groß.

So what! Es gab hier schon größere Einzelbilder!

> Viel Spaß (und kreuzigt mich nicht)

0, 1, 1, 2, 3, 5, 8, 13

von Harald K. (kirnbichler)


Lesenswert?

Norbert schrieb:
> Wie ist eure Einschätzung?
> Kann ein CBM8032 so etwas?

Nein. Ein 1-MHz-6502 ist langsamer als ein 16-MHz-AVR. Deutlich.

Ehrlicher dürfte der Vergleich sein, wenn auch der AVR mit nur 1 MHz 
getaktet wird.

Aber mit 16 MHz? Da könnte man schon darüber nachdenken, den 6502 zu 
emulieren. Mit einem Z80 hat das schon wer gemacht:

https://hackaday.com/2010/04/27/emulating-a-z80-computer-with-an-avr-chip/

Aber auch über 6502 wurde hier im Forum schon intensiver nachgedacht:

https://www.mikrocontroller.net/articles/AVR_6502_Emulator

von Michael B. (laberkopp)


Lesenswert?

Norbert schrieb:
> Kann ein fünfzig Jahre alter Mikroprozessor (der originale MOS6502
> ca.1976) schneller arbeiten als ein deutlich modernerer AVR ATmega32u4

Eigentlich: nein, der ATmega macht das ca. 100 x schneller.

Aber wenn dein 6502 über 64k RAM verfügen kann, kann er den ATmega, der 
wenig RAM hat, schlagen.

von Falk B. (falk)


Lesenswert?

🍅🍅 🍅. schrieb:
> Schätzung:
> AVR32:
> 4x schneller wegen 32bit
> 16x schneller wegen Mhz
> 3x schneller wegen IPC

Der AVR32U4 ist ein 8 Bitter mit 32kB Flash und USB ;-)
Es gab einen AVR32, der ist aber im Strom der Zeit versunken.

von Falk B. (falk)


Lesenswert?

Michael B. schrieb:
> Aber wenn dein 6502 über 64k RAM verfügen kann, kann er den ATmega, der
> wenig RAM hat, schlagen.

Nicht mal dann. Die beiden Zahlen brauchen 34 Byte in Binärkodierung 
oder 40 in BCD, macht max. 80 Byte. Die hat sogar ein ATtiny13. Addieren 
und Ausgeben über UART, fertig.

Aber mal wieder ein sehr gehaltvoller Beitrag von dir!

von Markus K. (markus-)


Lesenswert?

Norbert schrieb:

> Kann ein CBM8032 so etwas?
> Wie lange braucht der CBM8032 bei 1 MHz um die 382 Zahlen zu berechnen
> und darzustellen?

Bei solchen Aufgaben geht die Zeit hauptsächlich für die 
Bildschirmausgabe drauf. Wenn man das normal ausgibt, dann muss ja nach 
der 25. Zeile gescrollt werden. Dazu werden die 4KB Bildschirmspeicher 
(ich nehme an, das ist wie beim C64 mit 1Byte Zeichen und 1 Byte 
Attribut) fast vollständig gelesen und wieder geschrieben. Das dauert 
viel länger als die Rechnung.

Man könnte natürlich noch tricksen und z.B. alle Zahlen in ASCII 
hintereinander in den Speicher schreiben und dann den Offset des 
Bildschirmspeichers verschieben, aber das ist ein wilder Hack.

von Falk B. (falk)


Lesenswert?

Markus K. schrieb:
> Man könnte natürlich noch tricksen und z.B. alle Zahlen in ASCII
> hintereinander in den Speicher schreiben und dann den Offset des
> Bildschirmspeichers verschieben, aber das ist ein wilder Hack.

Nö, direkt in den Videospeicher ab 1024 schreiben!

von Yalu X. (yalu) (Moderator)


Lesenswert?

Ich kann mir denken, worauf du hinaus willst. Der 6502 hat ein
bestimmtes Feature, das der AVR nicht bzw. nur sehr eingeschränkt hat.
Ich glaube aber nicht, dass dieses Feature dem 6502 gegenüber dem
deutlich höher getakteten AVR zu Sieg verhilft.

Norbert schrieb:
> Wie lange braucht der CBM8032 bei 1 MHz um die 382 Zahlen zu berechnen
> und darzustellen?
> Und fast noch wichtiger, kann ein viel modernerer ATmega32u4 das
> (deutlich) schneller?

Vielleicht solltest du auch noch definieren, was du unter "berechnen"
und "darstellen" verstehst.

Zählt das Lesen einer bis zu 80-stelligen Zahl aus dem Flash und die
anschließende Addition von 0 schon als "berechnen"? Vermutlich nicht.

Sind Look-Up-Tabellen zur Beschleunigung von Berechnungen erlaubt? Wenn
ja, bis zu welcher Größe?

Vermutlich sind aber gar keine Tabellen erforderlich, um den 6502 zu
schlagen.

Der AVR hat im Gegensatz zum CBM kein integriertes Display. Somit
braucht er streng genommen ewig, um die Ergebnisse darzustellen. Welche
Optionen gestehst du dem AVR zu, die Ergebnisse dennoch anzuzeigen?

> so jede Fibonacci-Zahl in einer eigenen Zeile darstellen kann.

Wie genau erfolgt die Ausgabe in deinem 6502-Programm? Was passiert,
wenn die 25ste Zeile erreicht ist? Wird der Bildschirm dann um eine
Zeile hochgescrollt? Das Scrollen alleine würde ja schon sehr viel mehr
Zeit kosten als die eigentliche Berechnung (s. Beitrag von Markus).

: Bearbeitet durch Moderator
von Markus K. (markus-)


Lesenswert?

Falk B. schrieb:
> Markus K. schrieb:
>> Man könnte natürlich noch tricksen und z.B. alle Zahlen in ASCII
>> hintereinander in den Speicher schreiben und dann den Offset des
>> Bildschirmspeichers verschieben, aber das ist ein wilder Hack.
>
> Nö, direkt in den Videospeicher ab 1024 schreiben!

Das habe ich vorausgesetzt. Aber das Scrollen bleibt ja trotzdem. Außer, 
wenn man eben den Start des Bildschirmspeichers verschiebt. Dann scrollt 
man auch, aber eben ohne Kopierorgien.

Aber das mit dem Scrollen habe ich halt so angenommen. Man kann 
natürlich auch einfach immer auf die gleiche Stelle schreiben. Das 
verbietet die Aufgabe nicht. Wenn man aber schneller als die 
Bildwiederholfrequenz ist, dann werden gar nicht alle Zahlen 
dargestellt. Gilt das dann noch? Oder einfach am Ende des Bildschirms 
wieder oben anfangen.

Letztendlich ist die Aufgabe bzgl. der Ausgabe schlecht gestellt.

von Markus K. (markus-)


Lesenswert?

Yalu X. schrieb:
> Sind Look-Up-Tabellen zur Beschleunigung von Berechnungen erlaubt?

Eine Look-up-Table zur Beschleunigung der Addition? Das interessiert 
mich.

von Norbert (der_norbert)


Lesenswert?

Yalu X. schrieb:
> Ich kann mir denken, worauf du hinaus willst. Der 6502 hat ein
> bestimmtes Feature, das der AVR nicht bzw. nur sehr eingeschränkt hat.
;-)

> Vielleicht solltest du auch noch definieren, was du unter "berechnen"
> und "darstellen" verstehst.
Wirklich komplett und von Grund auf berechnen. Keine Tabellen, kein 
Look-up.

> Der AVR hat im Gegensatz zum CBM kein integriertes Display. Somit
> braucht er streng genommen ewig, um die Ergebnisse darzustellen. Welche
> Optionen gestehst du dem AVR zu, die Ergebnisse dennoch anzuzeigen?
Wir hatten das damals so vereinbart, das die auszugebenden Daten einzeln 
Zeilenweise als fertiger String im Speicher bereit liegen müssen. Also 
Berechnung und Ausgabe völlig getrennt. Die Rechner-Architekturen waren 
damals einfach viel zu unterschiedlich. Und so konnten wir wahlweise die 
Ausgabe unterdrücken und die Differenz messen.

Also wären ein angeschlossener Lochstreifen-Stanzer oder ein zig-MBit 
UART USB Interface gleich gut.

> Wie genau erfolgt die Ausgabe in deinem 6502-Programm? Was passiert,
> wenn die 25ste Zeile erreicht ist? Wird der Bildschirm dann um eine
> Zeile hochgescrollt?
Fällt ja alles unter Ausgabe. Aber um's aufzuhübschen, zwei Drittel des 
Bildschirms werden fortlaufend beschrieben und dann wieder von oben 
überschrieben. So kann man den Fortschritt verfolgen und dennoch die 
letzten ca. 15 Werte begutachten.
Darunter dann die Ergebnisse.
Die Ausgabe musste ich allerdings komplett neu schreiben, nichts was die 
Commodore ROMs oder die Microsoft ROMs bieten kommen auch nur halbwegs 
in den erträglichen Bereich. Da braucht man selbst mit Assembler einen 
Abreißkalender.

von Norbert (der_norbert)


Lesenswert?

Markus K. schrieb:
> Letztendlich ist die Aufgabe bzgl. der Ausgabe schlecht gestellt.

Da hast du Recht, hätte ich präziser sein müssen. Eigentlich geht es 
aber um die komplette Berechnung inklusive Vorbereitung zur Ausgabe.
Ich habe die Ausgabe nur zur Visualisierung mit hinein genommen.

von Norbert (der_norbert)


Lesenswert?

Kurt schrieb:
> Spann mich net auf die Folter, schafft das der 6502?

Ohne abzubrennen!

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

Hier mal die Arduino-Variante. Dauert 2777ms mit Ausgabe auf UART mit 
115200 Baud. Ohne UART-Ausgabgbe 72ms! Das wird eng für den 6502! ;-)

von Yalu X. (yalu) (Moderator)


Lesenswert?

Norbert schrieb:
> Wir hatten das damals so vereinbart, das die auszugebenden Daten einzeln
> Zeilenweise als fertiger String im Speicher bereit liegen müssen.

Mit "String" meist du einen ASCII-String (also eine Folge von Bytes in
0x30..0x39), der (bei aktivierter Ausgabe) ohne weitere Konvertierung in
den Bildspeicher kopiert werden kann?

von Norbert (der_norbert)


Lesenswert?

Yalu X. schrieb:
> Mit "String" meist du einen ASCII-String (also eine Folge von Bytes in
> 0x30..0x39), der (bei aktivierter Ausgabe) ohne weitere Konvertierung in
> den Bildspeicher kopiert werden kann?

Ganz genau so!

von Falk B. (falk)


Lesenswert?

Norbert schrieb:
>> Der AVR hat im Gegensatz zum CBM kein integriertes Display. Somit
>> braucht er streng genommen ewig, um die Ergebnisse darzustellen. Welche
>> Optionen gestehst du dem AVR zu, die Ergebnisse dennoch anzuzeigen?
> Wir hatten das damals so vereinbart, das die auszugebenden Daten einzeln
> Zeilenweise als fertiger String im Speicher bereit liegen müssen. Also
> Berechnung und Ausgabe völlig getrennt.

Na Vorsicht! Es gibt das DREI Aufgaben!

Neue Zahl berechnen (welches internes Format auch immer)
Zahl in ASCII umwandlen
String ausgeben

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

Und wenn man wirklich alle kleiner 10^80 haben will, muss man bis f_384 
rechnen.
1
381 18828075583602596462866526311206253798143927071100759813050465314516137773128706
2
382 30464466237021013443716776226800834957182606015969344302751396920321847653300991
3
383 49292541820623609906583302538007088755326533087070104115801862234837985426429697
4
384 79757008057644623350300078764807923712509139103039448418553259155159833079730688
5
Rechenzeit: 2791ms

Mit Ausgabe und Umwandlung:           2791ms
Ohne Ausgabe mit Umwandlung in ASCII:   91ms
Ohne Ausgabe und ohne Umwandlung:       72ms

: Bearbeitet durch User
von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Der 6502 hat da auch bei gleichem Takt keine Chance, der AVR kann viele 
Instruktionen in einem Takt ausführen, die der 6502 erst aus dem 
Speicher lesen muss.

384 Zahlen mit je 34 Bytes sind 13.056, das bekommt ein ATMega1284 
komplett in seine 16kB RAM hinein.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Die 383 Fibonacci-Zahlen haben zusammen 15506 Ziffern, wenn man – wie in
Norberts Python-Vorlage – die ersten beiden (0 und 1) weglässt.

Jede dieser Ziffern muss irgendwann als ASCII-Zeichen in den Speicher
geschrieben werden. Das Schreiben eines Bytes dauert beim 6502
mindestens 3 Zyklen (STA auf Nullseite). Das Schreiben aller 383 Strings
dauert also bei der Taktfrequenz von 1 MHz mindestens

  15506 · 3 µs ≈ 46,5 ms

Hinzu kommt natürlich noch die eigentliche Berechnung, die sicher
deutlich länger dauert.

Ich werde morgen einen Code für den ATmega32U4 posten, der bei 16 MHz
für die Berechnung und das Schreiben der Zahlen als ASCII-Strings
weniger als 20 ms braucht.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Da wirst Du das Problem bekommen, daß das Darstellen der Zahlen als 
ASCII und vor allem die Datenübertragung deutlich mehr Zeit benötigt, 
als die Berechnung.

Selbst bei 1Mbit mit dem UART braucht ein Byte (9 Bit bei 8N1) 
mindestens 9µs für die Übertragung. In den 20ms, die Du Dir als Ziel 
gesetzt hast, bekommst Du nur gut 2,2kB übertragen. Das reicht bei 
weitem nicht für alle 384 Zahlen.

Wenn man die Zahlen von Falk mal zugrunde legt, dauert die Übertragung 
aller Zahlen (mit Durchnummerierung) 2700ms. Bei 115kbit und 8N1 sind 
das 34.560 Bytes. Bei 1Mbit 8N1 würde allein diese Übertragung 311ms 
dauern.

Wenn Du mit Deinen 15506 Ziffern (ohne Textformatierung) Recht hast, 
landest immer noch bei grob überschlagen 150ms nur für die Übertragung 
bei 1Mbit.

Bei Deinem Beispiel hast Du auch vergessen, daß der 6502 meiner Kenntnis 
zwar auf der Zero Page einigermaßen schnell ist, aber weder passen alle 
Ziffern in 256 Byte Zero Page, noch liegt dort der Bildschirmspeicher.

Mich würde mal interessieren, wie lange der C64 in Basic dafür braucht.
Kann man das noch in Stunden messen?

: Bearbeitet durch User
von Tim  . (cpldcpu)


Lesenswert?

Norbert schrieb:

> Wie ist eure Einschätzung?
> Kann ein CBM8032 so etwas?

Norbert hat hier vermutlich den BCD-Mode des 6502 herausgekramt und 
freut sich jetzt darüber, dass der AVR dabei versagt, die interne 
Binärzahl in eine dezimale ASCII-Ausgabe zu konvertieren.

Allerdings kann man ja auch auf dem AVR den BCD-Mode emulieren, man hat 
ja deutlich mehr IPC.

von Christoph M. (mchris)


Lesenswert?

Norbert (der_norbert)
17.04.2025 19:07

>Christoph M. schrieb:
>> Das musst du mir mal zeigen.

>Ich hatte ja eine Antwort versprochen und die möchte ich nicht schuldig
>bleiben.

Oh danke :-)

Mich würde der dazughörige 6502-Code interessieren.

von Falk B. (falk)


Lesenswert?

Tim  . schrieb:
> Allerdings kann man ja auch auf dem AVR den BCD-Mode emulieren, man hat
> ja deutlich mehr IPC.

Was soll IPC sein? Instructions per Clock?

von Tim  . (cpldcpu)


Lesenswert?

Falk B. schrieb:
> Tim  . schrieb:
>> Allerdings kann man ja auch auf dem AVR den BCD-Mode emulieren, man hat
>> ja deutlich mehr IPC.
>
> Was soll IPC sein? Instructions per Clock?

Instructions per Cycle... "per clock" sollte auch ok sein.

von H. H. (hhinz)


Lesenswert?

Der Opa ist in Rente, aber sein Enkel W65C02-14 würde antreten.

von Falk B. (falk)


Lesenswert?

Ben B. schrieb:
> Mich würde mal interessieren, wie lange der C64 in Basic dafür braucht.
> Kann man das noch in Stunden messen?

Meine Schätzung. Wenn wir mal grob von 10 Basicbefehlen/s ausgegehen und 
ca. 10000 davon pro Fibonaccizahl ansetzen, macht das irgendwas um die 
384.000s bzw. 106,6h. Ist jetzt aber SEHR grob über den Daumen gepeilt. 
Vermutlich geht es schneller.

von Falk B. (falk)


Lesenswert?

Yalu X. schrieb:
> Ich werde morgen einen Code für den ATmega32U4 posten, der bei 16 MHz
> für die Berechnung und das Schreiben der Zahlen als ASCII-Strings
> weniger als 20 ms braucht.

Da bin ich mal gespannt! Ok, in handgeklöppeltem Assembler könnte das 
klappen.

von Tim  . (cpldcpu)


Angehängte Dateien:

Lesenswert?

Hier einmal ein Ansatz.

Der AVR-code ist nicht getestet. Ich wollte nur einmal schauen, ob LLMs 
inzwischen auch AVR-Assembler können. Anscheinend ist das der Fall.

Ich habe zunächst das C-programm erzeugt und das als Vorlage für die 
Assemblerimplementierung genetzt.

Man könnte durch mehr loop-unrolling noch ein paar Taktzyklen 
herausholen. Bin mir nicht sicher, ob nibble-packing viel hilft, da der 
AVR ja sowieso recht schnellen Speicherzugriff hat.
1
   ; Start with carry=0 path
2
    rjmp carry0_path  ; Enter the loop with carry=0
3
4
carry1_path:
5
    ; This is the path when carry=1 from previous iteration
6
    ld temp1, -Z      ; Load previous[j] and decrement Z
7
    ld temp2, -Y      ; Load current[j] and decrement Y
8
    add temp1, temp2  ; Add current digit
9
    inc temp1         ; Add carry=1
10
    
11
    ; Check for decimal overflow
12
    cpi temp1, 10     ; Compare with 10
13
    brlo store_no_carry  ; If < 10, no new carry
14
15
carry_with_overflow:    
16
    ; Handle carry case
17
    subi temp1, 10    ; Subtract 10
18
    st Z, temp1       ; Store result
19
    
20
    dec inner_cnt     ; Decrement counter
21
    brne carry1_path  ; If counter not zero, continue with carry=1
22
    rjmp inner_done   ; Exit if counter is zero
23
    
24
carry0_path:
25
    ; This is the path when carry=0 from previous iteration
26
    ld temp1, -Z      ; Load previous[j] and decrement Z
27
    ld temp2, -Y      ; Load current[j] and decrement Y
28
    add temp1, temp2  ; Add current digit (no carry to add)
29
    
30
    ; Check for decimal overflow
31
    cpi temp1, 10     ; Compare with 10
32
    brsh carry_with_overflow  ; If >= 10, reuse the common overflow code
33
    
34
    ; Fall through to common store with no carry
35
36
store_no_carry:
37
    st Z, temp1       ; Store result
38
    
39
    dec inner_cnt     ; Decrement counter
40
    brne carry0_path  ; If counter not zero, continue with carry=0
41
    rjmp inner_done   ; Exit if counter is zero

von Mairian (marianp)


Lesenswert?

Das ist eine spannende Frage, die einen direkten Vergleich der beiden 
Mikroprozessoren mit einer konkreten Aufgabe, der Berechnung der 
Fibonacci-Zahlen, anstellt. Um diese Frage zu beantworten, müssen wir 
uns sowohl die architektonischen Unterschiede als auch die 
Geschwindigkeit bei der Berechnung anschauen.

### Grundlegende Unterschiede zwischen MOS6502 und AVR ATmega32u4:

- **MOS6502 (1976):**
  - Taktfrequenz: 1 MHz.
  - 8-Bit-Architektur.
  - Kein Hardware-Divider, also alle Divisionen und viele Berechnungen 
müssen durch Software erfolgen.
  - Relativ einfache und geradlinige Befehlssätze.

- **AVR ATmega32u4 (2008):**
  - Taktfrequenz: 16 MHz (oder mehr, abhängig von der Konfiguration).
  - 8-Bit-Architektur mit erweiterten Funktionen und Optimierungen.
  - Hardware-Divider und viele Optimierungen, um Berechnungen zu 
beschleunigen.
  - Neuere Befehlssätze und komplexere Architektur.

### Fibonacci-Zahlen Berechnung:

Die Fibonacci-Zahlen sind eine Folge, in der jede Zahl die Summe der 
beiden vorherigen ist. Die Formel lautet:
\[ F(n) = F(n-1) + F(n-2) \]

Für diese Aufgabe möchten wir die ersten 382 Fibonacci-Zahlen berechnen, 
die alle kleiner als \(10^{80}\) sind. Diese Zahlen wachsen schnell, und 
die Herausforderung liegt darin, mit sehr großen Ganzzahlen zu arbeiten.

#### Schritt 1: Berechnung der Fibonacci-Zahlen

Eine effiziente Methode zur Berechnung der Fibonacci-Zahlen ist die 
**iterative Berechnung**, bei der nur die letzten beiden Zahlen der 
Folge gespeichert werden. Für sehr große Zahlen wird eine Bibliothek für 
arbiträr große Ganzzahlen benötigt.

Die wichtigsten Schritte für beide Prozessoren sind:
1. **Initialisierung** der ersten beiden Zahlen der Fibonacci-Folge.
2. **Iterative Berechnung** der nächsten Zahlen, bis die Grenze von 
\(10^{80}\) überschritten wird.

#### Schritt 2: Vergleich der Prozessoren

Obwohl der **AVR ATmega32u4** mit 16 MHz getaktet wird, was mehr als 16 
Mal schneller ist als der **MOS6502** mit nur 1 MHz, ist es wichtig, die 
Optimierungen in der Architektur zu berücksichtigen. Der AVR hat moderne 
Hardwareunterstützung, z. B. für Divisionen und große 
Ganzzahlenoperationen, was ihn wesentlich effizienter macht als der 
MOS6502.

### Berechnungsbeispiel

Hier ist ein Python-Skript, das die Fibonacci-Zahlen berechnet. Es kann 
als eine grobe Referenz für die Leistung beider Prozessoren dienen, da 
die Prozessoren in der Praxis natürlich ganz unterschiedliche Maschinen 
sind und wir uns nur auf die theoretische Geschwindigkeit stützen 
können:

```python
def fibonacci_up_to(limit):
    fibs = [0, 1]
    while True:
        next_fib = fibs[-1] + fibs[-2]
        if next_fib >= limit:
            break
        fibs.append(next_fib)
    return fibs

# Definiere die Obergrenze (10^80)
limit = 10**80
fibs = fibonacci_up_to(limit)

# Gebe die ersten 382 Fibonacci-Zahlen aus
for i, fib in enumerate(fibs[:382]):
    print(f"F({i}) = {fib}")
```

#### Schritt 3: Laufzeitbewertung

- **MOS6502:**
  Da der MOS6502 eine einfachere Architektur hat und mit nur 1 MHz 
arbeitet, wird das Berechnen der Fibonacci-Zahlen sehr langsam sein, 
besonders bei großen Zahlen. Es könnte mehrere Minuten oder sogar 
Stunden dauern, um 382 Fibonacci-Zahlen zu berechnen.

- **AVR ATmega32u4:**
  Der AVR mit 16 MHz wird deutlich schneller sein, da er mehr 
Rechenleistung pro Takt ausführen kann und moderne Optimierungen bietet. 
Die Berechnungen sollten in wenigen Sekunden oder höchstens Minuten 
abgeschlossen sein, selbst bei der Berechnung von Fibonacci-Zahlen mit 
sehr großen Werten.

### Fazit:
Der **AVR ATmega32u4** wird sicherlich viel schneller sein als der 
**MOS6502** bei der Berechnung der Fibonacci-Zahlen, selbst wenn der 
MOS6502 mit der maximalen Frequenz von 1 MHz arbeitet. Die zusätzliche 
Rechenleistung und die Hardwareoptimierungen des AVR machen ihn deutlich 
schneller bei der Berechnung dieser Folge.

Wenn du noch genauere Details zur Berechnung oder eine genauere 
Abschätzung der Rechenzeiten auf beiden Prozessoren möchtest, kann ich 
dir bei Bedarf auch eine Simulation oder weitere Informationen zu diesen 
Prozessoren und ihrer Performance bei der Fibonacci-Berechnung geben!

; Fibonacci-Berechnung für den MOS6502
; Berechnet die ersten Fibonacci-Zahlen und speichert sie im RAM

    .org $8000         ; Startadresse des Programms
    LDX #$00           ; Setze X (Fibonacci Index) auf 0
    LDY #$00           ; Setze Y (Fibonacci-Zahl 0) auf 0
    LDA #$01           ; Lade A mit 1 (erste Fibonacci-Zahl)

start_fib:
    STA $0200,X        ; Speichere die aktuelle Fibonacci-Zahl in RAM 
($0200 + X)
    Cpx #$0C           ; Stoppe nach 12 Fibonacci-Zahlen (Du kannst das 
anpassen)
    BEQ done           ; Wenn 12 Fibonacci-Zahlen erreicht, Ende

    LDA $0200,X        ; Lade die aktuelle Fibonacci-Zahl in A
    LDY $0200,X        ; Lade die vorherige Fibonacci-Zahl in Y
    CLC                ; Clear Carry
    ADC $0200,X        ; A = A + Y (F(n) = F(n-1) + F(n-2))
    STA $0200,X        ; Speichere die neue Fibonacci-Zahl in RAM

    INX                ; Erhöhe X für den nächsten Index
    BNE start_fib      ; Wiederhole den Berechnungsloop, solange nicht 
fertig

done:
    BRK                ; Beende das Programm

und

; Fibonacci-Berechnung für den AVR ATmega32u4
; Berechnet die ersten Fibonacci-Zahlen und speichert sie im SRAM

.include "m32u4def.inc" ; AVR Header für ATmega32u4

    .org 0x00             ; Startadresse (Reset-Vector)
    rjmp main             ; Springe zur Hauptfunktion

main:
    ldi r16, 0            ; Setze r16 (erste Fibonacci-Zahl) auf 0
    ldi r17, 1            ; Setze r17 (zweite Fibonacci-Zahl) auf 1
    ldi r18, 0x20         ; Speicheradresse für die Fibonacci-Zahlen im 
SRAM (z.B. $20)

    ; Berechnung der ersten 10 Fibonacci-Zahlen
    ; Die Berechnung geht durch eine Schleife und speichert die Zahlen 
im SRAM
    ldi r19, 10           ; Anzahl der Fibonacci-Zahlen, die wir 
berechnen wollen (z.B. 10)

fibonacci_loop:
    st X+, r16            ; Speichere Fibonacci-Zahl (r16) im SRAM
    mov r20, r16          ; Kopiere r16 in r20 (für Zwischenspeicherung)
    add r16, r17          ; r16 = r16 + r17 (Berechne Fibonacci)
    mov r17, r20          ; Setze r17 auf den alten Wert von r16 (n-1)

    dec r19               ; Verringere die Anzahl der verbleibenden 
Zahlen
    brne fibonacci_loop   ; Wenn nicht alle Zahlen berechnet sind, 
wiederhole die Schleife

    ; Endlosschleife, um das Programm zu beenden
    rjmp main

: Bearbeitet durch User
von Tim  . (cpldcpu)


Lesenswert?

Mairian schrieb:
> Das ist eine spannende Frage, die einen direkten Vergleich der beiden

Was soll der Bullshit? LLMs zu nutzen ist sinnvoll, aber man sollte 
damit auch vernünftig umgehen. Einfach Slop ins Forum zu posten erzeugt 
unnötiges Rauschen. Es kopiert ja auch nicht jeder seine debug-logs ins 
forum.

Der Code oben ist falsch und ignoriert die Aufgabenstellung.

: Bearbeitet durch User
von Mairian (marianp)


Lesenswert?

Tim  . schrieb:
> Der Code oben ist falsch und ignoriert die Aufgabenstellung.

Das könnte man ja noch anpassen lassen.
Wollte damit nur sagen, das Foren durch ChatGPT und co weitesgehend 
ausgedient haben, da man di e meisten Fragen heute dort schnell 
beantwortetn kann, sei des die Berühmte LED mit Vorwiderstand oder 
andere Dinge ohne das provozierende Fragen dazwischen auftauchen.
Und das funktioniert inzwischen sehr gut und nächstes jahr nahezu 
Perfekt als Forumsersatz

: Bearbeitet durch User
von Tim  . (cpldcpu)


Lesenswert?

Mairian schrieb:
> Tim  . schrieb:
>> Der Code oben ist falsch und ignoriert die Aufgabenstellung.
>
> Das könnte man ja noch anpassen lassen.
> Wollte damit nur sagen, das Foren durch ChatGPT und co weitesgehend
> ausgedient haben, da man di e meisten Fragen heute dort schnell

Du hast gerade gezeigt, dass das nicht der Fall ist, denn die Antwort 
besteht nur aus oberflächlichem Bullshit, der die Kernprobleme 
ignoriert.

Man kann allerdings durch gezieltes Prompting ein geeignetes Programm 
erzeugen (s.O.). Ein wenig denken musste ich schon noch, um den 
Lösungsansatz vorzuschlagen :)

Außerdem ist es sinnfrei, komplette LLM Antworten in ein Forum zu 
kopieren. Oder kopierst Du auch komplette google-suchantworten?

von Christoph M. (mchris)


Lesenswert?

Mairian (marianp)
18.04.2025 09:30

>Wollte damit nur sagen, das Foren durch ChatGPT und co weitesgehend
>ausgedient haben, da man di e meisten Fragen heute dort schnell
>beantwortetn kann,

Im Moment habe die Foren noch nicht ausgedient, da ChatGPT die Frage 
zwar beantwortet, aber eher als Allgemeinplatz.
Die Frage, ob ein 6502 unter bestimmten Voraussetzungen schneller sein 
kann als ein Atmega erfordert ein Verständnis von sehr speziellen 
Zusammenhängen, die ChatGPT nicht hat.
Die Verwendung der BCD Arithmetik-Befehle als Beschleuniger hat ChatGPT 
nicht auf dem Schirm, einfach weil sich's im Internet nicht so findet ( 
oder so speziell ist, dass es ChatGPT überlesen hat).

von Michael B. (laberkopp)


Lesenswert?

Mairian schrieb:
> Das ist eine spannende Frage,

Die du offenbar nicht beantworten kannst sondern das Orakel ChatGPT dazu 
befragen musst. Peinlich.

Falk B. schrieb:
> Da bin ich mal gespannt! Ok

Man muss bloss das sinnlose BCD weglassen und direkt 1 byte pro 
Dezimalstelle nutzen. Statt Addieren kann man auch 2 x 2 
(unterschiedliche, je nach Übertrag) 10 x 16 Tabellen nutzen: 
Summenziffer und Übertrag. Den Offset von '0' kann man bei der Ausgabe 
draufklatschen.

von Falk B. (falk)


Lesenswert?

Mairian schrieb:
> Das könnte man ja noch anpassen lassen.
> Wollte damit nur sagen, das Foren durch ChatGPT und co weitesgehend
> ausgedient haben, da man di e meisten Fragen heute dort schnell
> beantwortetn kann, sei des die Berühmte LED mit Vorwiderstand oder
> andere Dinge ohne das provozierende Fragen dazwischen auftauchen.
> Und das funktioniert inzwischen sehr gut und nächstes jahr nahezu
> Perfekt als Forumsersatz

MUAHHHHHHH!!! Ein digitaler Sklave spricht . . .

von Tim  . (cpldcpu)


Angehängte Dateien:

Lesenswert?

Ok, mir ist (selbst-gedacht) noch eine Idee gekommen, wie man auf dem 
AVR die BCD-Mode Geschwindigkeit erreichen kann.

- Es werden zwei Dezimalstellen pro byte gespeichert (d.h. 0-99). 
Dadurch kann der AVR das array mit (fast) genau so wenig Befehlen wie 
der 6502 bearbeiten und man erreicht die gleiche Packungsdichte von zwei 
Dezimalstellen pro Byte.
- Um die zwei Dezimalstellen pro byte zu extrahieren, kann man eine 
lookup-tabelle nutzen.

Code anbei in C und avr assembler.

Die Ausgabe über UART ist auf dem AVR natürlich sehr limitierend. Ist 
natürlich die Frage, ob das ein fairer Vergleich zu dem CBM-Screenmode 
ist...

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

Mairian schrieb:

> - **AVR ATmega32u4 (2008):**
>   - Taktfrequenz: 16 MHz (oder mehr, abhängig von der Konfiguration).
>   - 8-Bit-Architektur mit erweiterten Funktionen und Optimierungen.
>   - Hardware-Divider und viele Optimierungen, um Berechnungen zu
> beschleunigen.

Falsch. Der hat nur einen Multiplikator drin. Es ist KEIN 8051! ;-)

>   - Neuere Befehlssätze und komplexere Architektur.

Jaja, Laberrababer.

Die Plappertante ChatGPT hat mal wieder heiße Luft erzeugt, die gut 
klingt, aber löchrig wie ein Schweizer Käse ist.

> Obwohl der **AVR ATmega32u4** mit 16 MHz getaktet wird, was mehr als 16
> Mal schneller ist als der **MOS6502** mit nur 1 MHz, ist es wichtig, die
> Optimierungen in der Architektur zu berücksichtigen. Der AVR hat moderne
> Hardwareunterstützung, z. B. für Divisionen und große

Falsch.

>   Da der MOS6502 eine einfachere Architektur hat und mit nur 1 MHz
> arbeitet, wird das Berechnen der Fibonacci-Zahlen sehr langsam sein,
> besonders bei großen Zahlen. Es könnte mehrere Minuten oder sogar
> Stunden dauern, um 382 Fibonacci-Zahlen zu berechnen.

Apfelmus ist Mus aus Äpfeln.

> - **AVR ATmega32u4:**
>   Der AVR mit 16 MHz wird deutlich schneller sein, da er mehr
> Rechenleistung pro Takt ausführen kann und moderne Optimierungen bietet.
> Die Berechnungen sollten in wenigen Sekunden oder höchstens Minuten
> abgeschlossen sein, selbst bei der Berechnung von Fibonacci-Zahlen mit
> sehr großen Werten.

ChatGPT ist optimal zum Erzeugen von Politikerreden!

von Tim  . (cpldcpu)


Lesenswert?

Tim  . schrieb:
> Die Ausgabe über UART ist auf dem AVR natürlich sehr limitierend. Ist
> natürlich die Frage, ob das ein fairer Vergleich zu dem CBM-Screenmode
> ist...

Auf dem CBM muss man den Bildschirminhalt aber auch noch scrollen? Ob 
das vom OP berücksichtigt wurde?

von Falk B. (falk)


Lesenswert?

Tim  . schrieb:

> - Es werden zwei Dezimalstellen pro byte gespeichert (d.h. 0-99).

Das hatten wir schon.

Beitrag "Re: Wettkampf Opa(MOS6502) gegen Frischling(ATmega)"

> Die Ausgabe über UART ist auf dem AVR natürlich sehr limitierend. Ist
> natürlich die Frage, ob das ein fairer Vergleich zu dem CBM-Screenmode
> ist...

Das haten wir auch schon.

Beitrag "Re: Wettkampf Opa(MOS6502) gegen Frischling(ATmega)"

von Falk B. (falk)


Lesenswert?

Tim  . schrieb:
> Auf dem CBM muss man den Bildschirminhalt aber auch noch scrollen? Ob
> das vom OP berücksichtigt wurde?

Wer lesen kann, ist klar im Vorteil.

Beitrag "Re: Wettkampf Opa(MOS6502) gegen Frischling(ATmega)"

von Tim  . (cpldcpu)


Lesenswert?

Falk B. schrieb:
> Tim  . schrieb:
>
>> - Es werden zwei Dezimalstellen pro byte gespeichert (d.h. 0-99).
>
> Das hatten wir schon.
>
> Beitrag "Re: Wettkampf Opa(MOS6502) gegen Frischling(ATmega)"

Nö. hier emulierst du den BCD Modus. Mein Ansatz nutzt um Prinzip ein 
Basis100 System. Außerdem ist die Assemblerimplementierung deutlich 
effizienter. Schaue dir mal den Code an.

von Christoph M. (mchris)


Lesenswert?

Tim  . (cpldcpu)
18.04.2025 09:49

>Ok, mir ist (selbst-gedacht) noch eine Idee gekommen, wie man auf dem
>AVR die BCD-Mode Geschwindigkeit erreichen kann.

>- Es werden zwei Dezimalstellen pro byte gespeichert (d.h. 0-99).

Für den Vergleich, wo die Zielmarke der 6502 Geschwindigkeit ist, 
brauchen wir aber noch dessen Assemblercode.

von Tim  . (cpldcpu)


Lesenswert?

Christoph M. schrieb:
> Tim  . (cpldcpu)
> 18.04.2025 09:49
>
>>Ok, mir ist (selbst-gedacht) noch eine Idee gekommen, wie man auf dem
>>AVR die BCD-Mode Geschwindigkeit erreichen kann.
>
>>- Es werden zwei Dezimalstellen pro byte gespeichert (d.h. 0-99).
>
> Für den Vergleich, wo die Zielmarke der 6502 Geschwindigkeit ist,
> brauchen wir aber noch dessen Assemblercode.

Die inner loop sieht vermutlich so aus:
1
    SED
2
    CLC
3
...
4
    LDA array1+39    - 4
5
    ADC array2+39    - 4
6
    STA array1+39    - 4
7
...
8
    LDA array1+0    - 4
9
    ADC array2+0    - 4
10
    STA array1+0    - 4

Also 12µs für zwei Nibbles. Dazu kommt natürlich noch der Ausgabecode, 
der mindestens genau so lange braucht.

auf dem avr
1
    ; This is the path when carry=1 from previous iteration
2
    ld temp1, -Z      ; Load previous[j] and decrement Z
3
    ld temp2, -Y      ; Load current[j] and decrement Y
4
    add temp1, temp2  ; Add current digit
5
    inc temp1         ; Add carry=1
6
    
7
    ; Check for decimal overflow
8
    cpi temp1, 100    ; Compare with 100
9
    brlo store_no_carry  ; If < 100, no new carry
10
11
carry_with_overflow:    
12
    ; Handle carry case
13
    subi temp1, 100   ; Subtract 100
14
    st Z, temp1       ; Store result
15
    
16
    dec inner_cnt     ; Decrement counter
17
    brne carry1_path  ; If counter not zero, continue with carry=1
18
    rjmp inner_done   ; Exit if counter is zero

das sind max 15 clock cycle pro iteration, also weniger als 1µs bei 
16MHz

Edit: Norbert hat hier natürlich ein Problem konstruiert, dass den 6502 
bestmöglich bevorzugt.

: Bearbeitet durch User
von Yalu X. (yalu) (Moderator)


Angehängte Dateien:

Lesenswert?

Yalu X. schrieb:
> Ich werde morgen einen Code für den ATmega32U4 posten, der bei 16 MHz
> für die Berechnung und das Schreiben der Zahlen als ASCII-Strings
> weniger als 20 ms braucht.

Es sind laut avrtest 244897 Taktzyklen oder 15306 µs.

Yalu X. schrieb:
> Die 383 Fibonacci-Zahlen haben zusammen 15506 Ziffern, wenn man – wie in
> Norberts Python-Vorlage – die ersten beiden (0 und 1) weglässt.

Um gleichschnell zu sein, stünden dem 6502 für die Berechnung und
Speicherung der einzelnen Ziffer jeweils nur

  15306 µs / 15506 = 0,987 µs

zur Verfügung, also bei 1 MHz weniger als ein Taktzyklus. Selbst ein NOP
braucht schon 2 Zyklen.

PS: Um die Ausgabe zu aktivieren, muss in Zeile 3
1
#define _PRINT

der Underscore entfernt werden.

: Bearbeitet durch Moderator
von Hans W. (Firma: Wilhelm.Consulting) (hans-)


Lesenswert?

Norbert schrieb:
> Ich hatte ja eine Antwort versprochen und die möchte ich nicht schuldig
> bleiben.

Bist du aber!

Nachdem du min 2 CPI beim 6502 brauchst (fetch+execution) und der AVR 
min 1CPI brazcht, hast du am AVR teilweise 32 Zyklen Vorteil... Da 
könnte es sich glatt ausgehen dein 6502 ASM binary am AVR emulieren zu 
lassen!

Während ich das oben schrieb, habe ich schnell mal Google gefragt... 
(Wunder mich, dass die künstliche Dummheit nicht darauf gekommen ist...)

https://sbc.rictor.org/avr65c02.html

Der ATMega1284P bei 24mhz CLK schafft wirst case 1,9MHz 6502 code 
emulation... Also sollte das am 32u4 bei 16mhz immer noch mit 1,3MHz 
laufen (IIRC, sind das die selben cores).

Damit wird zumindest der Vergleich mit dem 1MHz 6502 schon ziemlich 
absurd.

[Edit]

Ein weiterer Emulator: https://2m5.de/6502_Emu/index.htm

Der schafft anscheinend am mega16 mit 16MHz einen 2mhz 6502 clock

[/Edit]

73

: Bearbeitet durch User
von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

>> Mich würde mal interessieren, wie lange der C64
>> in Basic dafür braucht. Kann man das noch in Stunden messen?
> Meine Schätzung. Wenn wir mal grob
> von 10 Basicbefehlen/s ausgegehen [..]
Na, ein wenig schneller war er meiner Erinnerung nach schon, bzw. es kam 
stark darauf an welche Befehle das waren und ob sowas wie Bildschirm 
scrollen weiter Zeit geklaut hat. Sowas wie Sprites über den Bildschirm 
schieben geht ruckelfrei, jedenfalls solange es nicht zu viele oder zu 
viele Achsen sind.

Ich würde mich aber wundern, wenn der C64 bereits so große Zahlen in 
Basic beherrschte. Wahrscheinlich muss man die wieder atomar behandeln 
und sie sich selbst zusammensetzen.

Ein Vorteil könnte vielleicht sein, wenn man "Basic" ein wenig dehnt... 
man ist ja beim C64 noch Herr über die Maschine. Heißt, man kann die 
Zahlen mit Peek&Poke in einen von Basic gerade nicht benutzten 
Speicherbereich hineinschreiben, ohne daß die Kiste crasht. Vielleicht 
wäre das schneller als die reinen Basic-Variablen zu benutzen.

von Oliver S. (oliverso)


Lesenswert?

Christoph M. schrieb:
> Die Frage, ob ein 6502 unter bestimmten Voraussetzungen schneller sein
> kann als ein Atmega erfordert ein Verständnis von sehr speziellen
> Zusammenhängen, die ChatGPT nicht hat.

Die sich aber im Kontext der Aufgabenstellung durch intensives 
Nachdenken von wenigen Millisekunden mit Nein beantworten lässt.

Selbst wenn der 6502 den ein- oder anderen Befehl hat, der auf einem AVR 
durch mehrere nachgebildet werden müssten, reicht alleine der Faktor 16 
beim Takt für diese Aussage.

Oliver

von Yalu X. (yalu) (Moderator)


Lesenswert?

Tim  . schrieb:
> Norbert hat hier vermutlich den BCD-Mode des 6502 herausgekramt

Ja, das war oben auch mein Gedanke:

Yalu X. schrieb:
> Ich kann mir denken, worauf du hinaus willst. Der 6502 hat ein
> bestimmtes Feature, das der AVR nicht bzw. nur sehr eingeschränkt hat.

Aber:

> Ich glaube aber nicht, dass dieses Feature dem 6502 gegenüber dem
> deutlich höher getakteten AVR zu Sieg verhilft.

Die BCD-Addition geht zwar superschnell (4,5 Taktzyklen pro Ziffer inkl.
Laden und Speichern), aber die anschließende Umwandlung in einen
ASCII-String dauert IMHO mindestens 13,5 Zyklen/Ziffer, u.a. deswegen,
weil dem 6502 ein Nibble-Swap-Befehl fehlt. In Summe sind das – bei
vollständig ausgerollten Schleifen 18 Zyklen/Ziffer. Selbst bei gleicher
Taktfrequenz dürfte der 6502 trotz des BCD-Modus das Rennen immer noch
knapp verlieren. Das liegt u.a. auch daran, dass er etwa doppelt so
viele Zyklen pro Instruktion braucht als der AVR.

Angesichts seines Alters ist das aber überhaupt keine Schande. Da ich
auf einem Apple II programmieren gelernt habe (erst in Basic, dann in
Hex-Maschinencode, später in Assembler und schließlich in Pascal), bin
ich nach wie vor ein Fan des 6502 :)

Auf jeden Fall bin ich auf Norberts Code gespannt. Vielleicht hat er ja
noch irgendetwas in seiner Trickkisten, an das bisher noch keiner
gedacht hat.

von Michael B. (laberkopp)


Lesenswert?

Yalu X. schrieb:
> Angesichts seines Alters ist das aber überhaupt keine Schande

Na ja, peinlich ist eher, dass der AVR obwohl 40 Jahre jünger nur etwas 
schneller als der 6502 ist und nicht mit 10GHz läuft.

Nach Moore und so wäre nämlich ein drastisch höherer Performancezuwachs 
zu erwarten. Aber man hat ihn im wesentlichen nur genutzt um Speicher 
auf den Chip zu packen.

Ich verstehe nicht warum die dicken CPU von Intel & AMD mit 3+ GHz 
laufen, die kleinen RISC aber nicht mindestens ebenso. Ja, man braucht 
eine Spannungsregelung  ja, die I/O Pins brauchen grosse und langsamen 
Transistoren, aber den Kern könnte man trotzdem mit GHz laufen lassen, 
PLL wurden auch schon erfunden.

von Tim  . (cpldcpu)


Lesenswert?

Yalu X. schrieb:

> ASCII-String dauert IMHO mindestens 13,5 Zyklen/Ziffer, u.a. deswegen,
> weil dem 6502 ein Nibble-Swap-Befehl fehlt. In Summe sind das – bei
> vollständig ausgerollten Schleifen 18 Zyklen/Ziffer. Selbst bei gleicher

Mit einem table-lookup vielleicht?
1
    LDA array1
2
    ADC array2
3
    STA array1
4
    TAX
5
    LDA table1,x
6
    sta screen
7
    lda table2,x
8
    sta screen

von Tim  . (cpldcpu)


Lesenswert?

Michael B. schrieb:

> Ich verstehe nicht warum die dicken CPU von Intel & AMD mit 3+ GHz

Die ziehen aber auch 100A und nicht 10mA ...

Die Hauptlimitierung bei MCUs ist übrigens der Speicher. Flash ist 
generall langsam und auch das SRAM ist normalerweise nicht auf 
Geschwindigkeit optimiert.

von Falk B. (falk)


Lesenswert?

Michael B. schrieb:
>> Angesichts seines Alters ist das aber überhaupt keine Schande
>
> Na ja, peinlich ist eher, dass der AVR obwohl 40 Jahre jünger nur etwas
> schneller als der 6502 ist und nicht mit 10GHz läuft.

Was auch immer du nimmst. NIMM WENIGER DAVON!

von 900ss (900ss)


Lesenswert?

Michael B. schrieb:
> und nicht mit 10GHz läuft

Um dann damit eine Waschmaschine zu mehr Konnektivität zu verhelfen weil 
Rechenleistung für TCP da ist?

Nein nein, ich bin nicht gegen schnelle CPUs (Mikrocontroller). Die gibt 
es schon wenn man die tatsächlich braucht.

von Christoph M. (mchris)


Lesenswert?

Michael B. (laberkopp)
18.04.2025 11:07
>Na ja, peinlich ist eher, dass der AVR obwohl 40 Jahre jünger nur etwas
>schneller als der 6502 ist und nicht mit 10GHz läuft.

Dein Nickname ist ja laberkopp .. Dummschwätzer wäre aber auch passend.

von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

Tim  . schrieb:
> Man kann allerdings durch gezieltes Prompting ein geeignetes Programm
> erzeugen

Unser Geschäftsführer träumt schon davon, das wir für unsere 
Online-Dienste bald keine individuellen Frontends mehr brauchen, weil 
die Benutzer einfach einen Prompt verfassen. Nach dem Motto: "Ich möchte 
ab morgen in den Tarif XL wechseln und dabei das Angebot für die neue 
Transportkiste wahrnehmen".

Falk B. schrieb:
> ChatGPT ist optimal zum Erzeugen von Politikerreden!

Leider ja

: Bearbeitet durch User
von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

Michael B. schrieb:
> Na ja, peinlich ist eher, dass der AVR obwohl 40 Jahre jünger nur etwas
> schneller als der 6502 ist und nicht mit 10GHz läuft.

Der AVR kann mindestens 16x so schnell getaktet werden. Wenn das nicht 
erheblich schneller ist, was dann?

Außerdem enthält er eine Menge integrierte Peripherie, für die man 
früher extra Geld und Platz brauchte. Sogar den Flash-Speicher, EEprom 
und einen Debugger-Interface. Davon durfte man zu 6502 Zeiten nicht mal 
träumen.

: Bearbeitet durch User
von 🍅🍅 🍅. (tomate)


Lesenswert?

Sherlock 🕵🏽‍♂️ schrieb:
> Sogar den Flash-Speicher, EEprom
> und einen Debugger-Interface. Davon durfte man zu 6502 Zeiten nicht mal
> träumen.

Externer EPROM und Logic-Analyzer am Bus hatte aber auch so seine 
Vorteile, speziell wenn der Chip nicht mehr will und man den Speicher 
kopieren will/muss.

von Falk B. (falk)


Lesenswert?

🍅🍅 🍅. schrieb:
> Externer EPROM und Logic-Analyzer am Bus hatte aber auch so seine
> Vorteile, speziell wenn der Chip nicht mehr will und man den Speicher
> kopieren will/muss.

Es war ein notwendiges Übel, weil man die Hardware debuggen musste! Will 
heute keiner mehr haben, denn man bekommt astrein getestete Hardware!

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

Hier die Variante in C64 Basic, deutlich schneller als gedacht. Die 
Berechnung dauert ca. 2s, die Ausgabe incl. Scrolling 1s. D.h. die 384 
Zahlen sind in ca. 1152s ~ 19min ausgegeben. Not too bad.

von Michael B. (laberkopp)


Lesenswert?

Falk B. schrieb:
> Was auch immer du nimmst. NIMM WENIGER DAVON!

Noch weniger Kaffee damit ich so eine Schnarchnase werde wie du, och 
nöö.

von Falk B. (falk)


Lesenswert?

Michael B. schrieb:
>> Was auch immer du nimmst. NIMM WENIGER DAVON!
>
> Noch weniger Kaffee damit ich so eine Schnarchnase werde wie du, och
> nöö.

https://www.youtube.com/watch?v=7edeOEuXdMU#t=8s

von Bradward B. (Firma: Starfleet) (ltjg_boimler)


Lesenswert?

> Kann ein fünfzig Jahre alter Mikroprozessor (der originale MOS6502
> ca.1976) schneller arbeiten als ein deutlich modernerer AVR ATmega32u4
> (oder ähnlicher Typ)?

Alter schützt vor speed nicht.
Auch ein "Trabi" kann schneller sein als ein "Tesla" ...
im freien Fall.  ;-)

von H. H. (hhinz)


Lesenswert?

Bradward B. schrieb:
> Auch ein "Trabi" kann schneller sein als ein "Tesla" ...
> im freien Fall.  ;-)

Aber nur wenn man den Trabi mit Beton füllt.

von 🍅🍅 🍅. (tomate)


Lesenswert?

Falk B. schrieb:
> Es war ein notwendiges Übel, weil man die Hardware debuggen musste! Will
> heute keiner mehr haben, denn man bekommt astrein getestete Hardware!

So toll getestete Hardware wie der STM32 in so einem 
Laser-Entfernungsmesser von mir, der wahrscheinlich mal Brown-Out oder 
sonstwas hatte und sich dann wahrscheinlich Müll ins Flash geschrieben 
hat.

Bei Kram aus den 1980/1990ern einfach EPROM kopieren, bei dem Scheiss 
von heute wegwerfen oder warten, dass mal einer Firmware leakt.

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

Hier das Endergebnis auf dem VICE. 16:07 für die 385 Fibonaccizahlen. 
Etwas besser als die Abschätzung.

: Bearbeitet durch User
von H. H. (hhinz)


Lesenswert?

🍅🍅 🍅. schrieb:
> Bei Kram aus den 1980/1990ern einfach EPROM kopieren, bei dem Scheiss
> von heute wegwerfen oder warten, dass mal einer Firmware leakt.

Heute muss man zum Gebrauch des Geräts nicht mehr in die Muckibude.

von Stephan S. (uxdx)


Lesenswert?

Man muss aber fairerweise die Berechnung von der Anzeige trennen

von Bradward B. (Firma: Starfleet) (ltjg_boimler)


Lesenswert?

>> Auch ein "Trabi" kann schneller sein als ein "Tesla" ...
>> im freien Fall.  ;-)
>
> Aber nur wenn man den Trabi mit Beton füllt.

Reichen "Betonköpfe" ?! ;-)

https://de.wikipedia.org/wiki/Betonkopf

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

H. H. schrieb:
> Bradward B. schrieb:
>> Auch ein "Trabi" kann schneller sein als ein "Tesla" ...
>> im freien Fall.  ;-)
>
> Aber nur wenn man den Trabi mit Beton füllt.

Nö. Im freien Fall in Luft nimmt der Trabi von allein eine (bezüglich 
des Luftwiderstands recht günstige) und ziemlich stabile aerodynamische 
Lage ein.

Der Tesla hingegen tut das nicht, der bewegt sich völlig chaotisch. 
Liegt an der Masseverteilung mit Schwerpunkt nahe an der größten Fläche, 
aber nicht in deren Mitte.

Die Energie, die die turbulente Bewegung schluckt und die hohe 
Wahrscheinlichkeit für ungünstige Luftwiderstände im chaotischen 
Fallverlauf mindern die terminal velocity des Tesla deutlich gegenüber 
dem Trabi in stabiler Fluglage.

Zumindest diesbezüglich gewinnt eindeutig der Trabi.

Der Einschlagkrater fällt allerdings trotz der deutlich höheren 
Einschlaggeschwindigkeit erheblich kleiner aus als der des Tesla. Masse 
läßt sich halt nur schwer ersetzen.

von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

🍅🍅 🍅. schrieb:
> Bei Kram aus den 1980/1990ern einfach EPROM kopieren

Auch heute könntest du einfach den Flash Speicher kopieren, wenn es der 
Hersteller des Gerätes nicht aktiv verhindern würde.

von Yalu X. (yalu) (Moderator)


Angehängte Dateien:

Lesenswert?

Hier noch eine Implementation in Basic für den Apple. Sie läuft inkl.
Bildschirmausgabe in 4,5 Minuten durch. Damit das Video nicht so lange
dauert, habe ich in der Mitte ein Stück herausgeschnitten.

von Falk B. (falk)


Lesenswert?

Yalu X. schrieb:
> Bildschirmausgabe in 4,5 Minuten durch.

Beachtlich! Deutlich schneller als meine C64 Variante, obwohl es die 
gleiche CPU ist. Ok, netter Trick, vier Dezimalstellen in einer Zahl zu 
verarbeiten ;-)

von Tim  . (cpldcpu)


Lesenswert?

Das sieht nach einer Basic-Variante von meinem C-Code oben aus :)

(Beitrag "Re: Wettkampf Opa(MOS6502) gegen Frischling(ATmega)")

: Bearbeitet durch User
von Jobst M. (jobstens-de)


Lesenswert?

Falk B. schrieb:
> ChatGPT ist optimal zum Erzeugen von Politikerreden!

Es gibt eigentlich nur eine Sache, die KI richtig gut kann: Menschen 
täuschen. Da passen, neben Phishing-Mails und Deep-Fakes, auch 
Politikerreden mit rein.


Hier noch eine Variante für die bash:
1
export BC_LINE_LENGTH='0' ; export val1='0' ; export val2='1' ; echo -e "$val1\n$val2" ; for ((i=0 ; i < 191 ; i++)) ; do export val1=`echo $val1 + $val2 | bc` ; export val2=`echo $val1 + $val2 | bc` ; echo -e "$val1\n$val2" ; done

Gruß
Jobst

von Falk B. (falk)


Lesenswert?

Yalu X. schrieb:
> Hier noch eine Implementation in Basic für den Apple. Sie läuft inkl.
> Bildschirmausgabe in 4,5 Minuten durch.

Ich hab deine Variante mal im VICE laufen lassen. 6:40 ist schon mehr 
als doppelt so schnell wie mein Original, aber immer noch etwas 
langsamer als der Apple ][. Vor allem muss man den Unfug von Basic 2.0 
umschiffen, bei welchem bei STR$() immer ein führendes Leerzeichen für 
positive Zahlen erzeugt wird!
Du sparst ja am Anfang auch viele Iterationen ein, wenn kein Carry mehr 
vorhanden ist. Das ist glaube ich der wesentliche Zeitgewinn, denn am 
Ende ist die Berechnung fast genau so langsam, egal ob mit einer oder 4 
Dezimalstellen / Arrayzelle.

von Dieter D. (Firma: Hobbytheoretiker) (dieter_1234)


Lesenswert?

Wann sind die Wettkampfvorbereitungen abgeschlossen und kann mit dem 
Wettkampfergebnis gerechnet werden?

von G. K. (zumsel)


Lesenswert?


von Yalu X. (yalu) (Moderator)


Lesenswert?

Falk B. schrieb:
> Yalu X. schrieb:
>> Bildschirmausgabe in 4,5 Minuten durch.
>
> Beachtlich! Deutlich schneller als meine C64 Variante, obwohl es die
> gleiche CPU ist. Ok, netter Trick, vier Dezimalstellen in einer Zahl zu
> verarbeiten ;-)

Eigentlich ist es ja Blödsinn, nur vier Dezimalstellen am Stück zu
verarbeiten. Ich habe das deswegen gemacht, weil die Integerveriablen
(mit '%'-Suffix) in Applesoft-basic 16 Bit breit sind, so dass die Summe
9999+9999=19998 noch gut hineinpasst. Dann habe ich aber herausgefunden,
dass das Programm mit den Integervariablen langsamer ist als mit Float.
Offensichtlich rechnet der Interpreter intern ausschließlich in Float
und muss deswegen die Integervariablen erst dorthin konvertieren, was
zusätzliche Zeit kostet.

Wenn aber sowieso in Float gerechnet wird, können deutlich mehr als nur
vier Stellen am Stück verarbeitet werden. Applesoft-Basic verwendet
40-Bit-Floats (1 Bit Vorzeichen, 31 Bits Mantisse und 8 Bits Exponent).
Mit den 31 Bits der Mantisse lassen sich Integerzahlen bis 2**32-1 ≈
4.3E9 lückenlos darstellen.

Somit kann man bspw. die gewünschten 80 Stellen in 10 Päckchen à 8
Stellen aufteilen. Das Programm braucht dann nur noch 2m49.

Oder man erhöht die Gesamtstellenzahl auf 81 und teilt diese in 9 mal 9
Stellen auf. Damit werden alle Fibinacci-Zahlen mit maximal 81 Stellen
in 2m42 berechnet. Die größte 80-stellige Zahl wird nach 2m38 angezeigt.
Gegenüber den 2m49 von oben ist die Verbesserung eher gering, was aber
evtl. darauf zurückzuführen ist, dass die 81-stelligen Zahlen jeweils 3
statt 2 Zeilen auf dem Bildschirm beanspruchen, was mehr Scrollaufwand
bedeutet.

Um noch Bens Frage von oben zu beantworten:

Ben B. schrieb:
> Mich würde mal interessieren, wie lange der C64 in Basic dafür braucht.
> Kann man das noch in Stunden messen?

Ja kann man. Aber bei den 0,044 Stunden, die die Berechnung braucht,
wird man vielleicht eine etwas angepasstere Einheit wählen ;-)

von Yalu X. (yalu) (Moderator)


Lesenswert?

G. K. schrieb:
> Ist auch ein 65F02 zulässig?
>
> https://www.e-basteln.de/computing/65f02/65f02/
> https://www.heise.de/news/Retro-Computing-6502-mit-100-MHz-6223820.html

Coole Sache, das! Vor allem auch die Tatsache, dass er in Apples, CBMs
und etlichen Schachcomputern die reguläre CPU ersetzen kann. Das sollte
man vielleicht wirklich mal nachbauen.

Vielleicht arbeitet Jürgen Müller (der Entwickler) ja bereits an einem
AVR mit 1,6 GHz :)

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

> Hier die Variante in C64 Basic, deutlich schneller als gedacht.
lach... danke dafür. In der Tat deutlich schneller als ich dachte. So 
schlecht wie man das heute manchmal in Erinnerung hat, war der alte 
Kasten eben doch nicht.

von G. K. (zumsel)


Lesenswert?

Jobst M. schrieb:

> Hier noch eine Variante für die bash:
>
1
> export BC_LINE_LENGTH='0' ; export val1='0' ; export val2='1' ; echo -e 
2
> "$val1\n$val2" ; for ((i=0 ; i < 191 ; i++)) ; do export val1=`echo 
3
> $val1 + $val2 | bc` ; export val2=`echo $val1 + $val2 | bc` ; echo -e 
4
> "$val1\n$val2" ; done
5
>

Dann kann man das auch gleich komplett von bc rechnen lassen :-)
1
#!/usr/bin/env -S BC_LINE_LENGTH=0 bc
2
val1=0
3
val2=1
4
print val1,"\n",val2,"\n"
5
for (i=0 ; i < 191 ; i++) {
6
         val1=val1+val2
7
  val2=val1+val2
8
  print val1,"\n",val2,"\n"
9
}
10
quit
1
$ time ./fn.sh > /dev/null
2
3
real  0m0,358s
4
user  0m0,277s
5
sys  0m0,163s
6
$ time ./fn.bc > /dev/null
7
8
real  0m0,002s
9
user  0m0,002s
10
sys  0m0,000s
11
$

von G. K. (zumsel)


Lesenswert?

Ob S. schrieb:

> Der Einschlagkrater fällt allerdings trotz der deutlich höheren
> Einschlaggeschwindigkeit erheblich kleiner aus als der des Tesla. Masse
> läßt sich halt nur schwer ersetzen.

Masse geht linear in die kinetische Energie, Geschwindigkeit dagegen 
quadratisch in die kinetische Energie.

von Re (r42)


Lesenswert?

Norbert schrieb:
> #!/usr/bin/python3
> [4 Zeilen Python Code]

Mairian schrieb:
> [17 Zeilen ressourcenfressenderer Pythoncode]

Das war doch gar nicht gefragt, hat der Ersteller Deines Postings das 
Originalposting überhaupt gelesen oder den Sinn der Challenge 
verstanden?


Norbert schrieb:
> Wie lange braucht der CBM8032 bei 1 MHz um die 382 Zahlen zu berechnen
> und darzustellen?

Mairian schrieb:
> ; Stoppe nach 12 Fibonacci-Zahlen (Du kannst das anpassen)
>     BEQ done           ; Wenn 12 Fibonacci-Zahlen erreicht, Ende

382. Nicht 12.

Der Ersteller dieses Programms hat nicht mal im Ansatz verstanden, dass 
es um die Behandlung sehr großer Zahlen geht, die eben nicht mehr in 
ein einziges Byte hineinpassen. Das lässt sich auch nicht mal eben so 
hochskalieren.



Mairian schrieb:
> Tim  . schrieb:
>> Der Code oben ist falsch und ignoriert die Aufgabenstellung.
> Wollte damit nur sagen, das Foren durch ChatGPT und co weitesgehend
> ausgedient haben,

Und warum formuliert der Ersteller des Postings dann nicht gleich, was 
er sagen will?


Tim  . schrieb:
> Du hast gerade gezeigt, dass das nicht der Fall ist, denn [...]
full ackn.



Falk B. schrieb:
> Mairian schrieb:
>> - **AVR ATmega32u4 (2008):**
>>   [...] Hardware-Divider und viele Optimierungen, um Berechnungen zu
> Falsch. Der hat nur einen Multiplikator drin. Es ist KEIN 8051! ;-)

Und inwiefern sollte ein Divider hier von Nutzen sein? Es geht nur um 
Additionen.

(re)

von Klaus (feelfree)


Lesenswert?

Re schrieb:
> Und warum formuliert der Ersteller des Postings dann nicht gleich, was
> er sagen will?

Er wollte wohl den Beweis seiner Aussage gleich mitliefern. Stattdessen 
hat er exakt das Gegenteil erreicht, er hat seine beabsichtigte Aussage 
gleich selbst widerlegt. Grandios!

von H. H. (hhinz)


Lesenswert?

Klaus schrieb:
> Er wollte wohl den Beweis seiner Aussage gleich mitliefern. Stattdessen
> hat er exakt das Gegenteil erreicht, er hat seine beabsichtigte Aussage
> gleich selbst widerlegt. Grandios!

Summa cum laude!

von Georg M. (g_m)


Lesenswert?

Dieter D. schrieb:
> Wann sind die Wettkampfvorbereitungen abgeschlossen und kann mit dem
> Wettkampfergebnis gerechnet werden?

Die nächste Zeitvertreib-Challenge: Wer mit seinem 8-Bit Mikrocontroller 
am schnellsten die Zahl π berechnet.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Nicht genug Speicher auf dieser Welt.

von Joachim B. (jar)


Lesenswert?

Georg M. schrieb:
> Wer mit seinem 8-Bit Mikrocontroller
> am schnellsten die Zahl π berechnet

sinnfreie Forderung, mathematisch ist in 2 Bit zwischen 3 und 4 
hinreichend genau

von Re (r42)


Lesenswert?

Michael B. schrieb:
> die kleinen RISC aber nicht mindestens ebenso. Ja, man braucht
> eine Spannungsregelung  ja, die I/O Pins brauchen grosse und langsamen
> Transistoren, aber den Kern könnte man trotzdem mit GHz laufen lassen,
> PLL wurden auch schon erfunden.

Du beschreibst STM32N6? (ok, GHz nur fast, aber nahe dran).
Dreistellige MHz sind ab Cortex M4 ("G4xx") im µC-Bereich schon lange 
Standard, PLL noch viel länger.

Aber "die kleinen RISC": haben andere Optimierungsziele.


Joachim B. schrieb:
> Georg M. schrieb:
>> Wer mit seinem 8-Bit Mikrocontroller am schnellsten die Zahl π berechnet
>
> sinnfreie Forderung, mathematisch ist in 2 Bit zwischen 3 und 4
> hinreichend genau

Eben, Wozu Nachkommestellen?
| https://de.wikipedia.org/wiki/Indiana_Pi_Bill

(re)

von Christoph M. (mchris)


Lesenswert?

Ob ein auf einem Arduino Nano emulierter 6502 wohl schneller ist als ein 
Arduino Nano ? :-)

Hier das Ergebnis für eine 6502 Assembler Berechnung der 80 stelligen 
Fibonacci Zahl:
Beitrag "Re: 6502 Emulator Arduino"

0.79 Sekunden ..

von Dieter D. (Firma: Hobbytheoretiker) (dieter_1234)


Lesenswert?

Georg M. schrieb:
> Die nächste Zeitvertreib-Challenge: Wer mit seinem 8-Bit Mikrocontroller
> am schnellsten die Zahl π berechnet.

Intel 4040 wäre noch eine weitere Variante.

von Christoph M. (mchris)


Lesenswert?

Der Arduino Nano 6502 Emulator läuft etwa 5 mal langsamer als ein Apple 
2 und braucht 0.79s.
Deshalb sollte ein mit 1Mhz getaktete 6502 die 80 Digit 
Fibonacci-Rechnung in ca. 160ms schaffen.
Jetzt bleibt die Frage: Wie schlägt sich der mit 16MHz getaktete Atmega 
im Vergleich?

von G. K. (zumsel)


Lesenswert?

Dieter D. schrieb:

> Intel 4040 wäre noch eine weitere Variante.

Linux auf so einer Kiste: 
https://dmitry.gr/?r=05.Projects&proj=35.%20Linux4004

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Andere Frage: Gibt es überhaupt irgendwas, wo ein 6502 im Vergleich zu 
einem (evtl. gleich getakteten) ATMega schneller ist?

von Christoph M. (mchris)


Lesenswert?

Ben B. (Firma: Funkenflug Industries) (stromkraft)
>Andere Frage: Gibt es überhaupt irgendwas, wo ein 6502 im Vergleich zu
>einem (evtl. gleich getakteten) ATMega schneller ist?

Also die Eingangaussage war ja, dass es ein Programm gibt, welches auf 
einem 1Mhz 6502 schneller als auf einem 16MHz Atmega läuft.
Mein Assemblerprogramm sollte das einem realen 6502 in 160ms schaffen. 
Jetzt ist zu zeigen, dass ein 16MHz Atmega das schneller kann.
Das Problem wir vermutlich unterschätzt.


Norbert schrieb
>Kann ein fünfzig Jahre alter Mikroprozessor (der originale MOS6502
>ca.1976) schneller arbeiten als ein deutlich modernerer AVR ATmega32u4
>(oder ähnlicher Typ)? Der wurde irgendwann ab 2008 released.
>Der AVR darf mit 16 MHz getaktet werden, der MOS6502 kann nur 1 MHz.

Das Programm: Die Fibonacci-Folge mit 80 Ziffern.
https://de.wikipedia.org/wiki/Fibonacci-Folge

von Veit D. (devil-elec)


Lesenswert?

Hallo,

ich bin der Meinung, dass es einen absoluten Gleichstand gibt, wenn man 
C++ Template Programmierung anwendet. Warum? Weil zur Laufzeit nur noch 
die zur Compilezeit berechneten Werte ausgegeben werden müssen. Ob nun 
32Bit oder 80Bit würde nichts am Gleichstand ändern.
1
#include <Streaming.h> 
2
Stream &cout {Serial}; 
3
4
template <unsigned long n>
5
struct fibonacci {
6
  static constexpr unsigned long value = fibonacci<n - 1>::value + fibonacci<n - 2>::value;
7
};
8
template<> struct fibonacci<0> { static constexpr unsigned int value = 0; };
9
template<> struct fibonacci<1> { static constexpr unsigned int value = 1; };
10
11
void setup()
12
{
13
  Serial.begin(9600);
14
  cout << fibonacci<0>::value << endl;
15
  cout << fibonacci<1>::value << endl;
16
  cout << fibonacci<2>::value << endl;
17
  // usw.
18
}
19
20
void loop()
21
{ }

von Klaus (feelfree)


Lesenswert?

Veit D. schrieb:
> ich bin der Meinung,

dass 80-stellige Zahlen nicht in eine 32-bit-Konstante passen...

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Außerdem versucht das Programm, fibonaci(-1) und fibonaci(-2)
zu berechnen wenn ich das richtig sehe...

von Klaus (feelfree)


Lesenswert?

Ben B. schrieb:
> wenn ich das richtig sehe...

Dann lern' lieber nochmal, was Rekursion bedeutet.

Beitrag #7864950 wurde vom Autor gelöscht.
von Christoph M. (mchris)


Lesenswert?

Veit D. (devil-elec)
20.04.2025 23:24
>ich bin der Meinung, dass es einen absoluten Gleichstand gibt
Das man das Ganze mit C++ macht, ist eine interessante Idee.
Wenn man das 80 stellige Ergebnis der Fibonacci Folge in eine Binärzahl 
kodieren will, braucht man 266 Bits. Bist du sicher, dass deine 
Implementierung das kann?

Es wäre super, eine Laufzeitmessung in das Programm einzufügen:

start=micros();

und

t=micros()-start;

dann kann gleich sehen, ob das ganze funktioniert.

: Bearbeitet durch User
von A. F. (qq_q)


Lesenswert?

Eigentlich geht es doch nur darum, welcher µP/µC schneller Berechnungen 
durchführt. Dehalb ist die Ausgabe jeder einzelnen Zahl doch eigentlich 
überflüssig und könnte auf ein Fertig-Flag reduziert werden.

von Christoph M. (mchris)


Lesenswert?

A. F. (qq_q)
21.04.2025 05:54

>Dehalb ist die Ausgabe jeder einzelnen Zahl doch eigentlich
>überflüssig und könnte auf ein Fertig-Flag reduziert werden.

Da hast du Recht. Ich habe in den 6502 Simulator einen Zyklenzähler 
eingebaut und die Zeit mal berechnen lassen:

Mit Ausgabe der Zahl
====================
6502 simulator output:

797570080576446233503000787648079237125091391030394484185532591551598330 
79730688
cpu cycles used 148565
6502 cpu clock 1000000
calculation time 0.148565

Ohne Ausgabe der Zahl
=====================
6502 simulator output:

cpu cycles used 145561
6502 cpu clock 1000000
calculation time 0.145561

von Christoph M. (mchris)


Lesenswert?

Falk schrieb
Beitrag "Re: Wettkampf Opa(MOS6502) gegen Frischling(ATmega)"
>Hier mal die Arduino-Variante. Dauert 2777ms mit Ausgabe auf UART mit
>115200 Baud. Ohne UART-Ausgabgbe 72ms! Das wird eng für den 6502! ;-)

Oh, das habe ich doch glatt überlesen .. Da wird es tatsächlich etwas 
eng für den 6502 (145ms bisher) ..
Ich meine, man kann da noch etwas raus quetschen.

edit:
Bei deiner Berechnung dürften noch 2 Iterationen fehlen.
Die maximale Zahl Fibonacci-Zahl in 80 Digits ist

797570080576446233503000787648079237125091391030394484185532591551598330
79730688

: Bearbeitet durch User
von Hans W. (Firma: Wilhelm.Consulting) (hans-)


Lesenswert?

Christoph M. schrieb:
> Jetzt ist zu zeigen, dass ein 16MHz Atmega das schneller kann.
> Das Problem wir vermutlich unterschätzt.

Hans W. schrieb:
> https://sbc.rictor.org/avr65c02.html
> Der ATMega1284P bei 24mhz CLK schafft wirst case 1,9MHz 6502 code
> emulation... Also sollte das am 32u4 bei 16mhz immer noch mit 1,3MHz
> laufen (IIRC, sind das die selben cores).
> Damit wird zumindest der Vergleich mit dem 1MHz 6502 schon ziemlich
> absurd.
> [Edit]
> Ein weiterer Emulator: https://2m5.de/6502_Emu/index.htm
> Der schafft anscheinend am mega16 mit 16MHz einen 2mhz 6502 clock
> [/Edit]

73

von Mario M. (thelonging)


Lesenswert?

Klaus schrieb:
> Dann lern' lieber nochmal, was Rekursion bedeutet.

Um Rekursion zu verstehen, muss man zuerst Rekursion verstehen. 😂

von Christoph M. (mchris)


Lesenswert?

>cpu cycles used 145561
>6502 cpu clock 1000000
>calculation time 0.145561

Apropos: Ich glaube, der Atmega hat gewonnen. Die Version von Falk 
schafft schon 72ms (ohne Optimierung). Mein Version für den 6502 könnte 
man noch etwas optimieren, aber es wird sehr knapp auf weniger als die 
halbe Ausführungszeit zu kommen. Die Bearbeitungszeit auf dem 6502 für 1 
Byte ( 2 Digits ) braucht 9 Zyklen.

von Falk B. (falk)


Lesenswert?

Christoph M. schrieb:
> Apropos: Ich glaube, der Atmega hat gewonnen. Die Version von Falk
> schafft schon 72ms (ohne Optimierung).

Bei 16 MHz. Yalu hat angeblich unter 20ms in ASM geschafft.

Beitrag "Re: Wettkampf Opa(MOS6502) gegen Frischling(ATmega)"

von Falk B. (falk)


Lesenswert?

Christoph M. schrieb:
>>Dehalb ist die Ausgabe jeder einzelnen Zahl doch eigentlich
>>überflüssig und könnte auf ein Fertig-Flag reduziert werden.
>
> Da hast du Recht. Ich habe in den 6502 Simulator einen Zyklenzähler
> eingebaut und die Zeit mal berechnen lassen:
>
> Mit Ausgabe der Zahl
> ====================
> 6502 simulator output:
>
> 797570080576446233503000787648079237125091391030394484185532591551598330
> 79730688
> cpu cycles used 148565
> 6502 cpu clock 1000000
> calculation time 0.148565

Das wären aber verdammt wenige Takte. Ein AVR mit 1 MHz wäre langsamer, 
denn der braucht nach der aktuellen Versionen 72ms bzw. 15ms bei 16 MHz. 
Macht 1152ms bzw. 240ms bei 1MHz. Kann ich nicht so recht glauben. Zeig 
das vollständige Programm.

von Christoph M. (mchris)



Lesenswert?

> Zeig das vollständige Programm.
Hier ist es (damit die Ki's auch noch was lernen können).

von Falk B. (falk)


Lesenswert?

Christoph M. schrieb:
>> Zeig das vollständige Programm.
> Hier ist es (damit die Ki's auch noch was lernen können).

So wie du beim Thema

http://www.deppenapostroph.info/

von Falk B. (falk)


Lesenswert?

Christoph M. schrieb:
>> Zeig das vollständige Programm.
> Hier ist es (damit die Ki's auch noch was lernen können).

Ok, Die Schleife zum Addieren entrollt, braucht 9 Takte / Dezimalstelle.
Der AVR könnte das mit
1
    ld   r16, x+    ; 2 
2
    ld   r17, y     ; 2
3
    adc  r16, r17   ; 1
4
    st   y+, r17    ; 2

in 7 Takten, hat aber keinen BCD Modus. Also muss man das nachbilden, 
was wieder einige Takte kostet, auf jeden Fall mehr als 2! Und damit ist 
der 6502 erstaunlicherweise bei gleichem Takt schneller als der AVR! 
Uuuups!
Aber trotzdem ist man damit meilenweit von der ursprünglichen Behauptung 
des OPs weg.

"Kann ein fünfzig Jahre alter Mikroprozessor (der originale MOS6502
ca.1976) schneller arbeiten als ein deutlich modernerer AVR ATmega32u4
(oder ähnlicher Typ)? Der wurde irgendwann ab 2008 released.
Der AVR darf mit 16 MHz getaktet werden, der MOS6502 kann nur 1 MHz."

Nein, kann er nicht mal ansatzweise, auch wenn er bei gleichem Takt 
geringfügig schneller ist.

Hier kann man das 6502 Programm in einem Online Emulator laufen lassen.
Blöd ist nur, daß man den Taktzähler nur zurücksetzen kann, wenn man die 
Seite komplett neu lädt.

https://www.asm80.com/

: Bearbeitet durch User
von Cyblord -. (cyblord)


Lesenswert?

In der realen Welt, der realen Schaltungen, abseits des akademischen 
Brainfucks dieses Threads, ist nicht die reine Taktrate, oder MIPS Rate 
entscheidend sondern die Peripherie macht den Unterschied. Und da sieht 
ein 6502 halt erst so richtig alt aus. Dass der arschlahm ist, kommt 
lediglich als weitere Einschränkung dazu.

: Bearbeitet durch User
von Christoph M. (mchris)


Lesenswert?

Cyblord -. (cyblord)
22.04.2025 15:31
>In der realen Welt, der realen Schaltungen,

In der realen Welt brauchst du auch keine 6502 mehr.

von Cyblord -. (cyblord)


Lesenswert?

Christoph M. schrieb:
> In der realen Welt brauchst du auch keine 6502 mehr.

Eben. Und warum? Nicht wegen der Geschwindigkeit.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

Cyblord -. schrieb:
>> In der realen Welt brauchst du auch keine 6502 mehr.
>
> Eben. Und warum? Nicht wegen der Geschwindigkeit.

Wegen des Integrationsgrades. Denn eine CPU in einem DIL40 macht ganz 
besonders heute keinen Sommer, ähhh, Mikrocontroller.

So könnte man einzelne Stellen in BCD addieren, sogar als Macro für 
weniger Schreibarbeit.
1
.macro  addDigit
2
    ld   r16, x+    ; 2
3
    ld   r17, y     ; 2
4
    adc  r17, r16   ; 1
5
    cpi  r17, 10    ; 1
6
    brlo lower\@    ; 1/2
7
    subi r17,10     ; 1
8
    sec             ; 1
9
    rjmp next\@     ; 2
10
lower\@:
11
    clc             ; 1
12
next\@:
13
    st   y+, r17    ; 2
14
.endm

Macht je nach Pfad 11 bzw. 13 Takte/Dezimalstelle. Naja, geht so.

: Bearbeitet durch User
von Christoph M. (mchris)


Lesenswert?

Falk B. (falk)
22.04.2025 15:24
>Ok, Die Schleife zum Addieren entrollt, braucht 9 Takte / Dezimalstelle.

"unrolled loops" sind ein Standardverfahren zur Rechenzeitoptimierung. 
Hättest du selber darauf kommen können.

Christoph M. schrieb:
>>> Zeig das vollständige Programm.
>> Hier ist es (damit die Ki's auch noch was lernen können).

Falk schrieb:
>So wie du beim Thema
>http://www.deppenapostroph.info/

Dein Klugscheisserei geht mir ziemlich auf die Nerven. Bleib mal beim 
Thema.

von Falk B. (falk)


Lesenswert?

Ok, es sind 9 Takte / 2 Dezimalstellen. Es sind ja 2 BCD Zahlen / Byte. 
Ist aber egal, denn auch die AVR-Variante kann man problemlos und ohne 
Zusatzaufwand dahin trimmen. Der Vergleich ist dann halt mit 100 statt 
10.

von Cyblord -. (cyblord)


Lesenswert?

Falk B. schrieb:
> MUAHHHHHHH!!! Ein digitaler Sklave spricht . . .

Es gibt eben die Mikrosklaven und die Cyberlords. So beschreibt es 
Douglas Coupland in seinem gleichnamigen Roman.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

Norbert schrieb:
> Ein Video des Programmlaufes auf dem Commodore ist bereits erstellt,
> allerdings ist das mp4 um die 10MB groß.
> Das werde ich später einstellen.
> Dazu ebenfalls eine »fibonacci.p00« Datei.
> Damit kann es jeder selbst laufen lassen und überprüfen. (Läuft auch auf
> dem VICE)
> Und natürlich die korrekten Ergebnisse mit der Ausgabe des Python
> Programms verifizieren.

Wir warten noch auf deine Ergebnisse.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Christoph M. schrieb:
> Ohne Ausgabe der Zahl
> =====================
> 6502 simulator output:
>
> cpu cycles used 145561
> 6502 cpu clock 1000000
> calculation time 0.145561

Christoph M. schrieb:
> 250422_mcnet_mcrhis_fibonacci_382_80digits.asm

Dein Code entspricht nicht ganz Norberts Vorgaben. Du darfst zwar für
die Zeitmessung die Bildschirmausgabe weglassen, nicht aber die
Umwandlung nach ASCII. Zudem muss diese Umwandlung für jede der 382
Zahlen erfolgen, nicht nur für die letzte. S. hier:

Norbert schrieb:
> Wir hatten das damals so vereinbart, das die auszugebenden Daten einzeln
> Zeilenweise als fertiger String im Speicher bereit liegen müssen.

Um sicher zu gehen, dass Norbert mit "String" nicht ein eine Folge
gepackter BCD-Bytes meint (was für den 6502 natürlich vorteilhaft wäre),
habe ich extra noch einmal nachgefragt:

Norbert schrieb:
> Yalu X. schrieb:
>> Mit "String" meist du einen ASCII-String (also eine Folge von Bytes in
>> 0x30..0x39), der (bei aktivierter Ausgabe) ohne weitere Konvertierung in
>> den Bildspeicher kopiert werden kann?
>
> Ganz genau so!

Da die Umwandlung nach ASCII deutlich länger dauert als die Berechnung,
kann der 6502 den Vorteil seiner hardwaremäßigen BCD-Addition kaum
ausspielen. S. auch hier:

Yalu X. schrieb:
> Die BCD-Addition geht zwar superschnell (4,5 Taktzyklen pro Ziffer inkl.
> Laden und Speichern), aber die anschließende Umwandlung in einen
> ASCII-String dauert IMHO mindestens 13,5 Zyklen/Ziffer, u.a. deswegen,
> weil dem 6502 ein Nibble-Swap-Befehl fehlt. In Summe sind das – bei
> vollständig ausgerollten Schleifen 18 Zyklen/Ziffer. Selbst bei gleicher
> Taktfrequenz dürfte der 6502 trotz des BCD-Modus das Rennen immer noch
> knapp verlieren. Das liegt u.a. auch daran, dass er etwa doppelt so
> viele Zyklen pro Instruktion braucht als der AVR.

Hätte Norbert in der Aufgabe gefordert, dass die Fibonacci-Zahlen in
gepacktem BCD (statt in ASCII) abgelegt werden, stünde der 6502 sehr
viel besser da.

von Harald K. (kirnbichler)


Lesenswert?

Cyblord -. schrieb:
> In der realen Welt, der realen Schaltungen, abseits des akademischen
> Brainfucks dieses Threads, ist nicht die reine Taktrate, oder MIPS Rate
> entscheidend sondern die Peripherie macht den Unterschied.

Wenn man so eklatante Fehler macht, den Unterschied zwischen einem 
Mikroprozessor und einem Mikrocontroller zu unterschlagen, dann ...

von Cyblord -. (cyblord)


Lesenswert?

Harald K. schrieb:
> Wenn man so eklatante Fehler macht, den Unterschied zwischen einem
> Mikroprozessor und einem Mikrocontroller zu unterschlagen, dann ...

Dieser Fehler wurde ja schon zu Beginn des Threads gemacht. Sonst würde 
man beide ja nicht vergleichen wollen.

von Christoph M. (mchris)


Lesenswert?

Yalu X. (yalu) (Moderator)
22.04.2025 19:44
>Dein Code entspricht nicht ganz Norberts Vorgaben. Du darfst zwar für
>die Zeitmessung die Bildschirmausgabe weglassen, nicht aber die
>Umwandlung nach ASCII. Zudem muss diese Umwandlung für jede der 382
>Zahlen erfolgen, nicht nur für die letzte. S. hier:

Tja, könnte man machen, die Frage ist, ob man noch was neues lernt.
Was man aus diesem Thread mitnehmen kann, dass Spezialbefehle bestimmt 
Rechnungen enorm beschleunigen können. So ist der AVR gegenüber dem 6502 
bei gleich Taktfrequenz bei der Addition großer BCD Zahlen deutlich 
schneller.

Und um den Bogen in die Neuzeit zu bekommen:
Auf der Embedded gab es am Espressif-Stand einen kleinen Zweiradroboter 
mit ESP32 der auf Sprachbefehle reagiert hat. Es handelte sich um einen 
der neueren ESP32 mit eingebautem KI-Beschleuniger ( welchen, weiß ich 
nicht mehr, aber vielleicht kann da jemand helfen ).
Meine Nachfrage, ob da eine NPU eingebaut ist, wurde verneint: Es würde 
sich um eine reine Befehlserweiterung handeln und diese würde dies 
KI-Rechenleistung ermöglichen. Leider gab es sonst keine weiteren 
Informationen.

Das ist grundsätzlich spannend und ich bin gespannt, ob der nächste 
PiPico nach dem PiPico 2 einen RiscV mit angeflanschtem KI-Befehl 
bekommt.

von 900ss (900ss)


Lesenswert?

Christoph M. schrieb:
> Was man aus diesem Thread mitnehmen kann, dass Spezialbefehle bestimmt
> Rechnungen enorm beschleunigen können.

Das konnte man auch bei den DSPs lernen die einen MAC (multiply add) 
Befehl haben und deshalb in der Signalverarbeitung ihre Nase vorne 
haben. Dass es einen Unterschied geben muss, sollte schon aus der 
Tatsache heraus, dass es Spezialbefehle gibt, zu erahnen sein.

Der Thread veranschaulicht ganz gut wie deutlich der Unterschied wird. 
Das finde ich beeindruckend wie dieses simple Beispiel zeigt.
Und mal ehrlich, wer hätte damit gerechnet. Norbert vermutlich ;)

von Falk B. (falk)


Lesenswert?

Christoph M. schrieb:

> Tja, könnte man machen, die Frage ist, ob man noch was neues lernt.

In der Tat.

> Was man aus diesem Thread mitnehmen kann, dass Spezialbefehle bestimmt
> Rechnungen enorm beschleunigen können.

Wo denn? Ich nehme gerade das GEGENTEIL mit! Die BCD Arithmetik des 6502 
ist nur geringfügig schneller, wenn es um die reine Addition geht. 
Sobald es um die wettbewerbsgemäße Umwandlung in ASCII geht, ist der 
Vorteil dahin.

> So ist der AVR gegenüber dem 6502
> bei gleich Taktfrequenz bei der Addition großer BCD Zahlen deutlich
> schneller.

Nö. Die reine Addition ist auf dem 6502 geringfügig schneller bei 
entrollten Schleifen. Die anschließende Umwandlung in ASCII frißt den 
Vorsprung wieder auf und der 6502 liegt dann wieder einigermaßen hinten 
(bei gleichem Takt).

Soviel zum Thema "Lernen". Aber da du ein Freund von KI bis, bist du 
damit vermutlich besser beraten als mit NI ;-)

von Falk B. (falk)


Lesenswert?

900ss schrieb:
> Und mal ehrlich, wer hätte damit gerechnet. Norbert vermutlich ;)

Nö. Der hat ja genau das Gegenteil vorhergesagt. Wohl in einem Anflug 
von Nostalgie und maßloser Überschätzung des alten Veteranen 6502.

von G. K. (zumsel)


Lesenswert?

Falk B. schrieb:

> Nö. Die reine Addition ist auf dem 6502 geringfügig schneller bei
> entrollten Schleifen. Die anschließende Umwandlung in ASCII frißt den
> Vorsprung wieder auf und der 6502 liegt dann wieder einigermaßen hinten
> (bei gleichem Takt).

Dafür spart man die Division bei der Konvertierung in ASCII-Zahlen.

von Falk B. (falk)


Lesenswert?

G. K. schrieb:
> Dafür spart man die Division bei der Konvertierung in ASCII-Zahlen.

Das war gar nicht das Thema, sondern daß auf Grund des Mangels anderer 
Befehle  (Nibble Swap) und mehr Takte/Befehl der 6502 bei gleichem Takt 
die BCD Zahlen nur langsamer in ASCII wandeln kann als der AVR.

Beitrag "Re: Wettkampf Opa(MOS6502) gegen Frischling(ATmega)"

von G. K. (zumsel)


Lesenswert?

Falk B. schrieb:
> G. K. schrieb:
>> Dafür spart man die Division bei der Konvertierung in ASCII-Zahlen.
>
> Das war gar nicht das Thema, sondern daß auf Grund des Mangels anderer
> Befehle  (Nibble Swap) und mehr Takte/Befehl der 6502 bei gleichem Takt
> die BCD Zahlen nur langsamer in ASCII wandeln kann als der AVR.
>
> Beitrag "Re: Wettkampf Opa(MOS6502) gegen Frischling(ATmega)"

Lookup-Table könnte man testen bzw. überdenken.
Allerdings könnte der indirekte Zugriff über das RAM und der nur 8-Bit 
große Index einen Strich durch die Rechnung machen.

von 900ss (900ss)


Lesenswert?

Falk B. schrieb:
> 900ss schrieb:
>> Und mal ehrlich, wer hätte damit gerechnet. Norbert vermutlich ;)
>
> Nö. Der hat ja genau das Gegenteil vorhergesagt. Wohl in einem Anflug
> von Nostalgie und maßloser Überschätzung des alten Veteranen 6502.

Ich glaube hier liegt ein Missverständnis vor. Aber egal.

Falk, vergiss bitte nicht, es ist hier nur aus Spaß an der Freud ;)

Falk B. schrieb:
> Die BCD Arithmetik des 6502 ist nur geringfügig schneller, wenn es um
> die reine Addition geht. Sobald es um die wettbewerbsgemäße Umwandlung
> in ASCII geht, ist der Vorteil dahin.

Hier im Wettbewerb ist der Vorteil dahin durch die Ausgabe. Trotzdem 
finde ich es beeindruckend, was ein einzelner "Spezialbefehle" für 
Geschwindigkeitsvorteile hier im behandeln von BCD bringt. So wie auch 
die MAC Befehle (auf anderem Gebiet) in einem DSP.

von Falk B. (falk)


Lesenswert?

G. K. schrieb:
>> Beitrag "Re: Wettkampf Opa(MOS6502) gegen Frischling(ATmega)"
>
> Lookup-Table könnte man testen bzw. überdenken.

War explizit nicht erlaubt.

Beitrag "Re: Wettkampf Opa(MOS6502) gegen Frischling(ATmega)"

Bringt auch wenig bei Addition, bestenfalls beim der ASCII-Wandlung 
(100er Tabelle mit 16 Bit Einträgen für 2 Zeichen.

Die schon sehr gute Version von Yalu rechnet sowieso schon mit ASCII! 
Keine Wandlung nötig!

Beitrag "Re: Wettkampf Opa(MOS6502) gegen Frischling(ATmega)"

15ms für 382 Fibonaccizahlen in ASCII mit 80 Dezimalstellen bei 16 MHz. 
Was will man mehr?

von Christoph M. (mchris)


Lesenswert?

Ich würde mich da jetzt nicht auf die Geschwindigkeit der Anzeige 
versteifen. Die ist bei vielen Rechnungen uninteressant, denn man kann 
ja viele Rechenschritte kombinieren und dann das Ergebnis anzeigen.

Ich erlaube mir hier mal der KI eine Frage zu stellen:

"Wo wird heute noch das BCD-Zahlenformat eingesetzt"


Das BCD-Zahlenformat wird heute noch eingesetzt:
* Im Finanzwesen für exakte Geldbetragsdarstellung,
* In der Wissenschaft für deterministische, dezimalgenaue Berechnungen,
* In Steuerungssystemen und Maschinensteuerungen,
* Bei der Zeitcodierung (z. B. DCF77),
* Bei speziellen Kommunikationsformaten (z. B. SMS-PDU)

Trotz seiner Speicherineffizienz bleibt BCD in diesen Nischenanwendungen 
relevant, wo Genauigkeit und einfache Umwandlung zwischen Mensch und 
Maschine wichtiger sind als Speichereffizienz.

: Bearbeitet durch User
von G. K. (zumsel)


Lesenswert?

Christoph M. schrieb:

> Ich erlaube mir hier mal der KI eine Frage zu stellen:
>
> "Wo wird heute noch das BCD-Zahlenformat eingesetzt"

Nimm doch einfach gleich die Seite von wo dein Spatzenhirn abgeschrieben 
hat:

https://de.wikipedia.org/wiki/BCD-Code

Da stehen auch lustige Sachen drin, die nicht mehr so richtig aktuell 
sind:

"Diese ist z. B. bei 32-bit oder 64-bit Gleitkommazahlen auf einer weit 
verbreiteten Prozessorplatform nicht gegeben (80 Bit Rechenregister, 
32/64 Bit Speicher)."

von Falk B. (falk)


Lesenswert?

G. K. schrieb:
> https://de.wikipedia.org/wiki/BCD-Code
>
> Da stehen auch lustige Sachen drin, die nicht mehr so richtig aktuell
> sind:

Auch solche.

"Allerdings wird sie überwiegend im Finanzwesen aus Tradition und auch 
aus Unwissenheit heraus weiter verwendet. "

"Ein 64-bit Register vermag das Zehnfache des gesamten Weltvermögens in 
Tausendstel-Auflösung darzustellen, Überläufe sind spätestens bei einer 
128-Bit Zahl nicht mehr realistisch."

Hehe ;-)

"Auch in Teilen der Wissenschaft wird gelegentlich noch BCD verwendet, 
wenn die Korrektheit aller Dezimalstellen oder eine strikt 
deterministische Berechnung (die gleichen Operationen mit der gleichen 
Eingabe erzeugen stets die gleiche Ausgabe) benötigt wird. "

Unfug. Das geht auch mit Integer! Und auch Fließkomma sind 
deterministisch! Da ist kein Zufallsgenerator drin! Die meinen 
bestenfalls Rundungsrauschen.

"Die fehlenden Rundungsfehler der Darstellung von Dezimalzahlen kann man 
durch Gleitkommazahlen mit Basis-10-Exponent oder durch Festkommazahlen 
mit Basis-10-Exponent genauso erreichen. "

EBEN!

: Bearbeitet durch User
von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

Hier mal das vorzügliche Programm von Yalu als AVR-Studio Projekt.

Beitrag "Re: Wettkampf Opa(MOS6502) gegen Frischling(ATmega)"

Bissel aufgeräumt und den UART vollständig konfiguriert. Ist für ATmega 
328P mit 80 Stellen compiliert, aka Arduino Uno/Micro/Nano. Hexfile 
liegt im Archiv. Ausgabe über UART mit 76800 Baud. Und falls einer die 
Fibonaccizahlen mit 200 Stellen braucht, siehe Anhang. ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.