Важная информация

User Tag List

Страница 3 из 4 ПерваяПервая 1234 ПоследняяПоследняя
Показано с 21 по 30 из 33

Тема: Мои эксперименты

  1. #21
    Master
    Регистрация
    15.02.2015
    Адрес
    г. Могилёв, Беларусь
    Сообщений
    835
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    98
    Поблагодарили
    65 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Дмитрий Посмотреть сообщение
    Что касается проблемы - с виду все норм, не заметил ничего критичного. Попробую подебажить - посмотрим.
    Кстати, многие не знают, но в ZXMAK2 есть Debugger, который может здорово помочь в отладке!
    Дебажил. На функции freemem (62),вроде, вываливается:

    ld a,(memblock)
    ld c,62
    rst 0x10
    ¡Un momento, señor fiscal!


  2. #22
    Master
    Регистрация
    15.02.2015
    Адрес
    г. Могилёв, Беларусь
    Сообщений
    835
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    98
    Поблагодарили
    65 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Решил проблему. Похоже, нумерация логических страниц в блоке с единицы...
    Заменил номера страниц с 0 и 1 на 1 и 2 - заработал правильный выход в ОС.
    ¡Un momento, señor fiscal!


  3. #23
    Master Аватар для Shaos
    Регистрация
    16.01.2005
    Адрес
    California, USA
    Сообщений
    805
    Спасибо Благодарностей отдано 
    97
    Спасибо Благодарностей получено 
    99
    Поблагодарили
    66 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    нумерация страниц в блоке таки с нуля (0,1,2...)

    а возврат в DSS у нас такой:
    Код:
    ; Exit program
    
    exit:
            ld   bc,0041h
            rst   10h
    либо RST 0 который вызывает тоже самое

    - - - Updated - - -

    и зачем SP переставлять вручную, если DSS при загрузке EXE всё равно ставит в тот SP который в хедере? и соответственно при выходе в DSS через 41h всё вернётся туда где было
    Администратор сетевого сообщества nedoPC.org
    Урал 8/64К, Sp2000, ZX48K+, ZX16K (спалил), TS1000 (американский ZX81), TS2068, Дельта-С, 20 лет собираю ATM Turbo 2+
    Неспектрумы: Электроника МК-85 и МК-85М, ПК-01 Львов, БК-0011, Вектор-06Ц, Лик (спец), Апогеи, Radio-86RK SRAM 32K & 128K (всё ещё собираю)

  4. #24
    Master
    Регистрация
    15.02.2015
    Адрес
    г. Могилёв, Беларусь
    Сообщений
    835
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    98
    Поблагодарили
    65 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Хотел сделать обработку клавиатуры в прерывании через функцию ОС scankey. Вот так:
    ;здесь обработка клавиатуры
    Ld a,(OldWin0Page); восстанавливаем системную страницу
    out (0x82),a
    ld a,0
    ld (scankey),a
    LD C,0x31 ;Функция опроса клавиатуры без ожидания
    RST 0x10
    JR Z,int2body1
    ld a,d
    and 127 ;убираем седьмой бит
    ld (scankey),a
    int2body1:
    Ld a,(Win0Page)
    out (0x82),a
    Почему-то это не работало...
    Пришлось писать обработку AT-клавиатуры самому. Вот код:
    ;Клавиатура
    SerialChAData EQU #18 ;регистр данных канала A последовательного порта контроллера Z84
    SerialChACtrl EQU #19 ;контролирующий регистр канала A последовательного порта контроллера Z84

    kbMoveUp EQU 0x75 ;стрелка вверх
    kbMoveDown EQU 0x72 ;стрелка вниз
    kbMoveLeft EQU 0x6B ;стрелка влево
    kbMoveRight EQU 0x74 ;стрелка вправо
    kbEsc EQU 0x76 ;ескейп
    target defb 0 ;код нажатой клавиши
    scankey defb 0
    pflag defb 0
    eflag defb 0 ;флаг расширенных кодов
    fflag defb 0 ;флаг заполнения буфера

    ;_____________________________
    ;обработчик прерывания

    int2m:
    di
    push af
    push bc
    push de
    push hl

    ld a,(tick)
    cp 2
    jr nc, int2body
    inc a
    ld (tick),a

    int2body:
    ;здесь обработка клавиатуры AT[ps/2 scan set 2]

    keys:
    ld a,(target) ; проверяем переменную со сканкодом нажатой клавиши
    or a
    jp nz, keystep2 ;если не ноль, то переходим к отлову отжатия клавиши
    ;иначе проверяем сканкод нажатой клавиши
    call scan
    ld d,a
    ld a,(fflag) ;проверяем буфер клавиатуры по флагу заполнения
    or a
    jp z, player ;если пуст - выходим
    ld a,d
    cp 0xF0; ;клавиша отжата?
    jr nz, keystep11 ;нет - проверяем на байт расширения
    call scan; ;иначе, освождаем буфер и выходим
    jp player
    keystep11:
    cp 0xE0; ;проверка на байт расширения
    jr nz,keystep12 ;если нерасширенный код, то переходим на обработку нерасширенных кодов
    call scan ;иначе, читаем буфер и сравниваем с
    cp 0xF0 ;кодом отжатия расширенного кода
    jr nz,keystep13 ;если не отжатие, то расширенный код, переходим на обработку расширенных кодов
    call scan ;иначе, освобождаем буфер и выходим
    jp player
    keystep13:
    ld (target),a ;запоминаем расширенный код
    ld a,1
    ld (eflag),a ;устанавливаем флаг расширенного кода и выходим
    jp player
    keystep12:
    ld (target),a ;запоминаем нерасширенный код
    xor a
    ld (eflag),a ;сбрасываем флаг расширенного кода и выходим
    jp player

    keystep2:
    ld a,(eflag) ;по флагу расширенных кодов определяем какое отжатие ловить
    or a
    jr z, keystep_for_F0 ;если флаг сброшен, ловим простое отжатие F0 нерасширенных кодов
    ;иначе, отлов расширенного отжатия EOFO расширенных кодов
    call scan
    ld d,a
    ld a,(fflag)
    or a
    jp z, player ;буфер пуст? да - выход
    ld a,d
    cp 0xE0 ;расширенный код?
    jr nz,F0compare ;нет - проверка на обычное отжатие
    call scan ;иначе,читаем буфер
    cp 0xF0 ;проверка на расширенное отжатие
    jr nz, player ;если не расширренное отжатие, то освобождаем буфер и выход
    call scan ;иначе, читаем расширенный код клавиши, которая была отжата
    ld b,a
    ld a,(target)
    cp b ;сравниваем код отжатой клавиши с клавишей, которая была нажата
    jr nz, player ;если коды не совпадают - выход
    ;ld (scankey),a
    xor a
    ld (target),a ;иначе, сбрасываем переменную для кода нажатой клавиши
    ld (eflag),a ; и сбрасываем флаг расширенных кодов
    jr player ;выход
    F0compare:
    cp 0xF0 ;обычное отжатие?
    jr nz, player ;нет -выход
    call scan ;да - освобождаем буфер и выход
    jr player

    ;отлов F0 (обычного отжатия нерасширенных кодов)
    keystep_for_F0:
    call scan ;читаем буфер
    ld d,a
    ld a,(fflag)
    or a
    jp z, player ;если буфер пуст - выход
    ld a,d
    cp 0xF0 ;обычное отжатие?
    jr nz, E0compare ;если нет - проверка расширенных кодов
    call scan ;иначе, читаем код отжатой клавиши
    ld b,a
    ld a,(target)
    cp b ;сравниваем код отжатой клавиши с клавишей, которая была нажата
    jr nz, player ;если коды не совпадают - выход
    ;ld (scankey),a
    xor a
    ld (target),a ;иначе, сбрасываем переменную для кода нажатой клавиши
    jr player ;выход
    E0compare: ;отлов расширенных кодов для освобождения буфера
    cp 0xE0 ;расширенный код?
    jr nz, player ;если нет - выход
    call scan ;иначе, читаем буфер
    cp 0xF0 ;расширенное отжатие?
    jr nz, player ;если нет - выход
    call scan ;иначе, освобождаем буфер от кода отжатой клавиши и выход
    jr player



    ;работа c плеером
    player:
    pop hl
    pop de
    pop bc
    pop af
    ei
    reti
    ;_______________________________

    scan:
    ;проверка есть ли данные от клавиатуры
    IN a,(SerialChACtrl) ;бит0 = 0 - нет данных;бит0 = 1 - есть данные
    and 1
    ld (fflag),a
    JR z,scanexit
    ;если данные есть
    IN a,(SerialChAData)
    scanexit:
    ret
    Работает. Программа реагирует на клавиши направлений(стрелки) и ескейп. В каждое отдельное прерывание работает только треть кода: либо фиксация в переменной кода нажатой клавиши, либо отлов отжатия F0, или отлов отжатия расширенного кода E0F0. Прошу потестить на реале, так как есть подозрение что эмулятор не пропускает клавиши PrintScreen и Pause\Break. Нужно проверить - нажатие этих клавиш не приведёт ли к отключению реакции на клавиши? Алгоритм обработки нажатий реагирует на обычные( однобайтовые коды нажатий и двубайтовые отпусканий) и расширенные( двубайтовые для нажатий и трёхбайтовые для отпусканий) коды, но не на дополнительные. Вот, нажатие ПринтСкрин и Паузы может привести к непредсказуемым результатам, так как они имеют дополнительные коды( 4-6 байт). Есть подозрение, что нажатие Паузы заблокирует клавиатуру.

    Ссылка на образ диска https://dropmefiles.com/9jsV5

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

    Полезные ссылки по теме:
    https://dvsav.ru/at-ps2-keyboard/
    https://ru.wikipedia.org/wiki/%D0%A1...BA%D0%BE%D0%B4

    Смотрел ещё исходники Клада от CHRV. Там обработчик совсем другой и для других целей( обработка нажатий нескольких клавиш). Мне не подойдёт.
    Последний раз редактировалось Smalovsky; 01.09.2021 в 16:42.
    ¡Un momento, señor fiscal!


  5. #25
    Master Аватар для Shaos
    Регистрация
    16.01.2005
    Адрес
    California, USA
    Сообщений
    805
    Спасибо Благодарностей отдано 
    97
    Спасибо Благодарностей получено 
    99
    Поблагодарили
    66 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    в обработчике прерываний DSS лучше не вызывать
    тем более клавишные подпрограммы - DSS ведь само по прерыванию инфу про кнопки берёт
    говорят, что клавиатуру можно по ZX-спектрумовски читать даже в режиме Спринтера - я не пробовал, ну и там естественно без курсорных и расширенных клавиш будет...
    Администратор сетевого сообщества nedoPC.org
    Урал 8/64К, Sp2000, ZX48K+, ZX16K (спалил), TS1000 (американский ZX81), TS2068, Дельта-С, 20 лет собираю ATM Turbo 2+
    Неспектрумы: Электроника МК-85 и МК-85М, ПК-01 Львов, БК-0011, Вектор-06Ц, Лик (спец), Апогеи, Radio-86RK SRAM 32K & 128K (всё ещё собираю)

  6. #26
    Master
    Регистрация
    15.02.2015
    Адрес
    г. Могилёв, Беларусь
    Сообщений
    835
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    98
    Поблагодарили
    65 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Shaos, мне бы кто на реале посмотрел тест клавитуры и отписался, клавиши ПринтСкрин и Пауза блокируют ли программу. Нужно стрелки понажимать чтоб квадратик подвигался, а затем нажать ПринтСкрин и Паузу в любом порядке, и затем снова стрелки. Эмулятор клавиши Принтскрин и Паузы не передаёт программе,поэтому я не знаю что будет на реале при нажатии этих клавиш.
    Просто, если есть возможность, погоняй на реале, напиши на форум какой результат. Нужно узнать работают ли стрелки после нажатия клавиш ПринтСкрин и Пауза. Обработку клавиатуры я делаю для игры.
    Образ диска https://dropmefiles.com/9jsV5
    Последний раз редактировалось Smalovsky; 02.09.2021 в 14:16.
    ¡Un momento, señor fiscal!


  7. #27
    Master Аватар для Shaos
    Регистрация
    16.01.2005
    Адрес
    California, USA
    Сообщений
    805
    Спасибо Благодарностей отдано 
    97
    Спасибо Благодарностей получено 
    99
    Поблагодарили
    66 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    У меня сейчас Спринтер в разобранном виде (переезжает со стола в ПЦ-корпус) - может Сайман или RomanRom2 смогут позапускать
    Администратор сетевого сообщества nedoPC.org
    Урал 8/64К, Sp2000, ZX48K+, ZX16K (спалил), TS1000 (американский ZX81), TS2068, Дельта-С, 20 лет собираю ATM Turbo 2+
    Неспектрумы: Электроника МК-85 и МК-85М, ПК-01 Львов, БК-0011, Вектор-06Ц, Лик (спец), Апогеи, Radio-86RK SRAM 32K & 128K (всё ещё собираю)

  8. #28
    Guru Аватар для Sayman
    Регистрация
    16.02.2006
    Адрес
    Новосибирск
    Сообщений
    3,277
    Спасибо Благодарностей отдано 
    17
    Спасибо Благодарностей получено 
    91
    Поблагодарили
    54 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Smalovsky, проверил. после запуска нажал на стрелку вправо. кубик начал движение. как его остановить? при нажатии на esc реакции нет. кубик доезжает до (почти) границы экрана и всё зависает. кубик за собой оставляет какие то полоски, с шагом и возрастанием. потом после ребута запустил снова. нажал на курсор вниз. кубик поехал вниз. далее всё аналогично. реакции на pause или print screen никакой нет.
    0A заповедей:
    I. Не удаляй каталог свой.
    II. Не удаляй до времени ни одного файла.
    III. Не кради файлы.
    IV. Не желай программы ближнего своего.
    V. Почитай BDOS и BIOS как родителей своих ...
    ---
    Sprinter resurrect:
    Telegram
    Discord
    Repo
    Forum

  9. #29
    Guru Аватар для Дмитрий
    Регистрация
    01.01.2009
    Адрес
    Донецк, Украина
    Сообщений
    3,260
    Спасибо Благодарностей отдано 
    35
    Спасибо Благодарностей получено 
    9
    Поблагодарили
    8 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Не знаю почему у тебя не работает опрос на прерываниях.
    У меня опрос клавиатуры нормально работал, я делал так:
    Обработчик прерваний в конце вызывает RST #38 (досовский обработчик прерываний IM1):
    Im2Handler:
    di
    push all
    ...
    pop all
    ei
    rst #38
    В коде проверка клавиатуры:
    CheckKeys:
    ld c,Dss.ScanKey
    rst #10
    ret z ;ничего не нажато
    ;определение нажатой кнопки
    ret

  10. #30
    Master
    Регистрация
    15.02.2015
    Адрес
    г. Могилёв, Беларусь
    Сообщений
    835
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    98
    Поблагодарили
    65 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Sayman Посмотреть сообщение
    проверил. после запуска нажал на стрелку вправо. кубик начал движение. как его остановить? при нажатии на esc реакции нет. кубик доезжает до (почти) границы экрана и всё зависает.
    Непонятно. В эмуляторе всё работает. Надо бы, что бы ещё кто на спринтере проверил.

    Цитата Сообщение от Sayman Посмотреть сообщение
    кубик за собой оставляет какие то полоски, с шагом и возрастанием.
    Это исправил.

    Вот видео работы обновленной программы на эмуляторе( теперь уже спрайт двигается на фоне):


    Возможно проблемы с клавиатурой в этом кусочке программы:
    scan:
    ;проверка есть ли данные от клавиатуры
    IN a,(SerialChACtrl) ;бит0 = 0 - нет данных;бит0 = 1 - есть данные
    and 1
    ld (fflag),a
    JR z,scanexit
    ;если данные есть
    IN a,(SerialChAData)
    ;вот тут возможно нужно что-то отправить в порт SerialChACtrl, что бы разрешить дальнейшую пересылку данных от клавиатуры
    scanexit:
    ret
    Это надо разбираться с последовательным портом будет.

    Программа для тестирования:
    https://dropmefiles.com/4hFOg
    Последний раз редактировалось Smalovsky; 09.09.2021 в 17:50.
    ¡Un momento, señor fiscal!


Страница 3 из 4 ПерваяПервая 1234 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Мои Atari
    от MaiklsBlack в разделе Atari
    Ответов: 12
    Последнее: 10.02.2013, 03:59
  2. Мои извинения
    от Nordic в разделе Барахолка (архив)
    Ответов: 42
    Последнее: 01.11.2010, 18:17
  3. Эксперименты с Audition
    от andrews в разделе Творчество
    Ответов: 12
    Последнее: 25.01.2009, 00:44
  4. Эксперименты с AY?
    от Электрик в разделе Музыка
    Ответов: 0
    Последнее: 29.06.2006, 02:45

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •