Exemple #1
0
void ti89_put_word(uint32_t adr, uint16_t arg) 
{
    // RAM access
	if(IN_BOUNDS(0x000000, adr, 0x1fffff))
	{
		put_w(tihw.ram, adr, RAM_SIZE_TI89 - 1, arg);
	}

    // FLASH access
	else if(IN_BOUNDS(0x200000, adr, 0x5fffff))
	{
		FlashWriteWord(adr, arg);
	}

	// memory-mapped I/O
    else if(IN_BOUNDS(0x600000, adr, 0x6fffff))
	{
		io_put_word(adr, arg);
	}

	// memory-mapped I/O (hw2)
	else if(IN_RANGE(adr, 0x700000, IO2_SIZE_TI89))
	{
		io2_put_word(adr, arg);
	}

    return;
}
Exemple #2
0
void ti89t_put_word(uint32_t adr, uint16_t arg) 
{
	// RAM access
	if(IN_BOUNDS(0x000000, adr, 0x03ffff) ||
	   IN_BOUNDS(0x200000, adr, 0x23ffff) ||
	   IN_BOUNDS(0x400000, adr, 0x43ffff))
	{
		put_w(tihw.ram, adr, 0x03ffff, arg);
	}

	// FLASH access
    else if(IN_BOUNDS(0x800000, adr, 0xbfffff))
	{
		FlashWriteWord(adr, arg);
	}

	// memory-mapped I/O
    else if(IN_BOUNDS(0x600000, adr, 0x6fffff))			
	{
		io_put_word(adr, arg);
	}

	// memory-mapped I/O (hw2)
	else if(IN_RANGE(adr, 0x700000, IO2_SIZE_TI89T))
	{
		io2_put_word(adr, arg);
	}

	// memory-mapped I/O (hw3)
	else if(IN_RANGE(adr, 0x710000, IO3_SIZE_TI89T))
	{
		io3_put_word(adr, arg);
	}

    return;
}
Exemple #3
0
//涉及到的地址是Flash的绝对地址 BYTE 不支持跨扇区操作!!!
//奇数地址, 则向后移写入(避免删除SECTOR 追加方式)
int FlashSaveBuffer(U32 Addr, void *Buffer, U32 Size)
{
	U32 i,SectorStartAddr,StartAddr,EndAddr,SecSize,Erased,ThisSize;
	U16 *TempBuffer;
	
	TempBuffer=(U16 *)malloc(STD_SECTOR_SIZE); 
	
	//get flash sector index and size
	i=GetFlashSectorIndex(Addr);
	SecSize=FlashSectorSizes[i];
	//get flash start address
	SectorStartAddr=GetFlashStartAddress(i);

	//read from flash to buffer
	for(i=0;i<SecSize/2;i++)
	{
		TempBuffer[i]=((U16*)SectorStartAddr)[i];
		//if(i%150==0) printf("%d %x\n", i, SectorStartAddr+i*2);
	}			
	//Determine the bound of tempbuffer and buffer		
	if(SectorStartAddr < Addr) 
	    StartAddr=Addr-SectorStartAddr;
	else 
	    StartAddr=0;
		
	EndAddr=StartAddr + Size;		
	if(EndAddr > SecSize) EndAddr = SecSize;
	ThisSize=EndAddr-StartAddr;
		
	//check diff of buffer
	if(memcmp((U8*)TempBuffer+StartAddr, Buffer, ThisSize))
	{
		//check if erase this section
		Erased=0;
		for(i=StartAddr;i<EndAddr;i+=2)
		{
			if(!(TempBuffer[i/2]==0xFFFF))
			{
			      if (!FlashSectorErase(SectorStartAddr)){
			           free(TempBuffer);
				    return -1;
				}
				Erased=1;
				break;
			}
		}
		memcpy((U8*)TempBuffer+StartAddr, Buffer, ThisSize);
		if(Erased)  //if erased old data, write back all data of the section
		{ 
			i=0; 
			EndAddr=SecSize;
		}
		else
		{ 
			i=(StartAddr/2)*2; //adjust odd address to previous
			EndAddr=((EndAddr+1)/2)*2; 			
		}
		
		while(i < EndAddr)
		{
			if (!FlashWriteWord(SectorStartAddr + i, TempBuffer[i/2]))
			{
				free(TempBuffer);
				return -2;
			}
			i+=2;
		}
	}
	
	free(TempBuffer);
	return 1;
}