--- trunk/src/devices/dev_pccmos.c 2007/10/08 16:18:56 15 +++ trunk/src/devices/dev_pccmos.c 2007/10/08 16:19:01 16 @@ -25,7 +25,7 @@ * SUCH DAMAGE. * * - * $Id: dev_pccmos.c,v 1.4 2005/10/04 04:11:14 debug Exp $ + * $Id: dev_pccmos.c,v 1.7 2005/10/09 22:21:31 debug Exp $ * * PC CMOS/RTC device. * @@ -74,8 +74,8 @@ * RTC; all other access are treated as CMOS RAM read/writes. */ - switch (relative_addr) { - case 0: if (writeflag == MEM_WRITE) { + if ((relative_addr & 1) == 0) { + if (writeflag == MEM_WRITE) { d->select = idata; if (idata <= 0x0d) { cpu->memory_rw(cpu, cpu->mem, @@ -84,8 +84,8 @@ } } else odata = d->select; - break; - case 1: if (d->select <= 0x0d) { + } else { + if (d->select <= 0x0d) { if (writeflag == MEM_WRITE) { cpu->memory_rw(cpu, cpu->mem, PCCMOS_MC146818_FAKE_ADDR + 1, &b, 1, @@ -102,15 +102,6 @@ else odata = d->ram[d->select]; } - break; - default: - if (writeflag == MEM_WRITE) { - fatal("[ pccmos: unimplemented write to address 0x%x" - " data=0x%02x ]\n", (int)relative_addr, (int)idata); - } else { - fatal("[ pccmos: unimplemented read from address 0x%x " - "]\n", (int)relative_addr); - } } if (writeflag == MEM_READ) @@ -126,7 +117,7 @@ int devinit_pccmos(struct devinit *devinit) { struct pccmos_data *d = malloc(sizeof(struct pccmos_data)); - int irq_nr; + int irq_nr, type = MC146818_PC_CMOS, len = DEV_PCCMOS_LENGTH; if (d == NULL) { fprintf(stderr, "out of memory\n"); @@ -134,16 +125,15 @@ } memset(d, 0, sizeof(struct pccmos_data)); - memory_device_register(devinit->machine->memory, devinit->name, - devinit->addr, DEV_PCCMOS_LENGTH, dev_pccmos_access, (void *)d, - MEM_DEFAULT, NULL); - /* * Different machines use different IRQ schemes. */ switch (devinit->machine->machine_type) { case MACHINE_CATS: irq_nr = 32 + 8; + type = MC146818_CATS; + d->ram[0x48] = 20; /* century */ + len = DEV_PCCMOS_LENGTH * 2; break; case MACHINE_X86: irq_nr = 16; /* "No" irq */ @@ -153,8 +143,12 @@ exit(1); } + memory_device_register(devinit->machine->memory, devinit->name, + devinit->addr, len, dev_pccmos_access, (void *)d, + MEM_DEFAULT, NULL); + dev_mc146818_init(devinit->machine, devinit->machine->memory, - PCCMOS_MC146818_FAKE_ADDR, irq_nr, MC146818_PC_CMOS, 1); + PCCMOS_MC146818_FAKE_ADDR, irq_nr, type, 1); return 1; }