aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2012-04-26 17:52:29 +0000
committerDimitri Sokolyuk <demon@dim13.org>2012-04-26 17:52:29 +0000
commit721d81db60bffed314b2ec12ff6e83bc8b910a0a (patch)
tree4f661034bbd81695fe626d6803343fec25685000
parent1c7efa286cb33f0c97ba5bbd793e5a34c2e29973 (diff)
new ops 1.5
-rw-r--r--dcpu16.h7
-rw-r--r--emu.c58
-rw-r--r--gramar.y24
-rw-r--r--lexer.l7
4 files changed, 73 insertions, 23 deletions
diff --git a/dcpu16.h b/dcpu16.h
index 581fd9b..6c655de 100644
--- a/dcpu16.h
+++ b/dcpu16.h
@@ -22,12 +22,13 @@ enum { A, B, C, X, Y, Z, I, J, PC, SP, EX, IA,
Aux, nReg };
enum { EXT, SET, ADD, SUB, MUL, MLI, DIV, DVI,
- MOD, AND, BOR, XOR, SHR, ASR, SHL, STI,
+ MOD, MDI, AND, BOR, XOR, SHR, ASR, SHL,
IFB, IFC, IFE, IFN, IFG, IFA, IFL, IFU,
- ADX = 0x1a, SBX, nOpt };
+ ADX = 0x1a, SBX,
+ STI = 0x1e, STD, nOpt };
enum { NOP, JSR, BRK,
- HCF = 0x07, INT, IAG, IAS,
+ HCF = 0x07, INT, IAG, IAS, IAP, IAQ,
HWN = 0x10, HWQ, HWI, nExt };
#define MEMSZ 0x10000
diff --git a/emu.c b/emu.c
index d6befff..cdf113a 100644
--- a/emu.c
+++ b/emu.c
@@ -76,6 +76,20 @@ ias(unsigned short *a)
}
void
+iap(unsigned short *a)
+{
+ /* TODO */
+ cycle += 3;
+}
+
+void
+iaq(unsigned short *a)
+{
+ /* TODO */
+ cycle += 2;
+}
+
+void
hwn(unsigned short *a)
{
/* TODO */
@@ -104,6 +118,8 @@ void (*extop[nExt])(unsigned short *a) = {
[INT] = intr,
[IAG] = iag,
[IAS] = ias,
+ [IAP] = iap,
+ [IAQ] = iaq,
[HWN] = hwn,
[HWQ] = hwq,
[HWI] = hwi,
@@ -211,6 +227,17 @@ mod(unsigned short *b, unsigned short *a)
}
void
+mdi(unsigned short *b, unsigned short *a)
+{
+ /* TODO */
+ if (*a == 0)
+ *b = 0;
+ else
+ *b %= *a;
+ cycle += 3;
+}
+
+void
and(unsigned short *b, unsigned short *a)
{
*b &= *a;
@@ -270,15 +297,6 @@ shl(unsigned short *b, unsigned short *a)
}
void
-sti(unsigned short *b, unsigned short *a)
-{
- *b = *a;
- ++reg[I];
- ++reg[J];
- cycle += 2;
-}
-
-void
ifb(unsigned short *b, unsigned short *a)
{
skip = !(*b & *a);
@@ -356,6 +374,25 @@ sbx(unsigned short *b, unsigned short *a)
cycle += 3;
}
+
+void
+sti(unsigned short *b, unsigned short *a)
+{
+ *b = *a;
+ ++reg[I];
+ ++reg[J];
+ cycle += 2;
+}
+
+void
+std(unsigned short *b, unsigned short *a)
+{
+ *b = *a;
+ --reg[I];
+ --reg[J];
+ cycle += 2;
+}
+
void (*op[nOpt])(unsigned short *a, unsigned short *b) = {
[EXT] = ext,
[SET] = set,
@@ -366,6 +403,7 @@ void (*op[nOpt])(unsigned short *a, unsigned short *b) = {
[DIV] = div,
[DVI] = dvi,
[MOD] = mod,
+ [MDI] = mdi,
[AND] = and,
[BOR] = bor,
[XOR] = xor,
@@ -383,6 +421,8 @@ void (*op[nOpt])(unsigned short *a, unsigned short *b) = {
[IFL] = ifl,
[ADX] = adx,
[SBX] = sbx,
+ [STI] = sti,
+ [STD] = std,
};
unsigned short *
diff --git a/gramar.y b/gramar.y
index d697835..2045f9c 100644
--- a/gramar.y
+++ b/gramar.y
@@ -64,10 +64,10 @@ struct label {
%token PUSH POP PEEK PICK SP PC EX
-%token SET ADD SUB MUL MLI DIV DVI MOD AND BOR XOR SHR ASR SHL STI
-%token IFB IFC IFE IFN IFG IFA IFL IFU ADX SBX
+%token SET ADD SUB MUL MLI DIV DVI MOD MDI AND BOR XOR SHR ASR SHL
+%token IFB IFC IFE IFN IFG IFA IFL IFU ADX SBX STI STD
%token NOP BRK DAT ORG
-%token JSR HCF INT IAG IAS HWN HWQ HWI
+%token JSR HCF INT IAG IAS IAP IAQ HWN HWQ HWI
%token LBR RBR LBRACE RBRACE LPAR RPAR
%token COMMA DP PLUS MINUS MULT
%token DOT HASH MACRO INCLUDE
@@ -210,13 +210,13 @@ opcode
| DIV { $$ = 0x06; }
| DVI { $$ = 0x07; }
| MOD { $$ = 0x08; }
- | AND { $$ = 0x09; }
- | BOR { $$ = 0x0a; }
- | XOR { $$ = 0x0b; }
- | SHR { $$ = 0x0c; }
- | ASR { $$ = 0x0d; }
- | SHL { $$ = 0x0e; }
- | STI { $$ = 0x0f; }
+ | MDI { $$ = 0x09; }
+ | AND { $$ = 0x0a; }
+ | BOR { $$ = 0x0b; }
+ | XOR { $$ = 0x0c; }
+ | SHR { $$ = 0x0d; }
+ | ASR { $$ = 0x0e; }
+ | SHL { $$ = 0x0f; }
| IFB { $$ = 0x10; }
| IFC { $$ = 0x11; }
| IFE { $$ = 0x12; }
@@ -227,6 +227,8 @@ opcode
| IFU { $$ = 0x17; }
| ADX { $$ = 0x1a; }
| SBX { $$ = 0x1b; }
+ | STI { $$ = 0x1e; }
+ | STD { $$ = 0x1f; }
;
extended
@@ -235,6 +237,8 @@ extended
| INT { $$ = 0x08; }
| IAG { $$ = 0x09; }
| IAS { $$ = 0x0a; }
+ | IAP { $$ = 0x0b; }
+ | IAQ { $$ = 0x0c; }
| HWN { $$ = 0x10; }
| HWQ { $$ = 0x11; }
| HWI { $$ = 0x12; }
diff --git a/lexer.l b/lexer.l
index 2799022..1619da4 100644
--- a/lexer.l
+++ b/lexer.l
@@ -43,13 +43,14 @@ DEC [0-9]+
[Dd][Ii][Vv] return DIV;
[Dd][Vv][Ii] return DVI;
[Mm][Oo][Dd] return MOD;
+[Mm][Dd][Ii] return MDI;
[Aa][Nn][Dd] return AND;
[Bb][Oo][Rr] return BOR;
[Xx][Oo][Rr] return XOR;
[Ss][Hh][Rr] return SHR;
[Aa][Ss][Rr] return ASR;
[Ss][Hh][Ll] return SHL;
-[Ss][Tt][Ii] return STI;
+
[Ii][Ff][Bb] return IFB;
[Ii][Ff][Cc] return IFC;
[Ii][Ff][Ee] return IFE;
@@ -60,6 +61,8 @@ DEC [0-9]+
[Ii][Ff][Uu] return IFU;
[Aa][Dd][Xx] return ADX;
[Ss][Bb][Xx] return SBX;
+[Ss][Tt][Ii] return STI;
+[Ss][Tt][Dd] return STD;
[Nn][Oo][Pp] return NOP;
[Jj][Ss][Rr] return JSR;
@@ -68,6 +71,8 @@ DEC [0-9]+
[Ii][Nn][Tt] return INT;
[Ii][Aa][Gg] return IAG;
[Ii][Aa][Ss] return IAS;
+[Ii][Aa][Pp] return IAP;
+[Ii][Aa][Qq] return IAQ;
[Hh][Ww][Nn] return HWN;
[Hh][Ww][Qq] return HWQ;
[Hh][Ww][Ii] return HWI;