Forum: Mikrocontroller und Digitale Elektronik Problem mit Pointern/Arrays


von ich (Gast)


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:
1
opcode = gameImage[PC++];

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

Der Code sieht so aus:
1
void exec6502(int timerTicks)
2
{
3
   while (timerTicks > 0)  {
4
        printf("PC:%05d timerTicks:%d\n", PC, timerTicks);
5
        
6
      // fetch instruction
7
        opcode = gameImage[PC++];
8
      // execute instruction
9
        instruction[opcode]();
10
11
      // calculate clock cycles
12
        clockticks6502 += ticks[opcode];
13
        timerTicks -= clockticks6502;
14
        clockticks6502 = 0;
15
   }
16
}
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.

von ich (Gast)


Lesenswert?

und natürlich was vergessen...
1
BYTE *gameImage;

von Andreas W. (geier99)


Lesenswert?

ich schrieb:
> und natürlich was vergessen...
>
1
BYTE *gameImage;
2
>

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

Bye
 Andi

von ich (Gast)


Lesenswert?

Achso, natürlich auch noch....

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

von ()?():() (Gast)


Lesenswert?

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

von Floh (Gast)


Lesenswert?

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

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

von Klaus W. (mfgkw)


Lesenswert?

Du hast immer noch nicht verraten, wo gameImage herkommt.

von ich (Gast)


Angehängte Dateien:

Lesenswert?

>(malloc/calloc/...)
nichts...

Ich poste mal mehr Code, so hat das keinen Zweck:
1
#include <stdio.h>
2
#include "6502.h" 
3
WORD addrmask;  
4
BYTE *gameImage; 
5
extern void init6502();
6
7
int main() {    
8
        printf("linux 6502 emulator\n"); 
9
        printf("starting 6502 emulation...\n");
10
        init6502();  
11
        printf("loading opcode image\n");
12
        int i;     
13
        for(i = 0; i < 512; i++) {
14
                gameImage[i] = 0xEA;
15
        }   
16
        printf("size data image %d\n", sizeof(gameImage));      
17
        printf("exec.\n");
18
        exec6502(128);
19
20
        return(0);
21
}
Im Anhang die 6502.c, am unteren Ende ist die Funktion die spinnt.

von Floh (Gast)


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

von ich (Gast)


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

von Klaus W. (mfgkw)


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

von Klaus W. (mfgkw)


Lesenswert?

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

Da hast du wohl ein malloc vergessen!

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.