aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2012-04-24 18:16:32 +0000
committerDimitri Sokolyuk <demon@dim13.org>2012-04-24 18:16:32 +0000
commitd28be64a53c8436359406cd73775f41216155a7d (patch)
treebd7f62bb6423e2828fe21e75cb9ec2015d3828f9
parenta11ec50c0155d4011140486ffb5af92812bf11b4 (diff)
add NOP opcode
-rw-r--r--dcpu16.h2
-rw-r--r--emu.c9
-rw-r--r--gramar.y5
-rw-r--r--lexer.l3
4 files changed, 14 insertions, 5 deletions
diff --git a/dcpu16.h b/dcpu16.h
index 20d308e..af96a6e 100644
--- a/dcpu16.h
+++ b/dcpu16.h
@@ -23,7 +23,7 @@ enum { A, B, C, X, Y, Z, I, J, PC, SP, O, Aux, nReg };
enum { EXT, SET, ADD, SUB, MUL, DIV, MOD, SHL,
SHR, AND, BOR, XOR, IFE, IFN, IFG, IFB, nOpt };
-enum { Res, JSR, BRK, nExt };
+enum { NOP, JSR, BRK, nExt };
#define MEMSZ 0x10000
diff --git a/emu.c b/emu.c
index 8ec00dc..5920ff7 100644
--- a/emu.c
+++ b/emu.c
@@ -62,11 +62,12 @@ void (*op[nOpt])(unsigned short *a, unsigned short *b) = {
[IFB] = ifb,
};
+void nop(unsigned short *a);
void jsr(unsigned short *a);
void stop(unsigned short *a);
void (*extop[nExt])(unsigned short *a) = {
- [Res] = stop, /* die on wrong opcode */
+ [NOP] = nop,
[JSR] = jsr,
[BRK] = stop,
};
@@ -215,6 +216,12 @@ ifb(unsigned short *a, unsigned short *b)
}
void
+nop(unsigned short *a)
+{
+ cycle += 1;
+}
+
+void
jsr(unsigned short *a)
{
mem[--reg[SP]] = reg[PC];
diff --git a/gramar.y b/gramar.y
index 7222723..7d952d2 100644
--- a/gramar.y
+++ b/gramar.y
@@ -57,7 +57,7 @@ char **label;
%token A B C X Y Z I J
%token POP PEEK PUSH SP PC O
%token SET ADD SUB MUL DIV MOD SHL SHR AND BOR XOR IFE IFN IFG IFB
-%token DAT JSR BRK ORG JMP
+%token NOP JSR BRK DAT ORG
%token LBR RBR LBRACE RBRACE LPAR RPAR
%token COMMA DP PLUS MINUS MULT
%token DOT HASH MACRO INCLUDE
@@ -204,7 +204,8 @@ opcode
;
extended
- : JSR { $$ = 0x01; }
+ : NOP { $$ = 0x00; }
+ | JSR { $$ = 0x01; }
| BRK { $$ = 0x02; }
;
diff --git a/lexer.l b/lexer.l
index fe0f809..de4ecab 100644
--- a/lexer.l
+++ b/lexer.l
@@ -50,11 +50,12 @@ DEC [0-9]+
[Ii][Ff][Gg] return IFG;
[Ii][Ff][Bb] return IFB;
+[Nn][Oo][Pp] return NOP;
[Jj][Ss][Rr] return JSR;
[Bb][Rr][Kk] return BRK;
+
[Dd][Aa][Tt] return DAT;
[Oo][Rr][Gg] return ORG;
-[Jj][Mm][Pp] return JMP;
[Pp][Oo][Pp] return POP;
[Pp][Ee][Ee][Kk] return PEEK;