static int net_store(unsigned cpunum, void *d, u_int32_t offset, u_int32_t val) { struct net_data *nd = d; (void)cpunum; if (offset >= NET_READBUF && offset < NET_READBUF+NET_BUFSIZE) { char *ptr = &nd->nd_rbuf[offset - NET_READBUF]; *(u_int32_t *)ptr = htonl(val); return 0; } else if (offset >= NET_WRITEBUF && offset < NET_WRITEBUF+NET_BUFSIZE) { char *ptr = &nd->nd_wbuf[offset - NET_WRITEBUF]; *(u_int32_t *)ptr = htonl(val); return 0; } switch (offset) { case NETREG_READINTR: setirq(nd, val, 1); break; case NETREG_WRITEINTR: setirq(nd, val, 0); break; case NETREG_CONTROL: setctl(nd, val); break; case NETREG_STATUS: return -1; default: return -1; } return 0; }
static int serial_store(unsigned cpunum, void *d, uint32_t offset, uint32_t val) { struct ser_data *sd = d; (void)cpunum; switch (offset) { case SERREG_CHAR: if (!sd->sd_wbusy) { sd->sd_wbusy = 1; g_stats.s_wchars++; console_putc(val); schedule_event(SERIAL_NSECS, sd, 0, serial_writedone, "serial write"); } return 0; case SERREG_RIRQ: storeirq(&sd->sd_rirq, val); setirq(sd); return 0; case SERREG_WIRQ: storeirq(&sd->sd_wirq, val); setirq(sd); return 0; } return -1; }
static void audio_state_channel2 (int nr, bool perfin) { struct audio_channel_data *cdp = audio_channel + nr; bool chan_ena = (dmacon & DMA_MASTER) && (dmacon & (1 << nr)); bool old_dma = cdp->dmaenstore; int audav = adkcon & (0x01 << nr); int audap = adkcon & (0x10 << nr); int napnav = (!audav && !audap) || audav; int hpos = current_hpos (); cdp->dmaenstore = chan_ena; if (currprefs.produce_sound == 0) { zerostate (cdp); return; } audio_activate (); if ((cdp->state == 2 || cdp->state == 3) && usehacks1 () && !chan_ena && old_dma) { // DMA switched off, state=2/3 and "too fast CPU": kill DMA instantly // or CPU timed DMA wait routines in common tracker players will lose notes newsample (cdp, (cdp->dat2 >> 0) & 0xff); if (napnav) setirq (nr); zerostate (cdp); return; }
static void serial_writedone(void *d, uint32_t gen) { struct ser_data *sd = d; (void)gen; sd->sd_wbusy = 0; sd->sd_wirq.si_ready = 1; setirq(sd); }
/* * Initialize keyboard */ void kbdinit() { #ifndef NDEBUG if ((kbd_debug = kernel_option("kbd")) == 0) kbd_debug = KBD_DEBUG; if ((i386_debug = kernel_option("i386")) == 0) i386_debug = I386_DEBUG; #endif setirq(KBD_IRQ, kbdintr); pic_enable(KBD_IRQ); numlock = 1; /* num-lock is on */ capslock = 0; /* caps-lock is off */ scrollock = 0; /* scroll-lock is off */ kbd_leds(); }
static void serial_pushinput(void *d, uint32_t junk) { struct ser_data *sd = d; uint32_t ch; (void)junk; if (sd->sd_inbufhead==sd->sd_inbuftail) { sd->sd_rbusy = 0; } else if (!sd->sd_didread && sd->sd_rirq.si_ready != 0) { sd->sd_droppedreads++; if (sd->sd_droppedreads == 1000000000 / SERIAL_NSECS) { msg("Kernel not responding; console input suspended"); } schedule_event(SERIAL_NSECS, sd, 0, serial_pushinput, "serial read"); } else { ch = (uint32_t)(unsigned char)sd->sd_inbuf[sd->sd_inbufhead]; sd->sd_inbufhead = (sd->sd_inbufhead+1)%INBUF_SIZE; if (sd->sd_droppedreads > 0) { msg("Held up to %u input characters while kernel" " unresponsive", sd->sd_droppedreads); sd->sd_droppedreads = 0; } sd->sd_readch = ch; sd->sd_didread = 0; sd->sd_rirq.si_ready = 1; setirq(sd); sd->sd_rbusy = 1; schedule_event(SERIAL_NSECS, sd, 0, serial_pushinput, "serial read"); } }