// SCSI Writeキャッシュ

#include "ascsi.h"
#include "deftype.h"

#define	DEBUG	0

unchar *S_CacheGetBuff(S_CACHE_BUFF *scb,long blocks)
// キャッシュから次回書き込みアドレスを得る(Write)
{
unchar *buff;
int fclr=0;
	if (blocks<0) { // バッファークリア指定付き
		fclr=1;
		blocks=-blocks;
	}
	if (scb->nextblock+blocks>scb->allblock) { // 次回与えるバッファーによりキャッシュがあふれる
	    int ret;
		// これまでのキャッシュ内容を書き出す
		#if DEBUG
		printf("GetBuff:");
		#endif
		ret=S_CacheFlush(scb);
		if (ret) return(NULL);
	}
	scb->blocks=blocks; // 与えたブロック数
	// ここではブロック番号は移動しない
	buff=&scb->cache[scb->sec1*scb->nextblock];
	#if DEBUG
	printf("buff=%p\n",buff);
	#endif
	if (fclr) {
		long sz,*b;
		b=(long*)buff;
		sz=scb->sec1*blocks/sizeof(long); // 高速化のためlong単位で消すから
						// セクターサイズは絶対にそれで割り切れる
		while (sz-->0) *b++=0;
	}
	return(buff);
}
