📄 program.cpp
字号:
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 + -