X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?p=YACASL2.git;a=blobdiff_plain;f=src%2Fexec.c;h=f1b2f16ddaef83e3574118cc67dcf543c7191020;hp=b22fbf40bf57b7bfb221fef0aa1d8cf843dc76f8;hb=9e6203ab5881638185e10b09b1f40428e95fb98c;hpb=15a07be760d84746bbace2d70326cd939f4568fd diff --git a/src/exec.c b/src/exec.c index b22fbf4..f1b2f16 100644 --- a/src/exec.c +++ b/src/exec.c @@ -94,9 +94,9 @@ static CERR cerr_load[] = { }; /** - * @brief 実行モード: trace, logical, dump, step + * @brief 実行モード: trace, logical, dump, monitor, step */ -EXECMODE execmode = {false, false, false, false}; +EXECMODE execmode = {false, false, false, false, false}; char *pr2str(WORD pr) { @@ -116,7 +116,7 @@ void svcin() return; } for(i = 0; i < INSIZE; i++) { - if(*(buf + i) == '\0' || *(buf + i) == '\n') { + if(!buf[i] || buf[i] == '\n') { --i; break; } @@ -124,7 +124,7 @@ void svcin() setcerr(208, ""); /* SVC input - memory overflow */ break; } - sys->memory[sys->cpu->gr[1]+i] = *(buf + i); + sys->memory[sys->cpu->gr[1] + i] = buf[i]; } sys->memory[sys->cpu->gr[2]] = i + 1; FREE(buf); @@ -226,25 +226,23 @@ void addcerrlist_exec() addcerrlist(ARRAYSIZE(cerr_exec), cerr_exec); } -bool loadassemble(const char *file) +WORD loadassemble(const char *file, WORD start) { FILE *fp; - bool stat = true; + WORD end; assert(file != NULL); if((fp = fopen(file, "rb")) == NULL) { perror(file); - return false; + return 0; } - execptr->end = execptr->start + - fread(sys->memory, sizeof(WORD), sys->memsize - execptr->start, fp); - if(execptr->end == sys->memsize) { + end = start + fread(sys->memory + start, sizeof(WORD), sys->memsize - start, fp); + if(end == sys->memsize) { setcerr(210, file); /* load - memory overflow */ fprintf(stderr, "Load error - %d: %s\n", cerr->num, cerr->msg); - stat = false; } fclose(fp); - return stat; + return end; } void nop() @@ -763,21 +761,15 @@ void svc() sys->cpu->pr += 2; } -char *grstr(WORD word) -{ - assert(word <= 7); - char *str = malloc_chk(3 + 1, "grstr.str"); - sprintf(str, "GR%d", word); - return str; -} - void exec() { clock_t clock_begin, clock_end; void (*cmdptr)(); char *s; + const char *monmsg = "COMET II machine code monitor. Type ? for help.\n"; + + create_cmdtable(HASH_CODE); /* 命令のコードとタイプがキーのハッシュ表を作成 */ - create_code_cmdtype(); /* 命令のコードとタイプがキーのハッシュ表を作成 */ if(execmode.trace == true) { fprintf(stdout, "\nExecuting machine codes\n"); } @@ -795,8 +787,14 @@ void exec() } fprintf(stdout, "\n"); } - /* デバッガーモードの場合、デバッガーを起動 */ - if(execmode.step == true || getbps(sys->cpu->pr) == true) { + /* ステップモードまたはブレークポイントの場合、モニターを起動 */ + if( + (execmode.monitor == true && sys->cpu->pr == execptr->start) || + execmode.step == true || getbps(sys->cpu->pr) == true) + { + if(sys->cpu->pr == execptr->start) { + fprintf(stdout, "%s", monmsg); + } monitor(); } /* プログラムレジスタをチェック */ @@ -824,9 +822,14 @@ void exec() if(cerr->num > 0) { goto execfin; } - /* 終了フラグがtrueの場合は、正常終了 */ + /* 終了フラグがtrueの場合は、モニターまたは正常終了 */ if(execptr->stop == true) { - break; + if(execmode.monitor == true) { + fprintf(stdout, "Return to top.\n"); + monitor(); + } else { + break; + } } /* クロック周波数の設定 */ do { @@ -835,7 +838,7 @@ void exec() } execfin: freebps(); - free_code_cmdtype(); /* 命令のコードとタイプがキーのハッシュ表を解放 */ + free_cmdtable(HASH_CODE); /* 命令のコードとタイプがキーのハッシュ表を解放 */ if(cerr->num > 0) { fprintf(stderr, "Execute error - %d: %s\n", cerr->num, cerr->msg); }