/* interrupt.S - interrupt handlers */ #include .text .global EXC_DIV_ERROR, EXC_DEBUG, EXC_NMI, EXC_BREAKPOINT .global EXC_INTO_OVERFLOW, EXC_BOUND_OVERFLOW, EXC_INVAL_OPCODE, EXC_NO_COPROCESSOR .global EXC_DOUBLE_EXCEPTION, EXC_COPROC_PROT_ERROR, EXC_INVAL_TSS, EXC_SEG_NOT_PRESENT .global EXC_STACK_FAULT, EXC_GEN_PROT_VIOLATION, EXC_PAGE_FAULT, EXC_RESERVED .global EXC_COPROCESSOR_ERROR, EXC_ALIGN_ERROR EXC_DIV_ERROR: mov $16,%ax mov %ax,%ds pushl $exc_div_error_str call print addl $4,%esp jmp looping EXC_DEBUG: mov $16,%ax mov %ax,%ds pushl $exc_debug_str call print addl $4,%esp jmp looping EXC_NMI: mov $16,%ax mov %ax,%ds pushl $exc_nmi_str call print addl $4,%esp jmp looping EXC_BREAKPOINT: mov $16,%ax mov %ax,%ds pushl $exc_breakpoint_str call print addl $4,%esp jmp looping EXC_INTO_OVERFLOW: mov $16,%ax mov %ax,%ds pushl $exc_into_overflow_str call print addl $4,%esp jmp looping EXC_BOUND_OVERFLOW: mov $16,%ax mov %ax,%ds pushl $exc_bound_overflow_str call print addl $4,%esp jmp looping EXC_INVAL_OPCODE: mov $16,%ax mov %ax,%ds pushl $exc_inval_opcode_str call print addl $4,%esp jmp looping EXC_NO_COPROCESSOR: mov $16,%ax mov %ax,%ds pushl $exc_no_coprocessor_str call print addl $4,%esp jmp looping EXC_DOUBLE_EXCEPTION: mov $16,%ax mov %ax,%ds pushl $exc_double_exception_str call print addl $4,%esp jmp looping EXC_COPROC_PROT_ERROR: mov $16,%ax mov %ax,%ds pushl $exc_coproc_prot_error_str call print addl $4,%esp jmp looping EXC_INVAL_TSS: mov $16,%ax mov %ax,%ds pushl $exc_inval_tss_str call print addl $4,%esp jmp looping EXC_SEG_NOT_PRESENT: mov $16,%ax mov %ax,%ds pushl $exc_seg_not_present_str call print addl $4,%esp jmp looping EXC_STACK_FAULT: mov $16,%ax mov %ax,%ds pushl $exc_stack_fault_str call print addl $4,%esp jmp looping EXC_GEN_PROT_VIOLATION: mov $16,%ax mov %ax,%ds pushl $exc_gen_prot_violation_str call print addl $4,%esp jmp looping EXC_PAGE_FAULT: mov $16,%ax mov %ax,%ds pushl $exc_page_fault_str call print addl $4,%esp jmp looping EXC_RESERVED: mov $16,%ax mov %ax,%ds pushl $exc_reserved_str call print addl $4,%esp jmp looping EXC_COPROCESSOR_ERROR: mov $16,%ax mov %ax,%ds pushl $exc_coprocessor_error_str call print addl $4,%esp jmp looping EXC_ALIGN_ERROR: mov $16,%ax mov %ax,%ds pushl $exc_align_error_str call print addl $4,%esp looping: jmp looping .data exc_div_error_str: .asciz "EXCEPTION: DIVIDE ERROR\r\n" exc_debug_str: .asciz "EXCEPTION: DEBUG EXCEPTION\r\n" exc_nmi_str: .asciz "EXCEPTION: NON-MASKABLE INTERRUPT\r\n" exc_breakpoint_str: .asciz "EXCEPTION: BREAKPOINT\r\n" exc_into_overflow_str: .asciz "EXCEPTION: OVERFLOW (INTO)\r\n" exc_bound_overflow_str: .asciz "EXCEPTION: OVERFLOW (BOUND)\r\n" exc_inval_opcode_str: .asciz "EXCEPTION: INVALID OPCODE\r\n" exc_no_coprocessor_str: .asciz "EXCEPTION: NO COPROCESSOR\r\n" exc_double_exception_str: .asciz "EXCEPTION: DOUBLE EXCEPTION\r\n" exc_coproc_prot_error_str: .asciz "EXCEPTION: COPROCESSOR PROTECTION ERROR\r\n" exc_inval_tss_str: .asciz "EXCEPTION: INVALID TSS SEGMENT\r\n" exc_seg_not_present_str: .asciz "EXCEPTION: SEGMENT NOT PRESENT\r\n" exc_stack_fault_str: .asciz "EXCEPTION: STACK FAULT\r\n" exc_gen_prot_violation_str: .asciz "EXCEPTION: GENERAL PROTECTION VIOLATION\r\n" exc_page_fault_str: .asciz "EXCEPTION: PAGE FAULT\r\n" exc_reserved_str: .asciz "EXCEPTION: UNKNOWN ERROR\r\n" exc_coprocessor_error_str: .asciz "EXCEPTION: COPROCESSOR ERROR\r\n" exc_align_error_str: .asciz "EXCEPTION: ALIGNMENT ERROR\r\n" .text .global IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7, IRQ8, IRQ9, IRQ10, IRQ11, IRQ12, IRQ13, IRQ14, IRQ15 IRQ0: pusha pushf incb cur_blink_counter cmpb $CUR_BLINK,cur_blink_counter jb no_blink subb $CUR_BLINK,cur_blink_counter call console_cur_blink no_blink: cmpl $0,timers je no_timer decl timers no_timer: mov $0x20, %al out %al, $0x20 popf popa iret IRQ1: push %ax push %ds push %edx mov $16,%ax mov %ax,%ds in $0x60,%al call kb_write_keycode mov $0x20, %al out %al, $0x20 pop %edx pop %ds pop %ax iret IRQ2: push %ax mov $0x20, %al out %al, $0x20 pop %ax iret IRQ3: push %ax mov $0x20, %al out %al, $0x20 pop %ax iret IRQ4: push %ax mov $0x20, %al out %al, $0x20 pop %ax iret IRQ5: push %ax mov $0x20, %al out %al, $0x20 pop %ax iret IRQ6: #push %ax pushf pusha call floppy_IRQ mov $0x20, %al out %al, $0x20 #pop %ax popa popf iret IRQ7: push %ax mov $0x20, %al out %al, $0x20 pop %ax iret IRQ8: push %ax mov $0x20, %al out %al, $0xA0 pop %ax iret IRQ9: push %ax mov $0x20, %al out %al, $0xA0 pop %ax iret IRQ10: push %ax mov $0x20, %al out %al, $0xA0 pop %ax iret IRQ11: push %ax mov $0x20, %al out %al, $0xA0 pop %ax iret IRQ12: push %ax mov $0x20, %al out %al, $0xA0 pop %ax iret IRQ13: push %ax mov $0x20, %al out %al, $0xA0 pop %ax iret IRQ14: push %ax mov $0x20, %al out %al, $0xA0 pop %ax iret IRQ15: push %ax mov $0x20, %al out %al, $0xA0 pop %ax iret