___lib_start: call ___lib_setup_c; /* Setup C runtime model */ jump _main; /* Begin C program */ ___lib_prog_term: pm(__done_execution)=PC; idle; jump ___lib_prog_term; DSP_K_INTR_RAPPER_0: push sts; DSP_K_INTR_RAPPER: bit tst ustat2 0x8; /* in interrupt? */ if not tf jump DSP_K_INTR_RAPPER_1; /* study pcstk to see where we were */ jump ___lib_prog_term; DSP_K_INTR_RAPPER_1: bit set ustat2 0x8; /* flag in interrupt */ /* select reqd shadow registers */ bit set mode1 0x0490; nop; r0=i7; /* remember stack */ r1=i6; /* and frame */ /* select remaining shadow registers */ bit set mode1 0x0008; r4 = ustat1; i6=r1; /* set frame */ i7=r0; /* and stack */ /* The simulator fails to store ASTAT across delayed interrupt vectoring. Test for silicon revision 0. */ ustat1 = astat; /* astat kept across vectoring */ r0 = mode2; /* get silicon rev. (simulator is 0)*/ r1 = 0x30000000; /* value for silicon rev. 0 */ r0 = r0 and r1; /* simulator (or rev. 0)? */ if ne jump (pc,0x7); /* if not, no problem */ pop sts; /* pop off bad astat (+good mode1) */ astat = ustat1; /* fix astat */ /* do what simulator should've done and redisable (pop sts undoes) */ push sts; bit clr mode1 0x1000; bit set mode1 0x498; /* re-set shadow */ nop; /* preserve i12 when interrupt over 'return' */ dm(i7,m7)=i12; /* program stack bound unlimited in shadow */ ustat1 = i7; b7=0; l7=0x7fffffff; i7 = ustat1; /* call C interrupt routine */ cjump __DSP_K_INTR_RAPPER (db); dm(i7,m7)=r2; dm(i7,m7)=pc; /* restore i12 when interrupt over 'return' */ modify(i7,m6); i12=dm(i7,m5); /* de-select shadow registers */ bit clr mode1 0x0498; /* mark out of interrupt */ bit clr ustat2 0x8; DSP_K_INTR_RAPPEREND: rti( db ); /* all that vector to DSP_K_INTR_RAPPER_0 must be closed here (CB7 never returns) */ # if( DSP_K_TIMER_SIG == SIG_TMZ )&& \ ( SHARC == __ADSP21065L__ ) pop sts; bit set mode1 0x1000; # else nop; nop; # endif .endseg;