#include #include // #include // #include #include //ダミー //int outp(int port,int value){return 0;} //int inp(int port){return 0;} int ErrorMessage=0; int PPGet(){//パラレルポートから1バイト入力 int InData; int OutData; int ReturnData; while((inp(0x379)&128)==0){ if(inp(0x60)==1){getch();ErrorMessage=-1;return 0;}//中止 } //ストローブを1 InData=inp(0x37a); OutData=InData|1; outp(0x37a,OutData); //データを取り込む ReturnData=inp(0x378); while((inp(0x379)&128)==128){ if(inp(0x60)==1){getch();ErrorMessage=-1;return 0;}//中止 } //ストローブを0 InData=inp(0x37a); OutData=InData&254; outp(0x37a,OutData); //成功 return ReturnData; } void PPPut(int Data){//パラレルポートに1バイト出力 int InData; int OutData; //ビジーが0になるのを待つ while((inp(0x379)&128)==128){ if(inp(0x60)==1){getch();ErrorMessage=-1;return;}//中止 } //データをセット outp(0x378,Data); //ストローブを1 InData=inp(0x37a); OutData=InData|1; outp(0x37a,OutData); //ビジーの値が1になるのを待つ while((inp(0x379)&128)==0){ if(inp(0x60)==1){getch();ErrorMessage=-1;return;}//中止 } //ストローブを0 InData=inp(0x37a); OutData=InData&254; outp(0x37a,OutData); //成功 ErrorMessage=0; return; } void main(int NumHikisuu,char *HikisuuValue[]){ char Hikisuu[3][64];//引数の値をコピーしたものを入れる const FileLength=256; char OpenFilePath[FileLength]; char UseFileName[32];//扱うファイル名 switch(NumHikisuu){ case 1://引数なし printf("\nプリンタポートデータ転送プログラム\n"); printf("By Dr.Nabe\n"); printf("\n使い方:\n"); printf("\n送信の場合→ PPIO O ファイル名\n"); printf("\n受信の場合→ PPIO I\n"); break; case 2://モード指定だけある strcpy(Hikisuu[1],HikisuuValue[1]); if((strcmp(Hikisuu[1],"O")==0)|(strcmp(Hikisuu[1],"o")==0)){//送信ファイル入力要請 printf("\n送信するファイルを指定してください\n"); printf("\nファイル名="); scanf("%s",OpenFilePath); } break; case 3://揃っている strcpy(Hikisuu[1],HikisuuValue[1]); strcpy(Hikisuu[2],HikisuuValue[2]); strcpy(OpenFilePath,Hikisuu[2]); if((strcmp(Hikisuu[1],"O")==0)|(strcmp(Hikisuu[1],"o")==0)){//送信モードでないのにファイル名が入っていたら中止 }else{ printf("送信モードではないのにファイル名が入っていたら中止するようにしています"); return; } break; } int intA; int intB; FILE *OFile; int InData;//入力IOデータを入れる int OutData;//出力IOデータを入れる int GetByte[1];//受信したデータが入る int PutByte[1];//送信するデータが入る unsigned long ByteCounter=0;//受信したバイトを数えるカウンター unsigned long FileSizeCounter=0;//送信するファイルサイズを数えるカウンター char RetByte[32];//送受信バイト数を文字列にして入れる char RetFileSize[32];//ファイルサイズを文字列にして入れる char FileHeader[32];//ファイルの情報が入る if(NumHikisuu<=1){//引数なし return; }else if((strcmp(Hikisuu[1],"i")==0)|(strcmp(Hikisuu[1],"I")==0)){//受信 //受信モードにする InData=inp(0x37a); OutData=InData|32; outp(0x37a,OutData); //受信可能かどうかのチェック //ポート0x378に値を入れてみて、そのポートから再び読み込んだときに同じ値が入っていたら失敗とする。 outp(0x378,255); if(inp(0x378)==255){ //上のチェックではポートに値を入れる前に既に値が255になっていた可能性があるため、別の値でも確認してみる outp(0x378,0); if(inp(0x378)==0){ printf("\n誠に残念ながら受信できないみたいです\n"); printf("\nBIOSの設定をとりあえず確認してみて下さい。\n"); return; } } //ストローブを0 InData=inp(0x37a); OutData=InData&254; outp(0x37a,OutData); printf("\nESCキーで中止します\n"); //ファイル名 //エラーが出るか受信終了まで取り込み続ける intA=0; OpenFilePath[intA]=PPGet();//受信作業開始 while((ErrorMessage!=-1)&(OpenFilePath[intA]!=';')){ intA++; OpenFilePath[intA]=PPGet();//受信作業 } OpenFilePath[intA]='\0'; //ファイルを開く OFile=fopen(OpenFilePath,"wb"); //ファイルサイズ //エラーが出るか受信終了まで取り込み続ける intA=0; RetFileSize[intA]=PPGet();//1バイト受信作業開始 while((ErrorMessage!=-1)&(RetFileSize[intA]!=';')){ intA++; RetFileSize[intA]=PPGet();//1バイト受信作業 } RetFileSize[intA]='\0'; FileSizeCounter=atol(RetFileSize);//文字列を変換して数値としても記録 printf(OpenFilePath);printf("\n");//ファイル名を表示 printf(RetFileSize);printf("バイトのファイルを受信します。"); printf("\nESCキーで中止します\n"); //エラーが出るか受信終了まで取り込み続ける while((ErrorMessage!=-1)&(ByteCounter<=FileSizeCounter)){ GetByte[0]=PPGet();//1バイト受信作業 fwrite(GetByte,1,1,OFile); ByteCounter++; } ByteCounter--;//ファイル終端の記号分、カウンターの値を引く if((ErrorMessage==-1)|(ByteCounter!=FileSizeCounter)){ printf("\n受信に失敗しました\n"); }else{ ultoa(ByteCounter,RetByte,10); strcat(RetByte,"バイト\n"); printf(RetByte); } //ファイルを閉じる fclose(OFile); printf("\n受信終了\n"); }else if((strcmp(Hikisuu[1],"o")==0)|(strcmp(Hikisuu[1],"O")==0)){//送信 //OpenFilePathの中からパスを除きファイル名を取り出す intA=0; intB=0; strcpy(UseFileName,""); while(OpenFilePath[intA]!='\0'){ UseFileName[intB]=OpenFilePath[intA]; intA++; intB++; if(OpenFilePath[intA]=='\\'){intA++;intB=0;} } UseFileName[intB]='\0'; //送信モードにする InData=inp(0x37a); OutData=InData&223; outp(0x37a,OutData); //送信可能かどうかのチェック //ポート0x378に値を入れてみて、そのポートから再び読み込んだときに同じ値が入っていれば成功とする。 outp(0x378,255); if(inp(0x378)!=255){ printf("\n誠に残念ながら送信できないみたいです\n"); return; } //上のチェックではポートに値を入れたときに既に値が255になっていた可能性があるため、別の値でも確認してみる outp(0x378,0); if(inp(0x378)!=0){ printf("\n誠に残念ながら送信できないみたいです\n"); return; } //ストローブを0 InData=inp(0x37a); OutData=InData&254; outp(0x37a,OutData); //送信用ファイル名 strcpy(OpenFilePath,Hikisuu[2]); //ファイルを開く OFile=fopen(OpenFilePath,"rb"); //ファイルを開くのに成功したかのチェック if(OFile==0){ printf("\nファイルが開けませんでした\n"); return; } //ファイルのサイズを確認 while(feof(OFile)==0){ fread(PutByte,1,1,OFile);//1バイト取り出す FileSizeCounter++; } FileSizeCounter--;//ファイル終端でさらに一バイト加算されるので、それを取り除く ultoa(FileSizeCounter,RetFileSize,10);//サイズを文字列に変換 fclose(OFile);//一度閉じる //ファイルのヘッダー作成 strcpy(FileHeader,UseFileName); strcat(FileHeader,";");//区切り strcat(FileHeader,RetFileSize);//サイズ strcat(FileHeader,";");//区切り //改めてファイルを開く OFile=fopen(OpenFilePath,"rb"); printf("ファイル名=");printf(UseFileName);printf("\n"); printf("サイズ=");printf(RetFileSize);printf("バイト\n"); printf("\nESCキーで中止します\n"); intA=0; //ヘッダーの内容をエラーが出るか送信終了区切りまで送信し続ける while((ErrorMessage!=-1)&(FileHeader[intA]!='\0')){ PPPut(FileHeader[intA]);//1バイト送信作業 intA++; } //ファイルの内容をエラーが出るか送信終了まで送信し続ける while((ErrorMessage!=-1)&(feof(OFile)==0)){ fread(PutByte,1,1,OFile);//1バイト取り出す PPPut(PutByte[0]);//1バイト送信作業 ByteCounter++; } ByteCounter--;//ファイル終端の記号分、カウンターの値を引く if((ErrorMessage==-1)|(ByteCounter!=FileSizeCounter)){ printf("\n送信に失敗しました\n"); }else{ ultoa(ByteCounter,RetByte,10); strcat(RetByte,"バイト\n"); printf(RetByte); } //ファイルを閉じる fclose(OFile); printf("\n送信終了\n"); } //処理終了 return; }