/***************************************************************** FERNANDO MORAES -- 04/MAIO/2000 - Programa que gera um arquivo HEX, para exibicao de barras coloridas no video VGA. - Formato da linha no arquivo hex (nao ha brancos) :[NBYTES][ENDERECO][00][bytes dos dados][chekcsum] - Exemplo: :1000000044882483448750FF2487448750FF2487F3 interpretacao: :10 0000 00 44882483448750FF2487448750FF2487 F3 -> 10H, significado 16 bytes de dados -> 0000H, significando endereco 0000H -> 00, significando campo de dados -> 32 caracteres, significando os 16 dados -> 73 eŽ o checksum - A ultima linha deve conter o delimitador de fim de arquivo :00000001FF *****************************************************************/ #include #include #include // IMPORTANTE: BYTES POR LINHA NO ARQUIVO HEX. Foram escolhidos 64 // bytes por linha, pois este valor corresponde a uma linha na imagem #define BLN 0x40 //***************************************************************** // imprime um hexa - SUPOE-SE HEXA ENTRE 0 E 255 //***************************************************************** void print_hex(FILE *F, int hex) { int i; char str[10]; sprintf(str,"%2x", hex); // COLOCA EM UMA STRING for(i=0; i<2; i++) if(str[i]==' ') fprintf(F,"0"); else fprintf(F,"%c", toupper((int)str[i])); } //***************************************************************** // gera o arquivo hexa //***************************************************************** int main() { FILE *p; int endereco=0, endH, endL, check, i,j, pt=0, cont=0, cor[4]; cor[0] = 0xFF; cor[1] = 0x55; cor[2] = 0xAA; cor[3] = 0x00; p=fopen("tt.hex","w"); // uma imagem completa, com 4 cores, tem 64 bytes por linha // e 480 linas, ou seja, 30720 bytes. for(i=0; i<30720/BLN; i++) { // PASSO 1: imprime o inicio do record e inicializa o checksum (soma) fprintf(p,":"); print_hex(p, (int) BLN); check = BLN; // PASSO 2: imprime o endereco o endereco e avanca BLN bytes endH = (int) endereco/ 256; endL = endereco - endH*256; endereco += BLN; print_hex(p, (int) endH); check += endH; print_hex(p, (int) endL); check += endL; // PASSO 3: imprime 0 tipo do record print_hex(p, (int) 0x00); // PASSO 4: imprime os BLN bytes da linha for(j=0; j3 ) pt=0; } fprintf(p,":00000001FF\n"); // FECHA O ARQUIVO puts("ok"); fclose(p); }