О, знакомая песТня. Прощевайте, больше не потревожу.
Вид для печати
И Вам не хворать. Не больно-то и хотелось выяснять у кого потолще... знания 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 уже расписал, если подробнее - на Спектруме клаву опрашивает процедура в составе ПЗУшного RST#38, а тут надо "перехватить" прерывание, записав адрес своей процедуры по адресу вектора. Можно опрашивать и по кадровому прерыванию, а ля Спектрум, но его нет на БК10. Можно просто воткнуть заглушку, если реакция на клаву не требуется, либо да, запретить прерывания через регистр. На БК специфичная система прерываний, после Спектрума к этому трудновато привыкать, но в ней есть и свои плюсы.
Пока не попробовал, но сразу вопрос: а как правильно восстанавливать векторы 60 и 274 перед выходом из программы? У них есть какие-то стандартные адреса или лучше будет запомнить те, что были записаны в них на момент установки наших векторов? *Нужно, чтобы работало на БК10/11(М).
Я просто в начале своих программ сохраняю все системные ячейки, которые собираюсь изменять. А при выходе восстанавливаю.
- - - Добавлено - - -
Статья про то как правильно сделать опрос клавиатуры и джойстика одновременно: https://manwe.pdp-11.ru/?/programming/joystick
Примерно так. На 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, которая восстанавливает всё обратно.