Как лучше всего получить персонажа с клавиатуры на DCPU16

Итак, моя цель - написать подпрограмму, которая при вызове зависает, пока пользователь не введет строку, завершенную <return>, который затем возвращает (возможно, записав его по адресу, указанному пользователем).

Моя проблема заключается в том, как лучше всего получить отдельные символы с клавиатуры. На мой взгляд, есть 3 способа:

  1. Слушайте прерывания с клавиатуры и получайте персонажа в ответ на них. Это будет означать, что логика выполняется getline будет в обработчике прерываний, которые, кажется, вызывают некоторые проблемы. то есть как вы вернетесь из getline в ответ на прессу о <return> ключ? У вас нет удобного адреса возврата в обработчике прерываний. Также мне кажется, что шаблон слишком сложной логики в обработчике прерываний... неправильный... хотя я очень неопытен в низкоуровневом кодировании.

  2. Просто продолжайте тянуть клавиатуру для нажатия клавиш.

  3. Реализация старого поведения 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 к счетчику, это можно поместить в сам обработчик прерываний, но вам нужно будет повторно активировать прерывания, находясь в цикле занятости.

Другие вопросы по тегам