www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit Pointern/Arrays


Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich versuche gerade einen C-6502 Emulator, der ursprünglich für DOS 
geschrieben war (in ANSI-C) mit gcc auf Linux zu compilieren, leider 
komme ich gerade nicht weiter...

Ich bekomme einen Segfault an folgender Stelle:
opcode = gameImage[PC++];

Die Variablen sind so angelegt:
WORD pc_reg = 0;
#define PC pc_reg
BYTE opcode;
WORD ist unsigned short, BYTE ist unsigned char.

Der Code sieht so aus:
void exec6502(int timerTicks)
{
   while (timerTicks > 0)  {
        printf("PC:%05d timerTicks:%d\n", PC, timerTicks);
        
      // fetch instruction
        opcode = gameImage[PC++];
      // execute instruction
        instruction[opcode]();

      // calculate clock cycles
        clockticks6502 += ticks[opcode];
        timerTicks -= clockticks6502;
        clockticks6502 = 0;
   }
}
Die exec6502() wird mit exec6502(1024); aufgerufen.

Ich hoffe ihr könnt mir dabei helfen, ich denke mal es fehlt nichts, 
kann aber noch sonst noch mehr Code Posten.

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und natürlich was vergessen...
BYTE *gameImage;

Autor: Andreas W. (geier99)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich schrieb:
> und natürlich was vergessen...
>
BYTE *gameImage;
> 

und wie wurde der Pointer initialisiert?
Es sieht für mich so aus, dass der Pointer auf einen falschen Bereich 
zeigt.

Bye
 Andi

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso, natürlich auch noch....

        for(i = 0; i < 1024; i++) {
                gameImage[i] = 0xEA;
        } 
0xEA ist ein gültiger Opcode, steht für NOP. Wenn ich nun die 
Fehlerhafte Zeile
opcode = gameImage[PC++];
Durch opcode = 0xEA; ersetze, dann rattert er komplett durch.

Autor: ()?():() (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Pointer läuft Amok oder wird da irgendwo Speicher 
(malloc/calloc/...) reserviert?

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich schrieb:
> gameImage[i] = 0xEA;

Hast du dafür überhaupt Speicherplatz besorgt?
Zeig doch mal die Wertbelegung von gameImage.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast immer noch nicht verraten, wo gameImage herkommt.

Autor: ich (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
>(malloc/calloc/...)
nichts...

Ich poste mal mehr Code, so hat das keinen Zweck:
#include <stdio.h>
#include "6502.h" 
WORD addrmask;  
BYTE *gameImage; 
extern void init6502();

int main() {    
        printf("linux 6502 emulator\n"); 
        printf("starting 6502 emulation...\n");
        init6502();  
        printf("loading opcode image\n");
        int i;     
        for(i = 0; i < 512; i++) {
                gameImage[i] = 0xEA;
        }   
        printf("size data image %d\n", sizeof(gameImage));      
        printf("exec.\n");
        exec6502(128);

        return(0);
}
Im Anhang die 6502.c, am unteren Ende ist die Funktion die spinnt.

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich schrieb:
> BYTE *gameImage;

ich schrieb:
> for(i = 0; i < 512; i++) {
>                 gameImage[i] = 0xEA;
>         }

Frage an dich: Auf welchen Speicher zeigt gameImage[0] ?

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke mal, dass es auf die Speicherstelle auf die der Pointer darauf 
zeigt. Aber das scheint wohl so nicht zu stimmen, nur komm ich gerade 
nicht ganz so mit...

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Floh schrieb:
> Frage an dich: Auf welchen Speicher zeigt gameImage[0] ?

Führe in nicht in die Irre; gameImage[0] ist doch gar kein Zeiger :-)

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich sehe nirgends eine Initialisierung für gameImage (was Floh wohl auch 
meinte).

Da hast du wohl ein malloc vergessen!

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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