/* 1. Compiler: TC 2.0 2. Mode: Large 3. Project: Flash.prj Flash.c ..\lib\8000l.lib ..\lib\tcpipl.lib 4. Explain: (1) To read, write and erase Flash memory. (2) If you want write to segment 0xD000 --> set base 0xD000, but must make sure your ROM-DISK.IMG size <= 64K bytes (3) when you erase sector 0xD000,ROM Disk(A:) will be damaged. ** Base can be 0xD000 or 0xE000. ----- for 8831/DOS 256K Flash Memory 5. Hordware: 8831 It's compiled by Tony ------------------------------------------------------------------------------------- */ #include #include #include #include"..\lib\8000.h" #include"..\LIB\vxcomm.h" /*----------------------------------------------------------------------------------*/ unsigned base=0xE000; unsigned offset=0; extern unsigned char ProtectMode; char *Prompt="\n\rFlash>"; void RunCmd(char *cmd); void ShowHelp(void) { Print("\n\rFlash.exe Ver 1.02. Utility for 8831(/512) Flash Memory."); Print("\n\rCommand: Erase --> Erase current segment to 0xFF"); Print("\n\r W offset(Hex) data(Hex) --> Write data(byte) to Seg:off"); Print("\n\r 'f'('F') data(Hex) --> Fill current block with data"); Print("\n\r D offset(Hex) --> Dump data(64 bytes) from Seg:off"); Print("\n\r Enter --> Dump next 64 bytes"); Print("\n\r 'u','U' --> Dump Last 64 bytes"); Print("\n\r 'q','Q' --> quit to 8831 System"); Print("\n\r 's'('S') segment(Hex) --> set new segment"); } void main(void) { int quit=0; int key; char cmd[80]; int idx=0; unsigned int id,fid; id=Is8000(); /*detect the current operation system*/ if(id){ Print("\n\r8831(%dK)",id); if(id==512) base=0x9000; } else { printf("\nFlash.exe Must run under 8831."); return; } ShowHelp(); fid=FlashReadId(); Print("\n\rFlash ID=%X -->",fid); if((fid&0xff)==1) Print("AMD"); else if((fid&0xff)==0xC2) Print("MXIC"); else Print("???"); if((fid>>8)==0xB0) Print("29F002T(256K)"); else if((fid>>8)==0xA4) Print("29F040(512K)"); else Print("???(???K)"); Print("\n\rProtect status:(1:protected, 0:nonprotected"); if(id==512){ for(idx=0;idx<8;idx++){ Print("\n\rSector 0x%04X:%c",0x8000+idx*0x1000,(ProtectMode&(0x80U>>idx))? '1':'0'); } } else if(id==256){ for(idx=0;idx<3;idx++){ Print("\n\rSector 0x%04X:%c",0xC000+idx*0x1000,(ProtectMode&(0x40U>>idx))? '1':'0'); } Print("\n\rSector 0xF000:%c",(ProtectMode&(0x40U>>3))? '1':'0'); Print("\n\rSector 0xF800:%c",(ProtectMode&(0x40U>>4))? '1':'0'); Print("\n\rSector 0xFA00:%c",(ProtectMode&(0x40U>>5))? '1':'0'); Print("\n\rSector 0xFC00:%c",(ProtectMode&(0x40U>>6))? '1':'0'); } idx=0; Print("\n\rCurrent segment is %4X",base); Print(Prompt); while(!quit){ if(Kbhit()){ key=Getch(); Putch(key); if(key=='\r'){ Putch('\n'); cmd[idx]=0; if(cmd[0]=='q' || cmd[0]=='Q') quit=1; else { RunCmd(cmd); idx=0; Print(Prompt); } } else if(key=='\b'){ if(idx) cmd[--idx]=0; } else { cmd[idx++]=key; } } } } void Dump(void) { int i,j; unsigned char far *data; for(j=0;j<4;j++){ data=(unsigned char far *)((((long)base)<<16)+offset); Print("[%04X:%04X] ",base,offset); for(i=0;i<16;i++){ Print("%02X ",*(data+i)); } Print(" "); for(i=0;i<16;i++){ Print("%c",*(data+i)<0x20 ? '.':*(data+i)); } offset+=16; Print("\n\r"); } } void CheckSegment(unsigned base,int data) { unsigned i; unsigned error=0; for(i=0;i<65535;i++){ if(data != FlashRead(base,i)){ error++; Print("\n\rError on offset %04X,data is %02X,anykey to continue," "'q' to stop verify.",i,FlashRead(base,i)); if(Getch()=='q') goto EndCheck; } } if(data != FlashRead(base,i)){ error++; Print("\n\rError on offset %04X,data is %02X",i,FlashRead(base,i)); } EndCheck: Print("\n\rVerify,Find %u errors",error); } void RunCmd(char *cmd) { unsigned dataoffset; unsigned data,i; switch(cmd[0]){ case 0: Dump(); break; case 'f': case 'F': sscanf(cmd+1,"%x",&data); for(i=0;i<65535;i++){ FlashWrite(base,i,data); } FlashWrite(base,i,data); CheckSegment(base,data); break; case 'd': case 'D': sscanf(cmd+1,"%x",&offset); Dump(); break; case 'w': case 'W': sscanf(cmd+1,"%x %x",&dataoffset,&data); Print("\n\rBefore write %04X:%04X is 0x%02X",base,dataoffset,FlashRead(base,dataoffset)); FlashWrite(base,dataoffset,data); Print("\n\rAfter write %04X:%04X is 0x%02X",base,dataoffset,FlashRead(base,dataoffset)); if(data != FlashRead(base,dataoffset)){ Print("\n\rWriteFlash Error"); } break; case 's': case 'S': sscanf(cmd+1,"%x",&base); Print("\n\rSet segment to %4X",base); break; case 'u': case 'U': offset-=128; Dump(); break; case 'E': case 'e': if(!stricmp(cmd,"ERASE")){ FlashErase(base); CheckSegment(base,0xff); } break; case 'h': case 'H': case '?': ShowHelp(); break; } }