📄 ata_emu.c
字号:
//#include <sys/syscall.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <io.h>
#include <direct.h>
#include <stdlib.h>
#include <stdio.h>
#include <memory.h>
#include <string.h>
/**** added by chilong 11/11/2001 ****/
//#include <stdio.h>
//#include "filesys/include/FileSys.h"
#include "../include/fat1x.h"
#include"../include/ata_emu.h"
#include"../include/ata_pcc.h"
/**** added by chilong 11/11/2001 ****/
int ghCardDev;
extern int CF_Format(void);
extern short FAT_get_hd_chs(unsigned short *sectorBuffer);
int CFInit(void)
{
int i, ret;
unsigned char buffer[512];
_mkdir("c:\\EmuBin");
ghCardDev = _open("c:\\EmuBin\\cfcard32m.bin",_O_RDWR | _O_CREAT | _O_BINARY,_S_IREAD | _S_IWRITE);
if(ghCardDev == -1)
return 0;
_lseek(ghCardDev, 0, SEEK_END);
if(_tell(ghCardDev) > 0)
return 1;
//pBuffer=(unsigned char *)malloc(LONG_BLOCK_LENTH);
memset(buffer, 0, 512);
_lseek(ghCardDev, 0, SEEK_SET);
for(i=0; i<0xf500; i++)
{
//ret=_write(ghFlashDev,(unsigned char *)gBlockBuffer, BLOCK_LENTH);
ret=_write(ghCardDev, buffer, 512);
if(ret == -1)
return 0;
}
FAT_get_hd_chs((unsigned short *)buffer);
CF_Format();
return 1;
}
unsigned short CFCardInCheck(void)
{
return CARD_IN;
}
/*************************************************************
Fuction: WAIT_COMMAND_AVAILABLE
**************************************************************/
#ifdef FAT_USE_PCMCIA
unsigned short WAIT_COMMAND_AVAILABLE(int driver, unsigned long howLong)
{
unsigned short result;
unsigned long timeout;
#if 0
/**** added by chilong temporaily 11/11/2001 ****/
// unsigned int i = 0;
/**** added by chilong temporaily 11/11/2001 ****/
/**** added by chilong 11/11/2001 ****/
#ifdef PCMCIA_DEBUG
printString("WAIT_COMMAND_AVAILABLE\n\r");
#endif
timeout = howLong + sc_getTimeStamp();
/**** added by chilong 11/11/2001 ****/
// timeout = howLong + 1000;
/**** added by chilong 11/11/2001 ****/
/* Wait until BSY = 0 */
#ifdef FAT_USE_PCMCIA
result = pcmInport(driver + STATUS_REG);
#else
result = inportb(driver + STATUS_REG);
result = result & 0x00FF;
#endif
while ((result & ATA_COMMAND_BUSY) == ATA_COMMAND_BUSY)
{
if (timeout < sc_getTimeStamp())
break;
#if( PCB_V >=5 )
// if card removed , break of the wait loop immediately
if( gCFCardStatus != CF_CARD_IN )
break;
#endif
#ifdef FAT_USE_PCMCIA
result = pcmInport(driver + STATUS_REG);
#else
result = inportb(driver + STATUS_REG);
result = result & 0x00FF;
#endif
}
return result;
#endif
return ATA_DRIVE_READY;
}
#endif
/*************************************************************
Fuction: GET_ERROR_RESULT
Get the error status reg.
return value: ATA_OK, ATA_FAILURE, ATA_FAIL_BBK, ATA_FAIL_UNC, ATA_FAIL_IDNF
ATA_FAIL_ABRT, ATA_FAIL_AMNF
**************************************************************/
#ifdef FAT_USE_PCMCIA
unsigned short GET_ERROR_RESULT(int driver)
{
return ATA_OK;
}
#endif
/*************************************************************
Function: WAIT_COMMAND_RESULT
**************************************************************/
#ifdef FAT_USE_PCMCIA
unsigned short WAIT_COMMAND_RESULT(int driver, unsigned long howLong)
{
return ATA_DRIVE_READY;
}
#endif
/*************************************************************
Function: ATA_GET_PARAMETER
**************************************************************/
#ifdef FAT_USE_PCMCIA
unsigned short ATA_GET_PARAMETER(int driver, unsigned short *buf)
{
buf[0] = 0x848a;
buf[1] = 0x01ea;
buf[2] = 0x0000;
buf[3] = 0x0004;
buf[4] = 0x0000;
buf[5] = 0x0240;
buf[6] = 0x0020;
buf[7] = 0x0000;
buf[8] = 0xf500;
buf[9] = 0x0000;
strcpy((char *)&buf[10], "223185d0402");
buf[20] = 0x0002;
buf[21] = 0x0002;
buf[22] = 0x0004;
strcpy((char *)&buf[23], "223185d0402");
buf[54] = 0x01ea;
buf[55] = 0x0004;
buf[56] = 0x0020;
return ATA_OK;
}
#endif
/*************************************************************
Function: ATA_READ_SECTOR
Read N sectors from drive
**************************************************************/
unsigned short ATA_READ_SECTOR(int driver, unsigned char secCount, unsigned long startSec, unsigned short *buf)
{
int offset;
int ret;
offset = startSec*512;
_lseek(ghCardDev, offset, SEEK_SET);
ret=_read(ghCardDev, buf, secCount*512);
if(ret==-1)
return 0xffff;
else
return ATA_OK;
}
/*************************************************************
Function: ATA_WRITE_SECTOR
Write N sectors to drive
**************************************************************/
unsigned short ATA_WRITE_SECTOR(int driver, unsigned char secCount, unsigned long startSec, unsigned short *buf)
{
int offset;
int ret;
offset = startSec*512;
_lseek(ghCardDev, offset, SEEK_SET);
ret=_write(ghCardDev, buf, secCount*512);
if(ret==-1)
return 0xffff;
else
return ATA_OK;
}
/*************************************************************
Function: ATA_READ
**************************************************************/
unsigned short ATA_READ(int driver, unsigned char secCount, unsigned long startSec, unsigned short *buf)
{
return (ATA_READ_SECTOR(driver, secCount, startSec, buf));
}
/*************************************************************
Function: ATA_WRITE
**************************************************************/
unsigned short ATA_WRITE(int driver, unsigned char secCount, unsigned long startSec, unsigned short *buf)
{
return (ATA_WRITE_SECTOR(driver, secCount, startSec, buf));
}
//#endif //FAT_ID
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -