diff options
| author | andromeda <andromeda@bsd.my.domain> | 2026-10-19 18:54:26 -0400 |
|---|---|---|
| committer | andromeda <andromeda@bsd.my.domain> | 2026-10-19 18:54:26 -0400 |
| commit | aa113b17449e67dbd808587b411aeb21ea869974 (patch) | |
| tree | b6b7f1b71d761cbc043d5e97f72345d428c140ac /lib/uefi.c3l/uefi/protocol/console.c3i | |
| parent | 97d331175ae47aec3d0b990ada9754a9e4298e32 (diff) | |
minimal running stub
Diffstat (limited to 'lib/uefi.c3l/uefi/protocol/console.c3i')
| -rw-r--r-- | lib/uefi.c3l/uefi/protocol/console.c3i | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/lib/uefi.c3l/uefi/protocol/console.c3i b/lib/uefi.c3l/uefi/protocol/console.c3i new file mode 100644 index 0000000..19faf2d --- /dev/null +++ b/lib/uefi.c3l/uefi/protocol/console.c3i @@ -0,0 +1,173 @@ +module uefi::protocol::console; + +import uefi; + +alias InputResetFn = fn EfiStatus (SimpleTextInputProtocol*, bool); +alias InputReadKeyFn = fn EfiStatus (SimpleTextInputProtocol*, EfiInputKey*); +alias InputResetExFn = fn EfiStatus(SimpleTextInputExProtocol*, bool); +alias InputReadKeyExFn = fn EfiStatus (SimpleTextInputExProtocol*, EfiKeyData*); +alias InputSetStateFn = fn EfiStatus (SimpleTextInputExProtocol*, KeyToggleState*); +alias InputRegisterKeystrokeNotifyFn = fn EfiStatus (SimpleTextInputExProtocol*, EfiKeyData*, KeyNotificationFunctionFn, void**); +alias InputUnregisterKeystrokeNotifyFn = fn EfiStatus (EfiKeyData*); +alias KeyNotificationFunctionFn = fn EfiStatus (EfiKeyData*); +alias OutputResetFn = fn EfiStatus (SimpleTextOutputProtocol*, bool); +alias OutputStringFn = fn EfiStatus (SimpleTextOutputProtocol*, EfiString); +alias OutputTestStringFn = fn EfiStatus (SimpleTextOutputProtocol*, EfiString); +alias OutputQueryModeFn = fn EfiStatus (SimpleTextOutputProtocol*, usz, usz*, usz*); +alias OutputSetModeFn = fn EfiStatus (SimpleTextOutputProtocol*, usz); +alias OutputSetAttributeFn = fn EfiStatus (SimpleTextOutputProtocol*, usz); +alias OutputClearScreenFn = fn EfiStatus (SimpleTextOutputProtocol*); +alias OutputSetCursorPositionFn = fn EfiStatus (SimpleTextOutputProtocol*, usz, usz); +alias OutputEnableCursorFn = fn EfiStatus (SimpleTextOutputProtocol*, bool); + +bitstruct ConsoleColor : char @bigendian { + TextColor background: 0..3; + TextColor foreground: 4..6; + // bit 7 is technically not used per spec +} + +enum ScanCode : ushort (ushort raw) { + NULL { 0x0000 }, + UP_ARROW { 0x0001 }, + DOWN_ARROW { 0x0002 }, + RIGHT_ARROW { 0x0003 }, + LEFT_ARROW { 0x0004 }, + HOME { 0x0005 }, + END { 0x0006 }, + INSERT { 0x0007 }, + DELETE { 0x0008 }, + PAGE_UP { 0x0009 }, + PAGE_DOWN { 0x000A }, + F1 { 0x000B }, + F2 { 0x000C }, + F3 { 0x000D }, + F4 { 0x000E }, + F5 { 0x000F }, + F6 { 0x0010 }, + F7 { 0x0011 }, + F8 { 0x0012 }, + F9 { 0x0013 }, + F10 { 0x0014 }, + F11 { 0x0015 }, + F12 { 0x0016 }, + ESCAPE { 0x0017 }, + PAUSE { 0x0048 }, + F13 { 0x0068 }, + F14 { 0x0069 }, + F15 { 0x006A }, + F16 { 0x006B }, + F17 { 0x006C }, + F18 { 0x006D }, + F19 { 0x006E }, + F20 { 0x006F }, + F21 { 0x0070 }, + F22 { 0x0071 }, + F23 { 0x0072 }, + F24 { 0x0073 }, + MUTE { 0x007F }, + VOLUME_UP { 0x0080 }, + VOLUME_DOWN { 0x0081 }, + BRIGHTNESS_UP { 0x0100 }, + BRIGHTNESS_DOWN { 0x0101 }, + SUSPEND { 0x0102 }, + HIBERNATE { 0x0103 }, + TOGGLE_DISPLAY { 0x0104 }, + RECOVERY { 0x0105 }, + EJECT { 0x0106 }, +} + +struct SimpleTextInputProtocol { + InputResetFn _reset; + InputReadKeyFn _read_key; + EfiEvent _event_wait_for_key; +} + +struct EfiInputKey { + ushort scanCode; + ushort unicodeChar; +} + +struct SimpleTextInputExProtocol { + InputResetExFn reset; + InputReadKeyExFn read_key; + EfiEvent event_wait_for_key; + InputSetStateFn set_state; + InputRegisterKeystrokeNotifyFn register_keystroke_notify; + InputUnregisterKeystrokeNotifyFn unregister_keystroke_notify; +} + +enum KeyShiftState : uint (uint raw) { + SHIFT_STATE_VALID { 0x8000_0000 }, + RIGHT_SHIFT_PRESSED { 0x0000_0001 }, + LEFT_SHIFT_PRESSED { 0x0000_0002 }, + RIGHT_CONTROL_PRESSED { 0x0000_0004 }, + LEFT_CONTROL_PRESSED { 0x0000_0008 }, + RIGHT_ALT_PRESSED { 0x0000_0010 }, + LEFT_ALT_PRESSED { 0x0000_0020 }, + RIGHT_LOGO_PRESSED { 0x0000_0040 }, + LEFT_LOGO_PRESSED { 0x0000_0080 }, + MENU_KEY_PRESSED { 0x0000_0100 }, + SYS_REQ_PRESSED { 0x0000_0200 }, +} + +enum KeyToggleState : char (char raw) { + TOGGLE_STATE_VALID { 0x80 }, + KEY_STATE_EXPOSED { 0x40 }, + SCROLL_LOCK_ACTIVE { 0x01 }, + NUM_LOCK_ACTIVE { 0x02 }, + CAPS_LOCK_ACTIVE { 0x04 }, +} + +struct EfiKeyState { + KeyShiftState keyShiftState; + KeyToggleState keyToggleState; +} + +struct EfiKeyData { + EfiInputKey key; + EfiKeyState keyState; +} + +struct SimpleTextOutputProtocol { + OutputResetFn _reset; + OutputStringFn _output_string; + OutputTestStringFn _test_string; + OutputQueryModeFn _query_mode; + OutputSetModeFn _set_mode; + OutputSetAttributeFn _set_attribute; + OutputClearScreenFn _clear_screen; + OutputSetCursorPositionFn _set_cursor_position; + OutputEnableCursorFn _enable_cursor; + TextMode* mode; +} + +struct TextMode { + int maxMode; + int currentMode; + int currentAttribute; + int currentCursorColumn; + int currentCursorRow; + bool isCursorVisible; +} + +enum TextColor : char (char raw) { + BLACK { 0x00 }, + BLUE { 0x01 }, + GREEN { 0x02 }, + CYAN { 0x03 }, + RED { 0x04 }, + MAGENTA { 0x05 }, + BROWN { 0x06 }, + LIGHT_GRAY { 0x07 }, + DARK_GRAY { 0x08 }, + LIGHT_BLUE { 0x09 }, + LIGHT_GREEN { 0x0A }, + LIGHT_CYAN { 0x0B }, + LIGHT_RED { 0x0C }, + LIGHT_MAGENTA { 0x0D }, + YELLOW { 0x0E }, + WHITE { 0x0F }, + +} + +macro char @efi_color($fg, $bg) @builtin @public => ($fg | ((0x07 & $bg) << 4)); |
