SCP: Add register validation tests as part of the SCP library test
This commit is contained in:
parent
5fd9ee3909
commit
78d3d1b560
1 changed files with 61 additions and 8 deletions
69
scp.c
69
scp.c
|
@ -568,7 +568,7 @@ t_stat set_prompt (int32 flag, CONST char *cptr);
|
||||||
t_stat set_runlimit (int32 flag, CONST char *cptr);
|
t_stat set_runlimit (int32 flag, CONST char *cptr);
|
||||||
t_stat sim_set_asynch (int32 flag, CONST char *cptr);
|
t_stat sim_set_asynch (int32 flag, CONST char *cptr);
|
||||||
static const char *_get_dbg_verb (uint32 dbits, DEVICE* dptr, UNIT *uptr);
|
static const char *_get_dbg_verb (uint32 dbits, DEVICE* dptr, UNIT *uptr);
|
||||||
static t_stat sim_sanity_check_register_declarations (void);
|
static t_stat sim_sanity_check_register_declarations (DEVICE **devices);
|
||||||
static void fix_writelock_mtab (DEVICE *dptr);
|
static void fix_writelock_mtab (DEVICE *dptr);
|
||||||
static t_stat _sim_debug_flush (void);
|
static t_stat _sim_debug_flush (void);
|
||||||
|
|
||||||
|
@ -2850,7 +2850,7 @@ if (register_check) {
|
||||||
/* This test is explicitly run after the above reset_all_p() so that any devices
|
/* This test is explicitly run after the above reset_all_p() so that any devices
|
||||||
which dynamically manipulate their register lists have already done that. */
|
which dynamically manipulate their register lists have already done that. */
|
||||||
sim_printf (" Running internal register sanity checks on %s simulator.\n", sim_name);
|
sim_printf (" Running internal register sanity checks on %s simulator.\n", sim_name);
|
||||||
if ((stat = sim_sanity_check_register_declarations ()) != SCPE_OK) {
|
if ((stat = sim_sanity_check_register_declarations (NULL)) != SCPE_OK) {
|
||||||
sim_printf ("Simulator device register sanity check error\n");
|
sim_printf ("Simulator device register sanity check error\n");
|
||||||
if (sim_ttisatty())
|
if (sim_ttisatty())
|
||||||
read_line_p ("Hit Return to exit: ", cbuf, sizeof (cbuf) - 1, stdin);
|
read_line_p ("Hit Return to exit: ", cbuf, sizeof (cbuf) - 1, stdin);
|
||||||
|
@ -2872,7 +2872,7 @@ if ((stat = sim_brk_init ()) != SCPE_OK) {
|
||||||
goto cleanup_and_exit;
|
goto cleanup_and_exit;
|
||||||
}
|
}
|
||||||
/* always check for register definition problems */
|
/* always check for register definition problems */
|
||||||
sim_sanity_check_register_declarations ();
|
sim_sanity_check_register_declarations (NULL);
|
||||||
|
|
||||||
signal (SIGINT, int_handler);
|
signal (SIGINT, int_handler);
|
||||||
if (!sim_quiet) {
|
if (!sim_quiet) {
|
||||||
|
@ -15753,14 +15753,17 @@ free (f);
|
||||||
* device state variables it is supposed to reference.
|
* device state variables it is supposed to reference.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static t_stat sim_sanity_check_register_declarations (void)
|
static t_stat sim_sanity_check_register_declarations (DEVICE **devices)
|
||||||
{
|
{
|
||||||
t_stat stat = SCPE_OK;
|
t_stat stat = SCPE_OK;
|
||||||
int i;
|
int i;
|
||||||
DEVICE *dptr;
|
DEVICE *dptr;
|
||||||
MFILE *f = MOpen ();
|
MFILE *f = MOpen ();
|
||||||
|
|
||||||
for (i = 0; (dptr = sim_devices[i]) != NULL; i++) {
|
if (devices == NULL) /* Test DEVICE not provided? */
|
||||||
|
devices = sim_devices; /* then Default to simulator's DEVICEs */
|
||||||
|
|
||||||
|
for (i = 0; (dptr = devices[i]) != NULL; i++) {
|
||||||
REG *rptr;
|
REG *rptr;
|
||||||
|
|
||||||
for (rptr = dptr->registers; (rptr != NULL) && (rptr->name != NULL); rptr++) {
|
for (rptr = dptr->registers; (rptr != NULL) && (rptr->name != NULL); rptr++) {
|
||||||
|
@ -15779,7 +15782,7 @@ for (i = 0; (dptr = sim_devices[i]) != NULL; i++) {
|
||||||
if (rptr->flags & REG_UNIT) {
|
if (rptr->flags & REG_UNIT) {
|
||||||
DEVICE **d;
|
DEVICE **d;
|
||||||
|
|
||||||
for (d = sim_devices; *d != NULL; d++) {
|
for (d = devices; *d != NULL; d++) {
|
||||||
if (((UNIT *)rptr->loc >= (*d)->units) &&
|
if (((UNIT *)rptr->loc >= (*d)->units) &&
|
||||||
((UNIT *)rptr->loc < (*d)->units + (*d)->numunits)) {
|
((UNIT *)rptr->loc < (*d)->units + (*d)->numunits)) {
|
||||||
udptr = *d;
|
udptr = *d;
|
||||||
|
@ -15865,6 +15868,54 @@ MClose (f);
|
||||||
return stat;
|
return stat;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8 treg8;
|
||||||
|
uint16 treg16;
|
||||||
|
uint32 treg32;
|
||||||
|
t_value tregval;
|
||||||
|
|
||||||
|
static struct validation_test {
|
||||||
|
REG reg[5];
|
||||||
|
t_stat expected_result;
|
||||||
|
} validations[] = {
|
||||||
|
{ { { ORDATAD (REG8, treg8, 8*sizeof(treg8), "8 bit register") },
|
||||||
|
{ ORDATAD (REG16, treg16, 8*sizeof(treg16), "16 bit register") },
|
||||||
|
{ ORDATAD (REG32, treg32, 8*sizeof(treg32), "32 bit register") },
|
||||||
|
{ ORDATAD (REGVAL, tregval, 8*sizeof(tregval), "value register") },
|
||||||
|
{NULL} },
|
||||||
|
SCPE_OK},
|
||||||
|
{ { { ORDATAD (REG8, treg8, 8*sizeof(treg8), "8 bit register") },
|
||||||
|
{ ORDATAD (REG16, treg16, 8*sizeof(treg16), "16 bit register") },
|
||||||
|
{ ORDATAD (REG32, treg32, 8*sizeof(treg32), "32 bit register") },
|
||||||
|
{ ORDATAD (REGVAL, tregval, 8*sizeof(tregval), "value register") },
|
||||||
|
{NULL} },
|
||||||
|
SCPE_OK},
|
||||||
|
{NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
static UNIT validate_units[3];
|
||||||
|
|
||||||
|
static DEVICE validate_test = {
|
||||||
|
"TEST-REG", validate_units, NULL, NULL,
|
||||||
|
3, 16, 22, 4, 16, 16};
|
||||||
|
|
||||||
|
static t_stat test_register_validation (void)
|
||||||
|
{
|
||||||
|
struct validation_test *v;
|
||||||
|
DEVICE *v_devs[] = {&validate_test,
|
||||||
|
NULL};
|
||||||
|
|
||||||
|
if (sim_switches & SWMASK ('T'))
|
||||||
|
sim_messagef (SCPE_OK, "test_register_validation - starting\n");
|
||||||
|
for (v = validations; v->reg[0].name != NULL; v++) {
|
||||||
|
validate_test.registers = v->reg;
|
||||||
|
if (SCPE_OK != sim_sanity_check_register_declarations (v_devs))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (sim_switches & SWMASK ('T'))
|
||||||
|
sim_messagef (SCPE_OK, "test_register_validation - done\n");
|
||||||
|
return SCPE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
typedef const char *(*parse_function)(const char *input, char *output, char end_char);
|
typedef const char *(*parse_function)(const char *input, char *output, char end_char);
|
||||||
struct function_test_data {
|
struct function_test_data {
|
||||||
char end_char;
|
char end_char;
|
||||||
|
@ -15992,7 +16043,7 @@ sim_printf ("Unit %s fired at %.0f\n", sim_uname (uptr), sim_gtime ());
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static t_stat test_scp_event_sequencing ()
|
static t_stat test_scp_event_sequencing (void)
|
||||||
{
|
{
|
||||||
DEVICE *dptr = &sim_scp_dev;
|
DEVICE *dptr = &sim_scp_dev;
|
||||||
uint32 i;
|
uint32 i;
|
||||||
|
@ -16104,7 +16155,7 @@ char gbuf[CBUFSIZE];
|
||||||
GET_SWITCHES (cptr); /* get switches */
|
GET_SWITCHES (cptr); /* get switches */
|
||||||
saved_switches |= sim_switches;
|
saved_switches |= sim_switches;
|
||||||
if (sim_time != 0.0)
|
if (sim_time != 0.0)
|
||||||
return sim_messagef (SCPE_UNK, "Library tests can not be performed after instructions have been executed.\n");
|
return sim_messagef (SCPE_UNK, "Library tests can only be performed before any other commands are processed.\n");
|
||||||
sim_switches = 0;
|
sim_switches = 0;
|
||||||
detach_all (0, 0); /* Assure that all units are unattached */
|
detach_all (0, 0); /* Assure that all units are unattached */
|
||||||
sim_switches = saved_switches;
|
sim_switches = saved_switches;
|
||||||
|
@ -16124,6 +16175,8 @@ if (sim_switches & SWMASK ('D')) {
|
||||||
sim_switches = saved_switches;
|
sim_switches = saved_switches;
|
||||||
}
|
}
|
||||||
if ((strcmp (gbuf, "ALL") == 0) || (strcmp (gbuf, "SCP") == 0)) {
|
if ((strcmp (gbuf, "ALL") == 0) || (strcmp (gbuf, "SCP") == 0)) {
|
||||||
|
if (test_register_validation () != SCPE_OK)
|
||||||
|
return sim_messagef (SCPE_IERR, "SCP register validation test failed\n");
|
||||||
if (test_scp_parsing () != SCPE_OK)
|
if (test_scp_parsing () != SCPE_OK)
|
||||||
return sim_messagef (SCPE_IERR, "SCP parsing test failed\n");
|
return sim_messagef (SCPE_IERR, "SCP parsing test failed\n");
|
||||||
if (test_scp_event_sequencing () != SCPE_OK)
|
if (test_scp_event_sequencing () != SCPE_OK)
|
||||||
|
|
Loading…
Add table
Reference in a new issue