diff --git a/instr/INSTRS b/instr/INSTRS index 9e751ef..53f7474 100644 --- a/instr/INSTRS +++ b/instr/INSTRS @@ -3,6 +3,54 @@ nop +# +# Logical instructions +# + +not r +not m + +and r r +and r i +and r m +and m r +and m i +and m m + +or r r +or r i +or r m +or m r +or m i +or m m + +xor r r +xor r i +xor r m +xor m r +xor m i +xor m m + +# shift left logical +shl r r +shl r i +shl r m +shl m r +shl m i +shl m m + +# shift right logical +shr r r +shr r i +shr r m +shr m r +shr m i +shr m m + +# +# Unsigned arithmetic instructions +# + add r r add r i add r m @@ -17,13 +65,13 @@ sub m r sub m i sub m m -# rdx = hi(rax * %0) -# rax = lo(rax * %0) +# rdx = hi(rax * $0) +# rax = lo(rax * $0) mul r mul i -# rdx = rax % %0 -# rax = rax / %0 +# rdx = rax % $0 +# rax = rax / $0 div r div i @@ -33,17 +81,27 @@ inc m dec r dec m +# +# Movement instructions +# + mov r r mov r i mov r m mov m r mov m i +mov m m xchg r r xchg r i xchg r m xchg m r xchg m i +xchg m m + +# +# Stack manipulation instructions +# push i push r @@ -56,6 +114,10 @@ call m ret +# +# Supervisor only instructions +# + cli sti diff --git a/instr/instrs.c b/instr/instrs.c index 383b7d7..efc5b7c 100644 --- a/instr/instrs.c +++ b/instr/instrs.c @@ -12,6 +12,42 @@ IMPL_START_0(nop) } IMPL_END; +IMPL_START_2(and) +{ + v1 &= v2; +} +IMPL_OUT; + +IMPL_START_2(or) +{ + v1 |= v2; +} +IMPL_OUT; + +IMPL_START_2(xor) +{ + v1 ^= v2; +} +IMPL_OUT; + +IMPL_START_2(shl) +{ + v1 <<= v2; +} +IMPL_OUT; + +IMPL_START_2(shr) +{ + v1 >>= v2; +} +IMPL_OUT; + +IMPL_START_1(not) +{ + v1 = ~v1; +} +IMPL_OUT; + IMPL_START_2(add) { v1 += v2; diff --git a/instr/jumps.c b/instr/jumps.c new file mode 100644 index 0000000..e69de29 diff --git a/karch/main.c b/karch/main.c index 472ebb3..266dd9d 100644 --- a/karch/main.c +++ b/karch/main.c @@ -26,7 +26,8 @@ ushort fwprog[] = { ushort bget(ctx_t *ctx) { if (addr2real(ctx->r[RIP].val) >= MEMSIZE) { - _except(ctx, E_ACC, "Executing out of memory"); + _except(ctx, E_ACC, "Executing out of memory: 0x%016lX", + ctx->r[RIP].val); } ushort c = ctx->mp[addr2real(ctx->r[RIP].val)];