#include #include #include #include #include #include #include #include "pcbios.h" #include "ramio.h" #include "vmemory.h" #include "file.h" #define MAIN #include "romem.h" #undef MAIN void main(int argc,char *argv[]) { char argument[WORDSIZE],*ep; /* command,argument buffer */ register int ret; /* return code */ register int c; /* is dbcs mode */ dbcsmode = isdbcs(); /* get lpt port address */ get_lpt(); lpt_num = 0; /* title */ printf("%s. Version %s.%s\n",TITLE,MAJOR,MINOR); printf("\tCopyright %s %s\n",AUTHOR,DATE); /* initialize virtual memory */ if(!vminit()) { if(dbcsmode) fprintf(stderr,"%s:仮想メモリーを初期化出来ません.\n",MYNAME); else fprintf(stderr,"%s:Virtual menory can not initialize.\n",MYNAME); exit(1); } /* get environment , command line option */ argument[0] = 0; if(NULL != (ep = getenv(ENVNAME))) { strcpy(argument,ep); strcat(argument," "); } while(--argc) { strcat(argument,*(++argv)); strcat(argument," "); } /* execute command */ ret = execute(argument); /* release virtual memory */ vmflush(); /* if error print usage */ if(printhelp) { for(c = 0;NULL != usage[c];c++) printf("%s\n",usage[c]); } else printf("Done.\n"); #ifdef DEBUG fprintf(stderr,"%s:exit level:%d\n",MYNAME,ret); #endif exit(ret); } int execute(char *argument) { char word[WORDSIZE]; /* command,argument word */ unsigned long source,distination,size; /* copy address range */ register int c; register int ret; /* return code */ #ifdef DEBUG fprintf(stderr,"%s:execute command:%s\n",MYNAME,argument); #endif ret = 0; while(*argument && (ret == 0)) { getword(word,&argument); switch(*word) { case 'l': case 'L': printhelp &= 0xfe; getword(word,&argument); if(0 == *word) { fprintf(stderr,"%s:missing argment(s)\n",MYNAME); ret = 1; break; } if(*word < '1' || '3' < *word) { fprintf(stderr,"%s:ilegal lpt port number %c\n",MYNAME,*word); ret = 1; break; } lpt_num = *word - '0'; if(0 != initport()) { fprintf(stderr,"%s:lpt port %d not found\n",MYNAME,lpt_num); lpt_num = 0; ret = 1; break; } printf("Set lpt port %d\n",lpt_num); break; case 'f': case 'F': printhelp &= 0xfe; getword(word,&argument); if(0 == *word) { fprintf(stderr,"%s:missing argment(s)\n",MYNAME); ret = 1; break; } if ('m' == *word || 'M' == *word) { format = MOTORORA; printf("Set file format motorora-S\n"); } else if ('i' == *word || 'I' == *word) { format = INTEL; printf("Set file format intel-hex\n"); } else if ('b' == *word || 'B' == *word) { format = BINARY; printf("Set file format binary\n"); } else { fprintf(stderr,"%s:ilegal file format %c\n",MYNAME,*word); ret = 1; break; } break; case 'e': case 'E': printhelp &= 0xfe; addrstep = ADDREVEN; /* address step is even */ printf("Set address step even\n"); break; case 'o': case 'O': printhelp &= 0xfe; addrstep = ADDRODD; /* address step is odd */ printf("Set address step odd\n"); break; case 'b': case 'B': printhelp &= 0xfe; addrstep = ADDRBOTH; /* address step is both even and odd */ printf("Set address step both even and odd\n"); break; case 'r': case 'R': printhelp &= 0xfe; getword(word,&argument); if(0 == *word) { fprintf(stderr,"%s:missing argment(s)\n",MYNAME); ret = 1; break; } if((0 == strcmp("-",word)) && (BINARY != format)) { if(usestdin) { fprintf(stderr,"%s:stdin not useable 2 times\n",MYNAME); ret = 1; break; } usestdin = 1; } printf("Read file %s\n",word); if(0 != readfile(word)) ret = 1; break; case 'w': case 'W': printhelp &= 0xfe; getword(word,&argument); if(0 == *word) { fprintf(stderr,"%s:missing argment(s)\n",MYNAME); ret = 1; break; } if((0 == strcmp("-",word)) && (BINARY != format)) { if(usestdout) { fprintf(stderr,"%s:stdin not useable 2 times\n",MYNAME); ret = 1; break; } usestdout = 1; } printf("Write file %s\n",word); if(0 != writefile(word)) ret = 1; break; case 'c': case 'C': printhelp &= 0xfe; getword(word,&argument); if(0 == *word) { fprintf(stderr,"%s:missing argment(s)\n",MYNAME); ret = 1; break; } source = strtounl(word,NULL,16); getword(word,&argument); if(0 == *word) { fprintf(stderr,"%s:missing argment(s)\n",MYNAME); ret = 1; break; } distination = strtounl(word,NULL,16); getword(word,&argument); if(0 == *word) { fprintf(stderr,"%s:missing argment(s)\n",MYNAME); ret = 1; break; } size = strtounl(word,NULL,16); printf("Copy memoty %lX bytes of %lX to %lX\n",size,source,distination); vmmove(source,distination,size); break; case 'm': case 'M': printhelp &= 0xfe; getword(word,&argument); if(0 == *word) { fprintf(stderr,"%s:missing argment(s)\n",MYNAME); ret = 1; break; } distination = strtounl(word,NULL,16); getword(word,&argument); if(0 == *word) { fprintf(stderr,"%s:missing argment(s)\n",MYNAME); ret = 1; break; } size = strtounl(word,NULL,16); getword(word,&argument); if(0 == *word) { fprintf(stderr,"%s:missing argment(s)\n",MYNAME); ret = 1; break; } c = (int)(strtounl(word,NULL,16) & 0xff); printf("Fill memoty %lX bytes of %X to %lX\n",size,c,distination); vmfill(distination,c,size); break; case 'a': case 'A': printhelp &= 0xfe; getword(word,&argument); if(0 == *word) { fprintf(stderr,"%s:missing argment(s)\n",MYNAME); ret = 1; break; } ramendaddr = strtounl(word,NULL,16); printf("Emuration ram down load end address = %lX\n",ramendaddr); break; case 'd': case 'D': printhelp &= 0xfe; if(lpt_num == 0) { lpt_num = 1; if(0 != initport()) { fprintf(stderr,"%s:lpt port 1 not found\n",MYNAME); lpt_num = 0; break; } } download(); break; case 'p': case 'P': printhelp &= 0xfe; getword(word,&argument); if(0 == *word) { fprintf(stderr,"%s:missing argment(s)\n",MYNAME); ret = 1; break; } if(lpt_num == 0) { lpt_num = 1; if(0 != initport()) { fprintf(stderr,"%s:lpt port 1 not found\n",MYNAME); lpt_num = 0; break; } } if('a' == *word || 'A' == *word) { ramdir(DIRAT); printf("Emuration ram direction to AT port\n"); } else if('t' == *word || 'T' == *word) { ramdir(DIRROM); printf("Emuration ram direction to terget port\n"); } else { fprintf(stderr,"%s:ilegal port direction %c\n",MYNAME,*word); ret = 1; break; } break; case '-': printhelp &= 0xfe; if(usestdin) { fprintf(stderr,"%s:stdin not useable 2 times\n",MYNAME); ret = 1; break; } usestdin = 1; printf("Read command from stdin\n"); while(NULL != fgets(word,WORDSIZE,stdin)) { c = execute(word); if(c) { ret = c; break; } } break; case 'h': case 'H': case '?': printhelp |= 2; break; default: fprintf(stderr,"%s:ilegal command %c\n",MYNAME,*word); break; } } return ret; } char *getword(char *word,char **string) { static char localbuf[64]; char *p,*wordp; if(NULL == *string) return(NULL); if(NULL == word) wordp = localbuf; else wordp = word; p = wordp; while(((**string == ' ') || (**string == '\t') || (**string == 0x0d) || (**string == 0x0a)) && **string) (*string)++; while((**string != ' ') && (**string != '\t') && (**string != 0x0d) && (**string != 0x0a) && **string) *wordp++ = *(*string)++; *wordp = 0; while(((**string == ' ') || (**string == '\t') || (**string == 0x0d) || (**string == 0x0a)) && **string) (*string)++; return p; } int readfile(char *name) { register int c; switch(format) { case MOTORORA: c = readmot(name); break; case INTEL: c = readitl(name); break; case BINARY: c = readbin(name); break; default: break; } if(c) { errmes(c,name); return 1; } return 0; } int writefile(char *name) { register int c; switch(format) { case MOTORORA: c = writemot(name); break; case INTEL: c = writeitl(name); break; case BINARY: c = writebin(name); break; default: break; } if(c) { errmes(c,name); return 1; } return 0; } void download(void) { unsigned long address; unsigned char data; unsigned long percent; /* set buffer memory address & step */ switch(addrstep) { case ADDREVEN: vmaddr(0l); vmstep(2l); break; case ADDRODD: vmaddr(1l); vmstep(2l); break; case ADDRBOTH: default: vmaddr(0l); vmstep(1l); break; } /* emuration ram direction to AT port */ ramdir(DIRAT); /* clear address counter on board */ addrclr(); percent = (ramendaddr + 1l) / 100l; printf("Down loading...\n"); for(address = 0;address <= ramendaddr;address++) { if(0 == (address % percent)) printf("%ld%% completed (Address:%lX)\r",address / percent,address); /* read data from buffer */ data = vmread(); /* write data to emuration ram */ ramwrite(data); /* increment address counter on board */ addrinc(); } printf("100%% completed (Address:%lX)\n",address - 1l); return; } void errmes(int err,char *str) { int dbcs; if(0 == err) return; dbcs = isdbcs(); switch(err) { case EF_BADFMT: if(dbcs) fprintf(stderr,"%s:ファイルのフォーマットが違うか、データが壊れています:%s\n",MYNAME,str); else fprintf(stderr,"%s:Unknown file format or broken recode:%s\n",MYNAME,str); break; case EF_NOTOPEN: if(dbcs) fprintf(stderr,"%s:ファイルをオープン出来ません:%s\n",MYNAME,str); else fprintf(stderr,"%s:File Can not open:%s\n",MYNAME,str); break; case EF_WRPRTCT: if(dbcs) fprintf(stderr,"%s:ファイルが書き込み禁止です:%s\n",MYNAME,str); else fprintf(stderr,"%s:File write protected:%s\n",MYNAME,str); break; case EF_RDERR: if(dbcs) fprintf(stderr,"%s:ファイルのリードエラーが発生しました:%s\n",MYNAME,str); else fprintf(stderr,"%s:File read error:%s\n",MYNAME,str); break; case EF_WRERR: if(dbcs) fprintf(stderr,"%s:ファイルのライトエラーが発生しました:%s\n",MYNAME,str); else fprintf(stderr,"%s:File write error:%s\n",MYNAME,str); break; case EF_SUMERR: if(dbcs) fprintf(stderr,"%s:ファイルのチェックサムエラーが発生しました:%s\n",MYNAME,str); else fprintf(stderr,"%s:File check sum error:%s\n",MYNAME,str); break; case EF_VMEXHST: if(dbcs) fprintf(stderr,"%s:仮想メモリー(EMS)が足りません:%s\n",MYNAME,str); else fprintf(stderr,"%s:Virtual memory (EMS) exhausted:%s\n",MYNAME,str); break; default: if(dbcs) fprintf(stderr,"%s:未定義のエラー番号:%s\n",MYNAME,str); else fprintf(stderr,"%s:Unexpected error:%s\n",MYNAME,str); break; } return; }