#include "defines.h"
#include "acdata.h"
#include "acmp.h"
#include "FAT32.h"
#include "ascsi.h"
#include <scsi.h>
#include <error.h>

#define	DEBUG	0
#if DEBUG
#include <stdio.h>
#endif

int GetDriveInf32(FILE32 *fp)
// ドライブ＋メディアに関する情報を取得する
// あらかじめfp->scsiidに取得したいSCSIのID+LUNを格納しておくこと
// return : =0:ok , !=0:error
{
struct READCAP cap;
unlong secbpb=0L;
unchar *rbuff;
	#if DEBUG >=2
	printf("SCSI-ID=%d\n",fp->scsiid);
	#endif
	
	// ドライブの情報を得る
	if (S_CheckReady(fp->scsiid)) {
		fp->error=ENODEV;
		return(1); // ドライブの準備が出来ていない
	}
	
	// 容量情報取得
	if (S_READCAP(fp->scsiid,&cap)) {
		// 容量情報が読めない
		fp->error=ENODEV;
		return(2);
	}
	fp->sec1=cap.size;
	if (fp->sec1>SEC1MAX) {
		// １セクタのサイズがサポート外である
		fp->error=ENOMEM;
		return(5);
	}
	fp->blksz=(cap.size==2048? 3:cap.size/512); // S_READEXT()のブロック長引数の算出
	
	// ブートセクターを読む
	rbuff=fp->buff;
	if (S_SecRead(0x000000,1,fp->scsiid,fp->blksz,rbuff)) {
		// セクターが読めない
		fp->error=ENODEV;
		return(2);
	}
	if (rbuff[0x000]==0xfa) {
		// 今はパーティション不対応
		switch (rbuff[0x1be+0x04]) {
			default: // FAT32でない
				return(3);
			case 0x0b: // FAT32 ; CHS
			case 0x0c: // FAT32 ; LBA
				break;
		}
		secbpb=ctol80(&rbuff[0x1be+0x08]); // BPBの位置
		if (S_SecRead(secbpb,1,fp->scsiid,fp->blksz,rbuff)) {
			// セクターが読めない
			fp->error=ENODEV;
			return(2);
		}
		#if DEBUG >=2
		printf("BPBセクター=$%x\n",secbpb);
		#endif
	} // ブートセクターがなくていきなりＢＰＢがある（と思う）
	// ＢＰＢを読む
	if (ctos80(&rbuff[0x00b])==0) {
		fp->error=ENODEV;
		return(4); // 未フォーマットディスクである
	}
	if (ctos80(&rbuff[0x011])!=0) {
		fp->error=ENODEV;
		return(3); // FAT32でない
	}
	fp->clu1sec =rbuff[0x00d];		// １クラスタのセクター数
	fp->clu1byte=fp->clu1sec*fp->sec1;	// １クラスタのバイト数
	if (fp->clu1byte>CLU1MAX) {
		// １クラスタのサイズがサポート外である
		fp->error=ENOMEM;
		return(6);
	}
	fp->fatsecs =ctol80(&rbuff[0x024]);	// 1FATセクター数
	fp->fats    =(short)(rbuff[0x010]);	// FAT数
	fp->secfat1 =ctos80(&rbuff[0x00e])+secbpb; // FAT1先頭セクター=FAT[0〜]のあるセクター
	fp->allsec  =ctol80(&rbuff[0x020]);	// 有効全セクター数
	fp->secdata =fp->secfat1+fp->fatsecs*fp->fats; // データ領域先頭セクター
	fp->fat=fp->fatroot=ctol80(&rbuff[0x002c]); // ルートディレクトリのFAT番号
	fp->fbufffat=0xffffffff; // fbuff[]に読み込まれているFATの先頭番号（＝なし）
	
	// 終了
	#if DEBUG >=2
	printf("１セクタバイト数=%d\n",fp->sec1);
	printf("ブロック長引数=%d\n",fp->blksz);
	printf("１クラスタのセクタ数=%d\n",fp->clu1sec);
	printf("１クラスタのバイト数=%d\n",fp->clu1byte);
	printf("FAT1先頭セクタ=$%x\n",fp->secfat1);
	printf("データ領域先頭セクタ=$%x\n",fp->secdata);
	printf("ルートディレクトリのFAT番号=$%x\n",fp->fatroot);
	#endif
	return(0);
}
