mikrocontroller.net

Forum: PC-Programmierung chip8 interpreter /emulator


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: gaosl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi ,
ich wollte einen chip8 interpreter umsetzen.
Dafür muss eine Hauptschleife immer einen neuen Befehl holen, dann 
decodieren und dann ausführen.
Die befehle sind in diesem Fall das Spiel. Allerdings weiß ich nicht 
genau wie ich die Befehle aus der Spieledatei auslesen muss. Denn wenn 
man eine .ch8 Datei mit dem Texteditor öffnet erscheinen da nur 
merkwürdige Zeichen.

Und kein Tutorial geht darauf so genau ein^^

Ich weiß nicht genau ob diese .ch8 dateien wirklich alle Befehle 
hintereinander gereiht haben. Dann könnte man einach immer 16 Bit 
auslesen und in ein Befehlregister reinschreiben.

Naja eigentlich könnte ich das ganze auch einfach testen,wenn ich meine 
Hauptschleife fertig programmiert habe und einfach die Datei einlese xD
Wollte aber trotzdem mal fragen was ihr darüber denkt ^^
Hier ein Link zu .ch8 Dateien.

https://www.zophar.net/pdroms/chip8/chip-8-games-pack.html
 // reading an entire binary file
#include <iostream>
#include <fstream>
using namespace std;

int main() {
  streampos size;
  char * memblock;

  ifstream file("Tetris.ch8", ios::in | ios::binary | ios::ate);
  if (file.is_open()) {
    size = 4;
    file.tellg();
    memblock = new char[size];
    file.seekg(0, ios::beg);
    file.read(memblock, size);
    file.close();
    for (int i = 0; i < size; i++) {
      cout << "\n" << memblock[i] << " :" << endl;
      for (int j = 7; j >= 0; j--) // or (int i = 0; i < 8; i++)  if you want reverse bit order in bytes
        cout << ((memblock[i] >> j) & 1);
    }
    cout << "\nthe entire file content is in memory";

    delete[] memblock;
  } else
    cout << "Unable to open file";
  return 0;
}

Autor: Atomkraft, warum nicht (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://devernay.free.fr/hacks/chip8/C8TECH10.HTM

> ich wollte einen chip8 interpreter umsetzen.

Wozu ein Tutorial?

Autor: foobar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich weiß nicht genau ob diese .ch8 dateien wirklich alle Befehle
> hintereinander gereiht haben.

Die Dateien enthalten die rohen RAM-Inhalt.  Sie werden an 0x200 geladen 
und auch da gestartet.

> Dann könnte man einach immer 16 Bit auslesen und in ein Befehlregister
> reinschreiben.

Du musst 2 Bytes ab der Adresse, auf die der PC zeigt, in dein 
"Befehlsregister" lesen und dann interpretieren.

Da Befehle und Daten beliebig gemischt sind, die Befehle immer 2 Bytes 
lang sind und auch an ungeraden Adressen liegen dürfen, ist ein 
Disassembler nicht mehr trivial.  Aber du willst ja nen Interpreter 
basteln, das ist einfacher ;-)

Autor: gaosl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antworten,
wenigstens bekomme ich so etwas Motivation :D

>Wozu ein Tutorial?

Ja ich habe eigentlich auch an mich selber den Anspruch durch einfaches 
Nachdenken das ganze umzusetzen.
Denn es geht ja da wahrscheinlich nur um das Prinzip  Fetch Decode 
Execute
Mal schauen^^ Danke nochmal für den Link

>Die Dateien enthalten die rohen RAM-Inhalt.  Sie werden an 0x200 geladen
>und auch da gestartet.

Dann werde ich das mal versuchen :D

Autor: gaosl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok , jetzt habe ich zwar schon eine Menge BEfehle abgetippt, aber bin 
mir noch sehr unsicher beim Einlesen aus einem "ROM-Game".
So sieht ein Inhat aus einem Test ROM aus:
 à¢ðe¢0a@0ÿ€€b cqÿÒr’ "&óqÿb Aÿ, î            €      À     ƒÀ    ?ÃÃÀ    ÿãÃÀ  ÿããÀ?€ 3ÿÃãÀÀÀ{àãàÿðààãàÿøàþáàñüð?ÿÁáàð|ð=ÿááàð>ð?ÿááàð>ð?óñáàðøùñáàðÿžÿóáàð>ÿóáàø>ÿ?ãÁàø<ÿÃÁà||<ÿƒÃà~|>? Ãà?ø> ÃÀø ÃÀð ‡ÀÀ ‡À   €   €                                

Eigentlich ist ein Befehl 2 Byte groß.
Wenn ich jetzt die ersten Bytes auslese, müsste ja ein bekannter Befehl 
auftauchen.
Bspw.:
https://www.rapidtables.com/convert/number/ascii-to-hex.html
12 02 20 e0 a2 01 f0 65 a2 30 61 40[\code]


Jetzt wollte ich mit Hilfe einer Textdatei einfach mal alle Befehle durchgehen, also einlesen.
Ich habe den ersten Befehl zu Test reingeschrieben:
0x00EE 
Mit diesem Code:
[code]ofstream file2("example.bin", ios::out | ios::binary | ios::ate);
  if (file2.is_open()) {
    file2 << 0b0000000011101110;
Wenn ich das dann aber auslese, werden die Nullen am Anfang ja einfach 
weggelassen.
Wenn ich dann den ersten Befehl (2 Byte) einlese erhalte ich : 
:11101110"irgendeinanderererOpcode !!"

ich würde aber gerne wieder 0b0000000011101110 erhalten, denn es geht ja 
um den Befehl 0x00EE , so erhalte ich aber nur 0xEE, was ja eigentlich 
schon das gleiche ist .
oh man .
Vielleicht hat jemand einen Denkanstoß :P

Autor: gaosl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm. 0x00 = 0b0000 0000 =

Autor: gaosl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gaosl schrieb:
> Hmm. 0x00 = 0b0000 0000 =

dort steht eigentlich NULNUL sein oder so ähnlich :,(
http://www.asciitable.com/

Autor: Larry (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum nimmst du nicht einfach C und dann ein simples fread?

Autor: gaosl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja kann ich auch mal testen , wenn das irgendwie irgendwas hilft :D

(habe auch gerade einfach 0x00EE in ein Array geladen, ok da würde es 
eigentlich sinn machen. Wenn ich weiß, dass ein Element 16 Bit groß ist, 
und der Inhalt EE ist, dann müsste es sich ja um 0x00EE handeln.)

Autor: foobar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> So sieht ein Inhat aus einem Test ROM aus: [ASCII-Müll]

Den Inhalt der ROMs als ASCII anzuzeigen ist Quatsch.  Schau dir das in 
Hex an, z.B. INVADERS:
00000000  12 25 53 50 41 43 45 20  49 4e 56 41 44 45 52 53  .%SPACE INVADERS
00000010  20 76 30 2e 39 20 42 79  20 44 61 76 69 64 20 57   v0.9 By David W
00000020  49 4e 54 45 52 60 00 61  00 62 08 a3 d3 d0 18 71  INTER`.a.b.....q
00000030  08 f2 1e 31 20 12 2d 70  08 61 00 30 40 12 2d 69  ...1 .-p.a.0@.-i
00000040  05 6c 15 6e 00 23 87 60  0a f0 15 f0 07 30 00 12  .l.n.#.`.....0..

Geladen wird das nach 0x200.  Disassembliert ergibt das:
00000200  12 25   JP  0x225
00000202  53 ...  "SPACE INVADERS v0.9 By David WINTER"
00000225  60 00   LD  V0,0x00
00000227  61 00   LD  V1,0x00
00000229  62 08   LD  V2,0x08
0000022b  a3 d3   LD  I,0x3d3
0000022d  d0 18   DRW V0,V1,8
...

> Wenn ich das dann aber auslese, werden die Nullen am Anfang ja einfach
> weggelassen.

Wenn zu zwei Bytes schreiben willst, dann tu das auch.

> Vielleicht hat jemand einen Denkanstoß

Eine allgemeine Programmiereinführung wäre dringend angebracht, danach 
eine für C oder C++ ...

Autor: Larry (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> testen

Da brauch man nichts testen.
fread ist genau dafuer da solchen Binaerkram unfallfrei zu lesen.

Autor: gaosl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank !
Denke mit den Antworten bin ich erst einmal gut beschäftigt !
:D

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.