elea9003-emu/governo.c
2019-12-23 23:05:03 +01:00

108 lines
3 KiB
C

#include "elea_tipi.h"
#include "governo.h"
#include "memoria.h"
#include "ricerca.h"
#include "algebra.h"
#include "accumulatore.h"
#include "telescrivente.h"
struct registri_sistema R;
int op_salto(istruzione *i)
{
return 0;
}
static operazione *OP[64] = {
/* 0 = OP_SALTO */ op_salto,
/* 1 = OP_MEM */ op_mem,
/* 2 = NO OP! */ (operazione *)0,
/* 3 = OP_RIa */ op_ria,
/* 4 = OP_-CT */ op_meno_ct,
/* 5 = OP_+CT */ op_piu_ct,
/* 6 = OP_CCT */ op_cct,
/* 7 = OP_+MM */ op_piu_mm,
/* 8 = NO OP! */ (operazione *)0,
/* 9 = NO OP! */ (operazione *)0,
/* 10 = OP_CMM */ op_cmm,
/* 11 = OP_RIi */ op_rii,
/* 12 = OP_CT */ op_ct,
/* 13 = NO OP! */ (operazione *)0,
/* 14 = OP_PUM */ op_pum,
/* 15 = OP_-MM */ op_meno_mm,
/* 16 = OP_MS */ op_ms,
/* 17 = OP_DA */ op_da,
/* 18 = OP_FAM */ op_fam,
/* 19 = OP_AoM */ op_aom,
/* 20 = NO OP! */ (operazione *)0,
/* 21 = OP_+X */ op_piu_x,
/* 22 = NO OP! */ (operazione *)0,
/* 23 = OP_+MA */ op_piu_ma,
/* 24 = OP_CMA */ op_cma,
/* 25 = OP_MA */ op_ma,
/* 26 = OP_CM */ op_cm,
/* 27 = OP_AM */ op_am,
/* 28 = NO OP! */ (operazione *)0,
/* 29 = OP_-X */ op_meno_x,
/* 30 = OP_+AM */ op_piu_am,
/* 31 = OP_-MA */ op_meno_ma,
/* 32 = NO OP! */ (operazione *)0,
/* 33 = NO OP! */ (operazione *)0,
/* 34 = OP_FTM */ op_ftm,
/* 35 = OP_ToM */ op_tom,
/* 36 = OP_+LD */ op_piu_ld,
/* 37 = OP_XLD */ op_xld,
/* 38 = NO OP! */ (operazione *)0,
/* 39 = OP_+MT */ op_piu_mt,
/* 40 = OP_CMT */ op_cmt,
/* 41 = OP_MT */ op_mt,
/* 42 = NO OP! */ (operazione *)0,
/* 43 = OP_TM */ op_tm,
/* 44 = NO OP! */ (operazione *)0,
/* 45 = OP_XLN */ op_xln,
/* 46 = OP_+TM */ op_piu_tm,
/* 47 = OP_-MT */ op_meno_mt,
/* 48 = NO OP! */ (operazione *)0,
/* 49 = NO OP! */ (operazione *)0,
/* 50 = NO OP! */ (operazione *)0,
/* 51 = NO OP! */ (operazione *)0,
/* 52 = NO OP! */ (operazione *)0,
/* 53 = NO OP! */ (operazione *)0,
/* 54 = NO OP! */ (operazione *)0,
/* 55 = NO OP! */ (operazione *)0,
/* 56 = NO OP! */ (operazione *)0,
/* 57 = NO OP! */ (operazione *)0,
/* 59 = NO OP! */ (operazione *)0,
/* 60 = NO OP! */ (operazione *)0,
/* 61 = NO OP! */ (operazione *)0,
/* 62 = NO OP! */ (operazione *)0,
/* 63 = NO OP! */ (operazione *)0,
/* 64 = NO OP! */ (operazione *)0
};
static booleano CanaleInternoOcc = NO;
static booleano CanaleEsternoOcc = NO;
static uint32_t N_Cicli = 0;
booleano canale_interno_occupato(void)
{
return CanaleInternoOcc;
}
booleano canale_esterno_occupato(void)
{
return CanaleEsternoOcc;
}
void esegui_primo_programma(void)
{
istruzione *i = R.I;
R.I += sizeof(istruzione);
carattere F = *((carattere *)i);
if (OP[F] != (operazione *)0) {
(*OP[F])(i);
} else {
/* TODO: fault */
}
}