/* Funções necessárias: Ajuste de ponteiros: - Trasnformar <$xx> em xx na rom: Implementada Escreve na rom: - Insere DTEs (?) */ #include #include #define ROM_NAME "som.smc" #define DMP_FILE "dmp.txt" #define OFFSET 0x90216 typedef unsigned char byte; byte read,read_temp; // byte a ser lido e copiado int size; // tamanho da stream FILE *rom, // arquivo de entrada *dmp; // arquivo com os dados comprimidos int main() { int temp, pnt_table, ac_pos, dmp_pos, pnt_pos, i, x; char tabela[255], str_pnt[2], str_wrt[1], c; /* pnt_table: endereço na tabela de ponteiros; ac_pos: posição na rom, para alterar os ponteiros; dmp_pos: posição no texto, necessário para reduzir o número de leituras pnt_pos: posição do novo ponteiro temp, i, x, c: variáveis de trabalho; tabela: tabela pra converter ascii -> tabela do jogo str_pnt: string de ponteiro, usada pra se guiar nos [#XXX] str_wrt: string de leitura, usada para se guiar nos <$xx> */ rom=fopen(ROM_NAME, "r+b"); // abre arquivo de entrada if(!rom) { printf("Erro ao abrir \"%s\".", ROM_NAME); exit(1); } dmp=fopen(DMP_FILE, "r"); if(!dmp) { printf("Erro ao abrir \"%s\".", DMP_FILE); exit(1); } dmp_pos = 0; ac_pos = 0x90A9A; pnt_table = 0x90216; tabela[0x0A] = 0x7F; // LF (quebra de linha ou Line Feed) tabela[0x20] = 0x80; // espaço c = 0x81; // "a" a "z" for (i=0x61; i <0x7B; i=i+1) { tabela[i] = c; c++; } c = 0x9B; for (i=0x41; i<0x5B; i=i+1) // "A" a "Z" { tabela[i] = c; c++; } c = 0xB5; for (i=0x30; i<0x3A; i=i+1) { tabela[i] = c; c++; } // símbolos tabela[0x2E] = 0xBF; // . tabela[0x2C] = 0xC0; // , tabela[0x21] = 0xC1; // ! tabela[0x27] = 0xC2; // ' tabela[0x22] = 0xC3; // " tabela[0x3A] = 0xC5; // : tabela[0x2D] = 0xC6; // - tabela[0xC7] = 0xC7; // * tabela[0x21] = 0xC8; // ! tabela[0x26] = 0xC9; // & tabela[0x3F] = 0xCA; // ? tabela[0x28] = 0xCB; // ( tabela[0x29] = 0xCC; // ) /******** REQUER TESTE DE CÁLCULO DE POSIÇÃO DO DMP_POS!!!!!******* ********** FUNÇÃO QUE CALCULA O ENDEREÇO QUE DEVE ESCREVER ******** ********** CALCULA CERTO, MAS SEM TESTE PRÁTICO AINDA ************/ do{ fseek(dmp, dmp_pos, SEEK_SET); fread(&read, 1, 1, dmp); if (read == '[') { dmp_pos +=2; fseek(dmp, dmp_pos, SEEK_SET); fread(&str_pnt, 1, 3, dmp); pnt_pos = strtol(str_pnt, 0, 16); dmp_pos += 5; fseek(dmp, dmp_pos, SEEK_SET); x = (pnt_pos * 2) + 0x90216; pnt_pos = x; temp = ac_pos; temp -= 0x90000; x = (temp /0x100) - 2; i = temp - ((temp / 0x100) * 0x100); fseek(rom, pnt_pos, SEEK_SET); fwrite(&i, 1, 1, rom); fwrite(&x, 1, 1, rom); fseek(rom, ac_pos, SEEK_SET); } if(read == 0x3C) { dmp_pos +=2; fseek(dmp, dmp_pos, SEEK_SET); fread (&str_wrt, 1, 2, dmp); x = strtol(str_wrt, 0, 16); printf("%x",x); dmp_pos+= 2; fseek(rom, ac_pos, SEEK_SET); fwrite(&x, 1, 1, rom); ac_pos++; } else { fseek(rom, ac_pos, SEEK_SET); fwrite(&tabela[read], 1, 1, rom); ac_pos++; } dmp_pos++; } while((c = getc(dmp)) != EOF); printf("Arquivos alterados com sucesso!"); fclose(rom); fclose(dmp); getch(); exit(0); }