Proton
#18
27 января 1998 |
|
Кодинг - Разбор опечаток из предыдущей статьи...
╔══════════════════════════════════════════════════════════════╗ ║ Кодинг. ║ ╙──────────────────────────────────────────────────────────────╜ 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.
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября