#include #include #include int ErrorMessage=0; int PPGet(){//パラレルポートから1バイト入力 int InData; int OutData; int ReturnData; int Limitter;//タイムアウトのカウント const Limit=5000;//リミットのカウント int LimitAddCounter;//リミットを加算するときのカウント const LAUp=100;//LimitAddCounterが0に戻る値 //ビジーが1になるのを待つ Limitter=0;//リミッターリセット LimitAddCounter=0;//リミットのリミットをリセット while((inp(0x379)&128)==0){ //変数LimitAddCounterの値がLAUpの値より大きくなったら値を0に戻し、それから1ミリ秒待機し、変数Limitterの値を加算する if(LimitAddCounter>LAUp){ delay(1); Limitter++; LimitAddCounter=0; }else{ LimitAddCounter++; } if(Limitter>Limit){ErrorMessage=-1;return 0;}//タイムアウト } //ストローブを1 InData=inp(0x37a); OutData=InData|1; outp(0x37a,OutData); //データを取り込む ReturnData=inp(0x378); //ビジーが0になるのを待つ Limitter=0;//リミッターリセット LimitAddCounter=0;//リミットのリミットをリセット while((inp(0x379)&128)==128){ //変数LimitAddCounterの値がLAUpの値より大きくなったら値を0に戻し、それから1ミリ秒待機し、変数Limitterの値を加算する if(LimitAddCounter>LAUp){ delay(1); Limitter++; LimitAddCounter=0; }else{ LimitAddCounter++; } if(Limitter>Limit){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; int Limitter;//タイムアウトのカウント const Limit=5000;//リミットのカウント int LimitAddCounter;//リミットを加算するときのカウント const LAUp=100;//LimitAddCounterが0に戻る値 //ビジーが0になるのを待つ Limitter=0;//リミッターリセット LimitAddCounter=0;//リミットのリミットをリセット while((inp(0x379)&128)==128){ //変数LimitAddCounterの値がLAUpの値より大きくなったら値を0に戻し、それから1ミリ秒待機し、変数Limitterの値を加算する if(LimitAddCounter>LAUp){ delay(1); Limitter++; LimitAddCounter=0; }else{ LimitAddCounter++; } if(Limitter>Limit){ErrorMessage=-1;return;}//タイムアウト } //データをセット outp(0x378,Data); //ストローブを1 InData=inp(0x37a); OutData=InData|1; outp(0x37a,OutData); //ビジーの値が1になるのを待つ Limitter=0;//リミッターリセット LimitAddCounter=0;//リミットのリミットをリセット while((inp(0x379)&128)==0){ //変数LimitAddCounterの値がLAUpの値より大きくなったら値を0に戻し、それから1ミリ秒待機し、変数Limitterの値を加算する if(LimitAddCounter>LAUp){ delay(1); Limitter++; LimitAddCounter=0; }else{ LimitAddCounter++; } if(Limitter>Limit){ErrorMessage=-1;return;}//タイムアウト } //ストローブを0 InData=inp(0x37a); OutData=InData&254; outp(0x37a,OutData); //成功 ErrorMessage=0; return; } void main(int NumHikisuu,char *Hikisuu[]){ int intA; FILE *OFile; const FileLength=256; char OpenFilePath[FileLength]; int InData;//入力IOデータを入れる int OutData;//出力IOデータを入れる int GetByte[1];//受信したデータが入る int PutByte[1];//送信するデータが入る unsigned long ByteCounter=0;//受信したバイトを数えるカウンター char RetByte[32];//バイト数を文字列にして入れる if(NumHikisuu<=1){//引数なし printf("\nプリンタポートデータ転送プログラム\n"); printf("By Dr.Nabe\n"); printf("\n使い方:\n"); printf("\n送信の場合→ PPIO O ファイル名\n"); printf("\n受信の場合→ PPIO I ファイル名\n"); }else if((strcmp(Hikisuu[1],"i")==0)|(strcmp(Hikisuu[1],"I")==0)){//受信 //引数がないときは入力要請 if(NumHikisuu==2){ printf("\n受け取ったデータを格納するファイルを指定してください\n"); printf("\nファイル名="); scanf("%s",OpenFilePath); }else{ //引数があったら引数の値を変数にセット strcpy(OpenFilePath,Hikisuu[2]); } //受信モードにする 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); //ファイルを開く OFile=fopen(OpenFilePath,"wb"); //エラーが出るか受信終了まで取り込み続ける GetByte[0]=PPGet();//1バイト受信作業をしてエラーチェック while(ErrorMessage!=-1){ fwrite(GetByte,1,1,OFile); GetByte[0]=PPGet();//1バイト受信作業 ByteCounter++; } if(ByteCounter==0){ 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)){//送信 //引数がないときは入力要請 if(NumHikisuu==2){ printf("\n受け取ったデータを格納するファイルを指定してください\n"); printf("\nファイル名="); scanf("%s",Hikisuu[2]); }else{ //引数があったら引数の値を変数にセット strcpy(OpenFilePath,Hikisuu[2]); } //送信モードにする 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; } //エラーが出るか送信終了まで送信し続ける fread(PutByte,1,1,OFile);//1バイト取り出してエラーチェック while((ErrorMessage!=-1)&(feof(OFile)==0)){ PPPut(PutByte[0]);//1バイト送信作業 fread(PutByte,1,1,OFile);//1バイト取り出す ByteCounter++; } if(ErrorMessage==-1){ printf("\n送信に失敗しました\n"); }else{ ultoa(ByteCounter,RetByte,10); strcat(RetByte,"バイト\n"); printf(RetByte); } //ファイルを閉じる fclose(OFile); printf("\n送信終了\n"); } //処理終了 return; }