Я пишу загрузчик под UEFI, который должен работать как POSIX-подобная оболочка, только код для обработки ввода - не работает
Note: я исправил обработку bs, теперь он печатается 1, а не 2 раза.
Код обработки ввода:
__scanln:
; scan key
mScankey __key_buf
; print key
mPrint __key_buf+2
; load key
mov si, word [__key_buf+2]
; if button is [Backspace], print [Space] and [Backspace]
cmp si, word 8
je .backspace
; if button is [Enter], end listening
cmp si, word 13
je .exit
; otherwise, save character and repeat
mov [rbx], word null
; shift buffer pointer
add rbx, 2
jmp __scanln
.backspace:
mov [__key_buf+2], word ' '
mPrint __key_buf+2
mPrint __bs_string;, __bs_string
; repeat
jmp __scanln
.exit:
; end the buffer and exit
mov [rbx], word null
mReturn
макросы:
листинг побольшеmacro mPrint [_str] {
if ~_str eq
forward
uefi_call_wrapper ConOut, OutputString, ConOut, _str
end if
}
macro mClear {
if ~ 0 eq 1
mCall __clear_screen
end if
}
macro mNewline [times_] {
if times_ eq
mPrintln
else
repeat times_
mPrintln
end repeat
end if
}
macro mPrintln [_str] {
if ~ _str eq
forward
mPrint _str
mPrint __crlf
else
mPrint __crlf
end if
}
macro mScankey _key {
if ~ _key eq
mov [_key], dword 0
@@:
uefi_call_wrapper ConIn, ReadKeyStroke, ConIn, _key
cmp dword [_key], 0
jz @b
end if
}
macro mScankeys _buffer, _times {
if ~ _buffer eq
if ~ _times eq
mov rcx, _times
mov rbx, _buffer
call __scankeys
end if
end if
}
macro mScanln _buffer {
if ~ buffer eq
mov rbx, _buffer
call __scanln
end if
}
после ввода 1 буквы код фризит, и я уже перебрал более чем по 15 возможных реализаций для обработкика для CR, LF и CRLF окончаний строки.
репозиторий:
GitHub
Запускаю я код на реальном железе через rEFInd