Listing 2. Interrupt Handlers

___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;