signed char ioman_directSectorWrite(IOManager *ioman,unsigned long address, unsigned char* buf) { unsigned char* ibuf; signed short bp; if((bp=ioman_findSectorInCache(ioman,address))!=-1){ ibuf=ioman_getPtr(ioman,bp); memCpy(buf,ibuf,512); ioman_setWritable(bp); return(0); } if((bp=ioman_findFreeSpot(ioman))!=-1){ ibuf=ioman_getPtr(ioman,bp); memCpy(buf,ibuf,512); ioman_resetCacheItem(ioman,bp); ioman->sector[bp]=address; ioman_setWritable(bp); ioman_setValid(bp); return(0); } if(ioman_writeSector(ioman,address,buf)){ return(-1); } return(0); }
signed char ioman_directSectorRead(IOManager *ioman,unsigned long address, unsigned char* buf) { unsigned char* ibuf; signed short bp; if((bp=ioman_findSectorInCache(ioman,address))!=-1){ ibuf=ioman_getPtr(ioman,bp); memCpy(ibuf,buf,512); return(0); } if((bp=ioman_findFreeSpot(ioman))!=-1){ if((ioman_putSectorInCache(ioman,address,bp))){ return(-1); } ibuf=ioman_getPtr(ioman,bp); memCpy(ibuf,buf,512); return(0); } if(ioman_readSector(ioman,address,buf)){ return(-1); } return(0); }
esint8 ioman_directSectorWrite(IOManager *ioman,euint32 address, euint8* buf) { euint8* ibuf; esint16 bp; if((bp=ioman_findSectorInCache(ioman,address))!=-1){ ibuf=ioman_getPtr(ioman,bp); memCpy(buf,ibuf,512); ioman_setWritable(bp); return(0); } if((bp=ioman_findFreeSpot(ioman))!=-1){ ibuf=ioman_getPtr(ioman,bp); memCpy(buf,ibuf,512); ioman_resetCacheItem(ioman,bp); ioman->sector[bp]=address; ioman_setWritable(bp); ioman_setValid(bp); return(0); } if(ioman_writeSector(ioman,address,buf)){ return(-1); } return(0); }
esint8 ioman_directSectorRead(IOManager *ioman,euint32 address, euint8* buf) { euint8* ibuf; esint16 bp; if((bp=ioman_findSectorInCache(ioman,address))!=-1){ ibuf=ioman_getPtr(ioman,bp); memCpy(ibuf,buf,512); return(0); } if((bp=ioman_findFreeSpot(ioman))!=-1){ if((ioman_putSectorInCache(ioman,address,bp))){ return(-1); } ibuf=ioman_getPtr(ioman,bp); memCpy(ibuf,buf,512); return(0); } if(ioman_readSector(ioman,address,buf)){ return(-1); } return(0); }
unsigned char* ioman_getSector(IOManager *ioman,unsigned long address, unsigned char mode) { signed long bp; if((bp=ioman_findSectorInCache(ioman,address))!=-1){ if(ioman_isReqRw(mode)){ ioman_setWritable(bp); } ioman_incUseCnt(ioman,bp); if(!ioman_isReqExp(mode))ioman_incRefCnt(ioman,bp); return(ioman_getPtr(ioman,bp)); } if((bp=ioman_findFreeSpot(ioman))==-1){ if(((bp=ioman_findUnusedSpot(ioman))!=-1)&&(ioman_isWritable(bp))){ ioman_flushSector(ioman,bp); } } if(bp!=-1){ ioman_resetCacheItem(ioman,bp); if((ioman_putSectorInCache(ioman,address,bp))){ return(0); } if(mode==IOM_MODE_READWRITE){ ioman_setWritable(bp); } ioman_incUseCnt(ioman,bp); if(!ioman_isReqExp(mode))ioman_incRefCnt(ioman,bp); return(ioman_getPtr(ioman,bp)); } if((bp=ioman_findOverallocableSpot(ioman))!=-1){ if(ioman_isWritable(bp)){ ioman_flushSector(ioman,bp); } if(ioman_push(ioman,bp)){ return(0); } ioman_resetCacheItem(ioman,bp); if((ioman_putSectorInCache(ioman,address,bp))){ return(0); } if(ioman_isReqRw(mode)){ ioman_setWritable(bp); } ioman_incUseCnt(ioman,bp); if(!ioman_isReqExp(mode))ioman_incRefCnt(ioman,bp); return(ioman_getPtr(ioman,bp)); } ioman_setError(ioman,IOMAN_ERR_NOMEMORY); return(0); }
euint8* ioman_getSector(IOManager *ioman,euint32 address, euint8 mode) { esint32 bp; if((bp=ioman_findSectorInCache(ioman,address))!=-1){ if(mode==IOM_MODE_READWRITE){ ioman_setWritable(bp); } ioman_incUseCnt(ioman,bp); ioman_incRefCnt(ioman,bp); return(ioman_getPtr(ioman,bp)); } if((bp=ioman_findFreeSpot(ioman))==-1){ if(((bp=ioman_findUnusedSpot(ioman))!=-1)&&(ioman_isWritable(bp))){ ioman_flushSector(ioman,bp); } } if(bp!=-1){ ioman_resetCacheItem(ioman,bp); if((ioman_putSectorInCache(ioman,address,bp))){ return(0); } if(mode==IOM_MODE_READWRITE){ ioman_setWritable(bp); } ioman_incUseCnt(ioman,bp); ioman_incRefCnt(ioman,bp); return(ioman_getPtr(ioman,bp)); } if((bp=ioman_findOverallocableSpot(ioman))!=-1){ if(ioman_isWritable(bp)){ ioman_flushSector(ioman,bp); } if(ioman_push(ioman,bp)){ return(0); } ioman_resetCacheItem(ioman,bp); if((ioman_putSectorInCache(ioman,address,bp))){ return(0); } if(mode==IOM_MODE_READWRITE){ ioman_setWritable(bp); } ioman_incUseCnt(ioman,bp); ioman_incRefCnt(ioman,bp); return(ioman_getPtr(ioman,bp)); } return(0); }