projects
/
YACASL2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
アセンブルと実行の流れを整理
[YACASL2.git]
/
src
/
exec.c
diff --git
a/src/exec.c
b/src/exec.c
index
aaef27b
..
61faee3
100644
(file)
--- a/
src/exec.c
+++ b/
src/exec.c
@@
-15,7
+15,7
@@
static CERR cerr_exec[] = {
{ 204, "OP in word #1 - not command code" },
{ 205, "r/r1 in word #1 - not GR" },
{ 206, "x/r2 in word #1 - not GR" },
{ 204, "OP in word #1 - not command code" },
{ 205, "r/r1 in word #1 - not GR" },
{ 206, "x/r2 in word #1 - not GR" },
- { 207, "
A
ddress in word #2 - out of memory" },
+ { 207, "
a
ddress in word #2 - out of memory" },
{ 208, "SVC input - memory overflow" },
{ 209, "SVC output - memory overflow" },
};
{ 208, "SVC input - memory overflow" },
{ 209, "SVC output - memory overflow" },
};
@@
-194,7
+194,7
@@
WORD val_adrx(WORD adr, WORD oprx)
{
WORD a;
if((a = adrx(adr, oprx)) >= sys->memsize) {
{
WORD a;
if((a = adrx(adr, oprx)) >= sys->memsize) {
- setcerr(207, pr2str(sys->cpu->pr + 1)); /*
A
ddress in word #2 - out of memory */
+ setcerr(207, pr2str(sys->cpu->pr + 1)); /*
a
ddress in word #2 - out of memory */
return 0x0;
}
return sys->memory[a];
return 0x0;
}
return sys->memory[a];
@@
-831,23
+831,24
@@
void svc()
/**
* 仮想マシンCOMET IIの実行
*/
/**
* 仮想マシンCOMET IIの実行
*/
-
bool
exec()
+
void
exec()
{
clock_t clock_begin, clock_end;
void (*cmdptr)();
{
clock_t clock_begin, clock_end;
void (*cmdptr)();
+ create_code_type(); /* 命令のコードとタイプがキーのハッシュ表を作成 */
if(execmode.trace == true) {
fprintf(stdout, "\nExecuting machine codes\n");
}
/* 機械語の実行 */
for (sys->cpu->pr = execptr->start; ; ) {
if(execmode.trace == true) {
fprintf(stdout, "\nExecuting machine codes\n");
}
/* 機械語の実行 */
for (sys->cpu->pr = execptr->start; ; ) {
- clock_begin = clock();
/* クロック周波数設定のため、実行開始時間を格納 */
- if(execmode.dump || execmode.trace) {
/* traceまたはdumpオプション指定時、改行を出力 */
- if(execmode.trace)
{
/* traceオプション指定時、レジスタを出力 */
+ clock_begin = clock(); /* クロック周波数設定のため、実行開始時間を格納 */
+ if(execmode.dump || execmode.trace) { /* traceまたはdumpオプション指定時、改行を出力 */
+ if(execmode.trace)
{
/* traceオプション指定時、レジスタを出力 */
fprintf(stdout, "#%04X: Register::::\n", sys->cpu->pr);
dspregister();
}
fprintf(stdout, "#%04X: Register::::\n", sys->cpu->pr);
dspregister();
}
- if(execmode.dump)
{
/* dumpオプション指定時、メモリを出力 */
+ if(execmode.dump)
{
/* dumpオプション指定時、メモリを出力 */
fprintf(stdout, "#%04X: Memory::::\n", sys->cpu->pr);
dumpmemory();
}
fprintf(stdout, "#%04X: Memory::::\n", sys->cpu->pr);
dumpmemory();
}
@@
-862,19
+863,19
@@
bool exec()
} else if(sys->cpu->sp > sys->memsize) {
setcerr(203, pr2str(sys->cpu->pr)); /* Stack Pointer (SP) - stack underflow */
}
} else if(sys->cpu->sp > sys->memsize) {
setcerr(203, pr2str(sys->cpu->pr)); /* Stack Pointer (SP) - stack underflow */
}
- goto exec
err
;
+ goto exec
fin
;
}
/* コードから命令を取得 */
/* 取得できない場合はエラー終了 */
if((cmdptr = getcmdptr(sys->memory[sys->cpu->pr] & 0xFF00)) == NULL) {
setcerr(204, pr2str(sys->cpu->pr)); /* OP in word #1 - not command code */
}
/* コードから命令を取得 */
/* 取得できない場合はエラー終了 */
if((cmdptr = getcmdptr(sys->memory[sys->cpu->pr] & 0xFF00)) == NULL) {
setcerr(204, pr2str(sys->cpu->pr)); /* OP in word #1 - not command code */
- goto exec
err
;
+ goto exec
fin
;
}
/* 命令の実行 */
(*cmdptr)();
/* エラー発生時はエラー終了 */
if(cerr->num > 0) {
}
/* 命令の実行 */
(*cmdptr)();
/* エラー発生時はエラー終了 */
if(cerr->num > 0) {
- goto exec
err
;
+ goto exec
fin
;
}
/* 終了フラグがtrueの場合は、正常終了 */
if(execptr->stop == true) {
}
/* 終了フラグがtrueの場合は、正常終了 */
if(execptr->stop == true) {
@@
-885,8
+886,9
@@
bool exec()
clock_end = clock();
} while(clock_end - clock_begin < CLOCKS_PER_SEC / sys->clocks);
}
clock_end = clock();
} while(clock_end - clock_begin < CLOCKS_PER_SEC / sys->clocks);
}
- return true;
-execerr:
- fprintf(stderr, "Execute error - %d: %s\n", cerr->num, cerr->msg);
- return false;
+execfin:
+ free_code_type(); /* 命令のコードとタイプがキーのハッシュ表を解放 */
+ if(cerr->num > 0) {
+ fprintf(stderr, "Execute error - %d: %s\n", cerr->num, cerr->msg);
+ }
}
}