╔══════════════════════════════════════════════════════════════╗
║ Кодинг. ║
╙──────────────────────────────────────────────────────────────╜
From : Jason Frost
To : PROTON
PR>
PR> Определение наличия Kempston Joystick.
PR>
PR> На зарубежном спектруме Kempston джойстик выбирается
PR> путём сброса A5 на шине адреса, таким образом его порт
PR> #DF (223), но на росийских спектрумах стандартным пор-
PR> том Kempston джойстика стал порт #1F(31). При от-
PR> сутствии Kempston мыши это не важно, и если какая ни-
PR> будь прога будет обращаться к джойстику через #DF то он
PR> будет нормально работать.
Здесь, скорее всего, опечатка. NAVY MOVES ведь не работает. Зато
адаптированные проги работают и на наших и на фирменных машинах.
Наш кемстон выбирается при нулях на А5,А6,А7, а адрес #DF этого
не обеспечивает.
PR>
PR>
PR> сброшены в 0. Например:
PR>
PR> XOR A
PR> IN A,(#1F)
!???????
вообще-то _полный адрес_ порта kempston'a - #FF1F.
По общепринятой спецификации выборка порта осуществляется
нулями на одной или нескольких адресных линиях, и чистая
адресная шина имеет вид #FFFF. Размер шины адреса в Z80 (Z8400)
16 бит, и при работе по укороченнын 8 - битным адресам на
старшую часть попадает случайное значение, что может повлечь
несовместимость с разными версиями аппаратуры.
Но это уже из области профессионального программирования. В
профессиональных системах (IS'DOS например) требование всегда и
везде указывать полный 16-битный адрес порта является
обязательным, и его несоблюдение считается серьезной ошибкой.
PR>
PR> Однако, эти способы не работают на многих
PR> спектрум-совместимых машинах, например Scorpion'ы, не-
на всех скорпах кемпстон имеется изначально. Причем разведен
он 100% правильно. Правильнее сказать: эти способы не работают
на машинах имеющих порт #FF и/или криво подключеный джойстик.
PR> которые Pentagon'ы и многие другие. Причин несколько:
PR> во-первых на многих платах не все старшие биты порта
PR> Kempston джойстика сброшены в 0, бывает, что они все
PR> (или некоторые из них) установлены в 1; во-вторых на
PR> фирменных спектрумах и на Scorpion'ах при обращении к
PR> какому-нибудь отсутствующему порту из него считывается
PR> содержимое порта атрибутов ("порт #FF") - именно с этим
PR> связаны сложности при подключении CDOS-модема к Scorpi-
у скорпа на системной шине имеется специальный вход IORQGE,
который отключает порт #FF и вообще _все_ остальные порты,
имеющиеся на материнской плате. Никаких проблем.
Порт #FF и модем вполне уживаются вместе. Доделка состоит
из микрухи ЛП8 и кусочка провода.
PR>
PR> Чтобы устранить вторую причину, надо разобраться,
PR> как работает порт атрибутов. Вывод на экран начинается
PR> сразу после прихода сигнала INT, точнее сразу после
PR> INT'а рисуется верхняя часть бордюра и в это время порт
PR> атрибутов отключается. Когда-же начинает рисоваться эк-
порт #FF- это порт атрибутов _экрана_, а не бордюра, и он _не
отключается_, просто из него в течение около 12000 тактов после
инта (пока рисуется верхняя часть бордюра), гарантированно
приходят только байты #FF, т.е. пустая шина данных.
PR> ран, то из порта атрибутов приходят байты атрибутов,
PR> которые в данный момент выводятся на монитор (однако, в
PR> те моменты, когда рисуются боковые части бордюра, порт
PR> атрибутов снова отключается) - это явление позволяет
^^^^^^^^^^^^^^^^^^
он не отключается !!! Он просто пуст, т.е. содержит #FF!
PR> синхронизировать бордюрные эффекты. Итак, для определе-
PR> ния наличия Kempston джойстика (а так-же это касается и
PR> Kempston мыши) его порт надо опрашивать только сразу
PR> после INT'а, пока порт атрибутов выключен, т.к. потом
почему сразу? Это надо делать в течение первых 12000 тактов
после инта, когда гарантированно исключен конфликт с портом
#FF. Почему 12000? Фирменный размер верхнего бордюрного поля
65 линий (на пентагоне 80), линия рисуется за 224 такта,
224*65=14560 тактов, но на wait'овых двухполевых машинах (в
частности фирменных) обычно меньше, 12000 как раз хватит.
PR>
PR> Ну а для устранения первой причины надо определять
PR> наличие Kempston джойстика по младшим 5 битам, но прав-
PR> да в этом есть один недостаток, а именно, если, когда
PR> прога проверяет наличие Kempston джойстика его удержи-
PR> вать - то программа не определит его присутствие.
PR>
PR> Итак, оптимальный способ определения Kempston
PR> джойстика, работает абсолютно на всех машинах со 100%
PR> надёжностью:
PR>
PR> ;
PR> ; (C) EVP-SOFT
PR> ;
PR> ; на время определения наличия Kempston
PR> ; джойстика желательно установить режим
PR> ; IM 2 и программу обработки прерываний
зачем с IM2 огород городить? Для тачек с нестабильной шиной
(которых немало), такой подход слишком громоздок: надо
расписывать табличку и т.д. При IM1 подпрограмма (ISR) опроса
клавиатуры (в зависимости от количества нажатых клавиш) занимает
около 1-2 тыс. тактов, что с лихвой укладывается в пресловутые
12 тыс. Так что при IM1 вполне достаточно тривиального
EI
HALT
LD A,#FF
IN A,(#1F)
AND #E0
JR Z,PRESENT
JR NOT PRESENT
В случае с мышой - аналогично.
Для машин с криво подключенным джойстиком логично поступить так:
если порт #FF1F обнаружен, но приходит из него не совсем то, что
надо (старшие три бита не в нуле), то джойстик все-таки есть,
и имеет смысл его опрашивать.
PR> ; сделать короткой:
см. выше про 12000 тактов.
PR>
PR> Определение наличия Kempston Mouse
PR>
PR> Название мыши "Kempston" вовсе не означает, что она
PR> подключается вместо Kempston джойстика. Для подключния
В Англии есть город Кемпстон, в котором есть одноименная
лаборатория, и в ней разные люди в разное время разработали
интерфейсы джойстика, мыши и принтера. Кста, принтерный -
почти точная копия нашего на KPS8OBB55.
PR> Kempston мыши нужен специальный контроллер, т.к. коор-
PR> динаты Kempston мыши (в отличии от AY-мыши) вычисляются
PR> аппаратно, а не программно. Связь с контроллером осу-
хм... смотря какая мышь. Если последовательная (microsoft mou-
se), то все так и есть. И не вычисляются, а преобразуются из
последовательного кода в параллельный.
А если параллельная, (стандарт для amiga & macintosh) то коор-
динаты она уже в готовом виде подает, и нужды в преобразовании
нет.
PR> её отсутствии из всех трёх "мышиных" портов считывается
PR> #FF, разумеется, когда выключается порт атрибутов. Если
еще раз: порт атрибутов _не выключается_! Он просто _ничего не
содержит_!
PR> хотя-бы из одного порта пришло не #FF, значит мышь
PR> есть. Однако, если после включения компа не прикасаться
PR> к мыши, то из портов координат тоже будет приходить
PR> #FF, и наличие мыши будет не определить - поэтому после
неправильно. После reset порты координат содержат нули, а не
#FF. Так что наличие мыши можно определить всегда.
PR> включения компа всегда сдвигайте мышь, иначе ни одна
PR> прога её не найдёт. Вобщем, наличие Kempston мыши можно
после аппаратного reset - аналогично, т.к. в контроллере
(не в каждом, но во многих) после reset происходят те же
процессы, что и при включении питания.
PR> ;
PR> ; на время определения наличия Kempston
PR> ; мыши желательно установить режим IM 2
зачем IM2? См. выше.
PR> ; и программу обработки прерываний сде-
PR> ; лать короткой:
см. выше про 12000 тактов.
Мораль: не надо возиться с IM2. Искать мышу или джойстик можно
и при IM1, но в любом случае делать это после EI : HALT, при
условии, что прерывающая процедура не длиннее 12000 тактов.
Для справки, ориентировочные значения длин некоторых ISR:
стандартная процедура опроса клавиатуры - 1-2 тыс. тактов
проигрыватель Pro tracker'a - 4-6 т. тактов
-"- ST pro - около 3,5 т.тактов
-"- ASC Sound Master - 6-12 т. тактов.
ISR - Interrupt Service Routine.
Other articles: