home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FreeWare Collection 2
/
FreeSoftwareCollection2pd199x-jp.img
/
ms_dos
/
p16torgb
/
p16torgb.c
next >
Wrap
Text File
|
1990-06-14
|
5KB
|
230 lines
/* P16TORGB.C V1.0L10 1989.05.06 last update 1989.05.07 */
/* programmed by MSどす */
/* Towns-PAINTのP16ファイルをPC98のベタファイルに変換します */
/* コンパクト モデル で コンパイル しています */
#define XBYTE 320
#define YDOTPC 400
#define YDOTFM 480
#define TRUE 1
#define FALSE 0
#define HEAD 'H'
#define BODY 'B'
#define TAIL 'T'
#define HLEN 134
#include <stdio.h>
#include <stdlib.h>
#include <dir.h>
#include <dos.h>
#include <ctype.h>
char drive1[MAXDRIVE];
char dir1[MAXDIR];
char name1[MAXFILE];
char ext1[MAXEXT];
char drive2[MAXDRIVE];
char dir2[MAXDIR];
char name2[MAXFILE];
char ext2[MAXEXT];
char *exttbl[] = {".R1",".G1",".B1"};
int fnleng;
char fname1[MAXPATH]="";
char fname2[MAXPATH]="";
int cnt,fseq;
FILE *fin,*fout;
unsigned char *rbuf,*rptr,*gbuf,*gptr,*bbuf,*bptr;
unsigned char tbuf[XBYTE+1],*tptr,temp[10];
struct dfree ds;
main(int argc,char *argv[])
{
int i,j,k,n;
unsigned long freearea;
unsigned char flg,w;
if((argc==1)||(argc>4)){
abend(1); /* パラメタのエラー */
}
flg=TAIL;
for(i=1;i<argc;i++){
w=toupper(argv[i][1]);
if((argv[i][0] == '-')&&((w == HEAD)||(w == BODY)||(w == TAIL))){
flg=w;
}
else{
if(fname1[0]){
strcpy(fname2,argv[i]);
}
else{
strcpy(fname1,argv[i]);
}
}
}
rbuf = (unsigned char *)malloc(80*400); /* 出力バッファの確保 */
if (rbuf == NULL){
abend(2); /* メモリアロケーション エラー */
}
gbuf = (unsigned char *)malloc(80*400);
if (gbuf == NULL){
abend(2);
}
bbuf = (unsigned char *)malloc(80*400);
if (bbuf == NULL){
abend(2);
}
memset(rbuf,NULL,32000);
memset(gbuf,NULL,32000);
memset(bbuf,NULL,32000);
fnsplit(fname1,drive1,dir1,name1,ext1); /* ファイル名の組み立て */
fnmerge(fname1,drive1,dir1,name1,".P16");
fnsplit(fname2,drive2,dir2,name2,ext2);
if(*drive2 == NULL) { strcpy(drive2,drive1); }
if(*drive2 == NULL) {
drive2[0]= 'A' + getdisk();
drive2[1]= ':';
drive2[2]= NULL;
}
if(*name2 == NULL) { strcpy(name2,name1); }
w = toupper(drive2[0]) - 'A' +1;
getdfree(w,&ds);
freearea=((unsigned long)ds.df_avail
* (unsigned long)ds.df_bsec
* (unsigned long)ds.df_sclus);
if(freearea < 96000L){
printf("ディスクの空き容量が %ld バイトしかありません\n",freearea);
abend(3);
}
fin=fopen(fname1,"rb"); /* P16 open */
if(fin==NULL){
printf("入力ファイルがOPEN出来ません(%s)\n",fname1);
abend(4);
}
printf("変換を開始します。\n");
n = fread(tbuf,1,HLEN,fin);
if(n < HLEN){ /* ヘッダ情報部分カット */
abend(5); /* ファイルの読み込みに失敗 */
}
if(flg == HEAD){ /* 先頭部分カット */
for(i=0;i<80;i++){
n = fread(tbuf,1,XBYTE,fin);
if(n < XBYTE){
abend(5); /* ファイルの読み込みに失敗 */
}
}
}
rptr=rbuf;
gptr=gbuf;
bptr=bbuf;
for(i=0;i<400;i++){ /* 変換作業 */
n = fread(tbuf,1,XBYTE,fin); /* 1ライン分のデータ読み込み */
if((flg == BODY) && (i%5 == 0)){ /* 均等にカット */
n = fread(tbuf,1,XBYTE,fin); /* 縦480ドット->400ドット */
}
if(n < XBYTE){
abend(5); /* ファイルの読み込みに失敗 */
}
for(j=0,tptr=tbuf;j<80;j++){
for(k=0;k<8;k += 2){
temp[k] = *tptr & 0x07;
temp[k+1] = ((*tptr++ & 0x70) >> 4);
}
for(k=0;k<8;k++){
*bptr <<= 1;
*bptr |= temp[k] & 1;
temp[k] >>= 1;
*rptr <<= 1;
*rptr |= temp[k] & 1;
temp[k] >>= 1;
*gptr <<= 1;
*gptr |= temp[k] & 1;
}
rptr++;
gptr++;
bptr++;
}
printf("☆");
}
fclose(fin);
printf("\n変換作業終了。\n");
printf("ベタファイルを書き込んでいます。しばらくお待ち下さい。\n");
/* char *exttbl[] = {".R1",".G1",".B1"};*/
for(i=0;i<3;i++){
fnmerge(fname2,drive2,dir2,name2,exttbl[i]); /* BUFFER WRITE */
fout=fopen(fname2,"wb");
if(fout==NULL){
printf("出力ファイルが作れません(%s)\n",fname2);
abend(6);
}
switch(i){
case 0:
n = fwrite(rbuf,1,32000,fout);
break;
case 1:
n = fwrite(gbuf,1,32000,fout);
break;
case 2:
n = fwrite(bbuf,1,32000,fout);
break;
default:
abend(99);
break;
}
if(n<32000){
printf("ファイルの書き込みに失敗しました(%s)\n",fname2);
abend(7);
}
fclose(fout);
}
free(rbuf);
free(gbuf);
free(bbuf);
printf("正常終了しました。\n");
}
abend(no)
int no;
{
switch(no){
case 1:
puts("P16TORGB V1.0L10 PDS制作: WetWare Publishing ) MSどす");
puts("Towns-PAINTのP16ファイルをPC98のベタファイルに変換します\n");
puts("使用方法:P16TORGB [-フラグ] 入力ファイル [ドライブ:][出力ファイル]");
puts(" 縦 480 -> 400 ドット にカットして変換します");
puts(" -H 先頭をカット -B 均等にカット -T 末尾をカット(デフォルト)");
break;
case 2:
fprintf(stderr,"メモリが確保出来ませんでした\n");
break;
case 3:
printf("96000 バイト以上の空きを確保して下さい\n");
break;
case 4:
printf("ファイル名を確認して下さい\n");
break;
case 5:
printf("ファイルの読み込みに失敗しました。\n");
break;
case 6:
case 7:
printf("出力先のディスクを確認して下さい\n");
break;
default:
printf("論理エラーです。デバッグして下さい!\n");
break;
}
exit(no);
}