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; }
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; }
//涉及到的地址是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; }