コード例 #1
0
ファイル: cpu_timer_set.c プロジェクト: marcoscunha/reverse
void cpu_timer_set (int32_t id, bigtime_t deadline)
{
  bigtime_t local_deadline = 0;
  soclib_timer_port_t timer = & PLATFORM_TIMER_BASE[id];

  local_deadline = deadline / PLATFORM_TIMER_RES;

  cpu_write(UINT32, & (timer -> period), (uint32_t)local_deadline);
  cpu_write(UINT32, & (timer -> mode), 3);
}
コード例 #2
0
void platform_debug_puts (char * string)
{
  uint32_t res = 0;

  for (int32_t i = 0; string[i] != '\0'; i += 1)
  {
    do cpu_read (UINT32, & (PLATFORM_DBGU_BASE -> SR), res);
    while ((res & 0x202) != 0x202);

    cpu_write (UINT32, & (PLATFORM_DBGU_BASE -> THR), string[i]);
  }
}
コード例 #3
0
ファイル: Sgc_Impl.cpp プロジェクト: Kinglions/modizer
blargg_err_t Sgc_Impl::start_track( int track )
{
	memset( ram .begin(), 0, ram .size() );
	memset( ram2.begin(), 0, ram2.size() );
	memset( vectors.begin(), 0xFF, vectors.size() );
	cpu.reset( unmapped_write.begin(), rom.unmapped() );
	
	if ( sega_mapping() )
	{
		vectors_addr = 0x10000 - Sgc_Cpu::page_size;
		idle_addr = vectors_addr;
		for ( int i = 1; i < 8; ++i )
		{
			vectors [i*8 + 0] = 0xC3; // JP addr
			vectors [i*8 + 1] = header_.rst_addrs [i*2 + 0];
			vectors [i*8 + 2] = header_.rst_addrs [i*2 + 1];
		}
		
		cpu.map_mem( 0xC000, 0x2000, ram.begin() );
		cpu.map_mem( vectors_addr, cpu.page_size, unmapped_write.begin(), vectors.begin() );
		
		bank2 = NULL;
		for ( int i = 0; i < 4; ++i )
			cpu_write( 0xFFFC + i, header_.mapping [i] );
	}
	else
	{
		if ( !coleco_bios )
			return BLARGG_ERR( BLARGG_ERR_CALLER, "Coleco BIOS not set" );
		
		vectors_addr = 0;
		cpu.map_mem( 0, 0x2000, unmapped_write.begin(), coleco_bios );
		for ( int i = 0; i < 8; ++i )
			cpu.map_mem( 0x6000 + i*0x400, 0x400, ram.begin() );
		
		idle_addr = 0x2000;
		cpu.map_mem( 0x2000, cpu.page_size, unmapped_write.begin(), vectors.begin() );
		
		for ( int i = 0; i < 0x8000 / bank_size; ++i )
		{
			int addr = 0x8000 + i*bank_size;
			cpu.map_mem( addr, bank_size, unmapped_write.begin(), rom.at_addr( addr ) );
		}
	}
	
	cpu.r.sp  = get_le16( header_.stack_ptr );
	cpu.r.b.a = track;
	next_play = play_period;
	
	jsr( header_.init_addr );
	
	return blargg_ok;
}
コード例 #4
0
ファイル: helper.c プロジェクト: Aleyr/nesemu2
static INLINE void memwrite(u32 addr,u8 data)
{
	//handle dpcm cycle stealing
	if(nes->cpu.pcmcycles)
		nes->cpu.pcmcycles--;

	//increment cycle counter, check irq lines
	cpu_tick();

	//write data to its address
	cpu_write(addr,data);
}
コード例 #5
0
ファイル: Nsf_Cpu.cpp プロジェクト: Gardenya/deadbeef
void Nsf_Impl::write_mem( addr_t addr, int data )
{
    (void) LOG_MEM( addr, "<", data );

    int offset = addr - sram_addr;
    if ( (unsigned) offset < sram_size )
    {
        sram() [offset] = data;
    }
    else
    {
        // after sram because CPU handles most low_ram accesses internally already
        int temp = addr & (low_ram_size-1); // also handles wrap-around
        if ( !(addr & 0xE000) )
        {
            low_ram [temp] = data;
        }
        else
        {
            int bank = addr - banks_addr;
            if ( (unsigned) bank < bank_count )
            {
                write_bank( bank, data );
            }
            else if ( (unsigned) (addr - apu.io_addr) < apu.io_size )
            {
                apu.write_register( time(), addr, data );
            }
            else
            {
#if !NSF_EMU_APU_ONLY
                // 0x8000-0xDFFF is writable
                int i = addr - 0x8000;
                if ( (unsigned) i < fdsram_size && fds_enabled() )
                    fdsram() [i] = data;
                else
#endif
                    cpu_write( addr, data );
            }
        }
    }
}
コード例 #6
0
ファイル: processor.c プロジェクト: Aleva14/Processor
static inline cpu_syscall(Cpu *cpu, int *ret_val){
	printf("syscall");
	reg call_type = cpu->r[Tyr];
	reg arg_1 = cpu->r[Glu];
	reg arg_2 = cpu->r[Lys];
	switch (call_type){
		case sys_read:
			cpu_read(cpu, arg_1, arg_2);
			break;
		case sys_write:
			cpu_write(cpu, arg_1, arg_2);
			break;
		case sys_exit:
			cpu_exit(cpu, ret_val);
			break;
		default:
			p_errno = INV_SYSCALL;
			break;
	}
		
}
コード例 #7
0
ファイル: Nsf_Emu.cpp プロジェクト: Lin20/projectpmr
blargg_err_t Nsf_Emu::start_track_( int track )
{
	RETURN_ERR( Classic_Emu::start_track_( track ) );
	
	memset( low_mem, 0, sizeof low_mem );
	memset( sram,    0, sizeof sram );
	
	cpu::reset( unmapped_code ); // also maps low_mem
	cpu::map_code( sram_addr, sizeof sram, sram );
	for ( int i = 0; i < bank_count; ++i )
		cpu_write( bank_select_addr + i, initial_banks [i] );
	
	apu.reset( pal_only, (header_.speed_flags & 0x20) ? 0x3F : 0 );
	apu.write_register( 0, 0x4015, 0x0F );
	apu.write_register( 0, 0x4017, (header_.speed_flags & 0x10) ? 0x80 : 0 );
	#if !NSF_EMU_APU_ONLY
	{
		if ( namco ) namco->reset();
		if ( vrc6  ) vrc6 ->reset();
		if ( fme7  ) fme7 ->reset();
	}
	#endif
	
	play_ready = 4;
	play_extra = 0;
	next_play = play_period / clock_divisor;
	
	saved_state.pc = badop_addr;
	low_mem [0x1FF] = (badop_addr - 1) >> 8;
	low_mem [0x1FE] = (badop_addr - 1) & 0xFF;
	r.sp = 0xFD;
	r.pc = init_addr;
	r.a  = track;
	r.x  = pal_only;
	
	return 0;
}
コード例 #8
0
ファイル: cpu_mp_send_ipi.c プロジェクト: marcoscunha/reverse
void cpu_mp_send_ipi (int32_t target, int32_t command, void * data)
{
  cpu_write (UINT32, & (PLATFORM_IPI_BASE[target] . data), ((uint32_t)data));
  cpu_write (UINT32, & (PLATFORM_IPI_BASE[target] . command), command);
}
コード例 #9
0
ファイル: SNES_SPC_misc.cpp プロジェクト: yupferris/snes_spc
void SNES_SPC::WriteByte(unsigned int address, unsigned char value)
{
	cpu_write(value, address);
}
コード例 #10
0
status_t d940_ethernet_write (void * handler, void * source, int64_t offset,
                                  int32_t * p_count) {
  d940_eth_data_t *   pdata = (d940_eth_data_t *) handler;
  d940_eth_t          d940_ethernet_device = pdata->dev;
  d940_eth_ncr_t      ncr;
  d940_eth_tsr_t      tsr;
  int32_t             buffer_index;
  void *              data = source;
  int32_t             buffer_size;
  int32_t             i;
  int32_t             frame_size = *p_count;
  interrupt_status_t  it_status;

  if(frame_size < 0)
  {
    return DNA_BAD_ARGUMENT;
  }

  if(pdata->tx_write == 0)
  {
    pdata->tx_write = *((int32_t *) data);
    return DNA_OK;
  }

  it_status = cpu_trap_mask_and_backup();
  lock_acquire(&pdata->lock);
   
  /* Check/Clear the status of the transmit */
  cpu_read(UINT32, &(d940_ethernet_device->tsr.raw), tsr.raw);
  cpu_write(UINT32, &(d940_ethernet_device->tsr.raw), tsr.raw);
  
  lock_release(&pdata->lock);
  cpu_trap_restore(it_status);
 
  if(tsr.bits.und)
  {
    log(INFO_LEVEL, "Underrun: Clear the transmit buffer list");
    
    it_status = cpu_trap_mask_and_backup();
    lock_acquire(&pdata->lock);
   
    /* Stop the transmit in case of underrun */
    cpu_read(UINT32, &(d940_ethernet_device->ncr.raw), ncr.raw);
    ncr.bits.te = 0;
    cpu_write(UINT32, &(d940_ethernet_device->ncr.raw), ncr.raw);
    ncr.bits.te = 1;
    cpu_write(UINT32, &(d940_ethernet_device->ncr.raw), ncr.raw);
    
    lock_release(&pdata->lock);
    cpu_trap_restore(it_status);
    
    /* ReInit the transmit */
    pdata->tx_tail = 0;
  
    /* ReInit the semaphore */
    while(semaphore_acquire(pdata->tx_sem, 1, DNA_RELATIVE_TIMEOUT, 0) 
        == DNA_OK);
    semaphore_release(pdata->tx_sem, TX_PACKET_LIMIT, 0);
  
    /* Clear the buffers */
    for(i = 0; i < D940_ETH_TX_BUFFER_COUNT; i++)
    {
      pdata->transmit_descs[i].used = 1;
    }
  }

  buffer_index = pdata->tx_tail;

  while(frame_size > 0)
  {
    cpu_cache_invalidate(CPU_CACHE_DATA, &pdata->transmit_descs[buffer_index],
      sizeof(struct tbde));
    
    buffer_size = D940_ETH_TX_BUFFER_SIZE;
    if(buffer_size > frame_size)
    {
      buffer_size = frame_size;
    }

    /* Copy in the transmit buffer */
    dna_memcpy(&pdata->transmit_buffers[buffer_index * D940_ETH_TX_BUFFER_SIZE],
      data, buffer_size);

    data += buffer_size;
    frame_size -= buffer_size;
    pdata->tx_write -= buffer_size;

    /* Set the transmit buffer as ready to send */
    pdata->transmit_descs[buffer_index].len = buffer_size;
    pdata->transmit_descs[buffer_index].used = 0;

    /* Last chunk ? */
    if(pdata->tx_write != 0)
    {
      pdata->transmit_descs[buffer_index].last = 0;
    }
    else
    {
      pdata->transmit_descs[buffer_index].last = 1;
    }

    buffer_index = NEXT_TX_BUFFER(buffer_index);
  }

  /* Next Packet invalid */
  pdata->transmit_descs[buffer_index].used = 1;
  pdata->tx_tail = buffer_index;

  if(pdata->tx_write == 0)
  {
    /* Force to flush the cache */
    cpu_cache_sync();
  
    it_status = cpu_trap_mask_and_backup();
    lock_acquire(&pdata->lock);
  
    /* Restart the transmission */
    cpu_read(UINT32, &(d940_ethernet_device->ncr.raw), ncr.raw);
    ncr.bits.tstart = 1;
    cpu_write(UINT32, &(d940_ethernet_device->ncr.raw), ncr.raw);
  
    lock_release(&pdata->lock);
    cpu_trap_restore(it_status);

    semaphore_acquire(pdata->tx_sem, 1, 0, 0);
  }
  return DNA_OK;
}
コード例 #11
0
status_t d940_ethernet_open (char * name, int32_t mode, void ** data)
{
  d940_eth_t            d940_ethernet_device;
  d940_eth_data_t *     pdata;
  d940_eth_int_t        interrupt;
  d940_eth_ncr_t        ncr;
  d940_eth_ncfgr_t      ncfgr;
  d940_eth_usrio_t      usrio;
  interrupt_status_t    it_status;
  uint32_t              i;
 
  if(data == NULL) return DNA_ERROR;

  /* /!\ Only for one device /!\ */
  if(dna_strcmp (name, d940_ethernet_devices[0]) != 0) return DNA_ERROR;
  pdata = d940_ethernet_handlers[0];

  /* Exclusive access */
  it_status = cpu_trap_mask_and_backup();
  lock_acquire(&pdata->lock);
  if(pdata->ref != 0) 
  {
    lock_release(&pdata->lock);
    cpu_trap_restore(it_status);
    return DNA_ERROR;
  }
  pdata->ref += 1;
  lock_release(&pdata->lock);
  cpu_trap_restore(it_status);

  /* Set device access */
  d940_ethernet_device = pdata->dev;
  *data = pdata;
  
  /* Init all the semaphore */
  while(semaphore_acquire(pdata->mio_sem, 1, DNA_RELATIVE_TIMEOUT, 0) 
        == DNA_OK);
  while(semaphore_acquire(pdata->mio_comp_sem, 1, DNA_RELATIVE_TIMEOUT, 0) 
        == DNA_OK);
  while(semaphore_acquire(pdata->tx_sem, 1, DNA_RELATIVE_TIMEOUT, 0) 
        == DNA_OK);
  while(semaphore_acquire(pdata->rx_sem, 1, DNA_RELATIVE_TIMEOUT, 0) 
        == DNA_OK);

  /* Set the limit of packet in the transmit buffers */
  semaphore_release(pdata->mio_sem, 1, 0);
  semaphore_release(pdata->tx_sem, TX_PACKET_LIMIT, 0);
  
  /* Initialisation of transmit buffer descriptor */
  for(i = 0; i < D940_ETH_TX_BUFFER_COUNT; i++)
  {
    pdata->transmit_descs[i].addr = 
      ((uint32_t)(& pdata->transmit_buffers[i * D940_ETH_TX_BUFFER_SIZE]));
    
    pdata->transmit_descs[i].used = 1;
    pdata->transmit_descs[i].wrap = 0;
    pdata->transmit_descs[i].no_crc = 0;
  }
  pdata->transmit_descs[i-1].wrap = 1;

  /* Initialisation of receive buffer descriptor */
  for(i = 0; i < D940_ETH_RX_BUFFER_COUNT; i++)
  {
    pdata->receive_descs[i].addr = 
      ((uint32_t)(& pdata->receive_buffers[i * D940_ETH_RX_BUFFER_SIZE])) >> 2;
    
    pdata->receive_descs[i].owner = 0;
    pdata->receive_descs[i].wrap = 0;
  }
  pdata->receive_descs[i-1].wrap = 1;
  
  /* Initialisation of the tails */
  pdata->tx_tail = 0;
  pdata->rx_tail = 0;
  pdata->rx_read = false;
  pdata->tx_write = 0;

  /* Initialisation of the stats */
  pdata->tx_count = 0;
  pdata->rx_count = 0;

  /* Configure the PHY */
  pdata->phy_status = 0;
  d940_ethernet_phy_probe(pdata);
  d940_ethernet_phy_manage(pdata);
 
  it_status = cpu_trap_mask_and_backup();
  lock_acquire(&pdata->lock);
  
  /* Configure the device (depends of PHY) */
  cpu_read(UINT32, &(d940_ethernet_device->ncfgr.raw), ncfgr.raw);
  ncfgr.bits.rbof = 0;
  ncfgr.bits.drfcs = 1;
  ncfgr.bits.pae = 1;
  cpu_write(UINT32, &(d940_ethernet_device->ncfgr.raw), ncfgr.raw);

  /* Configure MII */
  cpu_read(UINT32, &(d940_ethernet_device->usrio.raw), usrio.raw);
  usrio.bits.clken = 0;
  usrio.bits.rmii = 0;
  cpu_write(UINT32, &(d940_ethernet_device->usrio.raw), usrio.raw);

  /* Enable Interrupt (NO TXUBR & NO MFD) */
  interrupt.raw = 0x00003cf6;
  cpu_write(UINT32, &(d940_ethernet_device->ier.raw), interrupt.raw);

  /* Start Receive/Transmit */
  cpu_read(UINT32, &(d940_ethernet_device->ncr.raw), ncr.raw);
  ncr.bits.re = 1;
  ncr.bits.te = 1;
  ncr.bits.clrstat = 1;
  cpu_write(UINT32, &(d940_ethernet_device->ncr.raw), ncr.raw);
  
  lock_release(&pdata->lock);
  cpu_trap_restore(it_status);
 
  return DNA_OK;  
}