/* er0 に0, er1 に出力したい文字を入れ trapa #1 を実行する */
void
stub_putc(char c)
{
	/* er0 = c */
	Asm("push.l	er1");
	Asm("mov.l	er0, er1");
	Asm("sub.l	er0, er0");
	Asm("trapa	#1");
	Asm("pop.l	er1");
}
Example #2
0
void
sil_endian(void)
{
#ifdef SIL_ENDIAN_BIG			/* ビッグエンディアンプロセッサ */
	Asm("SIL_ENDIAN = BIG");
#else /* SIL_ENDIAN_BIG */
#ifdef SIL_ENDIAN_LITTLE		/* リトルエンディアンプロセッサ */
	Asm("SIL_ENDIAN = LITTLE");
#endif /* SIL_ENDIAN_LITTLE */
#endif /* SIL_ENDIAN_BIG */
}
Example #3
0
void task_idle_process(void)
{
/*
  struct TASK *task_cur;
  task_cur = tasktbl->next;
  task_cur->status = TASK_STAT_IDLE;
*/

  for(;;) {
//    console_puts("idle ");
//    console_putc('I');

    Asm("nop");
    cpu_halt();
/*
{
  static int i=0;
  int pos;
  char s[4];
  byte2hex(i,s);
  i++;
  pos = console_getpos();
  console_locatepos(77,0);
  console_puts(s);
  console_putpos(pos);
}
*/
  }
}
Example #4
0
void main(){
	char a;
	FILE file;
	FILE *fp = &file;
	// 汇编生成目标代码
	printf("生成目标代码\n");
	Asm Asm("data.asm");
	Asm.parse();
	printf("line  width offset\n");
	fopen_s(&fp, "data.bin", "w");
	Asm.write(fp);
	fclose(fp);
	printf("汇编结束\n");
	// 虚拟机执行
	printf("虚拟机执行\n");
	CPU CPU;
	CPU.init();
	fopen_s(&fp, "data.bin", "r");
	CPU.load(fp);
	fclose(fp);
	CPU.execute();
	CPU.store();
	printf("执行结束\n");
	cin >> a;
}
/*
 * 割り込みの許可、禁止
 *
 */
JSP_L1_CODE
ER ena_int( INTNO intno )
{
	volatile uint32_t *reg = pREG_SEC0_SCTL0;
	reg += intno*2;
	*reg |= (1<<BITP_SEC_SCTL_IEN) | (1<<BITP_SEC_SCTL_SEN);
	Asm("ssync;");
	return E_OK;
}
/*
 * dis_int()は、この実装ではSIC_IMASKの指定ビットをクリアする。
 *
 * しかし、SIC_IMASKのクリアはアプリケーション実行中には危険であり、
 * Blackfinのマニュアルでも婉曲的に禁止されている。そのため、TOPPERS/JSP for Blackfin
 * では、この関数を実装しない。
 *
 */
JSP_L1_CODE
ER dis_int( INTNO intno )
{
	volatile uint32_t *reg = pREG_SEC0_SCTL0;
	reg += intno*2;
	*reg &= ~((1<<BITP_SEC_SCTL_IEN) || (1<<BITP_SEC_CCTL_EN));
	Asm("ssync;");
	return E_OK;
}
Example #7
0
/*
 * Set Event
 */
EXPORT void setEvent(void)
{
	INT	n;

	Asm("sev");
	_tk_get_cfn(SCTAG_TKERPRNUM, &n, 1);
	while ( sync != (n-1) );
	sync = 0;
	mp_memory_barrier();
}
Example #8
0
/**
 * \brief  soft interrupt
 * \details Call trap_s instruction to raise the exception.
 * \param[in] *p_excinf
 */
static void soft_interrupt(void *p_exinf)
{
	//// 2-E: Task1 --> Int
	x.t_t1_int = perf_end();
	//// 3-S: Int --> Nest Int
	perf_start();
	Asm("trap_s 1");
	//// 4-E: Nest Int --> Int
	x.t_nest_int = perf_end();
	//// 5-S: Int --> Task1
	perf_start();
}
Example #9
0
bool KPatcher::Patch(HMODULE hModule, const TCHAR * name, int funcid, 
					 void * pProxy, unsigned long * pNewAddress)
{
	unsigned char * pProc = (unsigned char *) GetProcAddress(hModule, name);

	if ( pProc==NULL )
		return false;

	// length of first a few instructions no less than 5 bytes
	int len = First5(pProc, name);

	if (len < 5)
		return false;

	void * start = & m_buffer[m_bufpos];		// remember stub starting address

	Asm((char) 0x68); // push					// push funcid
	Asm((unsigned long) funcid);

	Asm((char) 0xE9); // jmp					// jmp pProxy
	AsmRel(pProxy);						

	* pNewAddress = (unsigned long ) & m_buffer[m_bufpos];	// pProxy will transfer control to here

	// copy original function starting instructions	// original function prolog
	memcpy(& m_buffer[m_bufpos], pProc, len); 
	m_bufpos += len;
	
	// jump to instructions after the header		// jump prolog + len
	Asm((char) 0xE9); // jmp
	AsmRel(pProc + len);

	// change header to jump to code in m_buffer
	LongInstruction inst;
	memset(& inst, 0x90, sizeof(inst));
	inst.opcode = 0xE9;										// jump
	inst.addr   = (unsigned) start - (unsigned) (pProc+5);	// stub
	
	return HackCopy(pProc, & inst, len);
}
Example #10
0
void sio_init( void )
{
	unsigned long dly;

	*MSTCR1 &= ~MSTS3;			// SCI3 power-up
	*PMR1 |= TXD;				// P22 -> TXD pin

	*SCR = 0x00;				// TE=0, RE=0
	*SMR = 0x01;				// 8N1, system clock / 4

	*BRR = (UARTCLK + 16 * RS_BAUD_RATE) / (32 * RS_BAUD_RATE) - 1;

	dly = SYSCLK / (2 * RS_BAUD_RATE);
	while (dly--){ Asm("nop"); }

	*SCR = TE | RE;
}
/*
 *  ターゲット依存の終了処理
 */
void
target_exit(void)
{
	/*
	 *  チップ依存の終了処理
	 */
	chip_terminate();

	/*
	 *  ターゲット依存の終了処理
	 */
#if defined(TOPPERS_USE_QEMU) && !defined(TOPPERS_OMIT_QEMU_SEMIHOSTING)
	/*
	 *  QEMUを終了させる.
	 */
	Asm("mov r0, #24\n\t"
		"svc 0x00123456");
#endif
	while (true) ;
}
Example #12
0
/*
 *  ターゲットシステムの終了ルーチン
 *
 *  システムを終了する時に使う.通常はモニタ呼び出しで実現する.
 *  
 */
void
sys_exit(void)
{
    Asm("brki r16 0x20");
}
Example #13
0
int main(int argc, char *argv[]) {

    int RetValue;
    Assembler Asm(argc, argv, RetValue);
    return RetValue;
}
Example #14
0
/*
 * Wait for event
 */
EXPORT void waitForEvent( void )
{
	Asm("wfe");
	atomic_inc((UW*)&sync);
	while ( sync != 0 );
}
Example #15
0
void sio_nop(void) {
	Asm("nop\n\tnop\n\tnop\n\tnop");
}