⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 isr_initialise.c

📁 s1mp3 sdk, action mp3 develop tool kit!
💻 C
字号:
/*
  09/03/2006 22:02:
  fc: Fixed indexes in ISR_Install() & ISR_Remove().

  01/03/2006 20:01
  fc: Fixed the differents interrupts handler.
      Added a retargetable mechanism so a handler can be installed by a third party application.
      It's a primitive way but we aren't using multitasking, are we ?
*/

#include <ATJ2085_Ports.h>
#include <drivers/isr.h>
#include <drivers/rtc.h>
#include <drivers/usb.h>

/* Minimal default ISR handlers */
/* --- */
void DEFAULT_ADC_ISR( void ) {
#asm
	in	a, (SARADC_IRQSTAT_REG)
	out	(SARADC_IRQCTRL_REG), a
#endasm
}

/* --- */
void DEFAULT_KEYBOARD_ISR( void ) {
#asm
	ld	a, MINT_STATUS_KEYBOARD
	out     (MINT_STATUS_REG), a
#endasm
}

/* --- */
void DEFAULT_RTC_ISR( void ) {
#asm
	in	a, (RTC_IRQSTATUS_REG)
	out	(RTC_IRQSTATUS_REG), a
#endasm
}

/* --- */
void DEFAULT_DMA_CTC_ISR( void ) {
#asm
	in	a, (IRQ_STATUS_REG)
	out	(IRQ_STATUS_REG), a
#endasm
}

/* --- */
void DEFAULT_UART_ISR( void ) {
#asm
	in	a, (UART_CONTROL_REG)
	out	(UART_CONTROL_REG), a
#endasm
}

/* --- */
void DEFAULT_USB_ISR( void ) {
#asm
	in	a, (USB_IRQSTATUS_REG)
	out	(USB_IRQSTATUS_REG), a
#endasm
}

/* --- */
void DEFAULT_I2C_ISR( void ) {
#asm
	in	a, (I2C_CONTROL_REG)
	out	(I2C_CONTROL_REG), a
#endasm
}

/* --- */
void DEFAULT_DSP_ISR( void ) {
#asm
	ld      a, MINT_STATUS_DSP
	out	(MINT_STATUS_REG), a
#endasm
}

void *_Current_ISR_Table[] = {
	DEFAULT_ADC_ISR,
	DEFAULT_KEYBOARD_ISR,
	DEFAULT_RTC_ISR,
	DEFAULT_DMA_CTC_ISR,
	DEFAULT_UART_ISR,
	DEFAULT_USB_ISR,
	DEFAULT_I2C_ISR,
	DEFAULT_DSP_ISR
};

void *_Default_ISR_Table[] = {
	DEFAULT_ADC_ISR,
	DEFAULT_KEYBOARD_ISR,
	DEFAULT_RTC_ISR,
	DEFAULT_DMA_CTC_ISR,
	DEFAULT_UART_ISR,
	DEFAULT_USB_ISR,
	DEFAULT_I2C_ISR,
	DEFAULT_DSP_ISR
};

void _ISR_Handler(void) {
#asm
	in	a, (MINT_STATUS_REG)
	rla
	jp	nc, no_adc_isr
	ld	hl, (__Current_ISR_Table + ISR_HANDLER_ADC)
	push	hl
	ret
no_adc_isr:
	rla
	jp	nc, no_keyboard_isr
	ld	hl, (__Current_ISR_Table + ISR_HANDLER_KEYBOARD)
	push	hl
	ret
no_keyboard_isr:
	rla
	jp	nc, no_rtc_isr
	ld	hl, (__Current_ISR_Table + ISR_HANDLER_RTC)
	push	hl
	ret
no_rtc_isr:
	rla
	jp	nc, no_dma_ctc_isr
	ld	hl, (__Current_ISR_Table + ISR_HANDLER_DMA_CTC)
	push	hl
	ret
no_dma_ctc_isr:
	rla
	jp	nc, no_uart_isr
	ld	hl, (__Current_ISR_Table + ISR_HANDLER_UART)
	push	hl
	ret
no_uart_isr:
	rla
	jp	nc, no_usb_isr
	ld	hl, (__Current_ISR_Table + ISR_HANDLER_USB)
	push	hl
	ret
no_usb_isr:
	rla
	jp	nc, no_i2c_isr
	ld	hl, (__Current_ISR_Table + ISR_HANDLER_I2C)
	push	hl
	ret
no_i2c_isr:
	rla
	jp	nc, no_dsp_isr
	ld	hl, (__Current_ISR_Table + ISR_HANDLER_DSP)
	push	hl
	ret
no_dsp_isr:
#endasm

}

/* --- */
void misr( void ) {
#asm
misr_start:
	di
	ex	af, af' '
	exx
	call	__ISR_Handler
	exx
	ex	af, af'	'
	ei
	reti
misr_end:
#endasm
}

void nmisr( void ) {
#asm
nmisr_start:
	retn
nmisr_end:
#endasm
}

/* 
  Set interrupts to IM 1, i.e. MI to 0x0038, NMI to 0x066
*/
void ISR_Initialise( void ) {
#asm
	di

	im	1

	; Copy ISR to 0x0038
	ld	hl, misr_start
	ld	de, 0x0038
	ld	bc, misr_end - misr_start
	ldir

	; Copy NMI ISR to 0x0066
	ld	hl, nmisr_start
	ld	de, 0x0066
	ld	bc, nmisr_end - nmisr_start
	ldir
#endasm
}

/*
  Install an user interrupt
*/
int ISR_Install(int Int_Number, void *Proc) {
	if(Int_Number >= ISR_HANDLER_ADC && Int_Number <= ISR_HANDLER_DSP) {
		#asm
			di
		#endasm
		_Current_ISR_Table[Int_Number >> 1] = Proc;
		#asm
			ei
		#endasm
		return(1);
	}
	return(0);
}

/*
  Restore the system interrupt
  (All must be restored forcibly right after program's end).
*/
int ISR_Remove(int Int_Number) {
	if(Int_Number >= ISR_HANDLER_ADC && Int_Number <= ISR_HANDLER_DSP) {
		#asm
			di
		#endasm
			_Current_ISR_Table[Int_Number  >> 1] = _Default_ISR_Table[Int_Number  >> 1];
		#asm
			ei
		#endasm
		return(1);
	}
	return(0);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -