// SCSI Writeキャッシュ

#include <scsi.h>
#include <string.h>	// memcpy()
#include <iocslib.h>	// DMAMOVE()
#include "ascsi.h"
#include "defines.h"

#define	DEBUG	0

int S_CacheWrite(S_CACHE_BUFF *scb,unlong sec)
// キャッシュに書き出す
{
	if (scb->nextblock==0) { // 先頭の時、書きだしセクター番号を記録
		scb->sector0=sec;
	}
	if (sec!=scb->sector0+scb->nextblock) {
	    int ret;
		// このブロックは書きだしセクターが連続ではないので、
		// 今までのキャッシュ内容を先に書き出してしまう
		#if DEBUG
		printf("Write:");
		#endif
		ret=_S_CacheWriteSub(scb);
		if (ret) return(ret);
		
		// 今のバッファー内容を先頭にコピーして次のシリーズに備える
		scb->sector0=sec;
	    	// 高速化のためDMAを使う
		DMAMOVE(scb->cache,&scb->cache[scb->sec1*scb->nextblock]
			,0b10000101
			,scb->blocks*scb->sec1);
		// 真ん中を抜いたらmemcpy()に出来る。68030以上ではその方が速いかも。
		scb->nextblock=0;
	}
	scb->nextblock+=scb->blocks; // 次回に与えるバッファーアドレス
	#if DEBUG
	printf("sec=%d/nextblock=%d\n",sec,scb->nextblock);
	#endif
	return(0);
}
