home *** CD-ROM | disk | FTP | other *** search
/ FreeWare Collection 2 / FreeSoftwareCollection2pd199x-jp.img / ms_dos / p16torgb / p16torgb.c next >
Text File  |  1990-06-14  |  5KB  |  230 lines

  1. /* P16TORGB.C  V1.0L10    1989.05.06        last update    1989.05.07            */
  2. /*         programmed by MSどす                                            */
  3. /*        Towns-PAINTのP16ファイルをPC98のベタファイルに変換します                    */
  4. /*        コンパクト モデル で コンパイル しています                                */
  5.  
  6. #define XBYTE 320
  7. #define YDOTPC 400
  8. #define YDOTFM 480 
  9. #define TRUE 1
  10. #define FALSE 0
  11. #define HEAD 'H'
  12. #define BODY 'B'
  13. #define TAIL 'T'
  14. #define HLEN 134
  15.  
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18. #include <dir.h>
  19. #include <dos.h>
  20. #include <ctype.h>
  21.  
  22. char drive1[MAXDRIVE];
  23. char dir1[MAXDIR];
  24. char name1[MAXFILE];
  25. char ext1[MAXEXT];
  26. char drive2[MAXDRIVE];
  27. char dir2[MAXDIR];
  28. char name2[MAXFILE];
  29. char ext2[MAXEXT];
  30. char *exttbl[] = {".R1",".G1",".B1"};
  31.  
  32. int fnleng;
  33. char fname1[MAXPATH]="";
  34. char fname2[MAXPATH]="";
  35. int cnt,fseq;
  36. FILE *fin,*fout;
  37. unsigned char *rbuf,*rptr,*gbuf,*gptr,*bbuf,*bptr;
  38. unsigned char tbuf[XBYTE+1],*tptr,temp[10];
  39.  
  40. struct dfree ds;
  41.  
  42. main(int argc,char *argv[])
  43. {
  44.     int i,j,k,n;
  45.     unsigned long freearea;
  46.     unsigned char flg,w;
  47.  
  48.     if((argc==1)||(argc>4)){
  49.         abend(1);                /* パラメタのエラー */
  50.     }
  51.  
  52.     flg=TAIL;
  53.     for(i=1;i<argc;i++){
  54.         w=toupper(argv[i][1]);
  55.         if((argv[i][0] == '-')&&((w == HEAD)||(w == BODY)||(w == TAIL))){
  56.             flg=w;
  57.         }
  58.         else{
  59.             if(fname1[0]){
  60.                 strcpy(fname2,argv[i]);
  61.             }
  62.             else{
  63.                 strcpy(fname1,argv[i]);
  64.             }
  65.         }
  66.     }
  67.  
  68.     rbuf = (unsigned char *)malloc(80*400);    /*    出力バッファの確保 */
  69.     if (rbuf == NULL){
  70.         abend(2);                            /* メモリアロケーション エラー */
  71.     }
  72.     gbuf = (unsigned char *)malloc(80*400);
  73.     if (gbuf == NULL){
  74.         abend(2);
  75.     }
  76.     bbuf = (unsigned char *)malloc(80*400);
  77.     if (bbuf == NULL){
  78.         abend(2);
  79.     }
  80.     memset(rbuf,NULL,32000);
  81.     memset(gbuf,NULL,32000);
  82.     memset(bbuf,NULL,32000);
  83.  
  84.     fnsplit(fname1,drive1,dir1,name1,ext1);        /* ファイル名の組み立て */
  85.     fnmerge(fname1,drive1,dir1,name1,".P16");
  86.     
  87.     fnsplit(fname2,drive2,dir2,name2,ext2);
  88.     if(*drive2 == NULL)    {    strcpy(drive2,drive1);    }
  89.     if(*drive2 == NULL)    {
  90.         drive2[0]= 'A' + getdisk();
  91.         drive2[1]= ':';
  92.         drive2[2]= NULL;
  93.     }
  94.     if(*name2 == NULL)    {    strcpy(name2,name1);    }
  95.  
  96.     w = toupper(drive2[0]) - 'A' +1;
  97.     getdfree(w,&ds);
  98.     freearea=((unsigned long)ds.df_avail
  99.             * (unsigned long)ds.df_bsec
  100.             * (unsigned long)ds.df_sclus);
  101.     if(freearea < 96000L){
  102.         printf("ディスクの空き容量が %ld バイトしかありません\n",freearea);
  103.         abend(3);
  104.     }
  105.  
  106.     fin=fopen(fname1,"rb");                            /* P16 open */
  107.     if(fin==NULL){
  108.         printf("入力ファイルがOPEN出来ません(%s)\n",fname1);
  109.         abend(4);
  110.     }
  111.     printf("変換を開始します。\n");
  112.     n = fread(tbuf,1,HLEN,fin);
  113.     if(n < HLEN){                    /* ヘッダ情報部分カット */
  114.         abend(5);                    /* ファイルの読み込みに失敗 */
  115.     }
  116.     if(flg == HEAD){                /* 先頭部分カット */
  117.         for(i=0;i<80;i++){
  118.             n = fread(tbuf,1,XBYTE,fin);
  119.             if(n < XBYTE){
  120.                 abend(5);                /* ファイルの読み込みに失敗 */
  121.             }
  122.         }
  123.     }
  124.  
  125.     rptr=rbuf;
  126.     gptr=gbuf;
  127.     bptr=bbuf;
  128.     for(i=0;i<400;i++){                                /* 変換作業 */
  129.         n = fread(tbuf,1,XBYTE,fin);        /* 1ライン分のデータ読み込み */
  130.         if((flg == BODY) && (i%5 == 0)){    /* 均等にカット */
  131.             n = fread(tbuf,1,XBYTE,fin);    /* 縦480ドット->400ドット */
  132.         }
  133.         if(n < XBYTE){
  134.             abend(5);                /* ファイルの読み込みに失敗 */
  135.         }
  136.         for(j=0,tptr=tbuf;j<80;j++){
  137.             for(k=0;k<8;k += 2){
  138.                 temp[k] = *tptr & 0x07;
  139.                 temp[k+1] = ((*tptr++ & 0x70) >> 4);
  140.             }
  141.             for(k=0;k<8;k++){
  142.                 *bptr <<= 1;
  143.                 *bptr |= temp[k] & 1;
  144.                 temp[k] >>= 1;
  145.                 *rptr <<= 1;
  146.                 *rptr |= temp[k] & 1;
  147.                 temp[k] >>= 1;
  148.                 *gptr <<= 1;
  149.                 *gptr |= temp[k] & 1;
  150.             }
  151.             rptr++;
  152.             gptr++;
  153.             bptr++;
  154.         }
  155.         printf("☆");
  156.     }
  157.  
  158.     fclose(fin);
  159.     printf("\n変換作業終了。\n");
  160.  
  161.     printf("ベタファイルを書き込んでいます。しばらくお待ち下さい。\n");
  162.                                 /* char *exttbl[] = {".R1",".G1",".B1"};*/
  163.     for(i=0;i<3;i++){
  164.         fnmerge(fname2,drive2,dir2,name2,exttbl[i]);    /* BUFFER WRITE */
  165.         fout=fopen(fname2,"wb");
  166.         if(fout==NULL){
  167.             printf("出力ファイルが作れません(%s)\n",fname2);
  168.             abend(6);
  169.         }
  170.         switch(i){
  171.           case 0:
  172.             n = fwrite(rbuf,1,32000,fout);
  173.             break;
  174.           case 1:
  175.             n = fwrite(gbuf,1,32000,fout);
  176.             break;
  177.           case 2:
  178.             n = fwrite(bbuf,1,32000,fout);
  179.             break;
  180.           default:
  181.               abend(99);
  182.             break;
  183.         }
  184.         if(n<32000){
  185.             printf("ファイルの書き込みに失敗しました(%s)\n",fname2);
  186.             abend(7);
  187.         }
  188.         fclose(fout);
  189.     }
  190.     
  191.     free(rbuf);
  192.     free(gbuf);
  193.     free(bbuf);
  194.     printf("正常終了しました。\n");
  195. }
  196.  
  197. abend(no)
  198. int no;
  199. {
  200.     switch(no){
  201.       case 1:
  202.         puts("P16TORGB V1.0L10  PDS制作: WetWare Publishing ) MSどす");
  203.         puts("Towns-PAINTのP16ファイルをPC98のベタファイルに変換します\n");
  204.         puts("使用方法:P16TORGB [-フラグ] 入力ファイル [ドライブ:][出力ファイル]");
  205.         puts("     縦 480 -> 400 ドット にカットして変換します");
  206.         puts("     -H 先頭をカット -B 均等にカット -T 末尾をカット(デフォルト)");
  207.         break;
  208.       case 2:          
  209.         fprintf(stderr,"メモリが確保出来ませんでした\n");
  210.         break;
  211.       case 3:
  212.         printf("96000 バイト以上の空きを確保して下さい\n");
  213.         break;
  214.       case 4:
  215.         printf("ファイル名を確認して下さい\n");
  216.         break;
  217.       case 5:
  218.         printf("ファイルの読み込みに失敗しました。\n");
  219.         break;
  220.       case 6:
  221.       case 7:
  222.         printf("出力先のディスクを確認して下さい\n");
  223.         break;
  224.       default:              
  225.         printf("論理エラーです。デバッグして下さい!\n");
  226.         break;
  227.     }
  228.     exit(no);
  229. }
  230.