61 lines
2.1 KiB
C
61 lines
2.1 KiB
C
|
|
#include "flashrom.h"
|
||
|
|
void flashrom_init (uint8 manufacturerID, uint8 modelID, uint32 sectorSize, uint32 magicAddr1, uint32 magicAddr2, uint32 magicMask) {
|
||
|
|
flashrom_manufacturerID =manufacturerID;
|
||
|
|
flashrom_modelID =modelID;
|
||
|
|
flashrom_sectorSize =sectorSize;
|
||
|
|
flashrom_magicAddr1 =magicAddr1;
|
||
|
|
flashrom_magicAddr2 =magicAddr2;
|
||
|
|
flashrom_magicMask =magicMask;
|
||
|
|
}
|
||
|
|
|
||
|
|
uint8 flashrom_read (uint32 A) {
|
||
|
|
if (flashrom_state ==0x90) /* software ID */
|
||
|
|
return A &1? flashrom_modelID: flashrom_manufacturerID;
|
||
|
|
else
|
||
|
|
if (flashrom_timeOut)
|
||
|
|
return (CartBR(A) ^(flashrom_timeOut &1? 0x40: 0x00)) &~0x88;
|
||
|
|
else
|
||
|
|
return CartBR(A);
|
||
|
|
}
|
||
|
|
|
||
|
|
void flashrom_write (uint32 fullAddress, uint8 V) {
|
||
|
|
uint32 i;
|
||
|
|
uint8* sector =NULL;
|
||
|
|
uint32 compare =fullAddress &flashrom_magicMask;
|
||
|
|
fullAddress &=PRGsize[0] -1;
|
||
|
|
switch (flashrom_state) {
|
||
|
|
/* command start */
|
||
|
|
default: if (compare ==flashrom_magicAddr1 && V ==0xAA) flashrom_state++; break;
|
||
|
|
case 0x01: if (compare ==flashrom_magicAddr2 && V ==0x55) flashrom_state++; break;
|
||
|
|
case 0x02: if (compare ==flashrom_magicAddr1) flashrom_state =V; break;
|
||
|
|
/* sector or chip erase */
|
||
|
|
case 0x80: if (compare ==flashrom_magicAddr1 && V ==0xAA) flashrom_state++; break;
|
||
|
|
case 0x81: if (compare ==flashrom_magicAddr2 && V ==0x55) flashrom_state++; break;
|
||
|
|
case 0x82: if (V ==0x30) { /* sector erase */
|
||
|
|
/* Determine the actual sector start by masking with the sector size */
|
||
|
|
fullAddress &=~(flashrom_sectorSize -1);
|
||
|
|
sector =PRGptr[0] +fullAddress;
|
||
|
|
for (i =0; i <flashrom_sectorSize; i++) sector[i] =0xFF;
|
||
|
|
flashrom_timeOut =flashrom_sectorSize;
|
||
|
|
} else
|
||
|
|
if (V ==0x10 && compare ==flashrom_magicAddr1) { /* chip erase */
|
||
|
|
for (i =0; i<=PRGsize[0]; i++) PRGptr[0][i] =0xFF;
|
||
|
|
flashrom_timeOut =PRGsize[0];
|
||
|
|
} else
|
||
|
|
if (V ==0xF0) flashrom_state =0;
|
||
|
|
break;
|
||
|
|
/* software ID */
|
||
|
|
case 0x90: if (V ==0xF0) flashrom_state =0; break;
|
||
|
|
/* byte program */
|
||
|
|
case 0xA0: PRGptr[0][fullAddress] =V;
|
||
|
|
flashrom_state =0;
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
void FP_FASTAPASS(1) flashrom_cpuCycle(int a) {
|
||
|
|
while (a--) {
|
||
|
|
if (flashrom_timeOut && !--flashrom_timeOut) flashrom_state =0;
|
||
|
|
}
|
||
|
|
}
|