/* 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"); }
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 */ }
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); } */ } }
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; }
/* * 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(); }
/** * \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(); }
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); }
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) ; }
/* * ターゲットシステムの終了ルーチン * * システムを終了する時に使う.通常はモニタ呼び出しで実現する. * */ void sys_exit(void) { Asm("brki r16 0x20"); }
int main(int argc, char *argv[]) { int RetValue; Assembler Asm(argc, argv, RetValue); return RetValue; }
/* * Wait for event */ EXPORT void waitForEvent( void ) { Asm("wfe"); atomic_inc((UW*)&sync); while ( sync != 0 ); }
void sio_nop(void) { Asm("nop\n\tnop\n\tnop\n\tnop"); }