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

查看: 5531|回復: 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
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费一级片在线观看 | 免费国产成人午夜私人影视 | 九九热视频这里只有精品 | 久久综合色之久久综合 | 日日操夜夜摸 | 久久99精品一级毛片 | www.精品视频 | 日韩精品中文字幕一区二区三区 | 另类专区另类专区亚洲 | 亚洲日本中文字幕在线 | 久久996热精品xxxx | 2022麻豆福利午夜久久 | 国产高清在线看免费视频观 | 午夜噜噜噜私人影院在线播放 | 国产无卡一级毛片aaa | 亚洲免费在线 | 国产麻豆一级在线观看 | 午夜向日葵在线视频观看下载 | 天天操综合网 | 男男羞羞视频网站免费 | 免费观看呢日本天堂视频 | 亚洲最色网站 | 国产精品亚洲专区无码不卡 | 国产一区二区三区免费播放 | 插插好爽爽爽啊 | 在线麻豆国产传媒60在线观看 | 四虎成人欧美精品在永久在线 | 成人欧美一区在线视频在线观看 | 老司机aⅴ在线精品导航 | 精品美女 | 日韩欧美亚洲精品 | 亚洲综合情 | 天堂va在线高清一区 | 国产三级精品三级在线专区91 | 91人成在线观看网站 | 午夜看片在线 | 黑人中文字幕在线精品视频站 | 国产高清在线精品一区a | 国产成人综合洲欧美在线 | 欧美成人中文字幕在线视频 | 色狠狠一区二区三区香蕉蜜桃 |