Dynamic IRQ handling

This commit is contained in:
2025-12-10 01:33:51 +01:00
parent 64b14f3878
commit 6feea1444a
18 changed files with 341 additions and 121 deletions

View File

@@ -56,6 +56,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define CASCADE_IRQ 2
static void pic_mask_all(void) {
ioport_out8(PIC1_DATA, 0xFF);
ioport_wait();
ioport_out8(PIC2_DATA, 0xFF);
ioport_wait();
}
void pic_init(void) {
// remap & disable
@@ -82,21 +89,41 @@ void pic_init(void) {
ioport_out8(PIC2_DATA, ICW4_8086);
ioport_wait();
pic_mask();
pic_mask_all();
}
void pic_mask(void) {
ioport_out8(PIC1_DATA, 0xFF);
ioport_wait();
ioport_out8(PIC2_DATA, 0xFF);
ioport_wait();
void pic_unmask_irq(uint8_t irq) {
uint16_t port;
uint8_t value;
irq -= 0x20;
if (irq < 8) {
port = PIC1_DATA;
} else {
port = PIC2_DATA;
irq -= 8;
}
value = ioport_in8(port) & ~(1<<irq);
ioport_out8(port, value);
}
void pic_unmask(void) {
ioport_out8(PIC1_DATA, 0);
ioport_wait();
ioport_out8(PIC2_DATA, 0);
ioport_wait();
void pic_mask_irq(uint8_t irq) {
uint16_t port;
uint8_t value;
irq -= 0x20;
if (irq < 8) {
port = PIC1_DATA;
} else {
port = PIC2_DATA;
irq -= 8;
}
value = ioport_in8(port) | (1<<irq);
ioport_out8(port, value);
}
void pic_fini(uint8_t trap) {