Forum: Compiler & IDEs 6502 Emulator


von Manfred L. (manni)


Angehängte Dateien:

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.

von Oliver S. (oliverso)


Lesenswert?

Warum ist es nachts kälter als draussen ?
Warum heißt das Huhn Huhn?

Die Antwort auf solch existenzielle Fragen lautet immer 42.

Oliver

von Hendrik L. (hlipka)


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.

von MaWin (Gast)


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.

von Larry (Gast)


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.

von Manfred L. (manni)


Lesenswert?

Larry schrieb:
>>run6502.exe temp.bin

Intelligenter und ergebnisorientierter geht es mit:

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

von Larry (Gast)


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

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.