From d75c072235285920f68e2b5a2ddf634c16b7251d Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Mon, 30 Mar 2015 13:52:48 -0700 Subject: [PATCH] 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 --- VAX/vax610_syslist.c | 7 +++++++ VAX/vax630_syslist.c | 12 ++++++++++++ VAX/vax780_syslist.c | 7 +++++++ VAX/vax860_syslist.c | 7 +++++++ VAX/vax_syslist.c | 7 +++++++ scp.c | 20 +++++++++++++------- scp.h | 2 +- 7 files changed, 54 insertions(+), 8 deletions(-) diff --git a/VAX/vax610_syslist.c b/VAX/vax610_syslist.c index 2c8c182e..13aeef4d 100644 --- a/VAX/vax610_syslist.c +++ b/VAX/vax610_syslist.c @@ -31,6 +31,13 @@ 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 mctl_dev; extern DEVICE tlb_dev; diff --git a/VAX/vax630_syslist.c b/VAX/vax630_syslist.c index 85d80df0..c5555631 100644 --- a/VAX/vax630_syslist.c +++ b/VAX/vax630_syslist.c @@ -31,10 +31,22 @@ #if defined(VAX_620) char sim_name[] = "rtVAX1000 (KA620)"; + +void vax_init(void) +{ +sim_savename = "rtVAX1000 (KA620)"; +} #else char sim_name[32] = "MicroVAX II (KA630)"; + +void vax_init(void) +{ +sim_savename = "MicroVAX II (KA630)"; +} #endif +void (*sim_vm_init) (void) = &vax_init; + extern DEVICE cpu_dev; extern DEVICE tlb_dev; extern DEVICE rom_dev; diff --git a/VAX/vax780_syslist.c b/VAX/vax780_syslist.c index 8cec8ef8..44bdf301 100644 --- a/VAX/vax780_syslist.c +++ b/VAX/vax780_syslist.c @@ -31,6 +31,13 @@ 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 tlb_dev; extern DEVICE sbi_dev; diff --git a/VAX/vax860_syslist.c b/VAX/vax860_syslist.c index 882fd5ce..243fa314 100644 --- a/VAX/vax860_syslist.c +++ b/VAX/vax860_syslist.c @@ -31,6 +31,13 @@ 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 tlb_dev; extern DEVICE abus_dev; diff --git a/VAX/vax_syslist.c b/VAX/vax_syslist.c index ccc2b051..635619e5 100644 --- a/VAX/vax_syslist.c +++ b/VAX/vax_syslist.c @@ -32,6 +32,13 @@ 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 tlb_dev; extern DEVICE rom_dev; diff --git a/scp.c b/scp.c index 2182848b..2f84763c 100644 --- a/scp.c +++ b/scp.c @@ -528,10 +528,12 @@ static const char *sim_sa64 = "64b addresses"; #else static const char *sim_sa64 = "32b addresses"; #endif +const char *sim_savename = sim_name; /* Simulator Name used in SAVE/RESTORE images */ /* 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_ver30[] = "V3.0"; const struct scp_error { @@ -5406,7 +5408,7 @@ REG *rptr; fprintf (sfile, "%s\n%s\n%s\n%s\n%s\n%.0f\n", save_vercur, /* [V2.5] save format */ - sim_name, /* sim name */ + sim_savename, /* sim name */ sim_si64, sim_sa64, eth_capabilities(), /* [V3.5] options */ sim_time); /* [V3.2] sim 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_stat r; size_t sz; -t_bool v35, v32; +t_bool v40, v35, v32; DEVICE *dptr; UNIT *uptr; REG *rptr; @@ -5547,8 +5549,10 @@ t_bool force_restore = sim_switches & SWMASK ('F'); fstat (fileno (rfile), &rstat); READ_S (buf); /* [V2.5+] read version */ -v35 = v32 = FALSE; -if (strcmp (buf, save_vercur) == 0) /* version 3.5? */ +v40 = v35 = v32 = FALSE; +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; else if (strcmp (buf, save_ver32) == 0) /* version 3.2? */ v32 = TRUE; @@ -5557,7 +5561,7 @@ else if (strcmp (buf, save_ver30) != 0) { /* version 3.0? */ return SCPE_INCOMP; } 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); return SCPE_INCOMP; } @@ -5619,7 +5623,9 @@ for ( ;; ) { /* device loop */ READ_I (uptr->u5); /* [V3.0+] more dev spec */ READ_I (uptr->u6); READ_I (flg); /* [V2.10+] unit flags */ - READ_I (uptr->dynflags); + if (v40) { /* [V4.0+] dynflags */ + READ_I (uptr->dynflags); + } old_capac = uptr->capac; /* save current capacity */ if (v35) { /* [V3.5+] capacity */ READ_I (uptr->capac); diff --git a/scp.h b/scp.h index 7c3ff0f9..cb1d96a4 100644 --- a/scp.h +++ b/scp.h @@ -229,6 +229,7 @@ extern struct timespec sim_deb_basetime; /* debug base time for r extern UNIT *sim_clock_queue; extern int32 sim_is_running; extern char *sim_prompt; /* prompt string */ +extern const char *sim_savename; /* Simulator Name used in Save/Restore files */ extern t_value *sim_eval; extern volatile int32 stop_cpu; 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_bool (*sim_vm_is_subroutine_call) (t_addr **ret_addrs); - #endif