2012-05-26 1 views
1

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

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

+0

Я очень ценю ваш ответ, но, боюсь, я не совсем понимаю все это. Я записал некоторые из вопросов, которые возникали у меня во время чтения, но было слишком долго, чтобы быть здесь. Я разместил его здесь: http://pastebin.com/Nwq5qRSU Если вам так хочется, вы можете подробно рассказать о некоторых из них. –

+0

@andvin, если этот ответ работает, вы должны действительно принять ответ и изучить, почему он работает. Для меня совершенно ясно, что он делает, возможно, вам стоит начать более базовый уровень сборки dcpu-16 0x10c Forum и 0x010c wiki, чтобы получить учебные пособия. – booyaa

+1

@booyaa Я понимаю основы сборки и инструкции. Я также могу написать рабочую функцию getline. У меня проблемы с тем, как лучше всего это сделать. Судя по нетривиальному способу выполнения упражнений с храповыми уродами, я полагаю, что некоторые соображения касались его проектирования. Я бы очень признателен за некоторые объяснения этих соображений. Моя проблема в том, что я понятия не имею, как наилучшим образом использовать прерывания. Что должен делать обработчик прерываний и почему? Такие вещи, как AFAIK, не объясняются в типичном учебнике DCPU. –

 Смежные вопросы

  • Нет связанных вопросов^_^