Guten Abend! Ich habe angefangen C zu lernen und benutze CodeBlocks mit GCC & SDL. Möchte ein RetroPC Emulator programmieren. Ich habe mehrere C-Dateien (cpu.c, video.c, memory.c u.s.w.) und mein Programm ist so aufgebaut das in cpu.c im Speicher geschrieben wird. Dafür benutze ich eine Funktion "void WriteToRAM(int addr,int byte)" die sich im memory.c befindet. Im video.c werden die Daten aus dem Speicher gelesen mittels "int ReadFromMemory(int addr)". Gibt es andere mögligkeiten sowas zu machen??? Ich glaube diese methode ist einfach zu langsam. Habe leider noch nicht so viel Ahnung von der richtige Programmiertechnik. MfG Dim
Ich würde nicht jedes Byte einzel schreiben. Das aufrufen der Funktion dauert dafür viel zu lang. Übertrage doch gleiche größere Blöcke.
Beim lesen für Video wird es klappen!!! Danke für Tipp! Aber wenn ein CPU läuft, der liest und schreibt nacheinander.. In dem Fall wird es (glaube ich) nicht funktionieren.
die meisten Emulatoren werden nicht ohne Grund teilweise in Assembler geschrieben. Ich weiss ja nicht wie weit du bist, aber für ein Emulator der auch noch schnell sein muss gehört eine ganze menge Optimierung. Hast du denn überhaupt schon mal die CPU ein wenig emuliert? Weil du dir schon gedanken über die Video ausgabe machst.
Wozu brauchst du die Funktion denn überhaupt? Da wird doch sonst auch nix weiter drinstehen, als sowas wie:
1 | zeigeraufspeicher[addr] = byte; |
Also entweder das direkt hinschreiben oder eine inline-Funktion bzw. ein Makro draus machen.
>> Hast du denn überhaupt schon mal die CPU ein wenig emuliert? Weil du dir >> schon gedanken über die Video ausgabe machst. Emulator läuft schon. CPU, Video und Tastatur funktionieren. >>>zeigeraufspeicher[addr] = byte; Soll ich einfach den Zeiger global definieren??? Habe schon mehrmals gelesen ... man soll globale Definitionen vermeiden
> void WriteToRAM(int addr,int byte)
Wenn du auf Geschwindigkeit aus bist, solltest du erst mal damit
anfangen die richtigen Datentypen zu benutzen.
Der Datentyp mit dem man Bytes beschreibt ist unsigned char und nicht
int. Du arbeitest auf einem PC, da wird ein int bei dir wahrscheinlich 4
Bytes gross sein und nicht 1 Byte.
D.h. bei der Zuweisung
memory[addr] = byte;
werden in Wirklichkeit 4 Bytes bewegt (wenn memory ebenfalls als array
of int definiert wurde). Damit macht dein Programm schon viel zu viel.
Adressen können per Definition nicht negativ sein. Wie gross ist
eigentlich der Speicher den du simulieren willst? Ist das ein 16 Bit
Adressraum oder ein 32 Bit Adressraum.
Je nachdem und je nach deinem Compiler ist der richtige Datentyp um eine
Adresse darzustellen entweder unsigned short oder unsigned int oder
unsigned long. Auf jeden Fall aber unsigned.
-> Fazit
Wenn du gerade erst angefangen hast zu programmieren, dann ist die
Emulation eines anderen Computers so ziemlich das ungünstigste Projekt,
welches du dir aussuchen konntest. Um so etwas zuverlässig und schnell
hinzukriegen muss man schon eine Menge in C können, ansonsten erleidet
man unweigerlich Schiffbruch. Gerade bei solchen Projekten muss man
nämlich die üblichen Richtlinien guten Programmierens des Öfteren mal
über Bord werfen um auf Speed zu kommen. Dafür sollte man einen kleinen
Sack schmutziger Tricks kennen, die zwar so ziemlich gegen alle guten
Programmierstile verstossen aber in diesem Gewerbe einfach unabdingbar
sind. Zb wird man die Schreibfunktion als MAKRO definieren, damit der
Funktionsoverhead wegfällt. Wenn man Block-Kopieren implementiert,
benutzt man zb 'Duffs Device' und schmutzige Casts um die HauptCPU dazu
zu bringen in einem Rutsch möglichst viele Daten zu bewegen, sofern
memcpy das nicht sowieso von sich aus erledigt.
Stell erst mal deine Datentypen richtig, so dass die CPU nicht unnötige
Zyklen einlegt und dann lebe mit der Geschwindigkeit. Und in etwa einem
Jahr holst du das Projekt wieder raus und arbeitest das ein, was du in
der Zwischenzeit gelernt hast.
@Karl heinz Buchegger Vielen Dank für Ihre Tipps! p.S. zu meinem Projekt: Ich habe bis jetzt immer so gelernt. nicht nur Programmierung. Einen Projekt ausgesucht und einfach gemacht. Schritt für Schritt. Einfach ein Buch lesen und versuchen zu verstehen ist zu langweilig. Aber! Wenn ich mit meinem "Emulator" fertig bin (hoffentlich) dann lerne ich sehr viel von C-Programmierung kennen. @all Nochmal herzlichen Dank für eure Unterstützung!
C Anfänger schrieb: > @Karl heinz Buchegger > > Vielen Dank für Ihre Tipps! Programmierer sind automatisch per Du. > p.S. > Einfach ein Buch lesen und versuchen zu verstehen ist zu langweilig. Du hast aber trotzdem hoffentlich eines daneben liegen. Ohne kommst du nämlich in den Zustand, dass du eine Menge Halbwissen ansammelst, das scheinbar nicht zusammenpasst. > Aber! Wenn ich mit meinem "Emulator" fertig bin (hoffentlich) dann lerne > ich sehr viel von C-Programmierung kennen. Nicht wirklich. Ein Emulator ist kein gutes Projekt zum lernen, was und vor allen Dingen wie man in C arbeitet. Ein gutes Projekt zum Überprüfen seiner Kenntnisse ist zb. ein Adressbuch. Da kommt alles vor: Arbeiten mit Strukturen Arbeiten mit Strings Arbeiten mit Files Arbeiten mit dynamischen Datenstrukturen Formatierte Ausgabe Robuste fehlertolerante Eingabe die wichtigsten Standardalgorithmen wie Suchen und Sortieren und wie einem die C-Library dabei helfen kann
>>Programmierer sind automatisch per Du. OK :) >>Du hast aber trotzdem hoffentlich eines daneben liegen. >>Ohne kommst du nämlich in den Zustand, dass du eine Menge Halbwissen >>ansammelst, das scheinbar nicht zusammenpasst. Habe ein Paar neben mir liegen! >>Ein Emulator ist kein gutes Projekt zum lernen, was und >>vor allen Dingen wie man in C arbeitet. Mein Emulator möchte ich trotzdem fertig machen. Habe noch eine Idee... ein Spiel zu programmieren. (Das soll ein Geburtstagsgeschenk sein!) Das mache ich aber später.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.