From f925850726e8cd1e429abe88fc5d96bdc74b987a Mon Sep 17 00:00:00 2001 From: j8takagi <j8takagi@nifty.com> Date: Thu, 31 Mar 2011 07:56:30 +0900 Subject: [PATCH] =?utf8?q?=E5=AE=9F=E8=A1=8C=E6=99=82=E3=81=AE=E5=87=A6?= =?utf8?q?=E7=90=86=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- include/struct.h | 1 + src/exec.c | 41 +++++++++++++++++++++++++++-------------- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/include/struct.h b/include/struct.h index de1aa4b..ec4f52b 100644 --- a/include/struct.h +++ b/include/struct.h @@ -114,6 +114,7 @@ typedef struct _CMDTAB { typedef struct { WORD start; /**<éå§ã¢ãã¬ã¹ */ WORD end; /**<çµäºã¢ãã¬ã¹ */ + bool stop; /**<çµäºãã©ã° */ } EXECPTR; extern EXECPTR *execptr; diff --git a/src/exec.c b/src/exec.c index 62d0b13..68717d8 100644 --- a/src/exec.c +++ b/src/exec.c @@ -496,7 +496,10 @@ void call(const WORD r, const WORD v) */ void ret(const WORD r, const WORD v) { - if(sys->cpu->sp < sys->memsize) { + assert(sys->cpu->sp <= sys->memsize); + if(sys->cpu->sp == sys->memsize) { + execptr->stop = true; + } else if(sys->cpu->sp < sys->memsize) { sys->cpu->pr = sys->memory[(sys->cpu->sp)++]; } } @@ -508,6 +511,9 @@ void svc(const WORD r, const WORD v) { switch(v) { + case 0x0: + execptr->stop = true; + break; case 0x1: /* IN */ svcin(); break; @@ -532,33 +538,37 @@ bool exec() } /* ãã©ã°ã¬ã¸ã¹ã¿ã®åæå¤è¨å® */ sys->cpu->fr = 0x0; + /* ã¹ã¿ãã¯ãã¤ã³ã¿ã®åæå¤è¨å® */ sys->cpu->sp = sys->memsize; - sys->cpu->pr = execptr->start; + /* çµäºãã©ã°ã®åæå¤è¨å® */ + execptr->stop = false; /* æ©æ¢°èªã®å®è¡ */ - for (; ; ) { + for (sys->cpu->pr = execptr->start; ; ) { clock_begin = clock(); - /* ããã°ã©ã ã¬ã¸ã¹ã¿ã®ã¢ãã¬ã¹ãä¸»è¨æ¶ã®ç¯å²å¤ã®å ´åã¯ã¨ã©ã¼ */ + /* ããã°ã©ã ã¬ã¸ã¹ã¿ã®ã¢ãã¬ã¹ãä¸»è¨æ¶ã®ç¯å²å¤ã®å ´åã¯ã¨ã©ã¼çµäº */ if(sys->cpu->pr >= sys->memsize) { setcerr(204, pr2str(sys->cpu->pr)); /* Program Register (PR) - out of COMET II memory */ + goto execerr; } - /* ã¹ã¿ãã¯é åã確ä¿ã§ããªãå ´åã¯ã¨ã©ã¼ */ + /* ã¹ã¿ãã¯é åã確ä¿ã§ããªãå ´åã¯ã¨ã©ã¼çµäº */ else if(sys->cpu->sp <= execptr->end) { setcerr(205, pr2str(sys->cpu->pr)); /* Stack Pointer (SP) - cannot allocate stack buffer */ + goto execerr; } - /* ã¹ã¿ãã¯é åã®ã¢ãã¬ã¹ãä¸»è¨æ¶ã®ç¯å²å¤ã®å ´åã¯ã¨ã©ã¼ */ + /* ã¹ã¿ãã¯é åã®ã¢ãã¬ã¹ãä¸»è¨æ¶ã®ç¯å²å¤ã®å ´åã¯ã¨ã©ã¼çµäº */ else if(sys->cpu->sp > sys->memsize) { setcerr(207, pr2str(sys->cpu->pr)); /* Stack Pointer (SP) - out of COMET II memory */ + goto execerr; } /* å½ä»¤ã®åãåºã */ op = sys->memory[sys->cpu->pr] & 0xFF00; /* å½ä»¤ã®è§£èª */ + /* å½ä»¤ãCOMET IIå½ä»¤ã§ã¯ãªãå ´åã¯ã¨ã©ã¼çµäº */ if((cmdtype = getcmdtype(op)) == NOTCMD) { setcerr(210, pr2str(sys->cpu->pr)); /* not command code of COMET II */ - } - /* ã¨ã©ã¼çºçæã¯çµäº */ - if(cerr->num > 0) { goto execerr; } + cmdptr = getcmdptr(op); r_r1 = (sys->memory[sys->cpu->pr] >> 4) & 0xF; x_r2 = sys->memory[sys->cpu->pr] & 0xF; /* traceãªãã·ã§ã³æå®æãã¬ã¸ã¹ã¿ãåºå */ @@ -611,11 +621,14 @@ bool exec() op &= 0xFB00; } /* å½ä»¤ã®å®è¡ */ - if((op == 0x8100 && sys->cpu->sp == sys->memsize) || (op == 0xF000 && val == 0x0)) { - return true; - } else { - cmdptr = getcmdptr(op); - (*cmdptr)(r_r1, val); + (*cmdptr)(r_r1, val); + /* ã¨ã©ã¼çºçæã¯ã¨ã©ã¼çµäº */ + if(cerr->num > 0) { + goto execerr; + } + /* çµäºãã©ã°ãtrueã®å ´åã¯ãæ£å¸¸çµäº */ + if(execptr->stop == true) { + break; } /* ã¯ããã¯å¨æ³¢æ°ã®è¨å® */ do { -- 2.18.0