Forum: PC-Programmierung Schnell Speicher lesen/schreiben


von C Anfänger (Gast)


Lesenswert?

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

von Peter (Gast)


Lesenswert?

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.

von C Anfänger (Gast)


Lesenswert?

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.

von Peter (Gast)


Lesenswert?

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.

von Rolf Magnus (Gast)


Lesenswert?

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.

von C Anfänger (Gast)


Lesenswert?

>> 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

von Karl H. (kbuchegg)


Lesenswert?

> 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.

von C Anfänger (Gast)


Lesenswert?

@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!

von Karl H. (kbuchegg)


Lesenswert?

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

von C Anfänger (Gast)


Lesenswert?

>>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
Noch kein Account? Hier anmelden.