Вход

Просмотр полной версии : ZXeretic



Soplik
26.09.2013, 00:41
Мне посоветовали все вопросы, связанные с будущим 3d шутером, обсуждать в какой-нибудь одной теме. Вот я и создал такую тему!

---------- Post added at 22:41 ---------- Previous post was at 22:30 ----------

http://zx.pk.ru/showthread.php?p=629791 -- начал рисовать иконки.
http://zx.pk.ru/showthread.php?t=21884 -- придумал шрифт.
http://cs412730.vk.me/v412730355/2870/xII41RiWRmg.jpg -- примерный скриншот без оружия и монстров.

AAA
26.09.2013, 00:45
очень красива

Soplik
26.09.2013, 00:49
Теперь главное -- написать всё это дело.

alvis
26.09.2013, 01:05
Начало интригует :)

Soplik
26.09.2013, 02:37
Я буду параллельно рисовать спрайты и учиться кодить. Крупную графику (заставки) мне обещала нарисовать одна тян.

---------- Post added at 23:50 ---------- Previous post was at 23:32 ----------

Формат комнаты пока вижу так:
1 байт -- заголовок. Тип комнаты (обычная, комната-лестница или комната -- винтовая лестница), наличие/отсутствие потолка, секретность и 4 зарезервированных бита.
1 байт -- высота стен (32 -- рост игрока, 255 -- максимум).
1 байт -- число углов в комнате (не больше 6--8, это не пентиум).
Для каждого угла:
2 байта -- координаты в относительной системе координат.
1 байт -- материал стены (цвет, освещенность, возможно еще какие-то данные).

Далее 1 байт -- количество порталов (дверей, окон и норок).
Для каждого портала:
1 байт -- номер стены.
1 байт -- смещение начала портала вдоль стены.
1 байт -- смещение конца портала вдоль стены.
1 байт -- высота пола.
1 байт -- высота потолка.
1 байт -- заливка пола.
1 байт -- заливка портала.
1 байт -- заливка потолка.
2 байта -- адрес комнаты, в которую портал ведет.

Далее 1 байт -- количество спрайтов в комнате..
Для каждого спрайта:
3 байта -- координаты в относительной системе.
1 байт -- номер спрайта.

Всё это можно распаковывать откуда-нибудь из медленной памяти при переходе из комнаты в комнату.
Я насчитал 97 байт, если комнатка четырехугольная с четырьмя дверями и десятком спрайтов. В одну банку таких комнаток может влезть полторы сотни.

Первая проблема: нужно как можно больше упростить и ускорить перевод горизонтальных координат в экранные.

---------- Post added 26.09.2013 at 00:02 ---------- Previous post was 25.09.2013 at 23:50 ----------

Экранный буфер 256х64, растягивается до 256х128 на этапе переброски, т. е. все объекты на игровом экране имеют половинное разрешение по вертикали. Буфер организован по столбцам, текстуры рисуются стековыми заливками (5 на столбец: пустой пол, нижние полстены, портал, верхние полстены, пустой потолок или кусок ночного неба со звездами). Спрайты -- тоже по столбцам линейно через стек, возможно с легким масштабированием по вертикали (несколько однотипных процедур).
Процедуры переброски буфера, рисования стены и фона где-нибудь в быстрой банке, а процедура(ы) рисования спрайта где-нибудь в #8000--BFFF
Вторая проблема: как лучше всего загружать данные в эту стековую радость?

Третья проблема: как раскрашивать картинку? 16с не предлагать.

---------- Post added at 00:37 ---------- Previous post was at 00:02 ----------

Существует ли в Art Studio возможность познакоместной работы с окнами?

Soplik
26.09.2013, 10:51
Если формулы перевода не найдем (см. Первую проблему), можно распаковывать комнату в клеточный формат и делать рейкастинг. Правда, не знаю, как тогда делать непрямые углы.

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

Andrew771
26.09.2013, 10:58
Если формулы перевода не найдем (см. Первую проблему), можно распаковывать комнату в клеточный формат и делать рейкастинг. Правда, не знаю, как тогда делать непрямые углы.
Ты сначала теорию изучи, в книге "Графика ZX Spectrum" (http://zxpress.ru/book.php?id=13) например. А потом уже додумывай.
Еще на эту тему: http://zx.pk.ru/showthread.php?t=20478&highlight=%F4%EE%F0%EC%F3%EB%FB+%EF%E5%F0%F1%EF%E5 %EA%F2%E8%E2%FB

Soplik
26.09.2013, 11:17
Я когда-то изучал теорию, но пока не могу приложить ее к спектрумовской практике.
Mode7 я писал, а Mode7, оптимизированный под Спектрум, -- нет.

AAA
26.09.2013, 11:42
Пасматри как красива рисует иконки мальчик ШИРУ

http://s017.radikal.ru/i423/1309/e0/104fa19b3053.gif

---------- Post added at 11:42 ---------- Previous post was at 11:38 ----------

Шрифты и надписи для меню делаются просто

http://www.fontov.net/

Выбираешь шрифт, размер и пишешь что надо в меню, нажимаешь интер. Потом готовое снимаешь с экрана принт скрином размещаешь в паинте на пространстве 256 на 192 и потом в бмп2сцр переводишь в арт студию.

вот пример, так рисуются названия, меню, шрифты и все остальная лабуда.
http://s008.radikal.ru/i304/1309/da/a63ba7f259c1.png

Zelya
26.09.2013, 11:46
Пасматри как красива рисует иконки мальчик ШИРУ
И это цвет-на-знакоместо?! Вынос мозга, я поражен!

Andrew771
26.09.2013, 11:53
Я когда-то изучал теорию, но пока не могу приложить ее к спектрумовской практике.
Mode7 я писал, а Mode7, оптимизированный под Спектрум, -- нет.
Так вот в этом искусство программирования на Спектруме и заключается. :)
Вот эту тему (http://zx.pk.ru/showthread.php?t=20478&highlight=%F4%EE%F0%EC%F3%EB%FB+%EF%E5%F0%F1%EF%E5 %EA%F2%E8%E2%FB) прочитай и по всем ссылкам там на статьи пройди. Много полезного.

psb
26.09.2013, 13:59
Существует ли в Art Studio возможность познакоместной работы с окнами?
есть BGE, он продвинутее и там есть все что хочешь и не хочешь.

Rindex
26.09.2013, 14:19
есть BGE, он продвинутее и там есть все что хочешь и не хочешь.

Ну не знаю, я привык к Арт-Студио, а BGE мне чужд. Однако на писюке я отлично пользуюсь MT-paint и фотожопом, к ним я привык намного быстрее. Но работа в BGE меня просто раздражает. Уж не знаю под чего авторы его там затачивали, но вышло что-то не то. А так да, он намного продвинутей Арт-Студии, тут я не спорю.

psb
26.09.2013, 14:26
Но работа в BGE меня просто раздражает.
дело вкуса. меня после бге и артстудио и даже zx-paintbrush раздражает. не идеал, но куда прямее...

Soplik
26.09.2013, 16:09
Ширу -- монстр. Если он согласится рисовать иконки, будет суперклассно. А если бы я писал под 48, то я бы у него попросил еще биперной музыки. Мне нужны неанимированные иконки 16х16, на другие жалко памяти.

Шрифт этот здоровенный, пропорциональный и фигово читается, а нужен моноширинный и маленький. Так-то конвертировать в scr я сам умею :)

БГЕ мне когда-то не покатил, а арт студио был любимым редактором еще в школе. Но, видимо, придется попробовать :)

AAA
26.09.2013, 17:04
У мну есть дисков 10-12 всех шрифтов в формате спеке на дискетах. Я сюда уже ложил, но если нада еще полажу

SlashNet
26.09.2013, 17:33
Вот вам мой вариант свечки (в извинение за пипиську).

Soplik
26.09.2013, 17:55
SlashNet, пойдёт! Только я правую половину с пониженной яркостью сделал бы.
А что там справа -- она стоит на чем-то?

AAA, жду ссылку или диски :)

SlashNet
26.09.2013, 18:04
Справа каракули (это я "ручку расписывал") + уменьшённые копии рисунка.

AAA
26.09.2013, 19:06
AAA, жду ссылку или диски
http://sderni.ru/198526

---------- Post added at 19:06 ---------- Previous post was at 19:04 ----------

По поводу спрайтов, бери готовое с других платформ, дораатывай под свой проект.

В гоогле поиске

Sprite 8bit game

или подобное

https://www.google.ru/search?q=sprite+8bit+game&newwindow=1&source=lnms&tbm=isch&sa=X&ei=UU1EUpT2IoXl4gS5sYGQAg&ved=0CAcQ_AUoAQ&biw=1680&bih=949&dpr=1

Soplik
26.09.2013, 19:30
По поводу спрайтов, бери готовое с других платформ, дораатывай под свой проект
Нет. Всё будем делать с нуля под спектрум.
За шрифты спасибо, попробую разобраться.
В каком редакторе удобнее всего работать со шрифтами, которых МНОГО?

AAA
26.09.2013, 20:19
В Арт студии есть меню шрифтов. В БГЕ тоже

Soplik
26.09.2013, 20:34
Я искал сначала среди шрифтовых.
Скачаю БГЕ, а то студия с полным набором не работает.
Который лучше, 2.41 или 3.05?

---------- Post added at 18:34 ---------- Previous post was at 18:21 ----------

В БГЕ тоже загрузка неудобная для такого числа шрифтов.
Посмотрел первых два десятка, ничего подходящего не нашел.
Может, свой использовать? ;)

А, разобрался :)
Нет, мне легче сделать свой, чем искать в таком море.

AAA
26.09.2013, 20:58
Не надо загружать арт студиу чтобы посмотреть шрифты.

Есть эмулятор UNREAL в нем есть строка P512 - перфект коммандер, нажимай на любой картинке или шрифте кнопку S и смотри, что подходит загружай.

Soplik
26.09.2013, 21:03
Это хорошо.
А чем плох мой серо-красный шрифт?

AAA
26.09.2013, 21:08
Это хорошо.
А чем плох мой серо-красный шрифт?

Всё нормально. Но не в шрифте суть. Ты начни с того как двигать спрайты, делать опрос кнопок. Это важней. Вот решил рисовать спрайты, а ты знаешь как их надо рисовать чтобы они потом начали двигаться ? Если через пол года сможешь по экрану двинуть человечка у которого еще что то при этом двигается и при том весь спрайт не будем мерцать, да еще и кнопочками по экрану взад вперед, это уже прогресс. А еще надо сделать скроллинг фона, надо сделать героев и таблички их движения.

У тебя примерно так тема идет, я хочу купить машину, вот уже купил запах для салона и наклейку на капот.

Soplik
26.09.2013, 21:19
Я сегодня написал опрос кнопок 6/7/0, полоски влево-вправо двигаются.
Завтра думаю подвигать в четыре стороны квадратик по пикселям,
послезавтра -- фон из одного тайла.
Потом сделаю переопределение клавиш, например.

Всё параллельно делается.

AAA
26.09.2013, 21:22
Это азы. Но как только ты столкнешся с движением спрайта в котором что то двигается на экране с задним фоном у которого что то двигается, это совсем другая песня. Тут тебе придется изучать исходный код программ. Например Неварта мегадемо, там он игру пыьался сделать р тупе. Или код Алёны с 3д ьуннелями. Я просто не понмиаю что ты за игру делаешь. Но исходники ДООМ есть.

Soplik
26.09.2013, 21:29
Я хочу сделать цветную ходилку от первого лица, без текстур, но с атмосферой.

Но как только ты столкнешся с движением спрайта в котором что то двигается на экране с задним фоном у которого что то двигается
Столкнусь и посмотрю.
Может, даже специально столкнусь :-)

Alex Rider
26.09.2013, 22:14
В чем пишешь код?

Soplik
26.09.2013, 22:17
В аласме, но это пока не код, а так, упражнения.
Аласм 5.09 на 42 символа.
Эмулятор -- восьмой спектакулятор.

Alex Rider
27.09.2013, 00:29
Рекомендую попробовать связку SjAsm Plus + Unreal Spectrum. SjAsm - кросс-ассемблер, сильно ускоряет разработку. Вот такой (http://zx.pk.ru/showthread.php?t=21731) редактор будет к нему в самый раз.

Soplik
27.09.2013, 00:48
Если не хватит возможностей аласма, обязательно попробую!
Пока намного больше в кодера упирается, чем в асм.

Alex Rider
27.09.2013, 00:59
Если не хватит возможностей аласма, обязательно попробую!
Не думаю, что Вы столкнетесь в ALASM с каким-то ограничениями, которые можно обойти в SjAsm. ALASM даже гибче. Но разработка в кросс-среде значительно быстрее. Если Вы только изучаете программирование для Спектрума, рекомендую все же писать на SjAsm.

Soplik
27.09.2013, 01:13
За счет чего она быстрее?

psb
27.09.2013, 02:52
За счет чего она быстрее?
за счет всего. просто надо попробовать, чтобы понять.

Alex Rider
27.09.2013, 11:22
За счет чего она быстрее?
Всех причин ща не припомню, но что есть.
1. Более удобное редактирование в привычном редакторе.
2. Более быстрая компиляция.
3. Продвинутые фишки типа перехода под идентификаторам между модулями, сворачивание кода, переход на строку с ошибкой по клику, подсветка синтаксиса, нет ограничений на количество символов в строке и многое другое.
4. Моментальная загрузка редактора и отсутствие необходимости сброса, перезапуска среды и загрузки исходников после сбоя.
5. Нормальная отладка в эмуляторе с умными точками останова, watches, одновременным отображением кода и экрана, без ограничений спектрумовских отладчиков.
6. Хранение и редактирование ресурсов в файловой системе PC без отсутствия необходимости загружать их редакторы на ZX.
7. [Почти] отсутствие необходимости конвертировать скачанные тексты других разработчиков и свои для выкладывания в Интернет.
8. Автоматизация обработки на PC большого количества ресурсов после их изменения (например, упаковка).
9. Одновременное редактирование нескольких модулей.
10. Отсутствие ограничений на использование 128-й памяти под сгенерированный код (на ZX обходится разработкой на более, чем 128к-байтной модели).
11. Просмотр и редактирование образов дисков в удобном hex-редакторе на PC.

psb
27.09.2013, 12:19
а главное - моментальный запуск в эмуляторе снапшота.

Alex Rider
27.09.2013, 13:33
а главное - моментальный запуск в эмуляторе снапшота.
Ну можно было написать отдельным пунктом, да... Просто как бы на ZX после ассемблирования время запуска-то тоже незаметно, а про время перезапуска после сбоя я сказал, вроде. Просто да, как-то туманно...

---------- Post added at 13:33 ---------- Previous post was at 13:31 ----------

Кстати, я снапшотами стараюсь не пользоваться. Но тут уж на вкус и цвет...

Дмитрий
27.09.2013, 14:41
Кстати, я снапшотами стараюсь не пользоваться. Но тут уж на вкус и цвет...
Я поначалу делал снапшоты, но в конце-концов пришел к самособирающемуся моноблоку с лоадером... ибо практично, да и снап не удобно проверять на разных платформах. А так батник запустил - у тебя на выходе уже готовый релиз в scl с пакетом документации и пр, да еще и под разные платформы...

rajdee
27.09.2013, 15:34
Как по мне, так одним из главных преимуществ использования sjasm я считаю, возможность использования cистем контроля (управления) версиями (git, mercurial, svn).

psb
27.09.2013, 16:35
А так батник запустил - у тебя на выходе уже готовый релиз в scl с пакетом документации и пр, да еще и под разные платформы...
и что, во время отладки каждый раз reset > tr-dos > run?

Дмитрий
27.09.2013, 16:39
psb, батник запускает эмуль, подсовывая нужную scl, потом автостарт tr-dos-а и ву а ля!

Andrew771
27.09.2013, 17:34
Я работаю в ассемблере эмулятора EmuZWin, там же запускаю, отлаживаю и сохраняю SNA. Всё в одной программе, удобно.

psb
27.09.2013, 19:49
батник запускает эмуль, подсовывая нужную scl, потом автостарт tr-dos-а и ву а ля!
меня бы выбесило ждать ресет трдоса... меня пауза в 1 сек в предыдущем анриле бесила, щас ее убрали - красота. кнопку нажал и твой код мгновенно работает. хоть 10 раз в сек. запускай:) а с паузами если, так тут до реала недалеко...

Soplik
27.09.2013, 20:46
Насчет азов: как удобнее всего организовать опрос клавиш? Мне в голову приходит либо жутковатый *****код, либо синклер джойстик.

Alex Rider
27.09.2013, 20:56
как удобнее всего организовать опрос клавиш?
Например, так (http://zx.pk.ru/showpost.php?p=619172&postcount=216)
Там поддерживается Sinclair 1, 2, QAOPM/Space, Cursor. Redefine нет.

Дмитрий
27.09.2013, 22:13
Redefine нет.
Но нет ничего сложного в его организации.

---------- Post added at 21:13 ---------- Previous post was at 20:21 ----------


меня бы выбесило ждать ресет трдоса...
У меня просто прога грузит дрова с дискеты. Да и в случае SNA, многие переменные барсика и тырдоса не инициализированы, что иногда создает грабли.

Alex Rider
28.09.2013, 05:35
Но нет ничего сложного в его организации.
Ну как сказать... Надо сделать анти-дребезг (тут же хорошую игру обсуждают?) и получение кода символа из полуряда и маски. Вторая процедура у меня есть готовая, а вот анти-дребезг надо выдернуть из проекта.

Soplik
28.09.2013, 16:01
А что за анти-дребезг?

NovaStorm
28.09.2013, 16:54
Фильтрация нескольких случайных нажатий одной кнопки.

Soplik
28.09.2013, 17:27
С какой частотой обычно происходят эти нажатия?

NovaStorm
28.09.2013, 21:55
Ну это же абсолютно бессистемно, на то он и дребезг. Фильтровать (если) надо нажатия чаще герц наверное 10-20 -- за три-четыре прерывания.

psb
28.09.2013, 22:55
Да и в случае SNA, многие переменные барсика и тырдоса не инициализированы, что иногда создает грабли.
у ужасма все инициализировано. тем он и хорош:)


С какой частотой обычно происходят эти нажатия?
обычно сразу после срабатывания в течение единиц-десятков мс могут быть многократные замыкания-размыкания. для хороших клавиатур достаточно опрашивать раз в прерывание (не чаще!), для плохих - и того реже. у меня была одна такая клава - многие проги с ней глючили, нажимаешь 1 раз, срабатывает 10 раз, ввести ничего невозможно. но это исключение.

да и не везде нужен антидребезг, так-то.

Soplik
29.09.2013, 02:00
Я чаще раза в прерывание и не буду, вы что.
Я думаю либо раз в прерывание опрашивать, а обрабатывать раз в кадр все 4--5 дампов,
или вообще опрашивать раз в кадр.

---------- Post added at 22:08 ---------- Previous post was at 21:53 ----------

Я решил перед написанием ZXeretic-а сделать другую игру, попроще, не 3D.
И обкатать часть процедур на ней.

---------- Post added 29.09.2013 at 00:00 ---------- Previous post was 28.09.2013 at 22:08 ----------

А как в аласме записать код на диск?

TSL
29.09.2013, 10:03
Смотри, вот кусок кода, которым я опрашиваю клаву на контроллере.
Его можно свободно портировать под нужды спектрума.



#define KDAT_PORT PORTC
#define KDAT_DIR DDRC
#define KDAT_PIN PINC
#define KROW_PORT PORTB
#define KROW_DIR DDRB
#define KROW_PIN PINB
#define DEBOUNCE_MASK 7 // Keyboard de-bouncing, as larger is bitmask as stronger is de-bouncing, but longer key response (1 to 7 LSBs)
#define KDB_DELAY 4 // Delay in microseconds so voltage from address line could propagate
#define MAX_KEYS 37

volatile U8 key[MAX_KEYS];

void poll_kbd(void)
{
U8 i, j, k, key_pin;
U8 row = 1;
U8 key_num = 0;

for (i = 0; i < 8; i++)
{
KROW_PORT = row; // assert address line */
delay_us(KDB_DELAY);
key_pin = KDAT_PIN; // poll keyboard data */
KROW_PORT = 0; // deassert address line to reduce current */
row <<= 1;

for (j = 0; j < 8; j++)
{
k = key[key_num];
k = (k & 0x80) | ((k << 1) & 0x7E) | (key_pin & 1);
key_pin >>= 1;

if (!(k & DEBOUNCE_MASK) && (k & 0x80))
{
/* key was pressed */
send_note_on(key_num);
k &= 0x7F;
}

else if (!(~k & DEBOUNCE_MASK) && !(k & 0x80))
{
/* key was released */
send_note_off(key_num);
k |= 0x80;
}

key[key_num++] = k;
if (key_num == MAX_KEYS)
break;
}
if (key_num == MAX_KEYS)
break;
}
}


Вот здесь:
k = (k & 0x80) | ((k << 1) & 0x7E) | (key_pin & 1);
происходит вдвиг бита статуса клавиши в переменную, после чего по маске определяется - считать ли клавишу нажатой или отжатой (все N бит по маске должны быть либо 0, либо 1), при этом старший бит определяет разовость этого события.
Выбирая маску, можно добиться нужной дребезгоустойчивости.

Alex Rider
29.09.2013, 12:59
Смотри, вот кусок кода, которым я опрашиваю клаву на контроллере.
Блин, тут даже меня сподобило задуматься...

да и не везде нужен антидребезг, так-то.
На самом деле, антидребезг жизненно необходим, если:

с клавиатуры редактируется текст;
для переназначения кнопок в частности;
если в программе критично каждое отдельное нажатие на кнопку, а не общее время нажатия.

Антидребезг совсем не нужен если прога ориенитирована на эмулятор или на PC-клавиатуру.
Одним из лучших антидребезговых механизмов на Спекртуме признан метод опроса кнопок в ПЗУ. Если убрать из него всякую гибкость, то суть примерно такова: если порт полуряда в течение 5 прерываний подряд возвращает одну и ту же комбинацию нажатых клавиш, это означает, что нажатие действительно произошло и колебательные процессы на контактах кончились.


А как в аласме записать код на диск?
А смотря что тебе надо. Смотри help'ы по таким командам:
SAVEBIN - сохраняет код в файл в файловую систему PC;
SAVESNA - сохраняет код в снапшот с инициализированными системными переменными;
SAVEHOB - сохраняет код в HOBETA-файл;
SAVETRD - добавляет код как ZX-файл к существующему TRD-файлу;

TSL
29.09.2013, 14:11
если порт полуряда в течение 5 прерываний подряд возвращает одну и ту же комбинацию нажатых клавиш, это означает, что нажатие действительно произошло и колебательные процессы на контактах кончились.
Я извиняюсь, прошу показать мне это место в ПЗУ бейсика.

Alex Rider
29.09.2013, 14:16
Я извиняюсь, прошу показать мне это место в ПЗУ бейсика.
Ok, наврал, не значение из порта там проверяется 5 прерываний, а порядковый номер нажатой кнопки на клавиатуре. Суть метода при это остается той же.

TSL
29.09.2013, 14:22
Ну покажи, где там проверяется 5 прерываний. Не важно чего.

Alex Rider
29.09.2013, 15:15
2BF KEYBOARD CALL 028E,KEY-SCAN Fetch a key value in the DE
RET NZ register pair but return immedi-
ately if the zero pair flag is reset.

A double system of 'KSTATE system variables' (KSTATE0 - KSTATE 3 and KSTATE4 - KSTATE7) is used from now on.
The two sets allow for the detection of a new key being pressed (using one set) whilst still within the 'repeat period' of the previous key to have been pressed (details in the other set).
A set will only become free to handle a new key if the key is held down for about 1/10 th. of a second. i.e. Five calls to KEYBOARD.

LD HL,KSTATE0 Start with KSTATE0.
02C6 K-ST-LOOP BIT 7,(HL) Jump forward if a 'set is free';
JR NZ,02D1,K-CH-SET i.e. KSTATE0/4 holds +FF.
INC HL However if the set is not free
DEC (HL) decrease its '5 call counter'
DEC HL and when it reaches zero signal
JR NZ,02D1,K-CH-SET the set as free.
LD (HL),+FF

After considering the first set change the pointer and consider the second set.

02D1 K-CH-SET LD A,L Fetch the low byte of the
LD HL,KSTATE4 address and jump back if the
CP L second set has still to be
JR NZ,02C6,K-ST-LOOP considered.

Return now if the key value indicates 'no-key' or a shift key only.

CALL 031E,K-TEST Make the necessary tests and
RET NC return if needed. Also change
the key value to a 'main code'.

A key stroke that is being repeated (held down) is now separated from a new key stroke.

LD HL,KSTATE0 Look first at KSTATE0.
CP (HL) Jump forward if the codes
JR Z,0310,K-REPEAT match - indicating a repeat.
EX DE,HL Save the address of KSTATE0.
LD HL,KSTATE4 Now look at KSTATE4.
CP (HL) Jump forward if the codes
JR Z,0310,K-REPEAT match - indicating a repeat.

But a new key will not be accepted unless one of the sets of KSTATE system variables is 'free'.

BIT 7,(HL) Consider the second set.
JR NZ,02F1,K-NEW Jump forward if 'free'.
EX DE,HL Now consider the first set.

BIT 7,(HL) Continue if the set is 'free' but
RET Z exit from the KEYBOARD
subroutine if not.

The new key is to be accepted. But before the system variable LAST-K can be filled, the KSTATE system variables, of the set being used, have to be initialised to handle any repeats and the key's code has to be decoded.

02F1 K-NEW LD E,A The code is passed to the
LD (HL),A E register and to KSTATE0/4.
INC HL The '5 call counter' for this
LD (HL),+05 set is reset to '5'.
INC HL The third system variable of
LD A,(REPDEL) the set holds the REPDEL value
LD (HL),A (normally 0.7 secs.).
INC HL Point to KSTATE3/7.

The decoding of a 'main code' depends upon the present state of MODE, bit 3 of FLAGS and the 'shift byte'.

LD C,(MODE) Fetch MODE.
LD D,(FLAGS) Fetch FLAGS.
PUSH HL Save the pointer whilst the
CALL 0333,K-DECODE 'main code' is decoded.
POP HL
LD (HL),A The final code value is saved in
KSTATE3/7; from where it is
collected in case of a repeat.

The next three instruction lines are common to the handling of both 'new keys' and 'repeat keys'.

0308 K-END LD (LAST-K),A Enter the final code value into
SET 5,(FLAGS) LAST-K and signal 'a new key'.
RET Finally return.

TSL
29.09.2013, 15:20
Какая прэлесть...
Практически это означает задержку в 100мс от момента нажатия до реакции на кнопку.

Alex Rider
29.09.2013, 15:55
Практически это означает задержку в 100мс от момента нажатия до реакции на кнопку.
Ога. Что вполне себе актуально для того списка, что я постил выше.

TSL
29.09.2013, 15:58
Ну вот этот LD (HL), 05 я раньше видел, но предположить ТАКОЕ... :)

---------- Post added at 13:58 ---------- Previous post was at 13:56 ----------

Неужели ж у них были такие хреновые клавы?
Я на всей механике спековской опрашивал с дребезгом 1 фрейм и было ок.

Alex Rider
29.09.2013, 16:02
Неужели ж у них были такие хреновые клавы?
Вроде бы как пленочные клавы с напыленными дорожками деградируют постепенно, где-то тут недавно тема по этому поводу пролетала.

---------- Post added at 16:02 ---------- Previous post was at 16:02 ----------

О, вот тут (http://zx.pk.ru/showthread.php?t=21821) про это говорили.

introspec
29.09.2013, 16:14
Неужели ж у них были такие хреновые клавы?
Я на всей механике спековской опрашивал с дребезгом 1 фрейм и было ок.
На моей дельте-с дребезг в 1 фрейм явно был недостаточен. Хотя я боролся с этим куда проще: я читал клаву один раз за фрейм, если что-то читалось, фактически, отключал клаву фреймов на 5 перед следующим опросом.

psb
29.09.2013, 16:43
т.е. вы хотите сказать, что если кнопка была нажата 2 фрейча (40 мс), то бейсик ее не засчитает?

Soplik
29.09.2013, 18:20
я читал клаву один раз за фрейм, если что-то читалось, фактически, отключал клаву фреймов на 5 перед следующим опросом.
То есть мне в игре читать клаву раз в 5 фреймов?

Alex Rider
29.09.2013, 18:22
т.е. вы хотите сказать, что если кнопка была нажата 2 фрейча (40 мс), то бейсик ее не засчитает?
Я всех обманул. Засчитает. Нажатия кнопок он видит в том же прерывании, в котором первый раз их прочитал нажатыми из порта. А вот для фиксации отпускания кнопка должна не считаться 5 раз подряд.

psb
29.09.2013, 18:24
ну вот, другое дело:)

Alex Rider
29.09.2013, 18:29
То есть мне в игре читать клаву раз в 5 фреймов?
Нет, introspec имел в виду, что, пока ничего не нажато, ждать нажатия каждый фрейм. Когда нажато - опрашивать каждый пятый. В принципе, неплохой вариант.
А ты для чего кнопки опращиваешь? Для управления героем? Тогда так пойдет.

Soplik
29.09.2013, 18:33
Для управления героем пока, да.
Если бы писал что-то со вводом текста, опрашивал бы раз во фрейм, сделал бы фреймов 10 подряд перед первым нажатием и фреймов 5 подряд -- перед следующими.