+ WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
+ if((sys->cpu->fr & (SF | ZF)) == 0) {
+ sys->cpu->pr = get_adr_x(w[1], w[0]);
+ } else {
+ sys->cpu->pr += 2;
+ }
+}
+
+void jmi()
+{
+ WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
+ if((sys->cpu->fr & SF) > 0) {
+ sys->cpu->pr = get_adr_x(w[1], w[0]);
+ } else {
+ sys->cpu->pr += 2;
+ }
+}
+
+void jnz()
+{
+ WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
+ if((sys->cpu->fr & ZF) == 0) {
+ sys->cpu->pr = get_adr_x(w[1], w[0]);
+ } else {
+ sys->cpu->pr += 2;
+ }
+}
+
+void jze()
+{
+ WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
+ if((sys->cpu->fr & ZF) > 0) {
+ sys->cpu->pr = get_adr_x(w[1], w[0]);
+ } else {
+ sys->cpu->pr += 2;
+ }
+}
+
+void jov()
+{
+ WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
+ if((sys->cpu->fr & OF) > 0) {
+ sys->cpu->pr = get_adr_x(w[1], w[0]);
+ } else {
+ sys->cpu->pr += 2;
+ }
+}
+
+void jump()
+{
+ WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
+ sys->cpu->pr = get_adr_x(w[1], w[0]);
+}
+
+void push()
+{
+ assert(sys->cpu->sp > execptr->end && sys->cpu->sp <= sys->memsize);
+ WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
+ sys->memory[--(sys->cpu->sp)] = get_adr_x(w[1], w[0]);
+ sys->cpu->pr += 2;
+}
+
+void pop()
+{
+ assert(sys->cpu->sp > execptr->end);
+ WORD w[] = {sys->memory[sys->cpu->pr]};
+ char *s = NULL;
+
+ if(sys->cpu->sp >= sys->memsize) {
+ setcerr(203, s = pr2str(sys->cpu->pr)); /* Stack Pointer (SP) - stack underflow */
+ FREE(s);
+ } else {
+ sys->cpu->gr[get_r_r1(w[0])] = sys->memory[(sys->cpu->sp)++];
+ sys->cpu->pr += 1;
+ }
+}
+
+void call()
+{
+ assert(sys->cpu->sp > execptr->end && sys->cpu->sp <= sys->memsize);
+ WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
+ sys->memory[--(sys->cpu->sp)] = sys->cpu->pr + 1;
+ sys->cpu->pr = get_adr_x(w[1], w[0]);
+}
+
+void ret()
+{
+ 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)++] + 1;
+ }
+}
+
+void svc()
+{
+ WORD w[] = {sys->memory[sys->cpu->pr], sys->memory[sys->cpu->pr + 1]};
+ switch(get_adr_x(w[1], w[0]))
+ {
+ case 0x0: /* STOP */
+ execptr->stop = true;
+ break;
+ case 0x1: /* IN */
+ svcin();
+ break;
+ case 0x2: /* OUT */
+ svcout();
+ break;
+ }
+ sys->cpu->pr += 2;
+}
+
+void exec()
+{
+ clock_t clock_begin = 0;
+ clock_t clock_end = 0;
+ void (*cmdptr)() = NULL;
+ char *s = NULL;
+ const char *monmsg = "COMET II machine code monitor. Type ? for help.\n";
+
+ create_cmdtable(HASH_CODE); /* 命令のコードとタイプがキーのハッシュ表を作成 */