kvisc/vm/pc/exec.c

43 lines
1.1 KiB
C
Raw Normal View History

2019-06-17 20:59:30 +02:00
// The OS/K Team licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
#include <pc/arch.h>
2019-07-17 22:25:50 +02:00
#define OUTPUT(p, r) { \
if (p->type == A_REG) \
R(p->reg) = r; \
2019-08-03 17:41:44 +02:00
else if (ACC_IS_MEM(p)) \
2019-08-03 19:01:12 +02:00
writemem(r, p->addr, p->mlen); \
else _except(E_ACC, "Trying to output to an IMM"); \
2019-08-03 17:41:44 +02:00
}
2019-07-17 22:25:50 +02:00
2019-06-17 20:59:30 +02:00
//
// Executes an instruction
//
2019-08-03 19:01:12 +02:00
void exec_instr(instr_t *in,
2019-06-17 20:59:30 +02:00
acc_t *p1,
acc_t *p2,
2019-08-14 20:23:05 +02:00
acc_t *p3)
2019-06-17 20:59:30 +02:00
{
2019-07-09 21:02:26 +02:00
uint out;
2019-08-14 20:23:05 +02:00
ulong r1 = 0, r2 = 0;
2019-06-17 20:59:30 +02:00
2019-06-23 21:12:25 +02:00
// Global instruction counter
2019-07-24 16:52:26 +02:00
ctx->ninstrs++;
2019-06-21 22:19:55 +02:00
2019-07-04 20:33:49 +02:00
if (ctx->dumpsw)
2019-08-14 20:23:05 +02:00
dump_instr(in, p1, p2, p3);
2019-06-17 20:59:30 +02:00
2019-08-14 20:23:05 +02:00
out = in->func(p1, p2, p3, &r1, &r2);
2019-06-17 20:59:30 +02:00
2019-07-09 21:02:26 +02:00
if (out)
2019-07-01 21:46:36 +02:00
{
2019-07-09 21:02:26 +02:00
OUTPUT(p1, r1);
2019-08-14 20:23:05 +02:00
if (__builtin_expect(out == 2, 0))
OUTPUT(p2, r2);
2019-06-17 20:59:30 +02:00
2019-09-08 19:04:07 +02:00
R(EZX) = 0;
2019-06-17 20:59:30 +02:00
}
}