diff --git a/AltairZ80/altairz80_cpu.c b/AltairZ80/altairz80_cpu.c index ab5f724c..574202ec 100644 --- a/AltairZ80/altairz80_cpu.c +++ b/AltairZ80/altairz80_cpu.c @@ -6159,7 +6159,10 @@ static t_stat sim_instr_mmu (void) { static t_stat cpu_reset(DEVICE *dptr) { int32 i; - sim_vm_is_subroutine_call = cpu_is_pc_a_subroutine_call; + if (sim_vm_is_subroutine_call == NULL) { /* First time reset? */ + sim_vm_is_subroutine_call = cpu_is_pc_a_subroutine_call; + altairz80_init(); + } AF_S = AF1_S = 0; BC_S = DE_S = HL_S = 0; BC1_S = DE1_S = HL1_S = 0; @@ -6802,8 +6805,6 @@ void altairz80_init(void) { /* altairz80_print_tables(); */ } -WEAK void (*sim_vm_init) (void) = &altairz80_init; - /* This is the binary loader. The input file is considered to be a string of literal bytes with no special format. The load starts at the current value of the PC if no start address is given. If the input string ends with ROM diff --git a/HP2100/hp2100_sys.c b/HP2100/hp2100_sys.c index 18cb772a..6c73ad47 100644 --- a/HP2100/hp2100_sys.c +++ b/HP2100/hp2100_sys.c @@ -1874,7 +1874,7 @@ char sim_name [] = "HP 2100"; /* the simulator name */ int32 sim_emax = MAX_INSTR_LENGTH; /* the maximum number of words in any instruction */ -void (*sim_vm_init) (void) = &one_time_init; /* a pointer to the one-time initializer */ +WEAK void (*sim_vm_init) (void) = &one_time_init; /* a pointer to the one-time initializer */ DEVICE *sim_devices [] = { /* an array of pointers to the simulated devices */ &cpu_dev, /* CPU (must be first) */ diff --git a/HP3000/hp3000_sys.c b/HP3000/hp3000_sys.c index f0dad15b..c58a6411 100644 --- a/HP3000/hp3000_sys.c +++ b/HP3000/hp3000_sys.c @@ -1072,7 +1072,7 @@ char sim_name [] = "HP 3000"; /* the simulator name */ int32 sim_emax = 2; /* the maximum number of words in any instruction */ -void (*sim_vm_init) (void) = &one_time_init; /* a pointer to the one-time initializer */ +WEAK void (*sim_vm_init) (void) = &one_time_init; /* a pointer to the one-time initializer */ DEVICE *sim_devices [] = { /* an array of pointers to the simulated devices */ &cpu_dev, /* CPU (must be first) */ diff --git a/I650/i650_defs.h b/I650/i650_defs.h index f39e09f6..a7321b3d 100644 --- a/I650/i650_defs.h +++ b/I650/i650_defs.h @@ -57,6 +57,7 @@ extern int IAS_TimingRing; extern int WriteAddr(int AR, t_int64 d, int NegZero); extern int ReadAddr(int AR, t_int64 * d, int * NegZero); extern CONST char * DecodeOpcode(t_int64 d, int * opcode, int * DA, int * IA); +extern void vm_init(void); /* digits contants */ diff --git a/I650/i650_sys.c b/I650/i650_sys.c index 2e58b56e..d6449f9a 100644 --- a/I650/i650_sys.c +++ b/I650/i650_sys.c @@ -177,6 +177,11 @@ uint16 ascii_to_hol[128] = { void vm_init(void) { int i; + static int initialized = 0; + + if (initialized) + return; + initialized = 1; // Initialize vm memory to all plus zero for(i = 0; i < MAXDRUMSIZE; i++) DRUM[i] = DRUM_NegativeZeroFlag[i] = 0; for(i = 0; i < 60; i++) IAS[i] = IAS_NegativeZeroFlag[i] = 0; @@ -186,8 +191,6 @@ vm_init(void) { } -void (*sim_vm_init) (void) = &vm_init; - /* Load a card image file into memory. */ t_stat diff --git a/I7000/i701_cpu.c b/I7000/i701_cpu.c index b075dd0a..2290e673 100644 --- a/I7000/i701_cpu.c +++ b/I7000/i701_cpu.c @@ -764,6 +764,9 @@ store: t_stat cpu_reset(DEVICE * dptr) { + extern void sys_init(void); + + sys_init(); AC = 0; MQ = 0; dualcore = 0; diff --git a/I7000/i701_sys.c b/I7000/i701_sys.c index 1c75b578..acdfe48d 100644 --- a/I7000/i701_sys.c +++ b/I7000/i701_sys.c @@ -301,8 +301,6 @@ void sys_init(void) { sim_vm_parse_addr = &parse_addr; } -void (*sim_vm_init) (void) = &sys_init; - /* Symbolic decode Inputs: diff --git a/I7000/i7070_cpu.c b/I7000/i7070_cpu.c index 654de0c9..2ae5114c 100644 --- a/I7000/i7070_cpu.c +++ b/I7000/i7070_cpu.c @@ -132,7 +132,6 @@ int cycle_time = 20; /* Cycle time of 12us */ int32 hst_p = 0; /* History pointer */ int32 hst_lnt = 0; /* History length */ struct InstHistory *hst = NULL; /* History stack */ -void (*sim_vm_init) (void) = &mem_init; /* CPU data structures @@ -2775,6 +2774,12 @@ mem_init() { t_stat cpu_reset(DEVICE * dptr) { + static int initialized = 0; + + if (initialized == 0) { + initialized = 1; + mem_init(); + } AC[1] = PSIGN; AC[2] = PSIGN; diff --git a/I7000/i7080_cpu.c b/I7000/i7080_cpu.c index 50d82bce..f32b1cc8 100644 --- a/I7000/i7080_cpu.c +++ b/I7000/i7080_cpu.c @@ -231,7 +231,6 @@ int32 hst_lnt = 0; /* History length */ struct InstHistory *hst = NULL; /* History stack */ extern uint32 drum_addr; extern UNIT chan_unit[]; -void (*sim_vm_init) (void) = &mem_init; /* CPU data structures @@ -3174,6 +3173,12 @@ cpu_reset(DEVICE * dptr) { int i; int n,p,h; + static int initialized; + + if (initialized == 0) { + initialized = 1; + mem_init(); + } /* Set next and previous address arrays based on CPU type */ if (CPU_MODEL == CPU_702) { diff --git a/Ibm1130/ibm1130_cpu.c b/Ibm1130/ibm1130_cpu.c index b0378874..f407cd17 100644 --- a/Ibm1130/ibm1130_cpu.c +++ b/Ibm1130/ibm1130_cpu.c @@ -162,9 +162,6 @@ static void cgi_start(void); static void cgi_stop(t_stat reason); static int simh_status_to_stopcode (int status); -/* hook pointers from scp.c */ -void (*sim_vm_init) (void) = &sim_init; - /* space to store extra simulator-specific commands */ #define MAX_EXTRA_COMMANDS 10 CTAB x_cmds[MAX_EXTRA_COMMANDS]; @@ -1317,6 +1314,7 @@ void break_simulation (t_stat stopreason) t_stat cpu_reset (DEVICE *dptr) { + sim_init(); wait_state = 0; /* cancel wait */ wait_lamp = TRUE; /* but keep the wait lamp lit on the GUI */ diff --git a/PDQ-3/pdq3_cpu.c b/PDQ-3/pdq3_cpu.c index fdba0b49..fba2f006 100644 --- a/PDQ-3/pdq3_cpu.c +++ b/PDQ-3/pdq3_cpu.c @@ -343,7 +343,9 @@ void cpu_finishAutoload() { /* CPU reset */ t_stat cpu_reset (DEVICE *dptr) { -// sim_printf("CPU RESET\n"); + extern void pdq3_vm_init (void); + pdq3_vm_init(); + // sim_printf("CPU RESET\n"); sim_brk_types = SWMASK('E')|SWMASK('R')|SWMASK('W'); sim_brk_dflt = SWMASK('E'); diff --git a/PDQ-3/pdq3_sys.c b/PDQ-3/pdq3_sys.c index 2c2ab5bf..390c5eb8 100644 --- a/PDQ-3/pdq3_sys.c +++ b/PDQ-3/pdq3_sys.c @@ -34,7 +34,6 @@ #include t_stat parse_sym_m (char *cptr, t_value *val, int32 sw); -void pdq3_vm_init (void); static t_stat pdq3_cmd_exstack(int32 arg, CONST char *buf); static t_stat pdq3_cmd_exmscw(int32 arg, CONST char *buf); static t_stat pdq3_cmd_extib(int32 arg, CONST char *buf); @@ -94,8 +93,6 @@ CTAB pdq3_cmds[] = { { NULL, NULL, 0, NULL } }; -WEAK void (*sim_vm_init)(void) = &pdq3_vm_init; - /* Loader proper */ t_stat sim_load (FILE *fi, CONST char *cptr, CONST char *fnam, int flag) { diff --git a/SAGE/m68k_scp.c b/SAGE/m68k_scp.c index e5fd253c..54ed530e 100644 --- a/SAGE/m68k_scp.c +++ b/SAGE/m68k_scp.c @@ -31,7 +31,6 @@ #include static t_bool symtrace = TRUE; -static void m68k_sim_init(void); static t_stat hdump_cmd(int32 arg, CONST char* buf); static t_stat symset_cmd(int32 arg, CONST char* buf); static t_stat symclr_cmd(int32 arg, CONST char* buf); @@ -56,8 +55,6 @@ static CTAB m68k_sim_cmds[] = { {0,0,0,0} }; -WEAK void (*sim_vm_init)(void) = &m68k_sim_init; - typedef struct _symhash { struct _symhash* nnext; struct _symhash* vnext; @@ -87,7 +84,7 @@ static void sym_clearall(void) return; } -static void m68k_sim_init(void) +void m68k_sim_init(void) { int i; sim_vm_cmd = m68k_sim_cmds; diff --git a/SAGE/sage_cpu.c b/SAGE/sage_cpu.c index 3b3f9610..51b352f5 100644 --- a/SAGE/sage_cpu.c +++ b/SAGE/sage_cpu.c @@ -130,6 +130,10 @@ static void sage_trapcallback(DEVICE* dptr,int trapnum) static t_stat sagecpu_reset(DEVICE* dptr) { t_stat rc; + extern void m68k_sim_init(void); + + + m68k_sim_init(); /* set CPU pointers */ m68kcpu_dev = &sagecpu_dev; diff --git a/VAX/is1000_syslist.c b/VAX/is1000_syslist.c index aab4c39f..c14744a2 100644 --- a/VAX/is1000_syslist.c +++ b/VAX/is1000_syslist.c @@ -34,8 +34,6 @@ void vax_init(void) sim_savename = "InfoServer 1000"; } -WEAK void (*sim_vm_init) (void) = &vax_init; - extern DEVICE cpu_dev; extern DEVICE tlb_dev; extern DEVICE rom_dev; diff --git a/VAX/vax410_syslist.c b/VAX/vax410_syslist.c index 66b5381c..971a3779 100644 --- a/VAX/vax410_syslist.c +++ b/VAX/vax410_syslist.c @@ -34,8 +34,6 @@ void vax_init(void) sim_savename = "MicroVAX 2000 (KA410)"; } -WEAK void (*sim_vm_init) (void) = &vax_init; - extern DEVICE cpu_dev; extern DEVICE tlb_dev; extern DEVICE rom_dev; diff --git a/VAX/vax420_syslist.c b/VAX/vax420_syslist.c index c6c79007..fb64ad00 100644 --- a/VAX/vax420_syslist.c +++ b/VAX/vax420_syslist.c @@ -58,8 +58,6 @@ sim_savename = "VAXstation 3100 M38 (KA42-B)"; #endif } -WEAK void (*sim_vm_init) (void) = &vax_init; - extern DEVICE cpu_dev; extern DEVICE tlb_dev; extern DEVICE rom_dev; diff --git a/VAX/vax43_syslist.c b/VAX/vax43_syslist.c index 3a23ac39..a20c11f5 100644 --- a/VAX/vax43_syslist.c +++ b/VAX/vax43_syslist.c @@ -34,8 +34,6 @@ void vax_init(void) sim_savename = "VAXstation 3100 M76 (KA43-A)"; } -WEAK void (*sim_vm_init) (void) = &vax_init; - extern DEVICE cpu_dev; extern DEVICE tlb_dev; extern DEVICE rom_dev; diff --git a/VAX/vax440_syslist.c b/VAX/vax440_syslist.c index 53db6700..2eba185f 100644 --- a/VAX/vax440_syslist.c +++ b/VAX/vax440_syslist.c @@ -46,8 +46,6 @@ sim_savename = "VAXstation 4000-VLC (KA48)"; #endif } -WEAK void (*sim_vm_init) (void) = &vax_init; - extern DEVICE cpu_dev; extern DEVICE tlb_dev; extern DEVICE rom_dev; diff --git a/VAX/vax610_syslist.c b/VAX/vax610_syslist.c index e38d1ce5..ee6dfe51 100644 --- a/VAX/vax610_syslist.c +++ b/VAX/vax610_syslist.c @@ -36,8 +36,6 @@ void vax_init(void) sim_savename = "MicroVAX I (KA610)"; } -WEAK 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 581fc7a8..a02f81d9 100644 --- a/VAX/vax630_syslist.c +++ b/VAX/vax630_syslist.c @@ -45,8 +45,6 @@ sim_savename = "MicroVAX II (KA630)"; } #endif -WEAK void (*sim_vm_init) (void) = &vax_init; - extern DEVICE cpu_dev; extern DEVICE tlb_dev; extern DEVICE rom_dev; diff --git a/VAX/vax730_syslist.c b/VAX/vax730_syslist.c index 99c4a066..cc80141d 100644 --- a/VAX/vax730_syslist.c +++ b/VAX/vax730_syslist.c @@ -31,6 +31,11 @@ char sim_name[] = "VAX 11/730"; +void vax_init(void) +{ +sim_savename = "VAX730"; +} + extern DEVICE cpu_dev; extern DEVICE tlb_dev; extern DEVICE sysb_dev; diff --git a/VAX/vax750_syslist.c b/VAX/vax750_syslist.c index e2ac0c7b..8cb5afa0 100644 --- a/VAX/vax750_syslist.c +++ b/VAX/vax750_syslist.c @@ -31,6 +31,11 @@ char sim_name[] = "VAX 11/750"; +void vax_init(void) +{ +sim_savename = "VAX750"; +} + extern DEVICE cpu_dev; extern DEVICE tlb_dev; extern DEVICE cmi_dev; diff --git a/VAX/vax780_syslist.c b/VAX/vax780_syslist.c index 2b87a97b..45eb151d 100644 --- a/VAX/vax780_syslist.c +++ b/VAX/vax780_syslist.c @@ -36,8 +36,6 @@ void vax_init(void) sim_savename = "VAX780"; } -WEAK void (*sim_vm_init) (void) = &vax_init; - extern DEVICE cpu_dev; extern DEVICE tlb_dev; extern DEVICE sbi_dev; diff --git a/VAX/vax820_syslist.c b/VAX/vax820_syslist.c index 1f3d99c3..3597a8b5 100644 --- a/VAX/vax820_syslist.c +++ b/VAX/vax820_syslist.c @@ -34,8 +34,6 @@ void vax_init(void) sim_savename = "VAX820"; } -WEAK void (*sim_vm_init) (void) = &vax_init; - extern DEVICE cpu_dev; extern DEVICE tlb_dev; extern DEVICE bi_dev; diff --git a/VAX/vax860_syslist.c b/VAX/vax860_syslist.c index 7dcb8709..b4008856 100644 --- a/VAX/vax860_syslist.c +++ b/VAX/vax860_syslist.c @@ -36,8 +36,6 @@ void vax_init(void) sim_savename = "VAX 8600"; } -WEAK void (*sim_vm_init) (void) = &vax_init; - extern DEVICE cpu_dev; extern DEVICE tlb_dev; extern DEVICE abus_dev; diff --git a/VAX/vax_cpu.c b/VAX/vax_cpu.c index d3926e56..125d8475 100644 --- a/VAX/vax_cpu.c +++ b/VAX/vax_cpu.c @@ -3315,6 +3315,7 @@ ASTLVL = 4; mapen = 0; FLUSH_ISTR; /* init I-stream */ if (M == NULL) { /* first time init? */ + vax_init(); sim_brk_types = sim_brk_dflt = SWMASK ('E'); sim_vm_is_subroutine_call = cpu_is_pc_a_subroutine_call; sim_clock_precalibrate_commands = vax_clock_precalibrate_commands; diff --git a/VAX/vax_defs.h b/VAX/vax_defs.h index 71910486..fbd32596 100644 --- a/VAX/vax_defs.h +++ b/VAX/vax_defs.h @@ -1035,6 +1035,7 @@ extern t_stat cpu_show_instruction_set (FILE *st, UNIT *uptr, int32 val, CONST v extern t_stat cpu_set_instruction_set (UNIT *uptr, int32 val, CONST char *cptr, void *desc); extern t_stat cpu_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr); extern t_stat cpu_model_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr); +extern void vax_init(); extern const uint32 byte_mask[33]; extern int32 autcon_enb; /* autoconfig enable */ extern int32 int_req[IPL_HLVL]; /* intr, IPL 14-17 */ diff --git a/VAX/vax_syslist.c b/VAX/vax_syslist.c index b1c17e6e..b31995e3 100644 --- a/VAX/vax_syslist.c +++ b/VAX/vax_syslist.c @@ -37,8 +37,6 @@ void vax_init(void) sim_savename = "VAX"; } -WEAK void (*sim_vm_init) (void) = &vax_init; - extern DEVICE cpu_dev; extern DEVICE tlb_dev; extern DEVICE rom_dev; diff --git a/doc/simh.doc b/doc/simh.doc index 9a0fd409..2199f719 100644 Binary files a/doc/simh.doc and b/doc/simh.doc differ diff --git a/scp.h b/scp.h index ae7b5b25..409c3a1a 100644 --- a/scp.h +++ b/scp.h @@ -417,7 +417,7 @@ extern t_stat parse_sym (CONST char *cptr, t_addr addr, UNIT *uptr, t_value *val /* The per-simulator init routine is a weak global that defaults to NULL The other per-simulator pointers can be overrriden by the init routine */ -WEAK extern void (*sim_vm_init) (void); +extern void (*sim_vm_init) (void); extern char *(*sim_vm_read) (char *ptr, int32 size, FILE *stream); extern void (*sim_vm_post) (t_bool from_scp); extern CTAB *sim_vm_cmd; diff --git a/sim_defs.h b/sim_defs.h index a90eb2d6..a60fad3d 100644 --- a/sim_defs.h +++ b/sim_defs.h @@ -322,12 +322,16 @@ typedef uint32 t_addr; #define WEAK __attribute__((weak)) #elif defined(_MSC_VER) #define WEAK __declspec(selectany) -#else -#define WEAK extern -#endif -#else -#define WEAK -#endif +#else /* !defined(__GNUC__) && !defined(_MSC_VER) */ +#define WEAK +#endif /* __GNUC__ */ +#else /* !defined(__cplusplus) */ +#if defined(__GNUC__) +#define WEAK __attribute__((common)) +#else /* !defined(__GNUC__) */ +#define WEAK +#endif /* defined(__GNUC__) */ +#endif /* defined(__cplusplus) */ /* System independent definitions */