/* * pico2tim.c PICO SLA16 Logic Analyzer wave data file * to SynaptiCAD WaveFormer tim file converter * Copyright(C)2001 by Kashi. * Mar.14/2001 Version 1.0 first edition */ #include #include #define VERSION "1.0" #pragma pack(1) struct tSigLabel { char label[6]; char dummy[46]; }; struct tAssign { char channel; char dummy[7]; }; struct tPICO { unsigned char id[4]; struct tSigLabel SigLabel[16]; struct tAssign Assign[16]; char dummy1[32], dummy2[2]; char clock, dummy3; long dummy4[13]; char dummy5[2], NofSigs, dummy6; long dummy7[21]; unsigned long data[8192]; }; main( int argc, char **argv) { FILE *fp, *fpo; struct tPICO pico; int i, j, pbit, cbit; long tick, cur; char path_buffer[_MAX_PATH]; char drive[_MAX_DRIVE]; char dir[_MAX_DIR]; char fname[_MAX_FNAME]; char ext[_MAX_EXT]; if( argc != 2 ){ fprintf( stderr, "pico SLA16 *.dat file to SympatiCAD tim file converter\n"); fprintf( stderr, "Version %s\n", VERSION); fprintf( stderr, "usage: pico2tim {pico_dat_file}\n"); exit(1); } if((fp = fopen( argv[1], "rb")) == NULL){ perror("pico2tim"); exit(1); } fread( &pico, sizeof(pico), 1, fp); if( (pico.id[0] != 0xff) || (pico.id[1] != 0xaa) || (pico.id[2] != 0x03) || (pico.id[3] != 0x70) ){ fclose(fp); fprintf( stderr, "not pico data file\n"); exit(1); } tick = (long)20 * (1 << pico.clock); _splitpath( argv[1], drive, dir, fname, ext ); _makepath( path_buffer, drive, dir, fname, "tim"); if((fpo = fopen( path_buffer, "w")) == NULL){ perror("pico2tim"); exit(1); } fprintf( fpo, "Timing Diagram Editor v5\n"); for(i = 0; i < pico.NofSigs; i++){ for(j = 0; j < 6; j++) if(pico.SigLabel[i].label[j] == 0x20) pico.SigLabel[i].label[j] = '_'; fprintf( fpo, "SIGNAL\t%s\n", pico.SigLabel[i].label); fprintf( fpo, "PROPS!\n"); cur = 0; pbit = 0; for(j = 0; j < 8192; j++){ if( pico.data[j] & (1 << pico.Assign[i].channel) ) cbit = 0; else cbit = 1; if( pbit != cbit){ fprintf( fpo, "E%d\t%d\t%ld000\t%ld000\t\t\n", j, cbit, cur, cur); } cur += tick; pbit = cbit; } fprintf( fpo, "!\n\n"); } fclose(fpo); fclose(fp); }