Как лучше всего получить персонажа с клавиатуры на DCPU16
Итак, моя цель - написать подпрограмму, которая при вызове зависает, пока пользователь не введет строку, завершенную <return>
, который затем возвращает (возможно, записав его по адресу, указанному пользователем).
Моя проблема заключается в том, как лучше всего получить отдельные символы с клавиатуры. На мой взгляд, есть 3 способа:
Слушайте прерывания с клавиатуры и получайте персонажа в ответ на них. Это будет означать, что логика выполняется
getline
будет в обработчике прерываний, которые, кажется, вызывают некоторые проблемы. то есть как вы вернетесь изgetline
в ответ на прессу о<return>
ключ? У вас нет удобного адреса возврата в обработчике прерываний. Также мне кажется, что шаблон слишком сложной логики в обработчике прерываний... неправильный... хотя я очень неопытен в низкоуровневом кодировании.Просто продолжайте тянуть клавиатуру для нажатия клавиш.
Реализация старого поведения 1.1 с помощью обработчика прерываний путем загрузки всех символов, помещенных в кольцевой буфер (возможно, длины 1).
Хотелось бы немного больше взглянуть на эти варианты.
1 ответ
Когда вы звоните getline
он должен настроить обработчик прерываний, чтобы он добавил набранные ключи в буфер и обновил индекс
затем начните занятый цикл, пока в конце буфера не появится новая строка, и отключите прерывания с клавиатуры.
getline:
set push B
set push X
;--coming from interrupt dispatch
SET B, buffer ;--address from argument
SET C, bufferlength ;-- from argument
SET PUSH, 0
SET X, SP ;--address of counter
SET A, startKeyInput
INT softwareInterrupt
IAQ 1;--restart interrupts
startloop:
SET A,buffer
ADD A,SP
IFN [A],'\n'
set PC, startloop ;--busy loop
IFL PEEK, X
set PC, startloop ;-- stopping buffer overflow
IAQ 0;--stop interrupts
set A, stopKeyInput
INT softwareInterrupt
SET C,POP;-- C is return value
SET X,POP
SET B,POP
FRI ;-- from interrupt
и обработчик прерываний добавляет набранный ключ в буфер, пока он не заполнится, и добавляет 1 к счетчику, это можно поместить в сам обработчик прерываний, но вам нужно будет повторно активировать прерывания, находясь в цикле занятости.