int pci_read( int bus, int dev, int func, int reg, int size ) { WORD base; struct PCI_CONF conf; conf.data = 0; conf.bits.enable = TRUE; conf.bits.bus = bus; conf.bits.dev = dev; conf.bits.func = func; conf.bits.reg = reg & 0xFC; port_outd( 0xCF8, conf.data ); base = 0xCFC + ( reg & 0x03 ); switch( size ) { case SIZE_BYTE: return port_inb( base ); case SIZE_WORD: return port_inw( base ); case SIZE_DWORD: return port_ind( base ); } return FAIL; }
int int17(void) { int timeout, val8; ioport_t addr; CARRY; if (_DX >= NUM_LPTS) return 1; addr = READ_WORD(BIOS_ADDRESS_LPT1 + _DX * 2); if (addr == 0) return 1; timeout = READ_BYTE(BIOS_LPT1_TIMEOUT + _DX) << 8; reset_idle(2); switch(_AH) { case 0: port_outb(addr, _AL); val8 = port_inb(addr + 2); port_outb(addr + 2, val8 | 0x01); // send strobe port_outb(addr + 2, val8 & ~0x01); while (((val8 = port_inb(addr + 1)) & LPT_STAT_NOT_ACK) && timeout) timeout--; break; case 1: val8 = port_inb(addr + 2); port_outb(addr + 2, val8 & ~0x04); // send init port_outb(addr + 2, val8 | 0x04); val8 = port_inb(addr + 1); break; case 2: val8 = port_inb(addr + 1); break; default: return 1; } _AH = val8 ^ (LPT_STAT_NOT_ACK | LPT_STAT_NOIOERR); if (!timeout) _AH |= LPT_STAT_TIMEOUT; NOCARRY; return 1; }
/* * Routine that handles keyboard interrupt */ void kbc_irq() { static uint8_t shift = 0; static uint8_t ctrl= 0; // Read scan from port 0x60 uint8_t b = port_inb(0x60); //Detect if shift is pressed switch(b) { case KBCSC_LEFTSHIFT: shift |= 1; break; case KBCSC_RIGHTSHIFT: shift |= 2; break; case (KBCSC_LEFTSHIFT | 0x80): shift &= ~1; break; case (KBCSC_RIGHTSHIFT | 0x80): shift &= ~2; /*case (KBCSC_LEFTCTRL | 0x80): ctrl |= 1; break; case (KBCSC_LEFTCTRL): ctrl |= 1; break;*/ /*case (KBCSC_RIGHTCTRL | 0x80): shift &= ~2;*/ default: break; } //Call method that converts scan code to character uint8_t c = get_tochar(b, shift, ctrl); if(c!=0) { print("%c", c); print_line(1,24, "%c", c); } }