Speccy - наш выбор!

Speccy - наш выбор! (http://zx-pk.ru/index.php)
-   Игры (http://zx-pk.ru/forumdisplay.php?f=5)
-   -   ZXeretic (http://zx-pk.ru/showthread.php?t=21893)

rajdee 27th September 2013 16:34

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

psb 27th September 2013 17:35

Quote:

Originally Posted by Дмитрий (Post 630425)
А так батник запустил - у тебя на выходе уже готовый релиз в scl с пакетом документации и пр, да еще и под разные платформы...

и что, во время отладки каждый раз reset > tr-dos > run?

Дмитрий 27th September 2013 17:39

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

Andrew771 27th September 2013 18:34

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

psb 27th September 2013 20:49

Quote:

Originally Posted by Дмитрий (Post 630454)
батник запускает эмуль, подсовывая нужную scl, потом автостарт tr-dos-а и ву а ля!

меня бы выбесило ждать ресет трдоса... меня пауза в 1 сек в предыдущем анриле бесила, щас ее убрали - красота. кнопку нажал и твой код мгновенно работает. хоть 10 раз в сек. запускай:) а с паузами если, так тут до реала недалеко...

Soplik 27th September 2013 21:46

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

Alex Rider 27th September 2013 21:56

Quote:

Originally Posted by Soplik (Post 630497)
как удобнее всего организовать опрос клавиш?

Например, так
Там поддерживается Sinclair 1, 2, QAOPM/Space, Cursor. Redefine нет.

Дмитрий 27th September 2013 23:13

Quote:

Originally Posted by Alex Rider (Post 630499)
Redefine нет.

Но нет ничего сложного в его организации.

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

Quote:

Originally Posted by psb (Post 630490)
меня бы выбесило ждать ресет трдоса...

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

Alex Rider 28th September 2013 06:35

Quote:

Originally Posted by Дмитрий (Post 630504)
Но нет ничего сложного в его организации.

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

Soplik 28th September 2013 17:01

А что за анти-дребезг?

NovaStorm 28th September 2013 17:54

Фильтрация нескольких случайных нажатий одной кнопки.

Soplik 28th September 2013 18:27

С какой частотой обычно происходят эти нажатия?

NovaStorm 28th September 2013 22:55

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

psb 28th September 2013 23:55

Quote:

Originally Posted by Дмитрий (Post 630504)
Да и в случае SNA, многие переменные барсика и тырдоса не инициализированы, что иногда создает грабли.

у ужасма все инициализировано. тем он и хорош:)

Quote:

Originally Posted by Soplik (Post 630647)
С какой частотой обычно происходят эти нажатия?

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

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

Soplik 29th September 2013 03: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 29th September 2013 11:03

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

Code:

#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 29th September 2013 13:59

Quote:

Originally Posted by TSL (Post 630803)
Смотри, вот кусок кода, которым я опрашиваю клаву на контроллере.

Блин, тут даже меня сподобило задуматься...
Quote:

Originally Posted by psb (Post 630721)
да и не везде нужен антидребезг, так-то.

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

Quote:

Originally Posted by Soplik (Post 630734)
А как в аласме записать код на диск?

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

TSL 29th September 2013 15:11

Quote:

Originally Posted by Alex Rider (Post 630826)
если порт полуряда в течение 5 прерываний подряд возвращает одну и ту же комбинацию нажатых клавиш, это означает, что нажатие действительно произошло и колебательные процессы на контактах кончились.

Я извиняюсь, прошу показать мне это место в ПЗУ бейсика.

Alex Rider 29th September 2013 15:16

Quote:

Originally Posted by TSL (Post 630850)
Я извиняюсь, прошу показать мне это место в ПЗУ бейсика.

Ok, наврал, не значение из порта там проверяется 5 прерываний, а порядковый номер нажатой кнопки на клавиатуре. Суть метода при это остается той же.

TSL 29th September 2013 15:22

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

Alex Rider 29th September 2013 16:15

Code:

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 29th September 2013 16:20

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

Alex Rider 29th September 2013 16:55

Quote:

Originally Posted by TSL (Post 630872)
Практически это означает задержку в 100мс от момента нажатия до реакции на кнопку.

Ога. Что вполне себе актуально для того списка, что я постил выше.

TSL 29th September 2013 16:58

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

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

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

Alex Rider 29th September 2013 17:02

Quote:

Originally Posted by TSL (Post 630878)
Неужели ж у них были такие хреновые клавы?

Вроде бы как пленочные клавы с напыленными дорожками деградируют постепенно, где-то тут недавно тема по этому поводу пролетала.

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

О, вот тут про это говорили.

introspec 29th September 2013 17:14

Quote:

Originally Posted by TSL (Post 630878)
Неужели ж у них были такие хреновые клавы?
Я на всей механике спековской опрашивал с дребезгом 1 фрейм и было ок.

На моей дельте-с дребезг в 1 фрейм явно был недостаточен. Хотя я боролся с этим куда проще: я читал клаву один раз за фрейм, если что-то читалось, фактически, отключал клаву фреймов на 5 перед следующим опросом.

psb 29th September 2013 17:43

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

Soplik 29th September 2013 19:20

Quote:

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

Alex Rider 29th September 2013 19:22

Quote:

Originally Posted by psb (Post 630892)
т.е. вы хотите сказать, что если кнопка была нажата 2 фрейча (40 мс), то бейсик ее не засчитает?

Я всех обманул. Засчитает. Нажатия кнопок он видит в том же прерывании, в котором первый раз их прочитал нажатыми из порта. А вот для фиксации отпускания кнопка должна не считаться 5 раз подряд.

psb 29th September 2013 19:24

ну вот, другое дело:)

Alex Rider 29th September 2013 19:29

Quote:

Originally Posted by Soplik (Post 630904)
То есть мне в игре читать клаву раз в 5 фреймов?

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

Soplik 29th September 2013 19:33

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


All times are GMT +4. The time now is 05:46.

Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.