コード例 #1
0
ファイル: tms5501.cpp プロジェクト: Tauwasser/mame
void tms5501_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
	switch (id)
	{
	case TIMER_1:
		set_interrupt(IRQ_TMR1);
		break;

	case TIMER_2:
		set_interrupt(IRQ_TMR2);
		break;

	case TIMER_3:
		set_interrupt(IRQ_TMR3);
		break;

	case TIMER_4:
		set_interrupt(IRQ_TMR4);
		break;

	case TIMER_5:
		if (!(m_cmd & CMD_XI7))
		{
			set_interrupt(IRQ_TMR5);
		}
		break;

	default:
		break;
	}
}
コード例 #2
0
ファイル: esp.c プロジェクト: juvenal/previous
void ESP_DMA_CTRL_Write(void) {
    Log_Printf(LOG_ESPDMA_LEVEL,"ESP DMA control write at $%08x val=$%02x PC=$%08x\n", IoAccessCurrentAddress, IoMem[IoAccessCurrentAddress & IO_SEG_MASK], m68k_getpc());
    esp_dma.control = IoMem[IoAccessCurrentAddress & IO_SEG_MASK];
        
    if (esp_dma.control&ESPCTRL_FLUSH) {
        Log_Printf(LOG_ESPDMA_LEVEL, "flush DMA buffer\n");
		if (ConfigureParams.System.bTurbo) {
			tdma_flush_buffer(0);
		} else {
			dma_esp_flush_buffer();
		}
    }
    if (esp_dma.control&ESPCTRL_CHIP_TYPE) {
        Log_Printf(LOG_ESPDMA_LEVEL, "SCSI controller is WD33C92\n");
    } else {
        Log_Printf(LOG_ESPDMA_LEVEL, "SCSI controller is NCR53C90\n");
    }
    if (esp_dma.control&ESPCTRL_RESET) {
        Log_Printf(LOG_ESPDMA_LEVEL, "reset SCSI controller\n");
        esp_reset_hard();
    }
    if (esp_dma.control&ESPCTRL_DMA_READ) {
        Log_Printf(LOG_ESPDMA_LEVEL, "DMA from SCSI to mem\n");
    } else {
        Log_Printf(LOG_ESPDMA_LEVEL, "DMA from mem to SCSI\n");
    }
    if (esp_dma.control&ESPCTRL_MODE_DMA) {
        Log_Printf(LOG_ESPDMA_LEVEL, "mode DMA\n");
    } else {
        Log_Printf(LOG_ESPDMA_LEVEL, "mode PIO\n");
    }
    if (esp_dma.control&ESPCTRL_ENABLE_INT) {
        Log_Printf(LOG_ESPDMA_LEVEL, "Enable ESP interrupt");
        if (status&STAT_INT) {
            set_interrupt(INT_SCSI, SET_INT);
        }
    } else {
        Log_Printf(LOG_ESPDMA_LEVEL, "Block ESP interrupt");
        set_interrupt(INT_SCSI, RELEASE_INT);
    }
    switch (esp_dma.control&ESPCTRL_CLKMASK) {
        case ESPCTRL_CLK10MHz:
            Log_Printf(LOG_ESPDMA_LEVEL, "10 MHz clock\n");
            break;
        case ESPCTRL_CLK12MHz:
            Log_Printf(LOG_ESPDMA_LEVEL, "12.5 MHz clock\n");
            break;
        case ESPCTRL_CLK16MHz:
            Log_Printf(LOG_ESPDMA_LEVEL, "16.6 MHz clock\n");
            break;
        case ESPCTRL_CLK20MHz:
            Log_Printf(LOG_ESPDMA_LEVEL, "20 MHz clock\n");
            break;
        default:
            break;
    }
}
コード例 #3
0
ファイル: asyncresult.cpp プロジェクト: airyai/avalon
bool AsyncResult::execute()
{
    bool should_call = false;
    {
        Lock::scoped_lock locker(lock_);
        if (status_ == WAIT) {
            should_call = true;
            status_ = RUNNING;
        }
    }
    if (should_call) {
        try {
            task_(*this);
            set_success();
        } catch (AvalonException& err) {
            set_error(&err);
        } catch (boost::thread_interrupted) {
            set_interrupt();
            throw;
        } catch (...) {
            set_error();
        }
    }
    return should_call;
}
コード例 #4
0
ファイル: tmc.c プロジェクト: jsdf/previous
void tmc_vir_write0(Uint8 val) {
	tmc.video_intr = val;
	if (tmc.video_intr&TMC_VI_INTERRUPT) {
		tmc.video_intr &= ~TMC_VI_INTERRUPT;
		set_interrupt(INT_DISK, RELEASE_INT);
	}
}
コード例 #5
0
void upd3301_device::device_reset()
{
	set_interrupt(0);
	set_drq(0);

	recompute_parameters();
}
コード例 #6
0
void upd3301_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
	switch (id)
	{
	case TIMER_HRTC:
		if (LOG) logerror("UPD3301 '%s' HRTC: %u\n", tag(), param);

		m_out_hrtc_func(param);
		m_hrtc = param;

		update_hrtc_timer(param);
		break;

	case TIMER_VRTC:
		if (LOG) logerror("UPD3301 '%s' VRTC: %u\n", tag(), param);

		m_out_vrtc_func(param);
		m_vrtc = param;

		if (param && !m_me)
		{
			m_status |= STATUS_E;
			set_interrupt(1);
		}

		update_vrtc_timer(param);
		break;

	case TIMER_DRQ:
		break;
	}
}
コード例 #7
0
ファイル: sc499.c プロジェクト: antervud/MAMEHub
void sc499_device::set_tc_state(int state)
{
	LOG2(("set_tc_state: block=%d state=%x", m_tape_pos-1, state));
	if (state == 0)
	{
		m_status |= SC499_STAT_DON; // 37ec
		set_dma_drq(CLEAR_LINE);

		switch (m_current_command & SC499_CMD_TYPE_MASK)
		{
		case SC499_CMD_READ_DATA:
			m_read_block_pending = 0;
			break;

		case SC499_CMD_WRITE_DATA:
			m_status &= ~SC499_STAT_RDY;
			if ((m_control & SC499_CTR_IEN) && (m_control & SC499_CTR_DNI))
			{
				set_interrupt(ASSERT_LINE);
				m_status |= SC499_STAT_IRQ;
			}
			break;
		}
	}
}
コード例 #8
0
/*
 * STUB: once register_interrupt_handler() is called, this routine
 * gets called each time SIG_TYPE is sent to this process
 */
static void
interrupt_handler(int sig, siginfo_t * sip, void *contextVP)
{
	ucontext_t *context = (ucontext_t *) contextVP;

	/* check that SIG_TYPE is blocked on entry */
	assert(!interrupts_enabled());
	if (loud) {
		int ret;
		ret = gettimeofday(&end, NULL);
		assert(!ret);
		if (first) {
			first = 0;
		} else {
			timersub(&end, &start, &diff);
		}
		start = end;
		printf("%s: context at %10p, time diff = %ld us\n",
		       __FUNCTION__, context,
		       diff.tv_sec * 1000000 + diff.tv_usec);
	}
	set_interrupt();
	/* implement preemptive threading by calling thread_yield */
	thread_yield(THREAD_ANY);
}
コード例 #9
0
ファイル: 3c505.c プロジェクト: CJBass/mame2013-libretro
void threecom3c505_device::do_receive_command()
{
	// receive pending and no other command is pending
	if (m_rx_pending > 0 && !m_command_pending)
	{
		if (m_rx_data_buffer.get_length() == 0 && !m_rx_fifo.is_empty())
		{
			m_rx_fifo.get(&m_rx_data_buffer);
		}

		// receive data available ?
		if (m_rx_data_buffer.get_length() > 0)
		{
			LOG2(("do_receive_command - data_length=%x rx_pending=%d",
							m_rx_data_buffer.get_length(), m_rx_pending));

			m_rx_pending--;
			set_command_pending(1);

			// preset receive response PCB
			memcpy(&m_response, &m_rcv_response, sizeof(m_rcv_response));

//          m_response.command = CMD_RECEIVE_PACKET_COMPLETE; // 0x38
//          m_response.length = 16;
//          m_response.data.rcv_resp.buf_ofs = htole16(0);
//          m_response.data.rcv_resp.buf_seg = htole16(0);
//          m_response.data.rcv_resp.buf_len = htole16(buf_len);

			// htole16 and friends are not portable beyond Linux.  It's named differently on *BSD and differently again on OS X.  Avoid!
			m_response.data.rcv_resp.pkt_len = uint16_to_le(m_rx_data_buffer.get_length());
			m_response.data.rcv_resp.timeout = 0; // successful completion
			m_response.data.rcv_resp.status  = uint16_to_le(m_rx_data_buffer.get_length() > 0 ? 0 : 0xffff);
			m_response.data.rcv_resp.timetag = 0; // TODO: time tag

			// compute and check no of bytes to be DMA'ed (must be even)
			UINT16 buf_len = uint16_from_le(m_response.data.rcv_resp.buf_len) & ~1;
			if (m_rx_data_buffer.get_length() > buf_len)
			{
				LOG1(("do_receive_command !!! buffer size too small (%d < %d)", buf_len, m_rx_data_buffer.get_length()));
				m_response.data.rcv_resp.pkt_len = uint16_to_le(buf_len);
				m_response.data.rcv_resp.status = 0xffff;
			}
			else
			{
				buf_len = (m_rx_data_buffer.get_length() + 1) & ~1;
				m_response.data.rcv_resp.buf_len = uint16_to_le(buf_len);
			}

			m_response_length = m_response.length + 2;
			m_response_index = 0;

			m_status |= ACRF; /* set adapter command register full */
			if (m_control & CMDE)
			{
				set_interrupt(ASSERT_LINE);
			}
		}
	}
}
コード例 #10
0
ファイル: ethernet.c プロジェクト: lewellyn/previous
void EN_RX_Mask_Write(void) {
    enet.rx_mask=IoMem[IoAccessCurrentAddress & IO_SEG_MASK];
 	Log_Printf(LOG_EN_REG_LEVEL,"[EN] Receiver masks write at $%08x val=$%02x PC=$%08x\n", IoAccessCurrentAddress, IoMem[IoAccessCurrentAddress & IO_SEG_MASK], m68k_getpc());
    
    if ((enet.rx_status&enet.rx_mask&0x8F)==0) {
        set_interrupt(INT_EN_RX, RELEASE_INT);
    }
}
コード例 #11
0
ファイル: ethernet.c プロジェクト: lewellyn/previous
void EN_TX_Mask_Write(void) {
    enet.tx_mask=IoMem[IoAccessCurrentAddress & IO_SEG_MASK];
 	Log_Printf(LOG_EN_REG_LEVEL,"[EN] Transmitter masks write at $%08x val=$%02x PC=$%08x\n", IoAccessCurrentAddress, IoMem[IoAccessCurrentAddress & IO_SEG_MASK], m68k_getpc());
    
    if ((enet.tx_status&enet.tx_mask&0x0F)==0 || (enet.tx_status&enet.tx_mask&0x0F)==TXSTAT_READY) {
        set_interrupt(INT_EN_TX, RELEASE_INT);
    }
}
コード例 #12
0
/* This is the function called when the Guest's timer expires. */
static enum hrtimer_restart clockdev_fn(struct hrtimer *timer)
{
	struct lg_cpu *cpu = container_of(timer, struct lg_cpu, hrt);

	/* Remember the first interrupt is the timer interrupt. */
	set_interrupt(cpu, 0);
	return HRTIMER_NORESTART;
}
コード例 #13
0
ファイル: 68307.cpp プロジェクト: qwijibo/mame
void m68307_cpu_device::licr2_interrupt()
{
	int prioritylevel = (m68307SIM->m_licr2 & 0x0007)>>0;
	int vector        = (m68307SIM->m_pivr & 0x00f0) | 0x9;
	m68307SIM->m_licr2 |= 0x8;


	set_interrupt(prioritylevel, vector);
}
コード例 #14
0
ファイル: tms5501.cpp プロジェクト: Tauwasser/mame
void tms5501_device::tra_complete()
{
	if (!(m_sta & STA_XBE))
	{
		transmit_register_setup(m_tb);

		m_sta |= STA_XBE;

		set_interrupt(IRQ_TB);
	}
}
コード例 #15
0
int MDTRA_WaitDialog::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
    _id = QDialog::qt_metacall(_c, _id, _a);
    if (_id < 0)
        return _id;
    if (_c == QMetaObject::InvokeMetaMethod) {
        switch (_id) {
        case 0: set_interrupt(); break;
        default: ;
        }
        _id -= 1;
    }
    return _id;
}
コード例 #16
0
ファイル: z80sio.c プロジェクト: broftkd/mess-svn
void z80sio_device::sio_channel::change_input_line(int line, int state)
{
	VPRINTF(("sio_change_input_line(%c, %s) = %d\n", 'A' + m_index, (line == SIO_RR0_CTS) ? "CTS" : "DCD", state));

	// remember the old value
	UINT8 old = m_status[0];

	// set the bit in the status register
	m_status[0] &= ~line;
	if (state)
		m_status[0] |= line;

	// if state change interrupts are enabled, signal
	if (((old ^ m_status[0]) & line) && (m_regs[1] & SIO_WR1_STATUSINT_ENABLE))
		set_interrupt(INT_STATUS);
}
コード例 #17
0
ファイル: v1050.c プロジェクト: CJBass/mame2013-libretro
void v1050_state::scan_keyboard()
{
	static const char *const keynames[] = { "ROW0", "ROW1", "ROW2", "ROW3", "ROW4", "ROW5", "ROW6", "ROW7", "ROW8", "ROW9", "ROW10", "ROW11" };
	int table = 0, row, col;
	int keydata = 0xff;

	UINT8 line_mod = ioport("ROW12")->read();

	if((line_mod & 0x07) && (line_mod & 0x18))
	{
		table = 3;  // shift & control
	}
	else if (line_mod & 0x07)
	{
		table = 1; // shifted
	}
	else if (line_mod & 0x18)
	{
		table = 2; // ctrl
	}

	// scan keyboard
	for (row = 0; row < 12; row++)
	{
		UINT8 data = ioport(keynames[row])->read();

		for (col = 0; col < 8; col++)
		{
			if (!BIT(data, col))
			{
				// latch key data
				keydata = V1050_KEYCODES[table][row][col];

				if (m_keydata != keydata)
				{
					m_keydata = keydata;
					m_keyavail = 1;

					set_interrupt(INT_KEYBOARD, 1);
					return;
				}
			}
		}
	}

	m_keydata = keydata;
}
コード例 #18
0
ファイル: sc499.c プロジェクト: antervud/MAMEHub
UINT8 sc499_device::read_status_port()
{
	static UINT8 m_last_status = 0xff;

	// omit excessive logging
	if (m_last_status != m_status)
	{
		LOG2(("read_status_port: %02x", m_status));
		m_last_status = m_status;
	}

	// reset pending interrupts
	set_interrupt(CLEAR_LINE);
	m_status &= ~SC499_STAT_IRQ;

	return m_last_status;
}
コード例 #19
0
ファイル: sc499.c プロジェクト: antervud/MAMEHub
UINT8 sc499_device::read_data_port()
{
	static UINT8 m_last_data = 0xff;

	// omit excessive logging
	if (m_last_data != m_data)
	{
		LOG2(("read_data_port: %02x", m_data));
		m_last_data = m_data;
	}

	if (m_control & SC499_CTR_IEN)
	{
		set_interrupt(CLEAR_LINE);
		m_status &= ~SC499_STAT_IRQ;
	}

	return m_data;
}
コード例 #20
0
//READ8_DEVICE_HANDLER( threecom3c505_r )
UINT8 threecom3c505_device::read_port(offs_t offset)
{
	// data to omit excessive logging
	static UINT8 last_data = 0xff;
	static UINT32 last_pc = 0;

	UINT8 data = m_reg[offset & 0x0f];
	switch (offset)
	{
	case PORT_COMMAND: /* 0x00 read/write, 8-bit */
		data = read_command_port();
		break;
	case PORT_STATUS: /* 0x02 read only, 8-bit */
		data=read_status_port();

		set_interrupt(CLEAR_LINE);

		// omit excessive logging
		if (data == last_data)
		{
			UINT32 pc = machine().device(MAINCPU)->safe_pcbase();
			if (pc == last_pc) {
				return data;
			}
			last_pc = pc;
		}
		last_data = data;

		break;
	case PORT_DATA: /* 0x04 read/write, 16-bit */
	case PORT_DATA + 1: /* 0x04 read/write, 16-bit */
		data = read_data_port();
		break;
	case PORT_CONTROL: /* 0x06 read/write, 8-bit */
		// just return current value
		break;
	default:
		break;
	}

	LOG2(("reading 3C505 Register at offset %02x = %02x", offset, data));
	return data;
}
コード例 #21
0
ファイル: EZPSF.C プロジェクト: daemqn/Atari_ST_Sources
int *ezpstart()
{
   register int   i, *adr;
   int   *save_globl();

   setup_page();
   setup_strings();
   liney = (SYSDOM*)scrsave;
   staffy = (int*)&liney[MAXLIN];
   measnum = &staffy[MAXSYS];
   systems = (SYSDOM*)&measnum[MAXSYS];
   brackets = (LBRACK*)&systems[MAXSYS];
   braces = (LBRACE*)&brackets[MAXCON];
   for (i = 0; i < MAXCON; i++) {
      braces[i].top = 0;
      braces[i].psym = (PSYM*)0L;
      braces[i].size = 0;
      brackets[i].top = 0;
      brackets[i].size = 0;
   }
   abortp = voff = FALSE;
   init_symb_structs();
   adr = (int*)&braces[MAXCON];
   s_image = (short*)save_globl( adr );
   calc_bufsize();
   graf_mouse( ARROW );
   wind_get( DESKTOP, WF_WORKXYWH, &desk.g_x, &desk.g_y, &desk.g_w,
         &desk.g_h );
   prinaddr->ob_x = (desk.g_x + desk.g_w - prinaddr->ob_width) >> 1;
   prinaddr->ob_y = (desk.g_y + desk.g_h - prinaddr->ob_height) >> 1;
   ((TEDINFO*)(prinaddr[PRNTYPE].ob_spec))->te_ptext = prname;
   objc_draw( prinaddr, ROOT, MAX_DEPTH, prinaddr->ob_x - 3,
         prinaddr->ob_y - 3, prinaddr->ob_width + 6, prinaddr->ob_height + 6 );
   objc_offset( prinaddr, ABORT, &abort.g_x, &abort.g_y );
   abort.g_w = prinaddr[ABORT].ob_width;
   abort.g_h = prinaddr[ABORT].ob_height;
   set_interrupt();
   return adr;
}
コード例 #22
0
ファイル: ka10_lp.c プロジェクト: markpizz/sims
t_stat lpt_devio(uint32 dev, uint64 *data) {
    UNIT *uptr = &lpt_unit;
    switch(dev & 3) {
    case CONI:
         *data = uptr->STATUS;
         if ((uptr->flags & UNIT_UC) == 0)
             *data |= C96;
         if ((uptr->flags & UNIT_ATT) == 0)
             *data |= ERR_FLG;
         sim_debug(DEBUG_CONI, &lpt_dev, "LP CONI %012llo PC=%06o\n", *data, PC);
         break;

    case CONO:
         clr_interrupt(dev);
         sim_debug(DEBUG_CONO, &lpt_dev, "LP CONO %012llo PC=%06o\n", *data, PC);
         uptr->STATUS = ((PI_DONE|PI_ERROR|DONE_FLG|BUSY_FLG) & *data);
         if (*data & CLR_LPT) {
             uptr->CHR = 0;
             uptr->CHL = 0;
             uptr->STATUS |= BUSY_FLG;
             sim_activate (&lpt_unit, lpt_unit.wait);
         }
         if ((uptr->flags & UNIT_ATT) == 0) {
             set_interrupt(dev, (uptr->STATUS >> 3));
         }
         if (uptr->STATUS & DONE_FLG)
             set_interrupt(dev, uptr->STATUS);
         break;

    case DATAO:
         if ((uptr->STATUS & BUSY_FLG) == 0) {
             uptr->CHL = (int32)(*data >> 15);
             uptr->CHR = (*data >> 1) & 0037777;
             uptr->STATUS |= BUSY_FLG;
             uptr->STATUS &= ~DONE_FLG;
             clr_interrupt(dev);
             sim_activate (&lpt_unit, lpt_unit.wait);
        }
コード例 #23
0
static void
do_event(void *data)
{
  ide_controller *controller = data;
  device *me = controller->me;
  controller->event_tag = 0;
  switch (controller->state) {
  case busy_loaded_state:
  case busy_drained_state:
    if (controller->current_transfer > 0) {
      controller->state = (controller->state == busy_loaded_state
			   ? loading_state : draining_state);
    }
    else {
      controller->state = idle_state;
    }
    set_interrupt(me, controller);
    break;
  default:
    device_error(me, "controller %d - unexpected event", controller->nr);
    break;
  }
}
コード例 #24
0
ファイル: tms5501.cpp プロジェクト: Tauwasser/mame
void tms5501_device::rcv_complete()
{
	receive_register_extract();
	m_rb = get_received_char();

	if (is_receive_framing_error())
	{
		m_sta |= STA_FE;
	}
	else
	{
		m_sta &= ~STA_FE;
	}

	if (m_sta & STA_RBL)
	{
		m_sta |= STA_OE;
	}

	m_sta |= (STA_RBL | STA_SR);
	m_sta &= ~(STA_SBD | STA_FBD);

	set_interrupt(IRQ_RB);
}
コード例 #25
0
ファイル: sc499.c プロジェクト: antervud/MAMEHub
void sc499_device::do_reset()
{
	LOG1(("do_reset: Reset controller microprocessor"));

	m_data = 0;
	m_command = SC499_CMD_NO_COMMAND;
	m_current_command = m_command;
	m_status = ~(SC499_STAT_DIR | SC499_STAT_EXC);
	m_control = 0;

	if (m_has_cartridge)
	{
		tape_status_set(SC499_ST1_POR | SC499_ST1_BOM);
	}

	m_tape_pos = 0;
	m_data_error_counter = 0;
	m_underrun_counter = 0;

	set_interrupt(CLEAR_LINE);
	set_dma_drq(CLEAR_LINE);

	m_timer1->adjust( attotime::never, SC499_TIMER_6, attotime::never);
}
コード例 #26
0
/* Should be called when you initialize threads package. Many of the calls won't
 * make sense at first -- study the man pages! */
void
register_interrupt_handler(int verbose)
{
	struct sigaction action;
	int error;
	static int init = 0;

	assert(!init);	/* should only register once */
	init = 1;
	loud = verbose;
	action.sa_handler = NULL;
	action.sa_sigaction = interrupt_handler;
	/* SIG_TYPE will be blocked while interrupt_handler() is running. */
	error = sigemptyset(&action.sa_mask);
	assert(!error);

	/* use sa_sigaction as handler instead of sa_handler */
	action.sa_flags = SA_SIGINFO;
	if (sigaction(SIG_TYPE, &action, NULL)) {
		perror("Setting up signal handler");
		assert(0);
	}
	set_interrupt();
}
コード例 #27
0
ファイル: z80sio.c プロジェクト: broftkd/mess-svn
void z80sio_device::sio_channel::serial_callback()
{
	int data = -1;

	// first perform any outstanding transmits
	if (m_outbuf != -1)
	{
		VPRINTF(("serial_callback(%c): Transmitting %02x\n", 'A' + m_index, m_outbuf));

		// actually transmit the character
		if (m_device->m_transmit_cb != NULL)
			(*m_device->m_transmit_cb)(m_device, m_index, m_outbuf);

		// update the status register
		m_status[0] |= SIO_RR0_TX_BUFFER_EMPTY;

		// set the transmit buffer empty interrupt if enabled
		if (m_regs[1] & SIO_WR1_TXINT_ENABLE)
			set_interrupt(INT_TRANSMIT);

		// reset the output buffer
		m_outbuf = -1;
	}

	// ask the polling callback if there is data to receive
	if (m_device->m_receive_poll_cb != NULL)
		data = (*m_device->m_receive_poll_cb)(m_device, m_index);

	// if we have buffered data, pull it
	if (m_receive_inptr != m_receive_outptr)
	{
		data = m_receive_buffer[m_receive_outptr];
		m_receive_outptr = (m_receive_outptr + 1) % ARRAY_LENGTH(m_receive_buffer);
	}

	// if we have data, receive it
	if (data != -1)
	{
		VPRINTF(("serial_callback(%c): Receiving %02x\n", 'A' + m_index, data));

		// if rx not enabled, just ignore it
		if (!(m_regs[3] & SIO_WR3_RX_ENABLE))
		{
			VPRINTF(("  (ignored because receive is disabled)\n"));
			return;
		}

		// stash the data and update the status
		m_inbuf = data;
		m_status[0] |= SIO_RR0_RX_CHAR_AVAILABLE;

		// update our interrupt state
		switch (m_regs[1] & SIO_WR1_RXINT_MASK)
		{
			case SIO_WR1_RXINT_FIRST:
				if (!m_int_on_next_rx)
					break;

			case SIO_WR1_RXINT_ALL_NOPARITY:
			case SIO_WR1_RXINT_ALL_PARITY:
				set_interrupt(INT_RECEIVE);
				break;
		}
		m_int_on_next_rx = false;
	}
}
コード例 #28
0
inline void upd3301_device::reset_counters()
{
	set_interrupt(0);
	set_drq(0);
}
コード例 #29
0
ファイル: omti8621.cpp プロジェクト: robsonfr/mame
void omti8621_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
	set_interrupt(ASSERT_LINE);
}
コード例 #30
0
ファイル: omti8621.cpp プロジェクト: robsonfr/mame
void omti8621_device::do_command(const UINT8 cdb[], const UINT16 cdb_length)
{
	UINT8 lun = get_lun(cdb);
	omti_disk_image_device *disk = our_disks[lun];
	int command_duration = 0; // ms

	log_command( cdb, cdb_length);

	// default to read status and status is successful completion
	omti_state = OMTI_STATE_STATUS;
	status_port |= OMTI_STATUS_IO | OMTI_STATUS_CD;
	command_status = lun ? OMTI_COMMAND_STATUS_LUN : 0;

	if (mask_port & OMTI_MASK_INTE) {
		set_interrupt(CLEAR_LINE);
	}

	if (!disk->m_image->exists()) {
		command_status |= OMTI_COMMAND_STATUS_ERROR; // no such drive
	}

	switch (cdb[0]) {
	case OMTI_CMD_TEST_DRIVE_READY: // 0x00
		if (!disk->m_image->exists())
		{
			set_sense_data(OMTI_SENSE_CODE_DRIVE_NOT_READY, cdb);
		}
		break;

	case OMTI_CMD_RECALIBRATE: // 0x01
		break;

	case OMTI_CMD_REQUEST_SENSE: // 0x03
		set_data_transfer(sense_data, sizeof(sense_data));
		break;

	case OMTI_CMD_READ_VERIFY: // 0x05
		check_disk_address(cdb);
		break;

	case OMTI_CMD_FORMAT_TRACK: // 0x06
		format_track(cdb);
		break;

	case OMTI_CMD_FORMAT_BAD_TRACK: // 0x07
		diskaddr_format_bad_track = get_disk_address(cdb);
		break;

	case OMTI_CMD_READ: // 0x08
		if (check_disk_address(cdb)) {
			// read data from controller
			read_sectors_from_disk(get_disk_address(cdb), cdb[4], lun);
			set_data_transfer(&sector_buffer[0],  OMTI_DISK_SECTOR_SIZE*cdb[4]);
		}
		break;

	case OMTI_CMD_WRITE: // 0x0A
		log_data();
		if (check_disk_address(cdb)) {
			write_sectors_to_disk(get_disk_address(cdb), cdb[4], lun);
		}
		break;

	case OMTI_CMD_SEEK: // 0x0B
		check_disk_address(cdb);
		break;

	case OMTI_CMD_READ_SECTOR_BUFFER: // 0x0E
		set_data_transfer(&sector_buffer[0], OMTI_DISK_SECTOR_SIZE*cdb[4]);
		break;

	case OMTI_CMD_WRITE_SECTOR_BUFFER: // 0x0F
		log_data();
		break;

	case OMTI_CMD_COPY: // 0x20
		if (check_disk_address(cdb) && check_disk_address(cdb+4)) {
			// copy sectors
			copy_sectors (get_disk_address(cdb+4), get_disk_address(cdb), cdb[4], lun);
		}
		break;

	case OMTI_CMD_READ_ESDI_DEFECT_LIST: // 0x37
		set_esdi_defect_list(get_lun(cdb), cdb[1] & 0x1f);
		set_data_transfer(disk->m_esdi_defect_list, sizeof(disk->m_esdi_defect_list));
		break;

#if 0   // this command seems unused by Domain/OS, and it's unclear what the intent of the code is (it makes some versions of GCC quite unhappy)
	case OMTI_CMD_ASSIGN_ALTERNATE_TRACK: // 0x11
		log_data();
		alternate_track_address[0] = get_disk_track(cdb);
		alternate_track_address[1] = get_disk_track(alternate_track_buffer-1);
		break;
#endif

	case OMTI_CMD_READ_DATA_TO_BUFFER: // 0x1E
		if (check_disk_address(cdb)) {
			// read data from controller
			read_sectors_from_disk (get_disk_address(cdb), cdb[4], lun);
			// Domain/OS doesn't expect zero access time
			command_duration += 1; // 1 ms is enough, average time would be 30 ms)
		}
		break;

	case OMTI_CMD_WRITE_DATA_FROM_BUFFER: // 0x1F
		log_data();
		if (check_disk_address(cdb)) {
			write_sectors_to_disk(get_disk_address(cdb), cdb[4], lun);
		}
		break;

	case  OMTI_CMD_RAM_DIAGNOSTICS: // 0xE0
		break;

	case OMTI_CMD_CONTROLLER_INT_DIAGNOSTIC: // 0xE4
		break;

	case OMTI_CMD_READ_LONG: // 0xE5
		if (check_disk_address(cdb)) {
			// read data from controller
			read_sectors_from_disk(get_disk_address(cdb), cdb[4], lun);
			set_data_transfer(&sector_buffer[0], OMTI_DISK_SECTOR_SIZE+6);
		}
		break;

	case OMTI_CMD_WRITE_LONG: // 0xE6
		log_data();
		if (check_disk_address(cdb)) {
			UINT32 diskaddr =  get_disk_address(cdb);
			write_sectors_to_disk(diskaddr, cdb[4], lun);
			// this will spoil the ECC code
			diskaddr_ecc_error = diskaddr;
		}
		break;

	case OMTI_CMD_READ_CONFIGURATION: // 0xEC
		set_configuration_data(get_lun(cdb));
		set_data_transfer(disk->m_config_data, sizeof(disk->m_config_data));
		break;

	case OMTI_CMD_INVALID_COMMAND: // 0xFF
		set_sense_data(OMTI_SENSE_CODE_INVALID_COMMAND, cdb);
		command_status |= OMTI_COMMAND_STATUS_ERROR;
		break;

	default:
		LOG(("do_command: UNEXPECTED command %02x",cdb[0]));
		set_sense_data(OMTI_SENSE_CODE_INVALID_COMMAND, cdb);
		command_status |= OMTI_COMMAND_STATUS_ERROR;
		break;
	}

	if (mask_port & OMTI_MASK_INTE) {
//      if (omti_state != OMTI_STATE_STATUS) {
//          LOG(("do_command: UNEXPECTED omti_state %02x",omti_state));
//      }
		status_port |= OMTI_STATUS_IREQ;
		if (command_duration == 0)
		{
			set_interrupt(ASSERT_LINE);
		}
		else
		{
			// FIXME: should delay omti_state and status_port as well
			m_timer->adjust(attotime::from_msec(command_duration), 0);
		}
	}
}