国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

查看: 5747|回復: 0
打印 上一主題 下一主題

GAL16V8反匯編源程序(原創)

[復制鏈接]
跳轉到指定樓層
樓主
發表于 2009-4-2 23:14:51 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
關鍵詞: 程序 , 匯編 , 原創
//菜農HotPower@126.com  2003.8.21 于雁塔菜地//GAL16V8反匯編源程序JED2ABEL.C
#include
#include
#include
#include
#include
#include
#include
#include
unsigned int getfusessum(unsigned char *str);
unsigned int getfusessum(unsigned char *str){
unsigned char ch;
unsigned int fusessum=0;
unsigned int i,j;
    for(i=0;i<275;i++){
       ch=0;
       for(j=0;j<8;j++){
          ch>>=1;
          if(*str++=='1') ch|=0x80;
       }
       fusessum+=ch;
    }
    return fusessum;
}
unsigned char getstrhex(unsigned char *str);
unsigned char getstrhex(unsigned char *str)
{
unsigned char ch=0;
unsigned int i;
    for(i=0;i<8;i++){
       ch<<=1;
       if(*str++=='1') ch++;
    }
    return ch;
}
main(int argc,char *argv[])
{
FILE *fp1,*fp2,*fp3;
unsigned int  x,y,z,i,j,k;
unsigned char *filename1,*filename2,*str,*ptr,*ctr,ch,ck;
unsigned char *p1=".jed",*p2=".pld";
unsigned long pccount,address=0,addressx=0;
unsigned char STX=0x02,ETX=0x03;
unsigned int SYN=2192,AC0=2193,XORN=2120;
unsigned char *buffer="Jed2Abel Version 3.01 Copyright (c) 1993,2008 HotPower";
unsigned char fuses[2200];
unsigned char outpins[]={2,1,3,19,4,18,5,17,6,14,7,13,8,12,9,11};//P16V8S
unsigned char outpinc[]={2,1,3,18,4,17,5,16,6,15,7,14,8,13,9,11};//P16V8C
unsigned char outpinr[]={2,19,3,18,4,17,5,16,6,15,7,14,8,13,9,12};//P16V8R
unsigned char *pinname[]={
              "P01     ",
              "P02     ",
              "P03     ",
              "P04     ",
              "P05     ",
              "P06     ",
              "P07     ",
              "P08     ",
              "P09     ",
              "GND     ",
              "P11     ",
              "P12     ",
              "P13     ",
              "P14     ",
              "P15     ",
              "P16     ",
              "P17     ",
              "P18     ",
              "P19     ",
              "VCC     "};
unsigned char *outpin;
unsigned int crc0=0,crc1=0;
unsigned int crcs0=0,crcs1=0;
unsigned int fusesum=0;
unsigned int pin;
    puts(buffer);
    if (argc<2 || argc>3) {
       puts("Syntax: Jed2Abel Jedfilename[.JED] [Abelfilename][.PLD]");
       exit(1);
    }
    filename1=(unsigned char*)calloc(64,sizeof(char));
    filename2=(unsigned char*)calloc(64,sizeof(char));
    str=argv[1];
    ptr=(argc==3) ? argv[2] : filename2;
    strcpy(filename1,str);
    strcpy(filename2,ptr);
    str=filename1;
    ptr=filename2;
    strlwr(str);
    strlwr(ptr);
    if(islower(*str)) *str^=0x20;
    if(islower(*str)) *ptr^=0x20;
    while (*str && (*str!='.')) str++;
    if (*str!='.') strcat(filename1,p1);
    if ((fp1=fopen(filename1,"rb+"))==NULL) {
       printf("Not found Jedfile:[");
       printf(filename1);
       puts("]");
       free(filename1);
       free(filename2);
       exit(1);
    }
    while(!feof(fp1) && (ch=fgetc(fp1))!=STX);
    if(ch!=STX){
       free(filename1);
       free(filename2);
       exit(1);
    }
    crc0=ch;
    while(!feof(fp1) && (ch=fgetc(fp1))!=ETX) crc0+=ch;
    crc0+=ch;
    if(ch==ETX){
       address=ftell(fp1);
       fscanf(fp1,"%04X",&crcs0);
    }
    if(crc0!=crcs0){//CRC出錯
       printf("MoveData_CRC Error!!!\r\n");
       if(ch==ETX){
          printf("OverWrite(Y/N)\n");
          ch=getch();
          printf("\r\n");
          if(ch=='Y' || ch=='y'){
         fseek(fp1,address,SEEK_SET);
         fprintf(fp1,"%04X",crc0);//強行改寫CRC錯誤!
          }
          else{
         free(filename1);
         free(filename2);
         exit(1);
          }
       }
       else{
          printf("OverWrite(Y/N)\n");
          ch=getch();
          printf("\r\n");
          if(ch=='Y' || ch=='y'){
         fseek(fp1,address,SEEK_SET);
         fprintf(fp1,"%04X",crc0);//強行改寫CRC錯誤!
          }
          else{
         free(filename1);
         free(filename2);
         exit(1);
          }
       }
    }
    rewind(fp1);
    while(!feof(fp1)){
       while(!feof(fp1) && fgetc(fp1)!='Q');
       if(!feof(fp1) && fgetc(fp1)=='F'){
          fscanf(fp1,"%04d",&fusesum);//QF2194
          break;
       }
    }
    if(feof(fp1) || fgetc(fp1)!='*' || fusesum!=2194){
       printf("No GAL16V8 JedFile!!!\n");
       printf("OverWrite(Y/N)\n");
       ch=getch();
       printf("\r\n");
       if(ch=='Y' || ch=='y'){
         rewind(fp1);
         fusesum=2194;//強行反匯編
       }
       else{
         free(filename1);
         free(filename2);
         exit(1);
       }
    }
    str=fuses;
    for(i=0;i<2200;i++) *str++='0';
    ck=0;
    while(!feof(fp1)){
       ch=fgetc(fp1);
       if(ch=='L' && ck==0x0a) break;
       ck=ch;
    }
    while(ch=='L'){
       address=ftell(fp1);
       pccount=0;
       while(!feof(fp1) && (ch=fgetc(fp1))>='0' && ch<='9'){
          pccount*=10;
          pccount+=ch&0x0f;
       }
       str=fuses+pccount;
       while(ch!='*'){
          if(ch=='1' || ch=='0'){
         *str++=ch;
         pccount++;
          }
          ch=fgetc(fp1);
       }
       addressx=ftell(fp1);
       while(!feof(fp1) && (ch=fgetc(fp1))!='L' && ch!='C' && ch!='V');
    }
    while(!feof(fp1) && ch=='V'){
        while(!feof(fp1) && (ch=fgetc(fp1))!='*' && (ch=fgetc(fp1))!='\n');
        ch=fgetc(fp1);
    }
    while(!feof(fp1) && ch!='C') ch=fgetc(fp1);
    if(ch=='C'){
        address=ftell(fp1);
        fscanf(fp1,"%04X",&crcs1);
    }
    str=fuses;
    crc1=getfusessum(str);
    if(crc1!=crcs1){
       printf("FusesData_CRC Error!!!\n");
       if(ch=='C'){
          printf("OverWrite(Y/N)\n");
          ch=getch();
          printf("\r\n");
          if(ch=='Y' || ch=='y'){
         fseek(fp1,address,SEEK_SET);
         fprintf(fp1,"%04X",crc1);
          }
          else{
         free(filename1);
         free(filename2);
         exit(1);
          }
       }
    }
    if (argc==2) {
       str=filename1;
       while (*str!='.') *ptr++=*str++;
       *ptr=0;
       strcat(filename2,p2);
    }
       else {
          while (*ptr && (*ptr!='.')) ptr++;
          if (*ptr==0) strcat(filename2,p2);
          else {
         ptr++;
         printf("Jed2Abel Abelfile:[");
         printf(filename2);
         printf("] (Y/N)?");
         ch=getch();
         printf("\r\n");
         if (ch=='Y' || ch=='y') {
            printf("Jed2Abel Convert (Y/N)?");
            ch=getch();
            printf("\r\n");
            if ((ch&=0x0df) !='Y') {
               fclose(fp1);
               free(filename1);
               free(filename2);
               exit(1);
            }
         }
         else {
            fclose(fp1);
            free(filename1);
            free(filename2);
            exit(1);
         }
          }
       }
    if (_chmod(filename2,1,0x20)==0x20) {
       printf("Overwrite existing Abelfile:[");
       printf(filename2);
       printf("] (Y/N)?");
       ch=getch();
       printf("\r\n");
       if ((ch&0x0df)!='Y') {
          fclose(fp1);
          free(filename1);
          free(filename2);
          exit(1);
       }
    }
    if ((fp2=fopen(filename2,"wt"))==NULL) {
       printf("Not open Abelfile:[");
       printf(filename2);
       puts("]");
       fclose(fp1);
       free(filename1);
       free(filename2);
       exit(1);
    }
    for(pin=0;pin<20;pin++){
       ctr=pinname[pin];
       while(*ctr && *ctr!=' ') ctr++;
       *ctr=0;
    }
    ptr=filename2;
    while(*ptr&&*ptr!='.') ptr++;
    ctr=ptr;
    *ctr++='.';//用戶定義管腳文件默認"*.PIN"
    *ctr++='P';
    *ctr++='i';
    *ctr++='n';
    *ctr=0;
    if ((fp3=fopen(filename2,"rt"))!=NULL){//用戶定義管腳文件"pldfilename.pin"
       while(!feof(fp3)){
          while(!feof(fp3) && (ch=fgetc(fp3))!='P');//只認大寫字母P
          pin=0;
          while(!feof(fp3) && (ch=fgetc(fp3))>='0' && ch<='9'){//只認數字管腳號
         pin*=10;
         pin+=ch&0x0f;
          }
          if(ch=='=' && pin>0 && pin<20){//P1=....P20=...
         ctr=buffer;
         while(!feof(fp3) && (ch=fgetc(fp3))!=';'){//每個管腳定義以分號;結尾
            *ctr++=ch;
         }
         *ctr=0;
         *(ctr+8)=0;
         if(ch==';'){
            ctr=buffer;
            strcpy(pinname[pin-1],ctr);//管腳定義名稱  P2=ABC;...P13=OUT;...
         }
          }
       }
       fclose(fp3);
    }
    else{
       if(fuses[SYN]=='0' && fuses[AC0]=='1'){
          strcpy(pinname[0],"Clk");
          strcpy(pinname[10],"OE");
       }
    }
    *ptr=0;
    ptr=filename2;
    str=filename1;
    while(*str&&*str!='.') str++;
    *str=0;
    str=filename1;
    printf("Jed2Abel ");
    printf(filename1);
    printf(" To ");
    puts(filename2);
    printf("Jed2Abel ConVert start, Please Wait...\r\n\r\n");
    rewind(fp2);
    fprintf(fp2,"module _%s\n",str);
    fprintf(fp2,"\ntitle 'Jed2Abel Version 3.01 Copyright (c) 1993,2008\n");
    fprintf(fp2,"       Jed2Abel JedFile:[%s.Jed]\n",str);
    fprintf(fp2,"       HotPower  1992.11.19'\n\n");
//fuses[SYN]=='0' && fuses[AC0]=='1' P16V8R
//fuses[SYN]=='1' && fuses[AC0]=='1' P16V8C
//fuses[SYN]=='1' && fuses[AC0]=='0' P16V8S
    if(fuses[SYN]=='1' && fuses[AC0]=='0'){
       fprintf(fp2,"       %s device 'P16V8S';\"Make JedFusesFile %s.Jed\n",ptr,ptr);
       printf(" %s.Jed device 'P16V8S';\n",ptr);
       outpin=outpins;
    }
    else{
       if(fuses[SYN]=='1' && fuses[AC0]=='1'){
          fprintf(fp2,"       %s device 'P16V8C';\"Make JedFusesFile %s.Jed\n",ptr,ptr);
          printf("%s.Jed device 'P16V8C';\n",ptr);
          outpin=outpinc;
       }
       else{
          if(fuses[SYN]=='0' && fuses[AC0]=='1'){
         fprintf(fp2,"       %s device 'P16V8R';\"Make JedFusesFile %s.Jed\n",ptr,ptr);
         printf("%s.Jed device 'P16V8R';\n",ptr);
         outpin=outpinr;
          }
       }
    }
    fprintf(fp2,"\n");
    for(pin=0;pin<9;pin++){
        if(pin) fprintf(fp2,",");
        fprintf(fp2,"%s",pinname[pin]);
    }
    fprintf(fp2," Pin ");
    for(pin=1;pin<10;pin++){
        if(pin>1) fprintf(fp2,",");
        fprintf(fp2,"%1d",pin);
    }
    fprintf(fp2,";\n");
    for(pin=10;pin<19;pin++){
        if(pin>10) fprintf(fp2,",");
        fprintf(fp2,"%s",pinname[pin]);
    }
    fprintf(fp2," Pin ");
    for(pin=11;pin<20;pin++){
        if(pin>11) fprintf(fp2,",");
        fprintf(fp2,"%2d",pin);
    }
    fprintf(fp2,";\n\n");
    y=0;
    for(x=0,pin=19;pin>=12;x++,pin--){
       if(fuses[SYN]=='0' && fuses[XORN+x]=='0') y++;
    }
    if(y){
       for(x=0,pin=18;pin>=11;x++,pin--){
          if(fuses[SYN]=='0' && fuses[XORN+x]=='0'){
         fprintf(fp2,"%s",pinname[pin]);
         if(--y) fprintf(fp2,",");
          }
       }
       fprintf(fp2," istype 'reg,pin';\n");
    }
    y=0;
    for(x=0,pin=19;pin>=12;x++,pin--){
       if(!(fuses[SYN]=='0' && fuses[XORN+x]=='0')) y++;
    }
    if(y){
       for(x=0,pin=18;pin>=11;x++,pin--){
          if(!(fuses[SYN]=='0' && fuses[XORN+x]=='0')){
         fprintf(fp2,"%s",pinname[pin]);
         if(--y) fprintf(fp2,",");
          }
       }
       fprintf(fp2," istype 'com';\n");
    }
    y=0;
    for(x=0,pin=18;pin>=11;x++,pin--){
//fuses[2048..2055]=1 pos;
//fuses[2048..2055]=0 neg;
       if(fuses[2048+x]=='1') y++;
    }
    if(y){
       for(x=0,pin=18;pin>=11;x++,pin--){
          if(fuses[2048+x]=='1'){
         fprintf(fp2,"%s",pinname[pin]);
         if(--y) fprintf(fp2,",");
          }
       }
       fprintf(fp2," istype 'pos';\n");
    }
    y=0;
    for(x=0,pin=19;pin>=12;x++,pin--){
       if(fuses[2048+x]=='0') y++;
    }
    if(y){
       for(x=0,pin=18;pin>=11;x++,pin--){
          if(fuses[2048+x]=='0'){
         fprintf(fp2,"%s",pinname[pin]);
         if(--y) fprintf(fp2,",");
          }
       }
       fprintf(fp2," istype 'neg';\n");
    }
    y=0;
    for(x=0,pin=19;pin>=12;x++,pin--){
       if(fuses[AC0]=='1' && fuses[XORN+x]=='1') y++;
    }
    if(y){
       for(x=0,pin=18;pin>=11;x++,pin--){
          if(fuses[AC0]=='1' && fuses[XORN+x]=='1'){
         fprintf(fp2,"%s",pinname[pin]);
         if(--y) fprintf(fp2,",");
          }
       }
       fprintf(fp2," istype 'eqn';\n");
    }
    fprintf(fp2,"\nH,L,X,Z,C,P=1,0,.X.,.Z.,.C.,.P.;\n");
    fprintf(fp2,"\nequations\n");
    for(x=0,pin=18;pin>=11;x++,pin--){
       str=fuses+x*32*8;
       ptr=str;
       y=0;
       z=0;
       k=0;
       for(i=0;i<32*8;i++){
          if(*ptr++=='0') y++;
          else z++;
       }
       if(z){
          for(i=0;i<8;i++){
         ptr=str+i*32;
         y=0;
         z=0;
         for(j=0;j<32;j++){
            if(*ptr++=='0') y++;
            else z++;
         }
         if(k==0){
            if(fuses[2048+x]=='0' && !(i==0 && fuses[AC0]=='1' && fuses[XORN+x]=='1')) fprintf(fp2,"!");
            else fprintf(fp2," ");
            fprintf(fp2,"%s",pinname[pin]);
         }
         if(i==0){
            if(fuses[AC0]=='1' && fuses[XORN+x]=='1'){
               fprintf(fp2,".oe =");
            }
            else k++;
         }
         else k++;
         if(k==1){
            if(fuses[SYN]=='0' && fuses[XORN+x]=='0') fprintf(fp2," :=");
            else fprintf(fp2," =");
         }
         if(y==0){
            if(k==0){
               fprintf(fp2," 1;\n");
            }
         }
         else{
            if(z==0){
               if(k==0){
              fprintf(fp2," 0;\n");
               }
            }
            else{
               if(k>1) fprintf(fp2,"\n     #");
               ptr=fuses+x*32*8;
               ptr+=i*32;
               z=0;
               for(j=0;j<32;j++){
              if(*ptr=='0'){
                 if(z) fprintf(fp2," &");
                 if(j&0x01) fprintf(fp2," !");
                 else fprintf(fp2," ");
                 y=j>>1;
                 fprintf(fp2,"%s",pinname[*(outpin+y)-1]);
                 z++;
              }
              ptr++;
               }
               if(k==0) fprintf(fp2,";\n");
            }
         }
          }
          if(k>1) fprintf(fp2,";\n");
       }
       else{
          fprintf(fp2,"\"%s =Input Pin\n",pinname[pin]);
       }
    }
    fprintf(fp2,"\nfuses \n");
    str=fuses;
    ch=getstrhex(str+2056);
//fuses[2056..2063] string
    fprintf(fp2," [2056..2063]=");
    if(ch==0) fprintf(fp2,"'';\n");
    else{
       if(ch>=' ') fprintf(fp2,"'%c';\n",ch);
       else fprintf(fp2,"^h%02X;\n",ch);
    }
    ch=getstrhex(str+2064);
    fprintf(fp2," [2064..2071]=");
    if(ch==0) fprintf(fp2,"'';\n");
    else{
       if(ch>=' ') fprintf(fp2,"'%c';\n",ch);
       else fprintf(fp2,"^h%02X;\n",ch);
    }
    ch=getstrhex(str+2072);
    fprintf(fp2," [2072..2079]=");
    if(ch==0) fprintf(fp2,"'';\n");
    else{
       if(ch>=' ') fprintf(fp2,"'%c';\n",ch);
       else fprintf(fp2,"^h%02X;\n",ch);
    }
    ch=getstrhex(str+2080);
    fprintf(fp2," [2080..2087]=");
    if(ch==0) fprintf(fp2,"'';\n");
    else{
       if(ch>=' ') fprintf(fp2,"'%c';\n",ch);
       else fprintf(fp2,"^h%02X;\n",ch);
    }
    ch=getstrhex(str+2088);
    fprintf(fp2," [2088..2095]=");
    if(ch==0) fprintf(fp2,"'';\n");
    else{
       if(ch>=' ') fprintf(fp2,"'%c';\n",ch);
       else fprintf(fp2,"^h%02X;\n",ch);
    }
    ch=getstrhex(str+2096);
    fprintf(fp2," [2096..2103]=");
    if(ch==0) fprintf(fp2,"'';\n");
    else{
       if(ch>=' ') fprintf(fp2,"'%c';\n",ch);
       else fprintf(fp2,"^h%02X;\n",ch);
    }
    ch=getstrhex(str+2104);
    fprintf(fp2," [2104..2111]=");
    if(ch==0) fprintf(fp2,"'';\n");
    else{
       if(ch>=' ') fprintf(fp2,"'%c';\n",ch);
       else fprintf(fp2,"^h%02X;\n",ch);
    }
    ch=getstrhex(str+2112);
    fprintf(fp2," [2112..2119]=");
    if(ch==0) fprintf(fp2,"'';\n");
    else{
       if(ch>=' ') fprintf(fp2,"'%c';\n",ch);
       else fprintf(fp2,"^h%02X;\n",ch);
    }
    fseek(fp1,addressx,SEEK_SET);
    while(!feof(fp1) && (ch=fgetc(fp1))!='V');
    y=1;
    *(buffer+20)=0;
    while(!feof(fp1) && ch=='V'){
        fscanf(fp1,"%04d",&pccount);
        while(!feof(fp1) && (ch=fgetc(fp1))!=' ');
        fprintf(fp2,"\ntest_vectors\"V%04d\n",y++);
        fscanf(fp1,"%20c",buffer);
        str=buffer;
        fprintf(fp2,"([");
        z=0;
        for(pin=0;pin<19;pin++){
           if(*str=='0' || *str=='1' || *str=='C' || *str=='P'){
          if(z) fprintf(fp2,",");
          fprintf(fp2,"%s",pinname][pin]);
          z++;
           }
           str++;
        }
        fprintf(fp2,"]->[");
        str=buffer;
        z=0;
        for(pin=0;pin<19;pin++){
           if(*str=='H' || *str=='L' || *str=='Z'){
          if(z) fprintf(fp2,",");
          fprintf(fp2,"%s",pinname][pin]);
          z++;
           }
           str++;
        }
        fprintf(fp2,"])\n");
        str=buffer;
        fprintf(fp2," [");
        z=0;
        for(pin=1;pin<=19;pin++){
           if(*str=='0' || *str=='1' || *str=='C' || *str=='P'){
          if(z) fprintf(fp2,",");
          if(*str=='0') fprintf(fp2," L ");
          else{
             if(*str=='1') fprintf(fp2," H ");
             else fprintf(fp2," %c ",*str);
          }
          z++;
           }
           str++;
        }
        fprintf(fp2,"]->[");
        str=buffer;
        z=0;
        for(pin=1;pin<=19;pin++){
           if(*str=='H' || *str=='L' || *str=='Z'){
          if(z) fprintf(fp2,",");
          fprintf(fp2," %c ",*str);
          z++;
           }
           str++;
        }
        fprintf(fp2,"];\n");
        while(!feof(fp1) && (ch=fgetc(fp1))!='V');
    }
    str=filename1;
    while(*str&&*str!='.') str++;
    *str=0;
    str=filename1;
    fprintf(fp2,"\nend _%s\n",str);
    free(filename1);
    free(filename2);
    fclose(fp1);


您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品国产麻豆福利在线 | 国产在线观看91精品2022 | 欧美啄木乌成人系列影片bt种子 | 一及黄色毛片 | 2022国内精品免费福利视频 | 国产片一级毛片视频 | 久久夜色精品国产噜噜小说 | 精品四虎 | 欧美日韩一区二区三区视频 | 国产微拍精品 | 日韩一区二区三区免费体验 | 花季传媒3.0.3每天免费3次 | 久久久久久久99久久久毒国产 | 日韩美香港a一级毛片 | 99热热热 | 羞羞视频免费网站在线看 | 老妇毛片久久久久久久久 | 久久精品99精品免费观看 | 成人免费在线观看网站 | 精品精品国产高清a毛片 | 日日日日日日日日日日 | www.欧美com| 亚洲高清视频在线播放 | 99热在线观看精品 | 精品福利一区二区三区 | 国产三级手机在线 | 国内久久久 | 国产一区二区免费播放 | 亚洲日韩中文字幕天堂不卡 | h成人口工动漫在线看网站 h成人动漫 | 97 在线播放| 天降奇兵国语高清在线观看 | 亚洲日本中文字幕一本 | 免费在线亚洲 | 国产黄色片在线免费观看 | 日韩第一色 | 人人亚洲 | 最新欧美精品一区二区三区 | 真实国产乱视频国语 | 大乳欲妇三级一区二区三区 | 国内外成人免费在线视频 |