VAX, VAX780, VAX8600, MicroVAX1, MicroVAX2: Stabilize SAVE/RESTORE capabilities to allow restore of older version VAX and VAX780 save images and to properly allow simulator restores of processor model variations as discussed in #197 points 1 & 2

This commit is contained in:
Mark Pizzolato 2015-03-30 13:52:48 -07:00
parent 478ff3d453
commit d75c072235
7 changed files with 54 additions and 8 deletions

View file

@ -31,6 +31,13 @@
char sim_name[32] = "MicroVAX I (KA610)"; char sim_name[32] = "MicroVAX I (KA610)";
void vax_init(void)
{
sim_savename = "MicroVAX I (KA610)";
}
void (*sim_vm_init) (void) = &vax_init;
extern DEVICE cpu_dev; extern DEVICE cpu_dev;
extern DEVICE mctl_dev; extern DEVICE mctl_dev;
extern DEVICE tlb_dev; extern DEVICE tlb_dev;

View file

@ -31,10 +31,22 @@
#if defined(VAX_620) #if defined(VAX_620)
char sim_name[] = "rtVAX1000 (KA620)"; char sim_name[] = "rtVAX1000 (KA620)";
void vax_init(void)
{
sim_savename = "rtVAX1000 (KA620)";
}
#else #else
char sim_name[32] = "MicroVAX II (KA630)"; char sim_name[32] = "MicroVAX II (KA630)";
void vax_init(void)
{
sim_savename = "MicroVAX II (KA630)";
}
#endif #endif
void (*sim_vm_init) (void) = &vax_init;
extern DEVICE cpu_dev; extern DEVICE cpu_dev;
extern DEVICE tlb_dev; extern DEVICE tlb_dev;
extern DEVICE rom_dev; extern DEVICE rom_dev;

View file

@ -31,6 +31,13 @@
char sim_name[] = "VAX 11/780"; char sim_name[] = "VAX 11/780";
void vax_init(void)
{
sim_savename = "VAX780";
}
void (*sim_vm_init) (void) = &vax_init;
extern DEVICE cpu_dev; extern DEVICE cpu_dev;
extern DEVICE tlb_dev; extern DEVICE tlb_dev;
extern DEVICE sbi_dev; extern DEVICE sbi_dev;

View file

@ -31,6 +31,13 @@
char sim_name[] = "VAX 8600"; char sim_name[] = "VAX 8600";
void vax_init(void)
{
sim_savename = "VAX 8600";
}
void (*sim_vm_init) (void) = &vax_init;
extern DEVICE cpu_dev; extern DEVICE cpu_dev;
extern DEVICE tlb_dev; extern DEVICE tlb_dev;
extern DEVICE abus_dev; extern DEVICE abus_dev;

View file

@ -32,6 +32,13 @@
char sim_name[64] = "MicroVAX 3900"; char sim_name[64] = "MicroVAX 3900";
void vax_init(void)
{
sim_savename = "VAX";
}
void (*sim_vm_init) (void) = &vax_init;
extern DEVICE cpu_dev; extern DEVICE cpu_dev;
extern DEVICE tlb_dev; extern DEVICE tlb_dev;
extern DEVICE rom_dev; extern DEVICE rom_dev;

18
scp.c
View file

@ -528,10 +528,12 @@ static const char *sim_sa64 = "64b addresses";
#else #else
static const char *sim_sa64 = "32b addresses"; static const char *sim_sa64 = "32b addresses";
#endif #endif
const char *sim_savename = sim_name; /* Simulator Name used in SAVE/RESTORE images */
/* Tables and strings */ /* Tables and strings */
const char save_vercur[] = "V3.5"; const char save_vercur[] = "V4.0";
const char save_ver35[] = "V3.5";
const char save_ver32[] = "V3.2"; const char save_ver32[] = "V3.2";
const char save_ver30[] = "V3.0"; const char save_ver30[] = "V3.0";
const struct scp_error { const struct scp_error {
@ -5406,7 +5408,7 @@ REG *rptr;
fprintf (sfile, "%s\n%s\n%s\n%s\n%s\n%.0f\n", fprintf (sfile, "%s\n%s\n%s\n%s\n%s\n%.0f\n",
save_vercur, /* [V2.5] save format */ save_vercur, /* [V2.5] save format */
sim_name, /* sim name */ sim_savename, /* sim name */
sim_si64, sim_sa64, eth_capabilities(), /* [V3.5] options */ sim_si64, sim_sa64, eth_capabilities(), /* [V3.5] options */
sim_time); /* [V3.2] sim time */ sim_time); /* [V3.2] sim time */
WRITE_I (sim_rtime); /* [V2.6] sim rel time */ WRITE_I (sim_rtime); /* [V2.6] sim rel time */
@ -5533,7 +5535,7 @@ t_addr k, high, old_capac;
t_value val, mask; t_value val, mask;
t_stat r; t_stat r;
size_t sz; size_t sz;
t_bool v35, v32; t_bool v40, v35, v32;
DEVICE *dptr; DEVICE *dptr;
UNIT *uptr; UNIT *uptr;
REG *rptr; REG *rptr;
@ -5547,8 +5549,10 @@ t_bool force_restore = sim_switches & SWMASK ('F');
fstat (fileno (rfile), &rstat); fstat (fileno (rfile), &rstat);
READ_S (buf); /* [V2.5+] read version */ READ_S (buf); /* [V2.5+] read version */
v35 = v32 = FALSE; v40 = v35 = v32 = FALSE;
if (strcmp (buf, save_vercur) == 0) /* version 3.5? */ if (strcmp (buf, save_vercur) == 0) /* version 4.0? */
v40 = v35 = v32 = TRUE;
if (strcmp (buf, save_ver35) == 0) /* version 3.5? */
v35 = v32 = TRUE; v35 = v32 = TRUE;
else if (strcmp (buf, save_ver32) == 0) /* version 3.2? */ else if (strcmp (buf, save_ver32) == 0) /* version 3.2? */
v32 = TRUE; v32 = TRUE;
@ -5557,7 +5561,7 @@ else if (strcmp (buf, save_ver30) != 0) { /* version 3.0? */
return SCPE_INCOMP; return SCPE_INCOMP;
} }
READ_S (buf); /* read sim name */ READ_S (buf); /* read sim name */
if (strcmp (buf, sim_name)) { /* name match? */ if (strcmp (buf, sim_savename)) { /* name match? */
sim_printf ("Wrong system type: %s\n", buf); sim_printf ("Wrong system type: %s\n", buf);
return SCPE_INCOMP; return SCPE_INCOMP;
} }
@ -5619,7 +5623,9 @@ for ( ;; ) { /* device loop */
READ_I (uptr->u5); /* [V3.0+] more dev spec */ READ_I (uptr->u5); /* [V3.0+] more dev spec */
READ_I (uptr->u6); READ_I (uptr->u6);
READ_I (flg); /* [V2.10+] unit flags */ READ_I (flg); /* [V2.10+] unit flags */
if (v40) { /* [V4.0+] dynflags */
READ_I (uptr->dynflags); READ_I (uptr->dynflags);
}
old_capac = uptr->capac; /* save current capacity */ old_capac = uptr->capac; /* save current capacity */
if (v35) { /* [V3.5+] capacity */ if (v35) { /* [V3.5+] capacity */
READ_I (uptr->capac); READ_I (uptr->capac);

2
scp.h
View file

@ -229,6 +229,7 @@ extern struct timespec sim_deb_basetime; /* debug base time for r
extern UNIT *sim_clock_queue; extern UNIT *sim_clock_queue;
extern int32 sim_is_running; extern int32 sim_is_running;
extern char *sim_prompt; /* prompt string */ extern char *sim_prompt; /* prompt string */
extern const char *sim_savename; /* Simulator Name used in Save/Restore files */
extern t_value *sim_eval; extern t_value *sim_eval;
extern volatile int32 stop_cpu; extern volatile int32 stop_cpu;
extern uint32 sim_brk_types; /* breakpoint info */ extern uint32 sim_brk_types; /* breakpoint info */
@ -266,5 +267,4 @@ extern t_bool (*sim_vm_fprint_stopped) (FILE *st, t_stat reason);
extern t_value (*sim_vm_pc_value) (void); extern t_value (*sim_vm_pc_value) (void);
extern t_bool (*sim_vm_is_subroutine_call) (t_addr **ret_addrs); extern t_bool (*sim_vm_is_subroutine_call) (t_addr **ret_addrs);
#endif #endif