--- trunk/src/devices/dev_scc.c 2007/10/08 16:18:00 4 +++ trunk/src/devices/dev_scc.c 2007/10/08 16:21:17 34 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003-2005 Anders Gavare. All rights reserved. + * Copyright (C) 2003-2007 Anders Gavare. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -25,7 +25,7 @@ * SUCH DAMAGE. * * - * $Id: dev_scc.c,v 1.27 2005/02/25 06:14:30 debug Exp $ + * $Id: dev_scc.c,v 1.37 2007/01/28 14:15:30 debug Exp $ * * Serial controller on some DECsystems and SGI machines. (Z8530 ?) * Most of the code in here is written for DECsystem emulation, though. @@ -40,6 +40,15 @@ * emulate the same lk201 behaviour as when using the dc device) * DMA * More correct interrupt support. + * + ****************************************************************************** + * _____ ___ ____ ___ _ + * |_ _/ _ \| _ \ / _ \| | + * | || | | | | | | | | | | + * | || |_| | |_| | |_| |_| + * |_| \___/|____/ \___/(_) + * + * Since this is actually a Z8530, it should be merged with dev_z8530.c! */ #include @@ -138,10 +147,7 @@ } -/* - * dev_scc_tick(): - */ -void dev_scc_tick(struct cpu *cpu, void *extra) +DEVICE_TICK(scc) { int i; struct scc_data *d = (struct scc_data *) extra; @@ -153,7 +159,7 @@ d->console_handle), 2); } if (d->use_fb == 1 && d->scc_nr == 1) - lk201_tick(&d->lk201); + lk201_tick(cpu->machine, &d->lk201); for (i=0; iscc_register_r[i * N_SCC_REGS + SCC_RR0] |= SCC_RR0_TX_EMPTY; @@ -178,8 +184,11 @@ if (d->scc_register_r[i * N_SCC_REGS + SCC_RR3] & SCC_RR3_TX_IP_A || d->scc_register_r[i * N_SCC_REGS + SCC_RR3] - & SCC_RR3_TX_IP_B) - cpu_interrupt(cpu, d->irq_nr); + & SCC_RR3_TX_IP_B) { +fatal("TODO: legacy rewrite!\n"); +abort(); +// cpu_interrupt(cpu, d->irq_nr); + } } /* RX interrupts? */ @@ -198,8 +207,11 @@ if (d->scc_register_r[i * N_SCC_REGS + SCC_RR3] & SCC_RR3_RX_IP_A || d->scc_register_r[i * N_SCC_REGS + SCC_RR3] - & SCC_RR3_RX_IP_B) - cpu_interrupt(cpu, d->irq_nr); + & SCC_RR3_RX_IP_B) { +fatal("TODO: legacy rewrite!\n"); +abort(); +// cpu_interrupt(cpu, d->irq_nr); + } } if (d->scc_register_w[N_SCC_REGS + SCC_WR1] & @@ -221,9 +233,11 @@ d->scc_register_r[i * N_SCC_REGS + SCC_RR3] & SCC_RR3_EXT_IP_B) { - cpu_interrupt(cpu, d->irq_nr); +fatal("TODO: legacy rewrite!\n"); +abort(); +// cpu_interrupt(cpu, d->irq_nr); /* TODO: huh? */ -cpu_interrupt(cpu, 8 + 0x02000000); +//cpu_interrupt(cpu, 8 + 0x02000000); } } } @@ -289,19 +303,15 @@ } -/* - * dev_scc_access(): - */ -int dev_scc_access(struct cpu *cpu, struct memory *mem, - uint64_t relative_addr, unsigned char *data, size_t len, - int writeflag, void *extra) +DEVICE_ACCESS(scc) { struct scc_data *d = (struct scc_data *) extra; uint64_t idata = 0, odata = 0; int port; int ultrix_mode = 0; - idata = memory_readmax64(cpu, data, len); + if (writeflag == MEM_WRITE) + idata = memory_readmax64(cpu, data, len); /* relative_addr /= d->addrmul; */ /* See SGI comment below instead. */ @@ -344,7 +354,10 @@ d->scc_register_r[port * N_SCC_REGS + SCC_RR3] = 0; - cpu_interrupt_ack(cpu, d->irq_nr); + +fatal("TODO: legacy rewrite!\n"); +abort(); +// cpu_interrupt_ack(cpu, d->irq_nr); } #ifdef SCC_DEBUG @@ -391,7 +404,10 @@ /* TODO: perhaps only clear the RX part of RR3? */ d->scc_register_r[N_SCC_REGS + SCC_RR3] = 0; - cpu_interrupt_ack(cpu, d->irq_nr); + +fatal("TODO: legacy rewrite!\n"); +abort(); +// cpu_interrupt_ack(cpu, d->irq_nr); debug("[ scc: (port %i) read from 0x%08lx: 0x%02x ]\n", port, (long)relative_addr, (int)odata); @@ -468,14 +484,14 @@ d->scc_nr = scc_nr; d->use_fb = use_fb; d->addrmul = addrmul; - d->console_handle = console_start_slave(machine, "SCC"); + d->console_handle = console_start_slave(machine, "SCC", 1); lk201_init(&d->lk201, use_fb, dev_scc_add_to_rx_queue, d->console_handle, d); memory_device_register(mem, "scc", baseaddr, DEV_SCC_LENGTH, - dev_scc_access, d, MEM_DEFAULT, NULL); - machine_add_tickfunction(machine, dev_scc_tick, d, SCC_TICK_SHIFT); + dev_scc_access, d, DM_DEFAULT, NULL); + machine_add_tickfunction(machine, dev_scc_tick, d, SCC_TICK_SHIFT, 0.0); return (void *) d; }