Beispiel #1
0
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;
}
Beispiel #2
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;
}
Beispiel #3
0
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;
	}
Beispiel #4
0
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);
}
Beispiel #5
0
/*
 * 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();
}
Beispiel #6
0
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");
    }
}