Make your own OS in 30 days – day7/8: Mouse interrupt handler
Day 7/8 implements FIFO ring buffer for Keyboard/Mouse handler to handle more than 1 byte code.
The main function wait for interrupt until it gets an interrupt by STI and HLT. When it’s interrupted, it disables interrupts by CLI, get key/mouse data by STI, draw it and wait for the next interrupt.
This version doesn’t have layers and mouse cursor overwrites background as below.
struct FIFO8 mousefifo; struct FIFO8 { unsigned char *buf; int p, q, size, free, flags; }; void inthandler21(int *esp) { unsigned char data; io_out8(PIC0_OCW2, 0x61); // IRQ-01 accepted -> PIC0 data = io_in8(PORT_KEYDAT); fifo8_put(&keyfifo, data); return; } void inthandler2c(int *esp) { unsigned char data; io_out8(PIC1_OCW2, 0x64); // IRQ-12 accepted -> PIC1 io_out8(PIC0_OCW2, 0x62); // IRQ-02 accepted -> PIC0 data = io_in8(PORT_KEYDAT); fifo8_put(&mousefifo, data); return; } int fifo8_put(struct FIFO8 *fifo, unsigned char data) { if (fifo->free == 0) { fifo->flags |= FLAGS_OVERRUN; return -1; } fifo->buf[fifo->p] = data; fifo->p++; if (fifo->p == fifo->size) { fifo->p = 0; } fifo->free--; return 0; } // loop in the main function for (;;) { io_cli(); if (fifo8_status(&keyfifo) + fifo8_status(&mousefifo) == 0) { io_stihlt(); } else { if (fifo8_status(&keyfifo) != 0) { i = fifo8_get(&keyfifo); io_sti(); // draw key data } else if (fifo8_status(&mousefifo) != 0) { i = fifo8_get(&mousefifo); io_sti(); // draw mouse data } } } }