6502 Emulator

OP #6435018
Lesenswert?

Hallo,

bei der Suche nach einem MOS 6502 Emulator in C bin ich auf diese Seite 
gestoßen: https://www.piumarta.com/software/lib6502/

Ich habe die entsprechende C-Software und die Dokumentation des Emulator 
runter geladen und was soll ich sagen: ich war mehr als verdutzt, denn 
eine C-Software, die nahezu nur aus #define statements besteht, habe ich 
nach mehr als 20 Jahren Erfahrung in C noch nie zuvor gesehen.

Dann habe mir trotzdem die Mühe gemacht, diese im MS Visual Studio zu 
implementieren. Ich war umso mehr erstaunt, dass sie zwar mit ein paar 
Compiler-Warnungen daher kommt, jedoch ohne jeglichen Fehler erstellt 
wurde. Die dazu notwendigen .c und .h files, inkl. der Dokumentation 
sind im Anhang.

Jetzt meine Fragen:
- warum wird diese Form der Programmierung verwendet ?
- welche Vorteile soll diese Art der Programmierung bringen ?
- ist dies die übliche Syntax, um z.B. einen Compiler zu schreiben ?

Ach so: der Author ist Ian Piumarta, ein Professor an der Kyoto 
University of Advanced Science, der schon eine illustre Vita hat.
Angehängte Dateien:
#6435042
Lesenswert?

Manfred L. schrieb:
> runter geladen und was soll ich sagen: ich war mehr als verdutzt, denn
> eine C-Software, die nahezu nur aus #define statements besteht, habe ich
> nach mehr als 20 Jahren Erfahrung in C noch nie zuvor gesehen.

Hmm. Dann bei Gelegenheit mal beim Obfuscated C Code Contest 
vorbeischauen :)

> Jetzt meine Fragen:
> - warum wird diese Form der Programmierung verwendet ?

In dem Falle: um die Opcodes in einen Microcode zu überführen, den man 
dann wiederum sehr einfach ausführen kann.

> - welche Vorteile soll diese Art der Programmierung bringen ?

Der Microcode ist eine einfachere und generalisierte Art um die CPU zu 
simulieren, man muss so nicht jeden Opcode extra ausimplementieren (was 
insbesondere kompliziert wird wenn er über mehrere Takte geht). Und wenn 
man nicht den Precompiler dafür benutzt, muss man sich halt selber eine 
Methode überlegen wie man den Microcode zu jedem Opcode ablegt. Und 
warum sollte man das tun wenn es doch so auch geht? (Zumal man hinterher 
ja tatsächlich zu übersetzenden Code bekommt, der Compiler also auch 
nochmal kontrolliert ob man da Mist gebaut hat)

> - ist dies die übliche Syntax, um z.B. einen Compiler zu schreiben ?

Das ist kein Compiler, sondern ein Emulator :-) Keine Ahnung ob das 
üblich ist, aber ich halte es zumindest für keine blöde Idee. Einen 
Compiler würde ich so aber nicht schreiben, dafür gibt es bessere 
Mittel.
Gast #6435071
Lesenswert?

Manfred L. schrieb:
> - warum wird diese Form der Programmierung verwendet ?

Damals, als es kein Inlining in C gab, war das die Methode Funktionen so 
zu schreiben dass sie ge-inline-t wurden und sogar als 
template-Funktionen einsetzbar waren. Bestes Beispiel min und max aus 
Original C.

> - welche Vorteile soll diese Art der Programmierung bringen ?

Schnellere Ausführungszeiten, insbesondere da in diesem Programm die 
Inhalte der Funktionen, die OpCodes nachbilden, ja minimal kurz sind, 
der calling-overhead relevant werden würde.

> - ist dies die übliche Syntax, um z.B. einen Compiler zu schreiben ?

Nein, heute gibt es C++ und Templates und Inlining, da muss man nicht 
mehr so Unübersichtliches schreiben. Eventuell ist der code aber 
generiert worden, so dass keinen interessiert, ob er unübersichtlich 
ist.
Gast #6435084
Lesenswert?

>tcc run6502.c lib6502.c

>run6502.exe temp.bin
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
...

> im MS Visual Studio zu implementieren

Es geht auch einfacher wie man sieht.
Gast #6435217
Lesenswert?

> ergebnisorientierter

Du musst wohl Informatiker sein.

>>run6502.exe -l 1000 temp.bin -d 1000 +11 -x

"temp.bin" disassemblieren kann ich auch ohne run6502.
Siehe unten.

Scheinbar ist der Begriff "Emulator" dir noch fremd.
Das Ergebnis eines Emulatorlaufs ist regelmaessig eben
nicht ein Disassemblerlisting, sondern das, was
die emulierte CPU dabei an Aussenwirkung erzeugt.
In diesem Fall sind es die Ausgaben des ebenfalls
emulierten Teils des Betriebssystems, die obige
Ausgabe erzeugen.

Die Frage nach
> Intelligenter
stellt sich mir da gar nicht mehr.
1
ROM:0000                 LDX     #$41
2
ROM:0002
3
ROM:0002 loc_2:                                  ; CODE XREF: ROM:0009j
4
ROM:0002                 TXA
5
ROM:0003                 JSR     $FFEE
6
ROM:0006                 INX
7
ROM:0007                 CPX     #$5B
8
ROM:0009                 BNE     loc_2
9
ROM:000B                 LDA     #$A
10
ROM:000D                 JSR     $FFEE
11
ROM:0010                 BRK
12
ROM:0010 ; end of 'ROM'
13
ROM:0010
14
ROM:0010
15
ROM:0010                 .END

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren