#include #include #include #include"..\lib\7188.h" /* if you want write to segment 0xD000 --> set base 0xD000, but must make sure your ROM-DISK.IMG size <= 64K bytes or when you erase sector 0xD000,ROM Disk(A:) will be damaged. ** base can be 0xD000 or 0xE000. ----- for 7188(D)/DOS 256K Flash Memory */ unsigned base=0xE000; unsigned offset=0; extern unsigned char ProtectMode; void RunCmd(char *cmd); void main(void) { int quit=0; int key; char cmd[80]; int idx=0; char *Prompt="\nFlash>"; unsigned int id,fid; id=Is7188(); if(id){ printf("\n7188(%dK)",id); if(id==512) base=0x9000; } else { printf("\nFlash.exe Must run under 7188."); return; } InitLib(); printf("\nFlash.exe Ver 1.02. Utility for 7188(D)/DOS(/512) Flash Memory."); printf("\nCommand: Erase --> Erase current segment to 0xFF"); printf("\n W offset(Hex) data(Hex) --> Write data(byte) to Seg:off"); printf("\n 'f'('F') data(Hex) --> Fill current block with data"); printf("\n D offset(Hex) --> Dump data(64 bytes) from Seg:off"); printf("\n Enter --> Dump next 64 bytes"); printf("\n 'u','U' --> Dump Last 64 bytes"); printf("\n 'q','Q' --> quit to ROM-DOS"); printf("\n 's'('S') segment(Hex) --> set new segment"); fid=FlashReadId(); printf("\nFlash ID=%X -->",fid); if((fid&0xff)==1) printf("AMD"); else if((fid&0xff)==0xC2) printf("MXIC"); else printf("???"); if((fid>>8)==0xB0) printf("29F002T(256K)"); else if((fid>>8)==0xA4) printf("29F040(512K)"); else printf("???(???K)"); printf("\nProtect status:(1:protected, 0:nonprotected"); if(id==512){ for(idx=0;idx<8;idx++){ printf("\nSector 0x%04X:%c",0x8000+idx*0x1000,(ProtectMode&(0x80U>>idx))? '1':'0'); } } else if(id==256){ for(idx=0;idx<3;idx++){ printf("\nSector 0x%04X:%c",0xC000+idx*0x1000,(ProtectMode&(0x40U>>idx))? '1':'0'); } printf("\nSector 0xF000:%c",(ProtectMode&(0x40U>>3))? '1':'0'); printf("\nSector 0xF800:%c",(ProtectMode&(0x40U>>4))? '1':'0'); printf("\nSector 0xFA00:%c",(ProtectMode&(0x40U>>5))? '1':'0'); printf("\nSector 0xFC00:%c",(ProtectMode&(0x40U>>6))? '1':'0'); } idx=0; printf("\nCurrent segment is %4X",base); printf(Prompt); while(!quit){ while(!kbhit()) ; key=getch(); printf("%c",key); if(key=='\r'){ printf("\n"); cmd[idx]=0; if(cmd[0]=='q' || cmd[0]=='Q') return; RunCmd(cmd); idx=0; printf(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); printf("[%04X:%04X] ",base,offset); for(i=0;i<16;i++){ printf("%02X ",*(data+i)); } printf(" "); for(i=0;i<16;i++){ printf("%c",*(data+i)<0x20 ? '.':*(data+i)); } offset+=16; printf("\n"); } } void CheckSegment(unsigned base,int data) { unsigned i; unsigned error=0; for(i=0;i<65535;i++){ if(data != FlashRead(base,i)){ error++; printf("\nError on offset %04X,data is %02X,anykey to continue," "'q' to stop verify.",i,FlashRead(base,i)); if(getch4()=='q') goto EndCheck; } } if(data != FlashRead(base,i)){ error++; printf("\nError on offset %04X,data is %02X",i,FlashRead(base,i)); } EndCheck: printf("\nVerify,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); printf("\nBefore write %04X:%04X is 0x%02X",base,dataoffset,FlashRead(base,dataoffset)); FlashWrite(base,dataoffset,data); printf("\nAfter write %04X:%04X is 0x%02X",base,dataoffset,FlashRead(base,dataoffset)); if(data != FlashRead(base,dataoffset)){ printf("\nWriteFlash Error"); } break; case 's': case 'S': sscanf(cmd+1,"%x",&base); printf("\nSet 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; } }