И Вам не хворать. Не больно-то и хотелось выяснять у кого потолще... знания PDP-11.
С клавишми разобрался. Надо было запретить прерывания от клавиатуры командой MOVB $0100, @$0177660
Что же никто об этом не сказал?
- - - Добавлено - - -
Но, кстати, опрос клавиш работает только на БК10. Что надо подшаманить для 11(М) ?
Ну, просто никто так не делает, вот и возникают непонятки. Если прерывание разрешено и программа обработки прерывания сама забирает код нажатой клавиши из регистра (первой, естественно, ведь она получает управление по прерыванию) то, само собой, основная программа уже не получит ни флагов ни кода. Тогда уже надо смотреть код клавиши в системных переменных, которые на БК10 и 11М вроде разные. Запрещать прерывание от клавы - зачем? Прерывание позволяет реагировать на все тогда, когда надо, занимаясь другими делами. Понятное дело, если идет какой-то критичный процесс, типа смены палитры на лету или запись на диск, тогда прерывание и длинный обработчик могут испортить всю малину. Куда проще сделать так, как я написал изначально:
Код:mov #v60,@#60 ;переписать прерывание от клавы по вектору 60 mov #v274,@#274 ;вектор 274 (клавиши с АР2) clr @#key ;начальный сброс буфера ..... 0: tst @#key ;цикл ожидания или просто проверка когда надо. Код клавиши тут появится сам. beq 0 ;делаем с кодом что надо и очищаем буфер clr @#key ..... v60: mov @#177662,@#key ;взять код клавиши ;можно и тут сразу обработать какие-то клавиши, которые должны прерывать исполнение программы rti v274: mov @#177662,@#key bis #200,@#key ;можно и тут сразу обработать какие-то клавиши, которые должны прерывать исполнение программы rti key: .#0 ;код нажатой клавиши, если >200 то с АР2
Последний раз редактировалось grf; 01.12.2021 в 06:17.
Блог проекта "The Goonies для БК11М"
БК-0011М, БК-0011М-01, SMK-512, AZ
Oleg N. Cher(01.12.2021)
Видимо, подразумевали, что вектора прерываний уже перехвачены =) выше grf уже расписал, если подробнее - на Спектруме клаву опрашивает процедура в составе ПЗУшного RST#38, а тут надо "перехватить" прерывание, записав адрес своей процедуры по адресу вектора. Можно опрашивать и по кадровому прерыванию, а ля Спектрум, но его нет на БК10. Можно просто воткнуть заглушку, если реакция на клаву не требуется, либо да, запретить прерывания через регистр. На БК специфичная система прерываний, после Спектрума к этому трудновато привыкать, но в ней есть и свои плюсы.
Oleg N. Cher(01.12.2021)
Блог проекта "The Goonies для БК11М"
БК-0011М, БК-0011М-01, SMK-512, AZ
Oleg N. Cher(01.12.2021)
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Oleg N. Cher(04.12.2021)
Я просто в начале своих программ сохраняю все системные ячейки, которые собираюсь изменять. А при выходе восстанавливаю.
- - - Добавлено - - -
Статья про то как правильно сделать опрос клавиатуры и джойстика одновременно: https://manwe.pdp-11.ru/?/programming/joystick
manwe.pdp-11.ru
Oleg N. Cher(04.12.2021)
Примерно так. На 0010 при попытке записи туда возникает ошибка шины, что приводит к прерыванию по 4 вектору.
Признаю, код немного хулиганский, но жаль тратить память просто так. Её у нас немного.Код:clr @#is11m mov @#4, @#save4 mov r6, @#savesp mov #restor, @#4 clr @177662 mov #1, @#is11m restor: mov (r7)+, r6 savesp: .word 1000 mov (r7)+, @(r7)+ save4: .word 100000, 4 .... is11m: .word 0
Если неясно, я сохраняю указатель стека и предыдущее значение вектора 4 прямо в поле непосредственной константы команды mov, которая восстанавливает всё обратно.
Oleg N. Cher(05.12.2021)
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)