4-6-1

;
;exception handler of not nesting
;add to "#pragma interrupt" extention
;
   .import	_vect_table
   .section	HNDL,code
   
;interrupt handling program(sequential exception handling,let BL bit be)
;If a general exception event occurs when the BL bit in SR is 1, a branch is made to the same address (H'A0000000) as for a reset.
   .ORG     H'600
   MOV.L    R0,@-R15          ;push R0
   MOV      #H'A4,R0          ;set address INTEVT2
   SHLL16   R0                ;
   SHLL8    R0                ;
   MOV.L    @R0,R0            ;get interrupt code
   SHLR2    R0                ;
   MOV.L    R1,@-R15          ;push R1
   SHLR     R0                ;
   MOV.L    #_vect_table,R1   ;get jump table top address
   ADD      R1,R0             ;added offset address
   MOV.L    @R15+,R1          ;pop R1
   MOV.L    @R0,R0            ;get process top address
   JMP      @R0               ;call process
   MOV.L    @R15+,R0          ;pop R0
  
   .END


4-6-2

#include "prot.c"
#define reserve 0
   
#pragma section VECT
void (* const vect_table[])(void) = {
   reserve,                  // 0x000 reset
   reserve,                  // 0x020 reset
   invalidTlbRead,           // 0x040 TLB invalid(read)
   invalidTlbWrite,          // 0x060 TLB invalid(write)
   firstPageWrite,           // 0x080 First Page write
   protectionErrorRead,      // 0x0a0 TLB permition(read)
   protectionErrorWrite,     // 0x0c0 TLB permition(write)
   addressErrorRead,         // 0x0e0 Address error(raed)
   addressErrorWrite,        // 0x100 Address error(write)
   reserve,                  // 0x120 -	
   reserve,                  // 0x140 -	
   reserve,                  // 0x160 TRAPA
   illigalInstruction,       // 0x180 Illigal instruction
   slotIlligalInstruction,   // 0x1a0 Slot illigal instruction
   nmi,                      // 0x1c0 NMI
   userBreak,                // 0x1e0 User braek
   irl15,                    // 0x200 IRL15
   irl14,                    // 0x220 IRL14
   irl13,                    // 0x240 IRL13
   irl12,                    // 0x260 IRL12
   irl11,                    // 0x280 IRL11
   irl10,                    // 0x2a0 IRL10
   irl9,                     // 0x2c0 IRL9
   irl8,                     // 0x2e0 IRL8
   irl7,                     // 0x300 IRL7
   irl6,                     // 0x320 IRL6
   irl5,                     // 0x340 IRL5
   irl4,                     // 0x360 IRL4
   irl3,                     // 0x380 IRL3
   irl2,                     // 0x3a0 IRL2
   irl1,                     // 0x3c0 IRL1
   reserve,                  // 0x3e0 -	
   tuni0,                    // 0x400 TUNI0
   tuni1,                    // 0x420 TUNI1
   tuni2,                    // 0x440 TUNI2
   ticpi2,                   // 0x460 TICPI2
   ati,                      // 0x480 RTC	ATI
   pri,                      // 0x4a0 	PRI
   cui,                      // 0x4c0	CUI
   eri,                      // 0x4e0 SCI	ERI
   rxi,                      // 0x500	RXI
   txi,                      // 0x520	TXI
   tei,                      // 0x540	TEI
   iti,                      // 0x560 WDT	ITI
   rcmi,                     // 0x580 BSC	RCMI
   rovi,                     // 0x5a0	ROVI
   dmaAddressError,          // 0x5c0 DMA address error	
   h_udi,                    // 0x5e0 H-UDI
   irq0,                     // 0x600 IRQ0
   irq1,                     // 0x620 IRQ1
   irq2,                     // 0x640 IRQ2
   irq3,                     // 0x660 IRQ3
   irq4,                     // 0x680 IRQ4
   irq5,                     // 0x6a0 IRQ5


4-6-3

;Interrupt handler
;VBR + h'600
;
 .section	INT,code,align=4
  
  mov.l	r0,@-sp		;push R0
  mov	#h'a4,r0	;set INTEVT2 address
  mov.l	r1,@-sp		;push R1
  shll16	r0
  mov.l	r2,@-sp		;push R2
  shll8	r0
  mov.l	r3,@-sp		;push R3
  mov.l	@r0,r0		;get event code
  mov.l	r4,@-sp		;push R4
  shlr2	r0		;make jump table offset address
  mov.l	r5,@-sp		;push R5
  shlr	r0		;
  mov.l	r6,@-sp		;push R6
  mov	r0,r2		;copy
  mov.l	r7,@-sp		;push R7
  mov.l	#startof CVECT,r1	;get top address of jump table
  sts	pr,@-sp		;push PR
  add	r1,r0		;
  stc	spc,@-sp	;push SPC
  mov.l	@r0,r0		;get jump address
  stc	ssr,@-sp	;push SSR
  ldc	r0,spc		;set jump address
   
  shlr2	r2		;make priority table address
  mova	tbl,r0		;get table top address
  add	r2,r0		;top + offset address
  mov.b	@r0,r0		;get priority
  
  tst	r0,r0		;test table data,=0 INTEVT,!=0 IPRx
  bf	sh7708in	;
  mov	#h'd8,r0	;set intevt address(H'FFFFFFD8)
  mov.l	@r0,r0		;get intevt code
  shlr	r0		;change code to interrupt mask data
  mov.l	#h'f0,r1	;
  extu.b	r1,r1		;
  and	r1,r0		;
  bra	set_sr		;
  xor	r1,r0		;
sh7708in:
  mov	r0,r2		;copy
  shlr	r0		;check bit0
  bt/s	set_sr		;go to IRL priority
  shll	r0		;
   
  shar	r2
  shar	r2
  and	#2,r0		;
  mov.l	#h'fffffee2,r1	;
  add	r0,r1		;
  mov.w	@r1,r0		;
  shld	r2,r0		;
 and	#h'f0,r0	;
set_sr:	
  mov.l	mask,r1		;get mask data
  stc	sr,r2		
  and	r2,r1		;clear interrupt mask bits
  or	r0,r1		;set interrupt priority
  ldc	r1,ssr		;set SSR
  mova	ret_hnd,r0	;get return address
  lds	r0,pr		;set PR
  rte			;call
  nop			;
   
;return program
ret_hnd:
  mov	set_blk,r0	;get BL bit set data
  stc	sr,r1		;
  or	r1,r0		;
  ldc	r0,sr		;exception mask for stack process
  ldc	@sp+,ssr	;pop
  ldc	@sp+,spc	;
  lds	@sp+,pr		;
  mov.l	@sp+,r7		;no change RB bit
  mov.l	@sp+,r6		;
  mov.l	@sp+,r5		;
  mov.l	@sp+,r4		;
  mov.l	@sp+,r3		;
  mov.l	@sp+,r2		;
  mov.l	@sp+,r1		;
  mov.l	@sp+,r0		;
  rte			;return 
  nop			;
  
        .align	4
  mask:	.data.l	h'efffff0f
  set_blk:	.data.l	h'10000000
   
  ;code for priority(interrupt mask)
  ;  bit7 - 4	: shift or priority
  ;  bit3 - 0	: lower address
  tbl:
   	.data.b	0	;000	Power ON reset
   	.data.b	0	;020	Manual reset
   	.data.b	0,0,0,0,0,0,0,0,0,0,0,0	;040-1a0
   	.data.b	h'f1	;1c0	NMI
   	.data.b	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	;1e0-3e0
   	.data.b	h'e0	;400	tuni0
   	.data.b	h'f0	;420	tuni1
   	.data.b	h'0	;440	tuni2
   	.data.b	h'0	;460	ticpi2
   	.data.b	h'10	;480	ati
   	.data.b	h'10	;4a0	pri
   	.data.b	h'10	;4c0	cui
   	.data.b	h'2	;4e0	eri
   	.data.b	h'2	;500	rxi
   	.data.b	h'2	;520	txi
   	.data.b	h'2	;540	tei
   	.data.b	h'e2	;560	iti
   	.data.b	h'f2	;580	rmci
   	.data.b	h'f2	;5a0	rovi
   	.data.b	0	;5c0
   	.data.b	h'f1	;5e0	H-UDI
   	.data.b	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	;600-7e0
   	.data.b	0,0,0,0,0,0,0,0,0,0,0,0,0	;800-980
   	.end


4-6-4

/*
   Interrupt handling program
*/
#include <_h_c_lib.h>
#include "iodefine.h"
#include 

void irqHandl(void) ;
void expHandl(void) ;
void mmuHandl(void) ;
  
extern void (* const vect_table[])(void) ;

const unsigned long priority[14][2]={
  0xfffffee2,12,              /*400*/
  0xfffffee2,8,               /*420*/
  0xfffffee2,4,               /*440*/
  0xfffffee2,4,               /*460*/
  0xfffffee2,0,               /*480*/
  0xfffffee2,0,               /*4A0*/
  0xfffffee2,0,               /*4C0*/
  0xfffffee4,4,               /*4E0*/
  0xfffffee4,4,               /*500*/
  0xfffffee4,4,               /*520*/
  0xfffffee4,4,               /*540*/
  0xfffffee4,12,              /*560*/
  0xfffffee4,8,               /*580*/
  0xfffffee4,8,               /*5A0*/
};

#pragma section IRQ
#pragma interrupt(irqHandl)

void irqHandl(void)
{
  unsigned int num,mask;
  
  switch(num = INTX.INTEVT2>>5){
  case 0xe:	// NMI
  case 0x2f:	// H-UDI
  mask = 15 ;
  break ;
  default:
  if((num > 0x2f) | (num < 0x20))
  mask = ((INTC.INTEVT>>5) & 0xf)^0xf ;
  else {
    mask = *(unsigned short *)(priority[(INTC.INTEVT-0x400)>>5][0]) ;
    mask = mask >> priority[(INTC.INTEVT-0x400)>>5][1] ;
    mask &= 0xf ;
  }
}  
  set_cr((get_cr() & 0xefffff0f)+(mask<<4)) ;                      // set sr
   (vect_table[num])() ;                                           // jump interrupt routine
  set_cr(get_cr() | 0x10000000) ;                                  // set BL bit
}

#pragma section EXP
#pragma interrupt(expHandl)

void expHandl(void)
{
 (vect_table[INTC.EXPEVT>>5])() ;                                  // jump exception routine
}

#pragma section MISS
#pragma interrupt(mmuHandl)

void mmuHandl(void)
{
 (vect_table[INTC.EXPEVT>>5])() ;                                  // jump mmu TLB miss routine
}