Size: a a a

Ассемблер

2020 July 08

ST

Saenro T in Ассемблер
s54816 разбил этот миф)
Там действительно будет проделываться одна и та же работа дважды. Мало того, что ты работаешь с клавой, так ещё и система делает тоже самое но для себя)
Другими словами, без INTов, INов, OUTов можно "тырить" у неё уже обработанный результат)
источник

楽園松本 in Ассемблер
Saenro T
s54816 разбил этот миф)
Там действительно будет проделываться одна и та же работа дважды. Мало того, что ты работаешь с клавой, так ещё и система делает тоже самое но для себя)
Другими словами, без INTов, INов, OUTов можно "тырить" у неё уже обработанный результат)
А у меня комп есть без винды. FreeDos
источник

ST

Saenro T in Ассемблер
А это не винда делает)
источник

ST

Saenro T in Ассемблер
Это БИОС старается
источник

楽園松本 in Ассемблер
Saenro T
Это БИОС старается
Мой БИОС слишком стар для этого :)
источник

楽園松本 in Ассемблер
Хотя там за ширмой столько всего делается
источник

ST

Saenro T in Ассемблер
Винда только следит кому бы дать
источник

楽園松本 in Ассемблер
В общем, сплошное надувательство
источник

ST

Saenro T in Ассемблер
Saenro T
Ввиду того, что программные прерывания использовать не планируется, можем несколько упростить задачу, а именно, обрабатывать не всю клаву, а только: ЦИФРЫ, ПРОБЕЛ (выступает разделителем) и ВВОД — конец строки.
Подсказка сканкодов:
Клавиша нажата (старший бит сброшен):
'1' — 02h
'2' — 03h
'3' — 04h
...
'9' — 0Ah
'0' — 0Bh
'space' — 39h
'enter' — 1Ch
При отпущенной клавише старший бит установлен в 1.
'1' — 82h
'2' — 83h
...
И да, достаём сие из 60h порта.
IN AL, 60h — AL=scancode.
Сканкоды можно вручную переводить в символы, например при помощи таблицы соответствия.
источник

楽園松本 in Ассемблер
Saenro T
IN AL, 60h — AL=scancode.
Сканкоды можно вручную переводить в символы, например при помощи таблицы соответствия.
А как же без системных вызовов можно на экран что-то вывести? Это же невозможно!
источник

ST

Saenro T in Ассемблер
Сканкоды идут последовательно за клавишами, как QWERTY...
Символы же идут в алфавитном порядке. Вот отсюда и проблема.
источник

ST

Saenro T in Ассемблер
楽園松本
А как же без системных вызовов можно на экран что-то вывести? Это же невозможно!
Верно, а кто сказал что нельзя "паразитировать"?)
источник

楽園松本 in Ассемблер
Saenro T
Верно, а кто сказал что нельзя "паразитировать"?)
Может, ты скажешь, что придётся что-то напрямую толкать в видео буфер?
источник

楽園松本 in Ассемблер
(Напоминает "Диалоги с Платоном" :) )
источник

ST

Saenro T in Ассемблер
У клавы есть свой контроллер, свой буффер наполнения. 16 двухбайтовых посадочных мест. Своего рода змея гоняется за своим хвостом. Беда будет если догонит.)
Два двухбайтовых указателя на начало (голову змеи) и конец (хвост змеи). Хотя используются только младшие байты, этого хватает, поскольку змея всего 32 байтовая.
Младший байт буфера — сканкод. Старший байт буфера — символ.
источник

楽園松本 in Ассемблер
Saenro T
У клавы есть свой контроллер, свой буффер наполнения. 16 двухбайтовых посадочных мест. Своего рода змея гоняется за своим хвостом. Беда будет если догонит.)
Два двухбайтовых указателя на начало (голову змеи) и конец (хвост змеи). Хотя используются только младшие байты, этого хватает, поскольку змея всего 32 байтовая.
Младший байт буфера — сканкод. Старший байт буфера — символ.
Это ребята уже сами поймут. Главное, ты рассказал, что есть скан-коды, которые контроллер клавиатуры передаёт через порт ввода-вывода. Мы читаем скан-код, и если это клавиша "конец работы", то выходим из цикла. Если это цифровая клавиша или пробел, то обрабатываем это событие. Если ничего нет, то есть пользователь ничего не нажал, то опрашиваем порт опять.
источник

楽園松本 in Ассемблер
Вопрос возникнет, как отобразить на экране?
источник

ST

Saenro T in Ассемблер
В текстовом режиме всё довольно просто.
ES=B800h — область экрана.
DI=0000h — начало экрана.
Одно знакоместо — два байта.
Выводим AX в ES:DI
AL — символ.
AH — цвет.
источник

楽園松本 in Ассемблер
Получается, что ты считаешь количество введённых символов до пробела или ентера, при этом запоминаешь начало в видео памяти для вводимой последовательности. После всех вводов у тебя будет такая информация: 1) где начало самой длинной последовательности; 2) её длина. А потом каждый нечётный байт от адреса начала последовательности  подкрашиваешь, изменяя атрибут цвет. Так?
источник

ST

Saenro T in Ассемблер
Почти в яблочко. Но в моей реализации что-то не совсем так...)
источник