From 721d81db60bffed314b2ec12ff6e83bc8b910a0a Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Thu, 26 Apr 2012 17:52:29 +0000 Subject: new ops 1.5 --- dcpu16.h | 7 ++++--- emu.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++--------- gramar.y | 24 ++++++++++++++---------- lexer.l | 7 ++++++- 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 @@ -75,6 +75,20 @@ ias(unsigned short *a) cycle += 1; } +void +iap(unsigned short *a) +{ + /* TODO */ + cycle += 3; +} + +void +iaq(unsigned short *a) +{ + /* TODO */ + cycle += 2; +} + void hwn(unsigned short *a) { @@ -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, @@ -210,6 +226,17 @@ mod(unsigned short *b, unsigned short *a) cycle += 3; } +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) { @@ -269,15 +296,6 @@ shl(unsigned short *b, unsigned short *a) cycle += 2; } -void -sti(unsigned short *b, unsigned short *a) -{ - *b = *a; - ++reg[I]; - ++reg[J]; - cycle += 2; -} - void ifb(unsigned short *b, unsigned short *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; -- cgit v1.2.3