1
0
mirror of https://github.com/PDP-10/klh10.git synced 2026-03-07 19:30:46 +00:00
Files
PDP-10.klh10/src/opdata.c
2015-04-27 22:54:12 +02:00

167 lines
5.0 KiB
C

/* OPDATA.C - Holds data definitions and instruction opcode tables.
*/
/* $Id: opdata.c,v 2.3 2001/11/10 21:28:59 klh Exp $
*/
/* Copyright © 1992, 1993, 2001 Kenneth L. Harrenstien
** All Rights Reserved
**
** This file is part of the KLH10 Distribution. Use, modification, and
** re-distribution is permitted subject to the terms in the file
** named "LICENSE", which contains the full text of the legal notices
** and should always accompany this Distribution.
**
** This software is provided "AS IS" with NO WARRANTY OF ANY KIND.
**
** This notice (including the copyright and warranty disclaimer)
** must be included in all copies or derivations of this software.
*/
/*
* $Log: opdata.c,v $
* Revision 2.3 2001/11/10 21:28:59 klh
* Final 2.0 distribution checkin
*
*/
#define EXTDEF /* Definitions, not declarations! */
#include <stddef.h> /* For NULL */
#include <stdio.h> /* For op_init error reporting */
#include "klh10.h"
#include "kn10def.h"
#include "opdefs.h"
#ifdef RCSID
RCSID(opdata_c,"$Id: opdata.c,v 2.3 2001/11/10 21:28:59 klh Exp $")
#endif
/* Initialize master table at compile time.
** op_init() uses this data to fill out all other tables at runtime.
*/
struct opdef opclist[] = {
# define idef(i, nam, en, rtn, fl) {nam, i, fl, (opfp_t) rtn },
# define iodef(i, nam, en, rtn, fl) {nam, i, fl, (opfp_t) rtn },
# define ixdef(i, nam, en, rtn, fl) {nam, i, fl, (opfp_t) rtn },
# include "opcods.h"
# undef idef
# undef iodef
# undef ixdef
{0, -1} /* Ends with null name, -1 value. */
};
/* Made-up default defs not in master list */
static struct opdef opdef_muuo =
{ "MUUO", 0, (IF_1X1|IF_OPN), (opfp_t) i_muuo };
static struct opdef opdef_luuo =
{ "LUUO", 0, (IF_1X1|IF_OPN), (opfp_t) i_luuo };
static struct opdef opdef_ixdflt =
{"X_UNDEF", 0, (IF_SPEC), (opfp_t) ix_undef };
static struct opdef opdef_iodflt =
{ "IO", 0, (IF_IO), (opfp_t) NULL };
#if !KLH10_CPU_KS
static struct opdef opdef_diodflt =
{"DIO", 0, (IF_IO), (opfp_t) i_diodisp };
#endif /* !KS */
/* Old-IO instruction names, indexed by IOX_<name> */
char *opcionam[8] = {
"BLKI", "DATAI", "BLKO", "DATAO",
"CONO", "CONI", "CONSZ", "CONSO"
};
int opcioflg[8] = {
IF_IO|IF_SPEC|IF_MS|IF_M1, /* BLKI data -> @ ptr in c(E) */
IF_IO|IF_MW|IF_M1, /* DATAI data -> c(E) */
IF_IO|IF_SPEC|IF_MS|IF_M1, /* BLKO @ ptr in c(E) -> data */
IF_IO|IF_MR|IF_M1, /* DATAO c(E) -> data */
IF_IO|IF_ME, /* CONO E -> device */
IF_IO|IF_MW|IF_M1, /* CONI device -> c(E) */
IF_IO|IF_SKP|IF_ME, /* CONSZ !(device & E) */
IF_IO|IF_SKP|IF_ME /* CONSO (device & E) */
};
char *opcdvnam[128] = {
"APR", /* 000 */
"PI", /* 004 */
"PAG", /* 010 */
"CCA", /* 014 */
"TIM", /* 020 */
"MTR", /* 024 */
/* 030,034,040,044,050,054,060,064,070,074 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
"PTP", /* 100 */
"PTR", /* 104 */
0, /* 110 */
0, /* 114 */
"TTY", /* 120 */
0, /* 124 */
"DIS" /* 130 */
};
/* OP_INIT - Initialize PDP10 instruction op data
** The master table is built up at compile time from the definitions
** in opdefs.h and opcods.h. The actual tables needed for runtime
** dispatch operation are too complicated for simple initialization, so
** this is where they're set up at runtime.
*/
int
op_init(void)
{
register struct opdef *op;
register int i;
int errs = 0;
/* First set all dispatch tables to default values */
/* Primary dispatch for normal ops */
for (op = &opdef_muuo, i = 0; i < I_N; ++i) { /* 0-777 = MUUO */
cpu.opdisp[i] = op->oprtn;
opcptr[i] = op;
}
/* Modify primary table so 001-037 become LUUOs */
for (op = &opdef_luuo, i = 1; i <= 037; ++i) {
cpu.opdisp[i] = op->oprtn;
opcptr[i] = op;
}
#if !KLH10_CPU_KS
/* Modify primary table so 0700-0777 become dev-IO instructions */
for (op = &opdef_diodflt, i = 0700; i <= 0777; ++i) {
cpu.opdisp[i] = op->oprtn;
opcptr[i] = op;
}
#endif /* !KS */
/* Secondary dispatch for EXTEND ops */
for (op = &opdef_ixdflt, i = 0; i < IX_N; ++i) { /* Extend ops */
opcxrtn[i] = (opxfp_t) (op->oprtn);
opcxptr[i] = op;
}
/* Secondary dispatch for IO ops */
for (op = &opdef_iodflt, i = 0; i < IO_N; ++i) { /* IO ops */
opciortn[i] = (opiofp_t) (op->oprtn);
opcioptr[i] = op;
}
/* Now set up values from compile-time data in master list */
for(op = opclist, i = 0; (op->opstr || op->opval != -1); ++op, ++i) {
if (0 <= op->opval && op->opval < I_N) {
cpu.opdisp[op->opval] = op->oprtn; /* Normal op */
opcptr[op->opval] = op;
} else if (IXOP(0) <= op->opval && op->opval <= IXOP(IX_N-1)) {
opcxrtn[IXIDX(op->opval)] = (opxfp_t) (op->oprtn); /* EXTEND op */
opcxptr[IXIDX(op->opval)] = op;
} else if (IOEXOP(0,0) <= op->opval
&& op->opval <= IOEXOP(IOX_N-1,IODV_N-1)) {
opciortn[IOIDX(op->opval)] = (opiofp_t)(op->oprtn); /* IO op */
opcioptr[IOIDX(op->opval)] = op;
} else {
fprintf(stderr, "op_init: Illegal opcode! Def %d:(%#o, \"%s\")\n",
i, op->opval, (op->opstr ? op->opstr : "<null>"));
++errs;
}
}
return (errs ? 0 : 1);
}