diff --git a/src/apr.c b/src/apr.c index 70f6a32..02b1d0b 100644 --- a/src/apr.c +++ b/src/apr.c @@ -3061,8 +3061,15 @@ aprmain(void *p) apr->nnextpulses = 0; apr->ia_inh = 0; + apr->membus.c12 = 0; + apr->membus.c34 = 0; apr->iobus.c12 = 0; apr->iobus.c34 = 0; + if(apr->membus.fmem) + apr->membus.fmem->poweron(apr->membus.fmem); + for(i = 0; i < 16; i++) + if(apr->membus.cmem[i]) + apr->membus.cmem[i]->poweron(apr->membus.cmem[i]); nextpulse(apr, mr_pwr_clr); while(apr->sw_power){ diff --git a/src/mem.c b/src/mem.c index 4512e95..1aadd4d 100644 --- a/src/mem.c +++ b/src/mem.c @@ -130,6 +130,18 @@ end: return 0; } +static void +powercore(Mem *mem) +{ + CMem *core; + + core = mem->module; + readmem(core->filename, core->core, 040000); + core->cmc_aw_rq = 1; + core->cmc_p_act = -1; + core->cmc_last_proc = 2; /* not reset by the hardware :/ */ +} + /* This is based on the 162 memory */ static int wakeff(Mem *mem, Membus *bus) @@ -183,6 +195,16 @@ end: return 0; } +static void +powerff(Mem *mem) +{ + FMem *ff; + + ff = mem->module; + ff->fmc_act = 0; + ff->fmc_wr = 0; +} + void wakemem(Membus *bus) { @@ -217,13 +239,8 @@ makecoremem(const char *file) Mem *mem; core = malloc(sizeof(CMem)); - memset(core, 0, sizeof(CMem)); core->filename = file; pthread_mutex_init(&core->mutex, nil); - core->cmc_aw_rq = 1; - core->cmc_p_act = -1; - core->cmc_last_proc = 2; - readmem(core->filename, core->core, 040000); mem = malloc(sizeof(Mem)); mem->module = core; @@ -232,6 +249,7 @@ makecoremem(const char *file) mem->bus[2] = &memterm; mem->bus[3] = &memterm; mem->wake = wakecore; + mem->poweron = powercore; return mem; } @@ -253,6 +271,7 @@ makefastmem(int p) mem->bus[2] = &memterm; mem->bus[3] = &memterm; mem->wake = wakeff; + mem->poweron = powerff; return mem; } diff --git a/src/pdp6.h b/src/pdp6.h index cb67c36..6aae3ad 100644 --- a/src/pdp6.h +++ b/src/pdp6.h @@ -151,6 +151,7 @@ struct Mem void *module; Membus *bus[4]; int (*wake)(Mem *mem, Membus *bus); + void (*poweron)(Mem *mem); }; struct Membus