Add VM opcodes NOP, LANG, and SANG

- To simplify code generation genericizing, add three new opcodes
  * NOP: No-Operation
  * LANG: Load Angle - load a BAM angle into a float reg as degrees
  * SANG: Save Angle - store a float reg into a BEM angle, converting from degrees
This commit is contained in:
Randy Heit 2013-08-23 21:46:40 -05:00
parent a69089ffd7
commit 3ea0d1b444
3 changed files with 32 additions and 0 deletions

View file

@ -1,6 +1,8 @@
#include "vm.h" #include "vm.h"
#include "c_console.h" #include "c_console.h"
#define NOP MODE_AUNUSED | MODE_BUNUSED | MODE_CUNUSED
#define LI MODE_AI | MODE_BCJOINT | MODE_BCIMMS #define LI MODE_AI | MODE_BCJOINT | MODE_BCIMMS
#define LKI MODE_AI | MODE_BCJOINT | MODE_BCKI #define LKI MODE_AI | MODE_BCJOINT | MODE_BCKI
#define LKF MODE_AF | MODE_BCJOINT | MODE_BCKF #define LKF MODE_AF | MODE_BCJOINT | MODE_BCKF

View file

@ -220,6 +220,16 @@ begin:
GETADDR(PB,RC,X_READ_NIL); GETADDR(PB,RC,X_READ_NIL);
reg.f[a] = *(VM_SWORD *)ptr / 65536.0; reg.f[a] = *(VM_SWORD *)ptr / 65536.0;
NEXTOP; NEXTOP;
OP(LANG):
ASSERTF(a); ASSERTA(B); ASSERTKD(C);
GETADDR(PB,KC,X_READ_NIL);
reg.f[a] = (*(VM_UWORD *)ptr >> 1) * (180.0 / 0x40000000); // BAM -> deg
NEXTOP;
OP(LANG_R):
ASSERTF(a); ASSERTA(B); ASSERTD(C);
GETADDR(PB,RC,X_READ_NIL);
reg.f[a] = (*(VM_UWORD *)ptr >> 1) * (180.0 / 0x40000000);
NEXTOP;
OP(LBIT): OP(LBIT):
ASSERTD(a); ASSERTA(B); ASSERTD(a); ASSERTA(B);
GETADDR(PB,0,X_READ_NIL); GETADDR(PB,0,X_READ_NIL);
@ -326,6 +336,17 @@ begin:
GETADDR(PA,RC,X_WRITE_NIL); GETADDR(PA,RC,X_WRITE_NIL);
*(VM_SWORD *)ptr = (VM_SWORD)(reg.f[B] * 65536.0); *(VM_SWORD *)ptr = (VM_SWORD)(reg.f[B] * 65536.0);
NEXTOP; NEXTOP;
OP(SANG):
ASSERTA(a); ASSERTF(B); ASSERTKD(C);
GETADDR(PA,KC,X_WRITE_NIL);
*(VM_UWORD *)ptr = (VM_UWORD)(reg.f[B] * ((1<<30) / 180.0)) << 1; // deg -> BAM
NEXTOP;
OP(SANG_R):
ASSERTA(a); ASSERTF(B); ASSERTD(C);
GETADDR(PA,RC,X_WRITE_NIL);
*(VM_UWORD *)ptr = (VM_UWORD)(reg.f[B] * ((1<<30) / 180.0)) << 1;
NEXTOP;
OP(SBIT): OP(SBIT):
ASSERTA(a); ASSERTD(B); ASSERTA(a); ASSERTD(B);
GETADDR(PA,0,X_WRITE_NIL); GETADDR(PA,0,X_WRITE_NIL);
@ -1301,6 +1322,9 @@ begin:
ASSERTA(B); ASSERTKA(C); ASSERTA(B); ASSERTKA(C);
CMPJMP(reg.a[B] == konsta[C].v); CMPJMP(reg.a[B] == konsta[C].v);
NEXTOP; NEXTOP;
OP(NOP):
NEXTOP;
} }
} }
catch(VMException *exception) catch(VMException *exception)

View file

@ -2,6 +2,8 @@
#define xx(op, name, mode) OP_##op #define xx(op, name, mode) OP_##op
#endif #endif
xx(NOP, nop, NOP), // no operation
// Load constants. // Load constants.
xx(LI, li, LI), // load immediate signed 16-bit constant xx(LI, li, LI), // load immediate signed 16-bit constant
xx(LK, lk, LKI), // load integer constant xx(LK, lk, LKI), // load integer constant
@ -35,6 +37,8 @@ xx(LV, lv, RVRPKI), // load vector
xx(LV_R, lv, RVRPRI), xx(LV_R, lv, RVRPRI),
xx(LX, lx, RFRPKI), // load fixed point xx(LX, lx, RFRPKI), // load fixed point
xx(LX_R, lx, RFRPRI), xx(LX_R, lx, RFRPRI),
xx(LANG, lang, RFRPKI), // load angle
xx(LANG_R, lang, RFRPRI),
xx(LBIT, lbit, RIRPI8), // rA = !!(*rB & C) -- *rB is a byte xx(LBIT, lbit, RIRPI8), // rA = !!(*rB & C) -- *rB is a byte
@ -57,6 +61,8 @@ xx(SV, sv, RPRVKI), // store vector
xx(SV_R, sv, RPRVRI), xx(SV_R, sv, RPRVRI),
xx(SX, sx, RPRFKI), // store fixed point xx(SX, sx, RPRFKI), // store fixed point
xx(SX_R, sx, RPRFRI), xx(SX_R, sx, RPRFRI),
xx(SANG, sang, RPRFKI), // store angle
xx(SANG_R, sang, RPRFRI),
xx(SBIT, sbit, RPRII8), // *rA |= C if rB is true, *rA &= ~C otherwise xx(SBIT, sbit, RPRII8), // *rA |= C if rB is true, *rA &= ~C otherwise