#include #include #include #include "reloc.h" FILE *fdObj, *fdLbl, *fdHol, *fdBin; void findLabelAddress(char *label, char *buf); int openWriteDestFiles(char fileName[]) { char *fnObj = malloc(strlen(fileName)+4+1); char *fnLbl = malloc(strlen(fileName)+4+1); char *fnHol = malloc(strlen(fileName)+4+1); strcpy(fnObj, fileName); strcpy(fnLbl, fileName); strcpy(fnHol, fileName); strcat(fnObj, EXT_CODE); strcat(fnLbl, EXT_LABELS); strcat(fnHol, EXT_HOLES); fdObj = fopen(fnObj, "w"); fdLbl = fopen(fnLbl, "w"); fdHol = fopen(fnHol, "w"); return (fdObj!=NULL) && (fdLbl!=NULL) && (fdHol!=NULL); } int writeCode(int opcode, int op1, int op2, int op3) { char ins[4]; int currAddr; ins[0]=opcode & 0xFF; ins[1]=op1 & 0xFF; ins[2]=op2 & 0xFF; ins[3]=op3 & 0xFF; // TODO : est-ce bien propre ? Little ou big endian ? currAddr = (int) ftell(fdObj); fwrite(ins, sizeof(char), 4, fdObj); return currAddr; } void writeLabel(char *label) { fprintf(fdLbl, "0x%02x\t%s\n", (int)ftell(fdObj), label); } void writeHole(int holeAddr, char *label) { fprintf(fdHol, "0x%02x\t%s\n", holeAddr, label); } void closeDestFiles() { fclose(fdObj); fclose(fdLbl); fclose(fdHol); } /* int ftellCode(){ return ftell(fdObj); }*/ void linker(char fileName[], int baseAddress) // Génère le .bin a partir des .obj, .lbl, .hol { char *fnObj = malloc(strlen(fileName)+4+1); char *fnLbl = malloc(strlen(fileName)+4+1); char *fnHol = malloc(strlen(fileName)+4+1); char *fnBin = malloc(strlen(fileName)+4+1); strcpy(fnObj, fileName); strcpy(fnLbl, fileName); strcpy(fnHol, fileName); strcpy(fnBin, fileName); strcat(fnObj, EXT_CODE); strcat(fnLbl, EXT_LABELS); strcat(fnHol, EXT_HOLES); strcat(fnBin, EXT_EXEC); fdObj = fopen(fnObj, "r"); fdLbl = fopen(fnLbl, "r"); fdHol = fopen(fnHol, "r"); fdBin = fopen(fnBin, "w"); int holeAddr=0, i; char label[MAX_LABEL_LEN]; char buf; while ( fscanf(fdHol, "0x%02x\t%s\n", &holeAddr, label) == 2 ) { int targetAddr = ftell(fdObj); for(i=0; i