;
; The very lowest level interrupt handlers
; The low memory vectors come here and are deflected
;

	INCLUDE "sys/offsets.i"
	
	; These functions are the C handlers	
	XREF	_int_handle1
	XREF	_int_handle2
	XREF	_int_handle3
	XREF	_int_handle4
	XREF	_int_handle5
	XREF	_int_handle6
	XREF	_int_handle7
	XREF	_except

	XREF	_udata
	XREF	_di

	; We can call this only from C
	XDEF	isr_install


	SECTION CODE
	

; Call this to install the handlers
isr_install:
	move.l	#isr_level1,$64
	move.l	#isr_level2,$68
	move.l	#isr_level3,$6c
	move.l	#isr_level4,$70
	move.l	#isr_level5,$74
	move.l	#isr_level6,$78
	move.l	#isr_level7,$7c
	move.l	#exception,$08
	move.l	#exception,$0c
	move.l	#exception,$10
	move.l	#exception,$14
	move.l	#exception,$18
	move.l	#exception,$1c
	move.l	#exception,$20
	move.l	#exception,$24
	move.l	#exception,$28
	move.l	#exception,$2c
	move.l	#exception,$30
	move.l	#exception,$34
	move.l	#exception,$38
	
	rts
	

; Level 1 interrupt; serial transmit, disk block, soft
isr_level1:
	movem.l	d0-d7/a0-a6,-(sp)
	move.l	#$01,-(sp)
	jsr	_int_handle1
	add.l	#4,sp
	movem.l	(sp)+,d0-d7/a0-a6
	rte

; Level 2 interrupt; CIA-A or expansion port
isr_level2:
	movem.l	d0-d7/a0-a6,-(sp)
	move.l	#$02,-(sp)
	jsr	_int_handle2
	add.l	#4,sp
	movem.l	(sp)+,d0-d7/a0-a6
	rte

; Level 3 interrupt; copper, vertical blank, blitter
isr_level3:
	movem.l	d0-d7/a0-a6,-(sp)
	move.l	#$03,-(sp)
	jsr	_int_handle3
	add.l	#4,sp
	movem.l	(sp)+,d0-d7/a0-a6
	rte

; Level 4 interrupt; audio channels 0-3
isr_level4:
	movem.l	d0-d7/a0-a6,-(sp)
	move.l	#$04,-(sp)
	jsr	_int_handle4
	add.l	#4,sp
	movem.l	(sp)+,d0-d7/a0-a6
	rte

; Level 5 interrupt; serial receive, disk sync
isr_level5:
	movem.l	d0-d7/a0-a6,-(sp)
	move.l	#$05,-(sp)
	jsr	_int_handle5
	add.l	#4,sp
	movem.l	(sp)+,d0-d7/a0-a6
	rte

; Level 6 interrupt; CIA-B, expansion port
isr_level6:
	movem.l	d0-d7/a0-a6,-(sp)
	move.l	#$06,-(sp)
	jsr	_int_handle6
	add.l	#4,sp
	movem.l	(sp)+,d0-d7/a0-a6
	rte

; Level 7 interrupt; serial buffer, disk block, soft
isr_level7:
	movem.l	d0-d7/a0-a6,-(sp)
	move.l	#$07,-(sp)
	jsr	_int_handle7
	add.l	#4,sp
	movem.l	(sp)+,d0-d7/a0-a6
	rte

; General exception handler
exception:
	movem.l	d0-d7/a0-a6,-(sp)	; Call me suspicious...
	jsr	_di			; Turn interrupts off
	move.l	usp,a3			; This is where the parameters are
	move.l	a3,-(sp)		; Save user context
	move.l	sp,a2			; Sort of a link instruction thingy
	move.l	a2,-(sp)		; Save kerenl exit context
	jsr	_except			; Enter the kernel proper

