⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 program.cpp

📁 是一款 基于 Windows 2K 操作系统中
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	BYTE  bTmp, bTrueData = 0;
	switch(bWhichChip)
	{
	case WM100040PINS:
        bTrueData = Tvia_Read3StateGate(STATEGATE2);
		bTrueData = bTrueData >> 4;
		bTrueData |= Tvia_Read3StateGate(STATEGATE3);
		break;
	case WM100028PINS:
		bTmp = Tvia_Read3StateGate(STATEGATE0);
        bTrueData  = ( (bTmp & 0xc0) >> 6 );                           //D1D0
        bTrueData |= bTmp & 0x30 ;                                     //D5D4
		bTrueData |= ( (Tvia_Read3StateGate(STATEGATE1) & 0x30) >>2 ); //D3D2
		bTrueData |= Tvia_Read3StateGate(STATEGATE3) & 0xc0;           //D7D6
		break;
    case WG200040PINS:
	case WG200064PINS:
	default:
		break;	
	}
	
    return bTrueData ;
}

BYTE CProgram::Tvia_IsBusy(void)
{    /* 0:free; 1:busy */
	BYTE bRet;
	bRet = Tvia_Read3StateGate(STATEGATE4);
	
	switch(bWhichChip)
	{
	case WM100040PINS:
		return (bRet & 0x10) ? 0 : 1;
	case WM100028PINS:
		return ( bRet & 0x80) ? 0 : 1;
    case WG200040PINS:
	case WG200064PINS:
	default:
		return FALSE;	
	}
}

BYTE CProgram::Tvia_ReadChipID(BYTE bChipID[])
{
    BYTE i;
	WORD wAddr = 0;
    /*disable Data Latch OUT before Data Latch IN*/
    Tvia_ControlDataLatchOut(OFF, LATCH3);
    /* Enable output control latch */
    Tvia_ControlOutputControlLatch(ON);
    /* disable */
    Tvia_ControlOutputControlLatch(OFF);
	
	/* prepare decode */
    Tvia_SendDecCode(DECODE_READ_SIGNATURE);
	switch(bWhichChip)
	{
	case WM100040PINS:
		wAddr = 0x30;
		for (i=0; i<3; i++)
		{
			Tvia_SendAddr(wAddr + i);
			/* Read data from address*/
			bChipID[i] = Tvia_ReadData();
		}
		break;
	case WM100028PINS:
		bChipID[0] = Tvia_ReadData();
        Tvia_SetPGZ(OFF);
		Tvia_SetPGZ(ON);
        bChipID[1] = Tvia_ReadData();
		break;
    case WG200040PINS:
	case WG200064PINS:
	default:
		break;	
	}	
	
   	/* Prepare invalid decode */
	Tvia_SendDecCode(DECODE_FREE);
	return bWhichChip;
}

WORD CProgram::Tvia_ReadDataFromFlash8K(BYTE DataBuffer[])
{
	WORD  i;
	HWND   hWnd;
	
    /*disable Data Latch OUT before Data Latch IN*/
    Tvia_ControlDataLatchOut(OFF, LATCH3);
    /* Enable output control latch */
    Tvia_ControlOutputControlLatch(ON);
    /* disable */
    Tvia_ControlOutputControlLatch(OFF);

	/* prepare decode */
	Tvia_SendDecCode( DECODE_READ );
	
	for (i=0; i<wFlashSize; i++)
	{
		//progress bar
		
		switch(bWhichChip)
		{
		case WM100040PINS:
			Tvia_SendAddr(i);
			DataBuffer[i] = Tvia_ReadData();
			break;

		case WM100028PINS:
			DataBuffer[i] = Tvia_ReadData();
            Tvia_SetPGZ(OFF);
			Tvia_SetPGZ(ON);
			break;

		case WG200040PINS:
	    case WG200064PINS:
	    default:
		    break;			
		}
		if (i % 1024  == 0)      //for progress 
		{
			hWnd = ::FindWindow(NULL, _T("Prog For Windows 9x"));
			::SendMessage(hWnd, WM_STEPIT, NULL, NULL);
		}
	}
	/* prepare invalid decode */
	Tvia_SendDecCode(DECODE_FREE);
	return wFlashSize;
}

BYTE CProgram::Tvia_WriteDataIntoFlash8K(WORD TmpFileSize, BYTE DataBuffer[])
{
	WORD  i;
	HWND  hWnd;

	if (TmpFileSize == 0x0)
		return 2;
	if (TmpFileSize > wFlashSize)
		return 3;

	if( !Tvia_EraseFlash() )
		return 1;
    
    for (i=0; i<TmpFileSize; i++)
	{
		// Progress bar
		/* prepare decode */
        Tvia_SendDecCode(DECODE_WRITE);  //??
		switch(bWhichChip)
		{
		case WM100040PINS:
			if (DataBuffer[i] != 0xff)
			{
				Tvia_SendAddr(i);
				Tvia_SendData(DataBuffer[i]);
				
				Tvia_SetPGZ(OFF);
				/* High level the PGZ */   
				Tvia_SetPGZ(ON);
                while( Tvia_IsBusy() );   
			}
			break;
		case WM100028PINS:
			Tvia_SendData(DataBuffer[i]);
			
			Tvia_SetPGZ(OFF);
			/* High level the PGZ */
       	    Tvia_SetPGZ(ON);   
			while( Tvia_IsBusy() );            
			break;
		case WG200040PINS:
	    case WG200064PINS:
	    default:
		    break;				
		}
		if (i % (TmpFileSize/7) == 0)    //for progress 
		{
			hWnd = ::FindWindow(NULL, _T("Prog For Windows 9x"));
			::SendMessage(hWnd, WM_STEPIT, NULL, NULL);
		}
	}
	/* prepare invalid decode */
	Tvia_SendDecCode(DECODE_FREE);
	return 0;
}

BYTE CProgram::Tvia_EraseFlash(void)
{
	BYTE WaitCNT = 1;
	BYTE bBusyOnAlways = 1;
	/* prepare decode */
	Tvia_SendDecCode(DECODE_ERASE_CHIP);

	Tvia_SetPGZ(OFF);
	/*PGZ low ative , should be hold within 300us */
	Sleep(1);
	/* High level the PGZ */
	Tvia_SetPGZ(ON);

	while( Tvia_IsBusy() && ((++WaitCNT % 200) != 0) )
	{
		Sleep(0x32);
		bBusyOnAlways = 0;
	}
	/* prepare invalid decode */
	Tvia_SendDecCode(DECODE_FREE);

	if (bBusyOnAlways == 1)
		return FALSE;                            //BUSY ==1 always

	if (WaitCNT == 200)
		return FALSE;                            //200ms PGZ !=1 Failed

	return TRUE;
}

void CProgram::Tvia_ClearAllLatch(void)
{	
    /* clear chip pin, clear Data Latch0/1/2/3/4 and Power On */
    Tvia_WriteDataLatch(0xff, 0x0);
    /* Data Latch0/1/2/3/4 can oputput to WM100 */
	Tvia_ControlDataLatchOut(ON, 0xff);
	/* enable */
	Tvia_ControlOutputControlLatch(ON);
	Tvia_ControlOutputControlLatch(OFF);
	
	/* clear Temp Data Latch, Output Control Latch and Input Control Latch */
   	Tvia_Out(LPT8, 0x0);
	Tvia_ControlTempDataLatch(ON);
    Tvia_ControlTempDataLatch(OFF);
	
	Tvia_ControlOutputControlLatch(ON);
    Tvia_ControlOutputControlLatch(OFF);
	
    Tvia_ControlInputControlLatch(ON);
    Tvia_ControlInputControlLatch(OFF);
	DataLatchEnable = 0x0;                     //clear
}

void CProgram::Tvia_InitBurner(void)
{   
	Tvia_ClearAllLatch();
	
   	/* High level the PGZ */
	Tvia_SetPGZ(ON);
	
    /* delay 100ms */
	Sleep(100);
	
	/* setb RST */
	Tvia_SetRST(ON);

	//Maybe add check Power or connection code here
}

/*-------------------- I/O Function --------------------*/

/*---------------------------------------------------------
asm_outp() is 8 bit I/O write
In: wPortAddr - I/O port address
bData     - 8 bit data to be written into the register
Out:
----------------------------------------------------------*/
void CProgram::asm_outp(WORD wPortAddr, BYTE bData)
{
    /* The tviaoutp() can be removed if you use standard c library which supports it*/
    __asm {
		push ax             /*save x86 ax register*/
		push dx             /*save x86 dx regist*/
		mov  dx, wPortAddr  /*dx=I/O port address*/
		mov  al, bData      /*al=date to be set in the register*/
		out  dx, al         /*x86 instruction for port I/O write*/
		pop  dx             /*restore x86 dx register*/
		pop  ax             /*restore x86 ax register*/
    };
	
}

/*---------------------------------------------------------
asm_inp() is 8 bit I/O read
In:  wPortAddr - I/O port address
Out: bData     - 8 bit data is read from the register
----------------------------------------------------------*/
BYTE CProgram::asm_inp(WORD wPortAddr)
{
    /* The tviainp() can be removed if you use standard c library which supports it*/
    BYTE bData;
    __asm {
        push ax             /*save x86 ax register*/
		push dx             /*save x86 dx regist*/
		mov  dx, wPortAddr  /*dx=I/O port address*/
		in   al, dx         /*x86 instruction for port I/O read*/
		mov  bData, al      /*save the data*/
		pop  dx             /*restore x86 dx register*/
		pop  ax             /*restore x86 ax register*/
    };
    return bData;
}

BYTE CProgram::Tvia_In(WORD wAddr)
{
	BYTE bData;
	bData = asm_inp(wAddr);
    if (wAddr == LPT9)
		bData = (bData & 0xf0) ^ 0x80;
    if (wAddr == LPTA)
		bData = (bData & 0x0f) ^ 0x0b;
	return bData ;
}

void CProgram::Tvia_Out(WORD wAddr, BYTE bData)
{
	if (wAddr == LPTA)
		bData = (bData & 0x0f) ^ 0x0b;
	asm_outp(wAddr,bData);
}

void CProgram::UpdataStatus(BYTE bChipType, WORD wRomSize)
{
	bWhichChip = bChipType;
	wFlashSize = wRomSize;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -