request_page := fn(page_count: u8): ^u8 { msg := "\{00}\{01}xxxxxxxx\0" msg_page_count := msg + 1; *msg_page_count = page_count return @eca(^u8, 3, 2, msg, 12) } release_page := fn(ptr: ^u8, page_count: u8): void { msg := "\{01}\{00}xxxxxxxx\0" msg_page_count := msg + 1; *msg_page_count = page_count msg_ptr := @as(^^u8, @bitcast(msg + 2)); *msg_ptr = ptr return @eca(void, 3, 2, msg, 12) } outb := fn(addr: u16, value: u8): void { msg := "\0\0\0\0\0"; *msg = 1; *(msg + 1) = 0; *@as(^u16, @bitcast(msg + 2)) = addr; *(msg + 4) = value @eca(void, 3, 3, msg, 5) return } inb := fn(addr: u16): u8 { msg := "\0\0\0\0"; *msg = 0; *(msg + 1) = 0; *@as(^u16, @bitcast(msg + 2)) = addr return @eca(u8, 3, 3, msg, 4) } outl := fn(addr: u16, value: u32): void { msg := "\0\0\0\0\0\0\0\0"; *msg = 1; *(msg + 1) = 2; *@as(^u16, @bitcast(msg + 2)) = addr; *(msg + 4) = value >> 24 & 0xFF; *(msg + 5) = value >> 16 & 0xFF; *(msg + 6) = value >> 8 & 0xFF; *(msg + 7) = value & 0xFF @eca(void, 3, 3, msg, 8) return } inl := fn(addr: u16): u32 { msg := "\0\0\0\0"; *msg = 0; *(msg + 1) = 2; *@as(^u16, @bitcast(msg + 2)) = addr return @eca(u32, 3, 3, msg, 4) }