rendered paste body#define NOR ((unsigned char*)0xA0000000)
#define NORWORD ((unsigned short int*)0xA0000000)
void eraseblock(int addr);
void writeblock(int block, int length);
unsigned char payload[0x1000];
int main() {
int i;
for(i = 0; i < sizeof(payload);) {
payload[i++] = 'C';
payload[i++] = 'H';
payload[i++] = 'R';
payload[i++] = 'I';
payload[i++] = 'S';
}
eraseblock(0x3e0000);
writeblock(0x3e0000, 0x1000);
while (1);
}
void eraseblock(int addr) {
NOR[addr]=0xFF;
NOR[addr]=0x60;
NOR[addr]=0xD0; //Unlock
NOR[addr]=0x20;
NOR[addr]=0xD0; //Erase
NOR[addr]=0x50;
while(NOR[addr]!=0x80); //wait for it to be ready
}
void writeblock(int addr, int length)
{
extern unsigned char *payload;
unsigned int i;
//first unlock the blocks
for(i=0;i<length;i+=0x4000) {
NOR[addr+i]=0xFF;
NOR[addr+i]=0x60;
NOR[addr+i]=0xD0; //Unlock
NOR[addr+i]=0xFF;
}
short int j;
NOR[0]=0xFF;
for(i=0;i<length;i+=4) {
j=*(payload++); //0
j+=256*(*(payload++)); //1
NOR[addr+i]=0x40;
NORWORD[(addr+i)/2]=j; //0x1100
NOR[addr]=0x70;
while(NOR[addr]!=0x80); //wait for it to be ready
NOR[addr]=0xFF;
j=*(payload++); //2
j+=256*(*(payload++)); //3
NOR[addr+i]=0x40;
NORWORD[((addr+i)/2)+1]=j; //0x3322
NOR[addr]=0x70;
while(NOR[addr]!=0x80); //wait for it to be ready
NOR[addr]=0xFF;
}
}