Added the Compare and Jump instructions
This commit is contained in:
parent
5c7119ca36
commit
9df3924351
|
@ -344,8 +344,8 @@
|
|||
| 2C 8a ii ii | JUMP.L a ii ii | LT? a; PC = PC + i ii ii |
|
||||
| 2C 9a ii ii | JUMP.Z a ii ii | ZERO? a; PC = PC + i ii ii |
|
||||
| 2C Aa ii ii | JUMP.NZ a ii ii | NZERO? a; PC = PC + i ii ii |
|
||||
| 2C Bx xx xx | Reserved | |
|
||||
| 2C Cx xx xx | Reserved | |
|
||||
| 2C Ba ii ii | JUMP.P | POSITIVE? a; PC = PC + ii ii |
|
||||
| 2C Ca ii ii | JUMP.NP | NEGATIVE? a; PC = PC + ii ii |
|
||||
| 2C Dx xx xx | Reserved | |
|
||||
| 2C Ex xx xx | Reserved | |
|
||||
| 2C Fx xx xx | Reserved | |
|
||||
|
@ -506,6 +506,37 @@ DO NOT USE.
|
|||
|-------------+----------|
|
||||
| 43 00 00 00 | Reserved |
|
||||
| ... | Reserved |
|
||||
| BF FF FF FF | Reserved |
|
||||
|
||||
** CMPJUMP Group
|
||||
| Hex | Name | Comment |
|
||||
|-------------+-------------+-------------------------------------|
|
||||
| C0 ab ii ii | CMPJUMP.G | a > b ? PC = PC + ii ii |
|
||||
| C1 ab ii ii | CMPJUMP.GE | a >= b ? PC = PC + ii ii |
|
||||
| C2 ab ii ii | CMPJUMP.E | a == b ? PC = PC + ii ii |
|
||||
| C3 ab ii ii | CMPJUMP.NE | a != b ? PC = PC + ii ii |
|
||||
| C4 ab ii ii | CMPJUMP.LE | a <= b ? PC = PC + ii ii |
|
||||
| C5 ab ii ii | CMPJUMP.L | a < b ? PC = PC + ii ii |
|
||||
| C6 ab ii ii | Reserved | |
|
||||
| ... | Reserved | |
|
||||
| CF ab ii ii | Reserved | |
|
||||
| D0 ab ii ii | CMPJUMPU.G | a > b ? PC = PC + ii ii (unsigned) |
|
||||
| D1 ab ii ii | CMPJUMPU.GE | a >= b ? PC = PC + ii ii (unsigned) |
|
||||
| D2 ab ii ii | Reserved | |
|
||||
| D3 ab ii ii | Reserved | |
|
||||
| D4 ab ii ii | CMPJUMPU.LE | a <= b ? PC = PC + ii ii (unsigned) |
|
||||
| D5 ab ii ii | CMPJUMPU.L | a < b ? PC = PC + ii ii (unsigned) |
|
||||
| D6 ab ii ii | Reserved | |
|
||||
| ... | Reserved | |
|
||||
| DF ab ii ii | Reserved | |
|
||||
|
||||
** Reserved Block 2
|
||||
At this time these instructions only produce a warning; but could do anything.
|
||||
DO NOT USE.
|
||||
| Hex | Name |
|
||||
|-------------+----------|
|
||||
| E0 00 00 00 | Reserved |
|
||||
| ... | Reserved |
|
||||
| FE FF FF FF | Reserved |
|
||||
|
||||
** 0OP
|
||||
|
|
12
asm.c
12
asm.c
|
@ -282,6 +282,16 @@ void assemble(struct Token* p)
|
|||
setExpression(p, "STORE8", "21", 4);
|
||||
setExpression(p, "STORE16", "22", 4);
|
||||
setExpression(p, "STORE32", "23", 4);
|
||||
setExpression(p, "CMPJUMP.G", "C0", 4);
|
||||
setExpression(p, "CMPJUMP.GE", "C1", 4);
|
||||
setExpression(p, "CMPJUMP.E", "C2", 4);
|
||||
setExpression(p, "CMPJUMP.NE", "C3", 4);
|
||||
setExpression(p, "CMPJUMP.LE", "C4", 4);
|
||||
setExpression(p, "CMPJUMP.L", "C5", 4);
|
||||
setExpression(p, "CMPJUMPU.G", "D0", 4);
|
||||
setExpression(p, "CMPJUMPU.GE", "D1", 4);
|
||||
setExpression(p, "CMPJUMPU.LE", "D4", 4);
|
||||
setExpression(p, "CMPJUMPU.L", "D5", 4);
|
||||
|
||||
/* 1OPI Group */
|
||||
setExpression(p, "JUMP.C", "2C0", 4);
|
||||
|
@ -295,6 +305,8 @@ void assemble(struct Token* p)
|
|||
setExpression(p, "JUMP.L", "2C8", 4);
|
||||
setExpression(p, "JUMP.Z", "2C9", 4);
|
||||
setExpression(p, "JUMP.NZ", "2CA", 4);
|
||||
setExpression(p, "JUMP.P", "2CB", 4);
|
||||
setExpression(p, "JUMP.NP", "2CC", 4);
|
||||
setExpression(p, "CALLI", "2D0", 4);
|
||||
setExpression(p, "LOADI", "2D1", 4);
|
||||
setExpression(p, "LOADUI", "2D2", 4);
|
||||
|
|
61
disasm.c
61
disasm.c
|
@ -771,6 +771,56 @@ void decode_Integer_2OPI(struct Instruction* c)
|
|||
strncpy(Name, "STORE32", 19);
|
||||
break;
|
||||
}
|
||||
case 0xC0: /* CMPJUMP.G */
|
||||
{
|
||||
strncpy(Name, "CMPJUMP.G", 19);
|
||||
break;
|
||||
}
|
||||
case 0xC1: /* CMPJUMP.GE */
|
||||
{
|
||||
strncpy(Name, "CMPJUMP.GE", 19);
|
||||
break;
|
||||
}
|
||||
case 0xC2: /* CMPJUMP.E */
|
||||
{
|
||||
strncpy(Name, "CMPJUMP.E", 19);
|
||||
break;
|
||||
}
|
||||
case 0xC3: /* CMPJUMP.NE */
|
||||
{
|
||||
strncpy(Name, "CMPJUMP.NE", 19);
|
||||
break;
|
||||
}
|
||||
case 0xC4: /* CMPJUMP.LE */
|
||||
{
|
||||
strncpy(Name, "CMPJUMP.LE", 19);
|
||||
break;
|
||||
}
|
||||
case 0xC5: /* CMPJUMP.L */
|
||||
{
|
||||
strncpy(Name, "CMPJUMP.L", 19);
|
||||
break;
|
||||
}
|
||||
case 0xD0: /* CMPJUMPU.G */
|
||||
{
|
||||
strncpy(Name, "CMPJUMPU.G", 19);
|
||||
break;
|
||||
}
|
||||
case 0xD1: /* CMPJUMPU.GE */
|
||||
{
|
||||
strncpy(Name, "CMPJUMPU.GE", 19);
|
||||
break;
|
||||
}
|
||||
case 0xD4: /* CMPJUMPU.LE */
|
||||
{
|
||||
strncpy(Name, "CMPJUMPU.LE", 19);
|
||||
break;
|
||||
}
|
||||
case 0xD5: /* CMPJUMPU.L */
|
||||
{
|
||||
strncpy(Name, "CMPJUMPU.L", 19);
|
||||
break;
|
||||
}
|
||||
default: /* Unknown 2OPI*/
|
||||
{
|
||||
break;
|
||||
|
@ -854,6 +904,16 @@ void decode_1OPI(struct Instruction* c)
|
|||
strncpy(Name, "JUMP.NZ", 19);
|
||||
break;
|
||||
}
|
||||
case 0xB: /* JUMP.P */
|
||||
{
|
||||
strncpy(Name, "JUMP.P", 19);
|
||||
break;
|
||||
}
|
||||
case 0xC: /* JUMP.NP */
|
||||
{
|
||||
strncpy(Name, "JUMP.NP", 19);
|
||||
break;
|
||||
}
|
||||
default: /* Unknown 1OPI*/
|
||||
{
|
||||
break;
|
||||
|
@ -1161,6 +1221,7 @@ void eval_instruction(struct Instruction* c)
|
|||
break;
|
||||
}
|
||||
case 0x0E ... 0x2B: /* Core 2OPI */
|
||||
case 0xC0 ... 0xDF:
|
||||
{
|
||||
decode_Integer_2OPI(c);
|
||||
break;
|
||||
|
|
122
vm.c
122
vm.c
|
@ -150,6 +150,18 @@ void STORER8(struct lilith* vm, struct Instruction* c);
|
|||
void STORER16(struct lilith* vm, struct Instruction* c);
|
||||
void STORER32(struct lilith* vm, struct Instruction* c);
|
||||
void JUMP(struct lilith* vm, struct Instruction* c);
|
||||
void JUMP_P(struct lilith* vm, struct Instruction* c);
|
||||
void JUMP_NP(struct lilith* vm, struct Instruction* c);
|
||||
void CMPJUMP_G(struct lilith* vm, struct Instruction* c);
|
||||
void CMPJUMP_GE(struct lilith* vm, struct Instruction* c);
|
||||
void CMPJUMP_E(struct lilith* vm, struct Instruction* c);
|
||||
void CMPJUMP_NE(struct lilith* vm, struct Instruction* c);
|
||||
void CMPJUMP_LE(struct lilith* vm, struct Instruction* c);
|
||||
void CMPJUMP_L(struct lilith* vm, struct Instruction* c);
|
||||
void CMPJUMPU_G(struct lilith* vm, struct Instruction* c);
|
||||
void CMPJUMPU_GE(struct lilith* vm, struct Instruction* c);
|
||||
void CMPJUMPU_LE(struct lilith* vm, struct Instruction* c);
|
||||
void CMPJUMPU_L(struct lilith* vm, struct Instruction* c);
|
||||
|
||||
/* Allocate and intialize memory/state */
|
||||
struct lilith* create_vm(size_t size)
|
||||
|
@ -1297,6 +1309,7 @@ bool eval_2OPI_Int(struct lilith* vm, struct Instruction* c)
|
|||
#endif
|
||||
|
||||
/* 0x0E ... 0x2B */
|
||||
/* 0xC0 ... 0xDF */
|
||||
switch(c->raw0)
|
||||
{
|
||||
case 0x0E: /* ADDI */
|
||||
|
@ -1452,6 +1465,96 @@ bool eval_2OPI_Int(struct lilith* vm, struct Instruction* c)
|
|||
STORE32(vm, c);
|
||||
break;
|
||||
}
|
||||
case 0xC0: /* CMPJUMP.G */
|
||||
{
|
||||
#ifdef DEBUG
|
||||
strncpy(Name, "CMPJUMP.G", 19);
|
||||
#endif
|
||||
|
||||
CMPJUMP_G(vm, c);
|
||||
break;
|
||||
}
|
||||
case 0xC1: /* CMPJUMP.GE */
|
||||
{
|
||||
#ifdef DEBUG
|
||||
strncpy(Name, "CMPJUMP.GE", 19);
|
||||
#endif
|
||||
|
||||
CMPJUMP_GE(vm, c);
|
||||
break;
|
||||
}
|
||||
case 0xC2: /* CMPJUMP.E */
|
||||
{
|
||||
#ifdef DEBUG
|
||||
strncpy(Name, "CMPJUMP.E", 19);
|
||||
#endif
|
||||
|
||||
CMPJUMP_E(vm, c);
|
||||
break;
|
||||
}
|
||||
case 0xC3: /* CMPJUMP.NE */
|
||||
{
|
||||
#ifdef DEBUG
|
||||
strncpy(Name, "CMPJUMP.NE", 19);
|
||||
#endif
|
||||
|
||||
CMPJUMP_NE(vm, c);
|
||||
break;
|
||||
}
|
||||
case 0xC4: /* CMPJUMP.LE */
|
||||
{
|
||||
#ifdef DEBUG
|
||||
strncpy(Name, "CMPJUMP.LE", 19);
|
||||
#endif
|
||||
|
||||
CMPJUMP_LE(vm, c);
|
||||
break;
|
||||
}
|
||||
case 0xC5: /* CMPJUMP.L */
|
||||
{
|
||||
#ifdef DEBUG
|
||||
strncpy(Name, "CMPJUMP.L", 19);
|
||||
#endif
|
||||
|
||||
CMPJUMP_L(vm, c);
|
||||
break;
|
||||
}
|
||||
case 0xD0: /* CMPJUMPU.G */
|
||||
{
|
||||
#ifdef DEBUG
|
||||
strncpy(Name, "CMPJUMPU.G", 19);
|
||||
#endif
|
||||
|
||||
CMPJUMPU_G(vm, c);
|
||||
break;
|
||||
}
|
||||
case 0xD1: /* CMPJUMPU.GE */
|
||||
{
|
||||
#ifdef DEBUG
|
||||
strncpy(Name, "CMPJUMPU.GE", 19);
|
||||
#endif
|
||||
|
||||
CMPJUMPU_GE(vm, c);
|
||||
break;
|
||||
}
|
||||
case 0xD4: /* CMPJUMPU.LE */
|
||||
{
|
||||
#ifdef DEBUG
|
||||
strncpy(Name, "CMPJUMPU.LE", 19);
|
||||
#endif
|
||||
|
||||
CMPJUMPU_LE(vm, c);
|
||||
break;
|
||||
}
|
||||
case 0xD5: /* CMPJUMPU.L */
|
||||
{
|
||||
#ifdef DEBUG
|
||||
strncpy(Name, "CMPJUMPU.L", 19);
|
||||
#endif
|
||||
|
||||
CMPJUMPU_L(vm, c);
|
||||
break;
|
||||
}
|
||||
default: return true;
|
||||
}
|
||||
#ifdef DEBUG
|
||||
|
@ -1569,6 +1672,24 @@ bool eval_Integer_1OPI(struct lilith* vm, struct Instruction* c)
|
|||
JUMP_NZ(vm, c);
|
||||
break;
|
||||
}
|
||||
case 0xB: /* JUMP.P */
|
||||
{
|
||||
#ifdef DEBUG
|
||||
strncpy(Name, "JUMP.P", 19);
|
||||
#endif
|
||||
|
||||
JUMP_P(vm, c);
|
||||
break;
|
||||
}
|
||||
case 0xC: /* JUMP.NP */
|
||||
{
|
||||
#ifdef DEBUG
|
||||
strncpy(Name, "JUMP.NP", 19);
|
||||
#endif
|
||||
|
||||
JUMP_NP(vm, c);
|
||||
break;
|
||||
}
|
||||
default: return true;
|
||||
}
|
||||
#ifdef DEBUG
|
||||
|
@ -1884,6 +2005,7 @@ void eval_instruction(struct lilith* vm, struct Instruction* current)
|
|||
break;
|
||||
}
|
||||
case 0x0E ... 0x2B: /* Integer 2OPI */
|
||||
case 0xC0 ... 0xDF:
|
||||
{
|
||||
decode_2OPI(current);
|
||||
invalid = eval_2OPI_Int(vm, current);
|
||||
|
|
|
@ -1616,3 +1616,115 @@ void JUMP(struct lilith* vm, struct Instruction* c)
|
|||
{
|
||||
vm->ip = vm->ip + c->raw_Immediate - 4;
|
||||
}
|
||||
|
||||
void JUMP_P(struct lilith* vm, struct Instruction* c)
|
||||
{
|
||||
int32_t tmp1;
|
||||
tmp1 = (int32_t)(vm->reg[c->reg0]);
|
||||
if(0 <= tmp1)
|
||||
{
|
||||
vm->ip = vm->ip + c->raw_Immediate - 4;
|
||||
}
|
||||
}
|
||||
|
||||
void JUMP_NP(struct lilith* vm, struct Instruction* c)
|
||||
{
|
||||
int32_t tmp1;
|
||||
tmp1 = (int32_t)(vm->reg[c->reg0]);
|
||||
if(0 > tmp1)
|
||||
{
|
||||
vm->ip = vm->ip + c->raw_Immediate - 4;
|
||||
}
|
||||
}
|
||||
|
||||
void CMPJUMP_G(struct lilith* vm, struct Instruction* c)
|
||||
{
|
||||
int32_t tmp1, tmp2;
|
||||
tmp1 = (int32_t)(vm->reg[c->reg0]);
|
||||
tmp2 = (int32_t)(vm->reg[c->reg1]);
|
||||
if(tmp1 > tmp2)
|
||||
{
|
||||
vm->ip = vm->ip + c->raw_Immediate - 4;
|
||||
}
|
||||
}
|
||||
|
||||
void CMPJUMP_GE(struct lilith* vm, struct Instruction* c)
|
||||
{
|
||||
int32_t tmp1, tmp2;
|
||||
tmp1 = (int32_t)(vm->reg[c->reg0]);
|
||||
tmp2 = (int32_t)(vm->reg[c->reg1]);
|
||||
if(tmp1 >= tmp2)
|
||||
{
|
||||
vm->ip = vm->ip + c->raw_Immediate - 4;
|
||||
}
|
||||
}
|
||||
|
||||
void CMPJUMP_E(struct lilith* vm, struct Instruction* c)
|
||||
{
|
||||
if((vm->reg[c->reg0]) == (vm->reg[c->reg1]))
|
||||
{
|
||||
vm->ip = vm->ip + c->raw_Immediate - 4;
|
||||
}
|
||||
}
|
||||
|
||||
void CMPJUMP_NE(struct lilith* vm, struct Instruction* c)
|
||||
{
|
||||
if((vm->reg[c->reg0]) != (vm->reg[c->reg1]))
|
||||
{
|
||||
vm->ip = vm->ip + c->raw_Immediate - 4;
|
||||
}
|
||||
}
|
||||
|
||||
void CMPJUMP_LE(struct lilith* vm, struct Instruction* c)
|
||||
{
|
||||
int32_t tmp1, tmp2;
|
||||
tmp1 = (int32_t)(vm->reg[c->reg0]);
|
||||
tmp2 = (int32_t)(vm->reg[c->reg1]);
|
||||
if(tmp1 <= tmp2)
|
||||
{
|
||||
vm->ip = vm->ip + c->raw_Immediate - 4;
|
||||
}
|
||||
}
|
||||
|
||||
void CMPJUMP_L(struct lilith* vm, struct Instruction* c)
|
||||
{
|
||||
int32_t tmp1, tmp2;
|
||||
tmp1 = (int32_t)(vm->reg[c->reg0]);
|
||||
tmp2 = (int32_t)(vm->reg[c->reg1]);
|
||||
if(tmp1 < tmp2)
|
||||
{
|
||||
vm->ip = vm->ip + c->raw_Immediate - 4;
|
||||
}
|
||||
}
|
||||
|
||||
void CMPJUMPU_G(struct lilith* vm, struct Instruction* c)
|
||||
{
|
||||
if((vm->reg[c->reg0]) > (vm->reg[c->reg1]))
|
||||
{
|
||||
vm->ip = vm->ip + c->raw_Immediate - 4;
|
||||
}
|
||||
}
|
||||
|
||||
void CMPJUMPU_GE(struct lilith* vm, struct Instruction* c)
|
||||
{
|
||||
if((vm->reg[c->reg0]) >= (vm->reg[c->reg1]))
|
||||
{
|
||||
vm->ip = vm->ip + c->raw_Immediate - 4;
|
||||
}
|
||||
}
|
||||
|
||||
void CMPJUMPU_LE(struct lilith* vm, struct Instruction* c)
|
||||
{
|
||||
if((vm->reg[c->reg0]) <= (vm->reg[c->reg1]))
|
||||
{
|
||||
vm->ip = vm->ip + c->raw_Immediate - 4;
|
||||
}
|
||||
}
|
||||
|
||||
void CMPJUMPU_L(struct lilith* vm, struct Instruction* c)
|
||||
{
|
||||
if((vm->reg[c->reg0]) < (vm->reg[c->reg1]))
|
||||
{
|
||||
vm->ip = vm->ip + c->raw_Immediate - 4;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue