pub fn out(comptime T: type, port: u16, value: T) void { switch (T) { u8 => outb(port, value), u16 => outw(port, value), u32 => outl(port, value), else => @compileError("Bad I/O port out size!"), } } pub fn in(comptime T: type, port: u16) T { return switch (T) { u8 => inb(port), u16 => inw(port), u32 => inl(port), else => @compileError("Bad I/O port in size!"), }; } pub fn outb(port: u16, val: u8) void { asm volatile ("outb %[val], %[port]" : : [val] "{al}" (val), [port] "N{dx}" (port), ); } pub fn outw(port: u16, val: u16) void { asm volatile ("outw %[val], %[port]" : : [val] "{ax}" (val), [port] "N{dx}" (port), ); } pub fn outl(port: u16, val: u32) void { asm volatile ("outl %[val], %[port]" : : [val] "{eax}" (val), [port] "N{dx}" (port), ); } pub fn inb(port: u16) u8 { return asm volatile ("inb %[port], %[result]" : [result] "={al}" (-> u8), : [port] "N{dx}" (port), ); } fn inw(port: u16) u16 { return asm volatile ("inw %[port], %[result]" : [result] "={ax}" (-> u16), : [port] "N{dx}" (port), ); } pub fn inl(port: u16) u32 { return asm volatile ("inl %[port], %[result]" : [result] "={eax}" (-> u32), : [port] "N{dx}" (port), ); }