Files
Z8C-Homebrew-Computer/OperatingSystem/monitor_v2/include/kdrv_int.s
2024-11-30 15:41:09 +01:00

85 lines
2.1 KiB
ArmAsm

INT_VEC_TABLE .equ [interrupt_vectors]
INT_PIO_ADDRD .equ CS_PIO_AD
INT_PIO_ADDRC .equ CS_PIO_AC
;initialize interrupt controller
intctrl_init:
;disable interrupt (just to make sure)
di
;setup interrupt table
ld a,high [INT_VEC_TABLE]
ld i,a
;setup PIO
ld a, 10000011b ;enable interrupt
out (INT_PIO_ADDRC), a
ld a, 00000010b ;set interrupt vector
out (INT_PIO_ADDRC), a
ld a, 11001111b ;setup as controll port
out (INT_PIO_ADDRC), a
ld a, 11110111b ;set all as inputs
out (INT_PIO_ADDRC), a
ld a, 10010111b ;enable interrupt; logic or, mask follows
out (INT_PIO_ADDRC), a
ld a, 11000000b ;set interrupt mask
out (INT_PIO_ADDRC), a
; set port
xor a
out (INT_PIO_ADDRD), a
;fill table
ld hl,[INT_VEC_TABLE]
ld b,128
_intctrl_init_fill_loop:
ld a, low [_int_invalid_int]
ld (hl),a
inc hl
ld a, high [_int_invalid_int]
ld (hl),a
inc hl
djnz _intctrl_init_fill_loop
;set int vector for PIO
ld hl, [_isr_pio]
ld (INT_VEC_TABLE + 2), hl
;enable interrupts
im 2
ret
;------------------------------------------------------------------------------
; setup interrupt for PIO pin
; inputs: a (interrupt pin)
; hl (jump addr)
;------------------------------------------------------------------------------
initctrl_int_register:
;------------------------------------------------------------------------------
; removes interrupt for PIO pin
; inputs: a (interrupt pin)
;------------------------------------------------------------------------------
initctrl_int_abandon:
; jumps to isr. MUST be exited with RETI opcode!
_isr_pio:
di
ld hl, [_str_pio_interrupt]
call print_str
;get int from pio
in a,(INT_PIO_ADDRD)
call print_a_hex
_int_invalid_int:
di
ld hl, [_str_invalid_interrupt]
call print_str
ei
reti
_str_invalid_interrupt:
db 10,13,"[KERNEL] INT: Invalid interrupt call! Exiting ISR.",10,13,0
_str_pio_interrupt:
db 10,13,"[KERNEL] INT: (DEBUG) Interrupt call from PIO.",10,13,0